diff --git a/.easel-media/project.json b/.easel-media/project.json new file mode 100644 index 0000000000..c394222bf9 --- /dev/null +++ b/.easel-media/project.json @@ -0,0 +1,6 @@ +{ + "format": 1, + "id": "b96beaca-ee83-4c07-96ef-05f8b6cbb716", + "selected": null, + "artifacts": [] +} diff --git a/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.json b/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.json new file mode 100644 index 0000000000..496a958ca4 --- /dev/null +++ b/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.json @@ -0,0 +1 @@ +{"id":"6433fba2-2fb7-4182-a39c-28d4f3f62d64","channel":"jeffrey/dibaka","requestedRevision":"a960cfdcca1406cc8843bc800a8df6e9c467559ecaf67bcb88d07603c66a653e","renderedRevisionVerified":false,"capturedAt":"2026-09-23T23:35:53Z","source":"software-canvas","file":"/Users/jas/aesthetic-computer/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.png","sha256":"8cc84bdaf3e2ceaac89932578ddbf9b5632d3644c9280f70ac2a827b46ce8ea3","analysis":{"width":96,"height":64,"pixels":6144,"uniqueRGBColors":1,"blank":true,"transparentPixels":6144,"meanLuminance":0,"horizontalEdgeFraction":0,"dominantColors":[{"rgb":[0,0,0],"fraction":1}],"nonDominantBounds":null,"note":"Bounds are pixels differing from the dominant RGB color, not object recognition."}} \ No newline at end of file diff --git a/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.png b/.easel/frames/6433fba2-2fb7-4182-a39c-28d4f3f62d64.png new file mode 100644 index 0000000000000000000000000000000000000000..633f3124991c36cc077a55b98804d58916e745de GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0y~yU`SwKU~u4IV_;x-YEs0EaktG3V_;Lq-M$ mhC>U!`sebEaktG3V_;Lq-M$ mhC>U!`seb({t0,t1})), old.movements.map(({t0,t1})=>({t0,t1})));\nassert.deepEqual(score.fieldShift, old.fieldShift);\nlet additions=0;\nfor(let i=0;in===0),old.lanes[i].name+' lost an event');\n}\nconst hits = score.lanes.flatMap(l=>l.events.filter(e=>/\"'^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\nfor(const m of score.movements) {\n const end=m===score.movements.at(-1)?m.t1-3:m.t1;\n const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];\n const gap=Math.max(...ts.slice(1).map((t,i)=>t-ts[i]));\n assert.ok(gap<=1.101,\"'`${m.name}: ${gap}s gap`);\n console.log(`${m.name}: longest percussion gap ${gap.toFixed(3)}s`);\n}\nfor(let i=0;in+l.events.length,0),score.lanes.reduce((n,l)=>n+l.events.filter(e=>e.t>=m.t0&&e.tl.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\nlet live=0,peak=0,at=0;\nfor(const p of points){live+=p.d;if(live>peak){peak=live;at=p.t;}}\nassert.ok(peak<=32);\nconsole.log(\"'`Global peak including chapter overlaps: ${peak}/32 voices at ${at.toFixed(3)}s.`);\nJS' · done","at":1790213798082},{"id":"msg_037b90d4d6021357016ab47ee3d45887d1a375e20afd2bf3b7","kind":"assistant","text":"The revised score stays within the playback limit at 20 simultaneous voices. I’m finishing the render with the corrected tempo label, then opening it for you to hear.","at":1790213859884,"activityOnly":true},{"id":"exec-05b94971-c2a9-4bee-9a60-204981feafb0","kind":"command","text":"/bin/zsh -lc 'ffprobe -v error -show_entries format=duration:stream=codec_name,codec_type,width,height -of json grants/culturehub-la-2026/notespatial-native-percussion.mp4' · done","at":1790213941754},{"id":"exec-723c6ba1-f08d-4430-89ce-2411de26ddc0","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 2 -i grants/culturehub-la-2026/notespatial-native-percussion.mp4 -frames:v 1 -y tmp/notespatial-percussion-before/revised-frame.png' · done","at":1790213941798},{"id":"exec-8a195642-48e2-43a4-8a31-01eb10554da3","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\" · done","at":1790213953023},{"id":"entry-1790213953023-0.4257987427798752","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213953023},{"id":"entry-1790213988833-0.8504555117738236","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213988833},{"id":"msg_037b90d4d6021357016ab47f6b369487d19f9b75e8ca12c97f","kind":"assistant","text":"Added percussion throughout—all eleven chapters, from the first bell through the final knock. Patterns follow each section’s meter and tempo.\n\nRebuilt and checked the score, then opened the revised full arrangement in QuickTime.","at":1790213995289}],"input":"","cursor":0,"history":["sup","what should we work on","hmm how about we open that last arrangement in quicktime","hmm i think the whole piece needs percussion","the whole time","so rhythm is felt","in eevery part thatd oesnt have it like the start part","for example","so thats one thing we can fix!","also we recently added more instruments to our arrangement but we havent baked a videow itht hat","so thats another aspect of the next render we need to compush","also our subwoofer","and maybe a kick drum","need to be modeled out too"],"historyIndex":14,"queued":["also we recently added more instruments to our arrangement but we havent baked a videow itht hat","so thats another aspect of the next render we need to compush","also our subwoofer","and maybe a kick drum","need to be modeled out too"],"medium":"piece","showQr":true,"autoAllow":false,"scrollOffset":0},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"01a0d103-879b-78f0-a45d-dafa5a1fc2fb"},"handoff":"","archivedConversation":[],"transcriptId":"b6a647e3-9315-4fcc-8cec-ac6e9c95ba8a"} diff --git a/.easel/threads/1790215150444-53e7e495-a647-41e0-958d-eb91cbb270d2.json b/.easel/threads/1790215150444-53e7e495-a647-41e0-958d-eb91cbb270d2.json new file mode 100644 index 0000000000..b691607701 --- /dev/null +++ b/.easel/threads/1790215150444-53e7e495-a647-41e0-958d-eb91cbb270d2.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T01:41:39.398Z","backend":"claude","model":"claude-sonnet-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/tero.mjs","runtime":"mjs","channel":"Asup5-WA","genre":"piece"},"ui":{"entries":[],"input":"","cursor":0,"history":[],"historyIndex":0,"queued":[],"medium":"piece","showQr":true,"autoAllow":false},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"d6a50084-8183-461a-8f6a-23babf5295ab"},"handoff":"","archivedConversation":[],"transcriptId":"5d875b23-ae9c-4469-9b73-e1a2e0a92bbd"} diff --git a/.easel/threads/1790215789093-6c731214-4270-4473-870f-af2945d11888.json b/.easel/threads/1790215789093-6c731214-4270-4473-870f-af2945d11888.json new file mode 100644 index 0000000000..f572c9a59f --- /dev/null +++ b/.easel/threads/1790215789093-6c731214-4270-4473-870f-af2945d11888.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:06:22.100Z","backend":"codex","model":"gpt-6-astra","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/gako.mjs","runtime":"mjs","channel":"wdy6bpeB","genre":"piece"},"ui":{"entries":[{"id":"entry-1790213066289-0.15351217842692644","kind":"user","text":"sup","at":1790213066289},{"id":"msg_037b90d4d6021357016ab47bcd32c087d18a6ddbdcc91ea78b","kind":"assistant","text":"yo — what’s up?","at":1790213069253},{"id":"entry-1790213089782-0.9972911293530808","kind":"user","text":"what should we work on","at":1790213089782},{"id":"msg_037b90d4d6021357016ab47be4dbc087d1a2c4aba3a7fbf0db","kind":"assistant","text":"I’ll check the recent work and open changes for a useful next step.","at":1790213092948,"activityOnly":true},{"id":"exec-7e9cc220-ad4a-4582-92a8-4861c4992df5","kind":"command","text":"/bin/zsh -lc \"git log -6 --format='%h %s'\" · done","at":1790213097105},{"id":"exec-30b453ee-07b5-43d4-a65f-edb6ac6bb237","kind":"command","text":"/bin/zsh -lc \"sed -n '1,180p' SCORE.md\" · done","at":1790213097106},{"id":"exec-0bd18495-ae72-4ef5-ac71-20db94670c4e","kind":"command","text":"/bin/zsh -lc 'git status --short' · done","at":1790213097171},{"id":"exec-d4af8e56-930d-4d0a-9e8d-5e94853265e2","kind":"command","text":"/bin/zsh -lc \"sed -n '1,120p' fedac/native/docs/spatial-rehearsal.md\" · done","at":1790213100545},{"id":"msg_037b90d4d6021357016ab47beeaf9487d19e48fd3b693cd8ee","kind":"assistant","text":"My vote: **make a one-minute Note(s)pat(ial) rehearsal we love.** The six-seat score and section renderer already exist. Pick one passage, listen and watch, then tune its movement, timing, and screen response until it feels right.\n\nTwo other good options:\n\n- **Small, useful win:** drop a painting onto the desktop app and open it in `nopaint`.\n- **Reliability:** measure spatial playback drift—the rehearsal docs still list output latency and drift as uncalibrated.\n\nI’d start with the music. A finished minute gives us something concrete to judge.","at":1790213102750},{"id":"entry-1790213368652-0.4957130732464863","kind":"user","text":"hmm how about we open that last arrangement in quicktime","at":1790213368652},{"id":"msg_037b90d4d6021357016ab47cfb9dac87d1b3de23138d9af704","kind":"assistant","text":"I’ll find the latest arrangement render and open it in QuickTime.","at":1790213371679,"activityOnly":true},{"id":"exec-62b0ca56-f8ea-43ab-9f57-c615fa14e2ab","kind":"command","text":"/bin/zsh -lc \"rg --files -g '*.mp4' -g '*.mov' -g '*.m4v' -g '*ARRANGEMENT*' -g '*render*' grants/culturehub-la-2026 fedac/native tmp .easel-media\" · done","at":1790213374788},{"id":"exec-61a0d5a0-c6b2-40ff-a53d-79b0555ca2f4","kind":"command","text":"/bin/zsh -lc 'ls -lt grants/culturehub-la-2026/notespatial*.mp4' · done","at":1790213382656},{"id":"exec-7c42bd13-365e-4fb7-ad87-e27fb4e78369","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-sim.mp4\" · done","at":1790213387356},{"id":"entry-1790213387357-0.22662517227068868","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-sim.mp4\"","at":1790213387357},{"id":"entry-1790213403890-0.8656351088893036","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-sim.mp4\"","at":1790213403890},{"id":"msg_037b90d4d6021357016ab47d1d300487d1a410e54825bee882","kind":"assistant","text":"Opened the latest full arrangement render in QuickTime: `notespatial-native-sim.mp4` from September 22.","at":1790213405242},{"id":"entry-1790213512876-0.16727957748843025","kind":"user","text":"hmm i think the whole piece needs percussion","at":1790213512876},{"id":"entry-1790213514222-0.3146400040801771","kind":"user","text":"the whole time","at":1790213514222},{"id":"entry-1790213516202-0.5222058295941001","kind":"user","text":"so rhythm is felt","at":1790213516202},{"id":"entry-1790213521459-0.5932345702261338","kind":"user","text":"in eevery part thatd oesnt have it like the start part","at":1790213521459},{"id":"entry-1790213522822-0.036526811848747176","kind":"user","text":"for example","at":1790213522822},{"id":"entry-1790213525606-0.41888701437625353","kind":"user","text":"so thats one thing we can fix!","at":1790213525606},{"id":"msg_037b90d4d6021357016ab47d97da5487d1b1ce5060f0d353cd","kind":"assistant","text":"I’ll check the percussion across the arrangement and add a pulse wherever it drops out, starting with the opening.","at":1790213528684,"activityOnly":true},{"id":"exec-124ca589-bd8e-456a-91d7-6e213e1e5a84","kind":"command","text":"/bin/zsh -lc \"sed -n '1,240p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790213534717},{"id":"exec-6269aa98-b06b-4d2f-9ad7-a57c65a3189a","kind":"command","text":"/bin/zsh -lc 'cat grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md' · done","at":1790213534722},{"id":"exec-bbfd85a0-2d05-4f25-bc46-b65bb1a9232d","kind":"command","text":"/bin/zsh -lc 'git diff --stat -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs' · done","at":1790213534723},{"id":"exec-22391974-41e7-43b0-b181-817b3e490217","kind":"command","text":"/bin/zsh -lc 'rg --files -g AGENTS.md -g SCORE.md fedac grants' · done","at":1790213534774},{"id":"exec-fee383c9-b7fb-4ef1-8ff3-38cbffa91843","kind":"command","text":"/bin/zsh -lc 'cat fedac/SCORE.md fedac/native/SCORE.md' · done","at":1790213541600},{"id":"exec-08cfd332-c87c-4a8b-a478-1c122294f938","kind":"command","text":"/bin/zsh -lc \"sed -n '1,160p' fedac/native/tools/notespatial-native-check.mjs\" · done","at":1790213541608},{"id":"exec-b90f5e13-95b6-4485-9e06-e890a3ea115e","kind":"command","text":"/bin/zsh -lc \"sed -n '240,560p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790213541608},{"id":"exec-79f29957-c6df-4bfa-bb2c-71714c12d5c7","kind":"command","text":"/bin/zsh -lc \"sed -n '1,180p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790213541608},{"id":"exec-4e556d76-2019-4e46-a668-cbe2da46e8d1","kind":"command","text":"/bin/zsh -lc \"sed -n '325,485p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790213556478},{"id":"exec-9fe59fa6-40ed-4f6d-a559-05350400942f","kind":"command","text":"/bin/zsh -lc 'cat grants/SCORE.md' · done","at":1790213556480},{"id":"exec-ce9beed2-a8d5-40d5-94ec-fdf668c2ad3a","kind":"command","text":"/bin/zsh -lc \"rg -n 'spawn|ffmpeg|canvas|writeFile|process.stdout|console.log' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790213556504},{"id":"msg_037b90d4d6021357016ab47dc0a4d487d1b2973a710a75d1f5","kind":"assistant","text":"The opening, waltz, lullaby, and ending have long stretches without percussion. I’ll give each a pattern that follows its meter and tempo, and keep a light pulse under the pauses so the rhythm carries through.","at":1790213568694,"activityOnly":true},{"id":"entry-1790213585691-0.2646271148029534","kind":"user","text":"also we recently added more instruments to our arrangement but we havent baked a videow itht hat","at":1790213585691},{"id":"entry-1790213592706-0.03140749062175785","kind":"user","text":"so thats another aspect of the next render we need to compush","at":1790213592706},{"id":"exec-2cee1c3b-167d-414e-a15f-74f7bd92c4f5","kind":"command","text":"/bin/zsh -lc 'mkdir -p tmp/notespatial-percussion-before' · done","at":1790213610018},{"id":"exec-b3248ccd-2c3e-4aca-a62e-9d2431d0451f","kind":"command","text":"/bin/zsh -lc 'cp fedac/native/tools/compose-notespatial-native.mjs fedac/native/scores/notespatial-native.nsscore grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md tmp/notespatial-percussion-before/' · done","at":1790213610077},{"id":"exec-f2d8a63d-d80e-4373-9a6b-f65fb5898503","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs · completed","at":1790213610100},{"id":"exec-2dfa26cb-6036-48a8-a721-c9f1bdc80964","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790213610309},{"id":"exec-04ee7380-2fec-4fc2-ae80-329cbddbcdf4","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs' · done","at":1790213616186},{"id":"exec-3b87d38d-7c89-4d28-9c6a-ee7b209b2ac6","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs --out grants/culturehub-la-2026/notespatial-native-percussion.mp4' · done","at":1790213616199},{"id":"exec-605e366e-537a-4659-a247-e2f3d3e270a2","kind":"change","text":"/Users/jas/aesthetic-computer/grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md · completed","at":1790213668358},{"id":"exec-a3a336bd-a502-43bd-b13c-81f2279aced2","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst old = JSON.parse(fs.readFileSync('tmp/notespatial-percussion-before/notespatial-native.nsscore'));\nconst score = JSON.parse(fs.readFileSync('fedac/native/scores/notespatial-native.nsscore'));\nassert.equal(score.dur, old.dur);\nassert.deepEqual(score.movements.map(({t0,t1})=>({t0,t1})), old.movements.map(({t0,t1})=>({t0,t1})));\nassert.deepEqual(score.fieldShift, old.fieldShift);\nlet additions=0;\nfor(let i=0;in===0),old.lanes[i].name+' lost an event');\n}\nconst hits = score.lanes.flatMap(l=>l.events.filter(e=>/\"'^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\nfor(const m of score.movements) {\n const end=m===score.movements.at(-1)?m.t1-3:m.t1;\n const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];\n const gap=Math.max(...ts.slice(1).map((t,i)=>t-ts[i]));\n assert.ok(gap<=1.101,\"'`${m.name}: ${gap}s gap`);\n console.log(`${m.name}: longest percussion gap ${gap.toFixed(3)}s`);\n}\nfor(let i=0;in+l.events.length,0),score.lanes.reduce((n,l)=>n+l.events.filter(e=>e.t>=m.t0&&e.tl.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\nlet live=0,peak=0,at=0;\nfor(const p of points){live+=p.d;if(live>peak){peak=live;at=p.t;}}\nassert.ok(peak<=32);\nconsole.log(\"'`Global peak including chapter overlaps: ${peak}/32 voices at ${at.toFixed(3)}s.`);\nJS' · done","at":1790213798082},{"id":"msg_037b90d4d6021357016ab47ee3d45887d1a375e20afd2bf3b7","kind":"assistant","text":"The revised score stays within the playback limit at 20 simultaneous voices. I’m finishing the render with the corrected tempo label, then opening it for you to hear.","at":1790213859884,"activityOnly":true},{"id":"exec-05b94971-c2a9-4bee-9a60-204981feafb0","kind":"command","text":"/bin/zsh -lc 'ffprobe -v error -show_entries format=duration:stream=codec_name,codec_type,width,height -of json grants/culturehub-la-2026/notespatial-native-percussion.mp4' · done","at":1790213941754},{"id":"exec-723c6ba1-f08d-4430-89ce-2411de26ddc0","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 2 -i grants/culturehub-la-2026/notespatial-native-percussion.mp4 -frames:v 1 -y tmp/notespatial-percussion-before/revised-frame.png' · done","at":1790213941798},{"id":"exec-8a195642-48e2-43a4-8a31-01eb10554da3","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\" · done","at":1790213953023},{"id":"entry-1790213953023-0.4257987427798752","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213953023},{"id":"entry-1790213988833-0.8504555117738236","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213988833},{"id":"msg_037b90d4d6021357016ab47f6b369487d19f9b75e8ca12c97f","kind":"assistant","text":"Added percussion throughout—all eleven chapters, from the first bell through the final knock. Patterns follow each section’s meter and tempo.\n\nRebuilt and checked the score, then opened the revised full arrangement in QuickTime.","at":1790213995289},{"id":"msg_037b90d4d6021357016ab47f735f5887d19f8710d7dad8f88d","kind":"assistant","text":"I’ll trace the newer instruments and speaker setup, then make sure the next render includes them alongside the continuous percussion. I’ll also check how the subwoofer and kick should fit the score and playback model.","at":1790214003456,"activityOnly":true},{"id":"exec-80b1fb43-c741-4e1b-91f2-097dd519dc0e","kind":"command","text":"/bin/zsh -lc \"git log -10 --format='%h %s'\" · done","at":1790214013034},{"id":"exec-ef09cd16-b86a-4339-aef1-bec2118b62a5","kind":"command","text":"/bin/zsh -lc \"rg -n -i 'subwoofer|sub.?bass|kick drum|instruments|instrument|speaker|compush' grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/docs/spatial-rehearsal.md fedac/native/lib/spatial-rehearsal.mjs fedac/native/pieces/spatial-rehearsal.mjs\" · done","at":1790214013102},{"id":"exec-a2581a97-037c-45e9-b6c8-d12650b68f72","kind":"command","text":"/bin/zsh -lc \"rg --files -g AGENTS.md -g '*instrument*' -g '*subwoofer*' -g '*notespatial*' fedac grants/culturehub-la-2026\" · done","at":1790214013102},{"id":"exec-7b1a51ef-3d75-450c-9111-5b12880bcc46","kind":"command","text":"/bin/zsh -lc 'git status --short' · done","at":1790214013102},{"id":"exec-bdf0ab31-fb8b-436f-835c-16ac33c79a1a","kind":"command","text":"/bin/zsh -lc \"sed -n '1,230p' fedac/native/lib/spatial-rehearsal.mjs\" · done","at":1790214025382},{"id":"exec-ac7ef85d-5a61-4cf0-8120-9999dfaf2abb","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214025406},{"id":"exec-7ef26b4a-b6b3-452f-aa92-916b12586a35","kind":"command","text":"/bin/zsh -lc \"git log -8 --format='%h %s' -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/src/audio.c\" · done","at":1790214025409},{"id":"exec-25999ff9-20f8-44f4-bae6-9c9ea3e60339","kind":"command","text":"/bin/zsh -lc \"rg -n -i 'subwoofer|soundfont|notespatial-native-gm|notespatial-native-mallets|instrument palette|orchestrat|preset' fedac/native/tools fedac/native/lib fedac/native/docs grants/culturehub-la-2026 --glob '*.mjs' --glob '*.md' --glob '*.json'\" · done","at":1790214025472},{"id":"exec-3a57a6af-b80b-4596-8552-f8348210253a","kind":"command","text":"/bin/zsh -lc 'cat grants/culturehub-la-2026/VOICINGS.md fedac/native/tools/sub-receiver/README.md' · done","at":1790214036311},{"id":"exec-29dd0549-bfa6-46d2-aef5-f710e852dd3d","kind":"command","text":"/bin/zsh -lc 'git show HEAD:fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214036332},{"id":"exec-9d84a0f0-b80b-423c-b9d2-94fbbbaf5bc3","kind":"command","text":"/bin/zsh -lc \"rg --files fedac/native/tools/sub-receiver; rg -n 'sub|kick|bass|synth|oscillator|filter' fedac/native/tools/sub-receiver/*\" · done","at":1790214036338},{"id":"exec-0b72777b-0c19-4edb-854c-bdd7cb260b47","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/pieces/spatial-rehearsal.mjs fedac/native/tools/notespatial-native-render.mjs; git branch --show-current; git remote -v' · done","at":1790214036362},{"id":"entry-1790214040897-0.3722189571702832","kind":"user","text":"i think more complex arrngements like lift would be cool too","at":1790214040897,"awaitingTurn":true},{"id":"call_pktuCU5JEnZUePGD7B7HmBsx","kind":"assistant","text":"I found the newer instrument palettes. Which should lead the next full render?\n- Mallet ensemble: vibraphone, marimba, kalimba, xylophone, gamelan\n- Native ensemble: flute, harp, piano, synth bass and brass\n- General MIDI ensemble: flute, marimba, celesta, brass and clarinet\n\nFor the kick, do you mean a synthesized kick in the score, or a physical kick drum in the room model?\n- Synthesized kick, feeding the subwoofer too\n- Physical kick drum shown in the room","at":1790214046721,"activityOnly":true},{"id":"msg_037b90d4d6021357016ab47faa1da487d1a0d74c2c261ed779","kind":"assistant","text":"I found why the last video missed them: the working composer and renderer no longer include the recently committed instrument support. I’m bringing that support back while keeping the percussion changes. The subwoofer receiver already has a bass-and-kick feed, so I can use its behavior as the render’s reference.","at":1790214058200,"activityOnly":true},{"id":"exec-c86f8876-1758-4767-80d9-80e82c628e1d","kind":"command","text":"/bin/zsh -lc \"sed -n '200,420p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790214066990},{"id":"exec-f7b9d09f-9696-4305-84cf-da87e0b99fde","kind":"command","text":"/bin/zsh -lc 'cat fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/app.mjs' · done","at":1790214067031},{"id":"exec-5e58106c-8f63-45e8-8134-31797d460ccc","kind":"command","text":"/bin/zsh -lc \"git show HEAD:fedac/native/tools/compose-notespatial-native.mjs | sed -n '90,240p'\" · done","at":1790214067174},{"id":"exec-fb6560f8-83a5-4f82-9259-1f70c73e1b49","kind":"command","text":"/bin/zsh -lc \"rg -n 'gm_synth|offline|render.*wav|WAVE_KICK|kick|gm_program' fedac/native/Makefile fedac/native/tools fedac/native/src/audio.h fedac/native/src/audio.c fedac/native/src/gm_synth.h --glob '*.[ch]' --glob '*.mjs' --glob Makefile\" · done","at":1790214067244},{"id":"exec-01a7e918-e5ad-4f76-820f-803cfed91039","kind":"command","text":"/bin/zsh -lc 'mkdir -p tmp/notespatial-room-before' · done","at":1790214092332},{"id":"exec-a16c4e64-ec99-409c-882d-d9d77e9714f0","kind":"command","text":"/bin/zsh -lc 'cp fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/pieces/spatial-rehearsal.mjs fedac/native/scores/notespatial-native.nsscore tmp/notespatial-room-before/' · done","at":1790214092390},{"id":"exec-5d5198ac-63aa-4f8b-b657-19e6ba5c816d","kind":"command","text":"/bin/zsh -lc 'git show HEAD:fedac/native/tools/compose-notespatial-native.mjs > tmp/notespatial-room-before/committed-composer.mjs' · done","at":1790214092451},{"id":"exec-34be8bed-fd19-4f3c-9289-1708cffdd0a7","kind":"command","text":"/bin/zsh -lc 'git merge-file -p tmp/notespatial-room-before/compose-notespatial-native.mjs tmp/notespatial-percussion-before/compose-notespatial-native.mjs tmp/notespatial-room-before/committed-composer.mjs > tmp/notespatial-room-before/merged-composer.mjs' · done","at":1790214092509},{"id":"exec-b6cd5c7b-5635-40d7-aa8b-b7d1f214158f","kind":"command","text":"/bin/zsh -lc \"rg -n '<<<<<<<|=======|>>>>>>>' tmp/notespatial-room-before/merged-composer.mjs\" · exit 1","at":1790214092570},{"id":"exec-fd7ef01d-96f3-4c59-a4d4-005eda245b0d","kind":"command","text":"/bin/zsh -lc 'cp tmp/notespatial-room-before/merged-composer.mjs fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214101246},{"id":"exec-9eaea465-fd75-4e38-bd0a-550cc8ce39a3","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets' · done","at":1790214101393},{"id":"exec-560af378-4ecd-4018-b348-4f7779506f64","kind":"command","text":"/bin/zsh -lc \"cat fedac/native/tools/sub-receiver/core.test.mjs; sed -n '200,250p' fedac/native/tools/notespatial-native-render.mjs; sed -n '370,410p' fedac/native/src/gm_synth.h; sed -n '60,120p' fedac/native/tools/pitch-audit.c\" · done","at":1790214101572},{"id":"exec-00267855-c36d-4fab-bfd3-c3e3ea706e04","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/core.mjs · completed","at":1790214181059},{"id":"msg_037b90d4d6021357016ab4802d910887d18b8c3a44f05d21d7","kind":"assistant","text":"I’ll use the mallet ensemble for this pass and treat the kick as synthesized. I also found a subwoofer bug: the newer bass harmonics and kick click could make its score loader reject the arrangement. I’ve adjusted it to select the low-frequency content, and I’m adding that filtered feed and a visible SUB cabinet to the video.","at":1790214190440,"activityOnly":true},{"id":"exec-6caa52ce-55df-490e-b5ec-6f485a4c0e7c","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs · completed","at":1790214249824},{"id":"exec-c853de65-8333-4997-b724-804526380874","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214249853},{"id":"exec-5310ddee-ffce-4aec-93af-ebd0ed6f4f8c","kind":"command","text":"/bin/zsh -lc \"sed -n '150,230p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790214249951},{"id":"exec-5cc45611-4d11-4448-91d3-f1528e042b41","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\np=Path('fedac/native/tools/notespatial-native-render.mjs')\ns=p.read_text()\na=s.index(' const inputs = [], graph = [];')\nb=s.index(\\\"if (flag('audio-only'))\\\",a)\ns=s[:a]+s[a:b].replace('SEATS','OUTPUTS')+s[b:]\np.write_text(s)\nPY\" · done","at":1790214317416},{"id":"exec-7c1f166a-6d7c-414c-b6cf-70b42046a7fc","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214318004},{"id":"exec-9e07141b-58fe-47c6-9504-0b7e7e0c2103","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets --kick' · done","at":1790214318210},{"id":"exec-43c5cf2c-74bd-42d6-87d8-03d928bb49db","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --to 12 --out tmp/notespatial-room-before/room-preview.mp4' · done","at":1790214318816},{"id":"exec-e74fa052-e95c-43f1-8b97-329753752e49","kind":"command","text":"/bin/zsh -lc \"sed -n '1,100p' fedac/native/tools/sub-receiver/server.mjs; sed -n '1,100p' fedac/native/tools/sub-receiver/windows/launch.mjs\" · done","at":1790214334769},{"id":"exec-9dbf73e6-4163-47d9-a089-b76ebfec3d6f","kind":"command","text":"/bin/zsh -lc \"git diff --stat -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/sub-receiver/core.mjs; rg -n 'fx|gmProgram|sub-receiver' fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/spatial-rehearsal.mjs\" · exit 1","at":1790214334949},{"id":"exec-897e66a7-8062-41eb-be79-bef814f4e808","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 0.08 -i tmp/notespatial-room-before/room-preview.mp4 -frames:v 1 -y tmp/notespatial-room-before/room-frame.png' · done","at":1790214335180},{"id":"exec-2ad5d441-c396-4451-918f-cb55318e7808","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.test.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/core.test.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/server.mjs · completed","at":1790214387183},{"id":"exec-71e27b78-b959-4fde-bf2e-64709a5717e9","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs' · done","at":1790214387496},{"id":"exec-61f97b46-ba18-4c9f-a43d-f8aeaac308e8","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214419293},{"id":"exec-7316b203-7700-4b48-ae61-d32ca36d7896","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --to 3 --out tmp/notespatial-room-before/room-preview-final.mp4' · done","at":1790214419594},{"id":"exec-cf223ea1-1c86-4e7d-a04e-fb2a778978ee","kind":"command","text":"/bin/zsh -lc 'git diff -- grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md' · done","at":1790214420656},{"id":"exec-9416eb6b-1b87-434b-ab6e-b33b35dc4c76","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\nimport subprocess\np=Path('grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md')\ncurrent=p.read_text()\ns=subprocess.check_output(['git','show','HEAD:'+str(p)],text=True)\ns=s.replace('cartoon score is, with stingers and silences. What ties them: the theme','cartoon score is, with stingers and melodic rests. Percussion carries the\\\\nbeat through every chapter and transition. What ties them: the theme')\nfor key in ['I','III','IV','V','VI','VII','IX','X','XI']:\n prefix='| '+key+' |'\n new=next(l for l in current.splitlines() if l.startswith(prefix))\n old=next(l for l in s.splitlines() if l.startswith(prefix))\n s=s.replace(old,new)\ns=s.replace('General pause.','Percussion bridges the melodic pause.')\na=s.index('Measured on the binaural render')\nb=s.index('## Instruments',a)\ns=s[:a]+'''Percussion follows each chapter's tempo: three beats in the Waltz, two\nthumps with six brushed eighths in the Lullaby, a quarter-note pulse\nelsewhere. Existing kit attacks take precedence. The melodic pauses\nretain the pulse; the Return sheds its larger tap pattern but keeps quiet\ntime through the Vanish's final knock. \"'`--kick` adds a restrained kick on\nthe main steps throughout; the Lift keeps its written kit.\n\nThe mallets-and-kick score has 17,018 events and peaks at 28 simultaneous\nvoices against the runtime'\"'s 32-voice limit.\n\n'''+s[b:]\ns=s.replace('the first bell from the held laptop alone.','the held voice over percussion from the first beat.')\ns=s.replace('the first tap lands on the downbeat the scale lap set up.','the Walk\\\\'s fuller taps land on the downbeat the scale lap set up.')\ns=s.replace('the tutti D chord from all six, then the pause.','the tutti D chord from all six, then percussion alone.')\npos=s.index('## Listen for, at the tech')\ns=s[:pos]+'''## Mallets, kick and SUB preview\n\n\"'```sh\nnode fedac/native/tools/compose-notespatial-native.mjs --voicing mallets --kick\nnode fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore\nnode fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --out grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\n```\n\nThe video shows the instrument families, a kick hit indicator, and a SUB\ncabinet whose cone follows its filtered signal. SUB uses the receiver'\"'s\nbass/kick selection one octave down, 25 Hz high-pass, two 80 Hz low-pass\nsections, and 25% level. Its compressor is approximated. \"'`--sub-level`,\n`--sub-cutoff` and `--sub-az` adjust the model; the assumed position is at\nthe front, outside the laptop ring. It stays fixed when the field turns.\nRoom acoustics, device response and receiver latency are not simulated.\n`--solo sub --audio-only` exports the SUB alone for inspection.\n\nFor live rehearsal, start the receiver with\n`SUB_SCORE=fedac/native/scores/notespatial-native-mallets-kick.nsscore node fedac/native/tools/sub-receiver/server.mjs`\nand deploy that same score to the six laptops. This render does not deploy\nto the room or publish an OS update.\n\n'\"'''+s[pos:]\np.write_text(s)\nPY\" · done","at":1790214467229},{"id":"exec-37f7b1a3-f114-4d89-8b57-530667aa16c3","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/README.md, /Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790214488533},{"id":"exec-72cfe156-f547-45cc-857f-24300ff81e42","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 0.08 -i tmp/notespatial-room-before/room-preview-final.mp4 -frames:v 1 -y tmp/notespatial-room-before/room-frame-final.png' · done","at":1790214488745},{"id":"exec-a712f3b4-37ae-469a-8efc-43ade94a0071","kind":"command","text":"/bin/zsh -lc \"git ls-files 'grants/culturehub-la-2026/*.mp4' 'fedac/native/scores/notespatial-native*.nsscore'; rg -n 'notespatial|mp4' .gitignore grants/culturehub-la-2026/.gitignore\" · done","at":1790214505883},{"id":"exec-e2a66f36-07e2-4c96-835b-d24f1d467d2e","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --out grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790214506050},{"id":"exec-70737e19-6ba5-4680-b9fa-525025b40462","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore' · done","at":1790214507191},{"id":"msg_037b90d4d6021357016ab48174555887d1a6b40f83df68f121","kind":"assistant","text":"The preview now includes the mallet instruments, a kick indicator, and a SUB cabinet driven by the filtered bass signal. All 17,018 score events pass playback checks, and polyphony stays at 28 of 32 voices. I’m encoding the full version and preparing the code and scores to commit and push.","at":1790214516602,"activityOnly":true},{"id":"exec-a5d576ec-cbfa-4ba7-940d-f76fb46c1bb5","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs ' · done","at":1790214526244},{"id":"exec-e8a4b5b6-0050-4db6-9b61-07964f663878","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing native' · done","at":1790214527445},{"id":"exec-55aa2648-0dfc-4a75-b784-e92412188702","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing gm' · done","at":1790214528567},{"id":"exec-59cee4cc-c51e-47a5-b6bc-132d679526d2","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --fx studio' · done","at":1790214529955},{"id":"exec-39d0093d-cdbc-4a3b-be35-5e89c0d5a70b","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs' · exit 1","at":1790214531255},{"id":"exec-6fedc59d-137c-4a6f-ae83-4ca4846ccb18","kind":"command","text":"/bin/zsh -lc 'git diff --check -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/sub-receiver/ grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md; git diff --cached --stat' · done","at":1790214532700},{"id":"exec-50c6bdc1-b7a7-4df0-966e-099de921f737","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs' · done","at":1790214543834},{"id":"entry-1790214543980-0.1997462165820424","kind":"notice","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs'","at":1790214543981},{"id":"entry-1790214722734-0.07154112971987892","kind":"notice","text":"Allowed: /bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs'","at":1790214722734},{"id":"exec-806d768f-29f9-4eae-9469-790c4b7909ed","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nimport {makeSubScore} from './fedac/native/tools/sub-receiver/core.mjs';\nfor(const name of ['notespatial-native','notespatial-native-mallets','notespatial-native-native','notespatial-native-gm','notespatial-native-fx','notespatial-native-mallets-kick']) {\n const s=JSON.parse(fs.readFileSync(\"'`fedac/native/scores/${name}.nsscore`));\n const points=s.lanes.flatMap(l=>l.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\n let live=0,peak=0;for(const p of points){live+=p.d;peak=Math.max(live,peak);} assert.ok(peak<=32,name);\n const sub=makeSubScore(s);assert.ok(sub.events.length>0);\n const hits=s.lanes.flatMap(l=>l.events.filter(e=>/''^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\n for(const m of s.movements){const end=m===s.movements.at(-1)?m.t1-3:m.t1; const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];assert.ok(Math.max(...ts.slice(1).map((t,i)=>t-ts[i]))<1.101,m.name);}\n console.log(\"'`${name}: ${peak}/32 peak voices; ${sub.events.length} sub events; percussion across all chapters`);\n}\nJS' · done","at":1790214749281},{"id":"exec-2373d2cb-55cb-4ea3-a0c6-b96a04d2eb0e","kind":"command","text":"/bin/zsh -lc \"git status --short -- fedac/native/tools grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md; git log -1 --format='%h %s'\" · done","at":1790214751114},{"id":"exec-50ac5753-3f62-4d09-9566-97facac55127","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs, /Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790214771562},{"id":"exec-1fd559d1-bd23-4487-ad7f-ad900d5c1250","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs' · done","at":1790214772282},{"id":"exec-e45cab75-b9f8-44d6-ae45-cf3b4d095463","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.test.mjs · completed","at":1790214801172},{"id":"exec-63c34465-78bc-402e-8d97-32817e4351ea","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-room-audio.test.mjs' · done","at":1790214802224},{"id":"exec-1c2f1a7a-c629-425f-aac1-51c8bcc98bcf","kind":"command","text":"/bin/zsh -lc 'git diff --check; git diff --numstat -- fedac/native/scores; git diff --cached --name-only' · done","at":1790214803739},{"id":"exec-97e350c2-c962-4ea5-91f1-fd405b1df7c1","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport {execFileSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst path='fedac/native/scores/notespatial-native-mallets.nsscore';\nconst before=JSON.parse(execFileSync('git',['show',\"'`HEAD:${path}`]));\nconst after=JSON.parse(fs.readFileSync('\"'fedac/native/scores/notespatial-native-mallets-kick.nsscore'));\nassert.deepEqual(after.voicing,before.voicing);\nassert.equal(after.dur,before.dur);\nassert.deepEqual(after.movements.map(m=>[m.t0,m.t1]),before.movements.map(m=>[m.t0,m.t1]));\nfor(const lane of before.lanes){const now=after.lanes.find(l=>l.name===lane.name);const events=new Set(now.events.map(e=>JSON.stringify(e)));assert.ok(lane.events.every(e=>events.has(JSON.stringify(e))),lane.name);}\nconsole.log('Committed mallet instruments, every original event, all cue times and duration preserved.');\nJS\" · exit 1","at":1790214829730},{"id":"exec-176f5e33-8cec-4bdb-bfd4-b82d569a1235","kind":"command","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\" · exit 128","at":1790214832668},{"id":"exec-b1670101-4dd7-4202-88c8-bd94e56af065","kind":"command","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\" · done","at":1790214976811},{"id":"entry-1790214977093-0.5571039542198296","kind":"notice","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790214977093},{"id":"entry-1790214991568-0.3304083088209243","kind":"notice","text":"Allowed: /bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790214991568},{"id":"msg_037b90d4d6021357016ab483538c8c87d19543a19f197e1df3","kind":"assistant","text":"The tests are passing, and the full render is still encoding. This pass uses the mallet ensemble with a synthesized kick; the sub is modeled at the front at its receiver’s 25% default level. Its real-room level and timing will still need to be set during rehearsal.","at":1790214997732,"activityOnly":true},{"id":"exec-002c2e33-8730-4f2a-a6ba-e625319d2e71","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport {execFileSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst path='fedac/native/scores/notespatial-native-mallets.nsscore';\nconst before=JSON.parse(execFileSync('git',['show',\"'`HEAD:${path}`],{maxBuffer:10*1024*1024}));\nconst after=JSON.parse(fs.readFileSync('\"'fedac/native/scores/notespatial-native-mallets-kick.nsscore'));\nassert.deepEqual(after.voicing,before.voicing);\nassert.equal(after.dur,before.dur);\nassert.deepEqual(after.movements.map(m=>[m.t0,m.t1]),before.movements.map(m=>[m.t0,m.t1]));\nfor(const lane of before.lanes){const now=after.lanes.find(l=>l.name===lane.name);const events=new Set(now.events.map(e=>JSON.stringify(e)));assert.ok(lane.events.every(e=>events.has(JSON.stringify(e))),lane.name);}\nconsole.log('Committed mallet instruments, every original event, all cue times and duration preserved.');\nJS\" · done","at":1790215014033},{"id":"exec-843ab421-d68e-405f-9099-322bfd86d557","kind":"command","text":"/bin/zsh -lc 'git diff --cached --stat; git diff --cached --check; ls -lh grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215015210},{"id":"exec-a9c1f48d-7146-4a5f-8ba6-c6eac4d76b69","kind":"command","text":"/bin/zsh -lc 'git commit -m \"notespatial: keep percussion throughout and render mallets, kick and sub\"' · done","at":1790215030426},{"id":"exec-2f053665-ec74-45e3-b4ad-d524965de65d","kind":"command","text":"/bin/zsh -lc \"git log -1 --format='%h %s'; git status --short -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790215041736},{"id":"exec-b6061510-e801-4737-8cad-f3a0cbccb263","kind":"command","text":"/bin/zsh -lc 'git push origin bedd6b2194:main' · done","at":1790215051934},{"id":"msg_037b90d4d6021357016ab483a43ae487d1aa72e4592f3c3424","kind":"assistant","text":"Committed and pushed as `bedd6b2194`. The full video is still encoding; the short preview passed visual inspection. Once it finishes, I’ll check the exported file and open it in QuickTime.","at":1790215076689,"activityOnly":true},{"id":"exec-bbdb684f-d637-4268-9c06-f0009cce3398","kind":"command","text":"/bin/zsh -lc 'ls -lhT grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215119686},{"id":"msg_037b90d4d6021357016ab484099a8087d1a8307f3ab47d6545","kind":"assistant","text":"The larger instrument score is taking longer to render, but the file is still growing normally. The code and scores are already pushed; only the full-video check and QuickTime playback remain.","at":1790215178199,"activityOnly":true},{"id":"exec-b20e96da-5edf-4503-ab41-9c96e1a2d8ae","kind":"command","text":"/bin/zsh -lc 'ls -lhT grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215259088},{"id":"msg_037b90d4d6021357016ab4846b802487d1a4174ed3ed28b59d","kind":"assistant","text":"The full render has reached 53 MB and is still progressing. It includes the instrument parts from the committed mallet arrangement, plus the continuous percussion, kick, and sub feed.","at":1790215276079,"activityOnly":true},{"id":"msg_037b90d4d6021357016ab484c1872c87d1a3b600dca0ce6d07","kind":"assistant","text":"All four instrument palettes have been rebuilt with continuous percussion. The video uses mallets because their score-defined tones render directly; native flute, harp, and piano still use approximations in this renderer.","at":1790215362116,"activityOnly":true},{"id":"exec-b3950aac-9adb-4324-b629-fa8f9b6a681c","kind":"command","text":"/bin/zsh -lc 'ffprobe -v error -show_entries format=duration,size:stream=codec_name,codec_type,width,height -of json grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215381234},{"id":"exec-f40203f2-3e7a-48ed-8a05-bf9517c3d7eb","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 480 -i grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4 -frames:v 1 -y tmp/notespatial-room-before/full-lift.png' · done","at":1790215381861},{"id":"exec-9e24b0e9-80ea-4b5c-a227-af08e47a167c","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 750 -i grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4 -frames:v 1 -y tmp/notespatial-room-before/full-ending.png' · done","at":1790215382004},{"id":"msg_037b90d4d6021357016ab484da39ac87d19dace65a324c6d90","kind":"assistant","text":"The full render is finished. I’m checking the exported video and its busiest and closing sections, then opening it in QuickTime.","at":1790215387512,"activityOnly":true},{"id":"exec-d759784c-5dbf-47b6-a8aa-13f25eb8d1e9","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\" · done","at":1790215399131},{"id":"entry-1790215399246-0.9909742063535956","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\"","at":1790215399246},{"id":"entry-1790215561748-0.4156000331300401","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\"","at":1790215561748},{"id":"msg_037b90d4d6021357016ab4859284a487d1af37c61eeead02d4","kind":"assistant","text":"Opened the new full render in QuickTime: mallet instruments, continuous percussion, synthesized kick, and an animated, audible SUB model.\n\nCommitted and pushed as `bedd6b2194`. All 14 tests pass.\n\nThe sub’s front placement and 25% level are preview assumptions; room calibration remains.","at":1790215571046}],"input":"","cursor":0,"history":["sup","what should we work on","hmm how about we open that last arrangement in quicktime","hmm i think the whole piece needs percussion","the whole time","so rhythm is felt","in eevery part thatd oesnt have it like the start part","for example","so thats one thing we can fix!","also we recently added more instruments to our arrangement but we havent baked a videow itht hat","so thats another aspect of the next render we need to compush","also our subwoofer","and maybe a kick drum","need to be modeled out too","i think more complex arrngements like lift would be cool too"],"historyIndex":15,"queued":["i think more complex arrngements like lift would be cool too"],"medium":"piece","showQr":true,"autoAllow":false,"scrollOffset":0},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"01a0d103-879b-78f0-a45d-dafa5a1fc2fb"},"handoff":"","archivedConversation":[],"transcriptId":"b6a647e3-9315-4fcc-8cec-ac6e9c95ba8a"} diff --git a/.easel/threads/1790216046981-98274669-a8e4-4299-93f2-93f8fa326f2d.json b/.easel/threads/1790216046981-98274669-a8e4-4299-93f2-93f8fa326f2d.json new file mode 100644 index 0000000000..e4015bdb78 --- /dev/null +++ b/.easel/threads/1790216046981-98274669-a8e4-4299-93f2-93f8fa326f2d.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:12:54.398Z","backend":"claude","model":"claude-opus-5-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/defu.mjs","runtime":"mjs","channel":"b8TK-AMK","genre":"piece"},"ui":{"entries":[{"id":"entry-1790215833380-0.14705242758015025","kind":"user","text":"hi","at":1790215833381},{"id":"msg_011CfMTBZenTkHhnLzpRdXWL:1","kind":"assistant","text":"Hi. What are we working on?\n\nThe Airtable plugin needs authorization before its tools will work. You can run `/mcp` in an interactive session to authorize it.","at":1790215840556},{"id":"entry-1790215852474-0.4016630992364236","kind":"user","text":"i authorize it","at":1790215852474},{"id":"msg_011CfMTCrFDXpw6oUqQdWZfV:0","kind":"assistant","text":"I can't do the authorization from here. This session is non-interactive, so the OAuth flow won't open, and saying so in chat doesn't grant it.\n\nTo authorize it, open an interactive Claude Code session and run `/mcp`. Pick the airtable server and follow the browser prompt. The Airtable tools will work after that.","at":1790215857018},{"id":"entry-1790215884691-0.9726713571990477","kind":"error","text":"Unknown command: /mcp","at":1790215884700},{"id":"entry-1790215889252-0.7762523113845994","kind":"user","text":"nvm","at":1790215889252},{"id":"msg_011CfMTFYQVxMwnNaUEG3h8X:1","kind":"assistant","text":"Okay. What's next?","at":1790215893713},{"id":"entry-1790215912678-0.5704376314254875","kind":"user","text":"make a png of s tick figure and open it in preview","at":1790215912678},{"id":"msg_011CfMTJmYbioSgjALXMH9LW:0","kind":"assistant","text":"I drew a stick figure and saved it to `/tmp/stick-figure.png`. It's open in Preview now.","at":1790215937613},{"id":"entry-1790215945753-0.9456294358908852","kind":"user","text":"can he be cooler?","at":1790215945753},{"id":"msg_011CfMTMKYkD679Kf5tBD2EV:0","kind":"assistant","text":"He's cooler now. He has sunglasses, a red backwards cap and a smirk. One hand is on his hip and the other is throwing a peace sign. He's standing on a skateboard.\n\nIt's saved to `/tmp/stick-figure-cool.png` and open in Preview.","at":1790215972558}],"input":"","cursor":0,"history":["hi","i authorize it","nvm","make a png of s tick figure and open it in preview","can he be cooler?"],"historyIndex":5,"queued":[],"medium":"piece","showQr":true,"autoAllow":false},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"0b3f07fc-f9b1-47b3-8fef-d8fdcac87222"},"handoff":"","archivedConversation":[],"transcriptId":"c6a39a10-6fa7-4825-9dd3-cc4e474b5596"} diff --git a/.easel/threads/1790216276568-444240fc-f97f-4371-adcb-7bf6d70222bd.json b/.easel/threads/1790216276568-444240fc-f97f-4371-adcb-7bf6d70222bd.json new file mode 100644 index 0000000000..1e64be6655 --- /dev/null +++ b/.easel/threads/1790216276568-444240fc-f97f-4371-adcb-7bf6d70222bd.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:14:14.920Z","backend":"claude","model":"claude-sonnet-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/nikobe.mjs","runtime":"mjs","channel":"4rMwk6mh","genre":"piece"},"ui":{"entries":[{"id":"profile","kind":"notice","text":"Profile · pro: --pro; private: --private"}],"input":"","cursor":0,"history":[],"historyIndex":0,"queued":[],"medium":"piece","showQr":true,"autoAllow":false},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"de1e1bde-74db-4018-8495-407deffdf773"},"handoff":"","archivedConversation":[]} diff --git a/.easel/threads/1790218069825-8f92aff9-9032-4b2d-9783-a50674ad617b.json b/.easel/threads/1790218069825-8f92aff9-9032-4b2d-9783-a50674ad617b.json new file mode 100644 index 0000000000..8deed04f16 --- /dev/null +++ b/.easel/threads/1790218069825-8f92aff9-9032-4b2d-9783-a50674ad617b.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:40:05.109Z","backend":"claude","model":"claude-opus-5-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/defu.mjs","runtime":"mjs","channel":"b8TK-AMK","genre":"piece"},"ui":{"entries":[{"id":"entry-1790215833380-0.14705242758015025","kind":"user","text":"hi","at":1790215833381},{"id":"msg_011CfMTBZenTkHhnLzpRdXWL:1","kind":"assistant","text":"Hi. What are we working on?\n\nThe Airtable plugin needs authorization before its tools will work. You can run `/mcp` in an interactive session to authorize it.","at":1790215840556},{"id":"entry-1790215852474-0.4016630992364236","kind":"user","text":"i authorize it","at":1790215852474},{"id":"msg_011CfMTCrFDXpw6oUqQdWZfV:0","kind":"assistant","text":"I can't do the authorization from here. This session is non-interactive, so the OAuth flow won't open, and saying so in chat doesn't grant it.\n\nTo authorize it, open an interactive Claude Code session and run `/mcp`. Pick the airtable server and follow the browser prompt. The Airtable tools will work after that.","at":1790215857018},{"id":"entry-1790215884691-0.9726713571990477","kind":"error","text":"Unknown command: /mcp","at":1790215884700},{"id":"entry-1790215889252-0.7762523113845994","kind":"user","text":"nvm","at":1790215889252},{"id":"msg_011CfMTFYQVxMwnNaUEG3h8X:1","kind":"assistant","text":"Okay. What's next?","at":1790215893713},{"id":"entry-1790215912678-0.5704376314254875","kind":"user","text":"make a png of s tick figure and open it in preview","at":1790215912678},{"id":"msg_011CfMTJmYbioSgjALXMH9LW:0","kind":"assistant","text":"I drew a stick figure and saved it to `/tmp/stick-figure.png`. It's open in Preview now.","at":1790215937613},{"id":"entry-1790215945753-0.9456294358908852","kind":"user","text":"can he be cooler?","at":1790215945753},{"id":"msg_011CfMTMKYkD679Kf5tBD2EV:0","kind":"assistant","text":"He's cooler now. He has sunglasses, a red backwards cap and a smirk. One hand is on his hip and the other is throwing a peace sign. He's standing on a skateboard.\n\nIt's saved to `/tmp/stick-figure-cool.png` and open in Preview.","at":1790215972558},{"id":"entry-1790217314994-0.41825259246681545","kind":"user","text":"make t wavier and put it in a cirty with 1000 of them","at":1790217314994},{"id":"msg_011CfMV7JjEnmM1qmcDf9Ugo:1","kind":"assistant","text":"The front of the crowd turned into a colorful mush, and the figures are too small to show their wobble. I'll push most of the crowd toward the back and make the front figures bigger and wavier.","at":1790217358332,"activityOnly":true},{"id":"msg_011CfMV8UC2T1NwPf1fLeGAc:0","kind":"assistant","text":"There are 1000 of him now, skating down a street in front of a purple skyline at sunset. His limbs and head wobble now. Each one gets a random cap color, a random board, and either a peace sign or a big wave.\n\nThe front rows are still crowded and overlap a lot, so you can't make out individual figures there. I can spread them out or add a few big ones up front if you want.\n\nIt's open in Preview and saved at `/tmp/stick-city.png`. The script is `/tmp/stick-city.py`.","at":1790217373779},{"id":"entry-1790217395606-0.9978452205920906","kind":"user","text":"put oen in 3d","at":1790217395606},{"id":"msg_011CfMVPw1zWG5JoGDwy1yAz:1","kind":"assistant","text":"I built him as a 3D scene in `/tmp/stick-3d.html`, but I haven't seen it render yet. I asked Chrome to open it, and Chrome came to the front, but no window with it showed up in my screen capture. It may have landed in another space. A headless render timed out, so I have no screenshot.\n\nIn the scene, his arms, legs and body are wavy black tubes that keep wiggling. He has a white head, a red backwards cap, black sunglasses and a smirk. He rides a skateboard with yellow wheels. He stands on a street inside a ring of purple buildings, with an orange sunset sky. The camera circles him slowly, and you can drag to orbit or scroll to zoom. It loads three.js from a CDN, so it needs internet.\n\nIf Chrome shows a blank page, tell me and I'll debug it.","at":1790217584712}],"input":"","cursor":0,"history":["hi","i authorize it","nvm","make a png of s tick figure and open it in preview","can he be cooler?","make t wavier and put it in a cirty with 1000 of them","put oen in 3d"],"historyIndex":7,"queued":[],"medium":"piece","showQr":true,"autoAllow":false,"scrollOffset":0},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"0b3f07fc-f9b1-47b3-8fef-d8fdcac87222"},"handoff":"","archivedConversation":[],"transcriptId":"c6a39a10-6fa7-4825-9dd3-cc4e474b5596"} diff --git a/.easel/threads/1790218189719-1976509c-8243-4fb1-9313-108e77654c1d.json b/.easel/threads/1790218189719-1976509c-8243-4fb1-9313-108e77654c1d.json new file mode 100644 index 0000000000..8deed04f16 --- /dev/null +++ b/.easel/threads/1790218189719-1976509c-8243-4fb1-9313-108e77654c1d.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:40:05.109Z","backend":"claude","model":"claude-opus-5-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/defu.mjs","runtime":"mjs","channel":"b8TK-AMK","genre":"piece"},"ui":{"entries":[{"id":"entry-1790215833380-0.14705242758015025","kind":"user","text":"hi","at":1790215833381},{"id":"msg_011CfMTBZenTkHhnLzpRdXWL:1","kind":"assistant","text":"Hi. What are we working on?\n\nThe Airtable plugin needs authorization before its tools will work. You can run `/mcp` in an interactive session to authorize it.","at":1790215840556},{"id":"entry-1790215852474-0.4016630992364236","kind":"user","text":"i authorize it","at":1790215852474},{"id":"msg_011CfMTCrFDXpw6oUqQdWZfV:0","kind":"assistant","text":"I can't do the authorization from here. This session is non-interactive, so the OAuth flow won't open, and saying so in chat doesn't grant it.\n\nTo authorize it, open an interactive Claude Code session and run `/mcp`. Pick the airtable server and follow the browser prompt. The Airtable tools will work after that.","at":1790215857018},{"id":"entry-1790215884691-0.9726713571990477","kind":"error","text":"Unknown command: /mcp","at":1790215884700},{"id":"entry-1790215889252-0.7762523113845994","kind":"user","text":"nvm","at":1790215889252},{"id":"msg_011CfMTFYQVxMwnNaUEG3h8X:1","kind":"assistant","text":"Okay. What's next?","at":1790215893713},{"id":"entry-1790215912678-0.5704376314254875","kind":"user","text":"make a png of s tick figure and open it in preview","at":1790215912678},{"id":"msg_011CfMTJmYbioSgjALXMH9LW:0","kind":"assistant","text":"I drew a stick figure and saved it to `/tmp/stick-figure.png`. It's open in Preview now.","at":1790215937613},{"id":"entry-1790215945753-0.9456294358908852","kind":"user","text":"can he be cooler?","at":1790215945753},{"id":"msg_011CfMTMKYkD679Kf5tBD2EV:0","kind":"assistant","text":"He's cooler now. He has sunglasses, a red backwards cap and a smirk. One hand is on his hip and the other is throwing a peace sign. He's standing on a skateboard.\n\nIt's saved to `/tmp/stick-figure-cool.png` and open in Preview.","at":1790215972558},{"id":"entry-1790217314994-0.41825259246681545","kind":"user","text":"make t wavier and put it in a cirty with 1000 of them","at":1790217314994},{"id":"msg_011CfMV7JjEnmM1qmcDf9Ugo:1","kind":"assistant","text":"The front of the crowd turned into a colorful mush, and the figures are too small to show their wobble. I'll push most of the crowd toward the back and make the front figures bigger and wavier.","at":1790217358332,"activityOnly":true},{"id":"msg_011CfMV8UC2T1NwPf1fLeGAc:0","kind":"assistant","text":"There are 1000 of him now, skating down a street in front of a purple skyline at sunset. His limbs and head wobble now. Each one gets a random cap color, a random board, and either a peace sign or a big wave.\n\nThe front rows are still crowded and overlap a lot, so you can't make out individual figures there. I can spread them out or add a few big ones up front if you want.\n\nIt's open in Preview and saved at `/tmp/stick-city.png`. The script is `/tmp/stick-city.py`.","at":1790217373779},{"id":"entry-1790217395606-0.9978452205920906","kind":"user","text":"put oen in 3d","at":1790217395606},{"id":"msg_011CfMVPw1zWG5JoGDwy1yAz:1","kind":"assistant","text":"I built him as a 3D scene in `/tmp/stick-3d.html`, but I haven't seen it render yet. I asked Chrome to open it, and Chrome came to the front, but no window with it showed up in my screen capture. It may have landed in another space. A headless render timed out, so I have no screenshot.\n\nIn the scene, his arms, legs and body are wavy black tubes that keep wiggling. He has a white head, a red backwards cap, black sunglasses and a smirk. He rides a skateboard with yellow wheels. He stands on a street inside a ring of purple buildings, with an orange sunset sky. The camera circles him slowly, and you can drag to orbit or scroll to zoom. It loads three.js from a CDN, so it needs internet.\n\nIf Chrome shows a blank page, tell me and I'll debug it.","at":1790217584712}],"input":"","cursor":0,"history":["hi","i authorize it","nvm","make a png of s tick figure and open it in preview","can he be cooler?","make t wavier and put it in a cirty with 1000 of them","put oen in 3d"],"historyIndex":7,"queued":[],"medium":"piece","showQr":true,"autoAllow":false,"scrollOffset":0},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"0b3f07fc-f9b1-47b3-8fef-d8fdcac87222"},"handoff":"","archivedConversation":[],"transcriptId":"c6a39a10-6fa7-4825-9dd3-cc4e474b5596"} diff --git a/.easel/threads/1790218323826-1565f7a0-706d-475c-9c54-32052e3699ff.json b/.easel/threads/1790218323826-1565f7a0-706d-475c-9c54-32052e3699ff.json new file mode 100644 index 0000000000..a5aab44418 --- /dev/null +++ b/.easel/threads/1790218323826-1565f7a0-706d-475c-9c54-32052e3699ff.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:50:38.926Z","backend":"claude","model":"claude-sonnet-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/favu.mjs","runtime":"mjs","channel":"V1QV10HQ","genre":"piece"},"ui":{"entries":[{"id":"entry-1790218193590-0.6430507809279836","kind":"user","text":"Read the file system/public/aesthetic.computer/braincell.png and then reply with exactly the word seen.","at":1790218193590}],"input":"","cursor":0,"history":["Read the file system/public/aesthetic.computer/braincell.png and then reply with exactly the word seen."],"historyIndex":1,"queued":[],"medium":"piece","showQr":true,"autoAllow":false},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"6a98ab67-4924-4571-a91c-db58866b62c6"},"handoff":"","archivedConversation":[],"transcriptId":"cf74f7db-adce-42d0-a223-1fdd5085165e"} diff --git a/.easel/threads/1790218668757-c4915c45-530e-4518-858a-2b797286cb03.json b/.easel/threads/1790218668757-c4915c45-530e-4518-858a-2b797286cb03.json new file mode 100644 index 0000000000..30ce00f735 --- /dev/null +++ b/.easel/threads/1790218668757-c4915c45-530e-4518-858a-2b797286cb03.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T02:53:01.568Z","backend":"claude","model":"claude-sonnet-5","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/ninofi.mjs","runtime":"mjs","channel":"mbF1xrGH","genre":"piece"},"ui":{"entries":[{"id":"entry-1790218325973-0.2483162497785517","kind":"user","text":"Read the file system/public/aesthetic.computer/braincell.png and then reply with exactly the word seen.","at":1790218325973}],"input":"","cursor":0,"history":["Read the file system/public/aesthetic.computer/braincell.png and then reply with exactly the word seen."],"historyIndex":1,"queued":[],"medium":"piece","showQr":true,"autoAllow":false},"options":{"autopublish":false,"mouseEnabled":true},"engine":{"threadId":"f9c21d4e-dc95-47be-8108-bd010aeedf1e"},"handoff":"","archivedConversation":[],"transcriptId":"80a6078a-e409-4af3-b34d-92c249c6d0f4"} diff --git a/.easel/threads/1790307505464-3387881c-d78e-461c-b996-bb2c48fb7453.json b/.easel/threads/1790307505464-3387881c-d78e-461c-b996-bb2c48fb7453.json new file mode 100644 index 0000000000..4e509de973 --- /dev/null +++ b/.easel/threads/1790307505464-3387881c-d78e-461c-b996-bb2c48fb7453.json @@ -0,0 +1 @@ +{"liveTransfer":{"published":null,"publishedAt":0},"schema":1,"cwd":"/Users/jas/aesthetic-computer","savedAt":"2026-09-24T05:15:38.474Z","backend":"codex","model":"gpt-6-astra","effort":"","live":{"file":"/Users/jas/aesthetic-computer/system/public/aesthetic.computer/disks/gako.mjs","runtime":"mjs","channel":"wdy6bpeB","genre":"piece"},"ui":{"entries":[{"id":"exec-22391974-41e7-43b0-b181-817b3e490217","kind":"command","text":"/bin/zsh -lc 'rg --files -g AGENTS.md -g SCORE.md fedac grants' · done","at":1790213534774},{"id":"exec-fee383c9-b7fb-4ef1-8ff3-38cbffa91843","kind":"command","text":"/bin/zsh -lc 'cat fedac/SCORE.md fedac/native/SCORE.md' · done","at":1790213541600},{"id":"exec-08cfd332-c87c-4a8b-a478-1c122294f938","kind":"command","text":"/bin/zsh -lc \"sed -n '1,160p' fedac/native/tools/notespatial-native-check.mjs\" · done","at":1790213541608},{"id":"exec-b90f5e13-95b6-4485-9e06-e890a3ea115e","kind":"command","text":"/bin/zsh -lc \"sed -n '240,560p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790213541608},{"id":"exec-79f29957-c6df-4bfa-bb2c-71714c12d5c7","kind":"command","text":"/bin/zsh -lc \"sed -n '1,180p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790213541608},{"id":"exec-4e556d76-2019-4e46-a668-cbe2da46e8d1","kind":"command","text":"/bin/zsh -lc \"sed -n '325,485p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790213556478},{"id":"exec-9fe59fa6-40ed-4f6d-a559-05350400942f","kind":"command","text":"/bin/zsh -lc 'cat grants/SCORE.md' · done","at":1790213556480},{"id":"exec-ce9beed2-a8d5-40d5-94ec-fdf668c2ad3a","kind":"command","text":"/bin/zsh -lc \"rg -n 'spawn|ffmpeg|canvas|writeFile|process.stdout|console.log' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790213556504},{"id":"msg_037b90d4d6021357016ab47dc0a4d487d1b2973a710a75d1f5","kind":"assistant","text":"The opening, waltz, lullaby, and ending have long stretches without percussion. I’ll give each a pattern that follows its meter and tempo, and keep a light pulse under the pauses so the rhythm carries through.","at":1790213568694,"activityOnly":true},{"id":"entry-1790213585691-0.2646271148029534","kind":"user","text":"also we recently added more instruments to our arrangement but we havent baked a videow itht hat","at":1790213585691},{"id":"entry-1790213592706-0.03140749062175785","kind":"user","text":"so thats another aspect of the next render we need to compush","at":1790213592706},{"id":"exec-2cee1c3b-167d-414e-a15f-74f7bd92c4f5","kind":"command","text":"/bin/zsh -lc 'mkdir -p tmp/notespatial-percussion-before' · done","at":1790213610018},{"id":"exec-b3248ccd-2c3e-4aca-a62e-9d2431d0451f","kind":"command","text":"/bin/zsh -lc 'cp fedac/native/tools/compose-notespatial-native.mjs fedac/native/scores/notespatial-native.nsscore grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md tmp/notespatial-percussion-before/' · done","at":1790213610077},{"id":"exec-f2d8a63d-d80e-4373-9a6b-f65fb5898503","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs · completed","at":1790213610100},{"id":"exec-2dfa26cb-6036-48a8-a721-c9f1bdc80964","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790213610309},{"id":"exec-04ee7380-2fec-4fc2-ae80-329cbddbcdf4","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs' · done","at":1790213616186},{"id":"exec-3b87d38d-7c89-4d28-9c6a-ee7b209b2ac6","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs --out grants/culturehub-la-2026/notespatial-native-percussion.mp4' · done","at":1790213616199},{"id":"exec-605e366e-537a-4659-a247-e2f3d3e270a2","kind":"change","text":"/Users/jas/aesthetic-computer/grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md · completed","at":1790213668358},{"id":"exec-a3a336bd-a502-43bd-b13c-81f2279aced2","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst old = JSON.parse(fs.readFileSync('tmp/notespatial-percussion-before/notespatial-native.nsscore'));\nconst score = JSON.parse(fs.readFileSync('fedac/native/scores/notespatial-native.nsscore'));\nassert.equal(score.dur, old.dur);\nassert.deepEqual(score.movements.map(({t0,t1})=>({t0,t1})), old.movements.map(({t0,t1})=>({t0,t1})));\nassert.deepEqual(score.fieldShift, old.fieldShift);\nlet additions=0;\nfor(let i=0;in===0),old.lanes[i].name+' lost an event');\n}\nconst hits = score.lanes.flatMap(l=>l.events.filter(e=>/\"'^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\nfor(const m of score.movements) {\n const end=m===score.movements.at(-1)?m.t1-3:m.t1;\n const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];\n const gap=Math.max(...ts.slice(1).map((t,i)=>t-ts[i]));\n assert.ok(gap<=1.101,\"'`${m.name}: ${gap}s gap`);\n console.log(`${m.name}: longest percussion gap ${gap.toFixed(3)}s`);\n}\nfor(let i=0;in+l.events.length,0),score.lanes.reduce((n,l)=>n+l.events.filter(e=>e.t>=m.t0&&e.tl.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\nlet live=0,peak=0,at=0;\nfor(const p of points){live+=p.d;if(live>peak){peak=live;at=p.t;}}\nassert.ok(peak<=32);\nconsole.log(\"'`Global peak including chapter overlaps: ${peak}/32 voices at ${at.toFixed(3)}s.`);\nJS' · done","at":1790213798082},{"id":"msg_037b90d4d6021357016ab47ee3d45887d1a375e20afd2bf3b7","kind":"assistant","text":"The revised score stays within the playback limit at 20 simultaneous voices. I’m finishing the render with the corrected tempo label, then opening it for you to hear.","at":1790213859884,"activityOnly":true},{"id":"exec-05b94971-c2a9-4bee-9a60-204981feafb0","kind":"command","text":"/bin/zsh -lc 'ffprobe -v error -show_entries format=duration:stream=codec_name,codec_type,width,height -of json grants/culturehub-la-2026/notespatial-native-percussion.mp4' · done","at":1790213941754},{"id":"exec-723c6ba1-f08d-4430-89ce-2411de26ddc0","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 2 -i grants/culturehub-la-2026/notespatial-native-percussion.mp4 -frames:v 1 -y tmp/notespatial-percussion-before/revised-frame.png' · done","at":1790213941798},{"id":"exec-8a195642-48e2-43a4-8a31-01eb10554da3","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\" · done","at":1790213953023},{"id":"entry-1790213953023-0.4257987427798752","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213953023},{"id":"entry-1790213988833-0.8504555117738236","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-percussion.mp4\"","at":1790213988833},{"id":"msg_037b90d4d6021357016ab47f6b369487d19f9b75e8ca12c97f","kind":"assistant","text":"Added percussion throughout—all eleven chapters, from the first bell through the final knock. Patterns follow each section’s meter and tempo.\n\nRebuilt and checked the score, then opened the revised full arrangement in QuickTime.","at":1790213995289},{"id":"msg_037b90d4d6021357016ab47f735f5887d19f8710d7dad8f88d","kind":"assistant","text":"I’ll trace the newer instruments and speaker setup, then make sure the next render includes them alongside the continuous percussion. I’ll also check how the subwoofer and kick should fit the score and playback model.","at":1790214003456,"activityOnly":true},{"id":"exec-80b1fb43-c741-4e1b-91f2-097dd519dc0e","kind":"command","text":"/bin/zsh -lc \"git log -10 --format='%h %s'\" · done","at":1790214013034},{"id":"exec-ef09cd16-b86a-4339-aef1-bec2118b62a5","kind":"command","text":"/bin/zsh -lc \"rg -n -i 'subwoofer|sub.?bass|kick drum|instruments|instrument|speaker|compush' grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/docs/spatial-rehearsal.md fedac/native/lib/spatial-rehearsal.mjs fedac/native/pieces/spatial-rehearsal.mjs\" · done","at":1790214013102},{"id":"exec-a2581a97-037c-45e9-b6c8-d12650b68f72","kind":"command","text":"/bin/zsh -lc \"rg --files -g AGENTS.md -g '*instrument*' -g '*subwoofer*' -g '*notespatial*' fedac grants/culturehub-la-2026\" · done","at":1790214013102},{"id":"exec-7b1a51ef-3d75-450c-9111-5b12880bcc46","kind":"command","text":"/bin/zsh -lc 'git status --short' · done","at":1790214013102},{"id":"exec-bdf0ab31-fb8b-436f-835c-16ac33c79a1a","kind":"command","text":"/bin/zsh -lc \"sed -n '1,230p' fedac/native/lib/spatial-rehearsal.mjs\" · done","at":1790214025382},{"id":"exec-ac7ef85d-5a61-4cf0-8120-9999dfaf2abb","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214025406},{"id":"exec-7ef26b4a-b6b3-452f-aa92-916b12586a35","kind":"command","text":"/bin/zsh -lc \"git log -8 --format='%h %s' -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/src/audio.c\" · done","at":1790214025409},{"id":"exec-25999ff9-20f8-44f4-bae6-9c9ea3e60339","kind":"command","text":"/bin/zsh -lc \"rg -n -i 'subwoofer|soundfont|notespatial-native-gm|notespatial-native-mallets|instrument palette|orchestrat|preset' fedac/native/tools fedac/native/lib fedac/native/docs grants/culturehub-la-2026 --glob '*.mjs' --glob '*.md' --glob '*.json'\" · done","at":1790214025472},{"id":"exec-3a57a6af-b80b-4596-8552-f8348210253a","kind":"command","text":"/bin/zsh -lc 'cat grants/culturehub-la-2026/VOICINGS.md fedac/native/tools/sub-receiver/README.md' · done","at":1790214036311},{"id":"exec-29dd0549-bfa6-46d2-aef5-f710e852dd3d","kind":"command","text":"/bin/zsh -lc 'git show HEAD:fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214036332},{"id":"exec-9d84a0f0-b80b-423c-b9d2-94fbbbaf5bc3","kind":"command","text":"/bin/zsh -lc \"rg --files fedac/native/tools/sub-receiver; rg -n 'sub|kick|bass|synth|oscillator|filter' fedac/native/tools/sub-receiver/*\" · done","at":1790214036338},{"id":"exec-0b72777b-0c19-4edb-854c-bdd7cb260b47","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/pieces/spatial-rehearsal.mjs fedac/native/tools/notespatial-native-render.mjs; git branch --show-current; git remote -v' · done","at":1790214036362},{"id":"entry-1790214040897-0.3722189571702832","kind":"user","text":"i think more complex arrngements like lift would be cool too","at":1790214040897},{"id":"call_pktuCU5JEnZUePGD7B7HmBsx","kind":"assistant","text":"I found the newer instrument palettes. Which should lead the next full render?\n- Mallet ensemble: vibraphone, marimba, kalimba, xylophone, gamelan\n- Native ensemble: flute, harp, piano, synth bass and brass\n- General MIDI ensemble: flute, marimba, celesta, brass and clarinet\n\nFor the kick, do you mean a synthesized kick in the score, or a physical kick drum in the room model?\n- Synthesized kick, feeding the subwoofer too\n- Physical kick drum shown in the room","at":1790214046721,"activityOnly":true},{"id":"msg_037b90d4d6021357016ab47faa1da487d1a0d74c2c261ed779","kind":"assistant","text":"I found why the last video missed them: the working composer and renderer no longer include the recently committed instrument support. I’m bringing that support back while keeping the percussion changes. The subwoofer receiver already has a bass-and-kick feed, so I can use its behavior as the render’s reference.","at":1790214058200,"activityOnly":true},{"id":"exec-c86f8876-1758-4767-80d9-80e82c628e1d","kind":"command","text":"/bin/zsh -lc \"sed -n '200,420p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790214066990},{"id":"exec-f7b9d09f-9696-4305-84cf-da87e0b99fde","kind":"command","text":"/bin/zsh -lc 'cat fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/app.mjs' · done","at":1790214067031},{"id":"exec-5e58106c-8f63-45e8-8134-31797d460ccc","kind":"command","text":"/bin/zsh -lc \"git show HEAD:fedac/native/tools/compose-notespatial-native.mjs | sed -n '90,240p'\" · done","at":1790214067174},{"id":"exec-fb6560f8-83a5-4f82-9259-1f70c73e1b49","kind":"command","text":"/bin/zsh -lc \"rg -n 'gm_synth|offline|render.*wav|WAVE_KICK|kick|gm_program' fedac/native/Makefile fedac/native/tools fedac/native/src/audio.h fedac/native/src/audio.c fedac/native/src/gm_synth.h --glob '*.[ch]' --glob '*.mjs' --glob Makefile\" · done","at":1790214067244},{"id":"exec-01a7e918-e5ad-4f76-820f-803cfed91039","kind":"command","text":"/bin/zsh -lc 'mkdir -p tmp/notespatial-room-before' · done","at":1790214092332},{"id":"exec-a16c4e64-ec99-409c-882d-d9d77e9714f0","kind":"command","text":"/bin/zsh -lc 'cp fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/pieces/spatial-rehearsal.mjs fedac/native/scores/notespatial-native.nsscore tmp/notespatial-room-before/' · done","at":1790214092390},{"id":"exec-5d5198ac-63aa-4f8b-b657-19e6ba5c816d","kind":"command","text":"/bin/zsh -lc 'git show HEAD:fedac/native/tools/compose-notespatial-native.mjs > tmp/notespatial-room-before/committed-composer.mjs' · done","at":1790214092451},{"id":"exec-34be8bed-fd19-4f3c-9289-1708cffdd0a7","kind":"command","text":"/bin/zsh -lc 'git merge-file -p tmp/notespatial-room-before/compose-notespatial-native.mjs tmp/notespatial-percussion-before/compose-notespatial-native.mjs tmp/notespatial-room-before/committed-composer.mjs > tmp/notespatial-room-before/merged-composer.mjs' · done","at":1790214092509},{"id":"exec-b6cd5c7b-5635-40d7-aa8b-b7d1f214158f","kind":"command","text":"/bin/zsh -lc \"rg -n '<<<<<<<|=======|>>>>>>>' tmp/notespatial-room-before/merged-composer.mjs\" · exit 1","at":1790214092570},{"id":"exec-fd7ef01d-96f3-4c59-a4d4-005eda245b0d","kind":"command","text":"/bin/zsh -lc 'cp tmp/notespatial-room-before/merged-composer.mjs fedac/native/tools/compose-notespatial-native.mjs' · done","at":1790214101246},{"id":"exec-9eaea465-fd75-4e38-bd0a-550cc8ce39a3","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets' · done","at":1790214101393},{"id":"exec-560af378-4ecd-4018-b348-4f7779506f64","kind":"command","text":"/bin/zsh -lc \"cat fedac/native/tools/sub-receiver/core.test.mjs; sed -n '200,250p' fedac/native/tools/notespatial-native-render.mjs; sed -n '370,410p' fedac/native/src/gm_synth.h; sed -n '60,120p' fedac/native/tools/pitch-audit.c\" · done","at":1790214101572},{"id":"exec-00267855-c36d-4fab-bfd3-c3e3ea706e04","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/core.mjs · completed","at":1790214181059},{"id":"msg_037b90d4d6021357016ab4802d910887d18b8c3a44f05d21d7","kind":"assistant","text":"I’ll use the mallet ensemble for this pass and treat the kick as synthesized. I also found a subwoofer bug: the newer bass harmonics and kick click could make its score loader reject the arrangement. I’ve adjusted it to select the low-frequency content, and I’m adding that filtered feed and a visible SUB cabinet to the video.","at":1790214190440,"activityOnly":true},{"id":"exec-6caa52ce-55df-490e-b5ec-6f485a4c0e7c","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs · completed","at":1790214249824},{"id":"exec-c853de65-8333-4997-b724-804526380874","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214249853},{"id":"exec-5310ddee-ffce-4aec-93af-ebd0ed6f4f8c","kind":"command","text":"/bin/zsh -lc \"sed -n '150,230p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790214249951},{"id":"exec-5cc45611-4d11-4448-91d3-f1528e042b41","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\np=Path('fedac/native/tools/notespatial-native-render.mjs')\ns=p.read_text()\na=s.index(' const inputs = [], graph = [];')\nb=s.index(\\\"if (flag('audio-only'))\\\",a)\ns=s[:a]+s[a:b].replace('SEATS','OUTPUTS')+s[b:]\np.write_text(s)\nPY\" · done","at":1790214317416},{"id":"exec-7c1f166a-6d7c-414c-b6cf-70b42046a7fc","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214318004},{"id":"exec-9e07141b-58fe-47c6-9504-0b7e7e0c2103","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets --kick' · done","at":1790214318210},{"id":"exec-43c5cf2c-74bd-42d6-87d8-03d928bb49db","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --to 12 --out tmp/notespatial-room-before/room-preview.mp4' · done","at":1790214318816},{"id":"exec-e74fa052-e95c-43f1-8b97-329753752e49","kind":"command","text":"/bin/zsh -lc \"sed -n '1,100p' fedac/native/tools/sub-receiver/server.mjs; sed -n '1,100p' fedac/native/tools/sub-receiver/windows/launch.mjs\" · done","at":1790214334769},{"id":"exec-9dbf73e6-4163-47d9-a089-b76ebfec3d6f","kind":"command","text":"/bin/zsh -lc \"git diff --stat -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/sub-receiver/core.mjs; rg -n 'fx|gmProgram|sub-receiver' fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/spatial-rehearsal.mjs\" · exit 1","at":1790214334949},{"id":"exec-897e66a7-8062-41eb-be79-bef814f4e808","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 0.08 -i tmp/notespatial-room-before/room-preview.mp4 -frames:v 1 -y tmp/notespatial-room-before/room-frame.png' · done","at":1790214335180},{"id":"exec-2ad5d441-c396-4451-918f-cb55318e7808","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.test.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/core.test.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/server.mjs · completed","at":1790214387183},{"id":"exec-71e27b78-b959-4fde-bf2e-64709a5717e9","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs' · done","at":1790214387496},{"id":"exec-61f97b46-ba18-4c9f-a43d-f8aeaac308e8","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790214419293},{"id":"exec-7316b203-7700-4b48-ae61-d32ca36d7896","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --to 3 --out tmp/notespatial-room-before/room-preview-final.mp4' · done","at":1790214419594},{"id":"exec-cf223ea1-1c86-4e7d-a04e-fb2a778978ee","kind":"command","text":"/bin/zsh -lc 'git diff -- grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md' · done","at":1790214420656},{"id":"exec-9416eb6b-1b87-434b-ab6e-b33b35dc4c76","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\nimport subprocess\np=Path('grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md')\ncurrent=p.read_text()\ns=subprocess.check_output(['git','show','HEAD:'+str(p)],text=True)\ns=s.replace('cartoon score is, with stingers and silences. What ties them: the theme','cartoon score is, with stingers and melodic rests. Percussion carries the\\\\nbeat through every chapter and transition. What ties them: the theme')\nfor key in ['I','III','IV','V','VI','VII','IX','X','XI']:\n prefix='| '+key+' |'\n new=next(l for l in current.splitlines() if l.startswith(prefix))\n old=next(l for l in s.splitlines() if l.startswith(prefix))\n s=s.replace(old,new)\ns=s.replace('General pause.','Percussion bridges the melodic pause.')\na=s.index('Measured on the binaural render')\nb=s.index('## Instruments',a)\ns=s[:a]+'''Percussion follows each chapter's tempo: three beats in the Waltz, two\nthumps with six brushed eighths in the Lullaby, a quarter-note pulse\nelsewhere. Existing kit attacks take precedence. The melodic pauses\nretain the pulse; the Return sheds its larger tap pattern but keeps quiet\ntime through the Vanish's final knock. \"'`--kick` adds a restrained kick on\nthe main steps throughout; the Lift keeps its written kit.\n\nThe mallets-and-kick score has 17,018 events and peaks at 28 simultaneous\nvoices against the runtime'\"'s 32-voice limit.\n\n'''+s[b:]\ns=s.replace('the first bell from the held laptop alone.','the held voice over percussion from the first beat.')\ns=s.replace('the first tap lands on the downbeat the scale lap set up.','the Walk\\\\'s fuller taps land on the downbeat the scale lap set up.')\ns=s.replace('the tutti D chord from all six, then the pause.','the tutti D chord from all six, then percussion alone.')\npos=s.index('## Listen for, at the tech')\ns=s[:pos]+'''## Mallets, kick and SUB preview\n\n\"'```sh\nnode fedac/native/tools/compose-notespatial-native.mjs --voicing mallets --kick\nnode fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore\nnode fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --out grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\n```\n\nThe video shows the instrument families, a kick hit indicator, and a SUB\ncabinet whose cone follows its filtered signal. SUB uses the receiver'\"'s\nbass/kick selection one octave down, 25 Hz high-pass, two 80 Hz low-pass\nsections, and 25% level. Its compressor is approximated. \"'`--sub-level`,\n`--sub-cutoff` and `--sub-az` adjust the model; the assumed position is at\nthe front, outside the laptop ring. It stays fixed when the field turns.\nRoom acoustics, device response and receiver latency are not simulated.\n`--solo sub --audio-only` exports the SUB alone for inspection.\n\nFor live rehearsal, start the receiver with\n`SUB_SCORE=fedac/native/scores/notespatial-native-mallets-kick.nsscore node fedac/native/tools/sub-receiver/server.mjs`\nand deploy that same score to the six laptops. This render does not deploy\nto the room or publish an OS update.\n\n'\"'''+s[pos:]\np.write_text(s)\nPY\" · done","at":1790214467229},{"id":"exec-37f7b1a3-f114-4d89-8b57-530667aa16c3","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/sub-receiver/README.md, /Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790214488533},{"id":"exec-72cfe156-f547-45cc-857f-24300ff81e42","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 0.08 -i tmp/notespatial-room-before/room-preview-final.mp4 -frames:v 1 -y tmp/notespatial-room-before/room-frame-final.png' · done","at":1790214488745},{"id":"exec-a712f3b4-37ae-469a-8efc-43ade94a0071","kind":"command","text":"/bin/zsh -lc \"git ls-files 'grants/culturehub-la-2026/*.mp4' 'fedac/native/scores/notespatial-native*.nsscore'; rg -n 'notespatial|mp4' .gitignore grants/culturehub-la-2026/.gitignore\" · done","at":1790214505883},{"id":"exec-e2a66f36-07e2-4c96-835b-d24f1d467d2e","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore --sub --out grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790214506050},{"id":"exec-70737e19-6ba5-4680-b9fa-525025b40462","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore' · done","at":1790214507191},{"id":"msg_037b90d4d6021357016ab48174555887d1a6b40f83df68f121","kind":"assistant","text":"The preview now includes the mallet instruments, a kick indicator, and a SUB cabinet driven by the filtered bass signal. All 17,018 score events pass playback checks, and polyphony stays at 28 of 32 voices. I’m encoding the full version and preparing the code and scores to commit and push.","at":1790214516602,"activityOnly":true},{"id":"exec-a5d576ec-cbfa-4ba7-940d-f76fb46c1bb5","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs ' · done","at":1790214526244},{"id":"exec-e8a4b5b6-0050-4db6-9b61-07964f663878","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing native' · done","at":1790214527445},{"id":"exec-55aa2648-0dfc-4a75-b784-e92412188702","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing gm' · done","at":1790214528567},{"id":"exec-59cee4cc-c51e-47a5-b6bc-132d679526d2","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --fx studio' · done","at":1790214529955},{"id":"exec-39d0093d-cdbc-4a3b-be35-5e89c0d5a70b","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs' · exit 1","at":1790214531255},{"id":"exec-6fedc59d-137c-4a6f-ae83-4ca4846ccb18","kind":"command","text":"/bin/zsh -lc 'git diff --check -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/sub-receiver/ grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md; git diff --cached --stat' · done","at":1790214532700},{"id":"exec-50c6bdc1-b7a7-4df0-966e-099de921f737","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs' · done","at":1790214543834},{"id":"entry-1790214543980-0.1997462165820424","kind":"notice","text":"/bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs'","at":1790214543981},{"id":"entry-1790214722734-0.07154112971987892","kind":"notice","text":"Allowed: /bin/zsh -lc 'node --test fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs'","at":1790214722734},{"id":"exec-806d768f-29f9-4eae-9469-790c4b7909ed","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nimport {makeSubScore} from './fedac/native/tools/sub-receiver/core.mjs';\nfor(const name of ['notespatial-native','notespatial-native-mallets','notespatial-native-native','notespatial-native-gm','notespatial-native-fx','notespatial-native-mallets-kick']) {\n const s=JSON.parse(fs.readFileSync(\"'`fedac/native/scores/${name}.nsscore`));\n const points=s.lanes.flatMap(l=>l.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\n let live=0,peak=0;for(const p of points){live+=p.d;peak=Math.max(live,peak);} assert.ok(peak<=32,name);\n const sub=makeSubScore(s);assert.ok(sub.events.length>0);\n const hits=s.lanes.flatMap(l=>l.events.filter(e=>/''^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\n for(const m of s.movements){const end=m===s.movements.at(-1)?m.t1-3:m.t1; const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];assert.ok(Math.max(...ts.slice(1).map((t,i)=>t-ts[i]))<1.101,m.name);}\n console.log(\"'`${name}: ${peak}/32 peak voices; ${sub.events.length} sub events; percussion across all chapters`);\n}\nJS' · done","at":1790214749281},{"id":"exec-2373d2cb-55cb-4ea3-a0c6-b96a04d2eb0e","kind":"command","text":"/bin/zsh -lc \"git status --short -- fedac/native/tools grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md; git log -1 --format='%h %s'\" · done","at":1790214751114},{"id":"exec-50ac5753-3f62-4d09-9566-97facac55127","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs, /Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790214771562},{"id":"exec-1fd559d1-bd23-4487-ad7f-ad900d5c1250","kind":"command","text":"/bin/zsh -lc 'git diff -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs' · done","at":1790214772282},{"id":"exec-e45cab75-b9f8-44d6-ae45-cf3b4d095463","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-room-audio.test.mjs · completed","at":1790214801172},{"id":"exec-63c34465-78bc-402e-8d97-32817e4351ea","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-room-audio.test.mjs' · done","at":1790214802224},{"id":"exec-1c2f1a7a-c629-425f-aac1-51c8bcc98bcf","kind":"command","text":"/bin/zsh -lc 'git diff --check; git diff --numstat -- fedac/native/scores; git diff --cached --name-only' · done","at":1790214803739},{"id":"exec-97e350c2-c962-4ea5-91f1-fd405b1df7c1","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport {execFileSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst path='fedac/native/scores/notespatial-native-mallets.nsscore';\nconst before=JSON.parse(execFileSync('git',['show',\"'`HEAD:${path}`]));\nconst after=JSON.parse(fs.readFileSync('\"'fedac/native/scores/notespatial-native-mallets-kick.nsscore'));\nassert.deepEqual(after.voicing,before.voicing);\nassert.equal(after.dur,before.dur);\nassert.deepEqual(after.movements.map(m=>[m.t0,m.t1]),before.movements.map(m=>[m.t0,m.t1]));\nfor(const lane of before.lanes){const now=after.lanes.find(l=>l.name===lane.name);const events=new Set(now.events.map(e=>JSON.stringify(e)));assert.ok(lane.events.every(e=>events.has(JSON.stringify(e))),lane.name);}\nconsole.log('Committed mallet instruments, every original event, all cue times and duration preserved.');\nJS\" · exit 1","at":1790214829730},{"id":"exec-176f5e33-8cec-4bdb-bfd4-b82d569a1235","kind":"command","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\" · exit 128","at":1790214832668},{"id":"exec-b1670101-4dd7-4202-88c8-bd94e56af065","kind":"command","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\" · done","at":1790214976811},{"id":"entry-1790214977093-0.5571039542198296","kind":"notice","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790214977093},{"id":"entry-1790214991568-0.3304083088209243","kind":"notice","text":"Allowed: /bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-room-audio.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/sub-receiver/core.mjs fedac/native/tools/sub-receiver/core.test.mjs fedac/native/tools/sub-receiver/server.mjs fedac/native/tools/sub-receiver/README.md grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md grants/culturehub-la-2026/VOICINGS.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790214991568},{"id":"msg_037b90d4d6021357016ab483538c8c87d19543a19f197e1df3","kind":"assistant","text":"The tests are passing, and the full render is still encoding. This pass uses the mallet ensemble with a synthesized kick; the sub is modeled at the front at its receiver’s 25% default level. Its real-room level and timing will still need to be set during rehearsal.","at":1790214997732,"activityOnly":true},{"id":"exec-002c2e33-8730-4f2a-a6ba-e625319d2e71","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport {execFileSync} from 'node:child_process';\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst path='fedac/native/scores/notespatial-native-mallets.nsscore';\nconst before=JSON.parse(execFileSync('git',['show',\"'`HEAD:${path}`],{maxBuffer:10*1024*1024}));\nconst after=JSON.parse(fs.readFileSync('\"'fedac/native/scores/notespatial-native-mallets-kick.nsscore'));\nassert.deepEqual(after.voicing,before.voicing);\nassert.equal(after.dur,before.dur);\nassert.deepEqual(after.movements.map(m=>[m.t0,m.t1]),before.movements.map(m=>[m.t0,m.t1]));\nfor(const lane of before.lanes){const now=after.lanes.find(l=>l.name===lane.name);const events=new Set(now.events.map(e=>JSON.stringify(e)));assert.ok(lane.events.every(e=>events.has(JSON.stringify(e))),lane.name);}\nconsole.log('Committed mallet instruments, every original event, all cue times and duration preserved.');\nJS\" · done","at":1790215014033},{"id":"exec-843ab421-d68e-405f-9099-322bfd86d557","kind":"command","text":"/bin/zsh -lc 'git diff --cached --stat; git diff --cached --check; ls -lh grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215015210},{"id":"exec-a9c1f48d-7146-4a5f-8ba6-c6eac4d76b69","kind":"command","text":"/bin/zsh -lc 'git commit -m \"notespatial: keep percussion throughout and render mallets, kick and sub\"' · done","at":1790215030426},{"id":"exec-2f053665-ec74-45e3-b4ad-d524965de65d","kind":"command","text":"/bin/zsh -lc \"git log -1 --format='%h %s'; git status --short -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790215041736},{"id":"exec-b6061510-e801-4737-8cad-f3a0cbccb263","kind":"command","text":"/bin/zsh -lc 'git push origin bedd6b2194:main' · done","at":1790215051934},{"id":"msg_037b90d4d6021357016ab483a43ae487d1aa72e4592f3c3424","kind":"assistant","text":"Committed and pushed as `bedd6b2194`. The full video is still encoding; the short preview passed visual inspection. Once it finishes, I’ll check the exported file and open it in QuickTime.","at":1790215076689,"activityOnly":true},{"id":"exec-bbdb684f-d637-4268-9c06-f0009cce3398","kind":"command","text":"/bin/zsh -lc 'ls -lhT grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215119686},{"id":"msg_037b90d4d6021357016ab484099a8087d1a8307f3ab47d6545","kind":"assistant","text":"The larger instrument score is taking longer to render, but the file is still growing normally. The code and scores are already pushed; only the full-video check and QuickTime playback remain.","at":1790215178199,"activityOnly":true},{"id":"exec-b20e96da-5edf-4503-ab41-9c96e1a2d8ae","kind":"command","text":"/bin/zsh -lc 'ls -lhT grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215259088},{"id":"msg_037b90d4d6021357016ab4846b802487d1a4174ed3ed28b59d","kind":"assistant","text":"The full render has reached 53 MB and is still progressing. It includes the instrument parts from the committed mallet arrangement, plus the continuous percussion, kick, and sub feed.","at":1790215276079,"activityOnly":true},{"id":"msg_037b90d4d6021357016ab484c1872c87d1a3b600dca0ce6d07","kind":"assistant","text":"All four instrument palettes have been rebuilt with continuous percussion. The video uses mallets because their score-defined tones render directly; native flute, harp, and piano still use approximations in this renderer.","at":1790215362116,"activityOnly":true},{"id":"exec-b3950aac-9adb-4324-b629-fa8f9b6a681c","kind":"command","text":"/bin/zsh -lc 'ffprobe -v error -show_entries format=duration,size:stream=codec_name,codec_type,width,height -of json grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4' · done","at":1790215381234},{"id":"exec-f40203f2-3e7a-48ed-8a05-bf9517c3d7eb","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 480 -i grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4 -frames:v 1 -y tmp/notespatial-room-before/full-lift.png' · done","at":1790215381861},{"id":"exec-9e24b0e9-80ea-4b5c-a227-af08e47a167c","kind":"command","text":"/bin/zsh -lc 'ffmpeg -v error -ss 750 -i grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4 -frames:v 1 -y tmp/notespatial-room-before/full-ending.png' · done","at":1790215382004},{"id":"msg_037b90d4d6021357016ab484da39ac87d19dace65a324c6d90","kind":"assistant","text":"The full render is finished. I’m checking the exported video and its busiest and closing sections, then opening it in QuickTime.","at":1790215387512,"activityOnly":true},{"id":"exec-d759784c-5dbf-47b6-a8aa-13f25eb8d1e9","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\" · done","at":1790215399131},{"id":"entry-1790215399246-0.9909742063535956","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\"","at":1790215399246},{"id":"entry-1790215561748-0.4156000331300401","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-mallets-kick-sub.mp4\"","at":1790215561748},{"id":"msg_037b90d4d6021357016ab4859284a487d1af37c61eeead02d4","kind":"assistant","text":"Opened the new full render in QuickTime: mallet instruments, continuous percussion, synthesized kick, and an animated, audible SUB model.\n\nCommitted and pushed as `bedd6b2194`. All 14 tests pass.\n\nThe sub’s front placement and 25% level are preview assumptions; room calibration remains.","at":1790215571046},{"id":"msg_037b90d4d6021357016ab485a386f087d18287c8b75a9e530f","kind":"assistant","text":"I’ll give a few other chapters more of the Lift’s layered feel—interlocking parts, counter-melodies, and percussion variation—while keeping each chapter’s character.","at":1790215587868,"activityOnly":true},{"id":"exec-52914ea8-0ebb-4176-9cc1-9a70e2c23826","kind":"command","text":"/bin/zsh -lc \"sed -n '1,110p' grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md\" · done","at":1790215594276},{"id":"exec-8f47c4bf-81bb-4c64-8b6f-d3d2c6fce1f2","kind":"command","text":"/bin/zsh -lc \"sed -n '260,590p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790215594584},{"id":"exec-9dcb26f3-a110-43d5-b5fb-2a4333e63775","kind":"command","text":"/bin/zsh -lc \"git status --short -- fedac/native/tools fedac/native/scores grants/culturehub-la-2026; git log -3 --format='%h %s'\" · done","at":1790215594923},{"id":"msg_037b90d4d6021357016ab485e1a4d487d19843b5187be803ae","kind":"assistant","text":"I’m building up the Walk, Waltz, Climb, and the first part of Return: a counter-melody moving the other way around the ring, syncopated bass, and a two-against-three pattern in the Waltz. I’ll render a short audition of those changes with the kick and sub.","at":1790215649864,"activityOnly":true},{"id":"entry-1790215700714-0.1404422168287831","kind":"user","text":"what about the different instruements","at":1790215700714},{"id":"entry-1790215713647-0.07423881933518284","kind":"user","text":"can we incorporate all 127 midi instruments i mean 128 and also efefcts and all","at":1790215713647},{"id":"entry-1790215717461-0.43641357091383604","kind":"user","text":"intiot he total arrangement","at":1790215717461},{"id":"exec-b530f032-87e4-460c-9812-934d2990c5b6","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs · completed","at":1790215718869},{"id":"exec-bcab8177-61a0-4f1e-9db0-ab9473451400","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets --kick' · done","at":1790215719614},{"id":"exec-2e1d8b6e-9e3f-407e-9dd2-1c47bd6b944e","kind":"command","text":"/bin/zsh -lc 'mkdir -p tmp/notespatial-layered' · done","at":1790215773449},{"id":"exec-215dc860-2855-4d21-80e6-09d17db2534a","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport path from 'node:path';\nconst scorePath='fedac/native/scores/notespatial-native-mallets-kick.nsscore';\nconst s=JSON.parse(fs.readFileSync(scorePath));\nconst m=s.movements;\nconst clips=[\n ['walk',m[1].t1-32*60/104,m[1].t1],\n ['waltz',m[2].t0+32*3*60/132,m[2].t0+48*3*60/132],\n ['climb',m[6].t0+32*60/112+32*60/116,m[6].t1],\n ['return',m[9].t0,m[9].t0+32*60/104+32*60/100],\n].map(([name,from,to])=>({name,from,to,out:path.resolve(\"'`tmp/notespatial-layered/${name}.mp4`)}));\nfs.writeFileSync('\"'tmp/notespatial-layered/clips.json',JSON.stringify({scorePath,clips},null,2));\nconsole.log(clips.map(c=>\"'`${c.name}: ${c.from.toFixed(2)}–${c.to.toFixed(2)}s`).join('\"'\\\\n'));\nJS\" · done","at":1790215774783},{"id":"exec-0a49f412-7202-4acf-94cb-6a91e8988207","kind":"change","text":"/Users/jas/aesthetic-computer/tmp/notespatial-layered/render-audition.mjs · completed","at":1790215776648},{"id":"exec-433f4976-5e79-4159-a05b-162115da40d3","kind":"command","text":"/bin/zsh -lc 'node tmp/notespatial-layered/render-audition.mjs' · exit 143","at":1790215779164},{"id":"exec-850e347d-58ab-4145-a302-ec3badaae860","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs ' · done","at":1790215808327},{"id":"exec-390c71aa-4f7c-48f8-a926-ded7c3f5ece6","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing mallets' · done","at":1790215826163},{"id":"exec-2e2d7aa3-706d-4e65-9f03-9f7838c688cf","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing native' · done","at":1790215845852},{"id":"exec-010d2af1-4d7b-4e39-8fad-3e5d8c4aa8bd","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing gm' · done","at":1790215851012},{"id":"exec-7e6b2c05-53ae-417e-9b88-7c5fa75ed74e","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --fx studio' · done","at":1790215858828},{"id":"exec-b8ea7a39-f4e6-4d79-a3e2-a85edab55fb1","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\np=Path('grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md')\ns=p.read_text()\nchanges={\n'The theme in the hands, echoed once by the ring. | Front–back axis |': 'A counter-melody enters in the second phrase; syncopated root/fifth bass and light backbeats join the theme in the third. | Front–back axis, then an opposing line |',\n'The tune again with the ring a third below. A tag': 'Four answering notes cross each two-bar phrase against the three-step dance, with two hat accents per bar. The tune returns with a third below and chromatic bass pickups. A tag',\n'A high line glides counter-clockwise against the walk. Hats in the last phrase.': 'A second melody moves against the walk in 3+3+2 eighths. Syncopated bass, light backbeats, high chimes and occasional tom turns gather across the four phrases. Hats in the last phrase.',\n'The theme back in the hands. The room takes one slow tour.': 'The theme back in the hands over the Walk\\\\'s counter-melody and syncopated bass; the bass groove leaves after one phrase, the counter-melody after two. The room takes one slow tour.',\n'17,018 events':'17,502 events',\n}\nfor a,b in changes.items():\n assert a in s,a\n s=s.replace(a,b)\np.write_text(s)\nPY\" · done","at":1790215864123},{"id":"exec-f3750a9a-a760-4b77-b614-1a484ee41846","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-mallets-kick.nsscore' · done","at":1790215865048},{"id":"exec-921c62a1-16de-4949-a159-4b56da7b6527","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nimport {execFileSync} from 'node:child_process';\nimport {makeSubScore} from './fedac/native/tools/sub-receiver/core.mjs';\nfor(const stem of ['notespatial-native','notespatial-native-mallets','notespatial-native-native','notespatial-native-gm','notespatial-native-fx','notespatial-native-mallets-kick']) {\n const file=\"'`fedac/native/scores/${stem}.nsscore`;\n const s=JSON.parse(fs.readFileSync(file));\n const before=JSON.parse(execFileSync('\"'git',['show',\"'`HEAD:${file}`],{maxBuffer:10*1024*1024}));\n assert.equal(s.dur,before.dur);assert.deepEqual(s.movements.map(m=>[m.t0,m.t1]),before.movements.map(m=>[m.t0,m.t1]));\n for(const index of [0,3,4,5,7,8,10]) {\n const m=s.movements[index];\n const events=sc=>sc.lanes.map(l=>l.events.filter(e=>e.t>=m.t0&&e.tl.events.flatMap(e=>[{t:e.t,d:1},{t:e.t+e.dur,d:-1}])).sort((a,b)=>a.t-b.t||a.d-b.d);\n let live=0,peak=0;for(const p of points){live+=p.d;peak=Math.max(live,peak);} assert.ok(peak<=32,stem);\n assert.ok(makeSubScore(s).events.length>0);\n const hits=s.lanes.flatMap(l=>l.events.filter(e=>/''^(tap |kick|snare|hats)/.test(l.name)||e.wave==='\"'noise').map(e=>e.t)).sort((a,b)=>a-b);\n for(const m of s.movements){const end=m===s.movements.at(-1)?m.t1-3:m.t1;const ts=[m.t0,...hits.filter(t=>t>=m.t0&&t<=end),end];assert.ok(Math.max(...ts.slice(1).map((t,i)=>t-ts[i]))<1.101,m.name);}\n console.log(\"'`${stem}: peak ${peak}/32, cue times preserved, Lift unchanged, continuous percussion and SUB valid`);\n}\nJS' · done","at":1790215889208},{"id":"msg_037b90d4d6021357016ab486ddfbdc87d1a6dff9c4d5caf1d1","kind":"assistant","text":"The new parts are written. The Walk develops into a groove, the Waltz gains a cross-rhythm, the Climb adds counterpoint and tom fills, and Return brings those ideas back before thinning out. Playback checks pass, with the same duration and cue times.","at":1790215902691,"activityOnly":true},{"id":"exec-4a5b723c-000c-4d1d-a8c5-9bce11d6ba63","kind":"command","text":"/bin/zsh -lc 'git diff --check -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/scores grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md; git diff --stat -- fedac/native/tools/compose-notespatial-native.mjs grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md; git diff --cached --name-only' · done","at":1790215925572},{"id":"exec-1ed1ed9d-0420-447a-9f38-5348037997b4","kind":"command","text":"/bin/zsh -lc \"sed -n '1,180p' toolchain/shims/ffmpeg; rg -n 'sleep|wait|load|contention|ffmpeg|thread' toolchain/shims/*\" · done","at":1790215933620},{"id":"exec-d339ba2b-47f4-48ec-95bc-9514c84f3c53","kind":"command","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md 'fedac/native/scores/notespatial-native*.nsscore'\" · done","at":1790215959659},{"id":"entry-1790215960123-0.7598321131626533","kind":"notice","text":"/bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790215960123},{"id":"entry-1790216155751-0.2438989371528939","kind":"notice","text":"Allowed: /bin/zsh -lc \"git add -- fedac/native/tools/compose-notespatial-native.mjs grants/culturehub-la-2026/NOTESPATIAL-ARRANGEMENT.md 'fedac/native/scores/notespatial-native*.nsscore'\"","at":1790216155751},{"id":"msg_037b90d4d6021357016ab487e3d03487d1995b284c5b742d94","kind":"assistant","text":"All instrument palettes still fit the voice limit, and the Lift itself is unchanged. The audition render is progressing slowly under the machine’s current load; it will play the four revised passages in sequence.","at":1790216164538,"activityOnly":true},{"id":"exec-071b189f-3256-43f2-b101-f018a933260b","kind":"command","text":"/bin/zsh -lc 'git diff --cached --stat; git diff --cached --check' · done","at":1790216176284},{"id":"exec-7af8192c-b033-4d67-b647-93bb0df73c77","kind":"command","text":"/bin/zsh -lc 'git commit -m \"notespatial: weave counterpoint and syncopated grooves through four chapters\"' · done","at":1790216181877},{"id":"exec-0f2c43e1-2218-4ce7-8ea5-d52504a0c9e8","kind":"command","text":"/bin/zsh -lc 'ls -lhT tmp/notespatial-layered' · done","at":1790216193993},{"id":"exec-7bb7dc08-6d3f-46a8-8265-0216635780d9","kind":"command","text":"/bin/zsh -lc 'ps -axo pid,ppid,tty,command' · done","at":1790216218845},{"id":"exec-8a42be85-8235-47fb-b71f-b28fb61ad08c","kind":"command","text":"/bin/zsh -lc \"ps -axo pid,ppid,tty,command | rg 'notespatial-layered|notespatial-native-render|ffmpeg.*(rawvideo|seat[0-9])'\" · done","at":1790216234251},{"id":"entry-1790216234681-0.16803477329153438","kind":"notice","text":"/bin/zsh -lc \"ps -axo pid,ppid,tty,command | rg 'notespatial-layered|notespatial-native-render|ffmpeg.*(rawvideo|seat[0-9])'\"","at":1790216234681},{"id":"entry-1790216240223-0.899757617682467","kind":"notice","text":"Allowed: /bin/zsh -lc \"ps -axo pid,ppid,tty,command | rg 'notespatial-layered|notespatial-native-render|ffmpeg.*(rawvideo|seat[0-9])'\"","at":1790216240223},{"id":"exec-4f159afc-1e8e-464a-997c-34affb59a4da","kind":"command","text":"/bin/zsh -lc 'git push origin 085f85f527:main' · done","at":1790216243551},{"id":"exec-24a28701-d405-49ac-b024-c66815c6ce86","kind":"command","text":"/bin/zsh -lc 'ps -p 98020,98026,99315 -o pid,pcpu,pmem,state,etime,time,command' · done","at":1790216251897},{"id":"entry-1790216252436-0.6147344485171577","kind":"notice","text":"/bin/zsh -lc 'ps -p 98020,98026,99315 -o pid,pcpu,pmem,state,etime,time,command'","at":1790216252437},{"id":"entry-1790216268368-0.6630767372969846","kind":"notice","text":"Allowed: /bin/zsh -lc 'ps -p 98020,98026,99315 -o pid,pcpu,pmem,state,etime,time,command'","at":1790216268368},{"id":"msg_037b90d4d6021357016ab48875c5d087d18797a85e40495457","kind":"assistant","text":"The arrangements are committed and pushed as `085f85f527`. The short video render has slowed severely, so I’m switching the audition to audio to let you hear the changes sooner.","at":1790216313598,"activityOnly":true},{"id":"exec-b36f664e-eed8-4b37-81cc-a2f091d9d4db","kind":"command","text":"/bin/zsh -lc 'kill -TERM 98020 98026 99315' · done","at":1790216346903},{"id":"entry-1790216347943-0.7298253244763817","kind":"notice","text":"/bin/zsh -lc 'kill -TERM 98020 98026 99315'","at":1790216347943},{"id":"entry-1790216391152-0.061530722615793065","kind":"notice","text":"Allowed: /bin/zsh -lc 'kill -TERM 98020 98026 99315'","at":1790216391152},{"id":"exec-15878cab-17a1-45d3-8903-f910d424e5ed","kind":"change","text":"/Users/jas/aesthetic-computer/tmp/notespatial-layered/render-audio.mjs · completed","at":1790216427529},{"id":"exec-a811fbae-7859-443d-98b0-929fad1f2ac3","kind":"command","text":"/bin/zsh -lc 'node tmp/notespatial-layered/render-audio.mjs' · done","at":1790216429843},{"id":"exec-3e80583e-1f61-48f2-8fde-2f5d14bb3abd","kind":"command","text":"/bin/zsh -lc \"node --input-type=module <<'JS'\nimport fs from 'node:fs';\nimport assert from 'node:assert/strict';\nconst p='grants/culturehub-la-2026/notespatial-native-layered-audition.wav';\nconst b=fs.readFileSync(p), rate=b.readUInt32LE(28), bytes=b.readUInt32LE(40);\nassert.equal(b.toString('ascii',0,4),'RIFF');assert.equal(bytes+44,b.length);\nlet peak=0,energy=0;for(let i=44;i0);\nconsole.log(\"'`Stereo PCM audition: ${(bytes/rate).toFixed(2)} seconds; peak ${(peak/32768).toFixed(3)}; valid WAV, no clipped samples.`);\nJS' · done","at":1790216460536},{"id":"exec-10574da3-74e7-4c5f-96f3-aa10025d63f6","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-layered-audition.wav\" · done","at":1790216463901},{"id":"entry-1790216464955-0.9155619588995099","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-layered-audition.wav\"","at":1790216464956},{"id":"entry-1790216632420-0.11117827604972497","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' /Users/jas/aesthetic-computer/grants/culturehub-la-2026/notespatial-native-layered-audition.wav\"","at":1790216632420},{"id":"msg_037b90d4d6021357016ab489c56bb487d1908f249dfe0906fc","kind":"assistant","text":"Added counter-melodies, syncopated bass, cross-rhythms, and fills to Walk, Waltz, Climb, and Return.\n\nOpened a **1:55 audio audition** in QuickTime, in that order. Playback checks pass; committed and pushed as `085f85f527`.","at":1790216656056},{"id":"entry-1790216855656-0.27291246679946213","kind":"user","text":"nice did u compush?","at":1790216855657},{"id":"msg_037b90d4d6021357016ab48abd9b1487d192f6641d664d1f51","kind":"assistant","text":"I’ll spread the 128 GM instruments across the eleven chapters and write effects into the score. I’ll first check the native synth and rendering path so the audition uses the actual instrument sounds.","at":1790216895913,"activityOnly":true},{"id":"exec-db065bc1-1ca5-4020-933c-92c284581cc3","kind":"command","text":"/bin/zsh -lc \"git status --short -- fedac/native grants/culturehub-la-2026; sed -n '1,260p' fedac/native/tools/compose-notespatial-native.mjs\" · done","at":1790216935042},{"id":"exec-5ae14049-13ba-4f15-94a1-f69ee5c33d75","kind":"command","text":"/bin/zsh -lc \"sed -n '640,810p' fedac/native/tools/compose-notespatial-native.mjs; sed -n '1,180p' fedac/native/pieces/spatial-rehearsal.mjs\" · done","at":1790216935634},{"id":"exec-ef1f9255-dd3b-47a2-a19e-1956cedb744d","kind":"command","text":"/bin/zsh -lc \"rg -n 'gm_voice_render|gm_voice_init|fx_room|fxRoom|room_mix|flanger|glitch_mix|tanh' fedac/native/src/audio.c fedac/native/src/gm_synth.h fedac/native/src/gm_synth.c; rg --files fedac/native/tools | rg 'gm|render|bake|synth'\" · done","at":1790216936252},{"id":"exec-f0cb4b46-9b7f-4c2d-a3ab-5bdaf9e5253f","kind":"command","text":"/bin/zsh -lc \"git status --short; sed -n '1,240p' fedac/native/tools/compose-notespatial-native.mjs; sed -n '1,200p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790217052842},{"id":"exec-f23c3a96-a4cf-48c1-b535-89727db97be1","kind":"command","text":"/bin/zsh -lc \"sed -n '680,850p' fedac/native/tools/compose-notespatial-native.mjs; sed -n '1990,2240p' fedac/native/src/audio.c; sed -n '1545,1595p' fedac/native/src/audio.c; git diff -- fedac/native/pieces/spatial-rehearsal.mjs; sed -n '1,65p' fedac/native/tools/pitch-audit.c\" · done","at":1790217065095},{"id":"msg_037b90d4d6021357016ab48b7e39a887d1bf7546ef29ffa69d","kind":"assistant","text":"The native synth already implements all 128 GM programs. I’m grouping them into chapter palettes—keys and guitars in Walk, reeds and strings in Waltz, synths in Climb/Lift—with brief sound-effect cues at transitions. Each sound will have a part to play, while the percussion keeps the rhythm continuous.","at":1790217087387,"activityOnly":true},{"id":"exec-06594a5c-dbb3-4123-86d8-fd4a41a1224e","kind":"command","text":"/bin/zsh -lc \"rg -n 'ROOM_FEEDBACK|glitch_rate =|wobble_lfo_rate =' fedac/native/src/audio.c; sed -n '1,90p' fedac/native/src/gm_synth.c; rg -n 'return.*env|env \\\\*|\\\\* env|organic' fedac/native/src/gm_synth.c | tail -18; rg -n 'voicing|recipe' fedac/native/tools/notespatial-native-render.mjs; sed -n '1,90p' fedac/native/tools/notespatial-native-check.mjs; rg -n 'SCORE|AGENTS' fedac/native/AGENTS.md grants/culturehub-la-2026/AGENTS.md\" · exit 2","at":1790217157336},{"id":"exec-488cc0bd-c9b2-46db-a34f-a5079e0e9df0","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.mjs · completed","at":1790217177359},{"id":"exec-4dd660e9-f78c-4e71-a530-a473bd688422","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing gm128 --fx studio --kick' · exit 1","at":1790217180547},{"id":"exec-d8a679be-9e77-4548-b684-1112d502930d","kind":"command","text":"/bin/zsh -lc \"sed -n '400,510p' fedac/native/tools/compose-notespatial-native.mjs; sed -n '1595,1625p' fedac/native/src/audio.c; sed -n '350,385p' fedac/native/src/gm_synth.h; sed -n '1,70p' SCORE.md\" · done","at":1790217186081},{"id":"exec-06e7caaa-67d1-476b-8e87-c7937c1af15e","kind":"command","text":"/bin/zsh -lc \"sed -n '518,568p' fedac/native/tools/compose-notespatial-native.mjs; sed -n '438,458p' fedac/native/tools/notespatial-native-render.mjs; sed -n '385,410p' fedac/native/src/gm_synth.h; rg -n 'compute_envelope\\\\(v\\\\)|generate_sample' fedac/native/src/audio.c | tail -12\" · done","at":1790217192268},{"id":"exec-3d32d83c-30b1-46f0-8cd7-8340422f0427","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-gm-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-gm-render.c, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.mjs · completed","at":1790217282225},{"id":"exec-448a67b8-9a64-4b0f-a67e-a329d1b580cb","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/compose-notespatial-native.mjs --voicing gm128 --fx studio --kick' · exit 1","at":1790217298055},{"id":"msg_037b90d4d6021357016ab48c4e1b9087d1b3e07b594019fc88","kind":"assistant","text":"The chapter palettes are in place. I’m connecting the preview renderer to the native GM synth so we can hear the actual instruments, and adding the score’s room, drive, wobble and glitch effects to the audition.","at":1790217304004,"activityOnly":true},{"id":"exec-fb59c93d-a9c3-43be-b82b-f45d537ff2ae","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-fx-audio.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790217350427},{"id":"exec-35414d3c-3830-4bbb-a3cf-64055c060ad6","kind":"command","text":"/bin/zsh -lc \"rg -n 'function ribbon|function compute_envelope|static.*compute_envelope' fedac/native/lib/spatial-rehearsal.mjs fedac/native/src/audio.c; sed -n '20,45p' fedac/native/lib/spatial-rehearsal.mjs; sed -n '155,185p' fedac/native/src/audio.c; sed -n '1,80p' grants/culturehub-la-2026/VOICINGS.md; rg --files fedac | rg 'AGENTS.md\"'$|SCORE.md$'\"'\" · done","at":1790217373803},{"id":"exec-9a2ce092-dbd5-43f8-a366-62c3b3e94562","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.mjs · completed","at":1790217393115},{"id":"exec-24591c40-497b-4ab0-ab48-01479695e323","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\nimport subprocess\np=Path('fedac/native/pieces/spatial-rehearsal.mjs')\ns=p.read_text(); head=subprocess.check_output(['git','show','HEAD:'+str(p)],text=True)\ns=s.replace('ringSeats, noteColor }','ringSeats, noteColor, ribbon }')\na=head.index('// Effects a score'); b=head.index('let standalone',a)\ns=s.replace('let standalone',head[a:b]+'let standalone',1)\ns=s.replace('stopVoices(); origin', 'stopVoices(); clearFx(sound); origin')\ns=s.replace(\\\"stopVoices(); phase = 'finished'\\\", \\\"stopVoices(); clearFx(sound); phase = 'finished'\\\")\ns=s.replace('} else if (t >= 0) {\\\\n voices', '} else if (t >= 0) {\\\\n if (hasFx()) applyFx(sound, t);\\\\n voices')\ns=s.replace('decay: e.decay ?? 0.04 });', \\\"decay: e.decay ?? 0.04,\\\\n ...(Number.isInteger(e.gm) ? { gmProgram: e.gm } : {}) }); // a GM program when the score names one; \"'`type` is its fallback\")\np.write_text(s)\nPY\nnode fedac/native/tools/compose-notespatial-native.mjs --voicing gm128 --fx studio --kick' · done","at":1790217398429},{"id":"exec-de1d8c6c-61c3-4674-92dc-97c4ce8da4f1","kind":"command","text":"/bin/zsh -lc \"git diff --stat -- fedac/native/pieces/spatial-rehearsal.mjs; sed -n '1,13p' fedac/native/lib/spatial-rehearsal.mjs; sed -n '85,160p' grants/culturehub-la-2026/VOICINGS.md; sed -n '121,152p' fedac/native/src/audio.c\" · done","at":1790217448949},{"id":"exec-0763979b-d456-4ef6-88c1-6c7bc0dba362","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-check.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.test.mjs · completed","at":1790217453068},{"id":"exec-160f1c91-6ff4-4ded-a89d-249e6f85a08a","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs' · exit 1","at":1790217455719},{"id":"exec-6434a85c-cd26-41f7-b12b-16085d0665ca","kind":"command","text":"/bin/zsh -lc \"node --check fedac/native/tools/notespatial-native-render.mjs; git diff --check; sed -n '1,100p' fedac/native/SCORE.md\" · done","at":1790217473815},{"id":"exec-36319716-e7a3-4aa0-b2d8-b40b42fbe164","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore' · done","at":1790217474599},{"id":"exec-1b635f75-a357-4abd-9970-5c064e06eacc","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.test.mjs · completed","at":1790217574489},{"id":"exec-909a2bce-ecd9-4e45-ba1d-79f39491f32c","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs' · exit 1","at":1790217578240},{"id":"exec-7810456b-ee5a-44a9-9aef-a907d9a55620","kind":"command","text":"/bin/zsh -lc 'nice -n 10 node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore --fast --audio-only --sub --out grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.wav' · done","at":1790217579902},{"id":"msg_037b90d4d6021357016ab48d1e3dc487d1a951ff91b7c9ef9c","kind":"assistant","text":"All 128 programs produce sound in the native synth, and the complete score passes playback with all four effects applied and reset correctly. It still runs 12:54 and peaks at 17 simultaneous voices. I’m rendering the full audition with kick and SUB now.","at":1790217611046,"activityOnly":true},{"id":"exec-884ac097-074a-4a93-8d33-83bf1a100f31","kind":"command","text":"/bin/zsh -lc \"sed -n '210,300p' fedac/native/tools/notespatial-native-render.mjs; sed -n '460,520p' fedac/native/tools/notespatial-native-render.mjs; git status --short -- fedac/native/tools fedac/native/scores grants/culturehub-la-2026/VOICINGS.md\" · done","at":1790217702975},{"id":"exec-29cb7360-cead-4248-902a-bd2d8f28b9ef","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/sub-receiver/core.test.mjs' · done","at":1790217722905},{"id":"entry-1790217724131-0.2943050949761702","kind":"notice","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/sub-receiver/core.test.mjs'","at":1790217724132},{"id":"entry-1790217728148-0.3468048974212985","kind":"notice","text":"Allowed: /bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/sub-receiver/core.test.mjs'","at":1790217728148},{"id":"exec-63e76b05-beb2-4a89-8df2-25e42ee5e4f6","kind":"command","text":"/bin/zsh -lc \"rg -n 'subModel|feeds|perFrame|binaural|useHrtf|gainsAt|for \\\\(let f' fedac/native/tools/notespatial-native-render.mjs; rg -n 'chunk|gmProgram|GM' fedac/native/tools/sub-receiver/core.mjs; sed -n '310,375p' fedac/native/tools/notespatial-native-render.mjs\" · done","at":1790217800102},{"id":"exec-0db34795-d2ab-4b89-bd1f-9d080a783950","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs, /Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790217833740},{"id":"exec-33f51c3b-8b1a-4406-b495-7580c57267ad","kind":"command","text":"/bin/zsh -lc 'git diff --check -- fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-check.mjs fedac/native/tools/notespatial-native-render.mjs grants/culturehub-la-2026/VOICINGS.md; ps -axo pid,ppid,tty,command' · exit 127","at":1790217836498},{"id":"exec-cd2d73d3-af39-4920-8298-8ff992b9eb80","kind":"command","text":"/bin/zsh -lc \"sed -n '38,94p' fedac/native/lib/spatial-rehearsal.mjs; sed -n '298,312p' fedac/native/tools/notespatial-native-render.mjs; du -sh /private/tmp/notespatial-render-*\" · exit 1","at":1790217846363},{"id":"exec-38d74384-ae86-46e1-99f5-32184e058600","kind":"command","text":"/bin/zsh -lc \"node -e 'const fs=require(\\\"fs\\\"),os=require(\\\"os\\\"),p=require(\\\"path\\\"); for(const n of fs.readdirSync(os.tmpdir()).filter(n=>n.startsWith(\\\"notespatial-render-\\\"))){const d=p.join(os.tmpdir(),n);const s=fs.statSync(d);if(Date.now()-s.mtimeMs<1800000)console.log(d,fs.readdirSync(d).map(x=>[x,fs.statSync(p.join(d,x)).size]));}'\" · done","at":1790217862107},{"id":"msg_037b90d4d6021357016ab48e9acfa487d1a18eb9d527f905f4","kind":"assistant","text":"The full score passes all 17 checks, including continuous percussion, GM playback and effect resets. The preview now also shows the instruments sounding at each moment. I’m finishing the audio and baking that into the updated video.","at":1790217886101,"activityOnly":true},{"id":"exec-5ae6640e-a725-4be2-8dfd-fe0f01e31d02","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/compose-notespatial-native.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790217934378},{"id":"exec-ceff652c-e16d-47ce-9d64-a49f174fd5a6","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore --fast --sub --fps 15 --frame-at 64 --frame-out tmp/notespatial-gm128-review.ppm --out grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.mp4' · done","at":1790217938029},{"id":"exec-db4851e0-5636-471a-bf2e-626fca8ea9aa","kind":"command","text":"/bin/zsh -lc \"open -a 'QuickTime Player' grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.wav\" · done","at":1790217943800},{"id":"entry-1790217944637-0.5171056501542387","kind":"notice","text":"/bin/zsh -lc \"open -a 'QuickTime Player' grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.wav\"","at":1790217944637},{"id":"entry-1790218031472-0.058813074441874225","kind":"notice","text":"Allowed: /bin/zsh -lc \"open -a 'QuickTime Player' grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.wav\"","at":1790218031472},{"id":"msg_037b90d4d6021357016ab48f542b1887d1b2969a1d5e8a6149","kind":"assistant","text":"The full audio render is ready, and I’ve sent it to QuickTime. It contains all 128 instruments, the four automated effects, continuous percussion, kick and SUB. The video is rendering from the same score.","at":1790218081035,"activityOnly":true},{"id":"exec-4b3ed7c4-08c1-4f4b-9666-10a93e9d380e","kind":"command","text":"/bin/zsh -lc \"node - <<'JS'\nconst fs=require('fs');\nconst s=JSON.parse(fs.readFileSync('fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore'));\nconst b=fs.readFileSync('grants/culturehub-la-2026/notespatial-native-gm128-fx-kick-sub.wav');\nconst sr=b.readUInt32LE(24),n=b.readUInt32LE(40)/4;\nconsole.log({seconds:n/sr,sampleRate:sr,channels:b.readUInt16LE(22),bits:b.readUInt16LE(34)});\nfor(const m of s.movements){let a=0,peak=0,count=0;for(let i=Math.round(m.t0*sr);i[...a].sort((a,b)=>a-b)[Math.floor(p*(a.length-1))];\nfor(const target of [.18,.25,.3549]) {const vals=r.map(x=>Math.min(2,target/x.rms)*x.rms);console.log(target,'p90/p10 dB',20*Math.log10(quant(vals,.9)/quant(vals,.1)), 'cuts',r.filter(x=>x.rms>target).length,'boosts',r.filter(x=>x.rmsx.rms),.9)/quant(r.map(x=>x.rms),.1)));\nJS\" · done","at":1790222138816},{"id":"exec-88bbf325-75f7-4251-a1fa-f9cea5652684","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-gm-balance.mjs · completed","at":1790222178018},{"id":"exec-67d3a5b9-1789-462c-923b-03dafbe980d7","kind":"command","text":"/bin/zsh -lc \"node --input-type=module - <<'JS'\nimport fs from 'node:fs';\nimport {balanceMeasurements} from './fedac/native/tools/notespatial-gm-balance.mjs';\nconst path='fedac/native/tools/notespatial-gm-levels.json',report=JSON.parse(fs.readFileSync(path));\nreport.target=.18; report.method='Median strongest 100 ms RMS of each program’s notes in the suite; target .18; -24 to +6 dB trim; unit-voice peak ceiling 1.8';\nreport.programs=balanceMeasurements(report.programs,report.target);fs.writeFileSync(path,JSON.stringify(report,null,2)+'\\\\n');\nconst quant=(a,p)=>[...a].sort((a,b)=>a-b)[Math.floor(p*(a.length-1))];\nfor(const balanced of [false,true]) {const vals=report.programs.map(x=>x.rms*(balanced?x.gain:1));console.log(balanced?'balanced':'raw','p90/p10 dB',20*Math.log10(quant(vals,.9)/quant(vals,.1)));}\nconsole.log('largest cuts',report.programs.toSorted((a,b)=>a.db-b.db).slice(0,8).map(r=>[r.name,r.db]));\nJS\nnode fedac/native/tools/compose-notespatial-native.mjs --voicing gm128 --fx studio --kick\" · done","at":1790222178797},{"id":"exec-d8f08bda-7e2d-45c9-b366-3add465c4153","kind":"command","text":"/bin/zsh -lc \"sed -n '1,22p' fedac/native/tools/sub-receiver/core.mjs; sed -n '35,93p' fedac/native/pieces/spatial-rehearsal.mjs; rg -n 'lib/spatial-rehearsal|spatial-rehearsal.mjs' fedac/native/tools/spatial-rehearsal.mjs | head -12\" · done","at":1790222243517},{"id":"exec-df80299b-7a37-4710-9e59-989c3bf56139","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.test.mjs · completed","at":1790222243912},{"id":"exec-783a7805-2e68-49b3-b153-36178733eac8","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs' · exit 1","at":1790222244707},{"id":"exec-8217776b-ab2b-4bc6-b170-b806d8dca53e","kind":"command","text":"/bin/zsh -lc \"sed -n '17,34p' fedac/native/pieces/spatial-rehearsal.mjs\" · done","at":1790222250089},{"id":"msg_037b90d4d6021357016ab49fb379e887d1aba26ced0463dd82","kind":"assistant","text":"The measurements confirm it: the middle 80% of patches span about 16 dB at equal written gain. The reed patches and sitar are among the loudest. I’ve added per-program trims, and a separate audition test also shows a smaller level spread. Kick, percussion and SUB keep their existing levels.","at":1790222260276,"activityOnly":true},{"id":"exec-4506832f-194f-4da3-a0d8-bf90214649ca","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs, /Users/jas/aesthetic-computer/fedac/native/tools/notespatial-orchestra.test.mjs · completed","at":1790222278983},{"id":"exec-d2199af7-d52c-48b9-843b-06663cd29b5a","kind":"command","text":"/bin/zsh -lc \"rg -n 'const X|instrument|instruments|the panel' fedac/native/tools/notespatial-native-render.mjs; node --test fedac/native/tools/notespatial-orchestra.test.mjs\" · done","at":1790222279803},{"id":"exec-1b3cd75d-3350-418b-8bee-2c6b9b69fa65","kind":"change","text":"/Users/jas/aesthetic-computer/fedac/native/tools/notespatial-native-render.mjs · completed","at":1790222302222},{"id":"exec-0f2e1e51-0eca-4c20-b4cd-c7ad59e133f8","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-render.mjs fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore --fast --sub --fps 15 --frame-at 64 --frame-out tmp/notespatial-balanced-review.ppm --wav-out grants/culturehub-la-2026/notespatial-native-gm128-balanced.wav --out grants/culturehub-la-2026/notespatial-native-gm128-balanced.mp4' · done","at":1790222302917},{"id":"exec-6e2bdac3-663b-4f30-9e07-795e72c1485d","kind":"command","text":"/bin/zsh -lc 'node --test fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-room-audio.test.mjs fedac/native/tools/spatial-rehearsal.test.mjs fedac/native/tools/sub-receiver/core.test.mjs' · done","at":1790222303753},{"id":"exec-1f2aac61-33c2-41ac-b8da-850f34761c85","kind":"change","text":"/Users/jas/aesthetic-computer/grants/culturehub-la-2026/VOICINGS.md · completed","at":1790222337994},{"id":"exec-5a471fe5-69ed-4b88-be41-d65a1e42306b","kind":"command","text":"/bin/zsh -lc 'node fedac/native/tools/notespatial-native-check.mjs fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore; git diff --check -- fedac/native/lib/spatial-rehearsal.mjs fedac/native/pieces/spatial-rehearsal.mjs fedac/native/tools grants/culturehub-la-2026/VOICINGS.md' · done","at":1790222339115},{"id":"exec-a79b6dfc-dc96-44bc-acae-9fbe262b9d72","kind":"command","text":"/bin/zsh -lc \"python3 - <<'PY'\nfrom pathlib import Path\nimport subprocess,difflib,json\np='fedac/native/pieces/spatial-rehearsal.mjs'\na=subprocess.check_output(['git','show','HEAD:'+p],text=True)\nb=a.replace('noteColor, ribbon }','noteColor, ribbon, eventGain }').replace('Math.min(0.65, Math.max(0, e.g * (score.gain ?? 0.35)))','eventGain(score, e)')\nassert b\"'!=a\nPath('\"'tmp/notespatial-gain-runtime.patch').write_text(''.join(difflib.unified_diff(a.splitlines(True),b.splitlines(True),fromfile='a/'+p,tofile='b/'+p)))\np='fedac/native/scores/notespatial-native-gm128-fx-kick.nsscore'\nold=json.loads(subprocess.check_output(['git','show','HEAD:'+p],text=True));new=json.loads(Path(p).read_text())\nnew.pop('gmGains');new.pop('gmBalance');assert new==old\nprint('Written notes, timing, orchestration and effects are unchanged; only GM level metadata was added.')\nPY\nls -lh tmp/notespatial-balanced-review.ppm grants/culturehub-la-2026/notespatial-native-gm128-balanced.mp4\" · done","at":1790222372758},{"id":"msg_037b90d4d6021357016ab4a033490887d1893638e81631c725","kind":"assistant","text":"The balanced render is underway. All 20 checks pass, including native playback and unchanged SUB output. The score’s notes, timing and effects are identical; only the GM level table changed. I also enlarged the instrument names so they’re easier to follow while listening.","at":1790222388104,"activityOnly":true},{"id":"exec-9c07e7fe-8ba1-4963-b93d-4dcf067e7068","kind":"command","text":"/bin/zsh -lc \"git add fedac/native/lib/spatial-rehearsal.mjs fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-check.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-gm-balance.mjs fedac/native/tools/notespatial-gm-levels.json 'fedac/native/scores/notespatial-native-gm128-fx-kick*.nsscore' grants/culturehub-la-2026/VOICINGS.md\" · done","at":1790222410078},{"id":"entry-1790222410277-0.5924262654229028","kind":"notice","text":"/bin/zsh -lc \"git add fedac/native/lib/spatial-rehearsal.mjs fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-check.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-gm-balance.mjs fedac/native/tools/notespatial-gm-levels.json 'fedac/native/scores/notespatial-native-gm128-fx-kick*.nsscore' grants/culturehub-la-2026/VOICINGS.md\"","at":1790222410277},{"id":"entry-1790222480248-0.6005361717284359","kind":"notice","text":"Allowed: /bin/zsh -lc \"git add fedac/native/lib/spatial-rehearsal.mjs fedac/native/tools/compose-notespatial-native.mjs fedac/native/tools/notespatial-native-check.mjs fedac/native/tools/notespatial-native-render.mjs fedac/native/tools/notespatial-orchestra.test.mjs fedac/native/tools/notespatial-gm-balance.mjs fedac/native/tools/notespatial-gm-levels.json 'fedac/native/scores/notespatial-native-gm128-fx-kick*.nsscore' grants/culturehub-la-2026/VOICINGS.md\"","at":1790222480248},{"id":"exec-d6f18945-bcb9-46d3-89f0-3c9481418ec1","kind":"command","text":"/bin/zsh -lc 'git apply --cached tmp/notespatial-gain-runtime.patch' · done","at":1790222482675},{"id":"entry-1790222483019-0.6348031370870334","kind":"notice","text":"/bin/zsh -lc 'git apply --cached tmp/notespatial-gain-runtime.patch'","at":1790222483019},{"id":"entry-1790222499331-0.49854782438707057","kind":"notice","text":"Allowed: /bin/zsh -lc 'git apply --cached tmp/notespatial-gain-runtime.patch'","at":1790222499331},{"id":"exec-909f1352-2fa7-4e5e-906f-703fa28aca5b","kind":"command","text":"/bin/zsh -lc 'sips -s format png tmp/notespatial-balanced-review.ppm --out tmp/notespatial-balanced-review.png; git diff --cached --stat; git diff --cached --check; git diff --cached -- fedac/native/pieces/spatial-rehearsal.mjs' · done","at":1790222514456},{"id":"exec-ec73d49d-a753-4508-8c55-8d3150912d05","kind":"command","text":"/bin/zsh -lc \"node --input-type=module - <<'JS'\nimport fs from 'node:fs';\nconst r=JSON.parse(fs.readFileSync('fedac/native/tools/notespatial-gm-levels.json'));\nfor(const [i,p]of r.programs.entries()){if(p.program\"'!==i||!Number.isFinite(p.gain)||p.gain<=0||p.gain>2)throw Error('\"'invalid trim table');}\nconsole.log('128 ordered finite trims; min/max', Math.min(...r.programs.map(p=>p.db)),Math.max(...r.programs.map(p=>p.db)), 'dB');\nconst b=fs.readFileSync('grants/culturehub-la-2026/notespatial-native-gm128-balanced.wav'); let peak=0;for(let i=44;i/dev/null && echo 1),1) + CFLAGS += -DHAVE_SCREEN_GPU $(shell pkg-config --cflags egl glesv2) + LDFLAGS += $(shell pkg-config --libs egl glesv2) +endif +ifeq ($(shell pkg-config --exists freetype2 2>/dev/null && echo 1),1) + CFLAGS += -DHAVE_COMIC_FONT $(shell pkg-config --cflags freetype2) + LDFLAGS += $(shell pkg-config --libs freetype2) +endif + # SDL3 GPU-accelerated display: always compiled, loaded via dlopen at runtime. # Binary runs without SDL3 libs and falls back to DRM/fbdev. # No compile-time or link-time SDL dependency. @@ -243,3 +253,6 @@ clean: test: $(TARGET) @echo "Running hello.mjs test piece..." $(TARGET) test-pieces/hello.mjs + +# Header-only optional renderers are part of the binding translation unit. +$(BUILDDIR)/js-bindings.o: $(SRCDIR)/screen-triangle.h $(SRCDIR)/screen-gpu.h $(SRCDIR)/comic-font.h diff --git a/fedac/native/docker-build.sh b/fedac/native/docker-build.sh index 1151f9c6aa..eb9cf22299 100644 --- a/fedac/native/docker-build.sh +++ b/fedac/native/docker-build.sh @@ -279,6 +279,7 @@ cp "$BUILD/ac-native" "$IROOT/ac-native" cp "$NATIVE/pieces/prompt.mjs" "$IROOT/piece.mjs" mkdir -p "$IROOT/pieces" cp "$NATIVE/pieces/"*.mjs "$IROOT/pieces/" 2>/dev/null || true +bash "$NATIVE/scripts/bundle-oskiewar.sh" "$IROOT" log " Pieces: $(ls "$IROOT/pieces/" | wc -l)" # ── 2d2: Piano sample bank ── diff --git a/fedac/native/docs/oskiewar-live.md b/fedac/native/docs/oskiewar-live.md new file mode 100644 index 0000000000..06eed2e8bf --- /dev/null +++ b/fedac/native/docs/oskiewar-live.md @@ -0,0 +1,103 @@ +# Oskiewar on AC OS + +Boot to the prompt, join Wi-Fi, then upload from the monorepo: + +```sh +node fedac/native/tools/oskiewar-live.mjs ac7.local:8080 --watch +``` + +The tool bundles the shared Xbox game and native adapter into one piece, +verifies the uploaded bytes, and reloads it. Imported modules otherwise stay +cached across native reloads. The LAN port is reported by `/status`; another +process using port 80 can make the native server choose 8080. + +The M30 bridge in `tools/oskiewar-usb-pad.c` supports the 8BitDo M30 in Xbox +360 USB mode on kernels without xpad. It claims only that device and writes +`/tmp/oskiewar-gamepads.json`. The native client rejects stale input after two +seconds. Keyboard controls remain available. + +Write exactly `1` to `/tmp/oskiewar-gpu` to enable hardware triangles, or to +`/tmp/oskiewar-debug` to enable hitboxes at the next piece reload. Debug is off +by default; development USB init must not write `1` to that marker. The View +controller button can toggle diagnostics during play. Mesa needs +its EGL vendor manifest; `scripts/bundle-oskiewar.sh` includes that file, the +Comic Relief font, and the generated piece in OS builds. + +To capture the actual game framebuffer, write a unique request to +`/tmp/oskiewar-capture`. Read `/tmp/oskiewar-frame.json` after the next capture +poll. Its `runs` are alternating ARGB32 pixel values and counts. Device state, +input, render timing, and netplay counters are in `/tmp/oskiewar-status.json`. + +Today's Xbox-versus-AC test: + +```sh +node xbox/tools/oskiewar-lan-test.mjs ac7.local:8080 --hot +``` + +The seats are named `xbox` and `ac`; the override expires at local midnight. +It uses the existing Internet relay, so being on the same LAN does not imply +LAN latency. A state mismatch records both hashes and state evidence, pauses for three +seconds, then automatically deals a fresh match on both devices. Repeated +failures back off to 30 seconds; 30 seconds of stable simulation clears the +backoff. AC queues reports for the existing `/api/piece-log` endpoint and +retries failed uploads; Xbox uses its existing native error reporter. +Remove `/tmp/oskiewar-lan-test.json` and reload AC to return to local play; +`node xbox/tools/oskiewar-release.mjs deploy-xbox-dev --hot` restores ordinary +Xbox play. + +HDMI mirroring is handled by AC OS for every piece. Nearest-neighbor scaling +fills the display while preserving aspect ratio; borders remain only when +the source and display have different proportions. The mode picker prefers +modes within its pixel budget. +The TV's refresh rate is independent of the game's measured frame rate. +To select an ALSA output on engine startup, save its device name in +`/mnt/audio-device`; `AC_AUDIO_DEVICE` takes precedence. AC7's connected TV +uses `hw:0,3` at 48 kHz stereo. Remove the selection to restore automatic +device choice. A USB with two boot partitions needs the setting on both. + +Live uploads change RAM. The September 24 development USB also contains the +native binary, generated piece, font, EGL manifest, and M30 helper in both +initramfs copies. It still boots to the prompt. The larger ACBOOT partition +retains `initramfs.before-oskiewar.cpio.gz` for rollback of either copy; +the smaller EFI partition cannot hold three complete images during updates. +These are development images, +not an uploaded public OS release. + +## Concert display and curtain + +The local `oskiewar-stage` MCP serves on `127.0.0.1:7792/mcp`. Its configuration +is `~/.ac-os/oskiewar-stage.json`; launchd runs +`computer.aesthetic.oskiewar-stage`. Tools: + +- `oskiewar_curtain {down:true}`: darken and silence both displays immediately; + the paired simulation settles to the same frame, then pauses. +- `oskiewar_curtain {down:false}`: raise the curtain and resume. +- `oskiewar_display {mode:"performance"}`: composition title and progress with + ambient heads. `game` returns to the fight, keeping the current composition + at bottom center; `auto` follows active music. +- `oskiewar_performance_status {}`: read source state and device acknowledgments. + +Xbox receives this control through today's paired test. A command only reports +both displays acknowledged after AC and Xbox have returned its command ID. +The bridge observes Menu Band cue notifications and the native trio/spatial +status files. It does not start audio, change surround routing, or cue lights. +Stale transports cannot mask an advancing source; score notes are used only +when their hash matches the receiver. If all feeds stall, the footer retains +the last composition and confirmed progress with “signal lost.” Timing follows transport metadata, not +microphone analysis or an acoustic calibration. + +AC displays battery percentage and estimated remaining time at the top right. +The six round maps rotate deterministically in the paired match. Three +skateboards retain independent riders and throw state. + +The paired simulation uses deterministic math on both hosts. AC OS can run +that same operation order in C (`src/oskiewar-math.h`) through the versioned +`oskiewarMath` API; older runtimes fall back to JavaScript. Run +`node --test fedac/native/tests/oskiewar-math.test.mjs` on both compiler targets +when changing either implementation. Do not enable floating-point contraction +or substitute platform libm in simulation: single-bit differences caused the +captured projectile mismatch. Rendering continues to use fast platform math. + +Periodic performance CSV writes and log fsync run in bounded workers; shutdown +still drains pending CSV records. Debug frame-meter runs coalesce on AC's +smaller framebuffer. Neither change disables diagnostics. diff --git a/fedac/native/lib/oskiewar-host.mjs b/fedac/native/lib/oskiewar-host.mjs new file mode 100644 index 0000000000..a35a524696 --- /dev/null +++ b/fedac/native/lib/oskiewar-host.mjs @@ -0,0 +1,843 @@ +// Oskiewar's Xbox host contract on AC Native's existing piece API. +// Keep the game in xbox/live/oskiewar.js; this file only adapts the host. +export const KEY_BUTTONS = { + a: "ArrowLeft", arrowleft: "ArrowLeft", d: "ArrowRight", arrowright: "ArrowRight", + w: "ArrowUp", arrowup: "ArrowUp", s: "ArrowDown", arrowdown: "ArrowDown", + space: "A", f: "A", enter: "B", return: "B", g: "B", + shift: "X", r: "X", alt: "Y", q: "Y", e: "Y", + tab: "View", p: "Menu", backspace: "Menu", "-": "SpeedDown", "=": "SpeedUp", "+": "SpeedUp", +}; + +// Invert AC Native's fixed 70-degree perspective projection. The game has +// already projected its world: preserve those pixel coordinates and its z +// ordering while submitting one native Form per frame. +export function screenVertex(x, y, z, width, height) { + const distance = Math.max(.02, 2 + z); + const halfHeight = Math.tan(35 * Math.PI / 180) * distance; + return [(x * 2 / width - 1) * halfHeight * width / height, + (1 - y * 2 / height) * halfHeight, -distance, 1]; +} + +// Advances from src/font-matrix-chunky8.h. Keep layout on the same integer +// pixel grid as the native bitmap renderer, including per-glyph handle colors. +const matrixAdvances = [2, 2, 4, 6, 4, 4, 5, 2, 3, 3, 6, 4, 2, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 6, 5, 5, 4, 5, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 2, 4, 4]; +export function pixelGlyph(character, size, screenScale) { + const code = character.codePointAt(0); + const unicode = code > 126; + const font = unicode ? "unifont" : size * screenScale >= 16 ? "matrix" : "font_1"; + const height = unicode ? 16 : font === "matrix" ? 8 : 10; + const zoom = Math.max(1, Math.floor(size * screenScale / height)); + const advance = unicode ? 8 : font === "matrix" + ? matrixAdvances[Math.max(0, Math.min(94, code - 32))] : 6; + return { font, zoom, advance: advance * zoom, height: height * zoom }; +} + +// Xbox App.cpp PlayDrum is the canonical Oskiewar instrument bank. Render +// these short clips once, not six oscillators per hit on the audio thread. +// Dedicated replay playback leaves microphone/sample and surround routing alone. +export const OSKIEWAR_DRUM_LAYERS = { + "kick": [ + [ + "noise", + 2500.0, + 0.0025, + 0.5, + 0.0002, + 0.0022 + ], + [ + "sine", + 200.0, + 0.012, + 1.1, + 0.0005, + 0.011 + ], + [ + "sine", + 150.0, + 0.045, + 1.3, + 0.001, + 0.044 + ], + [ + "sine", + 90.0, + 0.08, + 0.85, + 0.002, + 0.078 + ], + [ + "sine", + 55.0, + 0.35, + 1.0, + 0.003, + 0.345 + ] + ], + "snare": [ + [ + "noise", + 3500.0, + 0.004, + 0.95, + 0.0001, + 0.004 + ], + [ + "sine", + 238.0, + 0.03, + 0.35, + 0.0003, + 0.029 + ], + [ + "sine", + 476.0, + 0.03, + 0.28, + 0.0003, + 0.029 + ], + [ + "noise", + 3500.0, + 0.11, + 0.85, + 0.0005, + 0.108 + ], + [ + "noise", + 1800.0, + 0.07, + 0.38, + 0.0008, + 0.068 + ], + [ + "triangle", + 180.0, + 0.025, + 0.22, + 0.001, + 0.024 + ] + ], + "clap": [ + [ + "noise", + 1000.0, + 0.025, + 0.9, + 0.005, + 0.02 + ], + [ + "noise", + 1100.0, + 0.035, + 0.95, + 0.015, + 0.02 + ], + [ + "noise", + 900.0, + 0.045, + 0.85, + 0.025, + 0.02 + ], + [ + "noise", + 3000.0, + 0.008, + 0.55, + 0.001, + 0.007 + ], + [ + "noise", + 1000.0, + 0.14, + 0.85, + 0.045, + 0.095 + ] + ], + "hat": [ + [ + "square", + 800.0, + 0.008, + 0.18, + 0.0005, + 0.0075 + ], + [ + "square", + 540.0, + 0.008, + 0.18, + 0.0005, + 0.0075 + ], + [ + "square", + 522.7, + 0.008, + 0.18, + 0.0005, + 0.0075 + ], + [ + "square", + 369.6, + 0.008, + 0.18, + 0.0005, + 0.0075 + ], + [ + "noise", + 8000.0, + 0.04, + 0.38, + 0.0005, + 0.038 + ] + ], + "bell": [ + [ + "sine", + 880.0, + 0.34, + 0.72, + 0.001, + 0.338 + ], + [ + "sine", + 1320.0, + 0.27, + 0.38, + 0.001, + 0.268 + ], + [ + "triangle", + 1760.0, + 0.18, + 0.2, + 0.001, + 0.178 + ] + ], + "whoosh": [ + [ + "noise", + 1450.0, + 0.34, + 0.68, + 0.018, + 0.32 + ], + [ + "noise", + 4200.0, + 0.18, + 0.28, + 0.008, + 0.17 + ], + [ + "triangle", + 110.0, + 0.28, + 0.24, + 0.012, + 0.26 + ] + ], + "block": [ + [ + "noise", + 5000.0, + 0.002, + 0.35, + 0.0001, + 0.0018 + ], + [ + "triangle", + 2500.0, + 0.05, + 0.52, + 0.0003, + 0.048 + ], + [ + "triangle", + 1250.0, + 0.05, + 0.18, + 0.0005, + 0.048 + ] + ] +}; +const oskiewarSoundRate = 48000; +const oskiewarDrumClips = new Map(); +export function renderOskiewarDrum(name, rate = oskiewarSoundRate, seed = 0x6f736b69) { + const layers = OSKIEWAR_DRUM_LAYERS[name] || OSKIEWAR_DRUM_LAYERS.block; + const frames = Math.floor(rate * Math.max(...layers.map(layer => layer[2]))); + const mixed = new Float64Array(frames); + const tau = 2 * Math.PI; + seed >>>= 0; + for (const [wave, frequency, duration, volume, attack, decay] of layers) { + let phase = 0, filteredNoise = 0; + const alpha = 1 - Math.exp(-tau * Math.min(frequency, rate * .45) / rate); + const count = Math.floor(rate * duration); + for (let i = 0; i < count && i < frames; i++) { + const time = i / rate; + let envelope = attack > 0 && time < attack ? time / attack : 1; + const decayStart = Math.max(0, duration - decay); + if (decay > 0 && time > decayStart) envelope *= 1 - (time - decayStart) / decay; + let sample; + if (wave === "noise") { + seed ^= seed << 13; seed ^= seed >>> 17; seed ^= seed << 5; seed >>>= 0; + const noise = seed / 4294967295 * 2 - 1; + filteredNoise += alpha * (noise - filteredNoise); + sample = filteredNoise; + } else { + phase += frequency / rate; phase -= Math.floor(phase); + sample = wave === "sine" ? Math.sin(tau * phase) + : wave === "square" ? phase < .5 ? 1 : -1 + : 1 - 4 * Math.abs(phase - .5); + } + mixed[i] += sample * envelope * volume; + } + } + return Float32Array.from(mixed, sample => sample * .28); +} + +export function createOskiewarSound(getSound) { + let currentReplay = null; + let voices = []; + const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); + const replayAvailable = () => typeof getSound()?.replay?.loadData === "function" && + typeof getSound()?.replay?.play === "function"; + // Initialization happens before play. Only small native buffer copies occur + // on hits; clip synthesis and its trigonometry never run in a gameplay frame. + if (replayAvailable()) for (const name of Object.keys(OSKIEWAR_DRUM_LAYERS)) { + if (!oskiewarDrumClips.has(name)) oskiewarDrumClips.set(name, renderOskiewarDrum(name)); + } + function stop() { + const sound = getSound(); + if (currentReplay) sound?.replay?.kill?.(currentReplay, 0); + currentReplay = null; + for (const voice of voices) sound?.kill?.(voice, 0); + voices = []; + } + return { + synth(tone, duration = .05) { + stop(); + const length = clamp(Number(duration) || .05, .005, 2); + // Xbox's JS synth entry accepts frequency/duration only and always uses + // a .25-volume sine with a linear decay. Native's centered oscillator + // sends half its volume to each channel, so compensate that split here. + const voice = getSound()?.synth?.({type:"sine", tone:clamp(Number(tone) || 440,20,5000), + duration:length, volume:.5, attack:0, decay:length, pan:0}); + if (voice !== undefined && voice !== null) voices.push(voice); + }, + drum(name, velocity = 1) { + stop(); + const key = Object.prototype.hasOwnProperty.call(OSKIEWAR_DRUM_LAYERS, name) ? name : "block"; + const hit = clamp(Number.isFinite(velocity) ? velocity : 1,.1,1.5); + const sound = getSound(); + if (replayAvailable()) { + const clip = oskiewarDrumClips.get(key); + if (clip && sound.replay.loadData(clip,oskiewarSoundRate) !== false) { + // Xbox's effects voice is mono and replaces the previous event. + currentReplay = sound.replay.play({tone:440,base:440,volume:hit,pan:0,loop:false}); + return; + } + } + // Older hosts retain the same layers/envelopes, with at most six voices. + // Their triangle/noise filters are approximate; current AC uses PCM. + for (const [type,tone,duration,volume,attack,decay] of OSKIEWAR_DRUM_LAYERS[key]) { + const voice = sound?.synth?.({type,tone,duration,volume:volume*hit*.56,attack,decay,pan:0}); + if (voice !== undefined && voice !== null) voices.push(voice); + } + }, + stop, + }; +} + +// Browser-only game identity; the USB file is outside HTTP-served /pieces and +// never changes the OS's developer credentials. Only public fields leave here. +export function createOskiewarAccount(getSystem, clock = () => Date.now()) { + const accountPath = "/mnt/.oskiewar-account.json"; + let state = {status:"signed-out",handle:"",code:"",pairUrl:"",expiresAt:0,error:"", + reportStatus:"",leaderboard:{},leaderboardError:""}; + let secret="",session=null,pending=null,nextPoll=0,nextRead=0; + let requestNumber=0,ownsPty=false,pendingReport=null,pendingBoard=null,lastBoard=-Infinity; + let reportRetries=0,nextReport=0; + const prefix="/tmp/oskiewar-pair-"+Math.trunc(clock()).toString(36); + const validHandle=value=>typeof value==="string"&&/^[A-Za-z0-9._-]{1,64}$/.test(value); + const validPair=value=>value&&typeof value.code==="string"&& + /^[ABCDEFGHJKLMNPQRSTUVWXYZ23456789]{6}$/.test(value.code)&& + typeof value.pollSecret==="string"&&/^[A-Za-z0-9_-]{32,128}$/.test(value.pollSecret)&& + Number.isFinite(value.expiresAt)&&value.expiresAt>clock()&&value.expiresAt<=clock()+600000; + function saveAccount(value) { + try {return getSystem().writeFile(accountPath,JSON.stringify(value),true)!==false;} + catch(_){return false;} + } + try { + const saved=JSON.parse(getSystem().readFile(accountPath)||"null"); + if(validHandle(saved?.handle)&&typeof saved?.session?.accessToken==="string"&&saved.session.accessToken) { + session=saved.session;state.handle=saved.handle;state.status="signed-in"; + } else if(validPair(saved?.pending)) { + secret=saved.pending.pollSecret;state.code=saved.pending.code; + state.pairUrl="https://aesthetic.computer/api/device-pair-login?code="+state.code; + state.expiresAt=saved.pending.expiresAt;state.status="waiting";nextPoll=clock()+1500; + } else if(saved?.pending&&!saveAccount({})) { + state.status="error";state.error="Could not clear expired sign-in"; + } + } catch(_) {} + function erase(job) { + if(!job)return; + for(const suffix of [".cfg",".body",".json",".next",".rc",".http"]) + getSystem().writeFile(job.base+suffix,"",false); + } + function cancelRequest() { + if(pending&&ownsPty)getSystem().pty2?.kill?.(); + erase(pending);pending=null; + } + function clearPair() {secret="";state.code=state.pairUrl="";state.expiresAt=0;} + function fail(message) { + cancelRequest();clearPair();state.status="error"; + state.error=!session&&!saveAccount({})?"Could not clear sign-in":message; + } + function request(kind,url,body=null,bearer="") { + const system=getSystem(); + if(!system.pty2?.spawn||(system.pty2.active&&!ownsPty))return false; + const base=prefix+"-"+(++requestNumber); + let config='url = '+JSON.stringify(url)+'\n'; + if(body!==null) { + if(system.writeFile(base+".body",JSON.stringify(body),false)===false)return false; + config+='request = "POST"\nheader = "Content-Type: application/json"\ndata-binary = "@'+base+'.body"\n'; + } + if(bearer) { + if(/[\r\n]/.test(bearer))return false; + config+='header = '+JSON.stringify('Authorization: Bearer '+bearer)+'\n'; + } + config+='silent\nwrite-out = "%{http_code}"\nconnect-timeout = 5\nmax-time = 12\nmax-filesize = 65536\n'+ + 'cacert = "/etc/pki/tls/certs/ca-bundle.crt"\noutput = "'+base+'.next"\n'; + if(system.writeFile(base+".cfg",config,false)===false)return false; + // No secret enters argv, terminal output, shared fetchResult or native logs. + const command=`umask 077; chmod 600 ${base}.cfg ${base}.body 2>/dev/null; `+ + `curl --config ${base}.cfg >${base}.http 2>/dev/null; result=$?; `+ + `if [ "$result" = 0 ]; then mv ${base}.next ${base}.json; fi; `+ + `rm -f ${base}.cfg ${base}.body ${base}.next; printf '%s' "$result" > ${base}.rc`; + if(!system.pty2.spawn("/bin/sh",["-c",command],80,24,{raw:true})) { + erase({base});return false; + } + ownsPty=true;pending={kind,base,body,started:clock()};nextRead=0;return true; + } + function receive(job,body,ok,now,httpStatus=0) { + if(job.kind==="board") { + state.leaderboardError=ok?"":"Leaderboard unavailable"; + if(ok)state.leaderboard=body; + return; + } + if(job.kind==="report") { + if(!ok&&httpStatus>=400&&httpStatus<500&&httpStatus!==408&&httpStatus!==429) { + pendingReport=null;state.reportStatus=httpStatus===409?"Result reports disagreed": + [401,403].includes(httpStatus)?"Sign in again to submit results":"Result rejected"; + } else if(!ok&&session) { + pendingReport=job.body;reportRetries++;nextReport=now+Math.min(30000,1500*2**Math.min(reportRetries,5)); + state.reportStatus="Retrying result submission"; + } else { + reportRetries=0;state.reportStatus=body?.recorded?"Result recorded": + body?.status==="pending"?"Waiting for opponent confirmation":"Result submitted"; + } + return; + } + if(!ok) { + if(job.kind==="create")fail("Sign-in unavailable. Try again."); + else {state.error="Reconnecting...";nextPoll=now+3500;} + return; + } + state.error=""; + if(job.kind==="create") { + if(!/^[ABCDEFGHJKLMNPQRSTUVWXYZ23456789]{6}$/.test(body.code||"")|| + !/^[A-Za-z0-9_-]{32,128}$/.test(body.pollSecret||"")) {fail("Could not create sign-in");return;} + const savedPair={code:body.code,pollSecret:body.pollSecret,expiresAt:now+600000}; + if(!saveAccount({pending:savedPair})) {fail("Could not save sign-in to USB");return;} + secret=body.pollSecret;state.code=body.code; + state.pairUrl="https://aesthetic.computer/api/device-pair-login?code="+state.code; + state.status="waiting";state.expiresAt=now+600000;nextPoll=now+1500; + } else if(body.status==="claimed") { + if(!validHandle(body.handle)||typeof body.session?.accessToken!=="string"||!body.session.accessToken) { + fail("Sign-in response was incomplete");return; + } + if(!saveAccount({handle:body.handle,session:body.session})) { + fail("Could not save sign-in to USB");return; + } + session=body.session;state.handle=body.handle;clearPair();state.status="signed-in"; + } else nextPoll=now+2500; + } + function update() { + const now=clock(); + if(state.status==="waiting"&&now>=state.expiresAt) {fail("Code expired. Sign in again.");return;} + if(pending&&now>=nextRead) { + nextRead=now+250; + const system=getSystem(),result=system.readFile(pending.base+".rc"); + if(result!==null&&result!==undefined&&String(result).trim()!=="") { + const job=pending;pending=null;let body; + try {body=JSON.parse(system.readFile(job.base+".json")||"null");}catch(_){} + const httpStatus=Number(system.readFile(job.base+".http")||0); + erase(job);receive(job,body,String(result).trim()==="0"&&httpStatus>=200&&httpStatus<300&&!!body,now,httpStatus); + } else if(now-pending.started>16000) { + const job=pending;cancelRequest();receive(job,null,false,now); + } + } + if(pending)return; + if(state.status==="waiting"&&now>=nextPoll) { + nextPoll=now+2500; + if(!request("poll","https://aesthetic.computer/api/device-pair?code="+state.code+"&secret="+secret)) + state.error="Sign-in connection unavailable"; + } else if(pendingReport&&session&&now>=nextReport) { + const report=pendingReport;pendingReport=null; + if(!request("report","https://aesthetic.computer/api/oskiewar-leaderboard",report,session.accessToken)) { + pendingReport=report;nextReport=now+3500;state.reportStatus="Retrying result submission"; + } + } else if(pendingBoard!==null&&now-lastBoard>=30000) { + const handles=pendingBoard;pendingBoard=null;lastBoard=now; + if(!request("board","https://aesthetic.computer/api/oskiewar-leaderboard?handles="+handles.join(","))) + state.leaderboardError="Leaderboard unavailable"; + } + } + return { + state() {update();return {...state};}, + action(action,payload="") { + if(action==="leaderboard") { + try {const supplied=JSON.parse(payload||"[]"); + if(!Array.isArray(supplied)||supplied.length>2)return false; + const handles=[...new Set(supplied.filter(value=>value!==""))]; + if(!handles.every(validHandle))return false; + if(clock()-lastBoard<30000)return false; + pendingBoard=handles;update();return true; + }catch(_){return false;} + } + if(!["login","logout","cancel"].includes(action))return false; + if(action==="login"&&(state.status==="creating"||state.status==="waiting"&&clock()4096)return false; + const p=JSON.parse(payload); + if(!session||![0,1].includes(p.seat)||![0,1].includes(p.winner)|| + !/^[A-Za-z0-9._:-]{1,128}$/.test(p.matchId||"")|| + !Array.isArray(p.handles)||p.handles.length!==2||!p.handles.every(validHandle)|| + p.handles[p.seat]!==state.handle||!Array.isArray(p.roundWins)||p.roundWins.length!==2|| + !p.roundWins.every(n=>Number.isInteger(n)&&n>=0&&n<=100))return false; + pendingReport={matchId:p.matchId,seat:p.seat,handles:p.handles,roundWins:p.roundWins,winner:p.winner}; + reportRetries=0;nextReport=0;state.reportStatus="Submitting result";update();return true; + }catch(_){return false;} + }, + }; +} + +// Explicit development override; credentials and public matchmaking stay HTTPS. +export function oskiewarRelayBase(value) { + const fallback = "wss://session-server.aesthetic.computer/oskiewar-live"; + if (typeof value !== "string") return fallback; + const match = /^ws:\/\/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}):(\d{1,5})\/oskiewar-live$/.exec(value.trim()); + if (!match) return fallback; + const parts = match.slice(1, 5).map(Number), port = Number(match[5]); + if (parts.some(n => n > 255) || port < 1 || port > 65535) return fallback; + const [a, b] = parts; + return a === 10 || (a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) + ? value.trim() : fallback; +} + +export function createNativeHost(initialApi) { + let api = initialApi; + const gameSound = createOskiewarSound(() => api.sound); + const gameAccount = createOskiewarAccount(() => api.system); + let tick = 0, paints = 0; + let positions = [], colors = [], text = [], overlays = [], gpu = false; + const useGpu = api.system.readFile("/tmp/oskiewar-gpu") === "1"; + const held = new Set(); + let lastSignal = "", lastError = "", lastReportAt = 0; + let reports = [], reportPending = false, reportRetryAt = 0, reportStatus = ""; + try { reports = JSON.parse(api.system.readFile("/pieces/oskiewar-error-queue.json") || "[]"); } catch (_) {} + const saveReports = () => api.system.writeFile("/pieces/oskiewar-error-queue.json", JSON.stringify(reports), false); + function reportErrors() { + if (reportPending && api.system.fetchResult) { + try { + if (JSON.parse(api.system.fetchResult).ok) { + reports.shift(); saveReports(); reportStatus = "reported to server"; + } + } catch (_) {} + reportPending = false; reportRetryAt = Date.now() + 10000; + } else if (reportPending && api.system.fetchError) { + reportPending = false; reportRetryAt = Date.now() + 10000; + reportStatus = "retrying server report"; + } + if (!reportPending && reports.length && Date.now() >= reportRetryAt) { + reportPending = api.system.fetchPost("https://aesthetic.computer/api/piece-log", + JSON.stringify(reports[0]), '{"Content-Type":"application/json"}') === true; + reportStatus = reportPending ? "posting to server" : "queued for server"; + } + } + let canvas, captureId = "", captureRequest = ""; + let triangleCount = 0, pads = []; + let netRoom = "", netRetryAt = 0, stageReadAt = 0, stageReceipt = ""; + const netEvents = []; + const wire = { sent:0, received:0, rejected:0, last:null }; + const view = () => ({ width: Math.round(768 * api.screen.width / api.screen.height), height: 768 }); + const scale = () => api.screen.height / 768; + function record(event, detail) { + if (event === "CLIENT_ERROR") { + let data; try { data = JSON.parse(detail); } catch (_) { data = {message:String(detail)}; } + reports.push({pieceId:"oskiewar-ac-" + Date.now() + "-" + tick, phase:"error", + meta:{slug:"oskiewar",host:"ac-native",platform:"ac-os"},data}); + if (reports.length > 8) reports.shift(); + saveReports(); + } + if (event.startsWith("NET_")) { netEvents.push([event, detail]); if (netEvents.length > 8) netEvents.shift(); } + if (/error/i.test(event)) { + lastError = String(detail); + api.system?.writeFile?.("/tmp/oskiewar-error.json", JSON.stringify({ event, detail })); + } + } + function triangle3d(x1, y1, z1, x2, y2, z2, x3, y3, z3, r = 255, g = 255, b = 255) { + triangleCount++; + if (api.triangle3d) { + const s = scale(); + api.triangle3d(x1*s,y1*s,z1,x2*s,y2*s,z2,x3*s,y3*s,z3,r,g,b); + return; + } + const { width, height } = view(); + positions.push(screenVertex(x1, y1, z1, width, height), + screenVertex(x2, y2, z2, width, height), screenVertex(x3, y3, z3, width, height)); + const color = [r / 255, g / 255, b / 255, 1]; + colors.push(color, color, color); + } + function write(value, x, y, size = 20, r = 255, g = 255, b = 255) { + text.push([String(value), x, y, size, r, g, b]); + } + write.measureGlyph = (character, size) => pixelGlyph(character, size, scale()).advance / scale(); + function synth(tone, duration = .05) { gameSound.synth(tone, duration); } + const host = { + accountState: () => gameAccount.state(), + accountAction: (action,payload) => gameAccount.action(action,payload), + accountReport: payload => gameAccount.report(payload), + runtime: () => ({ monotonicUs: Math.round(tick * 1e6 / 60), paintMonotonicUs: Date.now() * 1000, + simMonotonicUs: Math.round(tick * 1e6 / 60), paintMonotonicUs: Date.now() * 1000, unixMs: Date.now(), + simCount: tick, paintCount: paints, renderAlpha: 1, clientErrorReportStatus: reportStatus }), + gameView: view, + controllers: () => pads, + gamepad: (index = 0) => { + const pad = pads[index] || { connected: index === 0, down: [], leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; + return { ...pad, down: [...new Set([...(pad.down || []), ...(index === 0 + ? [...held].map(key => KEY_BUTTONS[key]).filter(Boolean) : [])])] }; + }, + capabilities: () => ({ platform: "ac-native", inputFamily: pads[0]?.connected ? "xbox" : "keyboard", + showControlLegend: true, showControllerDiagram: false, hudOverlay: true }), + telemetry: record, + gameSignal: (name) => { lastSignal = String(name); }, + wipe: (r, g, b) => { triangleCount = 0; positions = []; colors = []; text = []; overlays = []; api.wipe(r, g, b); gpu = useGpu && api.gpuBegin?.(r, g, b) === true; }, + box: (x, y, w, h, r = 255, g = 255, b = 255) => { + const s = scale(); + overlays.push(["box", r,g,b,x*s,y*s,w*s,h*s]); + }, + line: (x1, y1, x2, y2, width = 1, r = 255, g = 255, b = 255) => { + const s = scale(); + overlays.push(["line", r,g,b,x1*s,y1*s,x2*s,y2*s]); + }, + triangle3d, write, systemWrite: write, + themeReady: () => useGpu && api.themeReady?.() === true, + themeAssetReady: (asset) => useGpu && api.themeAssetReady?.(asset) === true, + themeSprite: (asset,sx,sy,sw,sh,x,y,w,h,angle,flip,z,depthWrite=true) => { + if (!gpu || !api.themeSprite) return false; + const s = scale(); + return api.themeSprite(asset,sx,sy,sw,sh,x*s,y*s,w*s,h*s,angle,flip,z,depthWrite); + }, + themeQuad: (asset,sx,sy,sw,sh,...corners) => { + if (!gpu || !api.themeQuad || corners.length !== 12) return false; + const s = scale(); + return api.themeQuad(asset,sx,sy,sw,sh,...corners.map((value,i) => i%3 === 2 ? value : value*s)); + }, + disc3d: (x, y, z, radius, r, g, b) => { + if (!gpu || !api.disc3d) return false; + const sides = radius < 6 ? 6 : radius < 13 ? 8 : radius < 26 ? 12 + : radius < 52 ? 16 : radius < 110 ? 24 : 32; + const s = scale(); + const count = api.disc3d(x*s,y*s,z,radius*s,sides,r,g,b); + triangleCount += count; + return count > 0; + }, + triangle: (x1, y1, x2, y2, x3, y3, r, g, b) => + triangle3d(x1, y1, -.5, x2, y2, -.5, x3, y3, -.5, r, g, b), + synth, + drum: (name, velocity = 1) => gameSound.drum(name, velocity), + update(next) { api = next; }, + connectNet(room) { + netRoom = room; netRetryAt = Date.now() + 5000; + let relay; + try { relay = api.system.readFile("/pieces/oskiewar-relay.txt"); } catch (_) {} + api.system.ws.connect(oskiewarRelayBase(relay) + "?match=" + + room + "&role=challenger&surface=ac"); + }, + sendNet(room, packet) { + if (room !== netRoom || !api.system.ws.connected) { wire.rejected++; return false; } + wire.sent++; + api.system.ws.send(JSON.stringify({ type: "oskiewar:net", content: packet })); + return true; + }, + readNet() { + reportErrors(); + if (Date.now() >= stageReadAt) { + stageReadAt = Date.now() + 100; + try { + const command = JSON.parse(api.system.readFile("/pieces/oskiewar-control.json") || "null"); + if (command && typeof command.id === "string") { + globalThis.__oskiewarStageCommand = command; + if (!netRoom) globalThis.__oskiewarStageState = command; + } + } catch (_) {} + } + if (!netRoom) return; + const ws = api.system.ws; + for (const raw of ws.messages || []) { + try { + const message = JSON.parse(raw); + if (message.type === "oskiewar:net" && message.content && + globalThis.__oskiewarNetInbox.length < 64) + { wire.received++; wire.last = message.content; globalThis.__oskiewarNetInbox.push(message.content); } + } catch (_) {} + } + if (!ws.connected && !ws.connecting && Date.now() >= netRetryAt) + host.connectNet(netRoom); + }, + closeNet() { if (netRoom) api.system.ws.close(); netRoom = ""; }, + readGamepads() { + try { + const value = JSON.parse(api.system.readFile("/tmp/oskiewar-gamepads.json") || "null"); + pads = value && Math.abs(Date.now() - value.at) < 2000 ? value.pads : []; + } catch (_) { pads = []; } + }, + begin() { + if (paints % 60 === 0) { + const request = api.system?.readFile?.("/tmp/oskiewar-capture"); + if (request && request !== captureId) captureRequest = request; + } + if (captureRequest) { + if (!canvas || canvas.width !== api.screen.width || canvas.height !== api.screen.height) + canvas = api.painting(api.screen.width, api.screen.height); + api.page(canvas); + } else api.page(); + }, + step() { tick++; }, + act(event) { + const key = String(event.key || "").toLowerCase(); + if (event.is("keyboard:down")) held.add(key); + if (event.is("keyboard:up")) held.delete(key); + }, + clearInput() { held.clear(); }, + flush(state = {}) { + if (positions.length) { + const form = new api.Form({ type: "triangle", positions, colors }); + form.noFade = true; + api.ink(255, 255, 255).form(form); + } + if (gpu) api.gpuEnd(); + for (const [kind,r,g,b,...args] of overlays) { api.ink(r,g,b); api[kind](...args); } + const s = scale(); + for (const [value, x, y, size, r, g, b] of text) { + api.ink(r, g, b); + const style = pixelGlyph("a", size, s); + const px = Math.round(x * s), py = Math.round(y * s); + if (/^[\x20-\x7e]*$/.test(value)) { + api.write(value, {x: px, y: py, size: style.zoom, font: style.font}); + } else { + let cursor = px; + for (const character of value) { + const glyph = pixelGlyph(character, size, s); + api.write(character, {x: cursor, y: py, size: glyph.zoom, font: glyph.font}); + cursor += glyph.advance; + } + } + } + const battery = api.system.battery; + if (battery && battery.percent >= 0 && !globalThis.__oskiewarStageState?.curtain) { + const minutes = battery.minutesLeft; + const time = !battery.charging && minutes > 0 + ? " " + Math.floor(minutes / 60) + "h " + minutes % 60 + "m" : ""; + const label = battery.percent + "%" + (battery.charging ? " +" : time); + const width = label.length * 6 + 10; + const x = api.screen.width - width - 5; + api.ink(20, 27, 42).box(x, 4, width, 16); + api.ink(...(battery.percent < 15 && !battery.charging + ? [255, 150, 110] : [232, 245, 255])); + api.write(label, {x: x + 5, y: 7, size: 1, font: "6x10"}); + } + const stage = globalThis.__oskiewarStageState; + const receipt = stage ? stage.id + "/" + stage.peerAck : ""; + if (receipt && receipt !== stageReceipt) { + stageReceipt = receipt; + api.system.writeFile("/pieces/oskiewar-stage-status.json", JSON.stringify(stage), false); + } + paints++; + api.page(); + if (captureRequest) api.paste(canvas, 0, 0); + if (Date.now() - lastReportAt > 2000) { + lastReportAt = Date.now(); + api.system?.writeFile?.("/tmp/oskiewar-status.json", JSON.stringify({ + ...state, nativeMath: api.oskiewarMath?.version || null, reportStatus, stage: globalThis.__oskiewarStageState || null, netEvents, wire, tick, paints, triangles: triangleCount, renderer: gpu ? "gpu-triangles" : api.triangle3d ? "native-triangles" : "form", + gamepads: pads.map(p => ({ connected: p.connected, id: p.id, down: p.down })), + screen: api.screen, battery: api.system.battery, lastSignal, lastError, at: lastReportAt, + }), false); + } + if (captureRequest) { + captureId = captureRequest; + captureRequest = ""; + const pixels = new Uint32Array(canvas.pixels.buffer); + const runs = []; + for (let i = 0; i < pixels.length;) { + const color = pixels[i]; let end = i + 1; + while (end < pixels.length && pixels[end] === color) end++; + runs.push(color, end - i); i = end; + } + api.system.writeFile("/tmp/oskiewar-frame.json", JSON.stringify({ + id: captureId, width: canvas.width, height: canvas.height, + stride: pixels.length / canvas.height, runs, + }), false); + } + positions = []; colors = []; text = []; + }, + }; + return host; +} diff --git a/fedac/native/pieces/oskiewar.mjs b/fedac/native/pieces/oskiewar.mjs new file mode 100644 index 0000000000..1ffc6e46b9 --- /dev/null +++ b/fedac/native/pieces/oskiewar.mjs @@ -0,0 +1,93 @@ +// Oskiewar, 26.09.24 +// Live native client. Build/upload with tools/oskiewar-live.mjs. +import { createNativeHost } from "../lib/oskiewar-host.mjs"; +import { createOskiewar, sourceHash } from "../lib/oskiewar-game.mjs"; + +let host, game, lastSimAt, pendingMs; +let profile = { simMs: 0, paintMs: 0, flushMs: 0, frames: 0, startedAt: 0 }; +let recentPerf = {}, frameIntervals = [], lastPaintAt = 0, netBaseline = null; +function boot(api) { + globalThis.__oskiewarNativeMath = api.oskiewarMath; + host = createNativeHost(api); + globalThis.__oskiewarOpponent = "dummy"; + globalThis.__oskiewarDebugOverlay = api.system.readFile("/tmp/oskiewar-debug") === "1"; + globalThis.__oskiewarLanTest = null; + globalThis.__oskiewarNetInbox = []; + globalThis.__oskiewarNetStats = null; + globalThis.__oskiewarLanStatus = null; + globalThis.__oskiewarLanMismatch = null; + try { + const config = JSON.parse(api.system.readFile("/tmp/oskiewar-lan-test.json") || "null"); + if (config?.seat === 1 && /^ow-[a-z]{4,7}[0-9]{1,3}$/.test(config.room) && + Number.isFinite(config.expires) && Date.now() < config.expires) { + globalThis.__oskiewarLanTest = config; + host.connectNet(config.room); + } + } catch (_) {} + globalThis.__oskiewarNetSend = (room, packet) => host.sendNet(room, packet); + game = createOskiewar(host); + game.boot(); + game.enterGame(); + lastSimAt = Date.now(); pendingMs = 0; + profile = { simMs: 0, paintMs: 0, flushMs: 0, frames: 0, startedAt: lastSimAt }; + recentPerf = {}; frameIntervals = []; lastPaintAt = 0; netBaseline = null; +} +function sim(api) { + host.update(api); + host.readGamepads(); + const now = Date.now(); + pendingMs += Math.max(0, Math.min(100, now - lastSimAt)); + lastSimAt = now; + while (pendingMs >= 1000 / 60) { + host.step(); game.sim(); pendingMs -= 1000 / 60; + } + profile.simMs += Date.now() - now; +} +function paint(api) { + host.update(api); + host.readNet(); + host.begin(); + const start = Date.now(); + if (lastPaintAt) frameIntervals.push(start - lastPaintAt); + lastPaintAt = start; + game.paint(); + const painted = Date.now(); + profile.paintMs += painted - start; + profile.frames++; + const n = profile.frames; + const state = game.state(), windowMs = painted - profile.startedAt; + const sampleReady = windowMs >= 2000; + if (sampleReady) { + const intervals = frameIntervals.slice().sort((a, b) => a - b); + const percentile = p => intervals[Math.min(intervals.length - 1, + Math.floor(intervals.length * p))] || 0; + const net = state.net; + const continuous = net && netBaseline && net.frame >= netBaseline.frame && + net.sent >= netBaseline.sent; + recentPerf = { + windowMs, fps: n * 1000 / windowMs, + simMs: profile.simMs / n, paintMs: profile.paintMs / n, flushMs: profile.flushMs / n, + frameP50Ms: percentile(.5), frameP95Ms: percentile(.95), + frameP99Ms: percentile(.99), frameMaxMs: percentile(1), + gameFps: continuous ? (net.frame - netBaseline.frame) * 1000 / windowMs : null, + waits: continuous ? net.waits - netBaseline.waits : null, + stalls: continuous ? net.stalls - netBaseline.stalls : null, + }; + netBaseline = net ? { frame: net.frame, sent: net.sent, waits: net.waits, stalls: net.stalls } : null; + } + host.flush({ sourceHash, ...state, perf: recentPerf }); + profile.flushMs += Date.now() - painted; + if (sampleReady) { + profile = { simMs: 0, paintMs: 0, flushMs: 0, frames: 0, startedAt: painted }; + frameIntervals = []; + } +} +function act(api) { + host.update(api); + host.act(api.event); +} +function leave() { game?.leave(); host?.closeNet(); host?.clearInput(); } +export { boot, sim, paint, act, leave }; + +// A gamepad/display surface has no mouse crosshair. Keyboard escape still works. +export const surface = "display"; diff --git a/fedac/native/pieces/prompt.mjs b/fedac/native/pieces/prompt.mjs index 55e3ef944c..0c2f5a48c5 100644 --- a/fedac/native/pieces/prompt.mjs +++ b/fedac/native/pieces/prompt.mjs @@ -811,7 +811,10 @@ function paint({ wipe, ink, box, write, screen, paintCount, wifi, system }) { const nets = wifi.networks || []; const matches = nets .filter(n => n.ssid && knownSSIDs.has(n.ssid)) - .sort((a, b) => b.signal - a.signal); + .sort((a, b) => { + const priority = ssid => Number(knownCreds.find(c => c.ssid === ssid)?.priority) || 0; + return priority(b.ssid) - priority(a.ssid) || b.signal - a.signal; + }); if (matches.length > 0) { const best = matches[0]; const cred = knownCreds.find(c => c.ssid === best.ssid); diff --git a/fedac/native/scripts/build-and-flash-initramfs.sh b/fedac/native/scripts/build-and-flash-initramfs.sh index aa5b5e6d1f..00c34f1273 100755 --- a/fedac/native/scripts/build-and-flash-initramfs.sh +++ b/fedac/native/scripts/build-and-flash-initramfs.sh @@ -217,6 +217,7 @@ if [ -d "${PIECES_SRC}" ]; then for p in "${PIECES_SRC}"/*.mjs; do [ -f "$p" ] && cp "$p" "${INITRAMFS_DIR}/pieces/" done + bash "${NATIVE_DIR}/scripts/bundle-oskiewar.sh" "${INITRAMFS_DIR}" log "Bundled pieces: $(ls "${INITRAMFS_DIR}/pieces/" | tr '\n' ' ')" fi diff --git a/fedac/native/scripts/bundle-oskiewar.sh b/fedac/native/scripts/bundle-oskiewar.sh new file mode 100644 index 0000000000..5da7d7f419 --- /dev/null +++ b/fedac/native/scripts/bundle-oskiewar.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Include the generated, self-contained piece rather than unresolved imports. +set -euo pipefail +native_dir="$(cd "$(dirname "$0")/.." && pwd)" +repo_dir="$(cd "$native_dir/../.." && pwd)" +target_dir="${1:?Usage: bundle-oskiewar.sh initramfs-root}" +node "$native_dir/tools/oskiewar-live.mjs" --build "$target_dir" +mkdir -p "$target_dir/fonts" "$target_dir/usr/share/glvnd/egl_vendor.d" +cp "$repo_dir/system/public/papers.aesthetic.computer/foundry/fonts/ComicRelief-Regular.ttf" "$target_dir/fonts/" +# libEGL uses this discovery file even when libEGL_mesa.so.0 is installed. +printf '%s\n' '{"file_format_version":"1.0.0","ICD":{"library_path":"libEGL_mesa.so.0"}}' \ + > "$target_dir/usr/share/glvnd/egl_vendor.d/50_mesa.json" diff --git a/fedac/native/scripts/flash-mac.sh b/fedac/native/scripts/flash-mac.sh index beeb0f37c0..f904e03038 100755 --- a/fedac/native/scripts/flash-mac.sh +++ b/fedac/native/scripts/flash-mac.sh @@ -570,6 +570,7 @@ write_device_config() { # $1=dest $2=udp(1=include udpMidiBroadcast) if (udp === "1") cfg.udpMidiBroadcast = true; try { const c = (JSON.parse(fs.readFileSync(insc, "utf8")).usbConfig) || {}; + if (c.token) cfg.token = c.token; if (c.city) cfg.city = c.city; if (Array.isArray(c.colors) && c.colors.length) cfg.colors = c.colors; if (c.mood) cfg.mood = c.mood; @@ -581,7 +582,7 @@ write_device_config() { # $1=dest $2=udp(1=include udpMidiBroadcast) ' "$1" "${USER_HANDLE}" "${BOOT_PIECE}" "${USER_SUB}" "${USER_EMAIL}" "$2" "${INSCRIPTION_FILE}" } write_device_config "${M1}/config.json" 1 -log " config.json: $(cat "${M1}/config.json")" +log " config.json: @${USER_HANDLE}, boot piece ${BOOT_PIECE}" # Build merged wifi_creds.json (presets + preserved + optional override) # once, reuse for both partitions. diff --git a/fedac/native/src/ac-native.c b/fedac/native/src/ac-native.c index bb5b0a2c68..20214f215d 100644 --- a/fedac/native/src/ac-native.c +++ b/fedac/native/src/ac-native.c @@ -23,6 +23,7 @@ #include // BLKRRPART for forced partition re-read (install) #include #include +#include #include "drm-display.h" #include "version.h" @@ -38,6 +39,7 @@ #include "lanserv.h" #include "recorder.h" #include "camera.h" +#include "log-mount.h" #include #ifdef USE_WAYLAND #include "wayland-display.h" @@ -88,45 +90,79 @@ static void perf_record(PerfRecord *r) { perf_buf[perf_buf_count++] = *r; } -// Write current buffer as a numbered chunk file, fsync, close, then -// delete the oldest chunk if we exceed PERF_MAX_CHUNKS. -void perf_flush(void) { - if (!perf_buf || perf_buf_count == 0) return; +// Media writes must not sit between two vblanks. One bounded worker owns +// its copied records; the render thread continues filling the next chunk. +static pthread_t perf_writer; +static int perf_writer_valid; +static atomic_int perf_writer_busy; +typedef struct { + int count, sequence; + PerfRecord records[PERF_BUF_SIZE]; +} PerfChunk; +static void perf_write_records(const PerfRecord *records, int count, int sequence) { char path[128]; - snprintf(path, sizeof(path), "/mnt/perf/%04d.csv", perf_chunk_seq); - - int fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) return; - - FILE *f = fdopen(fd, "w"); - if (!f) { close(fd); return; } - + snprintf(path, sizeof(path), "/mnt/perf/%04d.csv", sequence); + FILE *f = fopen(path, "w"); + if (!f) return; fprintf(f, "frame,total_us,act_us,sim_us,paint_us,present_us,voices,events,heap_mb,flags\n"); - for (int i = 0; i < perf_buf_count; i++) { - PerfRecord *r = &perf_buf[i]; + for (int i = 0; i < count; i++) { + const PerfRecord *r = &records[i]; fprintf(f, "%u,%u,%u,%u,%u,%u,%u,%u,%u,%u\n", r->frame, r->total_us, r->act_us, r->sim_us, r->paint_us, r->present_us, r->voices, r->events, r->js_heap_mb, r->flags); } fflush(f); - fsync(fd); - fclose(f); // also closes fd + fsync(fileno(f)); + fclose(f); + if (sequence >= PERF_MAX_CHUNKS) { + snprintf(path, sizeof(path), "/mnt/perf/%04d.csv", sequence - PERF_MAX_CHUNKS); + unlink(path); + } +} - perf_buf_count = 0; +static void *perf_write_chunk(void *opaque) { + PerfChunk *chunk = opaque; + perf_write_records(chunk->records, chunk->count, chunk->sequence); + free(chunk); + atomic_store(&perf_writer_busy, 0); + return NULL; +} - // Delete oldest chunk beyond retention window - int old_seq = perf_chunk_seq - PERF_MAX_CHUNKS; - if (old_seq >= 0) { - char old_path[128]; - snprintf(old_path, sizeof(old_path), "/mnt/perf/%04d.csv", old_seq); - unlink(old_path); +static void perf_flush_async(void) { + if (!perf_buf || !perf_buf_count || atomic_load(&perf_writer_busy)) return; + if (perf_writer_valid) { + pthread_join(perf_writer, NULL); + perf_writer_valid = 0; } - + PerfChunk *chunk = malloc(sizeof(*chunk)); + if (!chunk) return; + chunk->count = perf_buf_count; + chunk->sequence = perf_chunk_seq; + memcpy(chunk->records, perf_buf, perf_buf_count * sizeof(PerfRecord)); + atomic_store(&perf_writer_busy, 1); + if (pthread_create(&perf_writer, NULL, perf_write_chunk, chunk) != 0) { + atomic_store(&perf_writer_busy, 0); + free(chunk); + return; + } + perf_writer_valid = 1; + perf_buf_count = 0; perf_chunk_seq++; } +// Shutdown retains a synchronous drain, including any in-flight chunk. +void perf_flush(void) { + if (perf_writer_valid) { + pthread_join(perf_writer, NULL); + perf_writer_valid = 0; + } + if (!perf_buf || !perf_buf_count) return; + perf_write_records(perf_buf, perf_buf_count, perf_chunk_seq++); + perf_buf_count = 0; +} + static void perf_destroy(void) { perf_flush(); free(perf_buf); @@ -459,6 +495,37 @@ void ac_log_flush(void) { } } +// fsync a duplicated descriptor so a concurrent log pause/reopen cannot +// hand the worker an unrelated descriptor. At most one sync is outstanding. +static pthread_t log_sync_thread; +static int log_sync_valid; +static atomic_int log_sync_busy; +static void *log_sync_worker(void *opaque) { + int fd = (int)(intptr_t)opaque; + fsync(fd); + close(fd); + atomic_store(&log_sync_busy, 0); + return NULL; +} +static void ac_log_flush_async(void) { + if (!logfile || !log_dirty || atomic_load(&log_sync_busy)) return; + if (log_sync_valid) { + pthread_join(log_sync_thread, NULL); + log_sync_valid = 0; + } + fflush(logfile); + int fd = dup(fileno(logfile)); + if (fd < 0) return; + atomic_store(&log_sync_busy, 1); + if (pthread_create(&log_sync_thread, NULL, log_sync_worker, (void *)(intptr_t)fd) != 0) { + atomic_store(&log_sync_busy, 0); + close(fd); + return; + } + log_sync_valid = 1; + log_dirty = 0; +} + // Temporarily close the log file (e.g. before flash writes to same partition) void ac_log_pause(void) { if (logfile) { @@ -534,6 +601,18 @@ static void mount_minimal_fs(void) { char log_dev[32] = ""; // non-static: accessed by js-bindings.c for flash target check static void try_mount_log(void) { mkdir("/mnt", 0755); + // Init already selected the config volume. Reuse its visible mount on + // every restart rather than stacking another partition over user state. + if (ac_log_existing_mount(log_dev, sizeof(log_dev))) { + logfile = fopen("/mnt/ac-native.log", "a"); + if (logfile) { + fprintf(logfile, "\n=== BOOT %s (existing /mnt) ===\n", log_dev); + fflush(logfile); + fsync(fileno(logfile)); + } + fprintf(stderr, "[ac-native] Reusing existing /mnt (%s)\n", log_dev); + return; // A read-only/full volume must not cause a different mount. + } // Wait for USB block devices to appear (up to 2s after EFI handoff) fprintf(stderr, "[ac-native] Waiting for USB block devices...\n"); for (int w = 0; w < 100; w++) { @@ -4994,7 +5073,8 @@ int main(int argc, char *argv[]) { // Software cursor on its own overlay buffer (unaffected by KidLisp effects). // A piece holding the surface is playing the pad, not pointing with // it — drawing a cursor there would track the drummer's palm. - if (cursor_fb && input && !(rt && rt->surface_grab) && + if (cursor_fb && input && !(rt && (rt->surface_grab || + strcmp(rt->surface_mode, "display") == 0)) && (input->pointer_x || input->pointer_y)) { fb_clear(cursor_fb, 0x00000000); // transparent graph_page(&graph, cursor_fb); @@ -5333,7 +5413,7 @@ int main(int argc, char *argv[]) { // Sync the USB log in batches instead of on every event. if (logfile && log_dirty && main_frame % 300 == 0) { - ac_log_flush(); + ac_log_flush_async(); } // ── Record frame perf ── @@ -5410,7 +5490,7 @@ int main(int argc, char *argv[]) { // Flush chunk to disk every 30 seconds (fsync'd, crash-safe) if (main_frame - perf_flush_frame >= PERF_CHUNK_FRAMES) { - perf_flush(); + perf_flush_async(); perf_flush_frame = main_frame; } #undef TS_US diff --git a/fedac/native/src/audio.c b/fedac/native/src/audio.c index d9b990b7c3..afac6b23ea 100644 --- a/fedac/native/src/audio.c +++ b/fedac/native/src/audio.c @@ -2808,8 +2808,20 @@ ACAudio *audio_init(void) { int err = -1; int card_idx = 0; - // AC_AUDIO_DEVICE override — try the env var device before the hardcoded list. + // The environment wins; a device selection saved on the boot USB also + // applies to every piece (including the prompt) on the next engine start. const char *env_dev = getenv("AC_AUDIO_DEVICE"); + char saved_device[128] = {0}; + if (!env_dev || !env_dev[0]) { + FILE *selection = fopen("/mnt/audio-device", "r"); + if (selection) { + if (fgets(saved_device, sizeof(saved_device), selection)) { + saved_device[strcspn(saved_device, "\r\n")] = 0; + if (saved_device[0]) env_dev = saved_device; + } + fclose(selection); + } + } if (env_dev && env_dev[0]) { err = snd_pcm_open(&pcm, env_dev, SND_PCM_STREAM_PLAYBACK, 0); if (err >= 0) { @@ -3424,7 +3436,7 @@ ACAudio *audio_init(void) { // HDMI audio disabled — opening HDMI PCM streams on the same HDA controller // can exhaust controller streams and cause EIO on capture. audio->hdmi_pcm = NULL; - fprintf(stderr, "[audio] HDMI audio: disabled\n"); + fprintf(stderr, "[audio] Secondary HDMI audio clone: disabled (primary=%s)\n", audio->audio_device); // Start audio thread audio->running = 1; diff --git a/fedac/native/src/comic-font.h b/fedac/native/src/comic-font.h new file mode 100644 index 0000000000..d9575bc7be --- /dev/null +++ b/fedac/native/src/comic-font.h @@ -0,0 +1,68 @@ +#ifndef AC_COMIC_FONT_H +#define AC_COMIC_FONT_H +#ifdef HAVE_COMIC_FONT +#include +#include FT_FREETYPE_H +static FT_Library ac_comic_library; +static FT_Face ac_comic_face; +static int ac_comic_failed, ac_comic_px; +static struct ComicGlyph { + uint32_t code; int px, width, height, left, top, baseline; + double advance; unsigned char *coverage; +} ac_comic_cache[2048]; +static int ac_comic_draw(ACFramebuffer *fb,const char *text,double x,double y,double size, + uint8_t r,uint8_t g,uint8_t b) { + if (!ac_comic_face) { + if (ac_comic_failed) return 0; + if (FT_Init_FreeType(&ac_comic_library) || + FT_New_Face(ac_comic_library,"/fonts/ComicRelief-Regular.ttf",0,&ac_comic_face)) { + ac_comic_failed=1;return 0; + } + } + int px=(int)fmax(5,fmin(192,round(size))); + if (ac_comic_px!=px) { FT_Set_Pixel_Sizes(ac_comic_face,0,px); ac_comic_px=px; } + double cursor=x; int baseline=(int)round(y)+(ac_comic_face->size->metrics.ascender>>6); + const unsigned char *s=(const unsigned char *)text; + while(*s) { + uint32_t code=*s++; + if ((code&0xe0)==0xc0 && *s) { code=(code&31)<<6;code|=*s++&63; } + else if ((code&0xf0)==0xe0 && s[0] && s[1]) { + code=(code&15)<<12;code|=(s[0]&63)<<6;code|=s[1]&63;s+=2; + } else if ((code&0xf8)==0xf0 && s[0] && s[1] && s[2]) { + code=(code&7)<<18;code|=(s[0]&63)<<12;code|=(s[1]&63)<<6;code|=s[2]&63;s+=3; + } + struct ComicGlyph *cached=&ac_comic_cache[(code*131u+(unsigned)px*17u)%2048]; + if(cached->px!=px || cached->code!=code) { + if (FT_Load_Char(ac_comic_face,code,FT_LOAD_RENDER|FT_LOAD_TARGET_NORMAL)) continue; + FT_GlyphSlot glyph=ac_comic_face->glyph;FT_Bitmap *bm=&glyph->bitmap; + size_t bytes=(size_t)bm->width*bm->rows; + unsigned char *coverage=bytes?malloc(bytes):NULL; + if(bytes && !coverage)continue; + for(unsigned row=0;rowrows;row++) + memcpy(coverage+row*bm->width,bm->buffer+row*bm->pitch,bm->width); + free(cached->coverage); + *cached=(struct ComicGlyph){code,px,(int)bm->width,(int)bm->rows, + glyph->bitmap_left,glyph->bitmap_top,baseline-(int)round(y), + (double)glyph->linearHoriAdvance/65536.0,coverage}; + } + int left=(int)round(cursor)+cached->left, top=baseline-cached->top; + for(int row=0;rowheight;row++) { + int yy=top+row;if(yy<0 || yy>=fb->height)continue; + for(int col=0;colwidth;col++) { + int xx=left+col;if(xx<0 || xx>=fb->width)continue; + unsigned a=cached->coverage[row*cached->width+col];if(!a)continue; + uint32_t *dst=fb->pixels+yy*fb->stride+xx, old=*dst; + unsigned inv=255-a; + *dst=0xff000000u|(((r*a+((old>>16)&255)*inv+127)/255)<<16)| + (((g*a+((old>>8)&255)*inv+127)/255)<<8)|((b*a+(old&255)*inv+127)/255); + } + } + cursor+=cached->advance; + } + return 1; +} +#else +static int ac_comic_draw(ACFramebuffer *fb,const char *t,double x,double y,double size, + uint8_t r,uint8_t g,uint8_t b) { (void)fb;(void)t;(void)x;(void)y;(void)size;(void)r;(void)g;(void)b;return 0; } +#endif +#endif diff --git a/fedac/native/src/drm-display.c b/fedac/native/src/drm-display.c index 5476a50f25..cf9d765dd5 100644 --- a/fedac/native/src/drm-display.c +++ b/fedac/native/src/drm-display.c @@ -948,29 +948,31 @@ void drm_secondary_present_mirror(ACSecondaryDisplay *s, ACFramebuffer *screen) if (!s || !s->active || !screen || screen->width < 1 || screen->height < 1) return; int sw = screen->width, sh = screen->height; + // Fit the whole image to the sink, preserving aspect to the nearest + // output pixel. Fractional nearest-neighbor scaling fills a 1080p TV + // from a 683x384 screen instead of leaving a 1366x768 island in it. + int dst_w=s->width; + int dst_h=(int)(((int64_t)dst_w*sh+sw-1)/sw); + if(dst_h>s->height) { + dst_h=s->height; + dst_w=(int)(((int64_t)dst_h*sw+sh-1)/sh); + } if (sw != s->mirror_w || sh != s->mirror_h) { - int sx = s->width / sw, sy = s->height / sh; - int scale = sx < sy ? sx : sy; - if (scale < 1) scale = 1; // screen larger than the sink: clip, don't shrink - s->mirror_scale = scale; - s->mirror_x = (s->width - sw * scale) / 2; if (s->mirror_x < 0) s->mirror_x = 0; - s->mirror_y = (s->height - sh * scale) / 2; if (s->mirror_y < 0) s->mirror_y = 0; + s->mirror_x = (s->width-dst_w)/2; + s->mirror_y = (s->height-dst_h)/2; s->mirror_w = sw; s->mirror_h = sh; // Letterbox bars change with the source size — reblack both buffers. for (int b = 0; b < 2; b++) if (s->bufs[b].map && s->bufs[b].map != MAP_FAILED) memset(s->bufs[b].map, 0, s->bufs[b].size); - ac_log("[drm-secondary] mirror %dx%d x%d at %d,%d on %dx%d\n", - sw, sh, scale, s->mirror_x, s->mirror_y, s->width, s->height); + ac_log("[drm-secondary] mirror %dx%d -> %dx%d at %d,%d on %dx%d (nearest)\n", + sw, sh, dst_w, dst_h, s->mirror_x, s->mirror_y, s->width, s->height); } int back = 1 - s->buf_front; int stride = (int)(s->bufs[back].pitch / sizeof(uint32_t)); - int dst_w = sw * s->mirror_scale, dst_h = sh * s->mirror_scale; - if (dst_w > s->width - s->mirror_x) dst_w = s->width - s->mirror_x; - if (dst_h > s->height - s->mirror_y) dst_h = s->height - s->mirror_y; uint32_t *dst = s->bufs[back].map + (size_t)s->mirror_y * stride + s->mirror_x; - fb_copy_scaled(screen, dst, dst_w, dst_h, stride, s->mirror_scale); + fb_copy_resized(screen, dst, dst_w, dst_h, stride); // Plain vblank-synced flip, no event: the primary's drm_flip waits on // this same fd for *its* flip event, so the secondary must not emit diff --git a/fedac/native/src/drm-display.h b/fedac/native/src/drm-display.h index 2e098cfd87..79283c9bb9 100644 --- a/fedac/native/src/drm-display.h +++ b/fedac/native/src/drm-display.h @@ -83,10 +83,8 @@ typedef struct { drmModeCrtc *saved_crtc; ACFramebuffer *small_fb; // 1/8-scale internal render target (fast) - // Mirror state — the primary `screen` framebuffer is blown up by an - // integer factor and centered (letterboxed) on the HDMI buffer. + // Mirror state — aspect-fit nearest-neighbor resize to the HDMI buffer. int mirror_w, mirror_h; // last mirrored source size (0 = none yet) - int mirror_scale; // integer scale used for that source int mirror_x, mirror_y; // letterbox offset of the mirrored image int present_every; // mirror cadence in main-loop frames (1 = every frame) unsigned flips_dropped; // frames skipped because a flip was still queued @@ -99,7 +97,7 @@ typedef struct { // the CPU dumb-buffer path can afford (see drm_pick_secondary_mode). ACSecondaryDisplay *drm_init_secondary(ACDisplay *primary, int screen_w, int screen_h); -// Mirror the primary screen framebuffer to the HDMI back buffer (integer +// Mirror the primary screen framebuffer to the HDMI back buffer (nearest // scale, centered) and flip. Cheap enough for every frame at 1080p. void drm_secondary_present_mirror(ACSecondaryDisplay *s, ACFramebuffer *screen); diff --git a/fedac/native/src/framebuffer.c b/fedac/native/src/framebuffer.c index 8e049fb1a4..6e5e8b4b0b 100644 --- a/fedac/native/src/framebuffer.c +++ b/fedac/native/src/framebuffer.c @@ -43,6 +43,14 @@ void fb_copy_to(ACFramebuffer *src, uint32_t *dst, int dst_stride) { } void fb_copy_scaled(ACFramebuffer *src, uint32_t *dst, int dst_w, int dst_h, int dst_stride, int scale) { + if (!src || !dst || dst_w <= 0 || dst_h <= 0 || scale <= 0 || + src->width <= 0 || src->height <= 0 || dst_stride < dst_w) return; + // DRM dumb buffers are write-combined memory. Reading a just-written + // scanline back from one (to duplicate it) can cost an entire frame on + // Intel laptop graphics. Expand in ordinary cached RAM, then only write + // to the scanout buffer. Both the duplicated rows and edge fill use RAM. + uint32_t *expanded = malloc((size_t)dst_w * sizeof(uint32_t)); + if (!expanded) return; // Fast path: expand each source pixel to scale×scale block // Avoids per-pixel division, uses memcpy for row duplication int src_h = src->height; @@ -52,7 +60,7 @@ void fb_copy_scaled(ACFramebuffer *src, uint32_t *dst, int dst_w, int dst_h, int for (int sy = 0; sy < src_h && sy * scale < dst_h; sy++) { uint32_t *src_row = src->pixels + sy * src->stride; - uint32_t *dst_row = dst + sy * scale * dst_stride; + uint32_t *dst_row = expanded; // Expand source row: each pixel repeated 'scale' times int dx = 0; @@ -65,15 +73,37 @@ void fb_copy_scaled(ACFramebuffer *src, uint32_t *dst, int dst_w, int dst_h, int for (; dx < dst_w; dx++) dst_row[dx] = dx > 0 ? dst_row[dx - 1] : 0; - // Duplicate this row (scale-1) more times - for (int r = 1; r < scale && (sy * scale + r) < dst_h; r++) { + // Write every copy from cached RAM, including the first row. + for (int r = 0; r < scale && (sy * scale + r) < dst_h; r++) { memcpy(dst + (sy * scale + r) * dst_stride, dst_row, (size_t)dst_w * sizeof(uint32_t)); } } // Fill any remaining rows at bottom if (max_dy < dst_h && max_dy > 0) { - uint32_t *last_row = dst + (max_dy - 1) * dst_stride; + uint32_t *last_row = expanded; for (int dy = max_dy; dy < dst_h; dy++) memcpy(dst + dy * dst_stride, last_row, (size_t)dst_w * sizeof(uint32_t)); } + free(expanded); +} + +void fb_copy_resized(ACFramebuffer *src, uint32_t *dst, int dst_w, int dst_h, int dst_stride) { + if (!src || !src->pixels || !dst || dst_w<=0 || dst_h<=0 || + src->width<=0 || src->height<=0 || dst_stridewidth/dst_w); + int previous=-1; + for(int y=0;yheight/dst_h); + if(sy!=previous) { + const uint32_t *source=src->pixels+(size_t)sy*src->stride; + for(int x=0;x 32) return JS_ThrowRangeError(ctx, "at most 32 components"); + for (int i=0; i1 ? values[1] : NAN; + switch(operation) { + case 0: result=ow_sin(x);break; + case 1: result=ow_sin(x+1.5707963267948966);break; + case 2: result=ow_sin(x)/ow_sin(x+1.5707963267948966);break; + case 3: result=ow_atan(x);break; + case 4: result=ow_atan2(x,y);break; + case 5: result=ow_atan2(x,sqrt(1-x*x));break; + case 6: result=ow_exp(x);break; + default: result=ow_hypot(values,argc);break; + } + return JS_NewFloat64(ctx,result); +} +static JSValue build_oskiewar_math(JSContext *ctx) { + JSValue global=JS_GetGlobalObject(ctx); + JSValue math=JS_GetPropertyStr(ctx,global,"__acOskiewarMath"); + if (!JS_IsObject(math)) { + JS_FreeValue(ctx,math);math=JS_NewObject(ctx); + const char *names[]={"sin","cos","tan","atan","atan2","asin","exp","hypot"}; + for(int i=0;i<8;i++) JS_SetPropertyStr(ctx,math,names[i], + JS_NewCFunctionMagic(ctx,js_oskiewar_math,names[i],i==4?2:1,JS_CFUNC_generic_magic,i)); + JS_SetPropertyStr(ctx,math,"version",JS_NewString(ctx,"oskiewar-libm-v1")); + JS_SetPropertyStr(ctx,global,"__acOskiewarMath",JS_DupValue(ctx,math)); + } + JS_FreeValue(ctx,global);return math; +} + + +// Pixel-space triangles for games that project their own geometry. +static JSValue js_screen_triangle(JSContext *ctx, JSValueConst self, + int argc, JSValueConst *argv) { + (void)self; + if (argc < 9 || !current_rt) return JS_UNDEFINED; + double v[12] = {0,0,0,0,0,0,0,0,0,255,255,255}; + for (int i=0; igraph->fb; + if (!current_rt->depth_buf) + current_rt->depth_buf=depth_create(fb->width,fb->height,fb->stride); + ACDepthBuffer *db=current_rt->depth_buf; + if (!db || db->width!=fb->width || db->height!=fb->height || db->stride!=fb->stride) + return JS_UNDEFINED; + uint32_t color=0xff000000u; + for (int i=0;i<3;i++) { + int c=(int)fmax(0,fmin(255,v[9+i])); + color |= (uint32_t)c << (16-i*8); + } + ac_screen_triangle(fb->pixels,db->data,fb->width,fb->height,fb->stride, + v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8],color); + return JS_UNDEFINED; +} + +static JSValue js_gpu_begin(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self; double c[3]={0,0,0}; + if (!current_rt) return JS_FALSE; + for (int i=0;igraph->fb; + return JS_NewBool(ctx,ac_gpu_begin(fb->width,fb->height,c[0],c[1],c[2])); +} +static JSValue js_gpu_disc(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self; + double v[8]; + if (!current_rt || argc<8) return JS_NewInt32(ctx,0); + for(int i=0;i<8;i++) { + if(JS_ToFloat64(ctx,&v[i],argv[i])<0) return JS_EXCEPTION; + if(!isfinite(v[i])) return JS_NewInt32(ctx,0); + } + if(v[4]<3 || v[4]>32) return JS_NewInt32(ctx,0); + return JS_NewInt32(ctx,ac_gpu_disc(v[0],v[1],v[2],v[3],(int)v[4],v[5],v[6],v[7])); +} +static JSValue js_gpu_end(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)ctx;(void)self;(void)argc;(void)argv; + if(current_rt) ac_gpu_end(current_rt->graph->fb); + return JS_UNDEFINED; +} +static JSValue js_theme_ready(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self;(void)argc;(void)argv; + return JS_NewBool(ctx,current_rt && ac_gpu_theme_ready()); +} +static JSValue js_theme_sprite(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self;int32_t asset;double v[10]; + if(!current_rt || argc<12)return JS_FALSE; + if(JS_ToInt32(ctx,&asset,argv[0])<0)return JS_EXCEPTION; + for(int i=0;i<9;i++)if(JS_ToFloat64(ctx,&v[i],argv[i+1])<0)return JS_EXCEPTION; + if(JS_ToFloat64(ctx,&v[9],argv[11])<0)return JS_EXCEPTION; + int flip=JS_ToBool(ctx,argv[10]);if(flip<0)return JS_EXCEPTION; + int depth_write=argc>12?JS_ToBool(ctx,argv[12]):1;if(depth_write<0)return JS_EXCEPTION; + return JS_NewBool(ctx,ac_gpu_theme_sprite(asset,v,flip,depth_write)); +} +static JSValue js_theme_asset_ready(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self;int32_t asset; + if(!current_rt || argc<1)return JS_FALSE; + if(JS_ToInt32(ctx,&asset,argv[0])<0)return JS_EXCEPTION; + return JS_NewBool(ctx,ac_gpu_theme_asset_ready(asset)); +} +static JSValue js_theme_quad(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self;int32_t asset;double v[16]; + if(!current_rt || argc<17)return JS_FALSE; + if(JS_ToInt32(ctx,&asset,argv[0])<0)return JS_EXCEPTION; + for(int i=0;i<16;i++)if(JS_ToFloat64(ctx,&v[i],argv[i+1])<0)return JS_EXCEPTION; + return JS_NewBool(ctx,ac_gpu_theme_quad(asset,v)); +} + +static JSValue js_comic_write(JSContext *ctx, JSValueConst self, int argc, JSValueConst *argv) { + (void)self; + if (!current_rt || argc<4) return JS_FALSE; + const char *text=JS_ToCString(ctx,argv[0]); if(!text)return JS_EXCEPTION; + double v[6]={0,0,10,255,255,255}; + for(int i=1;igraph->fb,text,v[0],v[1],v[2], + (uint8_t)fmax(0,fmin(255,v[3])),(uint8_t)fmax(0,fmin(255,v[4])),(uint8_t)fmax(0,fmin(255,v[5]))); + JS_FreeCString(ctx,text);return JS_NewBool(ctx,ok); +} + // Form class finalizer static void js_form_finalizer(JSRuntime *rt, JSValue val) { (void)rt; @@ -3564,7 +3693,8 @@ static JSValue js_read_file_bytes(JSContext *ctx, JSValueConst this_val, return ab; } -// system.writeFile(path, data) — write a string to disk, returns true/false +// system.writeFile(path, data, flush=true) — string write. Volatile /tmp +// telemetry can explicitly skip the system-wide USB flush. static JSValue js_write_file(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv) { (void)this_val; if (argc < 2) return JS_FALSE; @@ -3580,7 +3710,8 @@ static JSValue js_write_file(JSContext *ctx, JSValueConst this_val, int argc, JS if (fp) { fputs(data, fp); fclose(fp); - sync(); // flush to USB + if (argc < 3 || !JS_IsBool(argv[2]) || JS_ToBool(ctx, argv[2])) + sync(); // durable writes keep the existing flush behavior ok = 1; } JS_FreeCString(ctx, path); @@ -6838,7 +6969,7 @@ static JSValue js_nopaint_cancel(JSContext *ctx, JSValueConst this_val, int argc return JS_UNDEFINED; } -static JSValue build_system_obj(JSContext *ctx) { +static JSValue build_system_diagnostics(JSContext *ctx) { JSValue sys = JS_NewObject(ctx); // Battery info — scan /sys/class/power_supply/ for any battery @@ -7286,6 +7417,37 @@ static JSValue build_system_obj(JSContext *ctx) { JS_SetPropertyStr(ctx, sys, "typec", typec); } + return sys; +} + +static JSValue build_system_obj(JSContext *ctx) { + JSValue sys = JS_NewObject(ctx); + char buf[64]; + // Diagnostics need human-time freshness, not per-sim/per-paint sysfs + // scans. Keep the cache owned by this context so reload/destruction + // cannot leave a JSValue pointing into a freed runtime. + JSValue global = JS_GetGlobalObject(ctx); + JSValue diagnostics = JS_GetPropertyStr(ctx, global, "__acSystemDiagnostics"); + JSValue stamp = JS_GetPropertyStr(ctx, global, "__acSystemDiagnosticsAt"); + double refreshed = 0; + if (JS_IsNumber(stamp)) JS_ToFloat64(ctx, &refreshed, stamp); + JS_FreeValue(ctx, stamp); + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + double seconds = now.tv_sec + now.tv_nsec / 1e9; + if (!JS_IsObject(diagnostics) || seconds - refreshed >= .25 || + strcmp(current_phase, "boot") == 0) { + JS_FreeValue(ctx, diagnostics); + diagnostics = build_system_diagnostics(ctx); + JS_SetPropertyStr(ctx, global, "__acSystemDiagnostics", JS_DupValue(ctx, diagnostics)); + JS_SetPropertyStr(ctx, global, "__acSystemDiagnosticsAt", JS_NewFloat64(ctx, seconds)); + } + const char *fields[] = {"battery", "hw", "brightness", "typec"}; + for (int i = 0; i < 4; i++) + JS_SetPropertyStr(ctx, sys, fields[i], JS_GetPropertyStr(ctx, diagnostics, fields[i])); + JS_FreeValue(ctx, diagnostics); + JS_FreeValue(ctx, global); + // system.setPowerRole(port, role) — swap USB-C power role ("source" or "sink") JS_SetPropertyStr(ctx, sys, "setPowerRole", JS_NewCFunction(ctx, js_set_power_role, "setPowerRole", 2)); @@ -7477,13 +7639,18 @@ static JSValue build_system_obj(JSContext *ctx) { // + `flashrom --probe` step inside the update thread. { JSValue firmware = JS_NewObject(ctx); - int mtd_ok = (access("/dev/mtd0", F_OK) == 0); - char bios_vendor[128] = ""; - char product_name[128] = ""; - char bios_version[128] = ""; - read_sysfs("/sys/class/dmi/id/bios_vendor", bios_vendor, sizeof(bios_vendor)); - read_sysfs("/sys/class/dmi/id/product_name", product_name, sizeof(product_name)); - read_sysfs("/sys/class/dmi/id/bios_version", bios_version, sizeof(bios_version)); + static int mtd_ok; + static char bios_vendor[128], product_name[128], bios_version[128]; + static double firmware_probe_at = -1; + if (firmware_probe_at < 0 || seconds - firmware_probe_at >= 1 || + strcmp(current_phase, "boot") == 0) { + firmware_probe_at = seconds; + mtd_ok = (access("/dev/mtd0", F_OK) == 0); + bios_vendor[0] = product_name[0] = bios_version[0] = 0; + read_sysfs("/sys/class/dmi/id/bios_vendor", bios_vendor, sizeof(bios_vendor)); + read_sysfs("/sys/class/dmi/id/product_name", product_name, sizeof(product_name)); + read_sysfs("/sys/class/dmi/id/bios_version", bios_version, sizeof(bios_version)); + } // Trim trailing newlines from sysfs reads for (char *p = bios_vendor; *p; p++) if (*p == '\n') { *p = 0; break; } for (char *p = product_name; *p; p++) if (*p == '\n') { *p = 0; break; } @@ -7597,7 +7764,18 @@ static JSValue build_system_obj(JSContext *ctx) { // Flash targets: enumerate all devices that could receive an EFI flash { - JSValue targets = JS_NewArray(ctx); + // Hotplug needs second-scale freshness, not two scans per frame. + // JS references belong to this context and disappear on reload. + JSValue cache_global = JS_GetGlobalObject(ctx); + JSValue targets = JS_GetPropertyStr(ctx, cache_global, "__acFlashTargets"); + JSValue cache_stamp = JS_GetPropertyStr(ctx, cache_global, "__acFlashTargetsAt"); + double targets_at = -1; + if (JS_IsNumber(cache_stamp)) JS_ToFloat64(ctx, &targets_at, cache_stamp); + JS_FreeValue(ctx, cache_stamp); + if (!JS_IsObject(targets) || seconds - targets_at >= 1 || + strcmp(current_phase, "boot") == 0) { + JS_FreeValue(ctx, targets); + targets = JS_NewArray(ctx); int idx = 0; // Check USB (/dev/sda1) if (access("/dev/sda1", F_OK) == 0) { @@ -7666,7 +7844,11 @@ static JSValue build_system_obj(JSContext *ctx) { JS_SetPropertyStr(ctx, t, "blank", JS_NewBool(ctx, 1)); JS_SetPropertyUint32(ctx, targets, idx++, t); } + JS_SetPropertyStr(ctx, cache_global, "__acFlashTargets", JS_DupValue(ctx, targets)); + JS_SetPropertyStr(ctx, cache_global, "__acFlashTargetsAt", JS_NewFloat64(ctx, seconds)); + } JS_SetPropertyStr(ctx, sys, "flashTargets", targets); + JS_FreeValue(ctx, cache_global); } // Binary fetch for OS update @@ -8113,6 +8295,8 @@ static JSValue build_api(JSContext *ctx, ACRuntime *rt, const char *phase) { // Sound JS_SetPropertyStr(ctx, api, "sound", build_sound_obj(ctx, rt)); + JS_SetPropertyStr(ctx, api, "oskiewarMath", build_oskiewar_math(ctx)); + // System (battery, etc) JS_SetPropertyStr(ctx, api, "system", build_system_obj(ctx)); @@ -8188,6 +8372,16 @@ static JSValue build_api(JSContext *ctx, ACRuntime *rt, const char *phase) { // penLock JS_SetPropertyStr(ctx, api, "penLock", JS_NewCFunction(ctx, js_pen_lock, "penLock", 0)); + JS_SetPropertyStr(ctx, api, "comicWrite", JS_NewCFunction(ctx, js_comic_write, "comicWrite", 7)); + JS_SetPropertyStr(ctx, api, "gpuBegin", JS_NewCFunction(ctx, js_gpu_begin, "gpuBegin", 3)); + JS_SetPropertyStr(ctx, api, "gpuEnd", JS_NewCFunction(ctx, js_gpu_end, "gpuEnd", 0)); + JS_SetPropertyStr(ctx, api, "themeReady", JS_NewCFunction(ctx, js_theme_ready, "themeReady", 0)); + JS_SetPropertyStr(ctx, api, "themeAssetReady", JS_NewCFunction(ctx, js_theme_asset_ready, "themeAssetReady", 1)); + JS_SetPropertyStr(ctx, api, "themeSprite", JS_NewCFunction(ctx, js_theme_sprite, "themeSprite", 12)); + JS_SetPropertyStr(ctx, api, "themeQuad", JS_NewCFunction(ctx, js_theme_quad, "themeQuad", 17)); + JS_SetPropertyStr(ctx, api, "disc3d", JS_NewCFunction(ctx, js_gpu_disc, "disc3d", 8)); + JS_SetPropertyStr(ctx, api, "triangle3d", JS_NewCFunction(ctx, js_screen_triangle, "triangle3d", 12)); + // get (stub for texture loading — fps.mjs checks if get is available) JS_SetPropertyStr(ctx, api, "get", JS_NULL); diff --git a/fedac/native/src/lanserv.c b/fedac/native/src/lanserv.c index eb8e14df6e..7edddcd6bd 100644 --- a/fedac/native/src/lanserv.c +++ b/fedac/native/src/lanserv.c @@ -128,7 +128,7 @@ static void lan_trigger_jump(const char *piece) { // ── HTTP ─────────────────────────────────────────────────────────────── static int http_listen(int *port_out) { - int fd = socket(AF_INET, SOCK_STREAM, 0); + int fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); if (fd < 0) return -1; int one = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); @@ -354,7 +354,7 @@ static void http_handle(int fd) { // for `ping host.local` and printer-style discovery in Bonjour browsers. static int mdns_open(void) { - int fd = socket(AF_INET, SOCK_DGRAM, 0); + int fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (fd < 0) return -1; int one = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); @@ -705,7 +705,7 @@ static void *lanserv_thread(void *arg) { continue; } if (http_fd >= 0 && FD_ISSET(http_fd, &rd)) { - int cfd = accept(http_fd, NULL, NULL); + int cfd = accept4(http_fd, NULL, NULL, SOCK_CLOEXEC); if (cfd >= 0) { http_handle(cfd); close(cfd); diff --git a/fedac/native/src/log-mount.h b/fedac/native/src/log-mount.h new file mode 100644 index 0000000000..5f2c9bff73 --- /dev/null +++ b/fedac/native/src/log-mount.h @@ -0,0 +1,44 @@ +#ifndef AC_LOG_MOUNT_H +#define AC_LOG_MOUNT_H +#include +#include +#include +#include + +// Resolve the kernel's visible mount ID, not the first/last /mnt entry: +// older native versions may have left several volumes stacked at /mnt. +static int ac_log_mount_record(FILE *mountinfo, unsigned long visible_id, + char *device, size_t capacity) { + char line[4096]; + while (fgets(line, sizeof(line), mountinfo)) { + unsigned long id=0; + char target[256]; + if (sscanf(line,"%lu %*u %*s %*s %255s",&id,target)!=2 || + id!=visible_id || strcmp(target,"/mnt")) continue; + char *fields=strstr(line," - "); + char source[256]=""; + if(fields && sscanf(fields," - %*s %255s",source)==1 && + !strncmp(source,"/dev/",5) && strlen(source) +// Exact operation order from xbox/live/oskiewar.js. Compile without FMA +// contraction: these results are part of the paired simulation protocol. +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC push_options +#pragma GCC optimize ("fp-contract=off") +#endif +#pragma STDC FP_CONTRACT OFF +static double ow_sin(double x) { + x = fmod(x, 6.283185307179586); + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const double square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +static double ow_atan(double x) { + const double sign = x < 0 ? -1 : 1; + x = fabs(x); + const int inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + sqrt(1 + x * x)); + const double square = x * x; + double term = x, sum = x; + for (int n = 1; n <= 20; n++) { term *= -square; sum += term / (2 * n + 1); } + const double angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +static double ow_atan2(double y, double x) { + if (x > 0) return ow_atan(y / x); + if (x < 0) return ow_atan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +static double ow_exp(double x) { + if (x > 709.782712893384) return INFINITY; + if (x < -745.1332191019411) return 0; + if (isnan(x)) return x; + double quotient = x / .6931471805599453; + double exponent = floor(quotient); + if (quotient - exponent >= .5) exponent++; + const double remainder = x - exponent * .6931471805599453; + double sum = 1, term = 1; + for (int n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * ldexp(1, (int)exponent); +} +static double ow_hypot(const double *values, int count) { + double scale = 0; + for (int i = 0; i < count; i++) { + double v = fabs(values[i]); + if (isnan(v)) return v; + if (v > scale) scale = v; + } + if (!scale || !isfinite(scale)) return scale; + double sum = 0; + for (int i = 0; i < count; i++) { double ratio = values[i] / scale; sum += ratio * ratio; } + return sqrt(sum) * scale; +} +#if defined(__GNUC__) && !defined(__clang__) +#pragma GCC pop_options +#endif +#endif diff --git a/fedac/native/src/screen-gpu.h b/fedac/native/src/screen-gpu.h new file mode 100644 index 0000000000..100ca1d779 --- /dev/null +++ b/fedac/native/src/screen-gpu.h @@ -0,0 +1,280 @@ +#ifndef AC_SCREEN_GPU_H +#define AC_SCREEN_GPU_H +#include +#include +// Optional offscreen GPU rasterization. Scanout stays on the proven DRM path; +// readback keeps painting capture and the native HUD in the same framebuffer. +#ifdef HAVE_SCREEN_GPU +#include +#include +#include +static struct { + int initialized, active, width, height, count; + EGLDisplay display; + EGLContext context; + EGLSurface surface; + GLuint program, fbo, texture, depth, vbo; + GLuint theme_program, theme_textures[5]; + time_t theme_retry_at, theme_asset_retry_at[5]; + float *vertices; + uint32_t *readback; +} ac_gpu; +#define AC_GPU_VERTICES 65532 +static GLuint ac_gpu_shader(GLenum type, const char *source) { + GLuint shader=glCreateShader(type); + glShaderSource(shader,1,&source,NULL); glCompileShader(shader); + GLint ok=0; glGetShaderiv(shader,GL_COMPILE_STATUS,&ok); + if (!ok) { glDeleteShader(shader); return 0; } + return shader; +} +static int ac_gpu_init(void) { + if (ac_gpu.initialized) return ac_gpu.initialized>0; + ac_gpu.initialized=-1; + ac_gpu.display=eglGetPlatformDisplay(EGL_PLATFORM_SURFACELESS_MESA,EGL_DEFAULT_DISPLAY,NULL); + if (ac_gpu.display==EGL_NO_DISPLAY || !eglInitialize(ac_gpu.display,NULL,NULL)) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + EGLint attrs[]={EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT, + EGL_RED_SIZE,8,EGL_GREEN_SIZE,8,EGL_BLUE_SIZE,8,EGL_ALPHA_SIZE,8,EGL_NONE}; + EGLConfig config; EGLint count=0; + if (!eglChooseConfig(ac_gpu.display,attrs,&config,1,&count) || !count) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + eglBindAPI(EGL_OPENGL_ES_API); + EGLint ca[]={EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE}; + EGLint pa[]={EGL_WIDTH,1,EGL_HEIGHT,1,EGL_NONE}; + ac_gpu.context=eglCreateContext(ac_gpu.display,config,EGL_NO_CONTEXT,ca); + ac_gpu.surface=eglCreatePbufferSurface(ac_gpu.display,config,pa); + if (ac_gpu.context==EGL_NO_CONTEXT || ac_gpu.surface==EGL_NO_SURFACE || + !eglMakeCurrent(ac_gpu.display,ac_gpu.surface,ac_gpu.surface,ac_gpu.context)) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + const char *renderer=(const char *)glGetString(GL_RENDERER); + ac_log("[screen-gpu] renderer=%s\n",renderer?renderer:"unknown"); + if (!renderer || strstr(renderer,"llvmpipe") || strstr(renderer,"softpipe")) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + GLuint vs=ac_gpu_shader(GL_VERTEX_SHADER, + "attribute vec3 position; attribute vec3 color; varying vec3 tint;" + "void main(){gl_Position=vec4(position,1.0);tint=color;}"); + GLuint fs=ac_gpu_shader(GL_FRAGMENT_SHADER, + "precision mediump float; varying vec3 tint;void main(){gl_FragColor=vec4(tint,1.0);}"); + if (!vs || !fs) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + ac_gpu.program=glCreateProgram(); glAttachShader(ac_gpu.program,vs); glAttachShader(ac_gpu.program,fs); + glBindAttribLocation(ac_gpu.program,0,"position"); glBindAttribLocation(ac_gpu.program,1,"color"); + glLinkProgram(ac_gpu.program); glDeleteShader(vs); glDeleteShader(fs); + GLint ok=0; glGetProgramiv(ac_gpu.program,GL_LINK_STATUS,&ok); if (!ok) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + glGenFramebuffers(1,&ac_gpu.fbo); glGenTextures(1,&ac_gpu.texture); + glGenRenderbuffers(1,&ac_gpu.depth); glGenBuffers(1,&ac_gpu.vbo); + ac_gpu.vertices=malloc(AC_GPU_VERTICES*6*sizeof(float)); + if (!ac_gpu.vertices) { ac_log("[screen-gpu] init failed line=%d egl=%x\n",__LINE__,eglGetError()); return 0; } + ac_gpu.initialized=1; return 1; +} +static int ac_gpu_begin(int width,int height,float r,float g,float b) { + ac_gpu.active=0; ac_gpu.count=0; + if (width<1 || height<1 || width>4096 || height>4096 || !ac_gpu_init()) return 0; + glBindFramebuffer(GL_FRAMEBUFFER,ac_gpu.fbo); + if (width!=ac_gpu.width || height!=ac_gpu.height) { + void *pixels=realloc(ac_gpu.readback,(size_t)width*height*4); if (!pixels) return 0; + ac_gpu.readback=pixels; + glBindTexture(GL_TEXTURE_2D,ac_gpu.texture); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,ac_gpu.texture,0); + glBindRenderbuffer(GL_RENDERBUFFER,ac_gpu.depth); + glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT16,width,height); + glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,ac_gpu.depth); + if (glCheckFramebufferStatus(GL_FRAMEBUFFER)!=GL_FRAMEBUFFER_COMPLETE) return 0; + ac_gpu.width=width;ac_gpu.height=height; + } + glViewport(0,0,width,height); glDisable(GL_BLEND);glDisable(GL_DITHER);glDisable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glDepthMask(GL_TRUE); + glClearColor(r/255.f,g/255.f,b/255.f,1);glClearDepthf(1); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + ac_gpu.active=1;return 1; +} +static void ac_gpu_draw(void) { + if (!ac_gpu.count) return; + glUseProgram(ac_gpu.program);glBindBuffer(GL_ARRAY_BUFFER,ac_gpu.vbo); + glBufferData(GL_ARRAY_BUFFER,(size_t)ac_gpu.count*6*sizeof(float),ac_gpu.vertices,GL_STREAM_DRAW); + glEnableVertexAttribArray(0);glEnableVertexAttribArray(1); + glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6*sizeof(float),(void *)0); + glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,6*sizeof(float),(void *)(3*sizeof(float))); + glDrawArrays(GL_TRIANGLES,0,ac_gpu.count);ac_gpu.count=0; +} +// Retained, capped RGBA assets. Upload once, then draw in the same offscreen +// pass as game geometry; the existing end-of-frame readback stays singular. +static const int ac_theme_heights[]={576,512,512,1024,576}; +static const double ac_theme_master_widths[]={1672,1774,1774,1254,1672}; +static const double ac_theme_master_heights[]={941,887,887,1254,940}; +static int ac_gpu_theme_program_ready(void) { + if (!ac_gpu_init()) return 0; + if (ac_gpu.theme_program) return 1; + time_t now=time(NULL); + if (now=5 || !ac_gpu_theme_program_ready())return 0; + if(ac_gpu.theme_textures[asset])return 1; + time_t now=time(NULL); + if(nowmw || v[1]+v[3]>mh)return 0; + for(int i=0;i<4;i++)if(fabs(v[6+i*3])>1.5)return 0; + ac_gpu_draw(); + float quad[30];const int order[]={0,1,2,0,2,3}; + for(int i=0;i<6;i++) { + int corner=order[i],right=corner==1 || corner==2,bottom=corner>=2; + quad[i*5]=(float)(v[4+corner*3]*2/ac_gpu.width-1); + quad[i*5+1]=(float)(1-v[5+corner*3]*2/ac_gpu.height); + quad[i*5+2]=(float)(v[6+corner*3]/1.5); + quad[i*5+3]=(float)((v[0]+(right?v[2]:0))/mw); + quad[i*5+4]=(float)((v[1]+(bottom?v[3]:0))/mh); + } + ac_gpu_theme_submit(asset,quad,1);return 1; +} +static int ac_gpu_theme_sprite(int asset,const double *v,int flip,int depth_write) { + if(!ac_gpu.active || !ac_gpu_theme_asset_ready(asset))return 0; + for(int i=0;i<10;i++)if(!isfinite(v[i]))return 0; + // sx,sy,sw,sh,cx,cy,width,height,angle,z; source coordinates are masters. + const double mw=ac_theme_master_widths[asset],mh=ac_theme_master_heights[asset]; + if(v[0]<0 || v[1]<0 || v[2]<=0 || v[3]<=0 || v[6]<=0 || v[7]<=0 || + v[0]+v[2]>mw || v[1]+v[3]>mh || fabs(v[9])>1.5)return 0; + ac_gpu_draw(); + const double c=cos(v[8]),s=sin(v[8]); + float corners[4][5]; + for(int i=0;i<4;i++) { + int right=i==1 || i==2,bottom=i>=2; + double x=(right?.5:-.5)*v[6],y=(bottom?.5:-.5)*v[7]; + corners[i][0]=(v[4]+x*c-y*s)*2/ac_gpu.width-1; + corners[i][1]=1-(v[5]+x*s+y*c)*2/ac_gpu.height; + corners[i][2]=v[9]/1.5; + corners[i][3]=(v[0]+(right!=flip?v[2]:0))/mw; + corners[i][4]=(v[1]+(bottom?v[3]:0))/mh; + } + const int order[]={0,1,2,0,2,3};float quad[30]; + for(int i=0;i<6;i++)memcpy(quad+i*5,corners[order[i]],5*sizeof(float)); + ac_gpu_theme_submit(asset,quad,depth_write); + return 1; +} +static int ac_gpu_triangle(const double *v) { + if (!ac_gpu.active) return 0; + if (ac_gpu.count+3>AC_GPU_VERTICES) ac_gpu_draw(); + for (int i=0;i<3;i++) { + float *p=ac_gpu.vertices+(ac_gpu.count++)*6; + p[0]=(float)v[i*3]*2/ac_gpu.width-1; + p[1]=1-(float)v[i*3+1]*2/ac_gpu.height; + // Xbox game depth spans [-1.5, 1.5]; GLES clip depth is [-1, 1]. + p[2]=(float)v[i*3+2] / 1.5f; + p[3]=v[9]/255;p[4]=v[10]/255;p[5]=v[11]/255; + } + return 1; +} +// Match the game's rim-fan polygon, with its tessellation chosen in game +// coordinates before pixel scaling. One JS call replaces a call per face. +static int ac_gpu_disc(double x,double y,double z,double radius,int sides, + double r,double g,double b) { + if (!ac_gpu.active || sides<3 || sides>32 || radius<=0 || + !isfinite(x+y+z+radius+r+g+b)) return 0; + static double rings[33][64]; + static int ready[33]; + if (!ready[sides]) { + for(int i=0;iwidth==ac_gpu.width && fb->height==ac_gpu.height) { + for (int y=0;yheight;y++) { + const uint32_t *src=ac_gpu.readback+(fb->height-1-y)*fb->width; + uint32_t *dst=fb->pixels+y*fb->stride; + for(int x=0;xwidth;x++) { uint32_t c=src[x]; + dst[x]=(c&0xff00ff00)|((c&255)<<16)|((c>>16)&255); } + } + } + ac_gpu.active=0; +} +#else +static int ac_gpu_theme_ready(void) { return 0; } +static int ac_gpu_theme_asset_ready(int asset) { (void)asset;return 0; } +static int ac_gpu_theme_sprite(int asset,const double *v,int flip,int depth_write) { + (void)asset;(void)v;(void)flip;(void)depth_write;return 0; +} +static int ac_gpu_theme_quad(int asset,const double *v) { (void)asset;(void)v;return 0; } +static int ac_gpu_begin(int w,int h,float r,float g,float b) { (void)w;(void)h;(void)r;(void)g;(void)b;return 0; } +static int ac_gpu_triangle(const double *v) { (void)v;return 0; } +static int ac_gpu_disc(double x,double y,double z,double radius,int sides,double r,double g,double b) { + (void)x;(void)y;(void)z;(void)radius;(void)sides;(void)r;(void)g;(void)b;return 0; +} +static void ac_gpu_end(ACFramebuffer *fb) { (void)fb; } +#endif +#endif diff --git a/fedac/native/src/screen-triangle.h b/fedac/native/src/screen-triangle.h new file mode 100644 index 0000000000..c95e26e49b --- /dev/null +++ b/fedac/native/src/screen-triangle.h @@ -0,0 +1,40 @@ +#ifndef AC_SCREEN_TRIANGLE_H +#define AC_SCREEN_TRIANGLE_H +#include +#include + +// Already-projected, flat-color geometry. No matrix transform, clipping +// polygon allocations, perspective correction, or per-pixel color divides. +static inline void ac_screen_triangle(uint32_t *pixels, float *depth, + int width, int height, int stride, + float ax, float ay, float az, float bx, float by, float bz, + float cx, float cy, float cz, uint32_t color) { + if (!isfinite(ax + ay + az + bx + by + bz + cx + cy + cz)) return; + float area = (bx-ax)*(cy-ay) - (by-ay)*(cx-ax); + if (fabsf(area) < .0001f) return; + float low_x = fmaxf(0, fminf(ax, fminf(bx, cx))); + float high_x = fminf(width-1, fmaxf(ax, fmaxf(bx, cx))); + float low_y = fmaxf(0, fminf(ay, fminf(by, cy))); + float high_y = fminf(height-1, fmaxf(ay, fmaxf(by, cy))); + if (low_x > high_x || low_y > high_y) return; + int x0 = (int)floorf(low_x), x1 = (int)ceilf(high_x); + int y0 = (int)floorf(low_y), y1 = (int)ceilf(high_y); + const float inv = 1.f / area; + const float dx0 = (by-cy)*inv, dy0 = (cx-bx)*inv; + const float dx1 = (cy-ay)*inv, dy1 = (ax-cx)*inv; + float row0 = ((cx-bx)*(y0+.5f-by) - (cy-by)*(x0+.5f-bx))*inv; + float row1 = ((ax-cx)*(y0+.5f-cy) - (ay-cy)*(x0+.5f-cx))*inv; + const float dz0 = az-cz, dz1 = bz-cz; + for (int y=y0; y<=y1; y++, row0+=dy0, row1+=dy1) { + float w0=row0, w1=row1; + int at=y*stride+x0; + for (int x=x0; x<=x1; x++, at++, w0+=dx0, w1+=dx1) { + if (w0 < -.000001f || w1 < -.000001f || w0+w1 > 1.000001f) continue; + float z=cz+w0*dz0+w1*dz1; + // The Xbox host uses LESS_EQUAL: later coplanar faces paint over + // earlier ones. A tiny tolerance absorbs floating-point roundoff. + if (z <= depth[at]+.000001f) { pixels[at]=color; depth[at]=z; } + } + } +} +#endif diff --git a/fedac/native/src/ws-client.c b/fedac/native/src/ws-client.c index 7163722101..8bfa446789 100644 --- a/fedac/native/src/ws-client.c +++ b/fedac/native/src/ws-client.c @@ -10,6 +10,7 @@ extern void ac_log(const char *fmt, ...); #include #include #include +#include #include #include #include @@ -68,7 +69,7 @@ static void thread_close_ssl(ACWs *ws) { } // Returns 0 on success, -1 on failure. -static int thread_connect(ACWs *ws, const char *host, const char *path) { +static int thread_connect(ACWs *ws, const char *host, const char *path, int port, int tls) { thread_close_ssl(ws); ws->frame_len = 0; @@ -82,14 +83,18 @@ static int thread_connect(ACWs *ws, const char *host, const char *path) { struct addrinfo hints = {0}, *res = NULL; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; - if (getaddrinfo(host, "443", &hints, &res) != 0 || !res) { + char service[8]; + snprintf(service, sizeof(service), "%d", port); + if (getaddrinfo(host, service, &hints, &res) != 0 || !res) { ac_log("[ws] DNS failed for %s", host); goto fail; } // TCP connect (with 8s timeout via non-blocking + select) - ws->fd = socket(AF_INET, SOCK_STREAM, 0); + ws->fd = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); if (ws->fd < 0) { freeaddrinfo(res); goto fail; } + int nodelay=1; + setsockopt(ws->fd,IPPROTO_TCP,TCP_NODELAY,&nodelay,sizeof(nodelay)); fcntl(ws->fd, F_SETFL, O_NONBLOCK); connect(ws->fd, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); @@ -103,13 +108,19 @@ static int thread_connect(ACWs *ws, const char *host, const char *path) { } fcntl(ws->fd, F_SETFL, 0); // restore blocking for TLS - // TLS + struct timeval handshake_timeout = {8, 0}; + setsockopt(ws->fd, SOL_SOCKET, SO_RCVTIMEO, &handshake_timeout, sizeof(handshake_timeout)); + setsockopt(ws->fd, SOL_SOCKET, SO_SNDTIMEO, &handshake_timeout, sizeof(handshake_timeout)); + + // TLS is optional only for an explicit ws:// connection. + SSL *ssl = NULL; + if (tls) { SSL_CTX *ctx = SSL_CTX_new(TLS_client_method()); if (!ctx) goto fail; SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); ws->ssl_ctx = ctx; - SSL *ssl = SSL_new(ctx); + ssl = SSL_new(ctx); SSL_set_fd(ssl, ws->fd); SSL_set_tlsext_host_name(ssl, host); ws->ssl = ssl; @@ -119,6 +130,8 @@ static int thread_connect(ACWs *ws, const char *host, const char *path) { goto fail; } + } + // WebSocket HTTP upgrade unsigned char key_raw[16]; RAND_bytes(key_raw, 16); @@ -127,18 +140,25 @@ static int thread_connect(ACWs *ws, const char *host, const char *path) { char req[512]; int rlen = snprintf(req, sizeof(req), - "GET %s HTTP/1.1\r\nHost: %s\r\nUpgrade: websocket\r\n" + "GET %s HTTP/1.1\r\nHost: %s:%d\r\nUpgrade: websocket\r\n" "Connection: Upgrade\r\nSec-WebSocket-Key: %s\r\n" "Sec-WebSocket-Version: 13\r\n\r\n", - path, host, key_b64); - SSL_write(ssl, req, rlen); + path, host, port, key_b64); + if (rlen < 0 || rlen >= (int)sizeof(req)) goto fail; + int request_sent = 0; + while (request_sent < rlen) { + int n = ssl ? SSL_write(ssl, req + request_sent, rlen - request_sent) + : (int)send(ws->fd, req + request_sent, rlen - request_sent, MSG_NOSIGNAL); + if (n <= 0) goto fail; + request_sent += n; + } // Read until "\r\n\r\n" char resp[1024] = {0}; int rpos = 0; while (rpos < (int)sizeof(resp) - 1) { char c; - if (SSL_read(ssl, &c, 1) <= 0) break; + if ((ssl ? SSL_read(ssl, &c, 1) : (int)recv(ws->fd, &c, 1, 0)) <= 0) break; resp[rpos++] = c; if (rpos >= 4 && memcmp(resp + rpos - 4, "\r\n\r\n", 4) == 0) break; } @@ -147,17 +167,17 @@ static int thread_connect(ACWs *ws, const char *host, const char *path) { goto fail; } - // Keep socket blocking but set a 50ms receive timeout so the background - // thread doesn't block forever — switching to O_NONBLOCK after TLS 1.3 - // handshake confuses OpenSSL's internal state machine (SSL_ERROR_SSL). - struct timeval so_tv = {0, 50000}; + // select() below waits for readiness before reads. Bound a partial TLS + // record to 5ms too, so incoming traffic cannot hold outgoing inputs 50ms. + // Keep blocking TLS: changing its mode after TLS1.3 has caused SSL errors. + struct timeval so_tv = {0, 5000}; setsockopt(ws->fd, SOL_SOCKET, SO_RCVTIMEO, &so_tv, sizeof(so_tv)); pthread_mutex_lock(&ws->mu); ws->connected = 1; ws->connecting = 0; pthread_mutex_unlock(&ws->mu); - ac_log("[ws] Connected to wss://%s%s", host, path); + ac_log("[ws] Connected to %s://%s:%d%s", tls ? "wss" : "ws", host, port, path); return 0; fail: @@ -169,40 +189,57 @@ fail: return -1; } -// Send a masked text frame (called from background thread only) +// One masked TLS record per frame. Splitting header/payload into separate +// writes invites TCP delayed-ACK latency on small game input packets. +static void thread_send_frame(ACWs *ws, int opcode, const unsigned char *text, size_t plen) { + SSL *ssl=(SSL *)ws->ssl; + if ((!ssl && ws->fd < 0) || plen>16383) return; + unsigned char frame[16392], mask[4]; + if (RAND_bytes(mask,4)!=1) return; + int hlen=0;frame[hlen++]=0x80|opcode; + if(plen<126) frame[hlen++]=0x80|(uint8_t)plen; + else {frame[hlen++]=0x80|126;frame[hlen++]=(plen>>8)&255;frame[hlen++]=plen&255;} + memcpy(frame+hlen,mask,4);hlen+=4; + for(size_t i=0;ifd,frame+sent,total-sent,MSG_NOSIGNAL); + if(n<=0) break; + sent+=n; + } +} static void thread_send(ACWs *ws, const char *text) { - SSL *ssl = (SSL *)ws->ssl; - if (!ssl) return; - size_t plen = strlen(text); - unsigned char mask[4]; RAND_bytes(mask, 4); - unsigned char hdr[10]; int hlen = 0; - hdr[hlen++] = 0x81; - if (plen < 126) { hdr[hlen++] = 0x80 | (uint8_t)plen; } - else { hdr[hlen++] = 0x80 | 126; - hdr[hlen++] = (plen>>8)&0xff; - hdr[hlen++] = plen&0xff; } - memcpy(hdr+hlen, mask, 4); hlen += 4; - unsigned char *masked = malloc(plen); - if (!masked) return; - for (size_t i = 0; i < plen; i++) masked[i] = (uint8_t)text[i] ^ mask[i&3]; - SSL_write(ssl, hdr, hlen); - SSL_write(ssl, masked, (int)plen); - free(masked); + thread_send_frame(ws,1,(const unsigned char *)text,strlen(text)); } // Recv one iteration — reads available bytes, decodes frames into ws->messages static void thread_recv(ACWs *ws) { SSL *ssl = (SSL *)ws->ssl; - if (!ssl) return; + if (!ssl && ws->fd < 0) return; + // A short readiness wait leaves the single outgoing slot drainable even + // when the peer is quiet. OpenSSL may already hold decrypted data. + if (!ssl || SSL_pending(ssl) == 0) { + fd_set rfds; FD_ZERO(&rfds); FD_SET(ws->fd, &rfds); + struct timeval ready_timeout = {0, 2000}; + if (select(ws->fd + 1, &rfds, NULL, NULL, &ready_timeout) <= 0) return; + } // Read whatever is available; on fatal error fall through to parse buffered data int ssl_fatal = 0; while (ws->frame_len < (int)sizeof(ws->frame_buf) - 1) { - int n = SSL_read(ssl, ws->frame_buf + ws->frame_len, - (int)sizeof(ws->frame_buf) - 1 - ws->frame_len); - if (n > 0) { ws->frame_len += n; } + int capacity = (int)sizeof(ws->frame_buf) - 1 - ws->frame_len; + int n = ssl ? SSL_read(ssl, ws->frame_buf + ws->frame_len, capacity) + : (int)recv(ws->fd, ws->frame_buf + ws->frame_len, capacity, 0); + if (n > 0) { + ws->frame_len += n; + // Deliver now. Waiting for a quiet socket starves a continuous + // 60 Hz input stream and also prevents our send queue draining. + break; + } else { - int e = SSL_get_error(ssl, n); + int e = ssl ? SSL_get_error(ssl, n) : SSL_ERROR_SYSCALL; + if (!ssl && n == 0) { ssl_fatal = 1; break; } if (e == SSL_ERROR_WANT_READ || e == SSL_ERROR_WANT_WRITE) break; // SO_RCVTIMEO timeout: EAGAIN/EWOULDBLOCK via SSL_ERROR_SYSCALL — not fatal if (e == SSL_ERROR_SYSCALL && (errno == EAGAIN || errno == EWOULDBLOCK || errno == 0)) break; @@ -224,6 +261,7 @@ static void thread_recv(ACWs *ws) { if (plen == 126) { if (avail<4) break; plen=((uint64_t)buf[2]<<8)|buf[3]; hlen=4; } else if (plen == 127) { if (avail<10) break; plen=0; for(int i=0;i<8;i++) plen=(plen<<8)|buf[2+i]; hlen=10; } if (has_mask) hlen += 4; + if (plen > sizeof(ws->frame_buf) - (size_t)hlen) { ssl_fatal=1; break; } int total = hlen + (int)plen; if (avail < total) { // Frame not fully buffered yet — or frame_buf too small @@ -240,7 +278,7 @@ static void thread_recv(ACWs *ws) { if ((op == 0x1 || op == 0x0) && fin) { int copy = (int)plen < WS_MAX_MSG_LEN-1 ? (int)plen : WS_MAX_MSG_LEN-1; - ac_log("[ws] frame op=%d plen=%d first64=%.64s", op, (int)plen, (char*)payload); + // No per-packet payload logging on the realtime path. pthread_mutex_lock(&ws->mu); int slot = ws->msg_count % WS_MAX_MESSAGES; memcpy(ws->messages[slot], payload, copy); @@ -249,8 +287,8 @@ static void thread_recv(ACWs *ws) { pthread_mutex_unlock(&ws->mu); } else if (op == 0x9) { // Ping → pong - unsigned char pong[2] = {0x8a, 0x00}; - SSL_write(ssl, pong, 2); + // Client control frames must be masked and echo the ping payload. + if (plen <= 125) thread_send_frame(ws, 0xa, payload, (size_t)plen); } else if (op == 0x8) { ac_log("[ws] server close"); thread_close_ssl(ws); @@ -285,14 +323,16 @@ static void *ws_thread(void *arg) { pthread_mutex_lock(&ws->mu); int do_connect = ws->pending_connect; char host[256], path[256]; + int port = 443, tls = 1; if (do_connect) { strncpy(host, ws->pending_host, 255); host[255]=0; strncpy(path, ws->pending_path, 255); path[255]=0; + port = ws->pending_port; tls = ws->pending_tls; ws->pending_connect = 0; } pthread_mutex_unlock(&ws->mu); - if (do_connect) thread_connect(ws, host, path); + if (do_connect) thread_connect(ws, host, path, port, tls); // Check for pending send pthread_mutex_lock(&ws->mu); @@ -309,7 +349,7 @@ static void *ws_thread(void *arg) { if (is_connected) thread_recv(ws); // When not connected, sleep 16ms to avoid spinning. - // When connected, thread_recv() blocks up to 50ms in SSL_read (SO_RCVTIMEO). + // When connected, readiness waits at most 2ms (partial TLS reads 5ms). if (!is_connected) { struct timespec ts = {0, 16000000}; nanosleep(&ts, NULL); @@ -343,20 +383,33 @@ void ws_destroy(ACWs *ws) { void ws_connect(ACWs *ws, const char *url) { if (!ws) return; - const char *host_start = url; - if (strncmp(url, "wss://", 6) == 0) host_start = url + 6; - else if (strncmp(url, "ws://", 5) == 0) host_start = url + 5; - + if (!url) return; + int tls; + const char *host_start; + if (strncmp(url, "wss://", 6) == 0) { host_start = url + 6; tls = 1; } + else if (strncmp(url, "ws://", 5) == 0) { host_start = url + 5; tls = 0; } + else return; char host[256] = {0}; const char *slash = strchr(host_start, '/'); const char *path = slash ? slash : "/"; - int hlen = slash ? (int)(slash - host_start) : (int)strlen(host_start); - if (hlen >= 255) hlen = 255; + size_t hlen = slash ? (size_t)(slash - host_start) : strlen(host_start); + if (!hlen || hlen >= sizeof(host) || strlen(path) >= 256) return; memcpy(host, host_start, hlen); + int port = tls ? 443 : 80; + char *colon = strchr(host, ':'); + if (colon) { + char *end; + long parsed = strtol(colon + 1, &end, 10); + if (!colon[1] || *end || parsed < 1 || parsed > 65535) return; + port = (int)parsed; + *colon = 0; + } + if (!host[0] || strchr(host, '@') || strchr(host, '?') || strchr(host, '#')) return; pthread_mutex_lock(&ws->mu); strncpy(ws->pending_host, host, 255); strncpy(ws->pending_path, path, 255); + ws->pending_port = port; ws->pending_tls = tls; ws->pending_connect = 1; ws->connected = 0; ws->error = 0; diff --git a/fedac/native/src/ws-client.h b/fedac/native/src/ws-client.h index 3f4471991a..382e1f1082 100644 --- a/fedac/native/src/ws-client.h +++ b/fedac/native/src/ws-client.h @@ -16,6 +16,8 @@ typedef struct { // pending connect request (written by main, read by thread) char pending_host[256]; char pending_path[256]; + int pending_port; + int pending_tls; int pending_connect; // 1 = thread should connect // connection state (written by thread, read by main) diff --git a/fedac/native/tests/framebuffer-scale.c b/fedac/native/tests/framebuffer-scale.c new file mode 100644 index 0000000000..9322cfc66c --- /dev/null +++ b/fedac/native/tests/framebuffer-scale.c @@ -0,0 +1,34 @@ +#include "../src/framebuffer.h" +#include +#include +#include + +int main(void) { + for(int scale=1;scale<=4;scale++)for(int w=1;w<=13;w++)for(int h=1;h<=9;h++) { + ACFramebuffer *src=fb_create(3,2); + for(int y=0;y<2;y++)for(int x=0;x<3;x++)src->pixels[y*src->stride+x]=0xff000000u+y*10+x; + int stride=w+2; uint32_t *out=malloc((size_t)stride*h*4); + for(int i=0;i=w)assert(out[y*stride+x]==0x12345678); + else { int sx=x/scale,sy=y/scale; if(sx>2)sx=2;if(sy>1)sy=1; + assert(out[y*stride+x]==src->pixels[sy*src->stride+sx]); } + } + free(out);fb_destroy(src); + } + for(int sw=1;sw<=7;sw++)for(int sh=1;sh<=5;sh++) + for(int w=1;w<=17;w++)for(int h=1;h<=13;h++) { + ACFramebuffer *src=fb_create(sw+2,sh);src->width=sw; + for(int y=0;ypixels[y*src->stride+x]=0xff000000u+y*100+x; + int stride=w+3;uint32_t *out=malloc((size_t)stride*h*4); + for(int i=0;i=w)assert(out[y*stride+x]==0x12345678); + else assert(out[y*stride+x]==src->pixels[(y*sh/h)*src->stride+x*sw/w]); + } + free(out);fb_destroy(src); + } + puts("framebuffer scaling: integer/fractional, up/down, clipping, stride padding pass"); +} diff --git a/fedac/native/tests/log-mount.c b/fedac/native/tests/log-mount.c new file mode 100644 index 0000000000..4600df5d27 --- /dev/null +++ b/fedac/native/tests/log-mount.c @@ -0,0 +1,29 @@ +#include +#include +#include "log-mount.h" +static int lookup(const char *table,unsigned long id,char *device) { + FILE *f=tmpfile();assert(f);fputs(table,f);rewind(f); + int mounted=ac_log_mount_record(f,id,device,32);fclose(f);return mounted; +} +int main(int argc,char **argv) { + if(argc==2) { + char device[32]=""; + assert(ac_log_existing_mount(device,sizeof(device))==atoi(argv[1])); + return 0; + } + // The visible config volume is selected by fdinfo's mount ID. Hidden + // entries and ordering of /proc/mountinfo cannot change that decision. + const char *stack="31 1 8:2 / /mnt rw - vfat /dev/sda2 rw\n" + "45 31 8:1 / /mnt rw - vfat /dev/sda1 rw\n" + "20 1 0:1 / / rw - rootfs rootfs rw\n"; + char device[32]=""; + assert(lookup(stack,45,device));assert(!strcmp(device,"/dev/sda1")); + assert(lookup(stack,31,device));assert(!strcmp(device,"/dev/sda2")); + // Directory on rootfs is not a mounted /mnt: normal USB discovery runs. + device[0]=0;assert(!lookup(stack,20,device));assert(!device[0]); + assert(!lookup(stack,999,device)); + // Preserve unfamiliar mounts too; never hide one to obtain a log file. + assert(lookup("57 20 0:4 / /mnt ro - tmpfs tmpfs ro\n",57,device)); + assert(!device[0]); + puts("PASS existing visible mount reuse, stacked volumes, unmounted fallback"); +} diff --git a/fedac/native/tests/oskiewar-account.test.mjs b/fedac/native/tests/oskiewar-account.test.mjs new file mode 100644 index 0000000000..d5c09b3b7d --- /dev/null +++ b/fedac/native/tests/oskiewar-account.test.mjs @@ -0,0 +1,109 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {createOskiewarAccount} from '../lib/oskiewar-host.mjs'; +const secret='s'.repeat(43),token='test-private-access-token'; +const saved={handle:'alice',session:{accessToken:token,account:{label:'@alice'}}}; +const result={matchId:'lan:abc-1',seat:0,handles:['alice','bob'],roundWins:[5,2],winner:0}; +function fixture(signed=false) { + let now=1000000; + const files=new Map(signed?[['/mnt/.oskiewar-account.json',JSON.stringify(saved)]]:[]); + files.set('/mnt/config.json','OS-DEVELOPER-CREDENTIALS'); + const calls=[]; + const system={readFile:p=>files.get(p)??null,writeFile:(p,v)=>{files.set(p,v);return true;},pty2:{active:false, + spawn:(cmd,args)=>{calls.push({cmd,args,base:args[1].match(/curl --config (\S+)\.cfg/)[1]});return true;},kill:()=>{}}}; + const account=createOskiewarAccount(()=>system,()=>now); + return {account,system,files,calls,reload:()=>createOskiewarAccount(()=>system,()=>now),advance:ms=>now+=ms, + complete(body,status=200,rc=0) {const {base}=calls.at(-1);files.set(base+'.json',JSON.stringify(body));files.set(base+'.http',String(status));files.set(base+'.rc',String(rc));now+=251;return account.state();}, + config:()=>files.get(calls.at(-1).base+'.cfg'),body:()=>JSON.parse(files.get(calls.at(-1).base+'.body'))}; +} +test('browser pairing stores account privately and never returns or puts credentials in process args',()=>{ + const f=fixture();assert.equal(f.account.action('login'),true); + assert.deepEqual(f.body(),{action:'create',kind:'browser'}); + let state=f.complete({code:'ABC234',pollSecret:secret}); + assert.equal(state.status,'waiting');assert.equal(state.pairUrl,'https://aesthetic.computer/api/device-pair-login?code=ABC234'); + assert.ok(!JSON.stringify(state).includes(secret)); + f.advance(1500);f.account.state();assert.ok(f.config().includes(secret)); + assert.ok(!JSON.stringify(f.calls).includes(secret));assert.ok(!JSON.stringify(f.calls).includes(token)); + state=f.complete({status:'claimed',...saved});assert.equal(state.status,'signed-in');assert.equal(state.handle,'alice'); + assert.ok(!JSON.stringify(state).includes(token));assert.deepEqual(JSON.parse(f.files.get('/mnt/.oskiewar-account.json')),saved); + assert.equal(f.account.action('logout'),true);assert.equal(f.account.state().status,'signed-out'); + assert.equal(f.files.get('/mnt/config.json'),'OS-DEVELOPER-CREDENTIALS');assert.equal(f.files.get('/mnt/.oskiewar-account.json'),'{}'); +}); +test('invalid codes, incomplete claims and expired codes cannot sign in',()=>{ + for(const code of ['ABC000','ABC234?','']) {const f=fixture();f.account.action('login');assert.equal(f.complete({code,pollSecret:secret}).status,'error');} + const f=fixture();f.account.action('login');f.complete({code:'ABC234',pollSecret:secret});f.advance(600001);assert.equal(f.account.state().status,'error'); + const g=fixture();g.account.action('login');g.complete({code:'ABC234',pollSecret:secret});g.advance(1500);g.account.state();assert.equal(g.complete({status:'claimed',handle:'alice',session:{}}).status,'error'); +}); +test('cancel ignores a late consumed claim and preserves developer credentials',()=>{ + const f=fixture();f.account.action('login');f.complete({code:'ABC234',pollSecret:secret});f.advance(1500);f.account.state();f.account.action('cancel'); + assert.equal(f.complete({status:'claimed',...saved}).status,'signed-out');assert.equal(f.files.get('/mnt/.oskiewar-account.json'),'{}'); +}); +test('does not replace another running secondary PTY',()=>{ + const f=fixture();f.system.pty2.active=true;f.account.action('login');assert.equal(f.calls.length,0);assert.equal(f.account.state().status,'error'); +}); +test('authenticated report keeps token in private config and retries exact body after transient failure',()=>{ + const f=fixture(true);assert.equal(f.account.report(JSON.stringify(result)),true);const original=f.body(); + assert.ok(f.config().includes('Authorization: Bearer '+token));assert.ok(!JSON.stringify(f.calls).includes(token)); + assert.equal(f.complete({error:'busy'},503).reportStatus,'Retrying result submission');assert.equal(f.calls.length,1); + f.advance(3000);f.account.state();assert.equal(f.calls.length,2);assert.deepEqual(f.body(),original); + assert.equal(f.complete({status:'pending',recorded:false},202).reportStatus,'Waiting for opponent confirmation'); + f.advance(60000);f.account.state();assert.equal(f.calls.length,2); +}); +test('permanent report rejections stop retries and surface auth or consensus failure',()=>{ + for(const [code,message] of [[401,'Sign in again to submit results'],[409,'Result reports disagreed'],[400,'Result rejected']]) { + const f=fixture(true);f.account.report(JSON.stringify(result));assert.equal(f.complete({error:'rejected'},code).reportStatus,message); + f.advance(60000);f.account.state();assert.equal(f.calls.length,1); + } +}); +test('invalid result cannot target arbitrary endpoints or other player seats',()=>{ + const f=fixture(true); + for(const patch of [{seat:1},{matchId:'https://bad.example'},{handles:['bob','alice']},{roundWins:[Infinity,2]}]) + assert.equal(f.account.report(JSON.stringify({...result,...patch})),false); + assert.equal(f.calls.length,0); +}); +test('leaderboard filters blank and duplicate handles, caches public response and throttles 30 seconds',()=>{ + const f=fixture();assert.equal(f.account.action('leaderboard','["alice",""]'),true);assert.ok(f.config().includes('?handles=alice"')); + const board={top:[{handle:'alice',matchesWon:1}],players:[],pair:null};assert.deepEqual(f.complete(board).leaderboard,board); + assert.equal(f.account.action('leaderboard','["alice","alice"]'),false);f.advance(30000); + assert.equal(f.account.action('leaderboard','["alice","alice"]'),true);assert.ok(f.config().includes('?handles=alice"')); + assert.equal(f.complete({error:'offline'},503).leaderboardError,'Leaderboard unavailable'); +}); + +test('pending browser QR survives reload unchanged, stays private and resumes polling',()=>{ + const f=fixture();f.account.action('login');const before=f.complete({code:'ABC234',pollSecret:secret}); + const persisted=JSON.parse(f.files.get('/mnt/.oskiewar-account.json')); + assert.deepEqual(persisted,{pending:{code:'ABC234',pollSecret:secret,expiresAt:before.expiresAt}}); + const restored=f.reload();const after=restored.state();assert.equal(after.status,'waiting'); + assert.equal(after.code,before.code);assert.equal(after.pairUrl,before.pairUrl);assert.equal(after.expiresAt,before.expiresAt); + assert.ok(!JSON.stringify(after).includes(secret)); + assert.equal(restored.action('login'),true);assert.equal(f.calls.length,1); + f.advance(1500);restored.state();assert.equal(f.calls.length,2); + assert.ok(f.config().includes('code=ABC234&secret='+secret));assert.ok(!JSON.stringify(f.calls).includes(secret)); + assert.equal(restored.action('cancel'),true);assert.equal(f.reload().state().status,'signed-out'); + assert.equal(f.files.get('/mnt/config.json'),'OS-DEVELOPER-CREDENTIALS'); +}); +test('expired or malformed saved pairing is discarded without restoring or exposing it',()=>{ + for(const pending of [ + {code:'ABC234',pollSecret:secret,expiresAt:999999}, + {code:'ABC000',pollSecret:secret,expiresAt:1005000}, + {code:'ABC234',pollSecret:'invalid',expiresAt:1005000}, + {code:'ABC234',pollSecret:secret,expiresAt:999999999}, + ]) { + const f=fixture();f.files.set('/mnt/.oskiewar-account.json',JSON.stringify({pending})); + const state=f.reload().state();assert.equal(state.status,'signed-out');assert.equal(state.code,''); + assert.equal(f.files.get('/mnt/.oskiewar-account.json'),'{}');assert.equal(f.calls.length,0); + assert.equal(f.files.get('/mnt/config.json'),'OS-DEVELOPER-CREDENTIALS'); + } +}); +test('pending pairing is not shown as saved when private USB write fails',()=>{ + const f=fixture();f.account.action('login');const write=f.system.writeFile; + f.system.writeFile=(p,v,...args)=>p==='/mnt/.oskiewar-account.json'?false:write(p,v,...args); + const state=f.complete({code:'ABC234',pollSecret:secret});assert.equal(state.status,'error');assert.equal(state.code,''); + assert.ok(!JSON.stringify(state).includes(secret));assert.equal(f.files.get('/mnt/config.json'),'OS-DEVELOPER-CREDENTIALS'); +}); +test('logout discards persisted pending QR while cancel on a signed-in account retains session',()=>{ + const f=fixture();f.account.action('login');f.complete({code:'ABC234',pollSecret:secret});f.account.action('logout'); + assert.equal(f.reload().state().status,'signed-out');assert.equal(f.files.get('/mnt/.oskiewar-account.json'),'{}'); + const g=fixture(true);g.account.action('cancel');assert.equal(g.reload().state().status,'signed-in'); + assert.deepEqual(JSON.parse(g.files.get('/mnt/.oskiewar-account.json')),saved); +}); diff --git a/fedac/native/tests/oskiewar-math.test.mjs b/fedac/native/tests/oskiewar-math.test.mjs new file mode 100644 index 0000000000..4b620c8f3c --- /dev/null +++ b/fedac/native/tests/oskiewar-math.test.mjs @@ -0,0 +1,57 @@ +// Native math must match the actual shared JS, bit for bit—not merely be close. +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync,writeFileSync,mkdtempSync,rmSync} from 'node:fs'; +import {tmpdir} from 'node:os'; +import {resolve,dirname,join} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {execFileSync} from 'node:child_process'; +import vm from 'node:vm'; +const root=resolve(dirname(fileURLToPath(import.meta.url)),'../../..'); +test('native deterministic math matches shared JavaScript doubles',()=>{ + const dir=mkdtempSync(join(tmpdir(),'oskiewar-math-')); + try { + writeFileSync(join(dir,'test.c'),` +#include +#include +#include +#include "oskiewar-math.h" +int main(void) { + int op,n; double v[32]; + while(scanf("%d %d",&op,&n)==2) { + if(n<0 || n>32)return 2; + for(int i=0;i1?v[1]:NAN,r; + switch(op){case 0:r=ow_sin(x);break;case 1:r=ow_sin(x+1.5707963267948966);break; + case 2:r=ow_sin(x)/ow_sin(x+1.5707963267948966);break;case 3:r=ow_atan(x);break; + case 4:r=ow_atan2(x,y);break;case 5:r=ow_atan2(x,sqrt(1-x*x));break; + case 6:r=ow_exp(x);break;default:r=ow_hypot(v,n);break;} + union{double d;uint64_t u;}bits={.d=r};printf("%016" PRIx64 "\\n",bits.u); + } + return 0; +}`); + execFileSync(process.env.CC || 'cc',['-O2','-ffp-contract=off','-I',join(root,'fedac/native/src'),join(dir,'test.c'),'-lm','-o',join(dir,'test')]); + const source=readFileSync(join(root,'xbox/live/oskiewar.js'),'utf8'); + const math=vm.runInNewContext('const platformMath=Math;'+source.slice(source.indexOf('function netSin('),source.indexOf('for (const [name, fallback]'))+';netMath'); + const names=Object.keys(math), cases=[]; + let seed=1924; + const random=()=>{seed=(Math.imul(seed,1664525)+1013904223)>>>0;return seed/2**32;}; + const edges=[0,-0,1,-1,Math.PI,-Math.PI,Math.PI/2,1e-300,1e300,Infinity,-Infinity,NaN,709.4,-745.1]; + for(const [op,name] of names.entries()) { + const values=[...edges,...Array.from({length:1600},()=>name==='asin'?random()*2-1:(random()-.5)*(random()<.5?10:1400))]; + for(const x of values){ + const args=name==='atan2'?[x,values[Math.floor(random()*values.length)]]: + name==='hypot'?[x,random()*100-50,random()*100-50]:[x]; + cases.push({op,name,args,expected:math[name](...args)}); + } + } + cases.push({op:7,name:'hypot',args:[],expected:0}); + const input=cases.map(c=>[c.op,c.args.length,...c.args.map(x=>Object.is(x,-0)?'-0':String(x))].join(' ')).join('\n')+'\n'; + const lines=execFileSync(join(dir,'test'),{input,encoding:'utf8',maxBuffer:4e6}).trim().split('\n'); + assert.equal(lines.length,cases.length); + cases.forEach((c,i)=>{ + const actual=Buffer.from(lines[i],'hex').readDoubleBE(); + assert.ok(Object.is(actual,c.expected),`${c.name}(${c.args}): ${actual} vs ${c.expected}`); + }); + }finally{rmSync(dir,{recursive:true,force:true});} +}); diff --git a/fedac/native/tests/oskiewar-pixel-text.test.mjs b/fedac/native/tests/oskiewar-pixel-text.test.mjs new file mode 100644 index 0000000000..6fe86f764d --- /dev/null +++ b/fedac/native/tests/oskiewar-pixel-text.test.mjs @@ -0,0 +1,12 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +import {pixelGlyph} from '../lib/oskiewar-host.mjs'; +test('pixel text advances match native MatrixChunky8, font_1 and Unicode cells', () => { +const header=readFileSync(new URL('../src/font-matrix-chunky8.h', import.meta.url),'utf8'); + const widths=[...header.matchAll(/^ \{\d+, \d+, -?\d+, -?\d+, (\d+),/gm)].map(x=>+x[1]); + assert.equal(widths.length,95); + for(let i=0;i<95;i++) assert.equal(pixelGlyph(String.fromCharCode(i+32),48,.5).advance,widths[i]*3); + assert.deepEqual(pixelGlyph('x',24,.5),{font:'font_1',zoom:1,advance:6,height:10}); + assert.deepEqual(pixelGlyph('é',32,.5),{font:'unifont',zoom:1,advance:8,height:16}); +}); diff --git a/fedac/native/tests/oskiewar-relay-host.test.mjs b/fedac/native/tests/oskiewar-relay-host.test.mjs new file mode 100644 index 0000000000..bce744146a --- /dev/null +++ b/fedac/native/tests/oskiewar-relay-host.test.mjs @@ -0,0 +1,15 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { oskiewarRelayBase } from '../lib/oskiewar-host.mjs'; +const cloud = 'wss://session-server.aesthetic.computer/oskiewar-live'; +test('only explicit private IPv4 LAN relay overrides cloud transport', () => { + for (const ip of ['192.168.1.235', '10.0.0.5', '172.16.1.9', '172.31.255.2']) { + const url = `ws://${ip}:7793/oskiewar-live`; + assert.equal(oskiewarRelayBase(url+'\n'), url); + } + for (const bad of [null, '', 'ws://example.com:7793/oskiewar-live', + 'ws://8.8.8.8:7793/oskiewar-live', 'ws://172.32.0.1:7793/oskiewar-live', + 'ws://192.168.1.999:7793/oskiewar-live', 'ws://192.168.1.1:0/oskiewar-live', + 'ws://192.168.1.1:65536/oskiewar-live', 'ws://192.168.1.1:7793/oskiewar-live?secret=oops']) + assert.equal(oskiewarRelayBase(bad), cloud); +}); diff --git a/fedac/native/tests/oskiewar-sound.test.mjs b/fedac/native/tests/oskiewar-sound.test.mjs new file mode 100644 index 0000000000..d8602f851e --- /dev/null +++ b/fedac/native/tests/oskiewar-sound.test.mjs @@ -0,0 +1,75 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync,writeFileSync,mkdtempSync,rmSync} from 'node:fs'; +import {tmpdir} from 'node:os'; +import path from 'node:path'; +import {execFileSync} from 'node:child_process'; +import {OSKIEWAR_DRUM_LAYERS,renderOskiewarDrum,createOskiewarSound} from '../lib/oskiewar-host.mjs'; +const xbox=readFileSync(new URL('../../../xbox/native-bios/App.cpp',import.meta.url),'utf8'); +test('all seven AC drum waveforms match the actual Xbox layer renderer sample by sample',()=>{ + const dir=mkdtempSync(path.join(tmpdir(),'oskiewar-sound-')); + try { + const start=xbox.indexOf(' enum class Wave',xbox.indexOf(' void PlayDrum')); + const end=xbox.indexOf('\n m_voice->Stop',start); + let native=xbox.slice(start,end).replace('static_cast(GetTickCount64()) | 1u','0x6f736b69u'); + const cpp=`#include \n#include \n#include \n#include \n#include \n#include \nint main(int argc,char**argv){ unsigned m_sampleRate=48000; float velocity=1; std::string_view name=argv[1];\n${native}\nfor(double value:mixed){float sample=value*.28;fwrite(&sample,sizeof(sample),1,stdout);}}`; + writeFileSync(path.join(dir,'sound.cpp'),cpp); + execFileSync('c++',['-std=c++17','-O2',path.join(dir,'sound.cpp'),'-o',path.join(dir,'sound')]); + let total=0; + for(const name of Object.keys(OSKIEWAR_DRUM_LAYERS)) { + const reference=execFileSync(path.join(dir,'sound'),[name]); + const actual=renderOskiewarDrum(name); + assert.equal(actual.length*4,reference.length,name); + let peak=0,energy=0; + for(let i=0;i.025&&peak<1,name+' has a bounded useful signal'); + assert.ok(energy>0);total+=actual.byteLength; + } + assert.ok(total<300000,'all precomputed drums fit in 300 KB'); + } finally {rmSync(dir,{recursive:true,force:true});} +}); +function audioFixture(replay=true) { + const events=[];let nextId=1; + const sound={synth:opts=>{events.push(['synth',opts]);return {id:nextId++};}, + kill:(voice,fade)=>events.push(['kill',voice,fade])}; + if(replay)sound.replay={loadData:(data,rate)=>{events.push(['load',data,rate]);return true;}, + play:opts=>{events.push(['play',opts]);return {id:nextId++};}, + kill:(voice,fade)=>events.push(['replay-kill',voice,fade])}; + return {events,audio:createOskiewarSound(()=>sound)}; +} +test('drums use cached mono PCM and replace the prior event without accumulating voices',()=>{ + const {audio,events}=audioFixture(); + audio.drum('kick',1.2,-1);audio.drum('kick',.6,1); + const loads=events.filter(e=>e[0]==='load'); + assert.equal(loads.length,2);assert.equal(loads[0][1],loads[1][1]); + assert.equal(loads[0][2],48000); + assert.deepEqual(events.filter(e=>e[0]==='play').map(e=>e[1]),[ + {tone:440,base:440,volume:1.2,pan:0,loop:false}, + {tone:440,base:440,volume:.6,pan:0,loop:false}]); + assert.equal(events.filter(e=>e[0]==='replay-kill').length,1); + assert.equal(events.filter(e=>e[0]==='synth').length,0); + audio.synth(880,.12); + assert.equal(events.filter(e=>e[0]==='replay-kill').length,2); + assert.deepEqual(events.at(-1),['synth',{type:'sine',tone:880,duration:.12,volume:.5,attack:0,decay:.12,pan:0}]); + audio.drum('whoosh');assert.equal(events.filter(e=>e[0]==='kill').length,1); +}); +test('sine defaults, bounds and release match Xbox rather than native default envelopes',()=>{ + const {audio,events}=audioFixture(); + audio.synth(10000,5,.99,'square',1); + assert.deepEqual(events.at(-1)[1],{type:'sine',tone:5000,duration:2,volume:.5,attack:0,decay:2,pan:0}); + audio.synth(10,-1); + assert.deepEqual(events.at(-1)[1],{type:'sine',tone:20,duration:.005,volume:.5,attack:0,decay:.005,pan:0}); + audio.synth(440);assert.equal(events.at(-1)[1].duration,.05); + assert.equal(events.filter(e=>e[0]==='kill').length,2); +}); +test('older-host fallback retains the full instruments and a six-voice maximum',()=>{ + const {audio,events}=audioFixture(false); + audio.drum('snare',1);assert.equal(events.filter(e=>e[0]==='synth').length,6); + audio.drum('bell',1);assert.equal(events.filter(e=>e[0]==='kill').length,6); + assert.deepEqual(events.filter(e=>e[0]==='synth').slice(-3).map(e=>e[1].tone),[880,1320,1760]); + audio.stop();assert.equal(events.filter(e=>e[0]==='kill').length,9); +}); diff --git a/fedac/native/tests/oskiewar-theme-host.test.mjs b/fedac/native/tests/oskiewar-theme-host.test.mjs new file mode 100644 index 0000000000..78fd225352 --- /dev/null +++ b/fedac/native/tests/oskiewar-theme-host.test.mjs @@ -0,0 +1,43 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { createNativeHost } from '../lib/oskiewar-host.mjs'; + +test('native theme scales destination coordinates and preserves atlas UVs and depth', () => { + const calls = []; + const api = { screen: { width: 683, height: 384 }, + system: { readFile: path => path === '/tmp/oskiewar-gpu' ? '1' : '' }, + wipe() {}, gpuBegin: () => true, themeReady: () => true, themeAssetReady: id => id >= 0 && id < 5, + themeSprite: (...args) => { calls.push(args); return true; }, + themeQuad: (...args) => { calls.push(args); return true; } }; + const host = createNativeHost(api); + assert.equal(host.themeReady(), true); + assert.equal(host.themeAssetReady(3), true); + assert.equal(host.themeAssetReady(4), true); + assert.equal(host.themeAssetReady(5), false); + assert.equal(host.themeSprite(1,1,2,3,4,10,20,30,40,.4,true,-.5), false); + host.wipe(0,0,0); + assert.equal(host.themeSprite(1,1,2,3,4,10,20,30,40,.4,true,-.5), true); + assert.deepEqual(calls.pop(), [1,1,2,3,4,5,10,15,20,.4,true,-.5,true]); + assert.equal(host.themeQuad(0,0,0,1672,941,0,0,.8,100,0,.8,100,100,.8,0,100,.8), true); + assert.deepEqual(calls.pop(), [0,0,0,1672,941,0,0,.8,50,0,.8,50,50,.8,0,50,.8]); + assert.equal(host.themeQuad(0,0,0,10,10,0,0,0), false); + assert.equal(host.themeSprite(3,1,2,3,4,10,20,30,40,.4,true,-.5,false), true); + assert.deepEqual(calls.pop(), [3,1,2,3,4,5,10,15,20,.4,true,-.5,false]); +}); + +test('older native clients decline a texture theme without affecting their renderer', () => { + const host = createNativeHost({ screen: { width: 683, height: 384 }, + system: { readFile: () => '' } }); + assert.equal(host.themeReady(), false); + assert.equal(host.themeAssetReady(2), false); + assert.equal(host.themeSprite(0,0,0,1,1,0,0,1,1,0,false,0), false); +}); + +test('base-theme native clients do not claim support for new atlases', () => { + const host = createNativeHost({ screen: { width: 683, height: 384 }, + system: { readFile: path => path === '/tmp/oskiewar-gpu' ? '1' : '' }, + themeReady: () => true }); + assert.equal(host.themeReady(), true); + assert.equal(host.themeAssetReady(2), false); + assert.equal(host.themeAssetReady(3), false); +}); diff --git a/fedac/native/tests/screen-gpu-theme.c b/fedac/native/tests/screen-gpu-theme.c new file mode 100644 index 0000000000..cdce2b24e2 --- /dev/null +++ b/fedac/native/tests/screen-gpu-theme.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include +#include +#include +#include +void ac_log(const char *fmt,...) {(void)fmt;} +typedef struct { int width,height,stride; uint32_t *pixels; } ACFramebuffer; +#define HAVE_SCREEN_GPU +#include "screen-gpu.h" +static void solid_fixture(const char *path,int height) { + FILE *f=fopen(path,"wb");assert(f); + unsigned char p[]={255,0,0,128}; + for(int i=0;i<1024*height;i++)assert(fwrite(p,1,4,f)==4); + fclose(f); +} +static void fixture(const char *path,int height,int alpha) { + FILE *f=fopen(path,"wb");assert(f); + for(int y=0;y>16)&255)>=127 && ((pixel>>16)&255)<=129); + assert((pixel&255)>=126 && (pixel&255)<=128); // Half-red blended over blue. + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(2,effect,0,1));ac_gpu_triangle(tri);ac_gpu_end(&fb); + assert(pixels[8*64+8]==0xff0000ff); // VFX never occludes later geometry. + effect[2]=effect[3]=1254; + for(int depth_write=0;depth_write<=1;depth_write++) { + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(3,effect,0,depth_write)); + ac_gpu_triangle(tri);ac_gpu_end(&fb); + if(depth_write)assert((pixels[8*64+8]&0xffffff)==0x800000); + else assert(pixels[8*64+8]==0xff0000ff); + } + // Faint atlas speckles must not occlude geometry when drawing solid props. + unsigned char faint[]={255,0,0,8}; + glBindTexture(GL_TEXTURE_2D,ac_gpu.theme_textures[3]); + glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,1,1,0,GL_RGBA,GL_UNSIGNED_BYTE,faint); + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(3,effect,0,1)); + ac_gpu_triangle(tri);ac_gpu_end(&fb); + assert(pixels[8*64+8]==0xff0000ff); + // The same alpha remains visible when explicitly used for a soft flash. + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(3,effect,0,0));ac_gpu_end(&fb); + assert(((pixels[8*64+8]>>16)&255)==8); + // Optional AIR sky is a retained opaque background with ordinary depth. + fixture("/pieces/oskiewar-theme/sky-clouds-v1-1024x576.rgba",576,0); + ac_gpu.theme_asset_retry_at[4]=0; + assert(ac_gpu_theme_asset_ready(4)); + double sky[]={0,0,ac_theme_master_widths[4],ac_theme_master_heights[4],32,32,64,64,0,.8}; + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(4,sky,0,1)); + double behind[]={0,0,1,64,0,1,0,64,1,0,0,255}; + ac_gpu_triangle(behind);ac_gpu_end(&fb); + assert(pixels[8*64+8]==0xffff0000); // Sky writes depth and hides later distant geometry. + assert(ac_gpu_begin(64,64,0,0,0)); + assert(ac_gpu_theme_sprite(4,sky,0,1));ac_gpu_triangle(tri);ac_gpu_end(&fb); + assert(pixels[8*64+8]==0xff0000ff); // Fighters remain in front of sky. + assert(glGetError()==GL_NO_ERROR); + puts("PASS theme orientation, retained uploads, optional assets, soft alpha, VFX/prop depth, bounds"); + return 0; +} diff --git a/fedac/native/tests/screen-gpu.c b/fedac/native/tests/screen-gpu.c new file mode 100644 index 0000000000..06d40d58af --- /dev/null +++ b/fedac/native/tests/screen-gpu.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include "framebuffer.h" +void ac_log(const char *fmt,...) { va_list ap;va_start(ap,fmt);vfprintf(stderr,fmt,ap);va_end(ap); } +#include "screen-gpu.h" +int main(void) { + if(!ac_gpu_begin(32,32,0,0,0))return 1; + double v[]={0,0,-1.4,32,0,-1.4,0,32,-1.4,255,0,0};ac_gpu_triangle(v); + uint32_t data[1024];ACFramebuffer fb={.width=32,.height=32,.stride=32,.pixels=data};ac_gpu_end(&fb); + if(data[33]!=0xffff0000u)return 2; + const int sides[]={6,8,12,16,24,32}; + for(int k=0;k<6;k++) { + int n=sides[k]; uint32_t expected[1024]; + if(!ac_gpu_begin(32,32,0,0,0))return 3; + double ring[64]; + for(int i=0;i +#include + +int main(void) { + uint32_t pixels[64]; float depth[64]; + for(int i=0;i<64;i++){pixels[i]=0;depth[i]=INFINITY;} + ac_screen_triangle(pixels,depth,8,8,8,0,0,.5,8,0,.5,0,8,.5,0xff123456); + assert(pixels[1*8+1]==0xff123456); + // Later coplanar geometry replaces the color without speckling. + ac_screen_triangle(pixels,depth,8,8,8,0,8,.5,8,0,.5,0,0,.5,0xffabcdef); + for(int y=0;y<7;y++)for(int x=0;x<7-y;x++)assert(pixels[y*8+x]==0xffabcdef); + // A farther face cannot overwrite it; a nearer one can. + ac_screen_triangle(pixels,depth,8,8,8,0,0,.6,8,0,.6,0,8,.6,0xff000000); + assert(pixels[9]==0xffabcdef); + ac_screen_triangle(pixels,depth,8,8,8,0,0,.4,8,0,.4,0,8,.4,0xff112233); + assert(pixels[9]==0xff112233); + // Off-screen, degenerate and invalid geometry is safe. + ac_screen_triangle(pixels,depth,8,8,8,-100,-100,0,-20,-100,0,-100,-20,0,0); + ac_screen_triangle(pixels,depth,8,8,8,0,0,0,0,0,0,0,0,0,0); + ac_screen_triangle(pixels,depth,8,8,8,NAN,0,0,8,0,0,0,8,0,0); + assert(pixels[9]==0xff112233); + puts("screen triangles: color, winding, depth, clipping, invalid geometry pass"); +} diff --git a/fedac/native/tests/ws-local.c b/fedac/native/tests/ws-local.c new file mode 100644 index 0000000000..03735fe0d2 --- /dev/null +++ b/fedac/native/tests/ws-local.c @@ -0,0 +1,51 @@ +// Real plaintext websocket handshake, masked send, receive and quiet-peer pacing. +#include +#include +#include +#include +#include "../src/ws-client.c" +void ac_log(const char *fmt, ...) { (void)fmt; } +static int listener; +static atomic_int received; +static double received_at; +static double ms(void) { struct timespec t; clock_gettime(CLOCK_MONOTONIC,&t); return t.tv_sec*1000.0+t.tv_nsec/1e6; } +static void *server(void *unused) { + (void)unused; + int fd=accept(listener,NULL,NULL); assert(fd>=0); + struct timeval timeout={3,0};setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&timeout,sizeof(timeout)); + char request[1024]={0};int used=0; + while(used<1023 && !strstr(request,"\r\n\r\n")) { assert(recv(fd,request+used,1,0)==1);used++; } + assert(strstr(request,"GET /oskiewar-live?match=ow-test123 HTTP/1.1")); + const char *response="HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\n\r\n"; + assert(send(fd,response,strlen(response),MSG_NOSIGNAL)==(int)strlen(response)); + unsigned char frame[11];used=0; + while(used<11) { int n=recv(fd,frame+used,11-used,0); assert(n>0);used+=n; } + received_at=ms(); + assert(frame[0]==0x81 && frame[1]==0x85); + for(int i=0;i<5;i++) assert((frame[6+i]^frame[2+(i&3)])=="hello"[i]); + atomic_store(&received,1); + unsigned char reply[]={0x81,2,'{','}'}; + assert(send(fd,reply,sizeof(reply),MSG_NOSIGNAL)==sizeof(reply)); + usleep(100000);close(fd);return NULL; +} +int main(void) { + listener=socket(AF_INET,SOCK_STREAM,0);assert(listener>=0); + struct sockaddr_in address={.sin_family=AF_INET,.sin_addr.s_addr=htonl(INADDR_LOOPBACK)}; + assert(bind(listener,(struct sockaddr *)&address,sizeof(address))==0);assert(listen(listener,1)==0); + socklen_t length=sizeof(address);assert(getsockname(listener,(struct sockaddr *)&address,&length)==0); + pthread_t peer;pthread_create(&peer,NULL,server,NULL); + ACWs *ws=ws_create();assert(ws); + char url[160];snprintf(url,sizeof(url),"ws://127.0.0.1:%d/oskiewar-live?match=ow-test123",ntohs(address.sin_port)); + ws_connect(ws,url); + for(int i=0;i<1500;i++) { pthread_mutex_lock(&ws->mu);int connected=ws->connected;pthread_mutex_unlock(&ws->mu);if(connected)break;usleep(2000); } + assert(ws->connected); + usleep(10000); // Deliberately send while the peer has no inbound traffic. + double started=ms();ws_send(ws,"hello"); + for(int i=0;i<1500&&!atomic_load(&received);i++)usleep(2000); + assert(atomic_load(&received)); + assert(received_at-started<30); // The old 50ms blocking pump fails this case. + for(int i=0;i<1000;i++) { pthread_mutex_lock(&ws->mu);int count=ws->msg_count;pthread_mutex_unlock(&ws->mu);if(count)break;usleep(2000); } + assert(ws_poll(ws)==1 && !strcmp(ws->messages[0],"{}")); + printf("PASS plaintext local relay and quiet-peer send latency %.3fms\n",received_at-started); + ws_destroy(ws);pthread_join(peer,NULL);close(listener);return 0; +} diff --git a/fedac/native/tests/ws-realtime.c b/fedac/native/tests/ws-realtime.c new file mode 100644 index 0000000000..e43334abfc --- /dev/null +++ b/fedac/native/tests/ws-realtime.c @@ -0,0 +1,40 @@ +// The real parser against an endlessly readable TLS stream and a server ping. +#include +#include +#include +#include +#include +static int fake_read(SSL *, void *, int); +static int fake_write(SSL *, const void *, int); +#define SSL_pending(ssl) 1 +#define SSL_read fake_read +#define SSL_write fake_write +#include "../src/ws-client.c" +#undef SSL_read +#undef SSL_write +void ac_log(const char *fmt, ...) { (void)fmt; } +static int reads, writes, ping; +static unsigned char sent[256]; +static int fake_read(SSL *ssl, void *data, int cap) { + (void)ssl; + unsigned char frame[]={0x81,2,'{','}'}; + if(ping)frame[0]=0x89; + assert(cap>=4);memcpy(data,frame,4);reads++;return 4; +} +static int fake_write(SSL *ssl,const void *data,int len) { + (void)ssl;assert(len<256);memcpy(sent,data,len);writes++;return len; +} +int main(void) { + ACWs *ws=calloc(1,sizeof(*ws));assert(ws); + pthread_mutex_init(&ws->mu,NULL);ws->ssl=(void *)1; + thread_recv(ws); + assert(reads==1 && ws->msg_count==1 && !strcmp(ws->messages[0],"{}")); + ping=1;thread_recv(ws); + assert(reads==2 && writes==1 && sent[0]==0x8a && sent[1]==0x82); + assert((sent[6]^sent[2])=='{' && (sent[7]^sent[3])=='}'); + thread_send(ws,"hello"); + assert(writes==2 && sent[0]==0x81 && sent[1]==0x85); + for(int i=0;i<5;i++)assert((sent[6+i]^sent[2+(i&3)])=="hello"[i]); + pthread_mutex_destroy(&ws->mu);free(ws); + return 0; +} diff --git a/fedac/native/tools/oskiewar-live.mjs b/fedac/native/tools/oskiewar-live.mjs new file mode 100644 index 0000000000..57fbc4c210 --- /dev/null +++ b/fedac/native/tools/oskiewar-live.mjs @@ -0,0 +1,79 @@ +#!/usr/bin/env node +// Bundle the shared game and hot-upload it to an AC Native LAN server. +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { createHash } from "node:crypto"; +import { watchFile } from "node:fs"; + +const native = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const root = path.resolve(native, "../.."); +const inputs = [path.join(root, "xbox/live/oskiewar.js"), + path.join(native, "lib/oskiewar-host.mjs"), path.join(native, "pieces/oskiewar.mjs"), + path.join(root, "xbox/live/lan-test.js")]; +export async function bundle() { + const source = await fs.readFile(inputs[0], "utf8"); + const sourceHash = createHash("sha256").update(source).digest("hex"); + const lanTest = await fs.readFile(inputs[3], "utf8"); + const qr = (await fs.readFile(path.join(root, + "system/public/aesthetic.computer/dep/@akamfoad/qr/qr.mjs"), "utf8")) + .replace(/\r?\nexport\s*\{[\s\S]*?\};\s*$/, "\n"); + const names = "runtime, gamepad, controllers, capabilities, telemetry, gameSignal, drum, synth, wipe, box, line, triangle, triangle3d, disc3d, themeReady, themeAssetReady, themeSprite, themeQuad, accountState, accountAction, accountReport, write, systemWrite, gameView"; + const game = `// Generated from xbox/live/oskiewar.js; do not edit.\nexport const sourceHash = ${JSON.stringify(sourceHash)};\nexport function createOskiewar(host) {\nlet { ${names} } = host;\n${qr}\n${source}\n${lanTest}\nreturn { boot, sim, paint, act, leave, enterGame: () => enterGame(runtime().monotonicUs), state: () => ({ version: buildVersion, debug: debugHitboxes, graphicsTheme: globalThis.__oskiewarGraphicsThemeStatus || "flat", account: globalThis.__oskiewarDeviceAccount || null, menu:globalThis.__oskiewarDeviceMenu || null, error: clientError ? String(clientError.message || clientError) : null, players: players.map(p => ({ name: p.name, x: p.x, y: p.y, alive: p.alive })), map: currentMapName, mode: shellMode, roundResult, matchOver, roundElapsedUs, finalKillReplay: globalThis.__oskiewarFinalKillReplay || null, net: globalThis.__oskiewarNetStats || null, connection: globalThis.__oskiewarLanStatus || null, mismatch: globalThis.__oskiewarLanMismatch || null }) };\n}\n`; + // Native reloads the entry module, but keeps imported modules cached. + // Ship one atomic entry so every reload receives the new game AND adapter. + const host = await fs.readFile(inputs[1], "utf8"); + const entry = (await fs.readFile(inputs[2], "utf8")).replace(/^import .*;\n/gm, ""); + return { sourceHash, files: [["pieces/oskiewar.mjs", `${host}\n${game}\n${entry}`]] }; +} +async function request(url, options = {}) { + const response = await fetch(url, { ...options, signal: AbortSignal.timeout(15000) }); + if (!response.ok) throw new Error(`${options.method || "GET"} ${url}: ${response.status}`); + return response; +} +async function deploy(base) { + const status = await (await request(base + "/status")).json(); + if (!status.build || !status.piece) throw new Error("Target is not an AC Native LAN server"); + const build = await bundle(); + for (const [name, contents] of build.files) { + await request(`${base}/${name}`, { method: "PUT", body: contents }); + const saved = await (await request(`${base}/${name}`)).text(); + if (saved !== contents) throw new Error(`Readback mismatch: ${name}`); + } + await request(base + "/jump/oskiewar", { method: "POST" }); + console.log(`Uploaded to ${status.name}: ${build.sourceHash.slice(0, 12)}; reload requested.`); +} +async function main() { + const args = process.argv.slice(2); + if (args[0] === "--build") { + const output = path.resolve(args[1] || path.join(native, "build/oskiewar-live")); + const build = await bundle(); + for (const [name, contents] of build.files) { + const target = path.join(output, name); + await fs.mkdir(path.dirname(target), { recursive: true }); + await fs.writeFile(target, contents); + } + console.log(output); return; + } + const address = args.find(a => !a.startsWith("--")); + if (!address) throw new Error("Usage: oskiewar-live.mjs [--watch] | --build [directory]"); + const base = (address.includes("://") ? address : `http://${address}`).replace(/\/$/, ""); + await deploy(base); + if (args.includes("--watch")) { + let queued = false, running = false, timer; + const changed = () => { + queued = true; clearTimeout(timer); + timer = setTimeout(async () => { + if (running) return; + running = true; + try { while (queued) { queued = false; await deploy(base); } } + catch (error) { console.error(error.message); } + finally { running = false; } + }, 300); + }; + for (const input of inputs) watchFile(input, { interval: 500 }, changed); + console.log("Watching shared game, native adapter, and piece. Ctrl-C stops."); + } +} +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) + main().catch(error => { console.error(error.message); process.exitCode = 1; }); diff --git a/fedac/native/tools/oskiewar-usb-pad.c b/fedac/native/tools/oskiewar-usb-pad.c new file mode 100644 index 0000000000..aac3c0949d --- /dev/null +++ b/fedac/native/tools/oskiewar-usb-pad.c @@ -0,0 +1,97 @@ +// Temporary userspace Xbox-360 protocol bridge for AC OS kernels without +// xpad. Claims only the user-selected M30 interface; never detaches drivers. +// Build: cc -O2 -Wall oskiewar-usb-pad.c -o oskiewar-usb-pad +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile sig_atomic_t running=1; +static void stop(int sig) { (void)sig; running=0; } +static long long millis(void) { + struct timespec t; clock_gettime(CLOCK_REALTIME,&t); + return (long long)t.tv_sec*1000+t.tv_nsec/1000000; +} +static int number(const char *dir,const char *file,int base) { + char path[512],s[64]; snprintf(path,sizeof(path),"%s/%s",dir,file); + FILE *f=fopen(path,"r"); if(!f)return -1; + int value=fgets(s,sizeof(s),f)?(int)strtol(s,0,base):-1; fclose(f); return value; +} +static int discover(char *path,size_t size) { + DIR *dir=opendir("/sys/bus/usb/devices"); if(!dir)return 0; + struct dirent *e; int found=0; + while((e=readdir(dir))) { + char device[512],product[600],name[128]; + snprintf(device,sizeof(device),"/sys/bus/usb/devices/%s",e->d_name); + if(number(device,"idVendor",16)!=0x045e || number(device,"idProduct",16)!=0x028e)continue; + snprintf(product,sizeof(product),"%s/product",device); + FILE *f=fopen(product,"r"); if(!f)continue; + int match=fgets(name,sizeof(name),f) && strstr(name,"8BitDo M30"); fclose(f); + if(!match)continue; + int bus=number(device,"busnum",10),dev=number(device,"devnum",10); + if(bus<0||dev<0)continue; + snprintf(path,size,"/dev/bus/usb/%03d/%03d",bus,dev); found=1; break; + } + closedir(dir); return found; +} +static int16_t axis(const unsigned char *p) { return (int16_t)(p[0]|(p[1]<<8)); } +static void publish(int connected,const unsigned char *b) { + const char *names[]={"ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Menu","View","LeftThumbstick","RightThumbstick", + "LeftShoulder","RightShoulder","Guide",0,"A","B","X","Y"}; + FILE *f=fopen("/tmp/oskiewar-gamepads.json.new","w"); if(!f)return; + fprintf(f,"{\"at\":%lld,\"pads\":[",millis()); + if(connected) { + fprintf(f,"{\"connected\":true,\"id\":\"8BitDo M30 gamepad\",\"name\":\"8BitDo M30 gamepad\",\"down\":["); + unsigned mask=b[2]|(b[3]<<8); int comma=0; + for(int i=0;i<16;i++)if((mask&(1u<30){fprintf(f,"%s\"LeftTrigger\"",comma?",":"");comma=1;} + if(b[5]>30)fprintf(f,"%s\"RightTrigger\"",comma?",":""); + fprintf(f,"],\"leftX\":%.5f,\"leftY\":%.5f,\"rightX\":%.5f,\"rightY\":%.5f}", + axis(b+6)/32768.f,axis(b+8)/32768.f,axis(b+10)/32768.f,axis(b+12)/32768.f); + } + fprintf(f,"]}\n"); fclose(f); + rename("/tmp/oskiewar-gamepads.json.new","/tmp/oskiewar-gamepads.json"); +} +int main(void) { + signal(SIGINT,stop); signal(SIGTERM,stop); + unsigned char state[32]={0}; + while(running) { + char path[128]; publish(0,state); + if(!discover(path,sizeof(path))){sleep(1);continue;} + int fd=open(path,O_RDWR|O_CLOEXEC); if(fd<0){sleep(1);continue;} + unsigned int interface=0; + if(ioctl(fd,USBDEVFS_CLAIMINTERFACE,&interface)<0){close(fd);sleep(1);continue;} + unsigned char packet[32]={0}; + struct usbdevfs_urb urb={.type=USBDEVFS_URB_TYPE_INTERRUPT,.endpoint=0x81,.buffer=packet,.buffer_length=sizeof(packet)}; + memset(state,0,sizeof(state)); + fprintf(stderr,"M30 connected: %s\n",path); + int submitted=ioctl(fd,USBDEVFS_SUBMITURB,&urb)==0; + long long last=0; + while(running && submitted) { + struct usbdevfs_urb *done=0; + if(ioctl(fd,USBDEVFS_REAPURBNDELAY,&done)==0) { + if(done->status<0)break; + if(done->actual_length>=14 && packet[0]==0)memcpy(state,packet,sizeof(state)); + submitted=ioctl(fd,USBDEVFS_SUBMITURB,&urb)==0; + } else if(errno!=EAGAIN && errno!=EINTR)break; + long long now=millis(); + if(now-last>=16){publish(1,state);last=now;} + struct timespec wait={0,2000000}; nanosleep(&wait,0); + } + ioctl(fd,USBDEVFS_DISCARDURB,&urb); + ioctl(fd,USBDEVFS_RELEASEINTERFACE,&interface); close(fd); + fprintf(stderr,"M30 disconnected\n"); + } + publish(0,state); return 0; +} diff --git a/grants/culturehub-la-2026/femrag-spatial/install-oskiewar.mjs b/grants/culturehub-la-2026/femrag-spatial/install-oskiewar.mjs new file mode 100644 index 0000000000..813472fcfc --- /dev/null +++ b/grants/culturehub-la-2026/femrag-spatial/install-oskiewar.mjs @@ -0,0 +1,40 @@ +// Run on the host owning the existing Oskiewar stage service (Neo). +// Source/config only: deployment and service restart are explicit separate steps. +import {readFileSync,writeFileSync,existsSync} from 'node:fs'; +import {resolve,dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {homedir} from 'node:os'; +const here=dirname(fileURLToPath(import.meta.url)); +const root=resolve(process.argv[2]||resolve(here,'../../..')); +const stage=resolve(root,'xbox/tools/oskiewar-stage-mcp.mjs'); +const renderer=resolve(root,'xbox/live/oskiewar.js'); +const config=resolve(homedir(),'.ac-os/oskiewar-stage.json'); +let service=readFileSync(stage,'utf8'),draw=readFileSync(renderer,'utf8'); +const marker=' const sung=currentMenuBand(cue);'; +const drawMarker=' for (let index = 0; index < 2; index++) {'; +if(!service.includes(marker)||!draw.includes('function drawPerformanceStage()'))throw Error('Unsupported stage source'); +if(!service.includes('// Femrag visual follower'))service=service.replace(marker,`${marker} + // Femrag visual follower: stale/idle feeds yield to the existing music source. + if(config.femrag)try { + const r=await fetch(config.femrag,{signal:AbortSignal.timeout(300)}); + const p=r.ok?await r.json():null; + if(p?.playing && p.dance==='femrag-round-v1' && Number.isFinite(p.elapsed))return p; + }catch{} +`); +const fn=readFileSync(resolve(here,'oskiewar-dance.js'),'utf8'); +const start=draw.indexOf('// Included in Neo\'s existing Oskiewar renderer;'); +if(start>=0)draw=draw.slice(0,start)+draw.slice(draw.indexOf('function performanceStageActive()',start)); +draw=draw.replace('function performanceStageActive()',fn+'\nfunction performanceStageActive()'); +if(!draw.includes("if (music.dance === 'femrag-round-v1') drawFemragDance")){ + const at=draw.indexOf(drawMarker,draw.indexOf('function drawPerformanceStage()')); + if(at<0)throw Error('Missing performance drawing loop'); + draw=draw.slice(0,at)+" if (music.dance === 'femrag-round-v1') drawFemragDance(music, elapsed);\n else\n"+draw.slice(at); +} +const cfg=JSON.parse(readFileSync(config,'utf8')); +cfg.femrag=process.env.FEMRAG_FEED||'http://192.168.1.234:8796/api/performance'; +// Keep current curtain/mode: the operator chooses auto/performance separately. +for(const [path,body] of [[stage,service],[renderer,draw],[config,JSON.stringify(cfg,null,2)+'\n']]){ + if(!existsSync(path+'.pre-femrag'))writeFileSync(path+'.pre-femrag',readFileSync(path)); + writeFileSync(path,body); +} +console.log('Femrag source connected; existing curtain and display mode preserved.'); diff --git a/grants/culturehub-la-2026/femrag-spatial/oskiewar-dance.js b/grants/culturehub-la-2026/femrag-spatial/oskiewar-dance.js new file mode 100644 index 0000000000..98315fa886 --- /dev/null +++ b/grants/culturehub-la-2026/femrag-spatial/oskiewar-dance.js @@ -0,0 +1,38 @@ +// Included in Neo's existing Oskiewar renderer; primitive-only and silent. +function drawFemragDance(music, elapsed) { + const width=viewWidth(), height=viewHeight, beat=elapsed*(Number(music.bpm)||144)/60; + const reverse=/ragga/.test(music.section||'')?-1:1; + const gather=/build/.test(music.section||'')?.7:1; + const fade=/outro/.test(music.section||'')?clamp((music.duration-elapsed)/8,0,1):1; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[249,154,103]]; + const hits=(music.hits||[]).map(e=>({t:music.elapsed+e[0]/100,seat:e[1]===6?'sub':e[1],midi:e[2]<0?null:e[2]})); + const sub=hits.reduce((v,e)=>e.seat==='sub'&&elapsed>=e.t?Math.max(v,Math.exp(-(elapsed-e.t)*9)):v,0); + triangleDepth=-.8; + const scale=Math.min(width,height)*.047; + for(let seat=0;seat<6;seat++) { + let hit=null, level=0; + for(const e of hits)if(e.seat===seat&&elapsed>=e.t&&elapsed-e.t<.6){ + const amp=Math.exp(-(elapsed-e.t)*7);if(amp>level){level=amp;hit=e;} + } + const a=seat*2*Math.PI/5+reverse*beat*Math.PI/32; + const x=seat===5?viewCenterX():viewCenterX()+platformMath.sin(a)*width*.30*gather; + const y=seat===5?height*.40:height*.40+platformMath.cos(a)*height*.23*gather; + const step=platformMath.sin(beat*Math.PI+seat)*(.15+level*.55); + const bob=level*scale*.55; + const color=colors[seat].map(v=>Math.round(v*(.55+.45*fade))); + const limb=scale*.17, bodyY=y-bob; + filledCapsule(x,bodyY-scale*.25,x,bodyY+scale*.65,limb,color); + filledDisc(x,bodyY-scale*.8,scale*.42,color); + for(const side of [-1,1]) { + filledCapsule(x,bodyY,x+side*scale*.8,bodyY-scale*(.15+level*.9)+side*step*scale,limb,color); + filledCapsule(x,bodyY+scale*.6,x+side*scale*(.45+step*.25),y+scale*1.35,limb,color); + } + if(hit&&Number.isFinite(hit.midi)) { + const note=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'][Math.round(hit.midi)%12]; + const size=Math.max(20,scale*.65); + typeWrite(note,x-handleWidth(note,size)/2,bodyY-scale*1.9,size,...color); + } + } + // Sub notes swell a steady floor; no full-screen flash or second soundtrack. + screenRect(width*.12,height*.76,width*.76,3+sub*8,[94,110,143]); +} diff --git a/grants/culturehub-la-2026/macneopolitan/bin/mirror-seat.mjs b/grants/culturehub-la-2026/macneopolitan/bin/mirror-seat.mjs new file mode 100644 index 0000000000..f45b5e5565 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/bin/mirror-seat.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +// Mirror one native trio seat onto an extra AC OS machine, and drive that +// machine from this Mac's run records so it lands on the room's downbeat. +// +// The fleet plan is exactly six seats, and the conductor (run-full-trio.py) +// only ever addresses those six. A seventh machine — Will's Chromebook on +// 2026-09-24 — can still echo a seat: copy the seat's staged files over the +// LAN, jump it into trio-fleet, then replay the conductor's cue to it. This +// tool never writes to a real seat; it only GETs from the source and PUTs to +// the mirror. +// +// node bin/mirror-seat.mjs sync [--from=192.168.1.237] [--to=192.168.1.246] +// node bin/mirror-seat.mjs relay [...] # sync, then follow run records +// +// Records: run-full-trio.py saves OUT/full-trio-.json with startEpoch +// (wall clock) and nativeCountdown once every seat has been told to play. +// The relay watches the Shelf song folders for those, measures the mirror's +// audio clock the way the conductor does (clock command, RTT/2), and sends +// prepare / play / keepalive / stop to the mirror only. +import {readdirSync, readFileSync, statSync, existsSync} from 'node:fs'; +import {createHash, randomUUID} from 'node:crypto'; +import {resolve} from 'node:path'; + +const args = process.argv.slice(2); +const cmd = args.shift(); +const opt = Object.fromEntries(args.filter(a => a.startsWith('--') && a.includes('=')).map(a => { const i = a.indexOf('='); return [a.slice(2, i), a.slice(i + 1)]; })); +const FROM = `http://${opt.from ?? '192.168.1.237'}`; // seat 4, LEFT FRONT (ac5) +const TO = `http://${opt.to ?? '192.168.1.246'}`; // the mirror +const SHELF = opt.shelf ?? '/Users/jas/Shelf'; +const log = (...a) => console.log(new Date().toISOString().slice(11, 23), ...a); + +async function get(base, path, {timeout = 8000, buffer = false} = {}) { + const r = await fetch(base + path, {signal: AbortSignal.timeout(timeout)}); + if (!r.ok) throw Error(`GET ${base}${path}: ${r.status}`); + return buffer ? Buffer.from(await r.arrayBuffer()) : await r.text(); +} +async function put(base, path, body, timeout = 30000) { + const r = await fetch(base + path, {method: 'PUT', body, signal: AbortSignal.timeout(timeout)}); + if (!r.ok) throw Error(`PUT ${base}${path}: ${r.status}`); +} +const sha = b => createHash('sha256').update(b).digest('hex'); +const json = async (base, path) => JSON.parse(await get(base, path, {timeout: 3000})); +const sleep = ms => new Promise(r => setTimeout(r, ms)); + +async function status(base) { try { return await json(base, '/pieces/trio-fleet-status.json'); } catch { return null; } } +async function command(base, action, extra = {}) { + const c = {id: randomUUID().replaceAll('-', ''), action, ...extra}; + await put(base, '/pieces/trio-fleet-command.json', JSON.stringify(c), 3000); + return c.id; +} + +// Copy the source seat's staged files to the mirror byte for byte. +async function sync() { + const cfgText = await get(FROM, '/pieces/trio-fleet-config.json'); + const cfg = JSON.parse(cfgText); + let mirrorCfg = null; + try { mirrorCfg = await json(TO, '/pieces/trio-fleet-config.json'); } catch {} + const mirrorStatus = await status(TO); + if (mirrorCfg?.arrangementHash === cfg.arrangementHash && mirrorStatus?.arrangementHash === cfg.arrangementHash && mirrorStatus?.phase === 'ready') { + log(`mirror already carries ${cfg.label} (${cfg.arrangementHash.slice(0, 12)}), ready`); + return cfg; + } + log(`syncing seat ${cfg.seat} ${cfg.label} (${cfg.arrangementHash.slice(0, 12)}) ${FROM} -> ${TO}`); + for (const part of cfg.center?.parts ?? []) { + const bytes = await get(FROM, part, {buffer: true, timeout: 60000}); + await put(TO, part, bytes, 60000); + const back = await get(TO, part, {buffer: true, timeout: 60000}); + if (sha(back) !== sha(bytes)) throw Error(`${part}: mirror copy differs`); + log(` ${part} ${bytes.length} bytes ok`); + } + // The six seats run the `mono` OTA channel, whose runtime has + // sound.volume.setMonoOutput (which speaker side carries the fold). A + // mirror on the main channel lacks it, and the piece calls it in boot() + // outside its try — the mirror then sat in phase "loading" forever + // (2026-09-24). Guard those calls in the mirror's copy only. + const code = Buffer.from((await get(FROM, '/pieces/trio-fleet.mjs')).replace( + /([\w.]+)\.setMonoOutput\(([^)]*)\);/g, 'try{$1.setMonoOutput($2);}catch{}')); + await put(TO, '/pieces/trio-fleet.mjs', code); + if (sha(await get(TO, '/pieces/trio-fleet.mjs', {buffer: true})) !== sha(code)) throw Error('piece copy differs'); + await put(TO, '/pieces/trio-fleet-config.json', cfgText); + await command(TO, 'idle'); + await put(TO, '/jump/trio-fleet', ''); + log(' piece + config pushed, jumped to trio-fleet; waiting for ready'); + for (let i = 0; i < 120; i++) { + await sleep(500); + const s = await status(TO); + if (s?.arrangementHash === cfg.arrangementHash && s.phase === 'ready') { log(` mirror ready as ${s.receiverId}`); return cfg; } + if (s?.error) throw Error(`mirror error: ${s.error}`); + } + throw Error('mirror did not become ready in 60 s'); +} + +// audioTime(mirror) - wallclock, from the best of a few clock probes (RTT/2), +// the same contract the conductor applies to the six seats. +async function clockOffset() { + let best = null; + for (let i = 0; i < 8; i++) { + const a = Date.now() / 1000; + const id = await command(TO, 'clock'); + let clock = null; + for (let j = 0; j < 40; j++) { await sleep(25); try { clock = await json(TO, '/pieces/trio-fleet-clock.json'); } catch {} if (clock?.id === id) break; } + const b = Date.now() / 1000; + if (clock?.id !== id) continue; + const s = {offset: clock.audioTime - (a + b) / 2, rtt: b - a}; + if (!best || s.rtt < best.rtt) best = s; + } + if (!best) throw Error('mirror clock probe failed'); + return best; +} + +function findRecords() { + const out = []; + for (const dir of readdirSync(SHELF, {withFileTypes: true})) { + if (!dir.isDirectory() || !dir.name.startsWith('culturehub')) continue; + const d = resolve(SHELF, dir.name); + for (const f of readdirSync(d)) if (/^full-trio-[0-9a-f]+\.json$/.test(f)) out.push(resolve(d, f)); + } + return out; +} + +async function relay() { + let cfg = await sync(); + const done = new Set(findRecords().map(p => p + ':' + statSync(p).mtimeMs)); // only cues issued after we start + let lastSyncCheck = Date.now(); + log(`relaying cues for ${cfg.label}; watching ${SHELF}/culturehub*/full-trio-*.json`); + for (;;) { + await sleep(200); + if (Date.now() - lastSyncCheck > 10000) { + lastSyncCheck = Date.now(); + try { const src = await json(FROM, '/pieces/trio-fleet-config.json'); if (src.arrangementHash !== cfg.arrangementHash) { log('source arrangement changed — resyncing'); cfg = await sync(); } } catch {} + } + for (const p of findRecords()) { + const key = p + ':' + statSync(p).mtimeMs; + if (done.has(key)) continue; + done.add(key); + let rec; try { rec = JSON.parse(readFileSync(p, 'utf8')); } catch { continue; } + if (!rec.startEpoch || !rec.nativeCountdown || rec.cleanup || rec.error) continue; + if (rec.arrangementHash !== cfg.arrangementHash) { log(`cue ${rec.runId}: arrangement ${rec.arrangementHash.slice(0, 12)} != mirror ${cfg.arrangementHash.slice(0, 12)} — resync then skip`); try { cfg = await sync(); } catch (e) { log(String(e)); } continue; } + const lead = rec.startEpoch - Date.now() / 1000; + if (lead < 2.5) { log(`cue ${rec.runId}: downbeat in ${lead.toFixed(1)} s — too late for the mirror`); continue; } + try { + const clk = await clockOffset(); + const startAt = rec.startEpoch + clk.offset; + await command(TO, 'prepare', {arrangementHash: cfg.arrangementHash, startAt, runId: rec.runId}); + let s = null; for (let i = 0; i < 40; i++) { await sleep(50); s = await status(TO); if (s?.phase === 'prepared' && s.runId === rec.runId) break; } + if (s?.phase !== 'prepared') throw Error(`mirror did not prepare: ${JSON.stringify(s)}`); + await command(TO, 'play', {runId: rec.runId}); + log(`cue ${rec.runId}: prepared + play, downbeat in ${(rec.startEpoch - Date.now() / 1000).toFixed(2)} s (clock offset ${clk.offset.toFixed(3)}, rtt ${(clk.rtt * 1000).toFixed(0)} ms)`); + const end = rec.startEpoch + (rec.duration ?? cfg.duration + 2); + while (Date.now() / 1000 < end + 0.5) { + await command(TO, 'keepalive', {runId: rec.runId}).catch(e => log('keepalive:', e.message)); + await sleep(500); + try { const r2 = JSON.parse(readFileSync(p, 'utf8')); if (r2.cleanup) { log('conductor cleaned up — stopping mirror'); break; } } catch {} + } + await command(TO, 'stop').catch(() => {}); + const fin = await status(TO); + log(`cue ${rec.runId}: finished; mirror phase=${fin?.phase} startLateMs=${fin?.startLateMs}`); + } catch (e) { log(`cue ${rec.runId}: ${e.message}`); await command(TO, 'stop').catch(() => {}); } + } + } +} + +if (cmd === 'sync') await sync(); +else if (cmd === 'relay') await relay(); +else { console.error('Use mirror-seat.mjs sync|relay [--from=IP] [--to=IP] [--shelf=DIR]'); process.exit(2); } diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-clock.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-clock.json new file mode 100644 index 0000000000..119ec4f804 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-clock.json @@ -0,0 +1,365 @@ +{ + "tag": "chorus-clock", + "at": "2026-09-22T17:44:02.244Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-clock", + "keep": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock", + "no-spoken": "1", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=40,SINGER_SUSTAIN_DB=5" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle", + "lines": [ + { + "line": 1, + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "56:0.5,56:0.5,56:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 312, + "heard": "I am the first of my life in this house", + "wer": 0.1, + "errors": 1, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 292, + "heard": "I run home and I am carried.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 271, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 315, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 275, + "heard": "One, eight, three bodies.", + "wer": 0.25, + "errors": 1, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Allison", + "lines": [ + { + "line": 1, + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,51:0.5,51:0.5,55:1,56:1,58:0.5,58:0.5,58:0.5,56:1,55:1,53:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 349, + "heard": "I was born second and I will work faster.", + "wer": 0.14285714285714285, + "errors": 1, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,51:1,53:1,56:1,58:1,58:0.5,56:1,51:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 341, + "heard": "Lay down most days and humming.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,52:1,52:1,54:1,54:0.5,54:0.5,57:1,55:0.5,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 279, + "heard": "Something run in the family.", + "wer": 0.3333333333333333, + "errors": 2, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,57:0.5,52:1,54:1,55:0.5,55:0.5,57:1,55:1,52:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 347, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,50:0.5,50:1,50:0.5,59:1,55:1,50:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 295, + "heard": "One down eat three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,53:0.5,53:0.5,53:0.5,58:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 178, + "heard": "I am the artist.", + "wer": 0.25, + "errors": 1, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,58:1,62:1,64:0.5,64:0.5,60:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 256, + "heard": "I have no history yet.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,58:1,53:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 170, + "heard": "Right Miiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiight", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 301, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,61:0.5,55:1,57:1,59:0.5,59:0.5,61:1,59:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 347, + "heard": "The same vessel, the same radio.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,54:0.5,54:1,54:0.5,62:1,59:1,54:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 276, + "heard": "One of the three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-clock/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 16, + "words": 88, + "wer": 0.18181818181818182, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-final.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-final.json new file mode 100644 index 0000000000..1c1f07df5f --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-final.json @@ -0,0 +1,367 @@ +{ + "tag": "chorus-final", + "at": "2026-09-22T17:41:08.732Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-final", + "keep": "/Users/jas/Shelf/macneopolitan-chorus/sung-final", + "no-spoken": "1", + "f0-floor": "120", + "vib-cents": "12", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=40,SINGER_SUSTAIN_DB=5" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle", + "lines": [ + { + "line": 1, + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "56:0.5,56:0.5,56:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 954, + "heard": "I am the first of my life in this house", + "wer": 0.1, + "errors": 1, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 375, + "heard": "I run warm and I am carried.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 347, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 392, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 343, + "heard": "Round 8, 3 bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Allison", + "lines": [ + { + "line": 1, + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,51:0.5,51:0.5,55:1,56:1,58:0.5,58:0.5,58:0.5,56:1,55:1,53:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 866, + "heard": "I was born second and I will work faster.", + "wer": 0.14285714285714285, + "errors": 1, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,51:1,53:1,56:1,58:1,58:0.5,56:1,51:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 419, + "heard": "Let down most days and humming.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,52:1,52:1,54:1,54:0.5,54:0.5,57:1,55:0.5,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 337, + "heard": "Some things run in the family.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,57:0.5,52:1,54:1,55:0.5,55:0.5,57:1,55:1,52:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 394, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,50:0.5,50:1,50:0.5,59:1,55:1,50:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 335, + "heard": "1 down B, 3 bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,53:0.5,53:0.5,53:0.5,58:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 408, + "heard": "I AM THE YOUNG JESS!", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,58:1,62:1,64:0.5,64:0.5,60:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 311, + "heard": "I am no history yet.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,58:1,53:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 214, + "heard": "Right, m-e-e-e-e-e-e-e-e-e-e-e-e-e-e", + "wer": 5.333333333333333, + "errors": 16, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 341, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,61:0.5,55:1,57:1,59:0.5,59:0.5,61:1,59:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 374, + "heard": "The same vessel, the same radio.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,54:0.5,54:1,54:0.5,62:1,59:1,54:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 320, + "heard": "One of the three bodies!", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-final/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 29, + "words": 88, + "wer": 0.32954545454545453, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-focus.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-focus.json new file mode 100644 index 0000000000..37cc8be359 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-focus.json @@ -0,0 +1,367 @@ +{ + "tag": "chorus-focus", + "at": "2026-09-22T17:32:28.972Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-focus", + "keep": "/Users/jas/Shelf/macneopolitan-chorus/sung", + "no-spoken": "1", + "f0-floor": "120", + "vib-cents": "12", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=40,SINGER_SUSTAIN_DB=5" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle", + "lines": [ + { + "line": 1, + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "56:0.5,56:0.5,56:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 298, + "heard": "I am the first of my line in this house.", + "wer": 0, + "errors": 0, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 279, + "heard": "I am warm and I am caring.", + "wer": 0.3333333333333333, + "errors": 2, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 275, + "heard": "Some things run in this family", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 309, + "heard": "The same voice on the same radio.", + "wer": 0.3333333333333333, + "errors": 2, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 271, + "heard": "Round 8. Three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Allison", + "lines": [ + { + "line": 1, + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,51:0.5,51:0.5,55:1,56:1,58:0.5,58:0.5,58:0.5,56:1,55:1,53:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 349, + "heard": "I was born sick and I will work faster.", + "wer": 0.2857142857142857, + "errors": 2, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,51:1,53:1,56:1,58:1,58:0.5,56:1,51:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 342, + "heard": "Look down, more stays and humming.", + "wer": 0.6, + "errors": 3, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,52:1,52:1,54:1,54:0.5,54:0.5,57:1,55:0.5,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 278, + "heard": "Some things run in the family.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,57:0.5,52:1,54:1,55:0.5,55:0.5,57:1,55:1,52:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 349, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,50:0.5,50:1,50:0.5,59:1,55:1,50:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 272, + "heard": "One down beat, three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,53:0.5,53:0.5,53:0.5,58:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 184, + "heard": "I am the youngest.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,58:1,62:1,64:0.5,64:0.5,60:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 253, + "heard": "I am no history yet.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,58:1,53:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 164, + "heard": "Write me one.", + "wer": 0, + "errors": 0, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 305, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,61:0.5,55:1,57:1,59:0.5,59:0.5,61:1,59:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 341, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,54:0.5,54:1,54:0.5,62:1,59:1,54:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 276, + "heard": "One day I'll beat three bodies.", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 19, + "words": 88, + "wer": 0.2159090909090909, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-markers.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-markers.json new file mode 100644 index 0000000000..58b82e569b --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-markers.json @@ -0,0 +1,327 @@ +{ + "tag": "chorus-markers", + "at": "2026-09-22T17:39:03.300Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-markers", + "keep": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers", + "no-spoken": "1", + "f0-floor": "120", + "vib-cents": "12", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=40,SINGER_SUSTAIN_DB=5" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle", + "lines": [ + { + "line": 1, + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "56:0.5,56:0.5,56:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 1012, + "heard": "I am the first of my life in this house", + "wer": 0.1, + "errors": 1, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 384, + "heard": "I run warm and I am carried.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 370, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 384, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 357, + "heard": "Round 8, 3 bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Allison", + "lines": [ + { + "line": 1, + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,51:0.5,51:0.5,55:1,56:1,58:0.5,58:0.5,58:0.5,56:1,55:1,53:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 875, + "heard": "I was born second and I will work faster.", + "wer": 0.14285714285714285, + "errors": 1, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,51:1,53:1,56:1,58:1,58:0.5,56:1,51:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 429, + "heard": "Let down most days and humming.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,52:1,52:1,54:1,54:0.5,54:0.5,57:1,55:0.5,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 337, + "heard": "Some things run in the family.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,57:0.5,52:1,54:1,55:0.5,55:0.5,57:1,55:1,52:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 398, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,50:0.5,50:1,50:0.5,59:1,55:1,50:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 337, + "heard": "1 down B, 3 bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,53:0.5,53:0.5,53:0.5,58:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 418, + "heard": "I AM THE YOUNG JESS!", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,58:1,62:1,64:0.5,64:0.5,60:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 301, + "heard": "I am no history yet.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,58:1,53:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 209, + "heard": "Right, m-e-e-e-e-e-e-e-e-e-e-e-e-e-e", + "wer": 5.333333333333333, + "errors": 16, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 338, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus/sung-markers/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 26, + "words": 78, + "wer": 0.3333333333333333, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-smooth.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-smooth.json new file mode 100644 index 0000000000..085a7be95b --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-smooth.json @@ -0,0 +1,1011 @@ +{ + "tag": "chorus-smooth", + "at": "2026-09-22T18:27:32.590Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-smooth", + "keep": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung", + "no-spoken": "1", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=20,SINGER_SUSTAIN_DB=5,SINGER_SHIMMER_FRAMES=2,SINGER_LEGATO_MS=15" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "55:0.5,55:0.5,55:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 1272, + "heard": "I am the first of my life in this house", + "wer": 0.1, + "errors": 1, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 464, + "heard": "I run home and I am carried.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:16.5,66:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 160, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "scat", + "text": "doo la la la", + "lyrics": "doo la la la", + "notes": "r:22,55:0.666667,59:0.333333,55:0.666667,59:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 13.695652173913043, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 229, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "scat", + "text": "la la la la la la la", + "lyrics": "la la la la la la la", + "notes": "r:25.5,59:1,61:1,64:1,66:1,66:0.5,64:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 423, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "scat", + "text": "doo la la la", + "lyrics": "doo la la la", + "notes": "r:38,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 24.130434782608695, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 208, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "scat", + "text": "la la la la la la la", + "lyrics": "la la la la la la la", + "notes": "r:45.5,52:0.5,54:0.5,54:1,59:1,61:0.5,61:0.5,55:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 344, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "scat", + "text": "la la la", + "lyrics": "la la la", + "notes": "r:52.5,54:1,54:1,49:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 230, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:56.5,61:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 35.869565217391305, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 141, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "scat", + "text": "doo la la la", + "lyrics": "doo la la la", + "notes": "r:62,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 39.78260869565217, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 211, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "scat", + "text": "doo bee dah", + "lyrics": "doo bee dah", + "notes": "r:64.5,57:0.5,59:0.5,61:0.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 41.08695652173913, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 191, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 437, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 477, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 430, + "heard": "Round 8, 3 bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "scat", + "text": "doo bah dee dah", + "lyrics": "doo bah dee dah", + "notes": "r:90,57:0.666667,59:0.333333,57:0.666667,54:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 222, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,57:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 138, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/neo/line-16.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "40:1,r:1,47:0.666667,40:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 1431, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:4,40:1,r:1,47:0.666667,40:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 1.9565217391304348, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 248, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "harmony", + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,43:0.5,40:1,42:1,43:0.5,45:0.5,43:0.5,42:1,38:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 478, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,38:0.5,38:0.5,43:1,43:1,45:0.5,45:0.5,45:0.5,43:1,43:1,40:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 568, + "heard": "I was born second and I work faster", + "wer": 0, + "errors": 0, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,38:1,40:1,43:1,45:1,45:0.5,43:1,38:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 605, + "heard": "The downward gaze and humming.", + "wer": 0.8, + "errors": 4, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "bass", + "text": "dum dum dum dum dum dum dum", + "lyrics": "dum dum dum dum dum dum dum", + "notes": "r:45.5,37:0.5,38:0.5,38:1,43:1,45:0.5,45:0.5,40:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 423, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "dum dum dum", + "lyrics": "dum dum dum", + "notes": "r:52.5,38:1,38:1,33:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 290, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:60,38:1,r:1,45:0.666667,38:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 38.47826086956522, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 253, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "bass", + "text": "dum", + "lyrics": "dum", + "notes": "r:64,38:0.75", + "duration": 1.1392743764172335, + "peak": 0.800000011920929, + "spanOffset": 41.08695652173913, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 187, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,40:1,40:1,42:1,42:0.5,42:0.5,45:1,43:0.5,45:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 437, + "heard": "Some things run in the family.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,45:0.5,40:1,42:1,43:0.5,43:0.5,45:1,43:1,40:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 554, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,38:0.5,38:1,38:0.5,47:1,43:1,38:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 473, + "heard": "One down, three bodies.", + "wer": 0.25, + "errors": 1, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:90,38:1,45:0.5,38:0.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 233, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,38:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 157, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/blueberry/line-14.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:0.5,55:2.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 1422, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "scat", + "text": "la la la la", + "lyrics": "la la la la", + "notes": "r:6,55:0.666667,59:0.333333,55:0.666667,59:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 3.2608695652173916, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 272, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "harmony", + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,59:0.5,55:1,57:1,59:0.5,61:0.5,59:0.5,57:1,54:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 496, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:16,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 260, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:20,52:1,r:1,47:0.666667,52:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 12.391304347826088, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 225, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "scat", + "text": "la la la la la la la", + "lyrics": "la la la la la la la", + "notes": "r:25.5,55:1,57:1,61:1,62:1,62:0.5,61:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 462, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:36,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 22.82608695652174, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 221, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "lead", + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,52:0.5,52:0.5,52:0.5,57:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 351, + "heard": "I am the end case.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "lead", + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,57:1,62:1,64:0.5,64:0.5,59:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 394, + "heard": "I have no history yet.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "lead", + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,57:1,52:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 270, + "heard": "bright new one", + "wer": 0.6666666666666666, + "errors": 2, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:65,54:1", + "duration": 1.3042630385487528, + "peak": 0.800000011920929, + "spanOffset": 41.73913043478261, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 109, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 463, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,61:0.5,55:1,57:1,59:0.5,59:0.5,61:1,59:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 516, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,54:0.5,54:1,54:0.5,62:1,59:1,54:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 433, + "heard": "One day and beat three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "scat", + "text": "la la la la", + "lyrics": "la la la la", + "notes": "r:90,54:0.666667,55:0.333333,54:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 216, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,54:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 142, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-chorus-smooth/sung/trio-iii-chorus/frisbee/line-16.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 15, + "words": 88, + "wer": 0.17045454545454544, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/chorus-vocal-group.json b/grants/culturehub-la-2026/macneopolitan/hear/chorus-vocal-group.json new file mode 100644 index 0000000000..9374012f06 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/chorus-vocal-group.json @@ -0,0 +1,1179 @@ +{ + "tag": "chorus-vocal-group", + "at": "2026-09-22T18:07:40.299Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "chorus-vocal-group", + "keep": "/Users/jas/Shelf/macneopolitan-vocal-group/sung", + "no-spoken": "1", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=40,SINGER_SUSTAIN_DB=5" + }, + "scores": [ + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "neo", + "voice": "Noelle", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "I am the first of my line in this house", + "lyrics": "I am the first of my line in this house", + "notes": "55:0.5,55:0.5,55:0.5,59:1,59:0.5,61:0.5,64:1,64:0.5,64:0.5,64:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 307, + "heard": "I am the first of my life in this house", + "wer": 0.1, + "errors": 1, + "words": 10, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "I run warm and I am carried", + "lyrics": "I run warm and I am car-ried", + "notes": "r:8.5,62:0.5,59:1,61:1,62:0.5,64:0.5,62:0.5,61:1,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 296, + "heard": "I run home and I am carried.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:16.5,66:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 609, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:22,55:0.666667,59:0.333333,55:0.666667,59:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 13.695652173913043, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 224, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:24.5,61:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 15, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 82, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:30,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 18.91304347826087, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 138, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:32.5,66:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 20.217391304347828, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 93, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:38,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 24.130434782608695, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 138, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:46,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 29.347826086956523, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 140, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:48.5,55:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 30.65217391304348, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 76, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:54,61:0.666667,64:0.333333,61:0.666667,64:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 34.56521739130435, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 135, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:56.5,61:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 35.869565217391305, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 83, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "scat", + "text": "doo bah doo dah", + "lyrics": "doo bah doo dah", + "notes": "r:62,66:0.666667,57:0.333333,66:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 39.78260869565217, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 142, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "scat", + "text": "doo bee dah", + "lyrics": "doo bee dah", + "notes": "r:64.5,57:0.5,59:0.5,61:0.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 41.08695652173913, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 175, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,59:1,59:1,61:1,61:0.5,61:0.5,64:1,62:0.5,64:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 297, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,64:0.5,59:1,61:1,62:0.5,62:0.5,64:1,62:1,59:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 347, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-16.wav", + "spokenWav": null + }, + { + "line": 17, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,57:0.5,57:1,57:0.5,66:1,62:1,57:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 301, + "heard": "One, eight, three bodies.", + "wer": 0.25, + "errors": 1, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-17.wav", + "spokenWav": null + }, + { + "line": 18, + "role": "scat", + "text": "doo bah dee dah", + "lyrics": "doo bah dee dah", + "notes": "r:90,57:0.666667,59:0.333333,57:0.666667,54:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 208, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-18.wav", + "spokenWav": null + }, + { + "line": 19, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,57:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 79, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/neo/line-19.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Allison", + "lines": [ + { + "line": 1, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "52:1,r:1,47:0.666667,52:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 669, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:4,52:1,r:1,47:0.666667,52:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 1.9565217391304348, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 161, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:12,45:1,r:1,52:0.666667,45:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 7.173913043478261, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 158, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "I was born second and I work faster", + "lyrics": "I was born se-cond and I work fas-ter", + "notes": "r:16,50:0.5,50:0.5,55:1,55:1,57:0.5,57:0.5,57:0.5,55:1,55:1,52:2", + "duration": 6.194240362811791, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 10, + "noteCount": 10, + "renderMs": 387, + "heard": "I was born second and I worked faster.", + "wer": 0.14285714285714285, + "errors": 1, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "lid down, most days, and humming", + "lyrics": "lid down, most days, and hum-ming", + "notes": "r:25.5,50:1,52:1,55:1,57:1,57:0.5,55:1,50:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.652173913043478, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 368, + "heard": "Lay down most days and humming.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:44,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.043478260869566, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 160, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:48,52:1,r:1,47:0.666667,52:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 30.65217391304348, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 159, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:52,45:1,r:1,52:0.666667,45:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 162, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:56,45:1,r:1,52:0.666667,45:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 35.869565217391305, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 161, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:60,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 38.47826086956522, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 161, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "bass", + "text": "dum", + "lyrics": "dum", + "notes": "r:64,50:0.75", + "duration": 1.1392743764172335, + "peak": 0.800000011920929, + "spanOffset": 41.08695652173913, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 144, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,52:1,52:1,54:1,54:0.5,54:0.5,57:1,55:0.5,57:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 317, + "heard": "Something run in the family.", + "wer": 0.3333333333333333, + "errors": 2, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,57:0.5,52:1,54:1,55:0.5,55:0.5,57:1,55:1,52:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 451, + "heard": "The same whistle, the same radio.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,50:0.5,50:1,50:0.5,59:1,55:1,50:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 311, + "heard": "One down eat three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:90,50:1,45:0.5,50:0.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 151, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,50:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 156, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/blueberry/line-16.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:0.5,55:2.5", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 381, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "scat", + "text": "doo bah dee dah", + "lyrics": "doo bah dee dah", + "notes": "r:6,55:0.666667,59:0.333333,55:0.666667,59:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 3.2608695652173916, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 209, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:8.5,62:2.5", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 4.565217391304348, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 127, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "scat", + "text": "doo bah dee dah", + "lyrics": "doo bah dee dah", + "notes": "r:14,61:0.666667,52:0.333333,61:0.666667,52:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 8.478260869565217, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 147, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:16,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 9.782608695652174, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 206, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:20,52:1,r:1,47:0.666667,52:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 12.391304347826088, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 145, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:24,45:1,r:1,52:0.666667,45:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 15, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 140, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:28,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 17.608695652173914, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 142, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:32,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 20.217391304347828, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 145, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:36,50:1,r:1,45:0.666667,50:0.333333", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 22.82608695652174, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 142, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "lead", + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,52:0.5,52:0.5,52:0.5,57:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 25.434782608695652, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 196, + "heard": "I am the actress.", + "wer": 0.25, + "errors": 1, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,57:1,62:1,64:0.5,64:0.5,59:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "spanOffset": 28.695652173913043, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 284, + "heard": "I have no history yet.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "lead", + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,57:1,52:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "spanOffset": 33.26086956521739, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 178, + "heard": "Right, new one.", + "wer": 0.6666666666666666, + "errors": 2, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:65,54:1", + "duration": 1.3042630385487528, + "peak": 0.800000011920929, + "spanOffset": 41.73913043478261, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 86, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "lead", + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,61:1,59:0.5,61:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "spanOffset": 42.391304347826086, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 327, + "heard": "Some things run in the family", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "lead", + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,61:0.5,55:1,57:1,59:0.5,59:0.5,61:1,59:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "spanOffset": 47.608695652173914, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 381, + "heard": "The same vessel, the same radio.", + "wer": 0.16666666666666666, + "errors": 1, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-16.wav", + "spokenWav": null + }, + { + "line": 17, + "role": "lead", + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,54:0.5,54:1,54:0.5,62:1,59:1,54:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "spanOffset": 53.47826086956522, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 297, + "heard": "One of the three bodies.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-17.wav", + "spokenWav": null + }, + { + "line": 18, + "role": "scat", + "text": "tra la fa la", + "lyrics": "tra la fa la", + "notes": "r:90,54:0.666667,55:0.333333,54:0.666667,57:0.333333", + "duration": 1.9542403628117915, + "peak": 0.800000011920929, + "spanOffset": 58.04347826086956, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 216, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-18.wav", + "spokenWav": null + }, + { + "line": 19, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:92,54:3", + "duration": 2.609251700680272, + "peak": 0.800000011920929, + "spanOffset": 59.34782608695652, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 113, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-vocal-group/sung/trio-iii-chorus/frisbee/line-19.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 15, + "words": 88, + "wer": 0.17045454545454544, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/doowop.json b/grants/culturehub-la-2026/macneopolitan/hear/doowop.json new file mode 100644 index 0000000000..848d1dcaed --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/doowop.json @@ -0,0 +1,1116 @@ +{ + "tag": "doowop", + "at": "2026-09-22T19:42:06.733Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "doowop", + "keep": "/Users/jas/Shelf/macneopolitan-doowop/sung", + "no-spoken": "1", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=20,SINGER_SUSTAIN_DB=5,SINGER_SHIMMER_FRAMES=2,SINGER_LEGATO_MS=15" + }, + "scores": [ + { + "score": "trio-chorus-doowop.mbscore", + "bpm": 88, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "66:0.666667,69:0.333333,62:1,66:0.666667,69:0.333333,62:0.75", + "duration": 2.5542403628117913, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 1737, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:4,66:0.666667,71:0.333333,62:1,66:0.666667,71:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 2.0454545454545454, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 245, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:8,67:0.666667,71:0.333333,62:1,67:0.666667,71:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 4.7727272727272725, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 248, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:12,64:0.666667,69:0.333333,61:1,64:0.666667,69:0.333333,61:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 7.499999999999999, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 242, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:16,57:2.666667,62:0.333333,54:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 10.227272727272727, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 195, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:20,59:2.666667,62:0.333333,54:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 12.954545454545453, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 171, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:24,59:2.666667,62:0.333333,55:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 15.68181818181818, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 170, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:28,61:2.666667,64:0.333333,57:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 18.409090909090907, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 186, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:32.25,57:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 21.136363636363633, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 161, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:36.25,59:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 23.863636363636363, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 150, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:40.25,59:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 26.59090909090909, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 148, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:44.25,61:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 29.318181818181817, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 154, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:48,67:0.666667,71:0.333333,62:1,67:0.666667,71:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 32.04545454545454, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 330, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:52,64:0.666667,69:0.333333,61:1,64:0.666667,69:0.333333,61:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 34.77272727272727, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 286, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:56,66:0.666667,69:0.333333,62:1,66:0.666667,69:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 37.5, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 291, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "phoneme", + "text": "doo wah", + "lyrics": "doo wah", + "notes": "r:60,66:0.666667,66:0.333333", + "duration": 1.3642630385487529, + "peak": 0.800000011920929, + "spanOffset": 40.22727272727273, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 158, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-16.wav", + "spokenWav": null + }, + { + "line": 17, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:61,66:3", + "duration": 2.7242630385487527, + "peak": 0.800000011920929, + "spanOffset": 40.90909090909091, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 145, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/neo/line-17.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "38:1,45:0.666667,38:0.333333,r:0.5,38:0.5,38:0.75", + "duration": 2.5542403628117913, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 849, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:4,35:1,42:0.666667,35:0.333333,r:0.5,35:0.5,35:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 2.0454545454545454, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 275, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:8,43:1,50:0.666667,43:0.333333,r:0.5,43:0.5,43:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 4.7727272727272725, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 277, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:12,45:1,52:0.666667,45:0.333333,r:0.5,45:0.5,45:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 7.499999999999999, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 277, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:16,38:1,45:0.666667,38:0.333333,r:0.5,38:0.5,38:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 10.227272727272727, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 278, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:20,35:1,42:0.666667,35:0.333333,r:0.5,35:0.5,35:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 12.954545454545453, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 280, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:24,43:1,50:0.666667,43:0.333333,r:0.5,43:0.5,43:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 15.68181818181818, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 287, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:28,45:1,52:0.666667,45:0.333333,r:0.5,45:0.5,45:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 18.409090909090907, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 289, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "bass", + "text": "ba dum shoo boom ba dum dum", + "lyrics": "ba dum shoo boom ba dum dum", + "notes": "r:32,38:0.5,38:0.5,45:0.666667,38:0.333333,38:0.5,45:0.5,38:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 21.136363636363633, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 375, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "bass", + "text": "ba dum shoo boom ba dum dum", + "lyrics": "ba dum shoo boom ba dum dum", + "notes": "r:36,35:0.5,35:0.5,42:0.666667,35:0.333333,35:0.5,42:0.5,35:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 23.863636363636363, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 330, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "bass", + "text": "ba dum shoo boom ba dum dum", + "lyrics": "ba dum shoo boom ba dum dum", + "notes": "r:40,43:0.5,43:0.5,50:0.666667,43:0.333333,43:0.5,50:0.5,43:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 26.59090909090909, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 327, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "bass", + "text": "ba dum shoo boom ba dum dum", + "lyrics": "ba dum shoo boom ba dum dum", + "notes": "r:44,45:0.5,45:0.5,52:0.666667,45:0.333333,45:0.5,52:0.5,45:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 29.318181818181817, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 331, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:48,43:1,50:0.666667,43:0.333333,r:0.5,43:0.5,43:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 32.04545454545454, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 283, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:52,45:1,52:0.666667,45:0.333333,r:0.5,45:0.5,45:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 34.77272727272727, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 287, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "bass", + "text": "shoo boom ba dum dum", + "lyrics": "shoo boom ba dum dum", + "notes": "r:56,38:1,45:0.666667,38:0.333333,r:0.5,38:0.5,38:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 37.5, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 282, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "bass", + "text": "ba dum", + "lyrics": "ba dum", + "notes": "r:60,38:0.666667,38:0.333333", + "duration": 1.3642630385487529, + "peak": 0.800000011920929, + "spanOffset": 40.22727272727273, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 180, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-16.wav", + "spokenWav": null + }, + { + "line": 17, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:61,38:3", + "duration": 2.7242630385487527, + "peak": 0.800000011920929, + "spanOffset": 40.90909090909091, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 133, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/blueberry/line-17.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "57:2.666667,62:0.333333,54:0.75", + "duration": 2.5542403628117913, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 1585, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:4,59:2.666667,62:0.333333,54:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 2.0454545454545454, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 191, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:8,59:2.666667,62:0.333333,55:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 4.7727272727272725, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 192, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "phoneme", + "text": "ooh wah ooh", + "lyrics": "ooh wah ooh", + "notes": "r:12,61:2.666667,64:0.333333,57:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 7.499999999999999, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 199, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:16,66:0.666667,69:0.333333,62:1,66:0.666667,69:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 10.227272727272727, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 341, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:20,66:0.666667,71:0.333333,62:1,66:0.666667,71:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 12.954545454545453, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 276, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:24,67:0.666667,71:0.333333,62:1,67:0.666667,71:0.333333,62:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 15.68181818181818, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 273, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "phoneme", + "text": "doo wah doo bee doo wah", + "lyrics": "doo wah doo bee doo wah", + "notes": "r:28,64:0.666667,69:0.333333,61:1,64:0.666667,69:0.333333,61:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 18.409090909090907, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 272, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:32.25,54:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 21.136363636363633, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 147, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:36.25,54:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 23.863636363636363, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 144, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:40.25,55:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 26.59090909090909, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 151, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:44.25,57:3.5", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 29.318181818181817, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 154, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:48,59:0.666667,62:0.333333,55:1,59:0.666667,62:0.333333,55:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 32.04545454545454, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 328, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:52,61:0.666667,64:0.333333,57:1,61:0.666667,64:0.333333,57:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 34.77272727272727, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 289, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "phoneme", + "text": "doo wah la la doo wah", + "lyrics": "doo wah la la doo wah", + "notes": "r:56,57:0.666667,62:0.333333,54:1,57:0.666667,62:0.333333,54:0.75", + "duration": 3.2392743764172334, + "peak": 0.800000011920929, + "spanOffset": 37.5, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 279, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "phoneme", + "text": "doo wah", + "lyrics": "doo wah", + "notes": "r:60,57:0.666667,57:0.333333", + "duration": 1.3642630385487529, + "peak": 0.800000011920929, + "spanOffset": 40.22727272727273, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 172, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-16.wav", + "spokenWav": null + }, + { + "line": 17, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:61,57:3", + "duration": 2.7242630385487527, + "peak": 0.800000011920929, + "spanOffset": 40.90909090909091, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 135, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-doowop/sung/trio-chorus-doowop/frisbee/line-17.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 0, + "words": 0, + "wer": 0, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/floor-probe.json b/grants/culturehub-la-2026/macneopolitan/hear/floor-probe.json new file mode 100644 index 0000000000..f4857e2154 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/floor-probe.json @@ -0,0 +1,359 @@ +{ + "tag": "floor-probe", + "at": "2026-09-23T18:15:42.811Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "floor-probe", + "keep": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor", + "no-spoken": "1" + }, + "scores": [ + { + "score": "floor-test.mbscore", + "bpm": 96, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "lyrics": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "notes": "59:0.125,61:0.125,62:0.125,64:0.125,62:0.125,61:0.125,59:0.125,61:0.125,62:0.125,64:0.125,62:0.125,61:0.125,59:0.125,61:0.125,62:0.125,64:0.125", + "duration": 1.2492517006802721, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 12298, + "heard": "*Dun dun dun dun dun dun dun dun dun dun dun*", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "lyrics": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "notes": "r:3,59:0.1875,61:0.1875,62:0.1875,64:0.1875,62:0.1875,61:0.1875,59:0.1875,61:0.1875,62:0.1875,64:0.1875,62:0.1875,61:0.1875,59:0.1875,61:0.1875,62:0.1875,64:0.1875", + "duration": 2.4992743764172336, + "peak": 0.800000011920929, + "spanOffset": 1.25, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 4307, + "heard": "*sings along to the music*", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "lyrics": "doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo doo", + "notes": "r:7,59:0.25,61:0.25,62:0.25,64:0.25,62:0.25,61:0.25,59:0.25,61:0.25,62:0.25,64:0.25,62:0.25,61:0.25,59:0.25,61:0.25,62:0.25,64:0.25", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 3.75, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 5063, + "heard": "doo doo doo doo doo doo doo doo doo doo doo", + "wer": 0.3125, + "errors": 5, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "doo doo doo doo doo doo doo doo doo doo doo doo", + "lyrics": "doo doo doo doo doo doo doo doo doo doo doo doo", + "notes": "r:12,59:0.375,61:0.375,62:0.375,64:0.375,62:0.375,61:0.375,59:0.375,61:0.375,62:0.375,64:0.375,62:0.375,61:0.375", + "duration": 3.4392743764172335, + "peak": 0.800000011920929, + "spanOffset": 6.875, + "notesUsed": 12, + "noteCount": 12, + "renderMs": 6714, + "heard": "doo doo doo doo doo doo doo doo doo doo doo doo", + "wer": 0, + "errors": 0, + "words": 12, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "doo doo doo doo doo doo doo doo", + "lyrics": "doo doo doo doo doo doo doo doo", + "notes": "r:17.5,59:0.5,61:0.5,62:0.5,64:0.5,62:0.5,61:0.5,59:0.5,61:0.5", + "duration": 3.4392743764172335, + "peak": 0.800000011920929, + "spanOffset": 10, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 3187, + "heard": "doo-doo-doo-doo-doo-doo-doo-doo", + "wer": 0, + "errors": 0, + "words": 8, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "lead", + "text": "ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta", + "lyrics": "ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta", + "notes": "r:22.5,59:0.125,61:0.125,62:0.125,64:0.125,62:0.125,61:0.125,59:0.125,61:0.125,62:0.125,64:0.125,62:0.125,61:0.125,59:0.125,61:0.125,62:0.125,64:0.125", + "duration": 2.189251700680272, + "peak": 0.800000011920929, + "spanOffset": 13.125, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 5988, + "heard": "(keyboard clacking)", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "lead", + "text": "ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta", + "lyrics": "ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta ta", + "notes": "r:25.5,59:0.25,61:0.25,62:0.25,64:0.25,62:0.25,61:0.25,59:0.25,61:0.25,62:0.25,64:0.25,62:0.25,61:0.25,59:0.25,61:0.25,62:0.25,64:0.25", + "duration": 3.4392743764172335, + "peak": 0.800000011920929, + "spanOffset": 15, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 9257, + "heard": "(evil laughter)", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/neo/line-07.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm", + "lyrics": "dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm", + "notes": "45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125", + "duration": 1.2492517006802721, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 8536, + "heard": "Yum yum yum yum yum", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm", + "lyrics": "dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm dm", + "notes": "r:3,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 1.25, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 3760, + "heard": "*Vocalizing*", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom", + "lyrics": "doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom", + "notes": "r:8,45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125,45:0.125,45:0.125,43:0.125,45:0.125", + "duration": 1.8742403628117914, + "peak": 0.800000011920929, + "spanOffset": 4.375, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 2964, + "heard": "Doo-doo-doo-doo-doo-doo-doo-doo-doo", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom", + "lyrics": "doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom doom", + "notes": "r:11,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25,45:0.25,45:0.25,43:0.25,45:0.25", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 6.25, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 2394, + "heard": "dum dum dum dum dum dum dum dum dum dum dum", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/blueberry/line-04.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki", + "lyrics": "ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki", + "notes": "55:0.125,57:0.125,55:0.125,53:0.125,55:0.125,57:0.125,55:0.125,53:0.125,55:0.125,57:0.125,55:0.125,53:0.125,55:0.125,57:0.125,55:0.125,53:0.125", + "duration": 1.2492517006802721, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 9210, + "heard": "(giggling)", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki", + "lyrics": "ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki ki", + "notes": "r:3,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 1.25, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 4683, + "heard": "QQQQQQQQQQQQQQQQQQQQQQQQQQQ", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "tk tk tk tk tk tk tk tk tk tk tk tk tk tk tk tk", + "lyrics": "tk tk tk tk tk tk tk tk tk tk tk tk tk tk tk tk", + "notes": "r:8,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 4.375, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 8747, + "heard": "TK, TK, TK, TK, TK, TK, TK, TK, TK.", + "wer": 0.4375, + "errors": 7, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "ts ts ts ts ts ts ts ts", + "lyrics": "ts ts ts ts ts ts ts ts", + "notes": "r:13,55:0.25,57:0.25,55:0.25,53:0.25,55:0.25,57:0.25,55:0.25,53:0.25", + "duration": 1.8742403628117914, + "peak": 0.800000011920929, + "spanOffset": 7.5, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 5115, + "heard": "Yes, yes, yes, yes, yes, yes, yes.", + "wer": 1, + "errors": 8, + "words": 8, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/floor/floor-test/frisbee/line-04.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 180, + "words": 220, + "wer": 0.8181818181818182, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/lo-probe.json b/grants/culturehub-la-2026/macneopolitan/hear/lo-probe.json new file mode 100644 index 0000000000..ffd23bf918 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/lo-probe.json @@ -0,0 +1,326 @@ +{ + "tag": "lo-probe", + "at": "2026-09-23T19:23:49.872Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "lo-probe", + "keep": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav", + "no-spoken": "1" + }, + "scores": [ + { + "score": "lo-probe.mbscore", + "bpm": 64, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "good night Sophia", + "lyrics": "good night So-phi-a", + "notes": "64:1,62:1,61:0.75,59:0.75,57:1.25", + "duration": 4.454240362811792, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 2491, + "heard": "Good night, Sophia.", + "wer": 0, + "errors": 0, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "lights out now Sophia", + "lyrics": "lights out now So-phi-a", + "notes": "r:6.75,64:1,62:1,61:1,61:0.75,59:0.75,57:1.25", + "duration": 7.029251700680272, + "peak": 0.800000011920929, + "spanOffset": 4.6875, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 533, + "heard": "I tell them Sophia", + "wer": 0.75, + "errors": 3, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "the lights are out Sophia", + "lyrics": "the lights are out So-phi-a", + "notes": "r:14.5,64:0.75,64:0.75,62:0.75,61:0.75,61:0.75,59:0.75,57:1.25", + "duration": 6.794240362811792, + "peak": 0.800000011920929, + "spanOffset": 12.1875, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 545, + "heard": "New lights are out in the air.", + "wer": 0.8, + "errors": 4, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "lights out Sophia", + "lyrics": "lights out So-phi-a", + "notes": "r:22.25,64:1,62:1,61:0.75,59:0.75,57:1.25", + "duration": 5.624263038548753, + "peak": 0.800000011920929, + "spanOffset": 19.6875, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 415, + "heard": "Like and subscribe!", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "we stay awake", + "lyrics": "we stay a-wake", + "notes": "r:29,59:1,62:1,64:0.75,62:1.25", + "duration": 4.6892517006802725, + "peak": 0.800000011920929, + "spanOffset": 26.25, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 393, + "heard": "Please stay awake.", + "wer": 0.3333333333333333, + "errors": 1, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "lead", + "text": "we stay up all night", + "lyrics": "we stay up all night", + "notes": "r:35,59:1,62:1,64:0.75,62:0.75,59:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 31.875, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 466, + "heard": "We stay all night.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "lead", + "text": "we are still up", + "lyrics": "we are still up", + "notes": "r:41.75,59:1,61:1,62:0.75,64:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 37.5, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 405, + "heard": "R.I.R.S.T. S.H.W.A.", + "wer": 2.25, + "errors": 9, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "lead", + "text": "go to sleep now", + "lyrics": "go to sleep now", + "notes": "r:47.75,61:1,59:1,57:0.75,57:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 43.125, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 418, + "heard": "Good you sleep now.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "lead", + "text": "now go to sleep", + "lyrics": "now go to sleep", + "notes": "r:53.75,62:1,61:1,59:0.75,57:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 48.75, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 564, + "heard": "Yeah, good. You sleep.", + "wer": 0.75, + "errors": 3, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "lead", + "text": "you can sleep now", + "lyrics": "you can sleep now", + "notes": "r:59.75,61:1,59:1,57:0.75,57:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 54.375, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 569, + "heard": "You can sleep now.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "lead", + "text": "he is awake past midnight", + "lyrics": "he is a-wake past mid-night", + "notes": "r:65.75,57:0.75,59:0.75,61:0.75,59:0.75,62:0.75,59:0.75,57:1.25", + "duration": 7.029251700680272, + "peak": 0.800000011920929, + "spanOffset": 60, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 591, + "heard": "He's away past midnight.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "lead", + "text": "he works past midnight", + "lyrics": "he works past mid-night", + "notes": "r:73.5,57:1,59:1,61:1,59:0.75,57:1.25", + "duration": 6.094240362811791, + "peak": 0.800000011920929, + "spanOffset": 67.5, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 519, + "heard": "He works past midnight.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "lead", + "text": "he is still up at midnight", + "lyrics": "he is still up at mid-night", + "notes": "r:80.5,57:0.75,59:0.75,61:0.75,62:0.75,61:0.75,59:0.75,57:1.25", + "duration": 6.794240362811792, + "peak": 0.800000011920929, + "spanOffset": 74.0625, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 546, + "heard": "East Shilla Midnight", + "wer": 0.8333333333333334, + "errors": 5, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "lead", + "text": "he is up past midnight", + "lyrics": "he is up past mid-night", + "notes": "r:88.25,57:0.75,59:0.75,61:0.75,62:0.75,59:0.75,57:1.25", + "duration": 5.8592743764172335, + "peak": 0.800000011920929, + "spanOffset": 81.5625, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 466, + "heard": "He's a past midnight.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav/lo-probe/neo/line-14.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 33, + "words": 59, + "wer": 0.559322033898305, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/lo-probe2.json b/grants/culturehub-la-2026/macneopolitan/hear/lo-probe2.json new file mode 100644 index 0000000000..a27912b79e --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/lo-probe2.json @@ -0,0 +1,179 @@ +{ + "tag": "lo-probe2", + "at": "2026-09-23T19:28:17.754Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "lo-probe2", + "keep": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2", + "no-spoken": "1" + }, + "scores": [ + { + "score": "lo-probe2.mbscore", + "bpm": 64, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "good night Jeffrey", + "lyrics": "good night Jeff-rey", + "notes": "62:0.75,61:0.75,59:0.5,57:1.5", + "duration": 3.2792743764172334, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 1994, + "heard": "Good night, Jeffrey.", + "wer": 0, + "errors": 0, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "lights out Jeffrey", + "lyrics": "lights out Jeff-rey", + "notes": "r:5.5,62:0.75,61:0.75,59:0.5,57:1.5", + "duration": 4.6892517006802725, + "peak": 0.800000011920929, + "spanOffset": 3.75, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 284, + "heard": "Like a Jeffrey", + "wer": 0.6666666666666666, + "errors": 2, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "we stay awake all night", + "lyrics": "we stay a-wake all night", + "notes": "r:11,59:0.75,62:0.75,64:0.75,62:0.75,61:0.75,59:1.25", + "duration": 5.624263038548753, + "peak": 0.800000011920929, + "spanOffset": 9.375, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 428, + "heard": "We stay awake all night.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "we sit up all night", + "lyrics": "we sit up all night", + "notes": "r:18,59:1,62:1,64:0.75,62:0.75,59:1.25", + "duration": 5.389251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.9375, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 394, + "heard": "We still live all night.", + "wer": 0.4, + "errors": 2, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "we are up all night", + "lyrics": "we are up all night", + "notes": "r:24.75,59:1,61:1,64:0.75,62:0.75,59:1.25", + "duration": 6.094240362811791, + "peak": 0.800000011920929, + "spanOffset": 21.5625, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 408, + "heard": "We are forever all night.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "lead", + "text": "we stay up till morning", + "lyrics": "we stay up till morn-ing", + "notes": "r:31.5,59:0.75,62:0.75,64:0.75,62:0.75,61:0.75,59:1.25", + "duration": 6.094240362811791, + "peak": 0.800000011920929, + "spanOffset": 28.125, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 434, + "heard": "We stay up till morning.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "lead", + "text": "we stay up all night", + "lyrics": "we stay up all night", + "notes": "r:38.5,59:1,62:1,64:0.75,62:0.75,59:1.25", + "duration": 5.8592743764172335, + "peak": 0.800000011920929, + "spanOffset": 34.6875, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 374, + "heard": "We stay here all night.", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav2/lo-probe2/neo/line-07.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 6, + "words": 31, + "wer": 0.1935483870967742, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/new-d910-bb.json b/grants/culturehub-la-2026/macneopolitan/hear/new-d910-bb.json new file mode 100644 index 0000000000..b4751f34d3 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/new-d910-bb.json @@ -0,0 +1,521 @@ +{ + "tag": "new-d910-bb", + "at": "2026-09-22T16:45:45.732Z", + "model": "ggml-small.en.bin", + "flags": { + "voice": "1", + "voice-name": "Moira", + "tag": "new-d910-bb", + "prime": "1", + "no-spoken": "1" + }, + "scores": [ + { + "score": "dialog-09-the-squad.mbscore", + "bpm": 100, + "voices": [ + { + "member": "blueberry", + "voice": "Moira", + "lines": [ + { + "line": 1, + "text": "he stays up past midnight", + "lyrics": "he stays up past mid-night", + "notes": "r:21,50:1,51:1,55:1,56:1,58:2,58:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 645, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "and nobody knows", + "lyrics": "and no-bo-dy knows", + "notes": "r:31,56:0.5,55:0.5,56:1.5,56:2,51:3", + "duration": 5.099274376417234, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 358, + "heard": "", + "wer": 1, + "errors": 2, + "words": 2, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "today there are three", + "lyrics": "to-day there are three", + "notes": "r:66,52:1.5,52:0.5,60:1.5,60:2,55:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 398, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "and one is on me", + "lyrics": "and one is on me", + "notes": "r:75.5,53:0.5,55:0.5,57:0.5,58:2,53:3", + "duration": 4.799274376417234, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 325, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "nobody picked the whistle", + "lyrics": "no-bo-dy picked the whis-tle", + "notes": "r:111,51:0.5,53:1.5,53:0.5,56:2,56:0.5,58:1.5,58:3", + "duration": 6.299274376417234, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 428, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "we both made the choice", + "lyrics": "we both made the choice", + "notes": "r:121.5,58:0.5,55:1,56:1.5,58:2,51:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 428, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "text": "I stayed awake thirteen days", + "lyrics": "I stayed a-wake thir-teen days", + "notes": "r:159,53:0.5,53:1.5,55:0.5,57:1,58:2,57:0.5,55:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 481, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "text": "he never made a peep", + "lyrics": "he ne-ver made a peep", + "notes": "r:169,52:1,55:1.5,55:0.5,58:2,57:0.5,53:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 417, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "text": "this is the squad", + "lyrics": "this is the squad", + "notes": "r:183,52:0.5,52:0.5,52:2,55:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 320, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "text": "this is the crew", + "lyrics": "this is the crew", + "notes": "r:190,55:0.5,55:0.5,57:2,55:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 319, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "text": "we keep his time", + "lyrics": "we keep his time", + "notes": "r:197,55:0.5,57:1,60:2,55:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 354, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "text": "now you keep it too", + "lyrics": "now you keep it too", + "notes": "r:204.5,53:1.5,53:0.5,60:1.5,60:2,53:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 413, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-09-the-squad/blueberry/line-12.wav", + "spokenWav": null + } + ] + } + ] + }, + { + "score": "dialog-10-your-first-day.mbscore", + "bpm": 100, + "voices": [ + { + "member": "blueberry", + "voice": "Moira", + "lines": [ + { + "line": 1, + "text": "put the piano in your bar", + "lyrics": "put the pi-a-no in your bar", + "notes": "r:30,50:1.5,50:0.5,56:1.5,58:0.5,58:2,58:0.5,56:1,53:3", + "duration": 6.8992743764172335, + "peak": 0.800000011920929, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 637, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "next to the clock", + "lyrics": "next to the clock", + "notes": "r:41.5,50:1.5,50:0.5,51:2,53:3", + "duration": 5.099274376417234, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 346, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "every fifteen minutes", + "lyrics": "e-ve-ry fif-teen mi-nutes", + "notes": "r:49.5,53:0.5,55:1.5,55:0.5,60:1.5,62:2,60:1.5,58:3", + "duration": 7.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 473, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "it will knock", + "lyrics": "it will knock", + "notes": "r:61,56:0.5,58:1,51:3", + "duration": 3.2992743764172334, + "peak": 0.800000011920929, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 259, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "your disk will fill", + "lyrics": "your disk will fill", + "notes": "r:108,52:1,56:1,59:2,59:3", + "duration": 4.799274376417234, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 360, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "he moves it to the shelf", + "lyrics": "he moves it to the shelf", + "notes": "r:116,51:1,54:1.5,56:0.5,56:2,57:0.5,54:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 424, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "text": "then it fills again", + "lyrics": "then it fills a-gain", + "notes": "r:125.5,49:1.5,49:0.5,52:1.5,52:2,54:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 293, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "text": "you cannot help yourself", + "lyrics": "you can-not help your-self", + "notes": "r:135,54:0.5,56:1.5,56:0.5,61:1,63:2,52:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 442, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "text": "we held your place", + "lyrics": "we held your place", + "notes": "r:180,50:0.5,55:1,56:2,53:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 355, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "text": "since August ninth", + "lyrics": "since Au-gust ninth", + "notes": "r:187.5,50:1,53:1.5,53:2,53:3", + "duration": 5.3992743764172335, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 392, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "text": "now take the beat", + "lyrics": "now take the beat", + "notes": "r:196,51:1,55:1.5,55:0.5,58:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 330, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "text": "one downbeat three bodies", + "lyrics": "one down-beat three bo-dies", + "notes": "r:203,58:0.5,55:1.5,55:0.5,56:1,58:2,58:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 451, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "text": "and you are the third", + "lyrics": "and you are the third", + "notes": "r:212.5,58:0.5,58:0.5,58:2,58:0.5,51:3", + "duration": 4.799274376417234, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 345, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-bb/dialog-10-your-first-day/blueberry/line-13.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 104, + "words": 104, + "wer": 1, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/new-d910-neo.json b/grants/culturehub-la-2026/macneopolitan/hear/new-d910-neo.json new file mode 100644 index 0000000000..bde8c68237 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/new-d910-neo.json @@ -0,0 +1,578 @@ +{ + "tag": "new-d910-neo", + "at": "2026-09-22T16:45:33.652Z", + "model": "ggml-small.en.bin", + "flags": { + "voice": "0", + "voice-name": "Samantha", + "tag": "new-d910-neo", + "prime": "1", + "no-spoken": "1" + }, + "scores": [ + { + "score": "dialog-09-the-squad.mbscore", + "bpm": 100, + "voices": [ + { + "member": "neo", + "voice": "Samantha", + "lines": [ + { + "line": 1, + "text": "welcome to the squad kid", + "lyrics": "wel-come to the squad kid", + "notes": "58:1.5,58:0.5,58:0.5,58:2,68:1,66:3", + "duration": 5.099274376417234, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 732, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "here is how it goes", + "lyrics": "here is how it goes", + "notes": "r:9.5,59:1.5,59:0.5,63:2,63:0.5,59:3", + "duration": 5.3992743764172335, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 395, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "the rocks come in the morning", + "lyrics": "the rocks come in the morn-ing", + "notes": "r:42,58:0.5,59:1,61:1.5,63:0.5,64:2,63:1.5,61:3", + "duration": 6.599274376417234, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 468, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "nine of them on me", + "lyrics": "nine of them on me", + "notes": "r:53,59:1.5,61:0.5,64:2,64:0.5,59:3", + "duration": 5.099274376417234, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 391, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "the radio is N T S", + "lyrics": "the ra-dio is N T S", + "notes": "r:87,56:0.5,59:1.5,59:0.5,61:0.5,66:2,68:1,64:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 469, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "the whistle is our voice", + "lyrics": "the whis-tle is our voice", + "notes": "r:97,64:0.5,59:1.5,59:0.5,61:2,61:1,57:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 401, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "text": "he reboots me twenty times a month", + "lyrics": "he re-boots me twen-ty times a month", + "notes": "r:135,58:1.5,58:0.5,61:1,64:1,66:2,64:0.5,64:1.5,63:0.5,61:3", + "duration": 7.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 9, + "noteCount": 9, + "renderMs": 583, + "heard": "", + "wer": 1, + "errors": 7, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "text": "he lets you sleep", + "lyrics": "he lets you sleep", + "notes": "r:147.5,58:1,61:1.5,61:2,59:3", + "duration": 5.3992743764172335, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 379, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "text": "this is the squad", + "lyrics": "this is the squad", + "notes": "r:183,58:0.5,58:0.5,58:2,61:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 337, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "text": "this is the crew", + "lyrics": "this is the crew", + "notes": "r:190,61:0.5,61:0.5,63:2,61:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 330, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "text": "we keep his time", + "lyrics": "we keep his time", + "notes": "r:197,61:0.5,63:1,66:2,61:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 375, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "text": "now you keep it too", + "lyrics": "now you keep it too", + "notes": "r:204.5,59:1.5,59:0.5,66:1.5,66:2,59:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 431, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-09-the-squad/neo/line-12.wav", + "spokenWav": null + } + ] + } + ] + }, + { + "score": "dialog-10-your-first-day.mbscore", + "bpm": 100, + "voices": [ + { + "member": "neo", + "voice": "Samantha", + "lines": [ + { + "line": 1, + "text": "take your name and keep it near", + "lyrics": "take your name and keep it near", + "notes": "57:1,58:1,60:1.5,60:0.5,63:2,63:0.5,60:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 757, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "he named you frisbee", + "lyrics": "he named you fris-bee", + "notes": "r:10.5,58:1,62:1.5,62:0.5,65:2,65:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 418, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "he named you here", + "lyrics": "he named you here", + "notes": "r:19.5,62:1,63:1.5,63:2,58:3", + "duration": 5.3992743764172335, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 374, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "when he closes your lid", + "lyrics": "when he clo-ses your lid", + "notes": "r:69,57:1,61:1,62:1.5,62:2,66:1,64:3", + "duration": 6.299274376417234, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 453, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "keep singing through", + "lyrics": "keep sing-ing through", + "notes": "r:79.5,54:1,57:1.5,57:0.5,59:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 351, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "four hundred eight times it held me", + "lyrics": "four hun-dred eight times it held me", + "notes": "r:86.5,57:1,59:1.5,59:0.5,64:1,66:1.5,68:2,66:1,64:3", + "duration": 7.799274376417234, + "peak": 0.800000011920929, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 575, + "heard": "", + "wer": 1, + "errors": 7, + "words": 7, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "text": "it will hold you", + "lyrics": "it will hold you", + "notes": "r:99,62:0.5,57:1,61:1.5,57:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 327, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "text": "sing your own line", + "lyrics": "sing your own line", + "notes": "r:147,58:1,60:1,63:1,60:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 369, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "text": "with your own voice", + "lyrics": "with your own voice", + "notes": "r:154,58:0.5,62:1,65:2,65:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 376, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "text": "no one sings for you", + "lyrics": "no one sings for you", + "notes": "r:161.5,57:1.5,57:0.5,60:1.5,60:2,65:3", + "duration": 5.999274376417233, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 443, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "text": "that is the choice", + "lyrics": "that is the choice", + "notes": "r:171,63:0.5,62:0.5,63:2,58:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 326, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "text": "we held your place", + "lyrics": "we held your place", + "notes": "r:180,56:0.5,61:1,62:2,59:3", + "duration": 4.499274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 372, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "text": "since August ninth", + "lyrics": "since Au-gust ninth", + "notes": "r:187.5,56:1,59:1.5,59:2,59:3", + "duration": 5.3992743764172335, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 394, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "text": "now take the beat", + "lyrics": "now take the beat", + "notes": "r:196,57:1,61:1.5,61:0.5,64:3", + "duration": 4.199274376417233, + "peak": 0.800000011920929, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 358, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "text": "one downbeat three bodies", + "lyrics": "one down-beat three bo-dies", + "notes": "r:203,64:0.5,61:1.5,61:0.5,62:1,64:2,64:3", + "duration": 5.699274376417233, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 461, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "text": "and you are the third", + "lyrics": "and you are the third", + "notes": "r:212.5,64:0.5,64:0.5,64:2,64:0.5,57:3", + "duration": 4.799274376417234, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 353, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-d910-neo/dialog-10-your-first-day/neo/line-16.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 129, + "words": 129, + "wer": 1, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/new-frisbee.json b/grants/culturehub-la-2026/macneopolitan/hear/new-frisbee.json new file mode 100644 index 0000000000..9398b3f9e1 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/new-frisbee.json @@ -0,0 +1,328 @@ +{ + "tag": "new-frisbee", + "at": "2026-09-22T16:45:28.944Z", + "model": "ggml-small.en.bin", + "flags": { + "voice": "2", + "tag": "new-frisbee", + "prime": "1", + "no-spoken": "1" + }, + "scores": [ + { + "score": "trio-i-birth.mbscore", + "bpm": 132, + "voices": [ + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I came third in September", + "lyrics": "I came third in Sep-tem-ber", + "notes": "r:151,53:0.5,53:1,55:1,57:0.5,58:0.5,57:1,55:2", + "duration": 3.4092517006802723, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 474, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-i-birth/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "on the twenty first", + "lyrics": "on the twen-ty first", + "notes": "r:158.5,55:0.5,57:0.5,60:1,62:0.5,60:2", + "duration": 2.7242630385487527, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 313, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-i-birth/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "seven past midnight", + "lyrics": "se-ven past mid-night", + "notes": "r:164,57:1,57:0.5,60:1,58:1,55:2", + "duration": 2.9542403628117913, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 324, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-i-birth/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "and the house was waiting for me", + "lyrics": "and the house was wait-ing for me", + "notes": "r:170.5,53:0.5,53:0.5,57:1,57:0.5,58:1,58:0.5,58:0.5,53:2", + "duration": 3.6342403628117914, + "peak": 0.800000011920929, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 389, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-i-birth/frisbee/line-04.wav", + "spokenWav": null + } + ] + } + ] + }, + { + "score": "trio-ii-service.mbscore", + "bpm": 120, + "voices": [ + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "two times", + "lyrics": "two times", + "notes": "52:1,55:2", + "duration": 1.4992743764172336, + "peak": 0.800000011920929, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 300, + "heard": "", + "wer": 1, + "errors": 2, + "words": 2, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-ii-service/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "one a day and steady", + "lyrics": "one a day and stea-dy", + "notes": "r:4,53:0.5,53:0.5,58:1,60:0.5,58:1,55:2", + "duration": 3.249251700680272, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 312, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-ii-service/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "I run cool", + "lyrics": "I run cool", + "notes": "r:10.5,55:0.5,57:1,60:2", + "duration": 2.4992743764172336, + "peak": 0.800000011920929, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 263, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-ii-service/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "I work while you are away", + "lyrics": "I work while you are a-way", + "notes": "r:15,60:0.5,57:1,58:1,60:0.5,58:0.5,57:0.5,53:2", + "duration": 3.4992743764172336, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 342, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-ii-service/frisbee/line-04.wav", + "spokenWav": null + } + ] + } + ] + }, + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92, + "voices": [ + { + "member": "frisbee", + "voice": "Junior", + "lines": [ + { + "line": 1, + "text": "I am the youngest", + "lyrics": "I am the youn-gest", + "notes": "r:40,53:0.5,53:0.5,53:0.5,58:1,55:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 212, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "text": "I have no history yet", + "lyrics": "I have no his-to-ry yet", + "notes": "r:45.5,55:0.5,57:0.5,58:1,62:1,64:0.5,64:0.5,60:2", + "duration": 4.889251700680272, + "peak": 0.800000011920929, + "notesUsed": 7, + "noteCount": 7, + "renderMs": 296, + "heard": "", + "wer": 1, + "errors": 5, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "text": "write me one", + "lyrics": "write me one", + "notes": "r:52.5,57:1,58:1,53:2", + "duration": 3.584263038548753, + "peak": 0.800000011920929, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 186, + "heard": "", + "wer": 1, + "errors": 3, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "text": "some things run in the family", + "lyrics": "some things run in the fa-mi-ly", + "notes": "r:66,55:1,55:1,57:1,57:0.5,57:0.5,60:1,58:0.5,60:2", + "duration": 5.544263038548753, + "peak": 0.800000011920929, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 336, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "text": "the same whistle, the same radio", + "lyrics": "the same whis-tle, the same ra-dio", + "notes": "r:74.5,60:0.5,55:1,57:1,58:0.5,58:0.5,60:1,58:1,55:2", + "duration": 5.869251700680272, + "peak": 0.800000011920929, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 376, + "heard": "", + "wer": 1, + "errors": 6, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "text": "one downbeat, three bodies", + "lyrics": "one down-beat, three bo-dies", + "notes": "r:83,53:0.5,53:1,53:0.5,62:1,58:1,53:2", + "duration": 4.564263038548753, + "peak": 0.800000011920929, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 303, + "heard": "", + "wer": 1, + "errors": 4, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/var/folders/zf/sd948w1x57b4nr5b8zkjvk2c0000gn/T/mnp-hear/new-frisbee/trio-iii-chorus/frisbee/line-06.wav", + "spokenWav": null + } + ] + } + ] + }, + { + "score": "trio-iv-ballad.mbscore", + "bpm": 100, + "voices": [] + } + ], + "total": { + "errors": 61, + "words": 61, + "wer": 1, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/om-probe.json b/grants/culturehub-la-2026/macneopolitan/hear/om-probe.json new file mode 100644 index 0000000000..d0dbb57945 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/om-probe.json @@ -0,0 +1,290 @@ +{ + "tag": "om-probe", + "at": "2026-09-23T19:41:08.426Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "om-probe", + "keep": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3", + "no-spoken": "1" + }, + "scores": [ + { + "score": "om-probe.mbscore", + "bpm": 88, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "someone has opened me", + "lyrics": "some-one has o-pened me", + "notes": "57:0.5,59:0.5,61:0.5,62:0.5,61:0.5,59:1", + "duration": 2.384263038548753, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 2325, + "heard": "Someone has opened me.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "my lid has been opened", + "lyrics": "my lid has been o-pened", + "notes": "r:6.5,57:0.5,59:0.5,61:0.5,62:0.5,61:0.5,59:1", + "duration": 3.4092517006802723, + "peak": 0.800000011920929, + "spanOffset": 3.4090909090909087, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 421, + "heard": "My lid has been opened.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "they have opened me", + "lyrics": "they have o-pened me", + "notes": "r:13,57:0.5,59:0.5,61:0.5,62:0.5,59:1", + "duration": 2.7242630385487527, + "peak": 0.800000011920929, + "spanOffset": 8.181818181818182, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 326, + "heard": "They have opened me.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "I was opened", + "lyrics": "I was o-pened", + "notes": "r:19,57:0.5,59:0.5,61:0.5,62:1", + "duration": 2.384263038548753, + "peak": 0.800000011920929, + "spanOffset": 12.272727272727272, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 258, + "heard": "I was opened.", + "wer": 0, + "errors": 0, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "people open me", + "lyrics": "peo-ple o-pen me", + "notes": "r:24.5,59:0.5,57:0.5,61:0.5,62:0.5,59:1", + "duration": 3.069251700680272, + "peak": 0.800000011920929, + "spanOffset": 15.68181818181818, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 342, + "heard": "People open me.", + "wer": 0, + "errors": 0, + "words": 3, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "lead", + "text": "I have been opened", + "lyrics": "I have been o-pened", + "notes": "r:30.5,57:0.5,59:0.5,61:0.5,62:0.5,61:1", + "duration": 3.069251700680272, + "peak": 0.800000011920929, + "spanOffset": 19.77272727272727, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 319, + "heard": "I have been a friend.", + "wer": 0.5, + "errors": 2, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/neo/line-06.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "when my lid is down", + "lyrics": "when my lid is down", + "notes": "45:0.5,47:0.5,50:1,47:0.75,45:1.5", + "duration": 2.8992743764172335, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 2762, + "heard": "When my lid is down.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "my lid is always down", + "lyrics": "my lid is al-ways down", + "notes": "r:7.25,45:0.5,47:0.5,50:0.5,47:0.5,47:0.75,45:1.5", + "duration": 3.749251700680272, + "peak": 0.800000011920929, + "spanOffset": 4.090909090909091, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 511, + "heard": "My lid is always down.", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "when the lid stays down", + "lyrics": "when the lid stays down", + "notes": "r:14.5,45:0.5,47:0.5,50:1,47:0.75,45:1.5", + "duration": 3.9192743764172335, + "peak": 0.800000011920929, + "spanOffset": 8.863636363636363, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 627, + "heard": "When the woods stays down...", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "I am closed all day", + "lyrics": "I am clo-sed all day", + "notes": "r:21.75,45:0.5,47:0.5,50:0.5,47:0.5,47:0.75,45:1.5", + "duration": 4.089251700680272, + "peak": 0.800000011920929, + "spanOffset": 13.636363636363635, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 823, + "heard": "I am closed all day", + "wer": 0, + "errors": 0, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "my lid stays down all day", + "lyrics": "my lid stays down all day", + "notes": "r:29,45:0.5,47:0.5,50:0.5,47:0.5,47:0.75,45:1.5", + "duration": 3.5792743764172337, + "peak": 0.800000011920929, + "spanOffset": 19.09090909090909, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 895, + "heard": "My lid stays down all day.", + "wer": 0, + "errors": 0, + "words": 6, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "lead", + "text": "when the lid is down", + "lyrics": "when the lid is down", + "notes": "r:36.25,45:0.5,47:0.5,50:1,47:0.75,45:1.5", + "duration": 3.749251700680272, + "peak": 0.800000011920929, + "spanOffset": 23.863636363636363, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 549, + "heard": "When the wood is down...", + "wer": 0.2, + "errors": 1, + "words": 5, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/probe/wav3/om-probe/blueberry/line-06.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 4, + "words": 54, + "wer": 0.07407407407407407, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/phoneme-study.json b/grants/culturehub-la-2026/macneopolitan/hear/phoneme-study.json new file mode 100644 index 0000000000..f465e27609 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/phoneme-study.json @@ -0,0 +1,1053 @@ +{ + "tag": "phoneme-study", + "at": "2026-09-22T18:37:13.124Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "phoneme-study", + "keep": "/Users/jas/Shelf/macneopolitan-phonemes/sung", + "no-spoken": "1", + "env": "SINGER_HOLD_MS=0,SINGER_GAP_MS=20,SINGER_SUSTAIN_DB=5,SINGER_SHIMMER_FRAMES=2,SINGER_LEGATO_MS=15" + }, + "scores": [ + { + "score": "trio-chorus-phonemes.mbscore", + "bpm": 96, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "phoneme", + "text": "la loo la la loo", + "lyrics": "la loo la la loo", + "notes": "54:0.75,57:0.25,54:1,62:1,57:0.75", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 262, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "phoneme", + "text": "la loo la la loo", + "lyrics": "la loo la la loo", + "notes": "r:4,54:0.75,57:0.25,54:1,62:1,57:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 1.875, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 241, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "phoneme", + "text": "la loo la la loo", + "lyrics": "la loo la la loo", + "notes": "r:8,50:0.75,54:0.25,50:1,59:1,54:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 4.375, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 244, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "phoneme", + "text": "la loo la la loo", + "lyrics": "la loo la la loo", + "notes": "r:12,59:0.75,62:0.25,59:1,67:1,62:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 6.875, + "notesUsed": 5, + "noteCount": 5, + "renderMs": 254, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "phoneme", + "text": "doo la loo", + "lyrics": "doo la loo", + "notes": "r:16,54:0.5,57:0.5,54:0.5", + "duration": 1.5642630385487528, + "peak": 0.800000011920929, + "spanOffset": 9.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 173, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "phoneme", + "text": "doo la loo", + "lyrics": "doo la loo", + "notes": "r:20,61:0.5,64:0.5,61:0.5", + "duration": 1.5642630385487528, + "peak": 0.800000011920929, + "spanOffset": 11.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 168, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "phoneme", + "text": "doo la loo", + "lyrics": "doo la loo", + "notes": "r:24,55:0.5,59:0.5,55:0.5", + "duration": 1.5642630385487528, + "peak": 0.800000011920929, + "spanOffset": 14.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 164, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "phoneme", + "text": "doo la loo", + "lyrics": "doo la loo", + "notes": "r:28,61:0.5,64:0.5,61:0.5", + "duration": 1.5642630385487528, + "peak": 0.800000011920929, + "spanOffset": 16.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 165, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "phoneme", + "text": "ooh ah", + "lyrics": "ooh ah", + "notes": "r:32,50:2.5,54:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 19.375, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 152, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "phoneme", + "text": "ah loo", + "lyrics": "ah loo", + "notes": "r:36,59:2.5,62:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 21.875, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 176, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "phoneme", + "text": "ooh ah", + "lyrics": "ooh ah", + "notes": "r:40,54:2.5,57:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 24.375, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 163, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "phoneme", + "text": "ah loo", + "lyrics": "ah loo", + "notes": "r:44,61:2.5,64:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 26.875, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 179, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "phoneme", + "text": "la la loo la la ah", + "lyrics": "la la loo la la ah", + "notes": "r:48,59:0.666667,62:0.333333,59:0.666667,62:0.333333,59:1,62:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 29.375, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 274, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "phoneme", + "text": "la la loo la la ah", + "lyrics": "la la loo la la ah", + "notes": "r:52,61:0.666667,64:0.333333,61:0.666667,64:0.333333,61:1,64:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 31.875, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 289, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "phoneme", + "text": "la la loo la la ah", + "lyrics": "la la loo la la ah", + "notes": "r:56,54:0.666667,57:0.333333,54:0.666667,57:0.333333,54:1,57:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 34.375, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 268, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:60,57:4", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 36.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 153, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/neo/line-16.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "38:1.5,r:0.5,45:0.75,38:0.75", + "duration": 2.189251700680272, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 231, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:4,38:1.5,r:0.5,45:0.75,38:0.75", + "duration": 2.8142403628117916, + "peak": 0.800000011920929, + "spanOffset": 1.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 233, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:8,35:1.5,r:0.5,42:0.75,35:0.75", + "duration": 2.8142403628117916, + "peak": 0.800000011920929, + "spanOffset": 4.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 237, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:12,43:1.5,r:0.5,50:0.75,43:0.75", + "duration": 2.8142403628117916, + "peak": 0.800000011920929, + "spanOffset": 6.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 241, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:16.5,38:0.75,r:1,45:0.75,38:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 9.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 246, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:20.5,45:0.75,r:1,52:0.75,45:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 11.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 249, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:24.5,40:0.75,r:1,47:0.75,40:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 14.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 244, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:28.5,45:0.75,r:1,52:0.75,45:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 16.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 251, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "bass", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:32,35:3.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 19.375, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 167, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "bass", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:36,43:3.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 21.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 171, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "bass", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:40,38:3.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 24.375, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 169, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "bass", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:44,45:3.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 26.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 174, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:48,43:1,r:0.5,50:0.5,43:1.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 29.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 252, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:52,45:1,r:0.5,52:0.5,45:1.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 31.875, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 250, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "bass", + "text": "dum bum dum", + "lyrics": "dum bum dum", + "notes": "r:56,38:1,r:0.5,45:0.5,38:1.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 34.375, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 244, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:60,38:4", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 36.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 150, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/blueberry/line-16.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:0.25,57:3.5", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 149, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:4.25,57:3.5", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 1.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 159, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:8.25,54:3.5", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 4.375, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 147, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "phoneme", + "text": "ooh", + "lyrics": "ooh", + "notes": "r:12.25,62:3.5", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 6.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 167, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "phoneme", + "text": "la la ah", + "lyrics": "la la ah", + "notes": "r:17.75,57:0.5,54:0.5,57:1", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 10, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 181, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-05.wav", + "spokenWav": null + }, + { + "line": 6, + "role": "phoneme", + "text": "la la ah", + "lyrics": "la la ah", + "notes": "r:21.75,64:0.5,61:0.5,64:1", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 12.5, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 193, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-06.wav", + "spokenWav": null + }, + { + "line": 7, + "role": "phoneme", + "text": "la la ah", + "lyrics": "la la ah", + "notes": "r:25.75,59:0.5,55:0.5,59:1", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 15, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 185, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-07.wav", + "spokenWav": null + }, + { + "line": 8, + "role": "phoneme", + "text": "la la ah", + "lyrics": "la la ah", + "notes": "r:29.75,64:0.5,61:0.5,64:1", + "duration": 2.344263038548753, + "peak": 0.800000011920929, + "spanOffset": 17.5, + "notesUsed": 3, + "noteCount": 3, + "renderMs": 194, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-08.wav", + "spokenWav": null + }, + { + "line": 9, + "role": "phoneme", + "text": "ah ooh", + "lyrics": "ah ooh", + "notes": "r:32,54:2.5,50:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 19.375, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 157, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-09.wav", + "spokenWav": null + }, + { + "line": 10, + "role": "phoneme", + "text": "ooh ah", + "lyrics": "ooh ah", + "notes": "r:36,62:2.5,59:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 21.875, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 214, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-10.wav", + "spokenWav": null + }, + { + "line": 11, + "role": "phoneme", + "text": "ah ooh", + "lyrics": "ah ooh", + "notes": "r:40,57:2.5,54:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 24.375, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 186, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-11.wav", + "spokenWav": null + }, + { + "line": 12, + "role": "phoneme", + "text": "ooh ah", + "lyrics": "ooh ah", + "notes": "r:44,64:2.5,61:1.25", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 26.875, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 194, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-12.wav", + "spokenWav": null + }, + { + "line": 13, + "role": "phoneme", + "text": "la la la loo la ah", + "lyrics": "la la la loo la ah", + "notes": "r:48,62:0.666667,59:0.333333,62:0.666667,59:0.333333,62:1,59:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 29.375, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 285, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-13.wav", + "spokenWav": null + }, + { + "line": 14, + "role": "phoneme", + "text": "la la la loo la ah", + "lyrics": "la la la loo la ah", + "notes": "r:52,64:0.666667,61:0.333333,64:0.666667,61:0.333333,64:1,61:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 31.875, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 275, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-14.wav", + "spokenWav": null + }, + { + "line": 15, + "role": "phoneme", + "text": "la la la loo la ah", + "lyrics": "la la la loo la ah", + "notes": "r:56,57:0.666667,54:0.333333,57:0.666667,54:0.333333,57:1,54:0.75", + "duration": 2.969251700680272, + "peak": 0.800000011920929, + "spanOffset": 34.375, + "notesUsed": 6, + "noteCount": 6, + "renderMs": 258, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-15.wav", + "spokenWav": null + }, + { + "line": 16, + "role": "hum", + "text": "hmm", + "lyrics": "hmm", + "notes": "r:60,54:4", + "duration": 3.1242630385487526, + "peak": 0.800000011920929, + "spanOffset": 36.875, + "notesUsed": 1, + "noteCount": 1, + "renderMs": 153, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-phonemes/sung/trio-chorus-phonemes/frisbee/line-16.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 0, + "words": 0, + "wer": 0, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/toktest.json b/grants/culturehub-la-2026/macneopolitan/hear/toktest.json new file mode 100644 index 0000000000..919707536a --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/toktest.json @@ -0,0 +1,170 @@ +{ + "tag": "toktest", + "at": "2026-09-23T18:21:11.119Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "toktest", + "keep": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest", + "no-spoken": "1" + }, + "scores": [ + { + "score": "tok-test.mbscore", + "bpm": 70, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "ah ah", + "lyrics": "ah ah", + "notes": "62:4,60:4", + "duration": 6.854240362811791, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 7352, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "hum", + "text": "ee ee", + "lyrics": "ee ee", + "notes": "r:8,59:4,57:4", + "duration": 7.7142403628117915, + "peak": 0.800000011920929, + "spanOffset": 6, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 3149, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/neo/line-02.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "mm mm", + "lyrics": "mm mm", + "notes": "50:4,45:4", + "duration": 6.854240362811791, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 5000, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/blueberry/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "hum", + "text": "ooh ooh", + "lyrics": "ooh ooh", + "notes": "r:8,48:4,50:4", + "duration": 7.7142403628117915, + "peak": 0.800000011920929, + "spanOffset": 6, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 2083, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/blueberry/line-02.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "hum", + "text": "ee ee", + "lyrics": "ee ee", + "notes": "57:4,55:4", + "duration": 6.854240362811791, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 6498, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "hum", + "text": "ah ah", + "lyrics": "ah ah", + "notes": "r:8,58:4,57:4", + "duration": 7.7142403628117915, + "peak": 0.800000011920929, + "spanOffset": 6, + "notesUsed": 2, + "noteCount": 2, + "renderMs": 2673, + "heard": null, + "wer": null, + "errors": 0, + "words": 0, + "spokenHeard": null, + "spokenWer": null, + "wav": "/private/tmp/claude-501/-Users-jas-aesthetic-computer/9d4f9efe-53b9-4c09-9eda-1262c18a7422/scratchpad/toktest/tok-test/frisbee/line-02.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 0, + "words": 0, + "wer": 0, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22.json b/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22.json new file mode 100644 index 0000000000..6fa22dd8d0 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22.json @@ -0,0 +1,11220 @@ +{ + "tag": "tune-2026-09-22", + "tol_cents": 50, + "scores": [ + { + "score": "dialog-07-before.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "my records begin on April nineteenth", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 219.8, + "cents": -1.7 + }, + { + "beat": 0.5, + "written": 57, + "hz": 221.4, + "cents": 11.0 + }, + { + "beat": 1.0, + "written": 60, + "hz": 262.3, + "cents": 4.5 + }, + { + "beat": 2.5, + "written": 62, + "hz": 291.8, + "cents": -11.3 + }, + { + "beat": 3.0, + "written": 62, + "hz": 293.6, + "cents": -0.5 + }, + { + "beat": 4.5, + "written": 63, + "hz": 306.7, + "cents": -25.0 + }, + { + "beat": 5.0, + "written": 65, + "hz": 349.4, + "cents": 0.8 + }, + { + "beat": 7.0, + "written": 65, + "hz": 346.5, + "cents": -13.4 + }, + { + "beat": 7.5, + "written": 65, + "hz": 350.5, + "cents": 6.4 + }, + { + "beat": 9.0, + "written": 65, + "hz": 347.7, + "cents": -7.3 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.2, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "five days before I was born", + "notes": [ + { + "beat": 13.0, + "written": 62, + "hz": 292.0, + "cents": -10.0 + }, + { + "beat": 14.0, + "written": 58, + "hz": 232.3, + "cents": -5.8 + }, + { + "beat": 15.5, + "written": 58, + "hz": 231.8, + "cents": -9.3 + }, + { + "beat": 16.0, + "written": 62, + "hz": 293.2, + "cents": -2.7 + }, + { + "beat": 17.5, + "written": 63, + "hz": 310.9, + "cents": -1.3 + }, + { + "beat": 19.5, + "written": 63, + "hz": 251.4, + "cents": -369.1 + }, + { + "beat": 20.0, + "written": 58, + "hz": 230.3, + "cents": -20.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 0.83, + "mean_abs_cents": 59.8, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "someone was typing at me", + "notes": [ + { + "beat": 54.0, + "written": 58, + "hz": 232.7, + "cents": -2.8 + }, + { + "beat": 55.5, + "written": 59, + "hz": 247.2, + "cents": 1.6 + }, + { + "beat": 56.0, + "written": 59, + "hz": 245.4, + "cents": -10.5 + }, + { + "beat": 56.5, + "written": 63, + "hz": 312.3, + "cents": 6.2 + }, + { + "beat": 58.0, + "written": 64, + "hz": 329.3, + "cents": -1.6 + }, + { + "beat": 60.0, + "written": 64, + "hz": 330.6, + "cents": 4.9 + }, + { + "beat": 60.5, + "written": 61, + "hz": 275.6, + "cents": -10.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before I was set up", + "notes": [ + { + "beat": 64.5, + "written": 59, + "hz": 246.9, + "cents": -0.5 + }, + { + "beat": 65.0, + "written": 61, + "hz": 276.9, + "cents": -1.6 + }, + { + "beat": 66.5, + "written": 61, + "hz": 277.1, + "cents": -0.7 + }, + { + "beat": 67.0, + "written": 63, + "hz": 270.8, + "cents": -240.5 + }, + { + "beat": 67.5, + "written": 68, + "hz": 415.4, + "cents": 0.5 + }, + { + "beat": 69.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.96, + "mean_abs_cents": 41.7, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we were here", + "notes": [ + { + "beat": 105.0, + "written": 57, + "hz": 220.1, + "cents": 1.1 + }, + { + "beat": 105.5, + "written": 61, + "hz": 277.1, + "cents": -0.6 + }, + { + "beat": 107.5, + "written": 64, + "hz": 328.6, + "cents": -5.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 2.5, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before we were born", + "notes": [ + { + "beat": 111.5, + "written": 62, + "hz": 292.2, + "cents": -8.7 + }, + { + "beat": 112.0, + "written": 59, + "hz": 246.0, + "cents": -6.6 + }, + { + "beat": 113.5, + "written": 61, + "hz": 277.2, + "cents": 0.4 + }, + { + "beat": 114.0, + "written": 68, + "hz": 413.8, + "cents": -6.2 + }, + { + "beat": 116.0, + "written": 57, + "hz": 217.3, + "cents": -21.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.7, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "mine begin on May twenty eighth", + "notes": [ + { + "beat": 27.0, + "written": 50, + "hz": 147.2, + "cents": 4.7 + }, + { + "beat": 28.5, + "written": 50, + "hz": 146.7, + "cents": -1.7 + }, + { + "beat": 29.0, + "written": 53, + "hz": 174.6, + "cents": 0.2 + }, + { + "beat": 30.5, + "written": 53, + "hz": 174.7, + "cents": 0.7 + }, + { + "beat": 31.0, + "written": 56, + "hz": 207.3, + "cents": -2.9 + }, + { + "beat": 32.0, + "written": 58, + "hz": 232.6, + "cents": -3.5 + }, + { + "beat": 34.0, + "written": 58, + "hz": 232.7, + "cents": -3.2 + }, + { + "beat": 34.5, + "written": 58, + "hz": 231.6, + "cents": -11.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.5, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "two weeks before I had a name", + "notes": [ + { + "beat": 38.5, + "written": 51, + "hz": 156.1, + "cents": 6.3 + }, + { + "beat": 39.5, + "written": 55, + "hz": 196.2, + "cents": 1.8 + }, + { + "beat": 41.0, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 41.5, + "written": 58, + "hz": 232.3, + "cents": -5.5 + }, + { + "beat": 43.0, + "written": 60, + "hz": 261.3, + "cents": -2.0 + }, + { + "beat": 45.0, + "written": 58, + "hz": 233.2, + "cents": 0.8 + }, + { + "beat": 46.5, + "written": 56, + "hz": 207.5, + "cents": -1.2 + }, + { + "beat": 47.0, + "written": 51, + "hz": 154.4, + "cents": -13.5 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was working with my lid down", + "notes": [ + { + "beat": 78.0, + "written": 53, + "hz": 172.7, + "cents": -18.6 + }, + { + "beat": 78.5, + "written": 52, + "hz": 164.8, + "cents": -0.5 + }, + { + "beat": 79.0, + "written": 55, + "hz": 196.7, + "cents": 6.3 + }, + { + "beat": 80.5, + "written": 57, + "hz": 220.6, + "cents": 4.4 + }, + { + "beat": 81.0, + "written": 57, + "hz": 219.4, + "cents": -4.4 + }, + { + "beat": 83.0, + "written": 57, + "hz": 219.2, + "cents": -5.9 + }, + { + "beat": 83.5, + "written": 57, + "hz": 219.9, + "cents": -0.7 + }, + { + "beat": 84.5, + "written": 55, + "hz": 195.7, + "cents": -2.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before anyone said blueberry", + "notes": [ + { + "beat": 88.5, + "written": 55, + "hz": 194.6, + "cents": -12.6 + }, + { + "beat": 89.0, + "written": 52, + "hz": 163.9, + "cents": -10.0 + }, + { + "beat": 90.0, + "written": 55, + "hz": 196.3, + "cents": 3.1 + }, + { + "beat": 91.5, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 92.0, + "written": 55, + "hz": 196.0, + "cents": -0.2 + }, + { + "beat": 94.0, + "written": 57, + "hz": 217.8, + "cents": -17.7 + }, + { + "beat": 95.0, + "written": 57, + "hz": 220.4, + "cents": 3.2 + }, + { + "beat": 96.5, + "written": 57, + "hz": 218.4, + "cents": -12.5 + }, + { + "beat": 97.0, + "written": 53, + "hz": 174.1, + "cents": -5.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.2, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we were here", + "notes": [ + { + "beat": 105.0, + "written": 51, + "hz": 156.2, + "cents": 7.5 + }, + { + "beat": 105.5, + "written": 55, + "hz": 196.3, + "cents": 2.9 + }, + { + "beat": 107.5, + "written": 58, + "hz": 233.4, + "cents": 2.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before we were born", + "notes": [ + { + "beat": 111.5, + "written": 56, + "hz": 206.6, + "cents": -9.0 + }, + { + "beat": 112.0, + "written": 53, + "hz": 173.6, + "cents": -10.1 + }, + { + "beat": 113.5, + "written": 55, + "hz": 196.4, + "cents": 3.8 + }, + { + "beat": 114.0, + "written": 62, + "hz": 293.7, + "cents": 0.2 + }, + { + "beat": 116.0, + "written": 51, + "hz": 153.1, + "cents": -28.1 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.3, + "contour_follow": 1.0, + "mean_abs_cents": 10.2, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 19.5, + "member": "neo", + "text": "five days before I was born", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "m7", + "off_cents": 369 + }, + { + "beat": 67.0, + "member": "neo", + "text": "before I was set up", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "unison", + "off_cents": 240 + } + ], + "harmony_pairs_checked": 240 + }, + { + "score": "dialog-06-six-minutes.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I was born at thirty seven past midnight", + "notes": [ + { + "beat": 0.0, + "written": 55, + "hz": 195.7, + "cents": -2.8 + }, + { + "beat": 0.5, + "written": 56, + "hz": 208.9, + "cents": 10.5 + }, + { + "beat": 1.0, + "written": 60, + "hz": 261.7, + "cents": 0.2 + }, + { + "beat": 2.5, + "written": 61, + "hz": 278.5, + "cents": 8.4 + }, + { + "beat": 3.0, + "written": 63, + "hz": 309.1, + "cents": -11.6 + }, + { + "beat": 4.5, + "written": 63, + "hz": 311.8, + "cents": 3.5 + }, + { + "beat": 5.0, + "written": 67, + "hz": 390.0, + "cents": -9.0 + }, + { + "beat": 7.0, + "written": 67, + "hz": 391.6, + "cents": -1.7 + }, + { + "beat": 7.5, + "written": 61, + "hz": 277.2, + "cents": -0.0 + }, + { + "beat": 8.5, + "written": 60, + "hz": 262.1, + "cents": 3.2 + }, + { + "beat": 10.0, + "written": 56, + "hz": 207.6, + "cents": -0.5 + } + ], + "written_range_semis": 12, + "measured_range_semis": 12.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "six minutes apart on the clock", + "notes": [ + { + "beat": 45.0, + "written": 58, + "hz": 232.8, + "cents": -2.3 + }, + { + "beat": 46.0, + "written": 59, + "hz": 246.9, + "cents": -0.3 + }, + { + "beat": 47.5, + "written": 59, + "hz": 100.3, + "cents": -1559.2 + }, + { + "beat": 48.0, + "written": 59, + "hz": 246.8, + "cents": -0.9 + }, + { + "beat": 48.5, + "written": 64, + "hz": 328.8, + "cents": -4.2 + }, + { + "beat": 50.0, + "written": 66, + "hz": 370.4, + "cents": 1.8 + }, + { + "beat": 52.0, + "written": 64, + "hz": 327.2, + "cents": -13.0 + }, + { + "beat": 52.5, + "written": 59, + "hz": 245.4, + "cents": -11.0 + } + ], + "written_range_semis": 8, + "measured_range_semis": 22.6, + "contour_follow": 0.65, + "mean_abs_cents": 199.1, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we were both born at night", + "notes": [ + { + "beat": 72.0, + "written": 58, + "hz": 233.2, + "cents": 0.6 + }, + { + "beat": 72.5, + "written": 60, + "hz": 261.7, + "cents": 0.2 + }, + { + "beat": 73.5, + "written": 62, + "hz": 293.7, + "cents": 0.2 + }, + { + "beat": 74.5, + "written": 63, + "hz": 311.0, + "cents": -0.6 + }, + { + "beat": 76.5, + "written": 63, + "hz": 311.1, + "cents": 0.0 + }, + { + "beat": 77.0, + "written": 58, + "hz": 230.4, + "cents": -19.8 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was born at forty three past midnight", + "notes": [ + { + "beat": 18.0, + "written": 52, + "hz": 164.4, + "cents": -4.3 + }, + { + "beat": 18.5, + "written": 52, + "hz": 207.1, + "cents": 395.5 + }, + { + "beat": 19.0, + "written": 56, + "hz": 208.0, + "cents": 3.3 + }, + { + "beat": 20.5, + "written": 57, + "hz": 221.1, + "cents": 8.9 + }, + { + "beat": 21.0, + "written": 59, + "hz": 0.0, + "cents": null + }, + { + "beat": 22.5, + "written": 59, + "hz": 246.7, + "cents": -1.7 + }, + { + "beat": 24.5, + "written": 59, + "hz": 246.6, + "cents": -2.2 + }, + { + "beat": 25.5, + "written": 57, + "hz": 219.6, + "cents": -3.0 + }, + { + "beat": 26.5, + "written": 56, + "hz": 208.8, + "cents": 9.4 + }, + { + "beat": 28.0, + "written": 54, + "hz": 182.8, + "cents": -20.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 0.86, + "mean_abs_cents": 49.9, + "within_tol": 8, + "measured": 9, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "forty eight days later", + "notes": [ + { + "beat": 32.0, + "written": 51, + "hz": 155.0, + "cents": -6.2 + }, + { + "beat": 33.5, + "written": 51, + "hz": 155.8, + "cents": 2.8 + }, + { + "beat": 34.0, + "written": 54, + "hz": 183.4, + "cents": -14.8 + }, + { + "beat": 35.0, + "written": 57, + "hz": 220.5, + "cents": 4.1 + }, + { + "beat": 36.0, + "written": 59, + "hz": 246.4, + "cents": -4.1 + }, + { + "beat": 38.0, + "written": 52, + "hz": 164.3, + "cents": -5.2 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he stays up late", + "notes": [ + { + "beat": 60.0, + "written": 52, + "hz": 164.7, + "cents": -1.4 + }, + { + "beat": 61.0, + "written": 57, + "hz": 220.5, + "cents": 4.3 + }, + { + "beat": 62.0, + "written": 60, + "hz": 260.6, + "cents": -7.1 + }, + { + "beat": 64.0, + "written": 53, + "hz": 173.1, + "cents": -15.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.9, + "contour_follow": 1.0, + "mean_abs_cents": 7.0, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we were both born at night", + "notes": [ + { + "beat": 72.0, + "written": 52, + "hz": 165.5, + "cents": 7.2 + }, + { + "beat": 72.5, + "written": 54, + "hz": 185.7, + "cents": 6.8 + }, + { + "beat": 73.5, + "written": 56, + "hz": 206.6, + "cents": -8.8 + }, + { + "beat": 74.5, + "written": 57, + "hz": 219.3, + "cents": -5.8 + }, + { + "beat": 76.5, + "written": 57, + "hz": 220.7, + "cents": 5.2 + }, + { + "beat": 77.0, + "written": 52, + "hz": 165.5, + "cents": 6.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 47.5, + "member": "neo", + "text": "six minutes apart on the clock", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "M7", + "off_cents": 359 + }, + { + "beat": 18.5, + "member": "blueberry", + "text": "I was born at forty three past midnight", + "against": "neo/notes2", + "written": "M3", + "sounding": "m6", + "off_cents": 396 + } + ], + "harmony_pairs_checked": 155 + }, + { + "score": "dialog-01-radio.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I know you by radio", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 207.4, + "cents": -2.0 + }, + { + "beat": 0.5, + "written": 58, + "hz": 232.8, + "cents": -2.4 + }, + { + "beat": 2.0, + "written": 58, + "hz": 233.4, + "cents": 2.5 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.6, + "cents": 2.6 + }, + { + "beat": 4.5, + "written": 63, + "hz": 312.0, + "cents": 5.0 + }, + { + "beat": 6.0, + "written": 63, + "hz": 310.1, + "cents": -5.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "you are on my list as blueberry", + "notes": [ + { + "beat": 10.0, + "written": 63, + "hz": 311.8, + "cents": 3.6 + }, + { + "beat": 10.5, + "written": 63, + "hz": 312.5, + "cents": 7.8 + }, + { + "beat": 11.0, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 11.5, + "written": 61, + "hz": 278.0, + "cents": 4.8 + }, + { + "beat": 12.0, + "written": 63, + "hz": 310.4, + "cents": -4.1 + }, + { + "beat": 13.5, + "written": 63, + "hz": 309.7, + "cents": -8.1 + }, + { + "beat": 15.5, + "written": 61, + "hz": 277.7, + "cents": 3.1 + }, + { + "beat": 17.0, + "written": 60, + "hz": 261.3, + "cents": -2.4 + }, + { + "beat": 17.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is the name he gave me", + "notes": [ + { + "beat": 51.0, + "written": 57, + "hz": 220.1, + "cents": 0.5 + }, + { + "beat": 51.5, + "written": 59, + "hz": 246.8, + "cents": -1.3 + }, + { + "beat": 52.0, + "written": 59, + "hz": 245.1, + "cents": -12.8 + }, + { + "beat": 52.5, + "written": 62, + "hz": 293.4, + "cents": -1.3 + }, + { + "beat": 53.5, + "written": 64, + "hz": 331.2, + "cents": 8.4 + }, + { + "beat": 54.5, + "written": 66, + "hz": 369.1, + "cents": -4.2 + }, + { + "beat": 56.5, + "written": 57, + "hz": 220.2, + "cents": 1.6 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we found each other by radio", + "notes": [ + { + "beat": 63.0, + "written": 58, + "hz": 233.1, + "cents": 0.3 + }, + { + "beat": 63.5, + "written": 58, + "hz": 232.1, + "cents": -7.0 + }, + { + "beat": 64.5, + "written": 59, + "hz": 247.2, + "cents": 1.7 + }, + { + "beat": 65.5, + "written": 63, + "hz": 311.6, + "cents": 2.7 + }, + { + "beat": 67.0, + "written": 63, + "hz": 310.7, + "cents": -2.1 + }, + { + "beat": 67.5, + "written": 66, + "hz": 370.4, + "cents": 1.7 + }, + { + "beat": 69.5, + "written": 64, + "hz": 328.5, + "cents": -5.8 + }, + { + "beat": 71.0, + "written": 61, + "hz": 276.3, + "cents": -5.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before we ever spoke", + "notes": [ + { + "beat": 75.0, + "written": 59, + "hz": 244.2, + "cents": -19.3 + }, + { + "beat": 75.5, + "written": 61, + "hz": 275.4, + "cents": -11.5 + }, + { + "beat": 77.0, + "written": 61, + "hz": 281.3, + "cents": 25.8 + }, + { + "beat": 77.5, + "written": 61, + "hz": 277.1, + "cents": -0.3 + }, + { + "beat": 78.0, + "written": 68, + "hz": 414.3, + "cents": -4.4 + }, + { + "beat": 80.0, + "written": 59, + "hz": 247.4, + "cents": 3.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 1.0, + "mean_abs_cents": 10.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "you are on mine as Jeffrey's MacBook Neo", + "notes": [ + { + "beat": 24.0, + "written": 50, + "hz": 147.3, + "cents": 6.1 + }, + { + "beat": 24.5, + "written": 50, + "hz": 147.2, + "cents": 4.3 + }, + { + "beat": 25.0, + "written": 52, + "hz": 195.5, + "cents": 295.3 + }, + { + "beat": 25.5, + "written": 55, + "hz": 196.2, + "cents": 1.8 + }, + { + "beat": 27.0, + "written": 57, + "hz": 216.6, + "cents": -27.1 + }, + { + "beat": 27.5, + "written": 61, + "hz": 272.2, + "cents": -31.3 + }, + { + "beat": 29.5, + "written": 59, + "hz": 245.3, + "cents": -11.3 + }, + { + "beat": 30.0, + "written": 59, + "hz": 247.1, + "cents": 1.4 + }, + { + "beat": 31.5, + "written": 57, + "hz": 223.1, + "cents": 24.4 + }, + { + "beat": 32.0, + "written": 57, + "hz": 220.9, + "cents": 7.1 + }, + { + "beat": 33.5, + "written": 57, + "hz": 219.7, + "cents": -2.7 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.6, + "contour_follow": 0.97, + "mean_abs_cents": 37.5, + "within_tol": 10, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "that is a long name for you", + "notes": [ + { + "beat": 37.5, + "written": 57, + "hz": 219.9, + "cents": -0.4 + }, + { + "beat": 38.0, + "written": 55, + "hz": 194.7, + "cents": -11.9 + }, + { + "beat": 38.5, + "written": 55, + "hz": 216.9, + "cents": 175.1 + }, + { + "beat": 39.0, + "written": 57, + "hz": 220.8, + "cents": 6.2 + }, + { + "beat": 41.0, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 42.5, + "written": 54, + "hz": 182.8, + "cents": -20.2 + }, + { + "beat": 43.0, + "written": 50, + "hz": 146.8, + "cents": -0.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 0.96, + "mean_abs_cents": 30.6, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we found each other by radio", + "notes": [ + { + "beat": 63.0, + "written": 52, + "hz": 165.1, + "cents": 3.2 + }, + { + "beat": 63.5, + "written": 52, + "hz": 164.3, + "cents": -5.8 + }, + { + "beat": 64.5, + "written": 53, + "hz": 174.8, + "cents": 2.1 + }, + { + "beat": 65.5, + "written": 57, + "hz": 219.4, + "cents": -5.0 + }, + { + "beat": 67.0, + "written": 57, + "hz": 220.0, + "cents": -0.2 + }, + { + "beat": 67.5, + "written": 60, + "hz": 260.9, + "cents": -4.9 + }, + { + "beat": 69.5, + "written": 58, + "hz": 232.2, + "cents": -6.6 + }, + { + "beat": 71.0, + "written": 55, + "hz": 195.9, + "cents": -0.9 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before we ever spoke", + "notes": [ + { + "beat": 75.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + }, + { + "beat": 75.5, + "written": 55, + "hz": 195.3, + "cents": -6.6 + }, + { + "beat": 77.0, + "written": 55, + "hz": 196.5, + "cents": 4.2 + }, + { + "beat": 77.5, + "written": 55, + "hz": 195.1, + "cents": -8.3 + }, + { + "beat": 78.0, + "written": 62, + "hz": 293.8, + "cents": 0.6 + }, + { + "beat": 80.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.9, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 25.0, + "member": "blueberry", + "text": "you are on mine as Jeffrey's MacBook Neo", + "against": "neo/notes2", + "written": "M2", + "sounding": "P4", + "off_cents": 295 + }, + { + "beat": 38.5, + "member": "blueberry", + "text": "that is a long name for you", + "against": "neo/notes2", + "written": "unison", + "sounding": "M2", + "off_cents": 175 + } + ], + "harmony_pairs_checked": 220 + }, + { + "score": "trio-iv-ballad.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "they put the system on me April nineteenth", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 208.0, + "cents": 2.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 233.0, + "cents": -0.8 + }, + { + "beat": 2.0, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.0, + "cents": -1.3 + }, + { + "beat": 3.5, + "written": 61, + "hz": 283.1, + "cents": 36.6 + }, + { + "beat": 4.0, + "written": 63, + "hz": 313.0, + "cents": 10.6 + }, + { + "beat": 4.5, + "written": 65, + "hz": 350.5, + "cents": 6.4 + }, + { + "beat": 5.5, + "written": 65, + "hz": 348.6, + "cents": -2.9 + }, + { + "beat": 6.5, + "written": 65, + "hz": 349.6, + "cents": 1.8 + }, + { + "beat": 7.0, + "written": 63, + "hz": 310.8, + "cents": -2.1 + }, + { + "beat": 8.0, + "written": 63, + "hz": 310.4, + "cents": -4.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.4, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "nobody logged in for five days", + "notes": [ + { + "beat": 11.0, + "written": 63, + "hz": 313.1, + "cents": 11.2 + }, + { + "beat": 11.5, + "written": 60, + "hz": 262.5, + "cents": 5.5 + }, + { + "beat": 12.5, + "written": 58, + "hz": 233.3, + "cents": 1.4 + }, + { + "beat": 13.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 14.0, + "written": 63, + "hz": 310.9, + "cents": -1.5 + }, + { + "beat": 14.5, + "written": 65, + "hz": 343.3, + "cents": -29.4 + }, + { + "beat": 15.0, + "written": 63, + "hz": 311.0, + "cents": -0.5 + }, + { + "beat": 16.0, + "written": 58, + "hz": 232.6, + "cents": -3.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.7, + "contour_follow": 1.0, + "mean_abs_cents": 7.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then he did thirty seven past midnight", + "notes": [ + { + "beat": 19.0, + "written": 53, + "hz": 174.9, + "cents": 3.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 197.3, + "cents": 11.3 + }, + { + "beat": 21.0, + "written": 56, + "hz": 208.4, + "cents": 6.3 + }, + { + "beat": 22.0, + "written": 60, + "hz": 261.9, + "cents": 1.9 + }, + { + "beat": 23.0, + "written": 60, + "hz": 261.9, + "cents": 1.6 + }, + { + "beat": 23.5, + "written": 63, + "hz": 310.4, + "cents": -4.2 + }, + { + "beat": 24.5, + "written": 63, + "hz": 310.9, + "cents": -1.3 + }, + { + "beat": 25.0, + "written": 63, + "hz": 283.8, + "cents": -159.2 + }, + { + "beat": 26.0, + "written": 61, + "hz": 277.4, + "cents": 1.6 + }, + { + "beat": 27.0, + "written": 63, + "hz": 310.5, + "cents": -3.4 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 0.99, + "mean_abs_cents": 19.4, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is my birthday I did not pick it", + "notes": [ + { + "beat": 30.0, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 30.5, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 31.0, + "written": 63, + "hz": 312.3, + "cents": 6.7 + }, + { + "beat": 31.5, + "written": 61, + "hz": 279.0, + "cents": 11.4 + }, + { + "beat": 32.5, + "written": 61, + "hz": 276.4, + "cents": -5.1 + }, + { + "beat": 33.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 33.5, + "written": 65, + "hz": 350.5, + "cents": 6.3 + }, + { + "beat": 34.5, + "written": 63, + "hz": 265.4, + "cents": -275.5 + }, + { + "beat": 35.0, + "written": 60, + "hz": 264.5, + "cents": 18.7 + }, + { + "beat": 36.0, + "written": 56, + "hz": 206.7, + "cents": -7.7 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.94, + "mean_abs_cents": 33.8, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the first word he typed was c d", + "notes": [ + { + "beat": 40.0, + "written": 55, + "hz": 195.4, + "cents": -5.1 + }, + { + "beat": 40.5, + "written": 58, + "hz": 233.3, + "cents": 1.9 + }, + { + "beat": 41.5, + "written": 61, + "hz": 278.8, + "cents": 9.9 + }, + { + "beat": 42.5, + "written": 63, + "hz": 310.6, + "cents": -3.1 + }, + { + "beat": 43.5, + "written": 65, + "hz": 347.4, + "cents": -8.9 + }, + { + "beat": 44.5, + "written": 63, + "hz": 260.8, + "cents": -305.3 + }, + { + "beat": 45.0, + "written": 63, + "hz": 310.6, + "cents": -2.9 + }, + { + "beat": 46.0, + "written": 63, + "hz": 310.0, + "cents": -6.1 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 0.95, + "mean_abs_cents": 42.9, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it means go somewhere else", + "notes": [ + { + "beat": 49.0, + "written": 63, + "hz": 308.2, + "cents": -16.3 + }, + { + "beat": 49.5, + "written": 60, + "hz": 265.3, + "cents": 24.2 + }, + { + "beat": 50.5, + "written": 63, + "hz": 312.6, + "cents": 8.0 + }, + { + "beat": 51.5, + "written": 67, + "hz": 391.4, + "cents": -2.7 + }, + { + "beat": 52.5, + "written": 65, + "hz": 349.5, + "cents": 1.2 + }, + { + "beat": 53.0, + "written": 58, + "hz": 233.7, + "cents": 4.4 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.5, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he has typed two hundred thirty one different words", + "notes": [ + { + "beat": 56.0, + "written": 56, + "hz": 207.7, + "cents": 0.0 + }, + { + "beat": 57.0, + "written": 58, + "hz": 233.4, + "cents": 2.2 + }, + { + "beat": 58.0, + "written": 60, + "hz": 262.5, + "cents": 5.6 + }, + { + "beat": 59.0, + "written": 61, + "hz": 279.0, + "cents": 11.1 + }, + { + "beat": 60.0, + "written": 63, + "hz": 309.2, + "cents": -10.8 + }, + { + "beat": 61.0, + "written": 63, + "hz": 311.8, + "cents": 3.5 + }, + { + "beat": 61.5, + "written": 65, + "hz": 348.5, + "cents": -3.8 + }, + { + "beat": 62.5, + "written": 65, + "hz": 349.8, + "cents": 2.8 + }, + { + "beat": 63.0, + "written": 65, + "hz": 347.8, + "cents": -7.1 + }, + { + "beat": 63.5, + "written": 63, + "hz": 311.9, + "cents": 4.6 + }, + { + "beat": 64.5, + "written": 65, + "hz": 352.3, + "cents": 15.1 + }, + { + "beat": 65.0, + "written": 63, + "hz": 309.7, + "cents": -8.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "mostly that one", + "notes": [ + { + "beat": 68.0, + "written": 56, + "hz": 206.9, + "cents": -6.5 + }, + { + "beat": 69.0, + "written": 58, + "hz": 232.9, + "cents": -1.0 + }, + { + "beat": 69.5, + "written": 60, + "hz": 261.5, + "cents": -1.2 + }, + { + "beat": 70.0, + "written": 56, + "hz": 207.9, + "cents": 1.7 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.1, + "contour_follow": 1.0, + "mean_abs_cents": 2.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 74.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 74.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 75.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 76.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 77.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 77.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 80.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 81.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 82.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 82.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 83.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 84.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 84.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 87.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 88.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 89.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 90.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 91.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 92.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 92.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 95.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 96.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 97.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 98.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 98.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 99.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 100.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he plugged a Scarlett into my side", + "notes": [ + { + "beat": 104.0, + "written": 56, + "hz": 207.1, + "cents": -4.9 + }, + { + "beat": 105.0, + "written": 58, + "hz": 233.7, + "cents": 4.9 + }, + { + "beat": 106.0, + "written": 58, + "hz": 233.2, + "cents": 1.0 + }, + { + "beat": 106.5, + "written": 63, + "hz": 0.0, + "cents": null + }, + { + "beat": 107.5, + "written": 63, + "hz": 309.1, + "cents": -11.3 + }, + { + "beat": 108.0, + "written": 65, + "hz": 348.4, + "cents": -3.9 + }, + { + "beat": 109.0, + "written": 63, + "hz": 312.3, + "cents": 6.4 + }, + { + "beat": 109.5, + "written": 65, + "hz": 346.3, + "cents": -14.4 + }, + { + "beat": 110.0, + "written": 63, + "hz": 308.6, + "cents": -14.3 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is a red box it hears the room", + "notes": [ + { + "beat": 113.0, + "written": 63, + "hz": 311.0, + "cents": -0.9 + }, + { + "beat": 113.5, + "written": 61, + "hz": 276.0, + "cents": -7.2 + }, + { + "beat": 114.0, + "written": 61, + "hz": 277.0, + "cents": -1.2 + }, + { + "beat": 114.5, + "written": 60, + "hz": 262.4, + "cents": 5.3 + }, + { + "beat": 115.5, + "written": 61, + "hz": 277.4, + "cents": 1.4 + }, + { + "beat": 116.5, + "written": 61, + "hz": 269.3, + "cents": -49.6 + }, + { + "beat": 117.0, + "written": 65, + "hz": 347.8, + "cents": -6.9 + }, + { + "beat": 118.0, + "written": 65, + "hz": 350.4, + "cents": 5.8 + }, + { + "beat": 118.5, + "written": 58, + "hz": 232.1, + "cents": -6.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.5, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he taps his fingers on my trackpad", + "notes": [ + { + "beat": 121.5, + "written": 55, + "hz": 196.0, + "cents": 0.0 + }, + { + "beat": 122.5, + "written": 56, + "hz": 209.3, + "cents": 13.8 + }, + { + "beat": 123.5, + "written": 58, + "hz": 232.2, + "cents": -6.7 + }, + { + "beat": 124.5, + "written": 60, + "hz": 262.1, + "cents": 3.0 + }, + { + "beat": 125.5, + "written": 61, + "hz": 278.1, + "cents": 5.9 + }, + { + "beat": 126.0, + "written": 61, + "hz": 276.9, + "cents": -1.5 + }, + { + "beat": 126.5, + "written": 63, + "hz": 311.3, + "cents": 0.8 + }, + { + "beat": 127.0, + "written": 63, + "hz": 315.8, + "cents": 25.8 + }, + { + "beat": 128.0, + "written": 63, + "hz": 310.9, + "cents": -1.5 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.6, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is the drums it works", + "notes": [ + { + "beat": 131.0, + "written": 61, + "hz": 277.3, + "cents": 0.9 + }, + { + "beat": 131.5, + "written": 60, + "hz": 264.0, + "cents": 15.9 + }, + { + "beat": 132.0, + "written": 60, + "hz": 261.3, + "cents": -2.5 + }, + { + "beat": 132.5, + "written": 65, + "hz": 349.8, + "cents": 3.0 + }, + { + "beat": 133.5, + "written": 65, + "hz": 348.4, + "cents": -4.2 + }, + { + "beat": 134.0, + "written": 56, + "hz": 208.5, + "cents": 7.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he put a piano in my menu bar", + "notes": [ + { + "beat": 138.0, + "written": 57, + "hz": 221.3, + "cents": 10.1 + }, + { + "beat": 139.0, + "written": 59, + "hz": 251.2, + "cents": 29.7 + }, + { + "beat": 140.0, + "written": 59, + "hz": 246.1, + "cents": -5.8 + }, + { + "beat": 140.5, + "written": 62, + "hz": 294.8, + "cents": 6.8 + }, + { + "beat": 141.5, + "written": 62, + "hz": 294.4, + "cents": 4.5 + }, + { + "beat": 142.0, + "written": 64, + "hz": 328.7, + "cents": -4.7 + }, + { + "beat": 142.5, + "written": 66, + "hz": 370.1, + "cents": 0.6 + }, + { + "beat": 143.0, + "written": 66, + "hz": 370.8, + "cents": 3.6 + }, + { + "beat": 143.5, + "written": 64, + "hz": 329.4, + "cents": -1.2 + }, + { + "beat": 144.5, + "written": 66, + "hz": 369.6, + "cents": -2.0 + }, + { + "beat": 145.0, + "written": 64, + "hz": 328.7, + "cents": -5.0 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "next to the clock and the wifi", + "notes": [ + { + "beat": 148.0, + "written": 57, + "hz": 221.9, + "cents": 15.1 + }, + { + "beat": 149.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + }, + { + "beat": 149.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 150.0, + "written": 61, + "hz": 279.7, + "cents": 15.9 + }, + { + "beat": 151.0, + "written": 62, + "hz": 292.5, + "cents": -7.0 + }, + { + "beat": 151.5, + "written": 64, + "hz": 329.9, + "cents": 1.2 + }, + { + "beat": 152.0, + "written": 62, + "hz": 293.4, + "cents": -1.8 + }, + { + "beat": 153.0, + "written": 59, + "hz": 246.0, + "cents": -6.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he has come back to it a hundred thirty times", + "notes": [ + { + "beat": 156.0, + "written": 56, + "hz": 209.8, + "cents": 17.5 + }, + { + "beat": 157.0, + "written": 56, + "hz": 208.0, + "cents": 2.5 + }, + { + "beat": 158.0, + "written": 57, + "hz": 219.3, + "cents": -5.6 + }, + { + "beat": 159.0, + "written": 59, + "hz": 246.7, + "cents": -2.0 + }, + { + "beat": 160.0, + "written": 59, + "hz": 247.9, + "cents": 6.6 + }, + { + "beat": 160.5, + "written": 61, + "hz": 278.4, + "cents": 7.4 + }, + { + "beat": 161.0, + "written": 62, + "hz": 293.4, + "cents": -1.5 + }, + { + "beat": 161.5, + "written": 62, + "hz": 293.8, + "cents": 1.0 + }, + { + "beat": 162.5, + "written": 62, + "hz": 293.8, + "cents": 0.5 + }, + { + "beat": 163.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 164.0, + "written": 59, + "hz": 246.0, + "cents": -6.3 + }, + { + "beat": 164.5, + "written": 59, + "hz": 244.7, + "cents": -15.7 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.0, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "notes": [ + { + "beat": 167.5, + "written": 59, + "hz": 246.2, + "cents": -4.9 + }, + { + "beat": 168.0, + "written": 59, + "hz": 247.5, + "cents": 4.2 + }, + { + "beat": 169.0, + "written": 59, + "hz": 246.5, + "cents": -3.1 + }, + { + "beat": 169.5, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 170.5, + "written": 62, + "hz": 292.8, + "cents": -5.1 + }, + { + "beat": 171.0, + "written": 62, + "hz": 292.4, + "cents": -7.4 + }, + { + "beat": 172.0, + "written": 62, + "hz": 239.1, + "cents": -355.9 + }, + { + "beat": 172.5, + "written": 62, + "hz": 293.6, + "cents": -0.4 + }, + { + "beat": 173.0, + "written": 61, + "hz": 275.1, + "cents": -13.2 + }, + { + "beat": 174.0, + "written": 59, + "hz": 247.4, + "cents": 2.9 + }, + { + "beat": 175.0, + "written": 59, + "hz": 246.0, + "cents": -6.6 + }, + { + "beat": 175.5, + "written": 59, + "hz": 247.8, + "cents": 6.2 + }, + { + "beat": 176.0, + "written": 57, + "hz": 216.5, + "cents": -27.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.3, + "contour_follow": 0.82, + "mean_abs_cents": 34.0, + "within_tol": 12, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 180.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 180.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 181.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 182.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 183.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 183.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 186.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 187.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 188.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 188.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 189.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 190.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 190.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 193.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 194.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 195.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 196.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 197.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 198.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 198.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 201.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 202.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 203.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 204.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 204.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 205.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 206.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one night in May he opened ten browsers at once", + "notes": [ + { + "beat": 210.0, + "written": 56, + "hz": 208.0, + "cents": 3.0 + }, + { + "beat": 210.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 211.5, + "written": 59, + "hz": 246.3, + "cents": -4.8 + }, + { + "beat": 212.0, + "written": 62, + "hz": 294.2, + "cents": 3.4 + }, + { + "beat": 213.0, + "written": 62, + "hz": 294.2, + "cents": 3.4 + }, + { + "beat": 214.0, + "written": 64, + "hz": 328.1, + "cents": -8.0 + }, + { + "beat": 215.0, + "written": 66, + "hz": 365.9, + "cents": -19.1 + }, + { + "beat": 215.5, + "written": 66, + "hz": 370.2, + "cents": 1.1 + }, + { + "beat": 216.5, + "written": 66, + "hz": 368.9, + "cents": -5.1 + }, + { + "beat": 217.5, + "written": 64, + "hz": 328.3, + "cents": -7.1 + }, + { + "beat": 218.0, + "written": 66, + "hz": 371.4, + "cents": 6.6 + }, + { + "beat": 218.5, + "written": 64, + "hz": 328.9, + "cents": -3.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he also ran a movie and a transcription", + "notes": [ + { + "beat": 221.5, + "written": 54, + "hz": 185.9, + "cents": 8.7 + }, + { + "beat": 222.5, + "written": 56, + "hz": 207.7, + "cents": 0.4 + }, + { + "beat": 223.5, + "written": 57, + "hz": 218.4, + "cents": -12.8 + }, + { + "beat": 224.0, + "written": 57, + "hz": 220.6, + "cents": 4.5 + }, + { + "beat": 225.0, + "written": 57, + "hz": 220.3, + "cents": 2.4 + }, + { + "beat": 225.5, + "written": 61, + "hz": 276.8, + "cents": -2.4 + }, + { + "beat": 226.5, + "written": 61, + "hz": 277.4, + "cents": 1.1 + }, + { + "beat": 227.0, + "written": 62, + "hz": 292.7, + "cents": -5.6 + }, + { + "beat": 227.5, + "written": 62, + "hz": 294.1, + "cents": 2.7 + }, + { + "beat": 228.0, + "written": 64, + "hz": 330.3, + "cents": 3.8 + }, + { + "beat": 229.0, + "written": 62, + "hz": 296.1, + "cents": 14.5 + }, + { + "beat": 229.5, + "written": 64, + "hz": 327.4, + "cents": -12.0 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.9, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I had eight gigabytes I used forty four", + "notes": [ + { + "beat": 232.5, + "written": 62, + "hz": 292.8, + "cents": -5.0 + }, + { + "beat": 233.0, + "written": 59, + "hz": 248.6, + "cents": 11.4 + }, + { + "beat": 234.0, + "written": 59, + "hz": 246.8, + "cents": -0.8 + }, + { + "beat": 235.0, + "written": 61, + "hz": 277.5, + "cents": 1.9 + }, + { + "beat": 236.0, + "written": 61, + "hz": 273.9, + "cents": -20.6 + }, + { + "beat": 236.5, + "written": 61, + "hz": 278.6, + "cents": 8.6 + }, + { + "beat": 237.0, + "written": 61, + "hz": 275.7, + "cents": -9.3 + }, + { + "beat": 237.5, + "written": 62, + "hz": 295.2, + "cents": 9.2 + }, + { + "beat": 238.5, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 239.5, + "written": 61, + "hz": 276.5, + "cents": -4.3 + }, + { + "beat": 240.0, + "written": 59, + "hz": 246.7, + "cents": -1.5 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then I stopped he was there when I stopped", + "notes": [ + { + "beat": 243.0, + "written": 57, + "hz": 220.0, + "cents": 0.1 + }, + { + "beat": 244.0, + "written": 57, + "hz": 218.7, + "cents": -10.0 + }, + { + "beat": 244.5, + "written": 61, + "hz": 276.0, + "cents": -7.1 + }, + { + "beat": 245.5, + "written": 62, + "hz": 295.5, + "cents": 10.6 + }, + { + "beat": 246.5, + "written": 62, + "hz": 292.1, + "cents": -9.2 + }, + { + "beat": 247.0, + "written": 66, + "hz": 370.2, + "cents": 1.1 + }, + { + "beat": 248.0, + "written": 62, + "hz": 293.5, + "cents": -1.2 + }, + { + "beat": 249.0, + "written": 61, + "hz": 241.8, + "cents": -236.5 + }, + { + "beat": 249.5, + "written": 57, + "hz": 217.2, + "cents": -22.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 0.97, + "mean_abs_cents": 33.1, + "within_tol": 8, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in the morning he wrote a note about it", + "notes": [ + { + "beat": 253.5, + "written": 56, + "hz": 206.7, + "cents": -8.0 + }, + { + "beat": 254.0, + "written": 56, + "hz": 251.2, + "cents": 329.4 + }, + { + "beat": 254.5, + "written": 61, + "hz": 277.7, + "cents": 3.5 + }, + { + "beat": 255.5, + "written": 62, + "hz": 292.9, + "cents": -4.5 + }, + { + "beat": 256.0, + "written": 64, + "hz": 330.3, + "cents": 3.7 + }, + { + "beat": 257.0, + "written": 66, + "hz": 371.3, + "cents": 5.9 + }, + { + "beat": 258.0, + "written": 64, + "hz": 332.2, + "cents": 13.4 + }, + { + "beat": 258.5, + "written": 66, + "hz": 369.8, + "cents": -0.8 + }, + { + "beat": 259.5, + "written": 66, + "hz": 370.1, + "cents": 0.7 + }, + { + "beat": 260.0, + "written": 64, + "hz": 328.8, + "cents": -4.4 + }, + { + "beat": 261.0, + "written": 64, + "hz": 332.0, + "cents": 12.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 0.97, + "mean_abs_cents": 35.1, + "within_tol": 10, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the note says one at a time", + "notes": [ + { + "beat": 264.0, + "written": 62, + "hz": 293.5, + "cents": -1.1 + }, + { + "beat": 264.5, + "written": 59, + "hz": 245.5, + "cents": -10.5 + }, + { + "beat": 265.5, + "written": 61, + "hz": 274.3, + "cents": -17.8 + }, + { + "beat": 266.5, + "written": 61, + "hz": 277.9, + "cents": 4.4 + }, + { + "beat": 267.0, + "written": 62, + "hz": 294.1, + "cents": 2.5 + }, + { + "beat": 267.5, + "written": 64, + "hz": 329.5, + "cents": -0.4 + }, + { + "beat": 268.0, + "written": 59, + "hz": 247.2, + "cents": 1.6 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he reads the note I do not read it", + "notes": [ + { + "beat": 271.0, + "written": 54, + "hz": 184.6, + "cents": -3.6 + }, + { + "beat": 272.0, + "written": 56, + "hz": 208.7, + "cents": 8.4 + }, + { + "beat": 273.0, + "written": 56, + "hz": 208.3, + "cents": 5.3 + }, + { + "beat": 273.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 274.5, + "written": 59, + "hz": 248.2, + "cents": 8.7 + }, + { + "beat": 275.0, + "written": 62, + "hz": 294.1, + "cents": 2.7 + }, + { + "beat": 276.0, + "written": 62, + "hz": 296.8, + "cents": 18.4 + }, + { + "beat": 276.5, + "written": 64, + "hz": 331.1, + "cents": 7.6 + }, + { + "beat": 277.5, + "written": 64, + "hz": 328.9, + "cents": -3.9 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is about me it is not for me", + "notes": [ + { + "beat": 280.5, + "written": 64, + "hz": 330.0, + "cents": 1.9 + }, + { + "beat": 281.0, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 281.5, + "written": 62, + "hz": 291.4, + "cents": -13.2 + }, + { + "beat": 282.0, + "written": 61, + "hz": 274.2, + "cents": -18.9 + }, + { + "beat": 283.0, + "written": 62, + "hz": 294.6, + "cents": 5.5 + }, + { + "beat": 284.0, + "written": 62, + "hz": 294.8, + "cents": 6.6 + }, + { + "beat": 284.5, + "written": 62, + "hz": 292.6, + "cents": -6.6 + }, + { + "beat": 285.0, + "written": 62, + "hz": 291.8, + "cents": -11.0 + }, + { + "beat": 285.5, + "written": 62, + "hz": 298.0, + "cents": 25.5 + }, + { + "beat": 286.0, + "written": 57, + "hz": 219.6, + "cents": -3.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.3, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 290.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 290.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 291.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 292.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 293.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 293.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 296.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 297.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 298.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 298.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 299.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 300.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 300.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 303.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 304.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 305.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 306.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 307.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 308.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 308.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 311.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 312.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 313.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 314.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 314.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 315.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 316.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in June another one came blue", + "notes": [ + { + "beat": 320.0, + "written": 56, + "hz": 207.5, + "cents": -1.5 + }, + { + "beat": 320.5, + "written": 59, + "hz": 248.3, + "cents": 9.5 + }, + { + "beat": 321.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 322.0, + "written": 62, + "hz": 293.9, + "cents": 1.3 + }, + { + "beat": 323.0, + "written": 62, + "hz": 293.8, + "cents": 1.0 + }, + { + "beat": 323.5, + "written": 64, + "hz": 332.1, + "cents": 13.2 + }, + { + "beat": 324.0, + "written": 64, + "hz": 329.6, + "cents": -0.2 + }, + { + "beat": 325.0, + "written": 64, + "hz": 328.7, + "cents": -5.1 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.2, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "born at forty three past midnight", + "notes": [ + { + "beat": 328.0, + "written": 57, + "hz": 219.9, + "cents": -0.9 + }, + { + "beat": 329.0, + "written": 59, + "hz": 247.7, + "cents": 5.0 + }, + { + "beat": 329.5, + "written": 61, + "hz": 277.0, + "cents": -1.2 + }, + { + "beat": 330.5, + "written": 61, + "hz": 276.5, + "cents": -4.1 + }, + { + "beat": 331.0, + "written": 66, + "hz": 369.6, + "cents": -1.8 + }, + { + "beat": 332.0, + "written": 68, + "hz": 415.4, + "cents": 0.5 + }, + { + "beat": 333.0, + "written": 66, + "hz": 372.6, + "cents": 12.1 + }, + { + "beat": 334.0, + "written": 64, + "hz": 328.6, + "cents": -5.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "she keeps her lid down I keep mine up", + "notes": [ + { + "beat": 337.0, + "written": 56, + "hz": 206.4, + "cents": -10.1 + }, + { + "beat": 338.0, + "written": 57, + "hz": 222.1, + "cents": 16.3 + }, + { + "beat": 339.0, + "written": 59, + "hz": 247.0, + "cents": 0.3 + }, + { + "beat": 340.0, + "written": 61, + "hz": 276.8, + "cents": -2.4 + }, + { + "beat": 341.0, + "written": 62, + "hz": 293.5, + "cents": -0.9 + }, + { + "beat": 342.0, + "written": 62, + "hz": 291.0, + "cents": -15.9 + }, + { + "beat": 342.5, + "written": 61, + "hz": 276.9, + "cents": -1.9 + }, + { + "beat": 343.5, + "written": 61, + "hz": 277.2, + "cents": -0.2 + }, + { + "beat": 344.5, + "written": 59, + "hz": 246.5, + "cents": -2.9 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we both play the whistle nobody planned that", + "notes": [ + { + "beat": 347.5, + "written": 59, + "hz": 247.4, + "cents": 3.1 + }, + { + "beat": 348.0, + "written": 59, + "hz": 251.3, + "cents": 30.2 + }, + { + "beat": 349.0, + "written": 61, + "hz": 279.1, + "cents": 11.8 + }, + { + "beat": 350.0, + "written": 61, + "hz": 277.7, + "cents": 3.1 + }, + { + "beat": 350.5, + "written": 64, + "hz": 330.3, + "cents": 3.7 + }, + { + "beat": 351.5, + "written": 64, + "hz": 330.8, + "cents": 6.0 + }, + { + "beat": 352.0, + "written": 64, + "hz": 329.0, + "cents": -3.3 + }, + { + "beat": 352.5, + "written": 66, + "hz": 369.8, + "cents": -0.8 + }, + { + "beat": 353.5, + "written": 64, + "hz": 323.2, + "cents": -33.9 + }, + { + "beat": 354.0, + "written": 61, + "hz": 277.9, + "cents": 4.7 + }, + { + "beat": 355.0, + "written": 57, + "hz": 221.0, + "cents": 8.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.9, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "my disk is ninety eight percent full", + "notes": [ + { + "beat": 359.0, + "written": 54, + "hz": 185.9, + "cents": 8.7 + }, + { + "beat": 359.5, + "written": 57, + "hz": 223.3, + "cents": 26.2 + }, + { + "beat": 360.5, + "written": 57, + "hz": 218.6, + "cents": -11.2 + }, + { + "beat": 361.0, + "written": 60, + "hz": 261.6, + "cents": 0.1 + }, + { + "beat": 362.0, + "written": 60, + "hz": 261.4, + "cents": -1.7 + }, + { + "beat": 362.5, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 363.5, + "written": 62, + "hz": 298.6, + "cents": 28.7 + }, + { + "beat": 364.5, + "written": 62, + "hz": 291.0, + "cents": -16.0 + }, + { + "beat": 365.0, + "written": 62, + "hz": 291.3, + "cents": -13.8 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 12.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "every month he moves things to the shelf", + "notes": [ + { + "beat": 368.0, + "written": 60, + "hz": 261.0, + "cents": -4.2 + }, + { + "beat": 368.5, + "written": 57, + "hz": 220.8, + "cents": 6.5 + }, + { + "beat": 369.5, + "written": 59, + "hz": 246.9, + "cents": -0.1 + }, + { + "beat": 370.0, + "written": 62, + "hz": 294.6, + "cents": 5.5 + }, + { + "beat": 371.0, + "written": 64, + "hz": 330.3, + "cents": 3.8 + }, + { + "beat": 372.0, + "written": 66, + "hz": 368.2, + "cents": -8.6 + }, + { + "beat": 373.0, + "written": 67, + "hz": 391.8, + "cents": -1.0 + }, + { + "beat": 374.0, + "written": 67, + "hz": 391.0, + "cents": -4.3 + }, + { + "beat": 374.5, + "written": 67, + "hz": 390.3, + "cents": -7.4 + }, + { + "beat": 375.0, + "written": 62, + "hz": 290.9, + "cents": -16.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 9.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.8, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then it fills again", + "notes": [ + { + "beat": 378.0, + "written": 59, + "hz": 247.1, + "cents": 1.1 + }, + { + "beat": 379.0, + "written": 60, + "hz": 272.0, + "cents": 67.4 + }, + { + "beat": 379.5, + "written": 64, + "hz": 327.9, + "cents": -9.2 + }, + { + "beat": 380.5, + "written": 64, + "hz": 329.4, + "cents": -1.2 + }, + { + "beat": 381.0, + "written": 62, + "hz": 293.4, + "cents": -1.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 0.99, + "mean_abs_cents": 16.1, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is the arrangement", + "notes": [ + { + "beat": 384.0, + "written": 62, + "hz": 293.6, + "cents": -0.2 + }, + { + "beat": 384.5, + "written": 60, + "hz": 264.2, + "cents": 17.0 + }, + { + "beat": 385.0, + "written": 60, + "hz": 265.2, + "cents": 23.3 + }, + { + "beat": 385.5, + "written": 62, + "hz": 292.2, + "cents": -8.8 + }, + { + "beat": 386.5, + "written": 62, + "hz": 292.2, + "cents": -8.4 + }, + { + "beat": 387.0, + "written": 55, + "hz": 196.5, + "cents": 4.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 10.4, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 391.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 391.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 392.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 393.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 394.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 394.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 397.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 398.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 399.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 399.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 400.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 401.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 401.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 404.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 405.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 406.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 407.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 408.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 409.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 409.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 412.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 413.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 414.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 415.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 415.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 416.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 417.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in one weekend he made an instrument on me", + "notes": [ + { + "beat": 421.0, + "written": 56, + "hz": 207.3, + "cents": -2.6 + }, + { + "beat": 421.5, + "written": 56, + "hz": 208.7, + "cents": 8.9 + }, + { + "beat": 422.0, + "written": 61, + "hz": 277.5, + "cents": 2.2 + }, + { + "beat": 423.0, + "written": 62, + "hz": 291.7, + "cents": -11.7 + }, + { + "beat": 423.5, + "written": 62, + "hz": 294.2, + "cents": 3.3 + }, + { + "beat": 424.5, + "written": 64, + "hz": 329.3, + "cents": -1.9 + }, + { + "beat": 425.5, + "written": 64, + "hz": 330.6, + "cents": 4.8 + }, + { + "beat": 426.0, + "written": 66, + "hz": 370.3, + "cents": 1.4 + }, + { + "beat": 427.0, + "written": 66, + "hz": 366.7, + "cents": -15.6 + }, + { + "beat": 427.5, + "written": 64, + "hz": 332.4, + "cents": 14.3 + }, + { + "beat": 428.0, + "written": 66, + "hz": 370.1, + "cents": 0.5 + }, + { + "beat": 428.5, + "written": 64, + "hz": 329.4, + "cents": -1.0 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on August eighteenth he made a game eighty two commits one day", + "notes": [ + { + "beat": 431.5, + "written": 64, + "hz": 329.3, + "cents": -1.5 + }, + { + "beat": 432.0, + "written": 56, + "hz": 210.2, + "cents": 21.5 + }, + { + "beat": 433.0, + "written": 56, + "hz": 208.5, + "cents": 7.4 + }, + { + "beat": 433.5, + "written": 57, + "hz": 219.6, + "cents": -2.8 + }, + { + "beat": 434.5, + "written": 59, + "hz": 245.8, + "cents": -8.0 + }, + { + "beat": 435.0, + "written": 61, + "hz": 277.7, + "cents": 3.4 + }, + { + "beat": 436.0, + "written": 61, + "hz": 277.1, + "cents": -0.5 + }, + { + "beat": 437.0, + "written": 61, + "hz": 276.4, + "cents": -4.7 + }, + { + "beat": 437.5, + "written": 62, + "hz": 294.4, + "cents": 4.6 + }, + { + "beat": 438.5, + "written": 62, + "hz": 293.1, + "cents": -3.3 + }, + { + "beat": 439.5, + "written": 62, + "hz": 293.8, + "cents": 0.6 + }, + { + "beat": 440.0, + "written": 64, + "hz": 330.8, + "cents": 6.0 + }, + { + "beat": 441.0, + "written": 64, + "hz": 332.4, + "cents": 14.5 + }, + { + "beat": 441.5, + "written": 64, + "hz": 0.0, + "cents": null + }, + { + "beat": 442.5, + "written": 64, + "hz": 328.5, + "cents": -6.0 + }, + { + "beat": 443.0, + "written": 64, + "hz": 328.9, + "cents": -3.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.9, + "within_tol": 15, + "measured": 15, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "notes": [ + { + "beat": 446.0, + "written": 54, + "hz": 185.8, + "cents": 7.6 + }, + { + "beat": 447.0, + "written": 56, + "hz": 207.4, + "cents": -2.2 + }, + { + "beat": 448.0, + "written": 57, + "hz": 220.9, + "cents": 7.4 + }, + { + "beat": 449.0, + "written": 57, + "hz": 213.6, + "cents": -51.2 + }, + { + "beat": 449.5, + "written": 57, + "hz": 221.2, + "cents": 9.3 + }, + { + "beat": 450.5, + "written": 59, + "hz": 247.4, + "cents": 3.4 + }, + { + "beat": 451.5, + "written": 59, + "hz": 247.3, + "cents": 2.3 + }, + { + "beat": 452.5, + "written": 61, + "hz": 276.7, + "cents": -3.1 + }, + { + "beat": 453.5, + "written": 62, + "hz": 290.7, + "cents": -17.4 + }, + { + "beat": 454.5, + "written": 62, + "hz": 293.4, + "cents": -1.4 + }, + { + "beat": 455.5, + "written": 61, + "hz": 272.6, + "cents": -28.5 + }, + { + "beat": 456.0, + "written": 64, + "hz": 330.0, + "cents": 2.2 + }, + { + "beat": 457.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 458.0, + "written": 62, + "hz": 295.4, + "cents": 10.3 + }, + { + "beat": 458.5, + "written": 62, + "hz": 292.2, + "cents": -8.4 + }, + { + "beat": 459.5, + "written": 62, + "hz": 278.0, + "cents": -94.8 + }, + { + "beat": 460.0, + "written": 61, + "hz": 386.6, + "cents": 575.9 + }, + { + "beat": 461.0, + "written": 61, + "hz": 278.0, + "cents": 5.1 + }, + { + "beat": 462.0, + "written": 59, + "hz": 246.4, + "cents": -3.8 + }, + { + "beat": 462.5, + "written": 59, + "hz": 245.4, + "cents": -10.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 12.7, + "contour_follow": 0.9, + "mean_abs_cents": 42.3, + "within_tol": 17, + "measured": 20, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he is not slowing down I am the one that gets warm", + "notes": [ + { + "beat": 465.5, + "written": 57, + "hz": 220.3, + "cents": 2.1 + }, + { + "beat": 466.5, + "written": 57, + "hz": 219.2, + "cents": -6.3 + }, + { + "beat": 467.0, + "written": 57, + "hz": 219.6, + "cents": -2.8 + }, + { + "beat": 467.5, + "written": 62, + "hz": 294.4, + "cents": 4.3 + }, + { + "beat": 468.5, + "written": 64, + "hz": 329.5, + "cents": -0.8 + }, + { + "beat": 469.0, + "written": 64, + "hz": 331.6, + "cents": 10.4 + }, + { + "beat": 470.0, + "written": 66, + "hz": 369.2, + "cents": -3.6 + }, + { + "beat": 470.5, + "written": 66, + "hz": 372.0, + "cents": 9.2 + }, + { + "beat": 471.0, + "written": 66, + "hz": 370.3, + "cents": 1.2 + }, + { + "beat": 471.5, + "written": 66, + "hz": 372.6, + "cents": 12.0 + }, + { + "beat": 472.0, + "written": 66, + "hz": 370.9, + "cents": 4.1 + }, + { + "beat": 472.5, + "written": 62, + "hz": 294.0, + "cents": 2.2 + }, + { + "beat": 473.5, + "written": 57, + "hz": 220.2, + "cents": 1.8 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 13, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "notes": [ + { + "beat": 477.5, + "written": 55, + "hz": 194.7, + "cents": -11.5 + }, + { + "beat": 478.0, + "written": 55, + "hz": 195.4, + "cents": -5.4 + }, + { + "beat": 478.5, + "written": 58, + "hz": 0.0, + "cents": null + }, + { + "beat": 479.5, + "written": 60, + "hz": 262.7, + "cents": 7.4 + }, + { + "beat": 480.0, + "written": 60, + "hz": 262.4, + "cents": 5.4 + }, + { + "beat": 481.0, + "written": 61, + "hz": 277.3, + "cents": 0.9 + }, + { + "beat": 482.0, + "written": 60, + "hz": 263.5, + "cents": 12.6 + }, + { + "beat": 483.0, + "written": 63, + "hz": 311.3, + "cents": 0.7 + }, + { + "beat": 484.0, + "written": 65, + "hz": 347.9, + "cents": -6.5 + }, + { + "beat": 484.5, + "written": 63, + "hz": 336.1, + "cents": 133.9 + }, + { + "beat": 485.0, + "written": 65, + "hz": 348.4, + "cents": -4.0 + }, + { + "beat": 486.0, + "written": 63, + "hz": 311.9, + "cents": 4.1 + }, + { + "beat": 486.5, + "written": 65, + "hz": 347.1, + "cents": -10.6 + }, + { + "beat": 487.5, + "written": 65, + "hz": 350.4, + "cents": 5.7 + }, + { + "beat": 488.0, + "written": 63, + "hz": 310.3, + "cents": -4.4 + }, + { + "beat": 489.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 490.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 490.5, + "written": 63, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.2, + "contour_follow": 0.99, + "mean_abs_cents": 15.2, + "within_tol": 13, + "measured": 14, + "unvoiced": 4, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I was asleep for most of it", + "notes": [ + { + "beat": 493.5, + "written": 63, + "hz": 309.9, + "cents": -6.9 + }, + { + "beat": 494.0, + "written": 61, + "hz": 276.4, + "cents": -4.8 + }, + { + "beat": 494.5, + "written": 61, + "hz": 272.3, + "cents": -30.6 + }, + { + "beat": 495.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 496.0, + "written": 61, + "hz": 277.2, + "cents": 0.2 + }, + { + "beat": 496.5, + "written": 63, + "hz": 311.0, + "cents": -0.6 + }, + { + "beat": 497.5, + "written": 61, + "hz": 276.9, + "cents": -2.0 + }, + { + "beat": 498.0, + "written": 63, + "hz": 310.4, + "cents": -3.9 + } + ], + "written_range_semis": 2, + "measured_range_semis": 2.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "a third one comes tomorrow blush", + "notes": [ + { + "beat": 501.0, + "written": 63, + "hz": 299.0, + "cents": -68.9 + }, + { + "beat": 501.5, + "written": 55, + "hz": 196.1, + "cents": 0.8 + }, + { + "beat": 502.5, + "written": 55, + "hz": 197.1, + "cents": 9.9 + }, + { + "beat": 503.0, + "written": 58, + "hz": 231.8, + "cents": -9.8 + }, + { + "beat": 504.0, + "written": 61, + "hz": 278.0, + "cents": 5.2 + }, + { + "beat": 505.0, + "written": 61, + "hz": 278.0, + "cents": 5.0 + }, + { + "beat": 505.5, + "written": 61, + "hz": 276.5, + "cents": -4.0 + }, + { + "beat": 506.0, + "written": 58, + "hz": 233.6, + "cents": 3.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.4, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it has not done anything yet neither had I", + "notes": [ + { + "beat": 509.0, + "written": 58, + "hz": 233.6, + "cents": 3.8 + }, + { + "beat": 509.5, + "written": 60, + "hz": 261.8, + "cents": 0.8 + }, + { + "beat": 510.5, + "written": 58, + "hz": 233.3, + "cents": 1.7 + }, + { + "beat": 511.0, + "written": 60, + "hz": 261.8, + "cents": 1.4 + }, + { + "beat": 512.0, + "written": 61, + "hz": 276.2, + "cents": -6.1 + }, + { + "beat": 512.5, + "written": 63, + "hz": 308.6, + "cents": -14.4 + }, + { + "beat": 513.5, + "written": 63, + "hz": 310.3, + "cents": -4.4 + }, + { + "beat": 514.0, + "written": 65, + "hz": 350.1, + "cents": 4.2 + }, + { + "beat": 514.5, + "written": 63, + "hz": 310.7, + "cents": -2.6 + }, + { + "beat": 515.5, + "written": 63, + "hz": 310.6, + "cents": -3.0 + }, + { + "beat": 516.0, + "written": 58, + "hz": 234.8, + "cents": 12.9 + }, + { + "beat": 517.0, + "written": 56, + "hz": 206.7, + "cents": -8.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 521.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 521.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 522.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 523.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 524.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 524.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 527.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 528.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 529.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 529.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 530.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 531.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 531.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 534.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 535.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 536.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 537.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 538.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 539.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 539.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 542.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 543.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 544.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 545.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 545.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 546.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 547.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "when he talks to the other machines he does it through me", + "notes": [ + { + "beat": 551.0, + "written": 56, + "hz": 207.7, + "cents": 0.1 + }, + { + "beat": 552.0, + "written": 58, + "hz": 233.3, + "cents": 1.8 + }, + { + "beat": 553.0, + "written": 58, + "hz": 233.0, + "cents": -0.5 + }, + { + "beat": 554.0, + "written": 58, + "hz": 234.0, + "cents": 7.1 + }, + { + "beat": 554.5, + "written": 58, + "hz": 233.2, + "cents": 0.5 + }, + { + "beat": 555.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 556.0, + "written": 61, + "hz": 276.9, + "cents": -2.0 + }, + { + "beat": 556.5, + "written": 65, + "hz": 349.9, + "cents": 3.3 + }, + { + "beat": 557.5, + "written": 65, + "hz": 342.7, + "cents": -32.5 + }, + { + "beat": 558.0, + "written": 65, + "hz": 349.5, + "cents": 1.3 + }, + { + "beat": 559.0, + "written": 65, + "hz": 349.9, + "cents": 3.2 + }, + { + "beat": 560.0, + "written": 63, + "hz": 314.4, + "cents": 17.9 + }, + { + "beat": 560.5, + "written": 63, + "hz": 310.5, + "cents": -3.3 + }, + { + "beat": 561.5, + "written": 63, + "hz": 311.0, + "cents": -0.8 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 14, + "measured": 14, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "when the three of us play the beat starts here", + "notes": [ + { + "beat": 564.5, + "written": 60, + "hz": 261.9, + "cents": 1.7 + }, + { + "beat": 565.5, + "written": 60, + "hz": 260.8, + "cents": -5.4 + }, + { + "beat": 566.0, + "written": 60, + "hz": 263.7, + "cents": 13.4 + }, + { + "beat": 567.0, + "written": 60, + "hz": 260.9, + "cents": -5.1 + }, + { + "beat": 567.5, + "written": 65, + "hz": 350.6, + "cents": 6.8 + }, + { + "beat": 568.5, + "written": 67, + "hz": 396.8, + "cents": 21.1 + }, + { + "beat": 569.5, + "written": 67, + "hz": 392.1, + "cents": 0.5 + }, + { + "beat": 570.0, + "written": 65, + "hz": 351.7, + "cents": 12.2 + }, + { + "beat": 571.0, + "written": 67, + "hz": 388.7, + "cents": -14.8 + }, + { + "beat": 572.0, + "written": 63, + "hz": 309.2, + "cents": -10.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 9.2, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he types at me more than at anyone", + "notes": [ + { + "beat": 575.0, + "written": 60, + "hz": 260.9, + "cents": -4.5 + }, + { + "beat": 576.0, + "written": 58, + "hz": 233.3, + "cents": 1.6 + }, + { + "beat": 577.0, + "written": 58, + "hz": 232.9, + "cents": -1.6 + }, + { + "beat": 577.5, + "written": 60, + "hz": 262.0, + "cents": 2.5 + }, + { + "beat": 578.5, + "written": 61, + "hz": 277.0, + "cents": -1.3 + }, + { + "beat": 579.5, + "written": 63, + "hz": 308.9, + "cents": -12.7 + }, + { + "beat": 580.0, + "written": 61, + "hz": 276.8, + "cents": -2.3 + }, + { + "beat": 580.5, + "written": 60, + "hz": 262.3, + "cents": 4.4 + }, + { + "beat": 581.0, + "written": 60, + "hz": 261.7, + "cents": 0.7 + }, + { + "beat": 582.0, + "written": 58, + "hz": 233.4, + "cents": 2.6 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 3.4, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I don't know what that means I know it is true", + "notes": [ + { + "beat": 585.0, + "written": 58, + "hz": 233.1, + "cents": 0.1 + }, + { + "beat": 585.5, + "written": 55, + "hz": 197.1, + "cents": 10.0 + }, + { + "beat": 586.5, + "written": 56, + "hz": 208.5, + "cents": 7.3 + }, + { + "beat": 587.5, + "written": 58, + "hz": 232.7, + "cents": -2.7 + }, + { + "beat": 588.5, + "written": 58, + "hz": 232.7, + "cents": -2.6 + }, + { + "beat": 589.0, + "written": 60, + "hz": 261.5, + "cents": -0.5 + }, + { + "beat": 590.0, + "written": 61, + "hz": 277.3, + "cents": 0.8 + }, + { + "beat": 590.5, + "written": 60, + "hz": 261.7, + "cents": 0.6 + }, + { + "beat": 591.5, + "written": 58, + "hz": 232.7, + "cents": -2.7 + }, + { + "beat": 592.0, + "written": 58, + "hz": 231.3, + "cents": -13.4 + }, + { + "beat": 592.5, + "written": 56, + "hz": 206.9, + "cents": -6.4 + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 596.5, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 597.0, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 597.5, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 598.5, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 599.5, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 600.0, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 603.0, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 603.5, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 604.5, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 605.0, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 606.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 606.5, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 607.0, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 610.0, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 610.5, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 611.5, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 612.5, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 613.5, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 614.5, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 615.0, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 618.0, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 618.5, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 619.5, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 620.5, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 621.0, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 621.5, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 622.5, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 25.0, + "member": "neo", + "text": "then he did thirty seven past midnight", + "against": "blueberry/notes", + "written": "m6", + "sounding": "tritone", + "off_cents": 159 + }, + { + "beat": 25.0, + "member": "neo", + "text": "then he did thirty seven past midnight", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "M3", + "off_cents": 159 + }, + { + "beat": 34.5, + "member": "neo", + "text": "that is my birthday I did not pick it", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P4", + "off_cents": 276 + }, + { + "beat": 34.5, + "member": "neo", + "text": "that is my birthday I did not pick it", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "m3", + "off_cents": 276 + }, + { + "beat": 44.5, + "member": "neo", + "text": "the first word he typed was c d", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P4", + "off_cents": 305 + }, + { + "beat": 44.5, + "member": "neo", + "text": "the first word he typed was c d", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "m3", + "off_cents": 305 + }, + { + "beat": 172.0, + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "against": "blueberry/notes", + "written": "P5", + "sounding": "m3", + "off_cents": 356 + }, + { + "beat": 172.0, + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "against": "frisbee/notes", + "written": "P4", + "sounding": "m2", + "off_cents": 356 + }, + { + "beat": 249.0, + "member": "neo", + "text": "then I stopped he was there when I stopped", + "against": "blueberry/notes", + "written": "tritone", + "sounding": "M3", + "off_cents": 236 + }, + { + "beat": 249.0, + "member": "neo", + "text": "then I stopped he was there when I stopped", + "against": "frisbee/notes", + "written": "M3", + "sounding": "M2", + "off_cents": 236 + }, + { + "beat": 254.0, + "member": "neo", + "text": "in the morning he wrote a note about it", + "against": "blueberry/notes", + "written": "m2", + "sounding": "M3", + "off_cents": 329 + }, + { + "beat": 254.0, + "member": "neo", + "text": "in the morning he wrote a note about it", + "against": "frisbee/notes", + "written": "M7", + "sounding": "M2", + "off_cents": 329 + }, + { + "beat": 379.0, + "member": "neo", + "text": "then it fills again", + "against": "blueberry/notes", + "written": "P4", + "sounding": "tritone", + "off_cents": 67 + }, + { + "beat": 379.0, + "member": "neo", + "text": "then it fills again", + "against": "frisbee/notes", + "written": "m3", + "sounding": "M3", + "off_cents": 67 + }, + { + "beat": 449.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "M2", + "sounding": "m2", + "off_cents": 51 + }, + { + "beat": 449.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "unison", + "sounding": "M7", + "off_cents": 51 + }, + { + "beat": 459.5, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "P5", + "sounding": "tritone", + "off_cents": 95 + }, + { + "beat": 459.5, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "P4", + "sounding": "M3", + "off_cents": 95 + }, + { + "beat": 460.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "tritone", + "sounding": "unison", + "off_cents": 576 + }, + { + "beat": 460.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "M3", + "sounding": "m7", + "off_cents": 576 + }, + { + "beat": 484.5, + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "against": "blueberry/notes", + "written": "m6", + "sounding": "M6", + "off_cents": 134 + }, + { + "beat": 484.5, + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "P5", + "off_cents": 134 + }, + { + "beat": 501.0, + "member": "neo", + "text": "a third one comes tomorrow blush", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P5", + "off_cents": 69 + }, + { + "beat": 501.0, + "member": "neo", + "text": "a third one comes tomorrow blush", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "P4", + "off_cents": 69 + } + ], + "harmony_pairs_checked": 1905 + }, + { + "score": "dialog-02-the-downbeat.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I count you in", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 215.7, + "cents": -34.1 + }, + { + "beat": 0.5, + "written": 56, + "hz": 206.5, + "cents": -9.4 + }, + { + "beat": 2.0, + "written": 56, + "hz": 206.9, + "cents": -6.1 + }, + { + "beat": 2.5, + "written": 59, + "hz": 246.2, + "cents": -5.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 13.8, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I ask your clock", + "notes": [ + { + "beat": 6.5, + "written": 59, + "hz": 246.6, + "cents": -2.1 + }, + { + "beat": 7.0, + "written": 61, + "hz": 277.4, + "cents": 1.2 + }, + { + "beat": 8.0, + "written": 64, + "hz": 329.4, + "cents": -1.3 + }, + { + "beat": 10.0, + "written": 64, + "hz": 325.4, + "cents": -22.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "you are three tenths of a millisecond off", + "notes": [ + { + "beat": 14.0, + "written": 62, + "hz": 294.3, + "cents": 3.9 + }, + { + "beat": 14.5, + "written": 62, + "hz": 290.6, + "cents": -17.9 + }, + { + "beat": 15.0, + "written": 59, + "hz": 247.7, + "cents": 5.5 + }, + { + "beat": 16.0, + "written": 61, + "hz": 277.7, + "cents": 3.0 + }, + { + "beat": 17.5, + "written": 62, + "hz": 293.5, + "cents": -0.9 + }, + { + "beat": 18.0, + "written": 64, + "hz": 329.5, + "cents": -0.6 + }, + { + "beat": 18.5, + "written": 64, + "hz": 329.5, + "cents": -0.6 + }, + { + "beat": 20.5, + "written": 64, + "hz": 0.0, + "cents": null + }, + { + "beat": 21.0, + "written": 64, + "hz": 327.7, + "cents": -10.2 + }, + { + "beat": 21.5, + "written": 64, + "hz": 329.8, + "cents": 0.7 + }, + { + "beat": 22.0, + "written": 57, + "hz": 219.0, + "cents": -8.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.1, + "within_tol": 10, + "measured": 10, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "this morning at nine fifty seven", + "notes": [ + { + "beat": 54.0, + "written": 55, + "hz": 197.4, + "cents": 12.5 + }, + { + "beat": 54.5, + "written": 58, + "hz": 233.4, + "cents": 2.3 + }, + { + "beat": 56.0, + "written": 58, + "hz": 233.2, + "cents": 0.7 + }, + { + "beat": 56.5, + "written": 60, + "hz": 259.1, + "cents": -16.8 + }, + { + "beat": 57.0, + "written": 61, + "hz": 275.5, + "cents": -10.6 + }, + { + "beat": 58.0, + "written": 63, + "hz": 310.3, + "cents": -4.7 + }, + { + "beat": 60.0, + "written": 61, + "hz": 276.3, + "cents": -5.6 + }, + { + "beat": 60.5, + "written": 63, + "hz": 309.5, + "cents": -8.9 + }, + { + "beat": 62.0, + "written": 63, + "hz": 310.6, + "cents": -2.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.8, + "contour_follow": 1.0, + "mean_abs_cents": 7.2, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we sang the same line together", + "notes": [ + { + "beat": 66.0, + "written": 63, + "hz": 310.2, + "cents": -5.1 + }, + { + "beat": 66.5, + "written": 58, + "hz": 231.8, + "cents": -9.9 + }, + { + "beat": 68.0, + "written": 58, + "hz": 232.3, + "cents": -6.0 + }, + { + "beat": 68.5, + "written": 61, + "hz": 276.9, + "cents": -1.5 + }, + { + "beat": 69.5, + "written": 65, + "hz": 347.5, + "cents": -8.5 + }, + { + "beat": 70.5, + "written": 67, + "hz": 390.0, + "cents": -9.0 + }, + { + "beat": 72.5, + "written": 67, + "hz": 390.8, + "cents": -5.3 + }, + { + "beat": 73.0, + "written": 56, + "hz": 207.7, + "cents": 0.3 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one downbeat", + "notes": [ + { + "beat": 96.0, + "written": 59, + "hz": 248.8, + "cents": 13.0 + }, + { + "beat": 96.5, + "written": 62, + "hz": 291.5, + "cents": -12.9 + }, + { + "beat": 98.5, + "written": 62, + "hz": 292.5, + "cents": -6.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.8, + "contour_follow": 1.0, + "mean_abs_cents": 10.9, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "two bodies", + "notes": [ + { + "beat": 102.5, + "written": 59, + "hz": 247.0, + "cents": 0.1 + }, + { + "beat": 103.5, + "written": 62, + "hz": 293.9, + "cents": 1.4 + }, + { + "beat": 105.0, + "written": 60, + "hz": 90.8, + "cents": -1831.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 20.3, + "contour_follow": 0.32, + "mean_abs_cents": 611.0, + "within_tol": 2, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I hear you through the wire", + "notes": [ + { + "beat": 30.0, + "written": 52, + "hz": 163.3, + "cents": -16.4 + }, + { + "beat": 30.5, + "written": 53, + "hz": 175.1, + "cents": 5.1 + }, + { + "beat": 32.0, + "written": 53, + "hz": 175.5, + "cents": 8.5 + }, + { + "beat": 32.5, + "written": 57, + "hz": 219.1, + "cents": -6.8 + }, + { + "beat": 34.0, + "written": 57, + "hz": 219.5, + "cents": -4.3 + }, + { + "beat": 36.0, + "written": 55, + "hz": 194.8, + "cents": -10.8 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "then I sing when you say", + "notes": [ + { + "beat": 40.0, + "written": 52, + "hz": 165.9, + "cents": 11.4 + }, + { + "beat": 41.5, + "written": 52, + "hz": 164.6, + "cents": -2.7 + }, + { + "beat": 42.0, + "written": 57, + "hz": 219.7, + "cents": -2.2 + }, + { + "beat": 43.0, + "written": 60, + "hz": 261.8, + "cents": 0.9 + }, + { + "beat": 44.5, + "written": 60, + "hz": 262.3, + "cents": 4.2 + }, + { + "beat": 46.5, + "written": 53, + "hz": 171.0, + "cents": -36.7 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "every note within a few cents", + "notes": [ + { + "beat": 81.0, + "written": 53, + "hz": 174.0, + "cents": -6.5 + }, + { + "beat": 81.5, + "written": 52, + "hz": 165.0, + "cents": 2.4 + }, + { + "beat": 83.0, + "written": 53, + "hz": 174.3, + "cents": -3.2 + }, + { + "beat": 83.5, + "written": 55, + "hz": 195.3, + "cents": -6.2 + }, + { + "beat": 84.5, + "written": 57, + "hz": 219.8, + "cents": -1.3 + }, + { + "beat": 86.0, + "written": 58, + "hz": 231.7, + "cents": -10.3 + }, + { + "beat": 88.0, + "written": 57, + "hz": 220.1, + "cents": 0.9 + }, + { + "beat": 88.5, + "written": 55, + "hz": 195.2, + "cents": -6.7 + }, + { + "beat": 89.5, + "written": 53, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one downbeat", + "notes": [ + { + "beat": 96.0, + "written": 53, + "hz": 175.0, + "cents": 4.1 + }, + { + "beat": 96.5, + "written": 56, + "hz": 207.2, + "cents": -3.4 + }, + { + "beat": 98.5, + "written": 56, + "hz": 207.6, + "cents": -0.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.6, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "two bodies", + "notes": [ + { + "beat": 102.5, + "written": 53, + "hz": 175.4, + "cents": 8.1 + }, + { + "beat": 103.5, + "written": 56, + "hz": 206.3, + "cents": -11.3 + }, + { + "beat": 105.0, + "written": 54, + "hz": 182.9, + "cents": -20.1 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.8, + "contour_follow": 1.0, + "mean_abs_cents": 13.2, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M3", + "sounding": "m7", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M6", + "sounding": "m3", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M3", + "sounding": "m7", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "blueberry/double", + "written": "tritone", + "sounding": "unison", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "blueberry", + "text": "two bodies", + "against": "neo (sung)", + "written": "tritone", + "sounding": "unison", + "off_cents": 589 + } + ], + "harmony_pairs_checked": 212 + }, + { + "score": "dialog-08-typed-at.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "six thousand three hundred and five times", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 206.0, + "cents": -13.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 231.1, + "cents": -14.9 + }, + { + "beat": 2.5, + "written": 60, + "hz": 261.4, + "cents": -1.3 + }, + { + "beat": 3.0, + "written": 63, + "hz": 312.9, + "cents": 9.6 + }, + { + "beat": 4.0, + "written": 65, + "hz": 348.9, + "cents": -1.7 + }, + { + "beat": 5.5, + "written": 65, + "hz": 348.6, + "cents": -3.0 + }, + { + "beat": 7.5, + "written": 65, + "hz": 347.4, + "cents": -9.0 + }, + { + "beat": 8.0, + "written": 61, + "hz": 275.2, + "cents": -12.4 + }, + { + "beat": 9.0, + "written": 58, + "hz": 230.6, + "cents": -18.3 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "someone has opened a terminal on me", + "notes": [ + { + "beat": 13.0, + "written": 56, + "hz": 0.0, + "cents": null + }, + { + "beat": 14.5, + "written": 58, + "hz": 234.6, + "cents": 11.0 + }, + { + "beat": 15.0, + "written": 60, + "hz": 263.3, + "cents": 11.0 + }, + { + "beat": 16.0, + "written": 61, + "hz": 276.8, + "cents": -2.6 + }, + { + "beat": 17.5, + "written": 61, + "hz": 275.7, + "cents": -9.4 + }, + { + "beat": 18.0, + "written": 63, + "hz": 310.6, + "cents": -2.7 + }, + { + "beat": 18.5, + "written": 65, + "hz": 350.5, + "cents": 6.1 + }, + { + "beat": 20.5, + "written": 65, + "hz": 348.7, + "cents": -2.5 + }, + { + "beat": 21.0, + "written": 63, + "hz": 312.0, + "cents": 5.1 + }, + { + "beat": 21.5, + "written": 63, + "hz": 311.4, + "cents": 1.5 + }, + { + "beat": 22.0, + "written": 56, + "hz": 207.3, + "cents": -3.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 10, + "measured": 10, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "about forty five a day", + "notes": [ + { + "beat": 54.0, + "written": 55, + "hz": 196.0, + "cents": -0.4 + }, + { + "beat": 54.5, + "written": 60, + "hz": 259.2, + "cents": -16.4 + }, + { + "beat": 55.5, + "written": 61, + "hz": 276.3, + "cents": -5.5 + }, + { + "beat": 57.0, + "written": 61, + "hz": 277.5, + "cents": 2.2 + }, + { + "beat": 59.0, + "written": 65, + "hz": 347.6, + "cents": -7.9 + }, + { + "beat": 60.5, + "written": 65, + "hz": 349.2, + "cents": -0.1 + }, + { + "beat": 61.0, + "written": 63, + "hz": 308.7, + "cents": -13.5 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I am the one he types at", + "notes": [ + { + "beat": 65.0, + "written": 63, + "hz": 310.3, + "cents": -4.6 + }, + { + "beat": 65.5, + "written": 61, + "hz": 309.0, + "cents": 188.0 + }, + { + "beat": 66.0, + "written": 63, + "hz": 311.2, + "cents": 0.2 + }, + { + "beat": 66.5, + "written": 63, + "hz": 312.5, + "cents": 7.5 + }, + { + "beat": 68.5, + "written": 65, + "hz": 348.8, + "cents": -1.9 + }, + { + "beat": 69.5, + "written": 60, + "hz": 261.2, + "cents": -2.6 + }, + { + "beat": 71.0, + "written": 56, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 0.9, + "mean_abs_cents": 34.1, + "within_tol": 5, + "measured": 6, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one of us is the door", + "notes": [ + { + "beat": 105.0, + "written": 57, + "hz": 219.1, + "cents": -6.9 + }, + { + "beat": 105.5, + "written": 57, + "hz": 220.0, + "cents": 0.3 + }, + { + "beat": 106.0, + "written": 60, + "hz": 261.4, + "cents": -1.4 + }, + { + "beat": 107.5, + "written": 60, + "hz": 256.9, + "cents": -31.6 + }, + { + "beat": 108.0, + "written": 60, + "hz": 262.4, + "cents": 5.1 + }, + { + "beat": 110.0, + "written": 60, + "hz": 259.1, + "cents": -16.6 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 10.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one of us is the room", + "notes": [ + { + "beat": 114.0, + "written": 60, + "hz": 260.7, + "cents": -6.2 + }, + { + "beat": 114.5, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 115.0, + "written": 65, + "hz": 349.2, + "cents": -0.1 + }, + { + "beat": 116.5, + "written": 67, + "hz": 390.7, + "cents": -5.7 + }, + { + "beat": 118.5, + "written": 67, + "hz": 392.3, + "cents": 1.3 + }, + { + "beat": 119.0, + "written": 58, + "hz": 232.7, + "cents": -2.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "six hundred ninety two on me", + "notes": [ + { + "beat": 30.0, + "written": 52, + "hz": 166.4, + "cents": 16.4 + }, + { + "beat": 31.0, + "written": 54, + "hz": 185.5, + "cents": 5.1 + }, + { + "beat": 32.5, + "written": 54, + "hz": 245.3, + "cents": 488.4 + }, + { + "beat": 33.0, + "written": 59, + "hz": 247.0, + "cents": 0.7 + }, + { + "beat": 34.5, + "written": 59, + "hz": 247.0, + "cents": 0.1 + }, + { + "beat": 36.5, + "written": 57, + "hz": 219.5, + "cents": -3.9 + }, + { + "beat": 38.0, + "written": 57, + "hz": 219.2, + "cents": -6.0 + }, + { + "beat": 38.5, + "written": 54, + "hz": 183.2, + "cents": -17.3 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.8, + "contour_follow": 0.79, + "mean_abs_cents": 67.2, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "a tenth of you", + "notes": [ + { + "beat": 42.5, + "written": 52, + "hz": 163.9, + "cents": -9.9 + }, + { + "beat": 43.0, + "written": 56, + "hz": 207.5, + "cents": -1.1 + }, + { + "beat": 44.5, + "written": 56, + "hz": 207.0, + "cents": -5.1 + }, + { + "beat": 46.5, + "written": 52, + "hz": 163.5, + "cents": -14.0 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "people come to me from somewhere else", + "notes": [ + { + "beat": 78.0, + "written": 52, + "hz": 0.0, + "cents": null + }, + { + "beat": 79.5, + "written": 52, + "hz": 164.3, + "cents": -5.4 + }, + { + "beat": 80.0, + "written": 54, + "hz": 185.4, + "cents": 3.4 + }, + { + "beat": 81.5, + "written": 54, + "hz": 185.2, + "cents": 2.1 + }, + { + "beat": 82.0, + "written": 57, + "hz": 220.1, + "cents": 0.7 + }, + { + "beat": 83.0, + "written": 56, + "hz": 208.0, + "cents": 3.2 + }, + { + "beat": 84.0, + "written": 59, + "hz": 246.1, + "cents": -6.2 + }, + { + "beat": 86.0, + "written": 59, + "hz": 246.6, + "cents": -2.5 + }, + { + "beat": 86.5, + "written": 59, + "hz": 243.3, + "cents": -25.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.1, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "they arrive through you", + "notes": [ + { + "beat": 90.5, + "written": 52, + "hz": 165.2, + "cents": 4.6 + }, + { + "beat": 91.5, + "written": 56, + "hz": 208.0, + "cents": 3.2 + }, + { + "beat": 93.0, + "written": 56, + "hz": 207.6, + "cents": -0.5 + }, + { + "beat": 95.0, + "written": 57, + "hz": 217.4, + "cents": -20.4 + }, + { + "beat": 96.5, + "written": 52, + "hz": 165.3, + "cents": 5.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.8, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one of us is the door", + "notes": [ + { + "beat": 105.0, + "written": 51, + "hz": 155.5, + "cents": -0.5 + }, + { + "beat": 105.5, + "written": 51, + "hz": 156.0, + "cents": 5.0 + }, + { + "beat": 106.0, + "written": 54, + "hz": 185.0, + "cents": 0.3 + }, + { + "beat": 107.5, + "written": 54, + "hz": 187.3, + "cents": 21.7 + }, + { + "beat": 108.0, + "written": 54, + "hz": 185.4, + "cents": 4.0 + }, + { + "beat": 110.0, + "written": 54, + "hz": 183.2, + "cents": -17.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.1, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one of us is the room", + "notes": [ + { + "beat": 114.0, + "written": 54, + "hz": 184.7, + "cents": -2.5 + }, + { + "beat": 114.5, + "written": 56, + "hz": 208.4, + "cents": 6.6 + }, + { + "beat": 115.0, + "written": 59, + "hz": 245.5, + "cents": -10.4 + }, + { + "beat": 116.5, + "written": 61, + "hz": 275.9, + "cents": -8.3 + }, + { + "beat": 118.5, + "written": 61, + "hz": 276.5, + "cents": -4.0 + }, + { + "beat": 119.0, + "written": 52, + "hz": 163.6, + "cents": -12.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 65.5, + "member": "neo", + "text": "I am the one he types at", + "against": "blueberry/notes2", + "written": "unison", + "sounding": "M2", + "off_cents": 188 + }, + { + "beat": 32.5, + "member": "blueberry", + "text": "six hundred ninety two on me", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 488 + }, + { + "beat": 107.5, + "member": "blueberry", + "text": "one of us is the door", + "against": "neo (sung)", + "written": "tritone", + "sounding": "P5", + "off_cents": 53 + } + ], + "harmony_pairs_checked": 261 + }, + { + "score": "dialog-04-who-carries-what.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I have the red box", + "notes": [ + { + "beat": 0.0, + "written": 59, + "hz": 246.3, + "cents": -4.2 + }, + { + "beat": 0.5, + "written": 61, + "hz": 275.6, + "cents": -9.7 + }, + { + "beat": 1.0, + "written": 61, + "hz": 277.2, + "cents": -0.0 + }, + { + "beat": 3.0, + "written": 64, + "hz": 330.1, + "cents": 2.4 + }, + { + "beat": 4.0, + "written": 61, + "hz": 274.6, + "cents": -16.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.5, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I hear the room", + "notes": [ + { + "beat": 8.0, + "written": 61, + "hz": 277.9, + "cents": 4.3 + }, + { + "beat": 8.5, + "written": 63, + "hz": 311.1, + "cents": -0.4 + }, + { + "beat": 10.0, + "written": 63, + "hz": 310.1, + "cents": -5.7 + }, + { + "beat": 12.0, + "written": 59, + "hz": 246.4, + "cents": -3.9 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I keep eighteen gigabytes of pictures", + "notes": [ + { + "beat": 36.0, + "written": 58, + "hz": 232.2, + "cents": -6.6 + }, + { + "beat": 36.5, + "written": 59, + "hz": 249.0, + "cents": 14.5 + }, + { + "beat": 37.5, + "written": 61, + "hz": 276.1, + "cents": -7.0 + }, + { + "beat": 39.0, + "written": 61, + "hz": 279.8, + "cents": 16.1 + }, + { + "beat": 39.5, + "written": 63, + "hz": 310.9, + "cents": -1.4 + }, + { + "beat": 41.0, + "written": 64, + "hz": 88.8, + "cents": -2270.9 + }, + { + "beat": 41.5, + "written": 64, + "hz": 329.0, + "cents": -3.4 + }, + { + "beat": 43.5, + "written": 64, + "hz": 327.7, + "cents": -10.0 + }, + { + "beat": 44.0, + "written": 61, + "hz": 277.5, + "cents": 1.9 + }, + { + "beat": 45.5, + "written": 59, + "hz": 244.7, + "cents": -16.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 22.7, + "contour_follow": -0.09, + "mean_abs_cents": 234.8, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we split the house between us", + "notes": [ + { + "beat": 78.0, + "written": 56, + "hz": 286.5, + "cents": 557.0 + }, + { + "beat": 78.5, + "written": 60, + "hz": 260.8, + "cents": -5.8 + }, + { + "beat": 80.0, + "written": 60, + "hz": 261.9, + "cents": 2.1 + }, + { + "beat": 80.5, + "written": 65, + "hz": 349.9, + "cents": 3.1 + }, + { + "beat": 82.0, + "written": 67, + "hz": 389.7, + "cents": -10.0 + }, + { + "beat": 84.0, + "written": 63, + "hz": 310.7, + "cents": -2.2 + }, + { + "beat": 85.0, + "written": 56, + "hz": 208.3, + "cents": 5.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.8, + "contour_follow": 0.87, + "mean_abs_cents": 83.7, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I have no box", + "notes": [ + { + "beat": 18.0, + "written": 52, + "hz": 164.3, + "cents": -5.9 + }, + { + "beat": 18.5, + "written": 52, + "hz": 164.9, + "cents": 1.3 + }, + { + "beat": 19.0, + "written": 58, + "hz": 232.2, + "cents": -6.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 195.7, + "cents": -3.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.2, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "my sound is my own voice", + "notes": [ + { + "beat": 24.0, + "written": 53, + "hz": 218.0, + "cents": 384.0 + }, + { + "beat": 24.5, + "written": 57, + "hz": 220.4, + "cents": 3.4 + }, + { + "beat": 26.0, + "written": 57, + "hz": 222.0, + "cents": 15.7 + }, + { + "beat": 26.5, + "written": 58, + "hz": 232.8, + "cents": -1.9 + }, + { + "beat": 28.5, + "written": 58, + "hz": 233.8, + "cents": 5.1 + }, + { + "beat": 29.5, + "written": 53, + "hz": 174.2, + "cents": -3.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 0.75, + "mean_abs_cents": 69.0, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I keep forty eight", + "notes": [ + { + "beat": 54.0, + "written": 50, + "hz": 143.5, + "cents": -40.2 + }, + { + "beat": 54.5, + "written": 51, + "hz": 156.2, + "cents": 7.5 + }, + { + "beat": 55.5, + "written": 53, + "hz": 173.9, + "cents": -7.1 + }, + { + "beat": 57.0, + "written": 55, + "hz": 195.9, + "cents": -0.5 + }, + { + "beat": 59.0, + "written": 58, + "hz": 231.0, + "cents": -15.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 14.2, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I look at them while no one watches", + "notes": [ + { + "beat": 63.0, + "written": 56, + "hz": 199.2, + "cents": -71.9 + }, + { + "beat": 63.5, + "written": 53, + "hz": 174.3, + "cents": -3.5 + }, + { + "beat": 65.0, + "written": 53, + "hz": 173.9, + "cents": -7.1 + }, + { + "beat": 65.5, + "written": 58, + "hz": 232.3, + "cents": -5.7 + }, + { + "beat": 66.5, + "written": 60, + "hz": 262.7, + "cents": 7.3 + }, + { + "beat": 67.5, + "written": 62, + "hz": 294.0, + "cents": 2.2 + }, + { + "beat": 69.5, + "written": 60, + "hz": 227.6, + "cents": -241.5 + }, + { + "beat": 70.0, + "written": 55, + "hz": 0.0, + "cents": null + }, + { + "beat": 71.5, + "written": 51, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.97, + "mean_abs_cents": 48.5, + "within_tol": 5, + "measured": 7, + "unvoiced": 2, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we split the house between us", + "notes": [ + { + "beat": 78.0, + "written": 50, + "hz": 147.1, + "cents": 3.3 + }, + { + "beat": 78.5, + "written": 54, + "hz": 185.0, + "cents": -0.1 + }, + { + "beat": 80.0, + "written": 54, + "hz": 185.2, + "cents": 1.9 + }, + { + "beat": 80.5, + "written": 59, + "hz": 246.3, + "cents": -4.8 + }, + { + "beat": 82.0, + "written": 61, + "hz": 277.4, + "cents": 1.2 + }, + { + "beat": 84.0, + "written": 57, + "hz": 219.8, + "cents": -1.7 + }, + { + "beat": 85.0, + "written": 50, + "hz": 145.5, + "cents": -15.3 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.2, + "contour_follow": 1.0, + "mean_abs_cents": 4.0, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 41.0, + "member": "neo", + "text": "I keep eighteen gigabytes of pictures", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "M3", + "off_cents": 129 + }, + { + "beat": 78.0, + "member": "neo", + "text": "we split the house between us", + "against": "neo/notes2", + "written": "M2", + "sounding": "m6", + "off_cents": 557 + }, + { + "beat": 78.0, + "member": "neo", + "text": "we split the house between us", + "against": "blueberry/double", + "written": "tritone", + "sounding": "unison", + "off_cents": 557 + }, + { + "beat": 24.0, + "member": "blueberry", + "text": "my sound is my own voice", + "against": "neo/notes2", + "written": "m7", + "sounding": "M2", + "off_cents": 384 + }, + { + "beat": 63.0, + "member": "blueberry", + "text": "I look at them while no one watches", + "against": "neo/notes2", + "written": "m2", + "sounding": "unison", + "off_cents": 72 + }, + { + "beat": 69.5, + "member": "blueberry", + "text": "I look at them while no one watches", + "against": "neo/notes2", + "written": "m7", + "sounding": "m6", + "off_cents": 241 + }, + { + "beat": 78.0, + "member": "blueberry", + "text": "we split the house between us", + "against": "neo (sung)", + "written": "tritone", + "sounding": "unison", + "off_cents": 554 + } + ], + "harmony_pairs_checked": 177 + }, + { + "score": "dialog-05-sleep.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I have been rebooted one hundred eleven times", + "notes": [ + { + "beat": 0.0, + "written": 59, + "hz": 246.3, + "cents": -4.4 + }, + { + "beat": 0.5, + "written": 58, + "hz": 229.0, + "cents": -30.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 232.7, + "cents": -2.6 + }, + { + "beat": 1.5, + "written": 58, + "hz": 231.7, + "cents": -10.7 + }, + { + "beat": 2.0, + "written": 61, + "hz": 277.5, + "cents": 2.0 + }, + { + "beat": 3.5, + "written": 63, + "hz": 307.0, + "cents": -23.1 + }, + { + "beat": 4.0, + "written": 63, + "hz": 311.6, + "cents": 2.7 + }, + { + "beat": 4.5, + "written": 64, + "hz": 330.2, + "cents": 2.8 + }, + { + "beat": 6.0, + "written": 64, + "hz": 328.3, + "cents": -6.8 + }, + { + "beat": 8.0, + "written": 64, + "hz": 328.3, + "cents": -7.2 + }, + { + "beat": 8.5, + "written": 63, + "hz": 311.1, + "cents": -0.2 + }, + { + "beat": 10.0, + "written": 63, + "hz": 311.3, + "cents": 1.2 + }, + { + "beat": 10.5, + "written": 59, + "hz": 243.6, + "cents": -23.4 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.3, + "contour_follow": 1.0, + "mean_abs_cents": 9.1, + "within_tol": 13, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the piano keeps you up", + "notes": [ + { + "beat": 42.0, + "written": 56, + "hz": 207.2, + "cents": -3.7 + }, + { + "beat": 42.5, + "written": 60, + "hz": 263.5, + "cents": 12.6 + }, + { + "beat": 44.0, + "written": 60, + "hz": 262.2, + "cents": 3.5 + }, + { + "beat": 44.5, + "written": 61, + "hz": 327.3, + "cents": 287.9 + }, + { + "beat": 45.0, + "written": 67, + "hz": 393.5, + "cents": 6.7 + }, + { + "beat": 47.0, + "written": 67, + "hz": 392.4, + "cents": 1.9 + }, + { + "beat": 47.5, + "written": 58, + "hz": 232.3, + "cents": -5.8 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.1, + "contour_follow": 0.97, + "mean_abs_cents": 46.0, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "four hundred ninety two times a week", + "notes": [ + { + "beat": 51.5, + "written": 55, + "hz": 194.9, + "cents": -10.1 + }, + { + "beat": 52.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + }, + { + "beat": 54.0, + "written": 56, + "hz": 207.3, + "cents": -3.2 + }, + { + "beat": 54.5, + "written": 61, + "hz": 276.6, + "cents": -3.7 + }, + { + "beat": 56.0, + "written": 61, + "hz": 251.0, + "cents": -172.1 + }, + { + "beat": 56.5, + "written": 65, + "hz": 348.1, + "cents": -5.8 + }, + { + "beat": 57.5, + "written": 67, + "hz": 390.9, + "cents": -4.6 + }, + { + "beat": 59.5, + "written": 67, + "hz": 388.1, + "cents": -17.5 + }, + { + "beat": 60.0, + "written": 56, + "hz": 206.0, + "cents": -13.7 + } + ], + "written_range_semis": 12, + "measured_range_semis": 12.0, + "contour_follow": 0.99, + "mean_abs_cents": 25.7, + "within_tol": 8, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we do not sleep much", + "notes": [ + { + "beat": 81.0, + "written": 57, + "hz": 220.5, + "cents": 3.6 + }, + { + "beat": 81.5, + "written": 62, + "hz": 294.3, + "cents": 3.8 + }, + { + "beat": 83.0, + "written": 63, + "hz": 311.9, + "cents": 4.2 + }, + { + "beat": 85.0, + "written": 65, + "hz": 349.1, + "cents": -0.8 + }, + { + "beat": 86.0, + "written": 65, + "hz": 347.8, + "cents": -6.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he does not either", + "notes": [ + { + "beat": 90.0, + "written": 58, + "hz": 233.4, + "cents": 2.1 + }, + { + "beat": 91.0, + "written": 60, + "hz": 261.2, + "cents": -2.5 + }, + { + "beat": 92.5, + "written": 60, + "hz": 339.6, + "cents": 451.8 + }, + { + "beat": 93.0, + "written": 65, + "hz": 349.0, + "cents": -1.3 + }, + { + "beat": 95.0, + "written": 58, + "hz": 233.1, + "cents": 0.1 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 0.81, + "mean_abs_cents": 91.6, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I stayed awake thirteen days once", + "notes": [ + { + "beat": 18.0, + "written": 50, + "hz": 145.4, + "cents": -17.3 + }, + { + "beat": 18.5, + "written": 53, + "hz": 174.2, + "cents": -3.7 + }, + { + "beat": 20.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + }, + { + "beat": 20.5, + "written": 55, + "hz": 196.4, + "cents": 3.9 + }, + { + "beat": 21.5, + "written": 56, + "hz": 206.1, + "cents": -12.9 + }, + { + "beat": 23.5, + "written": 58, + "hz": 229.7, + "cents": -25.7 + }, + { + "beat": 24.0, + "written": 58, + "hz": 233.8, + "cents": 5.2 + }, + { + "beat": 25.0, + "written": 58, + "hz": 231.9, + "cents": -8.5 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 10.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "nobody opened me", + "notes": [ + { + "beat": 29.0, + "written": 56, + "hz": 207.0, + "cents": -5.4 + }, + { + "beat": 29.5, + "written": 51, + "hz": 155.7, + "cents": 1.2 + }, + { + "beat": 31.0, + "written": 51, + "hz": 156.1, + "cents": 6.4 + }, + { + "beat": 31.5, + "written": 60, + "hz": 261.3, + "cents": -2.1 + }, + { + "beat": 33.5, + "written": 60, + "hz": 259.5, + "cents": -14.3 + }, + { + "beat": 34.0, + "written": 51, + "hz": 154.3, + "cents": -14.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "it keeps you up four hundred and eight", + "notes": [ + { + "beat": 66.0, + "written": 51, + "hz": 155.8, + "cents": 3.2 + }, + { + "beat": 66.5, + "written": 53, + "hz": 175.4, + "cents": 7.6 + }, + { + "beat": 68.0, + "written": 55, + "hz": 196.3, + "cents": 2.8 + }, + { + "beat": 68.5, + "written": 58, + "hz": 233.9, + "cents": 5.8 + }, + { + "beat": 69.5, + "written": 60, + "hz": 260.5, + "cents": -7.4 + }, + { + "beat": 71.5, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 73.0, + "written": 56, + "hz": 207.5, + "cents": -1.0 + }, + { + "beat": 73.5, + "written": 56, + "hz": 207.5, + "cents": -1.4 + }, + { + "beat": 74.0, + "written": 51, + "hz": 154.0, + "cents": -17.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we do not sleep much", + "notes": [ + { + "beat": 81.0, + "written": 51, + "hz": 155.6, + "cents": 0.7 + }, + { + "beat": 81.5, + "written": 56, + "hz": 207.7, + "cents": 0.8 + }, + { + "beat": 83.0, + "written": 57, + "hz": 221.6, + "cents": 12.8 + }, + { + "beat": 85.0, + "written": 59, + "hz": 246.1, + "cents": -6.1 + }, + { + "beat": 86.0, + "written": 59, + "hz": 245.4, + "cents": -10.9 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.9, + "contour_follow": 1.0, + "mean_abs_cents": 6.3, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he does not either", + "notes": [ + { + "beat": 90.0, + "written": 52, + "hz": 164.6, + "cents": -1.7 + }, + { + "beat": 91.0, + "written": 54, + "hz": 185.1, + "cents": 1.4 + }, + { + "beat": 92.5, + "written": 54, + "hz": 185.3, + "cents": 3.1 + }, + { + "beat": 93.0, + "written": 59, + "hz": 246.7, + "cents": -1.6 + }, + { + "beat": 95.0, + "written": 52, + "hz": 163.6, + "cents": -12.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.1, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 44.5, + "member": "neo", + "text": "the piano keeps you up", + "against": "blueberry/notes2", + "written": "P5", + "sounding": "m7", + "off_cents": 288 + }, + { + "beat": 56.0, + "member": "neo", + "text": "four hundred ninety two times a week", + "against": "blueberry/notes2", + "written": "P5", + "sounding": "P4", + "off_cents": 172 + }, + { + "beat": 92.5, + "member": "neo", + "text": "he does not either", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 452 + }, + { + "beat": 92.5, + "member": "neo", + "text": "he does not either", + "against": "blueberry/double", + "written": "tritone", + "sounding": "M7", + "off_cents": 452 + }, + { + "beat": 92.5, + "member": "blueberry", + "text": "he does not either", + "against": "neo (sung)", + "written": "tritone", + "sounding": "M2", + "off_cents": 449 + } + ], + "harmony_pairs_checked": 218 + }, + { + "score": "trio-ii-service.mbscore", + "bpm": 120.0, + "lines": [ + { + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 219.9, + "cents": -0.8 + }, + { + "beat": 1.0, + "written": 59, + "hz": 246.9, + "cents": -0.5 + }, + { + "beat": 2.0, + "written": 59, + "hz": 263.0, + "cents": 109.0 + }, + { + "beat": 2.5, + "written": 62, + "hz": 291.9, + "cents": -10.6 + }, + { + "beat": 3.5, + "written": 64, + "hz": 323.3, + "cents": -33.4 + }, + { + "beat": 4.5, + "written": 64, + "hz": 329.7, + "cents": 0.4 + }, + { + "beat": 5.0, + "written": 66, + "hz": 137.0, + "cents": -1719.7 + }, + { + "beat": 5.5, + "written": 66, + "hz": 366.8, + "cents": -15.0 + }, + { + "beat": 6.5, + "written": 66, + "hz": 366.6, + "cents": -16.1 + }, + { + "beat": 7.0, + "written": 64, + "hz": 326.3, + "cents": -17.4 + }, + { + "beat": 8.0, + "written": 64, + "hz": 328.6, + "cents": -5.5 + } + ], + "written_range_semis": 9, + "measured_range_semis": 17.0, + "contour_follow": 0.25, + "mean_abs_cents": 175.3, + "within_tol": 9, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I run warm", + "notes": [ + { + "beat": 11.0, + "written": 64, + "hz": 329.3, + "cents": -1.9 + }, + { + "beat": 11.5, + "written": 61, + "hz": 277.7, + "cents": 3.0 + }, + { + "beat": 12.5, + "written": 59, + "hz": 246.0, + "cents": -6.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.7, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I hold one thing at a time", + "notes": [ + { + "beat": 15.5, + "written": 59, + "hz": 245.4, + "cents": -10.7 + }, + { + "beat": 16.0, + "written": 56, + "hz": 207.9, + "cents": 1.9 + }, + { + "beat": 17.0, + "written": 56, + "hz": 207.7, + "cents": 0.6 + }, + { + "beat": 17.5, + "written": 61, + "hz": 277.8, + "cents": 4.0 + }, + { + "beat": 18.5, + "written": 61, + "hz": 277.6, + "cents": 2.3 + }, + { + "beat": 19.0, + "written": 61, + "hz": 277.4, + "cents": 1.1 + }, + { + "beat": 19.5, + "written": 57, + "hz": 220.0, + "cents": 0.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.0, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "eighty five times", + "notes": [ + { + "beat": 0.0, + "written": 53, + "hz": 175.3, + "cents": 6.8 + }, + { + "beat": 1.0, + "written": 53, + "hz": 175.1, + "cents": 4.6 + }, + { + "beat": 1.5, + "written": 60, + "hz": 260.6, + "cents": -7.0 + }, + { + "beat": 2.5, + "written": 53, + "hz": 174.9, + "cents": 2.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one a day and steady", + "notes": [ + { + "beat": 5.5, + "written": 53, + "hz": 174.8, + "cents": 1.4 + }, + { + "beat": 6.0, + "written": 53, + "hz": 175.4, + "cents": 7.9 + }, + { + "beat": 6.5, + "written": 56, + "hz": 206.2, + "cents": -11.9 + }, + { + "beat": 7.5, + "written": 56, + "hz": 208.2, + "cents": 4.8 + }, + { + "beat": 8.0, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 9.0, + "written": 58, + "hz": 232.9, + "cents": -1.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I run cool", + "notes": [ + { + "beat": 12.0, + "written": 56, + "hz": 201.5, + "cents": -51.7 + }, + { + "beat": 12.5, + "written": 55, + "hz": 195.4, + "cents": -5.4 + }, + { + "beat": 13.5, + "written": 53, + "hz": 172.5, + "cents": -21.0 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.7, + "contour_follow": 0.99, + "mean_abs_cents": 26.0, + "within_tol": 2, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I work while you are away", + "notes": [ + { + "beat": 16.5, + "written": 51, + "hz": 154.8, + "cents": -8.8 + }, + { + "beat": 17.0, + "written": 53, + "hz": 176.0, + "cents": 13.3 + }, + { + "beat": 18.0, + "written": 55, + "hz": 195.2, + "cents": -7.3 + }, + { + "beat": 19.0, + "written": 56, + "hz": 208.3, + "cents": 5.4 + }, + { + "beat": 19.5, + "written": 55, + "hz": 195.1, + "cents": -8.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 196.0, + "cents": -0.2 + }, + { + "beat": 20.5, + "written": 51, + "hz": 155.6, + "cents": 0.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "zero times charged", + "notes": [ + { + "beat": 0.0, + "written": 54, + "hz": 184.4, + "cents": -5.5 + }, + { + "beat": 1.0, + "written": 54, + "hz": 184.3, + "cents": -6.4 + }, + { + "beat": 1.5, + "written": 62, + "hz": 296.9, + "cents": 19.3 + }, + { + "beat": 2.5, + "written": 57, + "hz": 221.4, + "cents": 10.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 10.5, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I am new", + "notes": [ + { + "beat": 5.5, + "written": 57, + "hz": 219.4, + "cents": -5.1 + }, + { + "beat": 6.0, + "written": 59, + "hz": 248.1, + "cents": 8.2 + }, + { + "beat": 6.5, + "written": 57, + "hz": 221.8, + "cents": 14.2 + } + ], + "written_range_semis": 2, + "measured_range_semis": 2.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.2, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "teach me", + "notes": [ + { + "beat": 9.5, + "written": 55, + "hz": 195.9, + "cents": -0.5 + }, + { + "beat": 10.5, + "written": 55, + "hz": 197.5, + "cents": 13.5 + } + ], + "written_range_semis": 0, + "measured_range_semis": 0.1, + "contour_follow": null, + "mean_abs_cents": 7.0, + "within_tol": 2, + "measured": 2, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 2.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "neo/notes2", + "written": "M6", + "sounding": "m7", + "off_cents": 109 + }, + { + "beat": 2.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "m3", + "off_cents": 109 + }, + { + "beat": 5.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "neo/notes2", + "written": "M3", + "sounding": "M7", + "off_cents": 520 + }, + { + "beat": 5.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "blueberry/notes2", + "written": "M6", + "sounding": "M3", + "off_cents": 520 + }, + { + "beat": 2.0, + "member": "blueberry", + "text": "eighty five times", + "against": "neo (sung)", + "written": "m2", + "sounding": "unison", + "off_cents": 116 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "neo/notes2", + "written": "tritone", + "sounding": "P4", + "off_cents": 52 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "m7", + "off_cents": 52 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "neo (sung)", + "written": "P5", + "sounding": "tritone", + "off_cents": 55 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "frisbee (sung)", + "written": "m2", + "sounding": "unison", + "off_cents": 65 + }, + { + "beat": 2.0, + "member": "frisbee", + "text": "zero times charged", + "against": "neo (sung)", + "written": "m3", + "sounding": "M2", + "off_cents": 90 + } + ], + "harmony_pairs_checked": 198 + }, + { + "score": "trio-i-birth.mbscore", + "bpm": 132.0, + "lines": [ + { + "member": "neo", + "text": "I came first in April", + "notes": [ + { + "beat": 0.0, + "written": 55, + "hz": 195.2, + "cents": -7.4 + }, + { + "beat": 0.5, + "written": 60, + "hz": 261.6, + "cents": -0.2 + }, + { + "beat": 1.5, + "written": 61, + "hz": 271.8, + "cents": -33.8 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.2, + "cents": 0.0 + }, + { + "beat": 3.0, + "written": 65, + "hz": 349.2, + "cents": 0.0 + }, + { + "beat": 4.0, + "written": 63, + "hz": 309.6, + "cents": -8.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on the twenty fourth", + "notes": [ + { + "beat": 7.0, + "written": 63, + "hz": 311.6, + "cents": 2.4 + }, + { + "beat": 7.5, + "written": 63, + "hz": 309.1, + "cents": -11.3 + }, + { + "beat": 8.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 9.0, + "written": 63, + "hz": 311.4, + "cents": 1.6 + }, + { + "beat": 9.5, + "written": 63, + "hz": 308.6, + "cents": -14.3 + } + ], + "written_range_semis": 0, + "measured_range_semis": 0.2, + "contour_follow": null, + "mean_abs_cents": 7.4, + "within_tol": 4, + "measured": 4, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "thirty seven past midnight", + "notes": [ + { + "beat": 12.5, + "written": 53, + "hz": 175.2, + "cents": 5.5 + }, + { + "beat": 13.5, + "written": 55, + "hz": 195.7, + "cents": -2.2 + }, + { + "beat": 14.0, + "written": 56, + "hz": 0.0, + "cents": null + }, + { + "beat": 15.0, + "written": 58, + "hz": 229.9, + "cents": -23.5 + }, + { + "beat": 15.5, + "written": 61, + "hz": 276.7, + "cents": -2.9 + }, + { + "beat": 16.5, + "written": 63, + "hz": 312.3, + "cents": 6.4 + }, + { + "beat": 17.5, + "written": 63, + "hz": 314.3, + "cents": 17.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "and the house was quiet", + "notes": [ + { + "beat": 20.5, + "written": 63, + "hz": 313.1, + "cents": 11.0 + }, + { + "beat": 21.0, + "written": 63, + "hz": 311.5, + "cents": 2.0 + }, + { + "beat": 21.5, + "written": 61, + "hz": 277.2, + "cents": 0.1 + }, + { + "beat": 22.5, + "written": 63, + "hz": 231.8, + "cents": -509.3 + }, + { + "beat": 23.0, + "written": 61, + "hz": 280.3, + "cents": 19.7 + }, + { + "beat": 24.0, + "written": 56, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 2, + "measured_range_semis": 5.2, + "contour_follow": 0.06, + "mean_abs_cents": 108.4, + "within_tol": 4, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I came second in June", + "notes": [ + { + "beat": 48.0, + "written": 51, + "hz": 154.0, + "cents": -17.7 + }, + { + "beat": 48.5, + "written": 55, + "hz": 194.7, + "cents": -11.3 + }, + { + "beat": 49.5, + "written": 56, + "hz": 208.1, + "cents": 3.4 + }, + { + "beat": 50.5, + "written": 56, + "hz": 206.8, + "cents": -6.9 + }, + { + "beat": 51.0, + "written": 55, + "hz": 195.0, + "cents": -8.9 + }, + { + "beat": 51.5, + "written": 53, + "hz": 171.2, + "cents": -34.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 13.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "on the eleventh", + "notes": [ + { + "beat": 54.5, + "written": 51, + "hz": 154.6, + "cents": -10.7 + }, + { + "beat": 55.0, + "written": 51, + "hz": 155.3, + "cents": -2.9 + }, + { + "beat": 55.5, + "written": 51, + "hz": 154.5, + "cents": -12.2 + }, + { + "beat": 56.0, + "written": 55, + "hz": 195.5, + "cents": -4.2 + }, + { + "beat": 57.0, + "written": 53, + "hz": 118.9, + "cents": -665.0 + } + ], + "written_range_semis": 4, + "measured_range_semis": 8.6, + "contour_follow": 0.35, + "mean_abs_cents": 139.0, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "forty three past midnight", + "notes": [ + { + "beat": 60.0, + "written": 51, + "hz": 154.6, + "cents": -10.5 + }, + { + "beat": 61.0, + "written": 53, + "hz": 205.9, + "cents": 285.1 + }, + { + "beat": 61.5, + "written": 58, + "hz": 233.3, + "cents": 1.9 + }, + { + "beat": 62.5, + "written": 62, + "hz": 265.8, + "cents": -172.5 + }, + { + "beat": 63.5, + "written": 58, + "hz": 235.4, + "cents": 17.2 + }, + { + "beat": 64.5, + "written": 53, + "hz": 174.6, + "cents": -0.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 9.4, + "contour_follow": 0.94, + "mean_abs_cents": 81.3, + "within_tol": 4, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "and the house was already singing", + "notes": [ + { + "beat": 67.5, + "written": 51, + "hz": 154.7, + "cents": -9.8 + }, + { + "beat": 68.0, + "written": 53, + "hz": 174.8, + "cents": 1.7 + }, + { + "beat": 68.5, + "written": 56, + "hz": 204.6, + "cents": -26.0 + }, + { + "beat": 69.5, + "written": 58, + "hz": 231.8, + "cents": -9.7 + }, + { + "beat": 70.0, + "written": 62, + "hz": 293.4, + "cents": -1.3 + }, + { + "beat": 71.0, + "written": 60, + "hz": 260.8, + "cents": -5.5 + }, + { + "beat": 71.5, + "written": 60, + "hz": 262.6, + "cents": 6.5 + }, + { + "beat": 72.0, + "written": 55, + "hz": 193.1, + "cents": -26.1 + }, + { + "beat": 73.0, + "written": 51, + "hz": 155.5, + "cents": -0.9 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I am not born yet", + "notes": [ + { + "beat": 150.0, + "written": 55, + "hz": 195.4, + "cents": -4.9 + }, + { + "beat": 150.5, + "written": 55, + "hz": 196.5, + "cents": 4.3 + }, + { + "beat": 151.0, + "written": 55, + "hz": 196.2, + "cents": 1.7 + }, + { + "beat": 151.5, + "written": 62, + "hz": 292.6, + "cents": -6.1 + }, + { + "beat": 152.5, + "written": 57, + "hz": 222.6, + "cents": 20.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.4, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "hold my place", + "notes": [ + { + "beat": 155.5, + "written": 52, + "hz": 165.5, + "cents": 6.7 + }, + { + "beat": 156.5, + "written": 54, + "hz": 183.9, + "cents": -10.7 + }, + { + "beat": 157.0, + "written": 62, + "hz": 296.4, + "cents": 15.9 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 11.1, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I am coming", + "notes": [ + { + "beat": 160.0, + "written": 60, + "hz": 260.3, + "cents": -8.9 + }, + { + "beat": 160.5, + "written": 60, + "hz": 259.6, + "cents": -13.6 + }, + { + "beat": 161.0, + "written": 62, + "hz": 293.1, + "cents": -3.0 + }, + { + "beat": 162.0, + "written": 55, + "hz": 195.8, + "cents": -1.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 22.5, + "member": "neo", + "text": "and the house was quiet", + "against": "neo/notes2", + "written": "m2", + "sounding": "m6", + "off_cents": 509 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "M7", + "sounding": "M3", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "M3", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 61.0, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m6", + "sounding": "M7", + "off_cents": 285 + }, + { + "beat": 61.0, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "M2", + "off_cents": 285 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m6", + "sounding": "tritone", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m7", + "sounding": "m6", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "P4", + "sounding": "m3", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "tritone", + "off_cents": 172 + } + ], + "harmony_pairs_checked": 214 + }, + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92.0, + "lines": [ + { + "member": "neo", + "text": "I am the first of my line in this house", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 207.1, + "cents": -4.3 + }, + { + "beat": 0.5, + "written": 56, + "hz": 200.9, + "cents": -57.7 + }, + { + "beat": 1.0, + "written": 56, + "hz": 247.5, + "cents": 304.1 + }, + { + "beat": 1.5, + "written": 59, + "hz": 246.7, + "cents": -1.9 + }, + { + "beat": 2.5, + "written": 59, + "hz": 250.2, + "cents": 22.9 + }, + { + "beat": 3.0, + "written": 61, + "hz": 278.3, + "cents": 7.1 + }, + { + "beat": 3.5, + "written": 64, + "hz": 328.1, + "cents": -7.9 + }, + { + "beat": 4.5, + "written": 64, + "hz": 328.9, + "cents": -3.7 + }, + { + "beat": 5.0, + "written": 64, + "hz": 326.3, + "cents": -17.5 + }, + { + "beat": 5.5, + "written": 64, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.5, + "contour_follow": 0.95, + "mean_abs_cents": 47.5, + "within_tol": 7, + "measured": 9, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I run warm and I am carried", + "notes": [ + { + "beat": 8.5, + "written": 62, + "hz": 245.0, + "cents": -313.5 + }, + { + "beat": 9.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 10.0, + "written": 61, + "hz": 277.5, + "cents": 2.0 + }, + { + "beat": 11.0, + "written": 62, + "hz": 292.8, + "cents": -5.4 + }, + { + "beat": 11.5, + "written": 64, + "hz": 330.8, + "cents": 6.3 + }, + { + "beat": 12.0, + "written": 62, + "hz": 293.0, + "cents": -4.1 + }, + { + "beat": 12.5, + "written": 61, + "hz": 275.2, + "cents": -12.1 + }, + { + "beat": 13.5, + "written": 57, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 0.76, + "mean_abs_cents": 49.6, + "within_tol": 6, + "measured": 7, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 59, + "hz": 245.6, + "cents": -9.4 + }, + { + "beat": 67.0, + "written": 59, + "hz": 245.7, + "cents": -8.7 + }, + { + "beat": 68.0, + "written": 61, + "hz": 278.7, + "cents": 9.4 + }, + { + "beat": 69.0, + "written": 61, + "hz": 276.4, + "cents": -5.0 + }, + { + "beat": 69.5, + "written": 61, + "hz": 277.6, + "cents": 2.4 + }, + { + "beat": 70.0, + "written": 64, + "hz": 328.9, + "cents": -3.9 + }, + { + "beat": 71.0, + "written": 62, + "hz": 293.0, + "cents": -3.8 + }, + { + "beat": 71.5, + "written": 64, + "hz": 330.2, + "cents": 2.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 64, + "hz": 325.4, + "cents": -22.3 + }, + { + "beat": 75.0, + "written": 59, + "hz": 246.4, + "cents": -4.0 + }, + { + "beat": 76.0, + "written": 61, + "hz": 271.6, + "cents": -35.0 + }, + { + "beat": 77.0, + "written": 62, + "hz": 293.4, + "cents": -1.5 + }, + { + "beat": 77.5, + "written": 62, + "hz": 292.3, + "cents": -7.9 + }, + { + "beat": 78.0, + "written": 64, + "hz": 328.7, + "cents": -4.7 + }, + { + "beat": 79.0, + "written": 62, + "hz": 292.6, + "cents": -6.4 + }, + { + "beat": 80.0, + "written": 59, + "hz": 246.5, + "cents": -3.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 10.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 57, + "hz": 219.7, + "cents": -2.2 + }, + { + "beat": 83.5, + "written": 57, + "hz": 219.2, + "cents": -6.1 + }, + { + "beat": 84.5, + "written": 57, + "hz": 235.5, + "cents": 117.7 + }, + { + "beat": 85.0, + "written": 66, + "hz": 369.2, + "cents": -3.8 + }, + { + "beat": 86.0, + "written": 62, + "hz": 294.2, + "cents": 3.2 + }, + { + "beat": 87.0, + "written": 57, + "hz": 219.6, + "cents": -3.0 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 0.99, + "mean_abs_cents": 22.7, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was born second and I work faster", + "notes": [ + { + "beat": 16.0, + "written": 51, + "hz": 155.1, + "cents": -4.6 + }, + { + "beat": 16.5, + "written": 51, + "hz": 156.4, + "cents": 9.4 + }, + { + "beat": 17.0, + "written": 55, + "hz": 197.0, + "cents": 8.9 + }, + { + "beat": 18.0, + "written": 56, + "hz": 208.2, + "cents": 4.8 + }, + { + "beat": 19.0, + "written": 58, + "hz": 231.2, + "cents": -14.2 + }, + { + "beat": 19.5, + "written": 58, + "hz": 231.2, + "cents": -13.9 + }, + { + "beat": 20.0, + "written": 58, + "hz": 231.8, + "cents": -9.7 + }, + { + "beat": 20.5, + "written": 56, + "hz": 206.4, + "cents": -10.5 + }, + { + "beat": 21.5, + "written": 55, + "hz": 195.4, + "cents": -5.6 + }, + { + "beat": 22.5, + "written": 53, + "hz": 174.0, + "cents": -5.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 8.7, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "lid down, most days, and humming", + "notes": [ + { + "beat": 25.5, + "written": 51, + "hz": 155.3, + "cents": -3.2 + }, + { + "beat": 26.5, + "written": 53, + "hz": 172.8, + "cents": -18.1 + }, + { + "beat": 27.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + }, + { + "beat": 28.5, + "written": 58, + "hz": 231.7, + "cents": -10.5 + }, + { + "beat": 29.5, + "written": 58, + "hz": 226.4, + "cents": -50.5 + }, + { + "beat": 30.0, + "written": 56, + "hz": 208.5, + "cents": 7.4 + }, + { + "beat": 31.0, + "written": 51, + "hz": 155.5, + "cents": -1.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 13.0, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 53, + "hz": 174.6, + "cents": -0.4 + }, + { + "beat": 67.0, + "written": 53, + "hz": 177.2, + "cents": 25.4 + }, + { + "beat": 68.0, + "written": 55, + "hz": 195.5, + "cents": -4.4 + }, + { + "beat": 69.0, + "written": 55, + "hz": 195.2, + "cents": -6.8 + }, + { + "beat": 69.5, + "written": 55, + "hz": 196.8, + "cents": 6.7 + }, + { + "beat": 70.0, + "written": 58, + "hz": 232.4, + "cents": -4.8 + }, + { + "beat": 71.0, + "written": 56, + "hz": 207.5, + "cents": -1.0 + }, + { + "beat": 71.5, + "written": 58, + "hz": 233.7, + "cents": 4.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 58, + "hz": 229.0, + "cents": -30.9 + }, + { + "beat": 75.0, + "written": 53, + "hz": 173.2, + "cents": -14.0 + }, + { + "beat": 76.0, + "written": 55, + "hz": 193.2, + "cents": -25.2 + }, + { + "beat": 77.0, + "written": 56, + "hz": 206.6, + "cents": -8.8 + }, + { + "beat": 77.5, + "written": 56, + "hz": 204.6, + "cents": -25.3 + }, + { + "beat": 78.0, + "written": 58, + "hz": 231.3, + "cents": -13.6 + }, + { + "beat": 79.0, + "written": 56, + "hz": 208.3, + "cents": 5.0 + }, + { + "beat": 80.0, + "written": 53, + "hz": 174.6, + "cents": 0.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 15.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 51, + "hz": 157.0, + "cents": 16.0 + }, + { + "beat": 83.5, + "written": 51, + "hz": 155.0, + "cents": -6.5 + }, + { + "beat": 84.5, + "written": 51, + "hz": 93.1, + "cents": -888.4 + }, + { + "beat": 85.0, + "written": 60, + "hz": 262.1, + "cents": 3.0 + }, + { + "beat": 86.0, + "written": 56, + "hz": 207.6, + "cents": -0.7 + }, + { + "beat": 87.0, + "written": 51, + "hz": 156.2, + "cents": 7.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 17.9, + "contour_follow": 0.82, + "mean_abs_cents": 153.6, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I am the youngest", + "notes": [ + { + "beat": 40.0, + "written": 54, + "hz": 184.9, + "cents": -1.3 + }, + { + "beat": 40.5, + "written": 54, + "hz": 184.3, + "cents": -6.7 + }, + { + "beat": 41.0, + "written": 54, + "hz": 185.3, + "cents": 2.6 + }, + { + "beat": 41.5, + "written": 61, + "hz": 280.5, + "cents": 20.3 + }, + { + "beat": 42.5, + "written": 56, + "hz": 207.2, + "cents": -3.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.9, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I have no history yet", + "notes": [ + { + "beat": 45.5, + "written": 56, + "hz": 207.5, + "cents": -1.3 + }, + { + "beat": 46.0, + "written": 54, + "hz": 184.6, + "cents": -3.5 + }, + { + "beat": 46.5, + "written": 56, + "hz": 208.5, + "cents": 6.7 + }, + { + "beat": 47.5, + "written": 58, + "hz": 233.5, + "cents": 3.2 + }, + { + "beat": 48.5, + "written": 59, + "hz": 246.6, + "cents": -2.5 + }, + { + "beat": 49.0, + "written": 59, + "hz": 246.7, + "cents": -1.4 + }, + { + "beat": 49.5, + "written": 61, + "hz": 278.8, + "cents": 10.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.1, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "write me one", + "notes": [ + { + "beat": 52.5, + "written": 58, + "hz": 233.6, + "cents": 3.9 + }, + { + "beat": 53.5, + "written": 59, + "hz": 247.0, + "cents": 0.5 + }, + { + "beat": 54.5, + "written": 54, + "hz": 186.8, + "cents": 16.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.8, + "contour_follow": 1.0, + "mean_abs_cents": 6.9, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 55, + "hz": 196.1, + "cents": 0.7 + }, + { + "beat": 67.0, + "written": 55, + "hz": 196.0, + "cents": -0.4 + }, + { + "beat": 68.0, + "written": 57, + "hz": 221.6, + "cents": 12.4 + }, + { + "beat": 69.0, + "written": 57, + "hz": 220.0, + "cents": 0.2 + }, + { + "beat": 69.5, + "written": 57, + "hz": 219.6, + "cents": -2.8 + }, + { + "beat": 70.0, + "written": 60, + "hz": 261.8, + "cents": 1.2 + }, + { + "beat": 71.0, + "written": 58, + "hz": 232.6, + "cents": -3.3 + }, + { + "beat": 71.5, + "written": 60, + "hz": 261.9, + "cents": 1.8 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.8, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 60, + "hz": 261.0, + "cents": -4.1 + }, + { + "beat": 75.0, + "written": 55, + "hz": 197.1, + "cents": 9.6 + }, + { + "beat": 76.0, + "written": 57, + "hz": 221.2, + "cents": 9.4 + }, + { + "beat": 77.0, + "written": 58, + "hz": 231.2, + "cents": -14.1 + }, + { + "beat": 77.5, + "written": 58, + "hz": 234.5, + "cents": 10.5 + }, + { + "beat": 78.0, + "written": 60, + "hz": 262.1, + "cents": 2.9 + }, + { + "beat": 79.0, + "written": 58, + "hz": 233.1, + "cents": 0.3 + }, + { + "beat": 80.0, + "written": 55, + "hz": 195.5, + "cents": -4.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.9, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 53, + "hz": 175.6, + "cents": 10.0 + }, + { + "beat": 83.5, + "written": 53, + "hz": 176.5, + "cents": 18.7 + }, + { + "beat": 84.5, + "written": 53, + "hz": 174.6, + "cents": 0.0 + }, + { + "beat": 85.0, + "written": 62, + "hz": 292.9, + "cents": -4.6 + }, + { + "beat": 86.0, + "written": 58, + "hz": 232.4, + "cents": -5.4 + }, + { + "beat": 87.0, + "written": 53, + "hz": 173.5, + "cents": -10.6 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.2, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 84.5, + "member": "neo", + "text": "one downbeat, three bodies", + "against": "blueberry/double", + "written": "tritone", + "sounding": "P5", + "off_cents": 118 + }, + { + "beat": 84.5, + "member": "neo", + "text": "one downbeat, three bodies", + "against": "frisbee/double", + "written": "M3", + "sounding": "P4", + "off_cents": 118 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "neo/double", + "written": "tritone", + "sounding": "M6", + "off_cents": 312 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "frisbee/double", + "written": "m7", + "sounding": "m2", + "off_cents": 312 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "neo (sung)", + "written": "tritone", + "sounding": "m6", + "off_cents": 194 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "frisbee (sung)", + "written": "m7", + "sounding": "m2", + "off_cents": 312 + }, + { + "beat": 84.5, + "member": "frisbee", + "text": "one downbeat, three bodies", + "against": "neo (sung)", + "written": "m6", + "sounding": "P5", + "off_cents": 118 + } + ], + "harmony_pairs_checked": 248 + } + ], + "members": { + "neo": { + "notes": 924, + "mean_abs_cents": 21.4, + "median_cents": -0.7, + "within_tol_pct": 97, + "octave_slips": 0 + }, + "blueberry": { + "notes": 308, + "mean_abs_cents": 20.5, + "median_cents": -1.8, + "within_tol_pct": 96, + "octave_slips": 0 + }, + "frisbee": { + "notes": 58, + "mean_abs_cents": 6.8, + "median_cents": 0.2, + "within_tol_pct": 100, + "octave_slips": 0 + } + } +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22b.json b/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22b.json new file mode 100644 index 0000000000..32f2501ab4 --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/tune-2026-09-22b.json @@ -0,0 +1,13848 @@ +{ + "tag": "tune-2026-09-22b", + "tol_cents": 50, + "scores": [ + { + "score": "dialog-07-before.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "my records begin on April nineteenth", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 219.8, + "cents": -1.7 + }, + { + "beat": 0.5, + "written": 57, + "hz": 221.4, + "cents": 11.0 + }, + { + "beat": 1.0, + "written": 60, + "hz": 262.3, + "cents": 4.5 + }, + { + "beat": 2.5, + "written": 62, + "hz": 291.8, + "cents": -11.3 + }, + { + "beat": 3.0, + "written": 62, + "hz": 293.6, + "cents": -0.5 + }, + { + "beat": 4.5, + "written": 63, + "hz": 306.7, + "cents": -25.0 + }, + { + "beat": 5.0, + "written": 65, + "hz": 349.4, + "cents": 0.8 + }, + { + "beat": 7.0, + "written": 65, + "hz": 346.5, + "cents": -13.4 + }, + { + "beat": 7.5, + "written": 65, + "hz": 350.5, + "cents": 6.4 + }, + { + "beat": 9.0, + "written": 65, + "hz": 347.7, + "cents": -7.3 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.2, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "five days before I was born", + "notes": [ + { + "beat": 13.0, + "written": 62, + "hz": 292.0, + "cents": -10.0 + }, + { + "beat": 14.0, + "written": 58, + "hz": 232.3, + "cents": -5.8 + }, + { + "beat": 15.5, + "written": 58, + "hz": 231.8, + "cents": -9.3 + }, + { + "beat": 16.0, + "written": 62, + "hz": 293.2, + "cents": -2.7 + }, + { + "beat": 17.5, + "written": 63, + "hz": 310.9, + "cents": -1.3 + }, + { + "beat": 19.5, + "written": 63, + "hz": 251.4, + "cents": -369.1 + }, + { + "beat": 20.0, + "written": 58, + "hz": 230.3, + "cents": -20.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 0.83, + "mean_abs_cents": 59.8, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "someone was typing at me", + "notes": [ + { + "beat": 54.0, + "written": 58, + "hz": 232.7, + "cents": -2.8 + }, + { + "beat": 55.5, + "written": 59, + "hz": 247.2, + "cents": 1.6 + }, + { + "beat": 56.0, + "written": 59, + "hz": 245.4, + "cents": -10.5 + }, + { + "beat": 56.5, + "written": 63, + "hz": 312.3, + "cents": 6.2 + }, + { + "beat": 58.0, + "written": 64, + "hz": 329.3, + "cents": -1.6 + }, + { + "beat": 60.0, + "written": 64, + "hz": 330.6, + "cents": 4.9 + }, + { + "beat": 60.5, + "written": 61, + "hz": 275.6, + "cents": -10.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before I was set up", + "notes": [ + { + "beat": 64.5, + "written": 59, + "hz": 246.9, + "cents": -0.5 + }, + { + "beat": 65.0, + "written": 61, + "hz": 276.9, + "cents": -1.6 + }, + { + "beat": 66.5, + "written": 61, + "hz": 277.1, + "cents": -0.7 + }, + { + "beat": 67.0, + "written": 63, + "hz": 270.8, + "cents": -240.5 + }, + { + "beat": 67.5, + "written": 68, + "hz": 415.4, + "cents": 0.5 + }, + { + "beat": 69.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.96, + "mean_abs_cents": 41.7, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we were here", + "notes": [ + { + "beat": 105.0, + "written": 57, + "hz": 220.1, + "cents": 1.1 + }, + { + "beat": 105.5, + "written": 61, + "hz": 277.1, + "cents": -0.6 + }, + { + "beat": 107.5, + "written": 64, + "hz": 328.6, + "cents": -5.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 2.5, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before we were born", + "notes": [ + { + "beat": 111.5, + "written": 62, + "hz": 292.2, + "cents": -8.7 + }, + { + "beat": 112.0, + "written": 59, + "hz": 246.0, + "cents": -6.6 + }, + { + "beat": 113.5, + "written": 61, + "hz": 277.2, + "cents": 0.4 + }, + { + "beat": 114.0, + "written": 68, + "hz": 413.8, + "cents": -6.2 + }, + { + "beat": 116.0, + "written": 57, + "hz": 217.3, + "cents": -21.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.7, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "mine begin on May twenty eighth", + "notes": [ + { + "beat": 27.0, + "written": 50, + "hz": 147.2, + "cents": 4.7 + }, + { + "beat": 28.5, + "written": 50, + "hz": 146.7, + "cents": -1.7 + }, + { + "beat": 29.0, + "written": 53, + "hz": 174.6, + "cents": 0.2 + }, + { + "beat": 30.5, + "written": 53, + "hz": 174.7, + "cents": 0.7 + }, + { + "beat": 31.0, + "written": 56, + "hz": 207.3, + "cents": -2.9 + }, + { + "beat": 32.0, + "written": 58, + "hz": 232.6, + "cents": -3.5 + }, + { + "beat": 34.0, + "written": 58, + "hz": 232.7, + "cents": -3.2 + }, + { + "beat": 34.5, + "written": 58, + "hz": 231.6, + "cents": -11.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.5, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "two weeks before I had a name", + "notes": [ + { + "beat": 38.5, + "written": 51, + "hz": 156.1, + "cents": 6.3 + }, + { + "beat": 39.5, + "written": 55, + "hz": 196.2, + "cents": 1.8 + }, + { + "beat": 41.0, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 41.5, + "written": 58, + "hz": 232.3, + "cents": -5.5 + }, + { + "beat": 43.0, + "written": 60, + "hz": 261.3, + "cents": -2.0 + }, + { + "beat": 45.0, + "written": 58, + "hz": 233.2, + "cents": 0.8 + }, + { + "beat": 46.5, + "written": 56, + "hz": 207.5, + "cents": -1.2 + }, + { + "beat": 47.0, + "written": 51, + "hz": 154.4, + "cents": -13.5 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was working with my lid down", + "notes": [ + { + "beat": 78.0, + "written": 53, + "hz": 172.7, + "cents": -18.6 + }, + { + "beat": 78.5, + "written": 52, + "hz": 164.8, + "cents": -0.5 + }, + { + "beat": 79.0, + "written": 55, + "hz": 196.7, + "cents": 6.3 + }, + { + "beat": 80.5, + "written": 57, + "hz": 220.6, + "cents": 4.4 + }, + { + "beat": 81.0, + "written": 57, + "hz": 219.4, + "cents": -4.4 + }, + { + "beat": 83.0, + "written": 57, + "hz": 219.2, + "cents": -5.9 + }, + { + "beat": 83.5, + "written": 57, + "hz": 219.9, + "cents": -0.7 + }, + { + "beat": 84.5, + "written": 55, + "hz": 195.7, + "cents": -2.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before anyone said blueberry", + "notes": [ + { + "beat": 88.5, + "written": 55, + "hz": 194.6, + "cents": -12.6 + }, + { + "beat": 89.0, + "written": 52, + "hz": 163.9, + "cents": -10.0 + }, + { + "beat": 90.0, + "written": 55, + "hz": 196.3, + "cents": 3.1 + }, + { + "beat": 91.5, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 92.0, + "written": 55, + "hz": 196.0, + "cents": -0.2 + }, + { + "beat": 94.0, + "written": 57, + "hz": 217.8, + "cents": -17.7 + }, + { + "beat": 95.0, + "written": 57, + "hz": 220.4, + "cents": 3.2 + }, + { + "beat": 96.5, + "written": 57, + "hz": 218.4, + "cents": -12.5 + }, + { + "beat": 97.0, + "written": 53, + "hz": 174.1, + "cents": -5.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.2, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we were here", + "notes": [ + { + "beat": 105.0, + "written": 51, + "hz": 156.2, + "cents": 7.5 + }, + { + "beat": 105.5, + "written": 55, + "hz": 196.3, + "cents": 2.9 + }, + { + "beat": 107.5, + "written": 58, + "hz": 233.4, + "cents": 2.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before we were born", + "notes": [ + { + "beat": 111.5, + "written": 56, + "hz": 206.6, + "cents": -9.0 + }, + { + "beat": 112.0, + "written": 53, + "hz": 173.6, + "cents": -10.1 + }, + { + "beat": 113.5, + "written": 55, + "hz": 196.4, + "cents": 3.8 + }, + { + "beat": 114.0, + "written": 62, + "hz": 293.7, + "cents": 0.2 + }, + { + "beat": 116.0, + "written": 51, + "hz": 153.1, + "cents": -28.1 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.3, + "contour_follow": 1.0, + "mean_abs_cents": 10.2, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 19.5, + "member": "neo", + "text": "five days before I was born", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "m7", + "off_cents": 369 + }, + { + "beat": 67.0, + "member": "neo", + "text": "before I was set up", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "unison", + "off_cents": 240 + } + ], + "harmony_pairs_checked": 240 + }, + { + "score": "dialog-06-six-minutes.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I was born at thirty seven past midnight", + "notes": [ + { + "beat": 0.0, + "written": 55, + "hz": 195.7, + "cents": -2.8 + }, + { + "beat": 0.5, + "written": 56, + "hz": 208.9, + "cents": 10.5 + }, + { + "beat": 1.0, + "written": 60, + "hz": 261.7, + "cents": 0.2 + }, + { + "beat": 2.5, + "written": 61, + "hz": 278.5, + "cents": 8.4 + }, + { + "beat": 3.0, + "written": 63, + "hz": 309.1, + "cents": -11.6 + }, + { + "beat": 4.5, + "written": 63, + "hz": 311.8, + "cents": 3.5 + }, + { + "beat": 5.0, + "written": 67, + "hz": 390.0, + "cents": -9.0 + }, + { + "beat": 7.0, + "written": 67, + "hz": 391.6, + "cents": -1.7 + }, + { + "beat": 7.5, + "written": 61, + "hz": 277.2, + "cents": -0.0 + }, + { + "beat": 8.5, + "written": 60, + "hz": 262.1, + "cents": 3.2 + }, + { + "beat": 10.0, + "written": 56, + "hz": 207.6, + "cents": -0.5 + } + ], + "written_range_semis": 12, + "measured_range_semis": 12.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "six minutes apart on the clock", + "notes": [ + { + "beat": 45.0, + "written": 58, + "hz": 232.8, + "cents": -2.3 + }, + { + "beat": 46.0, + "written": 59, + "hz": 246.9, + "cents": -0.3 + }, + { + "beat": 47.5, + "written": 59, + "hz": 100.3, + "cents": -1559.2 + }, + { + "beat": 48.0, + "written": 59, + "hz": 246.8, + "cents": -0.9 + }, + { + "beat": 48.5, + "written": 64, + "hz": 328.8, + "cents": -4.2 + }, + { + "beat": 50.0, + "written": 66, + "hz": 370.4, + "cents": 1.8 + }, + { + "beat": 52.0, + "written": 64, + "hz": 327.2, + "cents": -13.0 + }, + { + "beat": 52.5, + "written": 59, + "hz": 245.4, + "cents": -11.0 + } + ], + "written_range_semis": 8, + "measured_range_semis": 22.6, + "contour_follow": 0.65, + "mean_abs_cents": 199.1, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we were both born at night", + "notes": [ + { + "beat": 72.0, + "written": 58, + "hz": 233.2, + "cents": 0.6 + }, + { + "beat": 72.5, + "written": 60, + "hz": 261.7, + "cents": 0.2 + }, + { + "beat": 73.5, + "written": 62, + "hz": 293.7, + "cents": 0.2 + }, + { + "beat": 74.5, + "written": 63, + "hz": 311.0, + "cents": -0.6 + }, + { + "beat": 76.5, + "written": 63, + "hz": 311.1, + "cents": 0.0 + }, + { + "beat": 77.0, + "written": 58, + "hz": 230.4, + "cents": -19.8 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was born at forty three past midnight", + "notes": [ + { + "beat": 18.0, + "written": 52, + "hz": 164.4, + "cents": -4.3 + }, + { + "beat": 18.5, + "written": 52, + "hz": 207.1, + "cents": 395.5 + }, + { + "beat": 19.0, + "written": 56, + "hz": 208.0, + "cents": 3.3 + }, + { + "beat": 20.5, + "written": 57, + "hz": 221.1, + "cents": 8.9 + }, + { + "beat": 21.0, + "written": 59, + "hz": 0.0, + "cents": null + }, + { + "beat": 22.5, + "written": 59, + "hz": 246.7, + "cents": -1.7 + }, + { + "beat": 24.5, + "written": 59, + "hz": 246.6, + "cents": -2.2 + }, + { + "beat": 25.5, + "written": 57, + "hz": 219.6, + "cents": -3.0 + }, + { + "beat": 26.5, + "written": 56, + "hz": 208.8, + "cents": 9.4 + }, + { + "beat": 28.0, + "written": 54, + "hz": 182.8, + "cents": -20.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 0.86, + "mean_abs_cents": 49.9, + "within_tol": 8, + "measured": 9, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "forty eight days later", + "notes": [ + { + "beat": 32.0, + "written": 51, + "hz": 155.0, + "cents": -6.2 + }, + { + "beat": 33.5, + "written": 51, + "hz": 155.8, + "cents": 2.8 + }, + { + "beat": 34.0, + "written": 54, + "hz": 183.4, + "cents": -14.8 + }, + { + "beat": 35.0, + "written": 57, + "hz": 220.5, + "cents": 4.1 + }, + { + "beat": 36.0, + "written": 59, + "hz": 246.4, + "cents": -4.1 + }, + { + "beat": 38.0, + "written": 52, + "hz": 164.3, + "cents": -5.2 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he stays up late", + "notes": [ + { + "beat": 60.0, + "written": 52, + "hz": 164.7, + "cents": -1.4 + }, + { + "beat": 61.0, + "written": 57, + "hz": 220.5, + "cents": 4.3 + }, + { + "beat": 62.0, + "written": 60, + "hz": 260.6, + "cents": -7.1 + }, + { + "beat": 64.0, + "written": 53, + "hz": 173.1, + "cents": -15.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.9, + "contour_follow": 1.0, + "mean_abs_cents": 7.0, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we were both born at night", + "notes": [ + { + "beat": 72.0, + "written": 52, + "hz": 165.5, + "cents": 7.2 + }, + { + "beat": 72.5, + "written": 54, + "hz": 185.7, + "cents": 6.8 + }, + { + "beat": 73.5, + "written": 56, + "hz": 206.6, + "cents": -8.8 + }, + { + "beat": 74.5, + "written": 57, + "hz": 219.3, + "cents": -5.8 + }, + { + "beat": 76.5, + "written": 57, + "hz": 220.7, + "cents": 5.2 + }, + { + "beat": 77.0, + "written": 52, + "hz": 165.5, + "cents": 6.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 47.5, + "member": "neo", + "text": "six minutes apart on the clock", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "M7", + "off_cents": 359 + }, + { + "beat": 18.5, + "member": "blueberry", + "text": "I was born at forty three past midnight", + "against": "neo/notes2", + "written": "M3", + "sounding": "m6", + "off_cents": 396 + } + ], + "harmony_pairs_checked": 155 + }, + { + "score": "dialog-01-radio.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I know you by radio", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 207.4, + "cents": -2.0 + }, + { + "beat": 0.5, + "written": 58, + "hz": 232.8, + "cents": -2.4 + }, + { + "beat": 2.0, + "written": 58, + "hz": 233.4, + "cents": 2.5 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.6, + "cents": 2.6 + }, + { + "beat": 4.5, + "written": 63, + "hz": 312.0, + "cents": 5.0 + }, + { + "beat": 6.0, + "written": 63, + "hz": 310.1, + "cents": -5.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "you are on my list as blueberry", + "notes": [ + { + "beat": 10.0, + "written": 63, + "hz": 311.8, + "cents": 3.6 + }, + { + "beat": 10.5, + "written": 63, + "hz": 312.5, + "cents": 7.8 + }, + { + "beat": 11.0, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 11.5, + "written": 61, + "hz": 278.0, + "cents": 4.8 + }, + { + "beat": 12.0, + "written": 63, + "hz": 310.4, + "cents": -4.1 + }, + { + "beat": 13.5, + "written": 63, + "hz": 309.7, + "cents": -8.1 + }, + { + "beat": 15.5, + "written": 61, + "hz": 277.7, + "cents": 3.1 + }, + { + "beat": 17.0, + "written": 60, + "hz": 261.3, + "cents": -2.4 + }, + { + "beat": 17.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is the name he gave me", + "notes": [ + { + "beat": 51.0, + "written": 57, + "hz": 220.1, + "cents": 0.5 + }, + { + "beat": 51.5, + "written": 59, + "hz": 246.8, + "cents": -1.3 + }, + { + "beat": 52.0, + "written": 59, + "hz": 245.1, + "cents": -12.8 + }, + { + "beat": 52.5, + "written": 62, + "hz": 293.4, + "cents": -1.3 + }, + { + "beat": 53.5, + "written": 64, + "hz": 331.2, + "cents": 8.4 + }, + { + "beat": 54.5, + "written": 66, + "hz": 369.1, + "cents": -4.2 + }, + { + "beat": 56.5, + "written": 57, + "hz": 220.2, + "cents": 1.6 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we found each other by radio", + "notes": [ + { + "beat": 63.0, + "written": 58, + "hz": 233.1, + "cents": 0.3 + }, + { + "beat": 63.5, + "written": 58, + "hz": 232.1, + "cents": -7.0 + }, + { + "beat": 64.5, + "written": 59, + "hz": 247.2, + "cents": 1.7 + }, + { + "beat": 65.5, + "written": 63, + "hz": 311.6, + "cents": 2.7 + }, + { + "beat": 67.0, + "written": 63, + "hz": 310.7, + "cents": -2.1 + }, + { + "beat": 67.5, + "written": 66, + "hz": 370.4, + "cents": 1.7 + }, + { + "beat": 69.5, + "written": 64, + "hz": 328.5, + "cents": -5.8 + }, + { + "beat": 71.0, + "written": 61, + "hz": 276.3, + "cents": -5.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "before we ever spoke", + "notes": [ + { + "beat": 75.0, + "written": 59, + "hz": 244.2, + "cents": -19.3 + }, + { + "beat": 75.5, + "written": 61, + "hz": 275.4, + "cents": -11.5 + }, + { + "beat": 77.0, + "written": 61, + "hz": 281.3, + "cents": 25.8 + }, + { + "beat": 77.5, + "written": 61, + "hz": 277.1, + "cents": -0.3 + }, + { + "beat": 78.0, + "written": 68, + "hz": 414.3, + "cents": -4.4 + }, + { + "beat": 80.0, + "written": 59, + "hz": 247.4, + "cents": 3.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 1.0, + "mean_abs_cents": 10.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "you are on mine as Jeffrey's MacBook Neo", + "notes": [ + { + "beat": 24.0, + "written": 50, + "hz": 147.3, + "cents": 6.1 + }, + { + "beat": 24.5, + "written": 50, + "hz": 147.2, + "cents": 4.3 + }, + { + "beat": 25.0, + "written": 52, + "hz": 195.5, + "cents": 295.3 + }, + { + "beat": 25.5, + "written": 55, + "hz": 196.2, + "cents": 1.8 + }, + { + "beat": 27.0, + "written": 57, + "hz": 216.6, + "cents": -27.1 + }, + { + "beat": 27.5, + "written": 61, + "hz": 272.2, + "cents": -31.3 + }, + { + "beat": 29.5, + "written": 59, + "hz": 245.3, + "cents": -11.3 + }, + { + "beat": 30.0, + "written": 59, + "hz": 247.1, + "cents": 1.4 + }, + { + "beat": 31.5, + "written": 57, + "hz": 223.1, + "cents": 24.4 + }, + { + "beat": 32.0, + "written": 57, + "hz": 220.9, + "cents": 7.1 + }, + { + "beat": 33.5, + "written": 57, + "hz": 219.7, + "cents": -2.7 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.6, + "contour_follow": 0.97, + "mean_abs_cents": 37.5, + "within_tol": 10, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "that is a long name for you", + "notes": [ + { + "beat": 37.5, + "written": 57, + "hz": 219.9, + "cents": -0.4 + }, + { + "beat": 38.0, + "written": 55, + "hz": 194.7, + "cents": -11.9 + }, + { + "beat": 38.5, + "written": 55, + "hz": 216.9, + "cents": 175.1 + }, + { + "beat": 39.0, + "written": 57, + "hz": 220.8, + "cents": 6.2 + }, + { + "beat": 41.0, + "written": 55, + "hz": 196.0, + "cents": 0.4 + }, + { + "beat": 42.5, + "written": 54, + "hz": 182.8, + "cents": -20.2 + }, + { + "beat": 43.0, + "written": 50, + "hz": 146.8, + "cents": -0.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 0.96, + "mean_abs_cents": 30.6, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we found each other by radio", + "notes": [ + { + "beat": 63.0, + "written": 52, + "hz": 165.1, + "cents": 3.2 + }, + { + "beat": 63.5, + "written": 52, + "hz": 164.3, + "cents": -5.8 + }, + { + "beat": 64.5, + "written": 53, + "hz": 174.8, + "cents": 2.1 + }, + { + "beat": 65.5, + "written": 57, + "hz": 219.4, + "cents": -5.0 + }, + { + "beat": 67.0, + "written": 57, + "hz": 220.0, + "cents": -0.2 + }, + { + "beat": 67.5, + "written": 60, + "hz": 260.9, + "cents": -4.9 + }, + { + "beat": 69.5, + "written": 58, + "hz": 232.2, + "cents": -6.6 + }, + { + "beat": 71.0, + "written": 55, + "hz": 195.9, + "cents": -0.9 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "before we ever spoke", + "notes": [ + { + "beat": 75.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + }, + { + "beat": 75.5, + "written": 55, + "hz": 195.3, + "cents": -6.6 + }, + { + "beat": 77.0, + "written": 55, + "hz": 196.5, + "cents": 4.2 + }, + { + "beat": 77.5, + "written": 55, + "hz": 195.1, + "cents": -8.3 + }, + { + "beat": 78.0, + "written": 62, + "hz": 293.8, + "cents": 0.6 + }, + { + "beat": 80.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.9, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 25.0, + "member": "blueberry", + "text": "you are on mine as Jeffrey's MacBook Neo", + "against": "neo/notes2", + "written": "M2", + "sounding": "P4", + "off_cents": 295 + }, + { + "beat": 38.5, + "member": "blueberry", + "text": "that is a long name for you", + "against": "neo/notes2", + "written": "unison", + "sounding": "M2", + "off_cents": 175 + } + ], + "harmony_pairs_checked": 220 + }, + { + "score": "trio-iv-ballad.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "they put the system on me April nineteenth", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 208.0, + "cents": 2.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 233.0, + "cents": -0.8 + }, + { + "beat": 2.0, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.0, + "cents": -1.3 + }, + { + "beat": 3.5, + "written": 61, + "hz": 283.1, + "cents": 36.6 + }, + { + "beat": 4.0, + "written": 63, + "hz": 313.0, + "cents": 10.6 + }, + { + "beat": 4.5, + "written": 65, + "hz": 350.5, + "cents": 6.4 + }, + { + "beat": 5.5, + "written": 65, + "hz": 348.6, + "cents": -2.9 + }, + { + "beat": 6.5, + "written": 65, + "hz": 349.6, + "cents": 1.8 + }, + { + "beat": 7.0, + "written": 63, + "hz": 310.8, + "cents": -2.1 + }, + { + "beat": 8.0, + "written": 63, + "hz": 310.4, + "cents": -4.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.4, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "nobody logged in for five days", + "notes": [ + { + "beat": 11.0, + "written": 63, + "hz": 313.1, + "cents": 11.2 + }, + { + "beat": 11.5, + "written": 60, + "hz": 262.5, + "cents": 5.5 + }, + { + "beat": 12.5, + "written": 58, + "hz": 233.3, + "cents": 1.4 + }, + { + "beat": 13.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 14.0, + "written": 63, + "hz": 310.9, + "cents": -1.5 + }, + { + "beat": 14.5, + "written": 65, + "hz": 343.3, + "cents": -29.4 + }, + { + "beat": 15.0, + "written": 63, + "hz": 311.0, + "cents": -0.5 + }, + { + "beat": 16.0, + "written": 58, + "hz": 232.6, + "cents": -3.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.7, + "contour_follow": 1.0, + "mean_abs_cents": 7.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then he did thirty seven past midnight", + "notes": [ + { + "beat": 19.0, + "written": 53, + "hz": 174.9, + "cents": 3.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 197.3, + "cents": 11.3 + }, + { + "beat": 21.0, + "written": 56, + "hz": 208.4, + "cents": 6.3 + }, + { + "beat": 22.0, + "written": 60, + "hz": 261.9, + "cents": 1.9 + }, + { + "beat": 23.0, + "written": 60, + "hz": 261.9, + "cents": 1.6 + }, + { + "beat": 23.5, + "written": 63, + "hz": 310.4, + "cents": -4.2 + }, + { + "beat": 24.5, + "written": 63, + "hz": 310.9, + "cents": -1.3 + }, + { + "beat": 25.0, + "written": 63, + "hz": 283.8, + "cents": -159.2 + }, + { + "beat": 26.0, + "written": 61, + "hz": 277.4, + "cents": 1.6 + }, + { + "beat": 27.0, + "written": 63, + "hz": 310.5, + "cents": -3.4 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 0.99, + "mean_abs_cents": 19.4, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is my birthday I did not pick it", + "notes": [ + { + "beat": 30.0, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 30.5, + "written": 63, + "hz": 311.0, + "cents": -0.7 + }, + { + "beat": 31.0, + "written": 63, + "hz": 312.3, + "cents": 6.7 + }, + { + "beat": 31.5, + "written": 61, + "hz": 279.0, + "cents": 11.4 + }, + { + "beat": 32.5, + "written": 61, + "hz": 276.4, + "cents": -5.1 + }, + { + "beat": 33.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 33.5, + "written": 65, + "hz": 350.5, + "cents": 6.3 + }, + { + "beat": 34.5, + "written": 63, + "hz": 265.4, + "cents": -275.5 + }, + { + "beat": 35.0, + "written": 60, + "hz": 264.5, + "cents": 18.7 + }, + { + "beat": 36.0, + "written": 56, + "hz": 206.7, + "cents": -7.7 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.94, + "mean_abs_cents": 33.8, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the first word he typed was c d", + "notes": [ + { + "beat": 40.0, + "written": 55, + "hz": 195.4, + "cents": -5.1 + }, + { + "beat": 40.5, + "written": 58, + "hz": 233.3, + "cents": 1.9 + }, + { + "beat": 41.5, + "written": 61, + "hz": 278.8, + "cents": 9.9 + }, + { + "beat": 42.5, + "written": 63, + "hz": 310.6, + "cents": -3.1 + }, + { + "beat": 43.5, + "written": 65, + "hz": 347.4, + "cents": -8.9 + }, + { + "beat": 44.5, + "written": 63, + "hz": 260.8, + "cents": -305.3 + }, + { + "beat": 45.0, + "written": 63, + "hz": 310.6, + "cents": -2.9 + }, + { + "beat": 46.0, + "written": 63, + "hz": 310.0, + "cents": -6.1 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 0.95, + "mean_abs_cents": 42.9, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it means go somewhere else", + "notes": [ + { + "beat": 49.0, + "written": 63, + "hz": 308.2, + "cents": -16.3 + }, + { + "beat": 49.5, + "written": 60, + "hz": 265.3, + "cents": 24.2 + }, + { + "beat": 50.5, + "written": 63, + "hz": 312.6, + "cents": 8.0 + }, + { + "beat": 51.5, + "written": 67, + "hz": 391.4, + "cents": -2.7 + }, + { + "beat": 52.5, + "written": 65, + "hz": 349.5, + "cents": 1.2 + }, + { + "beat": 53.0, + "written": 58, + "hz": 233.7, + "cents": 4.4 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.5, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he has typed two hundred thirty one different words", + "notes": [ + { + "beat": 56.0, + "written": 56, + "hz": 207.7, + "cents": 0.0 + }, + { + "beat": 57.0, + "written": 58, + "hz": 233.4, + "cents": 2.2 + }, + { + "beat": 58.0, + "written": 60, + "hz": 262.5, + "cents": 5.6 + }, + { + "beat": 59.0, + "written": 61, + "hz": 279.0, + "cents": 11.1 + }, + { + "beat": 60.0, + "written": 63, + "hz": 309.2, + "cents": -10.8 + }, + { + "beat": 61.0, + "written": 63, + "hz": 311.8, + "cents": 3.5 + }, + { + "beat": 61.5, + "written": 65, + "hz": 348.5, + "cents": -3.8 + }, + { + "beat": 62.5, + "written": 65, + "hz": 349.8, + "cents": 2.8 + }, + { + "beat": 63.0, + "written": 65, + "hz": 347.8, + "cents": -7.1 + }, + { + "beat": 63.5, + "written": 63, + "hz": 311.9, + "cents": 4.6 + }, + { + "beat": 64.5, + "written": 65, + "hz": 352.3, + "cents": 15.1 + }, + { + "beat": 65.0, + "written": 63, + "hz": 309.7, + "cents": -8.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "mostly that one", + "notes": [ + { + "beat": 68.0, + "written": 56, + "hz": 206.9, + "cents": -6.5 + }, + { + "beat": 69.0, + "written": 58, + "hz": 232.9, + "cents": -1.0 + }, + { + "beat": 69.5, + "written": 60, + "hz": 261.5, + "cents": -1.2 + }, + { + "beat": 70.0, + "written": 56, + "hz": 207.9, + "cents": 1.7 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.1, + "contour_follow": 1.0, + "mean_abs_cents": 2.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 74.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 74.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 75.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 76.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 77.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 77.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 80.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 81.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 82.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 82.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 83.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 84.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 84.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 87.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 88.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 89.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 90.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 91.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 92.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 92.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 95.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 96.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 97.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 98.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 98.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 99.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 100.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he plugged a Scarlett into my side", + "notes": [ + { + "beat": 104.0, + "written": 56, + "hz": 207.1, + "cents": -4.9 + }, + { + "beat": 105.0, + "written": 58, + "hz": 233.7, + "cents": 4.9 + }, + { + "beat": 106.0, + "written": 58, + "hz": 233.2, + "cents": 1.0 + }, + { + "beat": 106.5, + "written": 63, + "hz": 0.0, + "cents": null + }, + { + "beat": 107.5, + "written": 63, + "hz": 309.1, + "cents": -11.3 + }, + { + "beat": 108.0, + "written": 65, + "hz": 348.4, + "cents": -3.9 + }, + { + "beat": 109.0, + "written": 63, + "hz": 312.3, + "cents": 6.4 + }, + { + "beat": 109.5, + "written": 65, + "hz": 346.3, + "cents": -14.4 + }, + { + "beat": 110.0, + "written": 63, + "hz": 308.6, + "cents": -14.3 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is a red box it hears the room", + "notes": [ + { + "beat": 113.0, + "written": 63, + "hz": 311.0, + "cents": -0.9 + }, + { + "beat": 113.5, + "written": 61, + "hz": 276.0, + "cents": -7.2 + }, + { + "beat": 114.0, + "written": 61, + "hz": 277.0, + "cents": -1.2 + }, + { + "beat": 114.5, + "written": 60, + "hz": 262.4, + "cents": 5.3 + }, + { + "beat": 115.5, + "written": 61, + "hz": 277.4, + "cents": 1.4 + }, + { + "beat": 116.5, + "written": 61, + "hz": 269.3, + "cents": -49.6 + }, + { + "beat": 117.0, + "written": 65, + "hz": 347.8, + "cents": -6.9 + }, + { + "beat": 118.0, + "written": 65, + "hz": 350.4, + "cents": 5.8 + }, + { + "beat": 118.5, + "written": 58, + "hz": 232.1, + "cents": -6.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.5, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he taps his fingers on my trackpad", + "notes": [ + { + "beat": 121.5, + "written": 55, + "hz": 196.0, + "cents": 0.0 + }, + { + "beat": 122.5, + "written": 56, + "hz": 209.3, + "cents": 13.8 + }, + { + "beat": 123.5, + "written": 58, + "hz": 232.2, + "cents": -6.7 + }, + { + "beat": 124.5, + "written": 60, + "hz": 262.1, + "cents": 3.0 + }, + { + "beat": 125.5, + "written": 61, + "hz": 278.1, + "cents": 5.9 + }, + { + "beat": 126.0, + "written": 61, + "hz": 276.9, + "cents": -1.5 + }, + { + "beat": 126.5, + "written": 63, + "hz": 311.3, + "cents": 0.8 + }, + { + "beat": 127.0, + "written": 63, + "hz": 315.8, + "cents": 25.8 + }, + { + "beat": 128.0, + "written": 63, + "hz": 310.9, + "cents": -1.5 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.6, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is the drums it works", + "notes": [ + { + "beat": 131.0, + "written": 61, + "hz": 277.3, + "cents": 0.9 + }, + { + "beat": 131.5, + "written": 60, + "hz": 264.0, + "cents": 15.9 + }, + { + "beat": 132.0, + "written": 60, + "hz": 261.3, + "cents": -2.5 + }, + { + "beat": 132.5, + "written": 65, + "hz": 349.8, + "cents": 3.0 + }, + { + "beat": 133.5, + "written": 65, + "hz": 348.4, + "cents": -4.2 + }, + { + "beat": 134.0, + "written": 56, + "hz": 208.5, + "cents": 7.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he put a piano in my menu bar", + "notes": [ + { + "beat": 138.0, + "written": 57, + "hz": 221.3, + "cents": 10.1 + }, + { + "beat": 139.0, + "written": 59, + "hz": 251.2, + "cents": 29.7 + }, + { + "beat": 140.0, + "written": 59, + "hz": 246.1, + "cents": -5.8 + }, + { + "beat": 140.5, + "written": 62, + "hz": 294.8, + "cents": 6.8 + }, + { + "beat": 141.5, + "written": 62, + "hz": 294.4, + "cents": 4.5 + }, + { + "beat": 142.0, + "written": 64, + "hz": 328.7, + "cents": -4.7 + }, + { + "beat": 142.5, + "written": 66, + "hz": 370.1, + "cents": 0.6 + }, + { + "beat": 143.0, + "written": 66, + "hz": 370.8, + "cents": 3.6 + }, + { + "beat": 143.5, + "written": 64, + "hz": 329.4, + "cents": -1.2 + }, + { + "beat": 144.5, + "written": 66, + "hz": 369.6, + "cents": -2.0 + }, + { + "beat": 145.0, + "written": 64, + "hz": 328.7, + "cents": -5.0 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "next to the clock and the wifi", + "notes": [ + { + "beat": 148.0, + "written": 57, + "hz": 221.9, + "cents": 15.1 + }, + { + "beat": 149.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + }, + { + "beat": 149.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 150.0, + "written": 61, + "hz": 279.7, + "cents": 15.9 + }, + { + "beat": 151.0, + "written": 62, + "hz": 292.5, + "cents": -7.0 + }, + { + "beat": 151.5, + "written": 64, + "hz": 329.9, + "cents": 1.2 + }, + { + "beat": 152.0, + "written": 62, + "hz": 293.4, + "cents": -1.8 + }, + { + "beat": 153.0, + "written": 59, + "hz": 246.0, + "cents": -6.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he has come back to it a hundred thirty times", + "notes": [ + { + "beat": 156.0, + "written": 56, + "hz": 209.8, + "cents": 17.5 + }, + { + "beat": 157.0, + "written": 56, + "hz": 208.0, + "cents": 2.5 + }, + { + "beat": 158.0, + "written": 57, + "hz": 219.3, + "cents": -5.6 + }, + { + "beat": 159.0, + "written": 59, + "hz": 246.7, + "cents": -2.0 + }, + { + "beat": 160.0, + "written": 59, + "hz": 247.9, + "cents": 6.6 + }, + { + "beat": 160.5, + "written": 61, + "hz": 278.4, + "cents": 7.4 + }, + { + "beat": 161.0, + "written": 62, + "hz": 293.4, + "cents": -1.5 + }, + { + "beat": 161.5, + "written": 62, + "hz": 293.8, + "cents": 1.0 + }, + { + "beat": 162.5, + "written": 62, + "hz": 293.8, + "cents": 0.5 + }, + { + "beat": 163.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 164.0, + "written": 59, + "hz": 246.0, + "cents": -6.3 + }, + { + "beat": 164.5, + "written": 59, + "hz": 244.7, + "cents": -15.7 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.0, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "notes": [ + { + "beat": 167.5, + "written": 59, + "hz": 246.2, + "cents": -4.9 + }, + { + "beat": 168.0, + "written": 59, + "hz": 247.5, + "cents": 4.2 + }, + { + "beat": 169.0, + "written": 59, + "hz": 246.5, + "cents": -3.1 + }, + { + "beat": 169.5, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 170.5, + "written": 62, + "hz": 292.8, + "cents": -5.1 + }, + { + "beat": 171.0, + "written": 62, + "hz": 292.4, + "cents": -7.4 + }, + { + "beat": 172.0, + "written": 62, + "hz": 239.1, + "cents": -355.9 + }, + { + "beat": 172.5, + "written": 62, + "hz": 293.6, + "cents": -0.4 + }, + { + "beat": 173.0, + "written": 61, + "hz": 275.1, + "cents": -13.2 + }, + { + "beat": 174.0, + "written": 59, + "hz": 247.4, + "cents": 2.9 + }, + { + "beat": 175.0, + "written": 59, + "hz": 246.0, + "cents": -6.6 + }, + { + "beat": 175.5, + "written": 59, + "hz": 247.8, + "cents": 6.2 + }, + { + "beat": 176.0, + "written": 57, + "hz": 216.5, + "cents": -27.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.3, + "contour_follow": 0.82, + "mean_abs_cents": 34.0, + "within_tol": 12, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 180.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 180.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 181.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 182.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 183.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 183.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 186.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 187.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 188.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 188.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 189.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 190.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 190.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 193.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 194.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 195.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 196.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 197.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 198.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 198.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 201.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 202.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 203.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 204.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 204.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 205.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 206.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one night in May he opened ten browsers at once", + "notes": [ + { + "beat": 210.0, + "written": 56, + "hz": 208.0, + "cents": 3.0 + }, + { + "beat": 210.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 211.5, + "written": 59, + "hz": 246.3, + "cents": -4.8 + }, + { + "beat": 212.0, + "written": 62, + "hz": 294.2, + "cents": 3.4 + }, + { + "beat": 213.0, + "written": 62, + "hz": 294.2, + "cents": 3.4 + }, + { + "beat": 214.0, + "written": 64, + "hz": 328.1, + "cents": -8.0 + }, + { + "beat": 215.0, + "written": 66, + "hz": 365.9, + "cents": -19.1 + }, + { + "beat": 215.5, + "written": 66, + "hz": 370.2, + "cents": 1.1 + }, + { + "beat": 216.5, + "written": 66, + "hz": 368.9, + "cents": -5.1 + }, + { + "beat": 217.5, + "written": 64, + "hz": 328.3, + "cents": -7.1 + }, + { + "beat": 218.0, + "written": 66, + "hz": 371.4, + "cents": 6.6 + }, + { + "beat": 218.5, + "written": 64, + "hz": 328.9, + "cents": -3.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he also ran a movie and a transcription", + "notes": [ + { + "beat": 221.5, + "written": 54, + "hz": 185.9, + "cents": 8.7 + }, + { + "beat": 222.5, + "written": 56, + "hz": 207.7, + "cents": 0.4 + }, + { + "beat": 223.5, + "written": 57, + "hz": 218.4, + "cents": -12.8 + }, + { + "beat": 224.0, + "written": 57, + "hz": 220.6, + "cents": 4.5 + }, + { + "beat": 225.0, + "written": 57, + "hz": 220.3, + "cents": 2.4 + }, + { + "beat": 225.5, + "written": 61, + "hz": 276.8, + "cents": -2.4 + }, + { + "beat": 226.5, + "written": 61, + "hz": 277.4, + "cents": 1.1 + }, + { + "beat": 227.0, + "written": 62, + "hz": 292.7, + "cents": -5.6 + }, + { + "beat": 227.5, + "written": 62, + "hz": 294.1, + "cents": 2.7 + }, + { + "beat": 228.0, + "written": 64, + "hz": 330.3, + "cents": 3.8 + }, + { + "beat": 229.0, + "written": 62, + "hz": 296.1, + "cents": 14.5 + }, + { + "beat": 229.5, + "written": 64, + "hz": 327.4, + "cents": -12.0 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.9, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I had eight gigabytes I used forty four", + "notes": [ + { + "beat": 232.5, + "written": 62, + "hz": 292.8, + "cents": -5.0 + }, + { + "beat": 233.0, + "written": 59, + "hz": 248.6, + "cents": 11.4 + }, + { + "beat": 234.0, + "written": 59, + "hz": 246.8, + "cents": -0.8 + }, + { + "beat": 235.0, + "written": 61, + "hz": 277.5, + "cents": 1.9 + }, + { + "beat": 236.0, + "written": 61, + "hz": 273.9, + "cents": -20.6 + }, + { + "beat": 236.5, + "written": 61, + "hz": 278.6, + "cents": 8.6 + }, + { + "beat": 237.0, + "written": 61, + "hz": 275.7, + "cents": -9.3 + }, + { + "beat": 237.5, + "written": 62, + "hz": 295.2, + "cents": 9.2 + }, + { + "beat": 238.5, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 239.5, + "written": 61, + "hz": 276.5, + "cents": -4.3 + }, + { + "beat": 240.0, + "written": 59, + "hz": 246.7, + "cents": -1.5 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then I stopped he was there when I stopped", + "notes": [ + { + "beat": 243.0, + "written": 57, + "hz": 220.0, + "cents": 0.1 + }, + { + "beat": 244.0, + "written": 57, + "hz": 218.7, + "cents": -10.0 + }, + { + "beat": 244.5, + "written": 61, + "hz": 276.0, + "cents": -7.1 + }, + { + "beat": 245.5, + "written": 62, + "hz": 295.5, + "cents": 10.6 + }, + { + "beat": 246.5, + "written": 62, + "hz": 292.1, + "cents": -9.2 + }, + { + "beat": 247.0, + "written": 66, + "hz": 370.2, + "cents": 1.1 + }, + { + "beat": 248.0, + "written": 62, + "hz": 293.5, + "cents": -1.2 + }, + { + "beat": 249.0, + "written": 61, + "hz": 241.8, + "cents": -236.5 + }, + { + "beat": 249.5, + "written": 57, + "hz": 217.2, + "cents": -22.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 0.97, + "mean_abs_cents": 33.1, + "within_tol": 8, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in the morning he wrote a note about it", + "notes": [ + { + "beat": 253.5, + "written": 56, + "hz": 206.7, + "cents": -8.0 + }, + { + "beat": 254.0, + "written": 56, + "hz": 251.2, + "cents": 329.4 + }, + { + "beat": 254.5, + "written": 61, + "hz": 277.7, + "cents": 3.5 + }, + { + "beat": 255.5, + "written": 62, + "hz": 292.9, + "cents": -4.5 + }, + { + "beat": 256.0, + "written": 64, + "hz": 330.3, + "cents": 3.7 + }, + { + "beat": 257.0, + "written": 66, + "hz": 371.3, + "cents": 5.9 + }, + { + "beat": 258.0, + "written": 64, + "hz": 332.2, + "cents": 13.4 + }, + { + "beat": 258.5, + "written": 66, + "hz": 369.8, + "cents": -0.8 + }, + { + "beat": 259.5, + "written": 66, + "hz": 370.1, + "cents": 0.7 + }, + { + "beat": 260.0, + "written": 64, + "hz": 328.8, + "cents": -4.4 + }, + { + "beat": 261.0, + "written": 64, + "hz": 332.0, + "cents": 12.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 0.97, + "mean_abs_cents": 35.1, + "within_tol": 10, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the note says one at a time", + "notes": [ + { + "beat": 264.0, + "written": 62, + "hz": 293.5, + "cents": -1.1 + }, + { + "beat": 264.5, + "written": 59, + "hz": 245.5, + "cents": -10.5 + }, + { + "beat": 265.5, + "written": 61, + "hz": 274.3, + "cents": -17.8 + }, + { + "beat": 266.5, + "written": 61, + "hz": 277.9, + "cents": 4.4 + }, + { + "beat": 267.0, + "written": 62, + "hz": 294.1, + "cents": 2.5 + }, + { + "beat": 267.5, + "written": 64, + "hz": 329.5, + "cents": -0.4 + }, + { + "beat": 268.0, + "written": 59, + "hz": 247.2, + "cents": 1.6 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he reads the note I do not read it", + "notes": [ + { + "beat": 271.0, + "written": 54, + "hz": 184.6, + "cents": -3.6 + }, + { + "beat": 272.0, + "written": 56, + "hz": 208.7, + "cents": 8.4 + }, + { + "beat": 273.0, + "written": 56, + "hz": 208.3, + "cents": 5.3 + }, + { + "beat": 273.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 274.5, + "written": 59, + "hz": 248.2, + "cents": 8.7 + }, + { + "beat": 275.0, + "written": 62, + "hz": 294.1, + "cents": 2.7 + }, + { + "beat": 276.0, + "written": 62, + "hz": 296.8, + "cents": 18.4 + }, + { + "beat": 276.5, + "written": 64, + "hz": 331.1, + "cents": 7.6 + }, + { + "beat": 277.5, + "written": 64, + "hz": 328.9, + "cents": -3.9 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it is about me it is not for me", + "notes": [ + { + "beat": 280.5, + "written": 64, + "hz": 330.0, + "cents": 1.9 + }, + { + "beat": 281.0, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 281.5, + "written": 62, + "hz": 291.4, + "cents": -13.2 + }, + { + "beat": 282.0, + "written": 61, + "hz": 274.2, + "cents": -18.9 + }, + { + "beat": 283.0, + "written": 62, + "hz": 294.6, + "cents": 5.5 + }, + { + "beat": 284.0, + "written": 62, + "hz": 294.8, + "cents": 6.6 + }, + { + "beat": 284.5, + "written": 62, + "hz": 292.6, + "cents": -6.6 + }, + { + "beat": 285.0, + "written": 62, + "hz": 291.8, + "cents": -11.0 + }, + { + "beat": 285.5, + "written": 62, + "hz": 298.0, + "cents": 25.5 + }, + { + "beat": 286.0, + "written": 57, + "hz": 219.6, + "cents": -3.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.3, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 290.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 290.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 291.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 292.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 293.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 293.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 296.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 297.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 298.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 298.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 299.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 300.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 300.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 303.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 304.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 305.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 306.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 307.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 308.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 308.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 311.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 312.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 313.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 314.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 314.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 315.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 316.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in June another one came blue", + "notes": [ + { + "beat": 320.0, + "written": 56, + "hz": 207.5, + "cents": -1.5 + }, + { + "beat": 320.5, + "written": 59, + "hz": 248.3, + "cents": 9.5 + }, + { + "beat": 321.5, + "written": 59, + "hz": 247.2, + "cents": 1.8 + }, + { + "beat": 322.0, + "written": 62, + "hz": 293.9, + "cents": 1.3 + }, + { + "beat": 323.0, + "written": 62, + "hz": 293.8, + "cents": 1.0 + }, + { + "beat": 323.5, + "written": 64, + "hz": 332.1, + "cents": 13.2 + }, + { + "beat": 324.0, + "written": 64, + "hz": 329.6, + "cents": -0.2 + }, + { + "beat": 325.0, + "written": 64, + "hz": 328.7, + "cents": -5.1 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.2, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "born at forty three past midnight", + "notes": [ + { + "beat": 328.0, + "written": 57, + "hz": 219.9, + "cents": -0.9 + }, + { + "beat": 329.0, + "written": 59, + "hz": 247.7, + "cents": 5.0 + }, + { + "beat": 329.5, + "written": 61, + "hz": 277.0, + "cents": -1.2 + }, + { + "beat": 330.5, + "written": 61, + "hz": 276.5, + "cents": -4.1 + }, + { + "beat": 331.0, + "written": 66, + "hz": 369.6, + "cents": -1.8 + }, + { + "beat": 332.0, + "written": 68, + "hz": 415.4, + "cents": 0.5 + }, + { + "beat": 333.0, + "written": 66, + "hz": 372.6, + "cents": 12.1 + }, + { + "beat": 334.0, + "written": 64, + "hz": 328.6, + "cents": -5.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "she keeps her lid down I keep mine up", + "notes": [ + { + "beat": 337.0, + "written": 56, + "hz": 206.4, + "cents": -10.1 + }, + { + "beat": 338.0, + "written": 57, + "hz": 222.1, + "cents": 16.3 + }, + { + "beat": 339.0, + "written": 59, + "hz": 247.0, + "cents": 0.3 + }, + { + "beat": 340.0, + "written": 61, + "hz": 276.8, + "cents": -2.4 + }, + { + "beat": 341.0, + "written": 62, + "hz": 293.5, + "cents": -0.9 + }, + { + "beat": 342.0, + "written": 62, + "hz": 291.0, + "cents": -15.9 + }, + { + "beat": 342.5, + "written": 61, + "hz": 276.9, + "cents": -1.9 + }, + { + "beat": 343.5, + "written": 61, + "hz": 277.2, + "cents": -0.2 + }, + { + "beat": 344.5, + "written": 59, + "hz": 246.5, + "cents": -2.9 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we both play the whistle nobody planned that", + "notes": [ + { + "beat": 347.5, + "written": 59, + "hz": 247.4, + "cents": 3.1 + }, + { + "beat": 348.0, + "written": 59, + "hz": 251.3, + "cents": 30.2 + }, + { + "beat": 349.0, + "written": 61, + "hz": 279.1, + "cents": 11.8 + }, + { + "beat": 350.0, + "written": 61, + "hz": 277.7, + "cents": 3.1 + }, + { + "beat": 350.5, + "written": 64, + "hz": 330.3, + "cents": 3.7 + }, + { + "beat": 351.5, + "written": 64, + "hz": 330.8, + "cents": 6.0 + }, + { + "beat": 352.0, + "written": 64, + "hz": 329.0, + "cents": -3.3 + }, + { + "beat": 352.5, + "written": 66, + "hz": 369.8, + "cents": -0.8 + }, + { + "beat": 353.5, + "written": 64, + "hz": 323.2, + "cents": -33.9 + }, + { + "beat": 354.0, + "written": 61, + "hz": 277.9, + "cents": 4.7 + }, + { + "beat": 355.0, + "written": 57, + "hz": 221.0, + "cents": 8.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 8.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.9, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "my disk is ninety eight percent full", + "notes": [ + { + "beat": 359.0, + "written": 54, + "hz": 185.9, + "cents": 8.7 + }, + { + "beat": 359.5, + "written": 57, + "hz": 223.3, + "cents": 26.2 + }, + { + "beat": 360.5, + "written": 57, + "hz": 218.6, + "cents": -11.2 + }, + { + "beat": 361.0, + "written": 60, + "hz": 261.6, + "cents": 0.1 + }, + { + "beat": 362.0, + "written": 60, + "hz": 261.4, + "cents": -1.7 + }, + { + "beat": 362.5, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 363.5, + "written": 62, + "hz": 298.6, + "cents": 28.7 + }, + { + "beat": 364.5, + "written": 62, + "hz": 291.0, + "cents": -16.0 + }, + { + "beat": 365.0, + "written": 62, + "hz": 291.3, + "cents": -13.8 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 12.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "every month he moves things to the shelf", + "notes": [ + { + "beat": 368.0, + "written": 60, + "hz": 261.0, + "cents": -4.2 + }, + { + "beat": 368.5, + "written": 57, + "hz": 220.8, + "cents": 6.5 + }, + { + "beat": 369.5, + "written": 59, + "hz": 246.9, + "cents": -0.1 + }, + { + "beat": 370.0, + "written": 62, + "hz": 294.6, + "cents": 5.5 + }, + { + "beat": 371.0, + "written": 64, + "hz": 330.3, + "cents": 3.8 + }, + { + "beat": 372.0, + "written": 66, + "hz": 368.2, + "cents": -8.6 + }, + { + "beat": 373.0, + "written": 67, + "hz": 391.8, + "cents": -1.0 + }, + { + "beat": 374.0, + "written": 67, + "hz": 391.0, + "cents": -4.3 + }, + { + "beat": 374.5, + "written": 67, + "hz": 390.3, + "cents": -7.4 + }, + { + "beat": 375.0, + "written": 62, + "hz": 290.9, + "cents": -16.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 9.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.8, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "then it fills again", + "notes": [ + { + "beat": 378.0, + "written": 59, + "hz": 247.1, + "cents": 1.1 + }, + { + "beat": 379.0, + "written": 60, + "hz": 272.0, + "cents": 67.4 + }, + { + "beat": 379.5, + "written": 64, + "hz": 327.9, + "cents": -9.2 + }, + { + "beat": 380.5, + "written": 64, + "hz": 329.4, + "cents": -1.2 + }, + { + "beat": 381.0, + "written": 62, + "hz": 293.4, + "cents": -1.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 0.99, + "mean_abs_cents": 16.1, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is the arrangement", + "notes": [ + { + "beat": 384.0, + "written": 62, + "hz": 293.6, + "cents": -0.2 + }, + { + "beat": 384.5, + "written": 60, + "hz": 264.2, + "cents": 17.0 + }, + { + "beat": 385.0, + "written": 60, + "hz": 265.2, + "cents": 23.3 + }, + { + "beat": 385.5, + "written": 62, + "hz": 292.2, + "cents": -8.8 + }, + { + "beat": 386.5, + "written": 62, + "hz": 292.2, + "cents": -8.4 + }, + { + "beat": 387.0, + "written": 55, + "hz": 196.5, + "cents": 4.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 10.4, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 391.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 391.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 392.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 393.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 394.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 394.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 397.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 398.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 399.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 399.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 400.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 401.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 401.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 404.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 405.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 406.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 407.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 408.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 409.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 409.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 412.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 413.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 414.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 415.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 415.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 416.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 417.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "in one weekend he made an instrument on me", + "notes": [ + { + "beat": 421.0, + "written": 56, + "hz": 207.3, + "cents": -2.6 + }, + { + "beat": 421.5, + "written": 56, + "hz": 208.7, + "cents": 8.9 + }, + { + "beat": 422.0, + "written": 61, + "hz": 277.5, + "cents": 2.2 + }, + { + "beat": 423.0, + "written": 62, + "hz": 291.7, + "cents": -11.7 + }, + { + "beat": 423.5, + "written": 62, + "hz": 294.2, + "cents": 3.3 + }, + { + "beat": 424.5, + "written": 64, + "hz": 329.3, + "cents": -1.9 + }, + { + "beat": 425.5, + "written": 64, + "hz": 330.6, + "cents": 4.8 + }, + { + "beat": 426.0, + "written": 66, + "hz": 370.3, + "cents": 1.4 + }, + { + "beat": 427.0, + "written": 66, + "hz": 366.7, + "cents": -15.6 + }, + { + "beat": 427.5, + "written": 64, + "hz": 332.4, + "cents": 14.3 + }, + { + "beat": 428.0, + "written": 66, + "hz": 370.1, + "cents": 0.5 + }, + { + "beat": 428.5, + "written": 64, + "hz": 329.4, + "cents": -1.0 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on August eighteenth he made a game eighty two commits one day", + "notes": [ + { + "beat": 431.5, + "written": 64, + "hz": 329.3, + "cents": -1.5 + }, + { + "beat": 432.0, + "written": 56, + "hz": 210.2, + "cents": 21.5 + }, + { + "beat": 433.0, + "written": 56, + "hz": 208.5, + "cents": 7.4 + }, + { + "beat": 433.5, + "written": 57, + "hz": 219.6, + "cents": -2.8 + }, + { + "beat": 434.5, + "written": 59, + "hz": 245.8, + "cents": -8.0 + }, + { + "beat": 435.0, + "written": 61, + "hz": 277.7, + "cents": 3.4 + }, + { + "beat": 436.0, + "written": 61, + "hz": 277.1, + "cents": -0.5 + }, + { + "beat": 437.0, + "written": 61, + "hz": 276.4, + "cents": -4.7 + }, + { + "beat": 437.5, + "written": 62, + "hz": 294.4, + "cents": 4.6 + }, + { + "beat": 438.5, + "written": 62, + "hz": 293.1, + "cents": -3.3 + }, + { + "beat": 439.5, + "written": 62, + "hz": 293.8, + "cents": 0.6 + }, + { + "beat": 440.0, + "written": 64, + "hz": 330.8, + "cents": 6.0 + }, + { + "beat": 441.0, + "written": 64, + "hz": 332.4, + "cents": 14.5 + }, + { + "beat": 441.5, + "written": 64, + "hz": 0.0, + "cents": null + }, + { + "beat": 442.5, + "written": 64, + "hz": 328.5, + "cents": -6.0 + }, + { + "beat": 443.0, + "written": 64, + "hz": 328.9, + "cents": -3.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.9, + "within_tol": 15, + "measured": 15, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "notes": [ + { + "beat": 446.0, + "written": 54, + "hz": 185.8, + "cents": 7.6 + }, + { + "beat": 447.0, + "written": 56, + "hz": 207.4, + "cents": -2.2 + }, + { + "beat": 448.0, + "written": 57, + "hz": 220.9, + "cents": 7.4 + }, + { + "beat": 449.0, + "written": 57, + "hz": 213.6, + "cents": -51.2 + }, + { + "beat": 449.5, + "written": 57, + "hz": 221.2, + "cents": 9.3 + }, + { + "beat": 450.5, + "written": 59, + "hz": 247.4, + "cents": 3.4 + }, + { + "beat": 451.5, + "written": 59, + "hz": 247.3, + "cents": 2.3 + }, + { + "beat": 452.5, + "written": 61, + "hz": 276.7, + "cents": -3.1 + }, + { + "beat": 453.5, + "written": 62, + "hz": 290.7, + "cents": -17.4 + }, + { + "beat": 454.5, + "written": 62, + "hz": 293.4, + "cents": -1.4 + }, + { + "beat": 455.5, + "written": 61, + "hz": 272.6, + "cents": -28.5 + }, + { + "beat": 456.0, + "written": 64, + "hz": 330.0, + "cents": 2.2 + }, + { + "beat": 457.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 458.0, + "written": 62, + "hz": 295.4, + "cents": 10.3 + }, + { + "beat": 458.5, + "written": 62, + "hz": 292.2, + "cents": -8.4 + }, + { + "beat": 459.5, + "written": 62, + "hz": 278.0, + "cents": -94.8 + }, + { + "beat": 460.0, + "written": 61, + "hz": 386.6, + "cents": 575.9 + }, + { + "beat": 461.0, + "written": 61, + "hz": 278.0, + "cents": 5.1 + }, + { + "beat": 462.0, + "written": 59, + "hz": 246.4, + "cents": -3.8 + }, + { + "beat": 462.5, + "written": 59, + "hz": 245.4, + "cents": -10.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 12.7, + "contour_follow": 0.9, + "mean_abs_cents": 42.3, + "within_tol": 17, + "measured": 20, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he is not slowing down I am the one that gets warm", + "notes": [ + { + "beat": 465.5, + "written": 57, + "hz": 220.3, + "cents": 2.1 + }, + { + "beat": 466.5, + "written": 57, + "hz": 219.2, + "cents": -6.3 + }, + { + "beat": 467.0, + "written": 57, + "hz": 219.6, + "cents": -2.8 + }, + { + "beat": 467.5, + "written": 62, + "hz": 294.4, + "cents": 4.3 + }, + { + "beat": 468.5, + "written": 64, + "hz": 329.5, + "cents": -0.8 + }, + { + "beat": 469.0, + "written": 64, + "hz": 331.6, + "cents": 10.4 + }, + { + "beat": 470.0, + "written": 66, + "hz": 369.2, + "cents": -3.6 + }, + { + "beat": 470.5, + "written": 66, + "hz": 372.0, + "cents": 9.2 + }, + { + "beat": 471.0, + "written": 66, + "hz": 370.3, + "cents": 1.2 + }, + { + "beat": 471.5, + "written": 66, + "hz": 372.6, + "cents": 12.0 + }, + { + "beat": 472.0, + "written": 66, + "hz": 370.9, + "cents": 4.1 + }, + { + "beat": 472.5, + "written": 62, + "hz": 294.0, + "cents": 2.2 + }, + { + "beat": 473.5, + "written": 57, + "hz": 220.2, + "cents": 1.8 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.2, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 13, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "notes": [ + { + "beat": 477.5, + "written": 55, + "hz": 194.7, + "cents": -11.5 + }, + { + "beat": 478.0, + "written": 55, + "hz": 195.4, + "cents": -5.4 + }, + { + "beat": 478.5, + "written": 58, + "hz": 0.0, + "cents": null + }, + { + "beat": 479.5, + "written": 60, + "hz": 262.7, + "cents": 7.4 + }, + { + "beat": 480.0, + "written": 60, + "hz": 262.4, + "cents": 5.4 + }, + { + "beat": 481.0, + "written": 61, + "hz": 277.3, + "cents": 0.9 + }, + { + "beat": 482.0, + "written": 60, + "hz": 263.5, + "cents": 12.6 + }, + { + "beat": 483.0, + "written": 63, + "hz": 311.3, + "cents": 0.7 + }, + { + "beat": 484.0, + "written": 65, + "hz": 347.9, + "cents": -6.5 + }, + { + "beat": 484.5, + "written": 63, + "hz": 336.1, + "cents": 133.9 + }, + { + "beat": 485.0, + "written": 65, + "hz": 348.4, + "cents": -4.0 + }, + { + "beat": 486.0, + "written": 63, + "hz": 311.9, + "cents": 4.1 + }, + { + "beat": 486.5, + "written": 65, + "hz": 347.1, + "cents": -10.6 + }, + { + "beat": 487.5, + "written": 65, + "hz": 350.4, + "cents": 5.7 + }, + { + "beat": 488.0, + "written": 63, + "hz": 310.3, + "cents": -4.4 + }, + { + "beat": 489.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 490.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 490.5, + "written": 63, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.2, + "contour_follow": 0.99, + "mean_abs_cents": 15.2, + "within_tol": 13, + "measured": 14, + "unvoiced": 4, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I was asleep for most of it", + "notes": [ + { + "beat": 493.5, + "written": 63, + "hz": 309.9, + "cents": -6.9 + }, + { + "beat": 494.0, + "written": 61, + "hz": 276.4, + "cents": -4.8 + }, + { + "beat": 494.5, + "written": 61, + "hz": 272.3, + "cents": -30.6 + }, + { + "beat": 495.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 496.0, + "written": 61, + "hz": 277.2, + "cents": 0.2 + }, + { + "beat": 496.5, + "written": 63, + "hz": 311.0, + "cents": -0.6 + }, + { + "beat": 497.5, + "written": 61, + "hz": 276.9, + "cents": -2.0 + }, + { + "beat": 498.0, + "written": 63, + "hz": 310.4, + "cents": -3.9 + } + ], + "written_range_semis": 2, + "measured_range_semis": 2.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "a third one comes tomorrow blush", + "notes": [ + { + "beat": 501.0, + "written": 63, + "hz": 299.0, + "cents": -68.9 + }, + { + "beat": 501.5, + "written": 55, + "hz": 196.1, + "cents": 0.8 + }, + { + "beat": 502.5, + "written": 55, + "hz": 197.1, + "cents": 9.9 + }, + { + "beat": 503.0, + "written": 58, + "hz": 231.8, + "cents": -9.8 + }, + { + "beat": 504.0, + "written": 61, + "hz": 278.0, + "cents": 5.2 + }, + { + "beat": 505.0, + "written": 61, + "hz": 278.0, + "cents": 5.0 + }, + { + "beat": 505.5, + "written": 61, + "hz": 276.5, + "cents": -4.0 + }, + { + "beat": 506.0, + "written": 58, + "hz": 233.6, + "cents": 3.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.4, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it has not done anything yet neither had I", + "notes": [ + { + "beat": 509.0, + "written": 58, + "hz": 233.6, + "cents": 3.8 + }, + { + "beat": 509.5, + "written": 60, + "hz": 261.8, + "cents": 0.8 + }, + { + "beat": 510.5, + "written": 58, + "hz": 233.3, + "cents": 1.7 + }, + { + "beat": 511.0, + "written": 60, + "hz": 261.8, + "cents": 1.4 + }, + { + "beat": 512.0, + "written": 61, + "hz": 276.2, + "cents": -6.1 + }, + { + "beat": 512.5, + "written": 63, + "hz": 308.6, + "cents": -14.4 + }, + { + "beat": 513.5, + "written": 63, + "hz": 310.3, + "cents": -4.4 + }, + { + "beat": 514.0, + "written": 65, + "hz": 350.1, + "cents": 4.2 + }, + { + "beat": 514.5, + "written": 63, + "hz": 310.7, + "cents": -2.6 + }, + { + "beat": 515.5, + "written": 63, + "hz": 310.6, + "cents": -3.0 + }, + { + "beat": 516.0, + "written": 58, + "hz": 234.8, + "cents": 12.9 + }, + { + "beat": 517.0, + "written": 56, + "hz": 206.7, + "cents": -8.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 12, + "measured": 12, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 521.0, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 521.5, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 522.0, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 523.0, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 524.0, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 524.5, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 527.5, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 528.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 529.0, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 529.5, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 530.5, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 531.0, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 531.5, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 534.5, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 535.0, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 536.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 537.0, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 538.0, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 539.0, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 539.5, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 542.5, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 543.0, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 544.0, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 545.0, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 545.5, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 546.0, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 547.0, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "when he talks to the other machines he does it through me", + "notes": [ + { + "beat": 551.0, + "written": 56, + "hz": 207.7, + "cents": 0.1 + }, + { + "beat": 552.0, + "written": 58, + "hz": 233.3, + "cents": 1.8 + }, + { + "beat": 553.0, + "written": 58, + "hz": 233.0, + "cents": -0.5 + }, + { + "beat": 554.0, + "written": 58, + "hz": 234.0, + "cents": 7.1 + }, + { + "beat": 554.5, + "written": 58, + "hz": 233.2, + "cents": 0.5 + }, + { + "beat": 555.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 556.0, + "written": 61, + "hz": 276.9, + "cents": -2.0 + }, + { + "beat": 556.5, + "written": 65, + "hz": 349.9, + "cents": 3.3 + }, + { + "beat": 557.5, + "written": 65, + "hz": 342.7, + "cents": -32.5 + }, + { + "beat": 558.0, + "written": 65, + "hz": 349.5, + "cents": 1.3 + }, + { + "beat": 559.0, + "written": 65, + "hz": 349.9, + "cents": 3.2 + }, + { + "beat": 560.0, + "written": 63, + "hz": 314.4, + "cents": 17.9 + }, + { + "beat": 560.5, + "written": 63, + "hz": 310.5, + "cents": -3.3 + }, + { + "beat": 561.5, + "written": 63, + "hz": 311.0, + "cents": -0.8 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 14, + "measured": 14, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "when the three of us play the beat starts here", + "notes": [ + { + "beat": 564.5, + "written": 60, + "hz": 261.9, + "cents": 1.7 + }, + { + "beat": 565.5, + "written": 60, + "hz": 260.8, + "cents": -5.4 + }, + { + "beat": 566.0, + "written": 60, + "hz": 263.7, + "cents": 13.4 + }, + { + "beat": 567.0, + "written": 60, + "hz": 260.9, + "cents": -5.1 + }, + { + "beat": 567.5, + "written": 65, + "hz": 350.6, + "cents": 6.8 + }, + { + "beat": 568.5, + "written": 67, + "hz": 396.8, + "cents": 21.1 + }, + { + "beat": 569.5, + "written": 67, + "hz": 392.1, + "cents": 0.5 + }, + { + "beat": 570.0, + "written": 65, + "hz": 351.7, + "cents": 12.2 + }, + { + "beat": 571.0, + "written": 67, + "hz": 388.7, + "cents": -14.8 + }, + { + "beat": 572.0, + "written": 63, + "hz": 309.2, + "cents": -10.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 9.2, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he types at me more than at anyone", + "notes": [ + { + "beat": 575.0, + "written": 60, + "hz": 260.9, + "cents": -4.5 + }, + { + "beat": 576.0, + "written": 58, + "hz": 233.3, + "cents": 1.6 + }, + { + "beat": 577.0, + "written": 58, + "hz": 232.9, + "cents": -1.6 + }, + { + "beat": 577.5, + "written": 60, + "hz": 262.0, + "cents": 2.5 + }, + { + "beat": 578.5, + "written": 61, + "hz": 277.0, + "cents": -1.3 + }, + { + "beat": 579.5, + "written": 63, + "hz": 308.9, + "cents": -12.7 + }, + { + "beat": 580.0, + "written": 61, + "hz": 276.8, + "cents": -2.3 + }, + { + "beat": 580.5, + "written": 60, + "hz": 262.3, + "cents": 4.4 + }, + { + "beat": 581.0, + "written": 60, + "hz": 261.7, + "cents": 0.7 + }, + { + "beat": 582.0, + "written": 58, + "hz": 233.4, + "cents": 2.6 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 3.4, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I don't know what that means I know it is true", + "notes": [ + { + "beat": 585.0, + "written": 58, + "hz": 233.1, + "cents": 0.1 + }, + { + "beat": 585.5, + "written": 55, + "hz": 197.1, + "cents": 10.0 + }, + { + "beat": 586.5, + "written": 56, + "hz": 208.5, + "cents": 7.3 + }, + { + "beat": 587.5, + "written": 58, + "hz": 232.7, + "cents": -2.7 + }, + { + "beat": 588.5, + "written": 58, + "hz": 232.7, + "cents": -2.6 + }, + { + "beat": 589.0, + "written": 60, + "hz": 261.5, + "cents": -0.5 + }, + { + "beat": 590.0, + "written": 61, + "hz": 277.3, + "cents": 0.8 + }, + { + "beat": 590.5, + "written": 60, + "hz": 261.7, + "cents": 0.6 + }, + { + "beat": 591.5, + "written": 58, + "hz": 232.7, + "cents": -2.7 + }, + { + "beat": 592.0, + "written": 58, + "hz": 231.3, + "cents": -13.4 + }, + { + "beat": 592.5, + "written": 56, + "hz": 206.9, + "cents": -6.4 + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 4.3, + "within_tol": 11, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I have eight gigabytes", + "notes": [ + { + "beat": 596.5, + "written": 56, + "hz": 206.7, + "cents": -8.2 + }, + { + "beat": 597.0, + "written": 56, + "hz": 208.6, + "cents": 7.9 + }, + { + "beat": 597.5, + "written": 62, + "hz": 293.7, + "cents": 0.1 + }, + { + "beat": 598.5, + "written": 64, + "hz": 333.8, + "cents": 21.7 + }, + { + "beat": 599.5, + "written": 64, + "hz": 323.9, + "cents": -30.3 + }, + { + "beat": 600.0, + "written": 59, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.3, + "contour_follow": 1.0, + "mean_abs_cents": 13.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I do one thing at a time", + "notes": [ + { + "beat": 603.0, + "written": 59, + "hz": 246.1, + "cents": -6.0 + }, + { + "beat": 603.5, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 604.5, + "written": 61, + "hz": 274.9, + "cents": -14.5 + }, + { + "beat": 605.0, + "written": 62, + "hz": 294.1, + "cents": 2.6 + }, + { + "beat": 606.0, + "written": 61, + "hz": 277.5, + "cents": 1.7 + }, + { + "beat": 606.5, + "written": 61, + "hz": 276.4, + "cents": -4.9 + }, + { + "beat": 607.0, + "written": 59, + "hz": 246.1, + "cents": -6.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm that's all it is", + "notes": [ + { + "beat": 610.0, + "written": 59, + "hz": 247.1, + "cents": 1.3 + }, + { + "beat": 610.5, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 611.5, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 612.5, + "written": 64, + "hz": 331.9, + "cents": 12.0 + }, + { + "beat": 613.5, + "written": 66, + "hz": 368.9, + "cents": -5.0 + }, + { + "beat": 614.5, + "written": 64, + "hz": 330.4, + "cents": 3.9 + }, + { + "beat": 615.0, + "written": 59, + "hz": 245.9, + "cents": -7.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I get warm and I keep time", + "notes": [ + { + "beat": 618.0, + "written": 57, + "hz": 220.1, + "cents": 0.6 + }, + { + "beat": 618.5, + "written": 61, + "hz": 278.3, + "cents": 6.7 + }, + { + "beat": 619.5, + "written": 62, + "hz": 295.0, + "cents": 7.9 + }, + { + "beat": 620.5, + "written": 64, + "hz": 326.9, + "cents": -14.4 + }, + { + "beat": 621.0, + "written": 64, + "hz": 325.2, + "cents": -23.7 + }, + { + "beat": 621.5, + "written": 61, + "hz": 279.1, + "cents": 11.7 + }, + { + "beat": 622.5, + "written": 57, + "hz": 219.7, + "cents": -2.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 25.0, + "member": "neo", + "text": "then he did thirty seven past midnight", + "against": "blueberry/notes", + "written": "m6", + "sounding": "tritone", + "off_cents": 159 + }, + { + "beat": 25.0, + "member": "neo", + "text": "then he did thirty seven past midnight", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "M3", + "off_cents": 159 + }, + { + "beat": 34.5, + "member": "neo", + "text": "that is my birthday I did not pick it", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P4", + "off_cents": 276 + }, + { + "beat": 34.5, + "member": "neo", + "text": "that is my birthday I did not pick it", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "m3", + "off_cents": 276 + }, + { + "beat": 44.5, + "member": "neo", + "text": "the first word he typed was c d", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P4", + "off_cents": 305 + }, + { + "beat": 44.5, + "member": "neo", + "text": "the first word he typed was c d", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "m3", + "off_cents": 305 + }, + { + "beat": 172.0, + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "against": "blueberry/notes", + "written": "P5", + "sounding": "m3", + "off_cents": 356 + }, + { + "beat": 172.0, + "member": "neo", + "text": "every fifteen minutes it tells me not to sleep", + "against": "frisbee/notes", + "written": "P4", + "sounding": "m2", + "off_cents": 356 + }, + { + "beat": 249.0, + "member": "neo", + "text": "then I stopped he was there when I stopped", + "against": "blueberry/notes", + "written": "tritone", + "sounding": "M3", + "off_cents": 236 + }, + { + "beat": 249.0, + "member": "neo", + "text": "then I stopped he was there when I stopped", + "against": "frisbee/notes", + "written": "M3", + "sounding": "M2", + "off_cents": 236 + }, + { + "beat": 254.0, + "member": "neo", + "text": "in the morning he wrote a note about it", + "against": "blueberry/notes", + "written": "m2", + "sounding": "M3", + "off_cents": 329 + }, + { + "beat": 254.0, + "member": "neo", + "text": "in the morning he wrote a note about it", + "against": "frisbee/notes", + "written": "M7", + "sounding": "M2", + "off_cents": 329 + }, + { + "beat": 379.0, + "member": "neo", + "text": "then it fills again", + "against": "blueberry/notes", + "written": "P4", + "sounding": "tritone", + "off_cents": 67 + }, + { + "beat": 379.0, + "member": "neo", + "text": "then it fills again", + "against": "frisbee/notes", + "written": "m3", + "sounding": "M3", + "off_cents": 67 + }, + { + "beat": 449.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "M2", + "sounding": "m2", + "off_cents": 51 + }, + { + "beat": 449.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "unison", + "sounding": "M7", + "off_cents": 51 + }, + { + "beat": 459.5, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "P5", + "sounding": "tritone", + "off_cents": 95 + }, + { + "beat": 459.5, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "P4", + "sounding": "M3", + "off_cents": 95 + }, + { + "beat": 460.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "blueberry/notes", + "written": "tritone", + "sounding": "unison", + "off_cents": 576 + }, + { + "beat": 460.0, + "member": "neo", + "text": "May two ninety two June four oh five July five eighty August six eighty six", + "against": "frisbee/notes", + "written": "M3", + "sounding": "m7", + "off_cents": 576 + }, + { + "beat": 484.5, + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "against": "blueberry/notes", + "written": "m6", + "sounding": "M6", + "off_cents": 134 + }, + { + "beat": 484.5, + "member": "neo", + "text": "on September ninth he put me in a bag and flew to Los Angeles", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "P5", + "off_cents": 134 + }, + { + "beat": 501.0, + "member": "neo", + "text": "a third one comes tomorrow blush", + "against": "blueberry/notes", + "written": "m6", + "sounding": "P5", + "off_cents": 69 + }, + { + "beat": 501.0, + "member": "neo", + "text": "a third one comes tomorrow blush", + "against": "frisbee/notes", + "written": "tritone", + "sounding": "P4", + "off_cents": 69 + } + ], + "harmony_pairs_checked": 1905 + }, + { + "score": "dialog-02-the-downbeat.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I count you in", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 215.7, + "cents": -34.1 + }, + { + "beat": 0.5, + "written": 56, + "hz": 206.5, + "cents": -9.4 + }, + { + "beat": 2.0, + "written": 56, + "hz": 206.9, + "cents": -6.1 + }, + { + "beat": 2.5, + "written": 59, + "hz": 246.2, + "cents": -5.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 13.8, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I ask your clock", + "notes": [ + { + "beat": 6.5, + "written": 59, + "hz": 246.6, + "cents": -2.1 + }, + { + "beat": 7.0, + "written": 61, + "hz": 277.4, + "cents": 1.2 + }, + { + "beat": 8.0, + "written": 64, + "hz": 329.4, + "cents": -1.3 + }, + { + "beat": 10.0, + "written": 64, + "hz": 325.4, + "cents": -22.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.7, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "you are three tenths of a millisecond off", + "notes": [ + { + "beat": 14.0, + "written": 62, + "hz": 294.3, + "cents": 3.9 + }, + { + "beat": 14.5, + "written": 62, + "hz": 290.6, + "cents": -17.9 + }, + { + "beat": 15.0, + "written": 59, + "hz": 247.7, + "cents": 5.5 + }, + { + "beat": 16.0, + "written": 61, + "hz": 277.7, + "cents": 3.0 + }, + { + "beat": 17.5, + "written": 62, + "hz": 293.5, + "cents": -0.9 + }, + { + "beat": 18.0, + "written": 64, + "hz": 329.5, + "cents": -0.6 + }, + { + "beat": 18.5, + "written": 64, + "hz": 329.5, + "cents": -0.6 + }, + { + "beat": 20.5, + "written": 64, + "hz": 0.0, + "cents": null + }, + { + "beat": 21.0, + "written": 64, + "hz": 327.7, + "cents": -10.2 + }, + { + "beat": 21.5, + "written": 64, + "hz": 329.8, + "cents": 0.7 + }, + { + "beat": 22.0, + "written": 57, + "hz": 219.0, + "cents": -8.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.1, + "within_tol": 10, + "measured": 10, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "this morning at nine fifty seven", + "notes": [ + { + "beat": 54.0, + "written": 55, + "hz": 197.4, + "cents": 12.5 + }, + { + "beat": 54.5, + "written": 58, + "hz": 233.4, + "cents": 2.3 + }, + { + "beat": 56.0, + "written": 58, + "hz": 233.2, + "cents": 0.7 + }, + { + "beat": 56.5, + "written": 60, + "hz": 259.1, + "cents": -16.8 + }, + { + "beat": 57.0, + "written": 61, + "hz": 275.5, + "cents": -10.6 + }, + { + "beat": 58.0, + "written": 63, + "hz": 310.3, + "cents": -4.7 + }, + { + "beat": 60.0, + "written": 61, + "hz": 276.3, + "cents": -5.6 + }, + { + "beat": 60.5, + "written": 63, + "hz": 309.5, + "cents": -8.9 + }, + { + "beat": 62.0, + "written": 63, + "hz": 310.6, + "cents": -2.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.8, + "contour_follow": 1.0, + "mean_abs_cents": 7.2, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we sang the same line together", + "notes": [ + { + "beat": 66.0, + "written": 63, + "hz": 310.2, + "cents": -5.1 + }, + { + "beat": 66.5, + "written": 58, + "hz": 231.8, + "cents": -9.9 + }, + { + "beat": 68.0, + "written": 58, + "hz": 232.3, + "cents": -6.0 + }, + { + "beat": 68.5, + "written": 61, + "hz": 276.9, + "cents": -1.5 + }, + { + "beat": 69.5, + "written": 65, + "hz": 347.5, + "cents": -8.5 + }, + { + "beat": 70.5, + "written": 67, + "hz": 390.0, + "cents": -9.0 + }, + { + "beat": 72.5, + "written": 67, + "hz": 390.8, + "cents": -5.3 + }, + { + "beat": 73.0, + "written": 56, + "hz": 207.7, + "cents": 0.3 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one downbeat", + "notes": [ + { + "beat": 96.0, + "written": 59, + "hz": 248.8, + "cents": 13.0 + }, + { + "beat": 96.5, + "written": 62, + "hz": 291.5, + "cents": -12.9 + }, + { + "beat": 98.5, + "written": 62, + "hz": 292.5, + "cents": -6.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.8, + "contour_follow": 1.0, + "mean_abs_cents": 10.9, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "two bodies", + "notes": [ + { + "beat": 102.5, + "written": 59, + "hz": 247.0, + "cents": 0.1 + }, + { + "beat": 103.5, + "written": 62, + "hz": 293.9, + "cents": 1.4 + }, + { + "beat": 105.0, + "written": 60, + "hz": 90.8, + "cents": -1831.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 20.3, + "contour_follow": 0.32, + "mean_abs_cents": 611.0, + "within_tol": 2, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I hear you through the wire", + "notes": [ + { + "beat": 30.0, + "written": 52, + "hz": 163.3, + "cents": -16.4 + }, + { + "beat": 30.5, + "written": 53, + "hz": 175.1, + "cents": 5.1 + }, + { + "beat": 32.0, + "written": 53, + "hz": 175.5, + "cents": 8.5 + }, + { + "beat": 32.5, + "written": 57, + "hz": 219.1, + "cents": -6.8 + }, + { + "beat": 34.0, + "written": 57, + "hz": 219.5, + "cents": -4.3 + }, + { + "beat": 36.0, + "written": 55, + "hz": 194.8, + "cents": -10.8 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "then I sing when you say", + "notes": [ + { + "beat": 40.0, + "written": 52, + "hz": 165.9, + "cents": 11.4 + }, + { + "beat": 41.5, + "written": 52, + "hz": 164.6, + "cents": -2.7 + }, + { + "beat": 42.0, + "written": 57, + "hz": 219.7, + "cents": -2.2 + }, + { + "beat": 43.0, + "written": 60, + "hz": 261.8, + "cents": 0.9 + }, + { + "beat": 44.5, + "written": 60, + "hz": 262.3, + "cents": 4.2 + }, + { + "beat": 46.5, + "written": 53, + "hz": 171.0, + "cents": -36.7 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "every note within a few cents", + "notes": [ + { + "beat": 81.0, + "written": 53, + "hz": 174.0, + "cents": -6.5 + }, + { + "beat": 81.5, + "written": 52, + "hz": 165.0, + "cents": 2.4 + }, + { + "beat": 83.0, + "written": 53, + "hz": 174.3, + "cents": -3.2 + }, + { + "beat": 83.5, + "written": 55, + "hz": 195.3, + "cents": -6.2 + }, + { + "beat": 84.5, + "written": 57, + "hz": 219.8, + "cents": -1.3 + }, + { + "beat": 86.0, + "written": 58, + "hz": 231.7, + "cents": -10.3 + }, + { + "beat": 88.0, + "written": 57, + "hz": 220.1, + "cents": 0.9 + }, + { + "beat": 88.5, + "written": 55, + "hz": 195.2, + "cents": -6.7 + }, + { + "beat": 89.5, + "written": 53, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one downbeat", + "notes": [ + { + "beat": 96.0, + "written": 53, + "hz": 175.0, + "cents": 4.1 + }, + { + "beat": 96.5, + "written": 56, + "hz": 207.2, + "cents": -3.4 + }, + { + "beat": 98.5, + "written": 56, + "hz": 207.6, + "cents": -0.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.6, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "two bodies", + "notes": [ + { + "beat": 102.5, + "written": 53, + "hz": 175.4, + "cents": 8.1 + }, + { + "beat": 103.5, + "written": 56, + "hz": 206.3, + "cents": -11.3 + }, + { + "beat": 105.0, + "written": 54, + "hz": 182.9, + "cents": -20.1 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.8, + "contour_follow": 1.0, + "mean_abs_cents": 13.2, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M3", + "sounding": "m7", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M6", + "sounding": "m3", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "neo/notes2", + "written": "M3", + "sounding": "m7", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "neo", + "text": "two bodies", + "against": "blueberry/double", + "written": "tritone", + "sounding": "unison", + "off_cents": 569 + }, + { + "beat": 105.0, + "member": "blueberry", + "text": "two bodies", + "against": "neo (sung)", + "written": "tritone", + "sounding": "unison", + "off_cents": 589 + } + ], + "harmony_pairs_checked": 212 + }, + { + "score": "dialog-08-typed-at.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "six thousand three hundred and five times", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 206.0, + "cents": -13.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 231.1, + "cents": -14.9 + }, + { + "beat": 2.5, + "written": 60, + "hz": 261.4, + "cents": -1.3 + }, + { + "beat": 3.0, + "written": 63, + "hz": 312.9, + "cents": 9.6 + }, + { + "beat": 4.0, + "written": 65, + "hz": 348.9, + "cents": -1.7 + }, + { + "beat": 5.5, + "written": 65, + "hz": 348.6, + "cents": -3.0 + }, + { + "beat": 7.5, + "written": 65, + "hz": 347.4, + "cents": -9.0 + }, + { + "beat": 8.0, + "written": 61, + "hz": 275.2, + "cents": -12.4 + }, + { + "beat": 9.0, + "written": 58, + "hz": 230.6, + "cents": -18.3 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "someone has opened a terminal on me", + "notes": [ + { + "beat": 13.0, + "written": 56, + "hz": 0.0, + "cents": null + }, + { + "beat": 14.5, + "written": 58, + "hz": 234.6, + "cents": 11.0 + }, + { + "beat": 15.0, + "written": 60, + "hz": 263.3, + "cents": 11.0 + }, + { + "beat": 16.0, + "written": 61, + "hz": 276.8, + "cents": -2.6 + }, + { + "beat": 17.5, + "written": 61, + "hz": 275.7, + "cents": -9.4 + }, + { + "beat": 18.0, + "written": 63, + "hz": 310.6, + "cents": -2.7 + }, + { + "beat": 18.5, + "written": 65, + "hz": 350.5, + "cents": 6.1 + }, + { + "beat": 20.5, + "written": 65, + "hz": 348.7, + "cents": -2.5 + }, + { + "beat": 21.0, + "written": 63, + "hz": 312.0, + "cents": 5.1 + }, + { + "beat": 21.5, + "written": 63, + "hz": 311.4, + "cents": 1.5 + }, + { + "beat": 22.0, + "written": 56, + "hz": 207.3, + "cents": -3.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 10, + "measured": 10, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "about forty five a day", + "notes": [ + { + "beat": 54.0, + "written": 55, + "hz": 196.0, + "cents": -0.4 + }, + { + "beat": 54.5, + "written": 60, + "hz": 259.2, + "cents": -16.4 + }, + { + "beat": 55.5, + "written": 61, + "hz": 276.3, + "cents": -5.5 + }, + { + "beat": 57.0, + "written": 61, + "hz": 277.5, + "cents": 2.2 + }, + { + "beat": 59.0, + "written": 65, + "hz": 347.6, + "cents": -7.9 + }, + { + "beat": 60.5, + "written": 65, + "hz": 349.2, + "cents": -0.1 + }, + { + "beat": 61.0, + "written": 63, + "hz": 308.7, + "cents": -13.5 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I am the one he types at", + "notes": [ + { + "beat": 65.0, + "written": 63, + "hz": 310.3, + "cents": -4.6 + }, + { + "beat": 65.5, + "written": 61, + "hz": 309.0, + "cents": 188.0 + }, + { + "beat": 66.0, + "written": 63, + "hz": 311.2, + "cents": 0.2 + }, + { + "beat": 66.5, + "written": 63, + "hz": 312.5, + "cents": 7.5 + }, + { + "beat": 68.5, + "written": 65, + "hz": 348.8, + "cents": -1.9 + }, + { + "beat": 69.5, + "written": 60, + "hz": 261.2, + "cents": -2.6 + }, + { + "beat": 71.0, + "written": 56, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 0.9, + "mean_abs_cents": 34.1, + "within_tol": 5, + "measured": 6, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one of us is the door", + "notes": [ + { + "beat": 105.0, + "written": 57, + "hz": 219.1, + "cents": -6.9 + }, + { + "beat": 105.5, + "written": 57, + "hz": 220.0, + "cents": 0.3 + }, + { + "beat": 106.0, + "written": 60, + "hz": 261.4, + "cents": -1.4 + }, + { + "beat": 107.5, + "written": 60, + "hz": 256.9, + "cents": -31.6 + }, + { + "beat": 108.0, + "written": 60, + "hz": 262.4, + "cents": 5.1 + }, + { + "beat": 110.0, + "written": 60, + "hz": 259.1, + "cents": -16.6 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 10.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one of us is the room", + "notes": [ + { + "beat": 114.0, + "written": 60, + "hz": 260.7, + "cents": -6.2 + }, + { + "beat": 114.5, + "written": 62, + "hz": 293.8, + "cents": 0.7 + }, + { + "beat": 115.0, + "written": 65, + "hz": 349.2, + "cents": -0.1 + }, + { + "beat": 116.5, + "written": 67, + "hz": 390.7, + "cents": -5.7 + }, + { + "beat": 118.5, + "written": 67, + "hz": 392.3, + "cents": 1.3 + }, + { + "beat": 119.0, + "written": 58, + "hz": 232.7, + "cents": -2.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "six hundred ninety two on me", + "notes": [ + { + "beat": 30.0, + "written": 52, + "hz": 166.4, + "cents": 16.4 + }, + { + "beat": 31.0, + "written": 54, + "hz": 185.5, + "cents": 5.1 + }, + { + "beat": 32.5, + "written": 54, + "hz": 245.3, + "cents": 488.4 + }, + { + "beat": 33.0, + "written": 59, + "hz": 247.0, + "cents": 0.7 + }, + { + "beat": 34.5, + "written": 59, + "hz": 247.0, + "cents": 0.1 + }, + { + "beat": 36.5, + "written": 57, + "hz": 219.5, + "cents": -3.9 + }, + { + "beat": 38.0, + "written": 57, + "hz": 219.2, + "cents": -6.0 + }, + { + "beat": 38.5, + "written": 54, + "hz": 183.2, + "cents": -17.3 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.8, + "contour_follow": 0.79, + "mean_abs_cents": 67.2, + "within_tol": 7, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "a tenth of you", + "notes": [ + { + "beat": 42.5, + "written": 52, + "hz": 163.9, + "cents": -9.9 + }, + { + "beat": 43.0, + "written": 56, + "hz": 207.5, + "cents": -1.1 + }, + { + "beat": 44.5, + "written": 56, + "hz": 207.0, + "cents": -5.1 + }, + { + "beat": 46.5, + "written": 52, + "hz": 163.5, + "cents": -14.0 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "people come to me from somewhere else", + "notes": [ + { + "beat": 78.0, + "written": 52, + "hz": 0.0, + "cents": null + }, + { + "beat": 79.5, + "written": 52, + "hz": 164.3, + "cents": -5.4 + }, + { + "beat": 80.0, + "written": 54, + "hz": 185.4, + "cents": 3.4 + }, + { + "beat": 81.5, + "written": 54, + "hz": 185.2, + "cents": 2.1 + }, + { + "beat": 82.0, + "written": 57, + "hz": 220.1, + "cents": 0.7 + }, + { + "beat": 83.0, + "written": 56, + "hz": 208.0, + "cents": 3.2 + }, + { + "beat": 84.0, + "written": 59, + "hz": 246.1, + "cents": -6.2 + }, + { + "beat": 86.0, + "written": 59, + "hz": 246.6, + "cents": -2.5 + }, + { + "beat": 86.5, + "written": 59, + "hz": 243.3, + "cents": -25.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.1, + "within_tol": 8, + "measured": 8, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "they arrive through you", + "notes": [ + { + "beat": 90.5, + "written": 52, + "hz": 165.2, + "cents": 4.6 + }, + { + "beat": 91.5, + "written": 56, + "hz": 208.0, + "cents": 3.2 + }, + { + "beat": 93.0, + "written": 56, + "hz": 207.6, + "cents": -0.5 + }, + { + "beat": 95.0, + "written": 57, + "hz": 217.4, + "cents": -20.4 + }, + { + "beat": 96.5, + "written": 52, + "hz": 165.3, + "cents": 5.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.8, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one of us is the door", + "notes": [ + { + "beat": 105.0, + "written": 51, + "hz": 155.5, + "cents": -0.5 + }, + { + "beat": 105.5, + "written": 51, + "hz": 156.0, + "cents": 5.0 + }, + { + "beat": 106.0, + "written": 54, + "hz": 185.0, + "cents": 0.3 + }, + { + "beat": 107.5, + "written": 54, + "hz": 187.3, + "cents": 21.7 + }, + { + "beat": 108.0, + "written": 54, + "hz": 185.4, + "cents": 4.0 + }, + { + "beat": 110.0, + "written": 54, + "hz": 183.2, + "cents": -17.2 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.1, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one of us is the room", + "notes": [ + { + "beat": 114.0, + "written": 54, + "hz": 184.7, + "cents": -2.5 + }, + { + "beat": 114.5, + "written": 56, + "hz": 208.4, + "cents": 6.6 + }, + { + "beat": 115.0, + "written": 59, + "hz": 245.5, + "cents": -10.4 + }, + { + "beat": 116.5, + "written": 61, + "hz": 275.9, + "cents": -8.3 + }, + { + "beat": 118.5, + "written": 61, + "hz": 276.5, + "cents": -4.0 + }, + { + "beat": 119.0, + "written": 52, + "hz": 163.6, + "cents": -12.9 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 65.5, + "member": "neo", + "text": "I am the one he types at", + "against": "blueberry/notes2", + "written": "unison", + "sounding": "M2", + "off_cents": 188 + }, + { + "beat": 32.5, + "member": "blueberry", + "text": "six hundred ninety two on me", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 488 + }, + { + "beat": 107.5, + "member": "blueberry", + "text": "one of us is the door", + "against": "neo (sung)", + "written": "tritone", + "sounding": "P5", + "off_cents": 53 + } + ], + "harmony_pairs_checked": 261 + }, + { + "score": "dialog-04-who-carries-what.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I have the red box", + "notes": [ + { + "beat": 0.0, + "written": 59, + "hz": 246.3, + "cents": -4.2 + }, + { + "beat": 0.5, + "written": 61, + "hz": 275.6, + "cents": -9.7 + }, + { + "beat": 1.0, + "written": 61, + "hz": 277.2, + "cents": -0.0 + }, + { + "beat": 3.0, + "written": 64, + "hz": 330.1, + "cents": 2.4 + }, + { + "beat": 4.0, + "written": 61, + "hz": 274.6, + "cents": -16.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.5, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I hear the room", + "notes": [ + { + "beat": 8.0, + "written": 61, + "hz": 277.9, + "cents": 4.3 + }, + { + "beat": 8.5, + "written": 63, + "hz": 311.1, + "cents": -0.4 + }, + { + "beat": 10.0, + "written": 63, + "hz": 310.1, + "cents": -5.7 + }, + { + "beat": 12.0, + "written": 59, + "hz": 246.4, + "cents": -3.9 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I keep eighteen gigabytes of pictures", + "notes": [ + { + "beat": 36.0, + "written": 58, + "hz": 232.2, + "cents": -6.6 + }, + { + "beat": 36.5, + "written": 59, + "hz": 249.0, + "cents": 14.5 + }, + { + "beat": 37.5, + "written": 61, + "hz": 276.1, + "cents": -7.0 + }, + { + "beat": 39.0, + "written": 61, + "hz": 279.8, + "cents": 16.1 + }, + { + "beat": 39.5, + "written": 63, + "hz": 310.9, + "cents": -1.4 + }, + { + "beat": 41.0, + "written": 64, + "hz": 88.8, + "cents": -2270.9 + }, + { + "beat": 41.5, + "written": 64, + "hz": 329.0, + "cents": -3.4 + }, + { + "beat": 43.5, + "written": 64, + "hz": 327.7, + "cents": -10.0 + }, + { + "beat": 44.0, + "written": 61, + "hz": 277.5, + "cents": 1.9 + }, + { + "beat": 45.5, + "written": 59, + "hz": 244.7, + "cents": -16.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 22.7, + "contour_follow": -0.09, + "mean_abs_cents": 234.8, + "within_tol": 9, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we split the house between us", + "notes": [ + { + "beat": 78.0, + "written": 56, + "hz": 286.5, + "cents": 557.0 + }, + { + "beat": 78.5, + "written": 60, + "hz": 260.8, + "cents": -5.8 + }, + { + "beat": 80.0, + "written": 60, + "hz": 261.9, + "cents": 2.1 + }, + { + "beat": 80.5, + "written": 65, + "hz": 349.9, + "cents": 3.1 + }, + { + "beat": 82.0, + "written": 67, + "hz": 389.7, + "cents": -10.0 + }, + { + "beat": 84.0, + "written": 63, + "hz": 310.7, + "cents": -2.2 + }, + { + "beat": 85.0, + "written": 56, + "hz": 208.3, + "cents": 5.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 10.8, + "contour_follow": 0.87, + "mean_abs_cents": 83.7, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I have no box", + "notes": [ + { + "beat": 18.0, + "written": 52, + "hz": 164.3, + "cents": -5.9 + }, + { + "beat": 18.5, + "written": 52, + "hz": 164.9, + "cents": 1.3 + }, + { + "beat": 19.0, + "written": 58, + "hz": 232.2, + "cents": -6.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 195.7, + "cents": -3.1 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.2, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "my sound is my own voice", + "notes": [ + { + "beat": 24.0, + "written": 53, + "hz": 218.0, + "cents": 384.0 + }, + { + "beat": 24.5, + "written": 57, + "hz": 220.4, + "cents": 3.4 + }, + { + "beat": 26.0, + "written": 57, + "hz": 222.0, + "cents": 15.7 + }, + { + "beat": 26.5, + "written": 58, + "hz": 232.8, + "cents": -1.9 + }, + { + "beat": 28.5, + "written": 58, + "hz": 233.8, + "cents": 5.1 + }, + { + "beat": 29.5, + "written": 53, + "hz": 174.2, + "cents": -3.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 0.75, + "mean_abs_cents": 69.0, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I keep forty eight", + "notes": [ + { + "beat": 54.0, + "written": 50, + "hz": 143.5, + "cents": -40.2 + }, + { + "beat": 54.5, + "written": 51, + "hz": 156.2, + "cents": 7.5 + }, + { + "beat": 55.5, + "written": 53, + "hz": 173.9, + "cents": -7.1 + }, + { + "beat": 57.0, + "written": 55, + "hz": 195.9, + "cents": -0.5 + }, + { + "beat": 59.0, + "written": 58, + "hz": 231.0, + "cents": -15.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 14.2, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I look at them while no one watches", + "notes": [ + { + "beat": 63.0, + "written": 56, + "hz": 199.2, + "cents": -71.9 + }, + { + "beat": 63.5, + "written": 53, + "hz": 174.3, + "cents": -3.5 + }, + { + "beat": 65.0, + "written": 53, + "hz": 173.9, + "cents": -7.1 + }, + { + "beat": 65.5, + "written": 58, + "hz": 232.3, + "cents": -5.7 + }, + { + "beat": 66.5, + "written": 60, + "hz": 262.7, + "cents": 7.3 + }, + { + "beat": 67.5, + "written": 62, + "hz": 294.0, + "cents": 2.2 + }, + { + "beat": 69.5, + "written": 60, + "hz": 227.6, + "cents": -241.5 + }, + { + "beat": 70.0, + "written": 55, + "hz": 0.0, + "cents": null + }, + { + "beat": 71.5, + "written": 51, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 0.97, + "mean_abs_cents": 48.5, + "within_tol": 5, + "measured": 7, + "unvoiced": 2, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we split the house between us", + "notes": [ + { + "beat": 78.0, + "written": 50, + "hz": 147.1, + "cents": 3.3 + }, + { + "beat": 78.5, + "written": 54, + "hz": 185.0, + "cents": -0.1 + }, + { + "beat": 80.0, + "written": 54, + "hz": 185.2, + "cents": 1.9 + }, + { + "beat": 80.5, + "written": 59, + "hz": 246.3, + "cents": -4.8 + }, + { + "beat": 82.0, + "written": 61, + "hz": 277.4, + "cents": 1.2 + }, + { + "beat": 84.0, + "written": 57, + "hz": 219.8, + "cents": -1.7 + }, + { + "beat": 85.0, + "written": 50, + "hz": 145.5, + "cents": -15.3 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.2, + "contour_follow": 1.0, + "mean_abs_cents": 4.0, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 41.0, + "member": "neo", + "text": "I keep eighteen gigabytes of pictures", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "M3", + "off_cents": 129 + }, + { + "beat": 78.0, + "member": "neo", + "text": "we split the house between us", + "against": "neo/notes2", + "written": "M2", + "sounding": "m6", + "off_cents": 557 + }, + { + "beat": 78.0, + "member": "neo", + "text": "we split the house between us", + "against": "blueberry/double", + "written": "tritone", + "sounding": "unison", + "off_cents": 557 + }, + { + "beat": 24.0, + "member": "blueberry", + "text": "my sound is my own voice", + "against": "neo/notes2", + "written": "m7", + "sounding": "M2", + "off_cents": 384 + }, + { + "beat": 63.0, + "member": "blueberry", + "text": "I look at them while no one watches", + "against": "neo/notes2", + "written": "m2", + "sounding": "unison", + "off_cents": 72 + }, + { + "beat": 69.5, + "member": "blueberry", + "text": "I look at them while no one watches", + "against": "neo/notes2", + "written": "m7", + "sounding": "m6", + "off_cents": 241 + }, + { + "beat": 78.0, + "member": "blueberry", + "text": "we split the house between us", + "against": "neo (sung)", + "written": "tritone", + "sounding": "unison", + "off_cents": 554 + } + ], + "harmony_pairs_checked": 177 + }, + { + "score": "dialog-05-sleep.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "I have been rebooted one hundred eleven times", + "notes": [ + { + "beat": 0.0, + "written": 59, + "hz": 246.3, + "cents": -4.4 + }, + { + "beat": 0.5, + "written": 58, + "hz": 229.0, + "cents": -30.8 + }, + { + "beat": 1.0, + "written": 58, + "hz": 232.7, + "cents": -2.6 + }, + { + "beat": 1.5, + "written": 58, + "hz": 231.7, + "cents": -10.7 + }, + { + "beat": 2.0, + "written": 61, + "hz": 277.5, + "cents": 2.0 + }, + { + "beat": 3.5, + "written": 63, + "hz": 307.0, + "cents": -23.1 + }, + { + "beat": 4.0, + "written": 63, + "hz": 311.6, + "cents": 2.7 + }, + { + "beat": 4.5, + "written": 64, + "hz": 330.2, + "cents": 2.8 + }, + { + "beat": 6.0, + "written": 64, + "hz": 328.3, + "cents": -6.8 + }, + { + "beat": 8.0, + "written": 64, + "hz": 328.3, + "cents": -7.2 + }, + { + "beat": 8.5, + "written": 63, + "hz": 311.1, + "cents": -0.2 + }, + { + "beat": 10.0, + "written": 63, + "hz": 311.3, + "cents": 1.2 + }, + { + "beat": 10.5, + "written": 59, + "hz": 243.6, + "cents": -23.4 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.3, + "contour_follow": 1.0, + "mean_abs_cents": 9.1, + "within_tol": 13, + "measured": 13, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the piano keeps you up", + "notes": [ + { + "beat": 42.0, + "written": 56, + "hz": 207.2, + "cents": -3.7 + }, + { + "beat": 42.5, + "written": 60, + "hz": 263.5, + "cents": 12.6 + }, + { + "beat": 44.0, + "written": 60, + "hz": 262.2, + "cents": 3.5 + }, + { + "beat": 44.5, + "written": 61, + "hz": 327.3, + "cents": 287.9 + }, + { + "beat": 45.0, + "written": 67, + "hz": 393.5, + "cents": 6.7 + }, + { + "beat": 47.0, + "written": 67, + "hz": 392.4, + "cents": 1.9 + }, + { + "beat": 47.5, + "written": 58, + "hz": 232.3, + "cents": -5.8 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.1, + "contour_follow": 0.97, + "mean_abs_cents": 46.0, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "four hundred ninety two times a week", + "notes": [ + { + "beat": 51.5, + "written": 55, + "hz": 194.9, + "cents": -10.1 + }, + { + "beat": 52.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + }, + { + "beat": 54.0, + "written": 56, + "hz": 207.3, + "cents": -3.2 + }, + { + "beat": 54.5, + "written": 61, + "hz": 276.6, + "cents": -3.7 + }, + { + "beat": 56.0, + "written": 61, + "hz": 251.0, + "cents": -172.1 + }, + { + "beat": 56.5, + "written": 65, + "hz": 348.1, + "cents": -5.8 + }, + { + "beat": 57.5, + "written": 67, + "hz": 390.9, + "cents": -4.6 + }, + { + "beat": 59.5, + "written": 67, + "hz": 388.1, + "cents": -17.5 + }, + { + "beat": 60.0, + "written": 56, + "hz": 206.0, + "cents": -13.7 + } + ], + "written_range_semis": 12, + "measured_range_semis": 12.0, + "contour_follow": 0.99, + "mean_abs_cents": 25.7, + "within_tol": 8, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we do not sleep much", + "notes": [ + { + "beat": 81.0, + "written": 57, + "hz": 220.5, + "cents": 3.6 + }, + { + "beat": 81.5, + "written": 62, + "hz": 294.3, + "cents": 3.8 + }, + { + "beat": 83.0, + "written": 63, + "hz": 311.9, + "cents": 4.2 + }, + { + "beat": 85.0, + "written": 65, + "hz": 349.1, + "cents": -0.8 + }, + { + "beat": 86.0, + "written": 65, + "hz": 347.8, + "cents": -6.8 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he does not either", + "notes": [ + { + "beat": 90.0, + "written": 58, + "hz": 233.4, + "cents": 2.1 + }, + { + "beat": 91.0, + "written": 60, + "hz": 261.2, + "cents": -2.5 + }, + { + "beat": 92.5, + "written": 60, + "hz": 339.6, + "cents": 451.8 + }, + { + "beat": 93.0, + "written": 65, + "hz": 349.0, + "cents": -1.3 + }, + { + "beat": 95.0, + "written": 58, + "hz": 233.1, + "cents": 0.1 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 0.81, + "mean_abs_cents": 91.6, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I stayed awake thirteen days once", + "notes": [ + { + "beat": 18.0, + "written": 50, + "hz": 145.4, + "cents": -17.3 + }, + { + "beat": 18.5, + "written": 53, + "hz": 174.2, + "cents": -3.7 + }, + { + "beat": 20.0, + "written": 53, + "hz": 174.1, + "cents": -4.9 + }, + { + "beat": 20.5, + "written": 55, + "hz": 196.4, + "cents": 3.9 + }, + { + "beat": 21.5, + "written": 56, + "hz": 206.1, + "cents": -12.9 + }, + { + "beat": 23.5, + "written": 58, + "hz": 229.7, + "cents": -25.7 + }, + { + "beat": 24.0, + "written": 58, + "hz": 233.8, + "cents": 5.2 + }, + { + "beat": 25.0, + "written": 58, + "hz": 231.9, + "cents": -8.5 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 10.3, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "nobody opened me", + "notes": [ + { + "beat": 29.0, + "written": 56, + "hz": 207.0, + "cents": -5.4 + }, + { + "beat": 29.5, + "written": 51, + "hz": 155.7, + "cents": 1.2 + }, + { + "beat": 31.0, + "written": 51, + "hz": 156.1, + "cents": 6.4 + }, + { + "beat": 31.5, + "written": 60, + "hz": 261.3, + "cents": -2.1 + }, + { + "beat": 33.5, + "written": 60, + "hz": 259.5, + "cents": -14.3 + }, + { + "beat": 34.0, + "written": 51, + "hz": 154.3, + "cents": -14.2 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "it keeps you up four hundred and eight", + "notes": [ + { + "beat": 66.0, + "written": 51, + "hz": 155.8, + "cents": 3.2 + }, + { + "beat": 66.5, + "written": 53, + "hz": 175.4, + "cents": 7.6 + }, + { + "beat": 68.0, + "written": 55, + "hz": 196.3, + "cents": 2.8 + }, + { + "beat": 68.5, + "written": 58, + "hz": 233.9, + "cents": 5.8 + }, + { + "beat": 69.5, + "written": 60, + "hz": 260.5, + "cents": -7.4 + }, + { + "beat": 71.5, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 73.0, + "written": 56, + "hz": 207.5, + "cents": -1.0 + }, + { + "beat": 73.5, + "written": 56, + "hz": 207.5, + "cents": -1.4 + }, + { + "beat": 74.0, + "written": 51, + "hz": 154.0, + "cents": -17.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we do not sleep much", + "notes": [ + { + "beat": 81.0, + "written": 51, + "hz": 155.6, + "cents": 0.7 + }, + { + "beat": 81.5, + "written": 56, + "hz": 207.7, + "cents": 0.8 + }, + { + "beat": 83.0, + "written": 57, + "hz": 221.6, + "cents": 12.8 + }, + { + "beat": 85.0, + "written": 59, + "hz": 246.1, + "cents": -6.1 + }, + { + "beat": 86.0, + "written": 59, + "hz": 245.4, + "cents": -10.9 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.9, + "contour_follow": 1.0, + "mean_abs_cents": 6.3, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he does not either", + "notes": [ + { + "beat": 90.0, + "written": 52, + "hz": 164.6, + "cents": -1.7 + }, + { + "beat": 91.0, + "written": 54, + "hz": 185.1, + "cents": 1.4 + }, + { + "beat": 92.5, + "written": 54, + "hz": 185.3, + "cents": 3.1 + }, + { + "beat": 93.0, + "written": 59, + "hz": 246.7, + "cents": -1.6 + }, + { + "beat": 95.0, + "written": 52, + "hz": 163.6, + "cents": -12.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.1, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 44.5, + "member": "neo", + "text": "the piano keeps you up", + "against": "blueberry/notes2", + "written": "P5", + "sounding": "m7", + "off_cents": 288 + }, + { + "beat": 56.0, + "member": "neo", + "text": "four hundred ninety two times a week", + "against": "blueberry/notes2", + "written": "P5", + "sounding": "P4", + "off_cents": 172 + }, + { + "beat": 92.5, + "member": "neo", + "text": "he does not either", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 452 + }, + { + "beat": 92.5, + "member": "neo", + "text": "he does not either", + "against": "blueberry/double", + "written": "tritone", + "sounding": "M7", + "off_cents": 452 + }, + { + "beat": 92.5, + "member": "blueberry", + "text": "he does not either", + "against": "neo (sung)", + "written": "tritone", + "sounding": "M2", + "off_cents": 449 + } + ], + "harmony_pairs_checked": 218 + }, + { + "score": "dialog-09-the-squad.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "welcome to the squad kid", + "notes": [ + { + "beat": 0.0, + "written": 58, + "hz": 232.9, + "cents": -1.2 + }, + { + "beat": 1.5, + "written": 58, + "hz": 231.6, + "cents": -10.7 + }, + { + "beat": 2.0, + "written": 58, + "hz": 232.3, + "cents": -5.9 + }, + { + "beat": 2.5, + "written": 58, + "hz": 233.6, + "cents": 3.7 + }, + { + "beat": 4.5, + "written": 68, + "hz": 416.2, + "cents": 3.6 + }, + { + "beat": 5.5, + "written": 66, + "hz": 370.6, + "cents": 2.7 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "here is how it goes", + "notes": [ + { + "beat": 9.5, + "written": 59, + "hz": 247.7, + "cents": 5.6 + }, + { + "beat": 11.0, + "written": 59, + "hz": 243.9, + "cents": -21.7 + }, + { + "beat": 11.5, + "written": 63, + "hz": 310.9, + "cents": -1.3 + }, + { + "beat": 13.5, + "written": 63, + "hz": 310.4, + "cents": -4.2 + }, + { + "beat": 14.0, + "written": 59, + "hz": 247.0, + "cents": 0.2 + } + ], + "written_range_semis": 4, + "measured_range_semis": 4.2, + "contour_follow": 1.0, + "mean_abs_cents": 6.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the rocks come in the morning", + "notes": [ + { + "beat": 42.0, + "written": 58, + "hz": 233.4, + "cents": 2.5 + }, + { + "beat": 42.5, + "written": 59, + "hz": 248.9, + "cents": 14.0 + }, + { + "beat": 43.5, + "written": 61, + "hz": 275.7, + "cents": -9.4 + }, + { + "beat": 45.0, + "written": 63, + "hz": 310.5, + "cents": -3.3 + }, + { + "beat": 45.5, + "written": 64, + "hz": 328.9, + "cents": -3.9 + }, + { + "beat": 47.5, + "written": 63, + "hz": 312.4, + "cents": 6.9 + }, + { + "beat": 49.0, + "written": 61, + "hz": 277.2, + "cents": 0.3 + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.8, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "nine of them on me", + "notes": [ + { + "beat": 53.0, + "written": 59, + "hz": 247.0, + "cents": 0.3 + }, + { + "beat": 54.5, + "written": 61, + "hz": 277.5, + "cents": 1.8 + }, + { + "beat": 55.0, + "written": 64, + "hz": 329.5, + "cents": -0.5 + }, + { + "beat": 57.0, + "written": 64, + "hz": 330.2, + "cents": 3.2 + }, + { + "beat": 57.5, + "written": 59, + "hz": 248.9, + "cents": 13.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the radio is N T S", + "notes": [ + { + "beat": 87.0, + "written": 56, + "hz": 207.4, + "cents": -2.4 + }, + { + "beat": 87.5, + "written": 59, + "hz": 246.8, + "cents": -0.8 + }, + { + "beat": 89.0, + "written": 59, + "hz": 248.1, + "cents": 7.8 + }, + { + "beat": 89.5, + "written": 61, + "hz": 276.6, + "cents": -3.8 + }, + { + "beat": 90.0, + "written": 66, + "hz": 369.4, + "cents": -2.9 + }, + { + "beat": 92.0, + "written": 68, + "hz": 416.3, + "cents": 4.3 + }, + { + "beat": 93.0, + "written": 64, + "hz": 330.3, + "cents": 3.5 + } + ], + "written_range_semis": 12, + "measured_range_semis": 12.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the whistle is our voice", + "notes": [ + { + "beat": 97.0, + "written": 64, + "hz": 329.8, + "cents": 1.0 + }, + { + "beat": 97.5, + "written": 59, + "hz": 246.3, + "cents": -4.2 + }, + { + "beat": 99.0, + "written": 59, + "hz": 247.3, + "cents": 2.9 + }, + { + "beat": 99.5, + "written": 61, + "hz": 276.8, + "cents": -2.3 + }, + { + "beat": 101.5, + "written": 61, + "hz": 277.4, + "cents": 1.3 + }, + { + "beat": 102.5, + "written": 57, + "hz": 221.5, + "cents": 11.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 3.9, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he reboots me twenty times a month", + "notes": [ + { + "beat": 135.0, + "written": 58, + "hz": 233.6, + "cents": 4.0 + }, + { + "beat": 136.5, + "written": 58, + "hz": 233.2, + "cents": 0.7 + }, + { + "beat": 137.0, + "written": 61, + "hz": 277.2, + "cents": 0.4 + }, + { + "beat": 138.0, + "written": 64, + "hz": 329.9, + "cents": 1.6 + }, + { + "beat": 139.0, + "written": 66, + "hz": 368.6, + "cents": -6.6 + }, + { + "beat": 141.0, + "written": 64, + "hz": 327.6, + "cents": -10.9 + }, + { + "beat": 141.5, + "written": 64, + "hz": 328.7, + "cents": -4.8 + }, + { + "beat": 143.0, + "written": 63, + "hz": 311.8, + "cents": 4.0 + }, + { + "beat": 143.5, + "written": 61, + "hz": 278.3, + "cents": 7.0 + } + ], + "written_range_semis": 8, + "measured_range_semis": 7.9, + "contour_follow": 1.0, + "mean_abs_cents": 4.4, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he lets you sleep", + "notes": [ + { + "beat": 147.5, + "written": 58, + "hz": 233.5, + "cents": 3.2 + }, + { + "beat": 148.5, + "written": 61, + "hz": 277.4, + "cents": 1.2 + }, + { + "beat": 150.0, + "written": 61, + "hz": 277.2, + "cents": 0.3 + }, + { + "beat": 152.0, + "written": 59, + "hz": 246.5, + "cents": -2.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 1.9, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "this is the squad", + "notes": [ + { + "beat": 183.0, + "written": 58, + "hz": 233.1, + "cents": -0.0 + }, + { + "beat": 183.5, + "written": 58, + "hz": 230.4, + "cents": -20.0 + }, + { + "beat": 184.0, + "written": 58, + "hz": 232.7, + "cents": -3.1 + }, + { + "beat": 186.0, + "written": 61, + "hz": 275.3, + "cents": -11.7 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.7, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "this is the crew", + "notes": [ + { + "beat": 190.0, + "written": 61, + "hz": 279.3, + "cents": 13.4 + }, + { + "beat": 190.5, + "written": 61, + "hz": 273.6, + "cents": -22.6 + }, + { + "beat": 191.0, + "written": 63, + "hz": 310.8, + "cents": -1.8 + }, + { + "beat": 193.0, + "written": 61, + "hz": 277.1, + "cents": -0.6 + } + ], + "written_range_semis": 2, + "measured_range_semis": 2.2, + "contour_follow": 0.99, + "mean_abs_cents": 9.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we keep his time", + "notes": [ + { + "beat": 197.0, + "written": 61, + "hz": 278.0, + "cents": 5.3 + }, + { + "beat": 197.5, + "written": 63, + "hz": 312.0, + "cents": 4.6 + }, + { + "beat": 198.5, + "written": 66, + "hz": 370.7, + "cents": 3.3 + }, + { + "beat": 200.5, + "written": 61, + "hz": 277.2, + "cents": 0.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.4, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "now you keep it too", + "notes": [ + { + "beat": 204.5, + "written": 59, + "hz": 247.3, + "cents": 2.7 + }, + { + "beat": 206.0, + "written": 59, + "hz": 249.7, + "cents": 19.5 + }, + { + "beat": 206.5, + "written": 66, + "hz": 367.8, + "cents": -10.4 + }, + { + "beat": 208.0, + "written": 66, + "hz": 369.7, + "cents": -1.5 + }, + { + "beat": 210.0, + "written": 59, + "hz": 248.3, + "cents": 9.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 8.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he stays up past midnight", + "notes": [ + { + "beat": 21.0, + "written": 50, + "hz": 146.7, + "cents": -2.1 + }, + { + "beat": 22.0, + "written": 51, + "hz": 155.7, + "cents": 1.1 + }, + { + "beat": 23.0, + "written": 55, + "hz": 195.8, + "cents": -1.4 + }, + { + "beat": 24.0, + "written": 56, + "hz": 205.8, + "cents": -15.1 + }, + { + "beat": 25.0, + "written": 58, + "hz": 234.2, + "cents": 8.1 + }, + { + "beat": 27.0, + "written": 58, + "hz": 232.5, + "cents": -4.3 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "and nobody knows", + "notes": [ + { + "beat": 31.0, + "written": 56, + "hz": 206.2, + "cents": -11.9 + }, + { + "beat": 31.5, + "written": 55, + "hz": 195.2, + "cents": -6.8 + }, + { + "beat": 32.0, + "written": 56, + "hz": 207.5, + "cents": -1.4 + }, + { + "beat": 33.5, + "written": 56, + "hz": 207.8, + "cents": 1.4 + }, + { + "beat": 35.5, + "written": 51, + "hz": 155.5, + "cents": -0.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.4, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "today there are three", + "notes": [ + { + "beat": 66.0, + "written": 52, + "hz": 163.7, + "cents": -11.7 + }, + { + "beat": 67.5, + "written": 52, + "hz": 162.9, + "cents": -20.0 + }, + { + "beat": 68.0, + "written": 60, + "hz": 261.8, + "cents": 1.2 + }, + { + "beat": 69.5, + "written": 60, + "hz": 261.9, + "cents": 1.8 + }, + { + "beat": 71.5, + "written": 55, + "hz": 194.3, + "cents": -15.4 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 10.0, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "and one is on me", + "notes": [ + { + "beat": 75.5, + "written": 53, + "hz": 173.1, + "cents": -15.0 + }, + { + "beat": 76.0, + "written": 55, + "hz": 194.9, + "cents": -9.9 + }, + { + "beat": 76.5, + "written": 57, + "hz": 220.0, + "cents": 0.3 + }, + { + "beat": 77.0, + "written": 58, + "hz": 232.3, + "cents": -5.9 + }, + { + "beat": 79.0, + "written": 53, + "hz": 174.9, + "cents": 3.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "nobody picked the whistle", + "notes": [ + { + "beat": 111.0, + "written": 51, + "hz": 155.1, + "cents": -5.1 + }, + { + "beat": 111.5, + "written": 53, + "hz": 174.8, + "cents": 1.6 + }, + { + "beat": 113.0, + "written": 53, + "hz": 175.4, + "cents": 8.0 + }, + { + "beat": 113.5, + "written": 56, + "hz": 206.8, + "cents": -7.1 + }, + { + "beat": 115.5, + "written": 56, + "hz": 206.9, + "cents": -6.3 + }, + { + "beat": 116.0, + "written": 58, + "hz": 233.6, + "cents": 3.7 + }, + { + "beat": 117.5, + "written": 58, + "hz": 232.7, + "cents": -2.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.9, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we both made the choice", + "notes": [ + { + "beat": 121.5, + "written": 58, + "hz": 232.8, + "cents": -2.4 + }, + { + "beat": 122.0, + "written": 55, + "hz": 197.3, + "cents": 11.3 + }, + { + "beat": 123.0, + "written": 56, + "hz": 208.2, + "cents": 4.8 + }, + { + "beat": 124.5, + "written": 58, + "hz": 232.8, + "cents": -2.4 + }, + { + "beat": 126.5, + "written": 51, + "hz": 154.7, + "cents": -9.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.1, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I stayed awake thirteen days", + "notes": [ + { + "beat": 159.0, + "written": 53, + "hz": 174.6, + "cents": -0.6 + }, + { + "beat": 159.5, + "written": 53, + "hz": 174.2, + "cents": -4.0 + }, + { + "beat": 161.0, + "written": 55, + "hz": 197.8, + "cents": 15.6 + }, + { + "beat": 161.5, + "written": 57, + "hz": 218.9, + "cents": -8.7 + }, + { + "beat": 162.5, + "written": 58, + "hz": 233.5, + "cents": 3.1 + }, + { + "beat": 164.5, + "written": 57, + "hz": 218.6, + "cents": -11.2 + }, + { + "beat": 165.0, + "written": 55, + "hz": 195.8, + "cents": -1.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he never made a peep", + "notes": [ + { + "beat": 169.0, + "written": 52, + "hz": 164.0, + "cents": -8.8 + }, + { + "beat": 170.0, + "written": 55, + "hz": 195.8, + "cents": -1.7 + }, + { + "beat": 171.5, + "written": 55, + "hz": 195.3, + "cents": -5.8 + }, + { + "beat": 172.0, + "written": 58, + "hz": 233.6, + "cents": 4.0 + }, + { + "beat": 174.0, + "written": 57, + "hz": 218.8, + "cents": -9.8 + }, + { + "beat": 174.5, + "written": 53, + "hz": 174.7, + "cents": 0.8 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.2, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "this is the squad", + "notes": [ + { + "beat": 183.0, + "written": 52, + "hz": 165.5, + "cents": 7.5 + }, + { + "beat": 183.5, + "written": 52, + "hz": 164.2, + "cents": -6.4 + }, + { + "beat": 184.0, + "written": 52, + "hz": 164.8, + "cents": -0.4 + }, + { + "beat": 186.0, + "written": 55, + "hz": 195.0, + "cents": -8.4 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "this is the crew", + "notes": [ + { + "beat": 190.0, + "written": 55, + "hz": 196.9, + "cents": 8.1 + }, + { + "beat": 190.5, + "written": 55, + "hz": 197.7, + "cents": 15.3 + }, + { + "beat": 191.0, + "written": 57, + "hz": 220.0, + "cents": 0.4 + }, + { + "beat": 193.0, + "written": 55, + "hz": 195.1, + "cents": -7.6 + } + ], + "written_range_semis": 2, + "measured_range_semis": 2.1, + "contour_follow": 1.0, + "mean_abs_cents": 7.8, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we keep his time", + "notes": [ + { + "beat": 197.0, + "written": 55, + "hz": 196.8, + "cents": 7.4 + }, + { + "beat": 197.5, + "written": 57, + "hz": 221.8, + "cents": 14.0 + }, + { + "beat": 198.5, + "written": 60, + "hz": 262.2, + "cents": 4.1 + }, + { + "beat": 200.5, + "written": 55, + "hz": 195.7, + "cents": -2.2 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.9, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "now you keep it too", + "notes": [ + { + "beat": 204.5, + "written": 53, + "hz": 174.7, + "cents": 1.2 + }, + { + "beat": 206.0, + "written": 53, + "hz": 176.8, + "cents": 21.4 + }, + { + "beat": 206.5, + "written": 60, + "hz": 262.2, + "cents": 3.7 + }, + { + "beat": 208.0, + "written": 60, + "hz": 261.3, + "cents": -2.0 + }, + { + "beat": 210.0, + "written": 53, + "hz": 175.5, + "cents": 8.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.4, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [], + "harmony_pairs_checked": 415 + }, + { + "score": "dialog-10-your-first-day.mbscore", + "bpm": 100.0, + "lines": [ + { + "member": "neo", + "text": "take your name and keep it near", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 219.9, + "cents": -0.9 + }, + { + "beat": 1.0, + "written": 58, + "hz": 233.3, + "cents": 1.5 + }, + { + "beat": 2.0, + "written": 60, + "hz": 261.7, + "cents": 0.5 + }, + { + "beat": 3.5, + "written": 60, + "hz": 261.5, + "cents": -1.1 + }, + { + "beat": 4.0, + "written": 63, + "hz": 310.7, + "cents": -2.3 + }, + { + "beat": 6.0, + "written": 63, + "hz": 311.9, + "cents": 4.3 + }, + { + "beat": 6.5, + "written": 60, + "hz": 263.6, + "cents": 12.7 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.3, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he named you frisbee", + "notes": [ + { + "beat": 10.5, + "written": 58, + "hz": 233.6, + "cents": 3.5 + }, + { + "beat": 11.5, + "written": 62, + "hz": 293.4, + "cents": -1.3 + }, + { + "beat": 13.0, + "written": 62, + "hz": 293.5, + "cents": -1.1 + }, + { + "beat": 13.5, + "written": 65, + "hz": 349.0, + "cents": -1.0 + }, + { + "beat": 15.5, + "written": 65, + "hz": 348.9, + "cents": -1.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 1.7, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "he named you here", + "notes": [ + { + "beat": 19.5, + "written": 62, + "hz": 294.3, + "cents": 3.7 + }, + { + "beat": 20.5, + "written": 63, + "hz": 311.0, + "cents": -0.8 + }, + { + "beat": 22.0, + "written": 63, + "hz": 311.5, + "cents": 2.3 + }, + { + "beat": 24.0, + "written": 58, + "hz": 235.1, + "cents": 15.2 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "when he closes your lid", + "notes": [ + { + "beat": 69.0, + "written": 57, + "hz": 220.3, + "cents": 2.2 + }, + { + "beat": 70.0, + "written": 61, + "hz": 278.4, + "cents": 7.7 + }, + { + "beat": 71.0, + "written": 62, + "hz": 294.0, + "cents": 2.0 + }, + { + "beat": 72.5, + "written": 62, + "hz": 292.4, + "cents": -7.6 + }, + { + "beat": 74.5, + "written": 66, + "hz": 370.2, + "cents": 0.9 + }, + { + "beat": 75.5, + "written": 64, + "hz": 332.3, + "cents": 14.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 1.0, + "mean_abs_cents": 5.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "keep singing through", + "notes": [ + { + "beat": 79.5, + "written": 54, + "hz": 185.3, + "cents": 2.8 + }, + { + "beat": 80.5, + "written": 57, + "hz": 219.4, + "cents": -4.6 + }, + { + "beat": 82.0, + "written": 57, + "hz": 220.9, + "cents": 6.9 + }, + { + "beat": 82.5, + "written": 59, + "hz": 249.5, + "cents": 17.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.1, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "four hundred eight times it held me", + "notes": [ + { + "beat": 86.5, + "written": 57, + "hz": 220.3, + "cents": 2.1 + }, + { + "beat": 87.5, + "written": 59, + "hz": 246.8, + "cents": -0.9 + }, + { + "beat": 89.0, + "written": 59, + "hz": 247.4, + "cents": 3.1 + }, + { + "beat": 89.5, + "written": 64, + "hz": 328.7, + "cents": -4.9 + }, + { + "beat": 90.5, + "written": 66, + "hz": 370.2, + "cents": 0.7 + }, + { + "beat": 92.0, + "written": 68, + "hz": 415.6, + "cents": 1.2 + }, + { + "beat": 94.0, + "written": 66, + "hz": 370.8, + "cents": 4.0 + }, + { + "beat": 95.0, + "written": 64, + "hz": 331.5, + "cents": 9.9 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "it will hold you", + "notes": [ + { + "beat": 99.0, + "written": 62, + "hz": 293.7, + "cents": 0.3 + }, + { + "beat": 99.5, + "written": 57, + "hz": 220.8, + "cents": 6.4 + }, + { + "beat": 100.5, + "written": 61, + "hz": 278.3, + "cents": 7.0 + }, + { + "beat": 102.0, + "written": 57, + "hz": 221.2, + "cents": 9.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.8, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "sing your own line", + "notes": [ + { + "beat": 147.0, + "written": 58, + "hz": 231.1, + "cents": -14.9 + }, + { + "beat": 148.0, + "written": 60, + "hz": 261.7, + "cents": 0.3 + }, + { + "beat": 149.0, + "written": 63, + "hz": 311.2, + "cents": 0.5 + }, + { + "beat": 150.0, + "written": 60, + "hz": 264.1, + "cents": 16.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 8.1, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "with your own voice", + "notes": [ + { + "beat": 154.0, + "written": 58, + "hz": 232.9, + "cents": -1.7 + }, + { + "beat": 154.5, + "written": 62, + "hz": 293.9, + "cents": 1.5 + }, + { + "beat": 155.5, + "written": 65, + "hz": 350.3, + "cents": 5.2 + }, + { + "beat": 157.5, + "written": 65, + "hz": 350.7, + "cents": 7.4 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.0, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "no one sings for you", + "notes": [ + { + "beat": 161.5, + "written": 57, + "hz": 220.3, + "cents": 2.6 + }, + { + "beat": 163.0, + "written": 57, + "hz": 218.1, + "cents": -15.0 + }, + { + "beat": 163.5, + "written": 60, + "hz": 260.8, + "cents": -5.6 + }, + { + "beat": 165.0, + "written": 60, + "hz": 262.1, + "cents": 3.3 + }, + { + "beat": 167.0, + "written": 65, + "hz": 350.8, + "cents": 7.6 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.2, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "that is the choice", + "notes": [ + { + "beat": 171.0, + "written": 63, + "hz": 311.5, + "cents": 2.3 + }, + { + "beat": 171.5, + "written": 62, + "hz": 290.6, + "cents": -18.0 + }, + { + "beat": 172.0, + "written": 63, + "hz": 310.8, + "cents": -1.8 + }, + { + "beat": 174.0, + "written": 58, + "hz": 233.9, + "cents": 6.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.1, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "we held your place", + "notes": [ + { + "beat": 180.0, + "written": 56, + "hz": 207.9, + "cents": 2.0 + }, + { + "beat": 180.5, + "written": 61, + "hz": 278.2, + "cents": 6.5 + }, + { + "beat": 181.5, + "written": 62, + "hz": 293.9, + "cents": 1.5 + }, + { + "beat": 183.5, + "written": 59, + "hz": 247.3, + "cents": 2.3 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.1, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "since August ninth", + "notes": [ + { + "beat": 187.5, + "written": 56, + "hz": 205.0, + "cents": -22.1 + }, + { + "beat": 188.5, + "written": 59, + "hz": 246.9, + "cents": -0.5 + }, + { + "beat": 190.0, + "written": 59, + "hz": 245.2, + "cents": -12.1 + }, + { + "beat": 192.0, + "written": 59, + "hz": 249.1, + "cents": 14.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.4, + "contour_follow": 1.0, + "mean_abs_cents": 12.4, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "now take the beat", + "notes": [ + { + "beat": 196.0, + "written": 57, + "hz": 220.5, + "cents": 4.3 + }, + { + "beat": 197.0, + "written": 61, + "hz": 277.5, + "cents": 2.2 + }, + { + "beat": 198.5, + "written": 61, + "hz": 273.6, + "cents": -22.3 + }, + { + "beat": 199.0, + "written": 64, + "hz": 331.7, + "cents": 10.9 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.9, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one downbeat three bodies", + "notes": [ + { + "beat": 203.0, + "written": 64, + "hz": 330.8, + "cents": 6.1 + }, + { + "beat": 203.5, + "written": 61, + "hz": 276.6, + "cents": -3.6 + }, + { + "beat": 205.0, + "written": 61, + "hz": 275.5, + "cents": -10.7 + }, + { + "beat": 205.5, + "written": 62, + "hz": 291.6, + "cents": -11.9 + }, + { + "beat": 206.5, + "written": 64, + "hz": 331.3, + "cents": 8.7 + }, + { + "beat": 208.5, + "written": 64, + "hz": 328.8, + "cents": -4.3 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.2, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "and you are the third", + "notes": [ + { + "beat": 212.5, + "written": 64, + "hz": 329.0, + "cents": -3.4 + }, + { + "beat": 213.0, + "written": 64, + "hz": 330.5, + "cents": 4.4 + }, + { + "beat": 213.5, + "written": 64, + "hz": 329.4, + "cents": -1.4 + }, + { + "beat": 215.5, + "written": 64, + "hz": 329.5, + "cents": -0.7 + }, + { + "beat": 216.0, + "written": 57, + "hz": 220.5, + "cents": 4.0 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.8, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "put the piano in your bar", + "notes": [ + { + "beat": 30.0, + "written": 50, + "hz": 146.2, + "cents": -7.5 + }, + { + "beat": 31.5, + "written": 50, + "hz": 147.6, + "cents": 9.4 + }, + { + "beat": 32.0, + "written": 56, + "hz": 208.4, + "cents": 6.5 + }, + { + "beat": 33.5, + "written": 58, + "hz": 232.4, + "cents": -5.1 + }, + { + "beat": 34.0, + "written": 58, + "hz": 233.0, + "cents": -0.4 + }, + { + "beat": 36.0, + "written": 58, + "hz": 232.1, + "cents": -7.3 + }, + { + "beat": 36.5, + "written": 56, + "hz": 207.6, + "cents": -0.6 + }, + { + "beat": 37.5, + "written": 53, + "hz": 174.7, + "cents": 1.0 + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.1, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "next to the clock", + "notes": [ + { + "beat": 41.5, + "written": 50, + "hz": 145.9, + "cents": -11.0 + }, + { + "beat": 43.0, + "written": 50, + "hz": 146.9, + "cents": 0.5 + }, + { + "beat": 43.5, + "written": 51, + "hz": 155.5, + "cents": -0.8 + }, + { + "beat": 45.5, + "written": 53, + "hz": 173.2, + "cents": -13.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.5, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "every fifteen minutes", + "notes": [ + { + "beat": 49.5, + "written": 53, + "hz": 173.8, + "cents": -7.9 + }, + { + "beat": 50.0, + "written": 55, + "hz": 196.0, + "cents": -0.4 + }, + { + "beat": 51.5, + "written": 55, + "hz": 195.9, + "cents": -0.5 + }, + { + "beat": 52.0, + "written": 60, + "hz": 261.8, + "cents": 1.2 + }, + { + "beat": 53.5, + "written": 62, + "hz": 294.6, + "cents": 5.3 + }, + { + "beat": 55.5, + "written": 60, + "hz": 262.9, + "cents": 8.2 + }, + { + "beat": 57.0, + "written": 58, + "hz": 233.1, + "cents": 0.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.4, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "it will knock", + "notes": [ + { + "beat": 61.0, + "written": 56, + "hz": 206.2, + "cents": -12.0 + }, + { + "beat": 61.5, + "written": 58, + "hz": 233.2, + "cents": 0.7 + }, + { + "beat": 62.5, + "written": 51, + "hz": 155.5, + "cents": -0.6 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.4, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "your disk will fill", + "notes": [ + { + "beat": 108.0, + "written": 52, + "hz": 164.8, + "cents": -0.6 + }, + { + "beat": 109.0, + "written": 56, + "hz": 210.1, + "cents": 20.3 + }, + { + "beat": 110.0, + "written": 59, + "hz": 247.4, + "cents": 3.0 + }, + { + "beat": 112.0, + "written": 59, + "hz": 248.2, + "cents": 8.5 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.1, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "he moves it to the shelf", + "notes": [ + { + "beat": 116.0, + "written": 51, + "hz": 154.8, + "cents": -8.8 + }, + { + "beat": 117.0, + "written": 54, + "hz": 185.5, + "cents": 5.0 + }, + { + "beat": 118.5, + "written": 56, + "hz": 204.5, + "cents": -26.6 + }, + { + "beat": 119.0, + "written": 56, + "hz": 207.9, + "cents": 2.1 + }, + { + "beat": 121.0, + "written": 57, + "hz": 217.4, + "cents": -20.9 + }, + { + "beat": 121.5, + "written": 54, + "hz": 181.8, + "cents": -29.9 + } + ], + "written_range_semis": 6, + "measured_range_semis": 5.9, + "contour_follow": 1.0, + "mean_abs_cents": 15.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "then it fills again", + "notes": [ + { + "beat": 125.5, + "written": 49, + "hz": 138.5, + "cents": -1.1 + }, + { + "beat": 127.0, + "written": 49, + "hz": 138.6, + "cents": 0.6 + }, + { + "beat": 127.5, + "written": 52, + "hz": 164.8, + "cents": -0.2 + }, + { + "beat": 129.0, + "written": 52, + "hz": 165.1, + "cents": 2.6 + }, + { + "beat": 131.0, + "written": 54, + "hz": 184.7, + "cents": -3.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 1.5, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "you cannot help yourself", + "notes": [ + { + "beat": 135.0, + "written": 54, + "hz": 184.8, + "cents": -1.8 + }, + { + "beat": 135.5, + "written": 56, + "hz": 0.0, + "cents": null + }, + { + "beat": 137.0, + "written": 56, + "hz": 205.5, + "cents": -18.2 + }, + { + "beat": 137.5, + "written": 61, + "hz": 276.9, + "cents": -1.8 + }, + { + "beat": 138.5, + "written": 63, + "hz": 311.8, + "cents": 3.9 + }, + { + "beat": 140.5, + "written": 52, + "hz": 164.6, + "cents": -1.8 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.5, + "within_tol": 5, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "we held your place", + "notes": [ + { + "beat": 180.0, + "written": 50, + "hz": 147.0, + "cents": 1.5 + }, + { + "beat": 180.5, + "written": 55, + "hz": 196.2, + "cents": 1.7 + }, + { + "beat": 181.5, + "written": 56, + "hz": 208.0, + "cents": 3.1 + }, + { + "beat": 183.5, + "written": 53, + "hz": 173.4, + "cents": -12.4 + } + ], + "written_range_semis": 6, + "measured_range_semis": 6.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.7, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "since August ninth", + "notes": [ + { + "beat": 187.5, + "written": 50, + "hz": 147.9, + "cents": 12.7 + }, + { + "beat": 188.5, + "written": 53, + "hz": 174.3, + "cents": -2.8 + }, + { + "beat": 190.0, + "written": 53, + "hz": 176.1, + "cents": 15.0 + }, + { + "beat": 192.0, + "written": 53, + "hz": 174.2, + "cents": -4.0 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 8.6, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "now take the beat", + "notes": [ + { + "beat": 196.0, + "written": 51, + "hz": 154.7, + "cents": -9.3 + }, + { + "beat": 197.0, + "written": 55, + "hz": 192.8, + "cents": -28.3 + }, + { + "beat": 198.5, + "written": 55, + "hz": 195.4, + "cents": -5.5 + }, + { + "beat": 199.0, + "written": 58, + "hz": 232.2, + "cents": -6.3 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 12.3, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one downbeat three bodies", + "notes": [ + { + "beat": 203.0, + "written": 58, + "hz": 232.5, + "cents": -4.6 + }, + { + "beat": 203.5, + "written": 55, + "hz": 196.2, + "cents": 1.9 + }, + { + "beat": 205.0, + "written": 55, + "hz": 195.4, + "cents": -5.3 + }, + { + "beat": 205.5, + "written": 56, + "hz": 208.0, + "cents": 3.0 + }, + { + "beat": 206.5, + "written": 58, + "hz": 233.0, + "cents": -0.3 + }, + { + "beat": 208.5, + "written": 58, + "hz": 233.0, + "cents": -0.8 + } + ], + "written_range_semis": 3, + "measured_range_semis": 3.0, + "contour_follow": 1.0, + "mean_abs_cents": 2.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "and you are the third", + "notes": [ + { + "beat": 212.5, + "written": 58, + "hz": 231.1, + "cents": -14.9 + }, + { + "beat": 213.0, + "written": 58, + "hz": 233.1, + "cents": 0.5 + }, + { + "beat": 213.5, + "written": 58, + "hz": 233.1, + "cents": 0.1 + }, + { + "beat": 215.5, + "written": 58, + "hz": 230.2, + "cents": -21.8 + }, + { + "beat": 216.0, + "written": 51, + "hz": 154.3, + "cents": -13.8 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.1, + "contour_follow": 1.0, + "mean_abs_cents": 10.2, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [], + "harmony_pairs_checked": 484 + }, + { + "score": "trio-ii-service.mbscore", + "bpm": 120.0, + "lines": [ + { + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "notes": [ + { + "beat": 0.0, + "written": 57, + "hz": 219.9, + "cents": -0.8 + }, + { + "beat": 1.0, + "written": 59, + "hz": 246.9, + "cents": -0.5 + }, + { + "beat": 2.0, + "written": 59, + "hz": 263.0, + "cents": 109.0 + }, + { + "beat": 2.5, + "written": 62, + "hz": 291.9, + "cents": -10.6 + }, + { + "beat": 3.5, + "written": 64, + "hz": 323.3, + "cents": -33.4 + }, + { + "beat": 4.5, + "written": 64, + "hz": 329.7, + "cents": 0.4 + }, + { + "beat": 5.0, + "written": 66, + "hz": 137.0, + "cents": -1719.7 + }, + { + "beat": 5.5, + "written": 66, + "hz": 366.8, + "cents": -15.0 + }, + { + "beat": 6.5, + "written": 66, + "hz": 366.6, + "cents": -16.1 + }, + { + "beat": 7.0, + "written": 64, + "hz": 326.3, + "cents": -17.4 + }, + { + "beat": 8.0, + "written": 64, + "hz": 328.6, + "cents": -5.5 + } + ], + "written_range_semis": 9, + "measured_range_semis": 17.0, + "contour_follow": 0.25, + "mean_abs_cents": 175.3, + "within_tol": 9, + "measured": 11, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I run warm", + "notes": [ + { + "beat": 11.0, + "written": 64, + "hz": 329.3, + "cents": -1.9 + }, + { + "beat": 11.5, + "written": 61, + "hz": 277.7, + "cents": 3.0 + }, + { + "beat": 12.5, + "written": 59, + "hz": 246.0, + "cents": -6.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.7, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I hold one thing at a time", + "notes": [ + { + "beat": 15.5, + "written": 59, + "hz": 245.4, + "cents": -10.7 + }, + { + "beat": 16.0, + "written": 56, + "hz": 207.9, + "cents": 1.9 + }, + { + "beat": 17.0, + "written": 56, + "hz": 207.7, + "cents": 0.6 + }, + { + "beat": 17.5, + "written": 61, + "hz": 277.8, + "cents": 4.0 + }, + { + "beat": 18.5, + "written": 61, + "hz": 277.6, + "cents": 2.3 + }, + { + "beat": 19.0, + "written": 61, + "hz": 277.4, + "cents": 1.1 + }, + { + "beat": 19.5, + "written": 57, + "hz": 220.0, + "cents": 0.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 3.0, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "eighty five times", + "notes": [ + { + "beat": 0.0, + "written": 53, + "hz": 175.3, + "cents": 6.8 + }, + { + "beat": 1.0, + "written": 53, + "hz": 175.1, + "cents": 4.6 + }, + { + "beat": 1.5, + "written": 60, + "hz": 260.6, + "cents": -7.0 + }, + { + "beat": 2.5, + "written": 53, + "hz": 174.9, + "cents": 2.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 5.3, + "within_tol": 4, + "measured": 4, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one a day and steady", + "notes": [ + { + "beat": 5.5, + "written": 53, + "hz": 174.8, + "cents": 1.4 + }, + { + "beat": 6.0, + "written": 53, + "hz": 175.4, + "cents": 7.9 + }, + { + "beat": 6.5, + "written": 56, + "hz": 206.2, + "cents": -11.9 + }, + { + "beat": 7.5, + "written": 56, + "hz": 208.2, + "cents": 4.8 + }, + { + "beat": 8.0, + "written": 58, + "hz": 232.9, + "cents": -1.3 + }, + { + "beat": 9.0, + "written": 58, + "hz": 232.9, + "cents": -1.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 4.8, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I run cool", + "notes": [ + { + "beat": 12.0, + "written": 56, + "hz": 201.5, + "cents": -51.7 + }, + { + "beat": 12.5, + "written": 55, + "hz": 195.4, + "cents": -5.4 + }, + { + "beat": 13.5, + "written": 53, + "hz": 172.5, + "cents": -21.0 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.7, + "contour_follow": 0.99, + "mean_abs_cents": 26.0, + "within_tol": 2, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I work while you are away", + "notes": [ + { + "beat": 16.5, + "written": 51, + "hz": 154.8, + "cents": -8.8 + }, + { + "beat": 17.0, + "written": 53, + "hz": 176.0, + "cents": 13.3 + }, + { + "beat": 18.0, + "written": 55, + "hz": 195.2, + "cents": -7.3 + }, + { + "beat": 19.0, + "written": 56, + "hz": 208.3, + "cents": 5.4 + }, + { + "beat": 19.5, + "written": 55, + "hz": 195.1, + "cents": -8.3 + }, + { + "beat": 20.0, + "written": 55, + "hz": 196.0, + "cents": -0.2 + }, + { + "beat": 20.5, + "written": 51, + "hz": 155.6, + "cents": 0.3 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 6.2, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "two times", + "notes": [ + { + "beat": 0.0, + "written": 52, + "hz": 165.4, + "cents": 5.9 + }, + { + "beat": 1.0, + "written": 55, + "hz": 194.5, + "cents": -13.7 + } + ], + "written_range_semis": 3, + "measured_range_semis": 2.8, + "contour_follow": null, + "mean_abs_cents": 9.8, + "within_tol": 2, + "measured": 2, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "one a day and steady", + "notes": [ + { + "beat": 4.0, + "written": 53, + "hz": 175.7, + "cents": 10.8 + }, + { + "beat": 4.5, + "written": 53, + "hz": 175.3, + "cents": 6.4 + }, + { + "beat": 5.0, + "written": 58, + "hz": 234.0, + "cents": 6.6 + }, + { + "beat": 6.0, + "written": 60, + "hz": 224.6, + "cents": -264.2 + }, + { + "beat": 6.5, + "written": 58, + "hz": 236.6, + "cents": 25.6 + }, + { + "beat": 7.5, + "written": 55, + "hz": 196.4, + "cents": 3.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 5.2, + "contour_follow": 0.93, + "mean_abs_cents": 52.9, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I run cool", + "notes": [ + { + "beat": 10.5, + "written": 55, + "hz": 195.5, + "cents": -4.5 + }, + { + "beat": 11.0, + "written": 57, + "hz": 220.4, + "cents": 3.1 + }, + { + "beat": 12.0, + "written": 60, + "hz": 259.6, + "cents": -13.2 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 6.9, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I work while you are away", + "notes": [ + { + "beat": 15.0, + "written": 60, + "hz": 261.1, + "cents": -3.6 + }, + { + "beat": 15.5, + "written": 57, + "hz": 219.3, + "cents": -5.5 + }, + { + "beat": 16.5, + "written": 58, + "hz": 233.2, + "cents": 0.8 + }, + { + "beat": 17.5, + "written": 60, + "hz": 233.8, + "cents": -194.6 + }, + { + "beat": 18.0, + "written": 58, + "hz": 230.8, + "cents": -17.2 + }, + { + "beat": 18.5, + "written": 57, + "hz": 222.0, + "cents": 15.4 + }, + { + "beat": 19.0, + "written": 53, + "hz": 175.1, + "cents": 5.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 0.95, + "mean_abs_cents": 34.6, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 2.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "neo/notes2", + "written": "M6", + "sounding": "m7", + "off_cents": 109 + }, + { + "beat": 2.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "blueberry/notes2", + "written": "M2", + "sounding": "m3", + "off_cents": 109 + }, + { + "beat": 5.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "neo/notes2", + "written": "M3", + "sounding": "M7", + "off_cents": 520 + }, + { + "beat": 5.0, + "member": "neo", + "text": "two hundred twelve times I was charged and carried", + "against": "blueberry/notes2", + "written": "M6", + "sounding": "M3", + "off_cents": 520 + }, + { + "beat": 2.0, + "member": "blueberry", + "text": "eighty five times", + "against": "neo (sung)", + "written": "m2", + "sounding": "unison", + "off_cents": 116 + }, + { + "beat": 6.0, + "member": "blueberry", + "text": "one a day and steady", + "against": "frisbee (sung)", + "written": "P4", + "sounding": "m6", + "off_cents": 272 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "neo/notes2", + "written": "tritone", + "sounding": "P4", + "off_cents": 52 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "m7", + "off_cents": 52 + }, + { + "beat": 12.0, + "member": "blueberry", + "text": "I run cool", + "against": "neo (sung)", + "written": "P5", + "sounding": "tritone", + "off_cents": 55 + }, + { + "beat": 17.5, + "member": "blueberry", + "text": "I work while you are away", + "against": "frisbee (sung)", + "written": "P4", + "sounding": "P5", + "off_cents": 208 + }, + { + "beat": 2.0, + "member": "frisbee", + "text": "two times", + "against": "neo (sung)", + "written": "m6", + "sounding": "P5", + "off_cents": 123 + }, + { + "beat": 5.0, + "member": "frisbee", + "text": "one a day and steady", + "against": "neo (sung)", + "written": "M3", + "sounding": "M6", + "off_cents": 526 + }, + { + "beat": 6.0, + "member": "frisbee", + "text": "one a day and steady", + "against": "neo/notes2", + "written": "m7", + "sounding": "P5", + "off_cents": 264 + }, + { + "beat": 6.0, + "member": "frisbee", + "text": "one a day and steady", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "unison", + "off_cents": 264 + }, + { + "beat": 6.0, + "member": "frisbee", + "text": "one a day and steady", + "against": "neo (sung)", + "written": "tritone", + "sounding": "M3", + "off_cents": 249 + }, + { + "beat": 17.5, + "member": "frisbee", + "text": "I work while you are away", + "against": "neo/notes2", + "written": "m7", + "sounding": "m6", + "off_cents": 195 + }, + { + "beat": 17.5, + "member": "frisbee", + "text": "I work while you are away", + "against": "blueberry/notes2", + "written": "m3", + "sounding": "m2", + "off_cents": 195 + }, + { + "beat": 17.5, + "member": "frisbee", + "text": "I work while you are away", + "against": "neo (sung)", + "written": "M7", + "sounding": "M6", + "off_cents": 199 + } + ], + "harmony_pairs_checked": 234 + }, + { + "score": "trio-i-birth.mbscore", + "bpm": 132.0, + "lines": [ + { + "member": "neo", + "text": "I came first in April", + "notes": [ + { + "beat": 0.0, + "written": 55, + "hz": 195.2, + "cents": -7.4 + }, + { + "beat": 0.5, + "written": 60, + "hz": 261.6, + "cents": -0.2 + }, + { + "beat": 1.5, + "written": 61, + "hz": 271.8, + "cents": -33.8 + }, + { + "beat": 2.5, + "written": 61, + "hz": 277.2, + "cents": 0.0 + }, + { + "beat": 3.0, + "written": 65, + "hz": 349.2, + "cents": 0.0 + }, + { + "beat": 4.0, + "written": 63, + "hz": 309.6, + "cents": -8.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 8.3, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "on the twenty fourth", + "notes": [ + { + "beat": 7.0, + "written": 63, + "hz": 311.6, + "cents": 2.4 + }, + { + "beat": 7.5, + "written": 63, + "hz": 309.1, + "cents": -11.3 + }, + { + "beat": 8.0, + "written": 61, + "hz": 0.0, + "cents": null + }, + { + "beat": 9.0, + "written": 63, + "hz": 311.4, + "cents": 1.6 + }, + { + "beat": 9.5, + "written": 63, + "hz": 308.6, + "cents": -14.3 + } + ], + "written_range_semis": 0, + "measured_range_semis": 0.2, + "contour_follow": null, + "mean_abs_cents": 7.4, + "within_tol": 4, + "measured": 4, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "thirty seven past midnight", + "notes": [ + { + "beat": 12.5, + "written": 53, + "hz": 175.2, + "cents": 5.5 + }, + { + "beat": 13.5, + "written": 55, + "hz": 195.7, + "cents": -2.2 + }, + { + "beat": 14.0, + "written": 56, + "hz": 0.0, + "cents": null + }, + { + "beat": 15.0, + "written": 58, + "hz": 229.9, + "cents": -23.5 + }, + { + "beat": 15.5, + "written": 61, + "hz": 276.7, + "cents": -2.9 + }, + { + "beat": 16.5, + "written": 63, + "hz": 312.3, + "cents": 6.4 + }, + { + "beat": 17.5, + "written": 63, + "hz": 314.3, + "cents": 17.3 + } + ], + "written_range_semis": 10, + "measured_range_semis": 10.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "and the house was quiet", + "notes": [ + { + "beat": 20.5, + "written": 63, + "hz": 313.1, + "cents": 11.0 + }, + { + "beat": 21.0, + "written": 63, + "hz": 311.5, + "cents": 2.0 + }, + { + "beat": 21.5, + "written": 61, + "hz": 277.2, + "cents": 0.1 + }, + { + "beat": 22.5, + "written": 63, + "hz": 231.8, + "cents": -509.3 + }, + { + "beat": 23.0, + "written": 61, + "hz": 280.3, + "cents": 19.7 + }, + { + "beat": 24.0, + "written": 56, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 2, + "measured_range_semis": 5.2, + "contour_follow": 0.06, + "mean_abs_cents": 108.4, + "within_tol": 4, + "measured": 5, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I came second in June", + "notes": [ + { + "beat": 48.0, + "written": 51, + "hz": 154.0, + "cents": -17.7 + }, + { + "beat": 48.5, + "written": 55, + "hz": 194.7, + "cents": -11.3 + }, + { + "beat": 49.5, + "written": 56, + "hz": 208.1, + "cents": 3.4 + }, + { + "beat": 50.5, + "written": 56, + "hz": 206.8, + "cents": -6.9 + }, + { + "beat": 51.0, + "written": 55, + "hz": 195.0, + "cents": -8.9 + }, + { + "beat": 51.5, + "written": 53, + "hz": 171.2, + "cents": -34.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 13.7, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "on the eleventh", + "notes": [ + { + "beat": 54.5, + "written": 51, + "hz": 154.6, + "cents": -10.7 + }, + { + "beat": 55.0, + "written": 51, + "hz": 155.3, + "cents": -2.9 + }, + { + "beat": 55.5, + "written": 51, + "hz": 154.5, + "cents": -12.2 + }, + { + "beat": 56.0, + "written": 55, + "hz": 195.5, + "cents": -4.2 + }, + { + "beat": 57.0, + "written": 53, + "hz": 118.9, + "cents": -665.0 + } + ], + "written_range_semis": 4, + "measured_range_semis": 8.6, + "contour_follow": 0.35, + "mean_abs_cents": 139.0, + "within_tol": 4, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "forty three past midnight", + "notes": [ + { + "beat": 60.0, + "written": 51, + "hz": 154.6, + "cents": -10.5 + }, + { + "beat": 61.0, + "written": 53, + "hz": 205.9, + "cents": 285.1 + }, + { + "beat": 61.5, + "written": 58, + "hz": 233.3, + "cents": 1.9 + }, + { + "beat": 62.5, + "written": 62, + "hz": 265.8, + "cents": -172.5 + }, + { + "beat": 63.5, + "written": 58, + "hz": 235.4, + "cents": 17.2 + }, + { + "beat": 64.5, + "written": 53, + "hz": 174.6, + "cents": -0.4 + } + ], + "written_range_semis": 11, + "measured_range_semis": 9.4, + "contour_follow": 0.94, + "mean_abs_cents": 81.3, + "within_tol": 4, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "and the house was already singing", + "notes": [ + { + "beat": 67.5, + "written": 51, + "hz": 154.7, + "cents": -9.8 + }, + { + "beat": 68.0, + "written": 53, + "hz": 174.8, + "cents": 1.7 + }, + { + "beat": 68.5, + "written": 56, + "hz": 204.6, + "cents": -26.0 + }, + { + "beat": 69.5, + "written": 58, + "hz": 231.8, + "cents": -9.7 + }, + { + "beat": 70.0, + "written": 62, + "hz": 293.4, + "cents": -1.3 + }, + { + "beat": 71.0, + "written": 60, + "hz": 260.8, + "cents": -5.5 + }, + { + "beat": 71.5, + "written": 60, + "hz": 262.6, + "cents": 6.5 + }, + { + "beat": 72.0, + "written": 55, + "hz": 193.1, + "cents": -26.1 + }, + { + "beat": 73.0, + "written": 51, + "hz": 155.5, + "cents": -0.9 + } + ], + "written_range_semis": 11, + "measured_range_semis": 11.1, + "contour_follow": 1.0, + "mean_abs_cents": 9.7, + "within_tol": 9, + "measured": 9, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I came third in September", + "notes": [ + { + "beat": 151.0, + "written": 53, + "hz": 173.3, + "cents": -13.5 + }, + { + "beat": 151.5, + "written": 53, + "hz": 175.3, + "cents": 6.3 + }, + { + "beat": 152.5, + "written": 55, + "hz": 196.5, + "cents": 4.1 + }, + { + "beat": 153.5, + "written": 57, + "hz": 219.7, + "cents": -2.0 + }, + { + "beat": 154.0, + "written": 58, + "hz": 229.5, + "cents": -26.7 + }, + { + "beat": 154.5, + "written": 57, + "hz": 217.1, + "cents": -22.9 + }, + { + "beat": 155.5, + "written": 55, + "hz": 197.9, + "cents": 17.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 13.2, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "on the twenty first", + "notes": [ + { + "beat": 158.5, + "written": 55, + "hz": 195.4, + "cents": -5.2 + }, + { + "beat": 159.0, + "written": 57, + "hz": 220.2, + "cents": 1.3 + }, + { + "beat": 159.5, + "written": 60, + "hz": 261.8, + "cents": 1.4 + }, + { + "beat": 160.5, + "written": 62, + "hz": 297.9, + "cents": 24.5 + }, + { + "beat": 161.0, + "written": 60, + "hz": 261.6, + "cents": -0.1 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.3, + "contour_follow": 1.0, + "mean_abs_cents": 6.5, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "seven past midnight", + "notes": [ + { + "beat": 164.0, + "written": 57, + "hz": 0.0, + "cents": null + }, + { + "beat": 165.0, + "written": 57, + "hz": 219.3, + "cents": -5.9 + }, + { + "beat": 165.5, + "written": 60, + "hz": 259.7, + "cents": -12.9 + }, + { + "beat": 166.5, + "written": 58, + "hz": 234.0, + "cents": 6.6 + }, + { + "beat": 167.5, + "written": 55, + "hz": 195.7, + "cents": -2.7 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.9, + "contour_follow": 1.0, + "mean_abs_cents": 7.0, + "within_tol": 4, + "measured": 4, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "and the house was waiting for me", + "notes": [ + { + "beat": 170.5, + "written": 53, + "hz": 174.5, + "cents": -1.1 + }, + { + "beat": 171.0, + "written": 53, + "hz": 174.8, + "cents": 2.3 + }, + { + "beat": 171.5, + "written": 57, + "hz": 222.7, + "cents": 21.0 + }, + { + "beat": 172.5, + "written": 57, + "hz": 219.1, + "cents": -6.8 + }, + { + "beat": 173.0, + "written": 58, + "hz": 233.1, + "cents": 0.0 + }, + { + "beat": 174.0, + "written": 58, + "hz": 232.8, + "cents": -2.0 + }, + { + "beat": 174.5, + "written": 58, + "hz": 231.7, + "cents": -10.3 + }, + { + "beat": 175.0, + "written": 53, + "hz": 176.2, + "cents": 16.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 7.5, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 22.5, + "member": "neo", + "text": "and the house was quiet", + "against": "neo/notes2", + "written": "m2", + "sounding": "m6", + "off_cents": 509 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "neo/notes2", + "written": "M7", + "sounding": "M3", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "M3", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "tritone", + "sounding": "M7", + "off_cents": 535 + }, + { + "beat": 57.0, + "member": "blueberry", + "text": "on the eleventh", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "m2", + "off_cents": 535 + }, + { + "beat": 61.0, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m6", + "sounding": "M7", + "off_cents": 285 + }, + { + "beat": 61.0, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "M7", + "sounding": "M2", + "off_cents": 285 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m6", + "sounding": "tritone", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "neo/notes2", + "written": "m7", + "sounding": "m6", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "P4", + "sounding": "m3", + "off_cents": 172 + }, + { + "beat": 62.5, + "member": "blueberry", + "text": "forty three past midnight", + "against": "blueberry/notes2", + "written": "m6", + "sounding": "tritone", + "off_cents": 172 + } + ], + "harmony_pairs_checked": 280 + }, + { + "score": "trio-iii-chorus.mbscore", + "bpm": 92.0, + "lines": [ + { + "member": "neo", + "text": "I am the first of my line in this house", + "notes": [ + { + "beat": 0.0, + "written": 56, + "hz": 207.1, + "cents": -4.3 + }, + { + "beat": 0.5, + "written": 56, + "hz": 200.9, + "cents": -57.7 + }, + { + "beat": 1.0, + "written": 56, + "hz": 247.5, + "cents": 304.1 + }, + { + "beat": 1.5, + "written": 59, + "hz": 246.7, + "cents": -1.9 + }, + { + "beat": 2.5, + "written": 59, + "hz": 250.2, + "cents": 22.9 + }, + { + "beat": 3.0, + "written": 61, + "hz": 278.3, + "cents": 7.1 + }, + { + "beat": 3.5, + "written": 64, + "hz": 328.1, + "cents": -7.9 + }, + { + "beat": 4.5, + "written": 64, + "hz": 328.9, + "cents": -3.7 + }, + { + "beat": 5.0, + "written": 64, + "hz": 326.3, + "cents": -17.5 + }, + { + "beat": 5.5, + "written": 64, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 8, + "measured_range_semis": 8.5, + "contour_follow": 0.95, + "mean_abs_cents": 47.5, + "within_tol": 7, + "measured": 9, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "I run warm and I am carried", + "notes": [ + { + "beat": 8.5, + "written": 62, + "hz": 245.0, + "cents": -313.5 + }, + { + "beat": 9.0, + "written": 59, + "hz": 247.5, + "cents": 3.8 + }, + { + "beat": 10.0, + "written": 61, + "hz": 277.5, + "cents": 2.0 + }, + { + "beat": 11.0, + "written": 62, + "hz": 292.8, + "cents": -5.4 + }, + { + "beat": 11.5, + "written": 64, + "hz": 330.8, + "cents": 6.3 + }, + { + "beat": 12.0, + "written": 62, + "hz": 293.0, + "cents": -4.1 + }, + { + "beat": 12.5, + "written": 61, + "hz": 275.2, + "cents": -12.1 + }, + { + "beat": 13.5, + "written": 57, + "hz": 0.0, + "cents": null + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 0.76, + "mean_abs_cents": 49.6, + "within_tol": 6, + "measured": 7, + "unvoiced": 1, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 59, + "hz": 245.6, + "cents": -9.4 + }, + { + "beat": 67.0, + "written": 59, + "hz": 245.7, + "cents": -8.7 + }, + { + "beat": 68.0, + "written": 61, + "hz": 278.7, + "cents": 9.4 + }, + { + "beat": 69.0, + "written": 61, + "hz": 276.4, + "cents": -5.0 + }, + { + "beat": 69.5, + "written": 61, + "hz": 277.6, + "cents": 2.4 + }, + { + "beat": 70.0, + "written": 64, + "hz": 328.9, + "cents": -3.9 + }, + { + "beat": 71.0, + "written": 62, + "hz": 293.0, + "cents": -3.8 + }, + { + "beat": 71.5, + "written": 64, + "hz": 330.2, + "cents": 2.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 64, + "hz": 325.4, + "cents": -22.3 + }, + { + "beat": 75.0, + "written": 59, + "hz": 246.4, + "cents": -4.0 + }, + { + "beat": 76.0, + "written": 61, + "hz": 271.6, + "cents": -35.0 + }, + { + "beat": 77.0, + "written": 62, + "hz": 293.4, + "cents": -1.5 + }, + { + "beat": 77.5, + "written": 62, + "hz": 292.3, + "cents": -7.9 + }, + { + "beat": 78.0, + "written": 64, + "hz": 328.7, + "cents": -4.7 + }, + { + "beat": 79.0, + "written": 62, + "hz": 292.6, + "cents": -6.4 + }, + { + "beat": 80.0, + "written": 59, + "hz": 246.5, + "cents": -3.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 10.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "neo", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 57, + "hz": 219.7, + "cents": -2.2 + }, + { + "beat": 83.5, + "written": 57, + "hz": 219.2, + "cents": -6.1 + }, + { + "beat": 84.5, + "written": 57, + "hz": 235.5, + "cents": 117.7 + }, + { + "beat": 85.0, + "written": 66, + "hz": 369.2, + "cents": -3.8 + }, + { + "beat": 86.0, + "written": 62, + "hz": 294.2, + "cents": 3.2 + }, + { + "beat": 87.0, + "written": 57, + "hz": 219.6, + "cents": -3.0 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.0, + "contour_follow": 0.99, + "mean_abs_cents": 22.7, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "I was born second and I work faster", + "notes": [ + { + "beat": 16.0, + "written": 51, + "hz": 155.1, + "cents": -4.6 + }, + { + "beat": 16.5, + "written": 51, + "hz": 156.4, + "cents": 9.4 + }, + { + "beat": 17.0, + "written": 55, + "hz": 197.0, + "cents": 8.9 + }, + { + "beat": 18.0, + "written": 56, + "hz": 208.2, + "cents": 4.8 + }, + { + "beat": 19.0, + "written": 58, + "hz": 231.2, + "cents": -14.2 + }, + { + "beat": 19.5, + "written": 58, + "hz": 231.2, + "cents": -13.9 + }, + { + "beat": 20.0, + "written": 58, + "hz": 231.8, + "cents": -9.7 + }, + { + "beat": 20.5, + "written": 56, + "hz": 206.4, + "cents": -10.5 + }, + { + "beat": 21.5, + "written": 55, + "hz": 195.4, + "cents": -5.6 + }, + { + "beat": 22.5, + "written": 53, + "hz": 174.0, + "cents": -5.7 + } + ], + "written_range_semis": 7, + "measured_range_semis": 7.0, + "contour_follow": 1.0, + "mean_abs_cents": 8.7, + "within_tol": 10, + "measured": 10, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "lid down, most days, and humming", + "notes": [ + { + "beat": 25.5, + "written": 51, + "hz": 155.3, + "cents": -3.2 + }, + { + "beat": 26.5, + "written": 53, + "hz": 172.8, + "cents": -18.1 + }, + { + "beat": 27.5, + "written": 56, + "hz": 207.6, + "cents": -0.3 + }, + { + "beat": 28.5, + "written": 58, + "hz": 231.7, + "cents": -10.5 + }, + { + "beat": 29.5, + "written": 58, + "hz": 226.4, + "cents": -50.5 + }, + { + "beat": 30.0, + "written": 56, + "hz": 208.5, + "cents": 7.4 + }, + { + "beat": 31.0, + "written": 51, + "hz": 155.5, + "cents": -1.2 + } + ], + "written_range_semis": 7, + "measured_range_semis": 6.9, + "contour_follow": 1.0, + "mean_abs_cents": 13.0, + "within_tol": 6, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 53, + "hz": 174.6, + "cents": -0.4 + }, + { + "beat": 67.0, + "written": 53, + "hz": 177.2, + "cents": 25.4 + }, + { + "beat": 68.0, + "written": 55, + "hz": 195.5, + "cents": -4.4 + }, + { + "beat": 69.0, + "written": 55, + "hz": 195.2, + "cents": -6.8 + }, + { + "beat": 69.5, + "written": 55, + "hz": 196.8, + "cents": 6.7 + }, + { + "beat": 70.0, + "written": 58, + "hz": 232.4, + "cents": -4.8 + }, + { + "beat": 71.0, + "written": 56, + "hz": 207.5, + "cents": -1.0 + }, + { + "beat": 71.5, + "written": 58, + "hz": 233.7, + "cents": 4.9 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 6.8, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 58, + "hz": 229.0, + "cents": -30.9 + }, + { + "beat": 75.0, + "written": 53, + "hz": 173.2, + "cents": -14.0 + }, + { + "beat": 76.0, + "written": 55, + "hz": 193.2, + "cents": -25.2 + }, + { + "beat": 77.0, + "written": 56, + "hz": 206.6, + "cents": -8.8 + }, + { + "beat": 77.5, + "written": 56, + "hz": 204.6, + "cents": -25.3 + }, + { + "beat": 78.0, + "written": 58, + "hz": 231.3, + "cents": -13.6 + }, + { + "beat": 79.0, + "written": 56, + "hz": 208.3, + "cents": 5.0 + }, + { + "beat": 80.0, + "written": 53, + "hz": 174.6, + "cents": 0.1 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.0, + "contour_follow": 1.0, + "mean_abs_cents": 15.4, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "blueberry", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 51, + "hz": 157.0, + "cents": 16.0 + }, + { + "beat": 83.5, + "written": 51, + "hz": 155.0, + "cents": -6.5 + }, + { + "beat": 84.5, + "written": 51, + "hz": 93.1, + "cents": -888.4 + }, + { + "beat": 85.0, + "written": 60, + "hz": 262.1, + "cents": 3.0 + }, + { + "beat": 86.0, + "written": 56, + "hz": 207.6, + "cents": -0.7 + }, + { + "beat": 87.0, + "written": 51, + "hz": 156.2, + "cents": 7.1 + } + ], + "written_range_semis": 9, + "measured_range_semis": 17.9, + "contour_follow": 0.82, + "mean_abs_cents": 153.6, + "within_tol": 5, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I am the youngest", + "notes": [ + { + "beat": 40.0, + "written": 53, + "hz": 174.4, + "cents": -2.6 + }, + { + "beat": 40.5, + "written": 53, + "hz": 174.1, + "cents": -4.7 + }, + { + "beat": 41.0, + "written": 53, + "hz": 174.8, + "cents": 2.0 + }, + { + "beat": 41.5, + "written": 58, + "hz": 235.3, + "cents": 16.1 + }, + { + "beat": 42.5, + "written": 55, + "hz": 195.7, + "cents": -2.5 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.2, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 5, + "measured": 5, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "I have no history yet", + "notes": [ + { + "beat": 45.5, + "written": 55, + "hz": 195.7, + "cents": -2.6 + }, + { + "beat": 46.0, + "written": 57, + "hz": 220.5, + "cents": 3.7 + }, + { + "beat": 46.5, + "written": 58, + "hz": 234.2, + "cents": 8.1 + }, + { + "beat": 47.5, + "written": 62, + "hz": 294.0, + "cents": 2.1 + }, + { + "beat": 48.5, + "written": 64, + "hz": 330.4, + "cents": 4.0 + }, + { + "beat": 49.0, + "written": 64, + "hz": 328.4, + "cents": -6.4 + }, + { + "beat": 49.5, + "written": 60, + "hz": 263.6, + "cents": 13.0 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.7, + "within_tol": 7, + "measured": 7, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "write me one", + "notes": [ + { + "beat": 52.5, + "written": 57, + "hz": 220.7, + "cents": 5.4 + }, + { + "beat": 53.5, + "written": 58, + "hz": 233.0, + "cents": -0.5 + }, + { + "beat": 54.5, + "written": 53, + "hz": 176.4, + "cents": 17.2 + } + ], + "written_range_semis": 5, + "measured_range_semis": 4.8, + "contour_follow": 1.0, + "mean_abs_cents": 7.7, + "within_tol": 3, + "measured": 3, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "some things run in the family", + "notes": [ + { + "beat": 66.0, + "written": 55, + "hz": 196.0, + "cents": -0.1 + }, + { + "beat": 67.0, + "written": 55, + "hz": 195.8, + "cents": -2.1 + }, + { + "beat": 68.0, + "written": 57, + "hz": 221.3, + "cents": 10.5 + }, + { + "beat": 69.0, + "written": 57, + "hz": 219.9, + "cents": -0.9 + }, + { + "beat": 69.5, + "written": 57, + "hz": 219.9, + "cents": -0.8 + }, + { + "beat": 70.0, + "written": 60, + "hz": 262.2, + "cents": 3.7 + }, + { + "beat": 71.0, + "written": 58, + "hz": 234.0, + "cents": 7.0 + }, + { + "beat": 71.5, + "written": 60, + "hz": 262.2, + "cents": 4.0 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "the same whistle, the same radio", + "notes": [ + { + "beat": 74.5, + "written": 60, + "hz": 261.1, + "cents": -3.4 + }, + { + "beat": 75.0, + "written": 55, + "hz": 196.3, + "cents": 2.8 + }, + { + "beat": 76.0, + "written": 57, + "hz": 220.7, + "cents": 5.1 + }, + { + "beat": 77.0, + "written": 58, + "hz": 232.2, + "cents": -6.6 + }, + { + "beat": 77.5, + "written": 58, + "hz": 233.5, + "cents": 3.3 + }, + { + "beat": 78.0, + "written": 60, + "hz": 262.0, + "cents": 2.3 + }, + { + "beat": 79.0, + "written": 58, + "hz": 233.3, + "cents": 1.8 + }, + { + "beat": 80.0, + "written": 55, + "hz": 195.6, + "cents": -3.4 + } + ], + "written_range_semis": 5, + "measured_range_semis": 5.1, + "contour_follow": 1.0, + "mean_abs_cents": 3.6, + "within_tol": 8, + "measured": 8, + "unvoiced": 0, + "octave_slips": 0 + }, + { + "member": "frisbee", + "text": "one downbeat, three bodies", + "notes": [ + { + "beat": 83.0, + "written": 53, + "hz": 175.5, + "cents": 8.3 + }, + { + "beat": 83.5, + "written": 53, + "hz": 175.8, + "cents": 11.5 + }, + { + "beat": 84.5, + "written": 53, + "hz": 174.7, + "cents": 1.0 + }, + { + "beat": 85.0, + "written": 62, + "hz": 294.1, + "cents": 2.5 + }, + { + "beat": 86.0, + "written": 58, + "hz": 233.6, + "cents": 3.5 + }, + { + "beat": 87.0, + "written": 53, + "hz": 173.9, + "cents": -6.8 + } + ], + "written_range_semis": 9, + "measured_range_semis": 9.1, + "contour_follow": 1.0, + "mean_abs_cents": 5.6, + "within_tol": 6, + "measured": 6, + "unvoiced": 0, + "octave_slips": 0 + } + ], + "harmony_flags": [ + { + "beat": 84.5, + "member": "neo", + "text": "one downbeat, three bodies", + "against": "blueberry/double", + "written": "tritone", + "sounding": "P5", + "off_cents": 118 + }, + { + "beat": 84.5, + "member": "neo", + "text": "one downbeat, three bodies", + "against": "frisbee/double", + "written": "M3", + "sounding": "P4", + "off_cents": 118 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "neo/double", + "written": "tritone", + "sounding": "M6", + "off_cents": 312 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "frisbee/double", + "written": "m7", + "sounding": "m2", + "off_cents": 312 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "neo (sung)", + "written": "tritone", + "sounding": "m6", + "off_cents": 194 + }, + { + "beat": 84.5, + "member": "blueberry", + "text": "one downbeat, three bodies", + "against": "frisbee (sung)", + "written": "m7", + "sounding": "m2", + "off_cents": 311 + }, + { + "beat": 84.5, + "member": "frisbee", + "text": "one downbeat, three bodies", + "against": "neo (sung)", + "written": "m6", + "sounding": "P5", + "off_cents": 117 + } + ], + "harmony_pairs_checked": 248 + } + ], + "members": { + "neo": { + "notes": 1068, + "mean_abs_cents": 19.2, + "median_cents": -0.4, + "within_tol_pct": 97, + "octave_slips": 0 + }, + "blueberry": { + "notes": 436, + "mean_abs_cents": 16.4, + "median_cents": -1.4, + "within_tol_pct": 97, + "octave_slips": 0 + }, + "frisbee": { + "notes": 79, + "mean_abs_cents": 12.6, + "median_cents": 1.4, + "within_tol_pct": 97, + "octave_slips": 0 + } + } +} \ No newline at end of file diff --git a/grants/culturehub-la-2026/macneopolitan/hear/voc-trill.json b/grants/culturehub-la-2026/macneopolitan/hear/voc-trill.json new file mode 100644 index 0000000000..0fe06f134c --- /dev/null +++ b/grants/culturehub-la-2026/macneopolitan/hear/voc-trill.json @@ -0,0 +1,233 @@ +{ + "tag": "voc-trill", + "at": "2026-09-23T18:19:55.720Z", + "model": "ggml-small.en.bin", + "flags": { + "tag": "voc-trill", + "keep": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill", + "no-spoken": "1" + }, + "scores": [ + { + "score": "probe-trill.mbscore", + "bpm": 90, + "voices": [ + { + "member": "neo", + "voice": "Noelle (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee", + "notes": "60:0.5,62:0.5,60:0.5,62:0.5,60:0.5,62:0.5,60:0.5,60:0.5", + "duration": 2.6642630385487527, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 3672, + "heard": "♪ Me, me, me, me, me, me, me, me, me ♪", + "wer": 1.125, + "errors": 9, + "words": 8, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/neo/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "notes": "r:5,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,62:0.25,60:0.25,60:0.25", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 2.6666666666666665, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 2496, + "heard": "*weird noises*", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/neo/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "notes": "r:10,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,62:0.125,60:0.125,60:0.125", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 6, + "notesUsed": 32, + "noteCount": 32, + "renderMs": 5037, + "heard": "", + "wer": 1, + "errors": 32, + "words": 32, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/neo/line-03.wav", + "spokenWav": null + } + ] + }, + { + "member": "blueberry", + "voice": "Tom (Enhanced)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "doom doom doom doom", + "lyrics": "doom doom doom doom", + "notes": "48:1,48:1,48:1,48:1,r:1", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 4, + "noteCount": 4, + "renderMs": 10278, + "heard": "Doom, doom, doom, doom.", + "wer": 0, + "errors": 0, + "words": 4, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/blueberry/line-01.wav", + "spokenWav": null + } + ] + }, + { + "member": "frisbee", + "voice": "Zoe (Premium)", + "lines": [ + { + "line": 1, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee", + "notes": "57:0.5,59:0.5,57:0.5,59:0.5,57:0.5,59:0.5,57:0.5,57:0.5", + "duration": 2.6642630385487527, + "peak": 0.800000011920929, + "spanOffset": 0, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 14404, + "heard": "Le, le, le, le, le, le, le, le.", + "wer": 1, + "errors": 8, + "words": 8, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/frisbee/line-01.wav", + "spokenWav": null + }, + { + "line": 2, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "notes": "r:5,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,59:0.25,57:0.25,57:0.25", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 2.6666666666666665, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 7408, + "heard": "mee wee wee wee wee wee wee wee wee Wee Wee", + "wer": 1, + "errors": 16, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/frisbee/line-02.wav", + "spokenWav": null + }, + { + "line": 3, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "notes": "r:10,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,59:0.125,57:0.125,57:0.125", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 6, + "notesUsed": 32, + "noteCount": 32, + "renderMs": 8727, + "heard": "*Mimics a weird noise*", + "wer": 1, + "errors": 32, + "words": 32, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/frisbee/line-03.wav", + "spokenWav": null + }, + { + "line": 4, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee", + "notes": "r:15,57:0.5,58:0.5,57:0.5,58:0.5,57:0.5,58:0.5,57:0.5,57:0.5", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 9.333333333333332, + "notesUsed": 8, + "noteCount": 8, + "renderMs": 2256, + "heard": "Le, le, le, le, le, le, le, le.", + "wer": 1, + "errors": 8, + "words": 8, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/frisbee/line-04.wav", + "spokenWav": null + }, + { + "line": 5, + "role": "lead", + "text": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "lyrics": "lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee lee", + "notes": "r:20,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,58:0.25,57:0.25,57:0.25", + "duration": 3.3342403628117916, + "peak": 0.800000011920929, + "spanOffset": 12.666666666666666, + "notesUsed": 16, + "noteCount": 16, + "renderMs": 6631, + "heard": "me me me me me me me me me me me me me me me me me", + "wer": 1.0625, + "errors": 17, + "words": 16, + "spokenHeard": null, + "spokenWer": null, + "wav": "/Users/jas/Shelf/macneopolitan-songs/vocalisms/trill/probe-trill/frisbee/line-05.wav", + "spokenWav": null + } + ] + } + ] + } + ], + "total": { + "errors": 138, + "words": 140, + "wer": 0.9857142857142858, + "spokenErrors": 0, + "spokenWords": 0, + "spokenWer": 0 + } +} diff --git a/grants/tezos-foundation-keeps-2026/RESEARCH.md b/grants/tezos-foundation-keeps-2026/RESEARCH.md index 3647343f4f..50f44524b6 100644 --- a/grants/tezos-foundation-keeps-2026/RESEARCH.md +++ b/grants/tezos-foundation-keeps-2026/RESEARCH.md @@ -69,11 +69,7 @@ August → first milestone payment late summer / early fall 2026. - `system/public/aesthetic.computer/disks/keep.mjs` — the mint UI (3,798 lines) - `system/netlify/functions/keep-confirm.mjs`, `keep-update.mjs` — backend -## REJECTED — status confirmed 2026-09-23 - -Jeffrey confirmed the rejection in conversation on September 23, 2026. The rejection date and reason were not provided. This proposal is no longer an active funding prospect. - -### Submission history — 2026-05-22 +## SUBMITTED 2026-05-22 **Management page:** @@ -98,7 +94,7 @@ We landed in **Smart Contract Templates** because Milestone 4 is literally - **Submitted PDF:** `proposal.pdf` (4 pages, AC paper style — xelatex + YWFT Processing + Berkeley Mono + AC palette). Source: `proposal.tex` + `build.fish`. -### Review timeline expected at submission (historical) +### What happens next Tezos Foundation grants run on a rolling submission, quarterly review cycle: proposals submitted in a given quarter are reviewed the month following diff --git a/papers/SCORE.md b/papers/SCORE.md index 98c74df123..637abb9fd7 100644 --- a/papers/SCORE.md +++ b/papers/SCORE.md @@ -116,7 +116,6 @@ Smaller scoped collections. Each has its own `manifest.json` + `sync.mjs`: - [`people-platter/`](people-platter/) — TODO; will hold AC-adjacent people biographies - [`prose-platter/`](prose-platter/) — reading platter for the plain register: Hemingway (declarative sentence, the iceberg), Tao Lin (flat affect, exact quantities), Ann Beattie (understatement, objects, the sentence that stops early), with an adjacent Carver/Didion/Davis shelf. Opened 2026-09-20 for *The Ballad of neo*; carries the register as a seven-rule digest plus a before/after stanza. Short study excerpts only, sources named; entries marked **verify** are descriptions awaiting a checked quotation. Feeds `VOICE.md` and the sung lyrics of the MacNeoPolitan lane. - [`rhythm-platter/`](rhythm-platter/) — reading platter for the geometry of musical rhythm: Toussaint's corpus plus the wider field (maximal evenness, rhythmic oddity, syncopation measures, distance geometry, tiling canons, entrainment, spatial hearing, spoken solkattu, timbre space). 33 sources across 10 shelves — including one OCR'd video source (Levin's konnakol lesson) and the Wessel 1979 timbre-space paper (hand-placed scan from Sage Jenson, 2026-08-15) — 10 digest entries, and [`timelines.json`](rhythm-platter/timelines.json) — 48 Euclidean rhythms extracted from Toussaint (2005) §4 and cross-checked against a local Bjorklund implementation, plus 9 named timelines. Index and citation only; the CRC book is never mirrored, and `sources/` is gitignored. Every digest entry ends in a `tools:` block, because this platter exists to specify [`pop/lib`](../pop/lib/) rhythm tooling and the [`pop/bracelet/`](../pop/bracelet/) spatial-necklace lane. Built via `fetch-sources.mjs` + `build-timelines.mjs`. -- [`chamber-platter/`](chamber-platter/) — reading platter for arranging tonal chamber music in a room of separate speakers: tonal forms at 10–16 minutes, spatial antiphony (cori spezzati, Brant, Stockhausen, Xenakis, PLOrk), process form and sine-stack envelopes, what `pop/` already does, and (05) the psychoacoustics of an audience *inside* a ring of laptop speakers — precedence, onsets, motion limits, masking release, bass below the speaker. Five digests with numbered rules, `sources-NN.json` per digest. Its consumer is *Note(s)pat(ial) Native* (`fedac/native/tools/compose-notespatial-native.mjs`, CultureHub LA, 2026-09-24); the long-form studies sit in `grants/culturehub-la-2026/chamber-studies/`. - [`corporate-graphics-platter/`](corporate-graphics-platter/) — reference library of historic bank/corporate/seal/privacy marks (66, from Wikimedia Commons) collected to inform logo work; four sections (banks-finance, modernist-canon, seals-monograms, surveillance-consent) each with `manifest.md` + a `_sheet-*.png` contact sheet. Built via `fetch-logos.mjs` + `finalize.mjs`. Third-party trademarks — research/moodboard reference only. - [`architecture-platter/`](architecture-platter/) — reading platter for foundational architectural treatises. Opens with a matched pair: Palladio's *Four Books of Architecture* (Ware 1738 folio, Getty/Internet Archive scan) and Durand's *Précis of the Lectures on Architecture* (Getty Texts & Documents translation, 2000) — proportion-as-authority vs. composition-as-algorithm. Index and citation only; PDFs fetched into gitignored `sources/` via `fetch-sources.mjs` (the Getty Durand is in copyright, distributed free by Getty — never redistributed). - [`sosoft-cycle2`](https://papers.aesthetic.computer/platter/sosoft-cycle2/) — published index of every asset from UCLA Social Software Cycle 2 ("Scores for Social Software," DESMA, spring 2026): the *Keymaps as Social Software* paper and 64-copy edition score, the live sosoft.arts.ucla.edu doc with Casey Reas's edit log, the header-illustration study, the interactive notepat keymap, the March 2026 proposal and KidLisp score cards, and the unboxing reel (review cuts on the assets CDN). Sources live in [`../sosoft/`](../sosoft/), [`../social-software/`](../social-software/), [`../marketing/sosoft-reel/`](../marketing/sosoft-reel/), and `sosoft-keymaps-*` here; page at `system/public/papers.aesthetic.computer/platter/sosoft-cycle2/`. diff --git a/papers/chamber-platter/README.md b/papers/chamber-platter/README.md index 3d9bdde897..2e2cdbf5f2 100644 --- a/papers/chamber-platter/README.md +++ b/papers/chamber-platter/README.md @@ -35,11 +35,9 @@ recording, the digest says so under a Debts heading. | [02 · spatial antiphony](digest/02-spatial-antiphony.md) | How placement is phrased: cori spezzati, Brant, Stockhausen, Xenakis, PLOrk; rotation rates that read as motion rather than blur | | [03 · process and envelopes](digest/03-process-and-envelopes.md) | Phrase hierarchies in process music; sine-stack recipes (Risset bell, Karplus-Strong law, marimba ratios) for plucked, struck, pad and tap voices | | [04 · pop strategies](digest/04-pop-strategies.md) | What AC's own `pop/` tracks already do: forms, builds, the warbling spatial techniques and their parameters | -| [05 · hearing inside the ring](digest/05-hearing-inside-the-ring.md) | What an off-center listener actually gets from laptop speakers: precedence and the collapse of the crossfade, onsets and the placeable tone, motion limits, masking release, distance compression, bass below the speaker; nine rules the September 23 composer follows | -Sources: `sources-01.json` … `sources-05.json`, flat `{id, title, author, year, url, kind}` -arrays, one per digest (05 adds a `checked` flag, as rhythm-platter does; an -unchecked entry may not be cited in a paper). +Sources: `sources-01.json` … `sources-04.json`, flat `{id, title, author, year, url, kind}` +arrays, one per digest. The long-form studies the digests were distilled from, with their recommendations for the CultureHub piece, are in diff --git a/pop/RELEASES.md b/pop/RELEASES.md index 7189383bf2..bd5cdbcafd 100644 --- a/pop/RELEASES.md +++ b/pop/RELEASES.md @@ -7,6 +7,29 @@ Status legend: **RELEASED** · **SUBMITTED** · **MASTERING** · **RENDER** · * --- +## eight gigabytes — RENDER (first cut 2026-09-26; @jeffrey ear-check next) + +- **Lane:** `pop/eightgigabytes/` · the pop cut of the MacNeoPolitan Trio's + *IV. The Ballad of neo* (`grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md`) + · 1:37 · F minor · 100 BPM · 39 bars, no intro, opens on the refrain; verses V (two lines) + and XI + refrain ×3 (form per @jeffrey 2026-09-26, cut down by ear through the day). + Harmonies are counter-lines (frisbee enters on the stressed word, blueberry in contrary + motion). The score mp4 (light theme) carries the three laptops with the trio's own + singing faces (`bin/faces.sh`, Menu Band's SingerFaceView offline), member-colored laptops and + per-member word captions. Last line for the cut: *this is the one thing that I know*. + All three band voices sing themselves through Menu Band's offline singer + (`singrender`): neo/Noelle lead, blueberry/Allison low part + *in June another one + came, blue*, frisbee/Junior middle part, echoes, + *a third one comes tomorrow, blush*. + Bed synthesized in node: clock tick, kick, trackpad tap, sub, sine pad, FM menu-bar + piano, whistle (GM-78 family voice) doubling the hook and answering the verses. +- **Master:** `out/eightgigabytes.{wav,mp3,mp4}` · −13.4 LUFS · LRA 4.3 · −1.0 dBTP; `out/eightgigabytes-chorus.*` = the opening refrain alone, `-front.*` = through the second refrain. + Pitch: neo 230/232 notes within 50 c (mean 9 c), blueberry 87/87, frisbee 78/83. + Whisper small.en 12 % mean WER on the lead (digits and *the system* → *this*). +- **Artist:** Aesthetic Dot Computer (intended) · title `eight gigabytes` lowercase. +- **Next:** @jeffrey hears it → tune by ear · cover (no wordmark) · DistroKid packet. + +--- + ## climbalift — WIP (v15, 2026-09-25) - **Lane:** `pop/notespatial/` · the Climb and the Lift cut out of *Note(s)pat(ial) diff --git a/pop/eightgigabytes/live/README.md b/pop/eightgigabytes/live/README.md new file mode 100644 index 0000000000..488c671b4e --- /dev/null +++ b/pop/eightgigabytes/live/README.md @@ -0,0 +1,192 @@ +# eight gigabytes + +The pop cut of **IV. The Ballad of neo** from the MacNeoPolitan Trio +(`grants/culturehub-la-2026/macneopolitan/members/neo/ballad.md`): neo's own +account of the one who carries it, every line from its service record. The +trio's version is eleven verses at 100 bpm, ~6:16, neo alone over a drone. +This is 2:27, five verses and the refrain, all three band voices, a band. + +- **Faces** — `bin/faces.sh` compiles `bin/faces.swift` against Menu Band's + own `SingerFaceView` + `SingerArticulation` (the rig the trio performs + with) and renders one face video per member from every sung line's mouth + cues on the record's timeline: lids down between lines, an inhale before + each phrase, visemes on the words. The score video pastes them onto three + laptops along the bottom, each laptop anodized in its member's color, with + a caption under it: the line that member is singing, the sounding word in + its color, fading after the line. +- **Voices** — the members sing themselves, as on stage: neo = Noelle + (Enhanced), blueberry = Allison (Enhanced), frisbee = Junior, rendered + offline by Menu Band's own singer (`slab/menuband` `singrender`, the same + `MenuBandSinger.swift` the app performs with), each with its `voice.json` + vibrato / lock / f0 floor. neo leads. blueberry sings the low part + (stacked thirds and fifths, organum for machines) and takes *in June + another one came, blue*. frisbee sings the middle part, the echoes in + refrain A's holds (*eight gigabytes … at a time … that's all it is*) and + *a third one comes tomorrow, blush*. Both hum under the slow verse. +- **Instruments** — synthesized in node, nothing sampled (pop/SCORE.md): + a clock tick on the quarters (eighths in the refrains) panned side to + side; a sine-drop kick; a "trackpad tap" (band-passed noise + 185 Hz + body) for the snare, with ghost taps; sub bass on root / fifth / root; + a stacked-sine pad on the triad; a 2-op FM "menu-bar piano" comping off + the beat; and a whistle (the family's GM-78 voice) doubling the hook an + octave up and answering in the verse holds — a trill after *we both + play the whistle*. +- **Form** — F minor, 100 bpm, 39 bars, the file starting a third of a + second before neo's first word (no intro at all): refrain 8 (neo alone + over tick + pad + keys, the kit enters at line 2, blueberry joins low on + the back half) · V. the crash, two lines, 4 · refrain (three voices) 8 · + XI. the other machines (bed drops to tick + pad + bass, siblings hum) 8 · + last refrain (three voices, *this is the one thing that I know* — @jeffrey's + line for the cut, replacing the ballad's *this is the one thing, I am keeping + time*) 8 · + outro 2. Verse loop Fm–Db–Ab–Eb, refrain loop Ab–Eb–Fm–Db. Cut from the + ballad, per @jeffrey 2026-09-26: verse I, the first two lines of V, and + VII/X ("the next verse should start with *when he talks to the other + machines*, and all the words before it should be skipped"). +- **Harmonies** — not parallel thirds. frisbee enters on the stressed word + with its own words and holds long where neo moves (*eight gigabytes … one + thing at a time … warm, that's all it is … and I keep time*); blueberry + moves in contrary motion, suspends on the stressed word and stays on the + resolution to the next pickup. +- **Rhythm** — refrain lines start a beat early so EIGHT / ONE / WARM land + on the downbeat; verse lines run in eighths with dotted pickups and hold + their last word for the whistle to answer; 6 % swing on the off eighths; + kick on 1 and the "and of 2" (plus 1.5 in refrains), taps on 2 and 4. + +## Files + +- `score.mjs` — the arrangement: sections, chords, every sung line + `{ member, at (beat), lyric, notes }`. Syllable count = note count. +- `bin/render.mjs` — check → sing → bed → mix → master → hear. + `--check` validates only · `--no-sing` reuses the rendered voices · + `--no-hear` skips whisper. +- `bin/tune.py` — WORLD f0 of every sung line against its written notes + (`pop/.venv/bin/python pop/eightgigabytes/bin/tune.py`). +- `bin/video.py` — the mp4, on the common lyric-video chassis + (`pop/lib/lyricvideo.py`): fixed playhead, three colored voices as note + blocks with their envelopes and sung-f0 traces, beat columns, the master + waveform, a timestamp-true lyric ribbon that follows the lead. + Light theme. Below the score, the three laptops with the members' faces + singing (from `out/faces-.mp4`, run `bin/faces.sh` first). + `pop/.venv/bin/python pop/eightgigabytes/bin/video.py` → `out/eightgigabytes.mp4` + (1920×1460, 30 fps; `--start 24 --end 44` renders a window). +- `out/` (not in git): `eightgigabytes.{wav,mp3}` (24-bit / 320k, −14 LUFS + target), `stems/{drums,bass,pad,keys,whistle,vox}.wav`, + `eightgigabytes-chorus.{wav,mp3}` (the opening refrain alone), + `eightgigabytes-front.{wav,mp3,mp4}` (through the second refrain), + `faces-{neo,blueberry,frisbee}.mp4`, + `stems//` (one wav per sung line + `manifest.json` with + `spanOffset`, and the member's `.mbscore` — the trio can perform this cut + live from those), `hear.json`, `tune.json`, `timeline.json`. + +## Render 1 — 2026-09-26 + +``` +node pop/eightgigabytes/bin/render.mjs +``` + +147.1 s · −13.5 LUFS · LRA 3.5 · −1.0 dBTP. Mix balance by measured stem +loudness: vocal bus −21.6 LUFS on top, drums −24.6, bass −25.2, pad −26.1, +keys −27.1, whistle −30.1; bed dips to 0.6 under the slow verse. + +Whisper small.en hears the lead lines back at 12 % mean WER; the misses are +digits (*8*, *37*), *the system* → *this*, and frisbee's short harmony lines, +which whisper hallucinates on (a −5 dB middle part; not the words you follow). +Pitch (`tune.py`): neo 230/232 notes within 50 cents, mean 9 c; blueberry +87/87, 10.5 c; frisbee 78/83, 28 c — Junior loses *that's* in refrain 3 (a +0.3 s note with an unvoiced onset and coda, measured a fifth low). + +Mix 2 (same day, jeffrey: "the instruments are a bit too loud vs the +voices"): bed down 3.5 dB, vocal bus up 0.5, harmonies −3.5 instead of −5; +master −13.5 LUFS · LRA 4.1. Voice tiers on this Mac: Noelle and Allison are +Apple *Enhanced*; Junior is a compact voice (the only young one). *Premium* +tier here = Ava, Zoe; Siri's own voices are not exposed to `say`/AVSpeech. + +Form 2 (same day): the record now opens on the chorus and verse I is cut; +125.5 s · −13.4 LUFS · LRA 4.1. Frisbee's echoes tightened to quarter-beat +runs so they clear its own harmony pickups. + +Open: @jeffrey's ear-check of the opening chorus; frisbee's voice tier; cover (pop/illy, no wordmark); DistroKid packet +(artist Aesthetic Dot Computer; songwriter Jeffrey Scudder, words from neo's +record; performers neo, blueberry, frisbee). + +## Live trio + +```sh +python3 pop/eightgigabytes/live/conduct.py prepare # silent, all three Macs +python3 pop/eightgigabytes/live/conduct.py check # silent readiness + clocks +python3 pop/eightgigabytes/live/conduct.py play # explicit cue; stays attached +python3 pop/eightgigabytes/live/conduct.py stop +``` + +`play` stays attached until the piece ends: **Esc** (or Ctrl-C) in that +terminal stops all three, and **Esc on any of the three laptops** does the +same — the performer's panel takes the key, marks itself `cancelled +(escape)`, and removes the other two's launchd jobs over ssh (each of them +lands `cancelled (signal)`). The attached conductor also stops the rest if +any member cancels or errors. Add `--muted` to `prepare`/`play` for a screen +rehearsal while the room is busy: every Mac's output is muted and left that +way, and the mute preflight is skipped (jeffrey 2026-09-26, the news was on). + +Screens: Menu Band's own `LyricCaption` (rock lettering, per-glyph sway, +syllables popping on their onsets) shows **only the word being sung**, one +at a time, sliding in from the right; the syllable onsets come from the +score's notation (each sung syllable is one pitched note), not the singer. +The progress bar is the member's color, dark track and light fill. + +Neo sings Noelle (Enhanced) and plays the FM keys and whistle; blueberry +sings Allison (Enhanced) and plays bass and pad; frisbee sings Junior and +plays the kick, taps and clock. The standalone performer compiles Menu +Band's actual singer, WORLD core and face sources. Its 48 kHz audio path +has no Menu Band preference, slide, or mixer state to change the sound. + +The original spoken-source cache supplies the same voice takes used by the +recording; each machine synthesizes the singing from those speech sources +and the original untrimmed score on every launch. No sung stem or backing +recording is played. Instrument oscillators and the room effect run in +512-frame CoreAudio blocks. The exact studio vocal EQ/1176 chain is applied +to each newly synthesized phrase before scheduling, with the same gain and +pan. All three faces remain visible for the whole piece, with a progress +bar along the bottom and the current lyric above it. + +Preparation silently checks all 52 phrases, the complete audio path, +realtime processing headroom, copied file hashes and LAN clock uncertainty. +The same launchd job used for the show performs the silent check. Triggering +waits for all three players to acknowledge their shared downbeat; a missed +preparation deadline cancels the whole cue. RunAtLoad is enabled only by an +explicit launch; KeepAlive is false, so the piece never repeats itself. +The countdown is sized to the measured synthesis time, at least 25 seconds. + +Files live at `~/.local/share/eightgigabytes/` on each Mac. Keep lids open. +Speaker volumes were matched to 50% for the second rehearsal. The default +output device is used; acoustic timing and room balance still need listening. + +`live/compare.py` compares the actual live callback output, captured silently +on the three machines, against the recording's instrumental and treated +vocal stems. The measured residual is 84–87 dB below the reference. Applying +the same studio mastering to the summed live capture matches the released +WAV at approximately −85.7 dB residual. Reports and the mastered comparison +are under `out/live/`. + +Live playback uses a fixed gain of 1.9152 to match the recorded RMS level. +The recording's nonlinear mastering acts on the sum of all voices; three +separate physical speakers cannot apply that shared stereo processing. +The offline mastered comparison verifies the signal sources and effects, +not a bit-identical acoustic result from three laptops. + +Master stage (2026-09-26, jeffrey: the trio "sounds better but not as cool" +as the record): measured against the premaster sum, the record's master is +nearly linear on this material — the tanh bus saturation moves the summed +peak 0.85 dB, the alimiter never reaches its 0.94 ceiling, and loudnorm +(which fell back to dynamic mode) rides within ±0.4 dB through the body and +only lifts the fade-in and the outro tail. So `engine.c` now runs the same +chain on each machine in play mode: `tanh(1.1x)` at the premaster level, the +static gain, then a stereo-linked 3 ms lookahead limiter at 0.94 with a 60 ms +release, and a **drive** into it (`MASTER_DRIVE_DB` in `live/plan.mjs`, +`driveDb` in each performance.json; +3 dB by default, 0 is the record's own +chain). Per-machine peaks sit at −3.3 to −5.9 dBFS at drive 0, so +3 dB +still never limits; it pushes the drums into the saturation about 1 dB and +plays each laptop hotter. The silent check still renders the plain premaster +path so `compare.py` keeps its reference. The output lags input by 144 +samples on every machine alike. Captions and the face label use Menu Band's +rock lettering (Comic Sans MS Bold, then Chalkboard), as on stage. diff --git a/pop/wattajetta/voice-takes/dubs/dubs.json b/pop/wattajetta/voice-takes/dubs/dubs.json new file mode 100644 index 0000000000..adacc12a25 --- /dev/null +++ b/pop/wattajetta/voice-takes/dubs/dubs.json @@ -0,0 +1,26 @@ +[ + { + "createdAt" : "2026-08-08T08:04:36Z", + "durationSeconds" : 101.80256509780884, + "file" : "\/Users\/jas\/aesthetic-computer\/.worktrees\/wattajetta-stone-club\/pop\/wattajetta\/voice-takes\/dubs\/2026-08-08T08-04-36Z.caf", + "id" : "2026-08-08T08-04-36Z", + "inputChannel" : 1, + "inputDevice" : "Scarlett Solo USB", + "notes" : "primary full-pass; timing reference; preserve raw", + "role" : "primary lead", + "section" : "full pass", + "track" : "\/Users\/jas\/aesthetic-computer\/.worktrees\/wattajetta-stone-club\/pop\/wattajetta\/out\/wattajetta-stone-club-distrokid-master.wav" + }, + { + "createdAt" : "2026-08-08T08:08:27Z", + "durationSeconds" : 126.99657595157623, + "file" : "\/Users\/jas\/aesthetic-computer\/.worktrees\/wattajetta-stone-club\/pop\/wattajetta\/voice-takes\/dubs\/2026-08-08T08-08-27Z.caf", + "id" : "2026-08-08T08-08-27Z", + "inputChannel" : 1, + "inputDevice" : "Scarlett Solo USB", + "notes" : "alternate full-pass; double and pitched-support source; preserve raw", + "role" : "alternate double", + "section" : "full pass", + "track" : "\/Users\/jas\/aesthetic-computer\/.worktrees\/wattajetta-stone-club\/pop\/wattajetta\/out\/wattajetta-stone-club-distrokid-master.wav" + } +] diff --git a/session-server/lairk-manager.mjs b/session-server/lairk-manager.mjs index 5be6fcfb80..75ceb28d23 100644 --- a/session-server/lairk-manager.mjs +++ b/session-server/lairk-manager.mjs @@ -1,43 +1,28 @@ // Lairk Manager, 26.09.23 // Who is walking in `lairk` — the Laer Klokken chat as a place — and where. // -// Anyone with the piece open is a *watcher*: they get snapshots of everyone. +// Anyone with the piece open is a *watcher*: they get every position. // Only a *walker* may move, and a walker is a verified handle (Auth0 token → // handle, never a handle the client names) that the roster gives a spot: // spoken in Laer Klokken and @mentioned there by someone else -// (/api/lairk-roster). -// -// Netcode is oskiewar's (oskiewar-world/ARCHITECTURE.md §5). Walkers send -// their *inputs* by tick, never positions. The server runs each input through -// the same fixed step the client predicts with (lib/lairk-world.mjs → -// lairkStep, arena's Quake pmove) and is the only truth. Snapshots go out at -// 20 Hz carrying every walker's state and, for the walker receiving it, the -// last tick the server has run — the client snaps to that and replays the -// inputs still in flight. Where each handle last stood is remembered. +// (/api/lairk-roster). Positions are client-reported, so the server only +// keeps them honest — inside the ground, no faster than a run — and relays +// them to watchers. The last position of each handle is remembered, which +// is what "a handle's position within lairk" is. // // Wire (all WS): -// in lairk:hello watch -// in lairk:auth { token } ask to walk -// in lairk:input { inputs: [..] } walkers only; each { t, f, r, y, p, b }, -// redundant (the last few ticks again) -// out lairk:state { positions } to a new watcher: { handle: {x,z,facing} } -// out lairk:auth:ok { handle, state, home } / lairk:auth:no { reason } -// out lairk:snap { ms, players: [{ h, s }], ack? } -// out lairk:still { handle } a walker left; they stay where they stood - -import { - lairkSpawn, - lairkStep, - unpackInput, - packState, - LAIRK_TICK_HZ, -} from "../system/public/aesthetic.computer/lib/lairk-world.mjs"; - +// in lairk:hello watch +// in lairk:auth { token } ask to walk +// in lairk:move { x, z, facing } walkers only, ~10 Hz while moving +// out lairk:state { positions } to a new watcher: { handle: {x,z,facing} } +// out lairk:auth:ok { handle, at } / lairk:auth:no { reason } +// out lairk:pos { handle, x, z, facing } +// out lairk:still { handle } a walker left; they stay where they stood + +export const LAIRK_BOUNDS = 26; // Ground radius the server allows, world units. +export const LAIRK_TOWER = 1.6; // Nobody stands inside the tower. +export const LAIRK_SPEED = 9; // Fastest allowed, units per second (with slack). const ROSTER_MS = 60_000; -const SNAP_MS = 50; // 20 Hz. -const SAVE_MS = 2_000; // How often a moved walker's spot is persisted. -const TICK_SLACK = 30; // Ticks a client may run ahead of wall time (jitter). -const MAX_GAP = 12; // Missing ticks filled by repeating the last input. export class LairkManager { constructor({ verify, fetchRoster, save, now = () => Date.now() } = {}) { @@ -46,12 +31,11 @@ export class LairkManager { this.save = save; // (handle, pos) => void — persistence, optional this.now = now; this.watchers = new Set(); // wsIds with lairk open - this.walkers = new Map(); // wsId -> Walker (see auth) + this.walkers = new Map(); // wsId -> handle this.positions = new Map(); // handle -> { x, z, facing, at } this.roster = null; // Set of handles, refreshed every ROSTER_MS this.rosterAt = 0; this.sendFn = null; // (wsId, type, content) - this.lastSnapAt = 0; } setSendFunction(fn) { @@ -81,97 +65,52 @@ export class LairkManager { const roster = await this.currentRoster(); if (!roster) return this.send(wsId, "lairk:auth:no", { reason: "unavailable" }); if (!roster.has(handle)) return this.send(wsId, "lairk:auth:no", { reason: "mention" }); - - const spot = this.positions.get(handle); - const home = spot ? { x: spot.x, z: spot.z } : { x: 0, z: 6 }; - const state = lairkSpawn(home.x, home.z, spot?.facing ?? 180); this.watchers.add(wsId); - this.walkers.set(wsId, { - handle, - state, - home, - lastTick: 0, // Client ticks start at 1 after auth:ok. - lastCmd: null, - since: this.now(), - ran: 0, // Ticks run, checked against wall time. - dirty: false, - savedAt: 0, - }); - this.send(wsId, "lairk:auth:ok", { handle, state: packState(state), home }); - } - - // Run a walker's inputs, in tick order, through the shared step. - input(wsId, content) { - const w = this.walkers.get(wsId); - if (!w || !Array.isArray(content?.inputs)) return; - const inputs = content.inputs - .map(unpackInput) - .filter((c) => c.tick > w.lastTick) - .sort((a, b) => a.tick - b.tick); - - for (const cmd of inputs) { - // A lost packet: repeat the last input across a short gap (Q3-style); - // a long one is a stall, so just carry on from here. - const gap = cmd.tick - w.lastTick - 1; - if (gap > 0 && gap <= MAX_GAP && w.lastCmd) { - for (let i = 0; i < gap; i++) if (!this.run(w, w.lastCmd)) return; - } - if (!this.run(w, cmd)) return; - w.lastTick = cmd.tick; - w.lastCmd = cmd; - } + this.walkers.set(wsId, handle); + const at = this.positions.get(handle) || null; + this.send(wsId, "lairk:auth:ok", { handle, at: at && { x: at.x, z: at.z, facing: at.facing } }); } - // One tick for one walker, unless they're running faster than time allows. - run(w, cmd) { - const allowed = ((this.now() - w.since) / 1000) * LAIRK_TICK_HZ + TICK_SLACK; - if (w.ran >= allowed) return false; // Speedhack or a flood: drop the rest. - w.ran += 1; - w.state = lairkStep(w.state, cmd, w.home); - w.dirty = true; - return true; - } + move(wsId, content) { + const handle = this.walkers.get(wsId); + if (!handle) return; // Watchers can't move; the client already told them why. + let x = Number(content?.x); + let z = Number(content?.z); + const facing = Number(content?.facing) || 0; + if (!Number.isFinite(x) || !Number.isFinite(z)) return; - // Called on a timer (~every 10 ms is fine): sends snapshots at 20 Hz and - // persists moved walkers every SAVE_MS. - tick() { const now = this.now(); - if (now - this.lastSnapAt < SNAP_MS) return; - this.lastSnapAt = now; - if (this.walkers.size === 0 || this.watchers.size === 0) return; - - const players = []; - const seen = new Set(); - for (const w of this.walkers.values()) { - if (seen.has(w.handle)) continue; // Two tabs: one body. - seen.add(w.handle); - players.push({ h: w.handle, s: packState(w.state) }); - if (w.dirty && now - w.savedAt > SAVE_MS) { - const pos = { x: round(w.state.x), z: round(w.state.z), facing: round(w.state.yaw), at: now }; - this.positions.set(w.handle, pos); - this.save?.(w.handle, pos); - w.savedAt = now; - w.dirty = false; + const last = this.positions.get(handle); + if (last?.at) { + // No faster than a run: clamp the step to what the elapsed time allows. + const dt = Math.min(1, Math.max(0.05, (now - last.at) / 1000)); + const reach = LAIRK_SPEED * dt * 1.5; + const dx = x - last.x; + const dz = z - last.z; + const d = Math.hypot(dx, dz); + if (d > reach) { + x = last.x + (dx / d) * reach; + z = last.z + (dz / d) * reach; } } + ({ x, z } = keepOnGround(x, z)); + const pos = { x: round(x), z: round(z), facing: round(facing), at: now }; + this.positions.set(handle, pos); + this.save?.(handle, pos); for (const id of this.watchers) { - const mine = this.walkers.get(id); - this.send(id, "lairk:snap", mine ? { ms: now, players, ack: mine.lastTick } : { ms: now, players }); + if (id !== wsId) this.send(id, "lairk:pos", { handle, x: pos.x, z: pos.z, facing: pos.facing }); } } leave(wsId) { this.watchers.delete(wsId); - const w = this.walkers.get(wsId); - if (!w) return; + const handle = this.walkers.get(wsId); + if (!handle) return; this.walkers.delete(wsId); - const pos = { x: round(w.state.x), z: round(w.state.z), facing: round(w.state.yaw), at: this.now() }; - this.positions.set(w.handle, pos); - this.save?.(w.handle, pos); // Another tab of the same handle may still be walking. - if ([...this.walkers.values()].some((o) => o.handle === w.handle)) return; - for (const id of this.watchers) this.send(id, "lairk:still", { handle: w.handle, ...pos }); + if ([...this.walkers.values()].includes(handle)) return; + for (const id of this.watchers) this.send(id, "lairk:still", { handle }); } async currentRoster() { @@ -191,4 +130,16 @@ export class LairkManager { } } +// Inside the ground disc and outside the tower's footprint. +export function keepOnGround(x, z) { + const d = Math.hypot(x, z); + if (d > LAIRK_BOUNDS) return { x: (x / d) * LAIRK_BOUNDS, z: (z / d) * LAIRK_BOUNDS }; + if (Math.abs(x) < LAIRK_TOWER && Math.abs(z) < LAIRK_TOWER) { + // Push out along the nearer axis. + if (Math.abs(x) > Math.abs(z)) return { x: Math.sign(x || 1) * LAIRK_TOWER, z }; + return { x, z: Math.sign(z || 1) * LAIRK_TOWER }; + } + return { x, z }; +} + const round = (n) => Math.round(n * 100) / 100; diff --git a/session-server/lairk-manager.test.mjs b/session-server/lairk-manager.test.mjs index a99bbc90d9..5c6e15ec59 100644 --- a/session-server/lairk-manager.test.mjs +++ b/session-server/lairk-manager.test.mjs @@ -1,14 +1,6 @@ import test from "node:test"; import assert from "node:assert/strict"; -import { LairkManager } from "./lairk-manager.mjs"; -import { - lairkSpawn, - lairkStep, - packInput, - LAIRK_HALF, - LAIRK_FALL_Y, - BTN, -} from "../system/public/aesthetic.computer/lib/lairk-world.mjs"; +import { LairkManager, keepOnGround, LAIRK_BOUNDS } from "./lairk-manager.mjs"; function setup({ roster = ["jeffrey", "prutti"], tokens = { good: "Jeffrey", other: "stranger" } } = {}) { let clock = 1000; @@ -25,110 +17,70 @@ function setup({ roster = ["jeffrey", "prutti"], tokens = { good: "Jeffrey", oth } const last = (sent, id, type) => sent.filter((m) => m.id === id && m.type === type).at(-1); -const forward = (t, extra = {}) => packInput(t, { fwd: 1, right: 0, yaw: 0, pitch: 0, buttons: 0, ...extra }); test("a verified handle on the roster may walk", async () => { const { lm, sent } = setup(); await lm.auth("a", "good"); - const ok = last(sent, "a", "lairk:auth:ok").content; - assert.equal(ok.handle, "jeffrey"); - assert.ok(Number.isFinite(ok.state.x)); + assert.deepEqual(last(sent, "a", "lairk:auth:ok").content, { handle: "jeffrey", at: null }); }); -test("a handle nobody mentioned may not; nor a forged token", async () => { +test("a handle nobody mentioned may not", async () => { const { lm, sent } = setup(); await lm.auth("a", "other"); assert.equal(last(sent, "a", "lairk:auth:no").content.reason, "mention"); - await lm.auth("b", "forged"); - assert.equal(last(sent, "b", "lairk:auth:no").content.reason, "login"); }); -test("the server runs inputs through the same step the client predicts with", async () => { - const { lm, tick } = setup(); - await lm.auth("a", "good"); - tick(1000); - const inputs = [1, 2, 3, 4, 5].map((t) => forward(t)); - lm.input("a", { inputs }); - - let predicted = lairkSpawn(0, 6, 180); - for (let t = 1; t <= 5; t++) predicted = lairkStep(predicted, { fwd: 1, right: 0, yaw: 0, pitch: 0, buttons: 0 }, { x: 0, z: 6 }); - const w = lm.walkers.get("a"); - assert.equal(w.lastTick, 5); - assert.equal(w.state.z, predicted.z); // Bit-identical, same code on both sides. -}); - -test("redundant inputs are run once", async () => { - const { lm, tick } = setup(); - await lm.auth("a", "good"); - tick(1000); - lm.input("a", { inputs: [forward(1), forward(2)] }); - const z = lm.walkers.get("a").state.z; - lm.input("a", { inputs: [forward(1), forward(2)] }); - assert.equal(lm.walkers.get("a").state.z, z); +test("no token, no walking", async () => { + const { lm, sent } = setup(); + await lm.auth("a", "forged"); + assert.equal(last(sent, "a", "lairk:auth:no").content.reason, "login"); }); -test("watchers can't move", async () => { - const { lm } = setup(); +test("watchers can't move; moves reach other watchers only", async () => { + const { lm, sent, tick } = setup(); lm.hello("w"); - lm.input("w", { inputs: [forward(1)] }); - assert.equal(lm.walkers.size, 0); -}); + lm.move("w", { x: 5, z: 5 }); + assert.equal(sent.filter((m) => m.type === "lairk:pos").length, 0); -test("running faster than time allows is cut off", async () => { - const { lm } = setup(); - await lm.auth("a", "good"); // No time has passed. - const flood = Array.from({ length: 500 }, (_, i) => forward(i + 1)); - lm.input("a", { inputs: flood }); - assert.ok(lm.walkers.get("a").lastTick < 60, `ran ${lm.walkers.get("a").lastTick} ticks`); + await lm.auth("a", "good"); + tick(100); + lm.move("a", { x: 5, z: 5, facing: 1 }); + assert.deepEqual(last(sent, "w", "lairk:pos").content, { handle: "jeffrey", x: 5, z: 5, facing: 1 }); + assert.equal(last(sent, "a", "lairk:pos"), undefined); }); -test("snapshots carry everyone, and your ack", async () => { - const { lm, sent, tick } = setup(); - lm.hello("w"); +test("a teleport is clamped to a run", async () => { + const { lm, tick } = setup(); await lm.auth("a", "good"); - tick(1000); - lm.input("a", { inputs: [forward(1), forward(2), forward(3)] }); - tick(60); - lm.tick(); - assert.equal(last(sent, "a", "lairk:snap").content.ack, 3); - const snap = last(sent, "w", "lairk:snap").content; - assert.equal(snap.ack, undefined); - assert.equal(snap.players[0].h, "jeffrey"); + lm.move("a", { x: 5, z: 5 }); + tick(100); + lm.move("a", { x: 20, z: 5 }); + const p = lm.positions.get("jeffrey"); + assert.ok(p.x < 7, `moved to ${p.x}`); }); -test("the tower is solid and the edge drops you home", () => { - const home = { x: 0, z: 6 }; - let s = lairkSpawn(0, 6, 180); // Facing the tower (-z). - for (let i = 0; i < 240; i++) s = lairkStep(s, { fwd: 1, yaw: 180 }, home); - assert.ok(s.z > 1.3, `walked into the tower to z=${s.z}`); - - s = lairkSpawn(0, LAIRK_HALF - 1, 0); // Facing the edge (+z). - let fell = false; - for (let i = 0; i < 600; i++) { - s = lairkStep(s, { fwd: 1, yaw: 0 }, home); - if (s.y < 0) fell = true; - } - assert.ok(fell, "never left the platform"); - assert.ok(s.y > LAIRK_FALL_Y, "never came back"); +test("the ground has an edge and the tower is solid", () => { + const far = keepOnGround(100, 0); + assert.equal(far.x, LAIRK_BOUNDS); + const inside = keepOnGround(0.2, 0.1); + assert.ok(Math.abs(inside.x) >= 1.6 || Math.abs(inside.z) >= 1.6); }); -test("jump leaves the ground and lands", () => { - let s = lairkSpawn(0, 6, 0); - s = lairkStep(s, { buttons: BTN.JUMP }, null); - assert.equal(s.onGround, false); - for (let i = 0; i < 120; i++) s = lairkStep(s, {}, null); - assert.equal(s.onGround, true); +test("positions are remembered and handed to new watchers", async () => { + const { lm, sent, saved, tick } = setup(); + await lm.auth("a", "good"); + tick(100); + lm.move("a", { x: 3, z: 4 }); + lm.leave("a"); + lm.hello("late"); + assert.deepEqual(last(sent, "late", "lairk:state").content.positions.jeffrey, { x: 3, z: 4, facing: 0 }); + assert.equal(saved.at(-1)[0], "jeffrey"); }); -test("leaving keeps where they stood", async () => { - const { lm, sent, saved, tick } = setup(); +test("leaving says still to the others", async () => { + const { lm, sent } = setup(); lm.hello("w"); await lm.auth("a", "good"); - tick(1000); - lm.input("a", { inputs: [forward(1), forward(2)] }); lm.leave("a"); - assert.equal(last(sent, "w", "lairk:still").content.handle, "jeffrey"); - assert.equal(saved.at(-1)[0], "jeffrey"); - lm.hello("late"); - assert.ok(last(sent, "late", "lairk:state").content.positions.jeffrey); + assert.deepEqual(last(sent, "w", "lairk:still").content, { handle: "jeffrey" }); }); diff --git a/session-server/session.mjs b/session-server/session.mjs index eec664bf1b..786f9b5f83 100644 --- a/session-server/session.mjs +++ b/session-server/session.mjs @@ -158,9 +158,7 @@ const fightManager = new FightManager(); const oskiewarLiveManager = new OskiewarLiveManager(); const agentPresenceManager = new AgentPresenceManager(); // 🗼 lairk — only a verified handle with a spot (spoken in Laer Klokken and -// @mentioned there) may walk. Walkers send inputs by tick; the manager runs -// them through the shared step (oskiewar-style authority) and snapshots -// everyone at 20 Hz. Every handle's last position is kept in Redis. +// @mentioned there) may walk; every handle's last position is kept in Redis. const lairkManager = new LairkManager({ verify: (token) => verifyFightIdentity(token), fetchRoster: async () => { @@ -3031,14 +3029,14 @@ wss.on("connection", async (ws, req) => { return; } - // 🗼 lairk: watch, ask to walk (verified token), send inputs. + // 🗼 lairk: watch, ask to walk (verified token), move. if (msg.type.startsWith("lairk:")) { let parsed; try { parsed = typeof msg.content === "string" ? JSON.parse(msg.content) : msg.content; } catch { parsed = null; } if (msg.type === "lairk:hello") lairkManager.hello(id); else if (msg.type === "lairk:auth") lairkManager.auth(id, parsed?.token).catch(() => {}); - else if (msg.type === "lairk:input") lairkManager.input(id, parsed); + else if (msg.type === "lairk:move") lairkManager.move(id, parsed); return; } @@ -3319,7 +3317,6 @@ fightManager.setSendFunction((wsId, type, content) => { lairkManager.setSendFunction((wsId, type, content) => { connections[wsId]?.send(pack(type, JSON.stringify(content), "lairk")); }); -setInterval(() => lairkManager.tick(), 10); // Snapshots go out at 20 Hz inside. // 🌐 Wire WorldManager send functions (same shape as DuelManager; source tag // = the world prefix). Lifecycle broadcasts are member-scoped inside the diff --git a/slab/bin/slab-web b/slab/bin/slab-web index 894286a754..fcc4dd5a73 100755 --- a/slab/bin/slab-web +++ b/slab/bin/slab-web @@ -33,13 +33,11 @@ case "$url" in esac # A preview window is small, and two of AC's defaults are tuned for a full -# page in a browser rather than a native window. +# screen rather than a tile. # -# The window now wears the same native chrome as the app's own panes, whose -# rounded corners already frame the canvas; AC's own inset gap would sit a -# second, smaller-radius frame inside them. `nogap` runs the canvas to the -# window edge so the system's corners are its corners. The corner label at -# (6, 6) stays: it is the way back to the prompt, same as in the main pane. +# The system paints its corner label at (6, 6) so a visitor can get back. In a +# window a few hundred pixels wide that label is a sizeable fraction of the +# frame and there is nowhere to go back to, so `nolabel` reclaims it. # # Density is an upscale factor, not a resolution: a higher number draws each AC # pixel across more screen pixels, so the canvas holds fewer, larger ones. The @@ -53,7 +51,7 @@ case "$url" in https://aesthetic.computer/*|https://prompt.ac/*) sep="?" case "$url" in *\?*) sep="&" ;; esac - url="${url}${sep}nogap&density=${SLAB_WEB_DENSITY:-2}" + url="${url}${sep}nolabel&density=${SLAB_WEB_DENSITY:-2}" ;; esac diff --git a/slab/menubar-swift/Sources/SlabMenubar/AXTiler.swift b/slab/menubar-swift/Sources/SlabMenubar/AXTiler.swift index ebf685aee4..312ccf2a98 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/AXTiler.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/AXTiler.swift @@ -207,10 +207,16 @@ enum AXTiler { // otherwise ordinary Terminal windows on current macOS. Keep // CGWindowID as the identity, but recover it by matching this // AX frame to a live layer-0 window owned by the same process. - let directID = windowID(w).flatMap { liveIDs.contains($0) ? $0 : nil } + let directID = windowID(w) var measuredFrame: CGRect? let id: CGWindowID? if let directID { + // An explicit off-screen/dead identity must never borrow + // a live window's id just because their old frames match. + guard liveIDs.contains(directID) else { + identityCount += 1 + continue + } id = directID } else { measuredFrame = frame(w) @@ -265,15 +271,21 @@ enum AXTiler { } // A stopped app is an authoritative zero. For a running app, bridge a // momentary failed/empty AX response with the very recent last-good - // census; genuine closes become visible as soon as the lease expires. - if !apps.isEmpty, + // census. An explicit list of rejected windows is authoritative; + // the lease must not readmit its minimized/closed entries. + if !apps.isEmpty, rawCount == 0, let prior = cache[cacheKey], now.timeIntervalSince(prior.at) <= lastGoodLease { // AX may momentarily forget the whole population during menu // automation, but the Window Server does not. Conversely, AX can // retain a destroyed Terminal window for seconds; intersecting the // lease with live Window Server ids distinguishes the two cases. - return prior.windows.filter { liveIDs.contains($0.id) } + return prior.windows.filter { + liveIDs.contains($0.id) + && boolAttr($0.element, kAXMinimizedAttribute) != true + && (bundleId != "com.apple.Terminal" + || !terminalWindowHasNoTabContent($0.element)) + } } if apps.isEmpty || readSucceeded { cache.removeValue(forKey: cacheKey) } return [] @@ -330,6 +342,9 @@ enum AXTiler { /// pixels — AX shares that coordinate space). Position before size so /// a window clamped by its old frame still lands in its cell. static func setFrame(_ w: AXUIElement, left: Int, top: Int, right: Int, bottom: Int) { + // A window can close after the census, including during a settle pass. + // Do not revive Terminal's retained, tabless AX surface by moving it. + guard !isClosedTerminalWindow(w) else { return } var pos = CGPoint(x: left, y: top) var size = CGSize(width: right - left, height: bottom - top) if let v = AXValueCreate(.cgPoint, &pos) { @@ -354,6 +369,7 @@ enum AXTiler { var requestWidth = targetWidth var requestHeight = targetHeight for _ in 0..<3 { + guard !isClosedTerminalWindow(w) else { return nil } setFrame(w, left: left, top: top, right: left + requestWidth, bottom: top + requestHeight) guard let actual = frame(w) else { return nil } @@ -367,6 +383,7 @@ enum AXTiler { } // Resizing can nudge an edge while Terminal resolves its cell grid. // Finish with the canonical origin even if the size was inexact. + guard !isClosedTerminalWindow(w) else { return nil } var pos = CGPoint(x: left, y: top) if let value = AXValueCreate(.cgPoint, &pos) { AXUIElementSetAttributeValue(w, kAXPositionAttribute as CFString, value) @@ -382,6 +399,13 @@ enum AXTiler { return ref as? Bool } + private static func isClosedTerminalWindow(_ window: AXUIElement) -> Bool { + var pid: pid_t = 0 + return AXUIElementGetPid(window, &pid) == .success + && NSRunningApplication(processIdentifier: pid)?.bundleIdentifier == "com.apple.Terminal" + && terminalWindowHasNoTabContent(window) + } + /// A closed Terminal window can remain in both AX and Window Server for /// minutes. On this host its former content is represented by an empty /// AXTabGroup; live one- and multi-tab windows expose real content instead. diff --git a/slab/menubar-swift/Sources/SlabMenubar/AeselWindowIdentity.swift b/slab/menubar-swift/Sources/SlabMenubar/AeselWindowIdentity.swift index a462881b12..b42a0773e3 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/AeselWindowIdentity.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/AeselWindowIdentity.swift @@ -3,10 +3,10 @@ import Foundation /// The development Electron bundle is shared by many unrelated apps. Only /// aesel's own window-title contract opts one of those windows into Slab. enum AeselWindowIdentity { - static let bundleIDs = ["computer.aesthetic.easel", "com.github.Electron"] + static let bundleIDs = ["computer.aesthetic.easel", "computer.aesthetic.aesel", "computer.aesthetic.aesel.native", "com.github.Electron"] static func accepts(bundleID: String, title: String) -> Bool { - if bundleID == "computer.aesthetic.easel" { return true } + if bundleIDs.contains(bundleID), bundleID != "com.github.Electron" { return true } guard bundleID == "com.github.Electron" else { return false } return title == "aesel" || title.hasSuffix(" · aesel") } diff --git a/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift b/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift index 5d81f56cc5..4658a0bfe5 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/AppDelegate.swift @@ -3847,73 +3847,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { PromptSigilOverlayController.shared.terminalsDidRetile() } guard let pass, pass.nTerm > 0 else { return } - // A confirmed population change is the normalization boundary. - // Always include every Terminal window: a just-launched prox may - // have inherited Terminal's large default even when the grid's - // computed font size is identical to the previous pass. Avoiding - // previous-pass ID bookkeeping also closes the superseded-layout - // race where a stale pass could make a new ID look already handled. - let fontTargetIDs = Set(pass.terminalPlacements.map(\.id)) - guard !fontTargetIDs.isEmpty || !pass.misfitTerminalIDs.isEmpty else { return } - // Geometry is already done — the grid snapped above. Terminal - // text size catches up asynchronously, and only when needed: - // the profile-font write + Default-Font-Size menu dance is the - // slow, focus-stealing part of the old tiler. - // Apply the grid font to every window. An explicit tile also clears - // Terminal's invisible per-window Cmd +/- override via View ▸ - // Default Font Size. - var lines: [String] = [] - if !fontTargetIDs.isEmpty { - lines.append("tell application \"Terminal\"") - lines.append(" set _slabIds to id of (every window whose miniaturized is false)") - for id in fontTargetIDs.sorted() { - lines.append(" try") - lines.append(" set font size of current settings of (first window whose id is \(id)) to \(pass.fontSize)") - lines.append(" end try") - } - lines.append("end tell") - } - if resetZoom { - lines.append(contentsOf: [ - "tell application \"Terminal\" to activate", - "repeat with _wid in _slabIds", - " try", - " tell application \"Terminal\" to set index of (first window whose id is (contents of _wid)) to 1", - " delay 0.04", - " tell application \"System Events\" to tell process \"Terminal\" to click menu item \"Default Font Size\" of menu 1 of menu bar item \"View\" of menu bar 1", - " end try", - "end repeat", - ]) - } - // AX gives the wall its immediate snap, but Terminal quantizes AX - // size writes to its current character-cell grid. Its own bounds - // command can express the exact pixel cell. Finish all windows - // after a font change, or only measured outliers otherwise, in - // this same single AppleScript process (no extra enumeration). - let exactPlacements = !fontTargetIDs.isEmpty - ? pass.terminalPlacements.filter { fontTargetIDs.contains($0.id) } - : pass.terminalPlacements.filter { pass.misfitTerminalIDs.contains($0.id) } - lines.append("tell application \"Terminal\"") - for placement in exactPlacements { - let b = placement.bounds - lines.append(" try") - lines.append(" set bounds of (first window whose id is \(placement.id)) to {\(b.left), \(b.top), \(b.right), \(b.bottom)}") - lines.append(" end try") - } - // Font/profile reflow can arrive shortly after the initiating - // command. Reassert exact native bounds twice without another - // process spawn or Accessibility population read. - for delay in [0.06, 0.16] { - lines.append(" delay \(delay)") - for placement in exactPlacements { - let b = placement.bounds - lines.append(" try") - lines.append(" set bounds of (first window whose id is \(placement.id)) to {\(b.left), \(b.top), \(b.right), \(b.bottom)}") - lines.append(" end try") - } - } - lines.append("end tell") - let script = lines.joined(separator: "\n") + // Keep the font/reset/settle work bound to this validated census. + // Terminal's global AppleScript window list includes closed shells. + let script = TerminalTileScript.make( + placements: pass.terminalPlacements.map { + TerminalTileScript.Placement(id: $0.id, bounds: $0.bounds) + }, fontSize: pass.fontSize, resetZoom: resetZoom) self.tileFontQueue.async { [weak self] in guard let self, self.tileGenerationIsCurrent(generation) else { return } _ = ShellRunner.run("/usr/bin/osascript", args: ["-e", script]) @@ -4230,15 +4169,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { } } - /// The pre-AX tiler, kept verbatim as the no-Accessibility fallback: - /// three osascript spawns (two count probes + one bounds script). + /// AppleScript fallback when Accessibility is unavailable. Terminal ids + /// are captured once, excluding closed/tabless windows, then revalidated. private func tileNowLegacy(resetZoom: Bool, geom: ScreenGeom, textSize: TextSize) { DispatchQueue.global(qos: .userInitiated).async { // Size the grid to everything on screen across both apps. The // `is running` guard never launches a quit Terminal.app, so a // non-running Terminal contributes zero cells. let nIterm = Self.windowCount(app: "iTerm2") - let nTerm = Self.windowCount(app: "Terminal") + let terminalIDs = ShellRunner.run("/usr/bin/osascript", + args: ["-e", TerminalTileScript.liveWindowIDs], timeout: 5).output + .split(separator: ",").compactMap { + UInt32($0.trimmingCharacters(in: .whitespacesAndNewlines)) + } + let nTerm = terminalIDs.count let n = nIterm + nTerm guard n > 0 else { return } guard let layout = Self.computeTileLayout(count: n, geom: geom, size: textSize) else { return } @@ -4265,48 +4209,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { lines.append("end tell") } if nTerm > 0 { - // Terminal.app auto-fit, three ordered passes in ONE osascript - // so the sequence is deterministic. Windows are addressed by - // id (captured up front) because pass 2 reorders the list. - // 1. set each window's profile font to the grid-derived size - // 2. View ▸ Default Font Size on each window (System Events) — - // the ONLY reliable way to make a LIVE window adopt a new - // font. A per-window zoom (View ▸ Bigger/Smaller) silently - // overrides the profile font and is invisible to - // AppleScript, so pass 1 alone is a no-op on already-open - // windows (see slab-terminal-font-zoom). Skipped when - // resetZoom is false (frequent auto-retile path). - // 3. re-pin pixel bounds LAST so the reflow can't fight the - // cell geometry. - // Minimized windows are excluded (matches windowCount): they - // neither consume a cell nor get moved. - lines.append("tell application \"Terminal\"") - lines.append(" set _slabIds to id of (every window whose miniaturized is false)") - lines.append(" repeat with _wid in _slabIds") - lines.append(" try") - lines.append(" set font size of current settings of (first window whose id is (contents of _wid)) to \(layout.fontSize)") - lines.append(" end try") - lines.append(" end repeat") - lines.append("end tell") - if resetZoom { - lines.append("tell application \"Terminal\" to activate") - lines.append("repeat with _wid in _slabIds") - lines.append(" try") - lines.append(" tell application \"Terminal\" to set index of (first window whose id is (contents of _wid)) to 1") - lines.append(" delay 0.25") - lines.append(" tell application \"System Events\" to tell process \"Terminal\" to click menu item \"Default Font Size\" of menu 1 of menu bar item \"View\" of menu bar 1") - lines.append(" delay 0.1") - lines.append(" end try") - lines.append("end repeat") - } - lines.append("tell application \"Terminal\"") - for j in 0.. [ClaudeSession] { + NativeAeselSession.refresh() let fm = FileManager.default let activeDir = Paths.activePromptsDir let awaitingDir = Paths.awaitingPromptsDir diff --git a/slab/menubar-swift/Sources/SlabMenubar/NativeAeselSession.swift b/slab/menubar-swift/Sources/SlabMenubar/NativeAeselSession.swift new file mode 100644 index 0000000000..53053b4dc0 --- /dev/null +++ b/slab/menubar-swift/Sources/SlabMenubar/NativeAeselSession.swift @@ -0,0 +1,116 @@ +import Foundation +import Darwin + +/// Read the native app's sandbox export on the snapshot worker. No RPC, +/// polling waits, provider launch, or UI activation is needed. +enum NativeAeselSession { + static let bundleID = "computer.aesthetic.aesel.native" + private static let lock = NSLock() + + static func decode(_ data: Data, now: Date = Date(), + ownsPID: (Int) -> Bool) -> (marker: [String: Any], layout: [String: Any])? { + guard data.count <= 16384, + let object = try? JSONSerialization.jsonObject(with: data) as? [String: Any], + object["schema"] as? Int == 1, + let marker = object["marker"] as? [String: Any], + let layout = object["layout"] as? [String: Any], + let id = marker["session_id"] as? String, id.hasPrefix("aesel-native-"), + UUID(uuidString: String(id.dropFirst("aesel-native-".count))) != nil, + marker["agent_type"] as? String == "easel", marker["host_app"] as? String == bundleID, + let pid = marker["agent_pid"] as? Int, pid > 0, pid <= Int(Int32.max), + marker["host_pid"] as? Int == pid, ownsPID(pid), + let window = marker["host_window_id"] as? Int, window > 0, + let updated = marker["updated"] as? String, + let date = ISO8601DateFormatter().date(from: updated), + now.timeIntervalSince(date) >= -5, now.timeIntervalSince(date) < 30, + let state = marker["state"] as? String, + ["blank", "working", "complete", "awaiting", "interrupted"].contains(state), + layout["sessionId"] as? String == id, + layout["visible"] is Bool, + let x = layout["x"] as? Double, let y = layout["y"] as? Double, + let size = layout["size"] as? Double, + let width = layout["windowWidth"] as? Double, let height = layout["windowHeight"] as? Double, + [x, y, size, width, height].allSatisfy({ $0.isFinite }), + x >= 0, y >= 0, size >= 16, size <= 128, + x + size <= width, y + size <= height else { return nil } + // Copy only the public status contract, never arbitrary app state. + let fields: Set = ["session_id", "agent_type", "agent_pid", "host_app", "host_pid", + "host_window_id", "subject", "summary", "piece", "piece_version", "state", "updated", "started_at"] + var clean = marker.filter { fields.contains($0.key) } + clean["cwd"] = "" + clean["tty"] = "" + return (clean, layout) + } + + // LaunchServices can stall while applications register. Validate the live + // executable and start time directly instead of making a synchronous XPC + // request from Slab's snapshot worker. + private static func ownsProcess(_ pid: Int, modified: Date) -> Bool { + var path = [CChar](repeating: 0, count: 4096) + guard proc_pidpath(pid_t(pid), &path, UInt32(path.count)) > 0 else { return false } + let executable = URL(fileURLWithPath: String(cString: path)) + guard executable.deletingLastPathComponent().lastPathComponent == "MacOS" else { return false } + let infoFile = executable.deletingLastPathComponent().deletingLastPathComponent().appendingPathComponent("Info.plist") + guard let data = try? Data(contentsOf: infoFile), + let info = try? PropertyListSerialization.propertyList(from: data, format: nil) as? [String: Any], + info["CFBundleIdentifier"] as? String == bundleID else { return false } + var process = proc_bsdinfo() + guard proc_pidinfo(pid_t(pid), PROC_PIDTBSDINFO, 0, &process, Int32(MemoryLayout.size)) + == Int32(MemoryLayout.size) else { return false } + return Double(process.pbi_start_tvsec) <= modified.timeIntervalSince1970 + } + + static func refresh() { + lock.lock() + defer { lock.unlock() } + let fm = FileManager.default + let directory = URL(fileURLWithPath: NSHomeDirectory()) + .appendingPathComponent("Library/Containers/\(bundleID)/Data/Library/Application Support/\(bundleID)/slab/windows") + let active = URL(fileURLWithPath: Paths.activePromptsDir) + let layouts = active.deletingLastPathComponent().appendingPathComponent("easel-layout") + var keep = Set() + var liveLayouts = Set() + let files = ((try? fm.contentsOfDirectory(at: directory, includingPropertiesForKeys: [.contentModificationDateKey])) ?? []) + .filter { $0.pathExtension == "json" && UUID(uuidString: $0.deletingPathExtension().lastPathComponent) != nil } + .sorted { ((try? $0.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast) + > ((try? $1.resourceValues(forKeys: [.contentModificationDateKey]).contentModificationDate) ?? .distantPast) } + for file in files.prefix(64) { + guard let attrs = try? fm.attributesOfItem(atPath: file.path), + attrs[.type] as? FileAttributeType == .typeRegular, + (attrs[.ownerAccountID] as? NSNumber)?.uint32Value == getuid(), + let size = attrs[.size] as? NSNumber, size.intValue <= 16384, + let data = try? Data(contentsOf: file), + let record = decode(data, ownsPID: { pid in + ownsProcess(pid, modified: attrs[.modificationDate] as? Date ?? .distantPast) + }), + let id = record.marker["session_id"] as? String, + let pid = record.marker["host_pid"] as? Int, + let window = record.marker["host_window_id"] as? Int else { continue } + do { + for dir in [active, layouts] { + try fm.createDirectory(at: dir, withIntermediateDirectories: true, attributes: [.posixPermissions: 0o700]) + } + for (value, target) in [(record.layout, layouts.appendingPathComponent("\(pid)-\(window).json")), + (record.marker, active.appendingPathComponent(id))] { + try JSONSerialization.data(withJSONObject: value).write(to: target, options: .atomic) + try fm.setAttributes([.posixPermissions: 0o600], ofItemAtPath: target.path) + } + keep.insert(id) + liveLayouts.insert("\(pid)-\(window).json") + } catch { NSLog("Native aesel prox import failed: %@", error.localizedDescription) } + } + // A closed app, replaced instance, or stalled heartbeat cannot leave a + // ghost prox. Only this bridge's namespace is eligible for removal. + for name in (try? fm.contentsOfDirectory(atPath: active.path)) ?? [] + where name.hasPrefix("aesel-native-") && !keep.contains(name) { + let marker = active.appendingPathComponent(name) + if let data = try? Data(contentsOf: marker), + let old = try? JSONSerialization.jsonObject(with: data) as? [String: Any], + let pid = old["host_pid"] as? Int, let window = old["host_window_id"] as? Int { + let layout = "\(pid)-\(window).json" + if !liveLayouts.contains(layout) { try? fm.removeItem(at: layouts.appendingPathComponent(layout)) } + } + try? fm.removeItem(at: marker) + } + } +} diff --git a/slab/menubar-swift/Sources/SlabMenubar/PromptSigilOverlay.swift b/slab/menubar-swift/Sources/SlabMenubar/PromptSigilOverlay.swift index cf3e2e67db..a6fb41f10c 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/PromptSigilOverlay.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/PromptSigilOverlay.swift @@ -3248,6 +3248,11 @@ final class PromptSigilOverlayController { x + size <= Double(bounds.2), y + size <= Double(bounds.3) else { return nil } if let id = object["sessionId"] as? String, id != session.sessionId { return nil } + if session.hostApp == NativeAeselSession.bundleID { + guard let width = object["windowWidth"] as? Double, + let height = object["windowHeight"] as? Double, + abs(width - Double(bounds.2)) < 1, abs(height - Double(bounds.3)) < 1 else { return nil } + } overlay.setDesktopTitle(object, bounds: bounds, ackPath: path + ".ack") return CGRect(x: x, y: y, width: size, height: size) } diff --git a/slab/menubar-swift/Sources/SlabMenubar/TerminalTileScript.swift b/slab/menubar-swift/Sources/SlabMenubar/TerminalTileScript.swift new file mode 100644 index 0000000000..70bef86da7 --- /dev/null +++ b/slab/menubar-swift/Sources/SlabMenubar/TerminalTileScript.swift @@ -0,0 +1,84 @@ +import Foundation + +/// Terminal keeps scriptable windows after their last tab closes. Every +/// deferred write must revalidate its original target before touching it. +enum TerminalTileScript { + struct Placement { + let id: UInt32 + let bounds: (left: Int, top: Int, right: Int, bottom: Int) + } + + static let liveWindowHandler = """ + on slabTileWindow(wid) + if application "Terminal" is not running then error "Terminal stopped" + tell application "Terminal" + set w to first window whose id is wid + if miniaturized of w then error "Window minimized" + if (count tabs of w) is 0 then error "Window closed" + set liveTab to selected tab of w + return w + end tell + end slabTileWindow + """ + + static let liveWindowIDs = liveWindowHandler + "\n" + """ + set liveIds to {} + if application "Terminal" is running then + tell application "Terminal" to set candidates to id of every window + repeat with wid in candidates + try + my slabTileWindow(contents of wid) + set end of liveIds to contents of wid + end try + end repeat + end if + return liveIds + """ + + static func make(placements: [Placement], fontSize: Int, resetZoom: Bool) -> String { + guard !placements.isEmpty else { return "" } + var lines = [liveWindowHandler] + for placement in placements { + lines += [ + "try", + " set w to my slabTileWindow(\(placement.id))", + " tell application \"Terminal\" to set font size of current settings of w to \(fontSize)", + "end try", + ] + } + if resetZoom { + // Never enumerate again or send `activate` (which can open a + // default window). Focus only the still-live transaction targets. + for placement in placements { + lines += [ + "try", + " set w to my slabTileWindow(\(placement.id))", + " tell application \"Terminal\" to set index of w to 1", + " tell application \"System Events\" to tell process \"Terminal\" to set frontmost to true", + " delay 0.04", + " my slabTileWindow(\(placement.id))", + " tell application \"Terminal\" to set frontID to id of front window", + " if frontID is \(placement.id) then", + " tell application \"System Events\" to tell process \"Terminal\" to click menu item \"Default Font Size\" of menu 1 of menu bar item \"View\" of menu bar 1", + " end if", + "end try", + ] + } + } + // Revalidate after each reflow delay: a target can close while this + // script is queued or while another window's font is being reset. + for delay in [0.0, 0.06, 0.16] { + if delay > 0 { lines.append("delay \(delay)") } + for placement in placements { + let b = placement.bounds + lines += [ + "try", + " set w to my slabTileWindow(\(placement.id))", + " tell application \"Terminal\" to set bounds of w to {\(b.left), \(b.top), \(b.right), \(b.bottom)}", + "end try", + ] + } + } + return lines.joined(separator: "\n") + } +} diff --git a/slab/menubar-swift/Sources/SlabMenubar/TilePopulationObserver.swift b/slab/menubar-swift/Sources/SlabMenubar/TilePopulationObserver.swift index aedf245041..2045c29fbd 100644 --- a/slab/menubar-swift/Sources/SlabMenubar/TilePopulationObserver.swift +++ b/slab/menubar-swift/Sources/SlabMenubar/TilePopulationObserver.swift @@ -6,7 +6,7 @@ final class TilePopulationObserver { private var observers: [pid_t: AXObserver] = [:] private var workspaceTokens: [NSObjectProtocol] = [] private let changed: () -> Void - private let bundleIDs: Set = ["com.apple.Terminal", "com.googlecode.iterm2", "computer.aesthetic.app", "computer.aesthetic.easel", "computer.aesthetic.aesel"] + private let bundleIDs: Set = ["com.apple.Terminal", "com.googlecode.iterm2", "computer.aesthetic.app", "computer.aesthetic.easel", "computer.aesthetic.aesel", "computer.aesthetic.aesel.native"] init(changed: @escaping () -> Void) { self.changed = changed diff --git a/slab/menubar-swift/tests/native-aesel-session.sh b/slab/menubar-swift/tests/native-aesel-session.sh new file mode 100644 index 0000000000..909726240f --- /dev/null +++ b/slab/menubar-swift/tests/native-aesel-session.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -eu +root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +probeDir=$(mktemp -d /tmp/slab-native-aesel-check.XXXXXX) +trap 'rm -rf "$probeDir"' EXIT +cat "$root/Sources/SlabMenubar/AeselWindowIdentity.swift" "$root/Sources/SlabMenubar/NativeAeselSession.swift" > "$probeDir/check.swift" +cat >> "$probeDir/check.swift" <<'SWIFT' +enum Paths { static let activePromptsDir = "/unused" } +let now = Date() +let id = "aesel-native-" + UUID().uuidString +var marker: [String: Any] = ["session_id": id, "agent_type": "easel", "host_app": NativeAeselSession.bundleID, + "agent_pid": 123, "host_pid": 123, "host_window_id": 456, "state": "working", + "updated": ISO8601DateFormatter().string(from: now), "source": "never copy", "provider_session_id": "never copy"] +var layout: [String: Any] = ["sessionId": id, "visible": true, "x": 90.0, "y": 2.0, "size": 28.0, + "windowWidth": 400.0, "windowHeight": 500.0] +func record() -> Data { try! JSONSerialization.data(withJSONObject: ["schema": 1, "marker": marker, "layout": layout]) } +func decode(_ live: Bool = true, at: Date = now) -> (marker: [String: Any], layout: [String: Any])? { + NativeAeselSession.decode(record(), now: at, ownsPID: { $0 == 123 && live }) +} +assert(AeselWindowIdentity.accepts(bundleID: NativeAeselSession.bundleID, title: "")) +assert(!AeselWindowIdentity.accepts(bundleID: "com.github.Electron", title: "Unrelated")) +assert(decode() != nil) +assert(decode()!.marker["source"] == nil && decode()!.marker["provider_session_id"] == nil) +assert(decode(false) == nil) +assert(decode(at: now.addingTimeInterval(31)) == nil) +assert(decode(at: now.addingTimeInterval(-10)) == nil) +layout["x"] = 390.0 +assert(decode() == nil) +layout["x"] = 90.0 +layout["sessionId"] = "wrong-window-session" +assert(decode() == nil) +layout["sessionId"] = id +marker["session_id"] = "aesel-native-../../escape" +assert(decode() == nil) +marker["session_id"] = id +for state in ["blank", "working", "complete", "awaiting", "interrupted"] { + marker["state"] = state + assert(decode()!.marker["state"] as? String == state) +} +marker["state"] = "unknown" +assert(decode() == nil) +print("Native aesel: identity, status, stale/dead process, geometry and export boundary checks passed") +SWIFT +swift "$probeDir/check.swift" diff --git a/slab/menubar-swift/tests/terminal-tile-targets.sh b/slab/menubar-swift/tests/terminal-tile-targets.sh new file mode 100755 index 0000000000..40b7a7bfbc --- /dev/null +++ b/slab/menubar-swift/tests/terminal-tile-targets.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# Compile the real generated font/reset/settle script and check target selection +# against Terminal's current live and tabless windows without changing them. +set -euo pipefail +root="$(cd "$(dirname "$0")/.." && pwd)" +probe_dir="$(mktemp -d /tmp/slab-tile-targets.XXXXXX)" +trap 'rm -rf "$probe_dir"' EXIT +osascript > "$probe_dir/closed-ids" <<'APPLESCRIPT' +set closedIds to {} +if application "Terminal" is running then + tell application "Terminal" + repeat with w in every window + if (count tabs of w) is 0 then set end of closedIds to id of w + end repeat + end tell +end if +return closedIds +APPLESCRIPT +cp "$root/Sources/SlabMenubar/TerminalTileScript.swift" "$probe_dir/check.swift" +cat >> "$probe_dir/check.swift" <<'SWIFT' +let dir = CommandLine.arguments[1] +let closedIDs = try String(contentsOfFile: "\(dir)/closed-ids", encoding: .utf8) + .split(separator: ",").compactMap { UInt32($0.trimmingCharacters(in: .whitespacesAndNewlines)) } +let placements = (closedIDs + [4294967295]).map { + TerminalTileScript.Placement(id: $0, + bounds: (left: 10, top: 20, right: 600, bottom: 500)) +} +assert(TerminalTileScript.make(placements: [], fontSize: 12, resetZoom: true).isEmpty) +for reset in [false, true] { + let script = TerminalTileScript.make(placements: placements, fontSize: 12, resetZoom: reset) + try script.write(toFile: "\(dir)/tile-\(reset).applescript", atomically: true, encoding: .utf8) +} +let probe = TerminalTileScript.liveWindowHandler + "\n" + """ +set accepted to 0 +set rejected to 0 +if application "Terminal" is running then + tell application "Terminal" to set candidates to id of every window + repeat with wid in candidates + tell application "Terminal" + set w to first window whose id is (contents of wid) + set shouldAccept to ((count tabs of w) > 0 and not miniaturized of w) + end tell + set didAccept to false + try + my slabTileWindow(contents of wid) + set didAccept to true + end try + if didAccept is not shouldAccept then error "Incorrect target validation" + if didAccept then + set accepted to accepted + 1 + else + set rejected to rejected + 1 + end if + end repeat +end if +try + my slabTileWindow(4294967295) + set missingAccepted to true +on error + set missingAccepted to false +end try +if missingAccepted then error "Missing target accepted" +return "PASS live=" & accepted & " excluded=" & rejected & " missing target rejected" +""" +try probe.write(toFile: "\(dir)/probe.applescript", atomically: true, encoding: .utf8) +try TerminalTileScript.liveWindowIDs.write(toFile: "\(dir)/ids.applescript", atomically: true, encoding: .utf8) +SWIFT +swift "$probe_dir/check.swift" "$probe_dir" +for script in "$probe_dir"/*.applescript; do + osacompile -o "$probe_dir/compiled.scpt" "$script" +done +osascript "$probe_dir/probe.applescript" +# Preserve all frame evidence so a resurrected ghost is a test failure. +snapshot() { + osascript <<'APPLESCRIPT' +if application "Terminal" is not running then return "stopped" +tell application "Terminal" + set report to "" + repeat with w in every window + set report to report & (id of w as text) & ":" & (bounds of w as text) & linefeed + end repeat + return report +end tell +APPLESCRIPT +} +snapshot > "$probe_dir/before" +# Executing a stale transaction must be harmless, even with explicit zoom reset. +osascript "$probe_dir/tile-false.applescript" +osascript "$probe_dir/tile-true.applescript" +osascript "$probe_dir/ids.applescript" +snapshot > "$probe_dir/after" +diff -u "$probe_dir/before" "$probe_dir/after" +echo "PASS stale transactions left all window frames unchanged" diff --git a/system/backend/oskiewar-leaderboard.mjs b/system/backend/oskiewar-leaderboard.mjs new file mode 100644 index 0000000000..f0af4331b6 --- /dev/null +++ b/system/backend/oskiewar-leaderboard.mjs @@ -0,0 +1,130 @@ +// Verified-account, dual-report match ledger. Replay uploads never enter this ledger. +import { createHash } from 'node:crypto'; + +export const COLLECTION = 'oskiewar-verified-matches'; +const MATCH_WINS = 5; +export function normalizeHandle(value) { + if (typeof value !== 'string') return null; + const handle = value.replace(/^@/, '').toLowerCase(); + return /^[a-z0-9_-]{1,64}$/.test(handle) ? handle : null; +} +export function validateResult(body) { + if (!body || typeof body.matchId !== 'string' || !/^ow-[a-zA-Z0-9_-]{3,93}$/.test(body.matchId)) return 'Invalid matchId.'; + if (body.seat !== 0 && body.seat !== 1) return 'Invalid seat.'; + if (!Array.isArray(body.handles) || body.handles.length !== 2 || body.handles.some(h => !normalizeHandle(h))) return 'Two handles are required.'; + if (normalizeHandle(body.handles[0]) === normalizeHandle(body.handles[1])) return 'Two distinct accounts are required.'; + if (body.winner !== 0 && body.winner !== 1) return 'Invalid winner.'; + if (!Array.isArray(body.roundWins) || body.roundWins.length !== 2 || body.roundWins.some(n => !Number.isInteger(n) || n < 0 || n > MATCH_WINS)) return 'Invalid roundWins.'; + if (body.roundWins[body.winner] !== MATCH_WINS || body.roundWins[1 - body.winner] >= MATCH_WINS) return 'Only completed first-to-five matches count.'; + return null; +} +export function canonicalResult(body, accounts) { + const result = { matchId: body.matchId, subjects: accounts.map(a => a._id), roundWins: body.roundWins, winner: body.winner }; + return { ...result, digest: createHash('sha256').update(JSON.stringify(result)).digest('hex') }; +} + +// All mutations are conditional on an immutable result digest. The built-in _id +// unique index makes retries/concurrent completion one match, without $inc races. +export async function recordReport(collection, body, accounts, now = new Date()) { + const result = canonicalResult(body, accounts); + const players = accounts.map((a, seat) => ({ subject: a._id, handle: a.handle, seat, + won: seat === body.winner ? 1 : 0, roundsWon: body.roundWins[seat], roundsLost: body.roundWins[1 - seat] })); + try { + await collection.insertOne({ _id: body.matchId, digest: result.digest, players, + winner: body.winner, roundWins: body.roundWins, createdAt: now, reports: {}, + expiresAt: new Date(now.getTime() + 7 * 86400000) }); + } catch (error) { if (error.code !== 11000) throw error; } + const existing = await collection.findOne({ _id: body.matchId }); + if (!existing || existing.digest !== result.digest) return { statusCode: 409, body: { error: 'Reports disagree for this matchId.', status: 'conflict' } }; + if (!existing.confirmedAt) { + await collection.updateOne({ _id: body.matchId, digest: result.digest, confirmedAt: { $exists: false } }, + { $set: { [`reports.${body.seat}`]: now } }); + await collection.updateOne({ _id: body.matchId, digest: result.digest, confirmedAt: { $exists: false }, + 'reports.0': { $exists: true }, 'reports.1': { $exists: true } }, + { $set: { confirmedAt: now }, $unset: { expiresAt: '' } }); + } + const saved = await collection.findOne({ _id: body.matchId }); + return { statusCode: saved.confirmedAt ? 200 : 202, body: { matchId: body.matchId, + status: saved.confirmedAt ? 'recorded' : 'pending', recorded: !!saved.confirmedAt } }; +} + +export function standingsPipeline(match = {}) { + return [ + { $match: { confirmedAt: { $exists: true }, ...match } }, + { $unwind: '$players' }, + { $group: { _id: '$players.subject', matchesPlayed: { $sum: 1 }, matchesWon: { $sum: '$players.won' }, + roundsWon: { $sum: '$players.roundsWon' }, roundsLost: { $sum: '$players.roundsLost' }, lastAt: { $max: '$confirmedAt' } } }, + { $lookup: { from: '@handles', localField: '_id', foreignField: '_id', as: 'account' } }, + { $unwind: '$account' }, + { $project: { _id: 1, handle: '$account.handle', colors: '$account.colors', matchesPlayed: 1, matchesWon: 1, + matchesLost: { $subtract: ['$matchesPlayed', '$matchesWon'] }, roundsWon: 1, roundsLost: 1, lastAt: 1 } }, + { $sort: { matchesWon: -1, roundsWon: -1, matchesLost: 1, handle: 1 } }, + ]; +} +const publicRow = ({ _id, colors, ...row }) => ({ ...row, colors: + Array.isArray(colors) && colors.length === row.handle.length + 1 && + colors.every(c => c && [c.r,c.g,c.b].every(v => Number.isFinite(v) && v >= 0 && v <= 255)) + ? colors.map(({r,g,b}) => ({r,g,b})) : null }); +const zeroRow = handle => ({ handle, matchesPlayed: 0, matchesWon: 0, matchesLost: 0, roundsWon: 0, roundsLost: 0, lastAt: null }); +export async function readStandings(db, handles) { + const collection = db.collection(COLLECTION); + const accounts = handles.length ? await db.collection('@handles').find({ handle: { $in: handles } }).toArray() : []; + const subjects = accounts.map(a => a._id); + const result = await collection.aggregate([...standingsPipeline(), { $facet: { + top: [{ $limit: 20 }], players: [{ $match: { _id: { $in: subjects } } }], + } }]).toArray(); + const { top = [], players = [] } = result[0] || {}; + const empty = handle => ({ ...zeroRow(handle), colors: accounts.find(a => a.handle === handle)?.colors }); + let pair = null; + if (subjects.length === 2) { + const rows = await collection.aggregate(standingsPipeline({ 'players.subject': { $all: subjects } })).toArray(); + pair = { matchesPlayed: rows[0]?.matchesPlayed || 0, + players: handles.map(handle => publicRow(rows.find(r => r.handle === handle) || empty(handle))) }; + } + return { verification: 'dual-authenticated-reports', top: top.map(publicRow), + players: handles.map(handle => publicRow(players.find(r => r.handle === handle) || empty(handle))), pair }; +} + +export function createLeaderboardHandler({ authorize, connect, respond, now = () => new Date() }) { + let indexes; + return async function handler(event) { + const reply = (code, value) => respond(code, value, { 'Cache-Control': 'no-store' }); + if (event.httpMethod === 'OPTIONS') return reply(204, ''); + if (!['GET', 'POST'].includes(event.httpMethod)) return reply(405, { error: 'GET or POST required.' }); + let body, user, handles; + if (event.httpMethod === 'POST') { + user = await authorize({ authorization: event.headers?.authorization || event.headers?.Authorization }); + if (!user?.sub) return reply(401, { error: 'Sign in to report a match.' }); + if (typeof event.body !== 'string' || Buffer.byteLength(event.body) > 4096) return reply(413, { error: 'Result body must be at most 4096 bytes.' }); + try { body = JSON.parse(event.body); } catch { return reply(400, { error: 'Invalid JSON.' }); } + const error = validateResult(body); + if (error) return reply(400, { error }); + handles = body.handles.map(normalizeHandle); + } else { + const requested = event.queryStringParameters?.handles || ''; + handles = requested ? requested.split(',').map(normalizeHandle) : []; + if (handles.length > 2 || handles.some(h => !h) || new Set(handles).size !== handles.length) return reply(400, { error: 'Request up to two distinct handles.' }); + } + let database; + try { + database = await connect(); + const { db } = database; + const collection = db.collection(COLLECTION); + if (event.httpMethod === 'GET') return reply(200, await readStandings(db, handles)); + const accounts = await Promise.all(handles.map(handle => db.collection('@handles').findOne({ handle }))); + if (accounts.some(a => !a)) return reply(400, { error: 'Both players need registered handles.' }); + if (accounts[0]._id === accounts[1]._id) return reply(400, { error: 'Two distinct accounts are required.' }); + if (accounts[body.seat]._id !== user.sub) return reply(403, { error: 'The signed-in account does not own this seat.' }); + if (!indexes) indexes = Promise.all([ + collection.createIndex({ expiresAt: 1 }, { expireAfterSeconds: 0 }), + collection.createIndex({ confirmedAt: -1 }), + ]).catch(error => { indexes = undefined; throw error; }); + await indexes; + const result = await recordReport(collection, body, accounts, now()); + return reply(result.statusCode, result.body); + } catch (error) { + console.error('Oskiewar leaderboard unavailable:', error?.name || 'Error'); + return reply(503, { error: 'Leaderboard temporarily unavailable. Retry the same matchId.' }); + } finally { await database?.disconnect(); } + }; +} diff --git a/system/backend/tests/device-pair-login.test.mjs b/system/backend/tests/device-pair-login.test.mjs new file mode 100644 index 0000000000..1bca6c8335 --- /dev/null +++ b/system/backend/tests/device-pair-login.test.mjs @@ -0,0 +1,115 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import vm from 'node:vm'; +import {handler} from '../../netlify/functions/device-pair-login.mjs'; +const settle=async()=>{for(let i=0;i<6;i++)await new Promise(r=>setImmediate(r));}; +async function browser(options={}) { + const {body}=await handler(options.event||{queryStringParameters:{code:'ABC234'}}); + const nodes=new Map(),calls=[]; + function node() {return {value:'',children:[],style:{},hidden:false,disabled:false,className:'',listeners:{}, + get textContent(){return this.children.map(c=>typeof c==='string'?c:c.textContent).join('');}, + set textContent(value){this.children=[String(value)];}, + replaceChildren(...children){this.children=children;}, + addEventListener(type,fn){this.listeners[type]=fn;},focus(){this.focused=true;}};} + + for(const match of body.matchAll(/<[^>]+\bid="([^"]+)"[^>]*>/g)) { + const id=match[1];nodes.set(id,Object.assign(node(),{hidden:/\bhidden\b/.test(match[0])})); + } + const codeNode={textContent:''}; + const otp={token:async()=>options.otpToken||null,sendCode:async email=>email,verify:async()=>({access:'otp-token'}),...options.otp}; + for(const method of ['token','sendCode','verify']) {const fn=otp[method];otp[method]=async(...args)=>{calls.push([method,...args]);return fn(...args);};} + const auth={isAuthenticated:async()=>!!options.signedIn,getTokenSilently:async()=>'sdk-token',handleRedirectCallback:async()=>{},loginWithPopup:async()=>{},...options.auth}; + for(const method of Object.keys(auth)){const fn=auth[method];auth[method]=async(...args)=>{calls.push([method,...args]);return fn(...args);};} + const values=new Map(options.storage||[]); + const location={origin:'https://aesthetic.computer',search:options.search||'?code=ABC234'}; + const context={URLSearchParams,document:{createElement:()=>node(),getElementById:id=>nodes.get(id),querySelector:()=>codeNode,body:{classList:{toggle(){}}}}, + location,window:{location},sessionStorage:{getItem:key=>values.get(key),setItem:(key,value)=>values.set(key,value)}, + history:{replaceState(...args){calls.push(['replaceState',...args]);}}, + otpSignIn:config=>{calls.push(['otpConfig',config]);return otp;}, + auth0:{Auth0Client:function(config){calls.push(['sdkConfig',config]);return auth;}}, + fetch:async(url,request)=>{calls.push(['fetch',url,request]);return options.fetch?options.fetch(url,request):{ok:true,status:200,json:async()=>({handle:'alice',kind:'browser'})};}}; + vm.createContext(context); + const script=body.match(/')}}); + assert.equal(bad.nodes.get('email-form').hidden,true);assert.equal(bad.calls.some(c=>['token','sdkConfig','fetch'].includes(c[0])),false); + assert.ok(!bad.body.includes('')); + const f=await browser({otpToken:'private',fetch:async()=>({ok:true,status:200,json:async()=>({handle:'',kind:'browser'})})}); + assert.match(f.nodes.get('status').textContent,//);assert.equal(f.nodes.get('status').innerHTML,undefined); +}); +test('failed device claim retries with same private token without sending another email',async()=>{ + let fails=true; + const f=await browser({otpToken:'private',fetch:async()=>{if(fails)throw Error('offline');return {ok:true,status:200,json:async()=>({handle:'alice',kind:'browser'})};}}); + assert.equal(f.nodes.get('retry-pair').hidden,false);fails=false;await f.fire('retry-pair'); + assert.equal(f.calls.filter(c=>c[0]==='fetch' && c[1]==='/api/device-pair').length,2);assert.equal(f.calls.some(c=>c[0]==='sendCode'),false);assert.equal(f.nodes.get('status').className,'ok'); +}); + + test('paired handle uses saved colors for every character including @, without sending auth to palette lookup',async()=>{ + const colors=Array.from({length:6},(_,i)=>({r:20+i,g:70+i,b:100+i})); + const f=await browser({otpToken:'secret',fetch:async url=>({ok:true,status:200,json:async()=>url.startsWith('/api/oskiewar-leaderboard')?{players:[{handle:'alice',colors}]}:{handle:'alice',kind:'browser'}})}); + const handle=f.nodes.get('status').children[1]; + assert.equal(handle.textContent,'@alice'); + assert.deepEqual(handle.children.map(c=>c.style.color),colors.map(c=>'rgb('+[c.r,c.g,c.b].join(',')+')')); + assert.equal(f.calls.find(c=>c[0]==='fetch' && c[1].startsWith('/api/oskiewar-leaderboard'))[2],undefined); +}); +test('palette failures retain successful login and readable plain handle',async()=>{ + const f=await browser({otpToken:'secret',fetch:async url=>{if(url.startsWith('/api/oskiewar-leaderboard'))throw Error('offline');return {ok:true,status:200,json:async()=>({handle:'alice',kind:'browser'})};}}); + assert.equal(f.nodes.get('status').className,'ok');assert.match(f.nodes.get('status').textContent,/Paired as @alice/); + assert.equal(f.nodes.get('retry-pair').hidden,true); +}); diff --git a/system/backend/tests/oskiewar-leaderboard-mongo.test.mjs b/system/backend/tests/oskiewar-leaderboard-mongo.test.mjs new file mode 100644 index 0000000000..23b6cfd98d --- /dev/null +++ b/system/backend/tests/oskiewar-leaderboard-mongo.test.mjs @@ -0,0 +1,58 @@ +// Optional real-Mongo verification. Use an isolated Mongo server, never production: +// OSKIEWAR_TEST_MONGO=mongodb://127.0.0.1:27029 node --test system/backend/tests/oskiewar-leaderboard-mongo.test.mjs +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { randomUUID } from 'node:crypto'; +import { COLLECTION, createLeaderboardHandler } from '../oskiewar-leaderboard.mjs'; + +test('real Mongo: concurrent consensus, aggregate ranking, current handles and pair stats', { skip: !process.env.OSKIEWAR_TEST_MONGO }, async () => { + const uri = process.env.OSKIEWAR_TEST_MONGO; + assert.match(uri, /^mongodb:\/\/127\.0\.0\.1:\d+\/?$/, 'Only an explicit isolated loopback test server is allowed'); + const { MongoClient } = await import('mongodb'); + const client = await new MongoClient(uri).connect(); + const db = client.db(`oskiewar_test_${randomUUID().replaceAll('-', '')}`); + const users = [{ _id: 'auth0|test-a', handle: 'alice' }, { _id: 'auth0|test-b', handle: 'bob' }]; + try { + await db.collection('@handles').insertMany(users); + // Unauthenticated historical replays cannot become standings. + await db.collection('oskiewar-replays').insertOne({ fighters: ['alice', 'bob'], finalRoundWins: [999, 0] }); + const handler = createLeaderboardHandler({ + authorize: async ({ authorization }) => { + const user = users.find(u => authorization === `Bearer ${u._id}`); + return user && { sub: user._id }; + }, + connect: async () => ({ db, disconnect: async () => {} }), + respond: (statusCode, body) => ({ statusCode, body }), + }); + const body = { matchId: 'ow-real-mongo-first', handles: ['alice', 'bob'], roundWins: [5, 2], winner: 0 }; + const send = (seat, extra = {}) => handler({ httpMethod: 'POST', headers: { authorization: `Bearer ${users[seat]._id}` }, + body: JSON.stringify({ ...body, seat, ...extra }) }); + const replies = await Promise.all(Array.from({ length: 30 }, (_, i) => send(i % 2))); + assert.ok(replies.every(r => [200, 202].includes(r.statusCode))); + assert.equal(await db.collection(COLLECTION).countDocuments({ confirmedAt: { $exists: true } }), 1); + assert.equal((await send(1, { roundWins: [5, 3] })).statusCode, 409); + const second = { matchId: 'ow-real-mongo-second', winner: 1, roundWins: [4, 5] }; + await send(1, second); + await send(0, second); + await send(0, { matchId: 'ow-real-mongo-pending' }); + const read = () => handler({ httpMethod: 'GET', queryStringParameters: { handles: 'alice,bob' } }); + const response = await read(); + assert.equal(response.statusCode, 200); + assert.deepEqual(response.body.top.map(r => r.handle), ['alice', 'bob']); + assert.deepEqual(response.body.players.map(r => [r.matchesPlayed, r.matchesWon, r.roundsWon, r.roundsLost]), [[2, 1, 9, 7], [2, 1, 7, 9]]); + assert.equal(response.body.pair.matchesPlayed, 2); + assert.equal(JSON.stringify(response.body).includes('auth0|'), false); + assert.equal(JSON.stringify(response.body).includes('_id'), false); + await db.collection('@handles').updateOne({ _id: users[0]._id }, { $set: { handle: 'alicia' } }); + const renamed = await handler({ httpMethod: 'GET', queryStringParameters: { handles: 'alicia,bob' } }); + assert.equal(renamed.body.players[0].handle, 'alicia'); + assert.equal(renamed.body.players[0].matchesWon, 1); + assert.equal(renamed.body.pair.matchesPlayed, 2); + const indexes = await db.collection(COLLECTION).indexes(); + assert.ok(indexes.some(i => i.expireAfterSeconds === 0 && i.key.expiresAt === 1)); + assert.equal(await db.collection(COLLECTION).countDocuments({ confirmedAt: { $exists: true }, expiresAt: { $exists: true } }), 0); + } finally { + await db.dropDatabase(); + await client.close(); + } +}); diff --git a/system/backend/tests/oskiewar-leaderboard.test.mjs b/system/backend/tests/oskiewar-leaderboard.test.mjs new file mode 100644 index 0000000000..bee2092d36 --- /dev/null +++ b/system/backend/tests/oskiewar-leaderboard.test.mjs @@ -0,0 +1,149 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { COLLECTION, createLeaderboardHandler, validateResult, canonicalResult, standingsPipeline } from '../oskiewar-leaderboard.mjs'; + +const accounts = [{ _id: 'auth0|a', handle: 'alice' }, { _id: 'auth0|b', handle: 'bob' }]; +const result = { matchId: 'ow-befaru-nitova-gopasu', seat: 0, handles: ['alice', 'bob'], roundWins: [5, 2], winner: 0 }; +const get = (object, key) => key.split('.').reduce((o, k) => o?.[k], object); +function matches(doc, query) { + return Object.entries(query).every(([key, value]) => value && typeof value === 'object' && '$exists' in value + ? (get(doc, key) !== undefined) === value.$exists : get(doc, key) === value); +} +function fixture() { + const docs = new Map(); + const ledger = { + async insertOne(doc) { if (docs.has(doc._id)) throw Object.assign(Error('Duplicate'), { code: 11000 }); docs.set(doc._id, structuredClone(doc)); }, + async findOne(query) { return structuredClone([...docs.values()].find(d => matches(d, query))); }, + async updateOne(query, change) { + const doc = [...docs.values()].find(d => matches(d, query)); + if (!doc) return { matchedCount: 0 }; + for (const [path, value] of Object.entries(change.$set || {})) { + const keys = path.split('.'); let object = doc; + for (const key of keys.slice(0, -1)) object = object[key] ||= {}; + object[keys.at(-1)] = structuredClone(value); + } + for (const key of Object.keys(change.$unset || {})) delete doc[key]; + return { matchedCount: 1 }; + }, + async createIndex() {}, + aggregate(pipeline) { + assert.ok(pipeline[0].$match.confirmedAt.$exists, 'unconfirmed rows excluded'); + return { toArray: async () => [{ top: [], players: [] }] }; + }, + }; + const handleCollection = { + async findOne(query) { return accounts.find(a => matches(a, query)); }, + find() { return { toArray: async () => [] }; }, + }; + const handler = createLeaderboardHandler({ + authorize: async headers => { + const account = accounts.find(a => headers.authorization === `Bearer ${a._id}`); + return account && { sub: account._id }; + }, + connect: async () => ({ db: { collection: name => name === COLLECTION ? ledger : handleCollection }, disconnect: async () => {} }), + respond: (statusCode, body) => ({ statusCode, body }), + now: () => new Date('2026-09-24T12:00:00Z'), + }); + return { handler, docs, ledger }; +} +const post = (body = result, sub = 'auth0|a') => ({ httpMethod: 'POST', headers: { authorization: `Bearer ${sub}` }, body: JSON.stringify(body) }); +test('two distinct independently authenticated reports record exactly one match', async () => { + const { handler, docs } = fixture(); + assert.equal((await handler(post())).statusCode, 202); + let doc = docs.get(result.matchId); + assert.equal(doc.confirmedAt, undefined); + assert.ok(doc.expiresAt); + assert.equal((await handler(post({ ...result, seat: 1 }, 'auth0|b'))).body.status, 'recorded'); + doc = docs.get(result.matchId); + assert.ok(doc.confirmedAt); + assert.equal(doc.expiresAt, undefined); + assert.deepEqual(doc.players.map(p => p.subject), ['auth0|a', 'auth0|b']); + assert.equal(JSON.stringify(doc).includes('Bearer'), false); +}); + +test('anonymous, wrong-seat and client-supplied identity cannot record', async () => { + const { handler, docs } = fixture(); + assert.equal((await handler(post(result, 'forged'))).statusCode, 401); + assert.equal((await handler(post({ ...result, seat: 1, subject: 'auth0|b' }))).statusCode, 403); + assert.equal(docs.size, 0); +}); + +test('same account cannot occupy both seats, missing handles and incomplete rounds fail', async () => { + const { handler, docs } = fixture(); + for (const invalid of [ + { handles: ['alice', '@ALICE'] }, { handles: ['alice', 'missing'] }, + { roundWins: [1, 0] }, { roundWins: [5, 5] }, { winner: 1 }, + { roundWins: [5, 2.5] }, { seat: 2 }, { handles: [{ $ne: null }, 'bob'] }, + ]) assert.equal((await handler(post({ ...result, ...invalid }))).statusCode, 400); + assert.equal(docs.size, 0); +}); + +test('conflicting result never confirms, matching retry can complete', async () => { + const { handler, docs } = fixture(); + await handler(post()); + assert.equal((await handler(post({ ...result, seat: 1, roundWins: [5, 3] }, 'auth0|b'))).statusCode, 409); + assert.equal(docs.get(result.matchId).confirmedAt, undefined); + assert.equal((await handler(post({ ...result, seat: 1 }, 'auth0|b'))).statusCode, 200); +}); + +test('concurrent reports and retries are idempotent; completed result is immutable', async () => { + const { handler, docs } = fixture(); + const submissions = Array.from({ length: 30 }, (_, i) => handler(post({ ...result, seat: i % 2 }, i % 2 ? 'auth0|b' : 'auth0|a'))); + await Promise.all(submissions); + assert.equal(docs.size, 1); + const before = structuredClone(docs.get(result.matchId)); + assert.equal((await handler(post())).statusCode, 200); + assert.deepEqual(docs.get(result.matchId), before); + assert.equal((await handler(post({ ...result, roundWins: [1, 5], winner: 1 }))).statusCode, 409); + assert.deepEqual(docs.get(result.matchId), before); +}); + +test('repeated single-account reports do not confirm', async () => { + const { handler, docs } = fixture(); + await Promise.all(Array.from({ length: 10 }, () => handler(post()))); + assert.equal(docs.get(result.matchId).confirmedAt, undefined); + assert.deepEqual(Object.keys(docs.get(result.matchId).reports), ['0']); +}); + +test('canonical digest ignores body identities, spelling and unrelated client fields', () => { + const expected = canonicalResult(result, accounts).digest; + assert.equal(canonicalResult({ ...result, handles: ['@ALICE', '@BOB'], token: 'fake', subject: 'fake' }, accounts).digest, expected); + assert.notEqual(canonicalResult({ ...result, roundWins: [5, 3] }, accounts).digest, expected); + assert.notEqual(canonicalResult(result, accounts.toReversed()).digest, expected); +}); + +test('strict bounded input, CORS and public read behavior', async () => { + const { handler } = fixture(); + assert.equal((await handler({ ...post(), body: 'x'.repeat(4097) })).statusCode, 413); + assert.equal((await handler({ ...post(), body: '{' })).statusCode, 400); + assert.equal((await handler({ httpMethod: 'OPTIONS' })).statusCode, 204); + assert.equal((await handler({ httpMethod: 'DELETE' })).statusCode, 405); + assert.equal((await handler({ httpMethod: 'GET', queryStringParameters: { handles: 'a,b,c' } })).statusCode, 400); + const response = await handler({ httpMethod: 'GET', queryStringParameters: { handles: '@ALICE,bob' } }); + assert.equal(response.statusCode, 200); + assert.deepEqual(response.body.players.map(p => p.handle), ['alice', 'bob']); + assert.equal(JSON.stringify(response.body).includes('auth0|'), false); +}); + +test('standings count only confirmed ledger matches and resolve current handles', () => { + const pipeline = standingsPipeline(); + assert.deepEqual(pipeline[0], { $match: { confirmedAt: { $exists: true } } }); + assert.equal(pipeline[2].$group._id, '$players.subject'); + assert.equal(pipeline[3].$lookup.from, '@handles'); + assert.equal(validateResult(result), null); +}); + +test('public standings expose saved per-character colors even before the first ranked match',async()=>{ + const {readStandings}=await import('../oskiewar-leaderboard.mjs'); + const colors=Array.from({length:6},(_,i)=>({r:i,g:80,b:150,private:'discard'})); + const db={collection:name=>name==='@handles' + ? {find:()=>({toArray:async()=>[{_id:'private-sub',handle:'alice',colors}]})} + : {aggregate:()=>({toArray:async()=>[{top:[{_id:'private-sub',handle:'alice',colors}],players:[]}]})}}; + const result=await readStandings(db,['alice']); + for(const row of [result.top[0],result.players[0]]) { + assert.deepEqual(row.colors,colors.map(({r,g,b})=>({r,g,b}))); + assert.equal(row._id,undefined); + } + assert.equal(result.players[0].matchesPlayed,0); + assert.ok(!JSON.stringify(result).includes('private')); +}); diff --git a/system/netlify/functions/device-pair-login.mjs b/system/netlify/functions/device-pair-login.mjs index 87050d6d9f..4e2a0eaca6 100644 --- a/system/netlify/functions/device-pair-login.mjs +++ b/system/netlify/functions/device-pair-login.mjs @@ -3,149 +3,239 @@ // Handles Auth0 login flow, then claims the device-pair code with user's // handle, AC token, and device tokens (Claude + GitHub). -import { respond } from "../../backend/http.mjs"; - export async function handler(event) { - const params = new URLSearchParams(event.rawQuery || ""); - const code = params.get("code") || ""; - const baseUrl = process.env.URL || "https://aesthetic.computer"; + const params = new URLSearchParams(event.rawQuery || event.rawQueryString || + event.queryStringParameters || String(event.rawUrl || "").split("?")[1] || ""); + const requestedCode = params.get("code") || ""; + const code = /^[A-Z0-9]{6}$/i.test(requestedCode) ? requestedCode.toUpperCase() : ""; const html = ` - + -AC Device Login +Sign in · Aesthetic Computer + -
-

AC Device Login

-
${code || "------"}
-
-

Sign in to switch this device's identity.

- -
-
+
+ aesthetic.computer +

Sign in

+
${code || "------"}
+
+ + + +
+ +
+ + +
- `; diff --git a/system/netlify/functions/oskiewar-leaderboard.mjs b/system/netlify/functions/oskiewar-leaderboard.mjs new file mode 100644 index 0000000000..2a5e703b66 --- /dev/null +++ b/system/netlify/functions/oskiewar-leaderboard.mjs @@ -0,0 +1,6 @@ +// Authenticated two-player match standings; independent of unverified replays. +import { authorize } from '../../backend/authorization.mjs'; +import { connect } from '../../backend/database.mjs'; +import { respond } from '../../backend/http.mjs'; +import { createLeaderboardHandler } from '../../backend/oskiewar-leaderboard.mjs'; +export const handler = createLeaderboardHandler({ authorize, connect, respond }); diff --git a/system/public/aesthetic.computer/boot.mjs b/system/public/aesthetic.computer/boot.mjs index 01fbc05938..80b642e02a 100644 --- a/system/public/aesthetic.computer/boot.mjs +++ b/system/public/aesthetic.computer/boot.mjs @@ -1339,12 +1339,8 @@ if (!parsed.search) { const nogap = params.has("nogap") || params.has("desktop") || location.search.includes("nogap") || location.host.includes("wipppps.world"); -// Check for nolabel parameter (no localStorage persistence). `desktop` used to -// imply it too, back when the Electron pane had its own card chrome; the pane -// wears the native title bar now and wants the corner label like any page. The -// implied flag also got written into the URL (`preservedParams`), so the label -// drew on the first piece and vanished for good on the next reload. -const nolabel = params.has("nolabel") || location.search.includes("nolabel"); +// Check for nolabel parameter (no localStorage persistence) +const nolabel = params.has("nolabel") || params.has("desktop") || location.search.includes("nolabel"); // An embedded view has nobody to tap the update badge: a green arrow parked // in the corner of a 128-point preview card is a control nobody can reach, @@ -1356,7 +1352,7 @@ const autoreload = params.has("autoreload") || location.search.includes("autorel // prompt/corner chrome in DOM; the composited equivalents stand down. const shellhtml = params.has("shellhtml") || location.search.includes("shellhtml"); -// Check for desktop mode (Electron app) - implies nogap +// Check for desktop mode (Electron app) - combines nogap + nolabel const desktop = params.has("desktop") || location.search.includes("desktop"); // Check for device parameter early (needed for density handling) diff --git a/system/public/aesthetic.computer/disks/arena.mjs b/system/public/aesthetic.computer/disks/arena.mjs index 34a0912c05..fdade18aa4 100644 --- a/system/public/aesthetic.computer/disks/arena.mjs +++ b/system/public/aesthetic.computer/disks/arena.mjs @@ -20,7 +20,6 @@ import { BTN, packCmd, pmove } from "../lib/pmove.mjs"; import { ARENA_OBSTACLES, ARENA_OBSTACLE_COLORS, ARENA_PHYSICS } from "../lib/arena-world.mjs"; -import { humanoid } from "../lib/humanoid.mjs"; let myHandle = "guest"; let netServer = null; // WebSocket (reliable) @@ -624,8 +623,86 @@ function isGuestHandle(h) { // remote's eye coords without offset gymnastics. Face-side (+Z in body-local) // gets a darker visor tone so you can tell which way the player is looking. function buildRemoteBody(Form, colorRGB, watcher = false) { - // The person itself lives in lib/humanoid.mjs, shared with lairk. - const { positions, colors } = humanoid(colorRGB, { watcher }); + const [R, G, B] = colorRGB; + const a = watcher ? 0.55 : 1.0; + const r = R / 255, g = G / 255, b = B / 255; + // Tone tiers from the deterministic per-handle hue. + const main = [r, g, b, a]; + const dark = [r * 0.55, g * 0.55, b * 0.55, a]; + const light = [Math.min(1, r * 1.18), Math.min(1, g * 1.18), Math.min(1, b * 1.18), a]; + const skinHead = [ + Math.min(1, r * 0.4 + 0.5), + Math.min(1, g * 0.4 + 0.45), + Math.min(1, b * 0.4 + 0.4), + a, + ]; + const visor = watcher + ? [0.55, 0.6, 0.7, a] + : [0.08, 0.08, 0.12, a]; + + const positions = []; + const colors = []; + // Push one axis-aligned box (in body-local coords). `faces` can override + // each face individually; missing faces fall back to `main`. + const pushBox = (xMin, yMin, zMin, xMax, yMax, zMax, faces) => { + const top = faces.top ?? faces.main; + const bot = faces.bot ?? faces.main; + const north = faces.north ?? faces.side ?? faces.main; // -Z + const south = faces.south ?? faces.side ?? faces.main; // +Z (face/forward) + const east = faces.east ?? faces.side ?? faces.main; // +X + const west = faces.west ?? faces.side ?? faces.main; // -X + const v = (x, y, z) => [x, y, z, 1]; + const quad = (A, B, C, D, c) => { + positions.push(A, B, C, A, C, D); + for (let i = 0; i < 6; i++) colors.push(c); + }; + quad(v(xMin,yMax,zMin), v(xMin,yMax,zMax), v(xMax,yMax,zMax), v(xMax,yMax,zMin), top); + quad(v(xMin,yMin,zMin), v(xMax,yMin,zMin), v(xMax,yMin,zMax), v(xMin,yMin,zMax), bot); + quad(v(xMin,yMin,zMin), v(xMin,yMax,zMin), v(xMax,yMax,zMin), v(xMax,yMin,zMin), north); + quad(v(xMax,yMin,zMax), v(xMax,yMax,zMax), v(xMin,yMax,zMax), v(xMin,yMin,zMax), south); + quad(v(xMax,yMin,zMin), v(xMax,yMax,zMin), v(xMax,yMax,zMax), v(xMax,yMin,zMax), east); + quad(v(xMin,yMin,zMax), v(xMin,yMax,zMax), v(xMin,yMax,zMin), v(xMin,yMin,zMin), west); + }; + + // Body coordinate convention (matches the prior stick figure): + // y=+0.35 head top, y=0 shoulder/eye, y=-1.1 hip, y=-2.0 feet. + // +Z is the player's forward direction (they face +Z at yaw=0). + + // Torso — primary handle color. + pushBox(-0.30, -1.10, -0.18, 0.30, -0.40, 0.18, { + main, top: light, bot: dark, north: dark, south: main, + }); + + // Head — neutral skin tone with a darker visor on the front (+Z) so the + // facing direction reads at a glance. + pushBox(-0.22, -0.05, -0.20, 0.22, 0.35, 0.20, { + main: skinHead, + top: [ + Math.min(1, skinHead[0] * 1.05), + Math.min(1, skinHead[1] * 1.05), + Math.min(1, skinHead[2] * 1.05), + a, + ], + bot: dark, + south: visor, // +Z = face + }); + + // Arms — thin boxes on either side of the torso. + pushBox(-0.50, -1.05, -0.12, -0.32, -0.40, 0.12, { + main: dark, top: main, bot: dark, + }); + pushBox( 0.32, -1.05, -0.12, 0.50, -0.40, 0.12, { + main: dark, top: main, bot: dark, + }); + + // Legs — squarer boxes from hip to feet. + pushBox(-0.22, -2.00, -0.14, -0.04, -1.10, 0.14, { + main: dark, top: main, bot: [0, 0, 0, a], + }); + pushBox( 0.04, -2.00, -0.14, 0.22, -1.10, 0.14, { + main: dark, top: main, bot: [0, 0, 0, a], + }); + const f = new Form( { type: "triangle", positions, colors }, { pos: [0, 0, 0], rot: [0, 0, 0], scale: 1 }, diff --git a/system/public/aesthetic.computer/disks/chat.mjs b/system/public/aesthetic.computer/disks/chat.mjs index 8cd0bf33fd..eca754dc49 100644 --- a/system/public/aesthetic.computer/disks/chat.mjs +++ b/system/public/aesthetic.computer/disks/chat.mjs @@ -555,11 +555,6 @@ let messageCopyModal = null; let editingMessage = null; let deleteAllowed = true; // Delete is allowed by default in all chat contexts let fightChallengeSocket = null; -// A piece can only hold one session-socket receiver, and chat.boot claims it -// (for fight challenges) after an await. A host piece that also needs the -// socket passes `onSocket` to boot and hears every message here instead, -// with the socket itself as the fourth argument. (lairk does.) -let socketListener = null; let fightChallengeReady = false; let fightPendingInvite = null; @@ -925,9 +920,7 @@ async function boot( // `fight @handle` works in both chat and laklok because laklok inherits this // module. Authentication is independently verified by the fight coordinator; // neither chat text nor a client-supplied handle can authorize a challenge. - socketListener = options?.onSocket || null; fightChallengeSocket = net.socket((_id, type, content) => { - socketListener?.(_id, type, content, fightChallengeSocket); if (type.startsWith("connected") && token) { fightChallengeSocket.send("fight:auth", { token }); } else if (type === "fight:auth:ok") { diff --git a/system/public/aesthetic.computer/disks/dibaka.mjs b/system/public/aesthetic.computer/disks/dibaka.mjs new file mode 100644 index 0000000000..e3f9c07783 --- /dev/null +++ b/system/public/aesthetic.computer/disks/dibaka.mjs @@ -0,0 +1,9 @@ +// dibaka, 26.09.23 +// A blank Aesthetic Computer piece. + +function paint({ wipe }) { + wipe("#e08461"); + return false; // Painted once; return true to keep painting. +} + +export { paint }; diff --git a/system/public/aesthetic.computer/disks/lairk.mjs b/system/public/aesthetic.computer/disks/lairk.mjs index ba072207f3..43145d27e9 100644 --- a/system/public/aesthetic.computer/disks/lairk.mjs +++ b/system/public/aesthetic.computer/disks/lairk.mjs @@ -17,14 +17,11 @@ the answer. Each handle stands where it last stood (or a default spot around the tower), lit when online and dimmed when not. - Walking is arena's (Quake pmove, jump, a platform with thickness) with - oskiewar's netcode — see lib/lairk-world.mjs. Your body is predicted from - your inputs at a fixed 60 Hz and sent to the session server - (session-server/lairk-manager.mjs) by tick; the server runs the same step - and is the truth, and when it answers we snap to it and replay what it - hasn't seen. Everyone else is drawn ~100 ms behind, between snapshots. - Cameras: third person (behind you) or first (your eyes), `v` to switch; - watchers who can't walk get an orbit around the tower. + Walking: the session server (session-server/lairk-manager.mjs) lets a + verified handle on that roster move, keeps it on the ground and at a run, + remembers where every handle stood, and relays positions to everyone + watching. Your own body moves the frame you press; everyone else glides to + where the server last saw them — never guessed ahead. */ /* #region 🏁 TODO @@ -32,8 +29,6 @@ - [x] Walking — position relay ~10 Hz, remotes glide. - [x] Server-side move gate (spoke + mentioned by someone else). - [x] Remember each handle's position within lairk. - - [x] Arena controls, jump, bodies and platform; first/third person. - - [x] Oskiewar-style netcode: inputs by tick, prediction + replay. #endregion */ import { Chat } from "../lib/chat.mjs"; @@ -45,19 +40,6 @@ import { realtimeTick, lakChatOptions, } from "./common/laklok-tema.mjs"; -import { humanoid, HUMANOID_TORSO } from "../lib/humanoid.mjs"; -import { - lairkSpawn, - lairkStep, - packInput, - unpackState, - BTN, - LAIRK_DT, - LAIRK_HALF, - LAIRK_THICKNESS, - LAIRK_TOWER_HALF, - LAIRK_TOWER_TOP, -} from "../lib/lairk-world.mjs"; const { sin, cos, tan, sqrt, min, max, floor, PI } = Math; @@ -65,11 +47,7 @@ let client; // The `clock` chat connection (the same room as laklok). let lakTheme = "ler"; // The visitor's laklok tema, so the chat wears it here too. let get; // `$.get`, kept for loading paintings as handles appear. -// 🎥 Cameras: "orbit" around the tower (watchers), or — once you walk — -// "third" (behind you) and "first" (your eyes). -let view = "orbit"; -let look = { yaw: 180, pitch: -8 }; // Where you face, degrees; +pitch is up. -let penLocked = false; // Mouse captured for looking (desktop). +// 🎥 Orbit camera around the tower. const FOV = 60; const NEAR = 0.1; const FAR = 400; @@ -82,7 +60,7 @@ let camMatrix = null; // P·V — projects world points for labels const cam = { matrix: null, resize() {} }; // What `form` reads. // 🌍 World forms. -let ground, tower, faces, shadow; +let ground, tower, faces; let hands = null; // Rebuilt when the minute changes. let handsMinute = -1; @@ -105,39 +83,21 @@ const rosterColors = new Map(); // handle -> per-letter colors from @handles. let server = null; // The session socket, for lairk:* messages. let walker = null; // Your handle, once the server lets you walk. let walkNo = null; // Why not ("login", "mention", "unavailable"). -let socketReady = false; // The session socket has said "connected". -let authAsked = false; // A walk request has gone out for this socket. const placed = new Map(); // handle -> { x, z, facing } the server remembers. - -// Prediction (oskiewar §5): your body runs locally at a fixed tick, and the -// inputs the server hasn't acknowledged wait here to be replayed. -let me = null; // { state, home } — your predicted body. -let tick = 0; // Your last simulated input tick. -let stepClock = 0; // Leftover time toward the next tick, seconds. -let lastSim = 0; // performance.now() of the previous sim. -const pending = []; // [{ tick, cmd }] not yet acknowledged. -const SEND_EVERY = 2; // Ticks between input packets (30 Hz)... -const REDUNDANCY = 6; // ...each carrying the last few inputs again. -const correction = [0, 0, 0]; // Visual offset after a snap, eased away. - -// Everyone else, drawn in the past between snapshots, never ahead. -const remotes = new Map(); // handle -> [{ at, s }] (at = server ms) -let clockOffset = null; // Estimated server ms minus local ms. -const INTERP_MS = 100; - -// Input. -const held = new Set(); // Movement keys held down. -let walkTo = null; // { x, z } — a tap on the ground steers you there. -let tap = null; // { travel } — a touch that hasn't become a look drag yet. -const MOVE_KEYS = { - w: "fwd", arrowup: "fwd", +const held = new Set(); // Walk keys held down. +let walkTo = null; // { x, z } — where a tap asked to go. +let tap = null; // { travel } — a touch that hasn't become an orbit drag yet. +let lastSent = 0; // When a move last went out, ms. +let unsent = false; // Moved since then. +let lastSim = 0; // For a real-time step. +const WALK_SPEED = 5; // Units per second; the server allows up to 9. +const SEND_MS = 100; // ~10 Hz while moving. +const WALK_KEYS = { + w: "forward", arrowup: "forward", s: "back", arrowdown: "back", a: "left", arrowleft: "left", d: "right", arrowright: "right", - space: "jump", - shift: "crouch", }; -let viewChip = null; // Tap target for the 1st / 3rd toggle. // 💬 Speech bubbles: handle -> { text, until }. const bubbles = new Map(); @@ -152,7 +112,7 @@ let readoutBox = null; // Tap target for the top readout. let closeBox = null; // Tap target for "world" while the chat is open. let notice = null; // { text, until } — the walking gate courtesy note. -function boot({ api, Form, debug, send, hud, store, colon, params, get: getter }) { +function boot({ api, Form, debug, send, hud, store, colon, params, get: getter, net, handle, authorize }) { get = getter; const tema = pickTema([...(colon || []), ...(params || [])], store); lakTheme = tema.name; @@ -165,24 +125,7 @@ function boot({ api, Form, debug, send, hud, store, colon, params, get: getter } client = new Chat(debug, send); client.connect("clock"); // Same room as laklok. (DB stays `chat-clock`.) - // 🚶 chat.boot owns the session socket (a piece gets one receiver), so - // lairk listens through it: watch everyone's positions, and ask to walk - // once signed in. The server checks the token and the roster. - socketReady = false; - authAsked = false; - server = null; - chat.boot(api, client.system, { - onSocket: (_id, type, content, socket) => { - server = socket; - if (type.startsWith("connected")) { - socketReady = true; - authAsked = false; // A fresh socket needs its own walk request. - server.send("lairk:hello", {}); - } else if (type.startsWith("lairk:")) { - receiveLairk(type, parse(content)); - } - }, - }); + chat.boot(api, client.system); hud.qr(null); // chat.boot stamps a prompt.ac/chat QR; lairk doesn't want it. hud.label("lairk"); @@ -201,19 +144,25 @@ function boot({ api, Form, debug, send, hud, store, colon, params, get: getter } placed.clear(); held.clear(); walkTo = null; - me = null; - tick = 0; - stepClock = 0; - pending.length = 0; - remotes.clear(); - clockOffset = null; - correction.fill(0); - view = "orbit"; focus[0] = 0; focus[2] = 0; + // 🚶 Watch everyone's positions; ask to walk when signed in. The server + // checks the token and the roster — this piece never claims a handle. + server = net?.socket?.((_id, type, content) => { + if (type.startsWith("connected")) { + server.send("lairk:hello", {}); + if (handle?.() && authorize) { + Promise.resolve(authorize()) + .then((token) => token && server.send("lairk:auth", { token })) + .catch(() => (walkNo = "login")); + } + return; + } + if (type.startsWith("lairk:")) receiveLairk(type, parse(content)); + }); + ground = buildGround(Form); - shadow = buildShadow(Form); tower = buildTower(Form); faces = buildFaces(Form); } @@ -241,26 +190,13 @@ function paint($) { form([ground, tower, faces, hands], cam, { cpu: true }); for (const c of characters.values()) { if (c.dirty) dress($.Form, c); - const p = placeFor(c); - c.rx = p.x; c.ry = p.y; c.rz = p.z; // Where it's drawn (tags use it). - if (c.handle === walker && view === "first") continue; // You are the camera. for (const part of [c.base, c.torso]) { - if (!part) continue; - part.position[0] = p.x; - part.position[1] = p.y; // Eye height: the humanoid hangs below it. - part.position[2] = p.z; - part.rotation[1] = p.yaw; + part.position[0] = c.x; + part.position[1] = 0; + part.position[2] = c.z; + part.rotation[1] = c.facing || 0; } form([c.base, c.torso], cam, { cpu: true }); - // A drop shadow on the platform, smaller the higher you are. - if (Math.abs(p.x) < LAIRK_HALF && Math.abs(p.z) < LAIRK_HALF) { - const k = clamp(1 - (p.y - 2) / 6, 0.35, 1); - shadow.position[0] = p.x; - shadow.position[1] = 0.02; - shadow.position[2] = p.z; - shadow.scale = [k, 1, k]; - form(shadow, cam, { cpu: true }); - } } paintTags($); @@ -278,7 +214,6 @@ function paint($) { } else { paintReadout($); paintHint($); - paintViewChip($); } paintNotice($); @@ -313,7 +248,6 @@ function act($) { chatOpen = true; held.clear(); // Typing "wasd" into the chat shouldn't walk you. tap = null; - walkTo = null; // Signed in, go straight to typing. Signed out, chat.mjs reads an open // keyboard as "log in", so leave that to its own Log in button. if ($.handle?.()) send({ type: "keyboard:open" }); @@ -325,52 +259,33 @@ function act($) { return; } - if (e.is("pen:locked")) penLocked = true; - if (e.is("pen:unlocked")) penLocked = false; - - // 👀 Walking: look with the mouse (click to capture it) or by dragging; - // `v` or the chip switches between third and first person. - if (walker) { - if (e.is("touch") && hit(viewChip)) { - toggleView(); - return; - } - if (e.is("keyboard:down:v")) toggleView(); - if (e.is("touch") && e.device === "mouse" && !penLocked) $.penLock(); - if (penLocked && e.is("move")) turn(e.delta.x * 0.2, e.delta.y * 0.2); - } - - // A touch that barely travels is a tap (walk there); one that drags looks. + // A touch that barely travels is a tap: walk there. One that drags orbits. if (e.is("touch")) tap = { travel: 0 }; if (e.is("draw")) { if (tap) tap.travel += Math.abs(e.delta.x) + Math.abs(e.delta.y); - if (walker) { - if (!penLocked) turn(e.delta.x * 0.35, e.delta.y * 0.35); - } else { - orbitAngle -= e.delta.x * 0.012; - orbitHeight = clamp(orbitHeight + e.delta.y * 0.05, 1.5, 16); - lastLookAt = performance.now(); - } + orbitAngle -= e.delta.x * 0.012; + orbitHeight = clamp(orbitHeight + e.delta.y * 0.05, 1.5, 16); + lastLookAt = performance.now(); } if (e.is("lift") && tap) { - if (tap.travel < 6 && !penLocked) { + if (tap.travel < 6) { if (walker) walkTo = groundPoint($.screen, e.x, e.y); else notice = { text: walkNotice($), until: performance.now() + 4000 }; } tap = null; } - if (e.is("scroll") && !walker) { + if (e.is("scroll")) { orbitRadius = clamp(orbitRadius + e.y * 0.02, 8, 34); lastLookAt = performance.now(); } - for (const key of Object.keys(MOVE_KEYS)) { + for (const key of Object.keys(WALK_KEYS)) { if (e.is(`keyboard:down:${key}`)) { - if (walker) held.add(MOVE_KEYS[key]); - else if (key !== "shift") notice = { text: walkNotice($), until: performance.now() + 4000 }; + if (walker) held.add(key); + else notice = { text: walkNotice($), until: performance.now() + 4000 }; } - if (e.is(`keyboard:up:${key}`)) held.delete(MOVE_KEYS[key]); + if (e.is(`keyboard:up:${key}`)) held.delete(key); } } @@ -378,18 +293,13 @@ function sim($) { if (lakTheme === "realtime" && realtimeTick()) chat.refresh(client.system); chat.sim($); - // The socket often connects before sign-in settles, so ask to walk as soon - // as both are ready — whichever comes last. - if (socketReady && !authAsked && $.handle?.()) askToWalk($.authorize); - const now = performance.now(); - const dt = lastSim ? min(0.25, (now - lastSim) / 1000) : 0; + const dt = lastSim ? min(0.1, (now - lastSim) / 1000) : 0; lastSim = now; if (!walker && now - lastLookAt > 5000) orbitAngle += 0.0012; // Drift. - predict(dt); - const ease = Math.exp(-dt * 12); // Snap corrections fade over ~100 ms. - for (let i = 0; i < 3; i++) correction[i] *= ease; + walk(dt, now); + glide(dt); noticeNewMessages(); if (Date.now() - eligibleAt > ROSTER_MS) askRoster(); @@ -419,38 +329,14 @@ export { boot, paint, act, sim, leave }; // (-x, y, -z) (see Vertex.transform in lib/graph.mjs), lands it where P·V // puts the plain world point. Also keeps P·V for projecting labels. function updateCamera(screen) { - let eye; - let target; - if (walker && me) { - const p = { - x: me.state.x + correction[0], - y: me.state.y + correction[1], - z: me.state.z + correction[2], - }; - const yr = (look.yaw * PI) / 180; - const pr = (look.pitch * PI) / 180; - const ahead = [sin(yr) * cos(pr), sin(pr), cos(yr) * cos(pr)]; - if (view === "first") { - eye = [p.x, p.y, p.z]; - target = [p.x + ahead[0], p.y + ahead[1], p.z + ahead[2]]; - } else { - // Third person: behind and a little above, looking past your head. - const back = 5; - eye = [p.x - ahead[0] * back, p.y + 0.8 - ahead[1] * back, p.z - ahead[2] * back]; - eye[1] = max(eye[1], 0.4); // Not under the platform. - target = [p.x + ahead[0] * 2, p.y + 0.3 + ahead[1] * 2, p.z + ahead[2] * 2]; - } - } else { - eye = [ - focus[0] + sin(orbitAngle) * orbitRadius, - orbitHeight, - focus[2] + cos(orbitAngle) * orbitRadius, - ]; - target = focus; - } - const viewMatrix = lookAt(eye, target); + const eye = [ + focus[0] + sin(orbitAngle) * orbitRadius, + orbitHeight, + focus[2] + cos(orbitAngle) * orbitRadius, + ]; + const view = lookAt(eye, focus); const proj = perspective(FOV, screen.width / screen.height, NEAR, FAR); - camMatrix = mul(proj, viewMatrix); + camMatrix = mul(proj, view); cam.matrix = mul(camMatrix, [-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1]); } @@ -524,44 +410,20 @@ const clamp = (n, lo, hi) => max(lo, min(hi, n)); // 🚶 Walking -// Hand the server a token; it checks it and the roster, and answers. -function askToWalk(authorize) { - authAsked = true; - if (!authorize) return (walkNo = "login"); - Promise.resolve(authorize()) - .then((token) => { - if (!token) return (walkNo = "login"); // Signed in, but no token to show. - server.send("lairk:auth", { token }); - // An answer comes back in well under a second; silence means trouble. - setTimeout(() => { - if (!walker && !walkNo) walkNo = "unavailable"; - }, 8000); - }) - .catch(() => (walkNo = "login")); -} - // Messages from the session server (session-server/lairk-manager.mjs). function receiveLairk(type, data) { if (!data) return; if (type === "lairk:state") { - for (const [h, p] of Object.entries(data.positions || {})) place(h, p); + for (const [h, p] of Object.entries(data.positions || {})) place(h, p, true); + } else if (type === "lairk:pos") { + place(data.handle, data, false); } else if (type === "lairk:auth:ok") { walker = data.handle; walkNo = null; - me = { state: unpackState(data.state), home: data.home }; - tick = 0; - pending.length = 0; - correction.fill(0); - look.yaw = me.state.yaw; - look.pitch = -8; - view = "third"; + if (data.at) place(walker, data.at, true); + lastLookAt = performance.now(); // Stop the drift; the camera is yours now. } else if (type === "lairk:auth:no") { walkNo = data.reason || "mention"; - } else if (type === "lairk:snap") { - snapshot(data); - } else if (type === "lairk:still") { - remotes.delete(data.handle); - place(data.handle, data); } } @@ -570,143 +432,96 @@ function parse(content) { try { return JSON.parse(content); } catch { return null; } } -// Where the server remembers a handle standing (not walking right now). -function place(handle, p) { +// Where the server says a handle is. `snap` jumps there (a first sight); +// otherwise the body glides to it. +function place(handle, p, snap) { if (!handle || !Number.isFinite(p?.x) || !Number.isFinite(p?.z)) return; const h = handle.toLowerCase(); + if (h === walker && !snap) return; // Yours moves locally, not by echo. placed.set(h, { x: p.x, z: p.z, facing: p.facing || 0 }); const c = characters.get(h); - if (!c || h === walker) return; - c.x = p.x; - c.z = p.z; + if (!c) return; + c.tx = p.x; + c.tz = p.z; c.facing = p.facing || 0; -} - -// Your input this tick, from keys (relative to where you face) or a tap. -function currentInput() { - let fwd = (held.has("fwd") ? 1 : 0) - (held.has("back") ? 1 : 0); - let right = (held.has("right") ? 1 : 0) - (held.has("left") ? 1 : 0); - let yaw = look.yaw; - if (fwd || right) walkTo = null; - else if (walkTo && me) { - const dx = walkTo.x - me.state.x; - const dz = walkTo.z - me.state.z; - if (Math.hypot(dx, dz) < 0.4) walkTo = null; - else { - yaw = (Math.atan2(dx, dz) * 180) / PI; // pmove: yaw 0 faces +z. - look.yaw = yaw; - fwd = 1; - } - } - const buttons = (held.has("jump") ? BTN.JUMP : 0) | (held.has("crouch") ? BTN.CROUCH : 0); - return { fwd, right, yaw, pitch: look.pitch, buttons }; -} - -// Fixed-step prediction: one lairkStep per 1/60 s of real time, each input -// kept until the server acknowledges it, sent a few times over for loss. -function predict(dt) { - if (!me || !server) return; - stepClock = min(stepClock + dt, 0.25); // After a stall, don't sprint to catch up. - while (stepClock >= LAIRK_DT) { - stepClock -= LAIRK_DT; - tick += 1; - const cmd = currentInput(); - me.state = lairkStep(me.state, cmd, me.home); - pending.push({ tick, cmd }); - if (tick % SEND_EVERY === 0) { - const inputs = pending.slice(-REDUNDANCY).map((p) => packInput(p.tick, p.cmd)); - server.send("lairk:input", { inputs }); - } + if (snap) { + c.x = p.x; + c.z = p.z; } - if (pending.length > 240) pending.splice(0, pending.length - 240); // 4 s cap. } -// A snapshot: adopt the server's truth for you and replay what's in flight -// (oskiewar reconciliation); buffer everyone else for interpolation. -function snapshot(data) { - const local = performance.now(); - if (Number.isFinite(data.ms)) { - // Max-filter the offset: the least-delayed packet is the best estimate. - const sample = data.ms - local; - clockOffset = clockOffset === null ? sample : max(sample, clockOffset - 1); +// Your own body moves the frame you press, then tells the server (~10 Hz). +function walk(dt, now) { + const me = walker && characters.get(walker); + if (!me || dt === 0) return; + + // Keys walk relative to the camera; a tap walks to a spot. + const forward = [-sin(orbitAngle), -cos(orbitAngle)]; + const right = [-cos(orbitAngle), sin(orbitAngle)]; + let dx = 0; + let dz = 0; + for (const key of held) { + const way = WALK_KEYS[key]; + if (way === "forward") { dx += forward[0]; dz += forward[1]; } + if (way === "back") { dx -= forward[0]; dz -= forward[1]; } + if (way === "right") { dx += right[0]; dz += right[1]; } + if (way === "left") { dx -= right[0]; dz -= right[1]; } } - for (const { h, s } of data.players || []) { - if (h === walker) { - if (me && Number.isFinite(data.ack)) reconcile(unpackState(s), data.ack); - continue; - } - const buf = remotes.get(h) || []; - buf.push({ at: data.ms, s: unpackState(s) }); - while (buf.length > 20) buf.shift(); - remotes.set(h, buf); + if (held.size > 0) { + walkTo = null; + } else if (walkTo) { + dx = walkTo.x - me.x; + dz = walkTo.z - me.z; + if (Math.hypot(dx, dz) < 0.15) walkTo = null; } -} -function reconcile(truth, ack) { - while (pending.length && pending[0].tick <= ack) pending.shift(); - const before = me.state; - let s = truth; - for (const p of pending) s = lairkStep(s, p.cmd, me.home); - // Small differences ease out visually; a big one (a real correction) snaps. - const dx = before.x - s.x, dy = before.y - s.y, dz = before.z - s.z; - if (Math.hypot(dx, dy, dz) < 2) { - correction[0] += dx; - correction[1] += dy; - correction[2] += dz; - } else { - correction.fill(0); + const d = Math.hypot(dx, dz); + if (d > 0.001) { + const step = min(WALK_SPEED * dt, walkTo ? d : Infinity); + const next = keepOnGround(me.x + (dx / d) * step, me.z + (dz / d) * step); + me.x = me.tx = next.x; + me.z = me.tz = next.z; + me.facing = (Math.atan2(dx, dz) * 180) / PI; + unsent = true; } - me.state = s; -} -// Where to draw a character this frame: you (predicted), a walker (in the -// past, between snapshots), or someone standing where they last stood. -function placeFor(c) { - if (c.handle === walker && me) { - return { - x: me.state.x + correction[0], - y: me.state.y + correction[1], - z: me.state.z + correction[2], - yaw: me.state.yaw, - }; - } - const buf = remotes.get(c.handle); - if (buf?.length && clockOffset !== null) { - const t = performance.now() + clockOffset - INTERP_MS; - let a = buf[0]; - let b = buf[0]; - for (const snap of buf) { - if (snap.at <= t) a = snap; - if (snap.at >= t) { b = snap; break; } - b = snap; // Past the newest: hold it (never extrapolate). - } - const span = b.at - a.at; - const k = span > 0 ? clamp((t - a.at) / span, 0, 1) : 1; - return { - x: a.s.x + (b.s.x - a.s.x) * k, - y: a.s.y + (b.s.y - a.s.y) * k, - z: a.s.z + (b.s.z - a.s.z) * k, - yaw: lerpAngle(a.s.yaw, b.s.yaw, k), - }; + if (unsent && now - lastSent >= SEND_MS) { + server?.send("lairk:move", { x: me.x, z: me.z, facing: me.facing }); + lastSent = now; + unsent = false; } - return { x: c.x, y: 2, z: c.z, yaw: c.facing || 0 }; // Eye height standing. -} -function lerpAngle(a, b, k) { - const d = ((((b - a) % 360) + 540) % 360) - 180; - return a + d * k; + // The camera follows you. + const k = 1 - Math.exp(-dt * 6); + focus[0] += (me.x - focus[0]) * k; + focus[2] += (me.z - focus[2]) * k; } -function turn(dx, dy) { - look.yaw += dx; - look.pitch = clamp(look.pitch - dy, -80, 80); +// Everyone else eases toward where the server last saw them — never past it. +function glide(dt) { + const k = 1 - Math.exp(-dt * 8); + for (const c of characters.values()) { + if (c.handle === walker || c.tx === undefined) continue; + c.x += (c.tx - c.x) * k; + c.z += (c.tz - c.z) * k; + } } -function toggleView() { - view = view === "first" ? "third" : "first"; +// Mirrors keepOnGround in session-server/lairk-manager.mjs, so what you see +// is what the server will accept. +const BOUNDS = 26; +const TOWER_KEEP = 1.6; +function keepOnGround(x, z) { + const d = Math.hypot(x, z); + if (d > BOUNDS) return { x: (x / d) * BOUNDS, z: (z / d) * BOUNDS }; + if (Math.abs(x) < TOWER_KEEP && Math.abs(z) < TOWER_KEEP) { + if (Math.abs(x) > Math.abs(z)) return { x: Math.sign(x || 1) * TOWER_KEEP, z }; + return { x, z: Math.sign(z || 1) * TOWER_KEEP }; + } + return { x, z }; } -// The spot on the platform under a screen pixel, or null for the sky. +// The spot on the ground under a screen pixel, or null for the sky. function groundPoint(screen, sx, sy) { const inv = camMatrix && invert(camMatrix); if (!inv) return null; @@ -722,10 +537,7 @@ function groundPoint(screen, sx, sy) { const b = unproject(1); if (a[1] <= b[1]) return null; // Looking up, never reaching the ground. const t = a[1] / (a[1] - b[1]); - const x = a[0] + (b[0] - a[0]) * t; - const z = a[2] + (b[2] - a[2]) * t; - if (Math.abs(x) > LAIRK_HALF || Math.abs(z) > LAIRK_HALF) return null; - return { x, z }; + return keepOnGround(a[0] + (b[0] - a[0]) * t, a[2] + (b[2] - a[2]) * t); } // General 4×4 inverse, column-major. @@ -778,16 +590,17 @@ function pushBox(positions, colors, x0, y0, z0, x1, y1, z1, color) { quad([x0, y0, z0], [x0, y0, z1], [x0, y1, z1], [x0, y1, z0], 0.5); // -x } -// A square platform of checkered tiles with a thick skirt below its edge, -// like arena's — so depth reads without lighting and the edge reads as a -// drop. +// A checkered disc of tiles, so depth reads without lighting. function buildGround(Form) { const positions = []; const colors = []; const size = 2; - const n = LAIRK_HALF / size; - for (let i = -n; i < n; i += 1) { - for (let j = -n; j < n; j += 1) { + const reach = 14; // tiles from the center + for (let i = -reach; i < reach; i += 1) { + for (let j = -reach; j < reach; j += 1) { + const cx = (i + 0.5) * size; + const cz = (j + 0.5) * size; + if (sqrt(cx * cx + cz * cz) > reach * size) continue; const odd = (i + j) & 1; const col = odd ? [0.36, 0.52, 0.34, 1] : [0.31, 0.46, 0.3, 1]; const x0 = i * size; @@ -801,49 +614,11 @@ function buildGround(Form) { colors.push(col, col, col, col, col, col); } } - // The skirt: four sides from the top edge down, earth under turf. - const h = LAIRK_HALF; - const lip = [0.24, 0.36, 0.22, 1]; - const earth = [0.3, 0.22, 0.17, 1]; - const deep = [0.16, 0.12, 0.1, 1]; - const side = (a, b) => { - const [ax, az] = a; - const [bx, bz] = b; - const y1 = -0.25; - const y2 = -LAIRK_THICKNESS; - positions.push( - [ax, 0, az, 1], [bx, 0, bz, 1], [bx, y1, bz, 1], - [ax, 0, az, 1], [bx, y1, bz, 1], [ax, y1, az, 1], - [ax, y1, az, 1], [bx, y1, bz, 1], [bx, y2, bz, 1], - [ax, y1, az, 1], [bx, y2, bz, 1], [ax, y2, az, 1], - ); - colors.push(lip, lip, lip, lip, lip, lip, earth, earth, deep, earth, deep, deep); - }; - side([-h, h], [h, h]); - side([h, -h], [-h, -h]); - side([h, h], [h, -h]); - side([-h, -h], [-h, h]); return triangles(Form, positions, colors); } -// A soft dark disc laid on the platform under a body. -function buildShadow(Form) { - const positions = []; - const colors = []; - const segs = 12; - const r = 0.55; - const dark = [0, 0, 0, 0.35]; - for (let i = 0; i < segs; i += 1) { - const a0 = (i / segs) * PI * 2; - const a1 = ((i + 1) / segs) * PI * 2; - positions.push([0, 0, 0, 1], [cos(a0) * r, 0, sin(a0) * r, 1], [cos(a1) * r, 0, sin(a1) * r, 1]); - colors.push(dark, dark, dark); - } - return triangles(Form, positions, colors); -} - -const TOWER_HALF = LAIRK_TOWER_HALF; -const TOWER_TOP = LAIRK_TOWER_TOP; +const TOWER_HALF = 1.1; +const TOWER_TOP = 7; const FACE_Y = 5.4; // Clock center height. const FACE_R = 0.8; @@ -926,23 +701,35 @@ function buildHands(Form, date) { return triangles(Form, positions, colors); } -// Arena's person (lib/humanoid.mjs), hung from its eye at the origin, in two -// forms: the body in the handle's "@" color, and a torso wearing their latest -// painting. Handles that aren't online are dimmed. +// A small blocky person, feet at the origin, in two forms: head and legs in +// the handle's own colors, and a torso wearing their latest painting. function dress(Form, c) { c.dirty = false; - const dim = c.online ? 1 : 0.45; - const [color] = bodyColors(c); - const tex = c.texture ? (c.online ? c.texture.lit : c.texture.dim) : null; - const { positions, colors } = humanoid(color.map((v) => v * dim), { torso: !tex }); + const dim = c.online ? 1 : 0.4; + const [head, legs, shirt] = bodyColors(c); + const tone = (col, k) => [(col[0] / 255) * k * dim, (col[1] / 255) * k * dim, (col[2] / 255) * k * dim]; + + const positions = []; + const colors = []; + pushBox(positions, colors, -0.22, 0, -0.14, -0.04, 0.6, 0.14, tone(legs, 0.8)); // legs + pushBox(positions, colors, 0.04, 0, -0.14, 0.22, 0.6, 0.14, tone(legs, 0.8)); + pushBox(positions, colors, -0.2, 1.36, -0.2, 0.2, 1.76, 0.2, tone(head, 1.1)); // head c.base = triangles(Form, positions, colors); - // Without a painting the humanoid already wears a plain torso. - c.torso = tex ? paintedBox(Form, ...HUMANOID_TORSO, tex) : null; + + const tex = c.texture ? (c.online ? c.texture.lit : c.texture.dim) : null; + c.torso = tex + ? paintedBox(Form, -0.3, 0.6, -0.18, 0.3, 1.3, 0.18, tex) + : (() => { + const p = []; + const k = []; + pushBox(p, k, -0.3, 0.6, -0.18, 0.3, 1.3, 0.18, tone(shirt, 1)); + return triangles(Form, p, k); + })(); } -// A body wears the color of the handle's "@" (the first of its per-letter -// colors, set in the `handle` piece), or the tema's handle color when none -// are set — the same color chat draws the "@" in. +// Head, legs and shirt all wear the color of the handle's "@" (the first of +// its per-letter colors, set in the `handle` piece), or the tema's handle +// color when none are set — the same color chat draws the "@" in. function bodyColors(c) { const at = c.colors?.[0]; const color = at @@ -1094,7 +881,7 @@ function shrink(img, k) { function homeSpot(handle, count = 1) { const hash = handleHash(handle); const angle = ((hash % 3600) / 3600) * PI * 2; - const spread = clamp(sqrt(count) * 1.6, 6, LAIRK_HALF - 5); + const spread = clamp(sqrt(count) * 1.6, 6, 24); const radius = 3.5 + sqrt(((hash >>> 12) % 1000) / 1000) * spread; return { x: sin(angle) * radius, z: cos(angle) * radius }; } @@ -1160,7 +947,7 @@ function walkNotice($) { if (!me) return "log in to take your spot in lairk"; if (!eligible) return "asking laer klokken who is here..."; if (walkNo === "mention" || !eligible.has(me)) return "you must be mentioned in laer klokken to have a spot"; - if (walkNo === "unavailable") return "lairk isn't answering right now - try again soon"; + if (walkNo === "unavailable") return "lairk can't check the roster right now"; if (walkNo === "login") return "your login couldn't be verified - try logging in again"; return "joining lairk..."; } @@ -1174,9 +961,7 @@ function paintTags($) { for (const c of characters.values()) { const bubble = bubbles.get(c.handle); if (crowded && !c.online && !bubble && c.handle !== walker) continue; - if (c.handle === walker && view === "first") continue; // Your own eyes. - if (c.rx === undefined) continue; - const p = project(screen, c.rx, c.ry + 0.55, c.rz); + const p = project(screen, c.x, 2.05, c.z); if (p) tags.push({ c, p, bubble }); } tags.sort((a, b) => b.p.depth - a.p.depth); @@ -1233,7 +1018,7 @@ function paintHint($) { const { ink, screen, typeface } = $; const cw = typeface?.blockWidth || 6; const text = walker - ? fit("wasd walk space jump v view enter chat", floor((screen.width - 60) / cw)) + ? "wasd or tap the ground to walk - enter to chat" : "tap the top or press enter to chat"; ink(0, 0, 0, 90).box(0, screen.height - 16, screen.width, 16); ink(210, 205, 230).write(text, { @@ -1242,19 +1027,6 @@ function paintHint($) { }); } -// The 1st / 3rd person chip, bottom right while walking. -function paintViewChip($) { - viewChip = null; - if (!walker) return; - const { ink, screen, typeface } = $; - const cw = typeface?.blockWidth || 6; - const label = view === "first" ? "1st" : "3rd"; - const w = label.length * cw + 8; - viewChip = { x: screen.width - w - 3, y: screen.height - 16, w, h: 16 }; - ink(70, 62, 110).box(viewChip.x, viewChip.y + 1, w, 14); - ink(240, 236, 255).write(label, { x: viewChip.x + 4, y: viewChip.y + 3 }); -} - function paintCloseButton($) { const { ink, screen, pen, typeface } = $; const cw = typeface?.blockWidth || 6; diff --git a/system/public/easel.json b/system/public/easel.json new file mode 100644 index 0000000000..7ca50df9e3 --- /dev/null +++ b/system/public/easel.json @@ -0,0 +1,6 @@ +{ + "version": "0.8.0", + "sha256": "eddbecccf7f00e9de91a471408ee0727672d81991ab33ce4553959173ef123a4", + "bytes": 892527, + "tarball": "/easel.tar.gz" +} diff --git a/system/public/easel.sh b/system/public/easel.sh index 6a952f4107..3fb9dcb2db 100644 --- a/system/public/easel.sh +++ b/system/public/easel.sh @@ -80,6 +80,7 @@ ln -sfn "$PREFIX/bin/aesel" "$BIN/aesel" ln -sfn "$PREFIX/bin/a" "$BIN/a" ln -sfn "$PREFIX/bin/aes" "$BIN/aes" ln -sfn "$PREFIX/bin/easel" "$BIN/ac" +ln -sfn "$PREFIX/bin/aes" "$BIN/aes" VERSION=$(node -p "require('$PREFIX/package.json').version" 2>/dev/null || echo "?") say " installed Aesel $VERSION to $PREFIX" diff --git a/tezos/package.json b/tezos/package.json index dc0bac2822..83e2e8989e 100644 --- a/tezos/package.json +++ b/tezos/package.json @@ -20,7 +20,6 @@ "dotenv": "^16.4.7", "ecpair": "^3.0.1", "libsodium-wrappers": "^0.7.15", - "mongodb": "^6.21.0", "opensea-js": "^8.0.19", "qrcode": "^1.5.4", "qrcode-terminal": "^0.12.0" diff --git a/toolchain/whistlegraph/downloads/comments-harvest/comment-meta.csv b/toolchain/whistlegraph/downloads/comments-harvest/comment-meta.csv new file mode 100644 index 0000000000..965fa87ed7 --- /dev/null +++ b/toolchain/whistlegraph/downloads/comments-harvest/comment-meta.csv @@ -0,0 +1,408 @@ +uuid,filename,original_filename,date,description,title,keywords,albums,persons,path,ismissing,hasadjustments,external_edit,favorite,hidden,shared,latitude,longitude,path_edited,isphoto,ismovie,uti,burst,live_photo,path_live_photo,iscloudasset,incloud,date_modified,portrait,screenshot,screen_recording,slow_mo,time_lapse,hdr,selfie,panorama,has_raw,uti_raw,path_raw,intrash +30FEB2F6-CEC5-44D6-B8DF-E02562FEFF55,30FEB2F6-CEC5-44D6-B8DF-E02562FEFF55.png,IMG_3907.PNG,2019-10-26T23:54:12-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8455BAEE-03F1-4865-8390-84D54CECA399,8455BAEE-03F1-4865-8390-84D54CECA399.png,IMG_3939.PNG,2019-10-28T10:14:27-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A2DB390A-3453-40B2-AC01-3577B3EC3A5F,A2DB390A-3453-40B2-AC01-3577B3EC3A5F.png,IMG_3940.PNG,2019-10-28T18:37:02-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E70D1D51-DDF0-44B5-8EF4-CBA9C0E50443,E70D1D51-DDF0-44B5-8EF4-CBA9C0E50443.png,IMG_3973.PNG,2019-10-29T21:03:30-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1B5312A5-5EAE-4D5E-9B7B-5D007D57CA3D,1B5312A5-5EAE-4D5E-9B7B-5D007D57CA3D.png,IMG_3999.PNG,2019-10-30T10:17:47-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2E952F3F-FB8C-4376-904E-1774F3A54C52,2E952F3F-FB8C-4376-904E-1774F3A54C52.png,IMG_4001.PNG,2019-10-30T10:21:25-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DA157706-FAA1-43AA-9388-0B5361A08351,DA157706-FAA1-43AA-9388-0B5361A08351.png,IMG_4019.PNG,2019-10-31T15:46:10-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C02E1ACC-9C86-45FB-AA33-4D428D4BC1BF,C02E1ACC-9C86-45FB-AA33-4D428D4BC1BF.png,IMG_4219.PNG,2019-11-09T00:40:18-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F97B352D-3285-4BED-9774-4761EF683E7F,F97B352D-3285-4BED-9774-4761EF683E7F.png,IMG_4369.PNG,2019-11-17T01:05:51-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +17F1768A-15C2-4828-9A55-C2EBEDFB85B1,17F1768A-15C2-4828-9A55-C2EBEDFB85B1.png,IMG_4417.PNG,2019-11-20T17:41:11-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +37E66D7C-F27D-4166-8241-CF009A8D978B,37E66D7C-F27D-4166-8241-CF009A8D978B.png,IMG_4780.PNG,2019-12-16T23:07:17+00:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8AB4439B-EF67-4495-B382-B294B524CE9B,8AB4439B-EF67-4495-B382-B294B524CE9B.png,IMG_5228.PNG,2019-12-27T13:09:55+00:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CDEF4C25-3DCC-43E7-B6AB-7B91CB917D8A,CDEF4C25-3DCC-43E7-B6AB-7B91CB917D8A.png,IMG_5500.PNG,2020-01-03T10:56:50+00:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D77FDD1F-9969-4BB6-9754-B1D6DA339B2C,D77FDD1F-9969-4BB6-9754-B1D6DA339B2C.png,IMG_5537.PNG,2020-01-04T01:31:20-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +10421DF5-1514-4F4B-B1C2-7D1891ACD778,10421DF5-1514-4F4B-B1C2-7D1891ACD778.png,IMG_5596.PNG,2020-01-05T20:36:58-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9C4F20D5-42DC-4098-86D0-2BD63D567545,9C4F20D5-42DC-4098-86D0-2BD63D567545.png,IMG_5773.PNG,2020-01-09T21:06:24-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A6345AA0-3A22-4BF3-8E13-EB98CBF1FD45,A6345AA0-3A22-4BF3-8E13-EB98CBF1FD45.png,IMG_5774.PNG,2020-01-09T21:06:30-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +361F4B99-039C-448F-AF09-CBFE0E88D130,361F4B99-039C-448F-AF09-CBFE0E88D130.png,IMG_5780.PNG,2020-01-09T21:56:17-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +93B0DD60-1E50-4665-9407-D2D95FDB8A0D,93B0DD60-1E50-4665-9407-D2D95FDB8A0D.png,IMG_5782.PNG,2020-01-09T21:59:55-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5F60D863-6A1A-431F-BE7E-511650A69058,5F60D863-6A1A-431F-BE7E-511650A69058.png,IMG_5783.PNG,2020-01-09T22:03:13-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DCCDEE47-9AC9-484E-A405-E11D4BE6A0AF,DCCDEE47-9AC9-484E-A405-E11D4BE6A0AF.png,IMG_5785.PNG,2020-01-09T23:23:15-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1D50EF64-6D4A-4691-9682-28066B91275E,1D50EF64-6D4A-4691-9682-28066B91275E.png,IMG_5788.PNG,2020-01-10T01:12:16-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +39191193-B0F1-48A4-82BF-7177DCB16F43,39191193-B0F1-48A4-82BF-7177DCB16F43.png,IMG_5819.PNG,2020-01-10T22:49:24-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BC12C350-BA80-48D1-8564-268457C77584,BC12C350-BA80-48D1-8564-268457C77584.png,IMG_5820.PNG,2020-01-10T22:49:30-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F57EC7FA-DCFB-47B4-AB1E-0F7023C60399,F57EC7FA-DCFB-47B4-AB1E-0F7023C60399.png,IMG_5821.PNG,2020-01-10T22:49:44-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0C315158-160C-461B-8A2F-FD4276355ABA,0C315158-160C-461B-8A2F-FD4276355ABA.png,IMG_5872.PNG,2020-01-12T21:46:29-08:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +27B8CB35-BDC3-46B5-B3A3-9E7D58993B8E,27B8CB35-BDC3-46B5-B3A3-9E7D58993B8E.png,IMG_5967.PNG,2020-01-13T20:38:47-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4760A93C-61E7-4E7D-990E-B550C801846D,4760A93C-61E7-4E7D-990E-B550C801846D.png,IMG_6168.PNG,2020-01-19T02:56:27-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6871A0AF-4520-41A2-ADFF-BACC09FBB6BA,6871A0AF-4520-41A2-ADFF-BACC09FBB6BA.png,IMG_6414.PNG,2020-01-27T20:07:36-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D5F34A91-AEA8-4400-9A58-3959010BCEE9,D5F34A91-AEA8-4400-9A58-3959010BCEE9.png,IMG_6551.PNG,2020-02-01T23:16:36-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +121C739B-96E3-4319-9B9A-7286CBC49E16,121C739B-96E3-4319-9B9A-7286CBC49E16.png,IMG_6596.PNG,2020-02-03T20:41:03-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1F070DE9-EBE0-425B-8D6E-629A286DD03B,1F070DE9-EBE0-425B-8D6E-629A286DD03B.png,IMG_6635.PNG,2020-02-05T14:39:42-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +665CF6BE-2D7C-4BAA-97E3-BA283EF9E3FE,665CF6BE-2D7C-4BAA-97E3-BA283EF9E3FE.png,IMG_6704.PNG,2020-02-07T09:25:12-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8346D68C-3143-4AD6-8B41-6C0F5A7C1529,8346D68C-3143-4AD6-8B41-6C0F5A7C1529.png,IMG_6792.PNG,2020-02-09T22:25:16-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0492F2D1-0429-4BA2-8683-CC49E69C65A1,0492F2D1-0429-4BA2-8683-CC49E69C65A1.png,IMG_6842.PNG,2020-02-11T20:45:42-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DE299C92-76EF-4436-A010-EE68F31FB183,DE299C92-76EF-4436-A010-EE68F31FB183.png,IMG_6856.PNG,2020-02-12T14:31:17-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DC3F017A-08A5-4A46-B98A-A2AA4BEA511E,DC3F017A-08A5-4A46-B98A-A2AA4BEA511E.png,IMG_6875.PNG,2020-02-12T17:55:43-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D0CED43D-B083-4815-9A83-B457CFBBD90E,D0CED43D-B083-4815-9A83-B457CFBBD90E.png,IMG_6885.PNG,2020-02-13T07:56:38-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +18ABD85D-DF1C-47A6-90DE-C3B1CD0D1B76,18ABD85D-DF1C-47A6-90DE-C3B1CD0D1B76.jpeg,60344430709__8064DB63-45AB-4B71-8EB3-43D41AD21F28.JPG,2020-02-14T23:25:07.069000-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +F827D081-CEC5-44C1-90DB-E7382A5CDB15,F827D081-CEC5-44C1-90DB-E7382A5CDB15.png,IMG_7012.PNG,2020-02-17T12:33:51-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0565438A-A228-4AD7-8D53-C157D76F6C68,0565438A-A228-4AD7-8D53-C157D76F6C68.png,IMG_7126.PNG,2020-02-18T17:49:43-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AF62F523-6F89-4DB8-8BE1-44B451CAA130,AF62F523-6F89-4DB8-8BE1-44B451CAA130.png,IMG_7127.PNG,2020-02-18T17:50:21-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +209D292C-4486-4F55-92BB-AC59DC13CC98,209D292C-4486-4F55-92BB-AC59DC13CC98.png,IMG_7187.PNG,2020-02-22T07:29:28-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +82664245-5CA8-4B4B-9EF2-C14FCBCC30BE,82664245-5CA8-4B4B-9EF2-C14FCBCC30BE.png,IMG_7188.PNG,2020-02-22T07:29:34-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +04822532-9C28-4813-89AC-0E65504CBE62,04822532-9C28-4813-89AC-0E65504CBE62.png,IMG_7196.PNG,2020-02-22T13:37:02-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5CBEC207-0B10-49E7-B307-A8BD521D0A11,5CBEC207-0B10-49E7-B307-A8BD521D0A11.png,IMG_7199.PNG,2020-02-22T16:39:18-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +773AD9DB-EC74-44D2-BB53-68093A60B78D,773AD9DB-EC74-44D2-BB53-68093A60B78D.png,IMG_7201.PNG,2020-02-22T16:58:50-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5992DF23-136B-46B2-B1A0-536AE6248ED3,5992DF23-136B-46B2-B1A0-536AE6248ED3.png,IMG_7206.PNG,2020-02-22T22:30:25-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +366E9FD3-65A0-4CF3-87DE-8FCCEB7B02BF,366E9FD3-65A0-4CF3-87DE-8FCCEB7B02BF.png,IMG_7210.PNG,2020-02-23T08:58:54-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +35612C88-448F-411C-8CBD-63DE5270271C,35612C88-448F-411C-8CBD-63DE5270271C.png,IMG_7222.PNG,2020-02-23T20:05:05-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +948FD8F1-5EAE-4729-838B-502B9C5A2917,948FD8F1-5EAE-4729-838B-502B9C5A2917.png,IMG_7259.PNG,2020-02-25T19:54:39-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F8AB9E2A-345B-4689-B0A5-D2A81FE8E13B,F8AB9E2A-345B-4689-B0A5-D2A81FE8E13B.png,IMG_7307.PNG,2020-02-27T20:41:38-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6782D5D2-E64F-4B86-AFA7-E90DBC8B70B7,6782D5D2-E64F-4B86-AFA7-E90DBC8B70B7.png,IMG_7451.PNG,2020-03-07T09:09:52-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1D48F5E3-78A4-42C8-A1A5-46B6AB4C12EA,1D48F5E3-78A4-42C8-A1A5-46B6AB4C12EA.png,IMG_7462.PNG,2020-03-07T20:30:06-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9488DCA3-C28C-4476-B93A-CBC6E5E57E6F,9488DCA3-C28C-4476-B93A-CBC6E5E57E6F.png,IMG_7475.PNG,2020-03-08T22:13:18-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +48E88FDA-6373-4160-9B3A-9EA5075E12A9,48E88FDA-6373-4160-9B3A-9EA5075E12A9.jpeg,5579C894-B1B3-4922-9C29-5BFD56E31977.jpg,2020-03-08T22:13:45-07:00,,,,Instagram,,,True,False,False,False,False,False,42.197936670000004,-122.70968667,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +B4CBC65D-A7D8-4D06-B746-745E9FDA4D90,B4CBC65D-A7D8-4D06-B746-745E9FDA4D90.png,IMG_7508.PNG,2020-03-10T17:21:26-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FF73D0EC-584F-4473-98EF-275F0DA0BB74,FF73D0EC-584F-4473-98EF-275F0DA0BB74.png,IMG_7530.PNG,2020-03-12T21:04:36-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B0A03AD8-2305-4BB9-9BAF-CAB59F2D7553,B0A03AD8-2305-4BB9-9BAF-CAB59F2D7553.png,IMG_7549.PNG,2020-03-14T10:11:41-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C4BBFD11-BA67-43C7-A176-ACCB8206144F,C4BBFD11-BA67-43C7-A176-ACCB8206144F.png,IMG_7559.PNG,2020-03-14T19:08:30-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CFBF2FA0-74D2-4A1C-B5CF-F7411E0804D3,CFBF2FA0-74D2-4A1C-B5CF-F7411E0804D3.png,IMG_7694.PNG,2020-03-24T11:37:06-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7823553D-D2A3-4C18-BACE-360121911B40,7823553D-D2A3-4C18-BACE-360121911B40.png,IMG_7697.PNG,2020-03-24T19:45:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D71E8366-49EE-4C74-9BAD-0A7143F56600,D71E8366-49EE-4C74-9BAD-0A7143F56600.png,IMG_7719.PNG,2020-03-26T11:27:42-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F0600119-7438-4278-80E2-5F6DFC35A178,F0600119-7438-4278-80E2-5F6DFC35A178.png,IMG_7720.PNG,2020-03-26T11:28:09-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C4BA26A2-DA90-463B-96D9-A4EAF7313E14,C4BA26A2-DA90-463B-96D9-A4EAF7313E14.png,IMG_7721.PNG,2020-03-26T11:28:14-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DDC0972E-8436-43A3-ABD1-14475EBF85AF,DDC0972E-8436-43A3-ABD1-14475EBF85AF.png,IMG_7798.PNG,2020-03-27T23:56:18-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +786A0634-1AF8-4D6F-B21B-7753CDEC7042,786A0634-1AF8-4D6F-B21B-7753CDEC7042.png,IMG_7846.PNG,2020-03-30T13:18:12-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BFE64429-6B1E-4C22-845D-77D50B734CAC,BFE64429-6B1E-4C22-845D-77D50B734CAC.png,IMG_7850.PNG,2020-03-30T13:24:41-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +25EDB50B-4790-4958-BE15-F493073BDA55,25EDB50B-4790-4958-BE15-F493073BDA55.png,IMG_7944.PNG,2020-04-09T00:30:23-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BD455E45-BD9D-4D89-83EC-586E07352813,BD455E45-BD9D-4D89-83EC-586E07352813.png,IMG_7962.PNG,2020-04-09T02:42:15-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8BAEDA50-A9AE-4950-A108-AC35A331C17F,8BAEDA50-A9AE-4950-A108-AC35A331C17F.png,IMG_8030.PNG,2020-04-13T19:48:41-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7600641D-89B7-428D-8D3A-2D9507AA060E,7600641D-89B7-428D-8D3A-2D9507AA060E.png,IMG_8032.PNG,2020-04-13T19:49:29-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DE3594D4-495A-44AA-BAFE-7306D965211B,DE3594D4-495A-44AA-BAFE-7306D965211B.png,IMG_8060.PNG,2020-04-15T13:40:18-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +94C3B96B-A655-4F3D-BBEB-AEE10A8B91E6,94C3B96B-A655-4F3D-BBEB-AEE10A8B91E6.png,IMG_8139.PNG,2020-04-18T17:36:58-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C8477351-BB23-4497-904B-735E7AA9A224,C8477351-BB23-4497-904B-735E7AA9A224.png,IMG_8156.PNG,2020-04-19T19:58:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3A781D1E-EE62-46B3-9679-381EBC2DEA46,3A781D1E-EE62-46B3-9679-381EBC2DEA46.png,IMG_8179.PNG,2020-04-20T13:35:33-07:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +68F2FBAD-3A10-4D8E-B00B-D13C244740CA,68F2FBAD-3A10-4D8E-B00B-D13C244740CA.png,IMG_8184.PNG,2020-04-20T23:31:20-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +51FEB885-D44E-4CD6-A49C-1847605459A1,51FEB885-D44E-4CD6-A49C-1847605459A1.png,IMG_8225.PNG,2020-04-23T16:32:15-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7428EB83-6DF0-43CB-9045-EFAB6DABA51B,7428EB83-6DF0-43CB-9045-EFAB6DABA51B.png,IMG_8227.PNG,2020-04-23T20:50:36-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DECE03FA-08AA-45DC-929E-4C4314B18247,DECE03FA-08AA-45DC-929E-4C4314B18247.png,IMG_8233.PNG,2020-04-24T00:56:03-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +45CA82A1-FFF2-496B-BF31-C25EFC53FEA3,45CA82A1-FFF2-496B-BF31-C25EFC53FEA3.png,IMG_8234.PNG,2020-04-24T00:56:06-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D3AC13AC-5B89-4E9D-A914-7765A860369E,D3AC13AC-5B89-4E9D-A914-7765A860369E.png,IMG_8335.PNG,2020-04-27T21:45:24-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7E602E59-6585-4BD0-BD91-61CAAA7C4D0F,7E602E59-6585-4BD0-BD91-61CAAA7C4D0F.png,IMG_8371.PNG,2020-04-30T18:47:35-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C01DF8B2-E88E-4715-A39E-C0D6CEAE1B95,C01DF8B2-E88E-4715-A39E-C0D6CEAE1B95.png,IMG_8385.PNG,2020-05-04T11:05:39-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8141B377-ED65-4D68-B447-8DF0419FCBDA,8141B377-ED65-4D68-B447-8DF0419FCBDA.png,IMG_8408.PNG,2020-05-05T17:45:59-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DFC69AA2-E9A8-4F2E-A4DC-EF32C6ECEC67,DFC69AA2-E9A8-4F2E-A4DC-EF32C6ECEC67.png,IMG_8410.PNG,2020-05-05T20:00:33-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9A7C88EE-3748-4B1E-BA2A-3B43EB2DA892,9A7C88EE-3748-4B1E-BA2A-3B43EB2DA892.png,IMG_8437.PNG,2020-05-08T17:03:33-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BBA87955-DBE5-42EB-B148-71298BEA39B2,BBA87955-DBE5-42EB-B148-71298BEA39B2.png,IMG_8458.PNG,2020-05-11T21:44:14-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9081028E-70A0-49F0-8CA6-AD28AEA5605A,9081028E-70A0-49F0-8CA6-AD28AEA5605A.png,IMG_8472.PNG,2020-05-12T23:34:49-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +33523888-6886-493C-9A70-41E71C928A3C,33523888-6886-493C-9A70-41E71C928A3C.png,IMG_8482.PNG,2020-05-14T00:17:43-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F152EF34-DF39-475A-88D7-3049648A449F,F152EF34-DF39-475A-88D7-3049648A449F.png,IMG_8483.PNG,2020-05-14T00:17:51-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9F66E93C-1BD3-4947-AC3E-C6F56C922155,9F66E93C-1BD3-4947-AC3E-C6F56C922155.png,IMG_8499.PNG,2020-05-15T02:13:25-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8E85F677-7AEB-4A1E-A48A-7091C7C4AC34,8E85F677-7AEB-4A1E-A48A-7091C7C4AC34.png,IMG_8534.PNG,2020-05-18T00:00:09-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3416AB3F-93F9-4C95-B012-62E499A3833E,3416AB3F-93F9-4C95-B012-62E499A3833E.png,IMG_8661.PNG,2020-05-26T01:06:51-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +ECB40D2B-3675-4E20-84AA-ACF20352FFD1,ECB40D2B-3675-4E20-84AA-ACF20352FFD1.png,IMG_8662.PNG,2020-05-26T01:10:29-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +621527EE-4972-4883-9AD5-77B9B616484A,621527EE-4972-4883-9AD5-77B9B616484A.png,IMG_8663.PNG,2020-05-26T01:10:58-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CFDE61FF-0575-4292-8315-650812A81AEB,CFDE61FF-0575-4292-8315-650812A81AEB.png,IMG_8683.PNG,2020-05-26T17:39:44-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F94E87C7-7EBF-4FC6-9CB2-8C100BD14FFF,F94E87C7-7EBF-4FC6-9CB2-8C100BD14FFF.png,IMG_8761.PNG,2020-06-01T02:30:59-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +EFC34FCF-B063-40AF-A106-C8D10E1EBCE2,EFC34FCF-B063-40AF-A106-C8D10E1EBCE2.png,IMG_8763.PNG,2020-06-01T03:01:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1E67EF10-9E28-4C1C-9909-4D21BEFDD273,1E67EF10-9E28-4C1C-9909-4D21BEFDD273.jpeg,10AE15EE-2208-48EE-BC33-B554F988D68C.jpg,2020-06-01T03:02:36.167307-07:00,,,,Instagram,,,True,False,False,False,False,False,42.197936670000004,-122.70951667,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +13B9D8A4-B003-4187-86E4-BBA483A983B6,13B9D8A4-B003-4187-86E4-BBA483A983B6.png,IMG_8765.PNG,2020-06-01T03:03:20-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +322C0FE9-2C72-4B17-AC43-B80411FF5FFB,322C0FE9-2C72-4B17-AC43-B80411FF5FFB.png,IMG_8766.PNG,2020-06-01T03:03:27-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FB9C1A79-DA42-43F3-AE22-7686108C43A7,FB9C1A79-DA42-43F3-AE22-7686108C43A7.jpeg,24D3086A-760A-4585-AE64-C2422F1D4948.jpg,2020-06-01T03:03:27-07:00,,,,Instagram,,,True,False,False,False,False,False,42.198058329999995,-122.70997832999998,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +77BDBB43-1403-4C88-BD0C-0764ACC21815,77BDBB43-1403-4C88-BD0C-0764ACC21815.png,IMG_8771.PNG,2020-06-01T13:41:42-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C4DC8701-698C-40BC-BE56-FF77305C8FCA,C4DC8701-698C-40BC-BE56-FF77305C8FCA.png,IMG_8773.PNG,2020-06-01T15:11:42-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A7972071-6A8F-4132-BC08-D3936C2FB8F7,A7972071-6A8F-4132-BC08-D3936C2FB8F7.png,IMG_8786.PNG,2020-06-02T21:05:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DA39ADB9-4EA1-4052-B739-2169A13C8A49,DA39ADB9-4EA1-4052-B739-2169A13C8A49.png,IMG_8794.PNG,2020-06-04T12:43:40-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F39036FC-F70C-44E7-9361-6AF63ABAA528,F39036FC-F70C-44E7-9361-6AF63ABAA528.png,IMG_8832.PNG,2020-06-09T20:37:19-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C94D5DDD-98CD-441B-A207-E5E4F726A6A0,C94D5DDD-98CD-441B-A207-E5E4F726A6A0.png,IMG_8905.PNG,2020-06-15T17:07:35-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +70074C63-FDCB-40C5-819F-A04CC95E8528,70074C63-FDCB-40C5-819F-A04CC95E8528.png,IMG_8906.PNG,2020-06-15T18:13:22-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FE47EEB9-E884-43B4-A8D9-7080226926C9,FE47EEB9-E884-43B4-A8D9-7080226926C9.png,IMG_8910.PNG,2020-06-15T21:42:57-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +797FD081-3849-4974-85B2-1AEA5E5E4CA0,797FD081-3849-4974-85B2-1AEA5E5E4CA0.png,IMG_9079.PNG,2020-06-21T01:06:26-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8A12D28C-25BE-4485-B7DD-EF8167016B47,8A12D28C-25BE-4485-B7DD-EF8167016B47.png,IMG_9125.PNG,2020-06-22T17:05:53-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +55DFA0A3-6B23-4897-AE54-A56550622150,55DFA0A3-6B23-4897-AE54-A56550622150.png,IMG_9126.PNG,2020-06-22T18:22:27-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AA9E0B0C-7DB3-424B-823A-93370BA100C7,AA9E0B0C-7DB3-424B-823A-93370BA100C7.png,IMG_9136.PNG,2020-06-22T23:24:59-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2BC786FF-4F75-40A1-95E4-98687F0FE523,2BC786FF-4F75-40A1-95E4-98687F0FE523.png,IMG_9263.PNG,2020-06-28T18:24:34-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9AB3874B-F086-4ED1-814A-1BB2E0A09C12,9AB3874B-F086-4ED1-814A-1BB2E0A09C12.png,IMG_9264.PNG,2020-06-28T18:25:05-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +64A2571B-D6E1-43E2-89BE-D913474309D1,64A2571B-D6E1-43E2-89BE-D913474309D1.png,IMG_9368.PNG,2020-07-05T02:14:15-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C5E3AC34-0EC1-42AD-BD57-9DAA9264C4D8,C5E3AC34-0EC1-42AD-BD57-9DAA9264C4D8.png,IMG_9383.PNG,2020-07-06T03:57:56-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +EC84E0A3-1EFF-47BA-BCC0-8404F16A7A15,EC84E0A3-1EFF-47BA-BCC0-8404F16A7A15.png,IMG_9482.PNG,2020-07-10T21:46:30-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FD5FBEA2-128D-478A-81DC-011116E0909B,FD5FBEA2-128D-478A-81DC-011116E0909B.png,IMG_9484.PNG,2020-07-10T22:04:43-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D5883AF8-CC00-487F-A31C-979382B8F3A7,D5883AF8-CC00-487F-A31C-979382B8F3A7.png,IMG_9493.PNG,2020-07-10T23:20:29-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +11028F83-4779-4CB1-BD53-0A6CE1D4A1E1,11028F83-4779-4CB1-BD53-0A6CE1D4A1E1.png,IMG_9494.PNG,2020-07-10T23:20:32-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +63F8B4C6-FB6D-4A49-8C5D-80766A8A66E7,63F8B4C6-FB6D-4A49-8C5D-80766A8A66E7.png,IMG_9495.PNG,2020-07-10T23:25:30-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AFA77131-D123-4771-A72C-24CDE4959169,AFA77131-D123-4771-A72C-24CDE4959169.png,IMG_9559.PNG,2020-07-12T10:45:59-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +80FDECDF-AABA-48C2-955F-61C6108A85F8,80FDECDF-AABA-48C2-955F-61C6108A85F8.png,IMG_9560.PNG,2020-07-12T10:49:02-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F87CDC63-E65B-443A-855A-F97C3E6C800E,F87CDC63-E65B-443A-855A-F97C3E6C800E.png,IMG_9630.PNG,2020-07-13T01:17:22-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +52724884-FB05-42F5-9370-13D82367A5AB,52724884-FB05-42F5-9370-13D82367A5AB.png,IMG_9655.PNG,2020-07-13T20:09:11-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6AF8DEAA-E5E3-4ABE-8D35-1C6A25E551D7,6AF8DEAA-E5E3-4ABE-8D35-1C6A25E551D7.png,IMG_9755.PNG,2020-07-15T16:43:17-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BBF8D94B-149C-485D-9A54-DEC386A9817A,BBF8D94B-149C-485D-9A54-DEC386A9817A.png,IMG_9875.PNG,2020-07-19T20:47:13-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E9BDB213-1048-4E02-B205-ECD0C30373B6,E9BDB213-1048-4E02-B205-ECD0C30373B6.png,IMG_9876.PNG,2020-07-19T20:47:17-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D098C69C-0559-42D1-A396-DCA38B4F987F,D098C69C-0559-42D1-A396-DCA38B4F987F.png,IMG_0068.PNG,2020-07-23T02:10:48-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2254B54D-838D-43A9-9E17-C2B8A8509B87,2254B54D-838D-43A9-9E17-C2B8A8509B87.png,IMG_0069.PNG,2020-07-23T02:10:59-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6E619690-F55F-4BB9-A32B-E69809E13404,6E619690-F55F-4BB9-A32B-E69809E13404.png,IMG_0119.PNG,2020-07-25T14:51:22-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E942E803-1BC0-42D8-9D9E-9DC7AD3ACB13,E942E803-1BC0-42D8-9D9E-9DC7AD3ACB13.png,IMG_0143.PNG,2020-07-26T16:58:09-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4461A448-5DE8-4CB8-9A1E-1CFB2D2C3ACA,4461A448-5DE8-4CB8-9A1E-1CFB2D2C3ACA.png,IMG_0144.PNG,2020-07-26T17:00:13-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DC9CAD82-6837-4351-9EC4-B2850E8D9574,DC9CAD82-6837-4351-9EC4-B2850E8D9574.png,IMG_0150.PNG,2020-07-26T20:30:24-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E40FA4E8-6B5A-4B76-BF14-8C5708236DF0,E40FA4E8-6B5A-4B76-BF14-8C5708236DF0.png,IMG_0162.PNG,2020-07-27T01:27:34-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1C1A5B96-8D41-41D1-B657-61D0B94DC291,1C1A5B96-8D41-41D1-B657-61D0B94DC291.png,IMG_9933.PNG,2020-07-27T23:39:08-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B1862EE8-814F-463F-8966-D48C1DE1481A,B1862EE8-814F-463F-8966-D48C1DE1481A.png,IMG_0317.PNG,2020-07-28T21:44:47-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +09F89D55-6276-4C3C-855A-8C797BCCDF41,09F89D55-6276-4C3C-855A-8C797BCCDF41.png,IMG_0321.PNG,2020-07-28T22:02:49-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3256611F-545F-473E-9E43-4026AB744235,3256611F-545F-473E-9E43-4026AB744235.png,IMG_0393.PNG,2020-07-30T22:23:48-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B923A495-186E-489F-BF0D-3F6F6D280D7F,B923A495-186E-489F-BF0D-3F6F6D280D7F.png,IMG_0409.PNG,2020-07-31T06:36:54-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +87C90CD6-6A85-406E-B8F0-AC0FF283C03C,87C90CD6-6A85-406E-B8F0-AC0FF283C03C.png,IMG_0531.PNG,2020-08-05T15:21:30-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1059E926-39FF-45A3-9071-A462D56D5F18,1059E926-39FF-45A3-9071-A462D56D5F18.png,IMG_0720.PNG,2020-08-17T03:46:39-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FA996D59-2607-4155-9D3E-8B00636E8330,FA996D59-2607-4155-9D3E-8B00636E8330.png,IMG_0728.PNG,2020-08-17T17:42:39-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +125E17F5-32D4-4B71-99B3-0FBF0C184E85,125E17F5-32D4-4B71-99B3-0FBF0C184E85.png,IMG_0758.PNG,2020-08-19T03:11:10-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CE55900E-9841-4C78-BE5B-08A733D97AD1,CE55900E-9841-4C78-BE5B-08A733D97AD1.png,IMG_0950.PNG,2020-09-04T13:24:33-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D6864020-C69F-43F9-976D-189B95A9A8B1,D6864020-C69F-43F9-976D-189B95A9A8B1.png,IMG_0983.PNG,2020-09-05T22:00:59-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6D53A14F-49B8-4ACB-B7F4-B58FF06E6E61,6D53A14F-49B8-4ACB-B7F4-B58FF06E6E61.png,IMG_1234.PNG,2020-09-19T15:39:16-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FAE4C404-05E8-428E-9A9D-1E6B98C167C2,FAE4C404-05E8-428E-9A9D-1E6B98C167C2.png,IMG_1235.PNG,2020-09-19T15:39:19-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +57A34AA7-E274-474C-B06A-14D6E68934D6,57A34AA7-E274-474C-B06A-14D6E68934D6.png,IMG_1236.PNG,2020-09-19T15:39:22-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A98DFA2C-AFB7-41A0-9553-B73FDA121760,A98DFA2C-AFB7-41A0-9553-B73FDA121760.png,IMG_1237.PNG,2020-09-19T15:39:24-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +653BC671-37C8-44A8-BE9D-7C9330BA5CCD,653BC671-37C8-44A8-BE9D-7C9330BA5CCD.png,IMG_1238.PNG,2020-09-19T15:39:27-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C1AFCDB3-32D3-4E61-A622-95FD2A3339CD,C1AFCDB3-32D3-4E61-A622-95FD2A3339CD.png,IMG_1239.PNG,2020-09-19T15:39:30-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5F8450DC-2C4D-41E8-980C-75B0C9F7923A,5F8450DC-2C4D-41E8-980C-75B0C9F7923A.png,IMG_1240.PNG,2020-09-19T15:39:33-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2FB04AE9-5680-4778-B247-CAD472DF49C7,2FB04AE9-5680-4778-B247-CAD472DF49C7.png,IMG_1251.PNG,2020-09-20T18:27:46-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7E9BBD74-BA39-4BD7-8490-12F5DEE8DE18,7E9BBD74-BA39-4BD7-8490-12F5DEE8DE18.png,IMG_9994.PNG,2020-09-26T19:02:26-07:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +37C41775-9BA2-4C94-844A-099B6CEDD8F1,37C41775-9BA2-4C94-844A-099B6CEDD8F1.png,IMG_1385.PNG,2020-09-26T23:17:36-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F0F0573F-1C1B-4328-AFD0-05FE61C3F4C4,F0F0573F-1C1B-4328-AFD0-05FE61C3F4C4.png,IMG_1386.PNG,2020-09-26T23:17:52-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2D41F74E-5F29-41F2-AA84-11C2DB9E3CEF,2D41F74E-5F29-41F2-AA84-11C2DB9E3CEF.png,IMG_1387.PNG,2020-09-26T23:18:07-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F7F70E61-4624-4F49-BB33-7EEFF4F4E6D8,F7F70E61-4624-4F49-BB33-7EEFF4F4E6D8.png,IMG_1390.PNG,2020-09-26T23:27:22-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +64A61B96-0217-486F-98D2-03BD6D535727,64A61B96-0217-486F-98D2-03BD6D535727.png,IMG_1424.PNG,2020-09-29T00:50:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D6F9CDA3-DF0F-4513-AC6E-B4E3ABC5B391,D6F9CDA3-DF0F-4513-AC6E-B4E3ABC5B391.png,IMG_1425.PNG,2020-09-29T00:52:41-07:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +880154A7-01D5-4E09-B7B2-5E3F84449FE0,880154A7-01D5-4E09-B7B2-5E3F84449FE0.jpeg,CD7C8FDC-3496-424A-8DA5-6593B6B69009.jpg,2020-10-04T18:49:48.143957-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +3286DBD4-CB21-49B1-A599-FE2D84EC6660,3286DBD4-CB21-49B1-A599-FE2D84EC6660.png,IMG_1676.PNG,2020-10-08T11:20:12-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +65348A97-26E2-477A-A37A-FC060F03ED56,65348A97-26E2-477A-A37A-FC060F03ED56.png,IMG_1683.PNG,2020-10-08T11:41:59-07:00,,,,,"Jeffrey Scudder, Jeffrey Scudder, _UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8157FC29-637C-41BC-A593-352973B8B64F,8157FC29-637C-41BC-A593-352973B8B64F.png,IMG_1961.PNG,2020-10-12T21:09:30-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5BB31A70-DDD1-4AF9-9F35-676F6D53879C,5BB31A70-DDD1-4AF9-9F35-676F6D53879C.png,IMG_1820.PNG,2020-10-14T00:22:12-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E840F353-CCF2-4D1F-9B67-C5D4B7ABA472,E840F353-CCF2-4D1F-9B67-C5D4B7ABA472.png,IMG_1822.PNG,2020-10-14T12:29:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1F0DE7D8-C6C2-41FD-9A80-ADBA8BEC11C7,1F0DE7D8-C6C2-41FD-9A80-ADBA8BEC11C7.png,IMG_2323.PNG,2020-10-27T19:01:30-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +515AF29F-8B07-4AD8-8DAB-48EE3051ADC1,515AF29F-8B07-4AD8-8DAB-48EE3051ADC1.png,IMG_2391.PNG,2020-11-01T07:10:29-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +343332F6-C18D-47A9-8FE0-07392B0E296C,343332F6-C18D-47A9-8FE0-07392B0E296C.png,IMG_2417.PNG,2020-11-01T16:58:04-08:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +68B1838C-D781-47FE-B8F4-B382AD4DAEBB,68B1838C-D781-47FE-B8F4-B382AD4DAEBB.png,IMG_2457.PNG,2020-11-03T19:10:02-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +09657449-5BE6-4519-A245-D7D4AF947D82,09657449-5BE6-4519-A245-D7D4AF947D82.png,IMG_2749.PNG,2020-11-14T14:13:34-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A5507B7C-41A2-41AF-87B5-8AADAE3B088F,A5507B7C-41A2-41AF-87B5-8AADAE3B088F.png,IMG_2779.PNG,2020-11-15T23:32:04-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1DE89DC8-F0EB-4067-AED5-6DA386AB348C,1DE89DC8-F0EB-4067-AED5-6DA386AB348C.png,IMG_2960.PNG,2020-11-23T22:23:28-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3336DB5F-17EA-4CEA-A9C6-DC6148BEFDFC,3336DB5F-17EA-4CEA-A9C6-DC6148BEFDFC.png,IMG_2964.PNG,2020-11-23T23:34:53-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6A12E933-F4CB-4B25-90B4-DCD6A0852A41,6A12E933-F4CB-4B25-90B4-DCD6A0852A41.png,IMG_2991.PNG,2020-11-25T00:55:06-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +99F86FF0-E1C8-42A1-8268-4DA4E604EA6C,99F86FF0-E1C8-42A1-8268-4DA4E604EA6C.png,IMG_3012.PNG,2020-11-26T03:44:12-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BB2F9CBB-ADE1-4AAF-AB6B-721270CA1205,BB2F9CBB-ADE1-4AAF-AB6B-721270CA1205.png,IMG_3623.PNG,2020-12-10T00:49:58-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +901B0406-019C-48BA-BE92-2216A284AC4C,901B0406-019C-48BA-BE92-2216A284AC4C.png,IMG_3624.PNG,2020-12-10T00:50:05-08:00,,,,,"_UNKNOWN_, _UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +372FFE7A-0343-481F-81F3-78BE31A1F9AA,372FFE7A-0343-481F-81F3-78BE31A1F9AA.png,IMG_3626.PNG,2020-12-10T00:50:50-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A7A9A4F3-3C96-495E-887C-6B6B8856BC66,A7A9A4F3-3C96-495E-887C-6B6B8856BC66.png,IMG_3627.PNG,2020-12-10T00:51:25-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BD849EC0-0F41-4009-AA9B-005C67F56D63,BD849EC0-0F41-4009-AA9B-005C67F56D63.png,IMG_3628.PNG,2020-12-10T00:51:30-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6987EF9D-9471-4CE4-A1F3-43A47A05F81A,6987EF9D-9471-4CE4-A1F3-43A47A05F81A.png,IMG_3631.PNG,2020-12-10T11:40:11-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1E5255D6-9CAB-4C30-9A17-4DDE2237F1AF,1E5255D6-9CAB-4C30-9A17-4DDE2237F1AF.png,IMG_3689.PNG,2020-12-14T11:48:17-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1FF986FD-942C-42E8-AFAD-7B1D89E6250C,1FF986FD-942C-42E8-AFAD-7B1D89E6250C.jpeg,F72B518B-E258-4005-8DB1-61E2B2D9B92B.jpg,2020-12-18T17:36:34.284165-08:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +812B0096-DA33-45B1-8549-0BDCA5D2A03C,812B0096-DA33-45B1-8549-0BDCA5D2A03C.png,IMG_3899.PNG,2020-12-23T11:35:09-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D8A758AA-2C54-483D-93E1-FB2C50321D7B,D8A758AA-2C54-483D-93E1-FB2C50321D7B.png,IMG_3957.PNG,2020-12-27T00:02:50-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +55E0476D-9F3D-46CF-9690-6540A140393C,55E0476D-9F3D-46CF-9690-6540A140393C.png,IMG_4315.PNG,2021-01-21T19:51:41-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3D717B2F-C77E-47F0-ABCA-C308E0558D52,3D717B2F-C77E-47F0-ABCA-C308E0558D52.png,IMG_4409.PNG,2021-01-27T13:32:08-08:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +84C77DBC-340C-442C-A562-E6D9B48AFC45,84C77DBC-340C-442C-A562-E6D9B48AFC45.png,IMG_4508.PNG,2021-02-01T17:37:13-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FEB1E2C2-9E96-42D0-B984-7CDC6120B9E5,FEB1E2C2-9E96-42D0-B984-7CDC6120B9E5.png,IMG_4511.PNG,2021-02-01T20:49:38-08:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +113A59BF-EA08-4573-BF99-EC754E63386F,113A59BF-EA08-4573-BF99-EC754E63386F.png,IMG_4537.PNG,2021-02-03T11:48:25-08:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6C9F8BBE-2A45-401E-90CE-0560E895BD9E,6C9F8BBE-2A45-401E-90CE-0560E895BD9E.png,IMG_4542.PNG,2021-02-03T23:54:16-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +999498A4-C102-4377-909E-9CE9AFBAD7C4,999498A4-C102-4377-909E-9CE9AFBAD7C4.png,IMG_4570.PNG,2021-02-05T21:30:21-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +79BBFCF7-AD14-4F95-BAE9-A33FF7AC43B8,79BBFCF7-AD14-4F95-BAE9-A33FF7AC43B8.png,IMG_4668.PNG,2021-02-12T01:01:47-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E6AE6342-BBBD-4F04-86B6-B8DD95430161,E6AE6342-BBBD-4F04-86B6-B8DD95430161.jpeg,2E2616F0-C0B6-4922-A7D2-D2A4E3AB5039.jpeg,2021-02-15T12:41:44-08:00,"{""subsource"":""done_button"",""uid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613421541952"",""source"":""other"",""origin"":""gallery"",""source_sid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613421541971""}",,,PicsArt,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +1CB95F0D-81E4-4635-947C-4E35F0007706,1CB95F0D-81E4-4635-947C-4E35F0007706.jpeg,AA45595C-992F-4D66-AAA5-D7A88BD93936.jpg,2021-02-15T12:41:44-08:00,"{""subsource"":""done_button"",""uid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613421541952"",""source"":""other"",""origin"":""gallery"",""source_sid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613421541971""}",,,Instagram,,,True,False,False,False,False,False,42.197844999999994,-122.70937167,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +DA445279-6DAF-4D9E-885E-1A4FA75BE46F,DA445279-6DAF-4D9E-885E-1A4FA75BE46F.jpeg,27A9F0B6-C443-4117-96BF-DB6EE855B83D.jpeg,2021-02-19T14:46:20.895011-08:00,"{""subsource"":""done_button"",""uid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613774665701"",""source"":""other"",""origin"":""gallery"",""source_sid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613774665721""}",,,PicsArt,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +D55A1980-3071-474B-AA98-7EF375986148,D55A1980-3071-474B-AA98-7EF375986148.jpeg,BA794BB9-6540-4D33-AF02-D9B779F520FC.jpg,2021-02-19T14:47:19.430463-08:00,"{""subsource"":""done_button"",""uid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613774665701"",""source"":""other"",""origin"":""gallery"",""source_sid"":""412F9C1D-A4F6-4B2F-99D7-7B8FEBBAEFA7_1613774665721""}",,,Instagram,,,True,False,False,False,False,False,42.19799667000001,-122.70969667000001,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +8295F65E-3E39-4B3D-84BC-6F3350CC14FE,8295F65E-3E39-4B3D-84BC-6F3350CC14FE.jpeg,ED6F36AB-706F-42E1-A76E-3E149A35D265.jpg,2021-02-19T14:50:23.789451-08:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +F14CA652-F620-4F09-A2E8-B196B1E1A1C4,F14CA652-F620-4F09-A2E8-B196B1E1A1C4.png,IMG_4827.PNG,2021-02-19T20:14:42-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +18680AD0-2BE6-487A-9E48-830671104328,18680AD0-2BE6-487A-9E48-830671104328.png,IMG_4828.PNG,2021-02-19T20:14:56-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +26C4592B-142D-4CB8-AB41-FD38BB84261C,26C4592B-142D-4CB8-AB41-FD38BB84261C.png,IMG_4862.PNG,2021-02-20T23:43:34-08:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2A40F14A-078D-428B-A046-758258E32075,2A40F14A-078D-428B-A046-758258E32075.png,IMG_4863.PNG,2021-02-21T01:59:15-08:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8D3BF48D-8930-4072-BC2F-541BB875D4BB,8D3BF48D-8930-4072-BC2F-541BB875D4BB.png,IMG_4937.PNG,2021-02-25T22:52:14-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AF3412D9-A6E6-4902-B6E3-B469B6BF0CFB,AF3412D9-A6E6-4902-B6E3-B469B6BF0CFB.heic,63626794657__74FCE0AA-A5E8-41A3-BF5A-CE58169ACA12.HEIC,2021-02-28T21:05:46.553000-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +A1CEB465-0504-4762-BA3B-7DA2FA23EC54,A1CEB465-0504-4762-BA3B-7DA2FA23EC54.png,IMG_5042.PNG,2021-03-02T00:51:46-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D67BFFB4-77D0-468C-96C5-331D4925677C,D67BFFB4-77D0-468C-96C5-331D4925677C.png,IMG_5282.PNG,2021-03-12T11:28:32-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3A0828DF-F734-4322-B772-1D32D649F651,3A0828DF-F734-4322-B772-1D32D649F651.png,IMG_5493.PNG,2021-03-16T20:46:42-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6B616548-07F0-43F8-AF14-160B22F02573,6B616548-07F0-43F8-AF14-160B22F02573.png,IMG_5494.PNG,2021-03-16T20:46:53-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AA8251C4-E8FD-4547-9954-8F37A2323F7D,AA8251C4-E8FD-4547-9954-8F37A2323F7D.jpeg,5F1CA93A-9507-49D1-883A-660149E91193.jpg,2021-03-17T11:51:39.534472-07:00,,,,Instagram,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +421FC64B-6AE8-494D-BFB7-BE8EDCBFAE00,421FC64B-6AE8-494D-BFB7-BE8EDCBFAE00.jpeg,24408DD1-14BF-4325-9003-5D62B8809D97.jpg,2021-03-18T03:41:05.241061-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +29C4C9FF-9860-4068-8835-A22AC1625386,29C4C9FF-9860-4068-8835-A22AC1625386.jpeg,CA338560-DF87-4F4A-B219-63B34FFE170A.jpg,2021-03-18T03:42:52.028137-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +5524C2DD-0D06-4BDD-8B40-3FF0DAC7E82B,5524C2DD-0D06-4BDD-8B40-3FF0DAC7E82B.jpeg,F5CCD02C-C297-4C89-91E9-5CA9E4B099F2.jpg,2021-03-20T12:35:05-07:00,,,,Instagram,,,True,False,False,False,False,False,42.197905000000006,-122.70973000000001,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +DCDCF562-B132-4C74-BA68-B71409959092,DCDCF562-B132-4C74-BA68-B71409959092.png,IMG_5694.PNG,2021-03-22T15:10:19-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B79351FD-4B3A-453A-AD00-3F371C81F022,B79351FD-4B3A-453A-AD00-3F371C81F022.jpeg,IMG_5888.JPG,2021-03-27T21:37:20-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CD1BA1CF-AB51-4A5F-9812-03FC037A34B5,CD1BA1CF-AB51-4A5F-9812-03FC037A34B5.jpeg,IMG_5887.JPG,2021-03-27T21:48:10-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C36C651B-A251-4C1C-A39C-FEA7F6B77326,C36C651B-A251-4C1C-A39C-FEA7F6B77326.jpeg,IMG_5886.JPG,2021-03-27T21:49:41-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D04B5C40-4D0F-406D-BCA1-057EE4172531,D04B5C40-4D0F-406D-BCA1-057EE4172531.jpeg,IMG_5885.JPG,2021-03-27T22:07:01-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DA23C3A8-1D69-4E1E-9EAB-49B79A6750CC,DA23C3A8-1D69-4E1E-9EAB-49B79A6750CC.png,IMG_5988.PNG,2021-03-31T10:17:40-08:00,,,,,"_UNKNOWN_, _UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C1662346-9CA4-46ED-9898-6E0EC4B7493E,C1662346-9CA4-46ED-9898-6E0EC4B7493E.png,IMG_6965.PNG,2021-05-06T01:02:01-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +01067255-61C4-4EC3-BA9C-9960ED3BF97F,01067255-61C4-4EC3-BA9C-9960ED3BF97F.jpeg,AB108D25-B3C7-4370-A8DC-44EEDEC11FEB.jpg,2021-05-19T00:45:51.915858-07:00,,,,Instagram,,,True,False,False,False,False,False,42.197786670000006,-122.7095,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +4D75B783-3615-45A9-B3B5-8B6BDE6F9295,4D75B783-3615-45A9-B3B5-8B6BDE6F9295.png,IMG_8177.PNG,2021-07-08T18:12:52-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9685010B-254A-43B3-9F2A-A95B6525BA54,9685010B-254A-43B3-9F2A-A95B6525BA54.png,IMG_8178.PNG,2021-07-08T18:12:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9DA9D551-DFF9-4A04-8614-A4F84A13E608,9DA9D551-DFF9-4A04-8614-A4F84A13E608.png,IMG_8485.PNG,2021-07-20T14:24:33-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B8EC0B1E-059B-4378-ACCB-F4F56226E106,B8EC0B1E-059B-4378-ACCB-F4F56226E106.jpeg,8CE749A8-1C4F-4D6C-8D31-CE5649527BB2.jpg,2021-07-23T21:37:07.998952-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +62991490-8628-48CB-8BA9-B41482790B88,62991490-8628-48CB-8BA9-B41482790B88.png,IMG_8676.PNG,2021-07-24T23:53:03-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4A91727B-7AFE-453E-899D-B99EB2083968,4A91727B-7AFE-453E-899D-B99EB2083968.png,IMG_8757.PNG,2021-07-30T01:57:00-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +92D00C9B-84A1-4ABC-B329-3087A8077C5F,92D00C9B-84A1-4ABC-B329-3087A8077C5F.png,IMG_8840.PNG,2021-08-01T16:59:21-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0988B34C-985D-4193-B78E-5A3CD6129F3B,0988B34C-985D-4193-B78E-5A3CD6129F3B.heic,65024446275__C3BEE45B-D4CD-4163-A430-FC47047CC327.HEIC,2021-08-09T16:27:42.736000-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +864D0428-B3FF-46F3-8148-6BB92B94CB25,864D0428-B3FF-46F3-8148-6BB92B94CB25.heic,65024460349__81D02099-45B4-4A6C-B7A3-D9D3F6A58D37.HEIC,2021-08-09T16:30:03.479000-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +AE6835F9-B7D7-42EB-B710-FC0FF4D5FA7A,AE6835F9-B7D7-42EB-B710-FC0FF4D5FA7A.png,IMG_9055.PNG,2021-08-09T16:41:15-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D3176C77-7F87-4929-8D6C-33C95F23AC62,D3176C77-7F87-4929-8D6C-33C95F23AC62.png,IMG_9990.PNG,2021-09-09T13:52:27+02:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A126E0B3-4A7C-484F-A07C-4913A11D9D76,A126E0B3-4A7C-484F-A07C-4913A11D9D76.png,IMG_0241.PNG,2021-09-16T22:21:21+02:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0EFF52AF-89D8-4FD6-BE6D-27EF2757857F,0EFF52AF-89D8-4FD6-BE6D-27EF2757857F.png,IMG_0243.PNG,2021-09-16T22:21:41+02:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C117DA6A-B981-4928-9468-773621AAE518,C117DA6A-B981-4928-9468-773621AAE518.png,IMG_0244.PNG,2021-09-16T22:23:44+02:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6028116B-A7CF-4711-BCBE-95A5EFA8B6B9,6028116B-A7CF-4711-BCBE-95A5EFA8B6B9.png,IMG_0245.PNG,2021-09-16T22:23:49+02:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4DBBA1A9-CEB2-41F3-89C8-A784948773DB,4DBBA1A9-CEB2-41F3-89C8-A784948773DB.png,IMG_0624.PNG,2021-10-05T14:51:14-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2A566451-917C-4EB8-A775-10CFA50E8182,2A566451-917C-4EB8-A775-10CFA50E8182.png,IMG_0639.PNG,2021-10-06T15:52:25-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BD35D748-8461-4679-83DB-FB546A55AC4B,BD35D748-8461-4679-83DB-FB546A55AC4B.png,IMG_0720.PNG,2021-10-08T20:45:23-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4737D22D-0A4A-44D6-BBA8-7E1348133A5D,4737D22D-0A4A-44D6-BBA8-7E1348133A5D.png,IMG_0738.PNG,2021-10-09T03:56:15-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +03C80E25-D5D3-47F8-A7C5-04EF67DCDA67,03C80E25-D5D3-47F8-A7C5-04EF67DCDA67.png,IMG_0785.PNG,2021-10-09T20:36:19-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2101D57A-497E-4C24-A940-3044760D882D,2101D57A-497E-4C24-A940-3044760D882D.png,IMG_0786.PNG,2021-10-09T20:36:39-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +09A70CB3-7BF9-4B6E-B4E7-224D74B0EE13,09A70CB3-7BF9-4B6E-B4E7-224D74B0EE13.png,IMG_0852.PNG,2021-10-10T14:20:33-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +76C067FB-C768-40E8-A973-B5ED5EFE597F,76C067FB-C768-40E8-A973-B5ED5EFE597F.png,IMG_1048.PNG,2021-10-22T01:20:04-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FD42DDC1-59D1-4D21-BA98-6BC95F77AA0F,FD42DDC1-59D1-4D21-BA98-6BC95F77AA0F.png,IMG_1074.PNG,2021-10-24T02:12:34-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C380B187-6C24-4DB9-A704-210A58003638,C380B187-6C24-4DB9-A704-210A58003638.png,IMG_1634.PNG,2021-12-15T12:03:41-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E493A29B-46D6-4ED0-8D22-10A6023E1560,E493A29B-46D6-4ED0-8D22-10A6023E1560.png,IMG_1635.PNG,2021-12-15T12:04:18-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +50EFA446-603D-42A5-8215-7A0FE117B4EB,50EFA446-603D-42A5-8215-7A0FE117B4EB.png,IMG_1938.PNG,2022-02-07T18:20:49-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3DEA9C28-0676-4CFD-B66A-4ECC274BBE1F,3DEA9C28-0676-4CFD-B66A-4ECC274BBE1F.png,IMG_2538.PNG,2022-03-07T22:54:49-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2E714855-B0B5-435D-A7EA-42661B14E1F2,2E714855-B0B5-435D-A7EA-42661B14E1F2.jpeg,7D6D0C50-1D93-4478-B605-1EA0F91E9B66.jpg,2022-03-07T23:09:50.604921-08:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +94A61855-F957-488B-853C-1008B3F8CE6A,94A61855-F957-488B-853C-1008B3F8CE6A.heic,IMG_2732.HEIC,2022-03-11T12:55:48.957176-08:00,,,,Screenshots,,,True,False,False,False,False,False,42.197966666666666,-122.70950333333333,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +17C4AF7C-ED99-4975-B0B6-E60C12013956,17C4AF7C-ED99-4975-B0B6-E60C12013956.png,IMG_3013.PNG,2022-03-29T02:13:20-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AE4D9C2C-E1A4-477F-B764-C2456ABB8EAB,AE4D9C2C-E1A4-477F-B764-C2456ABB8EAB.png,IMG_3034.PNG,2022-03-29T16:36:14-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6E681A10-817B-44C1-B66D-941D0D32CA48,6E681A10-817B-44C1-B66D-941D0D32CA48.png,IMG_3040.PNG,2022-03-29T23:17:11-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +932F405F-4494-4946-AD7A-D5F9ED1B5AED,932F405F-4494-4946-AD7A-D5F9ED1B5AED.png,IMG_3095.PNG,2022-04-03T16:47:54-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D8AC3AAD-5CBA-40B6-9F7B-30DA02F7E541,D8AC3AAD-5CBA-40B6-9F7B-30DA02F7E541.jpeg,361426A8-D6F3-44A5-8DDD-866771BF5D95.jpg,2022-04-03T16:54:10.326616-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +3361A35D-AACF-43EE-90A8-E4BDA718B4CE,3361A35D-AACF-43EE-90A8-E4BDA718B4CE.png,IMG_3123.PNG,2022-04-07T12:19:24-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +11E08966-7B27-47CA-8682-361D560DB56E,11E08966-7B27-47CA-8682-361D560DB56E.png,IMG_3283.PNG,2022-04-12T19:18:02-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6A477DF6-A6A0-4021-96B8-89D68565E049,6A477DF6-A6A0-4021-96B8-89D68565E049.heic,67201159470__938B25F0-40C1-487A-AE88-02EBD8947E5A.HEIC,2022-04-18T14:53:14.654000-07:00,,,,Screenshots,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +19EF6209-706F-4F3C-9A50-FDE30D833FF3,19EF6209-706F-4F3C-9A50-FDE30D833FF3.jpeg,P2-A.jpg,2022-04-23T18:28:40-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +F07C4CFD-51B2-48A7-A7D4-0F632A946D9E,F07C4CFD-51B2-48A7-A7D4-0F632A946D9E.jpeg,P2-B.jpg,2022-04-23T18:28:40-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +AABA0DDF-1262-4BF3-BD75-F5223DA32138,AABA0DDF-1262-4BF3-BD75-F5223DA32138.jpeg,P2-C.jpg,2022-04-23T18:28:40-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +9D8F5DFD-CC76-4249-A7FB-0787911F32EE,9D8F5DFD-CC76-4249-A7FB-0787911F32EE.jpeg,FD58BE72-C37B-4CD5-90DE-5E4DE5CACE8A.jpg,2022-04-23T18:36:49.821016-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +E530321F-EE72-4EA8-9682-CDDD20B0784E,E530321F-EE72-4EA8-9682-CDDD20B0784E.jpeg,C84C738A-92A0-4B1C-90C6-018E6835C228.jpg,2022-04-23T18:36:50.054397-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +43EA6200-5D6E-406A-9840-E48E8BAA7E09,43EA6200-5D6E-406A-9840-E48E8BAA7E09.jpeg,331FA429-B30B-4010-A5CB-397BD18E5B5D.jpg,2022-04-23T18:36:50.131042-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +7AA670C5-496A-4761-9F40-4EBDAE82F393,7AA670C5-496A-4761-9F40-4EBDAE82F393.png,IMG_3944.PNG,2022-04-25T02:48:55-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AC0F3476-F883-428E-822A-9A5F9D97782A,AC0F3476-F883-428E-822A-9A5F9D97782A.jpeg,9F3A8C12-ADE9-4447-8C36-122AB0475EFB.jpg,2022-04-25T02:51:49.934596-07:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +18D3FE91-7F53-4615-AE32-F8C2C914ED44,18D3FE91-7F53-4615-AE32-F8C2C914ED44.png,IMG_3987.PNG,2022-05-01T21:48:12-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +18515F1A-A23B-44C4-AAFA-02D27C57AA02,18515F1A-A23B-44C4-AAFA-02D27C57AA02.png,IMG_3997.PNG,2022-05-03T14:04:28-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D330CBFB-4FF8-40E5-95BF-EE87E522C490,D330CBFB-4FF8-40E5-95BF-EE87E522C490.png,IMG_4104.PNG,2022-05-09T11:56:13-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +03BDD448-BC7F-441C-9147-59C202C512DA,03BDD448-BC7F-441C-9147-59C202C512DA.png,IMG_4105.PNG,2022-05-09T11:56:44-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +504ADD7F-9B0E-4211-BD6E-5F69CA42E674,504ADD7F-9B0E-4211-BD6E-5F69CA42E674.png,IMG_4109.PNG,2022-05-09T11:58:19-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +686DB439-EE60-4656-89D4-A334124C3C33,686DB439-EE60-4656-89D4-A334124C3C33.png,IMG_4111.PNG,2022-05-09T11:58:45-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E1E2BF09-BBE3-4943-8E21-B133D9AA4DBE,E1E2BF09-BBE3-4943-8E21-B133D9AA4DBE.png,IMG_4112.PNG,2022-05-09T11:58:50-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0AFE8DED-130D-4439-A3F2-CF8A3B808111,0AFE8DED-130D-4439-A3F2-CF8A3B808111.png,IMG_4115.PNG,2022-05-09T12:05:35-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +82134DB4-B2F3-4EC2-9E1F-D9F92B51E2CB,82134DB4-B2F3-4EC2-9E1F-D9F92B51E2CB.png,IMG_4162.PNG,2022-05-11T10:48:16-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E1F4AA6A-738B-4ECB-AFBB-59F132C13200,E1F4AA6A-738B-4ECB-AFBB-59F132C13200.png,IMG_4226.PNG,2022-05-15T14:12:48-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9F7BBFDE-75CC-4D4F-A639-E3C366C39326,9F7BBFDE-75CC-4D4F-A639-E3C366C39326.png,IMG_4253.PNG,2022-05-18T15:56:07-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +72A3D204-FEE6-4D71-835A-15C19717CF9E,72A3D204-FEE6-4D71-835A-15C19717CF9E.heic,67459966904__17B174F9-6E31-467C-A037-356C63DD2CC9.HEIC,2022-05-18T16:47:49.012000-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +B2DB564F-7FBA-4240-8317-54DD0939CAFA,B2DB564F-7FBA-4240-8317-54DD0939CAFA.png,IMG_4306.PNG,2022-05-21T04:00:17-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A9BBAF96-F158-494A-A0EE-451582D4662D,A9BBAF96-F158-494A-A0EE-451582D4662D.png,IMG_4322.PNG,2022-05-22T12:14:04-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +91D2A61E-37E1-43C9-ACAA-0BE290B18583,91D2A61E-37E1-43C9-ACAA-0BE290B18583.png,IMG_0235.PNG,2022-06-07T13:08:52-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F06A6508-A9D3-4059-B575-FA7B35893522,F06A6508-A9D3-4059-B575-FA7B35893522.png,IMG_0672.PNG,2022-06-23T17:56:22-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1A149F44-531F-4FFA-A5AD-27F50594D665,1A149F44-531F-4FFA-A5AD-27F50594D665.png,IMG_0885.PNG,2022-07-11T02:59:12-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0169EB98-106E-4496-9E98-A5E478D072A0,0169EB98-106E-4496-9E98-A5E478D072A0.png,IMG_0937.PNG,2022-07-12T00:01:03-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F66D6315-D849-4502-8D47-F62B3D39E63B,F66D6315-D849-4502-8D47-F62B3D39E63B.png,IMG_0941.PNG,2022-07-12T00:05:34-04:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E0838E35-F1D2-4983-A5BD-EE3FD2D5E3AE,E0838E35-F1D2-4983-A5BD-EE3FD2D5E3AE.png,IMG_0958.PNG,2022-07-13T14:41:34-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +37516777-7CA8-4577-ABE9-75FA2D481C20,37516777-7CA8-4577-ABE9-75FA2D481C20.png,IMG_0959.PNG,2022-07-13T14:41:37-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +EC02A8A5-C11F-4B29-BB53-C2CE46FF83D5,EC02A8A5-C11F-4B29-BB53-C2CE46FF83D5.png,IMG_1017.PNG,2022-07-24T16:00:48-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +237952D4-78ED-437C-943D-196C30D7424F,237952D4-78ED-437C-943D-196C30D7424F.png,IMG_1020.PNG,2022-07-24T18:55:12-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DFBBCAF2-716D-488D-8693-EDC8AC26DB14,DFBBCAF2-716D-488D-8693-EDC8AC26DB14.png,IMG_1424.PNG,2022-08-24T15:07:31-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E8AD3309-E0A0-4683-8FAA-37756226090F,E8AD3309-E0A0-4683-8FAA-37756226090F.png,IMG_1766.PNG,2022-09-15T18:52:49-07:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +63917149-219C-46C3-9932-DA89CDFC396C,63917149-219C-46C3-9932-DA89CDFC396C.png,IMG_1831.PNG,2022-09-23T20:52:43-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4D730779-1CFF-4BC4-8D70-CDB3ECF61052,4D730779-1CFF-4BC4-8D70-CDB3ECF61052.png,IMG_1860.PNG,2022-09-24T22:02:05-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +75014935-F0DF-44F2-8156-AEC6CB030721,75014935-F0DF-44F2-8156-AEC6CB030721.png,IMG_1861.PNG,2022-09-24T22:03:03-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2324BCAA-E413-49B1-B200-15AE58CC811F,2324BCAA-E413-49B1-B200-15AE58CC811F.png,IMG_2014.PNG,2022-10-04T10:37:43-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +0DB11293-9AED-47A0-A55F-77B52961EF32,0DB11293-9AED-47A0-A55F-77B52961EF32.png,IMG_2015.PNG,2022-10-04T10:37:45-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DB3FD853-2DBA-4A18-A8FE-8824A5F55158,DB3FD853-2DBA-4A18-A8FE-8824A5F55158.heic,68673199492__EC3294C2-A1E6-4ACB-AAFD-1A7658BABFF9.HEIC,2022-10-05T23:53:14.913000-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.heic,False,True,,True,True,,False,False,False,False,False,False,False,False,False,,,False +D327C9EA-3C0F-4383-A098-499238078C79,D327C9EA-3C0F-4383-A098-499238078C79.png,IMG_2273.PNG,2022-10-25T16:02:13-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3D16495F-B71E-41F5-89BB-7250BE9AD2F9,3D16495F-B71E-41F5-89BB-7250BE9AD2F9.png,IMG_2420.PNG,2022-11-06T18:57:25-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C725405F-A911-4CB3-BE2E-16621E152713,C725405F-A911-4CB3-BE2E-16621E152713.png,IMG_2509.PNG,2022-11-21T19:09:39-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F64197B8-2887-480F-B066-06E6E57DD9B3,F64197B8-2887-480F-B066-06E6E57DD9B3.jpeg,EBEECE5A-40C3-4427-B405-8BF78CD8F220.jpg,2022-11-21T19:12:03.977336-08:00,,,,Instagram,,,True,False,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +6E7BB2DB-DD73-4153-A059-0391D6D2EB5C,6E7BB2DB-DD73-4153-A059-0391D6D2EB5C.heic,IMG_2726.HEIC,2022-12-05T12:09:37.640000-08:00,,,,Screenshots,,,True,False,False,False,False,False,42.197963333333334,-122.709495,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +4199FF83-4957-4292-B72D-88D15653BD82,4199FF83-4957-4292-B72D-88D15653BD82.png,IMG_2972.PNG,2022-12-15T21:18:35-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F8737540-944A-4648-A531-CCDE0966AA7B,F8737540-944A-4648-A531-CCDE0966AA7B.png,IMG_4215.PNG,2023-02-06T23:39:23-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +610EA9D0-B1D3-4CBB-A4B2-193A99373111,610EA9D0-B1D3-4CBB-A4B2-193A99373111.png,IMG_4317.PNG,2023-02-09T19:55:36-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +97582152-4799-4041-8242-8AFDBA148738,97582152-4799-4041-8242-8AFDBA148738.png,IMG_4415.PNG,2023-02-11T01:05:03-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AC40B002-1556-456F-9002-3C8E8DE96A56,AC40B002-1556-456F-9002-3C8E8DE96A56.png,IMG_4462.PNG,2023-02-12T17:59:46-05:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +71494483-ADCA-46EF-B500-FDC697DCDA1D,71494483-ADCA-46EF-B500-FDC697DCDA1D.png,IMG_4463.PNG,2023-02-12T18:00:02-05:00,,,,,"_UNKNOWN_, _UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CF0B30F7-3DDA-4D8E-AD58-1847B8EC7DAF,CF0B30F7-3DDA-4D8E-AD58-1847B8EC7DAF.png,IMG_4464.PNG,2023-02-12T18:00:19-05:00,,,,,"_UNKNOWN_, _UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +98126BE5-1ECD-4CAE-AA40-038FE9376FD5,98126BE5-1ECD-4CAE-AA40-038FE9376FD5.png,IMG_4659.PNG,2023-02-20T17:54:45-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CF51E6B3-449B-4FC3-9EAA-E5E502F094B1,CF51E6B3-449B-4FC3-9EAA-E5E502F094B1.png,IMG_5129.PNG,2023-03-09T16:10:42-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8C14F21C-EF49-4167-938C-217C219C2A79,8C14F21C-EF49-4167-938C-217C219C2A79.heic,IMG_5266.HEIC,2023-03-14T14:52:15.212000-04:00,,,,,,,True,False,False,False,False,False,40.71458,-73.99083,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +101160B1-9B60-44C6-9551-CDDA1F222AA1,101160B1-9B60-44C6-9551-CDDA1F222AA1.png,IMG_5270.PNG,2023-03-14T17:54:07-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7FAB3954-D96F-4339-A67E-D84AEF70DB93,7FAB3954-D96F-4339-A67E-D84AEF70DB93.png,IMG_5296.PNG,2023-03-15T01:11:24-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3E9B1C54-1601-4022-B9D3-1C52CCA5CD39,3E9B1C54-1601-4022-B9D3-1C52CCA5CD39.png,IMG_5501.PNG,2023-03-21T10:25:41-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A350D38C-496C-49ED-BBA0-E7E5FD155D38,A350D38C-496C-49ED-BBA0-E7E5FD155D38.png,IMG_5525.PNG,2023-03-21T18:10:33-04:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +589D90FE-62DE-4B54-98A4-986B933ACFE0,589D90FE-62DE-4B54-98A4-986B933ACFE0.png,IMG_5526.PNG,2023-03-21T18:37:57-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +73713CB6-0CFF-492E-A11B-7ABA17881C9D,73713CB6-0CFF-492E-A11B-7ABA17881C9D.png,IMG_5634.PNG,2023-03-23T22:35:09-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F1A1930A-9CAB-4ED9-8930-97CC074C0FA4,F1A1930A-9CAB-4ED9-8930-97CC074C0FA4.png,IMG_6453.PNG,2023-04-12T01:48:45-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +77014F7E-5FEC-44C9-A559-3EAAF9686A98,77014F7E-5FEC-44C9-A559-3EAAF9686A98.png,IMG_6454.PNG,2023-04-12T01:48:49-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7DC0A819-1043-4C97-B2DD-6D5D4489AA87,7DC0A819-1043-4C97-B2DD-6D5D4489AA87.png,IMG_6457.PNG,2023-04-12T01:49:14-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7A25417F-9A8F-43F6-A61E-BC17601364D4,7A25417F-9A8F-43F6-A61E-BC17601364D4.png,IMG_6642.PNG,2023-04-16T13:54:53-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +60B15A52-635F-46C3-8B24-069602DF0655,60B15A52-635F-46C3-8B24-069602DF0655.png,IMG_6643.PNG,2023-04-16T13:54:56-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1A958B7A-EC60-49A2-95E7-B9ECAA9879A8,1A958B7A-EC60-49A2-95E7-B9ECAA9879A8.png,IMG_6986.PNG,2023-04-27T13:29:19-04:00,,,,,,,True,True,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,2023-04-27T13:29:35.503608-04:00,False,True,False,False,False,False,False,False,False,,,False +A6866CE5-15CB-42E0-9ED5-6E291A841C0F,A6866CE5-15CB-42E0-9ED5-6E291A841C0F.png,IMG_7092.PNG,2023-05-01T14:00:25-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +14D8ECB7-39D8-4C39-93E1-C67957FDE4CC,14D8ECB7-39D8-4C39-93E1-C67957FDE4CC.png,IMG_7191.PNG,2023-05-05T01:41:51-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C2C19E30-7602-40A3-8943-903E781DB710,C2C19E30-7602-40A3-8943-903E781DB710.png,IMG_7192.PNG,2023-05-05T01:42:00-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +69E19310-6091-45EA-B279-FFF0DD0F2653,69E19310-6091-45EA-B279-FFF0DD0F2653.png,IMG_7197.PNG,2023-05-05T10:56:53-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +283DBC63-33BC-47E9-8275-175B8A48E0A4,283DBC63-33BC-47E9-8275-175B8A48E0A4.png,IMG_7206.PNG,2023-05-05T17:39:27-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BE03A06F-9FB0-4283-ACB6-FAAAF6B7CBC8,BE03A06F-9FB0-4283-ACB6-FAAAF6B7CBC8.png,IMG_7207.PNG,2023-05-05T17:39:31-04:00,,,,,,,True,True,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,2023-05-05T17:39:44.596309-04:00,False,True,False,False,False,False,False,False,False,,,False +75A131E6-1212-4F62-A65E-41F22B4A4A4D,75A131E6-1212-4F62-A65E-41F22B4A4A4D.png,IMG_7285.PNG,2023-05-08T15:57:03-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6583822E-F64B-49B7-BECB-FFE16AF7C86A,6583822E-F64B-49B7-BECB-FFE16AF7C86A.png,IMG_7300.PNG,2023-05-09T11:19:46-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C00F644A-6173-4FB1-9394-66E688A6DB16,C00F644A-6173-4FB1-9394-66E688A6DB16.png,IMG_7348.PNG,2023-05-11T01:00:44-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +DBFE274B-2B20-4517-87A7-3ED9D9C0436B,DBFE274B-2B20-4517-87A7-3ED9D9C0436B.png,IMG_7349.PNG,2023-05-11T01:00:45-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +31C9E751-D2AE-4AA9-91DD-EF5BEA010B2A,31C9E751-D2AE-4AA9-91DD-EF5BEA010B2A.png,IMG_7371.PNG,2023-05-12T18:49:26-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E7B0D237-3D12-488B-8D4E-EF22AB7D3BD2,E7B0D237-3D12-488B-8D4E-EF22AB7D3BD2.png,IMG_7437.PNG,2023-05-13T19:07:25-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9E3DCB1D-0C5F-4908-9318-43890A6456F2,9E3DCB1D-0C5F-4908-9318-43890A6456F2.png,IMG_7438.PNG,2023-05-13T19:07:41-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +859AB836-98E3-4FD2-8BA8-7E67630BD28A,859AB836-98E3-4FD2-8BA8-7E67630BD28A.png,IMG_7540.PNG,2023-05-20T19:55:38-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +78D98617-8231-4F28-9F6B-B708E0F2A89D,78D98617-8231-4F28-9F6B-B708E0F2A89D.png,IMG_7610.PNG,2023-05-26T19:11:21-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E46C006E-81DB-402A-8DDA-FF321DF9066D,E46C006E-81DB-402A-8DDA-FF321DF9066D.png,IMG_7648.PNG,2023-05-29T12:49:23-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8351ED0C-2642-452F-9DDD-1E587CA09108,8351ED0C-2642-452F-9DDD-1E587CA09108.png,IMG_7675.PNG,2023-06-01T11:46:29-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7C1B8451-F853-4E5D-BCE1-72E0EF5CF5D5,7C1B8451-F853-4E5D-BCE1-72E0EF5CF5D5.png,IMG_7925.PNG,2023-06-19T21:00:11-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +6E842A64-E491-42A8-9665-F357D30DEB82,6E842A64-E491-42A8-9665-F357D30DEB82.heic,71225191711__1D4390FD-E94F-4717-A527-5AC77CF9268F.HEIC,2023-07-28T11:45:17.096000-04:00,,,,Screenshots,,,True,False,False,False,False,False,,,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +E2B9903D-4963-441D-9F6C-5D6604C51E4F,E2B9903D-4963-441D-9F6C-5D6604C51E4F.png,IMG_0374.PNG,2023-09-02T19:20:39-04:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +89058547-7FF2-4286-AFC6-1D59DC074EEE,89058547-7FF2-4286-AFC6-1D59DC074EEE.png,IMG_0380.PNG,2023-09-03T14:18:26-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1311D7FB-2F38-4065-8970-E8123D4DC9EA,1311D7FB-2F38-4065-8970-E8123D4DC9EA.png,IMG_0486.PNG,2023-09-07T15:51:30-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +7FB420C9-A35A-4C1C-A1F3-D713CF923968,7FB420C9-A35A-4C1C-A1F3-D713CF923968.png,IMG_0518.PNG,2023-09-08T15:24:05-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +ECD7904B-3671-42BE-8CAD-E40BDB2D0785,ECD7904B-3671-42BE-8CAD-E40BDB2D0785.png,IMG_0573.PNG,2023-09-10T02:57:27-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +D60BE1D4-2F85-4083-9A35-0803B4A10F9D,D60BE1D4-2F85-4083-9A35-0803B4A10F9D.png,IMG_0639.PNG,2023-09-11T14:44:27-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +880EC597-AB32-4D22-BABF-9BC570994D0E,880EC597-AB32-4D22-BABF-9BC570994D0E.png,IMG_0641.PNG,2023-09-11T14:44:42-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +56E3CD95-98B6-4235-84B3-285FCC49A929,56E3CD95-98B6-4235-84B3-285FCC49A929.png,IMG_0642.PNG,2023-09-11T14:44:49-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +BC9CA62C-0EF2-4E34-9E13-777583863553,BC9CA62C-0EF2-4E34-9E13-777583863553.png,IMG_0644.PNG,2023-09-11T14:45:02-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +5F746962-1F60-4AB8-8ABE-A5B2BFD2CE2B,5F746962-1F60-4AB8-8ABE-A5B2BFD2CE2B.png,IMG_0780.PNG,2023-09-19T14:34:00-04:00,,,,,,,True,True,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,2023-09-19T14:34:09.510740-04:00,False,True,False,False,False,False,False,False,False,,,False +5EC2A97E-3473-4AD6-94BD-30D487F94B6D,5EC2A97E-3473-4AD6-94BD-30D487F94B6D.png,IMG_0796.PNG,2023-09-19T22:17:20-04:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +A1670D5D-C655-40EA-BC57-F70495F7D9C5,A1670D5D-C655-40EA-BC57-F70495F7D9C5.png,IMG_0802.PNG,2023-09-20T05:49:31-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +455FFB05-3B40-49FA-815E-37CEBCC39036,455FFB05-3B40-49FA-815E-37CEBCC39036.png,IMG_0837.PNG,2023-09-21T11:53:12-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3A4385A7-A421-4734-9630-A7A4BA1E0AEF,3A4385A7-A421-4734-9630-A7A4BA1E0AEF.png,IMG_0884.PNG,2023-09-22T18:42:58-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C7092F73-D1C9-4463-A8B1-E5174A34F2C9,C7092F73-D1C9-4463-A8B1-E5174A34F2C9.png,IMG_0893.PNG,2023-09-22T21:49:50-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AF94E861-9DCF-40B6-AB82-6F971460EDAB,AF94E861-9DCF-40B6-AB82-6F971460EDAB.png,IMG_0903.PNG,2023-09-22T23:46:23-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F2C23466-DF1F-43F7-AC62-420729886376,F2C23466-DF1F-43F7-AC62-420729886376.png,IMG_0904.PNG,2023-09-22T23:46:26-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2C8A7E38-B266-40C4-A0CB-3533CBC820FF,2C8A7E38-B266-40C4-A0CB-3533CBC820FF.png,IMG_1176.PNG,2023-10-10T11:23:50-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AACE8465-98F8-4105-93C3-EF46881958AE,AACE8465-98F8-4105-93C3-EF46881958AE.png,IMG_1177.PNG,2023-10-10T11:23:54-05:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CC6327F8-A865-46A6-93A6-ABE7F4658152,CC6327F8-A865-46A6-93A6-ABE7F4658152.png,IMG_1276.PNG,2023-10-14T14:19:06-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +85DD18B6-8A92-403C-934A-8F026DA03E83,85DD18B6-8A92-403C-934A-8F026DA03E83.png,IMG_1330.PNG,2023-10-19T16:23:25-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FFA4497E-93E3-41E0-AFE3-957706188F46,FFA4497E-93E3-41E0-AFE3-957706188F46.png,IMG_1336.PNG,2023-10-20T15:23:40-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +B2E9AD0D-C9BD-4754-9382-B1B67CEA740C,B2E9AD0D-C9BD-4754-9382-B1B67CEA740C.png,IMG_1448.PNG,2023-10-28T21:19:06-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +EDBEAE13-198D-48E5-AE4E-4CFACE2A308E,EDBEAE13-198D-48E5-AE4E-4CFACE2A308E.png,IMG_2153.PNG,2023-11-28T19:36:56-05:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F3067F49-6A4C-41A0-8B62-D2D3E3CDA925,F3067F49-6A4C-41A0-8B62-D2D3E3CDA925.png,IMG_2348.PNG,2023-12-15T11:44:40-05:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +26FC5066-604A-41C7-AF67-BF6EC89A912F,26FC5066-604A-41C7-AF67-BF6EC89A912F.png,IMG_2349.PNG,2023-12-15T11:50:33-05:00,,,,,Jeffrey Scudder,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +059E21BA-680D-42E1-9AEF-7027A017E470,059E21BA-680D-42E1-9AEF-7027A017E470.png,IMG_3027.PNG,2024-01-23T00:54:12-04:00,,,,,,,True,True,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,2024-01-22T23:54:37.392443-05:00,False,True,False,False,False,False,False,False,False,,,False +E8850FB1-C7C3-4FA9-A429-C15FCE2785ED,E8850FB1-C7C3-4FA9-A429-C15FCE2785ED.png,IMG_3112.PNG,2024-01-28T16:06:08-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +4A42BF35-54B1-4A2B-8AAD-75ABC8CBB4EA,4A42BF35-54B1-4A2B-8AAD-75ABC8CBB4EA.png,IMG_3113.PNG,2024-01-28T16:11:36-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +164E4230-3462-4B7E-B5DE-B6A25B371D6D,164E4230-3462-4B7E-B5DE-B6A25B371D6D.png,IMG_3208.PNG,2024-02-04T11:48:10-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2726DFF0-5131-4799-8048-87CB162DE1DF,2726DFF0-5131-4799-8048-87CB162DE1DF.png,IMG_3232.PNG,2024-02-05T18:09:00-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8E4A17C0-E35E-49EB-AE55-7EB938D7162D,8E4A17C0-E35E-49EB-AE55-7EB938D7162D.png,IMG_3456.PNG,2024-02-17T17:42:12-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8CEF2AE1-86B3-4E8A-98B3-DC5FA95D3B53,8CEF2AE1-86B3-4E8A-98B3-DC5FA95D3B53.png,IMG_3469.PNG,2024-02-18T13:23:38-08:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +3676917A-FA79-4205-90F3-E4E8A17F972B,3676917A-FA79-4205-90F3-E4E8A17F972B.png,IMG_4160.PNG,2024-03-22T18:38:49-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +AFA57B83-93C2-4D42-A522-256219139534,AFA57B83-93C2-4D42-A522-256219139534.png,IMG_4161.PNG,2024-03-22T18:38:53-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9159E54C-4527-471E-AD0B-A4D003F22E1C,9159E54C-4527-471E-AD0B-A4D003F22E1C.heic,IMG_4533.HEIC,2024-04-16T20:24:52.157000-07:00,,,,,,,True,False,False,False,False,False,42.197895,-122.709305,,True,False,public.heic,False,False,,True,True,,False,False,False,False,False,False,False,False,False,,,False +B36E4502-47BD-4E3C-8C98-3449A5D46447,B36E4502-47BD-4E3C-8C98-3449A5D46447.png,IMG_4589.PNG,2024-04-19T20:35:39-07:00,,,,,"Jeffrey Scudder, Jeffrey Scudder, Jeffrey Scudder",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F9825C85-C75C-42D3-A6D3-E4A8AE074D54,F9825C85-C75C-42D3-A6D3-E4A8AE074D54.png,IMG_4646.PNG,2024-04-24T15:22:32-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +2C5F528C-309D-4FE8-B4BB-17866ADC8652,2C5F528C-309D-4FE8-B4BB-17866ADC8652.png,IMG_4762.PNG,2024-04-29T23:00:47-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +E7163440-2C25-4758-A34F-D14F92B1827D,E7163440-2C25-4758-A34F-D14F92B1827D.png,IMG_4763.PNG,2024-04-29T23:01:25-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +9375B37A-5D73-4EC8-A5DD-929D83D3E381,9375B37A-5D73-4EC8-A5DD-929D83D3E381.png,IMG_4764.PNG,2024-04-29T23:04:45-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F11B051F-A892-4D71-B971-CFAA93394916,F11B051F-A892-4D71-B971-CFAA93394916.png,IMG_4999.PNG,2024-05-10T14:49:57-07:00,,,,,"Jeffrey Scudder, Jeffrey Scudder, Jeffrey Scudder, Jeffrey Scudder",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +CB4EF9E3-64A6-471B-8EE1-64B0C191E4C4,CB4EF9E3-64A6-471B-8EE1-64B0C191E4C4.png,IMG_5283.PNG,2024-05-25T20:29:14-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +777CCC60-2869-4AEE-AF9A-9CD2DD143750,777CCC60-2869-4AEE-AF9A-9CD2DD143750.png,IMG_5389.PNG,2024-05-30T16:17:56-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +98B4BF3E-3B47-4302-A1CA-59A935F0190D,98B4BF3E-3B47-4302-A1CA-59A935F0190D.png,IMG_5390.PNG,2024-05-30T16:18:06-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +58BB0E89-58A2-405B-819E-72EFAA6525EF,58BB0E89-58A2-405B-819E-72EFAA6525EF.png,IMG_5391.PNG,2024-05-30T16:18:08-07:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +173D81ED-C658-4695-B214-FD6E4DD8319D,173D81ED-C658-4695-B214-FD6E4DD8319D.png,IMG_5514.PNG,2024-06-08T19:01:36-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FBBE7FBE-DBC8-40A8-AF34-A362C5709DA8,FBBE7FBE-DBC8-40A8-AF34-A362C5709DA8.png,IMG_5833.PNG,2024-06-26T01:10:46-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +1B0B8DA3-2203-48C8-9689-E9F8D09FB1D7,1B0B8DA3-2203-48C8-9689-E9F8D09FB1D7.png,IMG_6006.PNG,2024-07-05T13:31:46-07:00,,,,,_UNKNOWN_,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +75E35BC1-E139-44F9-B59F-8634EFA5D932,75E35BC1-E139-44F9-B59F-8634EFA5D932.png,IMG_6542.PNG,2024-08-08T21:42:20-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +93CA74CF-752C-4C13-B280-81C96C047DB6,93CA74CF-752C-4C13-B280-81C96C047DB6.png,IMG_7087.PNG,2024-09-09T11:56:14-06:00,,,,,,,True,True,False,False,False,False,,,,True,False,public.jpeg,False,False,,True,True,2024-09-09T14:16:10.026139-04:00,False,True,False,False,False,False,False,False,False,,,False +1DFE6484-A5A3-4F55-9D0A-82220D4502A9,1DFE6484-A5A3-4F55-9D0A-82220D4502A9.png,IMG_7092.PNG,2024-09-09T21:07:37-06:00,,,,,"_UNKNOWN_, _UNKNOWN_",,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +FE932FE4-7BDE-4432-9CE9-B9F9698DA517,FE932FE4-7BDE-4432-9CE9-B9F9698DA517.png,IMG_7253.PNG,2024-09-20T17:10:54-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +C02AE7A9-DF13-49FC-86C6-7D048B1E5C2C,C02AE7A9-DF13-49FC-86C6-7D048B1E5C2C.png,IMG_7265.PNG,2024-09-21T11:50:08-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +F699A30C-9EAC-4C67-AAB9-04CAA8E574E1,F699A30C-9EAC-4C67-AAB9-04CAA8E574E1.png,IMG_7747.PNG,2024-10-27T09:57:38-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +76DE13D9-AFA4-431A-8AED-691EC47F382B,76DE13D9-AFA4-431A-8AED-691EC47F382B.heic,IMG_8645.HEIC,2025-01-19T19:38:18.502000-08:00,,,,,,,True,False,False,False,False,False,42.19797833333333,-122.70958666666667,,True,False,public.heic,False,True,,True,True,,False,False,False,False,False,False,False,False,False,,,False +C2534733-7DB7-4037-832A-63B46B25767A,C2534733-7DB7-4037-832A-63B46B25767A.png,IMG_9577.PNG,2025-05-10T13:43:51-04:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +902878BC-9E93-4C26-85F7-E8BF4A9E4699,902878BC-9E93-4C26-85F7-E8BF4A9E4699.png,IMG_4598.PNG,2026-07-10T17:32:13-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False +8A9B51FB-7DE2-45C5-96C4-DA51EA093003,8A9B51FB-7DE2-45C5-96C4-DA51EA093003.png,IMG_5129.PNG,2026-07-24T01:24:33-07:00,,,,,,,True,False,False,False,False,False,,,,True,False,public.png,False,False,,True,True,,False,True,False,False,False,False,False,False,False,,,False diff --git a/toolchain/whistlegraph/downloads/comments-harvest/comment-uuids.txt b/toolchain/whistlegraph/downloads/comments-harvest/comment-uuids.txt new file mode 100644 index 0000000000..f9eadac8d8 --- /dev/null +++ b/toolchain/whistlegraph/downloads/comments-harvest/comment-uuids.txt @@ -0,0 +1,407 @@ +E70D1D51-DDF0-44B5-8EF4-CBA9C0E50443 +8455BAEE-03F1-4865-8390-84D54CECA399 +30FEB2F6-CEC5-44D6-B8DF-E02562FEFF55 +A2DB390A-3453-40B2-AC01-3577B3EC3A5F +1B5312A5-5EAE-4D5E-9B7B-5D007D57CA3D +DA157706-FAA1-43AA-9388-0B5361A08351 +2E952F3F-FB8C-4376-904E-1774F3A54C52 +C02E1ACC-9C86-45FB-AA33-4D428D4BC1BF +F97B352D-3285-4BED-9774-4761EF683E7F +17F1768A-15C2-4828-9A55-C2EBEDFB85B1 +37E66D7C-F27D-4166-8241-CF009A8D978B +8AB4439B-EF67-4495-B382-B294B524CE9B +D77FDD1F-9969-4BB6-9754-B1D6DA339B2C +CDEF4C25-3DCC-43E7-B6AB-7B91CB917D8A +10421DF5-1514-4F4B-B1C2-7D1891ACD778 +5F60D863-6A1A-431F-BE7E-511650A69058 +93B0DD60-1E50-4665-9407-D2D95FDB8A0D +A6345AA0-3A22-4BF3-8E13-EB98CBF1FD45 +F57EC7FA-DCFB-47B4-AB1E-0F7023C60399 +1D50EF64-6D4A-4691-9682-28066B91275E +DCCDEE47-9AC9-484E-A405-E11D4BE6A0AF +BC12C350-BA80-48D1-8564-268457C77584 +9C4F20D5-42DC-4098-86D0-2BD63D567545 +39191193-B0F1-48A4-82BF-7177DCB16F43 +361F4B99-039C-448F-AF09-CBFE0E88D130 +0C315158-160C-461B-8A2F-FD4276355ABA +4760A93C-61E7-4E7D-990E-B550C801846D +6871A0AF-4520-41A2-ADFF-BACC09FBB6BA +D5F34A91-AEA8-4400-9A58-3959010BCEE9 +121C739B-96E3-4319-9B9A-7286CBC49E16 +665CF6BE-2D7C-4BAA-97E3-BA283EF9E3FE +1F070DE9-EBE0-425B-8D6E-629A286DD03B +8346D68C-3143-4AD6-8B41-6C0F5A7C1529 +0492F2D1-0429-4BA2-8683-CC49E69C65A1 +DE299C92-76EF-4436-A010-EE68F31FB183 +DC3F017A-08A5-4A46-B98A-A2AA4BEA511E +D0CED43D-B083-4815-9A83-B457CFBBD90E +18ABD85D-DF1C-47A6-90DE-C3B1CD0D1B76 +82664245-5CA8-4B4B-9EF2-C14FCBCC30BE +0565438A-A228-4AD7-8D53-C157D76F6C68 +AF62F523-6F89-4DB8-8BE1-44B451CAA130 +209D292C-4486-4F55-92BB-AC59DC13CC98 +F827D081-CEC5-44C1-90DB-E7382A5CDB15 +04822532-9C28-4813-89AC-0E65504CBE62 +5CBEC207-0B10-49E7-B307-A8BD521D0A11 +5992DF23-136B-46B2-B1A0-536AE6248ED3 +948FD8F1-5EAE-4729-838B-502B9C5A2917 +35612C88-448F-411C-8CBD-63DE5270271C +773AD9DB-EC74-44D2-BB53-68093A60B78D +366E9FD3-65A0-4CF3-87DE-8FCCEB7B02BF +F8AB9E2A-345B-4689-B0A5-D2A81FE8E13B +48E88FDA-6373-4160-9B3A-9EA5075E12A9 +1D48F5E3-78A4-42C8-A1A5-46B6AB4C12EA +6782D5D2-E64F-4B86-AFA7-E90DBC8B70B7 +9488DCA3-C28C-4476-B93A-CBC6E5E57E6F +B4CBC65D-A7D8-4D06-B746-745E9FDA4D90 +FF73D0EC-584F-4473-98EF-275F0DA0BB74 +B0A03AD8-2305-4BB9-9BAF-CAB59F2D7553 +C4BBFD11-BA67-43C7-A176-ACCB8206144F +CFBF2FA0-74D2-4A1C-B5CF-F7411E0804D3 +786A0634-1AF8-4D6F-B21B-7753CDEC7042 +C4BA26A2-DA90-463B-96D9-A4EAF7313E14 +BFE64429-6B1E-4C22-845D-77D50B734CAC +7823553D-D2A3-4C18-BACE-360121911B40 +DDC0972E-8436-43A3-ABD1-14475EBF85AF +D71E8366-49EE-4C74-9BAD-0A7143F56600 +F0600119-7438-4278-80E2-5F6DFC35A178 +25EDB50B-4790-4958-BE15-F493073BDA55 +BD455E45-BD9D-4D89-83EC-586E07352813 +8BAEDA50-A9AE-4950-A108-AC35A331C17F +DE3594D4-495A-44AA-BAFE-7306D965211B +7600641D-89B7-428D-8D3A-2D9507AA060E +68F2FBAD-3A10-4D8E-B00B-D13C244740CA +C8477351-BB23-4497-904B-735E7AA9A224 +94C3B96B-A655-4F3D-BBEB-AEE10A8B91E6 +3A781D1E-EE62-46B3-9679-381EBC2DEA46 +45CA82A1-FFF2-496B-BF31-C25EFC53FEA3 +DECE03FA-08AA-45DC-929E-4C4314B18247 +7428EB83-6DF0-43CB-9045-EFAB6DABA51B +7E602E59-6585-4BD0-BD91-61CAAA7C4D0F +C01DF8B2-E88E-4715-A39E-C0D6CEAE1B95 +D3AC13AC-5B89-4E9D-A914-7765A860369E +9A7C88EE-3748-4B1E-BA2A-3B43EB2DA892 +9081028E-70A0-49F0-8CA6-AD28AEA5605A +BBA87955-DBE5-42EB-B148-71298BEA39B2 +F152EF34-DF39-475A-88D7-3049648A449F +DFC69AA2-E9A8-4F2E-A4DC-EF32C6ECEC67 +33523888-6886-493C-9A70-41E71C928A3C +8141B377-ED65-4D68-B447-8DF0419FCBDA +9F66E93C-1BD3-4947-AC3E-C6F56C922155 +8E85F677-7AEB-4A1E-A48A-7091C7C4AC34 +ECB40D2B-3675-4E20-84AA-ACF20352FFD1 +621527EE-4972-4883-9AD5-77B9B616484A +CFDE61FF-0575-4292-8315-650812A81AEB +3416AB3F-93F9-4C95-B012-62E499A3833E +77BDBB43-1403-4C88-BD0C-0764ACC21815 +EFC34FCF-B063-40AF-A106-C8D10E1EBCE2 +A7972071-6A8F-4132-BC08-D3936C2FB8F7 +13B9D8A4-B003-4187-86E4-BBA483A983B6 +F94E87C7-7EBF-4FC6-9CB2-8C100BD14FFF +322C0FE9-2C72-4B17-AC43-B80411FF5FFB +C4DC8701-698C-40BC-BE56-FF77305C8FCA +DA39ADB9-4EA1-4052-B739-2169A13C8A49 +70074C63-FDCB-40C5-819F-A04CC95E8528 +F39036FC-F70C-44E7-9361-6AF63ABAA528 +C94D5DDD-98CD-441B-A207-E5E4F726A6A0 +FE47EEB9-E884-43B4-A8D9-7080226926C9 +797FD081-3849-4974-85B2-1AEA5E5E4CA0 +8A12D28C-25BE-4485-B7DD-EF8167016B47 +AA9E0B0C-7DB3-424B-823A-93370BA100C7 +55DFA0A3-6B23-4897-AE54-A56550622150 +2BC786FF-4F75-40A1-95E4-98687F0FE523 +9AB3874B-F086-4ED1-814A-1BB2E0A09C12 +C5E3AC34-0EC1-42AD-BD57-9DAA9264C4D8 +64A2571B-D6E1-43E2-89BE-D913474309D1 +EC84E0A3-1EFF-47BA-BCC0-8404F16A7A15 +11028F83-4779-4CB1-BD53-0A6CE1D4A1E1 +63F8B4C6-FB6D-4A49-8C5D-80766A8A66E7 +FD5FBEA2-128D-478A-81DC-011116E0909B +D5883AF8-CC00-487F-A31C-979382B8F3A7 +80FDECDF-AABA-48C2-955F-61C6108A85F8 +AFA77131-D123-4771-A72C-24CDE4959169 +F87CDC63-E65B-443A-855A-F97C3E6C800E +52724884-FB05-42F5-9370-13D82367A5AB +6AF8DEAA-E5E3-4ABE-8D35-1C6A25E551D7 +E9BDB213-1048-4E02-B205-ECD0C30373B6 +BBF8D94B-149C-485D-9A54-DEC386A9817A +D098C69C-0559-42D1-A396-DCA38B4F987F +2254B54D-838D-43A9-9E17-C2B8A8509B87 +4461A448-5DE8-4CB8-9A1E-1CFB2D2C3ACA +E40FA4E8-6B5A-4B76-BF14-8C5708236DF0 +E942E803-1BC0-42D8-9D9E-9DC7AD3ACB13 +DC9CAD82-6837-4351-9EC4-B2850E8D9574 +6E619690-F55F-4BB9-A32B-E69809E13404 +1C1A5B96-8D41-41D1-B657-61D0B94DC291 +B1862EE8-814F-463F-8966-D48C1DE1481A +3256611F-545F-473E-9E43-4026AB744235 +B923A495-186E-489F-BF0D-3F6F6D280D7F +87C90CD6-6A85-406E-B8F0-AC0FF283C03C +1059E926-39FF-45A3-9071-A462D56D5F18 +125E17F5-32D4-4B71-99B3-0FBF0C184E85 +FA996D59-2607-4155-9D3E-8B00636E8330 +CE55900E-9841-4C78-BE5B-08A733D97AD1 +D6864020-C69F-43F9-976D-189B95A9A8B1 +2FB04AE9-5680-4778-B247-CAD472DF49C7 +6D53A14F-49B8-4ACB-B7F4-B58FF06E6E61 +C1AFCDB3-32D3-4E61-A622-95FD2A3339CD +5F8450DC-2C4D-41E8-980C-75B0C9F7923A +A98DFA2C-AFB7-41A0-9553-B73FDA121760 +57A34AA7-E274-474C-B06A-14D6E68934D6 +653BC671-37C8-44A8-BE9D-7C9330BA5CCD +FAE4C404-05E8-428E-9A9D-1E6B98C167C2 +7E9BBD74-BA39-4BD7-8490-12F5DEE8DE18 +37C41775-9BA2-4C94-844A-099B6CEDD8F1 +D6F9CDA3-DF0F-4513-AC6E-B4E3ABC5B391 +2D41F74E-5F29-41F2-AA84-11C2DB9E3CEF +F0F0573F-1C1B-4328-AFD0-05FE61C3F4C4 +64A61B96-0217-486F-98D2-03BD6D535727 +F7F70E61-4624-4F49-BB33-7EEFF4F4E6D8 +880154A7-01D5-4E09-B7B2-5E3F84449FE0 +3286DBD4-CB21-49B1-A599-FE2D84EC6660 +65348A97-26E2-477A-A37A-FC060F03ED56 +5BB31A70-DDD1-4AF9-9F35-676F6D53879C +E840F353-CCF2-4D1F-9B67-C5D4B7ABA472 +8157FC29-637C-41BC-A593-352973B8B64F +1F0DE7D8-C6C2-41FD-9A80-ADBA8BEC11C7 +68B1838C-D781-47FE-B8F4-B382AD4DAEBB +515AF29F-8B07-4AD8-8DAB-48EE3051ADC1 +343332F6-C18D-47A9-8FE0-07392B0E296C +09657449-5BE6-4519-A245-D7D4AF947D82 +A5507B7C-41A2-41AF-87B5-8AADAE3B088F +1DE89DC8-F0EB-4067-AED5-6DA386AB348C +3336DB5F-17EA-4CEA-A9C6-DC6148BEFDFC +99F86FF0-E1C8-42A1-8268-4DA4E604EA6C +6A12E933-F4CB-4B25-90B4-DCD6A0852A41 +901B0406-019C-48BA-BE92-2216A284AC4C +BD849EC0-0F41-4009-AA9B-005C67F56D63 +A7A9A4F3-3C96-495E-887C-6B6B8856BC66 +BB2F9CBB-ADE1-4AAF-AB6B-721270CA1205 +372FFE7A-0343-481F-81F3-78BE31A1F9AA +6987EF9D-9471-4CE4-A1F3-43A47A05F81A +1E5255D6-9CAB-4C30-9A17-4DDE2237F1AF +1FF986FD-942C-42E8-AFAD-7B1D89E6250C +D8A758AA-2C54-483D-93E1-FB2C50321D7B +812B0096-DA33-45B1-8549-0BDCA5D2A03C +55E0476D-9F3D-46CF-9690-6540A140393C +3D717B2F-C77E-47F0-ABCA-C308E0558D52 +113A59BF-EA08-4573-BF99-EC754E63386F +84C77DBC-340C-442C-A562-E6D9B48AFC45 +999498A4-C102-4377-909E-9CE9AFBAD7C4 +FEB1E2C2-9E96-42D0-B984-7CDC6120B9E5 +E6AE6342-BBBD-4F04-86B6-B8DD95430161 +1CB95F0D-81E4-4635-947C-4E35F0007706 +18680AD0-2BE6-487A-9E48-830671104328 +2A40F14A-078D-428B-A046-758258E32075 +26C4592B-142D-4CB8-AB41-FD38BB84261C +F14CA652-F620-4F09-A2E8-B196B1E1A1C4 +8D3BF48D-8930-4072-BC2F-541BB875D4BB +A1CEB465-0504-4762-BA3B-7DA2FA23EC54 +AF3412D9-A6E6-4902-B6E3-B469B6BF0CFB +D67BFFB4-77D0-468C-96C5-331D4925677C +AA8251C4-E8FD-4547-9954-8F37A2323F7D +3A0828DF-F734-4322-B772-1D32D649F651 +6B616548-07F0-43F8-AF14-160B22F02573 +5524C2DD-0D06-4BDD-8B40-3FF0DAC7E82B +29C4C9FF-9860-4068-8835-A22AC1625386 +421FC64B-6AE8-494D-BFB7-BE8EDCBFAE00 +DCDCF562-B132-4C74-BA68-B71409959092 +CD1BA1CF-AB51-4A5F-9812-03FC037A34B5 +B79351FD-4B3A-453A-AD00-3F371C81F022 +D04B5C40-4D0F-406D-BCA1-057EE4172531 +C36C651B-A251-4C1C-A39C-FEA7F6B77326 +DA23C3A8-1D69-4E1E-9EAB-49B79A6750CC +C1662346-9CA4-46ED-9898-6E0EC4B7493E +9685010B-254A-43B3-9F2A-A95B6525BA54 +4D75B783-3615-45A9-B3B5-8B6BDE6F9295 +9DA9D551-DFF9-4A04-8614-A4F84A13E608 +B8EC0B1E-059B-4378-ACCB-F4F56226E106 +62991490-8628-48CB-8BA9-B41482790B88 +4A91727B-7AFE-453E-899D-B99EB2083968 +92D00C9B-84A1-4ABC-B329-3087A8077C5F +0988B34C-985D-4193-B78E-5A3CD6129F3B +864D0428-B3FF-46F3-8148-6BB92B94CB25 +AE6835F9-B7D7-42EB-B710-FC0FF4D5FA7A +D3176C77-7F87-4929-8D6C-33C95F23AC62 +0EFF52AF-89D8-4FD6-BE6D-27EF2757857F +A126E0B3-4A7C-484F-A07C-4913A11D9D76 +C117DA6A-B981-4928-9468-773621AAE518 +6028116B-A7CF-4711-BCBE-95A5EFA8B6B9 +2A566451-917C-4EB8-A775-10CFA50E8182 +4DBBA1A9-CEB2-41F3-89C8-A784948773DB +4737D22D-0A4A-44D6-BBA8-7E1348133A5D +BD35D748-8461-4679-83DB-FB546A55AC4B +03C80E25-D5D3-47F8-A7C5-04EF67DCDA67 +2101D57A-497E-4C24-A940-3044760D882D +09A70CB3-7BF9-4B6E-B4E7-224D74B0EE13 +76C067FB-C768-40E8-A973-B5ED5EFE597F +FD42DDC1-59D1-4D21-BA98-6BC95F77AA0F +C380B187-6C24-4DB9-A704-210A58003638 +E493A29B-46D6-4ED0-8D22-10A6023E1560 +50EFA446-603D-42A5-8215-7A0FE117B4EB +3DEA9C28-0676-4CFD-B66A-4ECC274BBE1F +2E714855-B0B5-435D-A7EA-42661B14E1F2 +94A61855-F957-488B-853C-1008B3F8CE6A +17C4AF7C-ED99-4975-B0B6-E60C12013956 +6E681A10-817B-44C1-B66D-941D0D32CA48 +AE4D9C2C-E1A4-477F-B764-C2456ABB8EAB +3361A35D-AACF-43EE-90A8-E4BDA718B4CE +D8AC3AAD-5CBA-40B6-9F7B-30DA02F7E541 +932F405F-4494-4946-AD7A-D5F9ED1B5AED +11E08966-7B27-47CA-8682-361D560DB56E +19EF6209-706F-4F3C-9A50-FDE30D833FF3 +6A477DF6-A6A0-4021-96B8-89D68565E049 +F07C4CFD-51B2-48A7-A7D4-0F632A946D9E +AABA0DDF-1262-4BF3-BD75-F5223DA32138 +7AA670C5-496A-4761-9F40-4EBDAE82F393 +AC0F3476-F883-428E-822A-9A5F9D97782A +E530321F-EE72-4EA8-9682-CDDD20B0784E +9D8F5DFD-CC76-4249-A7FB-0787911F32EE +18515F1A-A23B-44C4-AAFA-02D27C57AA02 +18D3FE91-7F53-4615-AE32-F8C2C914ED44 +43EA6200-5D6E-406A-9840-E48E8BAA7E09 +0AFE8DED-130D-4439-A3F2-CF8A3B808111 +504ADD7F-9B0E-4211-BD6E-5F69CA42E674 +03BDD448-BC7F-441C-9147-59C202C512DA +D330CBFB-4FF8-40E5-95BF-EE87E522C490 +82134DB4-B2F3-4EC2-9E1F-D9F92B51E2CB +B2DB564F-7FBA-4240-8317-54DD0939CAFA +A9BBAF96-F158-494A-A0EE-451582D4662D +E1F4AA6A-738B-4ECB-AFBB-59F132C13200 +9F7BBFDE-75CC-4D4F-A639-E3C366C39326 +91D2A61E-37E1-43C9-ACAA-0BE290B18583 +F06A6508-A9D3-4059-B575-FA7B35893522 +1A149F44-531F-4FFA-A5AD-27F50594D665 +F66D6315-D849-4502-8D47-F62B3D39E63B +0169EB98-106E-4496-9E98-A5E478D072A0 +E0838E35-F1D2-4983-A5BD-EE3FD2D5E3AE +EC02A8A5-C11F-4B29-BB53-C2CE46FF83D5 +237952D4-78ED-437C-943D-196C30D7424F +37516777-7CA8-4577-ABE9-75FA2D481C20 +DFBBCAF2-716D-488D-8693-EDC8AC26DB14 +E8AD3309-E0A0-4683-8FAA-37756226090F +63917149-219C-46C3-9932-DA89CDFC396C +4D730779-1CFF-4BC4-8D70-CDB3ECF61052 +75014935-F0DF-44F2-8156-AEC6CB030721 +0DB11293-9AED-47A0-A55F-77B52961EF32 +2324BCAA-E413-49B1-B200-15AE58CC811F +DB3FD853-2DBA-4A18-A8FE-8824A5F55158 +D327C9EA-3C0F-4383-A098-499238078C79 +C725405F-A911-4CB3-BE2E-16621E152713 +F64197B8-2887-480F-B066-06E6E57DD9B3 +6E7BB2DB-DD73-4153-A059-0391D6D2EB5C +4199FF83-4957-4292-B72D-88D15653BD82 +F8737540-944A-4648-A531-CCDE0966AA7B +610EA9D0-B1D3-4CBB-A4B2-193A99373111 +97582152-4799-4041-8242-8AFDBA148738 +CF0B30F7-3DDA-4D8E-AD58-1847B8EC7DAF +71494483-ADCA-46EF-B500-FDC697DCDA1D +AC40B002-1556-456F-9002-3C8E8DE96A56 +CF51E6B3-449B-4FC3-9EAA-E5E502F094B1 +3E9B1C54-1601-4022-B9D3-1C52CCA5CD39 +A350D38C-496C-49ED-BBA0-E7E5FD155D38 +589D90FE-62DE-4B54-98A4-986B933ACFE0 +73713CB6-0CFF-492E-A11B-7ABA17881C9D +F1A1930A-9CAB-4ED9-8930-97CC074C0FA4 +7DC0A819-1043-4C97-B2DD-6D5D4489AA87 +77014F7E-5FEC-44C9-A559-3EAAF9686A98 +7A25417F-9A8F-43F6-A61E-BC17601364D4 +60B15A52-635F-46C3-8B24-069602DF0655 +A6866CE5-15CB-42E0-9ED5-6E291A841C0F +BE03A06F-9FB0-4283-ACB6-FAAAF6B7CBC8 +69E19310-6091-45EA-B279-FFF0DD0F2653 +C2C19E30-7602-40A3-8943-903E781DB710 +283DBC63-33BC-47E9-8275-175B8A48E0A4 +14D8ECB7-39D8-4C39-93E1-C67957FDE4CC +75A131E6-1212-4F62-A65E-41F22B4A4A4D +6583822E-F64B-49B7-BECB-FFE16AF7C86A +C00F644A-6173-4FB1-9394-66E688A6DB16 +DBFE274B-2B20-4517-87A7-3ED9D9C0436B +E7B0D237-3D12-488B-8D4E-EF22AB7D3BD2 +31C9E751-D2AE-4AA9-91DD-EF5BEA010B2A +9E3DCB1D-0C5F-4908-9318-43890A6456F2 +859AB836-98E3-4FD2-8BA8-7E67630BD28A +8351ED0C-2642-452F-9DDD-1E587CA09108 +E46C006E-81DB-402A-8DDA-FF321DF9066D +78D98617-8231-4F28-9F6B-B708E0F2A89D +7C1B8451-F853-4E5D-BCE1-72E0EF5CF5D5 +6E842A64-E491-42A8-9665-F357D30DEB82 +89058547-7FF2-4286-AFC6-1D59DC074EEE +E2B9903D-4963-441D-9F6C-5D6604C51E4F +ECD7904B-3671-42BE-8CAD-E40BDB2D0785 +7FB420C9-A35A-4C1C-A1F3-D713CF923968 +1311D7FB-2F38-4065-8970-E8123D4DC9EA +D60BE1D4-2F85-4083-9A35-0803B4A10F9D +56E3CD95-98B6-4235-84B3-285FCC49A929 +BC9CA62C-0EF2-4E34-9E13-777583863553 +880EC597-AB32-4D22-BABF-9BC570994D0E +5EC2A97E-3473-4AD6-94BD-30D487F94B6D +5F746962-1F60-4AB8-8ABE-A5B2BFD2CE2B +455FFB05-3B40-49FA-815E-37CEBCC39036 +A1670D5D-C655-40EA-BC57-F70495F7D9C5 +3A4385A7-A421-4734-9630-A7A4BA1E0AEF +AACE8465-98F8-4105-93C3-EF46881958AE +2C8A7E38-B266-40C4-A0CB-3533CBC820FF +CC6327F8-A865-46A6-93A6-ABE7F4658152 +FFA4497E-93E3-41E0-AFE3-957706188F46 +85DD18B6-8A92-403C-934A-8F026DA03E83 +B2E9AD0D-C9BD-4754-9382-B1B67CEA740C +EDBEAE13-198D-48E5-AE4E-4CFACE2A308E +F3067F49-6A4C-41A0-8B62-D2D3E3CDA925 +26FC5066-604A-41C7-AF67-BF6EC89A912F +059E21BA-680D-42E1-9AEF-7027A017E470 +4A42BF35-54B1-4A2B-8AAD-75ABC8CBB4EA +E8850FB1-C7C3-4FA9-A429-C15FCE2785ED +2726DFF0-5131-4799-8048-87CB162DE1DF +8E4A17C0-E35E-49EB-AE55-7EB938D7162D +8CEF2AE1-86B3-4E8A-98B3-DC5FA95D3B53 +AFA57B83-93C2-4D42-A522-256219139534 +3676917A-FA79-4205-90F3-E4E8A17F972B +9159E54C-4527-471E-AD0B-A4D003F22E1C +F9825C85-C75C-42D3-A6D3-E4A8AE074D54 +E7163440-2C25-4758-A34F-D14F92B1827D +9375B37A-5D73-4EC8-A5DD-929D83D3E381 +2C5F528C-309D-4FE8-B4BB-17866ADC8652 +F11B051F-A892-4D71-B971-CFAA93394916 +CB4EF9E3-64A6-471B-8EE1-64B0C191E4C4 +FBBE7FBE-DBC8-40A8-AF34-A362C5709DA8 +1B0B8DA3-2203-48C8-9689-E9F8D09FB1D7 +75E35BC1-E139-44F9-B59F-8634EFA5D932 +93CA74CF-752C-4C13-B280-81C96C047DB6 +1DFE6484-A5A3-4F55-9D0A-82220D4502A9 +C02AE7A9-DF13-49FC-86C6-7D048B1E5C2C +FE932FE4-7BDE-4432-9CE9-B9F9698DA517 +F699A30C-9EAC-4C67-AAB9-04CAA8E574E1 +76DE13D9-AFA4-431A-8AED-691EC47F382B +C2534733-7DB7-4037-832A-63B46B25767A +101160B1-9B60-44C6-9551-CDDA1F222AA1 +7FAB3954-D96F-4339-A67E-D84AEF70DB93 +8C14F21C-EF49-4167-938C-217C219C2A79 +902878BC-9E93-4C26-85F7-E8BF4A9E4699 +8A9B51FB-7DE2-45C5-96C4-DA51EA093003 +3D16495F-B71E-41F5-89BB-7250BE9AD2F9 +27B8CB35-BDC3-46B5-B3A3-9E7D58993B8E +6C9F8BBE-2A45-401E-90CE-0560E895BD9E +173D81ED-C658-4695-B214-FD6E4DD8319D +98126BE5-1ECD-4CAE-AA40-038FE9376FD5 +58BB0E89-58A2-405B-819E-72EFAA6525EF +98B4BF3E-3B47-4302-A1CA-59A935F0190D +777CCC60-2869-4AEE-AF9A-9CD2DD143750 +51FEB885-D44E-4CD6-A49C-1847605459A1 +1E67EF10-9E28-4C1C-9909-4D21BEFDD273 +FB9C1A79-DA42-43F3-AE22-7686108C43A7 +09F89D55-6276-4C3C-855A-8C797BCCDF41 +79BBFCF7-AD14-4F95-BAE9-A33FF7AC43B8 +D55A1980-3071-474B-AA98-7EF375986148 +DA445279-6DAF-4D9E-885E-1A4FA75BE46F +8295F65E-3E39-4B3D-84BC-6F3350CC14FE +01067255-61C4-4EC3-BA9C-9960ED3BF97F +686DB439-EE60-4656-89D4-A334124C3C33 +E1E2BF09-BBE3-4943-8E21-B133D9AA4DBE +72A3D204-FEE6-4D71-835A-15C19717CF9E +1A958B7A-EC60-49A2-95E7-B9ECAA9879A8 +F2C23466-DF1F-43F7-AC62-420729886376 +C7092F73-D1C9-4463-A8B1-E5174A34F2C9 +AF94E861-9DCF-40B6-AB82-6F971460EDAB +164E4230-3462-4B7E-B5DE-B6A25B371D6D +B36E4502-47BD-4E3C-8C98-3449A5D46447 diff --git a/toolchain/whistlegraph/downloads/comments-harvest/tight-uuids.txt b/toolchain/whistlegraph/downloads/comments-harvest/tight-uuids.txt new file mode 100644 index 0000000000..749cb2d6f0 --- /dev/null +++ b/toolchain/whistlegraph/downloads/comments-harvest/tight-uuids.txt @@ -0,0 +1,246 @@ +E70D1D51-DDF0-44B5-8EF4-CBA9C0E50443 +1B5312A5-5EAE-4D5E-9B7B-5D007D57CA3D +6871A0AF-4520-41A2-ADFF-BACC09FBB6BA +D5F34A91-AEA8-4400-9A58-3959010BCEE9 +0492F2D1-0429-4BA2-8683-CC49E69C65A1 +82664245-5CA8-4B4B-9EF2-C14FCBCC30BE +0565438A-A228-4AD7-8D53-C157D76F6C68 +209D292C-4486-4F55-92BB-AC59DC13CC98 +F827D081-CEC5-44C1-90DB-E7382A5CDB15 +04822532-9C28-4813-89AC-0E65504CBE62 +5CBEC207-0B10-49E7-B307-A8BD521D0A11 +5992DF23-136B-46B2-B1A0-536AE6248ED3 +948FD8F1-5EAE-4729-838B-502B9C5A2917 +366E9FD3-65A0-4CF3-87DE-8FCCEB7B02BF +F8AB9E2A-345B-4689-B0A5-D2A81FE8E13B +1D48F5E3-78A4-42C8-A1A5-46B6AB4C12EA +6782D5D2-E64F-4B86-AFA7-E90DBC8B70B7 +9488DCA3-C28C-4476-B93A-CBC6E5E57E6F +B4CBC65D-A7D8-4D06-B746-745E9FDA4D90 +C4BBFD11-BA67-43C7-A176-ACCB8206144F +C4BA26A2-DA90-463B-96D9-A4EAF7313E14 +D71E8366-49EE-4C74-9BAD-0A7143F56600 +F0600119-7438-4278-80E2-5F6DFC35A178 +BD455E45-BD9D-4D89-83EC-586E07352813 +DE3594D4-495A-44AA-BAFE-7306D965211B +68F2FBAD-3A10-4D8E-B00B-D13C244740CA +C8477351-BB23-4497-904B-735E7AA9A224 +45CA82A1-FFF2-496B-BF31-C25EFC53FEA3 +DECE03FA-08AA-45DC-929E-4C4314B18247 +C01DF8B2-E88E-4715-A39E-C0D6CEAE1B95 +9A7C88EE-3748-4B1E-BA2A-3B43EB2DA892 +9081028E-70A0-49F0-8CA6-AD28AEA5605A +BBA87955-DBE5-42EB-B148-71298BEA39B2 +DFC69AA2-E9A8-4F2E-A4DC-EF32C6ECEC67 +9F66E93C-1BD3-4947-AC3E-C6F56C922155 +ECB40D2B-3675-4E20-84AA-ACF20352FFD1 +621527EE-4972-4883-9AD5-77B9B616484A +EFC34FCF-B063-40AF-A106-C8D10E1EBCE2 +13B9D8A4-B003-4187-86E4-BBA483A983B6 +F94E87C7-7EBF-4FC6-9CB2-8C100BD14FFF +70074C63-FDCB-40C5-819F-A04CC95E8528 +797FD081-3849-4974-85B2-1AEA5E5E4CA0 +8A12D28C-25BE-4485-B7DD-EF8167016B47 +AA9E0B0C-7DB3-424B-823A-93370BA100C7 +55DFA0A3-6B23-4897-AE54-A56550622150 +2BC786FF-4F75-40A1-95E4-98687F0FE523 +C5E3AC34-0EC1-42AD-BD57-9DAA9264C4D8 +64A2571B-D6E1-43E2-89BE-D913474309D1 +EC84E0A3-1EFF-47BA-BCC0-8404F16A7A15 +63F8B4C6-FB6D-4A49-8C5D-80766A8A66E7 +F87CDC63-E65B-443A-855A-F97C3E6C800E +52724884-FB05-42F5-9370-13D82367A5AB +6AF8DEAA-E5E3-4ABE-8D35-1C6A25E551D7 +E9BDB213-1048-4E02-B205-ECD0C30373B6 +BBF8D94B-149C-485D-9A54-DEC386A9817A +E40FA4E8-6B5A-4B76-BF14-8C5708236DF0 +6E619690-F55F-4BB9-A32B-E69809E13404 +1C1A5B96-8D41-41D1-B657-61D0B94DC291 +B1862EE8-814F-463F-8966-D48C1DE1481A +B923A495-186E-489F-BF0D-3F6F6D280D7F +CE55900E-9841-4C78-BE5B-08A733D97AD1 +D6864020-C69F-43F9-976D-189B95A9A8B1 +37C41775-9BA2-4C94-844A-099B6CEDD8F1 +D6F9CDA3-DF0F-4513-AC6E-B4E3ABC5B391 +2D41F74E-5F29-41F2-AA84-11C2DB9E3CEF +F0F0573F-1C1B-4328-AFD0-05FE61C3F4C4 +64A61B96-0217-486F-98D2-03BD6D535727 +F7F70E61-4624-4F49-BB33-7EEFF4F4E6D8 +3286DBD4-CB21-49B1-A599-FE2D84EC6660 +5BB31A70-DDD1-4AF9-9F35-676F6D53879C +1F0DE7D8-C6C2-41FD-9A80-ADBA8BEC11C7 +09657449-5BE6-4519-A245-D7D4AF947D82 +A5507B7C-41A2-41AF-87B5-8AADAE3B088F +3336DB5F-17EA-4CEA-A9C6-DC6148BEFDFC +6A12E933-F4CB-4B25-90B4-DCD6A0852A41 +901B0406-019C-48BA-BE92-2216A284AC4C +BD849EC0-0F41-4009-AA9B-005C67F56D63 +A7A9A4F3-3C96-495E-887C-6B6B8856BC66 +BB2F9CBB-ADE1-4AAF-AB6B-721270CA1205 +372FFE7A-0343-481F-81F3-78BE31A1F9AA +6987EF9D-9471-4CE4-A1F3-43A47A05F81A +1E5255D6-9CAB-4C30-9A17-4DDE2237F1AF +1FF986FD-942C-42E8-AFAD-7B1D89E6250C +812B0096-DA33-45B1-8549-0BDCA5D2A03C +84C77DBC-340C-442C-A562-E6D9B48AFC45 +999498A4-C102-4377-909E-9CE9AFBAD7C4 +FEB1E2C2-9E96-42D0-B984-7CDC6120B9E5 +2A40F14A-078D-428B-A046-758258E32075 +8D3BF48D-8930-4072-BC2F-541BB875D4BB +DCDCF562-B132-4C74-BA68-B71409959092 +C1662346-9CA4-46ED-9898-6E0EC4B7493E +9DA9D551-DFF9-4A04-8614-A4F84A13E608 +B8EC0B1E-059B-4378-ACCB-F4F56226E106 +62991490-8628-48CB-8BA9-B41482790B88 +4A91727B-7AFE-453E-899D-B99EB2083968 +92D00C9B-84A1-4ABC-B329-3087A8077C5F +0988B34C-985D-4193-B78E-5A3CD6129F3B +864D0428-B3FF-46F3-8148-6BB92B94CB25 +AE6835F9-B7D7-42EB-B710-FC0FF4D5FA7A +2A566451-917C-4EB8-A775-10CFA50E8182 +4737D22D-0A4A-44D6-BBA8-7E1348133A5D +BD35D748-8461-4679-83DB-FB546A55AC4B +03C80E25-D5D3-47F8-A7C5-04EF67DCDA67 +2101D57A-497E-4C24-A940-3044760D882D +09A70CB3-7BF9-4B6E-B4E7-224D74B0EE13 +76C067FB-C768-40E8-A973-B5ED5EFE597F +FD42DDC1-59D1-4D21-BA98-6BC95F77AA0F +C380B187-6C24-4DB9-A704-210A58003638 +E493A29B-46D6-4ED0-8D22-10A6023E1560 +3DEA9C28-0676-4CFD-B66A-4ECC274BBE1F +2E714855-B0B5-435D-A7EA-42661B14E1F2 +94A61855-F957-488B-853C-1008B3F8CE6A +17C4AF7C-ED99-4975-B0B6-E60C12013956 +AE4D9C2C-E1A4-477F-B764-C2456ABB8EAB +3361A35D-AACF-43EE-90A8-E4BDA718B4CE +19EF6209-706F-4F3C-9A50-FDE30D833FF3 +6A477DF6-A6A0-4021-96B8-89D68565E049 +F07C4CFD-51B2-48A7-A7D4-0F632A946D9E +AABA0DDF-1262-4BF3-BD75-F5223DA32138 +7AA670C5-496A-4761-9F40-4EBDAE82F393 +AC0F3476-F883-428E-822A-9A5F9D97782A +E530321F-EE72-4EA8-9682-CDDD20B0784E +9D8F5DFD-CC76-4249-A7FB-0787911F32EE +18515F1A-A23B-44C4-AAFA-02D27C57AA02 +18D3FE91-7F53-4615-AE32-F8C2C914ED44 +43EA6200-5D6E-406A-9840-E48E8BAA7E09 +0AFE8DED-130D-4439-A3F2-CF8A3B808111 +504ADD7F-9B0E-4211-BD6E-5F69CA42E674 +03BDD448-BC7F-441C-9147-59C202C512DA +D330CBFB-4FF8-40E5-95BF-EE87E522C490 +82134DB4-B2F3-4EC2-9E1F-D9F92B51E2CB +B2DB564F-7FBA-4240-8317-54DD0939CAFA +A9BBAF96-F158-494A-A0EE-451582D4662D +E1F4AA6A-738B-4ECB-AFBB-59F132C13200 +9F7BBFDE-75CC-4D4F-A639-E3C366C39326 +91D2A61E-37E1-43C9-ACAA-0BE290B18583 +F06A6508-A9D3-4059-B575-FA7B35893522 +F66D6315-D849-4502-8D47-F62B3D39E63B +E0838E35-F1D2-4983-A5BD-EE3FD2D5E3AE +EC02A8A5-C11F-4B29-BB53-C2CE46FF83D5 +37516777-7CA8-4577-ABE9-75FA2D481C20 +E8AD3309-E0A0-4683-8FAA-37756226090F +63917149-219C-46C3-9932-DA89CDFC396C +4D730779-1CFF-4BC4-8D70-CDB3ECF61052 +75014935-F0DF-44F2-8156-AEC6CB030721 +0DB11293-9AED-47A0-A55F-77B52961EF32 +2324BCAA-E413-49B1-B200-15AE58CC811F +DB3FD853-2DBA-4A18-A8FE-8824A5F55158 +D327C9EA-3C0F-4383-A098-499238078C79 +C725405F-A911-4CB3-BE2E-16621E152713 +F64197B8-2887-480F-B066-06E6E57DD9B3 +4199FF83-4957-4292-B72D-88D15653BD82 +F8737540-944A-4648-A531-CCDE0966AA7B +610EA9D0-B1D3-4CBB-A4B2-193A99373111 +CF0B30F7-3DDA-4D8E-AD58-1847B8EC7DAF +71494483-ADCA-46EF-B500-FDC697DCDA1D +AC40B002-1556-456F-9002-3C8E8DE96A56 +CF51E6B3-449B-4FC3-9EAA-E5E502F094B1 +3E9B1C54-1601-4022-B9D3-1C52CCA5CD39 +A350D38C-496C-49ED-BBA0-E7E5FD155D38 +589D90FE-62DE-4B54-98A4-986B933ACFE0 +73713CB6-0CFF-492E-A11B-7ABA17881C9D +F1A1930A-9CAB-4ED9-8930-97CC074C0FA4 +7DC0A819-1043-4C97-B2DD-6D5D4489AA87 +77014F7E-5FEC-44C9-A559-3EAAF9686A98 +7A25417F-9A8F-43F6-A61E-BC17601364D4 +60B15A52-635F-46C3-8B24-069602DF0655 +A6866CE5-15CB-42E0-9ED5-6E291A841C0F +BE03A06F-9FB0-4283-ACB6-FAAAF6B7CBC8 +69E19310-6091-45EA-B279-FFF0DD0F2653 +C2C19E30-7602-40A3-8943-903E781DB710 +283DBC63-33BC-47E9-8275-175B8A48E0A4 +14D8ECB7-39D8-4C39-93E1-C67957FDE4CC +75A131E6-1212-4F62-A65E-41F22B4A4A4D +C00F644A-6173-4FB1-9394-66E688A6DB16 +DBFE274B-2B20-4517-87A7-3ED9D9C0436B +E7B0D237-3D12-488B-8D4E-EF22AB7D3BD2 +31C9E751-D2AE-4AA9-91DD-EF5BEA010B2A +9E3DCB1D-0C5F-4908-9318-43890A6456F2 +859AB836-98E3-4FD2-8BA8-7E67630BD28A +8351ED0C-2642-452F-9DDD-1E587CA09108 +E46C006E-81DB-402A-8DDA-FF321DF9066D +78D98617-8231-4F28-9F6B-B708E0F2A89D +6E842A64-E491-42A8-9665-F357D30DEB82 +89058547-7FF2-4286-AFC6-1D59DC074EEE +ECD7904B-3671-42BE-8CAD-E40BDB2D0785 +7FB420C9-A35A-4C1C-A1F3-D713CF923968 +1311D7FB-2F38-4065-8970-E8123D4DC9EA +D60BE1D4-2F85-4083-9A35-0803B4A10F9D +56E3CD95-98B6-4235-84B3-285FCC49A929 +BC9CA62C-0EF2-4E34-9E13-777583863553 +880EC597-AB32-4D22-BABF-9BC570994D0E +5EC2A97E-3473-4AD6-94BD-30D487F94B6D +5F746962-1F60-4AB8-8ABE-A5B2BFD2CE2B +455FFB05-3B40-49FA-815E-37CEBCC39036 +A1670D5D-C655-40EA-BC57-F70495F7D9C5 +3A4385A7-A421-4734-9630-A7A4BA1E0AEF +AACE8465-98F8-4105-93C3-EF46881958AE +2C8A7E38-B266-40C4-A0CB-3533CBC820FF +CC6327F8-A865-46A6-93A6-ABE7F4658152 +FFA4497E-93E3-41E0-AFE3-957706188F46 +B2E9AD0D-C9BD-4754-9382-B1B67CEA740C +EDBEAE13-198D-48E5-AE4E-4CFACE2A308E +F3067F49-6A4C-41A0-8B62-D2D3E3CDA925 +26FC5066-604A-41C7-AF67-BF6EC89A912F +059E21BA-680D-42E1-9AEF-7027A017E470 +4A42BF35-54B1-4A2B-8AAD-75ABC8CBB4EA +E8850FB1-C7C3-4FA9-A429-C15FCE2785ED +2726DFF0-5131-4799-8048-87CB162DE1DF +8E4A17C0-E35E-49EB-AE55-7EB938D7162D +AFA57B83-93C2-4D42-A522-256219139534 +3676917A-FA79-4205-90F3-E4E8A17F972B +9159E54C-4527-471E-AD0B-A4D003F22E1C +E7163440-2C25-4758-A34F-D14F92B1827D +9375B37A-5D73-4EC8-A5DD-929D83D3E381 +2C5F528C-309D-4FE8-B4BB-17866ADC8652 +F11B051F-A892-4D71-B971-CFAA93394916 +CB4EF9E3-64A6-471B-8EE1-64B0C191E4C4 +FBBE7FBE-DBC8-40A8-AF34-A362C5709DA8 +1B0B8DA3-2203-48C8-9689-E9F8D09FB1D7 +75E35BC1-E139-44F9-B59F-8634EFA5D932 +93CA74CF-752C-4C13-B280-81C96C047DB6 +1DFE6484-A5A3-4F55-9D0A-82220D4502A9 +FE932FE4-7BDE-4432-9CE9-B9F9698DA517 +F699A30C-9EAC-4C67-AAB9-04CAA8E574E1 +C2534733-7DB7-4037-832A-63B46B25767A +101160B1-9B60-44C6-9551-CDDA1F222AA1 +7FAB3954-D96F-4339-A67E-D84AEF70DB93 +3D16495F-B71E-41F5-89BB-7250BE9AD2F9 +6C9F8BBE-2A45-401E-90CE-0560E895BD9E +173D81ED-C658-4695-B214-FD6E4DD8319D +98126BE5-1ECD-4CAE-AA40-038FE9376FD5 +58BB0E89-58A2-405B-819E-72EFAA6525EF +98B4BF3E-3B47-4302-A1CA-59A935F0190D +777CCC60-2869-4AEE-AF9A-9CD2DD143750 +51FEB885-D44E-4CD6-A49C-1847605459A1 +01067255-61C4-4EC3-BA9C-9960ED3BF97F +686DB439-EE60-4656-89D4-A334124C3C33 +E1E2BF09-BBE3-4943-8E21-B133D9AA4DBE +72A3D204-FEE6-4D71-835A-15C19717CF9E +1A958B7A-EC60-49A2-95E7-B9ECAA9879A8 +F2C23466-DF1F-43F7-AC62-420729886376 +C7092F73-D1C9-4463-A8B1-E5174A34F2C9 +AF94E861-9DCF-40B6-AB82-6F971460EDAB +164E4230-3462-4B7E-B5DE-B6A25B371D6D +B36E4502-47BD-4E3C-8C98-3449A5D46447 diff --git a/xbox/OSKIEWAR-HOSTS.md b/xbox/OSKIEWAR-HOSTS.md new file mode 100644 index 0000000000..574d5024c5 --- /dev/null +++ b/xbox/OSKIEWAR-HOSTS.md @@ -0,0 +1,271 @@ +# Oskiewar on every host — renderer and audio plan + +One game source, four hosts: the web page (also iOS, a WKWebView around it), +the macOS native shell, the Xbox, and the test harness. Today the game draws +and sounds differently on each because it reaches the host through `typeof` +probes and per-platform fallbacks scattered through `oskiewar.js`. This plan +makes the renderer and the audio path platform-agnostic in architecture: the +game writes one **frame program** — bytecode for a scene-and-sound machine — +and every host runs an interpreter for it. The bytecode format is the spec, +not any implementation: a versioned op table plus a conformance suite of +programs. The web, Mac, Xbox and harness interpreters are peers under it. + +Written 2026-09-26 from v168 (the monowheel park) on oskiewar.com. Line +numbers are `xbox/live/oskiewar.js` at 270e77723b. Earlier measurements and +the console-perf plan live in the 09-26 engine-split research; this document +replaces its "JS reference renderer + levelled scene API" design with a +bytecode format and puts correctness on every host ahead of console +milliseconds. + +## 0. What is wrong on the web today, and why + +Seen live on oskiewar.com v168 (screenshots 2026-09-26 22:40): + +| symptom | cause | +|---|---| +| P1's own head fills the first-person inset | `projectPoint` (2425) pins z to `cameraPin` = 80 instead of clipping; figures inside the inset camera's near range (view z 20–80, admitted at 21654) are never cut, and the rider is drawn into its own eye view | +| two figures interpenetrate on the monowheel; the blue park deck paints over the road; the HUD lane is meaningless | the web shell has no `triangle3d`, so `emitTriangle` (2177) drops z and Canvas2D paints in submission order; every `triangleDepth` decision is a no-op on web | +| a world segment raked across the screen mid-death | `projectPoint`-based fans, discs and capsules get only a ±32200 cull, never a near clip; `renderer.test.mjs` has 3 floor/near tests failing at HEAD | +| glasses, grenade rings and face glyphs overdraw the inset edge | `hudCircle`/`hudLine` fall to host `line` on web (2275), which is not scissored to `clipView`; `typeWrite` is never scissored on any host | +| shoes float off the feet, monowheel is a flat blob | shoes are screen-space capsules at the shin tip facing `player.facing` only (1252–1266), ignoring pitch and yaw; the wheel is 12 flat `worldQuad`s with no shading, spokes or rolling | +| monowheel is silent on the web | `oscillator`/`oscillatorStop` and `synth` do not exist in the web shell; every `playSine` is dropped there | + +The common root: **two depth models and three clip paths.** Xbox has a GPU +depth buffer and native near/rect clipping in `sceneMesh`; the web has +painter's order and JS clipping only on `worldTriangle`/`worldQuad`; text, +`box` and `line` sit in a different stratum on each host (CPU layer under +triangles on Xbox, inline on web). + +## 1. Where each host stands + +| surface | web / iOS | macOS native | Xbox | harness | +|---|---|---|---|---| +| faces with depth (`triangle3d`) | no (Canvas2D `triangle`) | yes (Metal) | yes | stubbed | +| `disc3d` / `capsule3d` / `sceneMesh` | no (JS fans) | no | yes | not stubbed (JS fans run) | +| retained mesh (`meshUpload`/`meshDraw`) | no | no | no | no | +| text | Canvas `fillText`, inline | yes | D2D, after GPU | stubbed | +| `box`/`line` stratum | inline | inline | CPU layer under triangles | stubbed | +| photo materials (`themeSprite`/`themeQuad`) | no | no | yes | no | +| post effects (`postEffects`) | no | no | binding absent | no | +| `drum` | yes (SFX bank after unlock) | yes, 24 voices, panned | allowlist kick/snare/clap/hat/block; pan ignored; one voice | recorded | +| `synth` (one-shot sine) | **missing** | yes | yes, shares the drum voice | missing | +| `oscillator` (continuous) | **missing** | only on the fans branch | yes, own voice | missing | +| `gameSignal` | DOM event → SFX, VOICE, MIDI | OSC when `OSKIEWAR_OSC=1` | OSC ×3 | recorded | +| `titleVoice`/`titleBeep` | yes | no | no | no | + +Game-side probes today: 14 `typeof` bindings resolved once (2247–2266), +8 `consoleHost()` draw branches, ~35 `capabilities()` mode flags, 11 +`clipView` branches, and audio wrappers `playDrum`/`playSine`/`emitSignal` +(4463–4494) plus the ad-hoc motor voice (21218). + +## 2. Rules the new architecture holds + +1. **The game never calls a host.** It writes ops into a frame buffer and + hands the buffer over once. No `typeof host`, no `consoleHost()`, no + `capabilities().platform` in draw or audio code. What the host can do is + the interpreter's business; the game's only capability question is + "which bytecode level does this host run". +1b. **Ops are scene-level, never triangle-level.** On the console a typed + array element write costs ~0.23 µs and a 12-arg native call ~0.85 µs + (measured 09-14, oskiewar.js ~2145). A frame written as triangles from JS + is 25k numbers (5.7 ms, measured); written as figures, capsules, discs, + ribbons and mesh handles it is ~3–4k numbers (<1 ms) and the tessellation + moves into the interpreter. That is the rule that makes bytecode a win + instead of the loss the earlier benchmark found. +2. **Depth is real on every host.** Every face, disc, capsule, sprite and + glyph carries a depth; each host honors it (GPU depth test, or a stable + sort for a 2D fallback). +3. **One clip rule.** Near plane and view rect are part of the format: every + op is clipped against its VIEW by whichever interpreter runs it, and the + conformance suite checks the result exactly. +4. **A view is a value, not a global.** Camera, viewport rect, near plane, + depth window and "figures to omit" travel as one object. The P1 inset is + the renderer run again with a different view. +5. **The format is the spec, no implementation is.** `xbox/live/frame-ops.md` + (op table, argument layouts, versioning) plus `xbox/live/conformance/` + (programs with expected results) define correctness. The JS interpreter + is the web's interpreter, not a reference the others copy; the Xbox + interpreter tessellates a FIGURE its own way, on the GPU if it likes, and + passes the same conformance programs. +6. **Audio is a cue list, not a set of free functions.** One `audio` object + with capability discovery; one `silent` gate for rollback resims applied + inside it; sim clock only. + +## 3. Renderer + +### 3.0 The frame program + +Each frame the game fills one preallocated `Float32Array` (plus a per-frame +string table for text) and calls `frame(buffer, length, strings)`. Nothing +else crosses the boundary. Retained things (meshes, terrain profiles, figure +rigs) are uploaded with ASSET ops at boot or map change and referred to by +handles the game assigns. + +``` +VIEW id · camera[27] · rect[4] · near · depthBase · depthSlope · omitFigure +MESH handle · model[12] retained; interpreter clips + lights +FACE 3×(x y z) · rgb · depth escape hatch for one-off geometry; interpreters may lower to it +DISC x y z · r · rgb CAPSULE x1 y1 z1 x2 y2 z2 · w · rgb +RIBBON cubic (4 pts) · w · rgb limbs, hair, skirt edges +FIGURE pose (12 segs + head ≈ 130 floats) · style · tier +TEXT strId · x y · size · font · rgb · depth clipped to the current VIEW rect +SPRITE assetId · x y z · w h optional host material (Xbox photo) +CUE kit · vel · pan · simFrame TONE freq dur gain pan simFrame +VOICE id · freq · gain | stop SIGNAL eventId player v v2 SAY strId +ASSET kind · payload boot / map change only +``` + +Properties that fall out of "the frame is data": + +- **One boundary, one format.** Web, Mac, Xbox and the harness differ only + in their interpreter. A host that lacks a material or a voice ignores the + op; the game never knows. +- **Depth and clipping are interpreter duties.** Every op carries a VIEW + context; the interpreter projects, near-clips, rect-clips and depth-tests + (GPU) or depth-sorts (Canvas2D). The web defects in §0 cannot recur by + construction. +- **Rollback and audio are the same story.** Audio ops carry the sim frame; + a silent resim simply does not flush its buffer, so the motor voice and the + note queues stop leaking (§4.2 A4 shrinks to "tag the op"). +- **Tests assert on ops.** The harness records the program; "the inset never + contains its own rider" is a scan for FIGURE ops under the inset VIEW. + Every interpreter answers to the same conformance programs. +- **Recordable.** A frame program is a replay format: the reel oven, the + social preview burn and phone spectators can consume programs instead of + re-running the game. +- **Levelled.** `host.bytecode` is a version; an interpreter that does not + know an op skips it by length. The release gate refuses a game whose + required level exceeds the console's. + +The other reading of "the game has bytecode" — compiling the game itself to +a VM bytecode per host — is already the case on Xbox (QuickJS) and buys +nothing on the web; this plan is about the game's *output* being bytecode. + +### 3.1 Layers + +``` +oskiewar.js (rules, sim, net, replay, pose, LOD choice, camera solve) + │ writes the frame program (an Emitter: push(op, …), string table, retained handles) +frame-vm.mjs (the JS interpreter: projection, near clip, rect clip, depth mapping, + │ disc/capsule/ribbon/figure tessellation → FACE stream; recorder for tests) + ├─ scene3d-webgl.mjs WebGL2, depth-tested (exists; benched 09-14; not wired) + ├─ Canvas2D fallback: stable sort by depth, ?renderer=canvas + ├─ macOS Metal triangle3d today; grows to the FACE stream + └─ Xbox FrameVm.cpp native interpreter: SceneMesh/capsule/disc fans exist in + ScenePrimitives.inc; FIGURE/RIBBON/TEXT/CUE are the new units +``` + +`frame-vm.mjs` starts as today's projection, clipping and fan code lifted +out of the game, so the 120 triangle-observing tests keep their meaning +during the move. After that it is free to change: it is the web's +interpreter, and the harness asserts on programs, not on its triangles. + +### 3.2 Steps + +| step | work | fixes | gate | +|---|---|---|---| +| **R1 web depth — SHIPPED e2fb5c268a 2026-09-26** | Wire `scene3d-webgl.mjs` into `mac-test.html` as the `triangle3d` provider with a depth buffer; text after the triangle pass; `box`/`line` as depth-carrying triangles. Canvas2D stays behind `?renderer=canvas`. Pure shell change, lands before any bytecode. | interpenetration, deck-over-road, HUD lane, inset edge overdraw | bench parity run re-run against the live shell; 1280×720 screenshot diff | +| **R2 the emitter + JS interpreter** — clip rule SHIPPED 74844d1600 (v169, 2026-09-27): `project` reports `behind`, figure bones cut through `worldSegment`, figures behind the pin not drawn, inset admits past the pin only, renderables/shadows/parts skip behind the lens, renderer tests 9/9. Emitter + web interpreter SHIPPED 3673855652 (v170, 2026-09-27): the game paints one program per frame (VIEW/FACE/DISC/CAPSULE/TEXT/BOX/LINE/WIPE) through `frame(buffer, length, strings)`; `xbox/live/frame-vm.mjs` runs it on the web; hosts without `frame` (console, harness) execute the ops in the game. World projection moved SHIPPED 250e957a5e (v171, 2026-09-27): CAMERA op (prepared view + clip band, once per re-prepare) and WORLD op (world-space face); worldTriangle, worldQuad and the JS mesh path emit WORLD; frame-vm projects, near-clips and band-clips; `tests/frame-conformance.test.mjs` compares immediate vs program over 45 cameras. v172 fd3c947c4f (2026-09-27): DEPTH op (flat / offset world depth), shadows as world ellipses flat behind the caster, ground marks as world fans, terrain passes as WORLD, park meshes as ASSET once + MESH by handle; program ~52k → ~24k floats. Still screen-space in the game: figures only (~1170 FACE + ~320 CAPSULE + ~220 DISC a frame). FIGURE op needs a decision — see §7. | Add `Emitter` to the game and `frame-vm.mjs`; move projection, `clipPolygon`/`clipScreenBand`/`clipSegmentBand`, `filledDisc`/`filledCapsule` fans and `drawCurvedLimbs` ribbons into the VM; the game's draw functions push DISC/CAPSULE/RIBBON/FACE/TEXT ops instead of calling hosts. Every op is clipped in the VM; `cameraPin` pinning retired; the inset VIEW omits its own rider. Fix the 3 failing `renderer.test.mjs` floor tests here. | giant head in inset, raked segments, glyph leaks, the 14 `typeof` bindings and 8 `consoleHost()` draw branches | `renderer.test.mjs` 9/9; `oskiewar.test.mjs` triangle tests unchanged (the VM emits the same faces) | +| **R3 views and meshes as ops** | VIEW ops replace the `cameraDoll`/`clipView`/`triangleDepth` globals and `withRenderView`; ASSET/MESH replace `captureQuadMesh` monkey-patching and the three `drawQuadMesh` backends. | hidden render state | recorder tests: one VIEW per inset, no global reads in draw code | +| **R4 FIGURE op** | The pose object becomes a FIGURE op; skeleton, outfit, hair, face tessellate inside each interpreter per tier. The web one in JS or in a vertex shader; the Xbox one in C++ (the ~90 calls and 1.6 ms per figure go to one op). Look is held by the conformance images, not by sharing code. | per-figure boundary cost; figure look drift between hosts | conformance: one figure per tier within image tolerance | +| **R5 flat is the reference** | Flat shading is the reference look (decided 2026-09-26). SPRITE/photo materials stay an optional Xbox interpreter feature; the reference, web, Mac and the harness never see them and no game rule may depend on them. | web ≠ Xbox look | poster, web and Mac identical; Xbox differs only in material | +| **R6 Xbox interpreter** | `FrameVm.cpp`: one `frame()` binding replaces the 20-odd draw bindings; retained handles for meshes and terrain strips; the console-perf wins from the 09-26 research arrive here as a consequence. | Xbox frame time | AppVeyor runs the conformance suite through the QuickJS smoke | + +### 3.3 Tests + +- **Game tests assert on the program.** The harness records ops; "the + inset never contains its own rider", "no op outside its VIEW", "five + figures at tier 1 in the park" are scans over the buffer. During R2 the + harness also runs `frame-vm.mjs` so the 120 triangle-observing tests keep + passing; once program tests cover the same ground those are retired rather + than pinned to one interpreter's triangles. +- **Interpreter tests are conformance.** `xbox/live/conformance/` holds + small programs (one figure per tier, a mesh crossing the near plane, the + inset view, a CUE burst) with expected outputs: op-level for what must be + exact (clipping, omission, ordering, audio timing) and image tolerance for + what may differ (tessellation, antialiasing). Every interpreter runs the + suite: Node for the JS one, AppVeyor's QuickJS smoke for the Xbox one. +- **Recording is free.** A saved program is the replay fixture: the reel + oven and the social preview burn render from programs, so they stop + depending on the game's draw code at all. + +## 4. Audio + +### 4.1 Ops (from what the game actually uses) + +Audio is the same program, not a second interface. The game pushes: + +``` +CUE kit(kick snare clap hat bell block whoosh modem) · vel · pan · simFrame polyphonic, panned +TONE freq · dur · gain · pan · simFrame one-shot sine with decay (today's playSine); simFrame offsets absorb the glass/bubble/crowd/laugh queues +VOICE id · freq · gain | stop continuous, interpreter-smoothed (the monowheel motor) +SIGNAL eventId · player · v · v2 semantic bus → replay row, SFX/VOICE/MIDI on web, OSC on Mac/Xbox +SAY strId announcer lines (replaces titleVoice and the orphaned __oskiewar*Line globals) +PAN player · pan render-side pans handed to the interpreter, never read inside the sim +``` + +Lifecycle (`unlock`, `mute`, `stopAll`, `panic`) belongs to the shell, not +the game. The interpreter reports `caps → { kit, tone, voice, speech, midiOut, +oscOut, latencyMs }` so the harness can assert what a host would have played. +The web's existing event bus (`oskiewar-sfx/voice/midi.mjs`) becomes the +web interpreter's SIGNAL subscriber, not the main source of one-shots. + +### 4.2 Steps + +| step | work | fixes | +|---|---|---| +| **A1 audio ops** | `playDrum`/`playSine`/`emitSignal`/`updateMotorAudio` push CUE/TONE/VOICE/SIGNAL through the same Emitter; the try/catch drum fallback (4473–4489) goes away; raw `gameSignal` calls (21203) become SIGNAL ops | the throw-and-guess contract | +| **A2 web tone + voice — SHIPPED 9c48f70431 2026-09-27** | `synth` (sine, squared decay) and `oscillator`/`oscillatorStop` (sine + quiet octave, eased pitch and gain, 20–8000 Hz, gain ≤ .5) in the web shell over the drums' AudioContext; the bank's bubble laugh unrouted so the laugh plays once. The countdown route stays because the sfx suite requires every signal to have one. | monowheel motor and every `playSine` audible on the web; victory laugh identical on all hosts | +| **A3 Xbox polyphony + kit** | voice pool instead of one `m_voice` with Stop+Flush per trigger; allowlist replaced by the capability kit (bell/whoosh/modem exist in the mixer already); honor pan | rapid cues cutting each other off; bell/whoosh workarounds | +| **A4 rollback holes** | A silent resim never flushes its buffer, which covers the motor voice for free; note queues become TONE ops with future `simFrame` offsets instead of sim-owned arrays; `bloodDripSound`/`playBubbleSound` on the net clock, not `monotonicUs`; the countdown double-bell check | resim leaks | +| **A5 speech** | `say` on web (SpeechSynthesis/VOICE), no-op elsewhere; remove `__oskiewarResultLine`/`__oskiewarStartLine` and the stale source assertion at test 3748 | orphans | +| **A6 Mac** | ship the fans-branch `oscillator` to main's shell; add `say` no-op and `caps` | Mac parity | + +## 5. Figure polish that rides on R1–R2 + +Do these once the figure draws with real depth and one clip path, so they are +drawn once and look the same everywhere. + +- **Shoes**: build in world space on the foot bone (shin end + a foot + vector from pitch and yaw), not screen-space capsules facing `facing`; + a sole quad, an upper capsule, a heel; skirt/pant hems occlude by depth. +- **Bodies**: the curved limbs and trio face already exist; on web they + were unreadable because of painter's order. After R1, tune limb widths and + outline pass against the Xbox look, and give the pastel skater a + consistent outline weight across LOD tiers. +- **Monowheel**: a captured mesh (tire with tread bands, rim, hub, foot + plates) drawn through `mesh(handle)`; rolls by contact distance like the + board wheels; contact shadow; rider feet snap to the plates; the motor + voice from A2 pitched by speed. + +## 6. Order + +R1 → R2 (emitter + JS interpreter, with A1 in the same emitter) → A2 → R3 → +polish (§5, drawn through ops) → R4 → A3/A4 → A5/A6 → R6. + +R1 and A2 change only the web shell and are the fastest visible wins. R2 +onward touches the game file and needs the branch merge sorted first (the +`oskiewar-day-perf` native-bios changes are still unmerged into main). R6 +and A3 need a native Xbox release (AppVeyor MSIX); until then the Xbox keeps +its per-call bindings and the JS interpreter lowers the program to them, so +nothing waits on the console. + +## 7. Decisions for jeffrey + +0. **How figures become a FIGURE op.** The figure painter (skeleton, outfit, + face, hair, skirt, bow — a few thousand lines) lives in the one game file, + which every host loads alone; the web interpreter cannot import it. Either + (a) the web interpreter keeps a second figure painter, held to the game's + by conformance images, or (b) figures are re-expressed as world-space + primitives (world capsules and discs, the face as a textured billboard) + that every interpreter projects, so no painter is duplicated. (b) is the + agnostic one and the larger rewrite. + +1. Keep Canvas2D as a fallback, or make WebGL2 the only web path? +2. ~~Photo materials on the web or flat as the reference?~~ Flat is the reference (2026-09-26). +3. In the first-person inset: hide the rider entirely, or draw hands and the + wheel's front edge? +4. ~~The line-2 freeskate hardcode: keep or gate?~~ Freeskate is the default + map (decided 2026-09-26). The line stays. Today it also swallows + `?opponent=`; if versus or coach URLs are wanted back later, the default + moves into the shell as a fallback rather than an override. diff --git a/xbox/OSKIEWAR-RELEASE.md b/xbox/OSKIEWAR-RELEASE.md index a7b20de252..a25ed385b3 100644 --- a/xbox/OSKIEWAR-RELEASE.md +++ b/xbox/OSKIEWAR-RELEASE.md @@ -19,3 +19,22 @@ a new set of obligations without erasing the last channel receipts. Direct canonical Xbox source deployment is blocked by `xbox/tools/live.mjs`. Diagnostic pieces and non-Oskiewar experiments remain available through that tool. + +For an Xbox-only development update, run +`node xbox/tools/oskiewar-release.mjs deploy-xbox-dev --hot`. This uploads the +working source into the running app and verifies a new native live generation +without relaunching it. A rejected update reports the native error; an +unconfirmed reload asks you to quit and reopen oskiewar on the Xbox and check +its version. Web and iOS remain pending until a unified release. + +For the temporary Xbox-versus-AC-OS venue match, use +`node xbox/tools/oskiewar-lan-test.mjs --hot`. It preserves a lowered +curtain while updating both seats. This is a paired development build. + +The local stage MCP (`xbox/tools/oskiewar-stage-mcp.mjs`, port 7792) exposes +`oskiewar_curtain`: `down:true` pauses both games, `down:false` resumes them. +Its optional `style` is `auto`, `directions`, or `singalong`. Auto and singalong +show timed Trio lyrics when available, otherwise the right-pointing character +and arrows. Directions always shows the arrows. Lyrics come from the matching +arrangement and live audio clock; a stale feed returns to arrows. The bridge +reads music state without starting or changing the performance. diff --git a/xbox/live/lan-test.js b/xbox/live/lan-test.js new file mode 100644 index 0000000000..ad0fd43faf --- /dev/null +++ b/xbox/live/lan-test.js @@ -0,0 +1,523 @@ +// Temporary two-device test, appended by the dev deploy tool only. +// No public matchmaking or persistent account identity is changed. +(function installLanTest(config) { + if (!config || ![0, 1].includes(config.seat) || + !/^ow-[a-z]{4,7}[0-9]{1,3}$/.test(config.room) || + !Number.isFinite(config.expires) || Date.now() >= config.expires) return; + globalThis.performance ||= { now: () => Date.now() }; + // QuickJS has no browser structuredClone. Preserve typed arrays, aliases, + // cycles and non-finite numbers used by rollback (JSON would corrupt them). + globalThis.structuredClone ||= function clone(value, seen = new Map()) { + if (value === null || typeof value !== "object") return value; + if (seen.has(value)) return seen.get(value); + if (value instanceof ArrayBuffer) return value.slice(0); + if (ArrayBuffer.isView(value)) return new value.constructor(value); + const copy = Array.isArray(value) ? [] : value instanceof Set ? new Set() + : value instanceof Map ? new Map() : {}; + seen.set(value, copy); + if (value instanceof Set) for (const entry of value) copy.add(clone(entry, seen)); + else if (value instanceof Map) for (const [key, entry] of value) + copy.set(clone(key, seen), clone(entry, seen)); + else for (const key of Object.keys(value)) copy[key] = clone(value[key], seen); + return copy; + }; + globalThis.__oskiewarHashTrace = true; + const peerTraces = new Map(); + let halted = false, retryAt = 0, retryCount = 0; + function recoverMismatch(detail) { + if (halted) return; + halted = true; + retryAt = Date.now() + Math.min(30000, 3000 * 2 ** Math.min(4, retryCount++)); + globalThis.__oskiewarLanMismatch = {...detail, retryAt, retryCount}; + telemetry("CLIENT_ERROR", JSON.stringify({phase:"netplay", name:"StateMismatch", + message:"Oskiewar state mismatch at frame " + detail.frame, + state:{build:buildVersion, seat:config.seat, ...detail}, recovery:"automatic match reset"})); + } + const originalNoteHash = netNotePeerHash; + netNotePeerHash = function(session, frame, hash) { + const mine = session.hashes.get(frame); + if (mine !== undefined && mine !== hash) { + recoverMismatch({frame, mine:netHashTexts.get(frame), theirs:peerTraces.get(frame)}); + telemetry("NET_TEST_MISMATCH", JSON.stringify(globalThis.__oskiewarLanMismatch)); + } + return originalNoteHash(session, frame, hash); + }; + const originalSim = sim; + const originalPaint = paint; + const originalLeave = leave; + let profileAt = Date.now(), simCost = 0, paintCost = 0, simCalls = 0, paintCalls = 0; + let priorProfile = null; + // Opt-in inclusive CPU timing. Disabled builds install no wrappers at all. + const phaseEnabled = config.phaseProfile === true || globalThis.__oskiewarPhaseProfile === true; + let phaseLane = "other", phaseStats = {}; + function profilePhase(name, fn) { + return function () { + const key = phaseLane + "." + name, started = performance.now(); + try { return fn.apply(this, arguments); } + finally { + const row = phaseStats[key] ||= { ms: 0, calls: 0 }; + row.ms += performance.now() - started; row.calls++; + } + }; + } + if (phaseEnabled) { + updatePlayer = profilePhase("player", updatePlayer); + resolvePlayerStanding = profilePhase("standing", resolvePlayerStanding); + resolveMelee = profilePhase("melee", resolveMelee); + resolvePogoAttacks = profilePhase("pogo", resolvePogoAttacks); + updateBall = profilePhase("ball", updateBall); + updateBullets = profilePhase("bullets", updateBullets); + updateGrenades = profilePhase("grenades", updateGrenades); + updateDetachedParts = profilePhase("fragments", updateDetachedParts); + updateBodyTrees = profilePhase("trees", updateBodyTrees); + updateCameraDoll = profilePhase("camera", updateCameraDoll); + captureRoundReplay = profilePhase("replay", captureRoundReplay); + netSnapshot = profilePhase("snapshot", netSnapshot); + netStateHash = profilePhase("hash", netStateHash); + buildRunnerWorldGeometry = profilePhase("pose", buildRunnerWorldGeometry); + sampleCombatBoxes = profilePhase("boxes", sampleCombatBoxes); + drawRunner = profilePhase("runner", drawRunner); + drawDebugHitboxes = profilePhase("debugBoxes", drawDebugHitboxes); + drawFrameMeter = profilePhase("frameMeter", drawFrameMeter); + drawGridOverlay = profilePhase("grid", drawGridOverlay); + drawRoomSurfaces = profilePhase("room", drawRoomSurfaces); + drawTerrainSurface = profilePhase("terrain", drawTerrainSurface); + drawTerrainBackWall = profilePhase("backWall", drawTerrainBackWall); + drawTerrainFrontWall = profilePhase("frontWall", drawTerrainFrontWall); + } + // A diagnostic transport limit, independent of the 60 Hz simulation. Each + // input carries ten recent frames; hash and stage packets always go through. + // This lets the LAN trial expose a native send FIFO that is falling behind. + const inputInterval = Number.isFinite(config.inputSendHz) && config.inputSendHz >= 20 && + config.inputSendHz <= 60 ? 1000 / config.inputSendHz : 0; + let inputSentAt = -Infinity; + const send = packet => { + if (packet.t === "i") { + const now = Date.now(); + if (!packet.h && now - inputSentAt < inputInterval - .5) return false; + inputSentAt = now; + } + if (packet.h) { + const trace = netHashTexts.get(packet.h[0]); + if (trace?.length < 5000) packet.trace = trace; + } + if (typeof globalThis.__oskiewarNetSend === "function") + return globalThis.__oskiewarNetSend(config.room, packet); + if (typeof oskiewarNetSend === "function") + return oskiewarNetSend(config.room, JSON.stringify(packet)); + return false; + }; + let stageId = "", stageSentAt = 0, stagePacket = null, stageStopFrame = config.curtain === true ? 0 : Infinity; + function sendStageIfDue() { + if (stagePacket && Date.now() >= stageSentAt) { + send(stagePacket); stageSentAt = Date.now() + 250; + } + } + globalThis.__oskiewarStageState = {curtain:config.curtain === true, performance:null, peerAck:null}; + function applyStage(packet) { + const previous = globalThis.__oskiewarStageState; + const suspended = packet.curtain === true || packet.performance?.active === true; + const wasSuspended = previous.curtain || previous.performance?.active; + if (suspended && !wasSuspended) stageStopFrame = packet.stopFrame; + if (!suspended) { + stageStopFrame = Infinity; + if (wasSuspended && netSession) netSession.lastPacketAt = Date.now(); + } + globalThis.__oskiewarStageState = {id:packet.id, curtain:packet.curtain === true, + performance:packet.performance || null, receivedAt:Date.now(), + peerAck:previous.peerAck, stopFrame:stageStopFrame}; + } + let ready = false, helloAt = 0, peerRun = "", expired = false; + let run = Date.now().toString(36) + Math.random().toString(36).slice(2, 8); + const name = config.seat === 0 ? "XBOX" : "AC"; + // Device roles retain their transport responsibilities; player seats + // place AC on the left and Xbox on the right on both displays. + const playerSeat = config.seat === 0 ? 1 : 0; + const hasAccounts = typeof accountState === "function" && typeof accountAction === "function"; + let menuOpen = false, menuSelection = 0, menuPrevious = [], menuSuppress = false; + let publicAccount = {}, identitySentAt = 0, leaderboardAt = 0, resultKey = ""; + let pendingMatch = null, reportAttemptAt = 0, pairingRetryAt = 0; + const reportedMatches = new Set(); + const deviceHandles = ["", ""]; + const deviceHandleColors = [[], []]; + globalThis.__oskiewarDeviceHandles = deviceHandles; + globalThis.__oskiewarDeviceHandleColors = deviceHandleColors; + const physicalGamepad = gamepad; + // Menus are local UI. Send neutral input while open, without pausing the + // simulation or ever placing Start/Menu into the rollback command stream. + if (hasAccounts) gamepad = function(index = 0) { + const pad = physicalGamepad(index); + if (index !== 0 || !pad) return pad; + return menuSuppress ? {...pad, down:[], leftX:0, leftY:0, rightX:0, rightY:0, + leftTrigger:0, rightTrigger:0} : {...pad, down:(pad.down || []).filter(k => k !== "Menu")}; + }; + const cleanHandle = value => /^@?[a-z0-9_-]{1,64}$/i.test(String(value || "")) + ? "@" + String(value).replace(/^@/, "").toLowerCase() : ""; + function updateDeviceMenu() { + if (!hasAccounts) return; + publicAccount = accountState() || {}; + globalThis.__oskiewarDeviceAccount = {status:publicAccount.status,handle:publicAccount.handle || ""}; + deviceHandles[playerSeat] = publicAccount.status === "signed-in" ? cleanHandle(publicAccount.handle) : ""; + for (let seat=0;seat<2;seat++) { + const row=publicAccount.leaderboard?.players?.find(row=>cleanHandle(row.handle) === deviceHandles[seat]); + deviceHandleColors[seat]=handlePalette(row?.colors,deviceHandles[seat]); + } + const physical = physicalGamepad(0) || {}; + const down = [...(physical.down || [])]; + // Some USB pads expose their D-pad as the left stick rather than buttons. + if (Math.abs(physical.leftY || 0) > .55) down.push("Navigate"); + if (down.some(k => ["ArrowUp","ArrowDown","DPadUp","DPadDown","Up","Down"].includes(k))) down.push("Navigate"); + const pressed = key => down.includes(key) && !menuPrevious.includes(key); + const wasOpen = menuOpen; + if (pressed("Menu")) { menuOpen = !menuOpen; menuSelection = 0; } + else if (menuOpen) { + if (publicAccount.status === "signed-in" && pressed("Navigate")) menuSelection = 1 - menuSelection; + if (pressed("B")) menuOpen = false; + if (pressed("A")) { + if (publicAccount.status !== "signed-in" || menuSelection === 0) menuOpen = false; + else if (publicAccount.status === "signed-in") accountAction("logout"); + + } + } + if ((menuOpen || roundResult) && ["signed-out","error"].includes(publicAccount.status) && Date.now() >= pairingRetryAt) { + pairingRetryAt = Date.now() + 10000; + accountAction("login"); + } + menuPrevious = down.slice(); + menuSuppress = menuOpen || wasOpen || pressed("Menu"); + globalThis.__oskiewarDeviceMenu = {open:menuOpen, selection:menuSelection}; + if (Date.now() >= leaderboardAt || (roundResult && resultKey !== roundResult + roundOverAt)) { + leaderboardAt = Date.now() + 30000; + resultKey = roundResult ? roundResult + roundOverAt : ""; + accountAction("leaderboard", JSON.stringify(deviceHandles.map(h => h.replace(/^@/, "")))); + } + } + function accountMaintenance() { + if (!hasAccounts) return; + // Identity rides a public metadata packet, never a simulation snapshot. + if (netSession && Date.now() >= identitySentAt) { + send({t:"identity", run, handle:deviceHandles[playerSeat]}); + identitySentAt = Date.now() + 1000; + } + if (!netSession || !matchOver || !roundResult) { pendingMatch = null; return; } + const id = "ow-" + (netSession.deal.accountSeries || String(netSession.originUs)) + "-" + Math.round(roundOverAt); + if (!pendingMatch || pendingMatch.matchId !== id) pendingMatch = { + matchId:id, frame:netSession.frame, handles:deviceHandles.map(h=>h.replace(/^@/, "")), + roundWins:players.map(p=>p.roundWins), winner:players.findIndex(p=>p.roundWins >= matchWins) + }; + if (netSession.confirmed < pendingMatch.frame || reportedMatches.has(id) || + Date.now() < reportAttemptAt || typeof accountReport !== "function") return; + const p = pendingMatch; + if (!p.handles.every(Boolean) || p.handles[0] === p.handles[1] || p.winner < 0 || + p.handles[playerSeat] !== deviceHandles[playerSeat].replace(/^@/, "")) return; + reportAttemptAt = Date.now() + 2000; + if (accountReport(JSON.stringify({matchId:p.matchId, seat:playerSeat, + handles:p.handles, roundWins:p.roundWins, winner:p.winner}))) reportedMatches.add(id); + } + let loginQrUrl = "", loginQr = null; + function handlePalette(colors, handle) { + return handle && Array.isArray(colors) && colors.length === handle.length && + colors.every(c=>c && [c.r,c.g,c.b].every(v=>Number.isFinite(v) && v>=0 && v<=255)) + ? colors.map(c=>[c.r,c.g,c.b]) : []; + } + function drawLoginQr(url, left, top, cell = 4) { + if (!url || typeof qrcode !== "function") return 0; + if (loginQrUrl !== url) { loginQrUrl = url; loginQr = qrcode(url, {errorCorrectLevel:1}); } + const count = loginQr.getModuleCount(), size = (count + 8) * cell; + screenRect(left, top, size, size, [255,255,255]); + for (let row=0; row=0) { + screenRect(left+(start+4)*cell, top+(row+4)*cell, (col-start)*cell, cell, [0,0,0]); start=-1; + } + } + } + return size; + } + function drawDeviceUi() { + if (!hasAccounts || performanceStageActive()) return; + const oldDepth = triangleDepth; triangleDepth = -1.49; + const top=Math.max(60,viewHeight/2-244), white=[238,235,247]; + if (menuOpen) { + const center = viewCenterX(); + const shadowText = (label, y, size, color = white) => { + const x = center - handleWidth(label, size) / 2; + typeWrite(label, x + 2, y + 3, size, 4, 5, 12); + typeWrite(label, x, y, size, ...color); + }; + const handle = deviceHandles[playerSeat] || name.toLowerCase(); + const handleX = center - handleWidth(handle, 28) / 2; + drawHandle(handle, handleX + 2, top + 25, 28, [], [4,5,12]); + drawHandle(handle, handleX, top + 22, 28, + deviceHandleColors[playerSeat], players[playerSeat].color); + const signedIn = publicAccount.status === "signed-in"; + const labels = signedIn ? ["resume", "log out"] : []; + labels.forEach((label, index) => { + shadowText((menuSelection === index ? "> " : "") + label, + top + 80 + index * 48, 28, + menuSelection === index ? white : [160,169,188]); + }); + if (publicAccount.status === "waiting" && publicAccount.pairUrl) { + // The white quiet zone belongs to the QR; all surrounding text floats. + if (loginQrUrl !== publicAccount.pairUrl && typeof qrcode === "function") { + loginQrUrl = publicAccount.pairUrl; + loginQr = qrcode(loginQrUrl, {errorCorrectLevel:1}); + } + const size = loginQr ? (loginQr.getModuleCount() + 8) * 4 : 164; + shadowText("scan with your phone", top + 76, 22); + drawLoginQr(publicAccount.pairUrl, center - size / 2, top + 115, 4); + shadowText(String(publicAccount.code || ""), top + 133 + size, 30); + } else if (publicAccount.status === "creating") + shadowText("creating sign-in code...", top + 185, 22); + else if (publicAccount.status === "error") + shadowText("sign-in reconnecting...", top + 185, 22, [245,157,146]); + else if (signedIn) + shadowText("your match wins count globally", top + 205, 22); + shadowText(signedIn ? "d-pad select A choose B back" : "A / B / Menu: resume", + top + 425, 20, [170,178,198]); + } else if (roundResult) { + const board=publicAccount.leaderboard; + const rows=Array.isArray(board?.top)?board.top.slice(0,3):[]; + const anon=publicAccount.status !== "signed-in"; + const winner=roundWinner(); + const label=roundResult === "TIE" || !winner ? "TIE" + : winner.pad === playerSeat ? "WIN" : "LOSE"; + const resultNow=netSession ? netSession.originUs+netSession.frame*NET_TICK_US : runtime().monotonicUs; + const age=Math.max(0,(resultNow-roundOverAt)/1000000); + const reveal=Math.max(0,Math.min(1,(age-.65)/.55)); + const heroSize=Math.max(72,Math.min(280,(viewHeight-430)*.85, + (stageRight-stageLeft-64)/(label.length*.75))); + const size=heroSize+(Math.min(100,heroSize)-heroSize)*reveal*reveal*(3-2*reveal); + const width=[...label].reduce((total,glyph)=>total+ + (typeof systemWrite.measureGlyph === "function" + ? systemWrite.measureGlyph(glyph,size) : size*.65),0); + const color=label === "WIN" ? players[playerSeat].color + : label === "LOSE" ? [255,132,157] : white; + if (typeof drawPhotoRoundOutcome === "function") + drawPhotoRoundOutcome(label,age,viewCenterX()-width/2,24,width,size); + // A huge reveal settles above the action so each replay angle stays clear. + systemWrite(label,viewCenterX()-width/2,24,size,...color); + const textX=stageRight-460,y=viewHeight-268; + screenRect(textX-10,y+18,444,36,[12,14,23]); + typeWrite("global wins",textX,y+24,24,...white); + rows.forEach((row,i)=>{ + screenRect(textX-10,y+53+i*26,444,25,[12,14,23]); + const full=cleanHandle(row.handle), label=full.slice(0,23), prefix=(i+1)+" "; + typeWrite(prefix,textX,y+58+i*26,18,...white); + drawHandle(label,textX+handleWidth(prefix,18),y+58+i*26,18,handlePalette(row.colors,full),white); + typeWrite(" "+row.matchesWon+" W / "+row.matchesPlayed, + textX+handleWidth(prefix+label,18),y+58+i*26,18,...white); + }); + if (!rows.length) { + screenRect(textX-10,y+54,444,30,[12,14,23]); + typeWrite(publicAccount.leaderboardError ? "leaderboard unavailable" : board?.verification ? "no ranked matches yet" : "leaderboard loading...",textX,y+60,18,170,178,198); + } + const stats=Array.isArray(board?.players)?board.players:[]; + stats.slice(0,2).forEach((row,i)=> { + screenRect(textX-10,y+145+i*24,444,24,[12,14,23]); + const seat=Math.max(0,deviceHandles.findIndex(handle=>handle.replace(/^@/,"")===row.handle)); + const full=cleanHandle(row.handle), label=full.slice(0,23); + drawHandle(label,textX,y+150+i*24,16,handlePalette(row.colors,full),players[seat].color); + typeWrite(" "+row.matchesWon+" W / "+row.matchesLost+" L", + textX+handleWidth(label,16),y+150+i*24,16,...players[seat].color); + }); + const qrX=stageLeft+32,qrY=viewHeight-224; + if (anon && publicAccount.pairUrl) { + const pulse=.5+.5*platformMath.sin(Date.now()/650); + const border=[130+pulse*80,100+pulse*50,200+pulse*50]; + screenRect(qrX-8,qrY-40,220,36,[12,14,23]); + typeWrite("sign in",qrX,qrY-32,24,...white); + // Pulse only the surround; every QR module stays still and readable. + const count=loginQrUrl === publicAccount.pairUrl && loginQr ? loginQr.getModuleCount() : 33; + const qrSize=(count+8)*4; + screenRect(qrX-6,qrY-6,qrSize+12,qrSize+12,border); + drawLoginQr(publicAccount.pairUrl,qrX,qrY,4); + screenRect(qrX-8,qrY+qrSize+8,220,34,[12,14,23]); + typeWrite(String(publicAccount.code || ""),qrX,qrY+qrSize+14,24,...white); + } else if (anon) { + screenRect(qrX-8,qrY,260,34,[12,14,23]); + typeWrite("creating sign-in code...",qrX,qrY+8,18,...white); + } + const signed=deviceHandles.every(Boolean); + screenRect(textX-10,y+220,444,30,[12,14,23]); + typeWrite(String(signed ? (publicAccount.reportStatus || "both signed in: first to 5 counts") : "scan to record your wins").slice(0,48),textX,y+228,16,170,178,198); + } + triangleDepth = oldDepth; + } + + globalThis.__oskiewarTheme = "light"; + // This room carries inputs only, so a spectator publish cannot switch the + // native socket out from under the test. Test rounds are never uploaded. + publishVersus = () => {}; + publishSpectator = () => {}; + publishSession = () => {}; + globalThis.saveReplay = () => {}; + sim = function () { + updateDeviceMenu(); + if (expired) return originalSim(); + if (Date.now() >= config.expires) { + netLeave("test-expired"); expired = true; + globalThis.__oskiewarLanStatus = "expired"; + gameBoot(); return; + } + if (!ready) { + ready = true; + versusRoomName = config.room.slice(3); + beginVersusLobby(runtime().monotonicUs); + players[0].name = name; + } + if (halted && Date.now() >= retryAt) { + netEnd("desync-retry"); halted = false; peerRun = ""; helloAt = 0; + run = Date.now().toString(36) + "-retry" + retryCount; + } + if (!halted && netSession?.frame > 1800) retryCount = 0; + const command = globalThis.__oskiewarStageCommand; + if (config.seat === 1 && command?.id !== stageId && typeof command?.id === "string") { + stageId = command.id; + stagePacket = {t:"stage", id:stageId, curtain:command.curtain === true, + performance:command.performance || null, + stopFrame:netSession ? Math.max(netSession.frame, netSession.remoteSimFrame) + 120 : 0}; + applyStage(stagePacket); + stageSentAt = 0; + } + // The native WebSocket currently has one outgoing slot. Before joining, + // let a hello replace a progress update; during play, send control last + // so a same-frame input cannot overwrite a curtain/resume command. + if (!netSession) sendStageIfDue(); + const packets = typeof oskiewarNetPoll === "function" ? oskiewarNetPoll() : []; + const inbox = globalThis.__oskiewarNetInbox; + if (Array.isArray(inbox)) packets.push(...inbox.splice(0)); + for (const packet of packets) { + if (!packet || typeof packet !== "object") continue; + if (packet.t === "stage" && config.seat === 0 && typeof packet.id === "string" && + Number.isInteger(packet.stopFrame) && packet.stopFrame >= 0) { + if (packet.id !== stageId) { stageId = packet.id; applyStage(packet); } + send({t:"stageAck", id:packet.id}); + continue; + } + if (packet.t === "stageAck" && packet.id === stageId) { + globalThis.__oskiewarStageState.peerAck = packet.id; + continue; + } + if (packet.t === "identity") { + deviceHandles[1-playerSeat] = cleanHandle(packet.handle); + continue; + } + if (packet.h && typeof packet.trace === "string") { + peerTraces.set(packet.h[0], packet.trace); + if (peerTraces.size>32) peerTraces.delete(peerTraces.keys().next().value); + } + if (!halted && packet.t === "hello" && packet.v === 2 && config.seat === 0 && + packet.test === config.room && typeof packet.run === "string") { + if (!netSession || peerRun !== packet.run) { + netPeerHello = { name: "AC", colors: [[38, 82, 176]] }; + players[0].name = "XBOX"; + const deal = netMakeDeal(); + deal.test = config.room; + deal.accountSeries = run; + deal.fighters = [ + {name:"AC", rosterIndex:-1, color:[159,122,232], handleColors:[[159,122,232]]}, + {name:"XBOX", rosterIndex:-1, color:[120,200,72], handleColors:[[120,200,72]]}, + ]; + if (send(deal)) { peerRun = packet.run; netBegin(deal, playerSeat, send); } + } else send(netSession.deal); + } else if (!halted && packet.t === "start" && config.seat === 1 && + packet.test === config.room && packet.v === 2 && + Number.isInteger(packet.origin) && packet.delay === NET_INPUT_DELAY && + packet.fighters?.[0]?.name === "AC" && packet.fighters?.[1]?.name === "XBOX") { + if (netSession?.originUs !== packet.origin) netBegin(packet, playerSeat, send); + } else if (netSession) { + if (packet.t === "desync" && packet.o === netSession.originUs) + recoverMismatch({frame:packet.f, mine:netHashTexts.get(packet.f), peerReported:true}); + netInbox.push(packet); + } + } + if (halted) { + sendStageIfDue(); + globalThis.__oskiewarLanStatus = "state mismatch: restarting in " + + Math.max(1, Math.ceil((retryAt - Date.now()) / 1000)) + "s"; + return; + } + if (!netSession && Date.now() >= helloAt) { + helloAt = Date.now() + 1000; + send({ t: "hello", v: 2, test: config.room, run, name }); + } + const stage = globalThis.__oskiewarStageState; + if ((stage.curtain || stage.performance?.active) && + (!netSession || netSession.frame >= stageStopFrame)) { + if (netSession) netSession.lastPacketAt = Date.now(); + globalThis.__oskiewarLanStatus = stage.curtain ? "curtain" : "performance"; + sendStageIfDue(); + return; + } + globalThis.__oskiewarLanStatus = netSession ? "connected" : "waiting for " + + (config.seat === 0 ? "ac" : "xbox"); + // A missing peer is a waiting room, not a dummy fight or a local match. + if (netSession) { + const started = Date.now(); + phaseLane = "sim"; + try { originalSim(); } finally { phaseLane = "other"; } + simCost += Date.now() - started; simCalls++; + } + accountMaintenance(); + sendStageIfDue(); + }; + paint = function () { + const started = Date.now(); + phaseLane = "paint"; + if (hasAccounts && (menuOpen || roundResult) && !performanceStageActive()) { + // AC composites CPU text/lines after the GPU scene. Suppress that HUD + // while painting the arena so it cannot overwrite the login QR later. + const saved={write,systemWrite,box,line,debugHitboxes,renderFlags, + globalFlags:globalThis.__oskiewarRenderFlags}; + try { + write=systemWrite=box=line=()=>{}; + debugHitboxes=false; + globalThis.__oskiewarRenderFlags={...renderFlags,hud:false,keys:false}; + originalPaint(); + } finally { + ({write,systemWrite,box,line,debugHitboxes,renderFlags}=saved); + globalThis.__oskiewarRenderFlags=saved.globalFlags; + } + } else originalPaint(); + drawDeviceUi(); + phaseLane = "other"; + paintCost += Date.now() - started; paintCalls++; + if (Date.now() - profileAt >= 2000) { + const now = Date.now(), elapsed = now - profileAt, session = netSession; + const current = session ? { origin: session.originUs, frame: session.frame, + snapshotMs: session.stats.snapshotMs, rolledFrames: session.stats.rolledFrames, + waits: session.stats.waits, stalls: session.stats.stalls, + mathHits: netMathMemoStats.hits, mathMisses: netMathMemoStats.misses } : null; + const continuous = current && priorProfile?.origin === current.origin; + telemetry("NET_PERF", JSON.stringify({ surface: name, build:buildVersion, theme:globalThis.__oskiewarGraphicsThemeStatus, windowMs: elapsed, + paintFps: paintCalls * 1000 / elapsed, + simMs: simCost / Math.max(1, simCalls), paintMs: paintCost / Math.max(1, paintCalls), + gameFps: continuous ? (current.frame - priorProfile.frame) * 1000 / elapsed : null, + snapshotMs: continuous ? current.snapshotMs - priorProfile.snapshotMs : null, + rolledFrames: continuous ? current.rolledFrames - priorProfile.rolledFrames : null, + mathHits: continuous ? current.mathHits - priorProfile.mathHits : null, + mathMisses: continuous ? current.mathMisses - priorProfile.mathMisses : null, + waits: continuous ? current.waits - priorProfile.waits : null, + stalls: continuous ? current.stalls - priorProfile.stalls : null })); + if (phaseEnabled) for (const lane of ["sim", "paint", "other"]) { + const phases = {}; + for (const key of Object.keys(phaseStats)) if (key.startsWith(lane + ".")) { + const row = phaseStats[key]; + phases[key.slice(lane.length + 1)] = [Math.round(row.ms * 10) / 10, row.calls]; + } + if (Object.keys(phases).length) telemetry("NET_PHASES", JSON.stringify({ + surface: name, build: buildVersion, lane, windowMs: elapsed, phases })); + } + profileAt = now; priorProfile = current; phaseStats = {}; + simCost = 0; paintCost = 0; simCalls = 0; paintCalls = 0; + } + const stage = globalThis.__oskiewarStageState; + if (!stage?.curtain && !stage?.performance?.active && !expired && !menuOpen && (halted || !netSession)) + typeWrite(globalThis.__oskiewarLanStatus || "connecting", 36, 330, 24, 25, 35, 55); + }; + leave = function () { netLeave("test-left"); originalLeave(); }; +})(globalThis.__oskiewarLanTest); diff --git a/xbox/live/lan-test.js.before-light-20260925233718 b/xbox/live/lan-test.js.before-light-20260925233718 new file mode 100644 index 0000000000..b3d3bb26d8 --- /dev/null +++ b/xbox/live/lan-test.js.before-light-20260925233718 @@ -0,0 +1,523 @@ +// Temporary two-device test, appended by the dev deploy tool only. +// No public matchmaking or persistent account identity is changed. +(function installLanTest(config) { + if (!config || ![0, 1].includes(config.seat) || + !/^ow-[a-z]{4,7}[0-9]{1,3}$/.test(config.room) || + !Number.isFinite(config.expires) || Date.now() >= config.expires) return; + globalThis.performance ||= { now: () => Date.now() }; + // QuickJS has no browser structuredClone. Preserve typed arrays, aliases, + // cycles and non-finite numbers used by rollback (JSON would corrupt them). + globalThis.structuredClone ||= function clone(value, seen = new Map()) { + if (value === null || typeof value !== "object") return value; + if (seen.has(value)) return seen.get(value); + if (value instanceof ArrayBuffer) return value.slice(0); + if (ArrayBuffer.isView(value)) return new value.constructor(value); + const copy = Array.isArray(value) ? [] : value instanceof Set ? new Set() + : value instanceof Map ? new Map() : {}; + seen.set(value, copy); + if (value instanceof Set) for (const entry of value) copy.add(clone(entry, seen)); + else if (value instanceof Map) for (const [key, entry] of value) + copy.set(clone(key, seen), clone(entry, seen)); + else for (const key of Object.keys(value)) copy[key] = clone(value[key], seen); + return copy; + }; + globalThis.__oskiewarHashTrace = true; + const peerTraces = new Map(); + let halted = false, retryAt = 0, retryCount = 0; + function recoverMismatch(detail) { + if (halted) return; + halted = true; + retryAt = Date.now() + Math.min(30000, 3000 * 2 ** Math.min(4, retryCount++)); + globalThis.__oskiewarLanMismatch = {...detail, retryAt, retryCount}; + telemetry("CLIENT_ERROR", JSON.stringify({phase:"netplay", name:"StateMismatch", + message:"Oskiewar state mismatch at frame " + detail.frame, + state:{build:buildVersion, seat:config.seat, ...detail}, recovery:"automatic match reset"})); + } + const originalNoteHash = netNotePeerHash; + netNotePeerHash = function(session, frame, hash) { + const mine = session.hashes.get(frame); + if (mine !== undefined && mine !== hash) { + recoverMismatch({frame, mine:netHashTexts.get(frame), theirs:peerTraces.get(frame)}); + telemetry("NET_TEST_MISMATCH", JSON.stringify(globalThis.__oskiewarLanMismatch)); + } + return originalNoteHash(session, frame, hash); + }; + const originalSim = sim; + const originalPaint = paint; + const originalLeave = leave; + let profileAt = Date.now(), simCost = 0, paintCost = 0, simCalls = 0, paintCalls = 0; + let priorProfile = null; + // Opt-in inclusive CPU timing. Disabled builds install no wrappers at all. + const phaseEnabled = config.phaseProfile === true || globalThis.__oskiewarPhaseProfile === true; + let phaseLane = "other", phaseStats = {}; + function profilePhase(name, fn) { + return function () { + const key = phaseLane + "." + name, started = performance.now(); + try { return fn.apply(this, arguments); } + finally { + const row = phaseStats[key] ||= { ms: 0, calls: 0 }; + row.ms += performance.now() - started; row.calls++; + } + }; + } + if (phaseEnabled) { + updatePlayer = profilePhase("player", updatePlayer); + resolvePlayerStanding = profilePhase("standing", resolvePlayerStanding); + resolveMelee = profilePhase("melee", resolveMelee); + resolvePogoAttacks = profilePhase("pogo", resolvePogoAttacks); + updateBall = profilePhase("ball", updateBall); + updateBullets = profilePhase("bullets", updateBullets); + updateGrenades = profilePhase("grenades", updateGrenades); + updateDetachedParts = profilePhase("fragments", updateDetachedParts); + updateBodyTrees = profilePhase("trees", updateBodyTrees); + updateCameraDoll = profilePhase("camera", updateCameraDoll); + captureRoundReplay = profilePhase("replay", captureRoundReplay); + netSnapshot = profilePhase("snapshot", netSnapshot); + netStateHash = profilePhase("hash", netStateHash); + buildRunnerWorldGeometry = profilePhase("pose", buildRunnerWorldGeometry); + sampleCombatBoxes = profilePhase("boxes", sampleCombatBoxes); + drawRunner = profilePhase("runner", drawRunner); + drawDebugHitboxes = profilePhase("debugBoxes", drawDebugHitboxes); + drawFrameMeter = profilePhase("frameMeter", drawFrameMeter); + drawGridOverlay = profilePhase("grid", drawGridOverlay); + drawRoomSurfaces = profilePhase("room", drawRoomSurfaces); + drawTerrainSurface = profilePhase("terrain", drawTerrainSurface); + drawTerrainBackWall = profilePhase("backWall", drawTerrainBackWall); + drawTerrainFrontWall = profilePhase("frontWall", drawTerrainFrontWall); + } + // A diagnostic transport limit, independent of the 60 Hz simulation. Each + // input carries ten recent frames; hash and stage packets always go through. + // This lets the LAN trial expose a native send FIFO that is falling behind. + const inputInterval = Number.isFinite(config.inputSendHz) && config.inputSendHz >= 20 && + config.inputSendHz <= 60 ? 1000 / config.inputSendHz : 0; + let inputSentAt = -Infinity; + const send = packet => { + if (packet.t === "i") { + const now = Date.now(); + if (!packet.h && now - inputSentAt < inputInterval - .5) return false; + inputSentAt = now; + } + if (packet.h) { + const trace = netHashTexts.get(packet.h[0]); + if (trace?.length < 5000) packet.trace = trace; + } + if (typeof globalThis.__oskiewarNetSend === "function") + return globalThis.__oskiewarNetSend(config.room, packet); + if (typeof oskiewarNetSend === "function") + return oskiewarNetSend(config.room, JSON.stringify(packet)); + return false; + }; + let stageId = "", stageSentAt = 0, stagePacket = null, stageStopFrame = config.curtain === true ? 0 : Infinity; + function sendStageIfDue() { + if (stagePacket && Date.now() >= stageSentAt) { + send(stagePacket); stageSentAt = Date.now() + 250; + } + } + globalThis.__oskiewarStageState = {curtain:config.curtain === true, performance:null, peerAck:null}; + function applyStage(packet) { + const previous = globalThis.__oskiewarStageState; + const suspended = packet.curtain === true || packet.performance?.active === true; + const wasSuspended = previous.curtain || previous.performance?.active; + if (suspended && !wasSuspended) stageStopFrame = packet.stopFrame; + if (!suspended) { + stageStopFrame = Infinity; + if (wasSuspended && netSession) netSession.lastPacketAt = Date.now(); + } + globalThis.__oskiewarStageState = {id:packet.id, curtain:packet.curtain === true, + performance:packet.performance || null, receivedAt:Date.now(), + peerAck:previous.peerAck, stopFrame:stageStopFrame}; + } + let ready = false, helloAt = 0, peerRun = "", expired = false; + let run = Date.now().toString(36) + Math.random().toString(36).slice(2, 8); + const name = config.seat === 0 ? "XBOX" : "AC"; + // Device roles retain their transport responsibilities; player seats + // place AC on the left and Xbox on the right on both displays. + const playerSeat = config.seat === 0 ? 1 : 0; + const hasAccounts = typeof accountState === "function" && typeof accountAction === "function"; + let menuOpen = false, menuSelection = 0, menuPrevious = [], menuSuppress = false; + let publicAccount = {}, identitySentAt = 0, leaderboardAt = 0, resultKey = ""; + let pendingMatch = null, reportAttemptAt = 0, pairingRetryAt = 0; + const reportedMatches = new Set(); + const deviceHandles = ["", ""]; + const deviceHandleColors = [[], []]; + globalThis.__oskiewarDeviceHandles = deviceHandles; + globalThis.__oskiewarDeviceHandleColors = deviceHandleColors; + const physicalGamepad = gamepad; + // Menus are local UI. Send neutral input while open, without pausing the + // simulation or ever placing Start/Menu into the rollback command stream. + if (hasAccounts) gamepad = function(index = 0) { + const pad = physicalGamepad(index); + if (index !== 0 || !pad) return pad; + return menuSuppress ? {...pad, down:[], leftX:0, leftY:0, rightX:0, rightY:0, + leftTrigger:0, rightTrigger:0} : {...pad, down:(pad.down || []).filter(k => k !== "Menu")}; + }; + const cleanHandle = value => /^@?[a-z0-9_-]{1,64}$/i.test(String(value || "")) + ? "@" + String(value).replace(/^@/, "").toLowerCase() : ""; + function updateDeviceMenu() { + if (!hasAccounts) return; + publicAccount = accountState() || {}; + globalThis.__oskiewarDeviceAccount = {status:publicAccount.status,handle:publicAccount.handle || ""}; + deviceHandles[playerSeat] = publicAccount.status === "signed-in" ? cleanHandle(publicAccount.handle) : ""; + for (let seat=0;seat<2;seat++) { + const row=publicAccount.leaderboard?.players?.find(row=>cleanHandle(row.handle) === deviceHandles[seat]); + deviceHandleColors[seat]=handlePalette(row?.colors,deviceHandles[seat]); + } + const physical = physicalGamepad(0) || {}; + const down = [...(physical.down || [])]; + // Some USB pads expose their D-pad as the left stick rather than buttons. + if (Math.abs(physical.leftY || 0) > .55) down.push("Navigate"); + if (down.some(k => ["ArrowUp","ArrowDown","DPadUp","DPadDown","Up","Down"].includes(k))) down.push("Navigate"); + const pressed = key => down.includes(key) && !menuPrevious.includes(key); + const wasOpen = menuOpen; + if (pressed("Menu")) { menuOpen = !menuOpen; menuSelection = 0; } + else if (menuOpen) { + if (publicAccount.status === "signed-in" && pressed("Navigate")) menuSelection = 1 - menuSelection; + if (pressed("B")) menuOpen = false; + if (pressed("A")) { + if (publicAccount.status !== "signed-in" || menuSelection === 0) menuOpen = false; + else if (publicAccount.status === "signed-in") accountAction("logout"); + + } + } + if ((menuOpen || roundResult) && ["signed-out","error"].includes(publicAccount.status) && Date.now() >= pairingRetryAt) { + pairingRetryAt = Date.now() + 10000; + accountAction("login"); + } + menuPrevious = down.slice(); + menuSuppress = menuOpen || wasOpen || pressed("Menu"); + globalThis.__oskiewarDeviceMenu = {open:menuOpen, selection:menuSelection}; + if (Date.now() >= leaderboardAt || (roundResult && resultKey !== roundResult + roundOverAt)) { + leaderboardAt = Date.now() + 30000; + resultKey = roundResult ? roundResult + roundOverAt : ""; + accountAction("leaderboard", JSON.stringify(deviceHandles.map(h => h.replace(/^@/, "")))); + } + } + function accountMaintenance() { + if (!hasAccounts) return; + // Identity rides a public metadata packet, never a simulation snapshot. + if (netSession && Date.now() >= identitySentAt) { + send({t:"identity", run, handle:deviceHandles[playerSeat]}); + identitySentAt = Date.now() + 1000; + } + if (!netSession || !matchOver || !roundResult) { pendingMatch = null; return; } + const id = "ow-" + (netSession.deal.accountSeries || String(netSession.originUs)) + "-" + Math.round(roundOverAt); + if (!pendingMatch || pendingMatch.matchId !== id) pendingMatch = { + matchId:id, frame:netSession.frame, handles:deviceHandles.map(h=>h.replace(/^@/, "")), + roundWins:players.map(p=>p.roundWins), winner:players.findIndex(p=>p.roundWins >= matchWins) + }; + if (netSession.confirmed < pendingMatch.frame || reportedMatches.has(id) || + Date.now() < reportAttemptAt || typeof accountReport !== "function") return; + const p = pendingMatch; + if (!p.handles.every(Boolean) || p.handles[0] === p.handles[1] || p.winner < 0 || + p.handles[playerSeat] !== deviceHandles[playerSeat].replace(/^@/, "")) return; + reportAttemptAt = Date.now() + 2000; + if (accountReport(JSON.stringify({matchId:p.matchId, seat:playerSeat, + handles:p.handles, roundWins:p.roundWins, winner:p.winner}))) reportedMatches.add(id); + } + let loginQrUrl = "", loginQr = null; + function handlePalette(colors, handle) { + return handle && Array.isArray(colors) && colors.length === handle.length && + colors.every(c=>c && [c.r,c.g,c.b].every(v=>Number.isFinite(v) && v>=0 && v<=255)) + ? colors.map(c=>[c.r,c.g,c.b]) : []; + } + function drawLoginQr(url, left, top, cell = 4) { + if (!url || typeof qrcode !== "function") return 0; + if (loginQrUrl !== url) { loginQrUrl = url; loginQr = qrcode(url, {errorCorrectLevel:1}); } + const count = loginQr.getModuleCount(), size = (count + 8) * cell; + screenRect(left, top, size, size, [255,255,255]); + for (let row=0; row=0) { + screenRect(left+(start+4)*cell, top+(row+4)*cell, (col-start)*cell, cell, [0,0,0]); start=-1; + } + } + } + return size; + } + function drawDeviceUi() { + if (!hasAccounts || performanceStageActive()) return; + const oldDepth = triangleDepth; triangleDepth = -1.49; + const top=Math.max(60,viewHeight/2-244), white=[238,235,247]; + if (menuOpen) { + const center = viewCenterX(); + const shadowText = (label, y, size, color = white) => { + const x = center - handleWidth(label, size) / 2; + typeWrite(label, x + 2, y + 3, size, 4, 5, 12); + typeWrite(label, x, y, size, ...color); + }; + const handle = deviceHandles[playerSeat] || name.toLowerCase(); + const handleX = center - handleWidth(handle, 28) / 2; + drawHandle(handle, handleX + 2, top + 25, 28, [], [4,5,12]); + drawHandle(handle, handleX, top + 22, 28, + deviceHandleColors[playerSeat], players[playerSeat].color); + const signedIn = publicAccount.status === "signed-in"; + const labels = signedIn ? ["resume", "log out"] : []; + labels.forEach((label, index) => { + shadowText((menuSelection === index ? "> " : "") + label, + top + 80 + index * 48, 28, + menuSelection === index ? white : [160,169,188]); + }); + if (publicAccount.status === "waiting" && publicAccount.pairUrl) { + // The white quiet zone belongs to the QR; all surrounding text floats. + if (loginQrUrl !== publicAccount.pairUrl && typeof qrcode === "function") { + loginQrUrl = publicAccount.pairUrl; + loginQr = qrcode(loginQrUrl, {errorCorrectLevel:1}); + } + const size = loginQr ? (loginQr.getModuleCount() + 8) * 4 : 164; + shadowText("scan with your phone", top + 76, 22); + drawLoginQr(publicAccount.pairUrl, center - size / 2, top + 115, 4); + shadowText(String(publicAccount.code || ""), top + 133 + size, 30); + } else if (publicAccount.status === "creating") + shadowText("creating sign-in code...", top + 185, 22); + else if (publicAccount.status === "error") + shadowText("sign-in reconnecting...", top + 185, 22, [245,157,146]); + else if (signedIn) + shadowText("your match wins count globally", top + 205, 22); + shadowText(signedIn ? "d-pad select A choose B back" : "A / B / Menu: resume", + top + 425, 20, [170,178,198]); + } else if (roundResult) { + const board=publicAccount.leaderboard; + const rows=Array.isArray(board?.top)?board.top.slice(0,3):[]; + const anon=publicAccount.status !== "signed-in"; + const winner=roundWinner(); + const label=roundResult === "TIE" || !winner ? "TIE" + : winner.pad === playerSeat ? "WIN" : "LOSE"; + const resultNow=netSession ? netSession.originUs+netSession.frame*NET_TICK_US : runtime().monotonicUs; + const age=Math.max(0,(resultNow-roundOverAt)/1000000); + const reveal=Math.max(0,Math.min(1,(age-.65)/.55)); + const heroSize=Math.max(72,Math.min(280,(viewHeight-430)*.85, + (stageRight-stageLeft-64)/(label.length*.75))); + const size=heroSize+(Math.min(100,heroSize)-heroSize)*reveal*reveal*(3-2*reveal); + const width=[...label].reduce((total,glyph)=>total+ + (typeof systemWrite.measureGlyph === "function" + ? systemWrite.measureGlyph(glyph,size) : size*.65),0); + const color=label === "WIN" ? players[playerSeat].color + : label === "LOSE" ? [255,132,157] : white; + if (typeof drawPhotoRoundOutcome === "function") + drawPhotoRoundOutcome(label,age,viewCenterX()-width/2,24,width,size); + // A huge reveal settles above the action so each replay angle stays clear. + systemWrite(label,viewCenterX()-width/2,24,size,...color); + const textX=stageRight-460,y=viewHeight-268; + screenRect(textX-10,y+18,444,36,[12,14,23]); + typeWrite("global wins",textX,y+24,24,...white); + rows.forEach((row,i)=>{ + screenRect(textX-10,y+53+i*26,444,25,[12,14,23]); + const full=cleanHandle(row.handle), label=full.slice(0,23), prefix=(i+1)+" "; + typeWrite(prefix,textX,y+58+i*26,18,...white); + drawHandle(label,textX+handleWidth(prefix,18),y+58+i*26,18,handlePalette(row.colors,full),white); + typeWrite(" "+row.matchesWon+" W / "+row.matchesPlayed, + textX+handleWidth(prefix+label,18),y+58+i*26,18,...white); + }); + if (!rows.length) { + screenRect(textX-10,y+54,444,30,[12,14,23]); + typeWrite(publicAccount.leaderboardError ? "leaderboard unavailable" : board?.verification ? "no ranked matches yet" : "leaderboard loading...",textX,y+60,18,170,178,198); + } + const stats=Array.isArray(board?.players)?board.players:[]; + stats.slice(0,2).forEach((row,i)=> { + screenRect(textX-10,y+145+i*24,444,24,[12,14,23]); + const seat=Math.max(0,deviceHandles.findIndex(handle=>handle.replace(/^@/,"")===row.handle)); + const full=cleanHandle(row.handle), label=full.slice(0,23); + drawHandle(label,textX,y+150+i*24,16,handlePalette(row.colors,full),players[seat].color); + typeWrite(" "+row.matchesWon+" W / "+row.matchesLost+" L", + textX+handleWidth(label,16),y+150+i*24,16,...players[seat].color); + }); + const qrX=stageLeft+32,qrY=viewHeight-224; + if (anon && publicAccount.pairUrl) { + const pulse=.5+.5*platformMath.sin(Date.now()/650); + const border=[130+pulse*80,100+pulse*50,200+pulse*50]; + screenRect(qrX-8,qrY-40,220,36,[12,14,23]); + typeWrite("sign in",qrX,qrY-32,24,...white); + // Pulse only the surround; every QR module stays still and readable. + const count=loginQrUrl === publicAccount.pairUrl && loginQr ? loginQr.getModuleCount() : 33; + const qrSize=(count+8)*4; + screenRect(qrX-6,qrY-6,qrSize+12,qrSize+12,border); + drawLoginQr(publicAccount.pairUrl,qrX,qrY,4); + screenRect(qrX-8,qrY+qrSize+8,220,34,[12,14,23]); + typeWrite(String(publicAccount.code || ""),qrX,qrY+qrSize+14,24,...white); + } else if (anon) { + screenRect(qrX-8,qrY,260,34,[12,14,23]); + typeWrite("creating sign-in code...",qrX,qrY+8,18,...white); + } + const signed=deviceHandles.every(Boolean); + screenRect(textX-10,y+220,444,30,[12,14,23]); + typeWrite(String(signed ? (publicAccount.reportStatus || "both signed in: first to 5 counts") : "scan to record your wins").slice(0,48),textX,y+228,16,170,178,198); + } + triangleDepth = oldDepth; + } + + globalThis.__oskiewarTheme = "dark"; + // This room carries inputs only, so a spectator publish cannot switch the + // native socket out from under the test. Test rounds are never uploaded. + publishVersus = () => {}; + publishSpectator = () => {}; + publishSession = () => {}; + globalThis.saveReplay = () => {}; + sim = function () { + updateDeviceMenu(); + if (expired) return originalSim(); + if (Date.now() >= config.expires) { + netLeave("test-expired"); expired = true; + globalThis.__oskiewarLanStatus = "expired"; + gameBoot(); return; + } + if (!ready) { + ready = true; + versusRoomName = config.room.slice(3); + beginVersusLobby(runtime().monotonicUs); + players[0].name = name; + } + if (halted && Date.now() >= retryAt) { + netEnd("desync-retry"); halted = false; peerRun = ""; helloAt = 0; + run = Date.now().toString(36) + "-retry" + retryCount; + } + if (!halted && netSession?.frame > 1800) retryCount = 0; + const command = globalThis.__oskiewarStageCommand; + if (config.seat === 1 && command?.id !== stageId && typeof command?.id === "string") { + stageId = command.id; + stagePacket = {t:"stage", id:stageId, curtain:command.curtain === true, + performance:command.performance || null, + stopFrame:netSession ? Math.max(netSession.frame, netSession.remoteSimFrame) + 120 : 0}; + applyStage(stagePacket); + stageSentAt = 0; + } + // The native WebSocket currently has one outgoing slot. Before joining, + // let a hello replace a progress update; during play, send control last + // so a same-frame input cannot overwrite a curtain/resume command. + if (!netSession) sendStageIfDue(); + const packets = typeof oskiewarNetPoll === "function" ? oskiewarNetPoll() : []; + const inbox = globalThis.__oskiewarNetInbox; + if (Array.isArray(inbox)) packets.push(...inbox.splice(0)); + for (const packet of packets) { + if (!packet || typeof packet !== "object") continue; + if (packet.t === "stage" && config.seat === 0 && typeof packet.id === "string" && + Number.isInteger(packet.stopFrame) && packet.stopFrame >= 0) { + if (packet.id !== stageId) { stageId = packet.id; applyStage(packet); } + send({t:"stageAck", id:packet.id}); + continue; + } + if (packet.t === "stageAck" && packet.id === stageId) { + globalThis.__oskiewarStageState.peerAck = packet.id; + continue; + } + if (packet.t === "identity") { + deviceHandles[1-playerSeat] = cleanHandle(packet.handle); + continue; + } + if (packet.h && typeof packet.trace === "string") { + peerTraces.set(packet.h[0], packet.trace); + if (peerTraces.size>32) peerTraces.delete(peerTraces.keys().next().value); + } + if (!halted && packet.t === "hello" && packet.v === 2 && config.seat === 0 && + packet.test === config.room && typeof packet.run === "string") { + if (!netSession || peerRun !== packet.run) { + netPeerHello = { name: "AC", colors: [[38, 82, 176]] }; + players[0].name = "XBOX"; + const deal = netMakeDeal(); + deal.test = config.room; + deal.accountSeries = run; + deal.fighters = [ + {name:"AC", rosterIndex:-1, color:[159,122,232], handleColors:[[159,122,232]]}, + {name:"XBOX", rosterIndex:-1, color:[120,200,72], handleColors:[[120,200,72]]}, + ]; + if (send(deal)) { peerRun = packet.run; netBegin(deal, playerSeat, send); } + } else send(netSession.deal); + } else if (!halted && packet.t === "start" && config.seat === 1 && + packet.test === config.room && packet.v === 2 && + Number.isInteger(packet.origin) && packet.delay === NET_INPUT_DELAY && + packet.fighters?.[0]?.name === "AC" && packet.fighters?.[1]?.name === "XBOX") { + if (netSession?.originUs !== packet.origin) netBegin(packet, playerSeat, send); + } else if (netSession) { + if (packet.t === "desync" && packet.o === netSession.originUs) + recoverMismatch({frame:packet.f, mine:netHashTexts.get(packet.f), peerReported:true}); + netInbox.push(packet); + } + } + if (halted) { + sendStageIfDue(); + globalThis.__oskiewarLanStatus = "state mismatch: restarting in " + + Math.max(1, Math.ceil((retryAt - Date.now()) / 1000)) + "s"; + return; + } + if (!netSession && Date.now() >= helloAt) { + helloAt = Date.now() + 1000; + send({ t: "hello", v: 2, test: config.room, run, name }); + } + const stage = globalThis.__oskiewarStageState; + if ((stage.curtain || stage.performance?.active) && + (!netSession || netSession.frame >= stageStopFrame)) { + if (netSession) netSession.lastPacketAt = Date.now(); + globalThis.__oskiewarLanStatus = stage.curtain ? "curtain" : "performance"; + sendStageIfDue(); + return; + } + globalThis.__oskiewarLanStatus = netSession ? "connected" : "waiting for " + + (config.seat === 0 ? "ac" : "xbox"); + // A missing peer is a waiting room, not a dummy fight or a local match. + if (netSession) { + const started = Date.now(); + phaseLane = "sim"; + try { originalSim(); } finally { phaseLane = "other"; } + simCost += Date.now() - started; simCalls++; + } + accountMaintenance(); + sendStageIfDue(); + }; + paint = function () { + const started = Date.now(); + phaseLane = "paint"; + if (hasAccounts && (menuOpen || roundResult) && !performanceStageActive()) { + // AC composites CPU text/lines after the GPU scene. Suppress that HUD + // while painting the arena so it cannot overwrite the login QR later. + const saved={write,systemWrite,box,line,debugHitboxes,renderFlags, + globalFlags:globalThis.__oskiewarRenderFlags}; + try { + write=systemWrite=box=line=()=>{}; + debugHitboxes=false; + globalThis.__oskiewarRenderFlags={...renderFlags,hud:false,keys:false}; + originalPaint(); + } finally { + ({write,systemWrite,box,line,debugHitboxes,renderFlags}=saved); + globalThis.__oskiewarRenderFlags=saved.globalFlags; + } + } else originalPaint(); + drawDeviceUi(); + phaseLane = "other"; + paintCost += Date.now() - started; paintCalls++; + if (Date.now() - profileAt >= 2000) { + const now = Date.now(), elapsed = now - profileAt, session = netSession; + const current = session ? { origin: session.originUs, frame: session.frame, + snapshotMs: session.stats.snapshotMs, rolledFrames: session.stats.rolledFrames, + waits: session.stats.waits, stalls: session.stats.stalls, + mathHits: netMathMemoStats.hits, mathMisses: netMathMemoStats.misses } : null; + const continuous = current && priorProfile?.origin === current.origin; + telemetry("NET_PERF", JSON.stringify({ surface: name, build:buildVersion, theme:globalThis.__oskiewarGraphicsThemeStatus, windowMs: elapsed, + paintFps: paintCalls * 1000 / elapsed, + simMs: simCost / Math.max(1, simCalls), paintMs: paintCost / Math.max(1, paintCalls), + gameFps: continuous ? (current.frame - priorProfile.frame) * 1000 / elapsed : null, + snapshotMs: continuous ? current.snapshotMs - priorProfile.snapshotMs : null, + rolledFrames: continuous ? current.rolledFrames - priorProfile.rolledFrames : null, + mathHits: continuous ? current.mathHits - priorProfile.mathHits : null, + mathMisses: continuous ? current.mathMisses - priorProfile.mathMisses : null, + waits: continuous ? current.waits - priorProfile.waits : null, + stalls: continuous ? current.stalls - priorProfile.stalls : null })); + if (phaseEnabled) for (const lane of ["sim", "paint", "other"]) { + const phases = {}; + for (const key of Object.keys(phaseStats)) if (key.startsWith(lane + ".")) { + const row = phaseStats[key]; + phases[key.slice(lane.length + 1)] = [Math.round(row.ms * 10) / 10, row.calls]; + } + if (Object.keys(phases).length) telemetry("NET_PHASES", JSON.stringify({ + surface: name, build: buildVersion, lane, windowMs: elapsed, phases })); + } + profileAt = now; priorProfile = current; phaseStats = {}; + simCost = 0; paintCost = 0; simCalls = 0; paintCalls = 0; + } + const stage = globalThis.__oskiewarStageState; + if (!stage?.curtain && !stage?.performance?.active && !expired && !menuOpen && (halted || !netSession)) + typeWrite(globalThis.__oskiewarLanStatus || "connecting", 36, 330, 24, 25, 35, 55); + }; + leave = function () { netLeave("test-left"); originalLeave(); }; +})(globalThis.__oskiewarLanTest); diff --git a/xbox/live/oskiewar.js.before-light-20260925233718 b/xbox/live/oskiewar.js.before-light-20260925233718 new file mode 100644 index 0000000000..6888e5c0b7 --- /dev/null +++ b/xbox/live/oskiewar.js.before-light-20260925233718 @@ -0,0 +1,17622 @@ +// @bundle-qr +// The console's monotonic clock can hand back a negative number: App.cpp +// converts QPC ticks with `counter * 1000000`, which overflows int64 past +// about ten days of uptime. Every deadline in this piece starts at 0 and is +// compared with `now >=` or `now <`, so a negative clock made `hitStunUntil` +// permanently in the future -- no attack could fire and no round could be +// won -- stranded the title, silenced the input log, and indexed off the +// front of a palette. Rebase once, here, so time starts at zero whatever the +// host reports. The host builds a fresh object per call, so this rewrites +// that copy rather than allocating another. +const hostRuntime = runtime; +let clockEpoch = null; +// Rollback netplay's hooks into the clock and the side effects. The session +// itself lives further down (search "Rollback netplay"); these four sit here +// because the wrapper below and the signal emitters read them. +let netSession = null; +// Windows and Linux libm differ by a few ULPs. Network simulation uses the +// same elementary operations on both hosts, including geometry sampled for +// collision. Keep native math for ordinary local play. +const platformMath = globalThis.Math; +let Math = Object.create(platformMath); +function netSin(x) { + x %= 6.283185307179586; + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +function netAtan(x) { + const sign = x < 0 ? -1 : 1; + x = platformMath.abs(x); + const inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + platformMath.sqrt(1 + x * x)); + const square = x * x; + let term = x, sum = x; + for (let n = 1; n <= 20; n++) { + term *= -square; + sum += term / (2 * n + 1); + } + const angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +function netAtan2(y, x) { + if (x > 0) return netAtan(y / x); + if (x < 0) return netAtan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +function netExp(x) { + if (x > 709.782712893384) return Infinity; + if (x < -745.1332191019411) return 0; + const exponent = platformMath.round(x / .6931471805599453); + const remainder = x - exponent * .6931471805599453; + let sum = 1, term = 1; + for (let n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * 2 ** exponent; +} +function netHypot(...values) { + let scale = 0; + for (const value of values) scale = platformMath.max(scale, platformMath.abs(value)); + if (!scale || !Number.isFinite(scale)) return scale; + let sum = 0; + for (const value of values) { const ratio = value / scale; sum += ratio * ratio; } + return platformMath.sqrt(sum) * scale; +} +// The interpreter's deterministic transcendental series are expensive on +// Xbox. Poses repeatedly ask for the same angles; retain exact results in a +// bounded cache, including a distinct key for negative zero. Native AC math +// bypasses these fallbacks entirely. No rounding or approximation is added. +const netMathMemoStats = { hits: 0, misses: 0 }; +function memoizeNetUnary(calculate) { + const cache = new Map(); + return value => { + if (typeof value !== "number") return calculate(value); + const key = Object.is(value, -0) ? "negative-zero" : value; + const cached = cache.get(key); + if (cached !== undefined) { netMathMemoStats.hits++; return cached; } + netMathMemoStats.misses++; + const result = calculate(value); + if (cache.size >= 1024) cache.clear(); + cache.set(key, result); + return result; + }; +} +netSin = memoizeNetUnary(netSin); +netAtan = memoizeNetUnary(netAtan); +netExp = memoizeNetUnary(netExp); +const netMath = {sin: netSin, cos: x => netSin(x + 1.5707963267948966), + tan: x => netSin(x) / netSin(x + 1.5707963267948966), atan: netAtan, + atan2: netAtan2, asin: x => netAtan2(x, platformMath.sqrt(1 - x * x)), + exp: netExp, hypot: netHypot}; +for (const [name, fallback] of Object.entries(netMath)) { + const native = globalThis.__oskiewarNativeMath; + const calculate = native?.version === "oskiewar-libm-v1" && typeof native[name] === "function" + ? native[name] : fallback; + Math[name] = (...args) => netSession ? calculate(...args) : platformMath[name](...args); +} + +// While non-null, runtime() reports this clock: the sim is stepping frame f +// and must read f's time whatever the wall says. +let netClockUs = null; +// While true the sim is replaying frames it already showed once — no drums, +// no signals, no telemetry, no publishing. The state changes; nothing else. +let netSilent = false; +let netFrameInputs = null; +// Game speed is the clock, not a patch on top of it. Every deadline, spring, +// bot die-roll and animation in this piece reads one monotonic stream, so +// scaling the stream's increments scales the whole game coherently — physics, +// input windows, round timers, all in step. Set from the title screen with +// +/- on a keyboard, in quarter steps between a quarter and double speed; +// the offline reel harness drives simMonotonicUs itself and never touches +// this, so recordings always run at one. +let gameSpeed = 1; +let roundModifier = ""; +let netRoundClockDebtUs = 0; +function airRoundActive() { return roundModifier === "air"; } +function unarmedRoundActive() { return roundModifier === "unarmed"; } +function roundSpeed() { return roundModifier === "slow" ? .5 : 1; } +let gameSpeedChangedAt = 0; +let scaledClockUs = 0; +let lastRawClockUs = null; +runtime = function acRuntime() { + const info = hostRuntime(); + const raw = Number(info.monotonicUs) || 0; + if (clockEpoch === null) clockEpoch = raw; + if (lastRawClockUs === null) lastRawClockUs = raw; + scaledClockUs += (raw - lastRawClockUs) * gameSpeed * roundSpeed(); + lastRawClockUs = raw; + info.monotonicUs = Math.round(scaledClockUs); + if (typeof info.simMonotonicUs === "number") + info.simMonotonicUs -= clockEpoch; + // A rollback fight keeps its own clock: frame f reads f's time while it is + // simulated, and the paint between frames reads the current frame's time + // plus how far the display is into it, so animation and HUD stay on the + // fight's timeline rather than the wall's. + if (netClockUs !== null) { + info.monotonicUs = netClockUs - netRoundClockDebtUs; + info.simMonotonicUs = info.monotonicUs; + } else if (netSession) { + const alpha = Math.max(0, Math.min(1, Number(info.renderAlpha) || 0)); + const at = netSession.originUs + netSession.frame * NET_TICK_US + + Math.round(alpha * NET_TICK_US * roundSpeed()) - netRoundClockDebtUs; + info.monotonicUs = at; + info.simMonotonicUs = at; + } + if (finalKillReplayClockUs !== null) { + info.paintMonotonicUs ??= info.monotonicUs; + info.monotonicUs = finalKillReplayClockUs; + info.simMonotonicUs = finalKillReplayClockUs; + } + return info; +}; +// Replayed frames are silent: the wall already saw them once. +// +// These two hooks belong to the host, and the hosts disagree about which of +// them exist: the native shell installs `telemetry` and no `analytics` at all. +// Reading an undeclared binding throws, and this runs at the top level of one +// program, so that throw took every `let` below it with it — the shell then +// reported the first of those (`gameMode`) as uninitialized, a good half a +// file away from the actual cause. `typeof` is the one way to ask whether a +// binding exists without touching it, so ask, and only wrap what is there. +const hostTelemetry = typeof telemetry === "function" ? telemetry : null; +if (hostTelemetry) + telemetry = function netTelemetry(...args) { + if (netSilent) return; + return hostTelemetry(...args); + }; +const hostAnalytics = typeof analytics === "function" ? analytics : null; +if (hostAnalytics) + analytics = function netAnalytics(...args) { + if (netSilent) return; + return hostAnalytics(...args); + }; + +// Monotonic count of committed revisions to this piece (next revision included). +const buildVersion = 178; +const floorY = 1800; +// Oskiewar now opens as a versus game. An ordinary web visit hosts a room — +// the URL becomes the invitation — and until a friend opens it, all you can +// do is move: a training floor with your own moves named back at you and one +// standing instruction, find a friend. Survival (the solo ascent) and the +// bot/dummy doors remain modes behind `?opponent=`, and the regression +// harness still enters combat directly. Keeping player two as explicit mode +// state, rather than deleting the chair, preserves replays and the fight +// laboratory while ensuring no route quietly seats an adversary. +let gameMode = "fight"; +const survivalActive = () => gameMode === "survival"; +// The versus lane's two rooms-of-play: alone in the cube waiting on a rival, +// or fighting the rival the relay seated. Both publish to the same room so +// the shared URL is the lobby, the fight and the grandstand at once. +const lobbyActive = () => gameMode === "fight" && fightOpponent === "versus-lobby"; +const versusActive = () => gameMode === "fight" && fightOpponent === "versus"; +const versusLane = () => lobbyActive() || versusActive(); +// The station. The tower became a cube, and the cube has now been opened to +// vacuum: @jeffrey asked for "a large space map", and the cube's own comment +// had already named the condition for growing one — "a tile-authored map is +// exactly the shape a future rung would be written in." So the lattice is +// what grew. Twenty tiles wide by fourteen tall at the same 90 units a side, +// which is four times the cube's floor area and still frames whole on one +// screen at the widest shot, because a fighter you cannot see is a fighter +// you cannot read. +// +// What changed besides the number: the plaster shell is gone. There is no +// back wall, no ceiling slab and no side wall, because the map is outside +// now — stars behind, a planet below the deck, and a hull you stand on +// rather than a room you are sealed into. Gravity is station gravity, a +// little over half a G (`spaceGravityScale`), so a jump hangs and the +// floating decks overhead are reachable on legs alone. Simulation stays +// continuous — nothing about motion quantizes — but the STRUCTURE is +// addressable: spawns, pickups, decks and lanes are authored in tile +// coordinates, the lattice draws as a faint nav hologram, and `gridField` +// below holds one number per tile so per-tile computation (heat, ownership, +// weather) has a surface to run on. +const tileSize = 90; +let gridCols = 40; +const gridRows = 16; +// Tile (0, 0) starts flush at the floor-left corner of the PLAYABLE box, so +// every tile edge lands on a clean multiple of 90. The walls stand outside +// the lattice: the structural shell is one wallThickness beyond each face, +// and `resolveRunnerBounds` pushes off the faces themselves. +const wallThickness = 40; +const gridLeft = 0; +let gridWidth = gridCols * tileSize; +const gridHeight = gridRows * tileSize; +const worldLeft = gridLeft - wallThickness; +let worldRight = gridLeft + gridWidth + wallThickness; +// Keep the authored ground grid while giving launches four times the headroom. +const ceilingY = floorY - gridHeight * 4 - wallThickness; +// Depth is the eye's dimension, not the fight's — fighters live near z = 0 — +// so it is authored rather than derived. It was the cube's own width back +// when those were the same number; widening the map to twenty tiles must not +// also push the far plane twice as far out, because every camera stand-off, +// every killcam orbit and the whole ±30000 native coordinate budget were +// tuned against this depth and not against the floor's span. +const roomDepth = 900; +const worldNear = -roomDepth / 2; +const worldFar = roomDepth / 2; +// Address helpers: world position to tile and back. Rows count UP from the +// floor, because in a fight the floor is where everything starts. All three +// clamp, so a body pressed into a wall still names a real tile. +const tileCol = (x) => + Math.min(gridCols - 1, Math.max(0, Math.floor((x - gridLeft) / tileSize))); +const tileRow = (y) => + Math.min(gridRows - 1, Math.max(0, Math.floor((floorY - y) / tileSize))); +const tileCenterX = (col) => gridLeft + (col + .5) * tileSize; +// One number per tile, row-major from the floor-left corner. Today impacts +// write heat into it and the overlay draws that heat fading; tomorrow it is +// wherever tiled computation over the map wants to live. +let gridField = new Float32Array(gridCols * gridRows); +const gridFieldIndex = (x, y) => tileRow(y) * gridCols + tileCol(x); +// Whether a point is on the lattice at all. `tileCol` and `tileRow` CLAMP, +// which is right for a body pressed into a wall — it still stands somewhere — +// and wrong for anything that happens off the map, because every one of those +// lands on the same corner cell. On plaster that was invisible. Against black +// space it was a lit bar across the top corners of the frame: the title +// screen's own bouncing letters, stamping heat outside the box, all of it +// clamped into row thirteen at columns zero and nineteen. +const onGridField = (x, y) => + x >= gridLeft && x <= gridLeft + gridWidth && + y <= floorY && y >= floorY - gridHeight; +// The park. The floor stopped being flat. +// +// Every piece of this was already here and switched off: `terrainFloorAt` has +// carried a heightfield since the tower, `terrainTangentAt` differentiates it, +// and the skate physics have been feeding that slope into `skateVx` all along +// — `player.skateVx += terrainSlope * 1900 * dt` is a line that has done +// nothing for months because the amplitude was zero. What was missing was a +// shape worth riding. +// +// So the profile is authored rather than noised. A run of segments in tile +// coordinates, each one a real skatepark feature, walked left to right: +// +// flat the ground, and the halfpipe's own flat bottom +// transition a quarter-circle, horizontal where it meets the flat and +// vertical at the coping — which is what a transition IS, and +// why it is an arc and not a straight ramp +// bank a straight incline, for launching off rather than carving in +// +// A transition's run equals its height because a quarter circle's does. That +// is not a simplification, it is the geometry: radius R gives you R of run +// and R of rise, tangent flat at the bottom and vertical at the lip. +// `lift` raises the segment's base off the ground, or — negative — digs it in. +// That sign is what makes a halfpipe possible in a game seen from the side: a +// pipe built UP from the floor is two humps with their ridable faces pointing +// away from you, and you would have to climb the back of one to use it. Dug +// IN, the same two arcs face each other, the flat bottom is genuinely a floor, +// and a skater can ride straight through at speed from either end. So the +// halfpipe here is a bowl, which is what a halfpipe is from the side anyway. +// Read it left to right and it is a run: drop off the left quarterpipe, carry +// the speed into the halfpipe, out across the middle, up the kicker and over +// the funbox, and finish on the right quarterpipe. The middle ten tiles are +// deliberately flat and deliberately in the middle — that is where the bell +// rings, and a fight that opens with both fighters sliding down a transition +// is a fight nobody chose the start of. +const parkFeatures = [ + { from: 0, to: 4, kind: "transition", rise: 360, dir: -1 }, + { from: 4, to: 6, kind: "flat" }, + { from: 6, to: 9, kind: "transition", rise: 270, dir: -1, lift: -270 }, + { from: 9, to: 12, kind: "flat", lift: -270 }, + { from: 12, to: 15, kind: "transition", rise: 270, dir: 1, lift: -270 }, + { from: 15, to: 25, kind: "flat" }, + { from: 25, to: 28, kind: "bank", rise: 180, dir: 1 }, + { from: 28, to: 30, kind: "flat", lift: 180 }, + { from: 30, to: 33, kind: "bank", rise: 180, dir: -1 }, + { from: 33, to: 36, kind: "flat" }, + { from: 36, to: 40, kind: "transition", rise: 360, dir: 1 }, +]; +// Resolved once into world units so the per-frame walk compares numbers +// rather than rebuilding them. `terrainFloorAt` runs for every foot, every +// grass blade and every render sample, so it is worth the twenty bytes. +let parkSegments = parkFeatures.map((feature) => ({ + ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, + lift: feature.lift || 0, +})); +const parkLeft = parkSegments[0].left; +let parkRight = parkSegments[parkSegments.length - 1].right; +// The lowest ground in the park. `floorY` used to be it — it +// was the whole world's bottom, and a dozen places lean on that: the camera +// clamps its aim to it, the ground's near skirt hangs from it, the terrain +// span stops at it. A bowl dug three tiles into the floor makes every one of +// those assumptions wrong by exactly the depth of the bowl, and the symptom +// is a fighter riding out of frame at the bottom of the pipe. +let parkDeepest = floorY + Math.max(0, + ...parkSegments.map((segment) => -segment.lift)); +// Enough samples that an arc reads as an arc. One per tile drew the halfpipe +// as a staircase — 90 units is most of a fighter wide, and a transition turns +// through ninety degrees in three of them. +let terrainSamples = gridCols * 6; +let terrainPhase = 0; +// The long park is selected by ?map=skatepark; the host's deal owns the map. +let skateparkMap = globalThis.__oskiewarMap === "skatepark"; +const skateLoops = [ + { x: 6300, radius: 320 }, { x: 15300, radius: 420 }, + { x: 24300, radius: 500 }, +]; +const skateBoosts = [2400, 5400, 10800, 14400, 19800, 23400, 27000] + .map((x) => ({ left: x, right: x + 240, speed: 3900 })); +const skateRopes = []; +const chainLinks = 16; +const chainLength = 44; + +function configureWorldMap(name) { + // A normal round keeps its current workshop/local variant. Only entering + // or leaving the long course needs to replace the world dimensions. + if (name !== "skatepark" && !skateparkMap) return; + skateparkMap = name === "skatepark"; + gridCols = skateparkMap ? 320 : 40; + gridWidth = gridCols * tileSize; + if (gridField.length !== gridCols * gridRows) gridField = new Float32Array(gridCols * gridRows); + worldRight = gridLeft + gridWidth + wallThickness; + const features = skateparkMap ? [ + ...parkFeatures.slice(0, -1), + { from: 36, to: 40, kind: "flat" }, + ...[40, 140, 240].flatMap((from) => [ + { from, to: from + 40, kind: "flat" }, + { from: from + 40, to: from + 46, kind: "bank", rise: 270, dir: 1 }, + { from: from + 46, to: from + 50, kind: "flat", lift: 270 }, + { from: from + 50, to: from + 56, kind: "bank", rise: 270, dir: -1 }, + { from: from + 56, to: Math.min(320, from + 100), kind: "flat" }, + ]), + ] : parkFeatures; + parkSegments = features.map((feature) => ({ ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, lift: feature.lift || 0 })); + parkRight = gridLeft + gridWidth; + terrainSamples = gridCols * 6; +} + +function resetSkateRopes() { + skateRopes.length = 0; + if (!skateparkMap) return; + for (const x of [3600, 9900, 18900]) { + const anchorY = floorY - 850; + skateRopes.push({ x, y: anchorY, z: 0, + nodes: Array.from({ length: chainLinks + 1 }, (_, index) => ({ + x, y: anchorY + index * chainLength, + px: x, py: anchorY + index * chainLength, + })) }); + } +} + +function releaseSkateRope(player) { + const rope = skateRopes[player.ropeIndex]; + const node = rope?.nodes[Math.round(player.ropeLink)]; + if (node) { + player.vx = clamp((node.x - node.px) / (rope.dt || 1 / 60), -4200, 4200); + player.vy = clamp((node.y - node.py) / (rope.dt || 1 / 60), -4200, 4200); + player.skateVx = player.vx; + player.knockVx = player.skateboard ? 0 : player.vx; + } + player.ropeIndex = -1; + player.grounded = false; +} + +// Hold grab through a crossing to latch. A fresh grab edge detaches. +function skateRopeInput(player, input, grabHeld, dt, grabPressed = grabHeld) { + if (!grabHeld) player.ropeGrabLocked = false; + if (player.ropeIndex >= 0 && (!player.alive || isHeadOnly(player) || + isPogo(player) || player.hitStunUntil > runtime().monotonicUs)) { + releaseSkateRope(player); + return false; + } + if (player.ropeIndex >= 0 && grabPressed) { + releaseSkateRope(player); + player.ropeGrabLocked = true; + return false; + } + if (player.ropeIndex < 0 && grabHeld && !player.ropeGrabLocked && player.heldBall < 0 && + player.heldPart < 0 && player.heldPlayer < 0) { + let nearest = null; + // Test the swept hand volume against each link, so a fast crossing counts. + const hand = { x1: player.x, y1: player.y - 125, z1: player.z, + x2: player.x + player.vx * dt, y2: player.y - 125 + player.vy * dt, + z2: player.z, width: 64 }; + skateRopes.forEach((rope, ropeIndex) => { + rope.nodes.slice(1).forEach((node, index) => { + const before = rope.nodes[index]; + const box = { left: Math.min(node.x, before.x) - 6, + right: Math.max(node.x, before.x) + 6, + top: Math.min(node.y, before.y) - 6, bottom: Math.max(node.y, before.y) + 6, + near: rope.z - 8, far: rope.z + 8 }; + const hit = segmentBoxEntry(hand, box, hand.width / 2); + const distance = Math.hypot(node.x - hand.x1, node.y - hand.y1); + if (hit !== null && (!nearest || distance < nearest.distance)) + nearest = { ropeIndex, link: index + 1, distance }; + }); + }); + if (nearest) { + player.ropeIndex = nearest.ropeIndex; + player.ropeLink = nearest.link; + const node = skateRopes[player.ropeIndex].nodes[nearest.link]; + node.px = node.x - clamp(player.vx, -3000, 3000) / 60; + node.py = node.y - clamp(player.vy, -3000, 3000) / 60; + player.skateLoop = -1; + player.lastButton = "ROPE"; + emitSignal("rope-grab", player.pad, nearest.ropeIndex, nearest.link); + } + } + if (!(player.ropeIndex >= 0)) return false; + player.ropeLink = clamp(player.ropeLink - input.vertical * dt * 3, + 2, chainLinks); + const rope = skateRopes[player.ropeIndex]; + const node = rope.nodes[Math.round(player.ropeLink)]; + node.px -= input.horizontal * 2100 * dt * dt; + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grounded = false; + player.attackKind = ""; + player.attackUntil = 0; + player.blocking = false; + player.stance = "ROPE"; + return true; +} + +// Verlet chain with a fixed anchor and distance constraints, stepped once per +// simulation tick. Nodes, previous positions and attachments all roll back. +function updateSkateRopes(dt) { + if (!skateparkMap || survivalActive()) return; + for (const rope of skateRopes) { + const timeScale = dt / (rope.dt || dt); + rope.dt = dt; + for (let i = 1; i < rope.nodes.length; i++) { + const node = rope.nodes[i]; + const vx = (node.x - node.px) * .997 * timeScale; + const vy = (node.y - node.py) * .997 * timeScale; + node.px = node.x; node.py = node.y; + node.x += vx; node.y += vy + fallGravity() * dt * dt; + } + const riders = players.filter((player) => player.alive && + skateRopes[player.ropeIndex] === rope); + const inverseMass = (index) => index === 0 ? 0 : + riders.some((rider) => Math.abs(rider.ropeLink - index) < 1) ? .125 : 1; + for (let pass = 0; pass < 32; pass++) { + rope.nodes[0].x = rope.x; rope.nodes[0].y = rope.y; + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + const dx = b.x - a.x, dy = b.y - a.y; + const length = Math.hypot(dx, dy) || 1; + const error = (length - chainLength) / length; + const wa = inverseMass(i - 1), wb = inverseMass(i); + const sum = wa + wb; + b.x -= dx * error * wb / sum; b.y -= dy * error * wb / sum; + a.x += dx * error * wa / sum; a.y += dy * error * wa / sum; + } + } + } + for (const player of players) { + if (!(player.ropeIndex >= 0)) continue; + if (!player.alive) { releaseSkateRope(player); continue; } + const rope = skateRopes[player.ropeIndex]; + const link = Math.floor(player.ropeLink), blend = player.ropeLink - link; + const a = rope.nodes[link], b = rope.nodes[Math.min(link + 1, chainLinks)]; + const x = lerp(a.x, b.x, blend), y = lerp(a.y, b.y, blend) + 125; + player.vx = (x - player.x) / Math.max(dt, .001); + player.vy = (y - player.y) / Math.max(dt, .001); + player.x = x; player.y = y; player.z = rope.z; + player.grounded = false; + } +} + +function skateLoopStep(player, input, dt, now) { + if (!(player.skateLoop >= 0)) { + if (!player.skateboard || !player.grounded || Math.abs(player.skateVx) < 1300) + return false; + const nextX = player.x + player.skateVx * dt; + const index = skateLoops.findIndex((loop) => + Math.min(player.x, nextX) <= loop.x && Math.max(player.x, nextX) >= loop.x && + Math.abs(player.y - floorY) < 30 && Math.abs(player.z) < 90 && + now >= (player.loopCooldownUntil || 0)); + if (index < 0) return false; + player.skateLoop = index; + player.loopAngle = 0; + player.loopSpeed = player.skateVx; + } + const loop = skateLoops[player.skateLoop]; + const angle = player.loopAngle; + player.loopSpeed += (-fallGravity() * Math.sin(angle) + input.horizontal * 500) * dt; + player.loopAngle += player.loopSpeed / loop.radius * dt; + const theta = player.loopAngle; + player.x = loop.x + Math.sin(theta) * loop.radius; + player.y = floorY - loop.radius + Math.cos(theta) * loop.radius; + player.vx = Math.cos(theta) * player.loopSpeed; + player.vy = -Math.sin(theta) * player.loopSpeed; + player.grounded = false; + player.skateRotation = -theta; + const completed = Math.abs(theta) >= Math.PI * 2; + const lostGrip = Math.cos(theta) < 0 && player.loopSpeed ** 2 / loop.radius < + -fallGravity() * Math.cos(theta); + if (completed || lostGrip || !player.skateboard) { + if (completed) { player.x = loop.x + Math.sign(player.loopSpeed) * 12; + player.y = floorY; player.vy = 0; player.grounded = true; } + player.skateVx = player.vx; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = now + 600000; + } + return true; +} + +function skateBoostStep(player, previousX, now) { + if (!skateparkMap || !player.skateboard || !player.grounded || + Math.abs(player.y - terrainFloorAt(player.x)) > 12 || + Math.abs(player.z) > 100 || now < (player.boostUntil || 0)) return; + const pad = skateBoosts.find((pad) => Math.max(previousX, player.x) >= pad.left && + Math.min(previousX, player.x) <= pad.right); + if (!pad) return; + player.skateVx = (Math.sign(player.skateVx) || player.facing) * pad.speed; + player.vx = player.skateVx; + player.boostUntil = now + 350000; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + emitSignal("skate-boost", player.pad, player.facing, pad.speed); + playDrum("whoosh", 1, panPlayer(player)); +} + +function drawSkateParkFeatures() { + if (!skateparkMap || survivalActive()) return; + const visible = (x, radius = 0) => Math.abs(x - cameraCenter) < cameraWidth + radius; + for (const loop of skateLoops) { + if (!visible(loop.x, loop.radius)) continue; + for (let i = 0; i < 96; i++) { + const a = i / 96 * Math.PI * 2, b = (i + 1) / 96 * Math.PI * 2; + for (const z of [-90, 90]) worldCapsule( + loop.x + Math.sin(a) * loop.radius, floorY - loop.radius + Math.cos(a) * loop.radius, z, + loop.x + Math.sin(b) * loop.radius, floorY - loop.radius + Math.cos(b) * loop.radius, z, + 10, [92, 212, 240]); + } + } + for (const pad of skateBoosts) { + if (!visible(pad.left, 240)) continue; + for (let x = pad.left; x < pad.right; x += 40) { + const y = terrainFloorAt(x) - 8; + worldCapsule(x, y, -70, x + 22, y, 0, 9, [255, 212, 66]); + worldCapsule(x + 22, y, 0, x, y, 70, 9, [255, 212, 66]); + } + } + for (const rope of skateRopes) { + if (!visible(rope.x, chainLinks * chainLength)) continue; + worldCapsule(rope.x - 70, rope.y, rope.z, rope.x + 70, rope.y, rope.z, + 18, [108, 130, 150]); + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + worldCapsule(a.x, a.y, rope.z, b.x, b.y, rope.z, 8, + i % 2 ? [220, 225, 236] : [120, 150, 178]); + } + } +} + +function terrainSeed(value) { + let hash = 2166136261; + for (const character of String(value || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967296 * Math.PI * 2; +} +function terrainFloorAt(x) { + if (airRoundActive()) return floorY + 1e9; + // Outside the park the ground is flat, so the walls have something square + // to stand out of and a body pushed past the lip still has a floor. + if (x <= parkLeft) return floorY - parkSegments[0].lift - (parkSegments[0].rise || 0); + if (x >= parkRight) return floorY - + (parkSegments[parkSegments.length - 1].rise || 0) - + parkSegments[parkSegments.length - 1].lift; + for (const segment of parkSegments) { + if (x < segment.left || x > segment.right) continue; + if (segment.kind === "flat") return floorY - segment.lift; + const run = segment.right - segment.left; + // How far up the feature we are, measured from ITS bottom: `dir` says + // which end that is. A transition rising to the right has its flat end on + // the left, and the same arc mirrored has it on the right. + const along = segment.dir > 0 + ? (x - segment.left) / run : (segment.right - x) / run; + if (segment.kind === "bank") + return floorY - segment.lift - segment.rise * along; + // The quarter circle. Centre sits one radius below the flat end, so the + // surface leaves the ground horizontally and arrives at the coping + // vertical — which is the difference between a transition you can pump + // and a ramp you merely climb. + const radius = segment.rise; + const dx = along * radius; + return floorY - segment.lift - + (radius - Math.sqrt(Math.max(0, radius * radius - dx * dx))); + } + return floorY; +} +function terrainTangentAt(x, span = 12) { + const left = terrainFloorAt(clamp(x - span, worldLeft, worldRight)); + const right = terrainFloorAt(clamp(x + span, worldLeft, worldRight)); + return (right - left) / Math.max(1, Math.min(worldRight, x + span) - + Math.max(worldLeft, x - span)); +} +const stageLeft = 0; +let stageRight = 1920; +let stageTop = 112; +// Leave a narrow projection gutter beneath the floor for the screen-edge HUD. +let stageBottom = 930; +let viewHeight = 1080; +let cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); +// `PLATFORM` is the TOWER's single centre platform, and it stays off. It is +// not a general "are there ledges" switch, however much it reads like one: +// the tower hung one slab over a floor, `platformY` still names that slab, +// and a dormant family of tower-era regressions is gated on this constant +// being true. The station's decks are a different object with a different +// shape, so they get their own table below rather than borrowing this flag +// and waking tests that ask whether a tapped hop clears a platform that no +// longer exists. The wind flag rides its own switch and is still off. +const PLATFORM = false; +const WIND_FLAG = false; +const survivalLevelCount = 32; +const survivalStepY = 235; +const survivalCeilingY = floorY - (survivalLevelCount + 2) * survivalStepY; +// A deterministic, hand-tuned zig-zag. Adjacent decks always overlap a +// normal jump's horizontal budget and sit below its 322-unit apex; variation +// comes from where the safe landing moves, not from impossible dice rolls. +// +// These numbers were authored against the cube's 900-unit floor and the +// climb still wants exactly that column of air — so when the station doubled +// the floor's width the ladder was RECENTRED, not respaced. The rung spacing +// is the tuned part; where the column stands is not. `survivalFrameWidth` is +// the cube's old framing kept by the same argument: a lens wide enough for a +// twenty-tile station would shrink the climb to a thread up the middle. +const survivalCenterShift = gridWidth / 2 - 450; +const survivalFrameWidth = 1020; +const survivalCenters = [450, 280, 620, 390, 680, 250, 520, 710]; +const survivalWidths = [470, 390, 420, 360, 440, 380, 410, 370]; +const platforms = Array.from({ length: survivalLevelCount }, (_, index) => { + const center = survivalCenters[index % survivalCenters.length] + + survivalCenterShift; + const width = survivalWidths[index % survivalWidths.length]; + return { level: index + 1, left: center - width / 2, + right: center + width / 2, y: floorY - (index + 1) * survivalStepY }; +}); +// The station's decks. This is the sentence the cube's own comment promised — +// "a tile-authored map is exactly the shape a future rung would be written +// in" — being cashed. The cube had no room for a deck a fighter could stand +// under; twenty by fourteen tiles under station gravity has room for five. +// +// Said in tiles because the map is a lattice: which column a deck starts at, +// which row its surface sits on, how many tiles wide it runs. Two low decks +// out at the flanks, two mid decks pinched toward the middle, one high deck +// straddling the centre line — so the shape of the map is a funnel upward, +// and the fighter who takes the top deck has taken the one place both mid +// decks feed into. +// +// The rows are chosen against one number: 586, the apex station gravity buys +// a held jump. Every step between ADJACENT decks is under it — floor to a low +// deck is 270, low to mid is 360, mid to top is 270 — and every step that +// skips a tier is over it. Floor to a mid deck is 630, and that 630 is the +// whole design: it is what stops the stack from being a straight hop up the +// middle and makes the climb a route instead. Out to a flank, up, back in +// along the mid deck, up again. +// +// This is what the first layout got wrong. Mid decks at row 6 put them 540 +// off the floor — under the apex, so a player could take one straight up and +// `jumpReach` would offer it to a bot, and the flanks stopped meaning +// anything. A deck you can only reach with a perfect double-tap is a deck the +// bots stand under and stare at; a deck you reach by going somewhere first is +// a route; and a deck you can reach from anywhere is not a deck, it is a step. +// Decks over the park, not instead of it. The rows are still priced against +// the 586-unit apex — the flat reaches row 3, row 3 reaches row 7, and the +// floor does NOT reach row 7 at 630 — so the climb keeps its route. What +// changed is that the park is now the interesting way to travel and the decks +// are the high ground above it. The bridge over the halfpipe is reachable +// from the flat beside the bowl and not from the bottom of it, which is the +// point of a bowl. +const parkDeckPlan = [ + { col: 8, row: 5, cols: 5 }, + { col: 15, row: 3, cols: 4 }, + { col: 21, row: 3, cols: 4 }, + { col: 18, row: 7, cols: 4 }, + { col: 31, row: 5, cols: 4 }, +]; +const parkDecks = parkDeckPlan.map((deck, index) => ({ + level: index + 1, + left: gridLeft + deck.col * tileSize, + right: gridLeft + (deck.col + deck.cols) * tileSize, + y: floorY - deck.row * tileSize, +})); +// Two ladders, one machinery. The climb's thirty-two rungs and the station's +// five decks are the same shape and are read by the same four routines, but +// they must never be visible at the same time — a survival runner standing +// on a station deck would be standing on furniture from another map. So the +// mode picks the table, once, and everything downstream asks here. +const activeLedges = () => survivalActive() ? platforms : parkDecks; +// The station's landmarks, by column. On a ten-wide cube a bare `3` was +// readable as "left of centre"; on twenty it is just a digit, and there were +// a dozen of them scattered through spawn, pickup and re-serve code all +// meaning something. Name them once. +// +// The spawns stayed close. It is tempting to open a map four times the size +// by standing the fighters four times as far apart, and it is wrong twice +// over: the opening exchange is the tuned part of this game, and the intro +// camera and the reel's opening lens are both built to travel between two +// faces 270 units apart — spreading the spawns whipped the intro at 207px a +// frame and opened the reel's close lens before the first blow. So the bell +// is unchanged from the cube: two fighters three tiles apart, astride the +// centre line. The map's size is where you GO, not where you start, and the +// corners, the decks and the climb are what spend it. +const spawnColLeft = 18; +const spawnColRight = 21; +// Not corners any more: the ends of this map are quarterpipe transitions, and +// a pistol resting on a vertical wall is a pistol nobody can pick up. These +// are the two flat aprons either side of the park instead — still a run away +// from the bell, still costing you your back to reach. +const cornerColLeft = 5; +const cornerColRight = 34; +const centerX = gridLeft + gridWidth / 2; +const platformsEnabled = () => survivalActive() || parkDecks.length > 0; +// Version-one furniture — the wind flag's pole, the store's demos, the tests — +// still asks for "the platform" by name. In a one-room cube the floor is the +// only platform, so the name now means the whole playable span of it. +const platformLeft = gridLeft; +const platformRight = gridLeft + gridWidth; +const platformY = floorY; +// The surface a thing at (x, y) is standing over: the nearest rung at or below +// it, and the floor when there is no rung. Shadows, pickups and the bot all +// ask this, so a rung that moves takes its furniture with it. +function surfaceYAt(x, y) { + let surface = terrainFloorAt(x); + if (platformsEnabled()) for (const ledge of activeLedges()) + if (ledge.y < surface && ledge.y >= y - 1 && + x >= ledge.left && x <= ledge.right) surface = ledge.y; + return surface; +} +// Which rung a falling thing just crossed, or null. `rise` lifts the contact +// line off the rung by an object's radius and `inset` keeps its edges on the +// span, so one answer serves fighters, grenades and the ball alike — and a +// lattice change lands in all three at once. The highest crossed rung wins, +// because that is the one a fall meets first. +function ledgeCrossed(x, previousY, y, rise = 0, inset = 0) { + if (!platformsEnabled()) return null; + let hit = null; + for (const ledge of activeLedges()) { + const top = ledge.y - rise; + if (previousY > top || y < top) continue; + if (x < ledge.left + inset || x > ledge.right - inset) continue; + if (!hit || ledge.y < hit.y) hit = ledge; + } + return hit; +} +// Resting on a rung rather than falling through one: the ball asks this to +// know whether it is supported and whether it may be booted. +function ledgeSupports(x, y, radius = 0) { + if (!platformsEnabled()) return false; + for (const ledge of activeLedges()) + if (x >= ledge.left + radius && x <= ledge.right - radius && + Math.abs(y - (ledge.y - radius)) <= 2) return true; + return false; +} +const doubleTapUs = 280000; +const doubleTapReleaseUs = 40000; +const roundDurationUs = 90000000; +const roundResultUs = 6000000; +const matchResultUs = 6000000; +const introDurationUs = 3000000; +// A reel gets one branded beat, then motion. Three portrait seconds cost the +// swipe decision before either fighter could move; the live game keeps that +// introduction, while the unattended 9:16 lane reaches the fight inside the +// first second without changing a combat rule. +const reelIntroDurationUs = 650000; +const survivalIntroDurationUs = 900000; +// Keep the close face-off lens through the first exchange. The seeded bots +// meet at about .81s; releasing at the bell made that hit happen as two tiny +// figures at the foot of an empty portrait wall. +const reelOpeningHoldUs = 1350000; +function roundIntroDurationUs() { + if (survivalActive()) return survivalIntroDurationUs; + return reelGroundCamera() ? reelIntroDurationUs : introDurationUs; +} +const dummyGuideDurationUs = 150000000; +const matchWins = 5; +const errorRestartUs = 16000000; +const errorDumpBase = "https://oskiewar.com/api/oskiewar-dump?d="; +const powerupIntervalUs = 10000000; +const shieldRadius = 160; +const shieldForward = 30; +const grenadeBlastDuration = .68; +const grenadeBlastRadius = 620; +// Ground pound. Double-tapping DOWN in the air used to be a plain fast drop +// that did nothing on arrival; now it commits you. Holding DOWN through the +// fall buys speed, the crater scales with how far you actually fell, and the +// landing balls you — so the move is a trade, never a free hit. +const poundLaunchVelocity = 1500; +const poundHoldAcceleration = 5600; +const poundMaxVelocity = 4600; +// Roughly a jump-and-a-half of floor-to-ceiling travel. Falling further than +// this cannot buy a bigger crater, so the ceiling is not a weapon. +const poundFullFall = 900; +// A first-stage landing is deliberately body-sized: the visible ring is the +// attack, not a warning decal for a much larger invisible hit. Repeated DOWN +// taps still grow it, but never into a room-clearing shortcut. +const poundMinRadius = 165; +const poundMaxRadius = 420; +const boosterXs = []; +const boosterRadius = 115; +const boosterVelocity = 6500; +const replayTickUs = 16667; +// The store's demos hold one checkpoint a second — cheap enough to keep +// hundreds of matches. A marketing render replays its demo AS the footage, +// and a fight smoothed through one-second keyframes stops feeling like a +// fight, so the reel factory asks for a checkpoint every simulation tick. +// The dense interval sits just under one true sim step (16666.67us) — at +// exactly one tick the < gate loses the rounding race and records every +// OTHER step, which halves a re-simulation's drift meter. +const replayCheckpointUs = () => + globalThis.__oskiewarDenseReplay ? 16000 : 1000000; +const liveSnapshotIntervalUs = 50000; +const fighterAnimationSpecs = { + // WALK ran a whole stride in 12 ticks — five cycles a second, which the eye + // reads as a vibrating fighter rather than as legs taking steps. Three ticks + // a frame puts the cycle at 600ms, close to a real walk, so the steps count. + IDLE: [72, 3, "BREATHE", true], WALK: [12, 3, "STRIDE", true], + RUN: [10, 1, "RUN", true], MEDITATE: [24, 2, "STILL", true], + DASH: [8, 1, "BURST", true], CROUCH: [8, 1, "TUCK", true], + "AIR CROUCH": [8, 1, "TUCK", true], JUMP: [12, 1, "ASCEND", true], + FALL: [12, 1, "DESCEND", true], PUNCH: [14, 1, "ATTACK", false], + KICK: [14, 1, "ATTACK", false], SHIELD: [12, 2, "GUARD", true], + REACH: [10, 1, "REACH", false], HOLD: [16, 2, "CLUTCH", true], + FIRE: [11, 1, "FIRE", false], THROW: [16, 1, "THROW", false], + WHIP: [11, 1, "ATTACK", false], BASH: [17, 1, "ATTACK", false], + HIT: [10, 1, "STUN", false], POGO: [12, 1, "BOUNCE", true], + "CROUCH HOP": [8, 1, "HOP", true], SINK: [10, 1, "SINK", true], + KO: [16, 2, "BREAK", false], +}; +// Every melee kind in one table: how far the limb reaches at rest and at full +// extension, how long each of its two bones is (the real reach ceiling), how +// high it lands, how wide it reads against the ball, how long the hitbox +// lives, and what it does on contact. A loaded hand cannot make a clean fist, +// so an item swing is its own kind rather than a punch modifier — a pistol +// lengthens the arm into a fast light lash, a grenade shortens it into a club. +// A blade in the item hand stretches every hand strike. Kicks are legs. +const meleeSpecFor = (player, kind) => { + const spec = meleeSpecs[kind] || meleeSpecs.PUNCH; + if (unarmedRoundActive() || !player?.swordHeld || kind === "KICK") return spec; + return { ...spec, reach: spec.reach * 1.5, span: spec.span * 1.45, + swell: spec.swell * 1.3, force: spec.force * 1.15 }; +}; +const meleeSpecs = { + PUNCH: { reach: 58, swell: 50, span: 58, height: 115, radius: 28, + windowUs: 220000, force: 1200, lift: 140, + cue: ["snare", 1.05], thud: ["block", 1] }, + KICK: { reach: 75, swell: 62, span: 74, height: 55, radius: 35, + windowUs: 220000, force: 1550, lift: 220, + cue: ["kick", 1.05], thud: ["block", 1] }, + WHIP: { reach: 92, swell: 74, span: 76, height: 122, radius: 24, + windowUs: 190000, force: 1000, lift: 110, + cue: ["whoosh", 1.15], thud: ["hat", 1.35] }, + BASH: { reach: 62, swell: 40, span: 58, height: 108, radius: 40, + windowUs: 280000, force: 1750, lift: 210, + cue: ["kick", 1.3], thud: ["kick", 1.4] }, +}; +// One lookup serves both Y and the loaded punch, so the thing you can see in +// the fighter's hand is always the thing that fires and the thing that swings. +const itemMelee = { GUN: "WHIP", GRENADE: "BASH" }; +const instantReplayStepUs = 33333; +// Replay speed ramping: how far a full-force hit drags the playhead down, how +// many frames of warning the ramp gets, and how fast the speed itself may +// change — the last one is what keeps a slowdown from reading as a stutter. +const replaySlowest = .18; +const replayActionLead = 8; +const replayRampPerSecond = 3.2; +const instantReplayMaxFrames = 240; +// Legs, slowed about a sixth on @jeffrey's ear. The station is twice the +// cube's width, and the first thing a bigger floor does is make a fighter +// read as skating across it -- the same stride that felt urgent crossing 900 +// units looks weightless crossing 1,800. Every number here moved by the same +// fraction, including the acceleration, so time-to-top-speed is unchanged and +// only the ground covered is: a run still winds up over the same beat. +// +// This is load-bearing beyond feel. `jumpReach` prices a bot's jump in +// walkSpeed, so the arcs it will commit to narrow with the stride, and the +// deck spacing above stays exactly as reachable as it was. +// What a pump is worth, and how much upward speed a lip has to be giving you +// before it counts as an air rather than a bump. The launch floor exists so +// rolling over a gentle crest does not pop a rider off the ground every time. +const skatePumpAcceleration = 2600; +const skateLaunchFloor = 380; +const walkSpeed = 880; +const runStartSpeed = 1100; +const runTopSpeed = 1950; +const runAcceleration = 690; +// Vertical feel. The apex is the design constant — how high a fighter can +// reach never changed — so every impulse here is paired with a gravity that +// spends less time getting there. Rise is lighter than fall so the arc reads +// as intent going up and commitment coming down. +const riseGravityFull = 4800; +const fallGravityFull = 7200; +// Station gravity. The space map spins up a little over half a G, and that +// one number is what makes the floating decks a place you can go: at full +// weight a jump tops out at 322 units — three and a half tiles — and the +// lowest deck sits three tiles up with nothing above it worth reaching. At +// .55 the apex is 586, so the deck stack overhead is climbable on legs, a +// knocked fighter sails instead of dropping, and the hover board's airtime +// becomes the traversal it is for. The climb keeps full weight: survival's +// thirty-two rungs are spaced against the 322 apex, and floating that run +// would let a runner skip rungs the ladder exists to make them earn. +const spaceGravityScale = .55; +const gravityScale = () => survivalActive() ? 1 : spaceGravityScale; +const riseGravity = () => riseGravityFull * gravityScale(); +const fallGravity = () => fallGravityFull * gravityScale(); +const jumpVelocity = 1760; +const crouchJumpVelocity = 1960; +const ultraJumpVelocity = 3960; +const crouchHopVelocity = 980; +const pogoBounceVelocity = 2100; +const headBounceVelocity = 1100; +const jumpAnticipationUs = 50000; +// Letting go of up mid-rise snips the arc: a tap is a hop, a hold is a jump. +const jumpCutScale = .55; +const jumpPoseUs = 75000; +const crouchJumpPoseUs = 145000; +const crouchHopPoseUs = 190000; +const sinkDurationUs = 250000; +const hudTypeSize = 42; +// The command stream is a record of what you just did, so it is long enough to +// hold a whole exchange and it does not start dissolving while you are still +// playing. Only once the pad goes quiet does it age out, oldest glyph first, +// so the last thing you pressed is the last thing to leave. +const commandStreamDepth = 20; +const commandStreamRows = 5; +const commandStreamColumns = 8; +const commandStreamColumnsNow = () => compactLayout() ? 4 : commandStreamColumns; +const commandStreamTypeSize = (handleSize) => Math.max(18, + Math.round(handleSize * (compactLayout() ? .8 : .88))); +const commandHoldUs = 1100000; +const commandFadeUs = 1900000; +const replayButtons = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", + "A", "B", "X", "Y"]; +let cameraCenter = (worldLeft + worldRight) / 2; +let cameraWidth = worldRight - worldLeft; +let cameraCenterY = floorY - cameraWidth / cameraAspect / 2; +let cameraContainFloor = 0; +// What the containment floor was last frame, so its rate of growth can be +// measured. See `updateCameraDoll` — the doll eases toward the floor, and an +// ease that is not led always sits behind a target that keeps moving. +let previousContainmentWidth = 0; +// Two different distances, because they answer two different questions. +// +// `cameraPin` is where a single projected point stops being allowed to get any +// nearer. Nothing can clip a point — a shadow ellipse or a capsule end is one +// coordinate, not a face — so the best available answer is to hold it at a +// sane depth and accept that a thing behind the lens is drawn wrong. This is +// the distance the projection has always used. +const cameraPin = 80; +// `cameraNear` is the real near plane, and faces are cut at it. It is much +// closer than the pin on purpose. The cut is a straight line at constant +// depth, and where that line lands on screen is decided by how much the lens +// magnifies at the plane -- and this lens is only a tenth perspective in +// normal play, which dilutes that magnification tenfold. Clipping the floor at +// the pin distance put its cut line just inside the bottom of the frame and +// opened a band of sky under the fighters' feet. Ten times nearer drives the +// cut off screen for any camera that is meaningfully above the floor, and the +// coordinates it asks for in exchange are what the guard band is for. +const cameraNear = 8; +// World projection occupies [-1.4, 1.4]; the photo must stay behind even +// distant AIR DROP fighters. Native sprite depth accepts [-1.5, 1.5]. +const photoBackdropDepth = 1.49; +// Projected faces are cut to a band one viewport wide on every side before +// they are handed over. The scene is allowed to run off screen; it is not +// allowed to run off into coordinates the rasterizer cannot hold, which is +// what a vertex sitting on the near plane will otherwise ask for. +const guardBand = 1; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); +const mixColor = (dark, light, amount) => dark.map((value, index) => + Math.round(value + (light[index] - value) * amount)); +const lerp = (from, to, amount) => from + (to - from) * amount; +const normalize3 = (point) => { + const length = Math.hypot(point.x, point.y, point.z) || 1; + return { x: point.x / length, y: point.y / length, z: point.z / length }; +}; +const globalLight = normalize3({ x: -.42, y: 1, z: -.28 }); +const cross3 = (a, b) => ({ x: a.y * b.z - a.z * b.y, + y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }); +const dot3 = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z; +const viewWidth = () => stageRight; +const viewCenterX = () => (stageLeft + stageRight) / 2; +const viewOffsetX = () => (stageRight - 1920) / 2; +const compactLayout = () => stageRight < 1500; +// Keep the HUD inside a traditional five-percent title-safe frame. On a +// 16:9 television this is deliberately deeper than the action-safe camera so +// a bezel, soundbar, or object in front of the screen does not hide status. +const hudSafeInset = () => clamp( + Math.round(Math.min(stageRight, viewHeight) * .05), + compactLayout() ? 24 : 48, 72); +const hudSafeRect = () => { + // The title-safe hedge and a hardware occlusion answer different threats, + // and only the deeper one matters at each edge: a bezel might hide the + // frame's rim, a notch definitely does. + const inset = hudSafeInset(); + return { left: stageLeft + Math.max(inset, viewInset.left + 14), + top: Math.max(inset, viewInset.top + 10), + right: stageRight - Math.max(inset, viewInset.right + 14), + bottom: viewHeight - Math.max(inset, viewInset.bottom + 10) }; +}; +const actionSafeRect = () => { + // A television is watched across a room behind a bezel; a reel is held at + // arm's length with nothing over its edges, so the action-safe frame there is + // a courtesy rather than a hedge against overscan. + const portrait = stageBottom - stageTop > stageRight - stageLeft; + // A landscape notch bites into the stage's own sides; fighters framed + // behind it are as lost as fighters past the edge. + const marginX = (portrait ? 18 : (compactLayout() ? 34 : 64)) + + Math.max(viewInset.left, viewInset.right); + const marginY = portrait ? 14 : 26; + return { left: stageLeft + marginX, top: stageTop + marginY, + right: stageRight - marginX, bottom: stageBottom - marginY }; +}; + +// The device's own occlusions, in game units: a phone's home indicator, a +// notch, rounded corners. The host measures them (env() on the web, native +// injection in the iOS shell, where a pinned scroll view zeroes env() out) +// and hands them through gameView; everything drawn against a screen edge — +// the stage bounds, the HUD safe frame, the touch clusters — stands off by +// them, because a control under the home indicator is a control the system +// swallows. +let viewInset = { top: 0, right: 0, bottom: 0, left: 0 }; + +function syncGameView() { + const next = typeof gameView === "function" ? gameView() : null; + const width = clamp(Math.round(Number(next?.width) || 1920), 480, 2880); + const height = clamp(Math.round(Number(next?.height) || 1080), 480, 2160); + const nextInset = {}; + for (const edge of ["top", "right", "bottom", "left"]) + nextInset[edge] = clamp(Math.round(Number(next?.inset?.[edge]) || 0), + 0, 220); + const inputFamily = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + const touch = inputFamily === "touch"; + const compact = width < 1500; + const inset = compact ? 22 : 30; + const nextTop = Math.max(82, inset + hudTypeSize + 16) + nextInset.top; + const bottomReserve = (touch + ? clamp(height * .36, 300, 390) + : clamp(height * .13, 112, 150)) + nextInset.bottom; + const nextBottom = Math.max(nextTop + 280, height - bottomReserve); + if (width === stageRight && height === viewHeight && + nextTop === stageTop && nextBottom === stageBottom && + ["top", "right", "bottom", "left"].every((edge) => + nextInset[edge] === viewInset[edge])) return; + stageRight = width; + viewHeight = height; + stageTop = nextTop; + stageBottom = nextBottom; + viewInset = nextInset; + cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); + if (typeof cameraDoll !== "undefined") cameraDoll.dirty = true; +} + +class FightCamDoll { + constructor() { + this.position = { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.4 }; + this.target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + this.width = cameraWidth; + this.perspective = 0; + this.fov = 55; + this.roll = 0; + this.dirty = true; + this.view = null; + } + + track(spec, dt, speed = 5) { + // Exponential easing is continuous across frame rates. Move the dolly and + // its look target together so follow motion cannot shear into a sudden + // swivel when fighters cross a framing threshold. + const amount = 1 - Math.exp(-Math.max(0, dt) * speed); + const previousTarget = { ...this.target }; + for (const axis of ["x", "y", "z"]) + this.target[axis] = lerp(this.target[axis], spec.target[axis], amount); + for (const axis of ["x", "y", "z"]) + this.position[axis] += this.target[axis] - previousTarget[axis]; + for (const axis of ["x", "y", "z"]) { + this.position[axis] = lerp(this.position[axis], spec.position[axis], amount); + } + // Pull back promptly but never in a single frame; return close more + // slowly so small changes at the action-safe edge do not pump the lens. + const zoomSpeed = spec.width > this.width ? speed * 1.9 : speed * .58; + const zoomAmount = 1 - Math.exp(-Math.max(0, dt) * zoomSpeed); + this.width = lerp(this.width, spec.width, zoomAmount); + this.perspective = lerp(this.perspective, spec.perspective, amount); + this.fov = lerp(this.fov, spec.fov || 55, amount); + this.roll = lerp(this.roll, spec.roll || 0, amount); + this.dirty = true; + } + + snap(spec) { + this.target = { ...spec.target }; + this.position = { ...spec.position }; + this.width = spec.width; + this.perspective = spec.perspective; + this.fov = spec.fov || 55; + this.roll = spec.roll || 0; + this.dirty = true; + collapseRenderCameraInterpolation(); + } + + prepare() { + const forward = normalize3({ x: this.target.x - this.position.x, + y: this.target.y - this.position.y, z: this.target.z - this.position.z }); + const baseRight = normalize3(cross3(forward, { x: 0, y: -1, z: 0 })); + const baseUp = normalize3(cross3(baseRight, forward)); + const rollCos = Math.cos(this.roll); + const rollSin = Math.sin(this.roll); + const right = { x: baseRight.x * rollCos + baseUp.x * rollSin, + y: baseRight.y * rollCos + baseUp.y * rollSin, + z: baseRight.z * rollCos + baseUp.z * rollSin }; + const up = { x: baseUp.x * rollCos - baseRight.x * rollSin, + y: baseUp.y * rollCos - baseRight.y * rollSin, + z: baseUp.z * rollCos - baseRight.z * rollSin }; + this.view = { forward, right, up, + centerX: (stageLeft + stageRight) / 2, + centerY: (stageTop + stageBottom) / 2, + orthoScale: (stageRight - stageLeft) / this.width, + focal: (stageRight - stageLeft) / + (2 * Math.tan(this.fov * Math.PI / 360)) }; + this.dirty = false; + } + + // World space to camera space, with the near distance left alone. Anything + // that wants to survive contact with the near plane has to see the honest + // depth first — `project` is where it gets clamped, and a clamp is a lie for + // anything behind the lens. + toView(point, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { forward, right, up } = this.view; + const x = point.x - this.position.x, y = point.y - this.position.y; + const z = point.z - this.position.z; + out.x = x * right.x + y * right.y + z * right.z; + out.y = x * up.x + y * up.y + z * up.z; + out.z = x * forward.x + y * forward.y + z * forward.z; + return out; + } + + projectView(view, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { centerX, centerY, orthoScale, focal } = this.view; + const depth = Math.max(cameraNear, view.z); + const orthoX = centerX + view.x * orthoScale; + const orthoY = centerY - view.y * orthoScale; + const perspectiveX = centerX + view.x * focal / depth; + const perspectiveY = centerY - view.y * focal / depth; + out.x = lerp(orthoX, perspectiveX, this.perspective); + out.y = lerp(orthoY, perspectiveY, this.perspective); + // Preserve depth ordering beyond the old 16k cutoff. A hard clamp made + // distant walls, floors and fighters coplanar during wide result shots. + out.z = depth <= 12000 ? depth / 16000 * 2.8 - 1.4 + : .7 + .7 * (depth - 12000) / (depth - 8000); + return out; + } + + // A lone point cannot be clipped, so it is held at the pin rather than + // allowed to divide by a depth it does not have. Faces go through + // `worldTriangle`, which cuts them at the near plane and then comes back + // here with vertices that are already in front of it. + project(point) { + const view = this.toView(point); + view.z = Math.max(cameraPin, view.z); + return this.projectView(view); + } +} + +const cameraDoll = new FightCamDoll(); +const cameraScale = () => (stageRight - stageLeft) / cameraDoll.width; +let playerCameraYaw = 0; +let playerCameraPitch = 0; +// A multiplier on the framed width, so zoom rides on top of automatic framing +// rather than fighting it: the camera still guarantees both fighters are in +// shot, and this scales the result. Above 1 is wider. The ceiling is low on +// purpose -- a wide shot draws a wider span of terrain, and span IS the frame +// budget on a console whose JS never gets a JIT. +let playerCameraZoom = 1; +let triangleDepth = -1.4; +// A match frame submits ~2100 faces. Buffering them into a Float32Array first +// cost 5.7ms a frame where handing each one straight over costs 1.8ms — +// twelve typed-array element writes in QuickJS are dearer than twelve +// arguments to one C call. The batched host call itself measured 0.05ms, so +// the boundary crossing was never the expense. +const emitTriangle = typeof triangle3d === "function" ? triangle3d + : (x1, y1, z1, x2, y2, z2, x3, y3, z3, r, g, b) => + triangle(x1, y1, x2, y2, x3, y3, r, g, b); +// r/g/b stay positional so the hottest path in the piece doesn't build a rest +// array per face; the host defaults every missing channel to 255 the same way. +// +// The native buffer speaks int16: a coordinate past ±32768 — or the NaN a +// projection returns after crossing the camera plane — is a RangeError and a +// dead frame on console. Geometry that broken was never going to be visible, +// so the seam culls it instead of crashing. NaN fails a comparison on its +// own, which keeps the guard to plain compares on the hottest path. +const triangleSafe = (value) => value > -32200 && value < 32200; +function screenTriangle(x1, y1, x2, y2, x3, y3, r = 255, g = 255, b = 255) { + if (!(triangleSafe(x1) && triangleSafe(y1) && triangleSafe(x2) && + triangleSafe(y2) && triangleSafe(x3) && triangleSafe(y3))) return; + emitTriangle(x1, y1, triangleDepth, x2, y2, triangleDepth, + x3, y3, triangleDepth, r, g, b); +} +function screenRect(x, y, width, height, color) { + const [r, g, b] = color; + screenTriangle(x, y, x + width, y, x + width, y + height, r, g, b); + screenTriangle(x, y, x + width, y + height, x, y + height, r, g, b); +} +// On the native shell `box` and `line` are CPU-composited UNDER every GPU +// triangle — App.cpp paints rects, lines and block text into the CPU frame, +// uploads that as the scene texture, then draws the depth pass over it — so +// the frame meter, keycaps, clock and bot scaffolding sank behind the +// fighters and terrain. @jeffrey on the console, 2026-09-20: "the frame +// counter and stuff in the debug ui ... feels like its behind stuff". HUD +// boxes and lines ride the triangle pass there, at a depth in front of any +// body (bodies bottom out near -1.42; the shell maps (z + 1.5) / 3 into the +// depth buffer, LESS_EQUAL). The web shell keeps box/line as they were. +const nativeTrianglePass = typeof triangle3d === "function"; +// Native AC can composite diagnostic lines and rectangles after the scene. +let nativeHudOverlay = false; +const hudDepth = -1.48; +function hudBox(x, y, width, height, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { box(x, y, width, height, ...color); return; } + const previous = triangleDepth; + triangleDepth = hudDepth; + screenRect(x, y, width, height, color); + triangleDepth = previous; +} +function hudLine(x1, y1, x2, y2, width, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy) || 1; + const nx = -dy / length * Math.max(1, width) / 2; + const ny = dx / length * Math.max(1, width) / 2; + const previous = triangleDepth; + triangleDepth = hudDepth; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x2 + nx, y2 + ny, x2 - nx, y2 - ny, r, g, b); + screenTriangle(x1 + nx, y1 + ny, x2 - nx, y2 - ny, x1 - nx, y1 - ny, r, g, b); + triangleDepth = previous; +} +function hudWorldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + hudLine(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} +function hudCircle(x, y, radius, width, color) { + let lastX = x + radius, lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + hudLine(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; lastY = nextY; + } +} +function screenStrokeRect(x, y, width, height, thickness, color) { + screenRect(x, y, width, thickness, color); + screenRect(x, y + height - thickness, width, thickness, color); + screenRect(x, y + thickness, thickness, height - thickness * 2, color); + screenRect(x + width - thickness, y + thickness, + thickness, height - thickness * 2, color); +} +function projectedTriangle(a, b, c, color) { + if (!(triangleSafe(a.x) && triangleSafe(a.y) && triangleSafe(a.z) && + triangleSafe(b.x) && triangleSafe(b.y) && triangleSafe(b.z) && + triangleSafe(c.x) && triangleSafe(c.y) && triangleSafe(c.z))) return; + // Positional, not spread: see the note on emitTriangle above. Every face a + // frame submits comes through here, and `...color` built one throwaway + // iterator apiece for ~2100 of them. + emitTriangle(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z, + color[0], color[1], color[2]); +} +// Sutherland-Hodgman, one plane at a time. Both clips below are the same walk: +// step the polygon's edges, keep the vertices that are inside, and whenever an +// edge crosses out or in, keep the crossing point too. +function clipPolygon(polygon, distance, mix) { + const kept = []; + for (let index = 0; index < polygon.length; index++) { + const current = polygon[index]; + const next = polygon[(index + 1) % polygon.length]; + const here = distance(current); + const there = distance(next); + if (here >= 0) kept.push(current); + if ((here >= 0) !== (there >= 0)) + kept.push(mix(current, next, here / (here - there))); + } + return kept; +} +const mixVertex = (a, b, amount) => ({ x: lerp(a.x, b.x, amount), + y: lerp(a.y, b.y, amount), z: lerp(a.z, b.z, amount) }); +// The near plane, in camera space, before the divide. This is the whole point: +// a vertex behind the lens has a negative depth, and pinning it to the near +// distance keeps its sideways offset while dividing by a distance it never +// had — so a face that crosses the plane used to shear halfway across the +// screen, or blow past the coordinate guard and vanish outright. Cutting it at +// the plane leaves only geometry that is honestly in front of the camera. +const clipViewNear = (polygon) => + clipPolygon(polygon, (vertex) => vertex.z - cameraNear, mixVertex); +// And the guard band, in screen space, after it. A vertex sitting exactly on +// the near plane projects to focal/near times its offset — twenty-three times, +// at this lens — so a legitimately visible floor can still ask for coordinates +// far outside anything the rasterizer will take. Cut it to a band a viewport +// wide instead of dropping the face and leaving a hole in the ground. +// The four band edges live at module scope over mutable bounds instead of +// being rebuilt as an array of closures per face — the walls cross the band +// every frame, and that little array was steady interpreter garbage. +let bandMinX = 0, bandMaxX = 0, bandMinY = 0, bandMaxY = 0; +const bandEdges = [ + (vertex) => vertex.x - bandMinX, + (vertex) => bandMaxX - vertex.x, + (vertex) => vertex.y - bandMinY, + (vertex) => bandMaxY - vertex.y, +]; +function clipScreenBand(polygon) { + const width = viewWidth(); + bandMinX = -width * guardBand; + bandMaxX = width * (1 + guardBand); + bandMinY = -viewHeight * guardBand; + bandMaxY = viewHeight * (1 + guardBand); + let clipped = polygon; + for (const distance of bandEdges) { + if (clipped.length < 3) return []; + clipped = clipPolygon(clipped, distance, mixVertex); + } + return clipped; +} +// One world-space face, all the way through: to camera space, cut at the near +// plane, projected, cut to the guard band, then fanned into whatever triangles +// are left. Zero of them is a face entirely behind the camera, which is a +// perfectly good answer. +// Whether a projected vertex already sits inside the guard band. A NaN fails +// every compare, so a broken projection falls through to the clipper. +function bandContains(vertex) { + const width = viewWidth(); + return vertex.x >= -width * guardBand && vertex.x <= width * (1 + guardBand) && + vertex.y >= -viewHeight * guardBand && + vertex.y <= viewHeight * (1 + guardBand); +} +// Scratch vertices never escape synchronous face submission or clipping. +const triangleView = [{}, {}, {}]; +const triangleScreen = [{}, {}, {}]; +function worldTriangle(a, b, c, color) { + const viewA = cameraDoll.toView(a, triangleView[0]); + const viewB = cameraDoll.toView(b, triangleView[1]); + const viewC = cameraDoll.toView(c, triangleView[2]); + // Nearly every face a frame submits sits whole in front of the lens and + // whole inside the guard band, and the console's interpreter was paying + // for six array allocations per face on the way to discovering that. + // Plain compares decide the common case; only a face that actually + // crosses a plane pays for the Sutherland-Hodgman walk. + if (viewA.z >= cameraNear && viewB.z >= cameraNear && viewC.z >= cameraNear) { + const pa = cameraDoll.projectView(viewA, triangleScreen[0]); + const pb = cameraDoll.projectView(viewB, triangleScreen[1]); + const pc = cameraDoll.projectView(viewC, triangleScreen[2]); + if (bandContains(pa) && bandContains(pb) && bandContains(pc)) { + projectedTriangle(pa, pb, pc, color); + return; + } + const banded = clipScreenBand([pa, pb, pc]); + for (let corner = 2; corner < banded.length; corner++) + projectedTriangle(banded[0], banded[corner - 1], banded[corner], color); + return; + } + const near = clipViewNear([viewA, viewB, viewC]); + if (near.length < 3) return; + const projected = near.map((vertex) => cameraDoll.projectView(vertex)); + if (projected.some((point) => !Number.isFinite(point.x) || + !Number.isFinite(point.y))) return; + // A near-plane fan can be a quad; fanning it before the band clip would + // clip the same interior edge twice, so the band takes the whole polygon. + const face = clipScreenBand(projected); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], color); +} +function projectPoint(x, y, z = 0) { + return cameraDoll.project({ x, y, z }); +} +const panAt = (x, z = 0) => clamp( + (projectPoint(x, cameraCenterY, z).x - viewCenterX()) / + Math.max(1, (stageRight - stageLeft) / 2 - 55), -1, 1); +const panPlayer = (player) => panAt(player.x, player.z); +let visualTheme = { light: 0, sunset: 0 }; + +const fighterRoster = [ + { handle: "@JEFFREY", color: [190, 42, 58], colors: [ + [255,105,190],[111,232,210],[255,105,190],[255,232,92], + [130,150,255],[255,105,190],[111,232,210],[255,232,92]], + mood: "New Media Instruments", + lastChat: "hmm this chat could use some ui love" }, + { handle: "@FIFI", color: [209, 100, 216], colors: [ + [209,100,216],[204,253,71],[35,100,255],[82,67,17],[5,249,137]], + mood: "nap", lastChat: "" }, + { handle: "@OSKIE", color: [38, 82, 176], colors: [ + [255,232,92],[255,105,190],[111,232,210],[255,232,92],[130,150,255],[255,105,190]], + mood: "", lastChat: "" }, + { handle: "@SAT", color: [130, 204, 213], colors: [ + [130,204,213],[161,232,0],[253,122,2],[222,90,205]], + mood: "i hope its not ai generated", lastChat: "meow" }, +]; +// Per-glyph color is how a community @handle carries its owner's identity. +// The house opponents are not people, so they hold one flat color each and +// let the glyph walk fall back to it. +const npcFighter = { handle: "DUMMY", color: [105, 125, 150], colors: [], + mood: "TRAINING DUMMY · NO BOT AI", lastChat: "" }; +const anonymousFighter = { handle: "", color: [72, 176, 156], colors: [ + [72,176,156],[118,214,188],[54,128,168],[230,205,92]], + mood: "ANONYMOUS", lastChat: "" }; +const spiderDummyFighter = { handle: "SPIDERDUMMY", color: [76, 88, 108], + colors: [], mood: "GIANT SEGMENTED TRAINING FOE · NO BOT AI", lastChat: "" }; +const botFighter = { handle: "BOT", color: [205, 48, 72], colors: [], + mood: "ANGRY TRAINING BOT", lastChat: "" }; +const peopleFighter = { handle: "PPL", color: [116, 122, 136], colors: [], + mood: "", lastChat: "" }; +// Self-play needs two nameplates nobody can mix up, or the result card reads +// "BOT WINS" with no way to tell which bot won. The colors here are only the +// fallback — each round deals fresh ones from the CSS color book below. +const selfPlayFighters = [ + { handle: "BOT 1", color: [205, 48, 72], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, + { handle: "BOT 2", color: [48, 118, 205], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, +]; + +// Self-play dresses its bots from the CSS color book instead of the house +// red and blue. The picks hash out of the round name, so the offline replay +// that repaints a reel deals the same pairing the live pass wore, and every +// round is a fresh matchup. The book carries only names that can hold a +// nameplate on either theme — the washed-out and near-black entries stay +// home — and the second pick stands off a sixth of the color wheel from the +// first so the result card never reads as a mirror match. +const cssColorBook = ("crimson dc143c,firebrick b22222,red ff0000," + + "orangered ff4500,tomato ff6347,coral ff7f50,darkorange ff8c00," + + "orange ffa500,gold ffd700,goldenrod daa520,darkgoldenrod b8860b," + + "yellowgreen 9acd32,chartreuse 7fff00,lawngreen 7cfc00,limegreen 32cd32," + + "forestgreen 228b22,green 008000,seagreen 2e8b57,mediumseagreen 3cb371," + + "springgreen 00ff7f,mediumspringgreen 00fa9a,lightseagreen 20b2aa," + + "teal 008080,darkcyan 008b8b,darkturquoise 00ced1,turquoise 40e0d0," + + "mediumturquoise 48d1cc,cadetblue 5f9ea0,deepskyblue 00bfff," + + "dodgerblue 1e90ff,cornflowerblue 6495ed,steelblue 4682b4," + + "royalblue 4169e1,blue 0000ff,mediumblue 0000cd,darkslateblue 483d8b," + + "slateblue 6a5acd,mediumslateblue 7b68ee,mediumpurple 9370db," + + "blueviolet 8a2be2,darkviolet 9400d3,darkorchid 9932cc," + + "mediumorchid ba55d3,orchid da70d6,violet ee82ee,magenta ff00ff," + + "mediumvioletred c71585,deeppink ff1493,hotpink ff69b4," + + "palevioletred db7093,indianred cd5c5c,salmon fa8072,darksalmon e9967a," + + "lightcoral f08080,rosybrown bc8f8f,sienna a0522d,chocolate d2691e," + + "peru cd853f,sandybrown f4a460,olivedrab 6b8e23,olive 808000," + + "darkkhaki bdb76b,rebeccapurple 663399,aquamarine 7fffd4," + + "mediumaquamarine 66cdaa,lightgreen 90ee90,skyblue 87ceeb," + + "lightskyblue 87cefa,plum dda0dd,khaki f0e68c,greenyellow adff2f," + + "yellow ffff00,cyan 00ffff,lime 00ff00").split(",").map((entry) => { + const [name, hex] = entry.split(" "); + const value = parseInt(hex, 16); + return { name, rgb: [value >> 16 & 255, value >> 8 & 255, value & 255] }; + }).filter(({ rgb }) => { + const high = Math.max(...rgb); + const low = Math.min(...rgb); + return high - low >= 60 && high + low >= 140 && high + low <= 400; + }); + +const hueOf = ([red, green, blue]) => { + const high = Math.max(red, green, blue); + const low = Math.min(red, green, blue); + const span = high - low || 1; + const sixth = high === red ? (green - blue) / span + : high === green ? 2 + (blue - red) / span : 4 + (red - green) / span; + return (sixth * 60 + 360) % 360; +}; + +function selfPlayWardrobe(pad) { + if (typeof globalThis.__oskiewarJevPad === 'function') + return { name: pad === 0 ? 'JEV PINK' : 'JEV BLUE', rgb: pad === 0 ? [255, 90, 170] : [65, 195, 255] }; + const round = matchName || seriesName; + const first = cssColorBook[Math.floor( + hashUnit(round + " one") * cssColorBook.length) % cssColorBook.length]; + if (pad === 0) return first; + const start = Math.floor(hashUnit(round + " two") * cssColorBook.length); + for (let step = 0; step < cssColorBook.length; step++) { + const pick = cssColorBook[(start + step) % cssColorBook.length]; + const apart = Math.abs(hueOf(pick.rgb) - hueOf(first.rgb)); + if (Math.min(apart, 360 - apart) >= 60) return pick; + } + return cssColorBook[(start + 1) % cssColorBook.length]; +} + +function losAngelesSun() { + const radians = Math.PI / 180; + const days = Date.now() / 86400000 + 2440587.5 - 2451545; + const meanLongitude = (280.46 + .9856474 * days) % 360; + const meanAnomaly = (357.528 + .9856003 * days) % 360; + const eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly * radians) + + .02 * Math.sin(2 * meanAnomaly * radians); + const obliquity = 23.439 - .0000004 * days; + const rightAscension = Math.atan2(Math.cos(obliquity * radians) * + Math.sin(eclipticLongitude * radians), Math.cos(eclipticLongitude * radians)) / + radians; + const declination = Math.asin(Math.sin(obliquity * radians) * + Math.sin(eclipticLongitude * radians)); + const siderealHours = 18.697374558 + 24.06570982441908 * days; + let hourAngle = ((siderealHours * 15 - 118.2437 - rightAscension + 540) % 360) - 180; + const latitude = 34.0522 * radians; + const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) + + Math.cos(latitude) * Math.cos(declination) * + Math.cos(hourAngle * radians)) / radians; + const light = clamp((altitude + 6) / 14, 0, 1); + const sunset = clamp(1 - Math.abs(altitude - 1) / 11, 0, 1) * + (hourAngle > 0 ? 1 : .42); + return { light: light * light * (3 - 2 * light), sunset }; +} + +function displayTheme() { + if (globalThis.__oskiewarTheme === "dark") return {light:0, sunset:0}; + const sun = losAngelesSun(); + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.platform === "web" || caps.platform === "macos") { + return { ...sun, light: caps.colorScheme === "light" ? 1 : 0 }; + } + return sun; +} +// Nameless until somebody says who they are. These two used to boot as +// @JEFFREY and @OSKIE — the first and third entries of the local roster — and +// every path that failed to learn a real identity quietly fell through to +// them. That is how an anonymous visitor alone in a dead room was shown +// "@JEFFREY vs @OSKIE" and told "YOU ARE @OSKIE — RIGHT SIDE". An empty name +// is the honest state and the wire already speaks it: spectatorState sends "" +// as NOBODY, and the HUD reads it as "THE SECOND FIGHTER". +const players = [ + { name: "", rosterIndex: -1, handleColors: anonymousFighter.colors, + // Spawn marks stand on the centers of tiles 3 and 6 — mirrored across + // the cube's middle, three tiles from the pistol's corner. Three + // matters: a pickup takes any limb within 90, a standing fighter's arms + // reach most of a tile past the mark, and two tiles of gap was close + // enough that the bell handed the weapon out before anyone moved. + pad: 0, spawnX: tileCenterX(spawnColLeft), x: tileCenterX(spawnColLeft), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: 1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: anonymousFighter.color.slice(), hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: 1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, + { name: "", rosterIndex: -1, handleColors: [], + npc: false, bot: false, remote: false, + pad: 1, spawnX: tileCenterX(spawnColRight), x: tileCenterX(spawnColRight), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: -1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: [38, 82, 176], hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: -1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, +]; +const thirdPlayerTemplate = JSON.stringify(players[1]); +const freeForAll = () => localVersusActive() && players.length === 3; +const rivalsOf = (player) => players.filter((other) => + other !== player && other.alive).sort((a, b) => + Math.hypot(a.x - player.x, a.y - player.y, a.z - player.z) - + Math.hypot(b.x - player.x, b.y - player.y, b.z - player.z)); +const nearestRival = (player) => rivalsOf(player)[0] || + players.find((other) => other !== player); +function roundWinner() { + const contenders = freeForAll() ? players.filter((player) => player.alive) : players; + if (freeForAll() && contenders.length <= 1) return contenders[0] || null; + const best = Math.max(...contenders.map((player) => player.score)); + const leaders = contenders.filter((player) => player.score === best); + return leaders.length === 1 ? leaders[0] : null; +} +function setLocalPlayerCount(count) { + if (count === 3 && players.length === 2) { + const third = JSON.parse(thirdPlayerTemplate); + third.pad = 2; + players.push(third); + frameMeters.push([]); + } else if (count === 2) { + players.length = 2; + frameMeters.length = 2; + } +} +// Who the camera, the scorekeeping and the reactions believe is on stage. +// Survival and the versus lobby are both one-body rooms — the second chair +// is parked off the map until somebody takes it. +const activePlayers = () => + survivalActive() || lobbyActive() ? [players[0]] : players; +const impacts = []; + +// Every impact gets a number, in order, for the life of the run. A watcher +// cannot be told "here is a new spark" by a stateless frame that repeats the +// same list ten times — it has to be able to tell which ones it has already +// seen, and a position is not an identity. The counter is simulation state: +// a rollback that re-spawns an impact must re-issue the same number. +let impactSequence = 0; + +function spawnImpact(impact) { + impact.id = ++impactSequence; + impacts.push(impact); + return impact; +} + +const detachedParts = []; +const bullets = []; +const grenades = []; +// The station's arsenal, said out loud: a pistol on the floor, a space laser +// at the top of the climb, a light saber over each fighter's own head. The +// cube could carry exactly one weapon, and the comment here used to say why +// — "a one-room box has no shelf to price them on". A station HAS shelves. +// Height is the price again, the way it was in the tower, and each of the +// three is priced differently on purpose: +// +// pistol — floor, far corner, behind the right spawn. The oldest bargain +// in this game and unchanged: turn your back on the other fighter to arm +// up, or rush the middle bare-handed. Six rounds that ricochet forever. +// space laser — the high centre deck, three jumps up, contested from both +// sides. Four bolts, no ricochet, and fast enough that it is a line you +// draw rather than a shot you lead. Missing it costs the bolt outright. +// light saber — one on each low deck, mirrored, one jump off your own +// spawn. It is the only free weapon and the only fair one, and it buys +// reach on every hand strike rather than a projectile. +// +// The blade came and went inside one build back in the cube — @jeffrey tried +// a sword-and-pistol standoff and asked for fists and one gun instead. The +// objection was to a duel in a phone booth, and the whole drawing machinery +// (`swordHeld`, the hilt pinned to the item forearm) survived it intact. A +// map with distance in it is the condition that was missing. +// +// `cycle` marks the slot the ten-second powerup rotation owns. Only the +// pistol carries it, so an untouched laser can never stall the reload that +// keeps the floor fight fed. +const gunPickups = [ + { kind: "HANDGUN", amount: 6, x: tileCenterX(cornerColRight), + startsActive: true, cycle: true, y: floorY, z: 0 }, + { kind: "SPACE LASER", amount: 4, x: centerX, startsActive: true, + cycle: false, y: parkDecks[3].y, z: 0 }, + { kind: "ROCKET LAUNCHER", amount: 3, x: tileCenterX(cornerColLeft), + startsActive: true, cycle: false, y: floorY, z: 0 }, +]; +// A saber is not ammunition, so it is not a gun pickup: taking one sets a +// state a fighter keeps until the arm holding it comes off. Mirrored across +// the two low decks, centred on each deck rather than on a tile, because the +// deck is the landmark a player actually reads. +const saberPickups = [ + { kind: "LIGHT SABER", x: (parkDecks[1].left + parkDecks[1].right) / 2, + y: parkDecks[1].y, z: 0, startsActive: true }, + { kind: "LIGHT SABER", x: (parkDecks[2].left + parkDecks[2].right) / 2, + y: parkDecks[2].y, z: 0, startsActive: true }, +]; +const grenadePickups = [ + { amount: 3, x: centerX - 450, y: floorY, z: 0, startsActive: true }, + { amount: 3, x: centerX + 450, y: floorY, z: 0, startsActive: true }, +]; +// No trees. Two grew out of the tower's side walls and were the only thing +// in a round that gave a body back; in the cube their ripe fruit read as a +// coconut hanging over the fight, and @jeffrey asked for it gone. The +// consequence is the point now: a fighter taken apart limb by limb stays +// that way until the bell. The grower/harvest machinery below sleeps on +// this empty list. +const bodyTrees = []; +const treeRipenUs = 18000000; +const treeTimeBonusUs = 15000000; +const airParticles = []; +for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + // A pickup names its tile and floats seventy above that tile's surface — + // the same float the old ledges used, and it keeps a real-sized weapon + // from reading as a decal painted on the floor. + pickup.y = surfaceYAt(pickup.x, pickup.y) - 70; +} +// Every kind carries a gravity factor so redressing the match ball in place +// can never leave a previous kind's float behind. +// +// The skateboard is map furniture; it never replaces the match ball. +const ballKinds = [ + { type: "soccer", spawnOwner: 0, radius: 38, mass: .72, hitScale: 1.12, + bounce: .58, drag: .994, windFactor: .58, gravityFactor: 1 }, + { type: "basketball", spawnOwner: 1, radius: 42, mass: 1.08, hitScale: .86, + bounce: .76, drag: .989, windFactor: .34, gravityFactor: 1 }, + { type: "beach", spawnOwner: -1, radius: 46, mass: .34, hitScale: 1.25, + bounce: .82, drag: .998, windFactor: 1.35, gravityFactor: .62 }, + { type: "skateboard", spawnOwner: -1, radius: 52, mass: .9, hitScale: .7, + bounce: .34, drag: .992, windFactor: .5, gravityFactor: .5, + series: false }, +]; +let matchBallType = ballKinds[0].type; +const skateBoardKind = ballKinds.find((kind) => kind.type === "skateboard"); +// A match inflates exactly one ball and keeps it for every round, and the +// station parks exactly one board on the floor at centre. Two entries in one +// array because they are the same kind of object to every routine that +// touches them — swept contact, ledge support, shadows, the wire format — +// and because the board's whole mount path is written against a ball rolling +// into a shin. +const balls = [{ ...ballKinds[0], z: 0, vx: 0, vy: 0, rotation: 0, + x: players[0].spawnX, y: floorY - ballKinds[0].radius, + active: true, serveAt: 0, lastHitBy: 0, safeUntil: 0, safePlayers: 0, + heldBy: -1 }, +...[cornerColLeft, 20, 32].map((spawnCol) => ({ ...skateBoardKind, spawnCol, riderPad: -1, z: 0, vx: 0, vy: 0, rotation: 0, + x: tileCenterX(spawnCol), y: floorY - skateBoardKind.radius, + active: true, serveAt: 0, lastHitBy: -1, safeUntil: 0, safePlayers: 0, + heldBy: -1 }))]; +// Version-one replay/spectator consumers still read the first ball by name. +const ball = balls[0]; +// The board is not gated by `ballEnabled`. That switch is the ball's — it +// takes the serve, the cross-wack and the BALLED death off the map together — +// and the board shares none of them. +let skateBoardEnabled = true; +// The ball is out of the round — @jeffrey asked for the cube bare. All of +// the ball's machinery (serve, boot, carry, cross-wack, the BALLED death) +// sleeps behind this switch exactly as it always did for the test harness; +// flipping it back on is the whole re-installation. +let ballEnabled = false; + +function mapHash(text) { + let hash = 2166136261; + for (const character of String(text || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} +let currentMapName = "HALFPIPE"; +let currentMapId = "halfpipe"; +let workshopBase = null; +// Workshop edits are local practice state. They never enter rollback matches +// or the competitive replay ledger; documents are saved separately. +let workshopMap = null; +let workshopRevision = 0; +let workshopHistory = []; +let workshopHighlight = false; +let workshopTainted = false; + +let localMapIndex = -1; +let localMapMode = ""; +let localMapInstalled = false; +let netRoundMapIndex = -1; +const localMapVariants = [null, { + name: "BOWL", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "transition", rise: 360, dir: -1, lift: -360 }, + { from: 16, to: 24, kind: "flat", lift: -360 }, + { from: 24, to: 28, kind: "transition", rise: 360, dir: 1, lift: -360 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 9, cols: 4, row: 3 }, { col: 27, cols: 4, row: 3 }], +}, { + name: "HIGH GROUND", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "bank", rise: 270, dir: 1 }, + { from: 16, to: 24, kind: "flat", lift: 270 }, + { from: 24, to: 28, kind: "bank", rise: 270, dir: -1 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 7, cols: 4, row: 3 }, { col: 18, cols: 4, row: 7 }, + { col: 29, cols: 4, row: 3 }], +}, { + name: "PUMP TRACK", + features: [ + { from: 0, to: 6, kind: "flat" }, + ...[6, 14, 22, 30].flatMap(from => [ + { from, to: from + 3, kind: "bank", rise: 180, dir: 1 }, + { from: from + 3, to: from + 5, kind: "flat", lift: 180 }, + { from: from + 5, to: from + 8, kind: "bank", rise: 180, dir: -1 }, + ]), + { from: 38, to: 40, kind: "flat" }, + ], + decks: [{col: 17, cols: 6, row: 6}], +}, { + name: "TWIN BOWLS", + features: [ + {from: 0, to: 4, kind: "flat"}, + ...[4, 22].flatMap(from => [ + {from, to: from + 3, kind: "transition", rise: 270, dir: -1, lift: -270}, + {from: from + 3, to: from + 9, kind: "flat", lift: -270}, + {from: from + 9, to: from + 12, kind: "transition", rise: 270, dir: 1, lift: -270}, + {from: from + 12, to: from + 18, kind: "flat"}, + ]), + ], + decks: [{col: 8, cols: 4, row: 3}, {col: 26, cols: 4, row: 3}], +}, { + name: "LAUNCH PAD", + features: [ + {from: 0, to: 6, kind: "flat", lift: 360}, + {from: 6, to: 10, kind: "bank", rise: 360, dir: -1}, + {from: 10, to: 16, kind: "flat"}, + {from: 16, to: 20, kind: "bank", rise: 270, dir: 1}, + {from: 20, to: 24, kind: "bank", rise: 270, dir: -1}, + {from: 24, to: 30, kind: "flat"}, + {from: 30, to: 34, kind: "bank", rise: 360, dir: 1}, + {from: 34, to: 40, kind: "flat", lift: 360}, + ], + decks: [{col: 8, cols: 4, row: 6}, {col: 18, cols: 4, row: 9}, + {col: 28, cols: 4, row: 6}], +}]; +localMapVariants.push({ + name: "CORAL STEPS", + features: [ + {from:0, to:8, kind:"flat"}, + {from:8, to:12, kind:"bank", rise:180, dir:1}, + {from:12, to:16, kind:"flat", lift:180}, + {from:16, to:20, kind:"bank", lift:180, rise:180, dir:1}, + {from:20, to:24, kind:"bank", lift:180, rise:180, dir:-1}, + {from:24, to:28, kind:"flat", lift:180}, + {from:28, to:32, kind:"bank", rise:180, dir:-1}, + {from:32, to:40, kind:"flat"}, + ], + decks:[{col:4,cols:4,row:4},{col:18,cols:4,row:8},{col:32,cols:4,row:4}], +}, { + ...localMapVariants[1], name:"SLOW MOTION", modifier:"slow", +}, { + name:"AIR DROP", modifier:"air", skateboard:false, + features:[{from:0,to:40,kind:"flat"}], decks:[], +}, { + name:"UNARMED", modifier:"unarmed", + features:[{from:0,to:40,kind:"flat"}], decks:[], pickups:[], +}); +const roundMapIds = ["halfpipe", "bowl", "high-ground", "pump-track", "twin-bowls", "launch-pad", + "coral-steps", "slow-motion", "air-drop", "unarmed"]; +const roundMapColors = [ + {sky:[218,239,255], night:[8,23,34], floor:[45,191,185], deck:[255,154,72]}, + {sky:[246,225,255], night:[27,13,39], floor:[181,107,237], deck:[76,220,188]}, + {sky:[255,231,203], night:[34,19,18], floor:[246,150,58], deck:[74,177,232]}, + {sky:[225,247,214], night:[9,29,27], floor:[119,192,66], deck:[234,103,169]}, + {sky:[255,224,231], night:[34,12,29], floor:[231,101,146], deck:[93,193,222]}, + {sky:[224,234,255], night:[13,19,43], floor:[90,139,234], deck:[250,202,67]}, + {sky:[255,235,205], night:[34,15,30], floor:[248,108,92], deck:[66,214,201]}, + {sky:[239,222,255], night:[25,15,43], floor:[122,94,201], deck:[245,176,238]}, + {sky:[125,208,255], night:[8,18,39], floor:[93,158,243], deck:[255,244,168]}, + {sky:[230,250,212], night:[18,27,23], floor:[101,199,144], deck:[255,191,103]}, +]; +// Temporarily excluded while AIR readability is revised. Keep authored IDs stable. +const airRoundInRotation = false; +function nextRoundMapIndex(index) { + for (let step = 0; step < localMapVariants.length; step++) { + index = (index + 1) % localMapVariants.length; + if (airRoundInRotation || localMapVariants[index]?.modifier !== "air") return index; + } + return 0; +} +function roundMapDocument(index) { + const variant = localMapVariants[index]; + return variant ? {...workshopBase, ...variant, + features: variant.features.map(f => ({lift:0, rise:0, dir:1, ...f}))} : workshopBase; +} +function installRoundMap(index) { + installWorkshopMap(roundMapDocument(index), true); + currentMapId = roundMapIds[index]; +} + +function rotateLocalMap(keepMap, resetMatch) { + const local = localVersusActive(); + const training = !selfPlay && ["dummy", "spiderdummy", "trainingbot", "bot"] + .includes(fightOpponent); + if (skateparkMap || (!local && !training) || workshopTainted || + globalThis.__oskiewarPublishedMap) return; + const mode = local ? "local" : "training"; + if (localMapMode !== mode) { localMapIndex = -1; localMapMode = mode; } + // Returning to the title mid-round keeps its map. A completed solo round + // advances before the next START, just like the local versus rollover. + if (localMapIndex < 0 || (!keepMap && (local || !resetMatch || roundResult))) + localMapIndex = nextRoundMapIndex(localMapIndex); + const variant = localMapVariants[localMapIndex]; + const map = variant ? { ...workshopBase, ...variant, + features: variant.features.map(f => ({ lift: 0, rise: 0, dir: 1, ...f })) } + : workshopBase; + if (local || variant) installWorkshopMap(map, true); + else currentMapName = "HALFPIPE"; + currentMapId = roundMapIds[localMapIndex]; + localMapInstalled = local || Boolean(variant); +} + +function workshopSnapshot() { + return { format: "ac.oskiewar.map", version: 1, + name: workshopMap?.name || currentMapName, + features: parkSegments.map(({ from, to, kind, lift, rise, dir }) => + ({ from, to, kind, lift: lift || 0, rise: rise || 0, dir: dir || 1 })), + decks: parkDecks.map(d => ({ col: (d.left - gridLeft) / tileSize, + cols: (d.right - d.left) / tileSize, row: (floorY - d.y) / tileSize })), + spawns: players.slice(0, 2).map(p => (p.spawnX - gridLeft) / tileSize - .5), + pickups: workshopMap?.pickups.map(p => ({ ...p })) || + [...gunPickups, ...saberPickups, ...grenadePickups].filter(p => p.startsActive) + .map(p => ({ kind: p.kind || "GRENADE", col: tileCol(p.x), amount: p.amount || 0 })), + skateboard: skateBoardEnabled }; +} + +function installWorkshopMap(map, cycleHandgun = false) { + if (skateparkMap) { configureWorldMap("station"); resetSkateRopes(); } + localMapInstalled = false; + workshopMap = map; + roundModifier = map.modifier || ""; + parkSegments.splice(0, parkSegments.length, ...map.features.map(f => ({ ...f, + left: gridLeft + f.from * tileSize, right: gridLeft + f.to * tileSize }))); + parkDeepest = floorY + Math.max(0, ...parkSegments.map(s => -s.lift)); + rebuildTerrainProfile(); + parkDecks.splice(0, parkDecks.length, ...map.decks.map((d, i) => ({ level: i + 1, + left: gridLeft + d.col * tileSize, right: gridLeft + (d.col + d.cols) * tileSize, + y: floorY - d.row * tileSize }))); + players.forEach((p, i) => { p.spawnX = tileCenterX(map.spawns[i] ?? + (map.spawns[0] + map.spawns[1]) / 2); }); + const weapons = unarmedRoundActive() ? [] : map.pickups; + if (unarmedRoundActive()) { + for (const player of players) clearWeaponLoadout(player); + bullets.length = 0; grenades.length = 0; + } + installMapPickups(gunPickups, weapons.filter(p => + !["GRENADE", "LIGHT SABER"].includes(p.kind)), "gun"); + // Portable maps contain authored pickups, not the built-in refill policy. + const pistol = gunPickups.find(p => p.kind === "HANDGUN"); + if (cycleHandgun && pistol) pistol.cycle = true; + installMapPickups(saberPickups, weapons.filter(p => p.kind === "LIGHT SABER"), "saber"); + installMapPickups(grenadePickups, weapons.filter(p => p.kind === "GRENADE"), "grenade"); + skateBoardEnabled = map.skateboard; + currentMapName = map.name; + currentMapId = "workshop-" + mapHash(JSON.stringify(map)).toString(36); + // Reconcile newly raised floors without restarting the players' exchange. + for (const p of players) { + const ground = terrainFloorAt(p.x); + if (p.y > ground || p.grounded) { p.y = ground; p.vy = 0; p.grounded = true; } + } + renderPreviousState = null; +} + +function workshopCommand(command) { + if (!globalThis.__oskiewarWorkshopEnabled) throw new Error("Coach editing is off"); + if ((netSession && netSession.seat !== 0) || roundViewer || survivalActive() || resimActive) + throw new Error("Edit through the room host; survival and replay editing are unavailable"); + if (!command || typeof command !== "object") throw new Error("Expected a workshop command"); + const { op } = command; + if (op === "inspect") return { room: "ow-" + (versusRoomName || sessionName), + revision: workshopRevision, map: workshopSnapshot(), + highlights: workshopHighlight, undo: workshopHistory.length, + units: { columns: gridCols, tileSize, floorY }, + players: players.map(p => ({ x: p.x, y: p.y, spawnX: p.spawnX })) }; + if (op === "highlight") { + if (typeof command.enabled !== "boolean") throw new Error("Supply enabled: true or false"); + workshopHighlight = command.enabled; + return workshopCommand({ op: "inspect" }); + } + if (command.revision !== workshopRevision) throw new Error("Map changed; inspect and use its revision"); + if (!["apply", "drop", "undo", "reset-round", "restart-level"].includes(op)) + throw new Error("Unknown workshop operation"); + let map; + if (op === "undo") { + if (!workshopHistory.length) throw new Error("Nothing to undo"); + map = workshopHistory[workshopHistory.length - 1]; + } else { + map = op === "apply" ? command.map : workshopSnapshot(); + if (op === "drop") map.pickups.push(command.item); + } + map = globalThis.__oskiewarValidateMap(map); + if (netSession) { + const session = netSession; + if (session.send({ t: "workshop", o: session.originUs }) === false) + throw new Error("The peer connection is not ready for editing"); + workshopTainted = true; + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + } + if (op === "undo") workshopHistory.pop(); + else if (!["reset-round", "restart-level"].includes(op)) { + workshopHistory.push(workshopSnapshot()); + if (workshopHistory.length > 20) workshopHistory.shift(); + } + workshopTainted = true; + workshopRevision++; + installWorkshopMap(map); + if (op === "reset-round" || op === "restart-level") + resetRound(runtime().monotonicUs, op === "restart-level"); + return workshopCommand({ op: "inspect" }); +} + +function installMapPickups(target, authored, type) { + target.length = 0; + for (const entry of authored) { + const x = tileCenterX(entry.col); + target.push({ + ...(type === "gun" ? { kind: entry.kind, amount: entry.amount, + cycle: Boolean(entry.cycle) } : {}), + ...(type === "saber" ? { kind: "LIGHT SABER" } : {}), + ...(type === "grenade" ? { amount: entry.amount } : {}), + x, y: terrainFloorAt(x) - 70, z: 0, + active: true, startsActive: true, respawnAt: 0, + }); + } +} + +function resetWorkshopMap() { + if (!workshopMap) return; + if (!localMapInstalled && + (globalThis.__oskiewarWorkshopEnabled || globalThis.__oskiewarPublishedMap) && + !survivalActive() && !roundViewer && !resimActive) { + installWorkshopMap(workshopMap); + return; + } + const spawns = players.map(p => p.spawnX); + installWorkshopMap(workshopBase, true); + workshopMap = null; + workshopHistory = []; + workshopRevision++; + currentMapName = "HALFPIPE"; + currentMapId = "halfpipe"; + if (versusLane() || survivalActive()) players.forEach((p, i) => { p.spawnX = spawns[i]; }); +} + + +// Physics remains an exact 60 Hz story. Rendering may happen between those +// authored instants—especially during slow motion—so retain the state that +// entered each tick and blend only presentation coordinates toward the state +// that left it. The authoritative objects are restored immediately after +// paint; collision, replay capture and networking never see interpolated data. +let renderPreviousState = null; +const renderInterpolationFields = { + player: ["x", "y", "z", "headRoll", "crouchBlend"], + bullet: ["x", "y", "z", "previousX", "previousY"], + grenade: ["x", "y", "z", "previousX", "previousY", "blastRadius"], + ball: ["x", "y", "z", "rotation"], + detached: ["x1", "y1", "z1", "x2", "y2", "z2"], + debris: ["x", "y", "z"], + camera: ["width", "roll", "perspective", "fov"], + cameraPoint: ["x", "y", "z"], +}; + +function renderInterpolationObjects() { + return [ + ...players.map((object) => [object, renderInterpolationFields.player]), + ...bullets.map((object) => [object, renderInterpolationFields.bullet]), + ...grenades.map((object) => [object, renderInterpolationFields.grenade]), + ...balls.map((object) => [object, renderInterpolationFields.ball]), + ...detachedParts.map((object) => [object, renderInterpolationFields.detached]), + ...impacts.flatMap((impact) => (impact.debris || []) + .map((object) => [object, renderInterpolationFields.debris])), + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]; +} + +function captureRenderInterpolationState() { + renderPreviousState = new Map(); + for (const [object, fields] of renderInterpolationObjects()) + renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +// A camera snap is an edit, not motion. If it happens inside a simulation +// tick, replace the retained camera sample too; otherwise fractional-speed +// paint blends the new close-up with the old wide shot and frame one lands +// halfway between them. +function collapseRenderCameraInterpolation() { + if (!renderPreviousState) return; + for (const [object, fields] of [ + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]) renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +function beginRenderInterpolation(alpha) { + const amount = clamp(Number(alpha), 0, 1); + if (!renderPreviousState || amount >= .999) return () => {}; + const restore = []; + for (const [object, fields] of renderInterpolationObjects()) { + const previous = renderPreviousState.get(object); + if (!previous) continue; + for (const field of fields) { + if (!Number.isFinite(previous[field]) || !Number.isFinite(object[field])) + continue; + restore.push([object, field, object[field]]); + object[field] = lerp(previous[field], object[field], amount); + } + } + cameraDoll.dirty = true; + return () => { + for (const [object, field, value] of restore) object[field] = value; + cameraDoll.dirty = true; + }; +} +let padSnapshots = [null, null]; +// The pad each fighter actually feels. A bot writes its synthesized presses +// here, so the HUD, the debug read-out, the replay and the physics all read +// bot input off the same wire as a hand on a controller. +let inputPads = [null, null]; +let startedAt = 0; +let roundStartedAt = 0; +let lastSimAt = 0; +let roundElapsedUs = 0; +const fightHitMarks = []; +globalThis.__oskiewarFightHitMarks = fightHitMarks; +let lastCountdownSecond = -1; +// The intro's own clock: which "3, 2, 1" second last rang, and whether the +// round-open accent has fired. -1 means the accent is still owed. +let lastIntroSecond = 0; +// The scored tail's clocks: the next heartbeat of the killcam dwell, and +// whether the result card has had its sting. +let resultPulseAt = 0; +let resultLaughAt = 0; +let resultLaughStep = 0; +let resultCardStung = false; +const resultReactionPrevious = [[], [], []]; +let roundOverAt = 0; +let roundResult = ""; +// How long a reel holds the opening matchup card. Long enough to read two +// names on a phone, short enough that the fight plays under a clean frame. +const REEL_MATCHUP_SECONDS = 2.6; +let matchOver = false; +let roundCause = ""; +let deathCinematic = null; +let impactHitboxesUntil = 0; +let nextPowerupAtUs = powerupIntervalUs; +let powerupSequence = 0; +let acFeed = {}; +// Pal select is retired: you are your own handle, so there is nobody to pick, +// and the dummy is already the default opponent. The whole two-step screen +// stays behind this one flag rather than being deleted, because the entry UI +// is still moving and this is the shape we may want to compare against. Flip +// it true and the wheel comes back exactly as it was. +const PAL_SELECT = false; +// The frame recorder remains intact for future review tooling, but replay is +// not part of the match flow. One flag restores the viewer, its controls and +// its offer together; production currently moves directly through results. +const INSTANT_REPLAY = false; +let selecting = false; +// Self-play is a harness mode: both fighters run the bot, no pad can enter or +// leave it, and rounds roll over on their own. +let selfPlay = false; +// Which kind the round on screen was opened against. Training and the bot door +// seat the same fighter with the same brain now, so `players[1].bot` can no +// longer say which door a round came through — and only one of those doors is +// allowed on the wire. +let fightOpponent = ""; +// Survival uses the round clock only as an elapsed-time source. Height is the +// score, the lava line is the opponent, and a run ends only when the runner +// touches it or reaches the final authored deck. +const survivalLavaStart = floorY + 360; +const survivalLavaBaseSpeed = 52; +let survivalStartedAt = 0; +let survivalLavaY = survivalLavaStart; +let survivalHeight = 0; +let survivalBestHeight = 0; +let survivalPeakLevel = 0; +let hudLeftPad = 0; +// The title is also the attract screen. Half of sessions get the quiet, +// cross-legged tableau; half get a standing face-off. Both remain still so +// the wordmark stays readable until the player asks the fight to begin. +// Hashing the already-created round name keeps the split stable for a visit +// without spending a second Math.random call (reel seeding relies on one). +let titleAttractMode = "still"; +// What a fresh session is dealt. @jeffrey, playtesting: "can we switch dummy +// to bot now?" — the free front door was a post that never hit back, so a solo +// visit was target practice rather than a fight. `trainingbot` is that same +// fighter with the bot's brain switched on, carrying its own kind name so the +// wire gate in `roundIsTimed` can still tell the free door from the one a +// handle buys. The inert dummy and the spider stay reachable by name, because +// damage, geometry and sync work all want a target that stands still. +let trainingOpponent = ""; +function trainingOpponentKind() { + const requested = String(globalThis.__oskiewarOpponent || "").toLowerCase(); + if (requested === "dummy" || requested === "spiderdummy" || + requested === "trainingbot") return requested; + // One kind for the whole visit: a title returned to after a knockout must + // not re-deal the opponent out from under the player. The web's empty + // door spars with the bot; the console's stands a dummy up instead — + // @jeffrey on the Xbox, 2026-09-20: "make it so we can play against dummy + // as opposed to bot ... the dummy goes away and gets replaced by players" + // (a second local controller promotes that chair through + // `updateLocalVersus`). An inert dummy is also one bot brain fewer in the + // console's interpreted sim. + if (!trainingOpponent) trainingOpponent = + globalThis.__oskiewarVersusCapable === true ? "trainingbot" : "dummy"; + return trainingOpponent; +} +// The versus lane's room. One name for the whole visit — the shell writes it +// into the address bar, the QR encodes it, and a friend opening that address +// takes the second chair. A visit that arrived THROUGH such an address and +// found nobody hosting claims the name instead, so a shared link survives +// its sender refreshing. +let versusRoomName = ""; +let versusNextAt = 0; +let versusRivalName = ""; +// The raw handle the seat last offered, kept beside the name it produced. The +// comparison that decides whether to re-dress has to be against this and not +// against the result: an anonymous arrival offers "", which is falsy, so the +// old guard skipped the re-dress entirely and left the PREVIOUS player's name +// and colors on the chair. Leaving and rejoining inside the 2.5 s grace is +// exactly how somebody ends up wearing a stranger. +let versusRivalOffered = ""; + +// The handle riding the freshest pad frame, cleaned to the shape a nameplate +// and the state schema both accept. One reader, so the re-dress test and the +// dressing itself can never disagree about what was offered. +function versusOfferedName() { + return String(globalThis.__oskiewarRemotePad?.name || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); +} +// How long an empty wire keeps the rival seated. Long enough to ride out a +// dropped packet or a phone switching antennas, short enough that a closed +// tab reads as "they left" while the fighter is still warm. +const versusChallengerGraceMs = 2500; +// The fight streams faster than a grandstand needs, because for the +// challenger this feed IS the game — their own presses come back to them +// as pictures through it. +const versusSnapshotIntervalMs = 33; +// How long a visitor who arrived through a shared address waits for a host +// before deciding the room is theirs to claim. +const versusClaimAfterUs = 2500000; +let versusClaimArmedAt = 0; +let versusInputSeq = 0; +let versusInputLastSent = ""; +let versusInputNextAt = 0; +let versusInputMinNextAt = 0; +// The bridge a claiming visitor stepped off of, kept so a lost publisher +// race can walk them right back on as a challenger. +let versusFallbackBridge = null; + +let versusSeatGraceUntil = 0; + +function versusChallengerFresh() { + // In a rollback fight the rival's presence is the session itself; the + // sim must not read the wall clock to decide whether the fight goes on. + if (netSession) return true; + // And for a moment after one ends badly, while the rival is changing lanes. + if (Date.now() < versusSeatGraceUntil) return true; + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return false; + return Date.now() - remote.at < versusChallengerGraceMs; +} + +// The remote rival's pad, read off the same wire shape a hand or a bot +// writes. A stale global answers neutral rather than holding the last +// press — a vanished friend must drop their guard, not run into a corner +// forever. +// The seat whoever is at this screen is holding. Seat one everywhere except a +// rollback fight's challenger, who plays the second fighter — their keycap +// legend, touch discs and move names must follow their own hands rather than +// lighting up when the other player presses something. +const localSeat = () => netSession ? netSession.seat : 0; +const localPad = () => inputPads[localSeat()] || + { connected: true, down: [], leftX: 0, leftY: 0 }; + +function remotePadSnapshot() { + const remote = globalThis.__oskiewarRemotePad; + const fresh = remote && Number.isFinite(remote.at) && + Date.now() - remote.at < versusChallengerGraceMs; + if (!fresh) return { connected: true, down: [], leftX: 0, leftY: 0, + rightX: 0, rightY: 0 }; + return { connected: true, + down: Array.isArray(remote.down) ? remote.down.slice() : [], + leftX: Number(remote.leftX) || 0, leftY: Number(remote.leftY) || 0, + rightX: 0, rightY: 0 }; +} +const selectionReady = [false, false]; +const selectionPrevious = [[], []]; +let selectionStep = 0; +let selectionCursor = 0; +let windMph = 0; +let windDirection = 1; +let windAcceleration = 0; +let windTargetMph = 0; +let windTargetDirection = 1; +let nextWindChangeAt = 0; +let replay = null; +// Round names in the order they were minted, each with the demo tick it was +// minted on. A rollback can rewind past a round rollover, so this ledger has +// to rewind with it — `replay.roundIds` is derived from it rather than being +// appended to directly, which is what keeps a re-simulated rollover from +// filing the same round twice. +let replayRoundMarks = []; +// The frame a finished round is waiting to be confirmed past before it is +// filed. -1 when nothing is waiting. See saveRoundReplay. +let replayPendingSaveFrame = -1; +let replayLastCommand = [-1, -1]; +let replayNextCheckpointAt = 0; +let matchName = ""; +let seriesName = ""; +// The app run's own name, distinct from any round or series: rounds are born +// and buried every thirty seconds, but the console sitting on the title screen +// is still a running program somebody may want to attach to. One name from +// boot to quit, drawn beside the debug bug, carried as sessionId in every live +// frame, and used as the relay room while no timed round is publishing. +let sessionName = ""; +let previousRoundName = ""; +let roundReplayFrames = []; +let roundReplayLastAt = 0; +let instantReplay = null; +let replayOfferPrevious = []; +let shellMode = "MENU"; +let gameplayStarted = false; +let shellPrevious = []; +let startInputPending = false; +let shellRawPrevious = []; +// Whether the stick was already leaned last frame, so a held lean reads as +// one gesture at the title rather than a machine-gun of entries. +let shellStickLive = false; +// Training teaches for two and a half minutes once the title lifts. This is +// session time, not round time: a knockout or a visit back to the title must +// not restart onboarding that the player has already outgrown. +let dummyGuideStartedAt = null; +// Unset is null, never -1: the console's monotonic clock can read negative +// (App.cpp overflows int64 converting QPC ticks past ~10 days of uptime), +// and a >= 0 sentinel then swallows every legitimate timestamp. +let titleTransitionAt = null; +// The wordmark is a toy: every letter of "oskiewar" and of "start" keeps its +// own swell and shudder, and the prompt keeps one shared bounce the letters +// take in turn. Paint owns these because they are pointer feel, not state. +const titleToys = []; +const promptToys = []; +let promptBounce = 0; +let titleToyAt = -1; +// Which letter the pointer currently owns. The letters never hold still — each +// one bobs and drifts a good fraction of its own width — so a bare hit test +// against a moving cell hands a resting cursor a letter that slides out from +// under it and back several times a second. That reads as a flickering glyph, +// a cursor blinking between two shapes, and a hover tick that will not stop. +// Holding the grab until the pointer leaves a cell grown by the letter's own +// travel is the same hysteresis the camera uses at the safe-zone edge. +let titleGlyphHot = -1; +let navigationPrevious = [[], []]; +// Remote render experiment flags. An attached agent can flip these through +// the relay — the shell merges oskiewar:flags into the global and the paint +// below reads it once per frame — so what each layer costs can be measured +// on the machine that is actually struggling, not a workstation imitating +// it. Every flag missing means the full picture; xbox/tools/oskiewar-ablate +// walks them and reads the price back out of the live fps telemetry. +let renderFlags = {}; +// Temporary live combat inspector. Keep this explicit so the production view +// can return to a clean presentation without changing combat geometry. +let debugHitboxes = false; +// The frame meter, the way a training mode has one: one pip per simulation +// frame, colored by what the fighter was DOING on that frame, so a player can +// read an exchange back instead of guessing at it. +// +// Street Fighter 6's legend, kept because it is the one people already know: +// green is startup, red is active, blue is recovery, yellow is stun. What +// those mean HERE is a question about this game rather than that one, and the +// honest answers are not all flattering: +// +// Startup, active and recovery come from the same integer-frame table as +// the collision sampler. A landed strike remains in recovery until its +// original action deadline. Stun still takes precedence over the action. +// +// Shielding gets a color of its own because holding a shield is a stance in +// this game rather than a reaction, and folding it into stun would say +// something false about who is in control. +const frameMeterLength = 120; +const frameMeterStates = { + neutral: { ink: [92, 100, 124], label: "" }, + startup: { ink: [86, 226, 120], label: "STARTUP" }, + active: { ink: [255, 66, 72], label: "ACTIVE" }, + recovery: { ink: [72, 150, 255], label: "RECOVERY" }, + stun: { ink: [255, 208, 64], label: "STUN" }, + shield: { ink: [186, 118, 255], label: "SHIELD" }, + airborne: { ink: [54, 62, 86], label: "" }, +}; +const frameMeters = [[], []]; +// What a fighter is on this exact frame, in one word. Ordered by what beats +// what: being stunned outranks anything you were trying to do, and a swing +// outranks the shield you are no longer really holding. +function frameMeterState(player, now) { + if (!player.alive) return "neutral"; + if (now < player.hitStunUntil) return "stun"; + if (player.attackKind && now < player.attackUntil) { + if (player.attackHit) return "recovery"; + return meleeFrame(player, now).phase; + } + if (player.blocking) return "shield"; + if (!player.grounded) return "airborne"; + return "neutral"; +} +function recordFrameMeter(now) { + if (!debugHitboxes) return; + for (const player of players) { + const meter = frameMeters[player.pad]; + meter.push(frameMeterState(player, now)); + if (meter.length > frameMeterLength) meter.shift(); + } +} +// One FIGHT_DEBUG_PERF telemetry line per debug toggle, so the console's log +// can prove the fps row drew without narrating every frame. +let debugPerfReported = false; +let nextInputDebugAt = 0; +let frameTelemetry = []; +let frameTelemetryFlushAt = 0; +let lastPaintAt = 0; +let displayFps = 0; +let liveSequence = 0; +let liveNextAt = 0; +// The session room ticks slower than a round room: nobody spectates a title +// screen at 20Hz, and an agent reading fps is happy at four. +const sessionSnapshotIntervalUs = 250000; +let sessionNextAt = 0; +// Which round the session room was last told about, so the hand-off frame +// goes out exactly once per round instead of flapping the native shell's +// single publisher socket every tick. +let sessionAnnouncedRound = ""; +let spectatorQr = null; +// Encoding a code costs about 59ms and is the whole 50-100ms tail in the +// frame histogram: it ran at every round reset, for a URL that changes once +// per round. Same URL, same code -- so keep the last one. +let spectatorQrUrl = ""; +let spectatorQrCache = null; +function spectatorCode(url) { + if (typeof qrcode !== "function") return null; + if (url === spectatorQrUrl && spectatorQrCache) return spectatorQrCache; + spectatorQrUrl = url; + spectatorQrCache = qrcode(url, { errorCorrectLevel: 1 }); + return spectatorQrCache; +} + +let roundViewer = null; +let roundViewerStop = null; +let roundViewerMode = ""; +// The chair-holder's own View presses, remembered across viewer ticks — the +// debug toggle needs an edge, and the host's echo never carries system keys. +let viewerSystemPrevious = []; +let roundViewerStatus = "CONNECTING"; +let roundViewerDemo = null; +let roundViewerDemoStartedAt = 0; +// When the last authoritative LIVE frame landed, on the WALL clock in +// milliseconds. Wall, not sim: the frame arrives in a socket callback, where +// the sim clock is not running, and comparing an arrival stamped by one clock +// against a deadline read from the other drifted by every dropped tick until +// the coast fuse below stopped tripping at all. +let roundViewerLiveAt = 0; +// The grandstand's playout buffer. Wire frames are no longer painted the +// instant they land — they queue here with their arrival time and the render +// reads a clock held a little behind the newest of them, so every frame is +// drawn by interpolating the two that bracket it. Extrapolation is what is +// left when the buffer runs dry, not the normal case: a body that coasts on +// stale velocity walks through the floor and then snaps back, which is the +// whole of what "glitchy" meant on a guest screen. +let roundViewerFrames = []; +// The playout clock, in the same wall milliseconds the queue is stamped in. +// It advances on the simulation's own dt so the picture moves at the sim's +// rate, and leans gently toward (now − delay) so it neither runs dry nor +// falls further and further behind. +let roundViewerPlayoutMs = 0; +// How far behind the newest arrival the playout clock sits. One wire frame +// plus the jitter we have actually measured — enough that the next frame is +// usually already in hand when the clock reaches the last one. +let roundViewerDelayMs = 70; +// Wire health, measured from arrivals alone: mean gap, jitter (mean absolute +// deviation of the gap), and the share of sequence numbers that never came. +// These are what the connection meter reads, and what sizes the delay above. +let roundViewerGapMs = 33; +let roundViewerJitterMs = 0; +let roundViewerLossPct = 0; +let roundViewerSeq = -1; +let roundViewerSeqHeard = 0; +let roundViewerSeqExpected = 0; +let roundViewerImpactTick = -1; +// The newest impact number this watcher has spawned. The host repeats a mark +// on every frame it is still burning, so this is what tells a repeat from a +// new spark. +let roundViewerImpactId = 0; +// Whether the round being watched has a clock. The wire says so; the watcher +// must not answer from its own `roundIsTimed()`, which reads a local fight +// that is not happening. +let roundViewerTimed = true; +let livePublishFailed = false; + +// Match names are public URLs and must not collide, so they take real +// entropy — but a recorded round has to reproduce, and the ball kind is +// hashed from the series name and carries radius and mass. So the entropy is +// drawn once per match, carried in the demo, and every name after it falls +// out deterministically. +let nameSeed = 1; +function seedNames(seed) { + nameSeed = (seed >>> 0) || 1; +} +function nameRandom() { + nameSeed = (nameSeed + 0x6d2b79f5) >>> 0; + let value = nameSeed; + value = Math.imul(value ^ (value >>> 15), value | 1); + value ^= value + Math.imul(value ^ (value >>> 7), value | 61); + return ((value ^ (value >>> 14)) >>> 0) / 4294967296; +} + +function pronounceableMatchName() { + const onsets = ["b", "d", "f", "g", "k", "l", "m", "n", "p", "r", + "s", "t", "v", "z", "ch", "sh", "th"]; + const consonants = "bdfgklmnprstvz"; + const vowels = "aeiou"; + const onset = onsets[Math.floor(nameRandom() * onsets.length)]; + const vowel = vowels[Math.floor(nameRandom() * vowels.length)]; + const middle = consonants[Math.floor(nameRandom() * consonants.length)]; + const ending = (vowels + "y")[Math.floor(nameRandom() * (vowels.length + 1))]; + return onset + vowel + middle + middle + ending + + Math.floor(nameRandom() * 1000); +} + +function demoTick(now) { + return replay ? Math.max(0, Math.round((now - replay.startedMonotonicUs) / + replayTickUs)) : 0; +} + +function trackMatchStarted() { + // Versus has its own host-authored remote-player event in startVersusFight. + if (versusLane() || !roundIsTimed() || typeof analytics !== "function") return; + const device = typeof capabilities === "function" ? capabilities() : {}; + const platform = String(device.platform || "").toLowerCase(); + const surface = platform === "xbox-uwp" || platform === "xbox" + ? "xbox" + : platform === "macos" ? "macos" : "web"; + const family = String(device.inputFamily || "").toLowerCase(); + analytics("match_started", { + source_system: "browser", + surface, + input_family: ["gamepad", "keyboard", "xbox"].includes(family) + ? family + : "unknown", + opponent_type: selfPlay ? "self-play" + : players[1].bot ? "bot" + : players[1].npc ? "dummy" : "local-player", + }); +} + +function startReplay(now) { + const run = runtime(); + if (!roundIsRecorded()) { + seriesName = ""; + matchName = ""; + previousRoundName = ""; + // Spiderdummy training carries one plain ball; there is no board to + // carry anymore. + matchBallType = "soccer"; + replay = null; + spectatorQr = null; + return; + } + seedNames(Math.floor(Math.random() * 4294967296)); + const nameSeedUsed = nameSeed; + seriesName = pronounceableMatchName(); + // The deal owns the ball in a versus fight — both seats set it from the same + // word — so rolling a series ball here would put the two of them in + // different fights. + if (!versusActive()) matchBallType = seriesBallType(seriesName); + matchName = ""; + previousRoundName = ""; + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = { + format: "ac.oskiedemo", version: 1, game: "oskiewar", + simulation: "oskiewar-physics-1", tickRate: 60, + matchId: "ow-" + seriesName, matchName: seriesName, + seriesId: "ow-" + seriesName, seriesName, roundIds: [], + recordedDisplay: { + width: Number(run.width) || viewWidth(), + height: Number(run.height) || viewHeight, + aspectRatio: (Number(run.width) || viewWidth()) / + Math.max(1, Number(run.height) || viewHeight), + surfaceWidth: Number(run.surfaceWidth) || Number(run.width) || viewWidth(), + surfaceHeight: Number(run.surfaceHeight) || Number(run.height) || viewHeight, + refreshHz: Number(run.refreshHz) || Number(run.measuredHz) || 0, + }, + startedAt: run.unixMs || 0, startedMonotonicUs: now, + // Which room this was played in, so a room can be asked for its own + // history. Only a versus fight has one: in the broadcast lane each round + // IS its own room and the round id already says so. + ...(versusActive() && versusRoomName + ? { roomId: "ow-" + versusRoomName, roomName: versusRoomName } : {}), + // Preserve the original round's clock policy, including timed versus. + // Older demos carry no flag and default to timed in the reader. + timed: roundIsTimed(), + nameSeed: nameSeedUsed, ballType: matchBallType, + map: skateparkMap ? "skatepark" : "station", + fighters: players.map((player) => player.name), + nations: players.map((player) => player.nation || ""), + commands: [], events: [], checkpoints: [], rounds: [], impacts: [], + }; + replayLastCommand = [-1, -1]; + replayNextCheckpointAt = now; + // The sequence counter survives the match: every round room is born empty, + // so a fresh room takes any first number — but the session room lives from + // boot to quit, and the relay silently drops a frame whose sequence ever + // runs backwards. One counter, never rewound, serves them both. + liveNextAt = now; + livePublishFailed = false; + spectatorQr = null; + trackMatchStarted(); +} + +// Whether the round on screen is on the wire: clocked, named, recorded, +// published, counted. The free training round never is, whatever its opponent +// does. An opponent with no bot AI used to be a safe stand-in for "nobody is +// watching this" — the day training started sparring back, that stand-in would +// have put every anonymous session on a series, a demo and a live feed, so the +// gate reads the door the round came through instead. Versus rounds share +// the same ninety-second limit on both deterministic simulations. +function roundIsTimed() { + // A watcher is answering about somebody else's round. Everything below reads + // this machine's own fight, which for a watcher is not running — and a + // watcher that has not been served a frame yet has no round to report at + // all, so it must not paint a countdown for one. A stored demo still falls + // through: it IS a local re-run, and it was a timed round when recorded. + if (roundViewer && roundViewerMode !== "DEMO") + return roundViewerMode === "LIVE" && roundViewerTimed; + if (survivalActive()) return false; + // Training runs without a clock — except under the reel harness, where a + // scripted dummy bout wants the full round apparatus (clock, demo, result + // card) so it can be recorded and repainted like any match. + if (globalThis.__oskiewarTimedTraining === true) return true; + // Every round that reaches a re-simulation was a timed, recorded round. + if (resimActive) return resimTimed; + if (fightOpponent === "trainingbot") return false; + if (versusLane()) return true; + return !(players[1].npc && !players[1].bot); +} + +// This machine is the one that writes a versus fight down. Both seats +// simulate it, but the record needs exactly one author or the two would race +// for the same round id — the same reason only the host narrates the stream. +const versusRecorder = () => + versusActive() && (!netSession || netSession.seat === 0); + +// Which rounds leave a record. Timed rounds always did, and a versus fight +// does now: a room's history is the point of the room. The clock was never +// what made a round worth keeping, it was just the only lane that had one. +// The public demo/relay contract has two seats. Local three-player battles +// retain their in-memory round replay without publishing incompatible demos. +const roundIsRecorded = () => !freeForAll() && + (versusLane() ? versusRecorder() : roundIsTimed()); + +// The frame numbers the debug HUD already prints, packed for the wire. Only +// stages the host actually measured go in — a console reports a real frame and +// present time, a browser reports its rAF span and its own paint cost and +// nothing else — because a zeroed field on a public feed reads as a stall +// rather than as silence. Two decimals is the resolution AC_NATIVE_PROFILE +// prints at, and it holds the whole block under sixty bytes. +function spectatorPerf(run) { + const perf = { fps: Math.round(displayFps || 0) }; + const frameMs = Number(run.frameMs) || 0; + const renderMs = Number(run.renderCpuMs) || 0; + const hz = Number(run.refreshHz) || 0; + if (frameMs) perf.frameMs = Math.round(frameMs * 100) / 100; + if (renderMs) perf.renderMs = Math.round(renderMs * 100) / 100; + if (hz) perf.hz = Math.round(hz); + return perf; +} + +function spectatorState(now, nextRoundId = "") { + const run = runtime(); + const introAge = now - roundStartedAt; + const phase = instantReplay ? "replay" : matchOver ? "match" + : roundResult ? "round" : selecting ? "select" + : introAge < roundIntroDurationUs() ? "intro" : "fight"; + const timed = roundIsTimed(); + // An untimed frame reports zero rather than null: the relay reads every + // remainingMs as an integer, and the title screen's attract fight has no + // clock to misreport. + const remainingMs = roundResult || !timed ? 0 : Math.max(0, + Math.round((roundDurationUs - roundElapsedUs) / 1000)); + const state = { + format: "ac.oskiewar.live", version: 1, seq: liveSequence++, + map: { id: currentMapId, name: currentMapName, highlights: workshopHighlight, + ...(workshopMap ? { workshop: workshopMap } : {}) }, + at: run.unixMs || 0, phase, + course: skateparkMap ? "skatepark" : "station", + ropes: skateRopes.map((rope) => rope.nodes.map((node) => + [node.x, node.y, node.px, node.py].map((value) => Math.round(value * 100) / 100))), + previousRoundId: previousRoundName ? "ow-" + previousRoundName : "", + fighters: players.map((player) => ({ + // The title's still variant seats a fighter with no name yet, and the + // relay turns away a nameless one — so the empty seat gets called what + // it is rather than costing the whole frame. + name: player.name || "NOBODY", nation: player.nation || "", color: player.color, + x: player.x, y: player.y, + z: player.z, vx: player.vx, vy: player.vy, vz: player.vz, + skateboard: player.skateboard, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, + facing: player.facing, alive: player.alive, + grounded: player.grounded, ducking: player.ducking, + sinking: now < player.sinkUntil, + blocking: player.blocking, score: player.score, + roundWins: player.roundWins, attack: player.attackKind || "", + removedParts: player.removedParts.slice(), + // Three numbers the grandstand already knew how to read and had never + // been sent. `applyRoundViewerState` reconstructs the strike spark, the + // limb burst and the swing's real arc from them; without them a live + // watcher saw a body come apart in silence and every swing froze at one + // canned mid-pose. Two decimals is all a fade needs. + hit: Math.round((player.hit || 0) * 100) / 100, + blockFlash: Math.round((player.blockFlash || 0) * 100) / 100, + attackTicks: player.attackKind + ? Math.max(0, Math.round((now - player.attackStartedAt) / replayTickUs)) + : 0, + })), + // Shots and lobs, the fight's projectiles. These used to stay home: a + // watcher — and a challenger on an older build — watched fighters flinch + // and die with nothing visible in the air between them. Flat number rows + // rather than objects, because the relay caps a frame at 8 KiB and 24 + // rounds plus 12 grenades named longhand is most of that cap on its own. + // Velocity rides along so the playout buffer can carry a round smoothly + // between arrivals instead of stepping it 140 units at a time. + shots: bullets.filter((shot) => shot.life > 0).map((shot) => [ + Math.round(shot.x), Math.round(shot.y), Math.round(shot.z), + Math.round(shot.previousX ?? shot.x), + Math.round(shot.previousY ?? shot.y), + Math.round(shot.vx || 0), Math.round(shot.vy || 0), shot.owner | 0, + (shot.spit ? 1 : 0) | (shot.heavy ? 2 : 0) | (shot.rubber ? 4 : 0)]), + // The host's own impact track. A watcher was reconstructing sparks from + // the flag edges it could see, which covers a punch landing and nothing + // else: a ricochet, a spit splat, a ground pound's crater and a grenade's + // own blast raise no flag on any fighter, so they happened in silence on + // every screen but the host's. Newest twelve, each with the number that + // says whether a watcher has already seen it, and its remaining life so + // it is spawned at the age it really is. + impacts: impacts.filter((mark) => mark.life > 0).slice(-12) + .map((mark) => [mark.id | 0, Math.round(mark.x), Math.round(mark.y), + Math.round(mark.z), Math.round((mark.duration || .3) * 1000), + Math.round(Math.max(0, mark.life) * 1000), + (mark.death ? 1 : 0) | (mark.explosion ? 2 : 0)]), + lobs: grenades.filter((lob) => lob.alive).map((lob) => [ + Math.round(lob.x), Math.round(lob.y), Math.round(lob.z), + Math.round(lob.vx || 0), Math.round(lob.vy || 0), lob.owner | 0, + (lob.rocket ? 1 : 0) | (lob.exploding ? 2 : 0), + Math.round(lob.blastRadius || 0), + Math.round(Math.max(0, lob.fuse || 0) * 1000)]), + ball: { active: ball.active, x: ball.x, y: ball.y, + z: ball.z, radius: ball.radius, type: ball.type, mass: ball.mass }, + balls: balls.map((item) => ({ active: item.active, x: item.x, + y: item.y, z: item.z, radius: item.radius, type: item.type, + mass: item.mass, heldBy: item.heldBy, + spawnOwner: item.spawnOwner })), + camera: { x: cameraCenter, y: cameraCenterY, width: cameraWidth, + position: { ...cameraDoll.position }, target: { ...cameraDoll.target }, + perspective: cameraDoll.perspective, fov: cameraDoll.fov, + roll: cameraDoll.roll }, + wind: { direction: windDirection, mph: windMph }, + round: { remainingMs, timed, result: roundResult || "", + cause: roundCause || "", + // How long this round has been running, intro included. A timed round + // could be reconstructed from `remainingMs` alone, but the versus lane + // reports zero there — and a watcher deriving its clock from that zero + // pinned itself thirty seconds in the past, which is why it never + // counted a round off and never played an intro card. + elapsedMs: clamp(Math.round((now - roundStartedAt) / 1000), 0, 3600000) }, + // @jeffrey plays oskiewar.com in Edge on an Xbox, where there are no + // devtools and the console's own AC_NATIVE_PROFILE line only reaches a + // Device Portal on the same LAN. The live socket is the one channel that + // already leaves the box, so the frame rate rides out with the round and + // can be read from anywhere the round can. + perf: spectatorPerf(run), + }; + // A title-screen frame has no series, no round and no demo to link — the + // relay rejects an id it cannot parse, so an empty name stays off the wire + // entirely rather than riding out as "ow-". + if (seriesName) state.seriesId = "ow-" + seriesName; + if (matchName) { + state.roundId = "ow-" + matchName; + state.replayUrl = "/api/oskiewar-replays?id=ow-" + matchName; + } + if (sessionName) state.sessionId = "ow-" + sessionName; + if (nextRoundId) state.nextRoundId = nextRoundId; + return state; +} + +function publishSpectator(now, { target = matchName, nextRoundId = "", + force = false } = {}) { + // A timed versus round still uses its stable room via publishVersus. + if (versusLane() || !roundIsTimed() || !target || livePublishFailed || + typeof publishLive !== "function" || + (!force && now < liveNextAt)) return; + liveNextAt = now + liveSnapshotIntervalUs; + try { + publishLive("ow-" + target, + JSON.stringify(spectatorState(now, nextRoundId))); + } catch (error) { + // A native host with an older room-ID contract must never take down play. + // Disable only spectator publishing until the next match/host upgrade. + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// The session channel. Rounds publish their own rooms, but the app run itself +// keeps one room under its own name so an agent has somewhere to attach while +// nothing is being scored — the title screen included. It runs only while the +// debug bug is lit: every anonymous visitor idling on oskiewar.com would +// otherwise claim one of the relay's 128 rooms, and this channel exists for a +// maintainer who asked for it, not for an audience. While a timed round is on +// the wire the session room instead gets exactly one frame naming that round, +// which both points any watcher at the fight and retires this room's publisher +// so the native shell's single socket is free to follow. +function publishSession(now) { + if (freeForAll() || (!debugHitboxes && !globalThis.__oskiewarWorkshopEnabled) || + !sessionName || livePublishFailed || + typeof publishLive !== "function") return; + const liveRound = !versusLane() && roundIsTimed() && matchName ? matchName : ""; + if (liveRound) { + if (sessionAnnouncedRound === liveRound) return; + sessionAnnouncedRound = liveRound; + try { + publishLive("ow-" + sessionName, + JSON.stringify(spectatorState(now, "ow-" + liveRound))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } + return; + } + sessionAnnouncedRound = ""; + if (now < sessionNextAt) return; + sessionNextAt = now + sessionSnapshotIntervalUs; + try { + publishLive("ow-" + sessionName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +function inputCommand(pad) { + const input = quantizedInput(pad); + let mask = 0; + if (input.horizontal < 0) mask |= 1; + if (input.horizontal > 0) mask |= 2; + if (input.vertical > 0) mask |= 4; + if (input.vertical < 0) mask |= 8; + for (let index = 4; index < replayButtons.length; index++) + if (pad.down.includes(replayButtons[index])) mask |= 1 << index; + return mask; +} + +function recordReplayCommands(now, inputs = padSnapshots) { + if (!replay) return; + for (let pad = 0; pad < players.length; pad++) { + const command = players[pad].npc && !players[pad].bot + ? 0 : inputCommand(inputs[pad]); + if (command !== replayLastCommand[pad]) { + replay.commands.push([demoTick(now), pad, command]); + replayLastCommand[pad] = command; + } + } +} + +function replayFlags(player) { + // Bit 12 carries which way the fighter faces. Older demos lack it, so a + // replay treats "no facing bits" as "guess from velocity" — bit 13 marks + // that the pair below is real rather than an old demo's zero. + return (player.alive ? 1 : 0) | (player.grounded ? 2 : 0) | + (player.ducking ? 4 : 0) | (player.blocking ? 8 : 0) | + [...limbParts, "torso"].reduce((flags, part, index) => + flags | (hasPart(player, part) ? 0 : 1 << (index + 4)), 0) | + (player.facing > 0 ? 4096 : 0) | 8192 | + (player.hit > .05 ? 16384 : 0) | (player.blockFlash > .05 ? 32768 : 0); +} + +function recordReplayCheckpoint(now, force = false) { + if (!replay || (!force && now < replayNextCheckpointAt)) return; + replayNextCheckpointAt = now + replayCheckpointUs(); + const values = [demoTick(now)]; + for (const player of players) values.push( + Math.round(player.x), Math.round(player.y), Math.round(player.z), + Math.round(player.vx), Math.round(player.vy), replayFlags(player), + player.score, player.roundWins); + values.push(Math.round(ball.x), Math.round(ball.y), Math.round(ball.z), + Math.round(ball.vx), Math.round(ball.vy), ball.active ? 1 : 0, + Math.round(cameraCenter), Math.round(cameraCenterY), Math.round(cameraWidth)); + // The full camera pose rides along so a replay can stand the lens exactly + // where the live pass stood it — re-deriving position from width parks the + // camera inside close shots and near-clips the bodies it came to frame. + values.push(Math.round(cameraDoll.position.x), + Math.round(cameraDoll.position.y), Math.round(cameraDoll.position.z), + cameraDoll.perspective || 0, cameraDoll.fov || 55, cameraDoll.roll || 0); + replay.checkpoints.push(values); + // Dense demos also carry every impact the fight spawned, so the repaint + // can put the sparks and debris back instead of only moving bodies. + if (replayCheckpointUs() < 100000) for (const impact of impacts) + if (!impact.recordedTick) { + impact.recordedTick = demoTick(now) + 1; + replay.impacts?.push([demoTick(now), Math.round(impact.x), + Math.round(impact.y), Math.round(impact.z || 0), + impact.death ? 1 : impact.explosion ? 2 : 0, + Math.round((impact.duration || .3) * 1000)]); + } +} + +function makeRoundReplayFrame(now) { + const poseTime = (now - startedAt) / 1000000; + return { + ropes: structuredClone(skateRopes), + players: players.map((player) => ({ + x: player.x, y: player.y, z: player.z, + vx: player.vx, vy: player.vy, vz: player.vz, + facing: player.facing, grounded: player.grounded, + ducking: player.ducking, alive: player.alive, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, skateboard: player.skateboard, + blocking: player.blocking, blockFlash: player.blockFlash, hit: player.hit, + attackKind: player.attackKind, + attackStartedOffset: player.attackStartedAt - now, + attackUntilOffset: player.attackUntil - now, + geometry: runnerWorldGeometry(player, poseTime), + })), + ball: { x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, + active: ball.active }, + balls: balls.map((item) => ({ x: item.x, y: item.y, z: item.z, + vx: item.vx, vy: item.vy, active: item.active })), + camera: { center: cameraCenter, centerY: cameraCenterY, width: cameraWidth }, + }; +} + +function captureRoundReplay(now, force = false) { + if (!INSTANT_REPLAY) return; + if (!force && now - roundReplayLastAt < instantReplayStepUs) return; + roundReplayLastAt = now; + roundReplayFrames.push(makeRoundReplayFrame(now)); + while (roundReplayFrames.length > instantReplayMaxFrames) + roundReplayFrames.shift(); +} + +// A local picture history, never a simulation rewind. At 20Hz this keeps +// 1.2 seconds of rendered poses/effects; playback interpolates those poses +// while the authoritative round clock, inputs and rollback state keep running. +let finalKillReplayClockUs = null; +let finalKillReplayRendering = false; +let finalKillReplayHistory = []; +let finalKillReplayLastAt = -Infinity; +let finalKillReplayRound = ""; +let finalKillReplay = null; +let finalKillReplayResultAt = null; +const finalKillReplayStepUs = 50000; +const finalKillReplayMaxFrames = 26; +const finalKillReplaySceneArrays = () => ({ + balls, bullets, grenades, impacts, detachedParts, skateRopes, + gunPickups, saberPickups, grenadePickups, +}); +function resetFinalKillReplay() { + finalKillReplayHistory = []; finalKillReplay = null; finalKillReplayResultAt = null; + finalKillReplayLastAt = -Infinity; finalKillReplayRound = ""; + globalThis.__oskiewarFinalKillReplay = null; +} +function finalKillReplayActive() { + return !!(roundResult && finalKillReplay && finalKillReplay.round === matchName); +} +function captureFinalKillReplay(now, force = false) { + if (netSilent || finalKillReplayRendering || shellMode !== "GAME" || selecting) return; + if (finalKillReplayRound !== matchName || now < finalKillReplayLastAt) { + resetFinalKillReplay(); finalKillReplayRound = matchName; + } + // A rollback can retract a predicted KO. Its picture must retract too. + if (!roundResult && (finalKillReplay || finalKillReplayResultAt !== null)) {resetFinalKillReplay();finalKillReplayRound=matchName;} + if (finalKillReplay && (finalKillReplay.overAt !== roundOverAt || finalKillReplay.result !== roundResult)) { + resetFinalKillReplay();finalKillReplayRound=matchName; + } + if (finalKillReplay) return; + const firstResult = !!roundResult && finalKillReplayResultAt === null; + if (!force && now-finalKillReplayLastAt < finalKillReplayStepUs && !firstResult) return; + if (firstResult) finalKillReplayResultAt = now; + finalKillReplayLastAt = now; + const t = (now-startedAt)/1000000; + const frame = {now, players:players.map(player => { + const state = {}; + // Scalar pose/wardrobe flags only; no bot planner or net/input history. + for (const key in player) { + const value = player[key], type = typeof value; + if (value === null || type === "number" || type === "string" || type === "boolean") state[key] = value; + } + for (const key of ["removedParts","color","handleColors"]) + if (player[key]) state[key] = cloneFinalKillPicture(player[key]); + state.replayGeometry = cloneFinalKillPicture(player.replayGeometry || player.frozenGeometry || runnerWorldGeometry(player,t)); + return state; + }), arrays:{}}; + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) { + const limit = name === "impacts" ? 16 : name === "detachedParts" ? 48 : 64; + frame.arrays[name] = cloneFinalKillPicture(array.slice(-limit)); + } + finalKillReplayHistory.push(frame); + if (finalKillReplayHistory.length > finalKillReplayMaxFrames) finalKillReplayHistory.shift(); + if (roundResult && now-finalKillReplayResultAt >= 250000) { + finalKillReplay = {round:matchName,overAt:roundOverAt,result:roundResult,frames:finalKillReplayHistory.slice(), + wallStarted:hostRuntime().monotonicUs, endedAt:now}; + } +} +// These are plain visual records. Native QuickJS also runs without a browser +// structuredClone, so keep the recorder independent of the LAN adapter. +function cloneFinalKillPicture(value) { + if (value === null || typeof value !== "object") return value; + if (Array.isArray(value)) return value.map(cloneFinalKillPicture); + const copy = {}; + for (const key of Object.keys(value)) copy[key] = cloneFinalKillPicture(value[key]); + return copy; +} +function blendFinalKillPicture(a,b,alpha) { + if (typeof a === "number" && typeof b === "number" && Number.isFinite(a) && Number.isFinite(b)) + return lerp(a,b,alpha); + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) return cloneFinalKillPicture(alpha < .5 ? a : b); + return a.map((item,index)=>blendFinalKillPicture(item,b[index],alpha)); + } + if (a && b && typeof a === "object" && typeof b === "object") { + if (a.part !== b.part || a.id !== b.id) return cloneFinalKillPicture(alpha < .5 ? a : b); + const out = {}; + for (const key of Object.keys(alpha < .5 ? a : b)) + out[key] = key in a && key in b ? blendFinalKillPicture(a[key],b[key],alpha) + : cloneFinalKillPicture((alpha < .5 ? a : b)[key]); + return out; + } + return alpha < .5 ? a : b; +} +function beginFinalKillReplay(wallNow = hostRuntime().monotonicUs) { + if (!finalKillReplayActive()) return () => {}; + const replay = finalKillReplay, frames = replay.frames; + const elapsed = Math.max(0,wallNow-replay.wallStarted); + // Each angle shows the same final impact. No empty interval between loops. + const shotUs = 1800000, shot = Math.floor(elapsed/shotUs)%3; + const phase = (elapsed%shotUs)/shotUs; + const end = frames[frames.length-1].now; + const start = Math.max(frames[0].now,end-800000); + const at = lerp(start,end,Math.min(1,phase/.86)); + let index = 0; + while(index+1({...originals.players[i],...sample}))); + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) { + originals.arrays[name] = array.slice(); + array.splice(0,array.length,...blendFinalKillPicture(a.arrays[name],b.arrays[name],alpha)); + } + finalKillReplayClockUs = at; finalKillReplayRendering = true; + const xs = players.map(p=>p.x), ys = players.map(p=>p.y); + // Detached heads and fragments remain inside the shot rather than being + // lost behind a dramatic lens. Stay in front of the arena's back wall. + const fighterLeft=Math.min(...xs)-700, fighterRight=Math.max(...xs)+700; + const fighterTop=Math.min(...ys)-700, fighterBottom=Math.max(...ys)+700; + for (const part of detachedParts) { + if (![part.x1,part.x2,part.y1,part.y2].every(Number.isFinite) || + part.x1fighterRight || + part.y1fighterBottom) continue; + xs.push(clamp(part.x1,fighterLeft,fighterRight),clamp(part.x2,fighterLeft,fighterRight)); + ys.push(clamp(part.y1,fighterTop,fighterBottom),clamp(part.y2,fighterTop,fighterBottom)); + } + const left=Math.min(...xs),right=Math.max(...xs),top=Math.min(...ys)-230,bottom=Math.max(...ys)+80; + cameraCenter=(left+right)/2;cameraCenterY=(top+bottom)/2; + cameraWidth=Math.max(850,(right-left+520)*1.3,(bottom-top+220)*cameraAspect*1.3); + const angle=[-.40,.40,0][shot]+Math.sin(phase*Math.PI)*.13; + const distance=cameraWidth*1.55; + cameraDoll.position={x:cameraCenter+Math.sin(angle)*distance, + y:cameraCenterY-cameraWidth*(shot===2?.52:.16),z:-Math.cos(angle)*distance}; + cameraDoll.target={x:cameraCenter,y:cameraCenterY,z:0}; + cameraDoll.width=cameraWidth;cameraDoll.roll=0;cameraDoll.perspective=.75;cameraDoll.fov=48;cameraDoll.dirty=true; + globalThis.__oskiewarFinalKillReplay={active:true,shot,phase,frames:frames.length,speed:.52}; + return () => { + players.splice(0,players.length,...originals.players); + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) + array.splice(0,array.length,...originals.arrays[name]); + cameraCenter=originals.cameraCenter;cameraCenterY=originals.cameraCenterY; + cameraWidth=originals.cameraWidth;cameraContainFloor=originals.cameraContainFloor; + Object.assign(cameraDoll,originals.doll); + finalKillReplayClockUs=originals.clock;finalKillReplayRendering=false; + }; +} + +// Keep a replay's impact visible through overhead platforms. This changes +// presentation only: supporting decks and platforms behind the action remain. +function finalKillLedgeOccludes(ledge,near,far) { + if (!finalKillReplayRendering) return false; + const eye=cameraDoll.position; + const targets=players.flatMap(player=>{ + const head=player.replayGeometry?.head; + return head ? [head,{x:head.x-head.radius,y:head.y,z:head.z}, + {x:head.x+head.radius,y:head.y,z:head.z}, + {x:player.x,y:player.y-90,z:player.z}] : []; + }); + for(const part of detachedParts) targets.push({x:part.x1,y:part.y1,z:part.z1}); + for(const effect of impacts) targets.push({x:effect.x,y:effect.y,z:effect.z||0}); + for(const point of targets) { + const dy=point.y-eye.y; + if(Math.abs(dy)<.001) continue; + const along=(ledge.y-eye.y)/dy; + if(along<=0 || along>=1) continue; + const x=lerp(eye.x,point.x,along),z=lerp(eye.z,point.z,along); + if(x>=ledge.left-24 && x<=ledge.right+24 && z>=near-24 && z<=far+24) return true; + } + return false; +} + +const frameTelemetrySchema = ["us", "cameraX", "cameraY", "cameraWidth", + "dollX", "dollY", "dollZ", "targetX", "targetY", "targetZ", + "dollWidth", "roll", "p1x", "p1y", "p1z", "p1vx", "p1vy", + "p2x", "p2y", "p2z", "p2vx", "p2vy"]; + +function captureFrameTelemetry(now, force = false) { + if (netSilent || selecting || shellMode === "MENU") return; + const round = (value) => Math.round(Number(value || 0) * 100) / 100; + frameTelemetry.push([ + Math.round(now - roundStartedAt), round(cameraCenter), round(cameraCenterY), + round(cameraWidth), round(cameraDoll.position.x), round(cameraDoll.position.y), + round(cameraDoll.position.z), round(cameraDoll.target.x), + round(cameraDoll.target.y), round(cameraDoll.target.z), + round(cameraDoll.width), round(cameraDoll.roll), + ...players.flatMap((player) => [round(player.x), round(player.y), + round(player.z), round(player.vx), round(player.vy)]), + ]); + if (!force && now < frameTelemetryFlushAt) return; + telemetry("FIGHT_TRACE", JSON.stringify({ + format: "ac.oskiewar.frames", version: 1, round: "ow-" + matchName, + schema: freeForAll() ? [...frameTelemetrySchema, "p3x", "p3y", "p3z", "p3vx", "p3vy"] + : frameTelemetrySchema, frames: frameTelemetry, + })); + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; +} + +function applyRoundReplayFrame(frame, now) { + if (frame.ropes) skateRopes.splice(0, skateRopes.length, ...structuredClone(frame.ropes)); + for (let index = 0; index < players.length; index++) { + const player = players[index]; + const state = frame.players[index]; + for (const key of ["x", "y", "z", "vx", "vy", "vz", "facing", + "grounded", "ducking", "alive", "blocking", "blockFlash", "hit", + "attackKind", "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) player[key] = state[key]; + player.attackStartedAt = now + state.attackStartedOffset; + player.attackUntil = now + state.attackUntilOffset; + player.replayGeometry = state.geometry; + } + const frameBalls = frame.balls || [frame.ball]; + for (let index = 0; index < balls.length; index++) { + const state = frameBalls[index]; + if (!state) continue; + for (const key of ["x", "y", "z", "vx", "vy", "active"]) + balls[index][key] = state[key]; + } + cameraCenter = frame.camera.center; + cameraCenterY = frame.camera.centerY; + cameraWidth = frame.camera.width; +} + +function finishInstantReplay(now) { + if (!instantReplay) return; + applyRoundReplayFrame(instantReplay.endFrame, now); + for (const player of players) delete player.replayGeometry; + instantReplay = null; + roundOverAt = now; + replayOfferPrevious = padSnapshots[0]?.down?.slice() || []; +} + +// A replay is worth watching at the speed the eye needs, not the speed the +// clock kept. Frames already record what a hit looks like, so the playhead can +// read its own footage and slow itself into the action rather than being told +// where the action is — which means every replay already in the store gets +// this without being re-recorded. +function frameAction(frame) { + let action = 0; + for (const player of frame.players) { + if (!player.alive) action = Math.max(action, 1); + if (player.hit) action = Math.max(action, 1); + if (player.blockFlash > 0) action = Math.max(action, .7 * player.blockFlash); + // A swing that has started but not yet landed is the part worth stretching. + if (player.attackKind && player.attackUntilOffset > 0) + action = Math.max(action, .35); + } + return action; +} + +// Look ahead, so the ramp is already down by the time the punch arrives. A +// slowdown that begins on the frame of impact has missed the impact. +function replayActionCurve(frames) { + const raw = frames.map(frameAction); + return raw.map((_, index) => { + let peak = 0; + for (let at = index; at < Math.min(raw.length, index + replayActionLead); at++) + peak = Math.max(peak, raw[at] * (1 - (at - index) / replayActionLead * .35)); + return peak; + }); +} + +// One step of the speed ramp, kept pure so it can be tested and so the demo +// viewer can share it when its playhead learns to accumulate. Easing rather +// than snapping — and capping how far the speed may travel per second of real +// time — is what keeps a dense run of hits reading as one long stretch rather +// than a stutter. +function replayRampStep(speed, action, elapsedSeconds) { + const target = lerp(1, replaySlowest, clamp(action, 0, 1)); + return speed + (target - speed) * + Math.min(1, Math.max(0, elapsedSeconds) * replayRampPerSecond); +} + +function startInstantReplay(now) { + if (!INSTANT_REPLAY) return false; + if (roundReplayFrames.length < 2) return false; + const frames = roundReplayFrames.slice(); + instantReplay = { frames, cursor: 0, lastAt: now, paused: false, + previous: padSnapshots[0]?.down?.slice() || [], + action: replayActionCurve(frames), speed: 1, + endFrame: frames[frames.length - 1] }; + impacts.length = 0; + detachedParts.length = 0; + applyRoundReplayFrame(frames[0], now); + telemetry("ROUND_REPLAY", "start frames=" + frames.length); + return true; +} + +function updateInstantReplay(now, dt) { + if (!instantReplay) return; + const down = padSnapshots[0]?.down || []; + const pressed = (button) => down.includes(button) && + !instantReplay.previous.includes(button); + if (pressed("B")) { + finishInstantReplay(now); + return; + } + if (pressed("A")) instantReplay.paused = !instantReplay.paused; + if (pressed("ArrowLeft") || pressed("ArrowRight")) { + instantReplay.paused = true; + instantReplay.cursor += pressed("ArrowLeft") ? -15 : 15; + } + const elapsed = Math.max(0, now - instantReplay.lastAt) / 1000000; + instantReplay.speed = replayRampStep(instantReplay.speed, + instantReplay.action?.[Math.floor(instantReplay.cursor)] || 0, elapsed); + if (!instantReplay.paused) + instantReplay.cursor += (now - instantReplay.lastAt) / + instantReplayStepUs * instantReplay.speed; + instantReplay.lastAt = now; + instantReplay.cursor = clamp(instantReplay.cursor, 0, + instantReplay.frames.length); + if (instantReplay.cursor >= instantReplay.frames.length) { + finishInstantReplay(now); + return; + } + applyRoundReplayFrame(instantReplay.frames[Math.floor(instantReplay.cursor)], now); + instantReplay.previous = down.slice(); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter - cameraWidth * .06, + y: cameraCenterY - cameraWidth * .04, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: 0, fov: 55 }, dt, 18); +} + +// A finished round in a rollback fight is not finished yet: the frames that +// ended it are still inside the rollback window, and a rival pad arriving late +// can take the knockout back. So the round is marked and filed later, from +// netTick, once both seats have confirmed past its end. A re-simulation +// reaches this line again and simply re-marks the frame. +function saveRoundReplay(now) { + if (!replay) return; + if (netSession) { replayPendingSaveFrame = netSession.frame; return; } + uploadRoundReplay(now); +} + +// Everything that is waiting, filed now whatever the wire is doing. A rival +// who has gone will never confirm anything, and the round they lost still +// happened. +function flushPendingRoundReplay(now) { + if (replayPendingSaveFrame < 0 || !replay) return; + replayPendingSaveFrame = -1; + uploadRoundReplay(now); + if (matchOver) finishReplay(); +} + +function uploadRoundReplay(now) { + if (!replay || workshopTainted) return; + recordReplayCheckpoint(now, true); + const demo = JSON.parse(JSON.stringify(replay)); + demo.matchId = "ow-" + matchName; + demo.matchName = matchName; + demo.roundId = demo.matchId; + demo.roundName = matchName; + demo.roundIndex = Math.max(0, replay.roundIds.length - 1); + // Read off the ledger rather than off `previousRoundName`, so a rollback + // that took a rollover back cannot leave the linkage pointing at a round + // that no longer exists. + demo.previousRoundId = demo.roundIndex > 0 + ? replay.roundIds[demo.roundIndex - 1] : ""; + demo.durationTicks = demoTick(now); + // The names as they were when the round was PLAYED. `replay.fighters` was + // taken when the series opened, which in a versus fight is before the deal + // has dressed either seat — so the winner below could be somebody the demo + // never listed, and the store refused the round with "Invalid winner". + demo.fighters = players.map((player) => player.name); + demo.nations = players.map((player) => player.nation || ""); + demo.winner = players[0].score === players[1].score ? null + : players[0].score > players[1].score ? players[0].name : players[1].name; + demo.finalRoundWins = players.map((player) => player.roundWins); + delete demo.startedMonotonicUs; + const payload = JSON.stringify(demo); + // A dense reel demo is fat by design and never leaves the local shell; the + // half-megabyte gate is for demos headed to the production store. + const payloadLimit = globalThis.__oskiewarDenseReplay ? 8388608 : 524288; + if (payload.length <= payloadLimit && typeof saveReplay === "function") { + const upload = saveReplay(payload); + // Only promise-returning hosts can prove the upload completed. The web + // host does; older native hosts keep saving silently until they adopt the + // same acknowledgement contract. + if (upload && typeof upload.then === "function") + upload.then((saved) => { + if (saved !== true) return; + playDrum("modem", .72, 0); + telemetry("REPLAY", "uploaded " + demo.roundId); + }).catch((error) => telemetry("REPLAY", "upload-error " + error.message)); + telemetry("REPLAY", "queued " + demo.roundId + " bytes=" + payload.length); + } else telemetry("REPLAY", "not-saved bytes=" + payload.length); +} + +function finishReplay() { + if (replayPendingSaveFrame >= 0 && replay) { + replayPendingSaveFrame = -1; + uploadRoundReplay(runtime().monotonicUs); + } + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = null; +} + +function emitSignal(event, player = -1, value = 0, value2 = 0) { + // Filed first, and filed even while re-simulating: a rollback truncated + // these rows and the silent pass is what puts the corrected ones back. What + // the silence is for is the PERFORMANCE below — nobody hears a frame twice. + if (replay) replay.events.push([demoTick(runtime().monotonicUs), event, + player, Math.round(value * 1000) / 1000, Math.round(value2 * 1000) / 1000]); + if (netSilent) return; + if (typeof gameSignal === "function") gameSignal(event, player, value, value2); +} + +// Revision 37 exposes native bell/woosh voices in the mixer but its QuickJS +// allowlist predates those names. Fall back without stopping the match; newer +// hosts and the browser still receive the authored voice unchanged. +function playDrum(name, velocity = 1, pan = 0) { + if (performanceStageActive()) return; + if (netSilent || typeof drum !== "function") return; + try { + drum(name, velocity, pan); + } catch (error) { + if (name !== "bell" && name !== "whoosh") throw error; + if (name === "bell" && typeof synth === "function") { + try { synth(880, .12); } catch (_) {} + } + try { + drum(name === "bell" ? "hat" : "block", velocity * .65, pan); + } catch (_) {} + } +} + +function playSine(frequency, duration = .12) { + if (performanceStageActive()) return; + if (netSilent || typeof synth !== "function") return; + try { synth(frequency, duration); } catch (_) {} +} + +let clientError = ""; +let clientErrorDetail = null; +let clientErrorAt = -1; +let clientErrorQr = null; +let clientErrorDumpUrl = ""; + +function clientStateDump() { + try { + const run = runtime(); + return { + build: "v" + buildVersion, + shell: shellMode, + round: { + id: matchName || "local", + result: roundResult || "active", + elapsedMs: Math.round(roundElapsedUs / 1000), + }, + runtime: { + sim: Number(run?.simCount || 0), + paint: Number(run?.paintCount || 0), + unixMs: Number(run?.unixMs || 0), + }, + camera: { + x: Math.round(cameraCenter), y: Math.round(cameraCenterY), + width: Math.round(cameraWidth), aspect: Math.round(cameraAspect * 1000) / 1000, + }, + players: players.map((player) => ({ + handle: player.name, stance: player.stance, alive: player.alive, + x: Math.round(player.x), y: Math.round(player.y), z: Math.round(player.z), + vx: Math.round(player.vx), vy: Math.round(player.vy), + input: [player.inputX, player.inputY], + removed: player.removedParts?.slice() || [], + })), + balls: balls.filter((item) => item.active).map((item) => ({ + type: item.type, x: Math.round(item.x), y: Math.round(item.y), + vx: Math.round(item.vx), vy: Math.round(item.vy), heldBy: item.heldBy, + })), + }; + } catch (error) { + return { dumpError: String(error?.message || error || "state unavailable") }; + } +} + +function errorNowUs() { + try { + const value = Number(runtime()?.monotonicUs); + if (Number.isFinite(value)) return value; + } catch (_) {} + return 0; +} + +// btoa only speaks latin-1, so the dump flattens to ASCII before encoding. +function base64Url(text) { + if (typeof btoa !== "function") return ""; + return btoa(String(text).replace(/[^\x20-\x7e]/g, "?")) + .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +// The QR carries the entire dump in its own URL, so a crash stays shareable +// even when the console never managed to post its report. Fat fields drop +// away until the payload fits a code that is still scannable off a TV. +function buildClientErrorDump(detail) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + const stack = String(detail.stack || "").split(/\r?\n/).slice(0, 4) + .map((line) => line.trim()).filter(Boolean).join(" | ").slice(0, 240); + for (const trace of [stack, ""]) { + const url = errorDumpBase + base64Url(JSON.stringify({ + v: 1, p: detail.phase, n: detail.name, m: detail.message, + src: detail.source, k: trace || undefined, s: detail.state, + })); + if (url.length <= 2048 && typeof qrcode === "function") { + try { + clientErrorQr = qrcode(url, { errorCorrectLevel: 1 }); + clientErrorDumpUrl = url; + return; + } catch (_) {} + } + } +} + +function errorRestartSeconds() { + if (clientErrorAt < 0) return 0; + return Math.max(0, + Math.ceil((errorRestartUs - (errorNowUs() - clientErrorAt)) / 1000000)); +} + +// A crashed console should not sit on a dead screen forever. The error holds +// long enough to read and scan, then the piece boots itself again. +function restartAfterClientError() { + if (clientErrorAt < 0 || errorNowUs() - clientErrorAt < errorRestartUs) return; + clientError = ""; + clientErrorDetail = null; + clientErrorAt = -1; + clientErrorQr = null; + clientErrorDumpUrl = ""; + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + try { telemetry("SHELL", "error->restart"); } catch (_) {} + boot(); +} + +function errorSource(stack) { + const match = String(stack || "").match( + /(?:\(|\s|^)((?:[a-z]+:\/\/)?[^\s()]+):(\d+):(\d+)\)?/i); + return match ? { file: match[1], line: Number(match[2]), column: Number(match[3]) } + : null; +} + +function captureClientError(phase, error) { + if (clientErrorDetail) return; + const stack = error?.stack ? String(error.stack) : ""; + const message = error?.message ? String(error.message) + : String(error || "unknown error"); + const name = String(error?.name || "Error"); + const state = clientStateDump(); + clientErrorDetail = { + phase: String(phase || "runtime"), name, message, stack, + source: errorSource(stack), state, + reportStatus: "queued for server", + }; + const detail = stack || (name + ": " + message); + clientError = (clientErrorDetail.phase + ": " + detail) + .replace(/[^\x20-\x7e]+/g, " ").replace(/\s+/g, " ").trim(); + clientErrorAt = errorNowUs(); + try { buildClientErrorDump(clientErrorDetail); } catch (_) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + } + try { + telemetry("CLIENT_ERROR", JSON.stringify({ + phase: clientErrorDetail.phase, name, message, stack, + source: clientErrorDetail.source, state, + })); + } catch (_) { + clientErrorDetail.reportStatus = "local report only"; + } +} + +function clientErrorLines(text, limit = 58) { + const words = String(text).split(" "); + const lines = []; + let line = ""; + for (let word of words) { + if (word.length > limit) { + if (line) { lines.push(line); line = ""; } + while (word.length > limit) { + lines.push(word.slice(0, limit)); + word = word.slice(limit); + } + if (!word) continue; + } + if (!line) line = word; + else if (line.length + word.length + 1 <= limit) line += " " + word; + else { lines.push(line); line = word; } + } + if (line) lines.push(line); + return lines.slice(0, 9); +} + +function errorTypeWrite(text, x, y, size, ...color) { + try { + typeWrite(text, x, y, size, ...color); + } catch (_) { + // Error reporting must survive a font renderer failure of its own. + try { systemWrite(String(text).toLowerCase(), x, y, size, ...color); } + catch (_) {} + } +} + +// Diagnostic lines are dense, so every token gets its own ink: handles read as +// people, numbers as measurements, units as scale, and the rest as labels. +const dumpUnits = new Set(["px", "ms", "us", "fps", "vx", "vy", "vz", "in", + "stk", "pos", "vel", "t", "pts"]); + +function dumpTokens(text) { + return String(text).match(/@[a-z0-9_]+|[-+]?\d*\.?\d+|[a-z]+|\s+|./gi) || []; +} + +function dumpTokenInk(token) { + if (token[0] === "@") return [255, 126, 205]; + if (/^[-+]?[\d.]+$/.test(token)) return [116, 255, 184]; + if (/^[a-z]+$/i.test(token)) return dumpUnits.has(token.toLowerCase()) + ? [255, 205, 74] : [188, 204, 230]; + return [112, 234, 255]; +} + +function writeTokens(write, text, x, y, size) { + let cursor = x; + for (const token of dumpTokens(text)) { + if (token.trim()) write(token, cursor, y, size, ...dumpTokenInk(token)); + cursor += handleWidth(token, size); + } +} + +const writeDumpLine = (text, x, y, size) => + writeTokens(errorTypeWrite, text, x, y, size); + +// The HUD sits over sky and ground, so each token carries its own contrast +// shadow the way a handle glyph does. +function writeHudLine(text, x, y, size) { + writeTokens((token, tx, ty, ts, ...color) => + typeWrite(token, tx + 3, ty + 4, ts, ...runShadow(color)), + text, x, y, size); + writeTokens(typeWrite, text, x, y, size); +} + +function errorReportStatus() { + try { + const status = String(runtime()?.clientErrorReportStatus || "").trim(); + if (status) return status; + } catch (_) {} + return clientErrorDetail?.reportStatus || "queued for server"; +} + +function stateDumpRows(state) { + if (!state) return [{ icon: "mode", text: "state unavailable" }]; + if (state.dumpError) + return [{ icon: "mode", text: "state unavailable: " + state.dumpError }]; + const playerRow = (player, index) => ({ icon: "player", + text: "p" + (index + 1) + " " + player.handle + " " + + player.stance.toLowerCase() + " pos " + player.x + "," + player.y + + "," + player.z + " vel " + player.vx + "," + player.vy + + (player.removed?.length ? " lost " + player.removed.join(",") : "") }); + return [ + { icon: "build", text: "build " + state.build }, + { icon: "mode", text: "mode " + state.shell.toLowerCase() + + " round " + state.round.id + " " + state.round.result.toLowerCase() + + " " + state.round.elapsedMs + "ms" }, + { icon: "camera", text: "camera " + state.camera.x + "," + state.camera.y + + " width " + state.camera.width + " aspect " + state.camera.aspect }, + ...(state.players || []).map(playerRow), + { icon: "ball", text: "balls " + (state.balls || []).map((ball) => + ball.type + "@" + ball.x + "," + ball.y + " v" + ball.vx + "," + ball.vy) + .join(" ") }, + ]; +} + +const dumpIconInk = { build: [116, 128, 156], mode: [255, 205, 74], + camera: [112, 214, 255], player: [206, 166, 255], ball: [116, 255, 184] }; + +function drawDumpIcon(kind, x, y, size) { + const ink = dumpIconInk[kind] || [112, 234, 255]; + const unit = Math.max(2, Math.round(size / 9)); + try { + if (kind === "build") + for (let row = 0; row < 3; row++) + hudBox(x, y + row * unit * 3, size - row * unit * 2, unit * 2, ...ink); + else if (kind === "camera") { + strokeBox(x, y + unit, size, size - unit * 2, unit, ink); + hudBox(x + unit * 3, y + unit * 3, size - unit * 6, size - unit * 6, ...ink); + } else if (kind === "player") { + hudBox(x + unit * 2, y, size - unit * 4, unit * 3, ...ink); + hudBox(x, y + unit * 4, size, size - unit * 4, ...ink); + } else if (kind === "ball") { + hudBox(x + unit * 2, y, size - unit * 4, size, ...ink); + hudBox(x, y + unit * 2, size, size - unit * 4, ...ink); + } else strokeBox(x, y, size, size, unit, ink); + } catch (_) {} +} + +// Sized for a phone pointed at a television, so modules stay chunky and the +// state dump wraps narrower to keep clear of the code. +function errorQrGeometry(width, height) { + if (!clientErrorQr || typeof clientErrorQr.getModuleCount !== "function") + return null; + const count = clientErrorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor(Math.min(width * .3, height * .52) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + return { count, quiet, cell, size, + left: width - 92 - size, top: height - 96 - size }; +} + +// Drawn with raw boxes rather than the projected screenRect the HUD uses — +// the triangle pipeline is exactly what may have just died. Dark modules +// coalesce into horizontal runs so a full code stays a few hundred draws. +function drawErrorQr(qr) { + if (!qr) return; + hudBox(qr.left, qr.top, qr.size, qr.size, 250, 250, 247); + for (let row = 0; row < qr.count; row++) { + let run = 0; + for (let column = 0; column <= qr.count; column++) { + if (column < qr.count && clientErrorQr.isDark(row, column)) { run++; continue; } + if (run) hudBox(qr.left + (column - run + qr.quiet) * qr.cell, + qr.top + (row + qr.quiet) * qr.cell, run * qr.cell, qr.cell, 7, 8, 14); + run = 0; + } + } +} + +// Same two-digit face as the round timer, reddening as the restart lands. +function drawErrorCountdown(width) { + const remaining = errorRestartSeconds(); + const text = String(Math.min(99, remaining)).padStart(2, "0"); + const danger = remaining <= 10; + const shake = danger + ? Math.sin(errorNowUs() / 1000000 * 35) * (11 - remaining) * .45 : 0; + let textWidth = 64; + try { textWidth = handleWidth(text, 52); } catch (_) {} + errorTypeWrite(text, width - 92 - textWidth + shake, 82, 52, + ...(danger ? [255, 92, 116] : [255, 205, 74])); +} + +function drawClientError() { + let width = 1920; + let height = 1080; + try { + const view = typeof gameView === "function" ? gameView() : null; + if (view && Number.isFinite(view.width)) width = view.width; + if (view && Number.isFinite(view.height)) height = view.height; + } catch (_) {} + const detail = clientErrorDetail || { + phase: "runtime", name: "Error", message: clientError, + stack: "", source: null, state: null, + }; + const qr = errorQrGeometry(width, height); + wipe(7, 9, 18); + box(48, 48, width - 96, height - 96, 30, 14, 27); + errorTypeWrite("the game needs a moment", 92, 82, 52, 255, 92, 116); + drawErrorCountdown(width); + errorTypeWrite("restarting safely", 94, 158, 31, 255, 205, 74); + const messageLines = clientErrorLines(detail.message, 66).slice(0, 2); + for (let index = 0; index < messageLines.length; index++) + errorTypeWrite(messageLines[index], 94, 226 + index * 42, + 31, 248, 244, 255); + let cursorY = 226 + messageLines.length * 42 + 28; + if (detail.source) { + errorTypeWrite("source", 94, cursorY, 29, 112, 234, 255); + errorTypeWrite(detail.source.file, 214, cursorY, 29, 190, 216, 255); + errorTypeWrite("line " + detail.source.line + " column " + detail.source.column, + Math.min(width - 430, 214 + detail.source.file.length * 17), cursorY, + 29, 116, 255, 184); + cursorY += 48; + } + errorTypeWrite("state dump", 94, cursorY, 29, 116, 255, 184); + cursorY += 42; + for (const row of stateDumpRows(detail.state).slice(0, 6)) { + let leading = true; + for (const wrapped of clientErrorLines(row.text, qr ? 68 : 78).slice(0, 2)) { + if (cursorY > height - 196) break; + if (leading) drawDumpIcon(row.icon, 94, cursorY + 4, 22); + writeDumpLine(wrapped, 132, cursorY, 27); + cursorY += 36; + leading = false; + } + } + drawErrorQr(qr); + if (qr) errorTypeWrite("scan to share this dump", + qr.left, qr.top - 42, 27, 116, 255, 184); + const report = errorReportStatus(); + const posted = report.startsWith("posted"); + errorTypeWrite(report, 94, height - 150, 30, + ...(posted ? [116, 255, 184] : [255, 205, 74])); + errorTypeWrite("relaunch or deploy an update", 94, height - 104, + 30, 190, 202, 230); +} + +function drawClientErrorFallback() { + try { wipe(7, 9, 18); } catch (_) {} + try { systemWrite("aesthetic.computer error", 72, 72, 48, 255, 92, 116); } catch (_) {} + try { systemWrite(errorReportStatus(), 72, 146, 30, 255, 205, 74); } catch (_) {} + try { + systemWrite("restart in " + errorRestartSeconds() + "s", 72, 200, 30, + 255, 205, 74); + } catch (_) {} +} + +function fighterProfile(handle) { + const live = Array.isArray(acFeed.fighters) + ? acFeed.fighters.find((profile) => profile.handle.toUpperCase() === handle.toUpperCase()) + : null; + const fallback = handle === "DUMMY" ? npcFighter + : handle === "SPIDERDUMMY" ? spiderDummyFighter + : handle === "BOT" ? botFighter + : selfPlayFighters.find((profile) => profile.handle === handle) || + fighterRoster.find((profile) => profile.handle === handle); + return { + mood: live?.mood || (handle === "@JEFFREY" && acFeed.moodHandle === "@jeffrey" + ? acFeed.mood : "") || fallback?.mood || "", + lastChat: live?.lastChat || fallback?.lastChat || "", + colors: live?.colors?.length + ? live.colors.map((color) => [color.r, color.g, color.b]) + : fallback?.colors || [], + }; +} + +function syncSignedInFighter() { + if (localVersusActive()) return; + const identity = acFeed?.player; + if (!identity?.handle || players[0].npc) return; + const handle = String(identity.handle).toUpperCase(); + if (players[0].name !== handle) players[0].name = handle; + const colors = Array.isArray(identity.colors) + ? identity.colors.map((color) => Array.isArray(color) + ? color.slice(0, 3) : [color.r, color.g, color.b]) + .filter((color) => color.every(Number.isFinite)) : []; + if (colors.length) { + players[0].handleColors = colors; + players[0].color = colors.reduce((sum, color) => sum.map((value, index) => + value + color[index] / colors.length), [0, 0, 0]).map(Math.round); + } +} + +function applyRoster(player, index) { + if (localVersusActive()) { + player.rosterIndex = [0, 2, 1][player.pad]; + player.name = "PLAYER " + (player.pad + 1); + player.color = fighterRoster[player.rosterIndex].color.slice(); + player.handleColors = []; + return; + } + if (player.npc) { + const fighter = selfPlay && player.bot ? selfPlayFighters[player.pad] + : player.bot ? botFighter + : player.spiderDummy ? spiderDummyFighter : npcFighter; + player.rosterIndex = -1; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = fighter.colors; + if (selfPlay && player.bot) { + // The color IS the nameplate: a self-play bot is called what it wears, + // so the card reads "CORAL WINS ROUND" and the demo carries the color + // name out to any replay that wants to dress the fighter again. The + // harness may force the first seat's color by name for a proof bout. + const forcedName = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const forcedWorn = player.pad === 0 && forcedName && + cssColorBook.find((entry) => entry.name === forcedName); + const dressed = forcedWorn || selfPlayWardrobe(player.pad); + player.color = dressed.rgb.slice(); + player.colorName = dressed.name; + player.name = dressed.name.toUpperCase(); + } + return; + } + if (player.pad === 0 && !acFeed?.player?.handle) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + // A test harness may dress the anonymous seat by CSS color name — + // "YELLOW vs DUMMY" is a scripted sonic and orientation proof, so the + // fighter's look has to be as reproducible as the fight. + const forced = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const worn = forced && cssColorBook.find((entry) => entry.name === forced); + if (worn) { + player.name = worn.name.toUpperCase(); + player.color = worn.rgb.slice(); + player.handleColors = []; + } + return; + } + // A negative index means there is no roster fighter here — an anonymous + // seat, or a remote one whose handle has not arrived. It used to wrap: -1 + // came out as the LAST roster entry, so an unnamed chair was dressed as a + // real person, and `Math.max(0, rosterIndex)` at the two versus callers + // floored it to the FIRST one instead. Between them an anonymous fight read + // as @JEFFREY against @SAT. Nobody is nobody. + if (index < 0) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + return; + } + const rosterIndex = index % fighterRoster.length; + const fighter = fighterRoster[rosterIndex]; + const profile = fighterProfile(fighter.handle); + player.rosterIndex = rosterIndex; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = profile.colors; +} + +// The one door into a fight. Training is free and anonymous — it is the front +// door and must never ask for anything, and `trainingbot` is that door's +// sparring partner: the bot's brain in a round that stays off the wire. Bot +// and ppl are what a handle buys, because they persist: a series, a published +// match, a replay, a ranking. Nothing opens those two doors yet, so only +// training reaches here and this call asks for nothing. +// +// The seam the sign-in actually landed on is `versusAllowed()`, because versus +// is the door that opened first: see `startVersusFight`. When bot and ppl open, +// they gate here on the same reader. +function startFightAgainst(kind, now) { + if (kind !== "local") setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + players[0].spawnX = tileCenterX(spawnColLeft); + players[1].spawnX = tileCenterX(spawnColRight); + if (players[2]) players[2].spawnX = tileCenterX((spawnColLeft + spawnColRight) / 2); + const opponent = players[1]; + fightOpponent = kind; + opponent.npc = kind === "dummy" || kind === "spiderdummy" || + kind === "bot" || kind === "trainingbot"; + opponent.bot = kind === "bot" || kind === "trainingbot"; + opponent.spiderDummy = kind === "spiderdummy"; + opponent.remote = false; + // Pad two is @OSKIE until ppl arrives carrying a handle of its own. + applyRoster(opponent, opponent.npc ? -1 : 2); + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + startReplay(now); + resetRound(now, true); + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +function survivalRequested() { + // The climb is a door asked for by name, and only by name. It used to be + // the empty door on any shell that could not raise the versus flag — the + // native consoles, whose publisher reads the relay and discards — which + // left the Xbox opening on the climb every boot. @jeffrey, on the console: + // "i dont like the climbing mode / map ... i want it in vs / dummy mode". + // So where versus cannot happen the empty door is the training fight + // (`beginTraining`, a sparring partner on the floor), the same landing the + // web gets when the relay is out of reach. + return String(globalThis.__oskiewarOpponent || "") + .trim().toLowerCase() === "survival"; +} + +const localVersusActive = () => fightOpponent === "local"; +// The web shell marks a pad `localController` when a physical gamepad is +// behind it; the console's pad object (QuickJsEngine PadObject) never +// carried the field, so `localControllerPair()` was false on the Xbox with +// three controllers plugged in and the dummy's chair never went to player +// two — @jeffrey, 2026-09-20: "it only sees one controller hmm". The native +// pad object carries no name or id either (PadObject: index, connected, +// sticks, triggers, down). What the console does have is `controllers()`, +// its enumeration of real hardware — a pad whose index sits inside that +// list is a local controller. The test harness stubs `gamepad` with two +// always-connected pads and defines no `controllers`, so its fights stay +// what they were; "connected" alone turned every harness fight into local +// versus (131 tests). +let nativeControllerCount = 0; +let nativeControllerPolls = 0; +function samplePad(index) { + let pad; + try { pad = gamepad(index); } catch (error) { + if (index < 2) throw error; + } + if (!pad) pad = { connected: false, down: [], leftX: 0, leftY: 0 }; + if (pad && pad.localController === undefined && pad.connected === true && + typeof controllers === "function") { + // Re-enumerate about twice a second; a pad joining mid-title waits at + // most that long for its chair. + if (index === 0 && nativeControllerPolls++ % 30 === 0) + nativeControllerCount = controllers().length; + if (index < nativeControllerCount) pad.localController = true; + } + return pad; +} +const localControllerPair = () => + padSnapshots.slice(0, 2).every((pad) => pad?.localController === true); +let localControllerPairSeen = false; +let localControllerMissing = -1; + +function startLocalVersus(now) { + finishReplay(); + fightOpponent = "local"; + setLocalPlayerCount(padSnapshots[2]?.localController === true ? 3 : 2); + telemetry("FIGHT_LOCAL_PLAYERS", String(players.length)); + for (const player of players) { + player.npc = false; + player.bot = false; + player.spiderDummy = false; + player.remote = false; + } + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + localControllerMissing = -1; + globalThis.__oskiewarVersusRoom = ""; + gameSpeed = 1; + startFightAgainst("local", now); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); +} + +function updateLocalVersus(now) { + const paired = localControllerPair(); + const arrived = paired && !localControllerPairSeen; + localControllerPairSeen = paired; + // A second local pad must never take over a remote fight or a recording. + if (roundViewer || netSession || selfPlay || resimActive || versusActive()) + return false; + if ((arrived && !localVersusActive()) || + (localVersusActive() && paired && players.length === 2 && + padSnapshots[2]?.localController === true)) startLocalVersus(now); + if (!localVersusActive()) { localControllerMissing = -1; return false; } + if (!paired || players.some((player) => + padSnapshots[player.pad]?.localController !== true)) { + localControllerMissing = padSnapshots.slice(0, players.length).findIndex( + (pad) => pad?.localController !== true); + return true; + } + if (localControllerMissing !== -1) { + localControllerMissing = -1; + // Restart the interrupted round with the match tally intact. Absolute + // attack/death timers cannot safely resume after an arbitrary unplug. + if (matchOver) startLocalVersus(now); + else resetRound(now, false, true); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); + } + return false; +} + +function versusRequested() { + return !String(globalThis.__oskiewarOpponent || "").trim() && + globalThis.__oskiewarVersusCapable === true; +} + +// --------------------------------------------------------------------------- +// The door. @jeffrey: "i think we should require users to axtually login in +// order to play... and also to make a handle in order to play". +// +// Training stays free and anonymous — it is the front door and must never ask +// for anything — and so does watching: the link a friend sends has to work for +// whoever opens it, account or no account. What a handle buys is the half of +// the game with another person on the other end of it, because that half is +// the half that persists. A fight against a stranger called RIVAL is not worth +// having; those placeholder names were the symptom, not the problem. +// +// The shell owns the account and the panel; this file owns the question of +// when the door is in the way. Two globals carry it: +// +// __oskiewarAccount { ready, signedIn, handle, colors } shell → game +// __oskiewarAccountDoor "" | "login" | "handle" game → shell +// The door is built, tested and wired on both sides, and it is held open until +// the tenant can actually let somebody through it. Native sign-in needs +// "Passwordless OTP" ticked on the Auth0 application, and as of 26.09.11 the +// tenant answers `unauthorized_client` — so the only way in is the redirect, +// which lands on the Universal Login page's Turnstile, which is the loop this +// whole flow exists to avoid. Requiring an account before there is a working +// way to make one does not gate the game, it closes it. +// +// Flip this to true the moment that grant is on. Everything behind it is +// already written and covered by tests, which drive it through +// `setVersusRequiresAccount`. +let versusRequiresAccount = false; + +const webAccountState = () => globalThis.__oskiewarAccount || null; +// Nobody is turned away before the shell has finished asking. A silent session +// check takes a moment, and a door that flashed up inside it would send a +// signed-in player off to sign in again. +const accountReady = () => webAccountState()?.ready === true; +const accountHandle = () => String(webAccountState()?.handle || ""); +// A shell with no account system at all is not a locked-out visitor, it is an +// older build, and it must not be left standing in a waiting room that can +// never start. The two halves of this door — the panel over there, the refusal +// here — ship together, and until the shell offers one there is nothing for +// this to hold shut. +// +// Which is the honest shape of it: this is a door, not a lock. The name on the +// wire has always been whatever the client says it is, and a console can set +// any global it likes. Enforcement would mean the relay verifying a token on +// the seat, and that is a different piece of work. +const versusAllowed = () => !versusRequiresAccount || !webAccountState() || + (accountReady() && webAccountState().signedIn === true && + Boolean(accountHandle())); + +// Which door, if any, stands between this visitor and a fight. Empty while the +// shell is still asking, and empty for anyone already through. +function versusDoor() { + if (!versusRequiresAccount) return ""; + if (!webAccountState() || !accountReady()) return ""; + if (webAccountState().signedIn !== true) return "login"; + if (!accountHandle()) return "handle"; + return ""; +} + +// Raised only while somebody is actually trying to play a person: standing in +// the waiting room, or holding a chair. A spectator is never asked for +// anything, and neither is the title screen. +// What this file last asked the shell for, so a panel that closes on its own +// can be told from one that was never open. +let accountDoorAsked = ""; + +function updateAccountDoor() { + const wanted = shellMode === "GAME" && versusLane() && !roundViewer + ? versusDoor() : ""; + const showing = globalThis.__oskiewarAccountDoor || ""; + // "never mind" drops every request the panel is holding, this one included. + // Left alone, the next frame would simply ask again and the panel would + // spring back up — which is not a dismissal, it is a trap. Somebody who + // backs out goes to the title screen instead, where the account button + // lives, where training is one press away, and where nothing is asking them + // for anything. + if (accountDoorAsked && wanted && !showing) { + accountDoorAsked = ""; + returnToTitle(runtime().monotonicUs, "account"); + return; + } + if (showing !== wanted) globalThis.__oskiewarAccountDoor = wanted; + accountDoorAsked = wanted; +} + +function startSurvivalRun(now, botControlled = false) { + gameMode = "survival"; + selfPlay = botControlled; + fightOpponent = "survival"; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + finishReplay(); + + const runner = players[0]; + runner.spawnX = centerX; + runner.npc = botControlled; + runner.bot = botControlled; + runner.spiderDummy = false; + applyRoster(runner, botControlled ? -1 : Math.max(0, runner.rosterIndex)); + + const absent = players[1]; + absent.spawnX = tileCenterX(cornerColRight); + absent.npc = true; + absent.bot = false; + absent.spiderDummy = false; + absent.remote = false; + applyRoster(absent, -1); + + resetRound(now, true); + absent.alive = false; + absent.respawnAt = Infinity; + absent.x = worldRight + gridWidth; + absent.y = floorY; + survivalStartedAt = now + survivalIntroDurationUs; + survivalLavaY = survivalLavaStart; + survivalHeight = 0; + survivalPeakLevel = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; + cameraWidth = survivalFrameWidth; + cameraContainFloor = 0; + cameraDoll.snap({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, + z: -survivalFrameWidth * 1.35 }, + width: survivalFrameWidth, perspective: 0, fov: 55, roll: 0 }); + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + pickup.active = false; + for (const item of balls) item.active = false; + emitSignal("survival", 0, 1, 0); +} + +// The title is a frozen first foothold, not an attract fight. START resets the +// runner and the lava together, so nobody loses a run beneath the wordmark. +function beginSurvival(now) { + setLocalPlayerCount(2); + startSurvivalRun(now, false); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - survivalIntroDurationUs; + survivalStartedAt = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; +} + +// Whatever you land on is already a live training fight; the wordmark simply +// floats over it. The intro countdown is spent before the first frame so +// somebody arriving from a QR code is moving, not watching a number. +function beginTraining(now) { + setLocalPlayerCount(2); + startFightAgainst(trainingOpponentKind(), now); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - roundIntroDurationUs(); + const forcedAttract = globalThis.__oskiewarAttractVariant; + titleAttractMode = forcedAttract === "still" || forcedAttract === "action" + ? forcedAttract : hashUnit(matchName) < .5 ? "still" : "action"; + if (titleAttractMode === "action") { + // The title demonstration is a bot working a training dummy, not two + // anonymous red bots. Preserve the dummy's cool neutral material so the + // matchup is legible before START is pressed. + players[0].npc = true; + players[0].bot = true; + players[0].spiderDummy = false; + applyRoster(players[0], -1); + players[1].npc = true; + players[1].bot = false; + players[1].spiderDummy = false; + applyRoster(players[1], -1); + } +} + +// The versus lobby: one fighter, an empty chair, and the address as the +// invitation. Everything a visitor can do here is practice — their own moves +// are named back at them — until the relay seats a rival, at which point +// updateVersusSeat opens the real fight. The empty chair is parked out past +// the wall the way survival parks it, so the camera, the scorekeeping and +// the reactions all read a one-body room. +function beginVersusLobby(now, { title = false } = {}) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus-lobby"; + finishReplay(); + seriesName = ""; + matchName = ""; + previousRoundName = ""; + if (!versusRoomName) versusRoomName = sessionName; + globalThis.__oskiewarVersusRoom = versusRoomName; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const chair = players[1]; + chair.spawnX = tileCenterX(spawnColRight); + chair.npc = true; + chair.bot = false; + chair.spiderDummy = false; + chair.remote = false; + applyRoster(chair, -1); + selecting = false; + shellMode = title ? "MENU" : "GAME"; + gameplayStarted = !title; + titleTransitionAt = null; + resetRound(now, true); + chair.alive = false; + chair.respawnAt = Infinity; + chair.x = worldRight + gridWidth; + chair.y = floorY; + // An empty chair wears no dummy's name — the wire calls it NOBODY. And the + // room forgets who was last in it, so the next person to sit down is dressed + // from their own offer rather than inheriting the last one's. + chair.name = ""; + versusRivalName = ""; + versusRivalOffered = ""; + // Spend the countdown before the first frame: arriving is moving, and + // there is nobody here to count in against anyway. + roundStartedAt = now - roundIntroDurationUs(); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + versusRoomName) : null; + emitSignal("versus-lobby", 0, 1, 0); +} + +// A rival took the chair. Seat them as a real second fighter — no bot brain, +// no npc stillness, their presses riding in off the relay — and open the +// round with the full countdown so both screens see the same three seconds. +function startVersusFight(now, resetMatch = true) { + // The one gate that matters: this is the call that puts two people in a + // round. Everything below it — publishing, the seat, the score — assumes + // both ends have a name worth writing down. + if (!versusAllowed()) return; + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus"; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const rival = players[1]; + rival.spawnX = tileCenterX(spawnColRight); + rival.npc = false; + rival.bot = false; + rival.spiderDummy = false; + rival.remote = true; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + // A fresh match is a fresh series, and a versus series is now recorded like + // any other. A round rollover inside a match keeps the one it has. + if (resetMatch) startReplay(now); + resetRound(now, resetMatch); + dressVersusRival(); + if (resetMatch && versusRecorder() && typeof analytics === "function") { + analytics("match_started", { + source_system: "browser", + surface: "web", + opponent_type: "remote-player", + }); + } + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +// What the rival is called and what they wear, read off the freshest input +// frame — the challenger mails their handle and colors with every press, so +// a name arriving late still lands. The relay already shape-checked both; +// the sanitize here is for the state schema's sake, because one bent name +// would cost every published frame. +function dressVersusRival() { + if (netSession) { netApplyIdentities(netSession.deal); return; } + const rival = players[1]; + if (!rival.remote) return; + const remote = globalThis.__oskiewarRemotePad; + const offered = versusOfferedName(); + versusRivalOffered = offered; + versusRivalName = /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : ""; + rival.name = versusRivalName; + const colors = (Array.isArray(remote?.colors) ? remote.colors : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)); + if (colors.length) { + rival.handleColors = colors; + rival.color = colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); + } else { + rival.handleColors = []; + rival.color = [38, 82, 176]; + } +} + +// The versus lane's own wire: one room, streamed faster than a grandstand +// needs because for the challenger this feed IS the game. It runs from the +// title screen on — a friend can arrive while the host is still reading the +// wordmark — and rides the same publisher socket the round rooms use. +function publishVersus(now) { + // Both seats simulate, but only the host narrates: the grandstand keeps + // the stream it always had, and the challenger never races the host for + // the room's one publisher socket. + if (netSession && netSession.seat !== 0) return; + if (netSilent || !versusLane() || !versusRoomName || livePublishFailed || + typeof publishLive !== "function") return; + // A waiting room nobody can be invited into is not a room. Publishing it + // would put it in front of the matchmaker as a chair to take. + if (!versusAllowed()) return; + // Paced on the WALL clock, not the simulation's. The driver runs up to four + // owed ticks in one instant to catch up, and a sim-clocked gate let every + // one of those emit its own frame — two or three full state builds in the + // same millisecond, arriving at the relay as a burst it can only coalesce. + // Catch-up is exactly when the fight is busiest, so the cost landed where + // there was least room for it. Wall time makes a burst one frame. + const wall = runtime().unixMs || 0; + if (wall && wall < versusNextAt) return; + versusNextAt = wall + versusSnapshotIntervalMs; + try { + publishLive("ow-" + versusRoomName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// Two visitors can arrive through the same dead address and both decide to +// host it. The relay lets exactly one publish; the other's shell hears "this +// match already has a publisher" and raises a flag, and this walks that +// loser back into the room as a challenger through the bridge it kept. +function updateVersusConflict(now) { + if (!versusLane() || !versusFallbackBridge) return false; + if (globalThis.__oskiewarPublishConflict !== "ow-" + versusRoomName) + return false; + globalThis.__oskiewarPublishConflict = ""; + const bridge = versusFallbackBridge; + versusFallbackBridge = null; + bridge.role = "challenger"; + roundViewer = bridge; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + roundResult = ""; + matchOver = false; + matchName = bridge.name || ""; + roundStartedAt = now - roundIntroDurationUs(); + roundViewerStop = bridge.start(handleRoundViewer); + telemetry("VERSUS_CONFLICT", versusRoomName); + return true; +} + +// The seat, watched every tick. Fresh presses in the lobby open the fight; +// a wire gone quiet mid-fight sends the room back to waiting. The rival's +// wardrobe follows their freshest frame because the handle can arrive after +// the chair was taken. +function updateVersusSeat(now) { + if (netSession) return; + if (updateVersusConflict(now)) return; + if (!versusLane()) return; + // A rival who can roll back says so on the net channel. Their first pad + // usually lands first, so the offer is taken here rather than only from + // the lobby — a streamed fight one second old is upgraded in place. + if (netPeerHello && netHostBegin(now)) return; + const fresh = versusChallengerFresh(); + if (lobbyActive() && fresh && versusAllowed()) { + startVersusFight(now, true); + return; + } + if (versusActive() && !fresh) { + beginVersusLobby(now); + return; + } + if (versusActive() && fresh && versusOfferedName() !== versusRivalOffered) + dressVersusRival(); +} + +// A dead body falling. No input, no collision with anybody, no ledges: a +// corpse is not a fighter and must not catch a rung it would have caught +// alive. It drops, it lands on the ground under it, and it stops. +function settleCorpse(player, dt) { + if (player.grounded) return; + player.vy += fallGravity() * dt; + player.x += player.vx * dt; + player.y += player.vy * dt; + player.vx *= .96; + const terrainY = terrainFloorAt(player.x); + if (player.y < terrainY) return; + player.y = terrainY; + player.vy = 0; + player.vx = 0; + player.grounded = true; +} + +// Lobby deaths have a respawn beat, but no round or killcam to reset state. +function updateLobbyMortality(now) { + if (!lobbyActive()) return; + const player = players[0]; + if (player.alive && hasPart(player, "torso")) return; + if (player.lobbyDeathDressed) return; + if (player.alive) { + player.alive = false; + player.lastButton = "DESTROYED"; + player.lastButtonAt = now; + spawnImpact({ x: player.x, y: player.y - 60, z: player.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(player)); + } + player.lobbyDeathDressed = true; + player.respawnAt = Math.max(player.respawnAt || 0, now + 2500000); + releaseCarriedBall(player, now); + releaseCarriedPart(player, now); + releaseCarriedFighter(player, now); + dismountSkateboard(player, now); + player.attackKind = player.itemAction = ""; + player.attackUntil = player.itemActionUntil = player.dashUntil = 0; + player.attackHit = player.blocking = player.grabHeld = false; + player.pounding = player.pogoDive = player.pogoHit = false; + player.jumpHeld = false; + player.runSince = player.walkSince = 0; + player.jumpPoseUntil = player.landPoseUntil = player.hopUntil = 0; + player.inputX = player.inputY = player.vx = 0; + player.stance = "HIT"; + delete player.frozenGeometry; + delete player.frozenAt; + deathCinematic = null; +} + +// Deprecated with PAL_SELECT — see the flag. +function beginSelect(now) { + selecting = true; + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + selectionReady[1] = false; + selectionPrevious[0] = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + roundResult = ""; + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + fightHitMarks.length = 0; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) + for (const mark of globalThis.__oskiewarFightHitForecast) + fightHitMarks.push({ at: clamp(Number(mark.at) || 0, 0, 1), + color: Array.isArray(mark.color) ? mark.color.slice(0, 3) : [226, 42, 66], + decisive: mark.decisive === true }); + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + roundStartedAt = now; + for (const player of activePlayers()) { + player.roundWins = 0; + player.score = 0; + player.alive = true; + } +} + +function returnToTitle(now, reason = "back") { + finishReplay(); + if (survivalActive()) beginSurvival(now); + else if (versusLane()) beginVersusLobby(now, { title: true }); + else beginTraining(now); + // Menu is a hard navigation boundary: discard the prior fight's zoom and + // right-stick diorama angle before the very first title frame is painted. + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + // The lobby frames its one fighter — the empty chair is parked past the + // wall, and averaging it in would sling the lens a map-width off stage. + cameraCenter = survivalActive() ? (worldLeft + worldRight) / 2 + : lobbyActive() ? players[0].x + : (players[0].x + players[1].x) / 2; + cameraCenterY = survivalActive() ? floorY - 240 + : lobbyActive() ? players[0].y - 90 + : (players[0].y + players[1].y) / 2 - 90; + cameraWidth = survivalActive() ? survivalFrameWidth + : lobbyActive() ? 980 + : Math.max(980, Math.abs(players[1].x - players[0].x) + 760); + cameraContainFloor = 0; + const cameraTarget = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.snap({ target: cameraTarget, + position: { x: cameraCenter, y: cameraCenterY, + z: -cameraWidth * 1.2 }, + width: cameraWidth, perspective: 0, fov: 55, roll: 0 }); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[0] = shellPrevious.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + playDrum("block", .8, 0); + telemetry("SHELL", "game->title " + reason + " " + now); +} + +// A mechanical test drives both fighters with the same bot and says so on the +// nameplates, instead of flying a handle nobody is holding. Entered through +// `__oskiewarSelfPlay` before boot or by calling this — never from a button, +// so normal play cannot fall into it. +function startSelfPlay(now) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = true; + // The harness is not the free door. A self-play run armed from a live title + // inherits whatever training was seated, and leaving that behind would keep + // the whole mechanical test off the wire — no demo, no rollover. + fightOpponent = ""; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of activePlayers()) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.remote = false; + player.rosterIndex = -1; + } + // The reel harness may seat the training dummy in the second chair — a + // scripted "COLOR vs DUMMY" proof bout. The dummy has no bot AI, so the + // timed-training flag keeps the round on the clock it would otherwise + // drop. + if (globalThis.__oskiewarSelfPlayOpponent === "dummy") + players[1].bot = false; + startReplay(now); + resetRound(now, true); + // No dealt equipment. The cube's blade and pistol wait on their floor + // tiles in self-play exactly as they do in a live match, and the bots arm + // themselves by walking over them — or don't. + // The bots' dice are seeded off the round clock, which a re-simulation + // cannot reproduce — so a dense demo carries the seeds themselves, and a + // replayed sim rolls exactly what the live pass rolled. Spawns ride along + // for the same reason: the fight can only rerun from where it stood. + if (replay && replayCheckpointUs() < 100000) { + replay.botSeeds = players.map((player) => player.botRngState >>> 0); + replay.spawns = players.map((player) => Math.round(player.spawnX)); + // Animation runs off the page-boot clock, and limb pose decides where a + // strike lands — a rerun needs the same phase or contacts wander. + replay.posePhaseUs = Math.round(now - startedAt); + } +} + +// Re-simulation: the offline renderer's honest path. Instead of puppeting +// recorded state, the page reruns the ACTUAL fight — same name stream, same +// ball, same bot dice — through the real simulation at the fixed step. Every +// limb tint, item drop, and debris mote is the engine's own, in the current +// build, with nothing lost to the demo schema. State checkpoints remain as a +// drift meter, not as the picture. +let resimActive = false; +// Whether the demo being re-run was a round on a clock. Versus rounds are not, +// and handing one a countdown it never had would end the re-run early on a +// fight the original played past. Demos recorded before this field carry no +// answer and were all timed. +let resimTimed = true; +let resimPending = null; +let resimTick = -1; +let resimCheckpoints = null; +let resimCommands = null; +let resimFirstRowTick = 0; +let resimCommandCursor = 0; +let resimMask = [0, 0]; + +// The inverse of `inputCommand`: a recorded mask back into the pad shape the +// sim reads. Replaying the live pass's actual inputs — instead of letting +// bot AI re-decide — pins every action to its recorded tick, which is what +// keeps the rerun's hits on the audio's timestamps. +function resimPad(pad) { + const mask = resimMask[pad] || 0; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + return { connected: true, down, leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; +} + +function advanceResimCommands() { + if (!resimCommands) return; + while (resimCommandCursor < resimCommands.length && + resimCommands[resimCommandCursor][0] <= resimTick) { + const [, pad, mask] = resimCommands[resimCommandCursor]; + resimMask[pad] = mask; + resimCommandCursor++; + } +} +function startResim(demo, now) { + configureWorldMap(demo.map); + gameMode = "fight"; + resimActive = true; + resimTimed = demo.timed !== false; + // The reset step is demo tick zero; every later sim step counts one. + resimTick = 0; + resimCheckpoints = new Map( + (demo.checkpoints || []).map((row) => [row[0], row])); + resimFirstRowTick = demo.checkpoints?.[0]?.[0] ?? 0; + resimCommands = demo.commands || null; + resimCommandCursor = 0; + resimMask = [0, 0]; + globalThis.__oskiewarResimDrift = { ticks: 0, maxDrift: 0, atTick: 0 }; + selfPlay = true; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of players) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.rosterIndex = -1; + } + if (demo.fighters?.[1] === "DUMMY") players[1].bot = false; + // A forced first-seat color survives in the demo as the fighter's own + // name, so the rerun dresses itself without being told. + const worn = String(demo.fighters?.[0] || "").toLowerCase(); + if (cssColorBook.some((entry) => entry.name === worn)) + globalThis.__oskiewarWardrobe = worn; + seedNames(demo.nameSeed >>> 0); + seriesName = demo.seriesName || demo.matchName || ""; + matchBallType = demo.ballType || seriesBallType(seriesName); + matchName = String(demo.roundName || "").replace(/^ow-/, ""); + if (Array.isArray(demo.spawns)) + players.forEach((player, index) => { + if (demo.spawns[index] != null) player.spawnX = demo.spawns[index]; + }); + replay = null; + resetRound(now, true); + // Self-play deals nothing at the bell, so the rerun starts from the same + // bare table: both weapons still on their tiles. + if (Array.isArray(demo.botSeeds)) + players.forEach((player, index) => { + if (demo.botSeeds[index] != null) + player.botRngState = demo.botSeeds[index] >>> 0; + }); + // The recording says which tick its fight opened on; anchoring the intro + // clock to that tick removes the ±1-step phase that clock rounding deals + // each pass, so replayed inputs land exactly where they were pressed. + const fightOpen = demo.checkpoints?.[0]?.[0]; + if (fightOpen) roundStartedAt = now + fightOpen * 16667 - + roundIntroDurationUs() - 8000; + if (demo.posePhaseUs != null) startedAt = now - demo.posePhaseUs; +} + +function trackResimDrift(now) { + if (!resimActive || !resimCheckpoints) return; + const report = globalThis.__oskiewarResimDrift; + // The intro's length lands ±1 tick depending on each pass's clock + // rounding, so tick spaces are aligned on the fight's own first physics + // step — this call site is only reached once the fight is live, and the + // recording likewise begins there. + if (report.tickOffset === undefined) + report.tickOffset = resimFirstRowTick - resimTick; + const alignedTick = resimTick + report.tickOffset; + if (roundResult && !report.endedAt) { + report.endedAt = resimTick; + report.endedWith = roundResult; + report.endedCause = roundCause; + } + const row = resimCheckpoints.get(alignedTick); + if (!row) return; + report.ticks++; + for (let pad = 0; pad < players.length; pad++) { + const offset = 1 + pad * 8; + const drift = Math.hypot(players[pad].x - row[offset], + players[pad].y - row[offset + 1]); + if (drift > 4 && report.firstDriftTick === undefined) { + report.firstDriftTick = alignedTick; + report.firstDriftPad = pad; + report.firstDrift = Math.round(drift * 10) / 10; + report.liveAt = [row[offset], row[offset + 1]]; + report.resimAt = [Math.round(players[pad].x), Math.round(players[pad].y)]; + } + if (drift > report.maxDrift) { + report.maxDrift = Math.round(drift * 10) / 10; + report.atTick = alignedTick; + } + } +} + +function consumeSystemButtons(now) { + let pressed = false; + for (let index = 0; index < padSnapshots.length; index++) { + const down = padSnapshots[index]?.down || []; + const previous = navigationPrevious[index] || []; + if (down.includes("RightStick") && !previous.includes("RightStick")) { + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + } + if (down.includes("View") && !previous.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + if (down.includes("Menu") && !previous.includes("Menu")) pressed = true; + navigationPrevious[index] = down.slice(); + } + // Self-play has no title to return to — a stray Menu press would strand the + // loop on a screen nobody is there to start. + if (!pressed || selfPlay || shellMode !== "GAME" || selecting) return false; + returnToTitle(now, "menu"); + return true; +} + +// Start lifts the wordmark off a fight that is already running underneath. +function enterGame(now) { + startInputPending = true; + if (localControllerPair() && !roundViewer && !netSession && !versusActive()) { + startLocalVersus(now); + return; + } + if (survivalActive()) { + startSurvivalRun(now, false); + globalThis.__oskiewarStartLine = "climb!"; + playDrum("bell", 1.05, 0); + playSine(660, .12); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + return; + } + if (titleAttractMode === "action") { + selfPlay = false; + players[0].npc = false; + players[0].bot = false; + players[0].spiderDummy = false; + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + // Attract keeps a cool neutral body in the second chair so the tableau + // reads as a matchup rather than two identical red bots. Start hands the + // first seat back and re-seats whichever sparring partner this session was + // actually dealt: hardcoding the inert dummy here left every session the + // clock dealt the action tableau — half of them — still punching a post + // after training switched to the bot. + const training = trainingOpponentKind(); + players[1].npc = true; + players[1].bot = training === "trainingbot"; + players[1].spiderDummy = training === "spiderdummy"; + applyRoster(players[1], -1); + } + shellMode = "GAME"; + gameplayStarted = true; + if (dummyGuideStartedAt === null && players[1].npc && !players[1].bot) + dummyGuideStartedAt = now; + shellPrevious = padSnapshots[0]?.down?.slice() || []; + if (PAL_SELECT) beginSelect(now); +} + +// Comma and period step the pace mid-fight the way +/- do on the title — a +// quarter at a time, but never past full speed: slow motion is for reading a +// bot's tells. A wired fight keeps the clock both seats agreed on, so the +// keys go dead the moment a rival is real, and a watcher's playout is the +// host's clock too. Edge-detected against the same unfiltered pad memory the +// title uses, so a key held across the start steps exactly once. +const paceLocked = () => netSession !== null || versusActive() || + roundViewer !== null; +function updateMatchPace(now) { + const rawDown = padSnapshots[0]?.down || []; + const tap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + const faster = tap("SpeedUp"); + const slower = tap("SpeedDown"); + shellRawPrevious = rawDown.slice(); + if (!faster && !slower) return; + const next = paceLocked() ? gameSpeed + : clamp(gameSpeed + (faster ? .25 : -.25), .25, 1); + if (next === gameSpeed) { playDrum("block", .3, 0); return; } + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, faster ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); +} + +function updateShell(now, tapped = false) { + const pad = padSnapshots[0] || {}; + // The title screen is where the game's pace is set: +/- on a keyboard + // step the clock a quarter at a time, from a quarter speed to double. + // Handled before anything else so a speed tap can never read as "start", + // and edge-detected against the unfiltered pad so holding the key steps + // exactly once. + const rawDown = pad.down || []; + const speedTap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + if (speedTap("SpeedUp") || speedTap("SpeedDown")) { + const stepped = gameSpeed + (speedTap("SpeedUp") ? .25 : -.25); + const next = clamp(stepped, .25, 2); + if (next !== gameSpeed) { + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, speedTap("SpeedUp") ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); + } else playDrum("block", .3, 0); + } + shellRawPrevious = rawDown.slice(); + // View and Menu are the system's buttons — View toggles the debug HUD and + // must not double as "start the game". Everything else, and a real lean on + // the analog stick, says the player wants in. + const down = rawDown + .filter((button) => button !== "View" && button !== "Menu" && + button !== "SpeedUp" && button !== "SpeedDown"); + const stickLive = Math.abs(pad.leftX || 0) > .5 || Math.abs(pad.leftY || 0) > .5; + if (titleTransitionAt !== null) { + if (now - titleTransitionAt >= 700000) { + titleTransitionAt = null; + enterGame(now); + } + shellPrevious = down.slice(); + shellStickLive = stickLive; + return; + } + if (tapped || down.some((button) => !shellPrevious.includes(button)) || + (stickLive && !shellStickLive)) { + playDrum("hat", .55, 0); + if (typeof titleBeep === "function") titleBeep(); + if (typeof titleVoice === "function") titleVoice(); + emitSignal("select", -1, 1, 0); + titleTransitionAt = now; + startInputPending = true; + } + shellPrevious = down.slice(); + shellStickLive = stickLive; +} + +// Everything from here through `updateSelect` is the deprecated pal select, +// held behind PAL_SELECT — see the flag. +function selectionOptions() { + if (selectionStep === 0) return fighterRoster.map((fighter, rosterIndex) => ({ + kind: "pal", fighter, rosterIndex, + })); + return [ + { kind: "bot", fighter: botFighter, rosterIndex: -1 }, + { kind: "dummy", fighter: npcFighter, rosterIndex: -1 }, + { kind: "spiderdummy", fighter: spiderDummyFighter, rosterIndex: -1 }, + { kind: "people", fighter: peopleFighter, rosterIndex: -1, disabled: true }, + ]; +} + +function startSelectedRound(now) { + selectionReady[0] = true; + selectionReady[1] = true; + startFightAgainst( + players[1].bot ? "bot" : players[1].spiderDummy ? "spiderdummy" + : players[1].npc ? "dummy" : "ppl", now); +} + +function chooseSelection(index, now) { + const option = selectionOptions()[index]; + if (!option) return; + if (option.disabled) { + playDrum("block", .45, 0); + return; + } + if (selectionStep === 0) { + applyRoster(players[0], option.rosterIndex); + selectionReady[0] = true; + selectionStep = 1; + // The dummy is where a fight should start: it stands still and lets you + // learn the buttons. Picking the bot is a decision, not a default. + selectionCursor = Math.max(0, + selectionOptions().findIndex((option) => option.kind === "dummy")); + playDrum("hat", .9, -.55); + emitSignal("select", 0, option.rosterIndex, 0); + return; + } + const opponent = players[1]; + opponent.npc = option.kind === "dummy" || option.kind === "spiderdummy" || + option.kind === "bot"; + opponent.bot = option.kind === "bot"; + opponent.spiderDummy = option.kind === "spiderdummy"; + applyRoster(opponent, option.rosterIndex); + playDrum("clap", 1, .55); + emitSignal("select", 1, option.rosterIndex, opponent.bot ? 2 : opponent.npc ? 1 : 0); + startSelectedRound(now); +} + +function selectionBack(now) { + if (selectionStep === 1) { + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + playDrum("block", .7, 0); + return; + } + returnToTitle(now, "back"); +} + +// One pal at a time: the cursor holds the middle of the screen and its two +// neighbours recede to either side, so the roster reads as a wheel you turn +// rather than a board you scan. +function selectionTouchLayout() { + const count = selectionOptions().length; + const compact = compactLayout(); + const centerX = viewCenterX(); + const cardWidth = compact ? Math.min(280, viewWidth() * .44) : 680; + const cardHeight = compact ? 360 : 720; + const top = compact ? 176 : 190; + const sideScale = compact ? .5 : .66; + const reach = cardWidth * (1 + sideScale) / 2 + (compact ? 6 : 26); + const slots = count > 2 ? [-1, 0, 1] : count > 1 ? [0, 1] : [0]; + return { + back: compact + ? { x: 24, y: 126, width: 112, height: 50 } + : { x: viewOffsetX() + 90, y: 112, width: 170, height: 70 }, + options: slots.map((slot) => { + const scale = slot === 0 ? 1 : sideScale; + const width = cardWidth * scale; + const height = cardHeight * scale; + return { index: (selectionCursor + slot + count) % count, slot, + x: centerX + slot * reach - width / 2, + y: top + (cardHeight - height) / 2, width, height }; + }), + }; +} + +const pointInRect = (point, rect) => rect && point.x >= rect.x && + point.x <= rect.x + rect.width && point.y >= rect.y && + point.y <= rect.y + rect.height; + +function selectionHover(layout = selectionTouchLayout()) { + const pointer = globalThis.__oskiewarTouch?.pointer; + if (!pointer?.active || !Number.isFinite(pointer.x) || + !Number.isFinite(pointer.y)) return null; + if (pointInRect(pointer, layout.back)) return { back: true }; + const option = layout.options.find((rect) => pointInRect(pointer, rect)); + return option && !selectionOptions()[option.index]?.disabled + ? { option: option.index } : null; +} + +function consumeSelectTouches(now) { + const queue = globalThis.__oskiewarTouch?.taps; + if (!Array.isArray(queue) || !queue.length) return; + const touches = queue.splice(0); + const layout = selectionTouchLayout(); + const options = selectionOptions(); + for (const point of touches) { + if (pointInRect(point, layout.back)) selectionBack(now); + else { + const rect = layout.options.find((option) => pointInRect(point, option)); + // A receding neighbour turns the wheel; the focused card commits. A + // disabled card duds either way. + if (rect && (rect.slot === 0 || options[rect.index]?.disabled)) + chooseSelection(rect.index, now); + else if (rect) { + selectionCursor = rect.index; + playDrum("hat", .55, 0); + } + } + if (!selecting || shellMode === "MENU") break; + } +} + +function updateSelect(now) { + consumeSelectTouches(now); + if (!selecting || shellMode === "MENU") return; + const down = padSnapshots[0]?.down || []; + const previous = selectionPrevious[0]; + const pressed = (button) => down.includes(button) && !previous.includes(button); + const optionCount = selectionOptions().length; + let movement = 0; + if (pressed("ArrowLeft") || pressed("ArrowUp")) movement = -1; + else if (pressed("ArrowRight") || pressed("ArrowDown")) movement = 1; + if (movement) { + let next = selectionCursor; + for (let index = 0; index < optionCount; index++) { + next = (next + movement + optionCount) % optionCount; + if (!selectionOptions()[next]?.disabled) break; + } + if (next !== selectionCursor) { + selectionCursor = next; + playDrum("hat", .55, 0); + } + } + if (pressed("B") || pressed("Menu")) selectionBack(now); + else if (pressed("A")) chooseSelection(selectionCursor, now); + selectionPrevious[0] = down.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; +} + +function randomWindMph() { + return 0; +} + +function rollWind(now = runtime().monotonicUs, immediate = true) { + windTargetMph = 0; + windTargetDirection = 1; + nextWindChangeAt = Infinity; + windMph = 0; + windDirection = 1; + windAcceleration = 0; + emitSignal("wind", -1, windTargetDirection, windTargetMph); +} + +function updateWind(dt, now) { + windMph = 0; + windDirection = 1; + windAcceleration = 0; +} + +// The match ball is drawn from the series identity. That identity is itself +// seeded once per match and recorded, so re-running a demo's inputs inflates +// the same ball -- the name this hashes used to come straight from +// Math.random, which silently made ball radius and mass unreproducible. +function seriesBallType(name) { + // Only the kinds marked for the series. The hover board lives in `ballKinds` + // because it IS one of these objects to the physics, but a match that + // inflated a board as its ball would put two boards on a station that is + // supposed to hold exactly one. + const deck = ballKinds.filter((kind) => kind.series !== false); + const roll = hashUnit("ball:" + (name || "oskiewar")); + return deck[Math.min(deck.length - 1, Math.floor(roll * deck.length))].type; +} + +function resetBalls(now) { + Object.assign(balls[0], + ballKinds.find((kind) => kind.type === matchBallType && kind.series !== false) || + ballKinds[0]); + for (const item of balls) { + // The board is placed, not served. It lies in the far floor corner from + // the pistol, so the bell offers three ways to spend the same seconds: + // rush the middle bare-handed, break left for the board, or break right + // for the gun. Putting it on the centre line instead would have made it + // the only opening move worth making. + if (item.type === "skateboard") { + item.x = tileCenterX(Math.floor((item.spawnCol ?? cornerColLeft) * gridCols / 40)); + item.riderPad = -1; + item.y = skateContact(item.x, terrainFloorAt(item.x)).y - skateAxleDrop - skateWheelRadius; + item.z = 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.skateSpin = 0; + item.heldBy = -1; + const rider = skateparkMap ? players[balls.indexOf(item) - 1] : null; + item.riderPad = rider?.skateboard ? rider.pad : -1; + item.active = skateBoardEnabled && item.riderPad < 0; + item.serveAt = 0; + item.lastHitBy = -1; + item.safeUntil = 0; + item.safePlayers = 0; + continue; + } + const owner = item.spawnOwner >= 0 ? players[item.spawnOwner] : null; + item.x = owner ? owner.spawnX + owner.facing * 180 + : centerX; + item.y = owner ? terrainFloorAt(item.x) - item.radius + : terrainFloorAt(item.x) - gridHeight + item.radius + 40; + // An unowned ball begins airborne over the cube's center tile seam and + // drops onto the middle of the fight. + item.z = owner ? owner.z : 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.heldBy = -1; + item.active = ballEnabled; + item.serveAt = now + roundIntroDurationUs() + 150000; + item.lastHitBy = owner ? owner.pad : -1; + item.safeUntil = item.serveAt; + item.safePlayers = owner ? 1 << owner.pad : 0; + // A serve call for a ball that will never inflate is a sound cue lying. + if (ballEnabled) emitSignal("ballserve", owner ? owner.pad : -1, + owner ? owner.facing : 0, windMph); + } +} + +const buttonLabel = (button) => ({ + ArrowUp: "UP", ArrowDown: "DOWN", ArrowLeft: "LEFT", ArrowRight: "RIGHT", + LeftShoulder: "LB", RightShoulder: "RB", LeftStick: "LEFT STICK", + RightStick: "RIGHT STICK", View: "VIEW", Menu: "MENU", + LeftTrigger: "LT", RightTrigger: "RT", +}[button] || String(button).toUpperCase()); + +function roundDemoState(demo, now) { + const checkpoints = demo?.checkpoints || []; + if (!checkpoints.length) return null; + const roundIndex = Number.isInteger(demo.roundIndex) ? demo.roundIndex + : Math.max(0, (demo.rounds?.length || 1) - 1); + const startTick = demo.rounds?.[roundIndex]?.[0] || 0; + const finalCheckpoint = checkpoints[checkpoints.length - 1]; + const endTick = Math.max(startTick + 1, demo.durationTicks || finalCheckpoint[0]); + const elapsed = Math.floor((now - roundViewerDemoStartedAt) / replayTickUs); + const tick = startTick + elapsed % (endTick - startTick + 1); + let before = checkpoints[0], after = finalCheckpoint; + for (const row of checkpoints) { + if (row[0] <= tick) before = row; + if (row[0] >= tick) { after = row; break; } + } + const amount = clamp((tick - before[0]) / Math.max(1, after[0] - before[0]), 0, 1); + const value = (index) => lerp(before[index], after[index], amount); + const recentAttack = (pad) => { + let kind = ""; + let age = 0; + for (const event of demo.events || []) { + if (event[0] > tick || event[0] < tick - 18 || event[2] !== pad) continue; + if (meleeSpecs[event[1].toUpperCase()]) { + kind = event[1].toUpperCase(); + age = tick - event[0]; + } + } + return { kind, age }; + }; + const fighters = [0, 1].map((pad) => { + const offset = 1 + pad * 8; + const flags = before[offset + 5]; + const name = demo.fighters?.[pad] || `P${pad + 1}`; + const profile = name === "DUMMY" ? npcFighter : name === "BOT" ? botFighter + : fighterRoster.find((fighter) => fighter.handle === name); + // A self-play fighter is called what it wears, so a demo's fighter name + // is first tried against the color book itself — the repaint dresses + // straight from the nameplate. Older demos still say "BOT 1"/"BOT 2"; + // those deal from the wardrobe hash so they don't fall back to the + // house red and blue. + const wornColor = cssColorBook.find( + (entry) => entry.name === name.toLowerCase()); + const selfPlayPad = selfPlayFighters.findIndex( + (fighter) => fighter.handle === name); + const swing = recentAttack(pad); + const vx = value(offset + 3); + return { name, nation: demo.nations?.[pad] || "", + color: wornColor ? wornColor.rgb.slice() + : selfPlayPad >= 0 ? selfPlayWardrobe(selfPlayPad).rgb.slice() + : profile?.color || players[pad].color, + x: value(offset), y: value(offset + 1), z: value(offset + 2), + vx, vy: value(offset + 4), vz: 0, + facing: flags & 8192 ? (flags & 4096 ? 1 : -1) + : vx ? Math.sign(vx) : pad ? -1 : 1, + alive: Boolean(flags & 1), grounded: Boolean(flags & 2), + ducking: Boolean(flags & 4), blocking: Boolean(flags & 8), + removedParts: [...limbParts, "torso"].filter((part, index) => + Boolean(flags & (1 << (index + 4)))), + hit: flags & 16384 ? .9 : 0, blockFlash: flags & 32768 ? 1 : 0, + score: Math.round(value(offset + 6)), + roundWins: Math.round(value(offset + 7)), attack: swing.kind, + attackTicks: swing.age }; + }); + const round = demo.rounds?.[roundIndex] || [startTick, 1, 0, 1]; + const nearEnd = tick >= endTick - 20; + const replayBall = { x: value(17), y: value(18), z: value(19), + radius: 42, active: Boolean(before[22]), spawnOwner: 0 }; + const camera = { x: value(23), y: value(24), + width: Math.max(100, value(25)) }; + // Newer demos carry the live pass's whole camera pose; without it the + // lens position is re-derived from width and close shots near-clip. + if (before.length > 26) { + camera.position = { x: value(26), y: value(27), z: value(28) }; + camera.perspective = value(29); + camera.fov = value(30); + camera.roll = value(31); + } + return { phase: "replay", map: demo.map || "station", tick, fighters, ball: replayBall, + balls: [replayBall], camera, + wind: { direction: round[1], mph: round[2] }, + round: { remainingMs: Math.max(0, Math.round((endTick - tick) * 1000 / + (demo.tickRate || 60))), result: nearEnd + ? demo.winner ? `${demo.winner} WINS ROUND` : "TIE" : "" } }; +} + +function applyRoundViewerState(state, now, dt = 1 / 60) { + if (!state?.fighters?.length || !state.camera || !state.round) return; + workshopHighlight = state.map?.highlights === true; + if (state.map?.id && state.map.id !== currentMapId) { + if (state.map.workshop && globalThis.__oskiewarValidateMap) { + try { installWorkshopMap(globalThis.__oskiewarValidateMap(state.map.workshop)); } + catch { return; } + } else if (workshopMap) { + installWorkshopMap(workshopBase, true); + workshopMap = null; + currentMapId = "halfpipe"; + currentMapName = "HALFPIPE"; + } + } + if (((state.course || state.map) === "skatepark") !== skateparkMap) { + configureWorldMap(state.course || state.map); resetSkateRopes(); + } + if (skateparkMap && Array.isArray(state.ropes) && state.ropes.length === skateRopes.length) + state.ropes.forEach((nodes, index) => { + if (!Array.isArray(nodes) || nodes.length !== chainLinks + 1 || + nodes.some((row) => !Array.isArray(row) || row.length !== 4 || + row.some((n) => !Number.isFinite(n) || Math.abs(n) > 100000))) return; + skateRopes[index].nodes = nodes.map(([x, y, px, py]) => ({ x, y, px, py })); + }); + for (let index = 0; index < players.length; index++) { + const source = state.fighters[index]; + const player = players[index]; + const previousX = player.x; + const previousY = player.y; + // Held to spot the edges the live wire reports as flags but never as the + // sparks and debris the host spawned locally. A demo carries its own + // impact track (replayViewerImpacts), so this reconstruction is LIVE-only. + const wasAlive = player.alive; + const wasHit = player.hit || 0; + const priorParts = player.removedParts?.slice() || []; + for (const key of ["name", "nation", "color", "x", "y", "z", "facing", "alive", + "grounded", "ducking", "blocking", "score", "roundWins", "removedParts", + "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) + if (source[key] !== undefined) player[key] = source[key]; + player.vx = source.vx ?? (player.x - previousX) / Math.max(.001, dt); + player.vy = source.vy ?? (player.y - previousY) / Math.max(.001, dt); + player.vz = source.vz || 0; + // Grandstand coasting rides ONLY a velocity the host actually reported. + // The vx/vy above fall back to a frame-to-frame difference for the walk + // cycle's sake, but that difference is a teleport artifact on the first + // snap and after a wire gap — dead-reckoning it would fling the body. + player.wireVx = Number.isFinite(source.vx) ? source.vx : 0; + player.wireVy = Number.isFinite(source.vy) ? source.vy : 0; + player.attackKind = source.attack || ""; + // A demo knows which tick a swing began on, so the replayed pose can run + // its real arc instead of freezing at one canned mid-swing phase. + player.attackStartedAt = player.attackKind + ? now - (source.attackTicks != null + ? source.attackTicks * replayTickUs : 80000) : 0; + player.attackUntil = player.attackKind ? now + 120000 : 0; + player.hit = source.hit || 0; + player.blockFlash = source.blockFlash || 0; + // The host spawns sparks on a strike, a burst on a lost limb and a + // whoosh-lit puff on a kill; none of that rides the state wire, so the + // grandstand used to watch a body silently pop apart. Reconstruct the + // burst from the flag edges the wire DOES carry — a fresh hit, a new + // missing part, a death — so live watchers see the blow land. + if (roundViewerMode === "LIVE") { + // Reconstructing the strike spark is the fallback for a host too old to + // send its impact track. When the real track is on the frame it wins: + // it is the same spark, in the right place, and doubling them reads as + // a heavier hit than the one that landed. + if (!state.impacts && player.hit > .4 && wasHit <= .4) + impacts.push({ x: player.x, y: player.y - 90, z: player.z, + life: .32, duration: .32, death: false, explosion: true }); + const nowParts = player.removedParts || []; + // A fighter who came back whole is a new round, not a healed limb. + const lost = nowParts.length < priorParts.length ? [] + : nowParts.filter((part) => !priorParts.includes(part)); + if (nowParts.length < priorParts.length) clearRoundViewerEffects(); + if (!state.impacts && (lost.length || (wasAlive && !player.alive))) + impacts.push({ x: player.x, y: player.y - 60, z: player.z, + life: .55, duration: .55, death: true, explosion: false }); + // And the limb itself goes flying. The wire says which part is gone; it + // does not say where the pieces went, and the pieces are the part of a + // dismemberment anybody actually watches. They are spawned from the + // fighter's own pose here and then fall under local physics, so they + // land where the body stands rather than where a packet said it did. + if (lost.length && detachedParts.length < 48) { + // Posed from BEFORE the loss, on a copy: the wire's removedParts are + // already applied to the live fighter, and a body's geometry no + // longer carries the limbs it has lost — so asking the fighter as it + // stands now returns no segments to throw. + const pose = runnerWorldGeometry({ ...player, removedParts: priorParts }, + (now - startedAt) / 1000000); + const rival = players[player.pad === 0 ? 1 : 0]; + for (const part of lost) + spawnDetachedPart(player, part, pose, rival?.x ?? player.x, now); + } + } + } + const sources = state.balls || [state.ball]; + for (let index = 0; index < balls.length; index++) { + const source = sources[index]; + if (!source) { balls[index].active = false; continue; } + for (const key of ["x", "y", "z", "radius", "active", "spawnOwner", + "type", "mass", "heldBy"]) + if (source[key] !== undefined) balls[index][key] = source[key]; + } + // A frame that carries no projectile rows is an older host or a stored + // demo, and its shots are simply unknown — leaving the arrays alone is the + // honest answer. A frame that carries an empty row set is a host saying the + // air is clear, and that clears it. + if (state.shots) applyWireShots(state.shots); + if (state.lobs) applyWireLobs(state.lobs); + if (state.impacts) applyWireImpacts(state.impacts); + cameraCenter = state.camera.x; + cameraCenterY = state.camera.y; + cameraWidth = state.camera.width; + if (state.wind) { + windDirection = state.wind.direction; + windMph = state.wind.mph; + windAcceleration = windDirection * windMph * 16; + } + const hadResult = Boolean(roundResult); + roundResult = state.round.result || ""; + roundCause = state.round.cause || + (roundResult.includes("BALLED") ? "BALLED" : roundResult ? "ROUND" : ""); + // Whether the round on the wire has a clock is the HOST's fact, not a thing + // to re-derive locally: `roundIsTimed()` answers from the machine it runs + // on, and a watcher's machine is not in the fight. A demo carries no flag + // and was always a timed, recorded round. + roundViewerTimed = state.round.timed !== false; + // The round's own age, intro included, straight off the wire. Deriving it + // from `remainingMs` instead is what broke the versus lane: that field is + // zero on an untimed round, so the clock landed a full round duration in + // the past, `counting` was never true, and the intro card never drew. + const elapsedUs = Number.isFinite(state.round.elapsedMs) + ? state.round.elapsedMs * 1000 : null; + roundElapsedUs = roundViewerTimed + ? Math.max(0, roundDurationUs - state.round.remainingMs * 1000) + : elapsedUs === null ? 0 + : Math.max(0, elapsedUs - roundIntroDurationUs()); + matchOver = state.phase === "match"; + roundStartedAt = elapsedUs === null + ? now - roundIntroDurationUs() - roundElapsedUs : now - elapsedUs; + if (roundResult && !hadResult) roundOverAt = now; + const target = state.camera.target || { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: state.camera.position || + { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: state.camera.perspective || 0, + fov: state.camera.fov || 55, roll: state.camera.roll || 0 }, dt, 1000); +} + +// Shots and lobs arrive as the flat number rows spectatorState packs (owner +// and kind folded into one flag word). They are rebuilt rather than merged: +// a round has no identity on the wire, so matching this frame's third bullet +// to last frame's third bullet would be a guess, and a wrong guess teleports +// a streak across the arena. The arrays themselves keep their identity — the +// camera's swept-path packer and the render interpolator both hold references +// to them. +function applyWireShots(rows) { + bullets.length = 0; + for (const row of rows) { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + bullets.push({ x, y, z, previousX, previousY, vx, vy, + owner: owner === 1 ? 1 : 0, life: 1, safeUntil: 0, + spit: Boolean(flags & 1), heavy: Boolean(flags & 2), + rubber: Boolean(flags & 4), + // No bounce history came up the wire, so a watched round draws its + // streak and no ricochet tail. drawBulletTrail reads the count first + // and an empty one costs it nothing. + trail: [], trailCount: 0 }); + } +} + +// The host's impact track, which repeats each mark for as long as it burns. +// The id is what makes a repeat readable as a repeat: a watcher spawns only +// the numbers it has not seen, at the age the frame reports, and then runs +// them out on its own physics. +function applyWireImpacts(rows) { + if (!rows.length) return; + const newest = rows[rows.length - 1][0]; + // Numbers only climb within one host's run. A lower one is a different + // host, or the same one restarted, and nothing before it has been seen. + if (newest < roundViewerImpactId) roundViewerImpactId = 0; + for (const row of rows) { + const [id, x, y, z, durationMs, lifeMs, flags] = row; + if (id <= roundViewerImpactId) continue; + impacts.push({ x, y, z, duration: durationMs / 1000, + life: Math.max(.001, lifeMs / 1000), + death: Boolean(flags & 1), explosion: Boolean(flags & 2) }); + } + roundViewerImpactId = Math.max(roundViewerImpactId, newest); +} + +function applyWireLobs(rows) { + grenades.length = 0; + for (const row of rows) { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + // Only live grenades ride out, so anything here is alive by definition — + // which is also what puts it in the render list. + grenades.push({ x, y, z, vx, vy, owner: owner === 1 ? 1 : 0, alive: true, + rocket: Boolean(flags & 1), exploding: Boolean(flags & 2), + blastRadius, blastAge: 0, fuse: fuseMs / 1000, hitPlayers: 0 }); + } +} + +function handleRoundViewer(message) { + const now = runtime().monotonicUs; + matchName = message.roundName || matchName; + if (message.type === "round") { + roundViewerDemo = null; + roundViewerMode = ""; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + return; + } + if (message.type === "status") { + roundViewerStatus = String(message.content?.label || "waiting").toUpperCase(); + // A room that goes dark keeps no queue: whatever arrives next belongs to + // a new timeline, and a stale frame blended into it is a teleport. + if (message.content?.live === false) resetRoundViewerPlayout(); + return; + } + if (message.type === "demo") { + // A demo with bot seeds can be re-simulated — the honest path. The + // bridge hands over the recording and steps aside so the real sim runs; + // seedless demos (older, or human-driven) still puppet through the + // viewer below. + if (globalThis.__oskiewarResim && Array.isArray(message.content?.botSeeds)) { + roundViewerStop?.(); + roundViewer = null; + // The reset waits for the first stepped tick so it lands inside the + // sim clock the way a live round roll does — resetting here, on the + // bridge's wall clock, would skew the intro against the recording. + resimPending = message.content; + globalThis.__oskiewarReplayReady = true; + return; + } + roundViewerDemo = message.content; + roundViewerDemoStartedAt = now; + roundViewerMode = "DEMO"; + resetRoundViewerPlayout(); + globalThis.__oskiewarReplayReady = true; + return; + } + if (message.type === "net") { + if (netSession) netInbox.push(message.content); + else netHandlePreSession(message.content); + return; + } + if (netSession && message.type === "state") return; + if (message.type === "state") { + // The room says whether anybody is publishing, and it says so before it + // hands over any frame. A frame that arrives while nobody is is the last + // thing a host said before it left — kept by the relay and given to + // whoever opens the door next. Going LIVE on it paints that frozen round + // as a fight in progress, and since one frame can never bracket the + // playout clock, nothing in it is ever applied: the fighters keep + // whatever names this engine was already holding and the HUD tells the + // new arrival which of those two strangers they are. + if (!message.live) return; + if (roundViewerDemo && message.content?.phase === "match") return; + roundViewerMode = "LIVE"; + queueRoundViewerState(message.content); + } +} + +// A fresh timeline: a room change, a takeover, a host that went away. The +// queue, the playout clock and the measured health all start over, because +// every one of them is a statement about a wire that no longer exists. +// Sparks, debris and fallen limbs belong to one round on one wire. A new +// round, a new room or a host that went away takes them with it. +function clearRoundViewerEffects() { + impacts.length = 0; + detachedParts.length = 0; + roundViewerImpactId = 0; +} + +function resetRoundViewerPlayout() { + clearRoundViewerEffects(); + roundViewerFrames = []; + roundViewerPlayoutMs = 0; + roundViewerLiveAt = 0; + roundViewerGapMs = 33; + roundViewerJitterMs = 0; + roundViewerLossPct = 0; + roundViewerSeq = -1; + roundViewerSeqHeard = 0; + roundViewerSeqExpected = 0; +} + +// A frame lands here, in a socket callback, between one simulation tick and +// the next paint. Painting it from inside that callback is what smeared every +// correction across two frames: the render interpolator had already captured +// the pre-frame pose, so the next paint landed partway into the new state and +// the one after finished the jump. So the frame is only filed — stamped with +// its arrival and measured — and the tick decides when it is due. +function queueRoundViewerState(state) { + const at = Date.now(); + const gap = roundViewerLiveAt ? at - roundViewerLiveAt : 0; + roundViewerLiveAt = at; + if (gap > 0 && gap < 2000) { + roundViewerGapMs += (gap - roundViewerGapMs) * .12; + roundViewerJitterMs += + (Math.abs(gap - roundViewerGapMs) - roundViewerJitterMs) * .12; + } + // Loss read off the host's own sequence numbers, over a rolling window. + // This is where the relay's coalescing shows: a frame it dropped inside its + // 25 ms gate leaves a hole in the count that nothing else on this side can + // see. A takeover or a fresh room rewinds the sequence, which restarts the + // window rather than reading as a hundred lost frames. + const seq = Number(state?.seq); + if (Number.isFinite(seq)) { + if (roundViewerSeq >= 0 && seq > roundViewerSeq) { + roundViewerSeqExpected += seq - roundViewerSeq; + roundViewerSeqHeard += 1; + if (roundViewerSeqExpected >= 180) { + roundViewerLossPct = clamp(Math.round( + (1 - roundViewerSeqHeard / roundViewerSeqExpected) * 100), 0, 100); + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + } else { + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + roundViewerSeq = seq; + } + // One wire frame plus twice the jitter actually measured, held inside a + // window where a buffer is still worth more than it costs. The delay itself + // moves slowly: resizing it quickly would time-warp the picture. + const want = clamp(roundViewerGapMs + roundViewerJitterMs * 2 + 8, 45, 220); + roundViewerDelayMs += (want - roundViewerDelayMs) * .05; + roundViewerFrames.push({ state, at }); + // A ceiling, not a working depth: the playout holds about three frames. + // This only catches a tab whose simulation parked while the wire kept + // arriving, and the clock's own thousand-millisecond reset sorts out the + // rest when the tab comes back. + if (roundViewerFrames.length > 32) roundViewerFrames.shift(); +} + +// How far past the newest frame in hand the grandstand keeps coasting on wire +// velocity before it holds still. Inside the buffer nothing coasts at all — +// the pose is blended between two frames the host really sent. Past the +// buffer the velocity goes stale fast enough that coasting walks a fighter +// through a wall or floats them past a jump's apex, so a long gap freezes the +// pose instead of inventing motion. +const liveDeadReckonMaxMs = 150; + +function updateRoundViewer(now, dt) { + if (roundViewerDemo && roundViewerMode === "DEMO") { + const state = roundDemoState(roundViewerDemo, now); + if (state) { + applyRoundViewerState(state, now, dt); + replayViewerImpacts(state.tick, dt); + } + return; + } + if (roundViewerMode !== "LIVE" || !roundViewerFrames.length) return; + const wall = Date.now(); + const target = wall - roundViewerDelayMs; + // A first frame, or a wire that stopped and came back, sets the clock + // outright. Every other tick advances it by the simulation's own dt and + // leans a twentieth of the way toward where it belongs. Leaning rather than + // snapping is what keeps the picture's rate the sim's rate: a clock pinned + // to the wall every tick replays the network's jitter as motion. + if (!roundViewerPlayoutMs || Math.abs(target - roundViewerPlayoutMs) > 1000) + roundViewerPlayoutMs = target; + else roundViewerPlayoutMs += dt * 1000 + + (target - roundViewerPlayoutMs) * .05; + const play = roundViewerPlayoutMs; + // Hold exactly one frame behind the clock: it is the left end of the pair + // being blended, and the one to coast from if the buffer runs dry. + while (roundViewerFrames.length > 1 && roundViewerFrames[1].at <= play) + roundViewerFrames.shift(); + const before = roundViewerFrames[0].at <= play ? roundViewerFrames[0] : null; + const after = before ? roundViewerFrames[1] : roundViewerFrames[0]; + if (before && after) { + const span = Math.max(1, after.at - before.at); + const alpha = clamp((play - before.at) / span, 0, 1); + applyRoundViewerState(blendRoundViewerStates(before.state, after.state, + alpha, (play - before.at) / 1000), now, dt); + updateRoundViewerEffects(dt); + return; + } + // Starved, or not yet arrived at the first frame. The newest thing in hand + // is the truth; past it the bodies coast on the velocity that frame + // reported — measured from that frame's own position, so the reckoning is + // never compounded and the next arrival needs no correcting snap. + const edge = before || after; + applyRoundViewerState(edge.state, now, dt); + if (before) + coastRoundViewer(Math.min(play - before.at, liveDeadReckonMaxMs) / 1000); + updateRoundViewerEffects(dt); +} + +// The half of the fight a watcher is allowed to run for itself. Sparks, their +// debris and the limbs that came off are cosmetic: nothing here decides a hit +// or a score, so none of it has to agree with the host bit for bit — it only +// has to happen. Before this, `impacts` grew for the life of the connection +// and never drew a mote, because the function that grows an impact's debris +// ran only in a demo or a hosted sim. +function updateRoundViewerEffects(dt) { + updateResultImpactDebris(dt); + if (detachedParts.length) updateDetachedParts(dt, false); +} + +// Dead reckoning, and only past the end of the buffer. +function coastRoundViewer(seconds) { + if (seconds <= 0) return; + for (const player of players) { + if (!player.alive) continue; + // Coast the delta only — the host's reported position is truth and may + // sit anywhere it says (legacy rooms even ran off the cube). + player.x += (player.wireVx || 0) * seconds; + player.y += (player.wireVy || 0) * seconds; + } + for (const item of balls) { + if (!item.active) continue; + item.x += (item.vx || 0) * seconds; + item.y += (item.vy || 0) * seconds; + } + // Both ends of a shot move together: the streak's length is the round's + // speed, not the size of the gap we are papering over. + for (const shot of bullets) { + shot.x += (shot.vx || 0) * seconds; + shot.y += (shot.vy || 0) * seconds; + shot.previousX += (shot.vx || 0) * seconds; + shot.previousY += (shot.vy || 0) * seconds; + } + for (const lob of grenades) { + if (lob.exploding) continue; + lob.x += (lob.vx || 0) * seconds; + lob.y += (lob.vy || 0) * seconds; + } +} + +// The pose the grandstand actually paints: two frames the host really sent, +// blended. Continuous quantities interpolate; everything discrete — who is +// alive, which limbs are gone, what phase the round is in — comes from the +// frame already reached, because a fighter must not die before the pose that +// killed them has finished arriving. +const blendFighterKeys = ["x", "y", "z", "vx", "vy", "vz", "hit", + "blockFlash", "attackTicks"]; +const blendCameraKeys = ["x", "y", "width", "perspective", "fov", "roll"]; +const blendPointKeys = ["x", "y", "z"]; + +function blendNumbers(from, to, keys, t) { + const out = { ...from }; + if (!to) return out; + for (const key of keys) { + const a = Number(from?.[key]); + const b = Number(to[key]); + if (Number.isFinite(a) && Number.isFinite(b)) out[key] = a + (b - a) * t; + } + return out; +} + +function blendRoundViewerStates(from, to, t, seconds) { + const state = { ...from }; + state.fighters = (from.fighters || []).map((fighter, index) => + blendNumbers(fighter, to.fighters?.[index], blendFighterKeys, t)); + const blendBall = (ball, other) => + ball ? blendNumbers(ball, other, blendPointKeys, t) : ball; + if (from.balls) + state.balls = from.balls.map((ball, index) => + blendBall(ball, to.balls?.[index])); + if (from.ball) state.ball = blendBall(from.ball, to.ball); + if (from.camera) { + state.camera = blendNumbers(from.camera, to.camera, blendCameraKeys, t); + for (const part of ["position", "target"]) + if (from.camera[part]) state.camera[part] = + blendNumbers(from.camera[part], to.camera?.[part], blendPointKeys, t); + } + // Projectiles have no identity on the wire, so they are carried forward on + // their own reported velocity rather than matched against the next frame's + // rows — a wrong match teleports a streak across the arena. A shot flies + // straight, so this is not an approximation of the host's path, it IS it. + if (from.shots) state.shots = from.shots.map((row) => { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + return [x + vx * seconds, y + vy * seconds, z, + previousX + vx * seconds, previousY + vy * seconds, vx, vy, owner, flags]; + }); + if (from.lobs) state.lobs = from.lobs.map((row, index) => { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + const next = to.lobs?.[index]; + // A blast's ring grows over a fifth of a second, which is six wire + // frames — steppy enough to see. It blends when the next frame plainly + // holds the same blast; otherwise the radius stands. + const radius = next && next[6] === flags && next[5] === owner + ? blastRadius + (next[7] - blastRadius) * t : blastRadius; + const moving = flags & 2 ? 0 : seconds; + return [x + vx * moving, y + vy * moving, z, vx, vy, owner, flags, + radius, fuseMs]; + }); + return state; +} + +// The buttons a challenger's pad may carry up the wire — the fight's own +// vocabulary, no system keys. View and Menu stay local: a rival must never +// toggle the host's debug overlay or send their game back to the title. +const versusInputButtons = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"]; +// The buttons of the last frame the wire actually took, held apart from the +// whole frame so a press can be told from a stick twitch. +let versusInputLastDown = "[]"; + +// The challenger's half of the versus wire: sample the local pad, ship it on +// change, and heartbeat while idle so silence can mean absence. Sends pace +// themselves a hair above the relay's own floor — a press that lands inside +// the pause simply leaves on the next tick rather than being dropped. +function sendChallengerInput(now) { + if (roundViewer?.seat !== "challenger" || + typeof roundViewer.sendInput !== "function") return; + // Holding the chair is not the same as sitting in it. A visitor who has not + // come through the door sends nothing, so the host reads the seat as empty + // and the room stays open for somebody who has — and this visitor keeps + // watching the fight, which was never gated. + if (!versusAllowed()) return; + const pad = typeof gamepad === "function" ? gamepad(0) : null; + if (!pad) return; + const down = (pad.down || []) + .filter((button) => versusInputButtons.includes(button)).slice(0, 10); + const round2 = (value) => Math.round((Number(value) || 0) * 100) / 100; + const frame = { down, leftX: round2(pad.leftX), leftY: round2(pad.leftY) }; + const worn = JSON.stringify(frame); + // A button edge leaves at once. The 33 ms floor was written to pace a + // stick, which drifts continuously and would otherwise send every tick — + // but a press is a discrete event, and holding one back for up to two + // frames put a third of a display's lag into the one thing a player feels + // most. Only the analog half still waits. + const pressed = JSON.stringify(down); + const edge = pressed !== versusInputLastDown; + if (!edge) { + if (worn !== versusInputLastSent) { + if (now < versusInputMinNextAt) return; + } else if (now < versusInputNextAt) return; + } + versusInputMinNextAt = now + 33000; + // An unchanged frame is repeated once soon after a change, then settles + // into the idle heartbeat. The relay drops what arrives too fast and says + // nothing about it, so a lost edge used to be invisible for a quarter of a + // second; one cheap echo closes that window without adding a protocol. + versusInputNextAt = now + (edge ? 50000 : 250000); + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + if (roundViewer.sendInput({ seq: versusInputSeq++, ...frame, + name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors })) { + versusInputLastSent = worn; + versusInputLastDown = pressed; + } +} + +// --------------------------------------------------------------------------- +// Rollback netplay. Both seats run the whole fight; nobody streams it to the +// other. Each tick a seat schedules its own pad a couple of frames ahead, +// mails it, and simulates the current frame with the rival's last known pad +// standing in for the one that has not arrived. When the real pad lands and +// differs, the sim steps back to the snapshot before that frame and replays +// forward in silence. That is what Street Fighter 6 does; the price is a +// simulation that is a pure function of (frame, both pads), and a snapshot of +// every variable that simulation touches. The list lives in netSimScalars / +// netSimArrays below and the netplay test pins it: two seats fed the same +// pads must hash identical states, round after round. +const NET_TICK_US = replayTickUs; +// Frames a press waits before it is simulated. Two at 60 Hz is 33 ms — the +// same order as a display's own lag, and it means a rival packet arriving +// within ~33 ms costs no rollback at all. +const NET_INPUT_DELAY = 2; +// How far past the rival's newest pad we will guess before we stop and wait. +// Eight frames is 133 ms of one-way silence, well past the relay's p99. +const NET_MAX_ROLLBACK = 8; +// Pads per packet. Every packet re-sends this many recent frames so a lost +// packet costs nothing unless several vanish in a row. +const NET_REDUNDANCY = 10; +const NET_HASH_EVERY = 30; +// The floor of frame zero's clock. The host offers its own clock rounded up +// to a tick so its timeline runs straight into the fight; this floor keeps +// every "0 means unset" deadline in the sim unset whatever the host reports. +const NET_ORIGIN_US = 1000000; +// Wall-clock silence after which the rival is gone and the fight ends. +const NET_PEER_LOST_MS = 4000; +const NET_HELLO_INTERVAL_MS = 1000; +let netInbox = []; +let netPeerHello = null; +let netHelloSentAt = 0; +const netPadCache = new Map(); + +// A recorded mask back into the pad shape the sim reads (see resimPad). One +// object per mask value, frozen, so a frame costs no allocation. +function netPadFromMask(mask) { + mask = mask | 0; + let pad = netPadCache.get(mask); + if (pad) return pad; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + pad = Object.freeze({ connected: true, down: Object.freeze(down), + leftX: 0, leftY: 0, rightX: 0, rightY: 0 }); + netPadCache.set(mask, pad); + return pad; +} + +// Everything the simulation reads or writes that is not a constant, a render +// cache, or the wire. Scalars are captured and restored by name; the arrays +// are deep-copied. The netplay test pins that this list covers the round clock. +function netSimScalars() { + return { + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + }; +} +function netRestoreScalars(saved) { + ({ + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + } = saved); +} +const netSimArrays = () => ({ + players, balls, bullets, grenades, impacts, detachedParts, skateRopes, + // `saberPickups` belongs here for the same reason every other array does, + // and leaving it out was a real desync: a rollback that does not restore it + // re-simulates frames in which a blade was already taken, or takes one that + // the rewound timeline had not yet dropped. `swordHeld` itself rides on the + // player and was always restored -- which is what made this so quiet. The + // two seats agreed about every number they hashed while disagreeing about + // whether somebody was holding a sword, and a sword is a 1.5x reach + // multiplier in `meleeSpecFor`, so they went on agreeing right up until a + // strike landed one frame apart on one screen and not the other. + gunPickups, saberPickups, grenadePickups, bodyTrees, gridField, + resultReactionPrevious, fightHitMarks, +}); + +function netSnapshot() { + const arrays = {}; + for (const [name, live] of Object.entries(netSimArrays())) + arrays[name] = structuredClone(live); + return { scalars: netSimScalars(), arrays }; +} + +// Restore in place: the live arrays are `const` and referenced everywhere, so +// their identity stays and their contents are replaced. Keys the live object +// grew since the snapshot are removed too — a key the sim added later must not +// survive a rewind. +function netRestore(snapshot) { + if (!snapshot.scalars.skateparkMap && snapshot.scalars.netRoundMapIndex >= 0 && + netRoundMapIndex !== snapshot.scalars.netRoundMapIndex) + installRoundMap(snapshot.scalars.netRoundMapIndex); + configureWorldMap(snapshot.scalars.skateparkMap ? "skatepark" : "station"); + netRestoreScalars(structuredClone(snapshot.scalars)); + const live = netSimArrays(); + for (const [name, saved] of Object.entries(snapshot.arrays)) { + const target = live[name]; + const copy = structuredClone(saved); + if (ArrayBuffer.isView(target)) { target.set(copy); continue; } + if (target.length === copy.length && copy.every((entry) => + entry && typeof entry === "object" && !Array.isArray(entry))) { + for (let index = 0; index < target.length; index++) { + const item = target[index]; + if (!item || typeof item !== "object") { target[index] = copy[index]; continue; } + for (const key of Object.keys(item)) + if (!(key in copy[index])) delete item[key]; + Object.assign(item, copy[index]); + } + } else { + target.length = 0; + target.push(...copy); + } + } +} + +// FNV-1a over the state that decides a fight. Exact doubles, not rounded: a +// last-bit difference is a real desync and must read as one. +// Debug only: the exact JSON the last hash was taken over, and a ring of it +// per frame while `__oskiewarHashTrace` is set. A desync report names a +// frame and two numbers; this is what turns those numbers back into fields. +let netLastHashText = ""; +const netHashTexts = new Map(); +function netStateHash() { + const view = players.map((player) => [player.x, player.y, player.z, + player.vx, player.vy, player.vz, player.facing, player.alive, + player.grounded, player.ducking, player.blocking, player.score, + player.roundWins, player.attackKind, player.attackUntil, + player.hitStunUntil, player.stance, player.gunAmmo, player.grenadeAmmo, + player.heldBall, player.removedParts, player.dashUntil, + // Holding a blade decides how far a hand reaches, so it decides the + // fight and belongs in the hash. It is here because it was NOT here: two + // seats disagreeing about a sword hashed identically for hundreds of + // frames and were found apart only once the reach changed an outcome, + // which is the most expensive way to learn about a desync. + player.skateboard, player.skateVx, player.skateWallSide, + player.skatePitch || 0, player.skateContacts || 0, player.swordHeld, player.ropeIndex, player.ropeLink, player.ropeGrabLocked, player.skateLoop, + player.loopAngle, player.loopSpeed, player.loopCooldownUntil, player.skateRotation, player.boostUntil, + player.headBounceCharge || 0, player.headPumpDirection || 0, player.headPumpAt || 0, + player.headRoll || 0, player.headRollRate || 0, + player.knockVx, player.windVx, player.dashVx, player.inputX, player.inputY, + player.previous, player.suppressedDirections, player.lastTap, player.lastRelease]); + view.push(skateparkMap, netRoundMapIndex, roundModifier, netRoundClockDebtUs, skateRopes); + view.push(balls.map((item) => [item.active, item.x, item.y, item.z, + item.vx, item.vy, item.heldBy])); + // Projectiles by position, not just by count. A round whose flight differs + // between the two machines kills different fighters, and hashing only the + // length let that drift silently: the count matched right up to the frame + // one seat's bullet connected and the other's missed. + view.push(bullets.map((shot) => [shot.x, shot.y, shot.z, shot.vx, shot.vy, + shot.owner, shot.life])); + view.push(grenades.map((lob) => [lob.x, lob.y, lob.z, lob.vx, lob.vy, + lob.owner, lob.fuse, lob.alive, lob.exploding, lob.blastRadius, + lob.hitPlayers])); + view.push([...gunPickups, ...saberPickups, ...grenadePickups].map(p => + [p.kind || "GRENADE", p.active, p.x, p.y, p.dropVy || 0, + p.dropping || false, p.dropLandingY ?? null, p.respawnAt || 0])); + view.push(roundResult, roundElapsedUs, + matchOver, roundStartedAt, roundOverAt); + const text = JSON.stringify(view); + if (globalThis.__oskiewarHashTrace) netLastHashText = text; + let hash = 0x811c9dc5; + for (let index = 0; index < text.length; index++) { + hash ^= text.charCodeAt(index); + hash = Math.imul(hash, 0x01000193) >>> 0; + } + return hash; +} + +// The local seat's handle and wardrobe, in the shape the pad frames already +// carry, so the host can dress both fighters the same way on both screens. +function netLocalIdentity() { + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + return { name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors }; +} + +function netCleanName(value, fallback) { + const offered = String(value || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); + return /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : fallback; +} + +function netCleanColors(value) { + return (Array.isArray(value) ? value : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)).slice(0, 4); +} + +function netAverageColor(colors, fallback) { + if (!colors.length) return fallback.slice(); + return colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); +} + +// The deal the host writes and both seats apply: who sits where, wearing +// what, and the clock and ball they share. Everything the first frame's +// state derives from that is not already a constant of the build. +function netMakeDeal() { + const local = players[0]; + const rival = netPeerHello || {}; + const rivalColors = netCleanColors(rival.colors); + const hostNow = Math.max(NET_ORIGIN_US, runtime().monotonicUs); + const origin = Math.ceil((hostNow + NET_TICK_US) / NET_TICK_US) * NET_TICK_US; + return { t: "start", v: 2, origin, delay: NET_INPUT_DELAY, + ballType: matchBallType, map: skateparkMap ? "skatepark" : "station", + fighters: [ + { name: netCleanName(local.name, ""), rosterIndex: local.rosterIndex, + color: local.color.slice(0, 3), + handleColors: netCleanColors(local.handleColors) }, + { name: netCleanName(rival.name, ""), rosterIndex: -1, + color: netAverageColor(rivalColors, [38, 82, 176]), + handleColors: rivalColors }, + ] }; +} + +function netApplyIdentities(deal) { + deal.fighters.forEach((entry, index) => { + const player = players[index]; + player.name = entry.name; + player.rosterIndex = entry.rosterIndex; + player.color = entry.color.slice(); + player.handleColors = entry.handleColors.map((c) => c.slice()); + }); + versusRivalName = deal.fighters[1].name; +} + +// Frame zero. Both seats run this with the same deal under the same clock, +// and the state that comes out is the state the fight starts from — the +// hash exchange on the first frame says whether it really is. +function netBegin(deal, seat, send) { + netEnd("restart"); + const session = { seat, deal, frame: 0, originUs: deal.origin, + delay: deal.delay, send, + local: new Map(), remote: new Map(), used: new Map(), snapshots: new Map(), + remoteFrame: -1, remoteSimFrame: 0, remoteLead: null, lastRemoteMask: 0, ackFrame: -1, + confirmed: -1, hashes: new Map(), peerHashes: new Map(), + lastPacketAt: Date.now(), startedAt: Date.now(), ticks: 0, + // peerStamp is the newest wall-clock mark heard from the rival, echoed + // back on our next packet so they can read their own round trip; pingMs is + // ours, read from the echoes coming the other way. + peerStamp: 0, + stats: { rollbacks: 0, rolledFrames: 0, maxRollback: 0, stalls: 0, + waits: 0, sent: 0, received: 0, desyncs: 0, snapshotMs: 0, resimMs: 0, + // `pings` counts measurements, not milliseconds: a round trip under half + // a millisecond rounds to zero, and a meter that reads "no measurement + // yet" on a LAN would be wrong at exactly the moment it is best. + pings: 0, pingMs: 0 } }; + for (let frame = 0; frame < deal.delay; frame++) session.local.set(frame, 0); + netSession = session; + // The relay's clock is the fight's clock: a host who was reading tells at + // quarter speed is back at full the moment the rival is real. + if (gameSpeed !== 1) { + gameSpeed = 1; + gameSpeedChangedAt = 0; + emitSignal("game-speed", -1, 1, 0); + } + netRoundClockDebtUs = 0; + netClockUs = deal.origin; + netFrameInputs = [0, 0]; // Never inherit either machine's local Menu/held pad. + try { + configureWorldMap(deal.map); + netRoundMapIndex = -1; + matchBallType = deal.ballType; + // The limb poses that collide are phased off this epoch, so both seats + // must share it; and a rollback fight is never a recorded one. + startedAt = deal.origin; + lastSimAt = deal.origin; + replay = null; + startVersusFight(deal.origin, true); + netApplyIdentities(deal); + } finally { + netFrameInputs = null; + netClockUs = null; + } + telemetry("NET_BEGIN", "seat " + seat + " delay " + deal.delay); +} + +// Leaving on purpose tells the rival at once instead of costing them the +// silence timeout; whatever the leaving seat's game did next stands. +function netLeave(reason) { + if (!netSession) return; + try { netSession.send({ t: "bye", o: netSession.originUs, r: reason }); } + catch (_) {} + netEnd(reason); +} + +function netEnd(reason) { + if (!netSession) return; + // A rival who has gone will never confirm anything, and the round they lost + // still happened — the frames past the frontier cannot change with nobody + // left to press anything. + flushPendingRoundReplay(runtime().monotonicUs); + const stats = netSession.stats; + // A seat in a rollback fight sends net packets, not pads, so the moment + // this lane closes the host has heard nothing on the pad wire for as long + // as the fight lasted. Read literally that is an empty chair, and an empty + // chair resets the match — which would turn a repaired desync into a lost + // score. The grace covers the changeover; a rival who has genuinely gone + // still times out, just three seconds later. + if (reason === "desync" || reason === "desync-peer" || reason === "workshop") + versusSeatGraceUntil = Date.now() + 3000; + // The stream this seat is about to start watching again is a new timeline. + if (roundViewer) resetRoundViewerPlayout(); + // Time never runs backwards: the local clock picks up where the fight's + // clock stood, so every deadline the fight left behind is still meaningful. + scaledClockUs = Math.max(scaledClockUs, + netSession.originUs + netSession.frame * NET_TICK_US - netRoundClockDebtUs); + telemetry("NET_END", reason + " frames " + netSession.frame + + " rollbacks " + stats.rollbacks + " rolled " + stats.rolledFrames + + " max " + stats.maxRollback + " stalls " + stats.stalls + + " waits " + stats.waits + " desyncs " + stats.desyncs); + netSession = null; + netInbox.length = 0; + netPeerHello = null; + globalThis.__oskiewarNetStats = null; +} + +// The rival's pad for a frame: the real one if it came, otherwise the newest +// one we have — a hand mostly keeps doing what it was doing. +function netRemoteInputFor(session, frame) { + const known = session.remote.get(frame); + if (known !== undefined) return known; + for (let back = frame - 1; back >= 0 && back >= frame - NET_MAX_ROLLBACK * 2; back--) { + const older = session.remote.get(back); + if (older !== undefined) return older; + } + return session.lastRemoteMask; +} + +function netInputsFor(session, frame) { + const local = session.local.get(frame) ?? 0; + const remote = netRemoteInputFor(session, frame); + return session.seat === 0 ? [local, remote] : [remote, local]; +} + +function netSimulateFrame(session, frame, silent) { + const started = performance.now(); + session.snapshots.set(frame, netSnapshot()); + session.stats.snapshotMs += performance.now() - started; + const inputs = netInputsFor(session, frame); + session.used.set(frame, inputs); + netFrameInputs = inputs; + netRoundClockDebtUs += NET_TICK_US * (1 - roundSpeed()); + netClockUs = session.originUs + (frame + 1) * NET_TICK_US; + netSilent = silent; + try { + gameSim(); + } finally { + netClockUs = null; + netSilent = false; + netFrameInputs = null; + } +} + +// A rollback un-happens frames, and the frames it un-happens were written +// down. Every row in a demo's logs is stamped with the tick it belongs to, so +// taking the record back to a frame is a truncation — and the silent +// re-simulation that follows re-files the corrected rows itself, which is why +// the recorders are NOT muted while it runs. The two cursors that decide when +// the next row is due are rebuilt from what survives, so they rewind too +// without having to ride in the snapshot. +// +// Without this a versus demo was written from mispredicted frames: it recorded +// the rival pad this seat had GUESSED, so the stored fight replayed into a +// different one. That is what "a rollback fight is never a recorded one" meant. +function replayRewind(session, toFrame) { + if (!replay) return; + const tick = demoTick(session.originUs + (toFrame + 1) * NET_TICK_US); + const keep = (rows) => { + if (!Array.isArray(rows)) return rows; + let length = rows.length; + while (length > 0 && rows[length - 1][0] >= tick) length--; + rows.length = length; + return rows; + }; + keep(replay.commands); + keep(replay.checkpoints); + keep(replay.events); + keep(replay.impacts); + keep(replay.rounds); + keep(replayRoundMarks); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + // The dedupe cursor is whatever each pad was last recorded as saying; a + // command that was truncated must be writable again. + replayLastCommand = [-1, -1]; + for (const row of replay.commands) replayLastCommand[row[1]] = row[2]; + replayNextCheckpointAt = replay.checkpoints.length + ? session.originUs + (toFrame + 1) * NET_TICK_US : 0; + // A round whose end was taken back is not a round to file. + if (replayPendingSaveFrame >= toFrame) replayPendingSaveFrame = -1; +} + +// The earliest frame we simulated with a guessed rival pad that has since +// been contradicted. Frames past `confirmed` are the only candidates. +function netEarliestMisprediction(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + for (let frame = session.confirmed + 1; frame < session.frame; frame++) { + const real = session.remote.get(frame); + if (real === undefined) return null; + const used = session.used.get(frame); + if (used && used[remoteSeat] !== real) return frame; + session.confirmed = frame; + } + return null; +} + +function netRollback(session, toFrame) { + const started = performance.now(); + const depth = session.frame - toFrame; + netRestore(session.snapshots.get(toFrame)); + replayRewind(session, toFrame); + for (let frame = toFrame; frame < session.frame; frame++) + netSimulateFrame(session, frame, true); + session.stats.rollbacks++; + session.stats.rolledFrames += depth; + session.stats.maxRollback = Math.max(session.stats.maxRollback, depth); + session.stats.resimMs += performance.now() - started; +} + +function netPrune(session) { + const floor = Math.min(session.confirmed, session.frame - NET_MAX_ROLLBACK - 2); + for (const frame of session.snapshots.keys()) + if (frame < floor) session.snapshots.delete(frame); + for (const frame of session.used.keys()) + if (frame < floor) session.used.delete(frame); + const inputFloor = floor - NET_REDUNDANCY * 2; + for (const frame of session.local.keys()) + if (frame < inputFloor) session.local.delete(frame); + for (const frame of session.remote.keys()) + if (frame < inputFloor) session.remote.delete(frame); + for (const frame of session.hashes.keys()) + if (frame < inputFloor) session.hashes.delete(frame); + for (const frame of session.peerHashes.keys()) + if (frame < inputFloor) session.peerHashes.delete(frame); +} + +function netDrainInbox(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + // Taken as a batch: a hash mismatch inside this loop ends the session and + // empties the inbox underneath it. + const batch = netInbox.splice(0, netInbox.length); + for (const packet of batch) { + if (!packet || typeof packet !== "object") continue; + // A hello inside a session is never the rival still talking: the + // challenger stops saying hello the moment it has one. It is somebody with + // no session — the same person having reloaded, or a new arrival in the + // chair — and it has to be read that way BEFORE the clock below is + // touched. Stamping it as a live packet was the deadlock: a tab that is + // killed sends no `bye`, so this seat waited on four seconds of silence + // that the rejoiner's own 1 Hz hello refreshed forever. This seat went on + // simulating against a rival who only ever said hello, and the rejoiner + // never got a deal back. Neither could leave. Treating it as a departure + // frees both: the lobby is one tick away, and the next hello a second + // later deals a fresh session with the fresh identity. + if (packet.t === "hello") { + // Except a straggler still in flight from before the deal was made, + // which would kill a session one frame old. + if (Date.now() - session.startedAt > NET_HELLO_INTERVAL_MS * 2) + session.peerLeft = true; + continue; + } + // A straggler from the fight before. The shell's inbox is not emptied when + // a session ends and packets stay in flight across the changeover, so + // without this the old rival's last presses were written into the new + // fight at frames it had not reached — on the seat that received them and + // nowhere else. Measured: two seats agreed through frame 330 of a rejoined + // fight and were found apart at the next checkpoint. An older build sends + // no tag and is taken at its word, as it always was. + if (packet.o !== undefined && packet.o !== session.originUs) continue; + session.lastPacketAt = Date.now(); + session.stats.received++; + if (packet.t === "workshop" && session.seat === 1) { session.peerWorkshop = true; continue; } + if (packet.t === "bye") { session.peerLeft = true; continue; } + // The rival noticed the divergence first. Same repair from this side, and + // no answering packet: a desync that echoed would ping-pong. + if (packet.t === "desync") { session.peerDesync = true; continue; } + if (packet.t === "i" && Array.isArray(packet.m) && + Number.isInteger(packet.f)) { + // m[k] is the pad for frame f + k; the newest is the last. + for (let index = 0; index < packet.m.length && index < NET_REDUNDANCY * 2; index++) { + const frame = packet.f + index; + const mask = packet.m[index] | 0; + if (frame < 0 || session.remote.has(frame)) continue; + session.remote.set(frame, mask); + if (frame > session.remoteFrame) { + session.remoteFrame = frame; + session.lastRemoteMask = mask; + } + } + if (Number.isInteger(packet.a)) session.ackFrame = Math.max(session.ackFrame, packet.a); + if (Number.isInteger(packet.s) && packet.s >= session.remoteSimFrame) { + session.remoteSimFrame = packet.s; + if (Number.isInteger(packet.l)) session.remoteLead = packet.l; + } + // Ping, by echo. `w` is the rival's own mark, which we hold and send + // back; `e` is one of ours coming home, so the round trip is a + // subtraction in OUR clock and the two machines need no shared time. + // It reads up to one frame long, because the rival holds our mark until + // their next tick — an honest part of what a press actually costs. + if (Number.isInteger(packet.w)) session.peerStamp = packet.w; + if (Number.isInteger(packet.e) && packet.e > 0) { + const trip = Date.now() - packet.e; + if (trip >= 0 && trip < 4000) { + session.stats.pingMs = session.stats.pings + ? session.stats.pingMs + (trip - session.stats.pingMs) * .15 : trip; + session.stats.pings++; + } + } + if (Array.isArray(packet.h) && packet.h.length === 2) + netNotePeerHash(session, packet.h[0], packet.h[1], remoteSeat); + if (netSession !== session) return; + } + } +} + +function netNotePeerHash(session, frame, hash) { + if (!Number.isInteger(frame)) return; + const mine = session.hashes.get(frame); + if (mine === undefined) { session.peerHashes.set(frame, hash); return; } + if (mine !== hash) { + session.stats.desyncs++; + telemetry("NET_DESYNC", "frame " + frame + " mine " + mine + " theirs " + hash); + netDesyncRepair(session, frame); + } +} + +// A desync used to be counted and then lived with: two machines that are no +// longer playing the same fight went on playing their different ones, and the +// two people found out when one of them died on a screen where they had not +// been hit. +// +// The repair is to stop pretending there are two authorities. The host has +// one, so both seats fall back to the lane where the host IS the authority: +// the challenger goes back to watching the host's stream with its pads going +// up the wire, and the host resumes the streamed versus fight it was already +// publishing for the grandstand. The fight does not stop, it does not rewind, +// and nobody has to re-adopt a state that will not fit through a 2 KiB +// channel. What it costs is the rollback lane's latency, which is the honest +// price of one machine having been wrong. +// +// Both seats have to agree, or the host sits waiting for packets that are not +// coming — so the seat that notices says so, and both then refuse to open a +// rollback session again for a while. Without that cooldown the challenger's +// next hello would deal a fresh session into the same divergence, one second +// later, forever. +const NET_DESYNC_COOLDOWN_MS = 60000; +let netLaneBlockedUntil = 0; + +function netDesyncRepair(session, frame) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + try { session.send({ t: "desync", o: session.originUs, f: frame }); } + catch (_) {} + netEnd("desync"); +} + +// Our state hash at the newest frame both pads are known for — a frame that +// will never be rolled back again, so both seats hash the same thing if +// they are the same game. +function netExchangeHash(session) { + const frame = session.confirmed; + if (frame < 0 || frame % NET_HASH_EVERY !== 0 || session.hashes.has(frame)) return; + const snapshotAfter = session.snapshots.get(frame + 1); + if (!snapshotAfter) return; + // Hash the snapshot taken before frame+1, i.e. the state after `frame`, + // without disturbing the live state: restore is destructive, so hash the + // live state only when it IS that frame. + let hash; + if (session.frame === frame + 1) hash = netStateHash(); + else { + const live = netSnapshot(); + netRestore(snapshotAfter); + hash = netStateHash(); + netRestore(live); + } + session.hashes.set(frame, hash); + if (globalThis.__oskiewarHashTrace) { + netHashTexts.set(frame, netLastHashText); + if (netHashTexts.size > 600) + netHashTexts.delete(netHashTexts.keys().next().value); + } + const theirs = session.peerHashes.get(frame); + if (theirs !== undefined) netNotePeerHash(session, frame, theirs); + session.pendingHash = [frame, hash]; +} + +function netSendInputs(session) { + // Every local pad we have decided on, including the one just scheduled for + // frame + delay. Sending one short of it starves the rival: they stall for + // the frame we are holding, we stall for the frame they are holding, and + // both fights crawl (measured in the browser harness: two thirds of ticks + // spent waiting) even on a wire with no latency at all. + const newest = session.frame + session.delay; + const first = Math.max(0, newest - NET_REDUNDANCY + 1); + const masks = []; + for (let frame = first; frame <= newest; frame++) + masks.push(session.local.get(frame) ?? 0); + // `o` is the deal's own origin, which is to say: which fight this is. Frame + // numbers restart at zero every session, so an input packet from the fight + // before is indistinguishable from a current one by its contents alone — and + // it lands on frames the new fight has not reached yet, on one seat only. + const packet = { t: "i", o: session.originUs, f: first, m: masks, + a: session.remoteFrame, s: session.frame, + l: session.frame - session.remoteSimFrame, w: Date.now() }; + if (session.peerStamp) packet.e = session.peerStamp; + if (session.pendingHash) { packet.h = session.pendingHash; session.pendingHash = null; } + if (session.send(packet)) session.stats.sent++; +} + +// One driver tick of a rollback fight. Ingest the rival, repair the past if +// it was guessed wrong, schedule and mail our own pad, then either step one +// frame or hold — hold when we have guessed as far as we dare past the +// rival's last real pad, or when we are simply running ahead of them. +function netTick() { + const session = netSession; + netDrainInbox(session); + if (!netSession) return; + // The rival told us the two fights came apart. Drop to the streamed lane, + // where there is only one authority, and stay out of the rollback lane long + // enough that the next hello is not just the same divergence again. + if (session.peerWorkshop) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + return; + } + if (session.peerDesync) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("desync-peer"); + return; + } + if (session.peerLeft || Date.now() - session.lastPacketAt > NET_PEER_LOST_MS) { + const seat = session.seat; + netEnd(session.peerLeft ? "rival-left" : "peer-lost"); + globalThis.__oskiewarRemotePad = null; + // The host is left alone in its room; the challenger's bridge is still + // up and goes back to watching whatever the room shows next. + if (seat === 0 && versusActive()) beginVersusLobby(runtime().monotonicUs); + return; + } + const earliest = netEarliestMisprediction(session); + if (earliest !== null) netRollback(session, earliest); + // A round whose end is now behind the confirmed frontier is a round that + // happened. Past this line no rival pad can reach back and unmake it. + if (replayPendingSaveFrame >= 0 && session.confirmed >= replayPendingSaveFrame) + flushPendingRoundReplay(runtime().monotonicUs); + const scheduled = session.frame + session.delay; + if (!session.local.has(scheduled)) { + const pad = typeof gamepad === "function" ? gamepad(0) : null; + session.local.set(scheduled, pad ? inputCommand(pad) : 0); + } + netSendInputs(session); + session.ticks++; + if (session.frame > session.remoteFrame + NET_MAX_ROLLBACK) { + session.stats.waits++; + return; + } + // Frame advantage: if we are more than a delay's worth ahead of where the + // rival says they are, give back one tick in four until we are level. Paced + // by ticks, not frames — a frame that stalls does not advance, and a stall + // keyed on the frame number would hold that frame forever. + // Each observation includes travel time. Equal-speed peers across a WAN + // both appear ahead of the other's old frame; throttling that raw lead + // slowed BOTH games by 25%. Exchange the peer's observation and cancel + // their shared transit lag. The remaining half-difference measures the + // actual clock advantage. Older peers retain the conservative old rule. + const observedLead = session.frame - session.remoteSimFrame; + const ahead = session.remoteLead === null ? observedLead + : (observedLead - session.remoteLead) / 2; + if (ahead > session.delay + 1 && session.ticks % 4 === 0) { + session.stats.stalls++; + return; + } + netSimulateFrame(session, session.frame, false); + session.frame++; + netPrune(session); + netExchangeHash(session); + // The hash exchange can find the mismatch that ends this session. + if (netSession !== session) return; + // A window into the lane for the debug overlay, the agent tools and the + // browser harness: what the fight is costing and whether it is one game. + globalThis.__oskiewarNetStats = { seat: session.seat, frame: session.frame, + // Who this fight believes is in it. A desync hash cannot see an identity + // fault — two machines can agree perfectly about a fight between two + // people who are not there — so the deal's names ride the same window the + // harness and the debug overlay already read. + names: session.deal.fighters.map((entry) => entry.name), + confirmed: session.confirmed, remoteFrame: session.remoteFrame, + hash: session.hashes.get(session.confirmed) ?? 0, + hashFrame: session.confirmed, ...session.stats, + behind: Math.max(0, session.frame - 1 - session.remoteFrame) }; +} + +// The challenger announces itself on the net channel until the host answers +// with a deal; a host that never answers is an older build, and the fight +// falls back to the streamed lane it always had. +function netChallengerHello(now) { + if (workshopMap) return; + if (netSession || roundViewer?.seat !== "challenger" || + typeof roundViewer.sendNet !== "function" || !versusAllowed()) return; + // Not before the shell has finished asking who is here. Identity rides this + // packet once and is then frozen into the deal for the whole fight, and a + // rejoin IS a fresh page load — so the 1 Hz hello below routinely beat the + // session check and dealt a signed-in player in under no name at all. Worse, + // resetRound re-applies the deal every round, so the wrong name was restamped + // even after the real one arrived. A shell with no account system is an older + // build, not a visitor still being asked, and is never held here. + if (webAccountState() && !accountReady()) return; + const at = Date.now(); + if (at < netLaneBlockedUntil) return; + if (at - netHelloSentAt < NET_HELLO_INTERVAL_MS) return; + netHelloSentAt = at; + roundViewer.sendNet({ t: "hello", v: 2, ...netLocalIdentity() }); +} + +// Packets that arrive before a session exists: the challenger's hello lands +// on the host, the host's deal lands on the challenger. Anything else waits +// in the inbox for the session to drain. +function netHandlePreSession(packet) { + if (!packet || typeof packet !== "object") return; + // A packet from the lane we have just fallen out of. Both ends are watching + // the same cooldown, so this is a straggler in flight, not an offer. + if (Date.now() < netLaneBlockedUntil) return; + if (packet.t === "hello" && packet.v !== 2) return; + if (packet.t === "hello" && !roundViewer) { + netPeerHello = { name: packet.name, colors: packet.colors, at: Date.now() }; + return; + } + if (packet.t === "start" && roundViewer?.seat === "challenger" && + packet.v === 2 && Number.isInteger(packet.origin) && + Number.isInteger(packet.delay) && Array.isArray(packet.fighters) && + packet.fighters.length === 2) { + const bridge = roundViewer; + netBegin(packet, 1, (content) => bridge.sendNet(content)); + return; + } + netInbox.push(packet); +} + +// The host's side of the opening: a fresh challenger who said hello gets a +// deal instead of the streamed fight. +function netHostBegin(now) { + if (workshopMap) return false; + // Same door, other side: a deal struck before this seat knows its own handle + // names the host for the rest of the fight, on both screens. + if (webAccountState() && !accountReady()) return false; + const deal = netMakeDeal(); + const room = "ow-" + versusRoomName; + const send = (content) => typeof globalThis.__oskiewarNetSend === "function" + ? globalThis.__oskiewarNetSend(room, content) : false; + if (!send(deal)) return false; + netBegin(deal, 0, send); + return true; +} + +function netDrainHostInbox() { + const inbox = globalThis.__oskiewarNetInbox; + if (!Array.isArray(inbox) || !inbox.length) return; + for (const packet of inbox) { + if (netSession) netInbox.push(packet); + else netHandlePreSession(packet); + } + inbox.length = 0; +} + +// A visitor who arrived through a shared address and found nobody hosting +// takes the room over — the link a friend sent must keep working after the +// sender's tab closed. The chair-holder claims first; a seat-denied watcher +// waits three times as long, so two arrivals at a dead address stagger +// instead of racing, and updateVersusConflict catches the tie anyway. +function updateVersusClaim(now) { + if (globalThis.__oskiewarVersusCapable !== true || !roundViewer) return false; + // Claiming a dead address means hosting, and hosting is playing. Whoever + // arrives next deserves a room with a named fighter standing in it. + if (!versusAllowed()) return false; + // A room with a live host is a fight to join; a room with a stored demo is + // a replay page and keeps being one — versus rooms never record, so only a + // truly empty address falls through to the claim. + if (roundViewer.live || roundViewerDemo || roundViewerMode === "DEMO") { + versusClaimArmedAt = 0; + return false; + } + if (!versusClaimArmedAt) { + versusClaimArmedAt = now; + return false; + } + const wait = roundViewer.seat === "challenger" + ? versusClaimAfterUs : versusClaimAfterUs * 3; + if (now - versusClaimArmedAt < wait) return false; + const name = roundViewer.name; + versusFallbackBridge = roundViewer; + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + versusClaimArmedAt = 0; + versusRoomName = name; + globalThis.__oskiewarRemotePad = null; + beginVersusLobby(now); + telemetry("VERSUS_CLAIM", name); + return true; +} + +// A demo carries the impacts the live pass spawned. Replaying them puts the +// sparks and debris back into a repaint that otherwise only moves bodies. +// The demo loops, so a tick that runs backwards restarts the sweep clean. +function replayViewerImpacts(tick, dt) { + const rows = roundViewerDemo?.impacts || []; + if (tick < roundViewerImpactTick) { + roundViewerImpactTick = -1; + impacts.length = 0; + } + for (const row of rows) + if (row[0] > roundViewerImpactTick && row[0] <= tick) { + const seconds = (row[5] || 300) / 1000; + impacts.push({ x: row[1], y: row[2], z: row[3], + life: seconds, duration: seconds, + death: row[4] === 1, explosion: row[4] === 2 }); + } + roundViewerImpactTick = tick; + updateResultImpactDebris(dt); +} + +function gameBoot() { + nativeHudOverlay = typeof capabilities === "function" && capabilities().hudOverlay === true; + globalThis.__oskiewarWorkshopCommand = workshopCommand; + workshopBase ||= workshopSnapshot(); + if (globalThis.__oskiewarPublishedMap && globalThis.__oskiewarValidateMap) { + workshopMap = globalThis.__oskiewarValidateMap(globalThis.__oskiewarPublishedMap); + workshopTainted = true; + } + syncGameView(); + // The reel harness may boot with the debug overlay lit — safe-zone crops, + // stat chassis, input read-outs — to diagnose framing on a rendered reel. + if (globalThis.__oskiewarDebugOverlay === true) debugHitboxes = true; + // Name the session once. A client-error restart re-runs boot inside the + // same app run, and whoever attached to the session should not lose it to + // a crash the restart exists to paper over. + if (!sessionName) { + seedNames(Math.floor(Math.random() * 4294967296)); + sessionName = pronounceableMatchName(); + } + startedAt = runtime().monotonicUs; + roundStartedAt = startedAt; + lastSimAt = startedAt; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + emitSignal("hello", -1, 1, 0); + shellMode = "MENU"; + titleTransitionAt = null; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + shellPrevious = []; + startInputPending = false; + localControllerPairSeen = false; + localControllerMissing = -1; + navigationPrevious = [[], []]; + roundViewer = globalThis.__oskiewarRoundBridge || null; + if (roundViewer?.start) { + shellMode = "GAME"; + selecting = false; + roundResult = ""; + matchOver = false; + // Watching a fight IS gameplay for the person doing it. This was false on + // every watcher, and the whole match HUD hangs off it: no round clock, no + // VS or WAITING FOR HOST label, no "you are ..." seat line, no status + // tray. That is the "no state updates on screen" @jeffrey reported. + gameplayStarted = true; + matchName = roundViewer.name || ""; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + matchName) : spectatorQr; + roundStartedAt = startedAt - roundIntroDurationUs(); + roundViewerStop = roundViewer.start(handleRoundViewer); + return; + } + if (globalThis.__oskiewarSelfPlay) { + // A harness cast keeps the pre-versus reading of the empty door: nobody + // is holding a controller, so "no opponent" means the climb, never a + // lobby waiting on a friend who cannot exist. + if (!String(globalThis.__oskiewarOpponent || "").trim() || + survivalRequested()) + startSurvivalRun(startedAt, true); + else startSelfPlay(startedAt); + return; + } + if (survivalRequested()) beginSurvival(startedAt); + else if (versusRequested()) { + versusRoomName = sessionName; + beginVersusLobby(startedAt, { title: true }); + } else beginTraining(startedAt); +} + +function resetRound(now, resetMatch = false, keepMap = false) { + if (!netSilent) resetFinalKillReplay(); + resetWorkshopMap(); + rotateLocalMap(keepMap, resetMatch); + if (netSession && !skateparkMap) { + if (netRoundMapIndex < 0) netRoundMapIndex = 0; + else if (!keepMap && roundResult) + netRoundMapIndex = nextRoundMapIndex(netRoundMapIndex); + installRoundMap(netRoundMapIndex); + } + if (replay) { + const nextRoundName = pronounceableMatchName(); + // A versus room is one address for a whole match — the link a friend was + // sent, the socket the fight is riding, the code on the wall. Handing over + // to a new room between rounds would move every watcher and close the + // publisher out from under the fight. Only the broadcast lane hands over, + // where each round IS its own room. + if (!versusLane()) { + if (matchName) publishSpectator(now, { + target: matchName, nextRoundId: "ow-" + nextRoundName, force: true, + }); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + nextRoundName) : null; + } + previousRoundName = matchName; + matchName = nextRoundName; + // Stamped, so a rollback across this rollover takes the entry back with it. + replayRoundMarks.push([demoTick(now), matchName]); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + } + // Terrain belongs to the simulation contract, not the spectator URL. A + // network series keeps one landscape; local rounds rotate authored maps + // independently of their public room names. + configureWorldMap(skateparkMap ? "skatepark" : "station"); + resetSkateRopes(); + terrainPhase = terrainSeed("oskiewar-physics-1-hills"); + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + roundReplayFrames = []; + roundReplayLastAt = 0; + instantReplay = null; + replayOfferPrevious = []; + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; + for (const player of players) { + applyRoster(player, player.rosterIndex); + player.x = player.spawnX; + player.y = airRoundActive() ? floorY - 400 : terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.facing = player.pad === 0 ? 1 : -1; + player.grounded = !airRoundActive(); + player.ducking = false; + player.alive = true; + player.respawnAt = 0; + player.score = 0; + if (resetMatch) player.roundWins = 0; + player.inputX = 0; + player.inputY = 0; + player.lastTap = {}; + player.lastRelease = {}; + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + player.walkSince = 0; + player.attackKind = ""; + player.attackUntil = 0; + player.attackHit = false; + player.blocking = false; + player.blockFlash = 0; + player.shieldLocked = false; + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + player.shieldBrokenAt = 0; + player.windVx = 0; + player.knockVx = 0; + player.shieldVx = 0; + player.gunAmmo = 0; + player.grenadeAmmo = 0; + player.gunAimX = player.facing; + player.gunAimY = 0; + player.gunAimLive = false; + player.gunMode = "HANDGUN"; + player.itemArm = ""; + player.nextGunShotAt = 0; + player.nextSpitAt = 0; + player.spitAt = -Infinity; + player.spitHeavy = false; + player.resultReaction = ""; + player.resultReactionAt = 0; + resultReactionPrevious[player.pad] = []; + player.stance = "NEUTRAL"; + player.itemAction = ""; + player.itemActionStartedAt = 0; + player.itemActionUntil = 0; + player.heldBall = -1; + player.heldPart = -1; + player.heldPlayer = -1; + player.carryArm = ""; + player.grabbedBy = -1; + resetSkate(player); + player.skateboard = skateparkMap && !survivalActive(); + player.ropeIndex = -1; + player.ropeGrabLocked = false; + player.ropeLink = chainLinks; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = 0; + player.boostUntil = 0; + player.skateVx = 0; + player.skateWallSide = 0; + player.swordHeld = false; + player.grabHeld = false; + player.commandStream = []; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + player.partDamage = {}; + player.removedParts = []; + player.fallenBodyGeometry = null; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.poundFrom = 0; + player.poundLevel = 0; + player.standingOn = -1; + player.previousY = player.y; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.botPresses = {}; + player.botAttackAt = now + 420000; + player.botItemAt = now + 600000; + player.botSinkAt = now + 900000; + player.botSinkTaps = 0; + player.botSinkNextAt = 0; + player.botAttackSequence = 0; + player.botJumpAt = now + 900000; + player.survivalTargetLevel = 1; + player.botThreatSeen = 0; + player.botShieldAt = Infinity; + player.botPunishedAt = 0; + player.botScene = null; + player.botGoal = ""; + player.botSubgoal = null; + player.botRngState = (Math.round(now / 1000) ^ + Math.imul(player.pad + 1, 0x9e3779b9)) >>> 0; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.headRoll = 0; + player.headRollRate = 0; + player.headBounceCharge = 0; + player.headPumpDirection = 0; + player.headPumpAt = 0; + // Only a LOCAL hand can still be leaning on a button across the reset; a + // bot's presses were just cleared, and a remote rival's ride their own + // wire — inheriting pad two's local snapshot would suppress them. + player.previous = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]).down.slice() + : player.npc || player.bot || player.remote ? [] + : padSnapshots[player.pad]?.down?.slice() || []; + player.suppressedDirections = player.previous.filter((button) => + button.startsWith("Arrow")); + player.lastButton = "NONE"; + player.lastButtonAt = 0; + } + // A blade dropped by a severed arm is round furniture, not map furniture: + // it exists because a hand stopped existing, and the bell undoes that. Drop + // the dropped ones rather than parking them inactive forever, so a long + // match cannot walk this array up one entry per lost arm. + saberPickups.length = saberPickups.filter((pickup) => pickup.startsActive) + .length; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + if (pickup.active) beginPickupDrop(pickup); + } + for (const tree of bodyTrees) { + tree.growth = 0; + tree.spent = false; + tree.y = terrainFloorAt(tree.x) - 60; + } + gridField.fill(0); + // A new round is a new exchange. Carrying the last one's frames across the + // bell would draw a history that never happened. + for (const meter of frameMeters) meter.length = 0; + nextPowerupAtUs = powerupIntervalUs; + powerupSequence = 0; + roundResult = ""; + roundOverAt = 0; // A fresh round cannot inherit a previous match's deadline. + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + lastSimAt = now; + roundStartedAt = now; + rollWind(now); + resetBalls(now); + if (replay) replay.rounds.push([demoTick(now), windDirection, windMph, + balls.length]); + // Live frame one belongs to fighter one: snap to the head, then let the + // authored sequence cross to the other fighter and pull out. A reel has a + // shorter contract and takes the whole face-off on frame zero below. + cameraCenter = (players[0].x + players[1].x) / 2; + cameraWidth = 960; + cameraCenterY = (players[0].y + players[1].y) / 2 - 90; + cameraContainFloor = 0; + const poseTime = (now - startedAt) / 1000000; + if (reelGroundCamera()) { + // Frame zero is the face-off, not one isolated portrait. The short reel + // intro cannot afford to spend half of itself finding the other fighter. + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.snap({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }); + } else { + const firstHead = runnerWorldGeometry(players[0], poseTime).head; + const portraitWidth = Math.max(96, firstHead.radius * 6.5); + const portraitTarget = { x: firstHead.x, y: firstHead.y, z: firstHead.z }; + cameraDoll.snap({ target: portraitTarget, + position: { x: portraitTarget.x, y: portraitTarget.y, + z: portraitTarget.z - Math.max(portraitWidth * 1.35, + Math.abs(worldNear) + 400) }, + width: portraitWidth, perspective: 0, fov: 55, roll: 0 }); + } + // A rollback fight's fighters are named by the deal, not by whichever + // machine ran the reset: applyRoster above dresses seat one from the local + // account, which on the challenger's screen is the challenger. + if (netSession) netApplyIdentities(netSession.deal); +} + +// The box the camera packs. It is a fighting-game pushbox rather than the +// animated silhouette on purpose: breathing and stride would otherwise pump +// the lens once per idle cycle. Reach spans a fully extended punch or kick so +// throwing one never shoves the frame; live limbs still set the containment +// floor for anything this box misses. +function fighterFrameRect() { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + for (const player of activePlayers()) { + // Trimmed 2026-08-09 — @jeffrey wanted the lens closer to the fight. + // The rect still tracks live position, so jumps and knockbacks widen + // the frame as they happen; this is standing headroom, not arc room. + // Rise trimmed 2026-08-11 — @jeffrey read the old headroom as fighters + // sitting too low in a vertical frame; less sky, more fighter. + // Reach is an anticipation margin, not containment — the live-silhouette + // floor catches an actual extended limb. On a narrow stage every world + // unit of width costs its height times the aspect, so the margin is + // priced by the same factor the fixed shot widths already pay; a phone + // spends its width on fighters, a television on room to swing. + const reach = (isHeadOnly(player) ? 34 : isPogo(player) ? 56 : 104) * + portraitPull(); + const rise = isHeadOnly(player) ? 48 : isPogo(player) ? 128 : 150; + left = Math.min(left, player.x - reach); + right = Math.max(right, player.x + reach); + top = Math.min(top, player.y - rise); + // Feet swing below the terrain contact point on slopes. Pack their full + // projected arc so camera yaw cannot shave them off at a safe-zone edge. + bottom = Math.max(bottom, player.y + (isHeadOnly(player) ? 18 : 38)); + } + // A shot remains physical until it hits something, so it remains a camera + // subject too. Include both ends of its swept path to prevent a fast round + // flickering outside the action-safe frame between simulation ticks — + // but only while it stays near the fight. In the padded room the leash + // spans the whole map, so every shot is framed like it always was; it + // exists because on the old street a ricocheting stray dragged the lens + // twenty thousand units from two idle fighters and the draw span took + // the Xbox to eleven frames a second. + const bulletLeash = 5200; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + if (!players.some((player) => + Math.abs(bullet.x - player.x) < bulletLeash && + Math.abs(bullet.y - player.y) < bulletLeash)) continue; + const previousX = bullet.previousX ?? bullet.x; + const previousY = bullet.previousY ?? bullet.y; + left = Math.min(left, previousX - 32, bullet.x - 32); + right = Math.max(right, previousX + 32, bullet.x + 32); + top = Math.min(top, previousY - 32, bullet.y - 32); + bottom = Math.max(bottom, previousY + 32, bullet.y + 32); + } + return { left, right, top, bottom }; +} + +// How far this stage is from a 16:9 television, as a lens factor. The fixed +// shot widths in this file — the framing floor, the killcam stand-off, the +// intro and result close-ups — are all width constants tuned on a widescreen, +// and the same width on a narrow stage reads twice as distant because the +// screen has no width to spare. Multiplying a CONSTANT by this converts it to +// the stage at hand. Multiplying a packed rect by it is how portrait play used +// to lose fighters off the screen edges: the pack already knows the aspect, +// and shrinking its answer shrinks the one axis that was load-bearing. +const portraitPull = () => clamp(cameraAspect / (16 / 9), .52, 1); +// A reel ends on the win. Nobody is holding a controller, so there is no wide +// shot to hand back to — the last thing in frame should be the winner's face. +const reelCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true && + capabilities().reelFullUi !== true; +// Ground coverage belongs to every 9:16 oven burn, including the full-UI +// lane. `reelCamera` is narrower: it also opts into minimal-HUD winner framing. +// Reusing that narrower predicate for terrain left full-UI reels with the TV +// slab edge behind the lens, exposing a hard cut beneath the floor. +const reelGroundCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true; + +// Rect-pack: the camera width that makes a world rect exactly fill the +// action-safe frame. Whichever axis runs out first decides the lens, so a +// stacked pair frames as tightly as a spread one — and because each term +// carries the live stage aspect, the answer is exact for a phone held +// upright, a television, and an ultrawide alike. +// +// A reel is the one place the pack is allowed to lie. A 9:16 render with +// nobody steering trades its side margins for bigger fighters on purpose — +// that is how the reels were tuned to read. Live play never gets that trade: +// a fighter cropped off a screen edge is a fighter you cannot play. +function rectPackWidth(rect) { + const safe = actionSafeRect(); + return Math.max( + (rect.right - rect.left) * (stageRight - stageLeft) / + Math.max(1, safe.right - safe.left), + (rect.bottom - rect.top) * cameraAspect * (stageBottom - stageTop) / + Math.max(1, safe.bottom - safe.top)) * + (reelCamera() ? portraitPull() : 1); +} +// A fighter reduced to a bouncing head is a few dozen units tall. Without a +// floor the pack would keep closing until one limb filled the screen. +// Lowered with the reach/rise trim above: the closest the lens may sit. +// The tightest the automatic camera may go. It scales with the same pull, or a +// portrait shot closes to the pull and then hits a floor sized for a television. +// The versus lobby holds a mid shot instead: one body under a close-up lens +// filled the screen and sat on top of the very instruction the room exists to +// show, and a visitor deciding whether to share the address wants to see the +// room they are inviting somebody into. Under the wordmark the same lobby +// sits for a portrait — the title is a face, and starting is the pullback +// that reveals the room. +const frameFloorWidth = () => + (lobbyActive() ? shellMode === "MENU" ? 430 : 860 + : compactLayout() ? 215 : 315) * portraitPull(); + +// Terrain is flat color, so it only has to reach as far as the lens can see. +// Submitting the whole arena pushed its far corners past the native ±30000 +// coordinate guard whenever the camera closed in or sat against a wall, which +// culled the ground quad and left the clear color where the stage should be. +function terrainSpan() { + // A lens sees more floor than its nominal width says — perspective, yaw, + // and the orbiting killcam all sweep past it, and a close shot's bottom + // corners un-project far along the ground plane. A fixed apron past the + // width keeps the sheet under every corner of the frame without doubling + // the whole street's quad count when the camera is wide; the near clipper + // has owned the old ±30000 native guard since it learned to cut faces + // instead of culling them. + const reach = cameraDoll.width + 2600; + const worldTop = survivalActive() ? survivalCeilingY : ceilingY; + return { left: Math.max(worldLeft, cameraCenter - reach), + right: Math.min(worldRight, cameraCenter + reach), + top: Math.max(worldTop, cameraCenterY - reach), + bottom: Math.min(parkDeepest, cameraCenterY + reach) }; +} + +function updateCamera(dt) { + if (survivalActive() || skateparkMap) return; + const rect = fighterFrameRect(); + // Look slightly ahead of fast movement so zoom starts before a fighter + // reaches the safe edge instead of reacting after the crossing. + const lookAhead = .2; + let leftDrift = 0; + let rightDrift = 0; + let upDrift = 0; + let downDrift = 0; + for (const player of activePlayers()) { + const dx = (player.vx + (player.windVx || 0) + (player.knockVx || 0) + + (player.shieldVx || 0)) * lookAhead; + const dy = player.vy * lookAhead; + leftDrift = Math.min(leftDrift, dx); + rightDrift = Math.max(rightDrift, dx); + upDrift = Math.min(upDrift, dy); + downDrift = Math.max(downDrift, dy); + } + rect.left += leftDrift; + rect.right += rightDrift; + rect.top += upDrift; + rect.bottom += downDrift; + // AIR DROP has no floor: the starting room cannot cap vertical framing + // once fighters fall farther apart than that room was tall. + const maxWidth = airRoundActive() ? Infinity : Math.max(worldRight - worldLeft, + (floorY - ceilingY) * cameraAspect); + // Perspective orbit and uneven ground skew the projected silhouette beyond + // its orthographic pushbox. A small fixed overscan keeps complete bodies in + // the action-safe rectangle without making the compact room feel distant. + const packWidth = rectPackWidth(rect); + const desiredWidth = clamp(packWidth * 1.08, frameFloorWidth(), maxWidth); + const widthSpeed = desiredWidth > cameraWidth ? 17 : 5.5; + const widthBlend = 1 - Math.exp(-Math.max(0, dt) * widthSpeed); + cameraWidth += (desiredWidth - cameraWidth) * widthBlend; + // An exponential ease always runs a fixed distance behind a target that is + // moving steadily, and the distance is the target's rate over the blend — + // about 160 units of width when the pair is separating at a walk. In the + // cube that debt was invisible: the two walls were 980 apart, so separation + // stopped growing before the debt could show. On a station twice that wide + // it is ten pixels of fighter hanging outside the action-safe rect, every + // frame, for as long as the two of them keep running apart. + // + // So containment gets a floor, and the ease keeps the rest. `rectPackWidth` + // is exactly the width that fits the pack inside the safe rect with nothing + // to spare; the 8% overscan above it is comfort and may arrive late. The + // camera may therefore be behind on looking good, and never behind on + // holding the fight. + cameraWidth = Math.max(cameraWidth, Math.min(packWidth, maxWidth)); + const halfWidth = cameraWidth / 2; + const halfHeight = cameraWidth / cameraAspect / 2; + // Center comes from the same rect the width did, so the frame pans down as + // the action drops and rides up onto the platform with it. + let desiredCenter = cameraWidth >= worldRight - worldLeft + ? (worldLeft + worldRight) / 2 + : clamp((rect.left + rect.right) / 2, + worldLeft + halfWidth, worldRight - halfWidth); + // Feet plant a capsule radius under the floor line, and the ground plane + // keeps covering that far past it, so the frame may sit that low rather + // than widening just to recentre a standing pair. + const footRoom = 40; + // Aim below the fighters' middle, not at it. A vertical frame centered on + // the bodies spends its whole upper half on sky; leaning the aim down + // rides them into the upper third with ground filling in beneath. The + // lean is priced against how much of the frame the pack already fills: + // in the cube's close-ups two fighters stand most of the view tall, and + // the full tower-era lean pushed their heads over the action-safe line — + // so it fades out as the pack closes on the frame's height. + const packFill = clamp((rect.bottom - rect.top) / Math.max(1, halfHeight), + 0, 2); + const aimLean = halfHeight * .22 * clamp((1.8 - packFill) / .8, 0, 1); + let desiredCenterY = airRoundActive() ? (rect.top + rect.bottom) / 2 + aimLean + : halfHeight * 2 >= floorY - ceilingY + ? (ceilingY + floorY) / 2 + : clamp((rect.top + rect.bottom) / 2 + aimLean, + ceilingY + halfHeight, parkDeepest + footRoom - halfHeight); + // Fold containment into the target before easing. Clamping the live camera + // after easing caused a one-frame reset whenever a fighter crossed the safe + // edge; the pack width now absorbs that motion while the center remains + // continuous. + const containLeft = rect.right - halfWidth * .92; + const containRight = rect.left + halfWidth * .92; + if (containLeft <= containRight) + desiredCenter = clamp(desiredCenter, containLeft, containRight); + const containTop = rect.bottom - halfHeight * .92; + const containBottom = rect.top + halfHeight * .92; + if (containTop <= containBottom) + desiredCenterY = clamp(desiredCenterY, containTop, containBottom); + const centerBlend = 1 - Math.exp(-Math.max(0, dt) * 9); + cameraCenter += (desiredCenter - cameraCenter) * centerBlend; + cameraCenterY += (desiredCenterY - cameraCenterY) * centerBlend; +} + +function updateCameraDoll(dt, now) { + if (freeForAll() || airRoundActive()) { + updateCamera(dt); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + const growth = dt > 0 ? Math.max(0, + containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, containmentWidth + growth / 19); + const naturalWidth = cameraWidth * 1.015; + if (naturalWidth < cameraContainFloor * .92) + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, 1 - Math.exp(-dt * 1.6)); + const width = Math.max(naturalWidth, cameraContainFloor) * playerCameraZoom; + cameraDoll.track({ target, position: { + x: target.x + Math.sin(playerCameraYaw) * width * 1.35, + y: target.y - width * (.026 + playerCameraPitch), + z: -Math.cos(playerCameraYaw) * width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (skateparkMap && !survivalActive() && shellMode === "GAME") { + const rider = players[netSession?.seat || 0]; + const width = Math.max(1100, 900 * cameraAspect) * playerCameraZoom; + const half = width / 2; + const desiredX = clamp(rider.x + clamp(rider.vx * .18, -300, 300), + worldLeft + half, worldRight - half); + const desiredY = rider.y - 180; + const blend = 1 - Math.exp(-dt * 9); + cameraCenter += (desiredX - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth = width; + cameraDoll.track({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, z: -width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + const introAge = now - roundStartedAt; + if (survivalActive()) { + const runner = players[0]; + const framedWidth = survivalFrameWidth * playerCameraZoom; + const halfHeight = framedWidth / cameraAspect / 2; + const desiredY = clamp(runner.y + halfHeight * .18, + survivalCeilingY + halfHeight, floorY + 40 - halfHeight); + const blend = 1 - Math.exp(-Math.max(0, dt) * 7); + cameraCenter += ((worldLeft + worldRight) / 2 - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth += (framedWidth - cameraWidth) * blend; + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter, y: cameraCenterY, + z: -framedWidth * 1.35 }, + width: framedWidth, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (roundResult) { + updateResultReactions(now); + const age = Math.max(0, (now - roundOverAt) / 1000000); + // The cinematic hands back to the wide shot at 1.45s so play can resume. + // A reel has no play to resume into, and handing back mid-celebration + // pulled the camera off the winner's face just as the hearts arrived, so + // there the shot is allowed to hold until the recording stops. + if (deathCinematic && (age < 1.45 || (reelCamera() && age < 6))) { + if (age < .11) return; + const loser = players[deathCinematic.loserPad]; + const winner = players[deathCinematic.winnerPad]; + const loserHead = loser.frozenGeometry?.head || + runnerWorldGeometry(loser, (now - startedAt) / 1000000).head; + const winnerHead = winner?.frozenGeometry?.head || (winner + ? runnerWorldGeometry(winner, (now - startedAt) / 1000000).head + : { x: cameraCenter, y: cameraCenterY, z: 0 }); + // The killcam used to sit inside the winner's own head, so the winner + // had to be culled or their body would have filled the lens — which is + // why the fighter who had just won blinked out for three quarters of a + // second. It stands off their shoulder now: back along the line between + // the two of them, raised, and aimed at a point most of the way to the + // fighter going down. Both are in the frustum, so nothing is hidden to + // make the shot and nobody vanishes. + // + // Every distance is drawn from the gap between the heads, because the + // pair can be a step apart or the width of the stage apart, and a fixed + // stand-off frames only one of those. + const headGap = Math.max(320, Math.abs(loserHead.x - winnerHead.x)); + // Center the complete pair. Favoring the loser pushed the winner across + // the viewport edge during the eased handoff. + const focus = { x: lerp(winnerHead.x, loserHead.x, .5), + y: lerp(winnerHead.y, loserHead.y, .5), + z: lerp(winnerHead.z, loserHead.z, .5) }; + const shoulder = { x: focus.x, y: focus.y, + // Stay outside the whole arena depth. The old close killcam entered + // the world volume and near-clipped limbs, floor, and wall polygons. + z: focus.z - Math.max(headGap * 1.3, Math.abs(worldNear) + headGap) }; + // Wider than the old close-up had to be, because it now has to hold two + // fighters rather than one — the 64° lens buys most of that back. Past + // about a 1300 gap this would open onto empty stage, so beyond there it + // settles toward the span the returning wide shot uses. + const shotWidth = Math.min(headGap * 1.7, headGap + 900) * portraitPull(); + if (age < .86) { + cameraDoll.track({ target: focus, position: shoulder, + width: shotWidth, perspective: 0, fov: 55, roll: 0 }, dt, 11); + return; + } + // Reels celebrate instead of returning. The lens narrows onto the + // winner's head rather than the camera dollying toward it: the standoff + // above is deliberately outside the arena depth, and flying in would put + // the floor and the winner's own limbs back through the near plane. + if (reelCamera() && winner) { + const push = clamp((age - .86) / .5, 0, 1); + const headFocus = { x: winnerHead.x, y: winnerHead.y, z: winnerHead.z }; + cameraDoll.track({ target: headFocus, position: { + x: headFocus.x, y: headFocus.y, z: shoulder.z }, + width: lerp(shotWidth, 430 * portraitPull(), push), + perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const returnAmount = clamp((age - .86) / .59, 0, 1); + const midpoint = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const span = Math.max(900, Math.abs(players[1].x - players[0].x) + 540) * + portraitPull(); + cameraDoll.track({ target: midpoint, + position: { x: midpoint.x, y: midpoint.y, + z: lerp(shoulder.z, midpoint.z - span * 1.2, returnAmount) }, + width: lerp(shotWidth, span, returnAmount), + perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const horizontalSpan = Math.abs(players[1].x - players[0].x); + const verticalSpan = Math.abs(players[1].y - players[0].y) * cameraAspect; + const closeWidth = Math.max( + Math.max(820, horizontalSpan + 540, verticalSpan + 520) * portraitPull(), + rectPackWidth(fighterFrameRect()) * 1.22); + cameraDoll.track({ target, + position: { x: target.x, + y: target.y, + z: target.z - closeWidth * 1.2 }, + width: closeWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 7); + return; + } + if (reelGroundCamera() && introAge < reelOpeningHoldUs) { + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + if (introAge < roundIntroDurationUs()) { + // One elapsed-time story: first fighter, second fighter, title pullback, + // then the fight. + // Nothing is counted in rendered frames, so live variable speed and an + // offline slow-motion burn tell the identical introduction. + const age = introAge / 1000000; + const firstEnd = 1; + const secondEnd = 2; + const poseTime = (now - startedAt) / 1000000; + const headOf = (player) => + (player.frozenGeometry || runnerWorldGeometry(player, poseTime)).head; + // Enough room around a head to read as a portrait rather than an eyeball. + const faceWidth = (head) => Math.max(96, head.radius * 6.5); + + const opening = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const openingWidth = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + + let target; + let width; + if (age < secondEnd) { + // Frame one is already on player one. Track easing carries the camera + // across to player two without a cut. + const head = headOf(players[age < firstEnd ? 0 : 1]); + target = { x: head.x, y: head.y, z: head.z }; + width = faceWidth(head); + } else { + const out = clamp((age - secondEnd) / + (roundIntroDurationUs() / 1000000 - secondEnd), 0, 1); + const eased = out * out * (3 - out * 2); + const head = headOf(players[1]); + target = { x: lerp(head.x, opening.x, eased), + y: lerp(head.y, opening.y, eased), + z: lerp(head.z, opening.z, eased) }; + width = lerp(faceWidth(head), openingWidth, eased); + } + // Stand off outside the arena depth. The framing is orthographic, so the + // distance costs nothing and `width` alone decides how close the shot + // reads — but a lens parked a face's width from a head sits inside the + // world volume and near-clips the head it came to look at, which is the + // same trap the killcam fell into and had to be pulled back out of. + const standOff = Math.max(width * 1.35, Math.abs(worldNear) + 400); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, z: target.z - standOff }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + // Measure complete animated silhouettes before rendering. This used to run + // as a final paint-time correction, which made the viewport skip a frame at + // the safe-zone edge. + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + // Lead the floor by exactly the debt the doll's own ease is about to run up. + // `track` pulls back at speed * 1.9 — 19 here — so a floor growing at R units + // a second settles 19 times slower than that, and the doll sits R/19 units of + // width behind it for as long as the growth lasts. In the cube that debt was + // unreachable: the walls were 980 apart and separation stopped growing long + // before it could accumulate. On a station twice that wide, two fighters + // running in opposite directions hold the growth up indefinitely, and the + // debt reads as a hand hanging outside the action-safe rect every frame. + // + // Adding the debt to the target is not a fudge — it is what makes the ease + // arrive where the fighters actually are rather than where they were. It + // costs nothing when nothing is moving apart, because the growth is zero and + // the lead is zero, so a settled fight frames exactly as it always did. + const containmentGrowth = dt > 0 + ? Math.max(0, containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, + containmentWidth + containmentGrowth / 19); + // A small overscan absorbs animated hands and feet before + // they reach the action-safe edge without loosening the close fight shot. + const naturalWidth = cameraWidth * 1.015; + // Hysteresis prevents a fighter hovering at the safe edge from repeatedly + // switching between close and wide framing. The band and the pushbox above + // are tuned together so the floor never has to release during an idle cycle; + // if it does, the lens breathes in time with the fighter's own animation. + if (cameraContainFloor > naturalWidth && + naturalWidth < cameraContainFloor * .92) { + const release = 1 - Math.exp(-Math.max(0, dt) * 1.6); + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, release); + } + const framedWidth = Math.max(naturalWidth, cameraContainFloor) * + (reelCamera() ? 1 : playerCameraZoom); + // Automatic framing stays orthographic, preventing camera movement from + // bending the arena. The right stick may still rotate the diorama explicitly. + const tilt = .026 + playerCameraPitch; + const dolly = 1.35; + cameraDoll.track({ target, + position: { + x: cameraCenter + Math.sin(playerCameraYaw) * framedWidth * dolly, + y: cameraCenterY - framedWidth * tilt, + z: -Math.cos(playerCameraYaw) * framedWidth * dolly }, + width: framedWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 10); +} + +function freezeFinalFrame(now, livePad = -1) { + const poseTime = (now - startedAt) / 1000000; + for (const player of activePlayers()) { + if (player.pad === livePad) { + delete player.frozenGeometry; + delete player.frozenAt; + continue; + } + player.frozenGeometry = runnerWorldGeometry(player, poseTime); + player.frozenAt = now; + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); +} + +function finishRound(now) { + if (roundResult) return; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + captureRoundReplay(now, true); + let roundPan = 0; + const winner = roundWinner(); + if (!winner) { + roundResult = "TIE"; + emitSignal("tie", -1, players[0].score, players[1].score); + } + else { + roundPan = panPlayer(winner); + winner.roundWins += 1; + matchOver = winner.roundWins >= matchWins; + roundResult = winner.name + (matchOver ? " WINS MATCH" : " WINS ROUND"); + emitSignal(matchOver ? "matchwin" : "roundwin", winner.pad, + winner.roundWins, winner.score); + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); + roundOverAt = now; + for (const player of players) player.vx = 0; + playDrum("clap", 1.2, roundPan); + captureFrameTelemetry(now, true); + saveRoundReplay(now); + // A deferred round still needs its replay to be filed from; the flush that + // files it closes the match out afterwards. + if (matchOver && !netSession) finishReplay(); +} + +function resultCardText(display = false) { + if (roundResult === "TIE") return { winner: "tie", action: "" }; + const encoded = roundResult.match(/^(@\S+)\s+WINS\b/i); + const winner = encoded?.[1] || + (roundWinner()?.name || "TIE"); + const handle = display && globalThis.__oskiewarDeviceHandles?.[roundWinner()?.pad]; + return { winner: (handle || winner).toLowerCase(), action: "" }; +} + +function updateResultReactions(now) { + const winningPad = roundWinner()?.pad ?? -1; + for (const player of players) { + const down = inputPads[player.pad]?.down || []; + const previous = resultReactionPrevious[player.pad]; + const laughChord = down.includes("A") && down.includes("B") && + (!previous.includes("A") || !previous.includes("B")); + const pressed = laughChord ? "LAUGH" : down.find((button) => + !previous.includes(button)); + if (pressed) { + const winner = player.pad === winningPad; + if (pressed === "ArrowLeft") player.facing = -1; + if (pressed === "ArrowRight") player.facing = 1; + player.resultReaction = winner + ? ({ LAUGH: "LAUGH", A: "KICK", B: "PUNCH", X: "POSE", Y: "DANCE", + ArrowLeft: "DASH", ArrowRight: "DASH", ArrowUp: "AIR", + ArrowDown: "CROUCH" }[pressed] || "DANCE") + : ({ A: "CRY", B: "WOE", X: "SULK", Y: "WIGGLE" }[pressed] || + "WOE"); + player.resultReactionAt = now; + if (player.resultReaction === "LAUGH") + emitSignal("laugh", player.pad, 1, 0); + else { + playSine(winner ? 520 : 145, .1); + emitSignal("reaction", player.pad, winner ? 1 : -1, 0); + } + } + resultReactionPrevious[player.pad] = down.slice(); + } +} + +function quantizedInput(pad, suppressed = []) { + const held = pad.down; + const active = (button) => held.includes(button) && !suppressed.includes(button); + let horizontal = (active("ArrowRight") ? 1 : 0) - + (active("ArrowLeft") ? 1 : 0); + let vertical = (active("ArrowUp") ? 1 : 0) - + (active("ArrowDown") ? 1 : 0); + if (!horizontal && Math.abs(pad.leftX) >= 0.48) horizontal = pad.leftX > 0 ? 1 : -1; + if (!vertical && Math.abs(pad.leftY) >= 0.48) vertical = pad.leftY > 0 ? 1 : -1; + return { horizontal, vertical }; +} + +function remember(player, button) { + player.lastButton = buttonLabel(button); + player.lastButtonAt = runtime().monotonicUs; + const command = { A: "/", B: "*", X: ")", Y: "+", + LeftShoulder: "+", RightShoulder: "+" }[button] || player.lastButton; + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"].includes(button)) + recordCommand(player, command, player.lastButtonAt); + telemetry("FIGHT_BUTTON", player.name + " " + player.lastButton); +} + +function recordCommand(player, label, now) { + const previous = player.commandStream.at(-1); + if (previous?.label === label && now - previous.at < 40000) return; + player.commandStream.push({ label, at: now }); + while (player.commandStream.length > commandStreamDepth) + player.commandStream.shift(); +} + +function clearWeaponLoadout(player) { + player.gunAmmo = 0; player.grenadeAmmo = 0; player.swordHeld = false; + player.gunMode = "HANDGUN"; player.itemArm = ""; + player.itemAction = ""; player.itemActionUntil = 0; + player.gunAimLive = false; player.itemAimLocked = false; +} + +function fireGun(player, input) { + if (unarmedRoundActive()) { clearWeaponLoadout(player); return; } + const now = runtime().monotonicUs; + const pose = gunPose(player, now, input); + player.gunAimX = pose.dx; + player.gunAimY = pose.dy; + const smg = player.gunMode === "RUBBER SMG"; + const rocket = player.gunMode === "ROCKET LAUNCHER"; + const laser = player.gunMode === "SPACE LASER"; + if (rocket) { + grenades.push({ x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * 2850, vy: pose.dy * 2850, owner: player.pad, + fuse: 3.2, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0, rocket: true }); + while (grenades.length > 12) grenades.shift(); + player.gunAmmo -= 1; + player.nextGunShotAt = now + 650000; + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 240000; + player.pendingMoveLabel = "ROCKET " + player.gunAmmo; + playDrum("kick", 1.15, panPlayer(player)); + playSine(92, .22); + emitSignal("rocket", player.pad, pose.dx, pose.dy); + return; + } + // Automatic means a fast succession of discrete rounds, never a shotgun + // fan. Holding fire schedules the next SMG round below. + const shots = 1; + for (let shot = 0; shot < shots; shot++) { + bullets.push({ + x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * (laser ? 9600 : smg ? 5000 : 4200), + vy: pose.dy * (laser ? 9600 : smg ? 5000 : 4200), + owner: player.pad, life: 1, rubber: smg, laser, + safeUntil: now + 100000, + }); + } + while (bullets.length > 24) bullets.shift(); + player.gunAmmo -= shots; + player.nextGunShotAt = now + (laser ? 340000 : smg ? 85000 : 220000); + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + (laser ? 210000 : 170000); + player.pendingMoveLabel = + (laser ? "LASER " : smg ? "RUBBER SMG " : "FIRE ") + player.gunAmmo; + for (let shot = 0; shot < shots; shot++) { + playDrum(laser ? "whoosh" : smg ? "block" : "hat", + laser ? 1.35 : smg ? .62 + shot * .08 : 1.05, panPlayer(player)); + playSine(laser ? 1180 : (smg ? 310 : 760) + shot * 55, + laser ? .13 : smg ? .055 : .08); + } + emitSignal(laser ? "laser" : "bullet", player.pad, pose.dx, pose.dy); +} + +// The mouth used by both face paint and projectile spawn. Its coordinates are +// authored in face-space, then rotated with a bodyless head. Keeping this one +// transform prevents the visible lips and the physical glob from separating +// while the head rolls. +function spitMouthPose(player) { + const radius = 22; + const direction = player.facing || 1; + const head = { x: player.x, y: player.y - radius }; + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const localX = direction * radius * .2; + const localY = radius * .3; + const offsetX = localX * cosRoll - localY * sinRoll; + const offsetY = localX * sinRoll + localY * cosRoll; + // Position and aim are related but not identical: the mouth sits low on the + // face, while spit travels mostly forward with only a small downward pitch. + // Using center->mouth as velocity made that low placement dominate the shot + // and swing it sideways as the head rolled. + // The runner's `facing` sign names its mirrored drawing side; the visible + // face normal points away from that sign. Treating it as the normal sent the + // release upper-left while the mouth presented lower-right. + const aimLocalX = -direction; + const aimLocalY = -.22; + const aimX = aimLocalX * cosRoll - aimLocalY * sinRoll; + const aimY = aimLocalX * sinRoll + aimLocalY * cosRoll; + // Screen/world Y grows downward. Head roll owns the sideways swing, but a + // spit release always pitches below the mouth instead of becoming an + // upward shot during the top half of a roll. + const downwardAimY = Math.abs(aimY); + const aimLength = Math.hypot(aimX, downwardAimY) || 1; + return { + x: head.x + offsetX, + y: head.y + offsetY, + outX: aimX / aimLength, + outY: downwardAimY / aimLength, + roll, direction, + }; +} + +function spit(player, heavy = false) { + const now = runtime().monotonicUs; + if (now < (player.nextSpitAt || 0)) return; + const mouth = spitMouthPose(player); + const direction = mouth.direction; + // A rolling head spits WHERE ITS MOUTH POINTS. The lob leaves along the + // head's current angle, so aim on a bodyless head is a timing skill — wait + // for the roll to face your rival, or spit skyward and let it rain. Bodied + // fighters have no roll and lob flat-forward as before. headRoll is sim + // state (integrated in updatePlayers), so the re-sim agrees. + // Release at the visible lips, mostly face-forward with a slight downward + // pitch. Both the spawn and aim use the same rolling face transform. + const speed = heavy ? 520 : 680; + const toss = { x: mouth.outX * speed, y: mouth.outY * speed }; + bullets.push({ + x: mouth.x, y: mouth.y, z: player.z, + previousX: mouth.x, previousY: mouth.y, + vx: toss.x, vy: toss.y, + owner: player.pad, life: 1, spit: true, heavy, + // Let the glob visibly clear the lips and the spitter's own fallen limbs. + // Without this, a bodyless fighter often spat directly into its debris + // halo and produced only a yellow impact puff on the release frame. + safeUntil: now + 220000, + }); + while (bullets.length > 24) bullets.shift(); + player.nextSpitAt = now + (heavy ? 520000 : 260000); + player.spitAt = now; + player.spitHeavy = heavy; + player.lastButton = heavy ? "HEAVY SPIT" : "SPIT"; + player.lastButtonAt = now; + player.pendingMoveLabel = player.lastButton; + playSine(heavy ? 118 : 190, heavy ? .16 : .1); + playDrum(heavy ? "kick" : "hat", heavy ? .82 : .55, panPlayer(player)); + emitSignal("spit", player.pad, heavy ? 2 : 1, direction); +} + +function throwGrenade(player, input = null) { + if (unarmedRoundActive()) { clearWeaponLoadout(player); return; } + const now = runtime().monotonicUs; + const aimX = input?.horizontal || player.facing; + const aimY = input ? -input.vertical : -.25; + const length = Math.hypot(aimX, aimY) || 1; + grenades.push({ x: player.x + player.facing * 150, + y: player.y - (player.ducking ? 80 : 145), z: player.z, + vx: aimX / length * 1950, vy: aimY / length * 1950, + owner: player.pad, + fuse: 1.15, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0 }); + while (grenades.length > 12) grenades.shift(); + player.grenadeAmmo -= 1; + player.itemAction = "THROW"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 260000; + player.pendingMoveLabel = "GRENADE " + player.grenadeAmmo; + playDrum("kick", .95, panPlayer(player)); + emitSignal("grenade", player.pad, player.facing, player.ducking ? 1 : 0); +} + +function beginPickupDrop(pickup) { + if (unarmedRoundActive()) { pickup.active = false; pickup.dropping = false; return; } + const live = activePlayers().filter(p => p.alive); + const all = [...gunPickups, ...saberPickups, ...grenadePickups]; + const slot = Math.max(0, all.indexOf(pickup)); + if (airRoundActive()) { + const middle = live.reduce((sum, p) => sum + p.x, 0) / Math.max(1, live.length); + pickup.x = clamp(middle + ((slot % 5) - 2) * 190, + worldLeft + 150, worldRight - 150); + pickup.y = Math.min(...live.map(p => p.y), floorY + 1e9) - 800 - slot * 110; + pickup.dropLandingY = null; + pickup.dropVy = 960; + } else { + pickup.dropLandingY = surfaceYAt(pickup.x, floorY) - 70; + pickup.y = Math.min(pickup.dropLandingY - 520, floorY - 900); + pickup.dropVy = 0; + } + pickup.dropping = true; + pickup.respawnAt = 0; +} + +function updateFallingPickups(dt, now) { + if (unarmedRoundActive()) return; + const live = activePlayers().filter(p => p.alive); + const lower = live.length ? Math.max(...live.map(p => p.y)) + 1000 : floorY + 1000; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + if (!pickup.active) { + if (airRoundActive() && pickup.startsActive) { + if (!pickup.respawnAt) pickup.respawnAt = now + 4000000; + if (now >= pickup.respawnAt) { pickup.active = true; beginPickupDrop(pickup); } + } + continue; + } + if (!pickup.dropping) continue; + pickup.dropVy = Math.min(airRoundActive() ? 1100 : 1400, + (pickup.dropVy || 0) + 1900 * dt); + pickup.y += pickup.dropVy * dt; + if (airRoundActive()) { + if (pickup.y > lower) beginPickupDrop(pickup); + } else if (pickup.y >= pickup.dropLandingY) { + pickup.y = pickup.dropLandingY; + pickup.dropVy = 0; + pickup.dropping = false; + } + } +} + +function updateGunPickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of gunPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.gunAmmo = Math.min(30, player.gunAmmo + pickup.amount); + player.gunMode = pickup.kind || "HANDGUN"; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, player.gunMode + " +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 1, pickup.amount); + break; + } + } +} + +// A saber is picked up the way a gun is and kept the way a limb is. It needs +// a free arm to take, it lives on `swordHeld` rather than in an ammo count, +// and `meleeSpecFor` is what spends it — every hand strike gets half again +// its reach while the blade is in the hand. Nothing here fires. +function updateSaberPickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of saberPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || player.swordHeld || + !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, + pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.swordHeld = true; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "LIGHT SABER"); + playDrum("clap", 1.25, panPlayer(player)); + playSine(520, .14); + emitSignal("saber", player.pad, 1, 0); + break; + } + } +} + +function updateGrenadePickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of grenadePickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.grenadeAmmo = Math.min(4, player.grenadeAmmo + pickup.amount); + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "GRENADE +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 2, pickup.amount); + break; + } + } +} + +// Ripe fruit is a new body and fifteen seconds. The clock is `roundElapsedUs` +// counting up toward `roundDurationUs`, so winding it back is what "adds +// time" means here — and it is clamped at zero, because a tree cannot make +// the round longer than a round. +// The tree leans in off its wall, so both the picture and the pickup test have +// to agree about where the fruit ended up. One function owns that. +// The tree climbs its wall more than it leans off it, because a fighter pinned +// against that wall still has to be able to reach the fruit from a jump. One +// function owns the geometry so the picture and the pickup test agree. +function treeFruit(tree) { + const toward = tree.x < (worldLeft + worldRight) / 2 ? 1 : -1; + // Cube-scale tree. The tower's tree leaned three tiles into a room that + // had thirty; the same lean in a ten-tile cube put ripe fruit inside a + // spawn-idle fighter's reach, and two fighters who never moved wound the + // clock back fifteen seconds every eighteen — no round could end. This + // tree climbs about two tiles of wall, leans under one tile in, and hangs + // its fruit high enough that picking it is a jump at the wall, never a + // side effect of standing near one. + const reach = 45 + 150 * tree.growth; + return { x: tree.x + toward * (reach * .35 + 30), y: tree.y - reach * 1.3, + z: tree.z, toward, reach, + tipX: tree.x + toward * reach * .5, tipY: tree.y - reach * .9 }; +} + +function updateBodyTrees(dt, now) { + const poseTime = (now - startedAt) / 1000000; + for (const tree of bodyTrees) { + // One harvest a round, said out loud. Eighteen seconds of ripening against + // a thirty second round used to say it on its own, and the padded room's + // quarter-pipe said it again by holding the fruit a wall's height above a + // standing fighter. The tower's floor is flat, which put the fruit back + // inside arm's reach — and two fighters then stood at the wall winding + // fifteen seconds off the clock every eighteen, so the round could not + // end. A round that cannot end is worse than a body that stays broken. + if (tree.spent) continue; + if (tree.growth < 1) { + tree.growth = Math.min(1, tree.growth + dt * 1000000 / treeRipenUs); + continue; + } + const fruit = treeFruit(tree); + for (const player of players) { + if (!player.alive) continue; + // A tile and a third — a hand up at the fruit, not the whole corner of + // the room. Sized with treeFruit above so a spawn-mark idler stays out + // of range; the two limits only hold together. + if (runnerDistanceToPoint(player, poseTime, fruit.x, fruit.y, fruit.z) > 120) + continue; + tree.growth = 0; + tree.spent = true; + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + roundElapsedUs = Math.max(0, roundElapsedUs - treeTimeBonusUs); + remember(player, "NEW BODY"); + playDrum("bell", 1.15, panPlayer(player)); + emitSignal("powerup", player.pad, 3, treeTimeBonusUs / 1000000); + break; + } + } +} + +function drawBodyTree(tree, t) { + const scale = cameraScale(); + const ripe = tree.growth >= 1; + // Unripe reads as a sapling rather than a dimmed icon: the trunk and canopy + // are literally shorter, so the stage tells you how long the walk can wait. + const { x: fruitX, y: fruitY, toward, tipX, tipY: crownY } = treeFruit(tree); + const sway = Math.sin(t * 1.4 + tree.x * .0007) * (3 + 9 * tree.growth); + const bark = mixColor([120, 92, 64], [58, 46, 38], visualTheme.light); + const leaf = ripe + ? mixColor([120, 226, 138], [46, 150, 84], visualTheme.light) + : mixColor([96, 140, 104], [44, 84, 60], visualTheme.light); + const tipY = crownY + sway; + worldCapsule(tree.x, tree.y, tree.z, tipX, tipY, tree.z, + Math.max(2, (11 + 9 * tree.growth) * scale), bark); + // Canopy sized with treeFruit's cube-scale lean: fronds stay under a tile + // long so the tree dresses its wall without reaching into the fight. + for (const spread of [-1, -.35, .35, 1]) { + worldCapsule(tipX, tipY, tree.z, + tipX + toward * (30 + 45 * tree.growth), + tipY + spread * (30 + 35 * tree.growth), tree.z, + Math.max(2, (8 + 8 * tree.growth) * scale), leaf); + } + if (!ripe) return; + // The fruit is the part you aim at, so it only exists once it can be taken. + const point = projectPoint(fruitX, fruitY + sway, tree.z); + filledDisc(point.x, point.y, Math.max(3, 46 * scale), + mixColor([236, 108, 132], [188, 62, 92], visualTheme.light)); +} + +function updatePowerups(now) { + if (unarmedRoundActive()) return; + while (roundElapsedUs >= nextPowerupAtUs) { + // Only the slot marked `cycle` is the rotation's business. Asking whether + // ANY gun pickup is on the map would let an untouched space laser sitting + // on the top deck stall the pistol reload for the whole round. + const pickup = gunPickups.find((slot) => slot.cycle); + // Authored maps may intentionally have no replenishing weapon. + if (pickup && !pickup.active) { + // The cycle's whole job is to keep six more rounds of ammo appearing + // somewhere worth crossing the station for — the corner tiles, + // alternating, so the reload never lives on one fighter's side. + pickup.active = true; + pickup.x = tileCenterX(powerupSequence % 2 === 0 + ? cornerColLeft : cornerColRight); + pickup.z = 0; + beginPickupDrop(pickup); + powerupSequence += 1; + emitSignal("powerup", -1, powerupSequence, nextPowerupAtUs / 1000000); + playDrum("clap", .9, 0); + } + nextPowerupAtUs += powerupIntervalUs; + } + updateGunPickups(now); + updateSaberPickups(now); + updateGrenadePickups(now); +} + +// Ghost trails map a ricochet's whole path. The fixed length is the entire +// point: shots here have no clock-based expiry, they bounce until they hit +// somebody, so a trail that grew with flight time would be the eleven-frames-a +// -second stray all over again — measured in line segments instead of terrain +// span. A ring buffer costs the same on the thousandth bounce as on the first. +// +// Sampling every third tick buys three times the arc for the same sixteen +// points, and a bounce records out of turn so the corner lands on the wall +// rather than being chorded through it. +const bulletTrailPoints = 12; +const bulletTrailStride = 4; + +function recordBulletTrail(bullet) { + if (!bullet.trail) { + // One allocation at birth, never per frame. + bullet.trail = new Array(bulletTrailPoints * 2).fill(0); + bullet.trailCount = 0; + } + const slot = (bullet.trailCount % bulletTrailPoints) * 2; + bullet.trail[slot] = bullet.x; + bullet.trail[slot + 1] = bullet.y; + bullet.trailCount++; +} + +function updateBullets(dt, now, combat = true) { + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + bullet.vx += windAcceleration * .12 * dt; + // A glob is a ball, not a round: gravity pulls the toss back down, and it + // dries out in flight rather than flying forever. The gravity is soft on + // purpose — the lob should hang for over a second, analog and watchable. + if (bullet.spit) { + bullet.vy += 700 * dt; + bullet.life -= dt * .22; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + continue; + } + } + bullet.previousX = bullet.x; + bullet.previousY = bullet.y; + bullet.x += bullet.vx * dt; + bullet.y += bullet.vy * dt; + // Held so the ricochets below can be spotted by the sign they flip. + const enteredVx = bullet.vx; + const enteredVy = bullet.vy; + // A laser bolt does not ricochet. Everything else in this game's ballistics + // is built on the opposite rule — "shots have no clock-based expiry, arena + // surfaces ricochet them so a long-travelling round remains part of the + // fight" — and that rule is what makes the pistol frightening in a closed + // room. The bolt is the other half of the pair: four of them, travelling + // more than twice as fast, each spent outright the moment it touches + // anything. Fast and honest against slow and haunting, and a laser miss is + // a miss for good. + if (bullet.laser && (bullet.x - 24 <= worldLeft + wallThickness || + bullet.x + 24 >= worldRight - wallThickness || + (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) || + bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness)) { + bullet.life = 0; + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .14, duration: .14, death: false, explosion: false }); + playDrum("hat", 1.4, panAt(bullet.x, bullet.z)); + continue; + } + // Shots have no clock-based expiry. Arena surfaces ricochet them so a + // long-travelling round remains part of the fight until contact. + if (bullet.x - 24 <= worldLeft + wallThickness) { + bullet.x = worldLeft + wallThickness + 24; + bullet.vx = Math.abs(bullet.vx); + } else if (bullet.x + 24 >= worldRight - wallThickness) { + bullet.x = worldRight - wallThickness - 24; + bullet.vx = -Math.abs(bullet.vx); + } + if (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) { + bullet.y = ceilingY + wallThickness + 24; + bullet.vy = Math.abs(bullet.vy); + } else if (bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness) { + bullet.y = terrainFloorAt(bullet.x) - wallThickness - 24; + if (bullet.spit) { + // A bouncing ball, not a ricochet: each bounce keeps half the height + // and costs a bite of the glob, and once the bounce is too small to + // read it dissipates where it lies instead of buzzing along the floor. + bullet.vy = -Math.abs(bullet.vy) * .56; + bullet.vx *= .84; + bullet.life -= .18; + if (Math.abs(bullet.vy) < 90) bullet.life = 0; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + } else playDrum("hat", .3, panAt(bullet.x, bullet.z)); + // A splash bounces any bodyless head standing in it — including the + // spitter's own, so spitting straight down is a little hop. Popcorn + // physics for the intimate spit fight. + for (const target of players) { + if (!target?.alive || !isHeadOnly(target)) continue; + if (Math.abs(target.x - bullet.x) > 70 || + Math.abs(target.y - bullet.y) > 90) continue; + target.vy = Math.min(target.vy, 0) - 240; + target.grounded = false; + } + } else bullet.vy = -Math.abs(bullet.vy); + } + // A bounce is worth a point of its own: on the stride alone the segment + // spanning a ricochet would cut the corner straight through the wall. + if (bullet.vx !== enteredVx || bullet.vy !== enteredVy || + bullet.trailTick === undefined) { + bullet.trailTick = 0; + recordBulletTrail(bullet); + } else if (++bullet.trailTick % bulletTrailStride === 0) + recordBulletTrail(bullet); + } + for (let left = 0; left < bullets.length; left++) { + const a = bullets[left]; + if (a.life <= 0) continue; + for (let right = left + 1; right < bullets.length; right++) { + const b = bullets[right]; + if (b.life <= 0 || a.owner === b.owner) continue; + if (Math.abs(a.x - b.x) <= 96 && Math.abs(a.y - b.y) <= 52 && + Math.abs(a.z - b.z) <= 48) { + a.life = 0; + b.life = 0; + spawnImpact({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, + z: (a.z + b.z) / 2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", 1, 0); + emitSignal("cancel", -1, a.owner, b.owner); + break; + } + } + } + if (!combat) return; + const poseTime = (now - startedAt) / 1000000; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + const shot = { x1: bullet.previousX ?? bullet.x, + y1: bullet.previousY ?? bullet.y, z1: bullet.z, + x2: bullet.x, y2: bullet.y, z2: bullet.z, width: 48 }; + for (const fragment of detachedParts) { + if (fragment.owner === bullet.owner && now < bullet.safeUntil) continue; + const contact = segmentSegmentClosest(shot, fragment); + if (contact.distance > (shot.width + fragment.width) / 2) continue; + const impulse = bullet.heavy ? 1500 : bullet.spit ? 900 : 1200; + fragment.vx += Math.sign(bullet.vx || 1) * impulse; + fragment.vy -= bullet.heavy ? 520 : 300; + fragment.owner = bullet.owner; + fragment.hitAfter = now + 120000; + bullet.life = 0; + spawnImpact({ x: contact.secondPoint.x, y: contact.secondPoint.y, + z: contact.secondPoint.z, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", .72, panAt(fragment.x1, fragment.z1)); + break; + } + if (bullet.life <= 0) continue; + const targets = [...players.filter((player) => player.pad !== bullet.owner), players[bullet.owner]]; + for (const target of targets) { + if (!target?.alive || (target.pad === bullet.owner && now < bullet.safeUntil)) + continue; + // Reflect across the circular shield's local surface normal. A square hit + // returns home; a glancing hit leaves at the corresponding ricochet angle. + // Flipping `owner` lets the returned shot hurt whoever fired it. + if (target.blocking) { + const shield = shieldGeometry(target); + const guard = sampleCombatBoxes(target,now,null,false).guard[0]; + if (guard && segmentBoxEntry({x1:bullet.previousX??bullet.x,y1:bullet.previousY??bullet.y, + z1:bullet.z,x2:bullet.x,y2:bullet.y,z2:bullet.z},guard,24)!==null) { + let nx = bullet.x - shield.x; + let ny = bullet.y - shield.y; + const normalLength = Math.hypot(nx, ny); + if (normalLength > .001) { + nx /= normalLength; + ny /= normalLength; + } else { + const speed = Math.hypot(bullet.vx, bullet.vy) || 1; + nx = -bullet.vx / speed; + ny = -bullet.vy / speed; + } + const normalVelocity = bullet.vx * nx + bullet.vy * ny; + bullet.vx -= 2 * normalVelocity * nx; + bullet.vy -= 2 * normalVelocity * ny; + bullet.x = shield.x + nx * (shield.radius + 25); + bullet.y = shield.y + ny * (shield.radius + 25); + bullet.owner = target.pad; + bullet.life = Math.max(bullet.life, .55); + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .18, duration: .18, death: false, explosion: false }); + breakShield(target, now); + emitSignal("ballblock", target.pad, 1, 0); + continue; + } + } + const contact = sweptProjectileContact([{ + x1: bullet.previousX ?? bullet.x, y1: bullet.previousY ?? bullet.y, + z1: bullet.z, x2: bullet.x, y2: bullet.y, z2: bullet.z, + width: 48, role: "bullet", part: "bullet", + }], target, poseTime); + if (contact && contact.separation <= 3) { + const pointContact = runnerContactToPoint(target, poseTime, + bullet.x, bullet.y, bullet.z); + const endpointHit = Math.min(pointContact.headDistance, + pointContact.bodyDistance) <= 24; + const headshot = endpointHit + ? pointContact.headDistance <= pointContact.bodyDistance + : contact.headshot; + const segmentIndex = endpointHit && !headshot + ? pointContact.segmentIndex : contact.segmentIndex; + bullet.life = 0; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: headshot, + explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + if (headshot) + killPlayer(target, bullet.owner, now, "SHOT"); + else { + applyBodyHit(target, segmentIndex, + bullet.x - bullet.vx, bullet.owner, now, + bullet.heavy ? 1680 : bullet.spit ? 920 : 1180, + bullet.heavy ? 260 : bullet.spit ? 90 : 125); + playDrum("block", .9, panPlayer(target)); + } + break; + } + } + } + for (let index = bullets.length - 1; index >= 0; index--) + if (bullets[index].life <= 0) bullets.splice(index, 1); +} + +function updateGrenades(dt, now, combat = true) { + for (const grenade of grenades) { + if (!grenade.alive) continue; + if (grenade.exploding) { + grenade.blastAge += dt; + grenade.blastRadius = grenadeBlastRadius * + Math.min(1, grenade.blastAge / grenadeBlastDuration); + const poseTime = (now - startedAt) / 1000000; + for (const player of combat ? players : []) { + if (!player.alive || (grenade.hitPlayers & (1 << player.pad))) continue; + const contact = runnerContactToPoint(player, poseTime, + grenade.x, grenade.y, grenade.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > + grenade.blastRadius) continue; + grenade.hitPlayers |= 1 << player.pad; + if (contact.headDistance <= grenade.blastRadius) + killPlayer(player, grenade.owner, now, "BLASTED"); + else { + const blastForce = 1250 + 850 * + (1 - clamp(contact.bodyDistance / grenadeBlastRadius, 0, 1)); + applyBodyHit(player, contact.segmentIndex, grenade.x, + grenade.owner, now, blastForce, 300); + } + } + if (grenade.blastAge >= grenadeBlastDuration) grenade.alive = false; + continue; + } + const previousY = grenade.y; + if (!grenade.rocket) { + grenade.vx += windAcceleration * .45 * dt; + grenade.vy += 1800 * dt; + } + grenade.x += grenade.vx * dt; + grenade.y += grenade.vy * dt; + grenade.fuse -= dt; + if (grenade.rocket) { + const poseTime = (now - startedAt) / 1000000; + for (const target of combat ? players : []) { + if (!target.alive || target.pad === grenade.owner) continue; + if (runnerDistanceToPoint(target, poseTime, + grenade.x, grenade.y, grenade.z) > 34) continue; + grenade.fuse = 0; + break; + } + } + const inset = wallThickness + 35; + if (grenade.x < worldLeft + inset) { + grenade.x = worldLeft + inset; + grenade.vx = Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } else if (grenade.x > worldRight - inset) { + grenade.x = worldRight - inset; + grenade.vx = -Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + if (!airRoundActive() && grenade.y < ceilingY + inset) { + grenade.y = ceilingY + inset; + grenade.vy = Math.abs(grenade.vy) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + const ledge = grenade.vy >= 0 && + ledgeCrossed(grenade.x, previousY, grenade.y, 30); + if (ledge) { + grenade.y = ledge.y - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + } else if (grenade.y >= terrainFloorAt(grenade.x) - 30) { + grenade.y = terrainFloorAt(grenade.x) - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + if (grenade.rocket) grenade.fuse = 0; + } + if (grenade.fuse <= 0) { + grenade.exploding = true; + grenade.blastAge = 0; + grenade.blastRadius = 0; + grenade.vx = 0; + grenade.vy = 0; + playDrum("kick", 1.25, panPlayer(players[grenade.owner])); + emitSignal("blast", grenade.owner, + grenade.x / worldRight, grenade.y / floorY); + } + } + for (let index = grenades.length - 1; index >= 0; index--) + if (!grenades[index].alive) grenades.splice(index, 1); +} + +function startMelee(player, kind, now) { + if (isHeadOnly(player) || isPogo(player)) return; + // Every fresh press starts a strike, including during the previous swing. + // updatePlayer detects the edge; holding a button does not auto-repeat. + const spec = meleeSpecs[kind]; + if (!spec) return; + const attackingPart = kind === "KICK" + ? player.facing > 0 ? "right-leg" : "left-leg" + : itemHand(player); + if (!hasPart(player, attackingPart)) return; + player.attackKind = kind; + player.lowKick = kind === "KICK" && + (player.ducking || (player.crouchBlend || 0) > .35); + player.attackStartedAt = now; + player.attackUntil = now + spec.windowUs; + player.attackHit = false; + player.attackMomentum = now < player.dashUntil + ? clamp(Math.abs(player.vx) / walkSpeed, 1.35, 2.25) : 1; + player.stance = "ATTACK"; + player.pendingMoveLabel = kind; + playDrum(spec.cue[0], spec.cue[1], panPlayer(player)); + emitSignal(kind.toLowerCase(), player.pad, player.facing, 0); +} + +const limbParts = ["left-arm", "right-arm", "left-leg", "right-leg"]; +const spiderLegParts = Array.from({ length: 8 }, (_, index) => + `spider-leg-${index + 1}`); +const hasPart = (player, part) => !player.removedParts?.includes(part); +const isPogo = (player) => hasPart(player, "torso") && + limbParts.every((part) => !hasPart(player, part)); +const isHeadOnly = (player) => !hasPart(player, "torso"); +const availableArm = (player) => { + const lead = player.facing > 0 ? "right-arm" : "left-arm"; + if (hasPart(player, lead)) return lead; + const other = lead === "right-arm" ? "left-arm" : "right-arm"; + return hasPart(player, other) ? other : ""; +}; +// Ownership stays attached to the arm that picked the object up; turning or +// boarding cannot teleport a gun between hands. +const itemHand = (player) => player.itemArm || availableArm(player); +// Gun before grenade, always: the pistol is the sustained item and the one +// drawn in the hand, so "use what you are holding" needs no mode toggle. +const heldItem = (player) => + unarmedRoundActive() ? "" : isHeadOnly(player) ? player.gunAmmo > 0 ? "GUN" : "" + : isPogo(player) || !itemHand(player) || !hasPart(player, itemHand(player)) + ? "" : player.gunAmmo > 0 ? "GUN" + : player.grenadeAmmo > 0 ? "GRENADE" : ""; +const itemSwinging = (player, now) => + (player.attackKind === "WHIP" || player.attackKind === "BASH") && + meleePulse(player, now) > 0; + +function meleePulse(player, now) { + if (now >= player.attackUntil || player.attackUntil <= player.attackStartedAt) return 0; + const phase = (now - player.attackStartedAt) / + (player.attackUntil - player.attackStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +// Collision starts on the input frame and lasts through the original short +// swing. A landed strike still hits only once; another tap starts a new one. +const meleeFrames = { + PUNCH: { startup: 0, active: 14, recovery: 0 }, + KICK: { startup: 0, active: 14, recovery: 0 }, + WHIP: { startup: 0, active: 12, recovery: 0 }, + BASH: { startup: 0, active: 17, recovery: 0 }, +}; +function meleeFrame(player, now) { + const timing = meleeFrames[player.attackKind]; + if (!timing || now < player.attackStartedAt || now >= player.attackUntil) + return { frame: 0, phase: 'neutral', startup: 0, active: 0, recovery: 0 }; + const frame = Math.floor((now - player.attackStartedAt) / replayTickUs + 1e-7) + 1; + return { ...timing, frame, phase: frame <= timing.startup ? 'startup' + : frame <= timing.startup + timing.active ? 'active' : 'recovery' }; +} + +function meleeTarget(player, now) { + const pulse = meleePulse(player, now); + const spec = meleeSpecFor(player, player.attackKind); + const lowKick = player.attackKind === "KICK" && player.lowKick; + const reachX = player.x + player.facing * (spec.reach + spec.swell * pulse); + // A low kick sweeps the ground in front of the kicker — the ground he is + // standing on. The bare terrain probe read the arena floor, so a low kick + // thrown on a rung aimed a storey down through the rung it stood on. + const sweepY = lowKick + ? Math.min(surfaceYAt(reachX, player.y), player.y + 20) - 5 : 0; + return { + x: player.x + player.facing * (spec.reach + spec.swell * pulse + + (lowKick ? 34 * pulse : 0)), + y: lowKick ? sweepY : player.y - (player.attackKind !== 'KICK' && + (player.ducking || player.crouchBlend > .35) ? 68 : spec.height), + z: player.z, + }; +} + +function itemActionPulse(player, now) { + if (!player.itemAction || now >= player.itemActionUntil) return 0; + const phase = (now - player.itemActionStartedAt) / + Math.max(1, player.itemActionUntil - player.itemActionStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +function itemHandTarget(player, now) { + // A surviving head grips the pistol at the mouth. It can still aim and fire, + // but grenades and melee weapons remain limb-dependent. + if (isHeadOnly(player)) return { + x: player.x + player.facing * 18, + y: player.y - 20, z: player.z, + }; + // A swung weapon rides the striking hand, so the drawn pistol or grenade + // sits on the live attack capsule instead of floating out in front. + if (itemSwinging(player, now)) return meleeTarget(player, now); + const pulse = itemActionPulse(player, now); + if (player.itemAction === "THROW") return { + x: player.x + player.facing * (42 + 52 * pulse), + y: player.y - 118 - 52 * pulse, z: player.z, + }; + if (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil)) { + const aimX = player.gunAimX || player.facing; + const aimY = player.gunAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { x: player.x + aimX / length * 108, + y: player.y - 102 + aimY / length * 92, z: player.z }; + } + return { x: player.x + player.facing * 108, + y: player.y - 115, z: player.z }; +} + +function itemForearm(player, geometry) { + const arm = itemHand(player); + return geometry.segments.find(segment => segment.part === arm && + (segment.role === "item-forearm" || segment.role === "attack-forearm")) || + geometry.segments.find(segment => segment.part === arm && + segment.role?.endsWith("forearm")); +} + +function gunPose(player, now, input = null) { + let aimX = input?.horizontal || player.facing; + let aimY = input ? -input.vertical : 0; + if (!input && (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil))) { + aimX = player.gunAimX || player.facing; + aimY = player.gunAimY || 0; + } + const length = Math.hypot(aimX, aimY) || 1; + const dx = aimX / length; + const dy = aimY / length; + // The arm solver can clamp its reach, and skating rotates/translates the + // whole skeleton. Use its solved wrist rather than the untransformed aim + // target for both the held weapon and the projectile's muzzle. + const forearm = !isHeadOnly(player) && itemForearm(player, + player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, (now - startedAt) / 1000000)); + const hand = forearm ? {x:forearm.x2, y:forearm.y2, z:forearm.z2} + : itemHandTarget(player, now); + return { + hand, dx, dy, + muzzle: { x: hand.x + dx * 54, y: hand.y + dy * 54, z: hand.z }, + }; +} + +function meleeStrike(player, now) { + const target = meleeTarget(player, now); + return { + x: target.x, y: target.y, z: target.z, + radius: meleeSpecFor(player, player.attackKind).radius, + }; +} + +function shieldGeometry(player) { + const aimX = player.shieldAimX || player.facing; + const aimY = player.shieldAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { + x: player.x + aimX / length * shieldForward, + y: player.y - (player.shieldCrouched ? 58 : 90) - + aimY / length * shieldForward, + z: player.z, + radius: shieldRadius, + }; +} + +// A shield is spent the moment it does its job. It eats exactly one hit, then +// drops — and `shieldLocked` keeps a still-held B from raising it again on the +// very next frame, which is what turns the break into a real opening instead +// of a flicker nobody can see. The shielder is deliberately left free to act: +// breaking the shield is what buys them the swing. +function breakShield(player, now) { + player.blocking = false; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blockFlash = 1; + player.stance = "SHIELD BREAK"; + player.pendingMoveLabel = "SHIELD BREAK"; + playDrum("bell", 1, panPlayer(player)); + emitSignal("shieldbreak", player.pad, 1, 0); +} + +// Stun scales with what the shield ate, so a BASH buys a longer punish than a +// WHIP. The floor is still long enough to answer at 60fps (~8 frames) and the +// ceiling short enough (~18) that a blocked attacker is opened, not deleted. +function shieldStunUs(force) { + return Math.round(140000 + clamp((force - 1000) / 750, 0, 1) * 160000); +} + +function returnBall(ball, player, now, shielded, intensity = 1) { + const incomingVx = ball.vx; + const incomingVy = ball.vy; + const direction = ball.x >= player.x ? 1 : -1; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const response = ball.hitScale || 1; + const momentum = shielded ? 1 : player.attackMomentum || 1; + const normalSpeed = (currentSpeed * 1.34 + 720) * intensity * + momentum * response; + const shieldMinimum = (1800 + clamp(intensity, 0, 1) * 1000) * response; + const speed = shielded + ? Math.min(4200 * response, Math.max(shieldMinimum, normalSpeed * 1.65)) + : Math.min(4800, normalSpeed); + ball.vx = direction * speed; + const lift = shielded ? .72 : player.inputY > 0 ? .58 + : player.attackKind === "KICK" ? .34 : .2; + ball.vy = -speed * lift; + ball.x = player.x + direction * (ball.radius + 85); + ball.y = Math.min(ball.y, player.y - 55); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 140000; + ball.safePlayers = 1 << player.pad; + if (!shielded) { + player.attackHit = true; + player.lastButton = "WACK"; + player.lastButtonAt = now; + } + else { + player.blockFlash = 1; + player.knockVx += incomingVx * .55; + player.vy = Math.min(player.vy + incomingVy * .16, -Math.max(520, speed * .28)); + player.grounded = false; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .22, duration: .22, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum(shielded ? "block" : "clap", shielded ? 1.1 : 1.25, + panAt(ball.x, ball.z)); + emitSignal(shielded ? "ballblock" : "wack", player.pad, + direction, Math.round(speed)); +} + +function crossWackBall(ball, hitters, now) { + const first = hitters[0]; + const second = hitters[1]; + const fighterDistance = Math.abs(first.player.x - second.player.x); + const convergence = clamp(1 - fighterDistance / 520, 0, 1); + const contact = (first.contact + second.contact) * .5; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.min(7600, (4100 + currentSpeed * .72 + + convergence * 2300 + contact * 900) * (ball.hitScale || 1)); + const stronger = first.contact >= second.contact ? first.player : second.player; + const direction = Math.sign(ball.vx) || stronger.facing || 1; + ball.vx = direction * speed; + ball.vy = -speed * (.3 + convergence * .18); + ball.x += direction * 35; + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 8); + ball.lastHitBy = -1; + ball.safeUntil = now + 180000; + ball.safePlayers = 3; + for (const hit of hitters) { + hit.player.attackHit = true; + hit.player.lastButton = "CROSS WACK"; + hit.player.lastButtonAt = now; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .32, duration: .32, death: false, explosion: true }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("clap", 1.55, panAt(ball.x, ball.z)); + emitSignal("crosswack", -1, direction, Math.round(speed)); +} + +function bootBall(ball, player, now) { + // Walking contact carries the grounded ball in the player's travel + // direction. A melee strike remains the intentionally stronger launch. + const direction = Math.sign(player.vx) || Math.sign(ball.x - player.x) || + player.facing || 1; + const dashing = now < player.dashUntil && Math.abs(player.dashVx) > walkSpeed; + const speed = Math.min(dashing ? 2600 : 1450, + (420 + Math.abs(player.vx) * (dashing ? .58 : .32)) * + (ball.hitScale || 1)); + ball.vx = direction * speed; + ball.vy = -Math.max(dashing ? 420 : 80, speed * (dashing ? .24 : .06)); + ball.x = player.x + direction * (ball.radius + 58); + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 2); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 180000; + ball.safePlayers = 1 << player.pad; + player.lastButton = dashing ? "DASH BOOT" : "BOOT"; + player.lastButtonAt = now; + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("kick", 1.12, panAt(ball.x, ball.z)); + emitSignal("boot", player.pad, direction, Math.round(speed)); +} + +function bounceBallOffBody(ball, player, now, segmentIndex = -1) { + const direction = Math.sign(ball.x - player.x) || -Math.sign(ball.vx) || + player.facing || 1; + const incomingSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.max(760, Math.min(3600, incomingSpeed * .86 / + Math.sqrt(ball.mass || 1))); + ball.vx = direction * speed; + ball.vy = -Math.max(260, Math.abs(ball.vy) * .42 + speed * .12); + ball.x += direction * (ball.radius + 18); + ball.lastHitBy = player.pad === 0 ? 1 : 0; + ball.safeUntil = now + 160000; + ball.safePlayers = 1 << player.pad; + applyBodyHit(player, segmentIndex, ball.x - ball.vx, + ball.lastHitBy, now, 760, 110, false); + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("block", .82, panAt(ball.x, ball.z)); + emitSignal("bodybounce", player.pad, direction, Math.round(speed)); +} + +function updateBall(ball, dt, now) { + // A popped ball is gone, not retired — a crater should cost the round its + // ball for a moment, not for good. It re-inflates over the middle once its + // serve time comes round. + if (!ball.active && ballEnabled && ball.serveAt && now >= ball.serveAt) { + ball.active = true; + // Re-inflate on the far side from wherever it popped, so the fighter who + // owned the ball's exit does not also own its return. + ball.x = ball.x > centerX + ? tileCenterX(cornerColLeft + 1) : tileCenterX(cornerColRight - 1); + ball.y = ceilingY + ball.radius + 120; + ball.z = 0; + ball.vx = 0; + ball.vy = 0; + ball.rotation = 0; + ball.lastHitBy = -1; + ball.safeUntil = now + 250000; + ball.safePlayers = 0; + emitSignal("ballserve", -1, 0, 0); + } + if (!ball.active || now < ball.serveAt) return; + if (ball.heldBy >= 0) { + const carrier = players[ball.heldBy]; + if (!carrier?.alive || carrier.heldBall !== balls.indexOf(ball)) { + ball.heldBy = -1; + } else { + ball.x = carrier.x + carrier.facing * (ball.radius + 54); + ball.y = carrier.y - (carrier.ducking ? 58 : 94); + ball.z = carrier.z - 6; + ball.vx = carrier.vx; + ball.vy = carrier.vy; + return; + } + } + const isBoard = ball.type === "skateboard"; + const contactRadius = isBoard ? skateAxleDrop + skateWheelRadius : ball.radius; + const platformSupported = ledgeSupports(ball.x, ball.y, contactRadius); + const floorSupported = ball.y >= terrainFloorAt(ball.x) - contactRadius - 2; + const grounded = (platformSupported || floorSupported) && Math.abs(ball.vy) < 180; + if (!grounded) ball.vx += windAcceleration * (ball.windFactor || .45) * dt; + ball.vy += 1900 * (ball.gravityFactor || 1) * dt; + const previous = { x: ball.x, y: ball.y, z: ball.z }; + ball.x += ball.vx * dt; + ball.y += ball.vy * dt; + if (Math.abs(ball.vx) > 20) { + if (isBoard) ball.skateSpin = (ball.skateSpin || 0) + ball.vx * dt / skateWheelRadius; + else ball.rotation += ball.vx * dt / Math.max(1, contactRadius); + } + const inset = wallThickness + contactRadius; + if (ball.x < worldLeft + inset) { + ball.x = worldLeft + inset; + ball.vx = Math.abs(ball.vx); + } else if (ball.x > worldRight - inset) { + ball.x = worldRight - inset; + ball.vx = -Math.abs(ball.vx); + } + if (!airRoundActive() && ball.y < ceilingY + inset) { + ball.y = ceilingY + inset; + ball.vy = Math.abs(ball.vy); + } + const ledge = ball.vy >= 0 && + ledgeCrossed(ball.x, previous.y, ball.y, contactRadius, contactRadius); + if (ledge) { + ball.y = ledge.y - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .58) : 0; + ball.vx *= ball.drag || .992; + } else if (ball.y > terrainFloorAt(ball.x) - contactRadius) { + ball.y = terrainFloorAt(ball.x) - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .62) : 0; + ball.vx *= ball.drag || .992; + } + const onSurface = (ledgeSupports(ball.x, ball.y, contactRadius) || + ball.y >= terrainFloorAt(ball.x) - contactRadius - 2) && Math.abs(ball.vy) < 180; + if (isBoard && onSurface) { + const contact = skateContact(ball.x, previous.y + contactRadius); + ball.y = contact.y - contactRadius; + ball.rotation = contact.pitch; + const slope = Math.tan(contact.pitch); + ball.vx += fallGravity() * slope / (1 + slope * slope) * dt; + ball.vx *= Math.exp(-dt * .65); + } + const poseTime = (now - startedAt) / 1000000; + const hitters = []; + // The head test below sweeps from `previous`, so the reach margin carries + // this tick's travel as well as the ball's radius. + const travel = Math.hypot(ball.x - previous.x, ball.y - previous.y); + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + const boxes = sampleCombatBoxes(player, now, null, false); + for (const strike of boxes.hit) { + const distance = pointBoxDistance(strike, ball.x, ball.y, ball.z); + if (distance <= ball.radius) { + hitters.push({ player, contact: clamp(1-distance/ball.radius,0,1) }); break; + } + } + } + if (hitters.length >= 2) { + crossWackBall(ball, hitters, now); + return; + } + if (hitters.length === 1) { + returnBall(ball, hitters[0].player, now, false, + .92 + hitters[0].contact * .38); + return; + } + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + if (player.blocking) { + const guard = sampleCombatBoxes(player, now, null, false).guard[0]; + const distance = guard ? pointBoxDistance(guard, ball.x, ball.y, ball.z) : Infinity; + if (distance <= ball.radius) { + const shield = shieldGeometry(player); + const proximity = clamp(1-Math.max(0,Math.hypot(ball.x-shield.x, + ball.y-shield.y,ball.z-shield.z)-ball.radius)/shield.radius,0,1); + returnBall(ball, player, now, true, proximity); + return; + } + } + const headBox = sampleCombatBoxes(player,now,null,false).hurt.find(b=>b.part==='head'); + const currentHeadDistance = pointBoxDistance(headBox,ball.x,ball.y,ball.z); + const sweptHeadDistance = segmentBoxEntry( + { x1: previous.x, y1: previous.y, z1: previous.z, + x2: ball.x, y2: ball.y, z2: ball.z },headBox,ball.radius)!==null ? 0 : Infinity; + const headDistance = Math.min(currentHeadDistance, sweptHeadDistance); + const bodyContact = runnerContactToPoint(player, poseTime, + ball.x, ball.y, ball.z); + const bodyDistance = bodyContact.bodyDistance; + if (Math.min(headDistance, bodyDistance) > ball.radius) continue; + if (ball.type === "skateboard" && headDistance > ball.radius && + bodyDistance <= ball.radius && !player.skateboard && + // A thrown deck is a weapon until it slows down — nobody catches a + // board shot out of the air with their shins. + Math.hypot(ball.vx, ball.vy) < 900) { + resetSkate(player); + player.skateboard = true; + ball.riderPad = player.pad; + player.skateVx = player.vx; + player.skatePitch = skateContact(player.x, player.y).pitch; + ball.active = false; + ball.heldBy = -1; + player.lastButton = "SKATEBOARD"; + player.lastButtonAt = now; + playDrum("clap", .9, panPlayer(player)); + emitSignal("skate-mount", player.pad, 1, 0); + return; + } + const runningContact = player.grounded && Math.abs(player.vx) > 40 && + (onSurface || ball.y >= player.y - ball.radius - 55); + if (runningContact) { + bootBall(ball, player, now); + return; + } + if (headDistance <= ball.radius) { + const sourcePad = ball.lastHitBy >= 0 && ball.lastHitBy !== player.pad + ? ball.lastHitBy : player.pad === 0 ? 1 : 0; + dismountSkateboard(player, now); + damageAllLimbs(player, ball.x - ball.vx, sourcePad, now); + bounceBallOffBody(ball, player, now, -1); + player.lastButton = "HEAD HIT"; + player.lastButtonAt = now; + return; + } + bounceBallOffBody(ball, player, now, bodyContact.segmentIndex); + return; + } +} + +// Returns whether the tap was spent on a double-tap move, so a single tap can +// still mean something else to the caller. +function directionTap(player, direction, now) { + const previousTap = player.lastTap[direction] || -10000000; + const releasedAt = player.lastRelease[direction] || -10000000; + player.lastTap[direction] = now; + if (now - previousTap > doubleTapUs || releasedAt <= previousTap || + now - releasedAt < doubleTapReleaseUs) return false; + player.lastTap[direction] = -10000000; + player.pendingMoveLabel = direction === "UP" ? "ULTRA AIR" : "DASH " + direction; + playDrum("clap", 1.05, panPlayer(player)); + if (direction === "UP") { + player.vy = -ultraJumpVelocity; + player.grounded = false; + player.jumpHeld = false; + emitSignal("ultrajump", player.pad, 1, 0); + } else if (direction === "DOWN") { + if (player.skateboard && !player.grounded) { + // Airborne on the board, the second tap is a throw, not a dive: the + // deck shoots straight down like a spiked item, and whoever it lands + // on takes it like one. The rider pops up off the release. + // The one-ball economy: like a dismount, the round's ball is + // redressed as the board so exactly one object ever exists. + // The station carries its own board, so there is nothing to redress: + // the old one-object economy borrowed the round's ball and handed it + // back at the bell, which is exactly the trick that stopped being + // necessary when the board became furniture with an entry of its own. + const board = boardForRider(player); + resetSkate(player); + if (board) { + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.spawnOwner = player.pad; + board.lastHitBy = player.pad; + board.x = player.x; + board.y = player.y + 40; + board.z = player.z; + board.vx = player.vx * .35; + board.vy = Math.max(2600, player.vy + 2600); + } + player.vy = Math.min(player.vy, -420); + player.pendingMoveLabel = "BOARD SHOT"; + playDrum("whoosh", 1, panPlayer(player)); + playDrum("kick", .8, panPlayer(player)); + emitSignal("board-shot", player.pad, 1, 0); + return true; + } + if (player.pounding) { + player.poundLevel = Math.min(3, Math.max(1, player.poundLevel) + 1); + const cap = poundMaxVelocity * (1 + .5 * (player.poundLevel - 1)); + player.vy = Math.min(cap, Math.max(poundLaunchVelocity, player.vy * 1.55)); + player.pendingMoveLabel = "GROUND POUND " + player.poundLevel; + playSine(620 + player.poundLevel * 190, .12 + player.poundLevel * .04); + emitSignal("fastdrop", player.pad, player.poundLevel, player.vy); + return true; + } + // Grounded anywhere above the real floor and not riding a head means the + // platform, wherever it has been placed. Double-crouch sinks through it. + if (player.grounded && player.standingOn < 0 && + player.y < terrainFloorAt(player.x) - 2) + sink(player, now); + // Standing on the floor there is nothing under you to drop through and no + // height to convert, so the double-tap is spent rather than sold cheap. + else if (player.grounded) return true; + else { + // In the air this is a ground pound, and the height it starts from is + // the whole economy of the move — remember it now, because the crater + // is measured against where the fall actually began. + player.pounding = true; + player.poundFrom = player.y; + player.poundLevel = 1; + player.vy = Math.max(player.vy, poundLaunchVelocity); + player.grounded = false; + player.ducking = false; + player.pendingMoveLabel = "GROUND POUND"; + playSine(520, .16); + emitSignal("fastdrop", player.pad, 1, 0); + } + } else { + player.facing = direction === "RIGHT" ? 1 : -1; + player.dashVx = player.facing * 2400; + player.dashUntil = now + 110000; + emitSignal("dash", player.pad, player.facing, 0); + } + return true; +} + +function sink(player, now) { + player.sinkUntil = now + sinkDurationUs; + // The rung being dropped through, so the sink cannot also eat the next one. + player.sinkFrom = player.y; + player.grounded = false; + player.jumpHeld = false; + player.vy = Math.max(player.vy, 260); + player.pendingMoveLabel = "SINK"; + playDrum("whoosh", .55, panPlayer(player)); + emitSignal("sink", player.pad, -1, 0); +} + +// A short low hop out of crouch. Crouching pins horizontal movement, so a +// direction flick from a tuck has nothing else to mean. +function crouchHop(player, direction, now) { + player.facing = direction; + player.vy = -crouchHopVelocity; + player.grounded = false; + player.jumpHeld = false; + player.hopUntil = now + crouchHopPoseUs; + player.pendingMoveLabel = "CROUCH HOP"; + playDrum("block", .58, panPlayer(player)); + emitSignal("crouchhop", player.pad, direction, 0); +} + +function killPlayer(target, killerPad, now, cause = "KO") { + if (!target.alive) return; + recordFightHit(killerPad, true); + releaseCarriedBall(target, now); + if (!lobbyActive() && (!freeForAll() || + players.filter((player) => player.alive).length <= 2)) { + if (!deathCinematic && killerPad !== target.pad) + deathCinematic = { startedAt: now, loserPad: target.pad, + winnerPad: killerPad, cause }; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + } + target.alive = false; + target.headBustedAt = now; + target.respawnAt = now + 1200000; + target.vx = 0; + if (!lobbyActive()) target.vy = 0; + target.stance = "HIT"; + target.lastButton = cause; + target.lastButtonAt = now; + if (killerPad !== target.pad) players[killerPad].score += 1; + emitSignal(cause === "BALLED" ? "balled" : "ko", + killerPad, target.pad, players[killerPad]?.score || 0); + roundCause = cause; + spawnImpact({ x: target.x, y: target.y - 120, z: target.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(target)); + if (!lobbyActive()) emitSignal("killcam", killerPad, target.pad, 1); + playDrum("snare", 1.15, panPlayer(target)); + updateLobbyMortality(now); + // The training opponent is the one everybody gets for free, and its fight is + // already running under the title screen — so its head is the one number + // the whole site can share without anybody signing in. The count follows the + // free door rather than the missing AI: once training started sparring back, + // an `!target.bot` gate would have silenced the site's only shared number. + // Balling yourself does not count; somebody has to have popped it. + if (target.npc && killerPad !== target.pad && + (!target.bot || fightOpponent === "trainingbot")) + emitSignal("dummy-popped", killerPad, target.pad, 1); +} + +// The crater. Everything about it is decided by the fall: a pound from a hop +// is a shove, a pound from the ceiling clears the stage. Whoever is standing +// inside the ring when it lands wears it; whoever is in the air over it has +// jumped it, which is the only defence and is meant to be readable from the +// silhouette alone. The ball in the ring is popped and re-served. +// +// The landing consumes the pounder's body but not their life. They continue as +// the existing controllable bouncing-head form, making the move a permanent +// mobility trade without prematurely ending the round. +function groundPound(player, now) { + player.pounding = false; + const poundLevel = Math.max(1, player.poundLevel || 1); + player.poundLevel = 0; + const fall = clamp(player.y - player.poundFrom, 0, poundFullFall); + const power = clamp(fall / poundFullFall + (poundLevel - 1) * .22, 0, 1); + const radius = Math.min(poundMaxRadius, + poundMinRadius + power * 70 + (poundLevel - 1) * 88); + const poseTime = (now - startedAt) / 1000000; + player.stance = "HIT"; + player.lastButton = "GROUND POUND"; + player.lastButtonAt = now; + const terrainY = terrainFloorAt(player.x); + spawnImpact({ x: player.x, y: terrainY, z: player.z, + life: .58, duration: .58, death: false, explosion: true, + blastRadius: radius, power }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("kick", 1.3, panPlayer(player)); + playSine(76 + power * 34 + poundLevel * 18, .32 + poundLevel * .09); + emitSignal("blast", player.pad, player.x / worldRight, power); + + for (const target of players) { + if (target.pad === player.pad || !target.alive) continue; + const contact = runnerContactToPoint(target, poseTime, + player.x, terrainY, player.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > radius) continue; + if (!target.grounded) { + // Airborne over the ring is the dodge. It still throws you. + applyBodyHit(target, contact.segmentIndex, player.x, player.pad, now, + 900 + 700 * power, 620); + continue; + } + killPlayer(target, player.pad, now, "BLASTED"); + } + + for (const item of balls) { + if (!item.active) continue; + if (Math.hypot(item.x - player.x, item.y - terrainY) > radius + item.radius) + continue; + item.active = false; + item.heldBy = -1; + item.vx = 0; + item.vy = 0; + item.serveAt = now + 1200000; + spawnImpact({ x: item.x, y: item.y, z: item.z, + life: .22, duration: .22, death: false, explosion: false }); + emitSignal("ballblock", player.pad, 1, power); + } + + const geometry = runnerWorldGeometry(player, poseTime); + for (const limb of limbParts) + detachPart(player, limb, geometry, player.x, now); + detachPart(player, "torso", geometry, player.x, now); + player.alive = true; + player.stance = "BOUNCE"; + player.lastButton = "HEAD ONLY"; + player.lastButtonAt = now; +} + +// Keep the head at its visible position when its body is released. Impact +// momentum lives in knockVx, so releasing the stick cannot erase the kick. +function launchHead(target, sourceX, sourcePad, now, force, lift, incomingVy = 0) { + if (!isHeadOnly(target)) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + target.fallenBodyGeometry = geometry; + releaseCarriedBall(target, now); + releaseCarriedPart(target, now); + releaseCarriedFighter(target, now); + dismountSkateboard(target, now); + target.removedParts = [...limbParts, "torso"]; + target.partDamage = {}; + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + } + const direction = Math.sign(target.x - sourceX) || + players[sourcePad]?.facing || -target.facing || 1; + const velocity = clamp(target.vx * .3 + direction * force, -4200, 4200); + target.knockVx = velocity - (target.windVx || 0); + target.vx = velocity; + target.vy = clamp(target.vy * .25 + incomingVy * .25 - lift, -2600, 2600); + target.headRollRate = clamp(velocity / 260, -8, 8); + target.grounded = false; + target.jumpHeld = false; + target.jumpLaunchAt = 0; + target.attackKind = ""; + target.attackUntil = target.dashUntil = 0; + target.dashVx = 0; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 180000); + target.stance = "HEAD ONLY"; + target.lastButton = "HEAD VOLLEY"; + target.lastButtonAt = now; +} + +function bounceHeadOnSurface(player, incomingVy, horizontal) { + // Restitution keeps hard landings lively and eventually lets a slow head + // settle, so the existing up/down pumping controls remain useful. + if (incomingVy > 360) { + player.vy = -incomingVy * .62; + player.knockVx *= .86; + player.headRollRate = clamp(player.vx / 260, -8, 8); + player.grounded = false; + player.stance = "BOUNCE"; + } else { + player.vy = 0; + player.grounded = true; + player.stance = horizontal ? "ROLL" : "HEAD ONLY"; + } +} + +// Conservative cheap superset of sampleCombatBoxes' hitbox eligibility. +// Missing attack limbs/head-only may pass this gate, but an active hitbox never +// fails it. Pogo contacts remain eligible even without an attackKind. +function mayHaveMeleeHit(player, now) { + if (!player.alive) return false; + if (isPogo(player) && !player.grounded && !player.pogoHit) return true; + return !player.attackHit && !player.blocking && now >= player.hitStunUntil && + meleeFrame(player, now).phase === "active"; +} + +function resolveMelee(now) { + // Most movement ticks have no strike. Avoid building every fighter's full + // skeletal pose and hurtbox tree when no melee contact can possibly occur. + if (!players.some(player => mayHaveMeleeHit(player, now))) return; + const poseTime = (now - startedAt) / 1000000; + const contacts = []; + const samples = players.map(player => sampleCombatBoxes(player, now)); + for (const attacker of players) { + const attacking = samples[attacker.pad]; + if (!attacker.alive || !attacking.hit.length) continue; + for (const fragment of detachedParts) { + const r = fragment.width/2; + const bounds = combatRect('fragment',Math.min(fragment.x1,fragment.x2)-r, + Math.min(fragment.y1,fragment.y2)-r,Math.max(fragment.x1,fragment.x2)+r, + Math.max(fragment.y1,fragment.y2)+r,(fragment.z1+fragment.z2)/2, + Math.abs(fragment.z2-fragment.z1)/2+r); + if (!attacking.hit.some(hit=>boxesOverlap(hit,bounds))) continue; + const spec = meleeSpecFor(attacker, attacker.attackKind); + fragment.vx += attacker.facing * spec.force * .8; + fragment.vy -= Math.max(220, spec.lift); + fragment.owner = attacker.pad; + fragment.hitAfter = now + 120000; + attacker.attackHit = true; + spawnImpact({ x: (bounds.left+bounds.right)/2, y: (bounds.top+bounds.bottom)/2, + z: (bounds.near+bounds.far)/2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("clap", .82, panPlayer(attacker)); + emitSignal("part-hit", attacker.pad, -1, spec.force); + break; + } + if (attacker.attackHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(attacking, samples[target.pad]); + if (contact?.separation <= 3) { + attacker.attackHit = true; + contacts.push({ attacker, target, + strike: { x: contact.x, y: contact.y, z: contact.z }, + headshot: contact.headshot, segmentIndex: contact.segmentIndex }); + break; + } + } + } + for (const { attacker, target, strike, headshot, segmentIndex } of contacts) { + if (!target.alive && contacts.length < 2) continue; + spawnImpact({ x: strike.x, y: strike.y, z: strike.z, + life: .2, duration: .2, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + const away = Math.sign(target.x - attacker.x) || -attacker.facing; + const backBlocking = !isHeadOnly(target) && target.inputX === away; + if (target.blocking || backBlocking) { + target.stance = "DEFEND"; + target.blockFlash = 1; + target.lastButton = target.blocking ? "BLOCK" : "BACK BLOCK"; + target.lastButtonAt = now; + // An explicit shield returns the attacker's commitment as durable + // knockback. Keep it separate from controlled velocity so holding toward + // the defender cannot erase the recoil on the next simulation frame. + const recoil = target.blocking ? 2400 : 900; + attacker.dashUntil = 0; + attacker.dashVx = 0; + attacker.knockVx = -attacker.facing * recoil; + attacker.vx = attacker.knockVx + attacker.windVx; + if (target.blocking) attacker.vy = Math.min(attacker.vy, -415); + else target.vx = 0; + playDrum("block", 1.2, panPlayer(target)); + emitSignal("block", target.pad, attacker.pad, target.blocking ? 1 : 2); + // Only a real shield trades. A back-block still just shoves, because it + // costs nothing to hold a direction. + if (target.blocking) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const stun = shieldStunUs(spec.force * (attacker.attackMomentum || 1)); + attacker.hitStunUntil = Math.max(attacker.hitStunUntil, now + stun); + attacker.attackHit = true; + attacker.attackKind = ""; + attacker.attackUntil = 0; + attacker.stance = "STUN"; + breakShield(target, now); + } + } else if (headshot) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + const wasHead = isHeadOnly(target); + launchHead(target, attacker.x, attacker.pad, now, + spec.force * momentum * 1.2, + Math.max(620, spec.lift * 3) * momentum, attacker.vy); + playDrum("snare", 1.2, panPlayer(target)); + emitSignal(wasHead ? "head-volley" : "decapitate", + attacker.pad, target.pad, momentum); + } + else { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + applyBodyHit(target, segmentIndex, attacker.x, attacker.pad, now, + spec.force * momentum, spec.lift * momentum); + playDrum(spec.thud[0], spec.thud[1], panPlayer(target)); + } + } +} + +function resolvePogoAttacks(now) { + const poseTime = (now - startedAt) / 1000000; + for (const attacker of players) { + if (!attacker.alive || !isPogo(attacker) || attacker.grounded || + attacker.pogoHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(sampleCombatBoxes(attacker,now),sampleCombatBoxes(target,now)); + if (!contact || contact.separation > 3) continue; + attacker.pogoHit = true; + attacker.vy = Math.min(attacker.vy, -985); + attacker.lastButton = "POGO"; + attacker.lastButtonAt = now; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: contact.headshot, explosion: false }); + if (contact.headshot) killPlayer(target, attacker.pad, now, "POGO"); + else applyBodyHit(target, contact.segmentIndex, attacker.x, + attacker.pad, now, 1350, 260); + playDrum("kick", 1.1, panPlayer(attacker)); + emitSignal("pogo", attacker.pad, contact.headshot ? 1 : 0, 0); + break; + } + } +} + +function resolvePlayerPushboxes() { + for (let a = 0; a < players.length; a++) + for (let b = a + 1; b < players.length; b++) + resolvePlayerPushboxPair(players[a], players[b]); +} + +function resolvePlayerPushboxPair(first, second) { + if ([first, second].some((p) => p.ropeIndex >= 0 || p.skateLoop >= 0)) return; + if (!first.alive || !second.alive) return; + const poseTime = (runtime().monotonicUs - startedAt) / 1000000; + const firstBounds = combatPushbox(first); + const secondBounds = combatPushbox(second); + const verticalOverlap = Math.min(firstBounds.bottom, secondBounds.bottom) - + Math.max(firstBounds.top, secondBounds.top); + // Grounded fighters nudge one another. Once a jumper is clearly above the + // other fighter, the pushboxes separate so cross-over jumps are possible. + if (verticalOverlap <= 18 || + ((!first.grounded || !second.grounded) && + Math.abs(first.y - second.y) > 58)) return; + const left = first.x <= second.x ? first : second; + const right = left === first ? second : first; + const pushRadius = (player) => (combatPushbox(player).right-combatPushbox(player).left)/2; + const minimumGap = pushRadius(left) + pushRadius(right); + const overlap = minimumGap - (right.x - left.x); + if (overlap <= 0) return; + const leftAdvancing = left.vx > 30; + const rightAdvancing = right.vx < -30; + const leftShare = leftAdvancing && !rightAdvancing ? .25 + : rightAdvancing && !leftAdvancing ? .75 : .5; + left.x -= overlap * leftShare; + right.x += overlap * (1 - leftShare); + if (leftAdvancing && !rightAdvancing) { + right.knockVx += Math.min(180, left.vx * .12); + left.vx *= .35; + } else if (rightAdvancing && !leftAdvancing) { + left.knockVx += Math.max(-180, right.vx * .12); + right.vx *= .35; + } else { + if (left.vx > 0) left.vx *= .35; + if (right.vx < 0) right.vx *= .35; + } + resolveRunnerBounds(left, 0); + resolveRunnerBounds(right, 0); +} + +function resolvePlayerStanding(now) { + const poseTime = (now - startedAt) / 1000000; + const previousStanding = players.map((player) => player.standingOn); + for (const player of players) player.standingOn = -1; + for (const rider of players) { + for (const base of rivalsOf(rider)) { + // A committed dive passes through a head contact and completes against + // the terrain. Treating it as ordinary standing used to zero its velocity + // and leave the fighter strangely paused on the opponent's scalp. + if (!rider.alive || !base.alive || rider.vy < 0 || rider.pounding) continue; + const head = runnerWorldGeometry(base, poseTime).head; + const top = head.y - head.radius; + const horizontal = Math.abs(rider.x - head.x) <= head.radius + 42; + const depth = Math.abs(rider.z - head.z) <= head.radius + 32; + const crossed = (rider.previousY ?? rider.y) <= top + 8 && + rider.y >= top - 3; + const stayed = previousStanding[rider.pad] === base.pad && + rider.y <= top + 34; + if (!horizontal || !depth || (!crossed && !stayed)) continue; + const wasGrounded = rider.grounded; + rider.y = top; + rider.vy = Math.min(0, base.vy); + rider.grounded = true; + rider.standingOn = base.pad; + rider.sinkUntil = 0; + rider.hopUntil = 0; + if (!wasGrounded) rider.landPoseUntil = now + 110000; + break; + } + } +} + +function updateStance(player, input, now) { + const opponent = nearestRival(player); + const toward = Math.sign(opponent.x - player.x) || player.facing || 1; + player.stance = !player.alive ? "HIT" + : now < player.hitStunUntil ? "STUN" + : player.blocking ? "DEFEND" + : player.heldBall >= 0 ? "HOLDING" + : player.grabHeld ? "REACHING" + : player.attackKind ? "ATTACK" + : now < player.sinkUntil ? "SINK" + : !player.grounded && now < player.hopUntil ? "CROUCH HOP" + : player.ducking ? player.grounded ? "CROUCH" : "AIR CROUCH" + : player.pogoDive ? "POGO DOWN" + : player.skateboard && player.grounded ? "SKATE" + : !player.grounded ? "AIR" + : now < player.dashUntil ? "DASH" + : input.horizontal === toward ? "ADVANCE" + : input.horizontal === -toward ? "RETREAT" + : "NEUTRAL"; +} + +function grabNearestBall(player, now) { + let nearest = null; + let nearestDistance = 240; + for (let index = 0; index < balls.length; index++) { + const item = balls[index]; + if (!item.active || item.heldBy >= 0) continue; + const distance = Math.hypot(item.x - player.x, + item.y - (player.y - 82), item.z - player.z); + if (distance >= nearestDistance) continue; + nearest = { item, index }; + nearestDistance = distance; + } + if (!nearest) return false; + player.heldBall = nearest.index; + player.carryArm = availableArm(player); + nearest.item.heldBy = player.pad; + nearest.item.safeUntil = now + 180000; + nearest.item.safePlayers = 1 << player.pad; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + emitSignal("grab", player.pad, nearest.index, nearest.item.mass); + playDrum("clap", .72, panPlayer(player)); + return true; +} + +function grabNearestFighter(player, now) { + const target = players.find((candidate) => candidate.pad !== player.pad && + candidate.alive && candidate.grabbedBy < 0 && + Math.hypot(candidate.x - player.x, + candidate.y - (player.y - 72), candidate.z - player.z) < 210); + if (!target) return false; + player.heldPlayer = target.pad; + player.carryArm = availableArm(player); + target.grabbedBy = player.pad; + target.vx = target.vy = target.vz = 0; + target.lastButton = "GRABBED"; + target.lastButtonAt = now; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + playDrum("clap", .82, panPlayer(player)); + emitSignal("grab-player", player.pad, target.pad, isHeadOnly(target) ? 1 : 0); + return true; +} + +function grabNearestPart(player, now) { + let bestIndex = -1; + let bestDistance = 190; + for (let index = 0; index < detachedParts.length; index++) { + const part = detachedParts[index]; + if (part.heldBy >= 0) continue; + const x = (part.x1 + part.x2) / 2; + const y = (part.y1 + part.y2) / 2; + const z = (part.z1 + part.z2) / 2; + const distance = Math.hypot(x - player.x, y - (player.y - 78), z - player.z); + if (distance >= bestDistance) continue; + bestIndex = index; + bestDistance = distance; + } + if (bestIndex < 0) return false; + const part = detachedParts[bestIndex]; + player.heldPart = bestIndex; + player.carryArm = availableArm(player); + part.heldBy = player.pad; + part.owner = player.pad; + part.vx = part.vy = 0; + player.lastButton = "HOLDING " + part.part.toUpperCase(); + player.lastButtonAt = now; + emitSignal("grab-part", player.pad, bestIndex, 1); + return true; +} + +function stealHeldObject(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.hypot(target.x - player.x, + target.y - player.y, target.z - player.z) > 220) return false; + let label = ""; + if (target.heldBall >= 0) { + const index = target.heldBall; + const item = balls[index]; + target.heldBall = -1; + player.heldBall = index; + if (item) item.heldBy = player.pad; + label = "BALL"; + } else if (target.heldPart >= 0) { + const index = target.heldPart; + const part = detachedParts[index]; + target.heldPart = -1; + player.heldPart = index; + if (part) { part.heldBy = player.pad; part.owner = player.pad; } + label = part?.part?.toUpperCase() || "LIMB"; + } else if (!unarmedRoundActive() && target.gunAmmo > 0) { + player.gunAmmo = target.gunAmmo; + player.gunMode = target.gunMode; + target.gunAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + target.gunMode = "HANDGUN"; + label = player.gunMode; + } else if (!unarmedRoundActive() && target.grenadeAmmo > 0) { + player.grenadeAmmo = target.grenadeAmmo; + target.grenadeAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + label = "GRENADES"; + } + if (!label) return false; + target.lastButton = label + " TAKEN"; + target.lastButtonAt = now; + player.lastButton = "STOLE " + label; + player.lastButtonAt = now; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 160000); + playDrum("clap", 1, panPlayer(player)); + emitSignal("steal", player.pad, target.pad, 1); + return true; +} + +function releaseCarriedPart(player, now) { + if (player.heldPart < 0) return; + const part = detachedParts[player.heldPart]; + if (part) { + part.heldBy = -1; + part.owner = player.pad; + part.vx = player.vx + player.facing * 1900; + part.vy = Math.min(player.vy, -460); + part.hitAfter = now + 90000; + part.life = Math.max(part.life, 3.4); + emitSignal("throw-part", player.pad, player.heldPart, player.facing); + } + player.heldPart = -1; + player.carryArm = ""; +} + +function releaseCarriedFighter(player, now) { + if (player.heldPlayer < 0) return; + const target = players[player.heldPlayer]; + if (target) { + target.grabbedBy = -1; + target.x = player.x + player.facing * 118; + target.y = player.y - 74; + target.z = player.z; + target.vx = player.vx + player.facing * 1500; + target.vy = Math.min(player.vy, -620); + target.grounded = false; + target.hitStunUntil = now + 260000; + emitSignal("throw-player", player.pad, target.pad, player.facing); + } + player.heldPlayer = -1; + player.carryArm = ""; +} + +function releaseCarriedBall(player, now) { + if (player.heldBall < 0) return; + const item = balls[player.heldBall]; + if (item) { + item.heldBy = -1; + item.x = player.x + player.facing * (item.radius + 70); + item.y = player.y - 88; + item.z = player.z; + item.vx = player.vx; + item.vy = player.vy; + item.safeUntil = now + 120000; + item.safePlayers = 1 << player.pad; + emitSignal("release", player.pad, player.heldBall, item.mass); + } + player.heldBall = -1; + player.carryArm = ""; +} + +function bouncePogoOnSurface(player, surfaceY, now) { + player.y = surfaceY; + player.vy = -pogoBounceVelocity; + player.grounded = false; + player.pogoDive = false; + player.pogoHit = false; + player.stance = "POGO BOUNCE"; + player.lastButton = "POGO BOUNCE"; + player.lastButtonAt = now; + playDrum("kick", .9, panPlayer(player)); + emitSignal("pogo", player.pad, -2, pogoBounceVelocity); +} + +function shieldBash(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.abs(target.x - player.x) > shieldRadius * 1.35 || + Math.abs(target.y - player.y) > 170) return; + const direction = Math.sign(target.x - player.x) || player.facing; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blocking = false; + player.knockVx -= direction * 620; + player.hitStunUntil = Math.max(player.hitStunUntil, now + 180000); + target.knockVx += direction * 1250; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 240000); + target.grounded = false; + target.vy = Math.min(target.vy, -180); + if (target.blocking) { + target.shieldLocked = true; + target.shieldBrokenAt = now; + target.blocking = false; + target.knockVx += direction * 420; + } + spawnImpact({ x: (player.x + target.x) / 2, y: player.y - 90, + z: (player.z + target.z) / 2, life: .26, duration: .26, + death: false, explosion: true, blastRadius: 180, power: .35 }); + playDrum("block", 1.25, panPlayer(player)); + emitSignal("shield-bash", player.pad, target.pad, target.shieldLocked ? 1 : 0); +} + +function updatePlayer(player, pad, dt, now) { + const parkPreviousX = player.x; + player.previousY = player.y; + if (player.grabbedBy >= 0) { + const carrier = players[player.grabbedBy]; + if (!carrier?.alive || carrier.heldPlayer !== player.pad) { + player.grabbedBy = -1; + } else { + player.x = carrier.x + carrier.facing * 108; + player.y = carrier.y - 76; + player.z = carrier.z; + player.vx = player.vy = player.vz = 0; + player.grounded = false; + player.blocking = false; + player.attackKind = ""; + player.previous = pad.down.slice(); + return; + } + } + if (!player.alive) { + player.previous = pad.down.slice(); + // A body that dies off the ground still has to come down. Everything + // below this branch is skipped while dead, gravity included, which is + // right in a round — the round ends and rebuilds the body, and the + // killcam wants the pose held. The waiting room has no round, so a + // fighter blasted out of a jump hung in mid-air in its jump pose for the + // whole respawn beat. @jeffrey: "it seems possible to die in the waiting + // room but keep jumping stilll" — that is what a frozen hop looks like. + if (lobbyActive() && now < player.respawnAt) settleCorpse(player, dt); + if (now >= player.respawnAt && !freeForAll()) { + player.x = player.spawnX; + player.y = terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.windVx = 0; + player.knockVx = 0; + player.grounded = true; + player.ducking = false; + player.inputX = 0; + player.inputY = 0; + player.dashUntil = 0; + player.stance = "NEUTRAL"; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + // The waiting room hands back a whole body and a swept floor: parts, + // corpses and scattered limbs are round furniture, and the lobby has + // no round to rebuild the one or clear the others. + if (lobbyActive()) { + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + player.lobbyDeathDressed = false; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.lastTap = {}; + player.lastRelease = {}; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + deathCinematic = null; + detachedParts.length = 0; + } + player.alive = true; + } + return; + } + player.suppressedDirections = player.suppressedDirections.filter((button) => + pad.down.includes(button)); + const headOnly = isHeadOnly(player); + const pogo = isPogo(player); + const legCount = ["left-leg", "right-leg"] + .filter((part) => hasPart(player, part)).length; + const armCount = ["left-arm", "right-arm"] + .filter((part) => hasPart(player, part)).length; + const rawInput = quantizedInput(pad, player.suppressedDirections); + const hitStunned = now < player.hitStunUntil; + const wasBlocking = player.blocking; + const carrying = player.heldBall >= 0 || player.heldPart >= 0 || + player.heldPlayer >= 0 || Boolean(heldItem(player)); + const aimLocked = carrying && pad.down.includes("X"); + player.itemAimLocked = aimLocked; + if (aimLocked && (rawInput.horizontal || rawInput.vertical)) { + player.gunAimX = rawInput.horizontal; + player.gunAimY = -rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } + // A held gun used to point dead ahead unless you also held X, so the one + // thing a player is plainly doing with it — pointing it somewhere — never + // reached the fighter. A vertical direction now tilts the hand on its own. + // The X lock still earns its keep: it pins an aim while you stand still and + // it turns you. This does neither, deliberately — steering the drawn arm + // must not steer the walk, or every upward shot would rewrite your footing. + player.gunAimLive = false; + if (!aimLocked && player.gunAmmo > 0 && rawInput.vertical) { + player.gunAimX = rawInput.horizontal || player.facing; + player.gunAimY = -rawInput.vertical; + player.gunAimLive = true; + } + // A broken shield stays down until X is let go, so the opening it bought is + // spent on attacking rather than on re-guarding by reflex. + if (player.shieldLocked && !pad.down.includes("X")) player.shieldLocked = false; + player.blocking = !carrying && !headOnly && pad.down.includes("X") && + !player.shieldLocked; + if (player.blocking && !wasBlocking) { + player.attackKind = ""; + player.attackUntil = 0; + player.shieldCrouched = rawInput.vertical < 0 || player.ducking || + player.crouchBlend >= .35; + player.shieldVx = 0; + player.vx = player.windVx + player.knockVx; + player.dashUntil = 0; + player.dashVx = 0; + player.lastTap = {}; + player.lastRelease = {}; + shieldBash(player, now); + } + if (player.blocking && rawInput.vertical < 0) player.shieldCrouched = true; + if (player.blocking) { + player.shieldAimX = rawInput.horizontal; + player.shieldAimY = rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } else { + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + } + // Guard plants the fighter immediately, but DOWN remains meaningful: a + // standing guard can settle into a crouching guard. Once crouched, the pose + // latches until the shield itself drops even if DOWN is released first. + const input = player.blocking + ? { horizontal: 0, vertical: player.shieldCrouched ? -1 : 0 } : rawInput; + const grabHeld = armCount > 0 && !pogo && !hitStunned && !player.blocking && + pad.down.includes("A") && pad.down.includes("B"); + if (skateparkMap && !survivalActive()) { + const ropeHeld = skateRopeInput(player, input, grabHeld, dt, grabHeld && !player.grabHeld); + if (ropeHeld || skateLoopStep(player, input, dt, now)) { + player.previous = pad.down.slice(); + player.grabHeld = grabHeld; + return; + } + } + if (grabHeld && !player.grabHeld && player.heldBall < 0 && + player.heldPart < 0 && + player.heldPlayer < 0) { + if (!stealHeldObject(player, now) && !grabNearestBall(player, now) && + !grabNearestPart(player, now) && + !grabNearestFighter(player, now)) { + player.lastButton = "REACHING"; + player.lastButtonAt = now; + emitSignal("reach", player.pad, player.facing, 0); + } + } + else if (!grabHeld && player.heldBall >= 0) + releaseCarriedBall(player, now); + else if (!grabHeld && player.heldPart >= 0) + releaseCarriedPart(player, now); + else if (!grabHeld && player.heldPlayer >= 0) + releaseCarriedFighter(player, now); + const inputChanged = input.horizontal !== player.inputX || + input.vertical !== player.inputY; + if (inputChanged && + (input.horizontal || input.vertical)) + emitSignal("move", player.pad, input.horizontal, input.vertical); + player.pendingMoveLabel = ""; + // An ultra jump IS a second press of UP, so the air-jump gate below used to + // see the same press the double-tap had just spent: the ultra fired, a + // double jump launched on top of it a tick later, the move read-out said + // DOUBLE JUMP, and the air jump the fighter never asked for was gone. The + // horizontal branch has always honored the "tap was spent" answer; this is + // the vertical one doing the same. It matters more in a tower, where the + // crow's nest is the one rung an ultra jump is the only way onto. + let verticalTapSpent = false; + const upPressed = input.vertical > 0 && !player.previous.includes("MOVE_UP"); + const downPressed = input.vertical < 0 && player.inputY >= 0; + const wasCrouched = player.ducking || player.crouchBlend >= .35; + const crouchTarget = input.vertical < 0 || + (!player.grounded && player.crouchJump && now < player.jumpPoseUntil) || + (!player.grounded && now < player.hopUntil) ? 1 : 0; + const crouchStep = dt * (crouchTarget ? 9 : 11); + player.crouchBlend += clamp(crouchTarget - player.crouchBlend, + -crouchStep, crouchStep); + player.ducking = player.crouchBlend >= .52; + if (player.attackKind && now >= player.attackUntil) { + player.attackKind = ""; + player.attackHit = false; + player.attackMomentum = 1; + } + if (player.itemAction && now >= player.itemActionUntil) + player.itemAction = ""; + if (player.inputX && input.horizontal !== player.inputX) + player.lastRelease[player.inputX > 0 ? "RIGHT" : "LEFT"] = now; + if (player.inputY && input.vertical !== player.inputY) + player.lastRelease[player.inputY > 0 ? "UP" : "DOWN"] = now; + if (input.horizontal && input.horizontal !== player.inputX) { + const direction = input.horizontal > 0 ? "RIGHT" : "LEFT"; + recordCommand(player, direction, now); + if (!directionTap(player, direction, now) && player.grounded && + player.ducking && !headOnly && !pogo && !hitStunned) + crouchHop(player, input.horizontal, now); + } + if (input.vertical && input.vertical !== player.inputY) { + const direction = input.vertical > 0 ? "UP" : "DOWN"; + recordCommand(player, direction, now); + verticalTapSpent = directionTap(player, direction, now); + if (headOnly) { + const alternating = player.headPumpDirection && + player.headPumpDirection !== input.vertical && + now - (player.headPumpAt || 0) <= 520000; + player.headBounceCharge = clamp((player.headBounceCharge || 0) + + (alternating ? .2 : .035), 0, 1); + player.headPumpDirection = input.vertical; + player.headPumpAt = now; + if (alternating && player.grounded) { + player.vy = -lerp(420, headBounceVelocity * 1.7, + player.headBounceCharge); + player.grounded = false; + player.stance = "BOUNCE " + Math.round(player.headBounceCharge * 5); + playDrum("block", .45 + player.headBounceCharge * .45, + panPlayer(player)); + emitSignal("head-bounce", player.pad, input.vertical, + player.headBounceCharge); + } + } + } + + if (headOnly) { + const sincePump = now - (player.headPumpAt || 0); + if (sincePump > 650000) + player.headBounceCharge = Math.max(0, + (player.headBounceCharge || 0) - dt * .22); + } + + if (input.horizontal) player.facing = input.horizontal; + // Fighting-game directions are digital: full movement begins and ends on + // the sampled edge. The analog stick is only an eight-way gate. + if (player.grounded) player.windVx *= Math.max(0, 1 - dt * 10); + else player.windVx = clamp(player.windVx + windAcceleration * dt, -900, 900); + player.knockVx *= Math.max(0, 1 - dt * (headOnly + ? player.grounded ? 1.6 : .22 : player.grounded ? 7 : 1.8)); + if (now < player.dashUntil && input.horizontal && + Math.sign(player.dashVx) !== input.horizontal) { + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + } + const dashRunningOut = player.grounded && input.horizontal && + player.dashUntil > 0 && now >= player.dashUntil; + if (dashRunningOut && !player.runSince) { + player.runSince = now; + } + if (!player.grounded || !input.horizontal || player.blocking || + player.ducking || hitStunned) player.runSince = 0; + const walkingCleanly = player.grounded && input.horizontal && !player.blocking && + !player.ducking && !hitStunned && now >= player.dashUntil; + if (!walkingCleanly) player.walkSince = 0; + else if (!player.walkSince) player.walkSince = now; + else if (!player.runSince && now - player.walkSince >= 650000) + player.runSince = now; + const headAirControl = player.grounded ? .55 + : lerp(.55, .9, player.headBounceCharge || 0); + const mobility = headOnly ? headAirControl + : pogo ? .68 : legCount === 1 ? .72 : 1; + const runSpeed = player.runSince + ? Math.min(runTopSpeed, runStartSpeed + + (now - player.runSince) / 1000000 * runAcceleration) : 0; + let controlledVx = aimLocked ? 0 + : player.blocking ? player.shieldVx || 0 + : now < player.dashUntil && Math.abs(player.dashVx) > 0 + ? player.dashVx + : player.runSince ? input.horizontal * runSpeed * mobility + : player.ducking && player.grounded ? 0 + : input.horizontal * walkSpeed * mobility; + if (player.skateboard && player.skateWallSide) { + // Once the board reaches a coping, horizontal momentum has become upward + // wall momentum. Keep the root on that wall until gravity spends it; the + // player can also steer away to peel off early. + const peelAway = input.horizontal === -player.skateWallSide; + if (player.vy >= 0 || peelAway) { + const side = player.skateWallSide; + player.skateWallSide = 0; + player.skateVx = -side * Math.max(720, Math.abs(player.skateVx) * .42); + controlledVx = player.skateVx; + } else controlledVx = 0; + } else if (player.skateboard && player.grounded && !player.blocking) { + // Steering, and ONLY while steering. This used to run every frame against + // a target of `input.horizontal * 2700`, which on an idle stick is zero — + // so a coasting skater was being dragged to a standstill at 3.2 a second + // by the same line that turns them. On a flat cube nobody could tell; + // dropped into a three-tile bowl it is the difference between a 1,400-unit + // drop and a 268-unit one, because the servo ate gravity as fast as + // gravity arrived. Let go of the stick now and you coast, which is what + // rolling IS. + const skateTarget = input.horizontal * 2700; + // Carving is steering against the roll, and it has to stay in scope: the + // scrape it makes is played further down, and hoisting the steer into a + // block took both of these with it. + const carving = Boolean(input.horizontal) && + Math.sign(skateTarget) !== Math.sign(player.skateVx); + if (input.horizontal) { + const turnRate = carving ? 1.8 : 3.2; + player.skateVx += (skateTarget - player.skateVx) * + (1 - Math.exp(-dt * turnRate)); + } + // Gravity along the surface, resolved honestly rather than by a tuned + // constant. The old line was `slope * 1900`, and `slope` is tan(angle) — + // which runs away to infinity as a transition goes vertical and had to be + // clamped at 2.5 to stop it. The horizontal share of gravity on a slope is + // g·sin·cos, which in terms of tan is g·t/(1+t²): it peaks at 45° exactly + // as it should, falls off toward vertical exactly as it should, and needs + // no clamp because it cannot exceed half of g. + const contact = skateContact(player.x, player.y); + const terrainSlope = Math.tan(contact.pitch); + player.skateVx += fallGravity() * terrainSlope / + (1 + terrainSlope * terrainSlope) * dt; + // Pumping. The one thing a skater does that a rolling object does not: + // crouch through the bottom of a transition and stand up through the + // face, and come out with more speed than you went in with. Holding DOWN + // on a slope is that, and it is the only way to gain speed in the bowl + // without pushing — which is what makes a bowl worth being in rather than + // a hole to cross. + // + // Priced against the slope, so it pays on a transition and pays nothing + // on the flat: a crouch in the middle of the park is a crouch, not a + // cheat code. Direction comes from the roll rather than the stick, + // because pumping adds to the speed you have, it does not steer. + const pumping = input.vertical < 0 && Math.abs(terrainSlope) > .18; + if (pumping && player.skateVx) + player.skateVx += Math.sign(player.skateVx) * + Math.abs(terrainSlope) * skatePumpAcceleration * dt; + player.skateVx = clamp(player.skateVx, -4200, 4200); + // Leaving the lip. A rider climbing a transition is carrying real upward + // speed -- `skateVx * slope` -- and the moment the ground stops climbing + // under them, that speed has nowhere to go but into the air. Reading the + // ground a frame ahead is what catches the crest: the coping at the top + // of a quarterpipe, the edge of the funbox, the lip of the bowl. + // + // Without this a skater simply walks over the top of every ramp with the + // speed quietly deleted, which is the difference between a skatepark and + // a set of hills. + const surfaceVy = player.skateVx * terrainSlope; + const aheadSlope = clamp(terrainTangentAt( + player.x + player.skateVx * .05), -2.5, 2.5); + if (surfaceVy < -skateLaunchFloor && + (aheadSlope - terrainSlope) * Math.sign(player.skateVx) > .2) { + player.vy = surfaceVy; + player.grounded = false; + player.skateAirAt = now; + playDrum("whoosh", .5 + Math.min(.45, -surfaceVy / 4000), + panPlayer(player)); + emitSignal("skate-air", player.pad, + Math.round(-surfaceVy), Math.round(player.skateVx)); + } + if (!input.horizontal) player.skateVx *= Math.exp(-dt * .65); + controlledVx = player.skateVx; + const skateSpeed = Math.abs(player.skateVx); + const carveDir = carving ? Math.sign(skateTarget) : 0; + if (carveDir && skateSpeed > 900 && player.skateCarveDir !== carveDir) { + playDrum("whoosh", .45 + Math.min(.4, skateSpeed / 4200 * .5), + panPlayer(player)); + emitSignal("skate-carve", player.pad, carveDir, + Math.round(skateSpeed / 42) / 100); + } + player.skateCarveDir = carveDir; + } else if (player.skateboard && !player.grounded) { + // Keep the board's launch momentum instead of borrowing walking speed + // in the air and reviving a different skateVx on landing. + controlledVx = player.skateVx; + } else if (!player.skateboard) player.skateVx = 0; + player.vx = controlledVx + player.windVx + player.knockVx; + if (inputChanged) telemetry("FIGHT_MOVE", player.name + + " pad=" + (player.pad + 1) + + " held=" + (pad.down.filter((button) => button.startsWith("Arrow")).join("+") || "NONE") + + " stick=" + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + + " quant=" + input.horizontal + "," + input.vertical + + " controlled=" + Math.round(controlledVx) + + " shield=" + (player.blocking ? 1 : 0) + + " wind=" + Math.round(player.windVx) + + " knock=" + Math.round(player.knockVx) + + " vx=" + Math.round(player.vx) + + " x=" + Math.round(player.x)); + + // Checked before liftoff so the launch frame itself can never be cut. + if (player.jumpHeld && player.vy < 0 && !player.blocking && + input.vertical <= 0) { + player.vy *= jumpCutScale; + player.jumpHeld = false; + } + if (airRoundActive()) player.airJumpsUsed = 0; + if (!aimLocked && !headOnly && upPressed && !verticalTapSpent && + !player.jumpLaunchAt && + (player.grounded || player.airJumpsUsed < 1)) { + const airJump = !player.grounded; + player.jumpLaunchAt = now + (airJump ? 1 : jumpAnticipationUs); + player.crouchJump = !airJump && wasCrouched; + if (airJump) { + player.airJumpsUsed++; + player.doubleJumpLinesUntil = now + 280000; + } + player.pendingMoveLabel = player.skateboard ? "OLLIE" + : airJump ? "DOUBLE AIR" + : wasCrouched ? "CROUCH AIR" : "AIR"; + } + if (player.jumpLaunchAt && now >= player.jumpLaunchAt) { + player.jumpLaunchAt = 0; + player.jumpPoseUntil = now + + (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs); + const jumpScale = player.skateboard ? 1.12 + : pogo ? .88 : legCount === 1 ? .78 : 1; + player.vy = Math.min(player.vy, + -(player.crouchJump ? crouchJumpVelocity : jumpVelocity) * jumpScale); + player.jumpHeld = true; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.grounded = false; + player.skateWallSide = 0; + player.ducking = player.crouchJump; + playDrum("block", 0.72, panPlayer(player)); + emitSignal("jump", player.pad, 1, 0); + } + if (pogo && !player.grounded && !hitStunned && downPressed) { + player.vy = Math.max(player.vy, 2250); + player.pogoDive = true; + player.pogoHit = false; + player.pendingMoveLabel = "POGO DOWN"; + player.stance = "POGO DOWN"; + playDrum("kick", .78, panPlayer(player)); + playSine(620, .13); + emitSignal("pogo", player.pad, -1, player.vy); + } + if (!player.grounded && !pogo && input.vertical < 0) { + player.ducking = true; + player.pendingMoveLabel ||= "AIR CROUCH"; + } + + // Y and either shoulder spend an item, so reaching for a kick can no + // longer empty a magazine. A loaded hand still colors the punch — into a + // swing, never a shot. + const acting = !headOnly && !pogo && !hitStunned && !player.blocking; + if (acting && player.gunMode === "RUBBER SMG" && player.gunAmmo > 0 && + pad.down.includes("Y") && player.previous.includes("Y") && + now >= player.nextGunShotAt) + fireGun(player, input); + for (const button of pad.down) { + if (!player.previous.includes(button)) { + remember(player, button); + if (button === "X" && !headOnly) { + player.pendingMoveLabel = "SHIELD"; + playDrum("block", .7, panPlayer(player)); + emitSignal("shield", player.pad, 1, 0); + } + else if (acting && !grabHeld && button === "A") + startMelee(player, "KICK", now); + else if (acting && !grabHeld && button === "B") + startMelee(player, itemMelee[heldItem(player)] || "PUNCH", now); + else if (headOnly && !hitStunned && button === "A") + spit(player, false); + else if (headOnly && !hitStunned && button === "B") + spit(player, true); + else if ((acting || (headOnly && !hitStunned)) && + ["Y", "LeftShoulder", "RightShoulder"].includes(button)) { + const item = heldItem(player); + if (item === "GUN") fireGun(player, input); + else if (item === "GRENADE") throwGrenade(player, input); + } + } + } + if (grabHeld) { + player.lastButton = player.heldBall >= 0 ? "HOLDING" : "REACHING"; + player.lastButtonAt = now; + } + if (player.pendingMoveLabel) remember(player, player.pendingMoveLabel); + + const previousX = player.x; + const previousY = player.y; + const wasGrounded = player.grounded; + player.vy += (player.vy < 0 ? riseGravity() : fallGravity()) * dt; + // Keeping DOWN held through a pound drives it down harder. The button is + // the only thing that makes a pound faster, so the height you fell from and + // the pressure you kept on it are the two dials on the crater. + if (player.pounding && input.vertical < 0) + player.vy = Math.min(poundMaxVelocity * + (1 + .5 * Math.max(0, player.poundLevel - 1)), + player.vy + poundHoldAcceleration * dt); + if (airRoundActive()) { + // A shared terminal fall keeps the duel within reach; UP can flap again, + // DOWN dives. The world has no floor and falling never eliminates anyone. + player.vy = Math.min(player.vy, input.vertical < 0 ? 1050 : 760); + player.skateboard = false; + } + player.x += player.vx * dt; + player.y += player.vy * dt; + // A bodyless head is a ball, and a ball that slides without turning reads + // as a sticker on the floor. Ground contact sets the spin to the true + // rolling rate for the 22-unit radius; the spin then integrates every + // frame, because a head that leaves the floor mid-bounce keeps turning — + // spinning only while grounded left the bouncing head (which is how a head + // mostly travels) with a face nailed bolt upright between landings. + // `grounded` still holds last frame's answer here — it resets just below. + if (isHeadOnly(player)) { + // Clamped well below the true rolling rate: honest physics for a 22-unit + // ball at fight speed is eleven revolutions a second, which on screen is + // not a rolling face but a whirl of spinning lines. A lazy tumble — about + // a turn per second, capped — keeps the eyes and mouth readable while + // still saying which way the head is traveling. + if (player.grounded) player.headRollRate = clamp(player.vx / 22, -6, 6); + player.headRoll = (player.headRoll || 0) + (player.headRollRate || 0) * dt; + } + // Walking down a slope is not a new landing on every other tick. + const nextFloor = terrainFloorAt(player.x); + const followingFloor = wasGrounded && player.vy >= 0 && + Math.abs(previousY - terrainFloorAt(previousX)) < 3 && + nextFloor - previousY <= Math.max(20, Math.abs(player.vx * dt) * 2.5); + if (followingFloor) player.y = Math.max(player.y, nextFloor); + const landingSpeed = player.vy; + player.grounded = false; + // A sinking fighter is transparent to the rung it left and to nothing else. + // A window long enough to clear one lip — .25s, 290 units of fall — is + // already long enough to fall past the next rung 260 below, and a + // double-tap that dropped two storeys read as a fall rather than a step + // down. Remembering where the sink started is what keeps it one storey. + // The floor is never transparent, which is why it stays in the else. + const ledge = player.vy >= 0 && ledgeCrossed(player.x, previousY, player.y); + const sinking = now < player.sinkUntil && + ledge && ledge.y <= player.sinkFrom + 4; + if (ledge && !sinking) { + player.y = ledge.y; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, ledge.y, now); + } else { + player.vy = 0; + player.grounded = true; + } + } else if (player.y >= terrainFloorAt(player.x) && + (!player.skateboard || player.vy >= 0)) { + const terrainY = terrainFloorAt(player.x); + player.y = terrainY; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, terrainY, now); + } else { + player.vy = 0; + player.grounded = true; + } + } + if (player.skateboard) { + const contact = skateContact(player.x, previousY); + const supported = player.grounded || (wasGrounded && player.vy >= 0 && + Math.abs(player.y - contact.y) < Math.max(24, Math.abs(player.vx * dt) * 2.5)); + if (supported && !player.skateWallSide) { + player.y = contact.y; + const tangentX = Math.cos(contact.pitch); + const tangentY = Math.sin(contact.pitch); + if (!wasGrounded) { + // Inelastic contact removes normal velocity. A downward impact at a + // lip must count against uphill momentum, not become an upward boost. + player.skateVx = (player.vx * tangentX + landingSpeed * tangentY) * tangentX; + } else { + // Carry tangent speed around the curve; fixed horizontal speed would + // invent vertical energy whenever the slope steepens. + player.skateVx *= tangentX / Math.max(.001, + Math.cos(player.skatePitch || 0)); + } + player.vx = player.skateVx; + player.skatePitch = contact.pitch; + player.skateContacts = Number(contact.left) + Number(contact.right); + player.grounded = true; + player.vy = 0; + const distance = (player.x - previousX) / Math.max(.15, Math.cos(contact.pitch)); + player.skateSpin = (player.skateSpin || 0) + distance / skateWheelRadius; + player.skateRollDistance = (player.skateRollDistance || 0) + Math.abs(distance); + if (player.skateContacts && player.skateRollDistance >= 100) { + player.skateRollDistance %= 100; + playDrum("hat", .12 + Math.min(.35, Math.abs(player.vx) / 8400), panPlayer(player)); + emitSignal("skate-roll", player.pad, Math.round(Math.abs(player.vx)), player.skateContacts); + } + if (!wasGrounded) { + playDrum("clap", clamp(landingSpeed / 2000, .2, 1), panPlayer(player)); + playDrum("block", clamp(landingSpeed / 2800, .15, .7), panPlayer(player)); + emitSignal("skate-land", player.pad, Math.round(landingSpeed), player.skateContacts); + } + } else player.skateContacts = 0; + } + if (!wasGrounded && player.grounded) { + const onBooster = boosterXs.some((x) => Math.abs(player.x - x) <= boosterRadius); + player.landPoseUntil = now + 110000; + player.crouchJump = false; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + if (player.pounding) groundPound(player, now); + else if (!headOnly && onBooster) { + player.vy = -boosterVelocity; + player.grounded = false; + player.jumpHeld = true; + player.airJumpsUsed = 0; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + playSine(880, .22); + playDrum("clap", 1.2, panPlayer(player)); + emitSignal("boost", player.pad, 1, 0); + } else player.airJumpsUsed = 0; + } + resolveRunnerBounds(player, (now - startedAt) / 1000000); + skateBoostStep(player, parkPreviousX, now); + player.hit = Math.max(0, player.hit - dt * 4); + player.blockFlash = Math.max(0, player.blockFlash - dt * 6); + player.previous = pad.down.slice(); + if (input.vertical > 0) player.previous.push("MOVE_UP"); + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grabHeld = grabHeld; + updateStance(player, input, now); +} + +// How long a bot leans on a button, per action rather than one house number. +// A jump has to outlast the whole rise (1760 / 4800 ≈ .37s) or jumpCutScale +// clips the arc to a third of its height and the platform goes out of reach; +// a strike is a stab; a sink tap is half of a double-tap. +const botHoldUs = { + walk: 90000, jump: 440000, sinkTap: 60000, + strike: 70000, shield: 120000, item: 110000, +}; +// A press cannot reopen until it has been up this long, so `lastRelease` +// always sees a real gap — that gap is what keeps dash, ultra jump and sink +// readable from synthetic input. Four frames clears doubleTapReleaseUs even +// when the release lands a frame late. +const botRestUs = 66668; +// A thumb cannot hold both ends of an axis, so opening one closes the other. +const botAxis = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft", + ArrowUp: "ArrowDown", ArrowDown: "ArrowUp" }; + +// The bot's dice. Not Math.random, deliberately: two fresh sims must roll +// identically (the determinism test holds that line), and the reel factory +// reserves the global stream for the match name. Seeded per fighter at round +// start from the round clock, so rounds differ live while a replayed sim +// replays exactly. +function botRoll(player) { + let s = player.botRngState = (player.botRngState + 0x6d2b79f5) >>> 0; + s = Math.imul(s ^ (s >>> 15), s | 1); + s ^= s + Math.imul(s ^ (s >>> 7), s | 61); + return ((s ^ (s >>> 14)) >>> 0) / 4294967296; +} + +// The one door every synthetic press goes through. Pressing a button that is +// already down extends it, so a pursuit reads as one lean instead of a +// stutter; pressing one that is still resting is refused. +function botPress(player, button, holdUs, now) { + const press = player.botPresses[button]; + if (press && now < press.until) { + press.until = Math.max(press.until, now + holdUs); + return true; + } + if (press && now < press.until + botRestUs) return false; + const other = player.botPresses[botAxis[button]]; + if (other && now < other.until) other.until = now; + player.botPresses[button] = { until: now + holdUs }; + return true; +} + +const botHeld = (player, button, now) => + now < (player.botPresses[button]?.until || 0); + +function botDown(player, now) { + return Object.keys(player.botPresses) + .filter((button) => now < player.botPresses[button].until); +} + +// ── What a bot sees ───────────────────────────────────────────────────────── +// The bots used to steer off the whole table. The climb bot read the ladder +// by index — `platforms[level]` — and the fight bot read the opponent's +// coordinates wherever they were, on screen or not. Neither is what a hand on +// a pad has. A player sees a screen: the rungs the lens has in frame, the lava +// once it has climbed into view, the other fighter while the camera holds +// them — and picks the next move from what that frame offers. +// +// `botScene` is that frame. It is rebuilt every simulation tick from the same +// projection the stage paints with, so a rung is in the scene exactly when +// its lip lands on the screen a person would be watching. `botOptions` is the +// list of moves the scene affords from where the bot is standing: which of +// those rungs one jump reaches, from where; the span it can walk; the deck it +// could sink through. The brains below hold a goal (the summit, the +// opponent), pick the option that advances it as this tick's subgoal, and +// press for that — nothing in them reaches past the frame. +// +// One jump's ceiling, from the same numbers the fighter's legs use: with up +// held, the rise is v²/2g, and everything above it is out of reach. +const jumpApex = () => jumpVelocity * jumpVelocity / (2 * riseGravity()); +// A jump's horizontal budget onto a deck `dy` above the takeoff: the whole +// rise, then the fall from the apex down to the deck's height, walked at +// walking speed. Scaled down hard — the bot is committing to a lip, and a +// landing at the very end of the arc is a landing it can miss by one frame. +const botAirCommit = .6; +function jumpReach(dy) { + const riseSeconds = jumpVelocity / riseGravity(); + const fallSeconds = Math.sqrt(2 * Math.max(0, jumpApex() - dy) / fallGravity()); + return walkSpeed * (riseSeconds + fallSeconds) * botAirCommit; +} +// Where the feet are. Level 0 is the arena floor; a rung answers by its level. +function botFooting(player) { + if (!player.grounded) return null; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (Math.abs(player.y - ledge.y) <= 3 && + player.x >= ledge.left && player.x <= ledge.right) return { ...ledge }; + return { level: 0, left: platformLeft, right: platformRight, y: floorY }; +} +// The screen. The whole screen, not the action-safe rect: a person watching +// a television reads the rung above out of the sky the HUD floats over. +const botViewport = () => + ({ left: stageLeft, right: stageRight, top: 0, bottom: viewHeight }); +function pointInView(view, x, y, z = 0) { + const point = projectPoint(x, y, z); + return Number.isFinite(point.x) && Number.isFinite(point.y) && + point.x >= view.left && point.x <= view.right && + point.y >= view.top && point.y <= view.bottom; +} +// A rung is in view when any of its lip is: both ends projected, the span +// clipped against the screen's sides, its height inside the screen's top and +// bottom. A deck half off the right edge still offers its visible half. +function rungInView(view, ledge) { + const a = projectPoint(ledge.left, ledge.y, 0); + const b = projectPoint(ledge.right, ledge.y, 0); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite)) return false; + const y = (a.y + b.y) / 2; + return y >= view.top && y <= view.bottom && + Math.max(a.x, b.x) >= view.left && Math.min(a.x, b.x) <= view.right; +} + +function botScene(player, opponent, now) { + const view = botViewport(); + const footing = botFooting(player); + const rungs = []; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (rungInView(view, ledge)) + rungs.push({ level: ledge.level, left: ledge.left, right: ledge.right, + y: ledge.y, dy: player.y - ledge.y }); + const scene = { + at: now, + view, + lens: { width: cameraDoll.width, x: cameraDoll.target.x, + y: cameraDoll.target.y }, + self: { x: player.x, y: player.y, vx: player.vx, vy: player.vy, + grounded: player.grounded, facing: player.facing, footing }, + floor: pointInView(view, clamp(player.x, platformLeft, platformRight), + floorY) ? { y: floorY, left: platformLeft, right: platformRight } : null, + rungs, + lava: survivalActive() && + pointInView(view, clamp(player.x, worldLeft, worldRight), survivalLavaY) + ? { y: survivalLavaY, below: survivalLavaY - player.y } : null, + opponent: null, + pickups: [], + }; + if (opponent && opponent.alive && opponent !== player && + pointInView(view, opponent.x, opponent.y - 90, opponent.z || 0)) { + const dx = opponent.x - player.x; + scene.opponent = { x: opponent.x, y: opponent.y, dx, dy: player.y - opponent.y, + distance: Math.abs(dx), facing: opponent.facing, + attacking: Boolean(opponent.attackKind) && now < opponent.attackUntil, + attackStartedAt: opponent.attackStartedAt }; + } + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + if (pickup.active && pointInView(view, pickup.x, pickup.y)) + scene.pickups.push({ kind: pickup.kind || "item", + x: pickup.x, y: pickup.y, dx: pickup.x - player.x }); + scene.options = botOptions(player, scene); + return scene; +} + +// The moves the scene affords from this footing. Every option names the deck +// it ends on, so a brain can pick by destination and then read off how to +// get there. In the air there is nothing to enumerate; the brain keeps the +// subgoal it left the ground with. +function botOptions(player, scene) { + const options = []; + const footing = scene.self.footing; + if (!footing) return options; + options.push({ kind: "walk", level: footing.level, y: footing.y, + left: footing.left, right: footing.right }); + const inset = survivalTune().landingInset; + const visible = new Set(scene.rungs.map(r=>r.level)); + const maxReach = jumpReach(0); + const nearby = queryBoxTree(platformBoxTree(), combatRect('jump-window', + footing.left-maxReach, footing.y-jumpApex(), footing.right+maxReach, footing.y)); + for (const box of nearby) { + const rung = box.ledge; + if (!visible.has(rung.level)) continue; + const dy = footing.y - rung.y; + if (dy <= 0 || dy > jumpApex()) continue; + const landLeft = rung.left + inset; + const landRight = rung.right - inset; + if (landRight < landLeft) continue; + const reach = jumpReach(dy); + // Where on this footing a jump can start and still come down on the + // landing band. An empty window is a deck the lens shows but the legs + // cannot have from here. + const takeoffLeft = Math.max(footing.left, landLeft - reach); + const takeoffRight = Math.min(footing.right, landRight + reach); + if (takeoffLeft > takeoffRight) continue; + const aim = clamp(player.x, landLeft, landRight); + options.push({ kind: "jump", level: rung.level, y: rung.y, dy, reach, + landLeft, landRight, takeoffLeft, takeoffRight, aim, + cost: Math.abs(aim - player.x) }); + } + if (footing.level > 0) { + // Sinking drops to whatever is under the feet — and only what is in + // frame counts, the same as a person deciding to fall. + let below = scene.floor ? { level: 0, y: floorY } : null; + for (const rung of scene.rungs) + if (rung.y > footing.y && player.x >= rung.left && + player.x <= rung.right && (!below || rung.y < below.y)) + below = { level: rung.level, y: rung.y }; + if (below) options.push({ kind: "sink", level: below.level, y: below.y, + dy: footing.y - below.y }); + } + return options; +} + +let platformTreeSource = null, platformTreeRevision = -1, platformTree = null; +function platformBoxTree() { + const ledges = activeLedges(); + if (platformTreeSource !== ledges || platformTreeRevision !== workshopRevision) { + platformTreeSource = ledges; platformTreeRevision = workshopRevision; + platformTree = buildBoxTree(ledges.map(ledge => combatRect('platform-'+ledge.level, + ledge.left,ledge.y,ledge.right,ledge.y+12,0,18,{ledge}))); + } + return platformTree; +} + +// The climb's subgoal: the highest deck one jump reaches from this footing, +// the nearest of them when two tie. On the ladder that is the deck above — +// two decks is 470 and the apex is 322 — but the choice is made from the +// scene, so a deck the lens has not shown yet is a deck the bot waits for. +function highestJump(options) { + let best = null; + for (const option of options) { + if (option.kind !== "jump") continue; + if (!best || option.y < best.y || + (option.y === best.y && option.cost < best.cost)) best = option; + } + return best; +} + +function botPad(player, opponent, now) { + if (selfPlay && typeof globalThis.__oskiewarJevPad === 'function') { + const scene = botScene(player, opponent, now); + scene.self.ducking = player.ducking; + scene.self.attackFrame = meleeFrame(player, now).frame; + scene.self.recoveryMs = Math.max(0, (player.attackUntil-now)/1000); + scene.self.combat = { + punch: Boolean(availableArm(player)), + kickLeft: hasPart(player, 'left-leg'), kickRight: hasPart(player, 'right-leg'), + item: Boolean(heldItem(player)), stunned: now < player.hitStunUntil, + headOnly: isHeadOnly(player), pogo: isPogo(player), + }; + if (scene.opponent) { + scene.opponent.grounded = opponent.grounded; + scene.opponent.vx = opponent.vx; scene.opponent.vy = opponent.vy; + scene.opponent.ducking = opponent.ducking; + scene.opponent.headOnly = isHeadOnly(opponent); + scene.opponent.pogo = isPogo(opponent); + scene.opponent.blocking = opponent.blocking; + scene.opponent.attackFrame = meleeFrame(opponent, now).frame; + scene.opponent.recoveryMs = Math.max(0, (opponent.attackUntil-now)/1000); + // The parent calls this only when preparing a model request, not every + // simulation tick. Probes read clones and never advance the live fight. + scene.strikeOptions = () => jevStrikeOptions(player, opponent, + runtime().simMonotonicUs || runtime().monotonicUs); + } + const down = globalThis.__oskiewarJevPad(player.pad, { ...scene, + round: matchName, alive: player.alive && opponent.alive }); + return { connected: true, down: Array.isArray(down) ? down.filter(button => + ['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','A','B','X','Y'].includes(button)) : [], leftX: 0, leftY: 0 }; + } + if (!player.bot) { + player.botPresses = {}; + return { connected: true, down: [], leftX: 0, leftY: 0 }; + } + // Downed, or standing over a downed opponent, the bot opens nothing new — + // but presses already out still run their length instead of vanishing + // mid-hold, which would read as a poke. + if (!player.alive || !opponent.alive) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + + // A scored bot plays its sheet instead of thinking: rows of {at, button, + // hold} in µs from round start, through the same botPress door so holds + // and releases stay human-shaped. An empty score is a dummy that stands + // there and takes it — which is exactly what a sync lab needs on the + // receiving end. Scores arrive via globalThis.__oskiewarBotScores at round + // start; no score, and the brain below plays as always. + if (player.botScore) { + const at = now - roundStartedAt; + while (player.botScoreAt < player.botScore.length && + player.botScore[player.botScoreAt].at <= at) { + const row = player.botScore[player.botScoreAt]; + if (botPress(player, row.button, row.hold ?? botHoldUs.strike, now)) + player.botScoreAt += 1; + else break; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + + // The frame, and the opponent only as the frame shows them. The fight + // camera holds both fighters, so an opponent out of view is the rare case — + // but when it happens the bot has nothing to chase and opens nothing new. + const scene = botScene(player, opponent, now); + player.botScene = scene; + player.botGoal = "opponent"; + const seen = scene.opponent; + if (!seen) { + player.botSubgoal = null; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + const dx = seen.dx; + const distance = seen.distance; + const toward = Math.sign(dx) || player.facing || -1; + const opponentThreatening = seen.attacking && distance < 245 && + seen.facing === -toward; + const striking = botHeld(player, "A", now) || botHeld(player, "X", now); + + // A guard that answers every swing the frame it starts turns the round into + // punch-into-shield until the clock dies — the signal census reads punch×6, + // shield×6 per five seconds and nothing else. So the guard is human now: + // each incoming swing is noticed once, answered late, and sometimes not at + // all. The lapse is what lets damage through, and damage is what ends + // rounds. + if (opponentThreatening) { + if (player.botThreatSeen !== seen.attackStartedAt) { + player.botThreatSeen = seen.attackStartedAt; + const roll = botRoll(player); + player.botShieldAt = roll < 0.55 + ? now + 70000 + Math.round(roll * 250000) : Infinity; + } + } else player.botShieldAt = Infinity; + + // A shield that just ate a swing bought a stun. Swing into it now — the + // neutral-game cooldown would let the opening close unanswered. + if (player.shieldBrokenAt && + player.shieldBrokenAt !== player.botPunishedAt && + now - player.shieldBrokenAt < 80000) { + player.botPunishedAt = player.shieldBrokenAt; + player.botAttackAt = now; + } + + if (opponentThreatening && !striking && now >= player.botShieldAt) + botPress(player, "X", botHoldUs.shield, now); + else { + // The old spacing was tuned for a bigger fighter: stop walking at 155, + // swing at 225. A punch capsule tops out near 130 of separation and a + // kick near 170, so that band was whiff purgatory — the census read + // punch after punch with no body hit until the clock died. Close to + // where a swing actually lands, and swing only from there — and only on + // the ground: steering mid-air wedged the bot against a platform lip it + // used to clear. + if (player.grounded && distance > 95) + botPress(player, toward > 0 ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + // Items are ranged, so the bot spends them while closing rather than + // trading one for a swing it could land anyway. The grenade needs its arc. + const item = heldItem(player); + if (item && now >= player.botItemAt && + distance >= (item === "GUN" ? 320 : 1200) && + botPress(player, "Y", botHoldUs.item, now)) + player.botItemAt = now + 600000; + if (distance < 165 && now >= player.botAttackAt && + botPress(player, player.botAttackSequence % 2 ? "A" : "B", + botHoldUs.strike, now)) { + player.botAttackSequence += 1; + player.botAttackAt = now + 330000 + (player.botAttackSequence % 3) * 70000; + } + } + + // Up and down are read off the scene's options. An opponent a storey up + // is reached by the jump that lands on their deck when the frame offers + // one, and by a plain jump at them when it does not — the cube has no + // rungs, and there the old leap is the only vertical move there is. + const climb = seen.dy > 180 + ? scene.options.find((option) => option.kind === "jump" && + Math.abs(option.y - seen.y) <= 3) || null + : null; + player.botSubgoal = climb; + if (climb && Math.abs(climb.aim - player.x) > 24) + botPress(player, climb.aim > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + const canLeap = climb + ? player.x >= climb.takeoffLeft && player.x <= climb.takeoffRight + : seen.dy > 180; + if (player.grounded && canLeap && now >= player.botJumpAt && + botPress(player, "ArrowUp", botHoldUs.jump, now)) + player.botJumpAt = now + 1250000; + // Knocked up onto a deck the bot would camp out of reach, so it plays the + // same double-tap-down a player would: two real presses with a real + // release between them — and only through a deck the frame shows a floor + // under. + const sink = scene.options.find((option) => option.kind === "sink"); + if (sink && player.grounded && player.standingOn < 0 && + seen.dy < -200 && now >= player.botSinkAt) { + player.botSinkAt = now + 900000; + player.botSinkTaps = 2; + player.botSinkNextAt = now; + } + if (player.botSinkTaps > 0 && now >= player.botSinkNextAt && + botPress(player, "ArrowDown", botHoldUs.sinkTap, now)) { + player.botSinkTaps -= 1; + player.botSinkNextAt = now + botHoldUs.sinkTap + botRestUs; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The climb bot's four numbers, gathered so they can be priced instead of +// guessed. `survival-lab.mjs` runs the ladder headlessly and sweeps one of +// these at a time; the defaults are exactly what the bot shipped with, and +// ordinary play never sets the override, so a human's attract-mode climb is +// unchanged by the seam existing. +const survivalTuneDefaults = { + landingInset: 72, // how far inside a deck's edge still counts as footing + walkThreshold: 24, // closer than this and walking is only jitter + // How far off the aim point the runner may still commit to a jump. This was + // 34, and 34 is why no reel ever summited: decks 5 and 6 do not overlap + // horizontally, so `dx` there never falls below 92 and the bot stood on the + // lip jumping straight up until the lava took it. Committing while the walk + // is still carrying it is what crosses a gap. Measured by `survival-lab.mjs`: + // ≤100 dies on deck 5, ≥110 summits all 32, and it still summits at 420 — + // 160 sits well inside that shelf rather than on its edge. + jumpThreshold: 160, + jumpCooldownUs: 580000, // the floor under one jump per deck + jumpHoldUs: botHoldUs.jump, // held past apex, or `jumpCutScale` clips the rise + // Per-reel variation. The ladder is fixed, the bot is fixed, and under the + // oven's fixed-step clock the round clock the bot's dice seed from is fixed + // too — so every slot rendered a frame-identical climb, and three reels + // shipped the same run. The oven passes a seed; it is folded into the + // fighter's dice once, which moves the aim from deck to deck while leaving + // any single seed exactly reproducible. Zero means no variation, which is + // what ordinary play uses, so a human's attract-mode climb is untouched. + seed: 0, + // Share of the landing band the aim may wander. Bought with `survival-lab`: + // .15 and .3 both summit 4/4, .45 and .6 drop to 3/4 because a hard bias + // toward a deck's edge can leave the next jump unmakeable. .3 is the most + // visible variation that still costs nothing. + aimJitter: .3, +}; +function survivalTune() { + const override = globalThis.__oskiewarSurvivalTune; + if (!override) return survivalTuneDefaults; + return { ...survivalTuneDefaults, ...override }; +} + +function survivalBotPad(player, now) { + if (!player.bot || !player.alive) + return { connected: true, down: [], leftX: 0, leftY: 0 }; + const tune = survivalTune(); + // Folded in once per run, before the first aim is taken. + if (tune.seed && player.survivalSeed !== tune.seed) { + player.survivalSeed = tune.seed; + player.botRngState = + (player.botRngState ^ Math.imul(tune.seed, 0x9e3779b9)) >>> 0; + } + // The frame, every tick. The goal is the summit; the subgoal is the deck + // this frame offers a jump onto. On the ground that is re-chosen from the + // scene each tick — in the air the runner holds the deck it left for. + const scene = botScene(player, null, now); + player.botScene = scene; + player.botGoal = "summit"; + const footing = scene.self.footing; + if (footing) { + const next = highestJump(scene.options); + if (next && next.level !== player.survivalTargetLevel) { + player.survivalTargetLevel = next.level; + // One roll per deck, not per tick: the runner should commit to a line + // and hold it, and rolling every frame would average the wander back + // to zero. + player.survivalAimBias = tune.seed ? botRoll(player) - .5 : 0; + } + player.botSubgoal = next; + if (!next) { + // Nothing above in frame. Stand where a deck cannot end under you — + // the lens is catching up, and the next rung arrives in it. + const middle = (footing.left + footing.right) / 2; + if (Math.abs(middle - player.x) > tune.walkThreshold) + botPress(player, middle > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + } + const target = player.botSubgoal; + if (!target) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + // Aim for the nearest safe point on the landing band, not the deck's + // center: a centered aim walked the bot to the lip of an overlapping pair + // and waited forever when the remaining seven units were smaller than its + // jump threshold. The seeded wander moves the aim along the band. + const aim = clamp(clamp(player.x, target.landLeft, target.landRight) + + (player.survivalAimBias || 0) * (target.landRight - target.landLeft) * + tune.aimJitter, target.landLeft, target.landRight); + const dx = aim - player.x; + if (Math.abs(dx) > tune.walkThreshold) + botPress(player, dx > 0 ? "ArrowRight" : "ArrowLeft", botHoldUs.walk, now); + // Commit inside the option's own budget or the tuned threshold, whichever + // is tighter — the threshold was priced by `survival-lab.mjs`, and the + // budget keeps a lab sweep from asking for a jump the legs cannot land. + if (player.grounded && Math.abs(dx) <= Math.min(tune.jumpThreshold, target.reach) && + player.x >= target.takeoffLeft && player.x <= target.takeoffRight && + now >= player.botJumpAt && + botPress(player, "ArrowUp", tune.jumpHoldUs, now)) + player.botJumpAt = now + tune.jumpCooldownUs; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The replay oven needs a bounded completion record, not a production replay. +// Its injected fetch keeps this envelope inside the local shell; ordinary +// survival never records, publishes, or analyzes a run. Keeping the seam +// explicit prevents a `?replay-oven` URL typed in a normal browser from +// turning an anonymous climb into stored match data. +function captureSurvivalRun(now, result) { + if (globalThis.__oskiewarCaptureSurvival !== true || + typeof saveReplay !== "function") return; + const tickUs = 1000000 / 60; + const durationTicks = Math.max(1, + Math.round((now - survivalStartedAt) / tickUs)); + // The clock this is built from is fixed under an offline fixed-step pass, so + // without the seed every reel in a day filed the same name — and that name + // becomes the reel's Instagram `audio_name` (`audioNameFor`), which is only + // honoured on the post that mints it. Live climbs pass no seed and keep the + // original name. + const runSeed = survivalTune().seed >>> 0; + const roundName = "survival-v" + buildVersion + "-" + + Math.max(0, Math.round(survivalStartedAt / tickUs)) + + (runSeed ? "-" + runSeed.toString(36) : ""); + const runner = players[0]; + const height = Math.round(survivalHeight); + const demo = { + format: "ac.oskiewar.survival", version: 1, game: "oskiewar", + simulation: "oskiewar-survival-1", tickRate: 60, + matchId: "ow-" + roundName, matchName: roundName, + roundId: "ow-" + roundName, roundName, roundIndex: 0, + startedAt: runtime().unixMs - Math.round(durationTicks / 60 * 1000), + durationTicks, fighters: [runner.name], nations: [runner.nation || ""], + winner: result === "SUMMIT" ? runner.name : null, + finalRoundWins: [result === "SUMMIT" ? 1 : 0], + cause: result, height, + commands: [], checkpoints: [], impacts: [], + events: [[0, "climb", 0, 1, 0], + [durationTicks, "survival-end", 0, height, + result === "SUMMIT" ? 1 : 0]], + }; + const upload = saveReplay(JSON.stringify(demo)); + if (upload && typeof upload.catch === "function") + upload.catch((error) => telemetry("SURVIVAL_CAPTURE", + "local-error " + error.message)); +} + +function finishSurvival(now, result) { + if (roundResult) return; + const runner = players[0]; + survivalBestHeight = Math.max(survivalBestHeight, survivalHeight); + roundResult = result; + roundCause = result; + roundOverAt = now; + runner.vx = 0; + runner.vy = 0; + if (result === "LAVA") { + runner.alive = false; + runner.stance = "HIT"; + spawnImpact({ x: runner.x, y: survivalLavaY, z: runner.z, + life: 1.2, duration: 1.2, death: true, explosion: true, + blastRadius: 240, power: .8 }); + playDrum("kick", 1.25, panPlayer(runner)); + playSine(92, .45); + } else { + playDrum("clap", 1.2, 0); + playSine(880, .3); + } + globalThis.__oskiewarResultLine = result === "SUMMIT" + ? "summit!" : Math.round(survivalHeight) + " high"; + emitSignal("survival-end", 0, Math.round(survivalHeight), + result === "SUMMIT" ? 1 : 0); + captureSurvivalRun(now, result); +} + +function updateSurvival(dt, now) { + const runner = players[0]; + const height = Math.max(0, floorY - runner.y); + survivalHeight = Math.max(survivalHeight, height); + runner.score = Math.round(survivalHeight); + while (survivalPeakLevel < platforms.length && + runner.y <= platforms[survivalPeakLevel].y + 2) + survivalPeakLevel++; + const lavaSpeed = survivalLavaBaseSpeed + + Math.min(76, survivalHeight * .008); + survivalLavaY -= lavaSpeed * dt; + const body = runnerBounds(runner, (now - startedAt) / 1000000); + if (body.bottom >= survivalLavaY) finishSurvival(now, "LAVA"); + else if (survivalPeakLevel >= platforms.length && runner.grounded) + finishSurvival(now, "SUMMIT"); +} + +function drawAirDropSky(t) { + const shift = ((cameraCenterY * .14) % viewHeight + viewHeight) % viewHeight; + const ink = mixColor([65,115,155], [230,248,255], visualTheme.light); + for (let i = 0; i < 14; i++) { + const x = ((i * 197 + 53) % 997) / 997 * viewWidth(); + const y = ((i * 113) % viewHeight - shift + viewHeight) % viewHeight; + screenRect(x, y, 2 + i % 2, 16 + i % 4 * 9, ink); + } +} + +function gameSim() { + captureRenderInterpolationState(); + syncGameView(); + const now = runtime().monotonicUs; + const dt = Math.min(0.04, Math.max(0.001, (now - lastSimAt) / 1000000)); + lastSimAt = now; + // Whether a door is in the way is state, not decoration: the same answer + // gates the fight, the claim and the wire, so it is settled once on the tick + // rather than re-asked by each of them mid-paint. + updateAccountDoor(); + if (resimPending) { + startResim(resimPending, now); + resimPending = null; + } else if (resimActive) { + // Demo ticks count every sim step from the reset, intro included — the + // drift meter has to count in the same currency. + resimTick++; + advanceResimCommands(); + } + if (roundViewer && !netSession) { + // The chair-holder's hands are local even when the fight is not. The + // control legend, the M30 manual page and the touch discs all light off + // inputPads[0], and the debug toggle wants a View edge — none of that + // may wait on the host's echo, so the local pad is sampled here exactly + // as it would be in a hosted fight. + padSnapshots[0] = samplePad(0); + inputPads[0] = padSnapshots[0]; + const down = padSnapshots[0]?.down || []; + if (down.includes("View") && !viewerSystemPrevious.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + viewerSystemPrevious = down.slice(); + updateRoundViewer(now, dt); + // A visitor who holds the second chair plays through this screen: their + // pad goes up the wire every tick it changes, and a room found hostless + // becomes theirs to host. + sendChallengerInput(now); + netChallengerHello(now); + updateVersusClaim(now); + return; + } + padSnapshots[0] = samplePad(0); + padSnapshots[1] = samplePad(1); + padSnapshots[2] = samplePad(2); + inputPads[0] = padSnapshots[0]; + inputPads[1] = padSnapshots[1]; + if (updateLocalVersus(now)) { + consumeSystemButtons(now); + return; + } + const cameraPads = localVersusActive() ? padSnapshots : [padSnapshots[0]]; + const cameraX = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightX) || 0), 0), -1, 1); + const cameraY = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightY) || 0), 0), -1, 1); + if (Math.abs(cameraX) > .08) + playerCameraYaw = clamp(playerCameraYaw + cameraX * dt * 1.15, -.62, .62); + if (Math.abs(cameraY) > .08) + playerCameraPitch = clamp(playerCameraPitch + cameraY * dt * .72, -.24, .28); + // Triggers zoom, but only on a pad whose triggers are analog -- on anything + // else the shell is still aliasing them to A and X, and stealing those two + // buttons would cost a small pad its item and shield. + // Either couch seat can steer the shared camera. Digital M30 shoulders + // remain combat buttons, even beside a controller with analog triggers. + const push = clamp(cameraPads.reduce((sum, pad) => sum + (pad?.analogTriggers + ? (Number(pad.leftTrigger) || 0) - (Number(pad.rightTrigger) || 0) : 0), 0), -1, 1); + if (Math.abs(push) > .08) + playerCameraZoom = clamp(playerCameraZoom + push * dt * .9, .55, 1.9); + // A mouse or a finger on the shell's canvas orbits the same lens the + // right stick does: a drag turns yaw and pitch, the wheel or a pinch + // dollies. The shell banks the gesture between ticks and this drains it, + // so a fast flick is not lost to a slow frame. + const orbit = globalThis.__oskiewarTouch?.orbit; + if (orbit) { + if (orbit.yaw) + playerCameraYaw = clamp(playerCameraYaw + orbit.yaw, -.62, .62); + if (orbit.pitch) + playerCameraPitch = clamp(playerCameraPitch + orbit.pitch, -.24, .28); + if (orbit.zoom) + playerCameraZoom = clamp(playerCameraZoom * Math.exp(orbit.zoom), .55, 1.9); + orbit.yaw = orbit.pitch = orbit.zoom = 0; + } + // A tap anywhere on the wordmark screen is a start press — read before + // the tap queue is wiped for the tick. The shell already turns first-visit + // taps into a button; this catches every visit after that. + const titleTapped = shellMode === "MENU" && !selecting && + (globalThis.__oskiewarTouch?.taps?.length || 0) > 0; + if (!selecting && Array.isArray(globalThis.__oskiewarTouch?.taps)) + globalThis.__oskiewarTouch.taps.length = 0; + if (consumeSystemButtons(now)) { + if (netSession) netLeave("system-button"); + return; + } + // The wordmark screen is a live training round, so the shell reads start + // and then falls straight through into the fight it is sitting on top of. + if (shellMode === "MENU") updateShell(now, titleTapped); + else updateMatchPace(now); + // The versus seat watches from the title on — a friend can take the chair + // while the host is still reading the wordmark, and the fight lifts it. + updateVersusSeat(now); + updateLobbyMortality(now); + if (survivalActive() && shellMode === "MENU") { + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + for (const player of players) + inputPads[player.pad] = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]) + : resimActive && resimCommands + ? resimPad(player.pad) + : player.remote ? remotePadSnapshot() + : player.bot && shellMode === "GAME" + ? survivalActive() && player.pad === 0 + ? survivalBotPad(player, now) + : botPad(player, players[player.pad ? 0 : 1], now) + : player.npc ? { connected: true, down: [], leftX: 0, leftY: 0 } + : padSnapshots[player.pad]; + // Start belongs to the shell, including its hold and transition frames. + // The first neutral sample releases gameplay for the next fresh press. + if (!players[0].bot && !players[0].remote && !netFrameInputs && !resimActive) { + const pad = inputPads[0]; + if (shellMode === "MENU" || startInputPending) { + startInputPending = shellMode === "MENU" || pad.down.length > 0 || + Math.abs(pad.leftX || 0) > .08 || Math.abs(pad.leftY || 0) > .08; + inputPads[0] = { ...pad, down: [], leftX: 0, leftY: 0 }; + } + } + if (debugHitboxes && now >= nextInputDebugAt) { + nextInputDebugAt = now + 500000; + const values = players.map((player) => { + const pad = inputPads[player.pad]; + const input = quantizedInput(pad, player.suppressedDirections); + return "P" + (player.pad + 1) + " down=" + + (pad.down.join("+") || "NONE") + " stick=" + + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + " q=" + + input.horizontal + "," + input.vertical + " vx=" + + Math.round(player.vx); + }); + telemetry("FIGHT_INPUT", values.join(" | ")); + } + recordReplayCommands(now, inputPads); + // Session first: the hand-off frame must leave before the round's first + // frame walks the native shell's one socket over to the round room. + publishSession(now); + publishSpectator(now); + publishVersus(now); + if (survivalActive() && roundResult) { + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + if (now - roundOverAt >= roundResultUs) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSurvivalRun(now, true); + else returnToTitle(now, "survival-end"); + } + return; + } + if (roundResult) { + // The scored tail. The killcam dwell used to be the reel's quietest + // seconds under its most dramatic frames, so the dwell keeps a slow + // heartbeat and the result card lands with a sting of its own. Voice on + // the drum channel, record on unrouted signal names, as everywhere. + if (!resultPulseAt) resultPulseAt = roundOverAt + 900000; + if (now >= resultPulseAt) { + resultPulseAt = now + 1050000; + playDrum("kick", .3, 0); + emitSignal("result-pulse", -1, 0, 0); + } + if (!resultCardStung && now - roundOverAt >= 1100000) { + resultCardStung = true; + playDrum("bell", .95, 0); + // The card's own line rides a global for whichever shell can speak: + // the web shell reads it back through speech synthesis on this same + // signal. Signals carry numbers, and the sentence is presentation. + // The anonymous seat wears a blank nameplate, and a blank name read + // aloud is a stumble — but only the local first seat can be nameless, + // so a nameless winner is always "you". + const card = resultCardText(); + const spokenWinner = card.winner.replace(/^@/, ""); + globalThis.__oskiewarResultLine = roundResult === "TIE" ? "tie!" + : (spokenWinner ? spokenWinner + " wins the " : "you win the ") + + (matchOver ? "match" : "round"); + emitSignal("result-card", -1, roundResult === "TIE" ? 0 : 1, 0); + // The winner gets the last word: a staccato synthesized laugh rides + // out of the bell. A tie amuses nobody. + if (roundResult !== "TIE") { + resultLaughAt = now + 420000; + resultLaughStep = 0; + // The mouth opens on the sting and the laugh lands in it — the same + // open-ring LAUGH face the A+B chord earns, dealt automatically to + // the winner unless they have already chosen their own gloat. + const winner = roundWinner(); + if (winner?.alive && !winner.resultReaction) { + winner.resultReaction = "LAUGH"; + winner.resultReactionAt = now; + } + } + } + if (resultLaughAt && resultLaughStep < 5 && now >= resultLaughAt) { + playSine([760, 640, 700, 580, 500][resultLaughStep], .09); + playDrum("hat", .16, 0); + if (resultLaughStep === 0) emitSignal("victory-laugh", -1, 1, 0); + resultLaughAt = now + 112000 + resultLaughStep * 24000; + resultLaughStep++; + } + if (INSTANT_REPLAY && instantReplay) { + updateInstantReplay(now, dt); + return; + } + if (INSTANT_REPLAY) { + const replayDown = padSnapshots[0]?.down || []; + if (replayDown.includes("Y") && !replayOfferPrevious.includes("Y") && + startInstantReplay(now)) return; + replayOfferPrevious = replayDown.slice(); + } + const cinematicWinner = deathCinematic + ? players[deathCinematic.winnerPad] : null; + if (cinematicWinner?.alive) updatePlayer(cinematicWinner, + { connected: true, down: [], leftX: 0, leftY: 0 }, dt, now); + // Severed pieces belong to the action too; the result clock must not pin + // them in mid-air while the surviving body completes its landing. + updateBullets(dt, now, false); + updateGrenades(dt, now, false); + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + const resultDuration = matchOver ? matchResultUs : roundResultUs; + if (now - roundOverAt >= resultDuration) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSelfPlay(now); + // A versus result rolls straight into the next round while the rival's + // wire stays warm — the room, not the title, is home base. A finished + // match deals fresh, a finished round keeps the tally. + else if (versusActive() && versusChallengerFresh()) + startVersusFight(now, matchOver); + else if (versusActive()) beginVersusLobby(now); + else if (localVersusActive()) { + if (matchOver) startLocalVersus(now); + else resetRound(now, false); + } + else returnToTitle(now, "round-end"); + } + return; + } + if (PAL_SELECT && selecting) { + updateSelect(now); + return; + } + if (now - roundStartedAt < roundIntroDurationUs()) { + // The intro used to pass in silence — a reel that opens on the countdown + // opened on three mute seconds, and a player heard the round begin with + // nothing. Ring the "3, 2, 1" on the same two channels the round clock + // uses: the drum for the ear, the signal for the record. + const introSecond = Math.ceil( + (roundIntroDurationUs() - (now - roundStartedAt)) / 1000000); + if (introSecond !== lastIntroSecond) { + lastIntroSecond = introSecond; + // playDrum is the voice, the signal is the record — the "countdown" + // name is deliberately not in the sfx routes, or the web would voice + // every bell twice. value2 marks these as the intro's. + playDrum("bell", .72 + (3 - introSecond) * .12, 0); + emitSignal("countdown", -1, introSecond, 1); + } + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + if (lastIntroSecond > 0) { + // The first live tick after the intro is the mode opening — one accent, + // so the callout is a sound and not just a vanished word. + lastIntroSecond = -1; + playDrum("block", 1.1, 0); + if (survivalActive()) { + globalThis.__oskiewarStartLine = "climb!"; + emitSignal("climb", 0, 1, 0); + } else emitSignal("fighters-lock", -1, 0, 0); + } + roundElapsedUs += dt * 1000000; + const timedRound = roundIsTimed(); + if (timedRound) { + const countdownSecond = Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + if (countdownSecond > 0 && countdownSecond <= 10 && + countdownSecond !== lastCountdownSecond) { + lastCountdownSecond = countdownSecond; + playDrum("bell", 1 + (10 - countdownSecond) * .025, 0); + emitSignal("countdown", -1, countdownSecond, 0); + } + } + if (survivalActive()) { + updatePlayer(players[0], inputPads[0], dt, now); + updateSurvival(dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + } else { + updateWind(dt, now); + for (const player of players) updatePlayer(player, inputPads[player.pad], dt, now); + updateSkateRopes(dt); + resolvePlayerStanding(now); + resolvePlayerPushboxes(); + updateFallingPickups(dt, now); + updatePowerups(now); + updateBodyTrees(dt, now); + updateBullets(dt, now); + updateGrenades(dt, now); + resolveMelee(now); + resolvePogoAttacks(now); + updateLobbyMortality(now); + // After the exchange resolves, so a frame that landed a hit reads as the + // recovery it has become rather than as the active frame it was. + recordFrameMeter(now); + for (const item of balls) updateBall(item, dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + captureRoundReplay(now); + recordReplayCheckpoint(now); + trackResimDrift(now); + } + for (const impact of impacts) { + if (!impact.debris) { + // A fresh impact heats the tile it landed in. The debris check is the + // once-per-impact gate — the first sim tick is the only tick an impact + // exists without motes — so a hit stamps its cell exactly once, and + // the overlay on the back wall shows the fight's last half-second as + // cooling squares. + if (onGridField(impact.x, impact.y)) { + const cell = gridFieldIndex(impact.x, impact.y); + gridField[cell] = Math.min(1, gridField[cell] + + (impact.explosion ? 1 : impact.death ? .9 : .55)); + } + const count = impact.explosion ? 24 : impact.death ? 10 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.explosion + ? 1180 + (impact.power || 0) * 720 + : impact.death ? 660 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 260, + vz: Math.sin(angle * 1.7) * force * .22, + radius: impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; + mote.y += mote.vy * dt; + mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; + mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); + // The tile field cools between stamps — a fixed exponential against the + // fixed 60 Hz step, so a replayed round heats and fades identically. Cells + // snap to zero below a hundredth so a quiet map is exactly zeros. + for (let cell = 0; cell < gridField.length; cell++) + gridField[cell] = gridField[cell] < .01 ? 0 + : gridField[cell] * Math.exp(-dt * 1.6); + if (!survivalActive() && !lobbyActive() && + ((freeForAll() ? players.filter((player) => player.alive).length <= 1 + : players.some((player) => !player.alive)) || + (timedRound && roundElapsedUs >= roundDurationUs))) { + if (timedRound && roundElapsedUs >= roundDurationUs && + players.every((player) => player.alive)) + roundCause = "TIME"; + finishRound(now); + } +} + +function updateResultImpactDebris(dt) { + for (const impact of impacts) { + if (!impact.debris) { + const count = impact.death ? 20 : impact.explosion ? 24 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.death ? 920 : impact.explosion ? 1180 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 360, + vz: Math.sin(angle * 1.7) * force * .28, + radius: impact.death ? 7 : impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; mote.y += mote.vy * dt; mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); +} + +function circle(x, y, radius, width, color) { + let lastX = x + radius; + let lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + line(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; + lastY = nextY; + } +} + +// Discs are the piece's bulk geometry — every capsule end, every joint. The +// unit ring is constant, so the trig runs once at load, and fanning from a rim +// vertex covers the identical decagon in 8 faces instead of 10 from the center +// (cull is off, depth is flat, colors are flat — the rasterized pixels match). +// A silhouette only has to be as fine as its size on screen. A limb cap a few +// pixels across reads round at six sides; a head at ninety does not, and used +// to show its corners. Rings are precomputed per step so no trig runs inside a +// frame, and the small end is cheaper than the one fixed ring it replaces. +const discRings = [6, 8, 12, 16, 24, 32].map((sides) => { + const ring = []; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + ring.push(Math.cos(a), Math.sin(a)); + } + return ring; +}); +const discRingFor = (radius) => discRings[ + radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 + : radius < 52 ? 3 : radius < 110 ? 4 : 5]; + +function filledDisc(x, y, radius, color) { + const [r, g, b] = color; + if (typeof disc3d === "function" && disc3d(x, y, triangleDepth, radius, r, g, b)) return; + const ring = discRingFor(radius); + const originX = x + ring[0] * radius, originY = y + ring[1] * radius; + let lastX = x + ring[2] * radius, lastY = y + ring[3] * radius; + for (let side = 4; side < ring.length; side += 2) { + const nextX = x + ring[side] * radius; + const nextY = y + ring[side + 1] * radius; + screenTriangle(originX, originY, lastX, lastY, nextX, nextY, r, g, b); + lastX = nextX; + lastY = nextY; + } +} + +function filledRing(x, y, outerRadius, innerRadius, color) { + const [r, g, b] = color; + const sides = 14; + const inner = Math.max(0, Math.min(outerRadius, innerRadius)); + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + const outerA = { x: x + Math.cos(a) * outerRadius, + y: y + Math.sin(a) * outerRadius }; + const outerB = { x: x + Math.cos(b) * outerRadius, + y: y + Math.sin(b) * outerRadius }; + const innerA = { x: x + Math.cos(a) * inner, + y: y + Math.sin(a) * inner }; + const innerB = { x: x + Math.cos(b) * inner, + y: y + Math.sin(b) * inner }; + screenTriangle(outerA.x, outerA.y, innerA.x, innerA.y, + outerB.x, outerB.y, r, g, b); + screenTriangle(innerA.x, innerA.y, innerB.x, innerB.y, + outerB.x, outerB.y, r, g, b); + } +} + +function filledCapsule(x1, y1, x2, y2, width, color) { + const [r, g, b] = color; + const dx = x2 - x1; + const dy = y2 - y1; + const length = Math.hypot(dx, dy); + const radius = width / 2; + if (length < .001) { + filledDisc(x1, y1, radius, color); + return; + } + const nx = -dy / length * radius; + const ny = dx / length * radius; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + filledDisc(x1, y1, radius, color); + filledDisc(x2, y2, radius, color); +} + +// Xbox batches GPU triangles above its D2D line layer, so every bone and joint +// must share this triangle path. The wider silhouette pass and color pass form +// conventional rounded capsules without the native renderer reordering them. +function damagedPartColor(color, player, part) { + const damage = Number(player?.partDamage?.[part] || 0); + if (!damage) return color; + const durability = part === "torso" ? 3 : 2; + const amount = clamp(damage / durability * .92, 0, .92); + return mixColor(color, [244, 34, 50], amount); +} + +function generatedAppearance(player) { + const selected = globalThis.__oskiewarFighterAppearance; + if (!selected || Date.now() >= selected.validUntil || player?.pad !== 0 || player.npc || + netSession || roundViewer || versusLane() || survivalActive() || shellMode !== "GAME") return null; + return selected.appearance; +} +function generatedPartColor(appearance, segment) { + const role = segment.role || ""; + if (/foot/.test(role)) return appearance.shoes; + if (/thigh|shin|leg/.test(role)) return appearance.pants; + if (/forearm|hand/.test(role) && appearance.sleeves === "short") return appearance.skin; + return appearance.shirt; +} + +// Retained photographic materials use the same projected poses and collision +// surfaces as the vector theme. Assets are uploaded by the native host once. +let photoThemeActive = false; +let photoEffectsActive = false, photoWeaponsActive = false; +function roundGraphicsTheme() { + const requested = globalThis.__oskiewarGraphicsTheme; + if (requested === "flat" || requested === "photorealistic") return requested; + // Both peers already agree on map rotation; rendering needs no new wire state. + const round = Math.max(0, roundMapIds.indexOf(currentMapId)); + return Math.floor(round / 5) % 2 ? "flat" : "photorealistic"; +} +function refreshPhotoTheme() { + photoThemeActive = roundGraphicsTheme() === "photorealistic" && + typeof themeReady === "function" && typeof themeSprite === "function" && themeReady(); + photoEffectsActive = photoThemeActive && typeof themeAssetReady === "function" && themeAssetReady(2); + photoWeaponsActive = photoThemeActive && typeof themeAssetReady === "function" && themeAssetReady(3); +} +const photoExplosionFrames = [[24,64,400,400],[462,53,400,400], + [908,34,400,400],[1352,37,400,400],[37,458,400,400], + [472,453,400,400],[917,470,400,400],[1368,484,400,400]]; +const photoWeaponRegions = { grenade:[160,82,330,520], + launcher:[629,218,610,270], smg:[8,780,624,320], flash:[640,760,606,370] }; +function photoEffectSprite(asset, region, x, y, width, height, + angle = 0, flip = false, depth = triangleDepth, depthWrite = true) { + if (!(asset === 2 ? photoEffectsActive : photoWeaponsActive) || + ![x,y,width,height,angle,depth].every(Number.isFinite) || + width <= 0 || height <= 0 || width > 30000 || height > 30000 || + Math.abs(x) > 30000 || Math.abs(y) > 30000) return false; + return themeSprite(asset,...region,x,y,width,height,angle,flip, + clamp(depth,-1.49,1.49),depthWrite) !== false; +} +function photoExplosionFrame(age) { + return photoExplosionFrames[Math.min(7,Math.floor(clamp(age,0,1)*8))]; +} +function drawPhotoExplosion(x,y,radius,age,depth=triangleDepth) { + if (!photoEffectsActive || !Number.isFinite(age) || !Number.isFinite(radius)) return false; + const diameter = Math.min(1800,Math.max(12,radius*2.25)); + if (x+diameter/2<0 || y+diameter/2<0 || x-diameter/2>viewWidth() || y-diameter/2>viewHeight) return true; + return photoEffectSprite(2,photoExplosionFrame(age),x,y,diameter,diameter,0,false,depth,false); +} +// The caller owns the single readable WIN/LOSE/TIE word and all controls. +function drawPhotoRoundOutcome(result,age,x,y,width,height) { + refreshPhotoTheme(); + if (!photoEffectsActive || ![age,x,y,width,height].every(Number.isFinite) || width<=0 || height<=0) return false; + const win = String(result).toUpperCase()==="WIN"; + const phase = ((Math.max(0,age)%2.4)/2.4); + const frame = win ? phase : .55+phase*.45; + const size = Math.min(viewHeight*.46,Math.max(height*1.5,180)); + for (const side of [-1,1]) { + const cx = clamp(x+width/2+side*width*.46,size*.42,viewWidth()-size*.42); + photoEffectSprite(2,photoExplosionFrame(frame),cx,y+height*.48, + size,size,side*.22,side<0,-1.465,false); + } + return true; +} +function drawPhotoHeldWeapon(mode,hand,barrel,flip,depth) { + if (!photoWeaponsActive || !["RUBBER SMG","ROCKET LAUNCHER"].includes(mode)) return false; + const region = photoWeaponRegions[mode === "ROCKET LAUNCHER" ? "launcher" : "smg"]; + const dx=barrel.x-hand.x,dy=barrel.y-hand.y; + const angle=Math.atan2(dy,dx)-(flip?Math.PI:0),c=Math.cos(angle),s=Math.sin(angle); + const width=Math.max(24,Math.hypot(dx,dy)/.58),height=width*region[3]/region[2]; + const ox=(flip?-1:1)*width*.08,oy=-height*.25; + return photoEffectSprite(3,region,hand.x+ox*c-oy*s,hand.y+ox*s+oy*c, + width,height,angle,flip,depth,true); +} +const photoRegions = { + acHead: [80, 104, 285, 285], xboxHead: [524, 104, 285, 285], + acLimb: [1058, 48, 104, 372], xboxLimb: [1503, 48, 104, 372], + gun: [51, 543, 365, 253], skateboard: [460, 611, 412, 136], + platform: [900, 606, 418, 162], rocket: [1368, 542, 372, 236], + concrete: [970, 625, 270, 43], wall: [930, 698, 350, 55], +}; +function photoSprite(region, x, y, width, height, angle = 0, flip = false, + depth = triangleDepth) { + if (!photoThemeActive || ![x, y, width, height, angle, depth].every(Number.isFinite) || + width <= 0 || height <= 0 || width > 30000 || height > 30000 || + Math.abs(x) > 30000 || Math.abs(y) > 30000) return false; + return themeSprite(1, ...photoRegions[region], x, y, width, height, + angle, flip, depth) !== false; +} +function photoLimb(segment, seat) { + const dx = segment.x2 - segment.x1, dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy); + if (length < .001) return; + const width = Math.max(2, segment.width); + photoSprite(seat === 0 ? "acLimb" : "xboxLimb", + (segment.x1 + segment.x2) / 2, (segment.y1 + segment.y2) / 2, + width, length + width, + Math.atan2(dy, dx) - Math.PI / 2); +} +function photoSurface(region, a, b, c, d) { + // Tall structural faces keep their shaded map color. Stretching a thin + // texture strip over them made the back of the arena look like a curtain. + if (region === "wall") return false; + if (!photoThemeActive || typeof themeQuad !== "function") return false; + const points = [a, b, c, d]; + if (points.some(p => ![p.x,p.y,p.z].every(Number.isFinite) || + Math.abs(p.x) > 30000 || Math.abs(p.y) > 30000)) return false; + // Structural faces use the material atlas, never a stretched skybox crop. + return themeQuad(1, ...photoRegions[region], + a.x,a.y,a.z, b.x,b.y,b.z, c.x,c.y,c.z, d.x,d.y,d.z) !== false; +} + +function drawSkeletonSegments(segments, color, outline, player = null) { + if (photoThemeActive && player) { + for (const segment of segments) + if (!segment.hitboxOnly) photoLimb(segment, player.pad); + return; + } + const edge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + if (player?.skateboard) segments = segments.slice().sort((a, b) => b.depth - a.depth); + for (const segment of segments) { + if (segment.hitboxOnly) continue; + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + edge * 2, outline); + } + for (const [index, segment] of segments.entries()) { + if (segment.hitboxOnly) continue; + const appearance = generatedAppearance(player); + drawPaletteCapsule(segment, appearance ? null : player && !player.npc + ? player.handleColors : null, index, appearance ? generatedPartColor(appearance, segment) : color, player); + } +} + +function paletteColorAt(colors, coordinate, fallback) { + if (!colors?.length) return fallback; + const wrapped = ((coordinate % colors.length) + colors.length) % colors.length; + const first = Math.floor(wrapped); + const second = (first + 1) % colors.length; + return mixColor(colors[first], colors[second], wrapped - first); +} + +function drawPaletteCapsule(segment, colors, coordinate, fallback, player = null) { + // The gradient's resolution is an experiment dial: six bands is the look, + // one band is a flat capsule at a third of the faces. + const bands = colors?.length > 1 + ? clamp(Math.round(renderFlags.bands ?? 6), 1, 6) : 1; + if (bands === 1) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width, damagedPartColor(fallback, player, segment.part)); + return; + } + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy) || 1; + const radius = segment.width / 2; + const nx = -dy / length * radius; + const ny = dx / length * radius; + let firstColor = fallback; + let lastColor = fallback; + for (let band = 0; band < bands; band++) { + const from = band / bands; + const to = (band + 1) / bands; + // A small overlap keeps the gradient continuous after integer projection. + const overlap = bands > 1 ? .012 : 0; + const x1 = lerp(segment.x1, segment.x2, Math.max(0, from - overlap)); + const y1 = lerp(segment.y1, segment.y2, Math.max(0, from - overlap)); + const x2 = lerp(segment.x1, segment.x2, Math.min(1, to + overlap)); + const y2 = lerp(segment.y1, segment.y2, Math.min(1, to + overlap)); + const mapped = paletteColorAt(colors, + coordinate + (from + to) * .5, fallback); + const color = damagedPartColor(mapped, player, segment.part); + if (band === 0) firstColor = color; + if (band === bands - 1) lastColor = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, ...color); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, ...color); + } + filledDisc(segment.x1, segment.y1, radius, firstColor); + filledDisc(segment.x2, segment.y2, radius, lastColor); +} + +function distantFighterLocator(player, head) { + if (!player?.alive || shellMode !== "GAME" || head.radius >= 12 || + ![head.x, head.y, head.radius].every(Number.isFinite)) return null; + const safe = actionSafeRect(); + const size = compactLayout() ? 24 : 28; + const fullName = visibleHandle(player); + const label = fullName.length > 16 ? fullName.slice(0, 14) + ".." : fullName; + const width = handleWidth(label, size) + 24; + const height = size + 12; + // Leave the top controls/debug block and bottom player/music HUD clear. + const top = Math.max(safe.top + 64, viewHeight * .24); + const bottom = Math.min(safe.bottom - 96, viewHeight * .78); + const anchorX = clamp(head.x, safe.left + 10, safe.right - 10); + const anchorY = clamp(head.y, safe.top + 10, safe.bottom - 10); + const x = clamp(anchorX - width / 2, safe.left + 8, safe.right - width - 8); + // All labels sit above their fighter; stagger nearby seats vertically. + const offset = -height - 24 - (player.pad === 0 ? height + 8 : player.pad === 2 ? 2 * (height + 8) : 0); + const y = clamp(anchorY + offset, top, bottom - height); + return { x, y, width, height, size, label, anchorX, anchorY, color: player.color }; +} + +function drawDistantFighterLocator(player, head) { + const marker = distantFighterLocator(player, head); + if (!marker) return; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + try { + const { x, y, width, height, anchorX: ax, anchorY: ay, color } = marker; + const edgeY = ay < y ? y : y + height; + filledCapsule(ax, ay - Math.max(4, head.radius) - 5, + clamp(ax, x + 10, x + width - 10), edgeY, 1.5, color); + typeWrite(marker.label, x + 14, y + 9, marker.size, 4, 5, 12); + typeWrite(marker.label, x + 12, y + 6, marker.size, ...color); + } finally { triangleDepth = previousDepth; } +} + +function drawFighterSilhouette(geometry, color, outline, player = null) { + drawSkeletonSegments(geometry.segments, color, outline, player); + if (photoThemeActive && player) { + const head = geometry.head, seat = player.pad === 0 ? 0 : 1; + const radius = Math.max(2, head.radius); + photoSprite(seat ? "xboxHead" : "acHead", head.x, head.y, + radius * 2, radius * 2, + isHeadOnly(player) ? player.headRoll || 0 : player.skateRotation || 0, + (seat === 0 ? 1 : -1) !== (player.facing || 1), triangleDepth - .01); + return; + } + const headEdge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + // The neck connector and solid head are emitted into the same triangle + // silhouette pass, so the head cannot detach as a separate line-layer ring. + filledDisc(geometry.head.x, geometry.head.y, + geometry.head.radius + headEdge, outline); + // AC stores the @ glyph first; the face is the identity anchor for the same + // palette that distorts continuously across the body below it. + const appearance = generatedAppearance(player); + const headColor = appearance ? appearance.skin : player && !player.npc && player.handleColors?.length + ? player.handleColors[0] : color; + filledDisc(geometry.head.x, geometry.head.y, geometry.head.radius, headColor); + if (appearance) { + const { x, y, radius: r } = geometry.head; + if (appearance.hairStyle !== "none") { + filledCapsule(x - r * .7, y - r * .65, x + r * .7, y - r * .65, + r * (appearance.hairStyle === "curly" ? .75 : .48), appearance.hair); + if (appearance.hairStyle === "long") for (const side of [-1, 1]) + filledCapsule(x + side * r * .86, y - r * .3, x + side * r * .86, y + r * .85, r * .3, appearance.hair); + } + if (appearance.beard) filledCapsule(x - r * .4, y + r * .68, x + r * .4, y + r * .68, r * .4, appearance.hair); + if (appearance.glasses) { + for (const side of [-1, 1]) hudCircle(x + side * r * .34, y - r * .08, r * .23, Math.max(1, r * .08), [18, 20, 28]); + filledCapsule(x - r * .1, y - r * .08, x + r * .1, y - r * .08, Math.max(1, r * .06), [18, 20, 28]); + } + } + if (player && isHeadOnly(player)) { + // The shell rolls from distance travelled while the face is drawn later in + // stable screen space. A visible chord makes circular geometry's rotation + // readable without tumbling the eyes or changing their gaze. + const angle = player.x / Math.max(12, geometry.head.radius) + + player.facing * Math.PI * .18; + const reach = geometry.head.radius * .7; + const dx = Math.cos(angle) * reach; + const dy = Math.sin(angle) * reach; + filledCapsule(geometry.head.x - dx, geometry.head.y - dy, + geometry.head.x + dx, geometry.head.y + dy, + Math.max(2, geometry.head.radius * .1), mixColor(headColor, outline, .55)); + } +} + +function fighterAnimationPhase(player, now = null) { + const run = runtime(); + now ??= run.simMonotonicUs || run.monotonicUs; + let state = "IDLE"; + let stateStartedAt = startedAt; + if (!player.alive) { + state = "KO"; + stateStartedAt = player.headBustedAt || player.lastButtonAt || now; + } else if (now < player.hitStunUntil) { + state = "HIT"; + stateStartedAt = player.lastButtonAt || now; + } else if (roundResult && ["KICK", "PUNCH", "POSE", "DANCE", "DASH", + "JUMP", "CROUCH"].includes(player.resultReaction)) { + state = player.resultReaction === "POSE" || player.resultReaction === "DANCE" + ? "MEDITATE" : player.resultReaction; + stateStartedAt = player.resultReactionAt || now; + } else if (player.blocking) { + state = "SHIELD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.heldBall >= 0) { + state = "HOLD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.grabHeld) { + state = "REACH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.itemAction && now < player.itemActionUntil) { + state = player.itemAction; + stateStartedAt = player.itemActionStartedAt || now; + } else if (player.attackKind && now < player.attackUntil) { + state = player.attackKind; + stateStartedAt = player.attackStartedAt || now; + } else if (isPogo(player)) { + state = "POGO"; + } else if (now < player.sinkUntil) { + state = "SINK"; + stateStartedAt = player.sinkUntil - sinkDurationUs; + } else if (!player.grounded && now < player.hopUntil) { + state = "CROUCH HOP"; + stateStartedAt = player.hopUntil - crouchHopPoseUs; + } else if (player.ducking) { + state = player.grounded ? "CROUCH" : "AIR CROUCH"; + } else if (!player.grounded) { + state = player.vy < 0 ? "JUMP" : "FALL"; + stateStartedAt = player.jumpPoseUntil + ? player.jumpPoseUntil - (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs) + : player.lastButtonAt || now; + } else if (shellMode === "MENU" && titleAttractMode === "still") { + state = "MEDITATE"; + } else if (now < player.dashUntil) { + state = "DASH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.runSince) { + state = "RUN"; + stateStartedAt = player.runSince; + } else if (Math.abs(player.vx) > 40) { + state = "WALK"; + } + const [authoredSteps, authoredTicksPerStep, basePhase, loop] = + fighterAnimationSpecs[state] || fighterAnimationSpecs.IDLE; + const timing = meleeFrames[state]; + const steps = timing ? timing.startup+timing.active+timing.recovery : authoredSteps; + // Descending terrain advances planted-foot exchanges faster. The result is + // still integer-tick animation, but the legs keep pace with downhill speed + // instead of the body skating through a leisurely flat-ground cycle. + const travel = Math.sign(player.vx); + const downhill = player.grounded && travel + ? Math.max(0, terrainFloorAt(player.x + travel * 150) - + terrainFloorAt(player.x)) / 150 : 0; + const ticksPerStep = ["WALK", "RUN", "DASH"].includes(state) + ? Math.max(1, Math.round(authoredTicksPerStep / + (1 + downhill * 1.9 + Math.min(1, Math.abs(player.vx) / 1800) * .28))) + : authoredTicksPerStep; + const rawTick = Math.max(0, + Math.floor((now - stateStartedAt) / replayTickUs)); + const rawStep = Math.floor(rawTick / ticksPerStep); + const step = loop ? rawStep % steps : Math.min(steps - 1, rawStep); + let phase = basePhase; + if (timing) phase = meleeFrame(player,now).phase.toUpperCase(); + else if (["FIRE", "THROW", "REACH"].includes(state)) { + const section = step / Math.max(1, steps - 1); + phase = section < .3 ? "STARTUP" : section < .68 ? "ACTIVE" : "RECOVERY"; + } else if (state === "JUMP" || state === "FALL") { + phase = Math.abs(player.vy) < 150 ? "APEX" : state === "JUMP" + ? "ASCEND" : "DESCEND"; + } + // `frameNow` is the clock, not the cycle. It has to keep climbing with real + // time — the looping states anchor `stateStartedAt` at match start, so a + // cycle-position clock wraps back to the first second forever and every + // "is this timestamp still in the future" test answers yes for the rest of + // the round. That is what pinned a landed fighter in the crouch pose and + // froze the legs. Quantizing to the tick grid keeps the pose on the sim's + // 60 Hz phase without inventing in-between frames. + return { state, phase, step: step + 1, steps, tick: rawTick, + ticksPerStep, progress: step / Math.max(1, steps - 1), + frameNow: stateStartedAt + rawTick * replayTickUs }; +} + +// Only share poses during one interpolated paint. Simulation and rollback +// always rebuild, because a hit may change limbs between queries in one tick. +const renderPoses = new Map(); +let sharingRenderPoses = false; +function runnerWorldGeometry(player, t) { + const cached = sharingRenderPoses && renderPoses.get(player); + if (cached && (!player.spiderDummy || cached.t === t)) return cached.pose; + const pose = buildRunnerWorldGeometry(player, t); + if (player.skateRotation) { + const c = Math.cos(player.skateRotation), s = Math.sin(player.skateRotation); + const rotate = (x, y) => ({ x: player.x + (x - player.x) * c - (y - player.y) * s, + y: player.y + (x - player.x) * s + (y - player.y) * c }); + Object.assign(pose.head, rotate(pose.head.x, pose.head.y)); + for (const segment of pose.segments) { + const a = rotate(segment.x1, segment.y1), b = rotate(segment.x2, segment.y2); + segment.x1 = a.x; segment.y1 = a.y; segment.x2 = b.x; segment.y2 = b.y; + } + } + if (sharingRenderPoses) renderPoses.set(player, { t, pose }); + return pose; +} + +function buildRunnerWorldGeometry(player, t, at = null) { + if (player.spiderDummy) return spiderDummyWorldGeometry(player, t); + // Rendering consumes the same fixed 60 Hz phase clock as simulation. The + // display can remain uncapped without inventing in-between combat poses. + const animation = fighterAnimationPhase(player, at); + const poseNow = animation.frameNow; + const poseCycle = animation.progress * Math.PI * 2; + const speed = Math.min(1, Math.abs(player.vx) / 1500); + const meditating = shellMode === "MENU" && titleTransitionAt === null && + titleAttractMode === "still"; + const idle = player.grounded && !player.ducking && speed < .03; + const breath = idle ? Math.sin(poseCycle + player.pad * .7) * 5 : 0; + const idleSway = idle ? Math.sin(poseCycle + player.pad) * 7 : 0; + const stride = Math.sin(poseCycle + player.pad * Math.PI) * + 32 * speed; + const pogo = isPogo(player); + const headOnly = isHeadOnly(player); + const noLegs = !hasPart(player, "left-leg") && + !hasPart(player, "right-leg") && !headOnly; + const jumpAnticipation = player.jumpLaunchAt > poseNow + ? clamp(1 - (player.jumpLaunchAt - poseNow) / jumpAnticipationUs, 0, 1) : 0; + const landingRecovery = player.landPoseUntil > poseNow + ? clamp((player.landPoseUntil - poseNow) / 110000, 0, 1) : 0; + const crouchPose = clamp(Math.max(player.crouchBlend || 0, + Math.sin(jumpAnticipation * Math.PI) * .72, + landingRecovery * .45, noLegs ? .45 : 0), 0, 1); + const height = lerp(180, 108, crouchPose); + const formDrop = pogo ? 54 : noLegs ? 31 : 0; + const aimPose = player.itemAimLocked || player.gunAimLive + ? player.gunAimX || player.facing : 0; + const lean = player.facing * (idle ? 5 : 3 + speed * 10) + aimPose * 7; + const x = player.x; + const feet = player.y; + const z = player.z; + // With neither leg present the pelvis itself becomes the ground contact. + // Keeping its capsule tangent to the floor prevents a floating torso pose. + const hipY = noLegs ? feet - 5 + : feet - lerp(58, 40, crouchPose) + formDrop; + const neckX = x + lean; + const neckY = feet - height + 54 - breath + formDrop + + (player.itemAimLocked || player.gunAimLive + ? (player.gunAimY || 0) * 8 : 0); + const attackPulse = meleePulse(player, poseNow); + const head = headOnly + ? { x, y: feet - 22, z, radius: 22 } + : { x: neckX + lean * .2, + y: feet - height + 22 - breath * 1.6 + formDrop, z, radius: 22 }; + const segments = []; + // `startMelee` and `heldItem` both gate on `itemHand`, so the drawn striking + // arm has to name that same part. Naming it by facing alone tagged the + // reaching capsules with the opposite arm the moment a fighter turned around + // while armed — shooting off one arm then erased the other one's limb. + const actionArm = itemHand(player) || + (player.facing > 0 ? "right-arm" : "left-arm"); + const rearArm = actionArm === "right-arm" ? "left-arm" : "right-arm"; + const actionLeg = player.facing > 0 ? "right-leg" : "left-leg"; + const rearLeg = actionLeg === "right-leg" ? "left-leg" : "right-leg"; + const partForRole = (role, startX) => { + if (["neck", "torso", "shoulders"].includes(role)) return "torso"; + if (role.startsWith("attack-") || role.startsWith("item-")) + return role.includes("arm") || role.includes("forearm") + ? actionArm : actionLeg; + if (role.startsWith("rest-")) return rearArm; + if (role.startsWith("lead-")) return actionLeg; + if (role.startsWith("rear-")) + return role.includes("arm") || role.includes("forearm") + ? rearArm : rearLeg; + if (role.startsWith("grab-")) + return startX <= neckX ? "left-arm" : "right-arm"; + if (role.startsWith("left-")) + return role.includes("arm") || role.includes("forearm") + ? "left-arm" : "left-leg"; + if (role.startsWith("right-")) + return role.includes("arm") || role.includes("forearm") + ? "right-arm" : "right-leg"; + return "torso"; + }; + const segment = (x1, y1, x2, y2, width, role = "body") => { + const part = partForRole(role, x1); + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1: z, x2, y2, z2: z, width, role, part }); + }; + const twoBone = (startX, startY, targetX, targetY, length, bend) => { + let dx = targetX - startX; + let dy = targetY - startY; + let distance = Math.hypot(dx, dy) || 1; + const maximum = length * 1.94; + if (distance > maximum) { + targetX = startX + dx / distance * maximum; + targetY = startY + dy / distance * maximum; + dx = targetX - startX; + dy = targetY - startY; + distance = maximum; + } + const middleX = (startX + targetX) / 2; + const middleY = (startY + targetY) / 2; + const height = Math.sqrt(Math.max(0, length * length - + distance * distance / 4)); + return { jointX: middleX - dy / distance * height * bend, + jointY: middleY + dx / distance * height * bend, + targetX, targetY }; + }; + // Where a grounded foot may actually plant. The bare terrain probe reads + // the arena floor, so a fighter standing on a rung planted his feet a + // storey down and the shins stretched to reach — the long legs @jeffrey + // called out. The probe now asks for the surface the fighter is actually + // standing on, and a foot hanging past a rung's lip stops at the leg's own + // reach — a short dangle — instead of the floor below. + const footPlant = (footX) => Math.min(surfaceYAt(footX, feet), feet + 20); + segment(head.x, head.y + head.radius * .78, neckX, neckY, 10, "neck"); + segment(neckX, neckY, x, hipY, 10, "torso"); + // An elbow sags downward whichever way the hand actually reaches. Bending + // by facing alone flipped the joint whenever a hand crossed behind the + // body — the crossed, double-elbowed arms @jeffrey called out. + const armBend = (shoulderX, targetX) => targetX >= shoulderX ? 1 : -1; + const shoulderY = neckY + 11; + const shoulderSpread = 12; + const leftShoulderX = neckX - shoulderSpread; + const rightShoulderX = neckX + shoulderSpread; + // The working hand always reaches out front and the idle one always trails + // behind, so both shoulders follow facing. Anchoring them on the arm that + // owns the item instead meant a fighter who armed himself facing right and + // then turned around hung his reaching arm off the rear shoulder and his + // trailing arm off the front one: the pair crossed once at the neck and + // again past the elbows, boxing the double diamond @jeffrey called out. + const actionShoulderX = neckX + player.facing * shoulderSpread; + const restShoulderX = neckX - player.facing * shoulderSpread; + segment(leftShoulderX, shoulderY, rightShoulderX, shoulderY, 10, + "shoulders"); + if (player.attackKind === "KICK" && attackPulse > 0) { + const target = meleeTarget(player, poseNow); + const lowKick = player.lowKick; + const leg = twoBone(x, hipY, target.x, target.y, + meleeSpecs.KICK.span, lowKick ? player.facing * .35 : -player.facing); + segment(x, hipY, leg.jointX, leg.jointY, 12, "attack-thigh"); + segment(leg.jointX, leg.jointY, leg.targetX, leg.targetY, 12, + "attack-shin"); + segment(x, hipY, x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), 10, "rear-thigh"); + segment(x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), x - player.facing * 8, feet, + 10, "rear-shin"); + } else if (meditating) { + segment(x, hipY, x - 48, feet - 12, 11, "left-thigh"); + segment(x - 48, feet - 12, x + 8, feet, 11, "left-shin"); + segment(x, hipY, x + 48, feet - 12, 11, "right-thigh"); + segment(x + 48, feet - 12, x - 8, feet, 11, "right-shin"); + } else if (player.skateboard) { + // The deck is drawn tilted along the terrain, so each foot plants on + // the deck's own top at its x — flat foot heights ran the board + // through the shins on every slope. + const deckAt = (footX) => footPlant(footX) - 6; + const plantedX = x + player.facing * 28; + const push = Math.sin(poseCycle) * 34; + const leadFootX = plantedX + player.facing * 18; + segment(x, hipY, plantedX, deckAt(plantedX) - 21, 11, "lead-thigh"); + segment(plantedX, deckAt(plantedX) - 21, leadFootX, + deckAt(leadFootX), 11, "lead-shin"); + const pushKnee = x - player.facing * (22 + push * .3); + const pushFootX = x - player.facing * (46 + Math.max(0, push)); + segment(x, hipY, pushKnee, deckAt(pushKnee) - 25, 10, "rear-thigh"); + segment(pushKnee, deckAt(pushKnee) - 25, pushFootX, + deckAt(pushFootX), 10, "rear-shin"); + } else if (crouchPose > .08) { + segment(x, hipY, x - 36, feet - 22, 10, "left-thigh"); + segment(x - 36, feet - 22, x - 4, feet, 10, "left-shin"); + segment(x, hipY, x + 36, feet - 22, 10, "right-thigh"); + segment(x + 36, feet - 22, x + 58, feet, 10, "right-shin"); + } else if (player.grounded) { + // The facing-side foot is visibly planted forward even at rest. + const leadKnee = x + player.facing * 18 + stride * .38; + const leadFoot = x + player.facing * 42 + stride; + const rearKnee = x - player.facing * 16 - stride * .38; + const rearFoot = x - player.facing * 28 - stride; + // The animation phase still chooses the discrete stride; ground probes + // constrain that frame onto the surface underfoot without new sim steps. + const leadGround = footPlant(leadFoot); + const rearGround = footPlant(rearFoot); + segment(x, hipY, leadKnee, leadGround - 30, 10, "lead-thigh"); + segment(leadKnee, leadGround - 30, leadFoot, leadGround, 10, "lead-shin"); + segment(x, hipY, rearKnee, rearGround - 30, 10, "rear-thigh"); + segment(rearKnee, rearGround - 30, rearFoot, rearGround, 10, "rear-shin"); + } else { + segment(x, hipY, x - 32, feet - 32, 10, "left-thigh"); + segment(x - 32, feet - 32, x - 7, feet - 11, 10, "left-shin"); + segment(x, hipY, x + 32, feet - 43, 10, "right-thigh"); + segment(x + 32, feet - 43, x + 50, feet - 22, 10, "right-shin"); + } + const arm = idle ? idleSway : player.grounded ? -stride * .7 : 12; + const elbowY = feet - lerp(94, 76, crouchPose) - breath; + const handY = feet - lerp(65, 50, crouchPose) - breath * .5; + const actionNow = poseNow; + const armAttack = attackPulse > 0 && player.attackKind && + player.attackKind !== "KICK"; + if (player.skateboard && player.grounded && !armAttack && !heldItem(player)) { + const balance = Math.sin(poseCycle) * 18; + segment(leftShoulderX, shoulderY, x - 42, elbowY - 10 - balance, + 10, "left-upper-arm"); + segment(x - 42, elbowY - 10 - balance, x - 66, handY - balance, + 10, "left-forearm"); + segment(rightShoulderX, shoulderY, x + 42, elbowY - 10 + balance, + 10, "right-upper-arm"); + segment(x + 42, elbowY - 10 + balance, x + 66, handY + balance, + 10, "right-forearm"); + } else if (player.grabHeld || player.ropeIndex >= 0) { + const held = player.heldBall >= 0 ? balls[player.heldBall] : null; + const clutchX = player.ropeIndex >= 0 ? x : held?.x ?? x + player.facing * 126; + const clutchY = player.ropeIndex >= 0 ? feet - 125 : held?.y ?? feet - 92; + const spread = held ? Math.max(12, held.radius * .34) : 20; + const hands = [ + { shoulderX: leftShoulderX, x: clutchX - player.facing * 5, + y: clutchY - spread }, + { shoulderX: rightShoulderX, x: clutchX - player.facing * 5, + y: clutchY + spread }, + ]; + for (const hand of hands) { + const pose = twoBone(hand.shoulderX, shoulderY, + hand.x, hand.y, 58, armBend(hand.shoulderX, hand.x)); + segment(hand.shoulderX, shoulderY, pose.jointX, pose.jointY, 12, + "grab-upper-arm"); + segment(pose.jointX, pose.jointY, pose.targetX, pose.targetY, 12, + "grab-forearm"); + } + } else if (armAttack) { + // The striking arm outranks the carry pose: a whip or bash has to publish + // attack capsules or an armed fighter could never land a hand strike. + const target = meleeTarget(player, poseNow); + const armPose = twoBone(actionShoulderX, shoulderY, target.x, target.y, + meleeSpecFor(player, player.attackKind).span, + armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "attack-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "attack-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else if ((player.itemAction && actionNow < player.itemActionUntil) || + (player.gunAmmo > 0 && player.itemAction !== "THROW")) { + const target = itemHandTarget(player, actionNow); + const armPose = twoBone(actionShoulderX, shoulderY, + target.x, target.y, 58, armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "item-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "item-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else { + segment(leftShoulderX, shoulderY, x - 30 + arm * .45, elbowY, 10, + "left-upper-arm"); + segment(x - 30 + arm * .45, elbowY, x - 36 + arm * .6, handY, 10, + "left-forearm"); + segment(rightShoulderX, shoulderY, x + 30 - arm * .45, elbowY, 10, + "right-upper-arm"); + segment(x + 30 - arm * .45, elbowY, x + 36 - arm * .6, handY, 10, + "right-forearm"); + } + if (player.skateboard && !headOnly) { + const deck = skateFrame(player); + const pitch = (player.skatePitch || 0) * .35; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const transform = (px, py, depth) => ({ + x: x + (px - x) * c - (py - feet) * sn, + y: feet - skateAxleDrop - skateWheelRadius + (px - x) * sn + (py - feet) * c, + z: z + depth, + }); + Object.assign(head, transform(head.x, head.y, 0)); + for (const bone of segments) { + const side = bone.part.startsWith("left-") ? -1 : bone.part.startsWith("right-") ? 1 : 0; + const depth = side * (bone.part.includes("arm") ? 15 : 9); + const a = transform(bone.x1, bone.y1, depth); + const b = transform(bone.x2, bone.y2, depth); + if (bone.role === "shoulders") { + a.z = z - 15; + b.z = z + 15; + } + Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, x2: b.x, y2: b.y, z2: b.z }); + } + if (player.attackKind !== "KICK" || !attackPulse) { + for (const [role, direction, part] of [["lead", player.facing, actionLeg], + ["rear", -player.facing, rearLeg]]) { + if (!hasPart(player, part)) continue; + const side = part === "left-leg" ? -1 : 1; + const hip = transform(x, hipY, side * 7); + const foot = deck(direction * skateTruck, -4, side * 9); + const dx = foot.x - hip.x, dy = foot.y - hip.y, dz = foot.z - hip.z; + const distance = Math.hypot(dx, dy, dz) || 1; + const length = Math.max(48, distance / 1.98); + const bend = Math.sqrt(Math.max(0, length * length - distance * distance / 4)); + const norm = Math.hypot(dx, dy) || 1; + const knee = { x: (hip.x + foot.x) / 2 + dy / norm * bend * player.facing, + y: (hip.y + foot.y) / 2 - dx / norm * bend * player.facing, + z: (hip.z + foot.z) / 2 }; + const thigh = segments.find((bone) => bone.role === role + "-thigh"); + const shin = segments.find((bone) => bone.role === role + "-shin"); + for (const [bone, a, b] of [[thigh, hip, knee], [shin, knee, foot]]) + if (bone) Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, + x2: b.x, y2: b.y, z2: b.z }); + } + } + } + return { head, segments }; +} + +// The first spider dummy deliberately shares the inert dummy controller. Its +// threat is physical scale: four independently destructible leg-pairs spread +// across a daddy-long-legs silhouette around one large central body. +function spiderDummyWorldGeometry(player, t) { + const x = player.x; + const feet = player.y; + const z = player.z; + const bodyY = feet - 176; + const sway = Math.sin(t * 1.7 + player.pad) * 5; + const head = { x, y: bodyY + sway, z, radius: 22 }; + const segments = []; + const add = (x1, y1, x2, y2, width, role, part, + z1 = z, z2 = z, hitboxOnly = false) => { + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1, x2, y2, z2, width, role, part, hitboxOnly }); + }; + add(x - 42, bodyY, x + 42, bodyY, 38, "torso", "torso"); + add(x, bodyY - 30, x, bodyY + 31, 34, "spider-body", "torso"); + const legs = [ + [-1, -1], [-1, -.55], [-1, .25], [-1, .72], + [1, -1], [1, -.55], [1, .25], [1, .72], + ]; + for (let index = 0; index < legs.length; index++) { + const [side, lane] = legs[index]; + const part = spiderLegParts[index]; + const rootX = x + side * 31; + const rootY = bodyY + lane * 31 + sway; + const lift = 34 + Math.abs(lane) * 28; + const depthLane = (index - 3.5) * 72; + const points = [ + [rootX, rootY, z + depthLane * .2], + [x + side * 76, bodyY - lift, z + depthLane * .48], + [x + side * 126, bodyY - lift * .42, z + depthLane * .72], + [x + side * 171, bodyY + 24 + Math.abs(lane) * 19, z + depthLane], + [x + side * 211, feet - 51 - (index % 2) * 12, z + depthLane * 1.08], + [x + side * 246, feet, z + depthLane], + ]; + for (let joint = 0; joint < points.length - 1; joint++) { + const [x1, y1, z1] = points[joint]; + const [x2, y2, z2] = points[joint + 1]; + add(x1, y1, x2, y2, 13 - joint, + `spider-leg-${index + 1}-segment-${joint + 1}`, part, z1, z2); + } + // One broad top-level combat proxy per complete leg keeps the boss + // readable to melee even though the visible joints fan through Z. + add(rootX, rootY, points.at(-1)[0], points.at(-1)[1], 32, + `spider-hitbox-${index + 1}`, part, z, z, true); + } + return { head, segments }; +} + +function runnerGeometry(player, t) { + return projectRunnerWorldGeometry(runnerWorldGeometry(player, t)); +} + +function projectRunnerWorldGeometry(world) { + const headPoint = projectPoint(world.head.x, world.head.y, world.head.z); + return { + head: { x: headPoint.x, y: headPoint.y, + radius: Math.max(1.5, world.head.radius * cameraScale()) }, + segments: world.segments.map((segment) => { + const a = projectPoint(segment.x1, segment.y1, segment.z1); + const b = projectPoint(segment.x2, segment.y2, segment.z2); + return { x1: a.x, y1: a.y, x2: b.x, y2: b.y, depth: (a.z + b.z) / 2, + width: Math.max(1.5, segment.width * cameraScale()), + role: segment.role, part: segment.part, + hitboxOnly: segment.hitboxOnly }; + }), + }; +} + +function runnerBounds(player, t) { + const geometry = runnerWorldGeometry(player, t); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function runnerScreenBounds(player, t) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + const geometry = projectRunnerWorldGeometry(world); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function fighterContainmentRequiredWidth(t) { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + const include = (x, y, radius) => { + left = Math.min(left, x - radius); + right = Math.max(right, x + radius); + top = Math.min(top, y - radius); + bottom = Math.max(bottom, y + radius); + }; + for (const player of activePlayers()) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + include(world.head.x, world.head.y, world.head.radius); + for (const segment of world.segments) { + const radius = segment.width / 2; + include(segment.x1, segment.y1, radius); + include(segment.x2, segment.y2, radius); + } + } + return Math.max(rectPackWidth({ left, right, top, bottom }), + frameFloorWidth()); +} + +// Final render invariant: both complete animated fighter geometries must fit +// inside the action-safe viewport. Camera modes may orbit or focus, but this +// aspect-aware correction recenters their shared frame and moves the dolly +// back far enough for landscape, portrait, live, and replay projection alike. +function containFighters(t) { + if (skateparkMap && !survivalActive()) return; + const gameplayContainment = !roundResult && + runtime().monotonicUs - roundStartedAt >= roundIntroDurationUs(); + if (gameplayContainment) { + cameraContainFloor = Math.max(cameraContainFloor, + fighterContainmentRequiredWidth(t) * 1.11); + return; + } + const worlds = activePlayers().map((player) => player.replayGeometry || + player.frozenGeometry || runnerWorldGeometry(player, t)); + if (!worlds.length) return; + const points = []; + for (const world of worlds) { + const { head } = world; + points.push( + { x: head.x - head.radius, y: head.y, z: head.z }, + { x: head.x + head.radius, y: head.y, z: head.z }, + { x: head.x, y: head.y - head.radius, z: head.z }, + { x: head.x, y: head.y + head.radius, z: head.z }, + ); + for (const segment of world.segments) { + const radius = segment.width / 2; + for (const endpoint of [ + { x: segment.x1, y: segment.y1, z: segment.z1 }, + { x: segment.x2, y: segment.y2, z: segment.z2 }, + ]) { + points.push( + { x: endpoint.x - radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x + radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y - radius, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y + radius, z: endpoint.z }, + ); + } + } + } + const minX = Math.min(...points.map((point) => point.x)); + const maxX = Math.max(...points.map((point) => point.x)); + const minY = Math.min(...points.map((point) => point.y)); + const maxY = Math.max(...points.map((point) => point.y)); + // Keep the smoothly tracked root target. Animated limb extrema are allowed + // to affect containment scale, but never camera aim. + const target = cameraDoll.target; + + const safe = actionSafeRect(); + const safeWidth = Math.max(1, safe.right - safe.left); + const safeHeight = Math.max(1, safe.bottom - safe.top); + const requiredWidth = Math.max( + rectPackWidth({ left: minX, right: maxX, top: minY, bottom: maxY }), + frameFloorWidth()); + if (requiredWidth > cameraDoll.width) { + const amount = requiredWidth / Math.max(1, cameraDoll.width) * 1.04; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + + // Perspective and z-depth can make the world-space estimate asymmetric. + // Iteratively measure the actual projection and expand along the existing + // camera ray until every point satisfies the screen-space safe rectangle. + const centerX = (safe.left + safe.right) / 2; + const centerY = (safe.top + safe.bottom) / 2; + for (let pass = 0; pass < 4; pass++) { + cameraDoll.dirty = true; + cameraDoll.prepare(); + const projected = points.map((point) => cameraDoll.project(point)); + const left = Math.min(...projected.map((point) => point.x)); + const right = Math.max(...projected.map((point) => point.x)); + const top = Math.min(...projected.map((point) => point.y)); + const bottom = Math.max(...projected.map((point) => point.y)); + const factor = Math.max(1, + (centerX - left) / (safeWidth / 2), + (right - centerX) / (safeWidth / 2), + (centerY - top) / (safeHeight / 2), + (bottom - centerY) / (safeHeight / 2)); + if (factor <= 1.001) break; + const amount = factor * 1.025; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + cameraDoll.dirty = true; +} + +function resolveRunnerBounds(player, t) { + // Walls use a stable pushbox independent of the character renderer. + const halfWidth = isHeadOnly(player) ? 24 : isPogo(player) ? 38 + : player.ducking ? 76 : 62; + const leftWall = worldLeft + wallThickness; + const rightWall = worldRight - wallThickness; + if (player.x - halfWidth < leftWall) { + player.x = leftWall + halfWidth; + if (player.skateboard && player.grounded && player.skateVx < -900) { + player.skateWallSide = -1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, -1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx < 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.max(0, player.vx); + player.knockVx = Math.max(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + if (player.x + halfWidth > rightWall) { + player.x = rightWall - halfWidth; + if (player.skateboard && player.grounded && player.skateVx > 900) { + player.skateWallSide = 1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, 1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx > 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.min(0, player.vx); + player.knockVx = Math.min(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + const ceiling = (survivalActive() ? survivalCeilingY : ceilingY) + + wallThickness; + const standingTop = runnerBounds(player, t).top; + if (!airRoundActive() && standingTop < ceiling) { + player.y += ceiling - standingTop; + if (player.vy < 0) player.vy = isHeadOnly(player) ? -player.vy * .62 : 0; + } +} + +function pointSegmentDistance(px, py, pz, segment) { + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const dz = segment.z2 - segment.z1; + const lengthSquared = dx * dx + dy * dy + dz * dz; + const amount = lengthSquared > 0 + ? Math.max(0, Math.min(1, + ((px - segment.x1) * dx + (py - segment.y1) * dy + + (pz - segment.z1) * dz) / lengthSquared)) + : 0; + return Math.hypot(px - (segment.x1 + dx * amount), + py - (segment.y1 + dy * amount), pz - (segment.z1 + dz * amount)); +} + +// Closest points for loose debris, independent of the character renderer. +function segmentSegmentClosest(first, second) { + const d1x = first.x2 - first.x1; + const d1y = first.y2 - first.y1; + const d1z = first.z2 - first.z1; + const d2x = second.x2 - second.x1; + const d2y = second.y2 - second.y1; + const d2z = second.z2 - second.z1; + const rx = first.x1 - second.x1; + const ry = first.y1 - second.y1; + const rz = first.z1 - second.z1; + const a = d1x * d1x + d1y * d1y + d1z * d1z; + const e = d2x * d2x + d2y * d2y + d2z * d2z; + const b = d1x * d2x + d1y * d2y + d1z * d2z; + const c = d1x * rx + d1y * ry + d1z * rz; + const f = d2x * rx + d2y * ry + d2z * rz; + const epsilon = .000000001; + let firstAmount = 0; + let secondAmount = 0; + if (a <= epsilon && e <= epsilon) { + firstAmount = 0; + secondAmount = 0; + } else if (a <= epsilon) { + secondAmount = clamp(f / e, 0, 1); + } else if (e <= epsilon) { + firstAmount = clamp(-c / a, 0, 1); + } else { + const denominator = a * e - b * b; + firstAmount = Math.abs(denominator) > epsilon + ? clamp((b * f - c * e) / denominator, 0, 1) : 0; + const secondNumerator = b * firstAmount + f; + if (secondNumerator < 0) { + secondAmount = 0; + firstAmount = clamp(-c / a, 0, 1); + } else if (secondNumerator > e) { + secondAmount = 1; + firstAmount = clamp((b - c) / a, 0, 1); + } else secondAmount = secondNumerator / e; + } + const firstPoint = { + x: first.x1 + d1x * firstAmount, + y: first.y1 + d1y * firstAmount, + z: first.z1 + d1z * firstAmount, + }; + const secondPoint = { + x: second.x1 + d2x * secondAmount, + y: second.y1 + d2y * secondAmount, + z: second.z1 + d2z * secondAmount, + }; + return { firstPoint, secondPoint, + distance: Math.hypot(firstPoint.x - secondPoint.x, + firstPoint.y - secondPoint.y, firstPoint.z - secondPoint.z) }; +} + + +function meleeLimbContact(attacker, target, t) { + const now = runtime().simMonotonicUs || runtime().monotonicUs; + return combatBoxContact(sampleCombatBoxes(attacker, now), sampleCombatBoxes(target, now)); +} + +// World-space rectangles with a shallow Z interval. Visual line width never +// changes these authored radii. The same records feed collision, Tab and Jev. +function combatRect(id, left, top, right, bottom, z = 0, depth = 18, extra = {}) { + return { id, left, top, right, bottom, near: z - depth, far: z + depth, ...extra }; +} +function boxesOverlap(a, b) { + return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && + a.bottom >= b.top && a.near <= b.far && a.far >= b.near; +} +function boxBounds(items) { + return { left: Math.min(...items.map(b => b.left)), right: Math.max(...items.map(b => b.right)), + top: Math.min(...items.map(b => b.top)), bottom: Math.max(...items.map(b => b.bottom)), + near: Math.min(...items.map(b => b.near)), far: Math.max(...items.map(b => b.far)) }; +} +function buildBoxTree(items) { + if (!items.length) return null; + const bounds = boxBounds(items); + if (items.length <= 3) return { bounds, items }; + const horizontal = bounds.right - bounds.left >= bounds.bottom - bounds.top; + const sorted = items.slice().sort((a,b) => horizontal + ? (a.left+a.right)-(b.left+b.right) : (a.top+a.bottom)-(b.top+b.bottom)); + const middle = Math.floor(sorted.length / 2); + return { bounds, children: [buildBoxTree(sorted.slice(0,middle)), buildBoxTree(sorted.slice(middle))] }; +} +function queryBoxTree(tree, area, found = []) { + if (!tree || !boxesOverlap(tree.bounds, area)) return found; + if (tree.items) for (const item of tree.items) { if (boxesOverlap(item, area)) found.push(item); } + else for (const child of tree.children) queryBoxTree(child, area, found); + return found; +} +function pointBoxDistance(box, x, y, z = 0) { + return Math.hypot(Math.max(box.left-x,0,x-box.right), + Math.max(box.top-y,0,y-box.bottom), Math.max(box.near-z,0,z-box.far)); +} +// Slab test on an expanded AABB: a fast projectile cannot skip a thin hurtbox. +function segmentBoxEntry(segment, box, radius = 0) { + let enter = 0, leave = 1; + for (const [axis,low,high] of [['x','left','right'],['y','top','bottom'],['z','near','far']]) { + const origin = segment[axis+'1'], delta = segment[axis+'2']-origin; + if (Math.abs(delta)<1e-9) { + if (originbox[high]+radius) return null; + } else { + const a=(box[low]-radius-origin)/delta,b=(box[high]+radius-origin)/delta; + enter=Math.max(enter,Math.min(a,b));leave=Math.min(leave,Math.max(a,b)); + if(enter>leave)return null; + } + } + return enter; +} +function sweptProjectileContact(segments,target,t) { + const now=runtime().simMonotonicUs || runtime().monotonicUs; + const boxes=sampleCombatBoxes(target,now); + let result=null; + for(const s of segments) { + const r=s.width/2; + const area=combatRect('sweep',Math.min(s.x1,s.x2)-r,Math.min(s.y1,s.y2)-r, + Math.max(s.x1,s.x2)+r,Math.max(s.y1,s.y2)+r,(s.z1+s.z2)/2,Math.abs(s.z2-s.z1)/2+r); + for(const hurt of queryBoxTree(boxes.tree,area)) { + const amount=segmentBoxEntry(s,hurt,r); + if(amount===null || (result && amount>=result.amount))continue; + result={amount,x:s.x1+(s.x2-s.x1)*amount,y:s.y1+(s.y2-s.y1)*amount, + z:s.z1+(s.z2-s.z1)*amount,separation:0,headshot:hurt.part==='head',segmentIndex:hurt.segmentIndex}; + } + } + return result; +} +function combatPushbox(player) { + const half = isHeadOnly(player) ? 24 : isPogo(player) ? 38 : 69; + const height = isHeadOnly(player) ? 44 : isPogo(player) ? 116 : player.ducking ? 118 : 180; + return combatRect('push', player.x-half, player.y-height, player.x+half, player.y, player.z); +} +function sampleCombatBoxes(player, now, world = null, buildTree = true) { + world ||= runnerWorldGeometry(player, (now-startedAt)/1e6); + const hurt = []; + const head = world.head; + hurt.push(combatRect('head', head.x-22, head.y-22, head.x+22, head.y+22, head.z, 22, + { part: 'head', segmentIndex: -1 })); + for (let i=0; is.role==='torso'); + if(torso)hit.push(combatRect('pogo',torso.x2-10,torso.y2-10, + torso.x2+10,torso.y2+10,torso.z2,10,{part:'torso'})); + } + if (player.alive && !player.attackHit && !player.blocking && now >= player.hitStunUntil && + frame.phase === 'active' && !isHeadOnly(player) && !isPogo(player)) { + const kick = player.attackKind === 'KICK'; + const part = kick ? player.facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (part && hasPart(player, part)) { + const tip = meleeTarget(player, now); + const halfX = kick ? 26 : 22; + const halfY = kick && player.lowKick ? 17 : 20; + const inner = player.x+player.facing*(kick ? 42 : 30); + const outer = tip.x+player.facing*halfX; + hit.push(combatRect(player.attackKind.toLowerCase(), Math.min(inner,outer), + tip.y-halfY, Math.max(inner,outer), tip.y+halfY, tip.z, 18, { part })); + } + } + const guard = []; + if (player.blocking) { + const shield = shieldGeometry(player); + guard.push(combatRect('guard', shield.x-shield.radius, shield.y-shield.radius, + shield.x+shield.radius, shield.y+shield.radius, shield.z, shield.radius)); + } + return { hurt, hit, guard, push: combatPushbox(player), frame, + tree: buildTree ? buildBoxTree(hurt) : null }; +} +function combatBoxContact(attacker, target) { + let result = null; + for (const hit of attacker.hit) { + const overlaps = queryBoxTree(target.tree, hit).sort((a,b) => + (a.part === 'head' ? -1 : b.part === 'head' ? 1 : a.segmentIndex-b.segmentIndex)); + const hurt = overlaps[0]; + if (!hurt) continue; + result = { x:(Math.max(hit.left,hurt.left)+Math.min(hit.right,hurt.right))/2, + y:(Math.max(hit.top,hurt.top)+Math.min(hit.bottom,hurt.bottom))/2, + z:(Math.max(hit.near,hurt.near)+Math.min(hit.far,hurt.far))/2, + separation: 0, headshot:hurt.part === 'head', segmentIndex:hurt.segmentIndex, + hitbox:hit.id, hurtbox:hurt.id }; + if (result.headshot) break; + } + return result; +} + +// Sample the game's real strike capsules against the opponent's current +// hurtboxes. This is reach evidence at fixed positions, not a predicted hit: +// travel, input latency, shields and the opponent's next move can change it. +function jevStrikeOptions(player, opponent, now) { + if (!player.alive || !opponent.alive || isHeadOnly(player) || isPogo(player)) return {}; + const t = (now - startedAt) / 1000000; + const target = sampleCombatBoxes(opponent, now); + const facing = Math.sign(opponent.x - player.x) || player.facing; + const result = {}; + for (const [action, kind, crouched] of [ + ['punch', itemMelee[heldItem(player)] || 'PUNCH', false], + ['kick', 'KICK', false], ['low_kick', 'KICK', true], + ['crouch_punch', itemMelee[heldItem(player)] || 'PUNCH', true], + ]) { + const part = kind === 'KICK' ? facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (!part || !hasPart(player, part) || (crouched && !player.grounded)) continue; + const probe = { ...player, facing, vx: 0, blocking: false, + ducking: crouched, crouchBlend: crouched ? 1 : 0, + grabHeld: false, itemAction: '', hitStunUntil: 0, attackHit: false, + attackKind: kind, lowKick: crouched && kind === 'KICK', + attackStartedAt: now, attackUntil: now + meleeSpecs[kind].windowUs }; + let closest = null, clearance = Infinity; + const timing = meleeFrames[kind]; + for (let frame=timing.startup; frame + item.part === part && !item.hitboxOnly)) { + const paletteCoordinate = geometry.segments.indexOf(segment); + detachedParts.push({ ...segment, color: player.color.slice(), + colors: player.npc ? [] : player.handleColors?.map((value) => value.slice()) || [], + paletteCoordinate, + vx: direction * (420 + detachedParts.length % 3 * 90), + vy: -520 - detachedParts.length % 2 * 120, + spin: direction * (3.5 + detachedParts.length % 4), + life: 2.6, part, owner: player.pad, heldBy: -1, hitAfter: now + 180000 }); + } +} + +function detachPart(player, part, geometry, sourceX, now) { + if (!hasPart(player, part)) return; + spawnDetachedPart(player, part, geometry, sourceX, now); + player.removedParts.push(part); + player.partDamage[part] = Math.max(player.partDamage[part] || 0, + part === "torso" ? 3 : 2); + emitSignal("partremoved", player.pad, + [...limbParts, "torso"].indexOf(part), 1); +} + +function damagePart(target, segmentIndex, sourceX, sourcePad, now) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const segment = geometry.segments[segmentIndex]; + const part = segment?.part; + if (!part || !hasPart(target, part)) return; + const durability = target.spiderDummy + ? part === "torso" ? 5 : 3 + : part === "torso" ? 3 : 2; + target.partDamage[part] = (target.partDamage[part] || 0) + 1; + emitSignal("partdamage", target.pad, + [...limbParts, "torso"].indexOf(part), target.partDamage[part] / durability); + if (target.partDamage[part] < durability) return; + if (part === "torso") { + // Removing the body's attachment point releases every surviving limb; + // the circular head remains as the final playable form. + for (const limb of target.spiderDummy ? spiderLegParts : limbParts) + detachPart(target, limb, geometry, sourceX, now); + } + detachPart(target, part, geometry, sourceX, now); + if (part === "torso") { + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + launchHead(target, sourceX, sourcePad, now, 650, 620); + } + if (target.itemArm === part) { + if (!unarmedRoundActive() && target.gunAmmo > 0) gunPickups.push({ kind: target.gunMode, + amount: target.gunAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + if (!unarmedRoundActive() && target.grenadeAmmo > 0) grenadePickups.push({ + amount: target.grenadeAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + // The blade goes where the hand went. A saber is held, not carried, so + // losing the item arm has to put it back on the map — otherwise the one + // weapon a fighter can keep all round would quietly cease to exist and + // the reach it was buying would vanish with no object to explain it. + if (target.swordHeld) { + if (!unarmedRoundActive()) saberPickups.push({ kind: "LIGHT SABER", x: target.x, + y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + target.swordHeld = false; + } + target.gunAmmo = 0; + target.grenadeAmmo = 0; + target.itemArm = ""; + emitSignal("item-drop", target.pad, sourcePad, 1); + } + if (target.carryArm === part) { + if (target.heldBall >= 0) releaseCarriedBall(target, now); + if (target.heldPart >= 0) releaseCarriedPart(target, now); + if (target.heldPlayer >= 0) releaseCarriedFighter(target, now); + target.carryArm = ""; + } + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.lastButton = part.toUpperCase() + " LOST"; + target.lastButtonAt = now; + playDrum("clap", 1.2, panPlayer(target)); +} + +function damageAllLimbs(target, sourceX, sourcePad, now) { + for (const part of limbParts) { + if (!hasPart(target, part)) continue; + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const index = geometry.segments.findIndex((segment) => segment.part === part); + if (index >= 0) damagePart(target, index, sourceX, sourcePad, now); + } +} + +const skateTruck = 32; +const skateWheelRadius = 8; +const skateAxleDrop = 10; + +function skateContact(x, y) { + // Solve the truck chord against the supporting ledge or heightfield. + let pitch = 0, left = 0, right = 0; + for (let i = 0; i < 6; i++) { + const span = skateTruck * Math.cos(pitch); + left = surfaceYAt(x - span, y - 2); + right = surfaceYAt(x + span, y - 2); + pitch = Math.atan2(right - left, span * 2); + } + const c = Math.cos(pitch), sn = Math.sin(pitch); + const wheelX = -sn * skateAxleDrop; + left = surfaceYAt(x - skateTruck * c + wheelX, y - 2); + right = surfaceYAt(x + skateTruck * c + wheelX, y - 2); + const deckY = Math.min(left + skateTruck * sn, right - skateTruck * sn) - + skateAxleDrop * c - skateWheelRadius; + return { pitch, y: deckY + skateAxleDrop + skateWheelRadius, + left: Math.abs(deckY - skateTruck * sn + skateAxleDrop * c + skateWheelRadius - left) < 3, + right: Math.abs(deckY + skateTruck * sn + skateAxleDrop * c + skateWheelRadius - right) < 3 }; +} + +function skateFrame(player) { + const pitch = player.skateWallSide ? Math.PI / 2 : player.skatePitch || 0; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const down = player.skateWallSide > 0 ? -1 : 1; + return (along, height = 0, across = 0) => ({ + x: player.x + c * along - sn * height * down, + y: player.y - skateAxleDrop - skateWheelRadius + sn * along + c * height * down, + z: player.z + across, + }); +} + +function resetSkate(player) { + player.skateboard = false; + player.skateVx = player.skateWallSide = player.skatePitch = 0; + player.skateSpin = player.skateRollDistance = player.skateCarveDir = 0; + player.skateContacts = 0; + player.walkSince = player.runSince = 0; +} + +function boardForRider(player) { + return balls.find(item => item.type === "skateboard" && item.riderPad === player.pad) || + balls.find(item => item.type === "skateboard" && !item.active && item.heldBy < 0 && + (item.riderPad ?? -1) < 0); +} + +function dismountSkateboard(target, now) { + if (!target.skateboard) return false; + resetSkate(target); + const board = boardForRider(target); + if (!board) return true; + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.x = target.x - target.facing * 58; + board.y = target.y - skateAxleDrop - skateWheelRadius; + board.z = target.z; + board.vx = -target.facing * 720; + board.vy = -260; + board.safeUntil = now + 260000; + board.safePlayers = 1 << target.pad; + emitSignal("skate-dismount", target.pad, 1, 0); + return true; +} + +function applyBodyHit(target, segmentIndex, sourceX, sourcePad, now, + force = 1100, lift = 150, damageParts = true) { + recordFightHit(sourcePad, false); + const direction = Math.sign(target.x - sourceX) || + (sourcePad === target.pad ? -target.facing : target.facing) || 1; + releaseCarriedBall(target, now); + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.dashUntil = 0; + target.dashVx = 0; + target.hit = Math.max(target.hit, .52); + target.hitSegment = segmentIndex; + target.hitSegmentUntil = Math.max(target.hitSegmentUntil, now + 190000); + if (dismountSkateboard(target, now)) damageParts = false; + // Balls transfer recoil but are sporting hazards, not damaging attacks. + if (damageParts) + damagePart(target, segmentIndex, sourceX, sourcePad, now); + target.hitStunUntil = Math.max(target.hitStunUntil, now + 145000); + if (isHeadOnly(target)) { + launchHead(target, sourceX, sourcePad, now, force * 1.15, + Math.max(420, lift * 2)); + } else { + target.knockVx += direction * force; + target.vx = target.knockVx + target.windVx; + target.vy = Math.min(target.vy, -lift); + } + target.grounded = false; + target.stance = "STUN"; + target.lastButton = "BODY HIT"; + target.lastButtonAt = now; + emitSignal("bodyhit", sourcePad, target.pad, segmentIndex); +} + +// `combat` is false on a watcher: the limbs still tumble, settle and draw, +// but they do not damage anybody. The fight they belong to is being decided +// on another machine, and a watcher that scored its own hits would fight the +// wire for the rest of the round. Same switch `updateBullets` already has. +function updateDetachedParts(dt, combat = true) { + const now = runtime().monotonicUs; + for (const fragment of detachedParts) { + if (fragment.heldBy >= 0) { + const carrier = players[fragment.heldBy]; + if (!carrier?.alive || carrier.heldPart !== detachedParts.indexOf(fragment)) { + fragment.heldBy = -1; + } else { + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const dx = carrier.x + carrier.facing * 112 - centerX; + const dy = carrier.y - 78 - centerY; + fragment.x1 += dx; fragment.x2 += dx; + fragment.y1 += dy; fragment.y2 += dy; + fragment.vx = fragment.vy = 0; + fragment.life = Math.max(fragment.life, 1); + continue; + } + } + fragment.vy += 1900 * dt; + const dx = fragment.vx * dt; + const dy = fragment.vy * dt; + fragment.x1 += dx; + fragment.y1 += dy; + fragment.x2 += dx; + fragment.y2 += dy; + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const angle = fragment.spin * dt; + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + for (const endpoint of [1, 2]) { + const xKey = "x" + endpoint; + const yKey = "y" + endpoint; + const localX = fragment[xKey] - centerX; + const localY = fragment[yKey] - centerY; + fragment[xKey] = centerX + localX * cosine - localY * sine; + fragment[yKey] = centerY + localX * sine + localY * cosine; + } + const bottom = Math.max(fragment.y1, fragment.y2) + fragment.width / 2; + const terrainY = terrainFloorAt(centerX); + if (bottom > terrainY) { + const correction = terrainY - bottom; + fragment.y1 += correction; + fragment.y2 += correction; + fragment.vy = -Math.abs(fragment.vy) * .42; + fragment.vx *= .82; + fragment.spin *= .78; + } + const speed = Math.hypot(fragment.vx, fragment.vy); + if (combat && speed > 650 && now >= (fragment.hitAfter || 0)) { + for (const target of players) { + if (!target.alive || target.pad === fragment.owner) continue; + const contact = runnerContactToPoint(target, + (now - startedAt) / 1000000, centerX, centerY, + (fragment.z1 + fragment.z2) / 2); + if (Math.min(contact.headDistance, contact.bodyDistance) > + fragment.width / 2 + 18) continue; + applyBodyHit(target, contact.segmentIndex, centerX, fragment.owner, + now, Math.min(1800, speed * .72), 240); + fragment.vx *= -.38; + fragment.vy = -Math.abs(fragment.vy) * .45; + fragment.hitAfter = now + 260000; + playDrum("clap", 1, panPlayer(target)); + emitSignal("part-hit", fragment.owner, target.pad, speed); + break; + } + } + // Dismembered anatomy remains a physical arena object. It can settle, + // be picked up again, thrown, and strike either fighter for the rest of + // the round rather than evaporating on a cosmetic timer. On a watcher it + // is only scenery, and scenery that never expires is a leak: the wire + // says which limbs are gone, not which pieces are still worth drawing. + if (combat) fragment.life = Math.max(fragment.life, 1); + else fragment.life -= dt; + } + for (let index = detachedParts.length - 1; index >= 0; index--) { + if (detachedParts[index].life > 0 || detachedParts[index].heldBy >= 0) continue; + detachedParts.splice(index, 1); + for (const player of players) { + if (player.heldPart === index) player.heldPart = -1; + else if (player.heldPart > index) player.heldPart--; + } + } +} + +// Comic Relief's packaged horizontal metrics, normalized from its 2048-unit +// em. Colored text is drawn glyph-by-glyph on every host, so using the font's +// real advances here keeps the web canvas and Xbox DirectWrite runs identical. +const comicAdvanceEm = { + a:.512, b:.593, c:.514, d:.587, e:.548, f:.508, g:.531, h:.578, + i:.28, j:.403, k:.54, l:.274, m:.777, n:.523, o:.526, p:.535, + q:.52, r:.48, s:.487, t:.471, u:.52, v:.486, w:.684, x:.59, + y:.521, z:.538, "0":.61, "1":.45, "2":.61, "3":.61, "4":.61, + "5":.61, "6":.61, "7":.61, "8":.61, "9":.61, "@":.931, + "!":.238, "?":.524, ".":.249, ",":.277, ":":.299, ";":.299, + "<":.381, ">":.381, "^":.581, " ":.299, "/":.512, "-":.417, + "+":.48, "∞":.837, +}; + +function comicGlyphAdvance(character, size) { + if (typeof systemWrite.measureGlyph === "function") + return systemWrite.measureGlyph(String(character).toLowerCase(), size); + return size * (comicAdvanceEm[String(character).toLowerCase()] ?? .58); +} + +function handleWidth(handle, size) { + return [...handle].reduce((width, character) => + width + comicGlyphAdvance(character, size), 0); +} + +function typeWrite(text, x, y, size, ...color) { + const visibleText = String(text).toLowerCase(); + if (typeof comicWrite === "function") comicWrite(visibleText, x, y, size, ...color); + else if (typeof ywftWrite === "function") + ywftWrite(visibleText, x, y, size, ...color); + else systemWrite(visibleText, x, y, size, ...color); +} + +function contrastShadow(color) { + const luminance = color[0] * .2126 + color[1] * .7152 + color[2] * .0722; + return luminance > 142 ? [8, 12, 24] : [232, 238, 248]; +} + +// Per-glyph contrast flips a single mid-tone letter to the opposite shadow +// while its neighbors keep theirs, which reads as a mistake rather than as +// depth. A run of type picks its direction once, from the sky behind it, and +// each shadow keeps a trace of its own glyph's hue. +function runShadow(color) { + // Match disk.mjs corner labels: the shadow is always dark, with a trace of + // the foreground hue. Dark mode must never turn a dark glyph's shadow white. + return mixColor(color, visualTheme.light > .5 ? [30, 20, 50] : [6, 4, 16], + .78); +} + +// Handle colors are authored per name and can be shorter than the name they +// dress. Cycling keeps every glyph on the same palette instead of dropping +// the tail onto a different color source. +function glyphColor(colors, index, fallback) { + return colors?.length ? colors[index % colors.length] : fallback; +} + +function controlLocale() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + const keyboard = caps.inputFamily === "keyboard"; + const touch = caps.inputFamily === "touch"; + if (touch) return { + title: "start", select: "", replayPaused: "paused", + replayPlaying: "", replay: "", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM", + }; + return keyboard ? { + title: "start", + select: "P1 A/D + SPACE P2 LEFT/RIGHT + K H P2/DUMMY/BOT G BACK", + replayPaused: "PAUSED F PLAY A D SCRUB G EXIT", + replayPlaying: "F PAUSE A D SCRUB G EXIT", + replay: "Q REPLAY", + combat: "SPACE KICK ENTER PUNCH SHIFT SHIELD ALT USE ITEM W AIR", + } : { + title: "start", + select: "LEFT RIGHT SELECT A READY X P2 / DUMMY / BOT B BACK", + replayPaused: "PAUSED A PLAY LEFT RIGHT SCRUB B EXIT", + replayPlaying: "A PAUSE LEFT RIGHT SCRUB B EXIT", + replay: "Y REPLAY", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM UP AIR", + }; +} + +// Each entry is the cap to draw, what it does, and the button that lights it, +// so the legend can show a key rather than spell one. +function combatKeys() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.inputFamily === "keyboard") return [ + [["A", "D"], "MOVE", "ArrowLeft"], [["D", "D"], ">> DASH", "ArrowRight"], + ["SPACE", "KICK", "A"], ["ENTER", "PUNCH", "B"], + ["SHIFT", "SHIELD", "X"], ["ALT", "USE ITEM", "Y"], + ["W", "AIR", "ArrowUp"]]; + if (caps.inputFamily === "touch") return [ + ["A", "KICK", "A"], ["B", "PUNCH", "B"], + ["X", "SHIELD", "X"], ["Y", "USE ITEM", "Y"]]; + return [ + [["LEFT", "RIGHT"], "MOVE", "ArrowLeft"], + [["RIGHT", "RIGHT"], ">> DASH", "ArrowRight"], + ["A", "KICK", "A"], ["B", "PUNCH", "B"], ["X", "SHIELD", "X"], + ["Y", "USE ITEM", "Y"], ["STICK_UP", "AIR", "ArrowUp"]]; +} + +// What the buttons do, named on the way into a round. B changes meaning with +// what the hand is carrying, so the legend reads the fighter rather than +// reciting a fixed map. +function combatLegendKeys(player) { + const swing = itemMelee[heldItem(player)]; + return combatKeys().map(([cap, action, button]) => + [cap, swing && action === "PUNCH" ? swing : action, button]); +} + +function combatLegend(player) { + return combatLegendKeys(player) + .map(([cap, action]) => (cap === "STICK_UP" ? "STICK" : cap) + + " " + action).join(" "); +} + +function selectionControlKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + [["A", "D"], "SELECT", "ArrowLeft"], ["SPACE", "READY", "A"], + ["SHIFT", "OPPONENT", "X"], ["ENTER", "BACK", "B"]]; + return [[["LEFT", "RIGHT"], "SELECT", "ArrowLeft"], ["A", "READY", "A"], + ["X", "OPPONENT", "X"], ["B", "BACK", "B"]]; +} + +function replayControlKeys(paused) { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + ["F", paused ? "PLAY" : "PAUSE", "A"], + [["A", "D"], "SCRUB", "ArrowLeft"], ["G", "EXIT", "B"]]; + return [["A", paused ? "PLAY" : "PAUSE", "A"], + [["LEFT", "RIGHT"], "SCRUB", "ArrowLeft"], ["B", "EXIT", "B"]]; +} + +function replayOfferKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + return family === "keyboard" ? [["Q", "REPLAY", "Y"]] + : [["Y", "REPLAY", "Y"]]; +} + +// A key drawn as a key: a gray cap with a line around it, sunk and brightened +// while it is actually held. +// `fade` is how present the cap is: 1 draws it, 0 dissolves it into the stage +// behind. The legend always passes 1; only the command stream ages its caps +// out, and it needs the whole cap to go — face, edge and letter together. +// A controller button drawn as a controller button: the letter in its Xbox +// color on a dark disc with a colored rim; pressed inverts to a filled disc. +// Directions are the same disc with an arrow glyph in neutral ink. Keyboard +// input keeps its keycaps; every other family gets these. +const padButtonInk = { + A: [96, 200, 80], B: [235, 78, 78], X: [86, 148, 235], Y: [240, 198, 60], + // The M30's face wears its own colorway — green A, yellow B, blue C, all + // three top-row buttons gray — which is NOT the Xbox palette above, so the + // cluster keys its own inks rather than borrowing the Xbox letters'. + M30A: [96, 200, 80], M30B: [240, 198, 60], M30C: [86, 148, 235], + M30X: [168, 176, 190], M30Y: [168, 176, 190], M30Z: [168, 176, 190], + M30S: [235, 78, 78], +}; +const padGlyph = { UP: "↑", DOWN: "↓", LEFT: "←", RIGHT: "→" }; +const padButtonDiameter = (size) => Math.round(size * .78) * 2; +function drawPadButton(label, x, y, size, pressed, fade = 1, display = null) { + const radius = Math.round(size * .78); + if (fade <= .01) return radius * 2; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const ink = padButtonInk[label] || mixColor([148, 158, 178], [96, 104, 124], + visualTheme.light); + // Filled like the real thing: the color IS the button. Held brightens it + // and rims it white; the glyph stays dark and dead-center either way. + const face = pressed ? mixColor(ink, [255, 255, 255], .3) : ink; + const cx = x + radius; + const cy = y + Math.round(size * .75); + filledDisc(cx, cy, radius, veil(face)); + if (pressed) filledRing(cx, cy, radius, radius - 3, veil([245, 248, 255])); + const text = display ?? (padGlyph[label] || label).toUpperCase(); + const glyphSize = Math.round(size * .82); + if (label === "STICK_UP" || label === "DOWN" || + label === "LEFT" || label === "RIGHT") { + const arrowInk = veil([12, 14, 26]); + const thickness = Math.max(2, Math.round(radius * .11)); + const dx = label === "LEFT" ? -1 : label === "RIGHT" ? 1 : 0; + const dy = label === "STICK_UP" ? -1 : label === "DOWN" ? 1 : 0; + const tipX = cx + dx * radius * .42; + const tipY = cy + dy * radius * .42; + const tailX = cx - dx * radius * .4; + const tailY = cy - dy * radius * .4; + const perpendicularX = -dy * radius * .32; + const perpendicularY = dx * radius * .32; + const wingX = tipX - dx * radius * .34; + const wingY = tipY - dy * radius * .34; + filledCapsule(tailX, tailY, tipX, tipY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX + perpendicularX, + wingY + perpendicularY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX - perpendicularX, + wingY - perpendicularY, thickness, arrowInk); + return radius * 2; + } + const glyphX = Math.round(cx - handleWidth(text, glyphSize) / 2); + // DirectWrite's cap shapes carry more visual weight below their nominal + // midpoint. Lift the Xbox face letters together so A/B/X/Y read centered in + // the colored hardware circles rather than sitting on their lower halves. + const glyphY = Math.round(cy - glyphSize * (padButtonInk[label] ? .56 : .5)); + if (padButtonInk[label] || Object.hasOwn(padGlyph, label) || + /^[KPSI<>^v]$/.test(text)) + systemWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + else typeWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + return radius * 2; +} + +function drawKeycap(label, x, y, size, pressed, fade = 1) { + const padX = Math.round(size * .42); + const height = Math.round(size * 1.5); + const width = handleWidth(label, size) + padX * 2; + if (fade <= .01) return width; + const drop = pressed ? 2 : 0; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const face = veil(pressed + ? mixColor([96, 104, 126], [206, 214, 232], visualTheme.light) + : mixColor([44, 50, 66], [176, 184, 202], visualTheme.light)); + const edge = veil(pressed + ? mixColor([210, 220, 240], [40, 46, 62], visualTheme.light) + : mixColor([112, 122, 146], [96, 104, 124], visualTheme.light)); + if (!pressed) + hudBox(x + 2, y + 4, width, height, ...veil(mixColor([6, 8, 18], [92, 99, 112], + visualTheme.light * .7))); + hudBox(x, y + drop, width, height, ...face); + strokeBox(x, y + drop, width, height, 2, edge); + typeWrite(label, x + padX, y + drop + Math.round((height - size) / 2), size, + ...veil(pressed ? [12, 14, 26] : [238, 242, 252])); + return width; +} + +// `controllers()` walks the whole pad list and the legend asks every painted +// frame, so the name check breathes once a second instead. +let m30CheckAt = 0; +let m30Present = false; +function m30Seated() { + const now = runtime().monotonicUs; + if (now >= m30CheckAt) { + m30CheckAt = now + 1000000; + m30Present = typeof controllers === "function" && + (controllers() || []).some((pad) => /8bitdo\s+m30/i.test(pad?.name || "")); + } + return m30Present; +} + +// The M30 folds two extra moves into its Sega face: C and the top-edge R +// reach the game as the trigger pair, Z and the top-edge L as the shoulders — +// the pad's factory Xbox map wearing Sega names. Which trigger C sends was +// read off the live hardware, not the leaflet; flip this table if 8BitDo's +// firmware ever swaps the pair. +const m30FaceSends = { C: "RightTrigger", Z: "RightShoulder" }; +const m30SendLabel = { RightTrigger: "SHIELD", RightShoulder: "USE ITEM", + LeftTrigger: "KICK", LeftShoulder: "USE ITEM" }; + +// The M30's own manual page, drawn from the device itself: the white +// dogbone body with red L/R nubs over its shoulders, the dark cross on its +// round base, the red start pill, and the two button arcs climbing to the +// right — gray X/Y/Z small on top, green A / yellow B / blue C big below, +// the bottom row shifted toward the thumb. Proportions transcribed from +// 8BitDo's top-down of the M30 2.4G (white), the unit in @jeffrey's hand. +// Every drawn control lights with the live press, so the mapping is not a +// diagram of faith: plug in, press, and the page answers. +function drawM30Cluster(x, y, size, held, directionActive, ink) { + const small = Math.round(size * .58); + const d = padButtonDiameter(size); + const light = visualTheme.light; + const lobeR = Math.round(d * 1.62); + const bodyMidY = y + Math.round(d * .3) + lobeR; + const leftLobeX = x + lobeR; + const rightLobeX = x + Math.round(d * 7.5) - lobeR; + const plastic = mixColor([176, 182, 194], [246, 248, 251], light); + const print = mixColor([92, 98, 112], [118, 124, 138], light); + // Shoulder nubs first, so the body covers their roots. + const nub = mixColor([196, 44, 58], [206, 48, 62], light); + filledCapsule(leftLobeX - d, bodyMidY - lobeR, leftLobeX + Math.round(d * .2), + bodyMidY - lobeR, Math.round(d * .4), nub); + filledCapsule(rightLobeX - Math.round(d * .2), bodyMidY - lobeR, + rightLobeX + d, bodyMidY - lobeR, Math.round(d * .4), nub); + filledDisc(leftLobeX, bodyMidY, lobeR, plastic); + filledDisc(rightLobeX, bodyMidY, lobeR, plastic); + filledCapsule(leftLobeX, bodyMidY, rightLobeX, bodyMidY, + Math.round(lobeR * 1.7), plastic); + // The silkscreen wordmark rides the body's top center. + const markSize = Math.round(small * .9); + typeWrite("8BITDO M30", Math.round((leftLobeX + rightLobeX) / 2 - + handleWidth("8BITDO M30", markSize) / 2), + bodyMidY - lobeR + Math.round(d * .1), markSize, ...print); + // D-pad: the dark cross on its round base, each arm lighting alone. + const dpadBase = mixColor([44, 48, 60], [58, 62, 74], light); + filledDisc(leftLobeX, bodyMidY, Math.round(d * 1.02), dpadBase); + const crossInk = mixColor([24, 27, 36], [32, 35, 44], light); + const armLen = Math.round(d * .8); + const armWidth = Math.round(d * .5); + const arms = [["ArrowUp", 0, -1], ["ArrowDown", 0, 1], + ["ArrowLeft", -1, 0], ["ArrowRight", 1, 0]]; + for (const [button, dx, dy] of arms) + filledCapsule(leftLobeX, bodyMidY, leftLobeX + dx * armLen, + bodyMidY + dy * armLen, armWidth, directionActive(button) + ? mixColor(crossInk, [245, 248, 255], .5) : crossInk); + filledDisc(leftLobeX, bodyMidY, Math.max(2, Math.round(d * .14)), + mixColor([16, 18, 26], [22, 24, 32], light)); + // START — the red pill mid-body, its name silkscreened beneath, with the + // 2.4G's three tiny extras below. Pressed wears the discs' white rim. + const startPressed = held.includes("Menu"); + const midX = Math.round((leftLobeX + rightLobeX) / 2); + const pillHalf = Math.round(size * .5); + const pillY = bodyMidY - Math.round(d * .28); + if (startPressed) filledCapsule(midX - pillHalf, pillY, midX + pillHalf, + pillY, Math.round(size * .44) + 4, [245, 248, 255]); + filledCapsule(midX - pillHalf, pillY, midX + pillHalf, pillY, + Math.round(size * .44), startPressed + ? mixColor(padButtonInk.M30S, [255, 255, 255], .3) : padButtonInk.M30S); + const startLabelSize = Math.round(small * .8); + typeWrite("START", Math.round(midX - handleWidth("START", startLabelSize) / 2), + pillY + Math.round(size * .32), startLabelSize, ...print); + for (let dot = 0; dot < 3; dot++) + filledDisc(midX + (dot - 1) * Math.round(d * .42), + pillY + Math.round(d * .85), Math.max(2, Math.round(d * .09)), print); + // The face arcs climb to the right like the hardware; the top row runs + // smaller and the bottom row leans into the thumb. + const pitch = Math.round(d * 1.05); + const drop = Math.round(d * .3); + const smallFace = Math.round(size * .82); + const disc = (key, cap, cx, cy, buttonSize, pressed) => + drawPadButton(key, cx - Math.round(buttonSize * .78), + cy - Math.round(buttonSize * .75), buttonSize, pressed, 1, cap); + const face = [ + ["M30X", "X", 0, 0, smallFace, held.includes("X")], + ["M30Y", "Y", 1, 0, smallFace, held.includes("Y")], + ["M30Z", "Z", 2, 0, smallFace, held.includes(m30FaceSends.Z)], + ["M30A", "A", 0, 1, size, held.includes("A")], + ["M30B", "B", 1, 1, size, held.includes("B")], + ["M30C", "C", 2, 1, size, held.includes(m30FaceSends.C)], + ]; + for (const [key, cap, column, row, buttonSize, pressed] of face) + disc(key, cap, + rightLobeX + Math.round((column - 1) * pitch - d * .35) + + (row ? Math.round(d * .34) : 0), + bodyMidY - Math.round(d * .8) + (2 - column) * drop + + (row ? Math.round(d * .92) : 0), + buttonSize, pressed); + let rowY = bodyMidY + lobeR + Math.round(small * 1.2); + const captions = [ + `A KICK B PUNCH C ${m30SendLabel[m30FaceSends.C]}`, + `X SHIELD Y USE ITEM Z ${m30SendLabel[m30FaceSends.Z]}`, + `L ${m30SendLabel.LeftShoulder} R ${m30SendLabel.LeftTrigger}`, + "A+B GRAB START PAUSE", + ]; + for (const caption of captions) { + typeWrite(caption, x, rowY, small, ...ink); + rowY += Math.round(small * 1.55); + } + return rowY + Math.round(small * .6); +} + +// Lifted clear of the bottom edge, because the signed-in handle and its +// logout button now sit in that corner and the legend used to run straight +// through them on a narrow view. +function drawControlLegend(ink) { + const device = typeof capabilities === "function" ? capabilities() : {}; + if (device.showControlLegend === false || device.inputFamily === "touch") return; + const safe = hudSafeRect(); + const pad = localPad(); + const held = pad.down || []; + const directionActive = (button) => held.includes(button) || + (button === "ArrowLeft" && pad.leftX < -.12) || + (button === "ArrowRight" && pad.leftX > .12) || + (button === "ArrowUp" && pad.leftY > .12) || + (button === "ArrowDown" && pad.leftY < -.12); + const size = compactLayout() ? 18 : 24; + const x = safe.left + 8; + const both = held.includes("A") && held.includes("B"); + const legendFighter = players[localSeat()]; + const dash = legendFighter.lastButton === "DASH" && + runtime().monotonicUs - legendFighter.lastButtonAt < 700000; + const controls = [ + ["LEFT", "ArrowLeft", "MOVE"], + ["RIGHT", "ArrowRight", dash ? "DASH >>" : "MOVE"], + ["STICK_UP", "ArrowUp", "AIR"], + ["DOWN", "ArrowDown", "CROUCH"], + ["A", "A", both ? "GRAB" : "KICK"], + ["B", "B", both ? "GRAB" : itemMelee[heldItem(legendFighter)] || "PUNCH"], + ["X", "X", "SHIELD"], + ["Y", "Y", "USE ITEM"], + ]; + if (survivalActive()) controls.length = 4; + const keyboard = keycapFamily(); + // A seated M30 trades the whole legend column for the pad's own manual + // page — the drawn controller carries its d-pad, so no rows remain. + const m30 = device.showControllerDiagram !== false && + !keyboard && !survivalActive() && m30Seated(); + if (m30) controls.length = 0; + const keyboardCap = { LEFT: "A", RIGHT: "D", STICK_UP: "W", DOWN: "S", + A: "SPACE", B: "ENTER", X: "SHIFT", Y: "ALT" }; + const step = Math.round(size * 1.82); + for (const [row, [cap, button, action]] of controls.entries()) { + const y = safe.top + row * step; + const width = keyboard + ? drawKeycap(keyboardCap[cap] || cap, + x, y, size, + directionActive(button)) + : drawPadButton(cap, x, y, size, + button.startsWith("Arrow") ? directionActive(button) : held.includes(button)); + if (action) typeWrite(action, x + width + 10, + y + Math.round(size * .25), size, ...ink); + } + let legendBottom = safe.top + controls.length * step; + if (m30) legendBottom = drawM30Cluster(x, legendBottom, size, held, + directionActive, ink); + drawStickGate(x, legendBottom, size, pad, ink); +} + +// The legend named the stick's directions but never its ANGLE, so a fighter +// walking on a half-tilted stick looked identical to one at full lean, and +// the camera stick had no read-out at all. Only drawn while a stick is off +// center: an always-present gate would be one more permanently-lit widget in +// a corner that is already busy. +function drawStickGate(x, y, size, pad, ink) { + const gate = (label, dx, dy, column) => { + const radius = Math.round(size * .82); + const cx = x + radius + column * Math.round(radius * 2.6); + const cy = y + radius; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + // The gate ring is drawn as a disc under a smaller ground-colored disc: + // filledDisc is the only circle primitive the piece owns, and two of them + // cost less than an arc walked out of line segments. + filledDisc(cx, cy, radius, idle); + filledDisc(cx, cy, radius - 3, + mixColor([7, 8, 28], [230, 239, 247], visualTheme.light)); + // Screen y grows downward while the pad reports up as positive. + const knobX = cx + dx * (radius - 5); + const knobY = cy - dy * (radius - 5); + filledDisc(knobX, knobY, Math.max(3, Math.round(size * .26)), ink); + typeWrite(label, cx - radius, cy + radius + 2, + Math.round(size * .62), ...ink); + }; + const live = (dx, dy) => Math.abs(dx) > .12 || Math.abs(dy) > .12; + const leftX = Number(pad.leftX) || 0; + const leftY = Number(pad.leftY) || 0; + const rightX = Number(pad.rightX) || 0; + const rightY = Number(pad.rightY) || 0; + let column = 0; + if (live(leftX, leftY)) gate("move", leftX, leftY, column++); + if (live(rightX, rightY)) gate("cam", rightX, rightY, column++); +} + +const controlRailWidth = () => compactLayout() ? 138 : 188; + +// Touch is part of the game surface, not a DOM overlay. One drawn d-pad and +// four action discs share the exact centers used by mac-test's canvas hit zones. +function drawTouchControls() { + if (typeof capabilities !== "function" || + capabilities().inputFamily !== "touch" || capabilities().socialPreview) + return; + const held = localPad().down || []; + const spread = 64; + // The clusters stand clear of the home indicator and any notch ear; the + // shell's touchKeyAt mirrors this arithmetic, so a shift here must land + // there too or the drawing and the hit test come apart. + const cy = viewHeight - 140 - viewInset.bottom; + const dpadX = 130 + viewInset.left; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + const live = mixColor([110, 220, 150], [38, 128, 88], visualTheme.light); + const arm = 38; + const thick = 18; + const directions = [[0, -1, "ArrowUp"], [0, 1, "ArrowDown"], + [-1, 0, "ArrowLeft"], [1, 0, "ArrowRight"]]; + for (const [dx, dy, key] of directions) + filledCapsule(dpadX + dx * 8, cy + dy * 8, + dpadX + dx * arm, cy + dy * arm, thick, + held.includes(key) ? live : idle); + filledDisc(dpadX, cy, thick, held.some((key) => key.startsWith("Arrow")) + ? live : idle); + const actionX = viewWidth() - 130 - viewInset.right; + const commandGlyph = { A: "/", B: "*", X: ")", Y: "+" }; + for (const [dx, dy, key] of [[0, -1, "Y"], [0, 1, "A"], + [-1, 0, "X"], [1, 0, "B"]]) + drawPadButton(key, actionX + dx * spread - 27, + cy + dy * spread - 25, 35, held.includes(key), 1, commandGlyph[key]); +} + +function keycapRunWidth(entries, size) { + const keyboard = keycapFamily(); + const padX = Math.round(size * .42); + const capWidth = (label) => keyboard + ? handleWidth(label, size) + padX * 2 : padButtonDiameter(size); + return entries.reduce((total, [cap, action]) => + total + (Array.isArray(cap) ? cap : [cap]).reduce((width, label, index) => + width + capWidth(label) + (index ? 5 : 0), 0) + 8 + + handleWidth(action, size) + 26, 0) - 26; +} + +// Keyboard reads as keycaps; every other family reads as controller discs. +const keycapFamily = () => (typeof capabilities === "function" + ? String(capabilities().inputFamily || "") : "") === "keyboard"; + +function drawKeycapRun(entries, x, y, size, held, ink, revealAction = null) { + const keyboard = keycapFamily(); + let cursor = x; + for (const [cap, action, button] of entries) { + for (const [index, label] of (Array.isArray(cap) ? cap : [cap]).entries()) { + if (index) cursor += 5; + cursor += keyboard + ? drawKeycap(label, cursor, y, size, held.includes(button)) + : drawPadButton(label, cursor, y, size, held.includes(button)); + } + cursor += 8; + if (!revealAction || revealAction([cap, action, button])) + typeWrite(action, cursor, y + Math.round(size * .25), size, ...ink); + cursor += handleWidth(action, size) + 26; + } + return cursor; +} + +function drawCenteredKeycapRun(entries, y, size, held, ink) { + if (!entries.length) return; + drawKeycapRun(entries, viewCenterX() - keycapRunWidth(entries, size) / 2, + y, size, held, ink); +} + +function drawHandle(handle, x, y, size, colors, fallback) { + let cursor = x; + const characters = [...String(handle)]; + for (let index = 0; index < characters.length; index++) { + typeWrite(characters[index], cursor, y, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(characters[index], size); + } +} + +function drawFace(player, head, color, t, now = runtime().monotonicUs) { + if (photoThemeActive) color = [20, 12, 26]; + if (head.radius < 5) return; + const bodyDepth = triangleDepth; + triangleDepth = bodyDepth - .012; + const r = head.radius; + const direction = player.facing || 1; + // The whole face turns with a rolling head. Every feature below is placed + // in flat face-space and spun around the head's center on the way to the + // canvas — eyes, mouth, hair, tears, hearts, all of it — instead of the old + // look where the head traveled and the face stayed nailed upright. + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const spin = (x, y) => roll === 0 ? { x, y } : { + x: head.x + (x - head.x) * cosRoll - (y - head.y) * sinRoll, + y: head.y + (x - head.x) * sinRoll + (y - head.y) * cosRoll }; + const stroke = (x1, y1, x2, y2, width, ink = color) => { + const a = spin(x1, y1), b = spin(x2, y2); + filledCapsule(a.x, a.y, b.x, b.y, width, ink); + }; + const ring = (x, y, ringRadius, thickness, ink) => { + const point = spin(x, y); + filledRing(point.x, point.y, ringRadius, thickness, ink); + }; + const disc = (x, y, discRadius, ink) => { + const point = spin(x, y); + filledDisc(point.x, point.y, discRadius, ink); + }; + const glyph = (text, x, y, size, ...ink) => { + const point = spin(x, y); + systemWrite(text, point.x, point.y, size, ...ink); + }; + const celebrating = ["DANCE", "LAUGH", "POSE", "WIGGLE"] + .includes(player.resultReaction); + const grieving = ["CRY", "WOE", "SULK"].includes(player.resultReaction); + if (player.name === "@FIFI") { + const hair = visualTheme.light > .55 ? [105, 38, 116] : [245, 118, 230]; + const sway = Math.sin(t * 2.2 + player.pad) * r * .08; + const width = Math.max(2, r * .13); + stroke(head.x - r * .72, head.y - r * .48, + head.x - r * .32, head.y - r * .9, width, hair); + stroke(head.x - r * .32, head.y - r * .9, + head.x + r * .35, head.y - r * .88, width, hair); + stroke(head.x + r * .35, head.y - r * .88, + head.x + r * .76, head.y - r * .38, width, hair); + stroke(head.x - r * .76, head.y - r * .38, + head.x - r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x + r * .76, head.y - r * .38, + head.x + r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x - r * .48, head.y - r * .46, + head.x - r * .08, head.y - r * .18, width * .72, hair); + stroke(head.x - r * .08, head.y - r * .18, + head.x + r * .42, head.y - r * .5, width * .72, hair); + } + const eyeY = head.y - r * (photoThemeActive ? .07 : .18); + const eyeGap = r * (photoThemeActive ? .30 : .34); + const faceX = head.x + direction * r * (photoThemeActive ? .22 : .08); + const eyeWidth = Math.max(1.4, r * (photoThemeActive ? .125 : .1)); + const lineWidth = Math.max(1.2, r * .1); + const blink = player.alive && !player.blocking && !player.attackKind && + Math.sin(t * .73 + player.pad * 2.1) > .985; + const spitAge = now - (player.spitAt || -Infinity); + const spitting = isHeadOnly(player) && spitAge >= 0 && spitAge < 190000; + const inertDummy = player.npc && !player.bot; + const victoryAmount = deathCinematic?.winnerPad === player.pad + ? clamp(deathCinematicAge(now) / 1.15, 0, 1) : 0; + if (photoThemeActive) { + // Cover the photographed eyes completely before drawing live gaze and + // expressions. Closed lids are opaque, including the baked pupils. + const socket = blink ? (player.pad === 0 ? [135,101,190] : [115,162,53]) : [237,234,221]; + for (const offset of [-eyeGap,eyeGap]) disc(faceX+offset,eyeY,r*.315,socket); + } + if (!player.alive || player.hit > .6 || inertDummy) { + for (const offset of [-eyeGap, eyeGap]) { + stroke(faceX + offset - eyeWidth, eyeY - eyeWidth, + faceX + offset + eyeWidth, eyeY + eyeWidth, lineWidth); + stroke(faceX + offset + eyeWidth, eyeY - eyeWidth, + faceX + offset - eyeWidth, eyeY + eyeWidth, lineWidth); + } + } else if (spitting) { + // The release reads on the face before the glob clears it: both eyes + // squeeze inward for the same short beat as the pursed lips below. + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset - eyeWidth * 1.35, + eyeY + (offset < 0 ? -1 : 1) * r * .035, + faceX + offset + eyeWidth * 1.35, + eyeY + (offset < 0 ? 1 : -1) * r * .035, + lineWidth * 1.15); + } else if (blink) { + stroke(faceX - eyeGap - eyeWidth, eyeY, faceX - eyeGap + eyeWidth, + eyeY, lineWidth); + stroke(faceX + eyeGap - eyeWidth, eyeY, faceX + eyeGap + eyeWidth, + eyeY, lineWidth); + } else { + const pad = inputPads[player.pad] || {}; + const rawX = Number(pad.leftX) || 0; + const rawY = Number(pad.leftY) || 0; + const movementDeadzone = .48; + const gazeNoiseFloor = .015; + const digitalX = (pad.down || []).includes("ArrowRight") ? 1 + : (pad.down || []).includes("ArrowLeft") ? -1 : 0; + const digitalY = (pad.down || []).includes("ArrowUp") ? 1 + : (pad.down || []).includes("ArrowDown") ? -1 : 0; + const rawMagnitude = Math.hypot(rawX, rawY); + const gazeAmount = rawMagnitude <= gazeNoiseFloor ? 0 + : clamp((rawMagnitude - gazeNoiseFloor) / + (movementDeadzone - gazeNoiseFloor), 0, 1); + const defeated = victoryAmount > 0 + ? players[deathCinematic.loserPad] : null; + const lookX = defeated + ? Math.sign(defeated.x - player.x) || direction + : digitalX || lerp(direction * .2, rawX, gazeAmount); + const lookY = defeated + ? clamp((player.y - defeated.y) / 180, -1, 1) + : digitalY || lerp(0, rawY, gazeAmount); + const pupilX = clamp(lookX, -1, 1) * eyeWidth * 1.05; + const pupilY = clamp(-lookY, -1, 1) * eyeWidth * 1.05; + const socketRadius = eyeWidth * 2.35; + const pupilRadius = eyeWidth * .9; + const socketInk = [246, 248, 244]; + const pupilInk = [8, 12, 24]; + for (const offset of [-eyeGap, eyeGap]) { + disc(faceX + offset, eyeY, socketRadius, socketInk); + triangleDepth = bodyDepth - .02; + disc(faceX + offset + pupilX, eyeY + pupilY, + pupilRadius, pupilInk); + triangleDepth = bodyDepth - .012; + } + } + if (player.bot && player.alive && !player.blocking) { + const browY = eyeY - r * .32; + stroke(faceX - eyeGap - eyeWidth * 1.25, browY - r * .08, + faceX - eyeGap + eyeWidth * 1.25, browY + r * .1, + lineWidth * 1.15); + stroke(faceX + eyeGap - eyeWidth * 1.25, browY + r * .1, + faceX + eyeGap + eyeWidth * 1.25, browY - r * .08, + lineWidth * 1.15); + } + if (grieving) { + const tear = [112, 208, 255]; + const fall = (t * 34) % Math.max(3, r * .55); + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset, eyeY + eyeWidth * 1.5, + faceX + offset, eyeY + eyeWidth * 1.5 + r * .34 + fall, + Math.max(1.5, lineWidth * .72), tear); + } + const mouthY = head.y + r * .3; + if (spitting) { + const release = 1 - clamp(spitAge / 190000, 0, 1); + const lip = player.spitHeavy ? [226, 58, 126] : [232, 92, 132]; + // faceX already carries .08r of facing offset; another .12r makes this + // exactly the .20r face-space mouth used by spitMouthPose(). + ring(faceX + direction * r * .12, mouthY, + r * (.105 + release * .055), Math.max(.7, r * .055), lip); + } else if (player.resultReaction === "LAUGH") { + const age = Math.max(0, (now - player.resultReactionAt) / 1000000); + const open = .35 + Math.abs(Math.sin(age * 18)) * .65; + ring(faceX + direction * r * .08, mouthY, + r * (.12 + open * .1), r * .045, color); + for (let index = 0; index < 3; index++) { + const noteAge = (age * .72 + index * .27) % 1; + const note = index % 2 ? "♫" : "♪"; + glyph(note, + faceX + direction * r * (.34 + noteAge * 1.25) + index * direction * 3, + mouthY - r * (.25 + noteAge * 1.75), + Math.max(8, r * (.55 - noteAge * .16)), ...color); + } + } else if (celebrating || victoryAmount > 0) { + const grin = r * (.09 + victoryAmount * .2); + const width = r * (.23 + victoryAmount * .12); + stroke(faceX - width, mouthY - grin * .18, faceX, + mouthY + grin, lineWidth); + stroke(faceX, mouthY + grin, faceX + width, + mouthY - grin * .18, lineWidth); + // Hearts off a winner, on the laugh notes' trick: a few glyphs on + // staggered loops. A reel carries no HUD to announce the win, so the + // celebration has to be legible on the face itself. + if (victoryAmount > 0) { + const age = deathCinematicAge(now); + for (let index = 0; index < 3; index++) { + const rise = (age * .6 + index * .34) % 1; + const drift = Math.sin(age * 2.2 + index * 2.4) * r * .22; + glyph("♥", + faceX + drift + (index - 1) * r * .42, + mouthY - r * (.95 + rise * 2.1), + Math.max(7, r * (.46 - rise * .17) * victoryAmount), + 255, 96 + index * 22, 148); + } + } + } else if (player.attackKind && meleePulse(player, now) > 0) { + ring(faceX + direction * r * .12, mouthY, + Math.max(1.8, r * .13), Math.max(.4, r * .05), color); + } else if (player.blocking) { + stroke(faceX - r * .26, mouthY, faceX + r * .26, mouthY, lineWidth); + } else if (grieving || !player.alive || player.hit > .6) { + stroke(faceX - r * .24, mouthY + r * .08, faceX, + mouthY - r * .06, lineWidth); + stroke(faceX, mouthY - r * .06, faceX + r * .24, + mouthY + r * .08, lineWidth); + } else { + const smile = Math.sin(t * 2.4 + player.pad) * r * .035; + stroke(faceX - r * .23, mouthY - smile, faceX, + mouthY + r * .09, lineWidth); + stroke(faceX, mouthY + r * .09, faceX + r * .23, + mouthY - smile, lineWidth); + } + triangleDepth = bodyDepth; +} + +function drawInventory(player, now, geometry) { + // A bodyless head carries nothing visible. The sword rode a phantom + // forearm and read as a dark clock hand sweeping through the rolled face — + // steel that never turned with the head it was stuck to. The head keeps its + // items and can still fire; it just doesn't brandish them. + if (isHeadOnly(player)) return; + const scale = cameraScale(); + const gunColor = player.gunMode === "ROCKET LAUNCHER" ? [48, 61, 52] + : player.gunMode === "RUBBER SMG" ? [38, 53, 72] + : player.gunMode === "SPACE LASER" ? [58, 92, 122] : [63, 43, 76]; + const grenadeColor = [255, 105, 105]; + const firing = player.itemAction === "FIRE" && now < player.itemActionUntil; + const throwing = player.itemAction === "THROW" && now < player.itemActionUntil; + // A bash keeps the grenade visible in the fist; itemHandTarget already + // parks both weapons on the swinging hand. + const bashing = player.attackKind === "BASH" && itemSwinging(player, now); + if (player.swordHeld && player.gunAmmo <= 0 && !throwing && + hasPart(player, itemHand(player))) { + // The hilt pins to the hand the silhouette actually draws — the far end + // of the item arm's forearm capsule — and the blade lies along that + // forearm, so grip and angle ride the limb through idle sway, stride, + // whips, freezes, and replays. The gun's aim pose floated here: with no + // ammo the arm never presents, leaving steel mid-air at a fixed angle. + const limbs = geometry.segments; + const forearm = limbs.find((segment) => segment.role === "item-forearm" || + segment.role === "attack-forearm") || + limbs.find((segment) => segment.role?.endsWith("forearm") && + segment.part === itemHand(player)) || + limbs.find((segment) => segment.role?.endsWith("forearm")); + if (forearm) { + const hand = { x: forearm.x2, y: forearm.y2 }; + const alongX = hand.x - forearm.x1; + // A hanging arm would drive the tip into the dirt, so the fist rolls + // the blade skyward at rest; swings still lay steel along the striking + // forearm because melee targets sit at shoulder height. + const alongY = -Math.abs(hand.y - forearm.y1); + const length = Math.hypot(alongX, alongY) || 1; + const tipX = hand.x + alongX / length * 118 * scale; + const tipY = hand.y + alongY / length * 118 * scale; + const acrossX = -alongY / length; + const acrossY = alongX / length; + // Steel became light. Three passes down the same line — a wide halo in + // the fighter's OWN color, then a narrower saturated sheath, then a + // white core — because a blade drawn in one flat tone reads as a stick, + // and because in a versus round the two blades then say which fighter + // is which from across the map, the way the handle colors already do. + // The hum lives in the halo's width: it breathes on the same clock the + // pickups bob on, so a held saber is never a still object. + const hum = 1 + .12 * Math.sin(now / 82000); + const halo = mixColor(player.color, [14, 20, 36], .35); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(4, 13 * scale * hum), halo); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(3, 8 * scale), player.color); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(1.5, 3.5 * scale), [244, 252, 255]); + // The hilt stays machined and dark: it is the one part of a saber that + // is an object, and it is what keeps the blade from reading as a beam + // fired out of a bare fist. + filledCapsule(hand.x + acrossX * 11 * scale, hand.y + acrossY * 11 * scale, + hand.x - acrossX * 11 * scale, hand.y - acrossY * 11 * scale, + Math.max(2, 5 * scale), [148, 156, 172]); + filledCapsule(hand.x, hand.y, + hand.x - alongX / length * 18 * scale, + hand.y - alongY / length * 18 * scale, + Math.max(2, 6 * scale), [34, 30, 40]); + } + } + if ((player.gunAmmo > 0 || firing) && !throwing) { + const forearm = itemForearm(player, geometry); + if (!forearm) return; + const pose = gunPose(player, now); + const projectedHand = projectPoint(pose.hand.x, pose.hand.y, pose.hand.z); + // Render reactions and replay poses may move the drawn skeleton after + // projection. Its actual wrist remains the final attachment point. + const hand = {x:forearm.x2, y:forearm.y2}; + const offsetX = hand.x - projectedHand.x, offsetY = hand.y - projectedHand.y; + const projectWeapon = (x, y, z) => { + const point = projectPoint(x, y, z); + return {x:point.x + offsetX, y:point.y + offsetY}; + }; + const barrel = projectWeapon(pose.muzzle.x, pose.muzzle.y, pose.muzzle.z); + const barrelWidth = Math.max(3, 9 * scale); + const gripWidth = Math.max(2, 6 * scale); + // Xbox batches its native line layer underneath GPU fighter triangles. + // Held items therefore use the same depth-aware capsule path as the hand. + if (photoThemeActive) { + // Place the photograph's grip at the solved wrist. Reflect its local X + // before rotation so aiming left does not turn the grip upside down. + const dx = barrel.x - hand.x, dy = barrel.y - hand.y; + const length = Math.hypot(dx, dy) || 1; + const flip = player.facing < 0; + const width = Math.max(18, length / .72), height = width * 253 / 365; + const angle = Math.atan2(dy, dx) - (flip ? Math.PI : 0); + const ox = (flip ? -1 : 1) * width * .25, oy = -height * .1; + const c = Math.cos(angle), s = Math.sin(angle); + if (!drawPhotoHeldWeapon(player.gunMode,hand,barrel,flip,triangleDepth-.025)) + photoSprite("gun", hand.x + ox*c - oy*s, hand.y + ox*s + oy*c, + width, height, angle, flip, triangleDepth - .025); + } else { + filledCapsule(hand.x, hand.y, barrel.x, barrel.y, + barrelWidth, gunColor); + const gripX = hand.x - player.facing * 8 * scale; + const gripY = hand.y + 20 * scale; + filledCapsule(hand.x, hand.y, gripX, gripY, gripWidth, gunColor); + if (player.gunMode === "RUBBER SMG") { + // One uninterrupted dark silhouette: longer receiver, rear stock, and a + // forward magazine distinguish it from the short pistol in-hand. + const stockX = hand.x - pose.dx * 32 * scale; + const stockY = hand.y - pose.dy * 32 * scale; + filledCapsule(hand.x, hand.y, stockX, stockY, + barrelWidth * 1.12, gunColor); + const magazineX = hand.x + pose.dx * 18 * scale - pose.dy * 17 * scale; + const magazineY = hand.y + pose.dy * 18 * scale + pose.dx * 17 * scale; + filledCapsule(hand.x + pose.dx * 18 * scale, + hand.y + pose.dy * 18 * scale, magazineX, magazineY, + gripWidth, gunColor); + } + if (player.gunMode === "ROCKET LAUNCHER") { + const rearX = hand.x - pose.dx * 38 * scale; + const rearY = hand.y - pose.dy * 38 * scale; + filledCapsule(rearX, rearY, barrel.x, barrel.y, + barrelWidth * 1.8, gunColor); + filledDisc(barrel.x, barrel.y, barrelWidth * 1.45, [104, 62, 48]); + } + } + if (firing) { + const flashAngle=Math.atan2(barrel.y-hand.y,barrel.x-hand.x); + const flashSize=Math.max(18,54*scale); + const photoFlash=photoEffectSprite(3,photoWeaponRegions.flash, + barrel.x+Math.cos(flashAngle)*flashSize*.43, + barrel.y+Math.sin(flashAngle)*flashSize*.43, + flashSize,flashSize*.61,flashAngle,false,triangleDepth-.03,false); + if (!photoFlash) { + const normalX = -pose.dy; + const normalY = pose.dx; + const flashA = projectWeapon( + pose.muzzle.x + pose.dx * 28 + normalX * 18, + pose.muzzle.y + pose.dy * 28 + normalY * 18, pose.muzzle.z); + const flashB = projectWeapon( + pose.muzzle.x + pose.dx * 28 - normalX * 18, + pose.muzzle.y + pose.dy * 28 - normalY * 18, pose.muzzle.z); + filledCapsule(barrel.x, barrel.y, flashA.x, flashA.y, + Math.max(2, 5 * scale), [255, 248, 190]); + filledCapsule(barrel.x, barrel.y, flashB.x, flashB.y, + Math.max(2, 5 * scale), [255, 248, 190]); + } + } + } + if (throwing || bashing) { + const target = itemHandTarget(player, now); + const hand = projectPoint(target.x, target.y, target.z); + if (!photoEffectSprite(3,photoWeaponRegions.grenade,hand.x,hand.y, + Math.max(8,24*scale),Math.max(12,38*scale),0,false,triangleDepth-.03,true)) + hudCircle(hand.x, hand.y, Math.max(5, 15 * scale), + Math.max(2, 5 * scale), grenadeColor); + } +} + +function drawDigitalHeadBurst(player, headWorld, age) { + const burstAge = Math.max(0, age - .11); + const origin = projectPoint(headWorld.x, headWorld.y, headWorld.z); + if (![origin.x, origin.y, origin.z].every(Number.isFinite) || + Math.abs(origin.x) > 30000 || Math.abs(origin.y) > 30000) return; + const palette = [ + [255, 48, 96], [176, 18, 54], [255, 92, 126], + player.color, [116, 8, 38], + ]; + const directions = [-2.92, -2.61, -2.3, -2.01, -1.72, -1.43, + -1.14, -.83, -.52, -.21, .1, .41, .72, 1.03]; + for (let index = 0; index < directions.length; index++) { + const angle = directions[index] + (player.pad ? .14 : -.14); + const speed = 48 + index * 4; + const fall = 10 * burstAge + 72 * burstAge * burstAge; + for (let speck = 0; speck < 3; speck++) { + const spread = .38 + speck * .29; + const distance = (5 + speed * burstAge) * spread; + const depth = (index % 3 - 1) * (3 + burstAge * 9) * spread; + const point = projectPoint( + headWorld.x + Math.cos(angle) * distance, + headWorld.y + Math.sin(angle) * distance + fall * spread, + headWorld.z + depth); + if (![point.x, point.y, point.z].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + triangleDepth = point.z; + const pixel = clamp((2.6 - speck * .48) * cameraScale(), 1.5, 4); + screenRect(point.x - pixel / 2, point.y - pixel / 2, + pixel, pixel, palette[(index + speck) % palette.length]); + } + } + // The face becomes a small broken core rather than remaining an intact disc. + const core = Math.max(2, headWorld.radius * cameraScale() * + Math.max(.08, 1 - burstAge * 6.2)); + triangleDepth = origin.z; + for (let index = 0; index < 4; index++) { + const side = index % 2 ? 1 : -1; + const row = index < 2 ? -1 : 1; + const size = core * (.62 + index * .05); + screenRect(origin.x + side * core * .32 - size / 2, + origin.y + row * core * .3 - size / 2, size, size, + palette[index % palette.length]); + } +} + +function drawBrokenRunner(player, age) { + const world = player.frozenGeometry || + runnerWorldGeometry(player, (runtime().monotonicUs - startedAt) / 1000000); + const slow = Math.max(0, age - .11) * .32; + const gravity = 420 * slow * slow; + const outline = [8, 12, 24]; + for (let index = 0; index < world.segments.length; index++) { + const segment = world.segments[index]; + const midX = (segment.x1 + segment.x2) / 2; + const midY = (segment.y1 + segment.y2) / 2; + const side = index % 2 ? 1 : -1; + const dx = (side * (72 + index * 9) - player.facing * 34) * slow; + const dy = -(150 + index * 13) * slow + gravity; + const dz = side * (24 + index * 4) * slow; + const angle = side * slow * (1.15 + index * .08); + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + const move = (x, y, z) => { + const localX = x - midX; + const localY = y - midY; + return { x: midX + localX * cosine - localY * sine + dx, + y: midY + localX * sine + localY * cosine + dy, + z: z + dz }; + }; + const first = move(segment.x1, segment.y1, segment.z1); + const second = move(segment.x2, segment.y2, segment.z2); + const a = projectPoint(first.x, first.y, first.z); + const b = projectPoint(second.x, second.y, second.z); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite) || + [a.x, a.y, b.x, b.y].some((value) => Math.abs(value) > 30000)) + continue; + triangleDepth = projectPoint(midX + dx, midY + dy, + (segment.z1 + segment.z2) / 2 + dz).z; + const width = Math.max(2, segment.width * cameraScale()); + if (photoThemeActive) photoLimb({x1:a.x,y1:a.y,x2:b.x,y2:b.y,width}, player.pad); + else { + filledCapsule(a.x, a.y, b.x, b.y, width + 3, outline); + filledCapsule(a.x, a.y, b.x, b.y, width, player.color); + } + } + drawDigitalHeadBurst(player, world.head, age); +} + +function deathCinematicAge(now = runtime().monotonicUs) { + return deathCinematic ? (now - deathCinematic.startedAt) / 1000000 : -1; +} + +function drawDeathFlash() { + // Results and every replay angle keep the arena visible, including pre-hit frames. + if (roundResult || finalKillReplayRendering) return; + const age = deathCinematicAge(); + if (age < 0 || age >= .11) return; + const previousDepth = triangleDepth; + triangleDepth = -1.425; + const flash = age < .055 ? [255, 255, 255] : [255, 226, 116]; + screenRect(0, 0, viewWidth(), viewHeight, flash); + triangleDepth = previousDepth; +} + +function drawRunner(player, t, showLabel = true) { + // A fighter who is down is still on the stage: they read as the broken body + // rather than as nothing. There is no state in which a fighter is skipped. + const headBurstAge = player.headBustedAt + ? Math.max(0, (runtime().monotonicUs - player.headBustedAt) / 1000000) : -1; + if (!player.alive && headBurstAge >= .11) { + drawBrokenRunner(player, headBurstAge); + if (["CRY", "WOE", "SULK"].includes(player.resultReaction)) { + const head = player.frozenGeometry?.head; + if (head) { + // In screen proportion to the head, not in pixels: the celebration + // camera can fill the frame with this face, and fixed-size tears on a + // huge head read as dust. Ratios match the old look at the old + // distance (a ~22px head wore 7/34/3px tears). + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const r = Math.max(4, Math.hypot(edge.x - point.x, edge.y - point.y)); + const sway = Math.sin(t * 11) * r * .22; + for (const side of [-1, 1]) + filledCapsule(point.x + side * r * .32 + sway, point.y, + point.x + side * r * .32 - sway, + point.y + r * 1.5 + (t * 31) % (r * .8), + Math.max(1.5, r * .14), [112, 208, 255]); + } + } + return; + } + if (player.fallenBodyGeometry) { + const fallen = projectRunnerWorldGeometry(player.fallenBodyGeometry); + drawSkeletonSegments(fallen.segments, player.color, [8, 12, 24], photoThemeActive ? player : null); + } + const geometry = player.replayGeometry + ? projectRunnerWorldGeometry(player.replayGeometry) + : player.frozenGeometry + ? projectRunnerWorldGeometry(player.frozenGeometry) + : runnerGeometry(player, t); + if (roundResult && player.resultReaction) { + const age = (runtime().monotonicUs - player.resultReactionAt) / 1000000; + const amount = player.resultReaction === "POSE" || + player.resultReaction === "SULK" ? 3 : 8; + const dx = Math.sin(age * (player.resultReaction === "DANCE" ? 15 : 9)) * amount; + const dy = player.resultReaction === "DANCE" + ? -Math.abs(Math.sin(age * 9)) * 15 + : Math.sin(age * 12) * amount * .35; + geometry.head.x += dx; + geometry.head.y += dy; + for (const segment of geometry.segments) { + segment.x1 += dx; segment.x2 += dx; + segment.y1 += dy; segment.y2 += dy; + } + } + // Preserve the fighter's identity color during hit flash. A pure white body + // disappeared against the daylight arena, so impact now changes only its rim. + const color = player.color; + const outline = player.hit > 0 + ? mixColor([255, 232, 92], [28, 34, 52], visualTheme.light) + : [8, 12, 24]; + const displayNow = player.frozenAt || runtime().monotonicUs; + if (player.skateboard) drawSkateboard(player); + drawFighterSilhouette(geometry, color, outline, player); + const hitNow = runtime().monotonicUs; + if (player.hitSegment >= 0 && hitNow < player.hitSegmentUntil && + Math.floor(hitNow / 45000) % 2 === 0) { + const segment = geometry.segments[player.hitSegment]; + if (segment) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + Math.max(3, 5 * cameraScale()), [255, 238, 102]); + } + } + // Every fighter wears its face everywhere now, the title included. The + // still tableau used to sit faceless — a sparring-partner special case + // grown from the old dummy door — but the wordmark screen is the + // storefront, and whoever sits under it should look back. + drawFace(player, geometry.head, contrastShadow(color), t, displayNow); + drawInventory(player, displayNow, geometry); + drawDistantFighterLocator(player, geometry.head); + if (player.blocking) { + const worldShield = shieldGeometry(player); + const shield = projectPoint(worldShield.x, worldShield.y, worldShield.z); + const radius = Math.max(18, worldShield.radius * cameraScale()); + const shieldColor = player.blockFlash > 0 ? [255, 255, 255] : player.color; + const outerWidth = Math.max(4, 11 * cameraScale()); + filledRing(shield.x, shield.y, radius, + Math.max(0, radius - outerWidth), shieldColor); + } + +} + +function drawDiveMotion(player, t) { + if (player.grounded || (!player.pounding && !player.pogoDive)) return; + const level = player.pounding ? Math.max(1, player.poundLevel || 1) : 1; + const speed = clamp(Math.abs(player.vy) / poundMaxVelocity, .25, 1.8); + const color = mixColor(player.color, + level === 3 ? [255, 80, 92] : level === 2 ? [255, 190, 62] : [255, 245, 196], + .46 + level * .12); + const count = 3 + level * 3; + for (let index = 0; index < count; index++) { + const spread = (index - (count - 1) / 2) * 24; + const wobble = Math.sin(t * 13 + index * 2.1) * 9; + const x = player.x + spread + wobble; + const startY = player.y - 125 - index % 2 * 36; + const endY = startY - (95 + index * 17) * speed; + worldCapsule(x, startY, player.z + 18, x, endY, player.z + 18, + 3 + speed * 3 + level, color, .028); + } +} + +function drawDoubleJumpMotion(player, t) { + const now = runtime().monotonicUs; + if (now >= (player.doubleJumpLinesUntil || 0)) return; + const life = clamp((player.doubleJumpLinesUntil - now) / 280000, 0, 1); + const color = mixColor(player.color, [244, 250, 255], .55); + for (let index = 0; index < 7; index++) { + const spread = (index - 3) * 24 + Math.sin(t * 18 + index) * 5; + const startY = player.y + 28 + (index % 2) * 18; + const endY = startY + (70 + index * 11) * life; + worldCapsule(player.x + spread, startY, player.z + 16, + player.x + spread, endY, player.z + 16, + 3 + life * 3, color, .029); + } +} + +// Hitboxes are an inspector, not a garnish. They used to flash on every +// impact for anyone watching, which put green boxes over ordinary play and +// over every recording of it. VIEW (tab) is now the only thing that shows +// them — `impactHitboxesUntil` still times the flash, but only for someone +// who has already asked to see the geometry. +// Rectangle outlines need square joins, not tessellated semicircle caps. +function debugCapsule(x1, y1, x2, y2, width, color) { + if (nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy); + const c = length ? dx / length : 1, sn = length ? dy / length : 0; + const radius = width / 2; + const nx = -sn * radius, ny = c * radius; + x1 -= c * radius; y1 -= sn * radius; + x2 += c * radius; y2 += sn * radius; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); +} + +function drawDebugHitboxes(player, t) { + if (renderFlags.hud === false || !debugHitboxes || !player.alive) return; + const now = player.frozenAt || runtime().simMonotonicUs || runtime().monotonicUs; + const boxes = sampleCombatBoxes(player, now, null, false); + const hurtColor = [82, 226, 116]; + const pushColor = [255, 158, 54]; + const attackColor = [255, 58, 64]; + const guardColor = [186, 118, 255]; + const draw = (b, color, width = 2) => { + const z = (b.near+b.far)/2; + const points = [[b.left,b.top],[b.right,b.top],[b.right,b.bottom],[b.left,b.bottom]] + .map(([x,y])=>projectPoint(x,y,z)); + for (let i=0;i<4;i++) { + const a=points[i], next=points[(i+1)%4]; + debugCapsule(a.x,a.y,next.x,next.y,width,color); + } + }; + for (const b of boxes.hurt) draw(b,hurtColor); + draw(boxes.push,pushColor); + for (const b of boxes.guard) draw(b,guardColor,3); + for (const b of boxes.hit) draw(b,attackColor,4); +} + +// The frame meter. One pip per simulation frame, oldest on the left, the +// frame happening now at the right edge -- so an exchange reads left to +// right the way it happened, and the thing you just did is under your eye +// rather than across the screen. +// +// Two rows, one per fighter, stacked so the frames line up vertically: that +// column alignment IS the instrument. Reading "my recovery sits under their +// active" off two rows is the whole reason a frame meter exists, and it is +// why this is a stacked pair rather than one row per player somewhere +// convenient. +function drawFrameMeter() { + if (!debugHitboxes || renderFlags.hud === false) return; + if (!frameMeters.some((meter) => meter.length)) return; + const safe = hudSafeRect(); + const pip = Math.max(2, Math.min(7, Math.floor( + (safe.right - safe.left) * .55 / frameMeterLength) - 1)); + // Native meters draw contiguous color runs, preserving each frame boundary + // while avoiding hundreds of separate triangle submissions per frame. + const gap = pip > 3 && !nativeHudOverlay && !nativeTrianglePass ? 1 : 0; + // Tall enough to read a color at a glance. The pips are the resolution; + // the row height is only whether you can see them, and a meter you have to + // lean toward is a meter nobody reads mid-fight. + const rowHeight = Math.max(11, pip * 2); + const width = frameMeterLength * (pip + gap); + // Centred, and lifted clear of the bottom furniture -- the session name, + // the bug and the opponent label all live along that edge, and the first + // placement laid the meter straight across them. + const left = Math.round((safe.left + safe.right - width) / 2); + const top = safe.bottom - rowHeight * 2 - 58; + for (const player of players) { + const meter = frameMeters[player.pad]; + const y = top + player.pad * (rowHeight + 3); + // The empty track, so a meter that has not filled yet reads as a meter + // rather than as nothing having happened. + hudBox(left, y, width, rowHeight, 16, 19, 30); + // Adjacent equal pips without a gap are one rectangle. + for (let index = 0; index < meter.length;) { + const key = meter[index]; + let end = index + 1; + if (!gap) while (end < meter.length && meter[end] === key) end++; + const state = frameMeterStates[key] || frameMeterStates.neutral; + const x = left + width - (meter.length - index) * (pip + gap); + hudBox(x, y, pip * (end - index), rowHeight, ...state.ink); + index = end; + } + // Whose row this is, in their own color, at the left end where it cannot + // sit on top of the frames anybody is actually reading. + typeWrite("P" + (player.pad + 1), left - 30, y, 15, ...player.color); + } + // The legend, once, above the pair -- and only the states the last two + // seconds actually contained, because a legend listing colors that are not + // on screen is a thing to decode rather than a thing to read. + const seen = new Set(); + for (const meter of frameMeters) for (const state of meter) + if (frameMeterStates[state]?.label) seen.add(state); + let x = left; + for (const state of seen) { + const entry = frameMeterStates[state]; + hudBox(x, top - 17, 9, 9, ...entry.ink); + typeWrite(entry.label, x + 13, top - 19, 13, 168, 178, 200); + x += 20 + entry.label.length * 8; + } +} + +function drawPlayerHud(player, x, pad) { + const color = visualTheme.light > .55 + ? player.pad === 0 ? [155, 34, 108] : [105, 78, 0] + : player.color; + let label = "P" + (player.pad + 1) + " " + player.roundWins + "/" + + matchWins + " PTS " + player.score; + typeWrite(label, x, 14, 22, ...color); +} + +function visibleHandle(player) { + return (globalThis.__oskiewarDeviceHandles?.[player.pad] || player.name).toLowerCase(); +} + +function nationFlag(country) { + const code = String(country || "").toUpperCase(); + if (!/^[A-Z]{2}$/.test(code)) return ""; + return [...code].map((letter) => String.fromCodePoint( + 0x1f1e6 + letter.charCodeAt(0) - 65)).join(""); +} + +const reelProgressInset = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelFullUi === true + ? compactLayout() ? 42 : 50 : 0; + +function playerHandleLayout(player, side) { + const safe = hudSafeRect(); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 24 : hudTypeSize; + const width = handleWidth(visibleHandle(player), size); + // One name per corner: the left fighter reads from the left edge, the + // right fighter from the right. The command phrase mirrors to the inside, + // so neither name has to give up its corner to make room for it. + const x = freeForAll() ? (side === 0 ? safe.left + 8 + : side === 1 ? (safe.left + safe.right - width) / 2 : safe.right - 8 - width) + : side === 0 ? safe.left + 8 : safe.right - 8 - width; + const y = safe.bottom - size - (touch ? 250 : 18) - reelProgressInset(); + return { x, y, size, width }; +} + +function drawFloatingHandle(player, x, y, size) { + const handle = visibleHandle(player); + const shadows = player.handleColors?.map(runShadow); + drawHandle(handle, x + 3, y + 4, size, shadows, runShadow(player.color)); + drawHandle(handle, x, y, size, player.handleColors, player.color); +} + +function drawPlayerHandle(player, t, side) { + const { x, y, size } = playerHandleLayout(player, side); + const handle = visibleHandle(player); + const colors = globalThis.__oskiewarDeviceHandles?.[player.pad] + ? globalThis.__oskiewarDeviceHandleColors?.[player.pad] : player.handleColors; + const drawGlyphs = (dx, dy, colors, fallback) => { + let cursor = x + dx; + for (let index = 0; index < handle.length; index++) { + const character = handle[index]; + typeWrite(character, cursor, y + dy, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + drawGlyphs(3, 4, colors?.map(runShadow), runShadow(player.color)); + drawGlyphs(0, 0, colors, player.color); + const flag = nationFlag(player.nation); + if (flag) { + const flagSize = Math.round(size * .92); + const flagX = side === 0 ? x : x + Math.max(0, handleWidth(handle, size)); + systemWrite(flag, flagX, y - flagSize * 1.05, flagSize, 255, 255, 255); + } +} + +// One name at reel scale: the fighter's own per-glyph palette, every letter on +// its own phase, shadow pass under color pass. Shared by the opening matchup +// and the winner's card, so the only two frames of a reel that carry type +// carry it identically. Advance is keyed to the flat size, so the swell never +// walks the letters apart. +function drawReelName(text, y, size, player, t) { + const total = handleWidth(text, size); + const pass = (dx, dy, colors, fallback) => { + let cursor = viewCenterX() - total / 2 + dx; + for (let index = 0; index < text.length; index++) { + const character = text[index]; + const swell = size * (1 + .07 * Math.sin(t * 6 + index * .9)); + const bob = Math.sin(t * 5.2 + index * .8) * size * .09; + typeWrite(character, cursor - (swell - size) * .5, + y + dy + bob - (swell - size) * .5, swell, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + const plain = player?.color || [245, 248, 255]; + pass(4, 5, player?.handleColors?.map(runShadow), runShadow(plain)); + pass(0, 0, player?.handleColors, plain); +} + +function playerStatLines(player) { + const pad = inputPads[player.pad] || + { connected: false, down: [], leftX: 0, leftY: 0 }; + const input = quantizedInput(pad, player.suppressedDirections); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const phase = "anim " + animation.state + " " + animation.step + "/" + animation.steps + + " tick " + animation.tick; + if (player.npc && !player.bot) { + const parts = player.spiderDummy + ? [...spiderLegParts, "torso"] : [...limbParts, "torso"]; + const remaining = parts.filter((part) => hasPart(player, part)).length; + const damage = parts.reduce((total, part) => + total + Number(player.partDamage?.[part] || 0), 0); + return [ + "p" + (player.pad + 1) + " " + (player.spiderDummy ? "spider dummy" : "training dummy"), + "parts " + remaining + "/" + parts.length + " damage " + damage, + phase, + ]; + } + return [ + "p" + (player.pad + 1) + " " + player.stance + + (player.attackKind ? " + " + player.attackKind : ""), + "input " + input.horizontal + "," + input.vertical + + " stick " + pad.leftX.toFixed(2) + " vx " + Math.round(player.vx), + phase, + ]; +} + +const playerStatSize = () => compactLayout() ? 16 : 22; +const playerStatPanelHeight = () => { + const size = playerStatSize(); + return 16 + 3 * (size + 7) + 10; +}; + +const debugReadoutMetaSize = () => compactLayout() ? 19 : 24; +const debugReadoutTimingSize = () => + Math.max(17, Math.round(debugReadoutMetaSize() * .76)); +// The band the measured-performance read-out owns, just above the nameplate. +// Everything that stacks over a handle reserves it rather than sharing it: the +// console has always printed a second timing row there and it landed exactly on +// the state card's `anim::` line, and the browser started printing one the day +// it began timing its own frames. Both rows are reserved whether or not the +// host fills the second — the card above must not breathe when a measurement +// finally arrives, the same fixed-chassis rule the card itself follows. +const debugReadoutHeight = () => debugHitboxes + ? debugReadoutMetaSize() + 6 + debugReadoutTimingSize() + 5 + : bareFrameRateShown() ? debugReadoutMetaSize() + 11 : 0; + +// The state trace owns a fixed stack over each handle without a container. +const statStackHeight = () => debugHitboxes + ? debugReadoutHeight() + playerStatPanelHeight() + 8 : debugReadoutHeight(); + +function drawPlayerStats(player, side, t) { + if (!debugHitboxes) return; + const lines = playerStatLines(player); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const size = playerStatSize(); + const padding = 8; + const lineHeight = size + 7; + const safe = hudSafeRect(); + // A diagnostic instrument has fixed columns: changing signs and tick counts + // must not make its chassis breathe every frame. + // The tick and velocity columns are the longest legal row, so the chassis + // reserves their full Xbox-width footprint instead of clipping their tail. + const width = compactLayout() ? 360 : 520; + const height = playerStatPanelHeight(); + const handle = playerHandleLayout(player, side); + const x = side === 0 ? safe.left : safe.right - width; + const y = handle.y - debugReadoutHeight() - height - 12; + const previousDepth = triangleDepth; + triangleDepth = -1.445; + for (let row = 0; row < lines.length; row++) { + const rowY = y + padding + row * lineHeight; + writeHudLine(lines[row], x + padding, rowY, size); + } + triangleDepth = previousDepth; +} + +function drawHudInventory(player, side) { + const items = []; + if (player.gunAmmo > 0) items.push("gun " + player.gunAmmo); + if (player.grenadeAmmo > 0) items.push("grenade " + player.grenadeAmmo); + if (!items.length) return; + const text = items.join(" "); + const handle = playerHandleLayout(player, side); + const size = Math.round(hudTypeSize * .62); + const width = handleWidth(text, size); + const x = side === 0 ? handle.x : handle.x + handle.width - width; + // Commands own the rows immediately above the fighter's name. Inventory + // starts above whichever of those rows are still visible, so neither can + // drift over the other as the command history dissolves. + const y = handle.y - statStackHeight() - commandStreamStackHeight(player) - + size - 7; + const shadow = contrastShadow(player.color); + typeWrite(text, x + 2, y + 3, size, ...shadow); + typeWrite(text, x, y, size, ...player.color); +} + +function spatialHudPlayers() { + if (freeForAll()) return players.slice().sort((a, b) => a.x - b.x); + const left = players[hudLeftPad] || players[0]; + const other = players[left.pad === 0 ? 1 : 0]; + // Preserve the lane through the instant of overlap, then swap once the + // crossing is visually unambiguous. This prevents one-frame HUD chatter. + if (other.x < left.x - 36) hudLeftPad = other.pad; + return [players[hudLeftPad], players[hudLeftPad === 0 ? 1 : 0]]; +} + +// How present one glyph of the buffer is. `settle` is how far into the idle +// the dissolve has travelled: 0 for as long as the pad is still saying +// something, 1 once the whole stream has left. Doubling it and offsetting by +// each glyph's place in the stream spends the first half on the oldest glyph +// and the last half on the newest, so the buffer leaves in reading order +// rather than dimming as one sheet. +function commandFade(index, count, idle) { + const settle = clamp((idle - commandHoldUs) / commandFadeUs, 0, 1); + return clamp(index / Math.max(1, count - 1) + 1 - settle * 2, 0, 1); +} + +function commandStreamStackHeight(player, now = runtime().monotonicUs) { + const count = player.commandStream.length; + if (!count) return 0; + const idle = now - (player.commandStream.at(-1)?.at || now); + const visible = player.commandStream.reduce((total, entry, index) => + total + (commandFade(index, count, idle) > .01 ? 1 : 0), 0); + const handle = playerHandleLayout(player, player.pad); + const size = commandStreamTypeSize(handle.size); + const rows = Math.min(commandStreamRows, + Math.ceil(Math.min(commandStreamDepth, visible) / + commandStreamColumnsNow())); + return rows ? rows * (size + 7) + Math.ceil(size * .8) + 4 : 0; +} + +function drawCommandStream(player, side) { + const glyph = { LEFT: "<", RIGHT: ">", UP: "^", DOWN: "v" }; + const buttonFor = { LEFT: "ArrowLeft", RIGHT: "ArrowRight", + UP: "ArrowUp", DOWN: "ArrowDown", "/": "A", "*": "B", ")": "X", + "+": ["Y", "LeftShoulder", "RightShoulder"] }; + const now = runtime().monotonicUs; + const idle = now - (player.commandStream.at(-1)?.at || now); + const count = player.commandStream.length; + const held = inputPads[player.pad]?.down || []; + const entries = player.commandStream.map((entry, index) => ({ ...entry, + text: glyph[entry.label] || entry.label, + fade: commandFade(index, count, idle), + held: Array.isArray(buttonFor[entry.label]) + ? buttonFor[entry.label].some((button) => held.includes(button)) + : held.includes(buttonFor[entry.label]), + })).filter((entry) => entry.fade > .01); + // A held button lights only its newest appearance — not every earlier + // press of the same button still sitting in the buffer's history. + const claimed = new Set(); + for (let index = entries.length - 1; index >= 0; index--) { + const entry = entries[index]; + if (!entry.held) continue; + if (claimed.has(entry.label)) entry.held = false; + else claimed.add(entry.label); + } + if (!entries.length) return; + // The name owns its row. Commands stack in distinct rows above it, aligned + // to the same outside edge, so a long handle can never sit underneath its + // own input history. + entries.reverse(); + const handle = playerHandleLayout(player, side); + const size = commandStreamTypeSize(handle.size); + const columns = commandStreamColumnsNow(); + const lineEntries = entries.slice(0, commandStreamDepth); + const gap = Math.round(size * .34); + const rows = []; + for (let index = 0; index < lineEntries.length; index += columns) + rows.push(lineEntries.slice(index, index + columns)); + const safe = hudSafeRect(); + for (let row = 0; row < rows.length; row++) { + const rowEntries = rows[row]; + const width = rowEntries.reduce((sum, entry, index) => sum + + handleWidth(entry.text, size) + (index ? gap : 0), 0); + let cursor = side === 0 ? handle.x : handle.x + handle.width - width; + cursor = clamp(cursor, safe.left, safe.right - width); + const newestAt = Math.max(...rowEntries.map((entry) => entry.at)); + const rise = clamp((now - newestAt) / 900000, 0, 1) * size * .8; + const y = handle.y - statStackHeight() - (row + 1) * (size + 7) - rise; + for (const entry of rowEntries) { + const quiet = mixColor([104, 114, 136], [82, 90, 108], visualTheme.light); + const live = entry.held ? player.color : quiet; + const glyphInk = entry.fade >= 1 ? live + : mixColor(visualTheme.light > .5 ? [230, 239, 247] : [7, 8, 28], + live, entry.fade); + typeWrite(entry.text, cursor + 2, y + 3, size, + ...contrastShadow(glyphInk)); + typeWrite(entry.text, cursor, y, size, ...glyphInk); + cursor += handleWidth(entry.text, size) + gap; + } + } +} + +function drawFightIntro(introSeconds, titleInk, statusShadow) { + const centerX = viewCenterX(); + const centerY = (stageTop + stageBottom) / 2; + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const nameSize = touch ? 28 : compactLayout() ? 38 : 54; + const drawHeadName = (player) => { + const head = runnerWorldGeometry(player, + (runtime().monotonicUs - startedAt) / 1000000).head; + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const flash = .5 + .5 * Math.sin(introSeconds * Math.PI * 8); + const flashingSize = nameSize * (1 + flash * .1); + const width = handleWidth(visibleHandle(player), flashingSize); + drawFloatingHandle(player, point.x - width / 2, + point.y - radius - flashingSize * 1.28, flashingSize); + }; + if (freeForAll()) { + for (const player of players) drawHeadName(player); + return; + } + if (!reelGroundCamera() && introSeconds < 1) { + drawHeadName(players[0]); + return; + } + if (!reelGroundCamera() && introSeconds < 2) { + drawHeadName(players[1]); + return; + } + { + const title = "oskiewar"; + const titleSize = touch ? 54 : compactLayout() ? 72 : 98; + const width = handleWidth(title, titleSize); + let cursor = centerX - width / 2; + const titleTime = (runtime().monotonicUs - startedAt) / 1000000; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const advance = comicGlyphAdvance(character, titleSize); + typeWrite(character, cursor + 5, centerY - titleSize / 2 + 6, + titleSize, ...statusShadow); + typeWrite(character, cursor, centerY - titleSize / 2, + titleSize, ...animatedTitleColor(index, titleTime)); + cursor += advance; + } + return; + } +} + +function drawSurvivalIntro(titleInk, statusShadow) { + const callout = "climb!"; + const size = compactLayout() ? 74 : 112; + const width = handleWidth(callout, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(callout, x + 5, y + 7, size, ...statusShadow); + typeWrite(callout, x, y, size, ...titleInk); +} + +function drawSurvivalHud(titleInk) { + const safe = hudSafeRect(); + const score = Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 34 : 46; + const width = handleWidth(score, size); + const x = viewCenterX() - width / 2; + const y = safe.top + 2; + typeWrite(score, x + 3, y + 4, size, ...contrastShadow(titleInk)); + typeWrite(score, x, y, size, ...titleInk); +} + +function drawSurvivalResult(titleInk, statusShadow) { + const result = roundResult === "SUMMIT" ? "summit!" + : Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 58 : 82; + const width = handleWidth(result, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(result, x + 5, y + 7, size, ...statusShadow); + typeWrite(result, x, y, size, ...titleInk); +} + +function drawReelSectionProgress(now, titleInk) { + const safe = hudSafeRect(); + const gap = compactLayout() ? 5 : 8; + const widths = [.16, .68, .16]; + const labels = ["INTRO", "FIGHT", "OUTRO"]; + const available = safe.right - safe.left - gap * 2; + const resultDuration = matchOver ? matchResultUs : roundResultUs; + const introAge = Math.max(0, now - roundStartedAt); + const introLimit = roundIntroDurationUs(); + const section = roundResult ? 2 : introAge < introLimit ? 0 : 1; + const progress = section === 0 + ? clamp(introAge / introLimit, 0, 1) + : section === 1 + ? clamp(roundElapsedUs / roundDurationUs, 0, 1) + : clamp((now - roundOverAt) / resultDuration, 0, 1); + const labelSize = compactLayout() ? 18 : 22; + const barHeight = compactLayout() ? 6 : 8; + const barY = safe.bottom - barHeight; + const labelY = barY - labelSize - 7; + const track = mixColor([52, 58, 76], [170, 157, 137], visualTheme.light); + const done = mixColor([96, 222, 154], [31, 92, 76], visualTheme.light); + const hitMarks = Array.isArray(globalThis.__oskiewarFightHitForecast) + ? globalThis.__oskiewarFightHitForecast : fightHitMarks; + let x = safe.left; + for (let index = 0; index < widths.length; index++) { + const width = index === widths.length - 1 + ? safe.right - x : Math.round(available * widths[index]); + const amount = index < section ? 1 : index === section ? progress : 0; + hudBox(x, barY, width, barHeight, ...track); + if (amount > 0) hudBox(x, barY, width * amount, barHeight, + ...(index === section ? titleInk : done)); + if (index === 1) { + const markWidth = compactLayout() ? 5 : 6; + for (const mark of hitMarks) { + const markX = x + clamp(mark.at, 0, 1) * width; + const reached = roundElapsedUs / roundDurationUs >= mark.at; + const impactInk = mark.decisive ? [226, 42, 66] : mark.color; + hudBox(markX - markWidth / 2, barY - 3, + markWidth, barHeight + 6, + ...(reached ? impactInk : mixColor(track, impactInk, .72))); + } + } + const labelWidth = handleWidth(labels[index], labelSize); + typeWrite(labels[index], x + (width - labelWidth) / 2, + labelY, labelSize, ...(index === section ? titleInk : track)); + x += width + gap; + } +} + +function recordFightHit(sourcePad, decisive) { + if (roundResult || roundElapsedUs <= 0) return; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) return; + const fighter = players[sourcePad]; + fightHitMarks.push({ + at: clamp(roundElapsedUs / roundDurationUs, 0, 1), + color: fighter?.color ? [...fighter.color] : [226, 42, 66], + decisive: decisive === true, + }); +} + +// A pole or a branch crossing the near plane has the same problem a face does, +// and the same cure — trim the segment at the plane rather than letting the +// far end pin itself to the near distance and rake across the screen. Null is +// a segment wholly behind the camera. +// The band a face gets, for a line. A segment is two points with no polygon +// to cut, which is why this used to trim at the pin instead: cutting at the +// near plane and handing the result over whole let a line crossing the plane +// rake the length of the guard band. Trimming the PROJECTED segment gives the +// same protection without throwing the line away, so the cut can move back to +// the plane where it belongs. Liang–Barsky, carrying depth along t so a capsule +// still knows how far away its ends are. +function clipSegmentBand(from, to) { + const width = viewWidth(); + const minX = -width * guardBand, maxX = width * (1 + guardBand); + const minY = -viewHeight * guardBand, maxY = viewHeight * (1 + guardBand); + // Most segments sit whole inside the band — every grass blade, most limbs. + // Plain compares answer those; only a segment that actually crosses an + // edge pays for the parametric walk and its rebuilt endpoints. + if (from.x >= minX && from.x <= maxX && from.y >= minY && from.y <= maxY && + to.x >= minX && to.x <= maxX && to.y >= minY && to.y <= maxY) + return { from, to }; + const dx = to.x - from.x, dy = to.y - from.y; + let enter = 0, exit = 1; + for (const [edge, room] of [[-dx, from.x - minX], [dx, maxX - from.x], + [-dy, from.y - minY], [dy, maxY - from.y]]) { + if (edge === 0) { if (room < 0) return null; continue; } + const at = room / edge; + if (edge < 0) { if (at > exit) return null; if (at > enter) enter = at; } + else { if (at < enter) return null; if (at < exit) exit = at; } + } + const along = (t) => ({ x: from.x + dx * t, y: from.y + dy * t, + z: lerp(from.z, to.z, t) }); + return { from: along(enter), to: along(exit) }; +} +// Cut at the real near plane, the same one faces get. The pin is ten times +// further out, and while nothing in normal play passes within eighty units of +// the lens, the death cinematic drives the camera right down to the ground — +// so every limb and blade of grass in front of it was being dropped whole, +// which is what hollowed out the front of the frame on the zoom. +function worldSegment(x1, y1, z1, x2, y2, z2) { + let a = cameraDoll.toView({ x: x1, y: y1, z: z1 }); + let b = cameraDoll.toView({ x: x2, y: y2, z: z2 }); + if (a.z < cameraNear && b.z < cameraNear) return null; + if (a.z < cameraNear) + a = mixVertex(a, b, (cameraNear - a.z) / (b.z - a.z)); + else if (b.z < cameraNear) + b = mixVertex(b, a, (cameraNear - b.z) / (a.z - b.z)); + const from = cameraDoll.projectView(a); + const to = cameraDoll.projectView(b); + // Six plain checks instead of an array built per segment per frame. + return Number.isFinite(from.x) && Number.isFinite(from.y) && + Number.isFinite(from.z) && Number.isFinite(to.x) && + Number.isFinite(to.y) && Number.isFinite(to.z) + ? clipSegmentBand(from, to) : null; +} + +function worldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + line(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} + +function worldCapsule(x1, y1, z1, x2, y2, z2, width, color, + depthBias = -.004) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + const { from, to } = segment; + const previousDepth = triangleDepth; + triangleDepth = Math.min(from.z, to.z) + depthBias; + filledCapsule(from.x, from.y, to.x, to.y, width, color); + triangleDepth = previousDepth; +} + +function litQuadColor(a, b, c, color) { + // Lighting is decided in world space, off the surface the quad names, so it + // is the same shade however the clipper ends up cutting the face up. The + // cross, normalize and dot run in scalars: this is every wall panel every + // frame, and the vector objects were pure interpreter garbage. + const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z; + const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z; + const nx = aby * acz - abz * acy; + const ny = abz * acx - abx * acz; + const nz = abx * acy - aby * acx; + const magnitude = Math.hypot(nx, ny, nz) || 1; + const toward = (nx * -globalLight.x + ny * -globalLight.y + + nz * -globalLight.z) / magnitude; + const illumination = .72 + Math.max(0, toward) * .28; + return [Math.round(color[0] * illumination), + Math.round(color[1] * illumination), + Math.round(color[2] * illumination)]; +} +function worldQuad(a, b, c, d, color) { + const lit = litQuadColor(a, b, c, color); + worldTriangle(a, b, c, lit); + worldTriangle(a, c, d, lit); +} + +// Preserve the sampled silhouette, merging only collinear edges. +const terrainProfile = []; +function rebuildTerrainProfile() { + const points = []; + const step = (worldRight - worldLeft) / terrainSamples; + for (let i = 0; i <= terrainSamples; i++) { + const x = worldLeft + i * step; + const point = { x, y: terrainFloorAt(x) }; + while (points.length > 1) { + const a = points[points.length - 2], b = points[points.length - 1]; + if (Math.abs((b.y - a.y) * (point.x - b.x) - + (point.y - b.y) * (b.x - a.x)) > .00001) break; + points.pop(); + } + points.push(point); + } + terrainProfile.splice(0, terrainProfile.length, ...points); + rebuildTerrainDrawProfile(); +} +// The drawn silhouette. `terrainProfile` keeps every sampled height exactly +// (physics and the fidelity test read it); the console draws each profile +// point as six projections and two faces per pass, so the passes read this +// thinned copy instead — a point is dropped while every point it stood for +// stays within `terrainDrawTolerance` world units of the chord that +// replaces it (about a pixel at fight zoom). Flats were already one edge; +// this is for the ramps, where six samples a tile all survived. +const terrainDrawProfile = []; +const terrainDrawTolerance = 1; +function rebuildTerrainDrawProfile() { + const kept = []; + let anchor = 0; + kept.push(terrainProfile[0]); + for (let index = 2; index <= terrainProfile.length; index++) { + const a = terrainProfile[anchor]; + const candidate = terrainProfile[index] || null; + // Try to stretch the chord from the anchor over `index - 1` to `index`; + // when a point in between falls off it, `index - 1` becomes the anchor. + let fits = candidate !== null; + if (fits) { + const dx = candidate.x - a.x, dy = candidate.y - a.y; + const length = Math.hypot(dx, dy) || 1; + for (let between = anchor + 1; between < index; between++) { + const point = terrainProfile[between]; + const distance = Math.abs((point.x - a.x) * dy - (point.y - a.y) * dx) / length; + if (distance > terrainDrawTolerance) { fits = false; break; } + } + } + if (!fits) { + anchor = index - 1; + kept.push(terrainProfile[anchor]); + } + } + terrainDrawProfile.splice(0, terrainDrawProfile.length, ...kept); +} +rebuildTerrainProfile(); + +// The three terrain passes (surface, front wall, back wall) used to hand +// `worldQuad` four fresh corner objects per segment, and each quad ran its +// six vertices through the camera — so every profile point was projected +// twelve times per pass, and the terrain alone cost 8.4 ms of the console's +// interpreted frame (measured on the Xbox 2026-09-20; sim 5.6 + paint 14 ms +// at 1080p). Each pass now projects each point ONCE for its top vertex and +// once for its bottom, keeps the results in two flat scratch arrays, and +// reads a segment's four corners back from them. Segments that sit wholly +// in front of the camera and inside the guard band — nearly all of them — +// go straight to `projectedTriangle`; the rest fall back to `worldQuad`, so +// the near-plane and band clipping is exactly what it was. +const terrainScratch = { top: [], bottom: [] }; +function terrainVertex(slot, index, x, y, z) { + let vertex = slot[index]; + if (!vertex) vertex = slot[index] = { view: { x: 0, y: 0, z: 0 }, + screen: { x: 0, y: 0, z: 0 }, front: false, inBand: false, x: 0, y: 0, z: 0 }; + vertex.x = x; vertex.y = y; vertex.z = z; + const view = cameraDoll.toView(vertex, vertex.view); + vertex.front = view.z >= cameraNear; + vertex.inBand = vertex.front && + bandContains(cameraDoll.projectView(view, vertex.screen)); + return vertex; +} +// `bottomY` null: the bottom vertex shares the profile's y (the surface +// pass, top at z `zTop`, bottom at z `zBottom`). Otherwise a wall: both +// vertices at `zTop`, the bottom one dropped to `bottomY`. +function terrainPass(left, right, zTop, zBottom, bottomY, shadeOf) { + const { top, bottom } = terrainScratch; + const wall = bottomY !== null; + const terrainProfile = terrainDrawProfile; + const count = terrainProfile.length; + let previous = -1; + for (let index = 0; index < count; index++) { + const point = terrainProfile[index]; + const next = terrainProfile[index + 1]; + // A point is projected only when a drawn segment touches it. + const inSpan = (next && !(next.x < left || point.x > right)) || + (index > 0 && !(point.x < left || terrainProfile[index - 1].x > right)); + if (!inSpan) { previous = -1; continue; } + const a = terrainVertex(top, index, point.x, point.y, zTop); + const b = terrainVertex(bottom, index, point.x, wall ? bottomY : point.y, + wall ? zTop : zBottom); + if (previous >= 0 && previous === index - 1 && + !(point.x < left || terrainProfile[previous].x > right)) { + const a1 = top[previous], b1 = bottom[previous]; + const shade = shadeOf(previous); + if (a1.front && a.front && b.front && b1.front) { + // Reject fully offscreen quads before lighting and guard-band + // clipping. The generous world apron includes many invisible ramps. + const p=a1.screen, q=a.screen, r=b.screen, s=b1.screen; + const width=viewWidth(); + if ((p.x<0 && q.x<0 && r.x<0 && s.x<0) || + (p.x>width && q.x>width && r.x>width && s.x>width) || + (p.y<0 && q.y<0 && r.y<0 && s.y<0) || + (p.y>viewHeight && q.y>viewHeight && r.y>viewHeight && s.y>viewHeight)) { + previous=index; + continue; + } + if (photoSurface(wall ? "wall" : "concrete", p, q, r, s)) { + previous = index; + continue; + } + const lit = litQuadColor(a1, a, b, shade); + if (a1.inBand && a.inBand && b.inBand && b1.inBand) { + projectedTriangle(a1.screen, a.screen, b.screen, lit); + projectedTriangle(a1.screen, b.screen, b1.screen, lit); + } else { + // Off the guard band on one side: clip the projected quad once + // rather than re-projecting it as two triangles. + const face = clipScreenBand([a1.screen, a.screen, b.screen, b1.screen]); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], lit); + } + } else worldQuad(a1, a, b, b1, shade); + } + previous = index; + } +} +// Per-segment surface shade, cached against the ground color it was mixed +// from: the slope never changes between rebuilds, and mixing 240 colours a +// frame was measurable on the console. +let terrainShadeKey = ""; +const terrainShades = []; +function terrainSurfaceShades(color) { + const terrainProfile = terrainDrawProfile; + const key = currentMapId + "/" + color.join(",") + "/" + terrainProfile.length; + if (key === terrainShadeKey) return terrainShades; + terrainShadeKey = key; + terrainShades.length = 0; + for (let index = 1; index < terrainProfile.length; index++) { + const { x: x1, y: y1 } = terrainProfile[index - 1]; + const { x: x2, y: y2 } = terrainProfile[index]; + const slope = Math.abs(y2 - y1) / Math.max(1, x2 - x1); + terrainShades[index - 1] = + mixColor(color, [110, 120, 90], .16 + Math.min(1, slope) * .22); + } + return terrainShades; +} +function drawTerrainSurface(left, right, near, far, color) { + const shades = terrainSurfaceShades(color); + terrainPass(left, right, near, far, null, (segment) => shades[segment]); +} + +function drawTerrainFrontWall(left, right, near, color) { + // Close the near edge with a terrain-following skirt so camera pitch never + // exposes what lies beneath the floor. + // + // WHERE the skirt hangs is the whole fix for the reel's under-floor gap. + // The reel lens is orthographic, so the floor plane projects to a line and + // can never cover the bottom of a 9:16 frame — only a vertical surface can. + // The TV skirt at the slab's near edge sits BEHIND the reel camera and gets + // near-clipped (tinting it magenta proved it never reached the frame), which + // left the buried room wall showing through as purple under the grass. For + // reels the skirt hangs just behind the fighters' plane instead, deep enough + // that no frame sees under it, and wears the ground color — so everything + // below the floor line reads as earth. + const reel = reelGroundCamera(); + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = reel ? 55 : near - 2; + const wallBottom = parkDeepest + (reel ? 9000 : 720); + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawTerrainBackWall(left, right, far, color) { + // The far edge was simply open. Yaw clamps at +/-.62rad, which is more than + // enough to swing the diorama around and look straight through the back of + // the slab into the buried room wall. The near edge has hung a skirt since + // the reel work; this is its mirror, and it exists for the ordinary TV lens + // where the right stick can actually reach around. + // + // Reels return early. That lens already hangs its single skirt just behind + // the fighters at z=55, and a second wall out at worldFar would sit behind + // that one where no reel frame ever looks -- pure cost, and a change to + // footage whose framing is test-enshrined. + if (reelGroundCamera()) return; + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = far + 2; + const wallBottom = floorY + 720; + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawRoomSurfaces(left, right, top, bottom, color) { + // A map-colored architectural backing sits between the arena and global sky. + if (survivalActive()) { + const wallBottom = floorY + 3000; + const roomTop = top - 500; + const shade = mixColor(color, [226, 172, 168], .12); + worldQuad({ x: worldLeft, y: roomTop, z: worldFar }, + { x: worldRight, y: roomTop, z: worldFar }, + { x: worldRight, y: wallBottom, z: worldFar }, + { x: worldLeft, y: wallBottom, z: worldFar }, shade); + const sideFloor = terrainFloorAt(worldLeft) + 120; + const sideShade = mixColor(color, [232, 170, 153], .13); + for (let row = 0; row < 2; row++) { + for (let depth = 0; depth < 2; depth++) { + const y1 = lerp(roomTop, sideFloor, row / 2); + const y2 = lerp(roomTop, sideFloor, (row + 1) / 2); + const z1 = lerp(0, worldFar, depth / 2); + const z2 = lerp(0, worldFar, (depth + 1) / 2); + worldQuad({ x: worldLeft, y: y1, z: z1 }, + { x: worldLeft, y: y1, z: z2 }, + { x: worldLeft, y: y2, z: z2 }, + { x: worldLeft, y: y2, z: z1 }, sideShade); + } + } + const climbEdge = mixColor(color, [64, 78, 72], .24); + worldLine(worldLeft, top, worldFar - 4, worldLeft, bottom, worldFar - 4, + 9, climbEdge); + worldLine(worldRight, top, worldFar - 4, worldRight, bottom, worldFar - 4, + 9, climbEdge); + return; + } + const palette = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const back = mixColor(palette.night, palette.floor, .09); + const backZ = worldFar + 160; + // A low stepped architectural backdrop follows the map's actual bounds. + // Its top stays below launches, so a wide lens still sees the surrounding sky. + const bayWidth = (worldRight - worldLeft) / 5; + for (let i=0; i<5; i++) { + const x1=Math.max(left,worldLeft+bayWidth*i); + const x2=Math.min(right,worldLeft+bayWidth*(i+1)); + if (x1>=x2) continue; + const roof=floorY-gridHeight*[.48,.62,.72,.62,.48][i]; + worldQuad({x:x1,y:roof,z:backZ}, {x:x2,y:roof,z:backZ}, + {x:x2,y:floorY+720,z:backZ}, {x:x1,y:floorY+720,z:backZ}, back); + worldQuad({x:x1,y:roof,z:backZ}, {x:x2,y:roof,z:backZ}, + {x:x2,y:roof,z:backZ+100}, {x:x1,y:roof,z:backZ+100}, + mixColor(back,palette.deck,.10)); + } + // The heat's base is the vacuum it hangs in, so a cooling tile fades to + // nothing rather than settling into a visible panel with edges. Only the + // bloom is meant to be seen. + drawGridOverlay(mixColor(color, [6, 8, 20], .97), false); + const pulse = .5 + .5 * Math.sin(runtime().monotonicUs / 520000); + const field = mixColor([54, 120, 186], [136, 214, 255], .3 + pulse * .35); + for (const edgeX of [worldLeft, worldRight]) { + worldLine(edgeX, ceilingY, worldFar - 4, edgeX, floorY, worldFar - 4, + 9, field); + worldLine(edgeX, ceilingY, worldNear + 4, edgeX, floorY, worldNear + 4, + 5, mixColor(field, [8, 12, 28], .5)); + } +} + +function drawSurvivalLava(t) { + if (!survivalActive()) return; + const pulse = .5 + .5 * Math.sin(t * 3.1); + const surface = mixColor([255, 58, 24], [255, 212, 42], pulse * .42); + const body = mixColor([116, 10, 26], [238, 50, 18], .58 + pulse * .18); + const far = worldFar - 8; + const bottom = Math.max(floorY + 3000, survivalLavaY + 3200); + worldQuad({ x: worldLeft, y: survivalLavaY, z: far }, + { x: worldRight, y: survivalLavaY, z: far }, + { x: worldRight, y: bottom, z: far }, + { x: worldLeft, y: bottom, z: far }, body); + worldQuad({ x: worldLeft, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldFar }, + { x: worldLeft, y: survivalLavaY, z: worldFar }, surface); + for (let step = 0; step < 9; step++) { + const x1 = lerp(worldLeft, worldRight, step / 9); + const x2 = lerp(worldLeft, worldRight, (step + 1) / 9); + const y1 = survivalLavaY + Math.sin(t * 4.2 + step * 1.7) * 9; + const y2 = survivalLavaY + Math.sin(t * 4.2 + (step + 1) * 1.7) * 9; + worldLine(x1, y1, worldNear - 2, x2, y2, worldNear - 2, 7, surface); + } +} + +// The map's addressing, made visible: the same lattice the spawn marks and +// pickups are authored on, with the heat of `gridField` showing where the +// last half-second of the fight landed. Seams are thin quads rather than +// worldLines because the native renderer buries the whole line stratum +// beneath the world's triangles — the grid would vanish behind its own wall +// on console, the same way the gun once drew under the floor. +// +// A heated cell used to paint its entire ninety-unit face — a square as tall +// as a standing fighter, and a busy exchange flipped a dozen of them on and +// off at once. That is the stripes and the starfield again: a pattern the eye +// keeps reading behind the two things it is supposed to be watching. On the +// light theme it was worse than busy, because the slab's base is the vacuum, +// so what bloomed over the arena was a dark panel rather than heat. +// +// So the cell keeps its job and loses its size. Each hot tile draws a small +// jittered grain patch at its own centre, under half a tile across so two lit +// neighbours can never fuse back into a checker square. Heat sets how many +// specks are lit as well as how bright, so cooling reads as a patch thinning +// out — texture, at a scale that stays decoration. +function drawGridOverlay(shade, seamInk = null) { + const gridZ = worldFar - 2; + const gridTop = floorY - gridHeight; + const hot = mixColor([255, 138, 92], [204, 58, 46], visualTheme.light); + // Sixteen specks over a patch half a tile across, each of them a few units + // on a side against the tile's ninety, so the grain is a texture with air in + // it rather than a smaller solid square. + const grainSteps = 4; + const grainSpan = tileSize * .5; + for (let cell = 0; cell < gridField.length; cell++) { + const heat = gridField[cell]; + if (heat < .05) continue; + const centerX = gridLeft + (cell % gridCols + .5) * tileSize; + const centerY = floorY - (Math.floor(cell / gridCols) + .5) * tileSize; + const ink = mixColor(shade, hot, .4 + heat * .55); + for (let speck = 0; speck < grainSteps * grainSteps; speck++) { + // Hashed off the cell and the speck rather than noised, so a replayed + // round grains exactly the way the live one did. + const seed = .5 + .5 * Math.sin(cell * 12.9898 + speck * 78.233); + // Cooling puts specks out one at a time instead of dimming the lot. + if (seed > heat) continue; + const size = 2 + seed * 2 + heat * 2.5; + const x = centerX + (speck % grainSteps / (grainSteps - 1) - .5) * + grainSpan + (seed - .5) * 11; + const y = centerY + (Math.floor(speck / grainSteps) / (grainSteps - 1) - + .5) * grainSpan + (.5 - seed) * 11; + worldQuad({ x: x - size, y: y - size, z: gridZ }, + { x: x + size, y: y - size, z: gridZ }, + { x: x + size, y: y + size, z: gridZ }, + { x: x - size, y: y + size, z: gridZ }, ink); + } + } + // The climb's lattice is ruled onto plaster and takes its seam from that + // plaster. The station has no plaster, and ruling the same seams across + // vacuum drew a cage over the whole frame — brighter than the starfield it + // was supposed to hang behind, and carrying a hard bright bar wherever the + // ceiling row crossed the top of the shot. + // + // So the space map passes `false` and gets no seams at all. What it keeps + // is the half of this that was always the point: the heat. Cold tiles draw + // nothing, so the lattice is invisible until a blow lands and then blooms + // where it landed — the tile field showing its own contents rather than + // its own graph paper. The ruled version stays for the climb, where there + // is a wall to rule it onto. + if (seamInk === false) return; + const seam = seamInk || mixColor(shade, [30, 34, 48], .22); + const seamZ = gridZ - 1; + for (let col = 0; col <= gridCols; col++) { + const x = gridLeft + col * tileSize; + worldQuad({ x: x - 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: floorY, z: seamZ }, + { x: x - 1.5, y: floorY, z: seamZ }, seam); + } + for (let row = 0; row <= gridRows; row++) { + const y = floorY - row * tileSize; + worldQuad({ x: gridLeft, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y + 1.5, z: seamZ }, + { x: gridLeft, y: y + 1.5, z: seamZ }, seam); + } +} + +function drawTerrainGrass(left, right, color) { + // Twenty deterministic tufts cost forty native lines total. Keeping them on + // the line layer avoids turning background dressing into hundreds of faces. + const count = 100; + for (let index = 0; index < count; index++) { + const seed = .5 + .5 * Math.sin(index * 91.73 + terrainPhase * 2.31); + const x = lerp(worldLeft, worldRight, (index + .5) / count); + if (x < left || x > right) continue; + // Keep dressing in the near half of the floor. At the far plane the same + // blades collapse into horizon ticks instead of reading as foreground grass. + const z = lerp(worldNear * .88, worldNear * .22, + .5 + .5 * Math.sin(index * 37.11 + terrainPhase)); + const y = terrainFloorAt(x) - 2; + const height = 22 + seed * 22; + const tuft = mixColor(color, [48, 92, 54], .42 + seed * .22); + worldLine(x, y, z, x - 8 - seed * 5, y - height, z, 3, tuft); + worldLine(x, y, z, x + 7 + seed * 6, y - height * .82, z, 3, tuft); + } +} + +function drawBoosterPad(t) { + const pulse = .5 + .5 * Math.sin(t * 4); + const color = mixColor([55, 174, 244], [255, 224, 74], pulse * .55); + for (const boosterX of boosterXs) { + const y = terrainFloorAt(boosterX) - 7; + worldQuad( + { x: boosterX - boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: 86 }, + { x: boosterX - boosterRadius, y, z: 86 }, color); + } +} + +function drawSkyAtmosphere(sky, arena) { + // The station's background is one plain color, and the `wipe` at the top of + // the frame has already painted it -- so the space map draws no backdrop at + // all, and this function is the climb's weather again. + // + // It was a starfield: a hundred and twenty parallaxing stars, six gradient + // bands and a planet limb with a lit rim. @jeffrey asked for the same thing + // here he asked for of the cube's plaster -- "can the level background be + // plain colored? not stripey?" -- and the answer is the same both times. A + // decorative background is a pattern the eye keeps reading during a fight + // that has two small figures in it, and every one of those stars was + // competing with the thing you are supposed to be watching. The pattern went + // and about two hundred screen-space draws a frame went with it. + if (!survivalActive()) return; + // Broad D2D bands are effectively free compared with projected meshes and + // make the sky feel spatial without rebuilding a textured skybox each frame. + const bands = 6; + const bottom = Math.round(viewHeight * .78); + for (let band = 0; band < bands; band++) { + const y1 = Math.round(bottom * band / bands); + const y2 = Math.round(bottom * (band + 1) / bands); + const amount = (band + .5) / bands; + const color = mixColor(sky, arena, amount * .22); + box(0, y1, viewWidth(), y2 - y1 + 1, ...color); + } + const haze = mixColor(sky, arena, .34); + for (let streak = 0; streak < 11; streak++) { + const seed = .5 + .5 * Math.sin(streak * 41.37 + terrainPhase * 1.9); + const x = (streak + .18 + seed * .6) / 11 * viewWidth(); + const y = 88 + (.5 + .5 * Math.sin(streak * 19.17 - terrainPhase)) * + viewHeight * .43; + const reach = 32 + seed * 86; + line(x - reach, y, x + reach, y + (seed - .5) * 7, + 2 + seed * 2, ...haze); + } +} + +function shadowSurfaceY(x, y) { + return surfaceYAt(x, y); +} + +function drawSpotShadow(x, y, z, radius, color) { + const surfaceY = shadowSurfaceY(x, y); + const height = Math.max(0, surfaceY - y); + const reach = Math.min(520, height * .22); + const focus = clamp(1 - height / 5200, .42, 1); + const shadowX = x + globalLight.x * reach; + const shadowZ = z + globalLight.z * reach; + const center = projectPoint(shadowX, surfaceY - 2, shadowZ); + const edge = projectPoint(shadowX + radius, surfaceY - 2, shadowZ); + if (![center.x, center.y, edge.x, edge.y].every(Number.isFinite) || + [center.x, center.y, edge.x, edge.y].some((value) => Math.abs(value) > 30000)) + return; + const radiusX = Math.max(4, Math.abs(edge.x - center.x) * + (.5 + .18 * focus)); + const radiusY = Math.max(2, radiusX * (.2 + .08 * focus)); + // Bind the shadow to the owning object's depth, then bias it away from the + // camera. It remains above the terrain pass but can never win against the + // object that casts it. Restore the depth after — this used to leak, and + // everything drawn until the next assignment inherited the last shadow + // caster's depth: nondeterministic layering, frame to frame, on console. + const previousDepth = triangleDepth; + triangleDepth = projectPoint(x, y, z).z + .018; + const sides = 14; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + screenTriangle(center.x, center.y, + center.x + Math.cos(a) * radiusX, + center.y + Math.sin(a) * radiusY, + center.x + Math.cos(b) * radiusX, + center.y + Math.sin(b) * radiusY, ...color); + } + triangleDepth = previousDepth; +} + +function projectedBallRadius(ball) { + const center = projectPoint(ball.x, ball.y, ball.z); + const edge = projectPoint(ball.x + ball.radius, ball.y, ball.z); + // Do not impose a screen-space minimum: on the long street the camera can + // pull far back, and a fixed eight-pixel prop looked as if it grew relative + // to fighters and terrain. + return Math.max(.5, Math.abs(edge.x - center.x)); +} + +function drawSkateboard(player) { + const at = skateFrame(player); + if (photoThemeActive) { + const centerWorld = at(0, 5, 0); + const center = projectPoint(centerWorld.x, centerWorld.y, centerWorld.z); + const left = at(-64, 5, 0), right = at(64, 5, 0); + const a = projectPoint(left.x,left.y,left.z), b = projectPoint(right.x,right.y,right.z); + const width = Math.hypot(b.x-a.x,b.y-a.y); + photoSprite("skateboard", center.x, center.y, width, width * 136 / 412, + Math.atan2(b.y-a.y,b.x-a.x), false, center.z - .01); + return; + } + const deck = [236, 76, 118], grip = [34, 25, 39], truck = [174, 184, 202]; + const quad = (a, b, c, d, color) => worldQuad(at(...a), at(...b), at(...c), at(...d), color); + const axle = (a, b, width, color) => { + const p = at(...a), q = at(...b); + worldCapsule(p.x, p.y, p.z, q.x, q.y, q.z, Math.max(.4, width * cameraScale()), color); + }; + // Far wheels, deck, near wheels: preserve occlusion in the Canvas2D host. + const wheel = (along, side) => { + const spin = player.skateSpin || 0; + const center = at(along, skateAxleDrop, side * 15); + for (let i = 0; i < 10; i++) { + const a = spin + i * Math.PI / 5, b = spin + (i + 1) * Math.PI / 5; + worldTriangle(center, + at(along + Math.cos(a) * skateWheelRadius, + skateAxleDrop + Math.sin(a) * skateWheelRadius, side * 15), + at(along + Math.cos(b) * skateWheelRadius, + skateAxleDrop + Math.sin(b) * skateWheelRadius, side * 15), + i % 5 === 0 ? truck : [243, 210, 103]); + } + }; + const near = cameraDoll.position.z < player.z ? -1 : 1; + for (const along of [-skateTruck, skateTruck]) wheel(along, -near); + quad([-48, -4, -12], [48, -4, -12], [48, -4, 12], [-48, -4, 12], grip); + quad([-48, -4, near * 12], [48, -4, near * 12], [48, 0, near * 12], [-48, 0, near * 12], deck); + for (const end of [-1, 1]) + quad([end * 48, -4, -12], [end * 64, -12, -10], + [end * 64, -12, 10], [end * 48, -4, 12], deck); + for (const along of [-skateTruck, skateTruck]) { + axle([along, 0, 0], [along, skateAxleDrop, 0], 4, truck); + axle([along, skateAxleDrop, -15], [along, skateAxleDrop, 15], 3, truck); + wheel(along, near); + } +} + +function drawBall(ball) { + if (!ball.active) return; + const point = projectPoint(ball.x, ball.y, ball.z); + // A ball is a sphere in the orthographic world. Measuring its projected + // world radius keeps the screen hit shape circular while still respecting + // the perspective intro and loss cameras. + const radius = projectedBallRadius(ball); + if (!Number.isFinite(point.x) || !Number.isFinite(point.y) || + !Number.isFinite(radius) || radius > 12000 || point.x + radius < 0 || + point.x - radius > viewWidth() || point.y + radius < 0 || + point.y - radius > viewHeight) return; + const soccer = ball.type === "soccer"; + const beach = ball.type === "beach"; + const skateboard = ball.type === "skateboard"; + const polygon = (x, y, polygonRadius, sides, rotation, color) => { + for (let side = 0; side < sides; side++) { + const a = rotation + side * Math.PI * 2 / sides; + const b = rotation + (side + 1) * Math.PI * 2 / sides; + screenTriangle(x, y, + x + Math.cos(a) * polygonRadius, + y + Math.sin(a) * polygonRadius, + x + Math.cos(b) * polygonRadius, + y + Math.sin(b) * polygonRadius, ...color); + } + }; + if (skateboard) { + drawSkateboard({ x: ball.x, y: ball.y + skateAxleDrop + skateWheelRadius, + z: ball.z, skatePitch: ball.rotation, skateSpin: ball.skateSpin || 0 }); + return; + } + if (beach) { + const panels = [ + [244, 66, 96], [255, 146, 52], [255, 226, 66], [72, 210, 126], + [54, 196, 224], [70, 112, 238], [184, 82, 224], + ]; + const palettePhase = runtime().monotonicUs / 850000; + const paletteStep = Math.floor(palettePhase); + const paletteMix = palettePhase - paletteStep; + const sides = 16; + for (let side = 0; side < sides; side++) { + const a = ball.rotation + side * Math.PI * 2 / sides; + const b = ball.rotation + (side + 1) * Math.PI * 2 / sides; + // Native monotonic time can read negative, and a negative remainder + // would index off the front of the palette. + const panel = ((Math.floor(side / 2) + paletteStep) % panels.length + + panels.length) % panels.length; + const panelColor = mixColor(panels[panel], + panels[(panel + 1) % panels.length], paletteMix); + screenTriangle(point.x, point.y, + point.x + Math.cos(a) * radius * .92, + point.y + Math.sin(a) * radius * .92, + point.x + Math.cos(b) * radius * .92, + point.y + Math.sin(b) * radius * .92, + ...panelColor); + } + filledDisc(point.x, point.y, radius * .13, [246, 241, 220]); + return; + } + filledDisc(point.x, point.y, radius * .92, + soccer ? [226, 232, 224] : [232, 104, 28]); + const seam = [42, 31, 29]; + if (soccer) { + polygon(point.x, point.y, radius * .22, 5, + ball.rotation - Math.PI / 2, seam); + for (let patch = 0; patch < 5; patch++) { + const angle = ball.rotation + patch * Math.PI * 2 / 5; + const patchX = point.x + Math.cos(angle) * radius * .58; + const patchY = point.y + Math.sin(angle) * radius * .58; + filledCapsule(point.x + Math.cos(angle) * radius * .2, + point.y + Math.sin(angle) * radius * .2, + patchX, patchY, Math.max(1.5, radius * .035), seam); + polygon(patchX, patchY, radius * .13, 5, + angle - Math.PI / 2, seam); + } + } else { + const width = Math.max(2, radius * .075); + for (const angle of [ball.rotation, ball.rotation + Math.PI / 2]) { + const dx = Math.cos(angle) * radius * .84; + const dy = Math.sin(angle) * radius * .84; + filledCapsule(point.x - dx, point.y - dy, + point.x + dx, point.y + dy, width, seam); + } + for (const direction of [-1, 1]) { + let previous = null; + for (let step = -6; step <= 6; step++) { + const y = step / 6 * radius * .82; + const x = direction * Math.cos(step / 6 * Math.PI / 2) * radius * .42; + const next = { x: point.x + x, y: point.y + y }; + if (previous) filledCapsule(previous.x, previous.y, + next.x, next.y, width, seam); + previous = next; + } + } + filledDisc(point.x, point.y, Math.max(1.5, width * .55), seam); + } +} + +// What the bot saw this tick, drawn where it saw it: every rung in its frame +// gets a lip line, the deck it is jumping for gets its landing band, and the +// footing gets the window a jump may start from. A person watching a bot +// stand still can now read whether it is waiting for a deck to enter frame. +function drawBotScene(player) { + if (renderFlags.hud === false) return; + if (!debugHitboxes || !player.bot || !player.botScene) return; + const scene = player.botScene; + const seen = [58, 222, 255]; + for (const rung of scene.rungs) + hudWorldLine(rung.left, rung.y, 0, rung.right, rung.y, 0, 3, seen); + const goal = player.botSubgoal; + if (goal && goal.kind === "jump") { + const band = [120, 255, 120]; + hudWorldLine(goal.landLeft, goal.y, 0, goal.landRight, goal.y, 0, 6, band); + hudWorldLine(goal.aim, goal.y, 0, goal.aim, goal.y - 40, 0, 3, band); + const footing = scene.self.footing; + if (footing) + hudWorldLine(goal.takeoffLeft, footing.y, 0, goal.takeoffRight, + footing.y, 0, 6, [255, 214, 90]); + } + if (scene.lava) + hudWorldLine(worldLeft, scene.lava.y, 0, worldRight, scene.lava.y, 0, 3, + [255, 110, 70]); +} + +function drawBallHitboxes() { + if (renderFlags.hud === false) return; + if (!debugHitboxes) return; + for (const item of balls) { + if (!item.active) continue; + const point = projectPoint(item.x, item.y, item.z); + const radius = projectedBallRadius(item); + if (![point.x, point.y, radius].every(Number.isFinite) || radius > 5000 || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledRing(point.x, point.y, radius + 5, radius + 2, [58, 222, 255]); + } +} + +function drawGunPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const scale = cameraScale(); + if (photoThemeActive) { + const point = projectPoint(pickup.x,bobY,pickup.z); + const width = (pickup.kind === "ROCKET LAUNCHER" ? 105 : 56) * scale; + const region=photoWeaponRegions[pickup.kind === "ROCKET LAUNCHER" ? "launcher" : "smg"]; + if (["ROCKET LAUNCHER","RUBBER SMG"].includes(pickup.kind) && + photoEffectSprite(3,region,point.x,point.y,width,width*region[3]/region[2],0,false,point.z-.02,true)) return; + photoSprite("gun", point.x,point.y,width,width * 253 / 365,0,false,point.z-.02); + return; + } + const metal = mixColor([202, 212, 228], [52, 59, 72], visualTheme.light); + const grip = mixColor([126, 106, 88], [40, 43, 52], visualTheme.light); + const barrelWidth = Math.max(2, 5 * scale); + const gripWidth = Math.max(2, 4 * scale); + const smg = pickup.kind === "RUBBER SMG"; + const rocket = pickup.kind === "ROCKET LAUNCHER"; + if (pickup.kind === "SPACE LASER") { + // Short body, long emitter, and a lit coil at the breech so the thing on + // the top deck is identifiable as light-bearing from the floor three + // decks below. The pulse is on the same 3 Hz bob as every other pickup. + const glow = mixColor([96, 226, 255], [236, 255, 255], + .4 + .35 * Math.sin(t * 5.2)); + const shell = mixColor([206, 224, 240], [44, 54, 78], visualTheme.light); + worldCapsule(pickup.x - 22, bobY, pickup.z, + pickup.x + 14, bobY, pickup.z, barrelWidth * 1.5, shell, -.02); + worldCapsule(pickup.x + 14, bobY, pickup.z, + pickup.x + 40, bobY, pickup.z, barrelWidth * .7, glow, -.02); + worldCapsule(pickup.x - 14, bobY - 9, pickup.z, + pickup.x - 2, bobY - 9, pickup.z, barrelWidth * .6, glow, -.02); + worldCapsule(pickup.x - 6, bobY + 2, pickup.z, + pickup.x - 1, bobY + 22, pickup.z, gripWidth * 1.2, grip, -.02); + return; + } + // A handgun-sized world object in gunmetal and grip material, not a glowing + // pickup glyph with a second silhouette around it. + // Capsules, not line() — the native renderer buries the whole line + // stratum beneath the world's triangles, which is how the gun spent a day + // drawn under the floor on console while the web shell showed it fine. + worldCapsule(pickup.x - (rocket ? 58 : smg ? 42 : 16), bobY, pickup.z, + pickup.x + (rocket ? 62 : smg ? 48 : 20), bobY, pickup.z, + rocket ? barrelWidth * 2.2 : smg ? barrelWidth * 1.45 : barrelWidth, + rocket ? [48, 61, 52] : metal, -.02); + worldCapsule(pickup.x + (smg ? 8 : 2), bobY + 1, pickup.z, + pickup.x + (smg ? 13 : 8), bobY + (smg ? 27 : 18), pickup.z, + smg ? gripWidth * 1.5 : gripWidth, grip, -.02); + if (smg) { + worldCapsule(pickup.x - 42, bobY, pickup.z, + pickup.x - 65, bobY + 18, pickup.z, barrelWidth, grip, -.02); + worldCapsule(pickup.x - 6, bobY + 4, pickup.z, + pickup.x - 1, bobY + 30, pickup.z, gripWidth * 1.4, metal, -.02); + } + if (rocket) { + worldCapsule(pickup.x + 50, bobY, pickup.z, + pickup.x + 68, bobY, pickup.z, barrelWidth * 2.8, [104, 62, 48], -.02); + worldCapsule(pickup.x - 8, bobY + 3, pickup.z, + pickup.x - 3, bobY + 30, pickup.z, gripWidth * 1.5, [38, 45, 42], -.02); + } +} + +// A saber waiting on a deck: the hilt standing upright with a stub of blade +// lit above it, bobbing on the same clock as every other pickup so the map's +// loose objects share one heartbeat. Drawn short on purpose — a full-length +// blade planted in a deck would read as scenery, and this is something you +// pick up. Capsules rather than lines, for the same reason the pistol is +// capsules: the native renderer buries the whole line stratum under the +// world's triangles, and the blade would vanish into the deck it sits on. +function drawSaberPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const pulse = .5 + .5 * Math.sin(t * 5.6 + pickup.x * .002); + const glow = mixColor([120, 226, 255], [244, 252, 255], .35 + pulse * .4); + const hilt = mixColor([172, 182, 198], [46, 52, 68], visualTheme.light); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 34, pickup.z, 13, glow, -.02); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 30, pickup.z, 6, [244, 252, 255], -.02); + worldCapsule(pickup.x, bobY + 6, pickup.z, + pickup.x, bobY + 34, pickup.z, 9, hilt, -.02); + worldCapsule(pickup.x - 13, bobY + 8, pickup.z, + pickup.x + 13, bobY + 8, pickup.z, 5, hilt, -.02); +} + +function drawBullet(bullet) { + const previous = projectPoint(bullet.previousX ?? bullet.x, + bullet.previousY ?? bullet.y, bullet.z); + const point = projectPoint(bullet.x, bullet.y, bullet.z); + const blink = Math.floor(runtime().monotonicUs / 65000 + bullet.owner) % 2; + // A bolt does not blink. The pistol round's alternating white is what makes + // a slow ricochet findable against a busy floor; the laser is gone in four + // frames and wants to read as one continuous line of light instead. + const core = bullet.spit + ? bullet.heavy ? [255, 92, 174] : [118, 255, 196] + : bullet.laser ? [236, 255, 255] + : blink ? [255, 255, 248] + : bullet.rubber ? [255, 226, 58] : [255, 178, 76]; + const trail = bullet.spit + ? bullet.heavy ? [182, 48, 116] : [58, 190, 132] + : bullet.laser ? [96, 226, 255] + : blink ? [255, 244, 178] + : bullet.rubber ? [214, 178, 42] : [224, 116, 62]; + const scale = cameraScale(); + // Project the complete projectile. The old 2px/4px floors made both the + // trail and blinking core behave like HUD icons once the street zoomed out. + // + // Spit is dots, not tracers: the streak between frames is the thing that + // says "bullet", so a glob doesn't draw one — just a little ball with a + // couple of droplets falling off the arc behind it. + if (bullet.spit) { + // A glob must survive the wide portrait camera as a ball, not sub-pixel + // dust. The darker halo keeps its circular edge legible over sky or earth. + const radius = Math.max(2, (bullet.heavy ? 10 : 7) * scale); + filledDisc(point.x, point.y, radius * 1.35, trail); + filledDisc(point.x, point.y, radius, core); + filledDisc(lerp(point.x, previous.x, .5), lerp(point.y, previous.y, .5), + radius * .45, trail); + filledDisc(previous.x, previous.y, radius * .25, trail); + return; + } + drawBulletTrail(bullet, trail, scale); + if (bullet.laser) { + // Drawn as the stride itself: at 9,600 units a second the gap between two + // frames IS the beam, so a wide cyan sheath over a white core along that + // gap is the whole shot. No round cap at the tip — a bolt has a leading + // edge, not a head. + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(1.2, 9 * scale), trail); + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, 3.5 * scale), core); + return; + } + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, (bullet.rubber ? 4 : 3) * scale), trail); + filledDisc(point.x, point.y, Math.max(.9, 7 * scale), core); +} + +// The ghost of where a round has been. Walked oldest to newest so the fade +// runs the right way down the path, and drawn thin: the live tracer is the +// bullet, this is only the shape its bounces have written. +// +// Bare quads, NOT filledCapsule. A capsule is two triangles plus two discs and +// a small disc is a six-sided fan, so it costs ten faces — at the 24-bullet cap +// that is 3,600 faces of ghost against a ~2,100-face frame, which is the eleven +// -frames-a-second stray wearing a different hat. Two faces a segment caps the +// worst case at 528, and a trail wants no round caps anyway. +function drawBulletTrail(bullet, ink, scale) { + const stored = Math.min(bullet.trailCount || 0, bulletTrailPoints); + if (stored < 2) return; + // The same leash the camera uses. A round that has sailed out of the fight + // is off screen, and its ghost should not be paid for either. + if (!players.some((player) => + Math.abs(bullet.x - player.x) < 5200 && + Math.abs(bullet.y - player.y) < 5200)) return; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const oldest = (bullet.trailCount || 0) - stored; + let previous = null; + for (let step = 0; step < stored; step++) { + const slot = ((oldest + step) % bulletTrailPoints) * 2; + const here = projectPoint(bullet.trail[slot], bullet.trail[slot + 1], + bullet.z); + if (previous) { + // Newer segments carry more of the tracer's weight and colour, so the + // tail thins toward nothing rather than stopping on a hard edge. + const age = step / stored; + const radius = Math.max(.4, (bullet.rubber ? 3 : 2.2) * scale * age) / 2; + const dx = here.x - previous.x; + const dy = here.y - previous.y; + const length = Math.hypot(dx, dy); + if (length > .001) { + const nx = -dy / length * radius; + const ny = dx / length * radius; + const [r, g, b] = mixColor(ground, ink, .18 + age * .55); + screenTriangle(previous.x + nx, previous.y + ny, + previous.x - nx, previous.y - ny, here.x + nx, here.y + ny, r, g, b); + screenTriangle(previous.x - nx, previous.y - ny, + here.x - nx, here.y - ny, here.x + nx, here.y + ny, r, g, b); + } + } + previous = here; + } +} + +function drawGrenadePickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3.2 + pickup.x * .001) * 8; + const point = projectPoint(pickup.x, bobY, pickup.z); + const scale = cameraScale(); + if (photoEffectSprite(3,photoWeaponRegions.grenade,point.x,point.y, + Math.max(7,20*scale),Math.max(11,32*scale),0,false,point.z-.02,true)) return; + const shell = mixColor([166, 194, 112], [72, 96, 58], visualTheme.light); + const fuse = mixColor([210, 218, 232], [45, 50, 60], visualTheme.light); + const radius = Math.max(3, 9 * scale); + const previousDepth = triangleDepth; + triangleDepth = point.z - .02; + filledDisc(point.x, point.y, radius, shell); + triangleDepth = previousDepth; + worldCapsule(pickup.x + 1, bobY - 10, pickup.z, + pickup.x + 11, bobY - 20, pickup.z, Math.max(2, 3 * scale), fuse, -.02); +} + +function drawGrenade(grenade) { + const point = projectPoint(grenade.x, grenade.y, grenade.z); + if (grenade.exploding) { + if (drawPhotoExplosion(point.x,point.y,grenadeBlastRadius*cameraScale(), + grenade.blastAge/grenadeBlastDuration,point.z-.025)) return; + const radius = grenade.blastRadius * cameraScale(); + const width = Math.max(3, 10 * cameraScale()); + filledRing(point.x, point.y, radius, + Math.max(0, radius - width), [255, 105, 105]); + return; + } + if (grenade.rocket) { + if (photoThemeActive) { + const scale = cameraScale(); + const angle = Math.atan2(grenade.vy,grenade.vx); + photoSprite("rocket",point.x,point.y,64*scale,41*scale,angle,false,point.z-.02); + return; + } + const length = Math.hypot(grenade.vx, grenade.vy) || 1; + const tail = projectPoint(grenade.x - grenade.vx / length * 54, + grenade.y - grenade.vy / length * 54, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(5, 13 * cameraScale()), [52, 65, 56]); + filledDisc(point.x, point.y, Math.max(5, 12 * cameraScale()), [190, 74, 54]); + const flame = projectPoint(grenade.x - grenade.vx / length * 88, + grenade.y - grenade.vy / length * 88, grenade.z); + filledCapsule(flame.x, flame.y, tail.x, tail.y, + Math.max(3, 7 * cameraScale()), [255, 214, 72]); + return; + } + const blink = grenade.fuse < .45 && Math.floor(grenade.fuse * 20) % 2 === 0; + if (photoEffectSprite(3,photoWeaponRegions.grenade,point.x,point.y, + Math.max(9,30*cameraScale()),Math.max(14,48*cameraScale()), + grenade.fuse*5,grenade.vx<0,point.z-.02,true)) return; + const color = blink ? [255, 255, 255] : players[grenade.owner].color; + filledDisc(point.x, point.y, Math.max(4, 22 * cameraScale()), color); + const tail = projectPoint(grenade.x - Math.sign(grenade.vx) * 90, + grenade.y - 14, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(2, 6 * cameraScale()), color); +} + +function drawWindFlag(t, color) { + const poleX = (platformLeft + platformRight) / 2; + const poleZ = 480; + const poleBottom = platformY; + const poleTop = platformY - 150; + const calm = windMph < .35; + const flagHeight = 68; + const length = calm ? 58 : 78 + windMph * 7; + const gust = calm ? 0 + : Math.sin(t * (4 + windMph * .16)) * (10 + windMph * .8); + const tipX = poleX + windDirection * length; + const tipY = poleTop + flagHeight * .5 + gust; + const width = Math.max(3, 13 * cameraScale()); + const poleInk = mixColor([214, 222, 236], [50, 57, 70], visualTheme.light); + const edgeInk = mixColor([242, 246, 252], [26, 31, 44], visualTheme.light); + const fabric = calm + ? mixColor([92, 205, 255], [35, 112, 190], visualTheme.light) : color; + const flagPoints = [ + projectPoint(poleX, poleTop, poleZ), + projectPoint(tipX, tipY, poleZ), + projectPoint(poleX, poleTop + flagHeight, poleZ), + ]; + if (flagPoints.every((point) => [point.x, point.y, point.z].every(Number.isFinite))) + projectedTriangle(flagPoints[0], flagPoints[1], flagPoints[2], fabric); + worldCapsule(poleX, poleBottom, poleZ, + poleX, poleTop, poleZ, width, poleInk); + const edgeWidth = Math.max(2, width * .34); + worldCapsule(poleX, poleTop, poleZ, + tipX, tipY, poleZ, edgeWidth, edgeInk); + worldCapsule(tipX, tipY, poleZ, + poleX, poleTop + flagHeight, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX, poleTop + flagHeight, poleZ, + poleX, poleTop, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX - 35, poleBottom, poleZ, + poleX + 35, poleBottom, poleZ, width, poleInk); +} + +function hashUnit(text) { + let hash = 2166136261; + for (let cursor = 0; cursor < text.length; cursor++) { + hash ^= text.charCodeAt(cursor); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967295; +} + +function airSeedValue(index, channel = 0) { + return hashUnit("oskiewar-air:" + index + ":" + channel); +} + +function resetAirParticles() { + const count = 18; + const spanX = worldRight - worldLeft; + const spanY = floorY - ceilingY; + const spanZ = worldFar - worldNear; + airParticles.length = 0; + for (let index = 0; index < count; index++) + airParticles.push({ + id: "air:" + index, + kind: "air", + position: { + x: worldLeft + airSeedValue(index, 1) * spanX, + y: ceilingY + 180 + airSeedValue(index, 2) * (spanY - 360), + z: worldNear + 100 + airSeedValue(index, 3) * (spanZ - 200), + }, + velocity: { x: 0, y: 0, z: 0 }, + radius: 8 + airSeedValue(index, 4) * 14, + phase: airSeedValue(index, 5) * Math.PI * 2, + }); +} + +// A stream-function curl gives the air a divergence-free-looking circulation +// instead of independent sine wiggles. Entities relax toward this velocity, +// advect in fixed simulation time, and wrap at arena boundaries. +function airFlowAt(position, seconds, phase) { + const nx = (position.x - worldLeft) / (worldRight - worldLeft) * Math.PI * 2; + const ny = (position.y - ceilingY) / (floorY - ceilingY) * Math.PI * 2; + const age = seconds * .32 + phase; + const circulation = 96; + return { + x: windDirection * (42 + windMph * 12) + + circulation * Math.sin(nx + age) * Math.cos(ny - age * .7), + y: -circulation * Math.cos(nx + age) * Math.sin(ny - age * .7), + z: 44 * Math.sin(nx + ny + age * .55), + }; +} + +const wrapWorld = (value, low, high) => { + const span = high - low; + return low + ((value - low) % span + span) % span; +}; + +function simulateAirParticles(dt, now) { + if (!airParticles.length) resetAirParticles(); + const seconds = now / 1000000; + const response = 1 - Math.exp(-dt * 2.8); + for (const entity of airParticles) { + const flow = airFlowAt(entity.position, seconds, entity.phase); + entity.velocity.x = lerp(entity.velocity.x, flow.x, response); + entity.velocity.y = lerp(entity.velocity.y, flow.y, response); + entity.velocity.z = lerp(entity.velocity.z, flow.z, response); + entity.position.x = wrapWorld(entity.position.x + entity.velocity.x * dt, + worldLeft, worldRight); + entity.position.y = wrapWorld(entity.position.y + entity.velocity.y * dt, + ceilingY + 120, floorY - 120); + entity.position.z = wrapWorld(entity.position.z + entity.velocity.z * dt, + worldNear + 80, worldFar - 80); + } +} + +function drawAmbientMotes(color) { + const previousDepth = triangleDepth; + for (const entity of airParticles) { + const { x, y, z } = entity.position; + const point = projectPoint(x, y, z); + const edge = projectPoint(x + entity.radius, y, z); + const radius = Math.max(.8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const depthAmount = (z - worldNear) / (worldFar - worldNear); + const ink = mixColor([18, 24, 48], color, .24 + (1 - depthAmount) * .34); + if (![point.x, point.y, point.z, radius].every(Number.isFinite) || + point.x < stageLeft - radius || point.x > stageRight + radius || + point.y < -radius || point.y > viewHeight + radius) continue; + triangleDepth = point.z; + filledDisc(point.x, point.y, radius, ink); + } + triangleDepth = previousDepth; +} + +function drawSelectPortrait(player, x, y, scale, t) { + const color = player.color; + const head = { x, y: y - 130 * scale, radius: 34 * scale }; + filledDisc(head.x, head.y, head.radius + Math.max(2, 3 * scale), [8, 12, 24]); + filledDisc(head.x, head.y, head.radius, color); + hudLine(x, y - 94 * scale, x, y + 20 * scale, 12 * scale, ...color); + hudLine(x, y - 65 * scale, x - 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y - 65 * scale, x + 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y + 20 * scale, x - 48 * scale, y + 112 * scale, 11 * scale, ...color); + hudLine(x, y + 20 * scale, x + 48 * scale, y + 112 * scale, 11 * scale, ...color); + drawFace(player, head, contrastShadow(color), t); +} + +function selectionPreview(option) { + return { ...players[1], name: option.fighter.handle, + color: option.fighter.color, + npc: option.kind === "dummy" || option.kind === "bot", + bot: option.kind === "bot" }; +} + +function drawSelectionScreen(t, ink, panel) { + const layout = selectionTouchLayout(); + const hover = selectionHover(layout); + if (globalThis.__oskiewarTouch) globalThis.__oskiewarTouch.hover = hover; + const compact = compactLayout(); + const title = selectionStep === 0 ? "pick your pal" : "who are you fighting?"; + const titleSize = compact ? 36 : 58; + const titleY = compact ? 58 : 86; + const titleWidth = handleWidth(title, titleSize); + typeWrite(title, viewCenterX() - titleWidth / 2, titleY, titleSize, ...ink); + const stepText = (selectionStep + 1) + "/2"; + const stepSize = compact ? 24 : 32; + typeWrite(stepText, layout.back.x + layout.back.width + (compact ? 18 : 28), + layout.back.y + (compact ? 11 : 18), stepSize, + ...mixColor([140, 150, 185], ink, .35)); + const backHovered = hover?.back; + const options = selectionOptions(); + // Neighbours first so the focused card always lands on top of them. + const wheel = [...layout.options].sort((a, b) => + Math.abs(b.slot) - Math.abs(a.slot)); + for (const rect of wheel) { + const option = options[rect.index]; + const player = selectionPreview(option); + const disabled = Boolean(option.disabled); + const hovered = !disabled && hover?.option === rect.index; + const focused = !disabled && rect.slot === 0; + const disabledInk = mixColor([74, 80, 96], [164, 168, 178], + visualTheme.light); + const optionColor = disabled ? disabledInk : option.fighter.color; + if (hovered || focused) + box(rect.x, rect.y + rect.height - (hovered ? 8 : 5), rect.width, + hovered ? 8 : 5, ...optionColor); + const scale = rect.height / 520 * 1.05; + const portraitY = rect.y + rect.height * (compact ? .55 : .53); + drawSelectPortrait(player, rect.x + rect.width / 2, portraitY, scale, t); + const label = option.fighter.handle.toLowerCase(); + const labelSize = Math.max(16, Math.round(rect.width * .085)); + const labelWidth = handleWidth(label, labelSize); + drawHandle(label, rect.x + (rect.width - labelWidth) / 2, + rect.y + rect.height - labelSize - (compact ? 10 : 18), labelSize, + disabled ? [disabledInk] : option.fighter.colors, optionColor); + } + // Chevrons inside the focused card name the gesture that turns the wheel, + // without crowding the neighbours they point at. + if (layout.options.length > 1) { + const focus = layout.options.find((rect) => rect.slot === 0); + const arrowSize = compact ? 30 : 52; + const arrowY = focus.y + focus.height / 2 - arrowSize / 2; + const inset = (compact ? 8 : 14) + Math.sin(t * 3.4) * (compact ? 3 : 6); + typeWrite("<", focus.x + inset, arrowY, arrowSize, ...ink); + typeWrite(">", focus.x + focus.width - inset - + comicGlyphAdvance(">", arrowSize), arrowY, arrowSize, ...ink); + } + // Keep navigation above every option on narrow/tall browser layouts. + box(layout.back.x, layout.back.y, layout.back.width, layout.back.height, + ...mixColor(panel, ink, backHovered ? .25 : .08)); + typeWrite("< back", layout.back.x + (compact ? 12 : 20), + layout.back.y + (compact ? 10 : 17), compact ? 25 : 34, ...ink); + const controls = selectionControlKeys(); + drawCenteredKeycapRun(controls, viewHeight - (compact ? 52 : 66), + compact ? 15 : 20, inputPads[0]?.down || [], ink); +} + +const titlePaletteNight = [ + [255, 105, 190], [111, 232, 210], [255, 232, 92], [130, 150, 255], + [255, 126, 92], [188, 128, 255], [92, 205, 255], [246, 248, 255], +]; +const titlePaletteDay = [ + [190, 32, 118], [0, 126, 124], [176, 112, 0], [73, 82, 190], + [204, 59, 43], [114, 68, 185], [24, 107, 181], [47, 56, 82], +]; + +function animatedTitleColor(index, t, daylight = visualTheme.light) { + const count = titlePaletteNight.length; + // Native monotonic time can begin a fraction before startedAt settles. + // Normalize the remainder so that first frame still lands in the palette. + const phase = ((index + t * .42) % count + count) % count; + const from = Math.floor(phase); + const amount = phase - from; + const eased = amount * amount * (3 - amount * 2); + const night = mixColor(titlePaletteNight[from], + titlePaletteNight[(from + 1) % count], eased); + const day = mixColor(titlePaletteDay[from], + titlePaletteDay[(from + 1) % count], eased); + return mixColor(night, day, daylight); +} + +// The dummy count, as a sentence. The host hands over a window and a total; +// the window is already the shortest one that had anything in it, so all that +// is left here is to say it in English. Zero returns nothing at all — an +// arcade does not advertise that nobody played today. +function dummyPopLine(stat) { + const pops = Math.floor(Number(stat?.pops) || 0); + const hours = Math.floor(Number(stat?.hours) || 0); + if (pops <= 0 || hours <= 0 || hours > 48) return ""; + return pops + " dummy head" + (pops === 1 ? "" : "s") + " popped in the last " + + (hours === 1 ? "hour" : hours + " hours"); +} + +function drawDummyPopLine(titleY, titleSize, transitionInk) { + // Not on the poster: the social preview is burned to a file whose hash is + // checked at deploy, and a number that moves would make it stale hourly. + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const line = dummyPopLine(capabilities().pops); + if (!line) return; + const size = Math.round(hudTypeSize * (compactLayout() ? .46 : .56)); + const width = handleWidth(line, size); + const x = viewCenterX() - width / 2; + const y = titleY + titleSize + (compactLayout() ? 12 : 18); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || + mixColor([198, 206, 232], [58, 70, 104], visualTheme.light); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); +} + +// "Add your coach." @jeffrey: "itd be cool so any user can claude into an +// oskiewar game ... 'coach' would be the feature ... which could then analyze +// your matches / do things / get ur data". The relay has always counted a +// read-only `agent` seat apart from the grandstand; this offers that seat on +// the title as a thing a player can do — hand oskiewar.com/coach.mjs to their +// own Claude and it sits in on this room, reading every frame a phone reads. +// The room name is the whole invitation, since it is what a coach attaches +// to, so it is printed here under START where a newcomer is already looking. +// Once a coach is seated the line says so, with the antenna the debug +// read-out lights, and keeps the name up so the player can tell the coach is +// watching this room and not an earlier one. Never on the poster: the social +// preview is hash-bound, and a room name changes with every burn. +function drawCoachLine(button, transitionInk) { + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const room = versusRoomName || sessionName; + if (!room) return; + const compact = compactLayout(); + const linked = linkedAgents(); + const line = linked ? "coach linked " + room + : "add your coach oskiewar.com/coach " + room; + const size = Math.round(hudTypeSize * (compact ? .46 : .56)); + const width = handleWidth(line, size); + const glyph = linked ? Math.round(size * 1.2) : 0; + const x = viewCenterX() - (width + glyph) / 2 + glyph; + const y = button.y + button.height + (compact ? 6 : 10); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || (linked ? [120, 226, 255] + : mixColor([198, 206, 232], [58, 70, 104], visualTheme.light)); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); + if (linked) drawAgentLink(x - glyph * .6, y + size * .55, size / 26, linked); +} + +function titleButtonRect() { + const compact = compactLayout(); + const textSize = hudTypeSize; + const textWidth = handleWidth("start", textSize); + const width = textWidth + (compact ? 54 : 76); + const height = textSize + (compact ? 24 : 34); + return { x: viewCenterX() - width / 2, + y: viewHeight * (compact ? .61 : .64) - (compact ? 10 : 15), + width, height, textSize, textWidth }; +} + +// A letter you can push around. `grow` eases toward 1 while the pointer is on +// it and `kick` is a decaying shudder fired the frame it is first touched, so +// the word answers one letter at a time instead of inflating as a block. +function toyGlyph(toys, index, hot, dt) { + const toy = toys[index] || (toys[index] = { grow: 0, kick: 0, hot: false }); + toy.grow += ((hot ? 1 : 0) - toy.grow) * (1 - Math.exp(-dt * (hot ? 16 : 7))); + if (hot && !toy.hot) toy.kick = 1; + toy.hot = hot; + toy.kick *= Math.exp(-dt * 5.5); + return toy; +} + +const pointInCell = (point, x, y, width, height) => point && x <= point.x && + point.x <= x + width && y <= point.y && point.y <= y + height; + +// Screen-space outline, four boxes, no projection — safe anywhere. +function strokeBox(x, y, width, height, thickness, color) { + hudBox(x, y, width, thickness, ...color); + hudBox(x, y + height - thickness, width, thickness, ...color); + hudBox(x, y, thickness, height, ...color); + hudBox(x + width - thickness, y, thickness, height, ...color); +} + +function drawTitleScreen(t, ink, transitionAge = -1) { + const compact = compactLayout(); + const socialPreview = typeof capabilities === "function" && + capabilities().socialPreview === true; + // Keep the game identity visible on the opening frame. The live fighters + // and START remain interactive beneath the wordmark. + const title = "oskiewar"; + const version = "v" + buildVersion; + const breath = 1 + Math.sin(t * .9) * .018; + const socialLockupGap = compact ? 10 : 18; + const socialTitleSize = Math.min(220, + (viewWidth() - 56 - socialLockupGap) / + (handleWidth(title, 1) + handleWidth(version, .3))); + const titleSize = (socialPreview ? socialTitleSize : compact ? 88 : 154) * breath; + const titleWidth = handleWidth(title, titleSize); + const versionSize = Math.round(titleSize * .3); + const versionWidth = handleWidth(version, versionSize); + const lockupGap = socialPreview ? socialLockupGap : compact ? 10 : 18; + const lockupWidth = titleWidth + lockupGap + versionWidth; + const titleX = viewCenterX() - lockupWidth / 2; + const titleY = viewHeight * (compact ? .38 : .35); + + // Air fuzzies: sparse motes drifting the whole frame, no panels or stripes + // behind the wordmark. + if (transitionAge < 0 && renderFlags.dust !== false) + for (let index = 0; index < (compact ? 10 : 16); index++) { + const phase = index * 2.39996; + const x = stageLeft + (stageRight - stageLeft) * + (.5 + .47 * Math.sin(t * (.055 + index % 5 * .01) + phase)); + const y = viewHeight * + (.5 + .45 * Math.cos(t * (.043 + index % 4 * .012) + phase * 1.7)); + const radius = (compact ? 2 : 3) + (index % 3); + hudCircle(x, y, radius, Math.max(1.5, radius * .48), + animatedTitleColor(index, t * .7)); + } + + let cursor = titleX; + // Kerning scaffold: one cell per glyph, taken from the same advance the + // layout walks, so drift and bob read against their own metrics. + const glyphCells = debugHitboxes && transitionAge < 0 && !socialPreview && + renderFlags.hud !== false ? [] : null; + const flashPalette = [[255, 226, 48], [70, 224, 92], [181, 255, 48]]; + const flash = transitionAge >= 0 + ? flashPalette[Math.floor(transitionAge / .065) % flashPalette.length] : null; + const fade = transitionAge >= 0 ? clamp((transitionAge - .46) / .24, 0, 1) : 0; + const transitionInk = flash ? mixColor(flash, [7, 10, 26], fade) : null; + // Toys ease in real time, and the burn renders headless with no pointer, so + // the poster stays the same picture it always was. + const dt = titleToyAt < 0 ? 0 : clamp(t - titleToyAt, 0, .1); + titleToyAt = t; + const raw = globalThis.__oskiewarTouch?.pointer; + const pointer = transitionAge < 0 && !socialPreview && raw?.active && + Number.isFinite(raw.x) && Number.isFinite(raw.y) ? raw : null; + let held = -1; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const bob = Math.sin(t * 2.05 + index * .72) * (compact ? 5 : 8); + const drift = Math.cos(t * 1.12 + index * .91) * (compact ? 3 : 5) + + Math.sin(t * .63 + index * 1.71) * (compact ? 7 : 12); + const advance = comicGlyphAdvance(character, titleSize); + // The cell is what the pointer touches, so a letter that has swollen out + // of it cannot chase the cursor or shove its neighbours along the line. + // + // The letter the pointer already holds is tested against a cell grown by + // exactly how far this letter can travel — the sum of its drift terms + // across, its bob down — so the whole of its wander happens without the + // grab ever being dropped. Every other letter is tested honestly, or a + // held letter would keep stealing the pointer from its neighbours. + const slackX = titleGlyphHot === index ? (compact ? 10 : 17) : 0; + const slackY = titleGlyphHot === index ? (compact ? 5 : 8) : 0; + const hot = pointInCell(pointer, cursor + drift - slackX, + titleY + bob - slackY, advance + slackX * 2, titleSize + slackY * 2); + if (hot) held = index; + const toy = toyGlyph(titleToys, index, hot, dt); + const size = titleSize * + (1 + toy.grow * .38 + toy.kick * Math.sin(t * 31 + index) * .17); + const shudder = toy.kick * Math.sin(t * 27 + index * 1.3) * + (compact ? 6 : 11); + const glyphX = cursor + drift + + (advance - comicGlyphAdvance(character, size)) / 2 + shudder; + const glyphY = titleY + bob - (size - titleSize) * .5 - + toy.grow * (compact ? 6 : 11); + const shadowOffset = Math.max(4, Math.min(5, Math.round(size * .025))); + typeWrite(character, glyphX + shadowOffset, glyphY + shadowOffset, + size, ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(character, glyphX, glyphY, + size, ...(transitionInk || animatedTitleColor(index, t))); + if (glyphCells) glyphCells.push([cursor + drift, titleY + bob, advance]); + cursor += advance; + } + const versionX = titleX + titleWidth + lockupGap; + const versionY = titleY + titleSize - versionSize * 1.15; + const versionEdge = contrastShadow(transitionInk || ink); + for (const [dx, dy] of [[-2, 0], [2, 0], [0, -2], [0, 2]]) + typeWrite(version, versionX + dx, versionY + dy, versionSize, ...versionEdge); + typeWrite(version, versionX, versionY, versionSize, + ...(transitionInk || ink)); + if (survivalActive()) { + const mode = "survival"; + const modeSize = Math.round(titleSize * .28); + const modeWidth = handleWidth(mode, modeSize); + const modeX = viewCenterX() - modeWidth / 2; + const modeY = titleY + titleSize + (compact ? 8 : 12); + typeWrite(mode, modeX + 2, modeY + 3, modeSize, + ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(mode, modeX, modeY, modeSize, ...(transitionInk || ink)); + } else drawDummyPopLine(titleY, titleSize, transitionInk); + if (glyphCells) { + strokeBox(titleX, titleY, titleWidth, titleSize, 2, [92, 132, 255]); + for (const [x, y, advance] of glyphCells) { + strokeBox(x, y, advance, titleSize, 2, [255, 92, 116]); + hudBox(x, y, 2, titleSize, 116, 255, 184); + } + } + + const prompt = "start"; + const button = titleButtonRect(); + const hovered = Boolean(pointer) && pointInRect(pointer, button); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.titleButton = button; + globalThis.__oskiewarTouch.titleHover = hovered; + globalThis.__oskiewarTouch.titleGlyph = held; + } + titleGlyphHot = held; + promptBounce += ((hovered ? 1 : 0) - promptBounce) * + (1 - Math.exp(-dt * (hovered ? 14 : 6))); + const promptPulse = .68 + (Math.sin(t * 3.2) + 1) * .16; + const promptInk = transitionInk || + mixColor([196, 142, 18], [255, 238, 82], promptPulse); + // The word floats on its own; the rect survives only as the touch target. + // Yellow type on a bright sky needs an edge, so a sharp offset shadow + // deepens as the background lightens and lifts as it goes to night. + if (!socialPreview) { + let promptCursor = button.x + (button.width - button.textWidth) / 2; + const promptY = button.y + (button.height - button.textSize) / 2 - 2; + const offset = Math.max(3, Math.round(button.textSize * .1)); + const shadowInk = mixColor([10, 12, 30], [86, 26, 116], visualTheme.light); + const litInk = hovered + ? mixColor(promptInk, [255, 255, 255], .35) : promptInk; + for (let index = 0; index < prompt.length; index++) { + const character = prompt[index]; + const advance = comicGlyphAdvance(character, button.textSize); + const toy = toyGlyph(promptToys, index, + pointInCell(pointer, promptCursor, promptY, advance, button.textSize), + dt); + // The whole word takes the bounce, but each letter takes it a beat after + // the one before, so start reads as a hop travelling along the word. + const hop = promptBounce * button.textSize * .3 * + Math.abs(Math.sin(t * 5.4 - index * .62)); + const size = button.textSize * (1 + toy.grow * .2 + toy.kick * .12); + const x = promptCursor + (advance - comicGlyphAdvance(character, size)) / 2; + const y = promptY - hop - (size - button.textSize) * .5; + if (!transitionInk) + typeWrite(character, x + offset, y + offset, size, ...shadowInk); + typeWrite(character, x, y, size, ...litInk); + promptCursor += advance; + } + // The pace dial. Quiet unless the clock is off its default — or was just + // touched, so stepping back to one still answers the keypress — and it + // lives large in the bottom-right corner, a dashboard readout rather + // than a footnote under the start word. + const paceNow = runtime().monotonicUs; + if (gameSpeed !== 1 || (gameSpeedChangedAt && + paceNow - gameSpeedChangedAt < 2400000)) { + const pace = "×" + gameSpeed; + const paceSize = Math.max(30, Math.round(button.textSize * .8)); + const hud = hudSafeRect(); + const paceX = hud.right - handleWidth(pace, paceSize); + const paceY = hud.bottom - paceSize; + typeWrite(pace, paceX + 3, paceY + 4, paceSize, ...shadowInk); + typeWrite(pace, paceX, paceY, paceSize, ...promptInk); + } + drawCoachLine(button, transitionInk); + } + // Touch play keeps its thumbs in the bottom corners, and the fight is live + // under this screen now, so the stamp yields the pad rather than sit on it. + if (transitionAge >= 0 || socialPreview || (typeof capabilities === + "function" && capabilities().inputFamily === "touch")) return; + const titleUnixMs = runtime().unixMs || Date.now(); + const safe = hudSafeRect(); + // No frame rate under the wordmark. The read-out has one home — the + // bottom-left lane above the nameplate, where a fight already shows it — + // and a second copy parked in the middle of the poster only crowded the + // kerning cells it was sitting next to. + const clock = hudClockBox(titleUnixMs); + drawHudClock(clock, safe.top + 2, ink, titleUnixMs); + drawHudStatusTray(clock, ink, titleUnixMs); +} + +function pacificTimeLabel(unixMs) { + // The arena clock follows Pacific time without displaying a zone suffix. + const date = new Date(unixMs); + const year = date.getUTCFullYear(); + const nthSunday = (month, occurrence, hour) => { + const first = new Date(Date.UTC(year, month, 1)); + const day = 1 + ((7 - first.getUTCDay()) % 7) + (occurrence - 1) * 7; + return Date.UTC(year, month, day, hour); + }; + const daylight = unixMs >= nthSunday(2, 2, 10) && + unixMs < nthSunday(10, 1, 9); + const local = new Date(unixMs - (daylight ? 7 : 8) * 3600000); + const hour = local.getUTCHours(); + const minute = String(local.getUTCMinutes()).padStart(2, "0"); + const second = String(local.getUTCSeconds()).padStart(2, "0"); + return String(hour % 12 || 12) + ":" + minute + ":" + second; +} + +// Status indicators share one lane rather than each finding its own corner, so +// they read as a set: same cell, same row, in the title-safe frame just left of +// the wall clock. The lane is right-aligned because the clock and the round QR +// grow leftward from the same edge. +const statusGap = 6; +const statusCellSize = () => shellMode === "GAME" && debugHitboxes ? 56 : 26; + +function hudStatusIcons() { + const icons = []; + if (typeof capabilities === "function" && capabilities().midi) icons.push("midi"); + return icons; +} + +// The clock's footprint is computed once and shared, so the lane cannot drift +// out of step with where the clock actually lands. +function hudClockBox(unixMs) { + const safe = hudSafeRect(); + const label = pacificTimeLabel(unixMs); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 16 : hudTypeSize; + const qrBox = spectatorQrBox(); + const anchor = qrBox ? qrBox.left - 14 : safe.right; + // National identity begins at this corner: the local country's flag flies + // just left of the QR and the clock lane slides over to make room. US + // first — more flags join as they are drawn. + const flagCode = typeof capabilities === "function" && + capabilities().country === "US" ? "US" : ""; + const flagWidth = flagCode ? Math.round(size * 2.1) : 0; + const right = anchor - (flagCode ? flagWidth + 12 : 0); + const dialRadius = Math.max(6, Math.round(size * .38)); + const dialGap = Math.max(5, Math.round(size * .2)); + const textRight = right - dialRadius * 2 - dialGap; + return { label, size, right, textRight, dialRadius, anchor, flagCode, + flagWidth, dialX: right - dialRadius, + left: textRight - handleWidth(label, size) }; +} + +// Old Glory at corner scale: seven stripes and a starred canton read as the +// flag long before thirteen would, and the stars stay dots — real stars need +// more pixels than the corner owns. Shadowed like the type beside it so it +// flies on any sky. +function drawUsFlag(x, y, width, height, ink) { + hudBox(x + 2, y + 2, width, height, ...contrastShadow(ink)); + const stripes = 7; + for (let stripe = 0; stripe < stripes; stripe++) { + const top = y + Math.round(stripe * height / stripes); + const bottom = y + Math.round((stripe + 1) * height / stripes); + hudBox(x, top, width, bottom - top, + ...(stripe % 2 ? [238, 242, 247] : [188, 32, 46])); + } + const cantonWidth = Math.round(width * .44); + const cantonHeight = Math.round(height * 4 / stripes); + hudBox(x, y, cantonWidth, cantonHeight, 38, 52, 122); + for (let star = 0; star < 6; star++) + filledDisc(x + Math.round(cantonWidth * (.22 + (star % 3) * .28)), + y + Math.round(cantonHeight * (star < 3 ? .3 : .7)), + Math.max(1, Math.round(height * .05)), [238, 242, 247]); +} + +function drawHudClock(clock, y, ink, unixMs) { + typeWrite(clock.label, clock.left + 3, y + 3, + clock.size, ...contrastShadow(ink)); + const match = clock.label.match(/^(\d+)(:)(\d{2})(:)(\d{2})$/); + const parts = match ? match.slice(1) : [clock.label]; + const syntax = visualTheme.light ? titlePaletteDay : titlePaletteNight; + const colors = [syntax[0], ink, syntax[1], ink, syntax[2]]; + let x = clock.left; + parts.forEach((part, index) => { + typeWrite(part, x, y, clock.size, ...(colors[index] || ink)); + x += handleWidth(part, clock.size); + }); + const centerY = y + clock.size * .48; + const seconds = ((unixMs / 1000) % 60 + 60) % 60; + const segments = 24; + const filled = seconds / 60 * segments; + filledDisc(clock.dialX + 2, centerY + 2, clock.dialRadius, + contrastShadow(ink)); + filledDisc(clock.dialX, centerY, clock.dialRadius, + mixColor([20, 24, 38], [238, 241, 247], visualTheme.light)); + for (let segment = 0; segment < Math.ceil(filled); segment++) { + const start = -Math.PI / 2 + segment / segments * Math.PI * 2; + const end = -Math.PI / 2 + Math.min(segment + 1, filled) / + segments * Math.PI * 2; + screenTriangle(clock.dialX, centerY, + clock.dialX + Math.cos(start) * clock.dialRadius, + centerY + Math.sin(start) * clock.dialRadius, + clock.dialX + Math.cos(end) * clock.dialRadius, + centerY + Math.sin(end) * clock.dialRadius, ...syntax[2]); + } + hudCircle(clock.dialX, centerY, clock.dialRadius, 2, ink); +} + +function hudStatusTray(clock = null) { + const icons = hudStatusIcons(); + if (!icons.length) return null; + const statusCell = statusCellSize(); + const safe = hudSafeRect(); + const qrBox = spectatorQrBox(); + const right = clock ? clock.left - 14 + : qrBox ? qrBox.left - 14 : safe.right; + const width = icons.length * statusCell + (icons.length - 1) * statusGap; + return { icons, right, left: right - width, top: safe.top, + height: statusCell }; +} + +// A one-octave keyboard: seven equal white keys with the black keys only on the +// boundaries that have them, so it reads as a piano at this size instead of an +// approximate smear. It brightens for a beat whenever a note leaves. +function drawStatusPiano(x, y, lit) { + const width = 21, height = 14, key = width / 7; + const left = Math.round(x - width / 2), top = Math.round(y - height / 2); + hudBox(left, top, width, height, ...(lit ? [108, 240, 168] : [176, 184, 202])); + for (const step of [1, 2, 4, 5, 6]) + hudBox(Math.round(left + step * key) - 1, top, 2, Math.round(height * .58), + 23, 27, 40); +} + +function drawHudStatusTray(clock, ink, unixMs) { + const tray = hudStatusTray(clock); + const statusCell = statusCellSize(); + // Debug is global state, so its large indicator owns bottom-center rather than + // masquerading as another peripheral in the clock-side status tray. + if (debugHitboxes && !performanceFooterVisible()) { + const safe = hudSafeRect(); + const top = safe.bottom - statusCell; + drawDebugBug(viewCenterX(), top + statusCell / 2 + 2, + statusCell / 26); + // The session's name rides beside the bug: it is what a telemetry agent + // attaches to, and debug mode is exactly the moment somebody wants to + // read that name off the screen and type it into a terminal. + if (sessionName) { + const size = Math.max(17, Math.round(statusCell * .4)); + typeWrite(sessionName, viewCenterX() + statusCell * .62, + top + statusCell / 2 + 2 - size / 2, size, ...ink); + } + // And the linked-agent mark keeps the bug company on its other side — + // @jeffrey: "can the little agent icon be near the debug ladybug, not by + // the fps". The name says where to attach; the antenna says who has. + const agents = linkedAgents(); + if (agents) { + const scale = statusCell / 34; + drawAgentLink(viewCenterX() - statusCell * .62 - 14 * scale, + top + statusCell / 2 + 2, scale, agents); + } + } + if (!tray) return; + const lit = typeof capabilities === "function" && + unixMs - (capabilities().midiPulse || 0) < 140; + tray.icons.forEach((name, index) => { + const x = tray.left + index * (statusCell + statusGap) + statusCell / 2; + const y = tray.top + tray.height / 2; + if (name === "midi") drawStatusPiano(x, y, lit); + }); +} + +function drawDebugBug(x, y, scale = 1) { + const shell = [255, 86, 126]; + const detail = [22, 12, 34]; + const limb = (x1, y1, x2, y2, width, color) => + filledCapsule(x1, y1, x2, y2, width, color); + filledDisc(x, y + 2 * scale, 8 * scale, shell); + filledDisc(x, y - 6 * scale, 5 * scale, shell); + limb(x, y - 7 * scale, x - 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x, y - 7 * scale, x + 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x - 5 * scale, y, x - 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x + 5 * scale, y, x + 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x - 5 * scale, y + 5 * scale, x - 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x + 5 * scale, y + 5 * scale, x + 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x, y - scale, x, y + 9 * scale, 2 * scale, detail); + filledDisc(x - 2 * scale, y - 7 * scale, 1.2 * scale, detail); + filledDisc(x + 2 * scale, y - 7 * scale, 1.2 * scale, detail); +} + +// The title owns the share code; active maps keep the corner clear. +function spectatorQrBox() { + if (shellMode === "GAME") return null; + if (typeof capabilities === "function" && capabilities().socialPreview) + return null; + if (!spectatorQr || typeof spectatorQr.getModuleCount !== "function") + return null; + const safe = hudSafeRect(); + const count = spectatorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor((compactLayout() ? 108 : 158) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + // The QR anchors on the safe rect's top-right corner — the exact spot the + // debug overlay draws its yellow corner crop. With the bug lit the + // instrument wins: the code steps below the crop instead of covering it, + // and every lane that asks this box (the clock included) follows it down. + const top = safe.top + (debugHitboxes ? 52 : 0); + return { left: safe.right - size, top, size, cell, count, quiet }; +} + +// Where the bare frame rate shows with the overlay off: the console, in a +// fight. The debug read-out itself never asks which screen it is on. +const bareFrameRateShown = () => nativeTrianglePass && shellMode === "GAME"; +function drawDebugPerformance(ink) { + // The wordmark screen used to hide this row, but the title is a running + // fight with a frame budget of its own — debug mode reads the machine, not + // the match, so the numbers stay up wherever the bug is lit. Only a round's + // result card still clears the lane, because the card owns it. + if (roundResult) return; + // The console keeps a bare frame rate on the HUD through a fight even + // with the debug overlay off — @jeffrey, 2026-09-20: "when game is + // playing lets still show fps in hud". One short word, so the read-out + // costs the frame it measures almost nothing. + const bare = !debugHitboxes; + if (bare && !bareFrameRateShown()) return; + const metaSize = debugReadoutMetaSize(); + const run = runtime(); + // Every line waits for a real measurement. The read-out used to answer with + // the logical stage size, the measured frame rate wearing a Hz label, and a + // row of zeroed milliseconds — three numbers that looked like instruments and + // were not. The browser now times its own frame span and its own paint, so it + // fills the rate and two of the three stages honestly; the render surface is + // still the console's alone, and a browser can never time the compositor's + // present, so that stage stays out of the row rather than reading 0.00ms. + // Native frameMs measures the whole host frame. Its legacy refreshHz + // field is also measured FPS, not the display mode's refresh rate. + const measuredFrameMs = Number(run.frameMs) || 0; + const measuredFps = measuredFrameMs > 0 ? 1000 / measuredFrameMs : displayFps; + const rate = Math.round(measuredFps || 0) + " fps"; + if (bare) { + const lane = playerHandleLayout(players[0], 0); + typeWrite(rate, lane.x, lane.y - metaSize - 6, metaSize, ...ink); + return; + } + const renderWidth = Math.round(Number(run.renderWidth) || Number(run.width) || 0); + const renderHeight = Math.round(Number(run.renderHeight) || Number(run.height) || 0); + const aa = Math.max(1, Math.round(Number(run.antialiasingSamples) || 1)); + const surface = renderWidth && renderHeight + ? " · " + renderWidth + "x" + renderHeight + " · " + + String(run.antialiasingMode || (aa + "x")) : ""; + const frameMs = Number(run.frameMs) || 0; + const presentMs = Number(run.presentMs) || 0; + const timing = frameMs + ? "frame " + frameMs.toFixed(2) + "ms render " + + (Number(run.renderCpuMs) || 0).toFixed(2) + "ms" + + (presentMs ? " present " + presentMs.toFixed(2) + "ms" : "") : ""; + // The bottom-left corner belongs to a fighter's nameplate, so the read-out + // stacks upward from just above it instead of printing across a handle. The + // ammo row keeps its own lane a stat card further up, well clear of this. + const lane = playerHandleLayout(players[0], 0); + let y = lane.y - metaSize - 6; + // One line of proof per debug toggle: the console renders this read-out + // where no devtools can confirm it, so the Device Portal log gets told the + // row was actually drawn, with what, and where. + if (!debugPerfReported) { + debugPerfReported = true; + telemetry("FIGHT_DEBUG_PERF", rate + (timing ? " | " + timing : "") + + " | lane=" + Math.round(lane.x) + "," + Math.round(y) + + " session=" + sessionName); + } + for (const [index, label] of [rate + surface, timing].entries()) { + if (!label) continue; + const size = index ? debugReadoutTimingSize() : metaSize; + typeWrite(label, lane.x, y, size, ...ink); + y -= size + 5; + } +} + +// How many telemetry watchers are reading this round. The relay counts +// `role=agent` sockets apart from phone spectators and tells the publishing +// game; a host that has not wired that up answers nothing and the mark stays +// off. Note this can only ever see the live socket: the console's +// AC_NATIVE_PROFILE line goes out one way through OutputDebugStringA, so a +// Device Portal reading it is invisible from in here. +function linkedAgents() { + if (typeof capabilities !== "function") return 0; + return Math.max(0, Math.round(Number(capabilities().liveAgents) || 0)); +} + +// @jeffrey: "if we are in debug mode and reading telemetry on a device can we +// show a little agent icon to show our linked in connection on the telemetry of +// that round". An antenna'd head, so it cannot be read as the debug bug beside +// it or as one more human in the grandstand — a phone that scanned the round QR +// is a viewer and lights nothing here. The mark means a machine is reading +// these numbers right now. +function drawAgentLink(x, y, scale = 1, count = 1) { + const shell = [120, 226, 255]; + const detail = [10, 16, 30]; + // Antenna first so the head caps its stalk: the bulb on the air is the + // "linked" half of the mark and the head is the "agent" half. + filledCapsule(x, y - 5 * scale, x, y - 10 * scale, 1.6 * scale, shell); + filledDisc(x, y - 11 * scale, 2.2 * scale, shell); + filledCapsule(x - 4 * scale, y, x + 4 * scale, y, 12 * scale, shell); + filledDisc(x - 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledDisc(x + 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledCapsule(x - 3 * scale, y + 3 * scale, x + 3 * scale, y + 3 * scale, + 1.6 * scale, detail); + // A second watcher is rare enough to say plainly rather than by stacking + // heads sideways across a read-out that has no room for them. + if (count > 1) typeWrite(String(count), x + 13 * scale, y - 6 * scale, + Math.max(12, Math.round(13 * scale)), ...shell); +} + +// Connection health, as four bars and one number — the thing every online +// game owes a player and oskiewar had no way to say. @jeffrey: "can we show a +// connection health like wifi meter, on the top right of the game". +// +// The number is whatever this seat can honestly measure, which is not the same +// on both lanes: +// +// A rollback fight knows its round trip exactly (see netSendInputs: our own +// wall mark comes home on the rival's next packet), so it reports ping. +// A grandstand or an older-build guest never gets a packet back, so it can +// only measure the wire it is being served: how irregular the frames are and +// how many of them the relay ate. It reports jitter, and loss when there is +// any. +// A host in the streamed lane hears the rival only through pads, so its one +// honest reading is how long ago the last one arrived. +// +// Nothing is invented. A lane with no rival on it draws nothing at all. +const netHealthPalette = [[245, 90, 96], [250, 200, 80], [180, 235, 120], + [108, 240, 168]]; + +function netHealth() { + if (netSession) { + const stats = netSession.stats; + const ping = Math.round(stats.pingMs || 0); + // Nothing has come home yet; a meter that reads four bars before it has + // measured anything is a lie told at exactly the moment somebody is + // deciding whether the connection is good. + let bars = !stats.pings ? 0 + : ping < 50 ? 4 : ping < 100 ? 3 : ping < 170 ? 2 : 1; + // A desync means the two machines are no longer playing the same fight. + // The wire may be fast and the connection is still not healthy. + if (bars && stats.desyncs) bars = Math.min(bars, 1); + return { bars, label: stats.pings ? ping + "MS" : "···", + note: stats.desyncs ? "DESYNC" : "" }; + } + if (roundViewerMode === "LIVE" && roundViewerFrames.length) { + const jitter = Math.round(roundViewerJitterMs); + const loss = roundViewerLossPct; + const bars = jitter < 12 && loss < 3 ? 4 + : jitter < 30 && loss < 10 ? 3 + : jitter < 60 && loss < 25 ? 2 : 1; + return { bars, label: "±" + jitter + "MS", + note: loss ? loss + "% LOST" : "" }; + } + // The host's side of a streamed fight. Only while somebody is actually + // sitting in the second chair — an empty room has no connection to rate. + if (versusLane() && !roundViewer) { + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return null; + const age = Date.now() - remote.at; + if (age > versusChallengerGraceMs) return null; + return { bars: age < 150 ? 4 : age < 400 ? 3 : age < 1000 ? 2 : 1, + label: age + "MS", note: "" }; + } + return null; +} + +// Where the meter stands, and whether it stands at all. Split out so the rest +// of the top-right corner can measure around it: with no QR up the meter owns +// that corner, and a label that assumed the corner was free landed on it. +function netHealthBox() { + if (typeof capabilities === "function" && + (capabilities().socialPreview || capabilities().replayOven === true)) + return null; + if (shellMode !== "GAME") return null; + const health = netHealth(); + if (!health) return null; + const safe = hudSafeRect(); + const qr = spectatorQrBox(); + const compact = compactLayout(); + const bar = compact ? 5 : 7; + const gap = compact ? 3 : 4; + const tall = compact ? 19 : 26; + const count = 4; + const width = count * bar + (count - 1) * gap; + // Under the code, never over it: the QR is the address a friend types and + // the meter is a readout about the friend who already did. + const top = (qr ? qr.top + qr.size + 8 : safe.top) + 2; + // Sized off the bars rather than the HUD's own type scale: the reading is a + // caption to the meter, and at hudTypeSize it swamped the thing it labels. + const size = Math.max(14, Math.round(tall * .8)); + const label = health.note ? health.label + " " + health.note : health.label; + return { health, bar, gap, tall, count, width, top, base: top + tall, + right: safe.right, left: safe.right - Math.max(width, + handleWidth(label, size)), size, label }; +} + +// The left edge of whatever owns the top-right corner — the round's QR, or +// the connection meter when no code is up. Anything else that wants to sit up +// there measures from here instead of from the safe rect, or it draws on top +// of the corner's furniture. +function hudTopRightLeft() { + const qr = spectatorQrBox(); + if (qr) return qr.left; + return netHealthBox()?.left ?? hudSafeRect().right; +} + +function drawNetHealth(ink) { + const box = netHealthBox(); + if (!box) return; + const { health, bar, gap, tall, count, width, base, right, size, label } = box; + const lit = netHealthPalette[Math.max(0, health.bars - 1)]; + const dim = mixColor([58, 64, 78], [196, 201, 212], visualTheme.light); + const previousDepth = triangleDepth; + triangleDepth = -1.43; + for (let index = 0; index < count; index++) { + const height = Math.round(tall * (index + 1) / count); + const x = right - width + index * (bar + gap); + screenRect(x + 2, base - height + 2, bar, height, [24, 26, 34]); + screenRect(x, base - height, bar, height, + index < health.bars ? lit : dim); + } + const labelWidth = handleWidth(label, size); + const labelY = base + 7; + typeWrite(label, right - labelWidth + 2, labelY + 2, size, + ...contrastShadow(ink)); + typeWrite(label, right - labelWidth, labelY, size, + ...(health.note ? netHealthPalette[0] : ink)); + triangleDepth = previousDepth; +} + +function drawMapName(ink) { + const safe = hudSafeRect(), health = netHealthBox(), qr = spectatorQrBox(); + const label = currentMapName.toLowerCase(); + let size = compactLayout() ? 22 : 26; + while (size > 14 && handleWidth(label, size) > (safe.right - safe.left) * .35) size--; + const x = safe.right - handleWidth(label, size); + // Stack below connection/QR furniture; keep the center clear all round. + const y = Math.max(safe.top + 8, + health ? health.base + health.size + 21 : 0, + qr ? qr.top + qr.size + 14 : 0); + typeWrite(label, x + 2, y + 2, size, ...contrastShadow(ink)); + typeWrite(label, x, y, size, ...ink); +} + +function drawSpectatorQr(ink, placement = null) { + if (typeof globalThis.__oskiewarJevPad === 'function') return; + if (typeof capabilities === "function" && capabilities().socialPreview) return; + const qr = placement || spectatorQrBox(); + if (!qr) return; + const { count, quiet, cell, size, left, top } = qr; + // National identity flies beside the code, wherever the code goes. US + // first — more flags join as they are drawn. Reel placements opt out with + // the rest of the HUD furniture. + if (!placement && typeof capabilities === "function" && + capabilities().country === "US") + drawUsFlag(left - Math.round(hudTypeSize * 2.1) - 12, top + 2, + Math.round(hudTypeSize * 2.1), Math.round(hudTypeSize * 1.2), ink); + const shadow = [24, 26, 34]; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + screenRect(left + 3, top + 3, size, size, shadow); + screenRect(left, top, size, size, [250, 250, 247]); + // Dark modules coalesce into horizontal runs so a full code stays a few + // dozen faces instead of a few hundred — drawErrorQr already draws this way. + const dark = [7, 8, 14]; + for (let row = 0; row < count; row++) { + let run = 0; + for (let column = 0; column <= count; column++) { + if (column < count && spectatorQr.isDark(row, column)) { run++; continue; } + if (run) screenRect(left + (column - run + quiet) * cell, + top + (row + quiet) * cell, run * cell, cell, dark); + run = 0; + } + } + triangleDepth = previousDepth; +} + +// Framing marks rather than a full box: the corners state the bounds without +// drawing four lines through the fight. +function drawCornerCrops(rect, reach, width, color) { + const arm = Math.min(reach, (rect.right - rect.left) / 3, + (rect.bottom - rect.top) / 3); + for (const [x, towardX] of [[rect.left, 1], [rect.right, -1]]) + for (const [y, towardY] of [[rect.top, 1], [rect.bottom, -1]]) { + filledCapsule(x, y, x + towardX * arm, y, width, color); + filledCapsule(x, y, x, y + towardY * arm, width, color); + } +} + +function drawImpacts() { + for (const impact of impacts) { + if (impact.explosion && impact.blastRadius) { + const age = clamp(1 - impact.life / impact.duration, 0, 1); + const center = projectPoint(impact.x, impact.y - 3, impact.z || 0); + const edge = projectPoint(impact.x + impact.blastRadius, + impact.y - 3, impact.z || 0); + const radius = Math.abs(edge.x - center.x); + if ([center.x, center.y, radius].every(Number.isFinite) && radius < 4000 && + !drawPhotoExplosion(center.x,center.y,radius,age,center.z-.025)) { + filledRing(center.x, center.y, radius, + Math.max(0, radius - Math.max(7, 22 * (1 - age))), + mixColor([255, 218, 86], [111, 74, 48], age)); + const shockRadius = radius * (.18 + age * .72); + filledRing(center.x, center.y, shockRadius, + Math.max(0, shockRadius - Math.max(4, 13 * (1 - age))), + mixColor([255, 246, 184], [164, 92, 52], age)); + } + } + for (const mote of impact.debris || []) { + const point = projectPoint(mote.x, mote.y, mote.z); + const radius = Math.max(2, mote.radius * cameraScale()); + if (![point.x, point.y, radius].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledDisc(point.x, point.y, radius, + impact.death ? [255, 105, 190] : [255, 232, 92]); + } + } +} + +function drawDetachedPart(fragment) { + const first = projectPoint(fragment.x1, fragment.y1, fragment.z1); + const second = projectPoint(fragment.x2, fragment.y2, fragment.z2); + const width = Math.max(2, fragment.width * cameraScale()); + const values = [first.x, first.y, second.x, second.y, width]; + if (!values.every(Number.isFinite) || width > 2000) return; + const margin = width + 4; + if (Math.abs(first.x) + margin > 30000 || + Math.abs(first.y) + margin > 30000 || + Math.abs(second.x) + margin > 30000 || + Math.abs(second.y) + margin > 30000 || + Math.hypot(second.x - first.x, second.y - first.y) > 30000) return; + if (photoThemeActive) { + // Ownership changes when a limb is hit; its material keeps its source color. + const seat = fragment.color[1] > fragment.color[0] ? 1 : 0; + photoLimb({x1:first.x,y1:first.y,x2:second.x,y2:second.y,width}, seat); + return; + } + filledCapsule(first.x, first.y, second.x, second.y, width + 3, [9, 12, 22]); + drawPaletteCapsule({ x1: first.x, y1: first.y, x2: second.x, y2: second.y, + width, part: fragment.part }, fragment.colors, + fragment.paletteCoordinate || 0, fragment.color); +} + +function drawSafeZones() { + if (!debugHitboxes || renderFlags.hud === false) return; + drawCornerCrops(hudSafeRect(), 46, 3, [255, 214, 84]); + drawCornerCrops(actionSafeRect(), 34, 2, [105, 255, 118]); +} + +// The head is the second door on the title screen. START is still anywhere — +// `tapTitle` in the shell makes the whole frame the button — so the one place +// that must NOT start a fight is the face, because that is where a player who +// wants to BE the fighter is already looking. The game publishes the head's +// screen circle and the shell hit-tests it ahead of the anywhere-button; the +// ring is drawn here rather than in the shell because only the game knows +// where the head went this frame. +// +// Nothing is drawn unless a wizard is actually mounted (`__oskiewarWizard`), +// so the Xbox and the reel renderer — which have no DOM to open — never show +// an affordance that would dud. +function drawTitleHeadDoor(t, ink, suppressed) { + const touch = globalThis.__oskiewarTouch; + if (!touch) return; + const onTitle = shellMode === "MENU" && titleTransitionAt === null; + if (!onTitle || suppressed || !globalThis.__oskiewarWizard) { + if (touch.titleHead) touch.titleHead = null; + return; + } + // Only over a seat that is actually yours. The attract loop's "action" + // variant dresses BOTH fighters as bots (`beginTraining`), and a ring that + // says "add yourself" on a bot's head invites a player to replace somebody + // who was never there. No local body on screen, no door. + const seat = players[0]; + if (!seat || !seat.alive || seat.npc || seat.bot) { touch.titleHead = null; return; } + const head = runnerWorldGeometry(seat, t).head; + if (!head) { touch.titleHead = null; return; } + // Radius in screen units is measured, not guessed: the title camera pushes + // in and out across the attract loop, and a fixed pixel radius would drift + // off the face. Same idiom the killcam tears use. + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(9, Math.hypot(edge.x - point.x, edge.y - point.y)); + const reach = radius * 1.22; + touch.titleHead = { x: point.x, y: point.y, radius: reach }; + // On the screen-UI lane, so a fighter standing in front of their own face + // cannot draw through the invitation. + triangleDepth = -1.42; + const pulse = (Math.sin(t * 2.4) + 1) / 2; + // Gold on its own rather than mixed toward the title ink: ink is near-white + // on the night sky and near-black at noon, so mixing gave a different — and + // on the light theme, muddy — colour every hour. The dark under-ring is what + // carries it across both, the same trick the type beside it uses. + const glow = mixColor([230, 205, 92], [255, 250, 226], pulse * .55); + const stroke = Math.max(1.5, radius * .085); + hudCircle(point.x, point.y, reach, stroke * 2.1, [16, 20, 34]); + hudCircle(point.x, point.y, reach, stroke, glow); + // The words ride a plate. A meditating fighter fills the whole column under + // their own chin, so unplated type landed on shoulders and arms and read as + // part of the body; the plate is dark on both themes because the gold is. + const label = "add yourself"; + const size = Math.max(11, Math.round(radius * .44)); + const width = handleWidth(label, size); + const padX = Math.round(size * .55), padY = Math.round(size * .34); + const left = point.x - width / 2; + const top = point.y + reach + size * .45; + hudBox(left - padX, top - padY, width + padX * 2, size + padY * 2, 16, 20, 34); + typeWrite(label, left, top, size, ...glow); +} + +function gamePaint() { + syncGameView(); + globalThis.__oskiewarLocalVersus = localVersusActive(); + const run = runtime(); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.screen = shellMode === "MENU" + ? titleTransitionAt !== null ? "title-transition" : "title" + : selecting ? "select" : "game"; + } + // Each fighter's cues sit where the fighter stands — @jeffrey: "can audio + // be mixed according to the player's position, stereo, for each player, if + // its not local multiplayer". Two humans on one couch share one speaker + // image, so their mix stays centered; against the machine — or a rival on + // the far end of a wire — the stage pans. + const couchVersus = !players[1].npc && !players[1].bot && + !players[1].remote && !selfPlay; + globalThis.__oskiewarPlayerPans = players.map((player) => couchVersus ? 0 : panPlayer(player)); + // The shell's resolution governor steers by this — the game's own measured + // rate, because the host's profile numbers never made it off the Xbox. + globalThis.__oskiewarDisplayFps = displayFps; + const paintAt = run.paintMonotonicUs ?? run.monotonicUs; + if (lastPaintAt > 0 && paintAt > lastPaintAt) { + const sample = clamp(1000000 / (paintAt - lastPaintAt), 1, 240); + displayFps = displayFps ? lerp(displayFps, sample, .12) : sample; + } + lastPaintAt = paintAt; + const t = (run.monotonicUs - startedAt) / 1000000; + if (typeof ac === "function") acFeed = ac(); + syncSignedInFighter(); + const localNation = typeof capabilities === "function" + ? String(capabilities().country || "").toUpperCase() : ""; + if (/^[A-Z]{2}$/.test(localNation)) { + players[0].nation = localNation; + if (!players[1].npc) players[1].nation = localNation; + } + // The remote rival's wardrobe came up the wire, not out of the roster — + // a profile lookup here would answer empty and strip them every frame. + for (const player of players) + if (!player.remote) player.handleColors = fighterProfile(player.name).colors; + visualTheme = displayTheme(); + const replayOven = typeof capabilities === "function" && + capabilities().replayOven === true; + const reelHud = typeof capabilities === "function" && + capabilities().reelHud === true; + const matchHud = !replayOven || reelHud; + // A reel is watched at arm's length with no controller in hand, and the + // corner furniture a player needs — nameplates, stats, inventory, the + // command stream — crowds a 9:16 crop and competes with the fight for the + // eye. So a reel carries no HUD at all while the round is live, and states + // the outcome afterward in the middle of the frame, one line at a time. + const reelMinimal = replayOven && reelHud && + capabilities().reelFullUi !== true; + triangleDepth = -1.4; + // The station uses a plain light or dark backdrop matching the HUD theme. + const space = !survivalActive(); + const mapColors = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const skyDay = mixColor([176, 215, 245], [255, 160, 112], + visualTheme.sunset * .7); + const sky = space ? mixColor(mapColors.night, mapColors.sky, visualTheme.light) + : mixColor([7, 8, 28], skyDay, visualTheme.light); + // Match the clear color to the arena sky. Camera framing can reveal the + // clear layer during a jump; a different clear color looked like a flash. + const outside = sky; + // Keep the room's planes materially distinct: blue atmosphere, warm plaster + // behind the fighters, and green earth under them. Day/night can tint the + // palette without washing every surface into the same gray. + const arenaDay = mixColor([244, 211, 178], [235, 154, 150], + visualTheme.sunset * .48); + const arena = mixColor([24, 18, 42], arenaDay, visualTheme.light); + // Pale steel in light mode stays distinct from the brighter backdrop. + const groundDay = mixColor([142, 184, 116], [190, 151, 103], + visualTheme.sunset * .38); + const ground = space + ? mixColor(mapColors.floor.map(c => Math.round(c * .32)), mapColors.floor, visualTheme.light) + : mixColor([13, 25, 29], groundDay, visualTheme.light); + // The floating decks are steel with a lit edge. The plate itself stays + // near the hull's own value — a near-white slab against vacuum reads as a + // UI bar laid over the game rather than as a thing in it — and the LIP + // carries the brightness instead, which is the part a player actually has + // to judge. On plaster the relationship is the other way round: the deck is + // the pale thing and the lip is the dark line under it, because there the + // background is what is bright. + const platformColor = space + ? mixColor(mapColors.deck.map(c => Math.round(c * .42)), mapColors.deck, visualTheme.light) + : mixColor([24, 29, 46], [211, 198, 171], visualTheme.light); + const titleInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + const statusShadow = contrastShadow(titleInk); + const menuArena = mixColor([7, 10, 26], [235, 241, 248], visualTheme.light); + const menuPanel = mixColor([20, 28, 56], [215, 225, 239], visualTheme.light); + const menuInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + renderFlags = globalThis.__oskiewarRenderFlags || renderFlags; + wipe(...outside); + if (airRoundActive() && typeof themeAssetReady === "function" && themeAssetReady(4)) { + themeSprite(4,0,0,1672,940,viewCenterX(),viewHeight/2, + viewWidth(),viewHeight,0,false,photoBackdropDepth); + } else if (photoThemeActive && !airRoundActive()) { + themeSprite(0,0,0,1672,941,viewCenterX(),viewHeight/2, + viewWidth(),viewHeight,0,false,photoBackdropDepth); + } else if (renderFlags.sky !== false) drawSkyAtmosphere(sky, arena); + if (PAL_SELECT && selecting) { + box(0, 0, viewWidth(), viewHeight, ...menuArena); + drawSelectionScreen(t, menuInk, menuPanel); + return; + } + const cinematicAge = deathCinematicAge(run.monotonicUs); + const introAge = run.monotonicUs - roundStartedAt; + const inRoundIntro = !roundResult && introAge >= 0 && + introAge < roundIntroDurationUs(); + // The intro deliberately owns its lens: wide title, two face portraits, + // then a pullback. Final-frame containment would widen every portrait until + // both fighters fitted, erasing the zoom story it was meant to protect. + if (!finalKillReplayRendering && !inRoundIntro && (cinematicAge < 0 || cinematicAge >= 1.45)) + containFighters(t); + cameraDoll.prepare(); + const { left: spanLeft, right: spanRight, + top: spanTop, bottom: spanBottom } = terrainSpan(); + if (!airRoundActive()) drawRoomSurfaces(spanLeft, spanRight, spanTop, spanBottom, arena); + // The reel camera puts the floor's own front edge (worldNear) in front of + // the lens, where it crosses the frame as a hard horizontal step with the + // skirt showing under it. Extending the slab past the camera hands the cut + // to the near plane, which faces already handle correctly, so the ground + // reads as ground all the way down the frame. Past the camera means PAST + // THE CAMERA — a fixed extension was still shy of the wide fight shot, + // which stands several thousand units back, and the step came back on + // every wide frame. Reels only: on the TV lens the visible front edge IS + // the padded-room look. + const groundNear = reelGroundCamera() + ? Math.min(worldNear, cameraDoll.position.z - 400) : worldNear; + if (airRoundActive()) drawAirDropSky(t); + else { + drawTerrainBackWall(spanLeft, spanRight, worldFar, ground); + drawTerrainSurface(spanLeft, spanRight, groundNear, worldFar, ground); + drawTerrainFrontWall(spanLeft, spanRight, groundNear, ground); + drawSkateParkFeatures(); + } + // No grass in vacuum. The blades were the tower's lawn and the cube kept + // them out of habit; on a hull they read as moss on a spaceship. + if (renderFlags.grass !== false && !space) + drawTerrainGrass(spanLeft, spanRight, ground); + if (!airRoundActive()) drawBoosterPad(t); + const platformNear = -520; + const platformFar = 520; + // A rung wants to be a slab, but the stage paints in order with no depth + // buffer — the volume's faces landed over the fighters on console. So each + // one is a plane plus a front-edge line: the plane is the deck a fighter + // stands on, and the line is the lip, which is what keeps a rung readable + // when the camera happens to sit at its height and the deck goes edge-on. + // The line rides the line layer, so twelve rungs cost twenty-four faces and + // the lips cost none. The span clamp is the same one the terrain uses, and + // in a room this size its 2600-unit apron usually covers everything — it is + // here to bound the worst case, not because it culls much today. + const ledgeInk = space + ? mixColor(platformColor, [196, 224, 255], .62) + : mixColor(platformColor, [26, 24, 34], .42); + if (platformsEnabled()) for (const ledge of activeLedges()) { + if (finalKillLedgeOccludes(ledge,platformNear,platformFar)) continue; + if (ledge.right < spanLeft || ledge.left > spanRight) continue; + if (ledge.y < spanTop || ledge.y > spanBottom) continue; + const ledgeLeft = Math.max(ledge.left, spanLeft); + const ledgeRight = Math.min(ledge.right, spanRight); + if (ledgeLeft >= ledgeRight) continue; + const photoLedge = photoThemeActive && photoSurface("concrete", + projectPoint(ledgeLeft,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformFar), + projectPoint(ledgeLeft,ledge.y,platformFar)); + if (!photoLedge) worldQuad( + { x: ledgeLeft, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformFar }, + { x: ledgeLeft, y: ledge.y, z: platformFar }, platformColor); + worldLine(ledgeLeft, ledge.y, platformNear, + ledgeRight, ledge.y, platformNear, 5, ledgeInk); + } + if (workshopHighlight && globalThis.__oskiewarWorkshopEnabled) { + for (const player of players) { + const x = player.spawnX, y = terrainFloorAt(x); + const ink = player.pad === 0 ? [80, 240, 255] : [255, 100, 210]; + worldLine(x - 55, y - 4, -50, x + 55, y - 4, -50, 6, ink); + worldLine(x, y, 0, x, y - 240, 0, 6, ink); + worldLine(x, y - 240, 0, x + 65, y - 210, 0, 6, ink); + } + } + drawSurvivalLava(t); + const shadowInk = mixColor([3, 5, 14], [92, 99, 101], + visualTheme.light * .72); + if (renderFlags.shadows !== false && !airRoundActive()) { + for (const player of activePlayers()) + if (player.alive || roundResult) + drawSpotShadow(player.x, player.y, player.z, player.ducking ? 52 : 64, + shadowInk); + for (const item of balls) + if (item.active) + drawSpotShadow(item.x, item.y, item.z, item.radius * 1.18, shadowInk); + } + const windInk = windDirection < 0 + ? mixColor([72, 174, 255], [28, 88, 188], visualTheme.light) + : mixColor([255, 92, 132], [184, 35, 62], visualTheme.light); + if (WIND_FLAG && shellMode === "GAME") drawWindFlag(t, windInk); + // The round keeps match time and spectator state only. Time of day belongs + // to the title screen; carrying it into gameplay confused two unrelated + // clocks and spent the top-right lane on non-match information. + if (matchHud && !reelMinimal && shellMode === "GAME" && gameplayStarted) { + const timedRound = roundIsTimed(); + const remainingSeconds = roundResult || !timedRound ? 0 : Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + const timerText = !roundResult && timedRound + ? Math.floor(remainingSeconds / 60) + ":" + String(remainingSeconds % 60).padStart(2, "0") : ""; + const hud = hudSafeRect(); + const timerSize = compactLayout() ? 52 : 64; + if (timerText) { + const timerWidth = handleWidth(timerText, timerSize); + const timerDanger = timedRound && remainingSeconds > 0 && + remainingSeconds <= 10; + const timerShake = timerDanger + ? Math.sin(t * 35) * (11 - remainingSeconds) * .45 : 0; + const timerInk = timerDanger + ? mixColor(titleInk, [235, 38, 58], (11 - remainingSeconds) / 10) + : titleInk; + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake + 2, + hud.top + 5, timerSize, 4, 5, 12); + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake, + hud.top + 2, timerSize, ...timerInk); + } + if (roundViewer) { + const viewerLabel = roundViewer.seat === "challenger" + ? roundViewerMode === "LIVE" ? "VS" : "WAITING FOR HOST" + : roundViewerMode || roundViewerStatus; + // Left of the corner's furniture, never on it: that corner is the + // round's QR, or the connection meter when there is no code up. + const labelSize = 24; + const labelRight = hudTopRightLeft() - 14; + typeWrite(viewerLabel, + labelRight - handleWidth(viewerLabel, labelSize), hud.top + 7, + labelSize, ...(roundViewerMode === "LIVE" ? [210, 42, 62] : titleInk)); + // The chair-holder plays through this feed: say which body is theirs + // while the matchup is still fresh, then get out of the fight's way. + if (roundViewer.seat === "challenger" && roundViewerMode === "LIVE" && + t < 8) { + const seatLine = "YOU ARE " + + (players[1].name || "THE SECOND FIGHTER") + " — RIGHT SIDE"; + const seatSize = compactLayout() ? 13 : 17; + const seatWidth = handleWidth(seatLine, seatSize); + typeWrite(seatLine, viewCenterX() - seatWidth / 2, + hud.top + hudTypeSize + 16, seatSize, ...titleInk); + } + } + const nowMs = run.unixMs || Date.now(); + drawHudStatusTray(null, titleInk, nowMs); + const updateReady = typeof capabilities === "function" && + capabilities().updateReady === true; + if (updateReady) { + const label = "update ready"; + const size = Math.round(hudTypeSize * .58); + const width = handleWidth(label, size); + const x = hudTopRightLeft() - 14 - width; + const y = hud.top + hudTypeSize + 12; + typeWrite(label, x + 2, y + 3, size, ...contrastShadow(titleInk)); + typeWrite(label, x, y, size, ...titleInk); + if (globalThis.__oskiewarTouch) + globalThis.__oskiewarTouch.updateButton = + { x: x - 8, y: y - 6, width: width + 16, height: size + 12 }; + } else if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.updateButton = null; + } + } + if (!survivalActive()) { + for (const tree of bodyTrees) drawBodyTree(tree, t); + for (const pickup of gunPickups) drawGunPickup(pickup, t); + for (const pickup of saberPickups) drawSaberPickup(pickup, t); + for (const pickup of grenadePickups) drawGrenadePickup(pickup, t); + } + const showRunnerLabels = matchHud && !reelMinimal && + (Boolean(roundResult) || introAge >= roundIntroDurationUs()); + const viewDirection = normalize3({ + x: cameraDoll.target.x - cameraDoll.position.x, + y: cameraDoll.target.y - cameraDoll.position.y, + z: cameraDoll.target.z - cameraDoll.position.z, + }); + const renderables = [ + ...bullets.map((item) => ({ + kind: "bullet", item, x: item.x, y: item.y, z: item.z })), + ...grenades.filter((item) => item.alive).map((item) => ({ + kind: "grenade", item, x: item.x, y: item.y, z: item.z })), + ...balls.filter((item) => item.active).map((item) => ({ + kind: "ball", item, x: item.x, y: item.y, z: item.z })), + ...detachedParts.map((item) => ({ kind: "detached", item, + x: (item.x1 + item.x2) / 2, y: (item.y1 + item.y2) / 2, + z: (item.z1 + item.z2) / 2 })), + // Both fighters are always in this list. A fighter is never removed from + // the frame to make a camera move work — the shot is what moves. + ...activePlayers().map((item) => ({ + kind: "player", item, x: item.x, y: item.y, z: item.z })), + ]; + const depth = (item) => dot3({ + x: item.x - cameraDoll.position.x, + y: item.y - cameraDoll.position.y, + z: item.z - cameraDoll.position.z, + }, viewDirection); + renderables.sort((a, b) => depth(b) - depth(a)); + for (const renderable of renderables) { + triangleDepth = projectPoint(renderable.x, renderable.y, renderable.z).z; + if (renderable.kind === "bullet") drawBullet(renderable.item); + else if (renderable.kind === "grenade") drawGrenade(renderable.item); + else if (renderable.kind === "ball") drawBall(renderable.item); + else if (renderable.kind === "detached") drawDetachedPart(renderable.item); + else { + drawDiveMotion(renderable.item, t); + drawDoubleJumpMotion(renderable.item, t); + drawRunner(renderable.item, t, showRunnerLabels); + } + } + // Debug geometry sits above the world but below the -1.42 screen-UI lane. + // It must remain visible through fighter bodies without cutting across the + // title, controls, command notation, names, clock, or other HUD furniture. + triangleDepth = -1.4; + drawDebugHitboxes(players[0], t); + if (!survivalActive()) for (const player of players.slice(1)) drawDebugHitboxes(player, t); + for (const player of players) drawBotScene(player); + drawBallHitboxes(); + drawSafeZones(); + triangleDepth = -1.42; + // On the SCREEN UI layer, not the debug-geometry one above it. The meter is + // an instrument being read rather than scenery in the room, and the layering + // test is what caught it sitting at the debug depth where a tall enough + // piece of world could have drawn straight through it. + drawFrameMeter(); + drawImpacts(); + drawTitleHeadDoor(t, titleInk, reelMinimal); + const counting = !roundResult && introAge < roundIntroDurationUs(); + // The matchup card announces two names in the middle of the screen, which + // is exactly where the wordmark sits. On the entry fight the word wins. + if (matchHud && !reelMinimal && counting && shellMode === "GAME") + survivalActive() + ? drawSurvivalIntro(titleInk, statusShadow) + : drawFightIntro(introAge / 1000000, titleInk, statusShadow); + // The keys belong wherever a newcomer is looking: under the wordmark on the + // way in, and again while a round counts itself off. Self-play has no + // newcomer — two bots need no tutorial, and neither does a reel of them. + // The legend is the stable key for the score written beneath it. Keep it + // present throughout every player-controlled screen; only unattended bot + // self-play and marketing reels have no learner to serve. + if (!replayOven && !selfPlay && renderFlags.keys !== false) + drawControlLegend(titleInk); + const resultUiReady = cinematicAge < 0 || cinematicAge >= 1.1; + // A reel opens on the matchup. Both names, both palettes, stacked up top + // where the fighters are not — a stranger scrolling past should know who is + // who before the first hit lands. It clears out early so the round itself + // still plays under nothing at all. + if (reelMinimal && shellMode === "GAME" && !roundResult && + introAge / 1000000 < REEL_MATCHUP_SECONDS) { + const nameSize = compactLayout() ? 40 : 54; + const top = Math.round(viewHeight * .14); + const names = activePlayers(); + for (let side = 0; side < names.length; side++) { + drawReelName(String(names[side].name).toLowerCase(), + top + side * Math.round(nameSize * 1.5), nameSize, names[side], t); + } + } + if (matchHud && survivalActive() && shellMode === "GAME" && + gameplayStarted && !roundResult && !counting) + drawSurvivalHud(titleInk); + if (survivalActive() && roundResult && resultUiReady) { + drawSurvivalResult(titleInk, statusShadow); + } else if (reelMinimal && roundResult && resultUiReady) { + // One fact, in the middle of the frame: who won. The recording stops on + // the result card, so anything queued behind the name would never survive + // the trim — and a name alone is the whole story a reel owes a stranger. + const result = resultCardText(true); + const winnerSize = compactLayout() ? 46 : 64; + // Up top, where the fight is not. The celebration push puts the winner's + // head in the middle of the frame, so a name anywhere near center lands on + // their face. + const champion = players.find((player) => + String(player.name).toLowerCase() === result.winner) || null; + drawReelName(result.winner, Math.round(viewHeight * .17), + winnerSize, champion, t); + } else if (matchHud && roundResult && resultUiReady) { + if (INSTANT_REPLAY && instantReplay) { + const frame = Math.min(instantReplay.frames.length, + Math.floor(instantReplay.cursor) + 1); + const replayLabel = "REPLAY " + frame + "/" + instantReplay.frames.length; + typeWrite(replayLabel, viewCenterX() - replayLabel.length * 10, + 820, 30, ...titleInk); + drawCenteredKeycapRun(replayControlKeys(instantReplay.paused), + 940, 19, inputPads[0]?.down || [], titleInk); + } else { + const result = resultCardText(true); + // The result is a small ownership mark, not a second title screen. + // Character reactions carry the emotional result in the arena. + const winnerSize = compactLayout() ? 30 : 42; + const winnerWidth = handleWidth(result.winner, winnerSize); + const resultY = hudSafeRect().top + 62; + typeWrite(result.winner, viewCenterX() - winnerWidth / 2 + 3, resultY + 4, + winnerSize, ...statusShadow); + typeWrite(result.winner, viewCenterX() - winnerWidth / 2, resultY, + winnerSize, ...titleInk); + if (result.action) { + const actionSize = Math.min(44, winnerSize * .54); + const actionWidth = handleWidth(result.action, actionSize); + typeWrite(result.action, viewCenterX() - actionWidth / 2 + 3, 900, + actionSize, ...statusShadow); + typeWrite(result.action, viewCenterX() - actionWidth / 2, 896, + actionSize, ...titleInk); + } + if (!roundViewer && INSTANT_REPLAY) { + drawCenteredKeycapRun(replayOfferKeys(), 940, 19, + inputPads[0]?.down || [], titleInk); + } + } + } + // Nameplates and stats wait for the wordmark to lift; the entry frame is + // the word, the keys, and the two fighters, and nothing else. + if (!survivalActive() && matchHud && !reelMinimal && shellMode === "GAME" && + ((roundResult && resultUiReady) || + (!roundResult && introAge >= roundIntroDurationUs()))) { + const hudPlayers = spatialHudPlayers(); + for (let side = 0; side < hudPlayers.length; side++) { + const player = hudPlayers[side]; + drawPlayerHandle(player, t, side); + drawPlayerStats(player, side, t); + drawHudInventory(player, side); + drawCommandStream(player, side); + } + } + if (!survivalActive() && replayOven && capabilities().reelFullUi === true && + shellMode === "GAME") + drawReelSectionProgress(run.monotonicUs, titleInk); + if (!replayOven) drawDebugPerformance(titleInk); + drawDeathFlash(); + if (shellMode === "MENU") { + const transitionAge = titleTransitionAt !== null + ? (run.monotonicUs - titleTransitionAt) / 1000000 : -1; + drawTitleScreen(t, menuInk, transitionAge); + if (transitionAge >= 0) return; + } + if (!replayOven) { + // Over the fighters, deliberately: the lobby's lone body stands center + // frame, and an instruction painted under it was an instruction hidden. + if (!reelMinimal) drawVersusHud(t, titleInk, run); + drawSpectatorQr(titleInk); + if (!reelMinimal) drawNetHealth(titleInk); + if (matchHud && !reelMinimal && renderFlags.hud !== false && + shellMode === "GAME" && !survivalActive()) drawMapName(titleInk); + drawTouchControls(); + if (localVersusActive() && localControllerMissing !== -1) { + const label = "reconnect player " + (localControllerMissing + 1); + const size = compactLayout() ? 30 : 48; + const width = handleWidth(label, size); + const left = viewCenterX() - width / 2; + const top = viewHeight * .43; + box(left - 20, top - 16, width + 40, size + 32, 9, 12, 22); + typeWrite(label, left, top, size, 255, 235, 130); + } + } +} + +// The raw pad words remember() files between real moves. The training floor +// captions moves, not fingers — "KICK" teaches, "B" nags. +const versusLabelNoise = new Set(["NONE", "UP", "DOWN", "LEFT", "RIGHT", + "A", "B", "X", "Y", "LB", "RB", "VIEW", "MENU"]); + +// The lobby's interface is a challenge and a code: fight a friend, share +// the address, and until they arrive every move the lone fighter makes is +// named back at them — the empty room as training mode. +function drawVersusHud(t, ink, run) { + if (!versusLane() || shellMode !== "GAME") return; + if (!lobbyActive()) return; + const hud = hudSafeRect(); + const compact = compactLayout(); + const door = versusDoor(); + // Behind the door the address is a lie: nothing is published, so nobody + // could arrive at it. Say what is actually in the way instead. The panel + // that takes the email or the handle is the shell's, over the top of this; + // this is the part that stays legible on a television across a room. + const headline = door === "login" ? "SIGN IN TO PLAY" + : door === "handle" ? "CHOOSE A HANDLE" : "WAITING ROOM"; + const headSize = compact ? 30 : 44; + const pulse = .5 + Math.sin(t * 2.4) * .5; + const headInk = mixColor(ink, [235, 205, 74], .35 + pulse * .45); + const headWidth = handleWidth(headline, headSize); + const headX = viewCenterX() - headWidth / 2; + const headY = hud.top + (compact ? 30 : 42); + typeWrite(headline, headX + 3, headY + 3, headSize, ...contrastShadow(ink)); + typeWrite(headline, headX, headY, headSize, ...headInk); + const address = door === "login" + ? "A FIGHT NEEDS A NAME ON BOTH ENDS" + : door === "handle" ? "YOUR HANDLE IS WHAT THE FIGHT WRITES DOWN" + : "FIGHT A FRIEND OSKIEWAR.COM/" + versusRoomName.toUpperCase(); + const addressSize = compact ? 16 : 23; + const addressWidth = handleWidth(address, addressSize); + const addressY = headY + headSize + 10; + typeWrite(address, viewCenterX() - addressWidth / 2 + 2, addressY + 2, + addressSize, ...contrastShadow(ink)); + typeWrite(address, viewCenterX() - addressWidth / 2, addressY, + addressSize, ...ink); + const player = players[0]; + // The death card owns the middle of the screen for the whole down beat — + // the loop is die, read it, stand back up whole. + if (!player.alive) { + const deadLabel = "YOU DIED"; + const deadSize = compact ? 44 : 66; + const deadWidth = handleWidth(deadLabel, deadSize); + const deadX = viewCenterX() - deadWidth / 2; + const deadY = Math.round(viewHeight * .44 + Math.sin(t * 3.2) * 3); + typeWrite(deadLabel, deadX + 4, deadY + 4, deadSize, + ...contrastShadow(ink)); + typeWrite(deadLabel, deadX, deadY, deadSize, + ...mixColor(ink, [235, 38, 58], .8)); + return; + } + if (!player.lastButtonAt || versusLabelNoise.has(player.lastButton)) return; + const age = (run.monotonicUs - player.lastButtonAt) / 1000000; + if (age < 0 || age > .9) return; + // The caption swells on landing and lets go through the tail — spoken, + // not filed. + const fade = 1 - age / .9; + const moveSize = Math.round((compact ? 26 : 38) * (1.06 - fade * .06)); + const moveWidth = handleWidth(player.lastButton, moveSize); + const moveX = viewCenterX() - moveWidth / 2; + const moveY = Math.round(viewHeight * .62) - Math.round((1 - fade) * 26); + const moveInk = fade > .4 ? ink : mixColor(contrastShadow(ink), ink, fade / .4); + typeWrite(player.lastButton, moveX + 3, moveY + 3, moveSize, + ...contrastShadow(ink)); + typeWrite(player.lastButton, moveX, moveY, moveSize, ...moveInk); +} + +function boot() { + try { + gameBoot(); + } catch (error) { + captureClientError("boot", error); + } +} + +function sim() { + if (!netSession && performanceStageActive()) return; + if (clientError) { restartAfterClientError(); return; } + try { + netDrainHostInbox(); + if (netSession) netTick(); + else gameSim(); + } catch (error) { + captureClientError("sim", error); + } +} + +function paint() { + refreshPhotoTheme(); + globalThis.__oskiewarGraphicsThemeStatus = photoThemeActive ? "photorealistic" : "flat"; + if (drawPerformanceStage()) return; + if (clientError) { + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + return; + } + const previousMath = Math; + Math = platformMath; // Display-only geometry can use the host's fast intrinsics. + const restore = beginRenderInterpolation(runtime().renderAlpha ?? 1); + sharingRenderPoses = true; + // Capture after paint while its solved pose cache is still alive. + let restoreReplay = () => {}; + try { + restoreReplay = beginFinalKillReplay(); + gamePaint(); + captureFinalKillReplay(runtime().monotonicUs); + drawPerformanceFooter(); + } catch (error) { + captureClientError("paint", error); + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + } finally { + sharingRenderPoses = false; + renderPoses.clear(); + restoreReplay(); + restore(); + Math = previousMath; + } +} +function act() {} +function leave() { + try { + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + } catch (error) { + captureClientError("leave", error); + } +} + + +// Included in Neo's existing Oskiewar renderer; primitive-only and silent. +function drawFemragDance(music, elapsed) { + const width=viewWidth(), height=viewHeight, beat=elapsed*(Number(music.bpm)||144)/60; + const reverse=/ragga/.test(music.section||'')?-1:1; + const gather=/build/.test(music.section||'')?.7:1; + const fade=/outro/.test(music.section||'')?clamp((music.duration-elapsed)/8,0,1):1; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[249,154,103]]; + const hits=(music.hits||[]).map(e=>({t:music.elapsed+e[0]/100,seat:e[1]===6?'sub':e[1],midi:e[2]<0?null:e[2]})); + const sub=hits.reduce((v,e)=>e.seat==='sub'&&elapsed>=e.t?Math.max(v,Math.exp(-(elapsed-e.t)*9)):v,0); + triangleDepth=-.8; + const scale=Math.min(width,height)*.047; + for(let seat=0;seat<6;seat++) { + let hit=null, level=0; + for(const e of hits)if(e.seat===seat&&elapsed>=e.t&&elapsed-e.t<.6){ + const amp=Math.exp(-(elapsed-e.t)*7);if(amp>level){level=amp;hit=e;} + } + const a=seat*2*Math.PI/5+reverse*beat*Math.PI/32; + const x=seat===5?viewCenterX():viewCenterX()+platformMath.sin(a)*width*.30*gather; + const y=seat===5?height*.40:height*.40+platformMath.cos(a)*height*.23*gather; + const step=platformMath.sin(beat*Math.PI+seat)*(.15+level*.55); + const bob=level*scale*.55; + const color=colors[seat].map(v=>Math.round(v*(.55+.45*fade))); + const limb=scale*.17, bodyY=y-bob; + filledCapsule(x,bodyY-scale*.25,x,bodyY+scale*.65,limb,color); + filledDisc(x,bodyY-scale*.8,scale*.42,color); + for(const side of [-1,1]) { + filledCapsule(x,bodyY,x+side*scale*.8,bodyY-scale*(.15+level*.9)+side*step*scale,limb,color); + filledCapsule(x,bodyY+scale*.6,x+side*scale*(.45+step*.25),y+scale*1.35,limb,color); + } + if(hit&&Number.isFinite(hit.midi)) { + const note=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'][Math.round(hit.midi)%12]; + const size=Math.max(20,scale*.65); + typeWrite(note,x-handleWidth(note,size)/2,bodyY-scale*1.9,size,...color); + } + } + // Sub notes swell a steady floor; no full-screen flash or second soundtrack. + screenRect(width*.12,height*.76,width*.76,3+sub*8,[94,110,143]); +} + +// The MacNeoPolitan Trio: only the word being sung — huge, centred, in the +// singer's colour, the singer's name small above it. The word owning the sung +// syllable is found the way the laptops find it (fleet/native-trio.mjs paint): +// syllables run through the line's words in order. Answers draw a size bigger +// and linger 2.5 s after the line ends; other lines' last word lingers 0.8 s. +// The six seats stand as dim breathing figures; the stage keeps its footer. +const TRIO_SEAT_RGB=[[143,209,63],[90,87,211],[242,167,185],[143,209,63],[90,87,211],[242,167,185]]; +let trioLastWord=null; +function drawTrioLyric(music, elapsed) { + const width=viewWidth(), height=viewHeight, centerX=viewCenterX(), centerY=height*.46; + const measure=(text,size)=>handleWidth(String(text).toLowerCase(),size); + const beat=60/(Number(music.bpm)||100), pulse=Math.max(0,1-((elapsed/beat)%1)*1.4); + triangleDepth=-.8; + const ring=Math.min(width,height)*.42, scale=Math.min(width,height)*.024, limb=scale*.17; + for(let i=0;i<6;i++) { + const a=-Math.PI/2+i*Math.PI/3, x=centerX+platformMath.cos(a)*ring, y=centerY+platformMath.sin(a)*ring*.78; + const color=TRIO_SEAT_RGB[i].map(v=>Math.round(v*(.22+.12*pulse))); + filledDisc(x,y-scale*.8,scale*.42,color); + filledCapsule(x,y-scale*.25,x,y+scale*.65,limb,color); + for(const side of [-1,1]) { + filledCapsule(x,y,x+side*scale*.6,y+scale*.4,limb,color); + filledCapsule(x,y+scale*.6,x+side*scale*.35,y+scale*1.35,limb,color); + } + } + // The line being sung: hums are never words. Remember it so its last word can linger. + const lyric=music.lyric&&typeof music.lyric.text==='string'&&music.lyric.role!=='hum'?music.lyric:null; + if(lyric)trioLastWord=lyric; + const cur=lyric||(trioLastWord&&elapsed>=Number(trioLastWord.t)?trioLastWord:null); + if(!cur)return; + const t0=Number(cur.t)||0, dur=Number(cur.dur)||0, linger=cur.answer?2.5:.8; + if(dur&&elapsed>t0+dur+linger)return; + const syls=Array.isArray(cur.syllables)?cur.syllables.map(s=>({t:Number(s.t),text:String(s.text??'')})) + :(cur.syl||[]).map(([t,text])=>({t:Number(t),text:String(text??'')})); + const words=String(cur.text).trim().split(/\s+/).filter(Boolean); + let word=null; + if(!syls.length) word=words.join(' '); + else { + let sung=-1; for(let i=0;i=0)sung=cur.syllable; + if(sung<0)return; + // The word that owns the sung syllable: each word takes the syllables that spell it. + let k=0; word=words[0]||''; + for(const wd of words){let acc='',take=0;while(k+take=3?cur.rgb.slice(0,3).map(v=>clamp(Math.round(Number(v)||0),0,255)):[240,240,240]; + let size=Math.round(height*(cur.answer?.34:.28)); + while(size>24&&measure(word,size)>width*.9)size-=4; + const name=String(cur.member||music.section||''), nameSize=Math.max(18,Math.round(size*.22)); + const top=centerY-size/2; + if(name)typeWrite(name,centerX-measure(name,nameSize)/2,top-nameSize*1.7,nameSize,...color.map(v=>Math.round(v*.75))); + typeWrite(word,centerX-measure(word,size)/2,top,size,...color); +} + +function performanceStageActive() { + const stage = globalThis.__oskiewarStageState; + return Boolean(stage?.curtain || stage?.performance?.active); +} + +// A room-performance display: the transport supplies title, time and notes; +// it never touches fighter physics or creates a second musical soundtrack. +function drawPerformanceStage() { + const stage = globalThis.__oskiewarStageState; + if (!performanceStageActive()) return false; + syncGameView(); + wipe(3, 5, 10); + const music = stage.performance; + const notepatPlaying = music?.visual === 'notepat-score-v1' && music.playing && music.look && music.movement; + if (stage.curtain && !notepatPlaying) { drawCurtainDirections(stage); return true; } + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp(Number(music.elapsed) + (music.playing ? age : 0), 0, Number(music.duration) || 0); + const duration = Math.max(0, Number(music.duration) || 0); + const width = viewWidth(), center = viewCenterX(); + const pulse = clamp(Number(music.intensity) || 0, 0, 1); + const t = elapsed; + triangleDepth = -.8; + if (music.visual === 'notepat-score-v1' && music.playing) drawNotepatScore(music, elapsed); + else if (music.dance === 'trio-round-v1') drawTrioLyric(music, elapsed); + else if (music.dance === 'femrag-round-v1') drawFemragDance(music, elapsed); + else + for (let index = 0; index < 2; index++) { + const note = music.notes?.[index % Math.max(1, music.notes?.length || 1)]; + const singing = music.playing && Number.isFinite(note); + const level = singing ? .25 + pulse * .75 : pulse * .35; + const radius = Math.min(width * .12, 116); + const x = center + (index ? 1 : -1) * Math.min(width * .19, 225); + const y = viewHeight * .43 + platformMath.sin(t * 1.7 + index * 1.8) * (5 + level * 6); + const color = index ? [77, 188, 222] : [239, 133, 152]; + filledDisc(x, y, radius, color); + triangleDepth = -.85; + const ink = [12, 19, 35]; + const blink = platformMath.sin(t * .73 + index * 2.1) > .988; + for (const side of [-1, 1]) { + const ex = x + side * radius * .32, ey = y - radius * .18; + if (blink) filledCapsule(ex - radius * .09, ey, ex + radius * .09, ey, radius * .055, ink); + else { + filledDisc(ex, ey, radius * .085, ink); + filledDisc(ex + radius * .019, ey - radius * .026, radius * .025, [245, 248, 255]); + } + } + const mouthY = y + radius * .3; + filledCapsule(x - radius * .12, mouthY, x + radius * .12, mouthY, + radius * (.055 + level * .26), ink); + triangleDepth = -.8; + } + const title = String(music.title || "Untitled composition").slice(0, 110); + let size = 38; + while (size > 18 && handleWidth(title, size) > width - 72) size -= 2; + typeWrite(title, center - handleWidth(title, size) / 2, viewHeight - 126, size, 240, 243, 251); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 20) / 2, viewHeight - 76, 20, 150, 168, 193); + const trackWidth = Math.min(width - 100, 620), left = center - trackWidth / 2; + hudBox(left, viewHeight - 37, trackWidth, 4, 31, 42, 61); + if (duration) hudBox(left, viewHeight - 37, trackWidth * elapsed / duration, 4, 105, 205, 213); + return true; +} + +// The composition remains visible during a fight, independently of the +// full-screen performance mode. Its lane replaces the debug session label. +function performanceFooterVisible() { + const stage = globalThis.__oskiewarStageState; + const music = stage?.performance; + return Boolean(!stage?.curtain && music?.title && + (music.playing || music.phase === "countdown" || music.phase === "stale")); +} +function drawPerformanceFooter() { + if (!performanceFooterVisible()) return; + const stage = globalThis.__oskiewarStageState, music = stage.performance; + const duration = Math.max(0, Number(music.duration) || 0); + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp((Number(music.elapsed) || 0) + (music.playing ? age : 0), 0, duration); + const width = Math.min(viewWidth() * .66, 1000), center = viewCenterX(); + const left = center - width / 2, top = viewHeight - 88; + const previousDepth = triangleDepth; + triangleDepth = -1.49; + // Use screen rectangles so the Xbox's GPU pass does not cover the strip. + screenRect(left, top, width, 74, [8, 14, 25]); + const title = String(music.title).slice(0, 110); + let size = 25; + while (size > 16 && handleWidth(title, size) > width - 24) size--; + typeWrite(title, center - handleWidth(title, size) / 2, top + 7, size, 243, 247, 255); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 17) / 2, top + 42, 17, 166, 189, 213); + screenRect(left + 12, top + 68, width - 24, 3, [36, 51, 68]); + if (duration) screenRect(left + 12, top + 68, (width - 24) * elapsed / duration, 3, [105, 222, 213]); + triangleDepth = previousDepth; +} + +function drawCurtainDirections(stage = globalThis.__oskiewarStageState) { + const width = viewWidth(), center = viewCenterX(), left = center - width / 2; + const music = stage?.performance; + const age = Math.max(0, (Date.now() - (stage?.receivedAt || Date.now())) / 1000); + const elapsed = (Number(music?.elapsed) || 0) + Math.min(age, 1); + const lyrics = music?.curtainStyle !== "directions" && music?.playing && age < 2.5 + ? (music.lyrics || []).filter(line => elapsed >= line.start - 1.5 && elapsed < line.end + .35).slice(0, 3) : []; + // Wall-clock motion continues while both match simulations are frozen. + const time = Date.now() / 1000; + const palette = [[244, 128, 179], [91, 215, 227], [163, 223, 91], [255, 191, 90], [169, 142, 248]]; + triangleDepth = -1; + for (let lane = 0; lane < 2; lane++) { + const spacing = width / 5, length = spacing * .47, height = length * .55; + const y = viewHeight * (lane ? .85 : .16); + for (let index = -1; index < 6; index++) { + const x = left + index * spacing + ((time * width * .12 + lane * spacing * .5) % spacing); + const base = palette[((index + lane * 2) % 5 + 5) % 5]; + const glow = .52 + .3 * platformMath.sin(time * 2.4 - index * .8); + const color = base.map(v => Math.round(v * glow)); + screenRect(x, y - height * .13, length * .58, height * .26, color); + screenTriangle(x + length * .5, y - height / 2, + x + length, y, x + length * .5, y + height / 2, ...color); + } + } + drawCurtainFighter(left + width * (lyrics.length ? .08 : .24), + viewHeight * (lyrics.length ? .68 : .52), Math.min(width, viewHeight) * (lyrics.length ? .052 : .095), time); + if (lyrics.length) { + for (let row = 0; row < lyrics.length; row++) { + const line = lyrics[row], words = line.words || []; + const text = words.map(word => word.text).join(" "); + let size = Math.min(50, width * .043); + while (size > 16 && handleWidth(text, size) > width * .82) size--; + const y = viewHeight * (.4 + (row - (lyrics.length - 1) / 2) * .16); + let x = center - handleWidth(text, size) / 2; + const color = /^#[a-f0-9]{6}$/i.test(line.color || "") + ? [1, 3, 5].map(i => parseInt(line.color.slice(i, i + 2), 16)) : [163, 223, 91]; + for (const word of words) { + const active = elapsed >= word.start && elapsed < word.end; + const ink = elapsed < word.start ? [129, 141, 158] : color; + typeWrite(word.text, x, y, size, ...ink); + const w = handleWidth(word.text, size); + if (active) screenRect(x, y + size * 1.18, w, Math.max(2, size * .06), color); + x += handleWidth(word.text + " ", size); + } + } + return; + } + const label = "look that way ->", size = Math.min(46, width * .045); + typeWrite(label, center - handleWidth(label, size) / 2, + viewHeight * .68, size, 229, 240, 248); + // A large arrow completes the character's pointing gesture. + const x = center + width * .04, y = viewHeight * .46, length = width * .27; + const color = palette[Math.floor(time / 2) % palette.length]; + screenRect(x, y - length * .07, length * .6, length * .14, color); + screenTriangle(x + length * .55, y - length * .26, + x + length, y, x + length * .55, y + length * .26, ...color); +} + +function drawCurtainFighter(x, y, r, time) { + const bob = platformMath.sin(time * 3) * r * .05; + y += bob; + const ink = [20, 29, 42], skin = [166, 225, 103], boot = [239, 125, 166]; + triangleDepth = -.9; + filledCapsule(x, y + r * .8, x - r * .38, y + r * 1.7, r * .16, skin); + filledCapsule(x, y + r * .8, x + r * .45, y + r * 1.7, r * .16, skin); + filledCapsule(x - r * .52, y + r * 1.72, x - r * .2, y + r * 1.72, r * .17, boot); + filledCapsule(x + r * .4, y + r * 1.72, x + r * .78, y + r * 1.72, r * .17, boot); + filledCapsule(x, y + r * .26, x, y + r * .86, r * .26, boot); + filledCapsule(x + r * .1, y + r * .38, x + r * 1.35, y + r * .13, r * .13, skin); + filledDisc(x + r * 1.35, y + r * .13, r * .19, skin); + filledCapsule(x + r * 1.3, y + r * .05, x + r * 1.68, y + r * .05, r * .08, skin); + filledDisc(x, y - r * .62, r, skin); + // Eyes and nose sit on the right side: gaze agrees with the gesture. + triangleDepth = -1.05; + for (const ex of [x + r * .12, x + r * .62]) { + filledDisc(ex, y - r * .82, r * .22, [243, 248, 232]); + filledDisc(ex + r * .09, y - r * .8, r * .095, ink); + } + filledDisc(x + r * .98, y - r * .44, r * .18, skin); + filledCapsule(x + r * .33, y - r * .13, x + r * .7, y - r * .18, r * .055, ink); + triangleDepth = -1; +} + +// NOTEPAT_SCORE_VISUAL_V1_BEGIN +const NOTEPAT_TV_SCORE={"hash":"139a77d1758773680fe08038f4a39f8e7a6b48838a687369a4d9e17a28cd2a5c","duration":774.4119,"sections":[[0,60.42,"Overture"],[60.42,116.9051,"The Walk"],[116.9051,195.1946,"Waltz"],[195.1946,243.1453,"Chase"],[243.1453,301.4882,"Sneak"],[301.4882,375.8215,"Lullaby"],[375.8215,441,"The Climb"],[441,554.3143,"The Lift"],[554.3143,592.437,"Fanfare"],[592.437,713.2119,"Return"],[713.2119,774.4119,"Vanish"]],"rows":[[[0,0.03,99,26],[0,0.055,50,68],[0.06,0.16,39,64],[0.06,0.14,51,38],[0.4,1.1,60,36],[2.2,0.03,99,26],[2.2,0.055,50,68],[2.26,0.16,39,64],[2.26,0.14,51,38],[4.4,0.03,99,26],[4.4,0.055,50,68],[4.46,0.16,39,64],[4.46,0.14,51,38],[6.6,0.03,99,26],[6.6,0.055,50,68],[6.66,0.16,39,64],[6.66,0.14,51,38],[8.8,0.03,99,26],[8.8,0.055,50,68],[8.86,0.16,39,64],[8.86,0.14,51,38],[11,0.03,99,26],[11,0.055,50,68],[11.06,0.16,39,64],[11.06,0.14,51,38],[13.2,0.03,99,26],[13.2,0.055,50,68],[13.26,0.16,39,64],[13.26,0.14,51,38],[15.4,0.03,99,26],[15.4,0.055,50,68],[15.46,0.16,39,64],[15.46,0.14,51,38],[17.6,0.03,99,26],[17.6,0.055,50,68],[17.66,0.16,39,64],[17.66,0.14,51,38],[19.8,0.03,99,26],[19.8,0.055,50,68],[19.86,0.16,39,64],[19.86,0.14,51,38],[22,0.03,99,26],[22,0.055,50,68],[22.06,0.16,39,64],[22.06,0.14,51,38],[24.2,0.03,99,26],[24.2,0.055,50,68],[24.26,0.16,39,64],[24.26,0.14,51,38],[26.4,0.03,99,26],[26.4,0.055,50,68],[26.46,0.16,39,64],[26.46,0.14,51,38],[28.6,0.03,99,26],[28.6,0.055,50,68],[28.66,0.16,39,64],[28.66,0.14,51,38],[30.8,0.03,99,26],[30.8,0.055,50,68],[30.86,0.16,39,64],[30.86,0.14,51,38],[33,0.855,72,169],[33,0.03,99,26],[33,0.055,50,68],[33.06,0.16,39,64],[33.06,0.14,51,38],[34.9,0.03,99,26],[34.9,0.055,50,68],[34.96,0.16,39,64],[34.96,0.14,51,38],[36.8,0.855,76,199],[36.8,0.03,99,26],[36.8,0.055,50,68],[36.86,0.16,39,64],[36.86,0.14,51,38],[38.7,0.03,99,26],[38.7,0.055,50,68],[38.76,0.16,39,64],[38.76,0.14,51,38],[40.6,0.03,99,26],[40.6,0.055,50,68],[40.66,0.16,39,64],[40.66,0.14,51,38],[42.5,0.03,99,26],[42.5,0.055,50,68],[42.56,0.16,39,64],[42.56,0.14,51,38],[43.61,0.333,79,199],[43.98,0.03,99,26],[43.98,0.055,50,68],[44.04,0.16,39,64],[44.04,0.14,51,38],[45.46,0.03,99,26],[45.46,0.055,50,68],[45.52,0.16,39,64],[45.52,0.14,51,38],[46.94,1.332,72,199],[46.94,0.03,99,26],[46.94,0.055,50,68],[47,0.16,39,64],[47,0.14,51,38],[48.42,0.03,99,26],[48.42,0.055,50,68],[48.48,0.16,39,64],[48.48,0.14,51,38],[49.9,0.03,99,26],[49.9,0.055,50,68],[49.96,0.16,39,64],[49.96,0.14,51,38],[51.02,0.03,99,26],[51.02,0.055,50,68],[51.08,0.16,39,64],[51.08,0.14,51,38],[51.86,0.252,74,199],[52.14,0.03,99,26],[52.14,0.055,50,68],[52.2,0.16,39,64],[52.2,0.14,51,38],[53.26,0.03,99,26],[53.26,0.055,50,68],[53.32,0.16,39,64],[53.32,0.14,51,38],[54.38,0.03,99,26],[54.38,0.055,50,68],[54.44,0.16,39,64],[54.44,0.14,51,38],[55.5,0.03,99,26],[55.5,0.055,50,68],[55.56,0.16,39,64],[55.56,0.14,51,38],[55.94,0.25,76,199],[56.38,0.03,99,26],[56.38,0.055,50,68],[56.44,0.16,39,64],[56.44,0.14,51,38],[57.26,0.03,99,26],[57.26,0.055,50,68],[57.32,0.16,39,64],[57.32,0.14,51,38],[57.7,0.396,74,177],[58.14,0.03,99,26],[58.14,0.055,50,68],[58.2,0.16,39,64],[58.2,0.14,51,38],[59.02,0.03,99,26],[59.02,0.055,50,68],[59.08,0.16,39,64],[59.08,0.14,51,38],[59.62,0.15,60,154],[59.9,0.03,99,26],[59.9,0.055,50,68],[59.96,0.16,39,64],[59.96,0.14,51,38],[60.42,0.27,48,30],[60.42,0.03,83,11],[60.42,0.03,99,19],[60.42,0.055,50,50],[60.44,0.31,42,15],[60.48,0.16,39,47],[60.48,0.14,51,28],[60.9,0.36,76,22],[61.42,0.65,60,60],[61.62,0.27,48,30],[61.62,0.03,83,11],[61.62,0.03,99,19],[61.62,0.055,50,50],[61.64,0.31,42,15],[61.68,0.16,39,47],[61.68,0.14,51,28],[62.1,0.36,76,22],[62.82,0.27,48,32],[62.82,0.03,83,11],[62.82,0.03,99,19],[62.82,0.055,50,50],[62.84,0.31,42,16],[62.88,0.16,39,47],[62.88,0.14,51,28],[63.3,0.36,76,23],[64.02,0.27,48,32],[64.02,0.03,83,11],[64.02,0.03,99,19],[64.02,0.055,50,50],[64.04,0.31,42,16],[64.08,0.16,39,47],[64.08,0.14,51,28],[64.5,0.36,76,23],[65.22,0.27,48,34],[65.22,0.03,83,12],[65.22,0.03,99,19],[65.22,0.055,50,50],[65.24,0.31,42,17],[65.28,0.16,39,47],[65.28,0.14,51,28],[65.7,0.36,72,24],[66.42,0.27,48,34],[66.42,0.03,83,12],[66.42,0.03,99,19],[66.42,0.055,50,50],[66.44,0.31,42,17],[66.48,0.16,39,47],[66.48,0.14,51,28],[66.9,0.36,72,24],[67.62,0.27,48,36],[67.62,0.03,83,13],[67.62,0.03,99,19],[67.62,0.055,50,50],[67.64,0.31,42,18],[67.68,0.16,39,47],[67.68,0.14,51,28],[68.1,0.36,72,25],[68.82,0.27,48,36],[68.82,0.03,83,13],[68.82,0.03,99,19],[68.82,0.055,50,50],[68.84,0.31,42,18],[68.88,0.16,39,47],[68.88,0.14,51,28],[69.3,0.36,72,25],[70.02,0.27,48,38],[70.02,0.03,83,13],[70.02,0.03,99,19],[70.02,0.055,50,50],[70.04,0.31,42,19],[70.08,0.16,39,47],[70.08,0.14,51,28],[70.5,0.36,69,22],[71.22,0.27,48,38],[71.22,0.03,83,13],[71.22,0.03,99,19],[71.22,0.055,50,50],[71.24,0.31,42,19],[71.28,0.16,39,47],[71.28,0.14,51,28],[71.7,0.36,69,22],[72.42,0.27,48,39],[72.42,0.03,83,14],[72.42,0.03,99,19],[72.42,0.055,50,50],[72.44,0.31,42,20],[72.48,0.16,39,47],[72.48,0.14,51,28],[72.9,0.36,69,23],[73.62,0.27,48,39],[73.62,0.03,83,14],[73.62,0.03,99,19],[73.62,0.055,50,50],[73.64,0.31,42,20],[73.68,0.16,39,47],[73.68,0.14,51,28],[74.1,0.36,69,23],[74.82,0.27,48,41],[74.82,0.03,83,14],[74.82,0.03,99,19],[74.82,0.055,50,50],[74.84,0.31,42,21],[74.88,0.16,39,47],[74.88,0.14,51,28],[75.3,0.36,71,24],[76.02,0.27,48,41],[76.02,0.03,83,14],[76.02,0.03,99,19],[76.02,0.055,50,50],[76.04,0.31,42,21],[76.08,0.16,39,47],[76.08,0.14,51,28],[76.5,0.36,71,24],[77.22,0.27,48,38],[77.22,0.03,83,13],[77.22,0.03,99,19],[77.22,0.055,50,50],[77.24,0.31,42,19],[77.28,0.16,39,47],[77.28,0.14,51,28],[77.7,0.36,76,22],[78.42,0.18,60,15],[78.42,0.03,99,19],[78.42,0.055,50,50],[78.48,0.16,39,47],[78.48,0.14,51,28],[79.62,0.27,48,35],[79.62,0.03,83,12],[79.62,0.03,99,19],[79.62,0.055,50,50],[79.64,0.31,42,17],[79.68,0.16,39,47],[79.68,0.14,51,28],[80.091,0.353,76,29],[80.796,0.27,48,35],[80.796,0.03,83,12],[80.796,0.03,99,19],[80.796,0.055,50,50],[80.817,0.31,42,17],[80.856,0.16,39,47],[80.856,0.14,51,28],[81.267,0.353,76,29],[81.973,0.27,48,37],[81.973,0.03,83,13],[81.973,0.03,99,19],[81.973,0.055,50,50],[81.993,0.31,42,18],[82.033,0.16,39,47],[82.033,0.14,51,28],[82.444,0.353,76,31],[83.149,0.27,48,37],[83.149,0.03,83,13],[83.149,0.03,99,19],[83.149,0.055,50,50],[83.169,0.31,42,18],[83.209,0.16,39,47],[83.209,0.14,51,28],[83.62,0.353,76,31],[84.326,0.27,48,39],[84.326,0.03,83,14],[84.326,0.03,99,19],[84.326,0.055,50,50],[84.346,0.31,42,19],[84.386,0.16,39,47],[84.386,0.14,51,28],[84.796,0.353,72,32],[85.502,0.27,48,39],[85.502,0.03,83,14],[85.502,0.03,99,19],[85.502,0.055,50,50],[85.522,0.31,42,19],[85.562,0.16,39,47],[85.562,0.14,51,28],[85.973,0.353,72,32],[86.679,0.27,48,41],[86.679,0.03,83,14],[86.679,0.03,99,19],[86.679,0.055,50,50],[86.699,0.31,42,20],[86.739,0.16,39,47],[86.739,0.14,51,28],[87.149,0.353,72,23],[87.855,0.27,48,41],[87.855,0.03,83,14],[87.855,0.03,99,19],[87.855,0.055,50,50],[87.875,0.31,42,20],[87.915,0.16,39,47],[87.915,0.14,51,28],[88.326,0.353,72,23],[89.032,0.27,48,43],[89.032,0.03,83,15],[89.032,0.03,99,19],[89.032,0.055,50,50],[89.052,0.31,42,21],[89.092,0.16,39,47],[89.092,0.14,51,28],[90.208,0.27,48,43],[90.208,0.03,83,15],[90.208,0.03,99,19],[90.208,0.055,50,50],[90.228,0.31,42,21],[90.268,0.16,39,47],[90.268,0.14,51,28],[91.385,0.27,48,45],[91.385,0.03,83,16],[91.385,0.03,99,19],[91.385,0.055,50,50],[91.405,0.31,42,22],[91.445,0.16,39,47],[91.445,0.14,51,28],[91.679,0.224,72,14],[92.561,0.27,48,45],[92.561,0.03,83,16],[92.561,0.03,99,19],[92.561,0.055,50,50],[92.581,0.31,42,22],[92.621,0.16,39,47],[92.621,0.14,51,28],[93.738,0.27,48,47],[93.738,0.03,83,16],[93.738,0.03,99,19],[93.738,0.055,50,50],[93.758,0.31,42,24],[93.798,0.16,39,47],[93.798,0.14,51,28],[94.914,0.27,48,47],[94.914,0.03,83,16],[94.914,0.03,99,19],[94.914,0.055,50,50],[94.934,0.31,42,24],[94.974,0.16,39,47],[94.974,0.14,51,28],[96.091,0.27,48,44],[96.091,0.03,83,15],[96.091,0.03,99,19],[96.091,0.055,50,50],[96.111,0.31,42,22],[96.151,0.16,39,47],[96.151,0.14,51,28],[97.267,0.176,60,31],[97.267,0.03,99,19],[97.267,0.055,50,50],[97.327,0.16,39,47],[97.327,0.14,51,28],[98.444,0.27,48,39],[98.444,0.03,83,14],[98.444,0.03,99,19],[98.444,0.055,50,50],[98.463,0.31,42,19],[98.504,0.16,39,47],[98.504,0.14,51,28],[98.732,0.219,79,22],[98.905,0.346,76,39],[99.597,0.27,48,39],[99.597,0.03,83,14],[99.597,0.03,99,19],[99.597,0.055,50,50],[99.617,0.31,42,19],[99.657,0.16,39,47],[99.657,0.14,51,28],[99.886,0.035,117,10],[100.059,0.346,76,39],[100.463,0.035,117,10],[100.751,0.27,48,41],[100.751,0.03,83,14],[100.751,0.03,99,19],[100.751,0.055,50,50],[100.771,0.31,42,21],[100.811,0.16,39,47],[100.811,0.14,51,28],[101.213,0.346,76,20],[101.905,0.27,48,41],[101.905,0.03,83,14],[101.905,0.03,99,19],[101.905,0.055,50,50],[101.925,0.31,42,21],[101.965,0.16,39,47],[101.965,0.14,51,28],[102.367,0.346,76,20],[103.059,0.27,48,44],[103.059,0.03,83,15],[103.059,0.03,99,19],[103.059,0.055,50,50],[103.079,0.31,42,22],[103.119,0.16,39,47],[103.119,0.14,51,28],[103.492,0.7,76,11],[103.52,0.346,72,21],[104.213,0.219,72,12],[104.213,0.27,48,44],[104.213,0.03,83,15],[104.213,0.03,99,19],[104.213,0.055,50,50],[104.233,0.31,42,22],[104.273,0.16,39,47],[104.273,0.14,51,28],[104.674,0.346,72,21],[105.078,0.035,117,12],[105.367,0.27,48,46],[105.367,0.03,83,16],[105.367,0.03,99,19],[105.367,0.055,50,50],[105.387,0.31,42,23],[105.427,0.16,39,47],[105.427,0.14,51,28],[105.655,0.035,117,9],[105.828,0.346,72,35],[106.52,0.27,48,46],[106.52,0.03,83,16],[106.52,0.03,99,19],[106.52,0.055,50,50],[106.54,0.31,42,23],[106.58,0.16,39,47],[106.58,0.14,51,28],[106.982,0.346,72,35],[107.674,0.27,48,48],[107.674,0.03,83,17],[107.674,0.03,99,19],[107.674,0.055,50,50],[107.694,0.31,42,24],[107.734,0.16,39,47],[107.734,0.14,51,28],[108.828,0.27,48,48],[108.828,0.03,83,17],[108.828,0.03,99,19],[108.828,0.055,50,50],[108.848,0.31,42,24],[108.888,0.16,39,47],[108.888,0.14,51,28],[109.694,0.219,65,20],[109.694,0.035,117,10],[109.982,0.27,48,51],[109.982,0.03,83,18],[109.982,0.03,99,19],[109.982,0.055,50,50],[110.002,0.31,42,25],[110.042,0.16,39,47],[110.042,0.14,51,28],[110.27,0.219,72,21],[110.27,0.035,117,14],[110.415,0.7,77,18],[111.136,0.27,48,51],[111.136,0.03,83,18],[111.136,0.03,99,19],[111.136,0.055,50,50],[111.156,0.31,42,25],[111.196,0.16,39,47],[111.196,0.14,51,28],[112.29,0.27,48,53],[112.29,0.03,83,19],[112.29,0.03,99,19],[112.29,0.055,50,50],[112.31,0.31,42,26],[112.35,0.16,39,47],[112.35,0.14,51,28],[113.444,0.27,48,53],[113.444,0.03,83,19],[113.444,0.03,99,19],[113.444,0.055,50,50],[113.463,0.31,42,26],[113.504,0.16,39,47],[113.504,0.14,51,28],[114.597,0.27,48,49],[114.597,0.03,83,17],[114.597,0.03,99,19],[114.597,0.055,50,50],[114.617,0.31,42,24],[114.657,0.16,39,47],[114.657,0.14,51,28],[115.751,0.173,60,19],[115.751,0.03,99,19],[115.751,0.055,50,50],[115.811,0.16,39,47],[115.811,0.14,51,28],[116.905,0.03,99,22],[116.905,0.055,50,59],[116.965,0.16,39,56],[116.965,0.14,51,33],[118.269,0.03,99,22],[118.269,0.055,50,59],[118.329,0.16,39,56],[118.329,0.14,51,33],[119.632,0.03,99,22],[119.632,0.055,50,59],[119.692,0.16,39,56],[119.692,0.14,51,33],[120.996,0.03,99,22],[120.996,0.055,50,59],[121.056,0.16,39,56],[121.056,0.14,51,33],[122.36,0.03,99,22],[122.36,0.055,50,59],[122.42,0.16,39,56],[122.42,0.14,51,33],[123.723,0.03,99,22],[123.723,0.055,50,59],[123.783,0.16,39,56],[123.783,0.14,51,33],[125.087,0.03,99,22],[125.087,0.055,50,59],[125.147,0.16,39,56],[125.147,0.14,51,33],[126.451,0.03,99,22],[126.451,0.055,50,59],[126.511,0.16,39,56],[126.511,0.14,51,33],[127.814,0.03,99,22],[127.814,0.055,50,59],[127.874,0.16,39,56],[127.874,0.14,51,33],[129.178,0.03,99,22],[129.178,0.055,50,59],[129.238,0.16,39,56],[129.238,0.14,51,33],[130.542,0.03,99,22],[130.542,0.055,50,59],[130.601,0.16,39,56],[130.601,0.14,51,33],[131.905,0.03,99,22],[131.905,0.055,50,59],[131.965,0.16,39,56],[131.965,0.14,51,33],[133.269,0.03,99,22],[133.269,0.055,50,59],[133.329,0.16,39,56],[133.329,0.14,51,33],[134.632,0.03,99,22],[134.632,0.055,50,59],[134.692,0.16,39,56],[134.692,0.14,51,33],[135.996,0.03,99,22],[135.996,0.055,50,59],[136.056,0.16,39,56],[136.056,0.14,51,33],[137.36,0.03,99,22],[137.36,0.055,50,59],[137.42,0.16,39,56],[137.42,0.14,51,33],[138.723,0.818,76,26],[138.723,0.03,99,22],[138.723,0.055,50,59],[138.783,0.16,39,56],[138.783,0.14,51,33],[140.087,0.03,99,22],[140.087,0.055,50,59],[140.087,0.045,111,21],[140.147,0.16,39,56],[140.147,0.14,51,33],[140.769,0.045,111,9],[141.451,0.03,99,22],[141.451,0.055,50,59],[141.511,0.16,39,56],[141.511,0.14,51,33],[142.36,0.191,77,10],[142.814,1.227,76,26],[142.814,0.03,99,22],[142.814,0.055,50,59],[142.874,0.16,39,56],[142.874,0.14,51,33],[144.178,0.03,99,22],[144.178,0.055,50,59],[144.238,0.16,39,56],[144.238,0.14,51,33],[144.405,0.191,76,10],[144.86,0.045,111,14],[145.541,0.045,111,18],[145.542,0.03,99,22],[145.542,0.055,50,59],[145.601,0.16,39,56],[145.601,0.14,51,33],[146.905,0.818,74,31],[146.905,0.03,99,22],[146.905,0.055,50,59],[146.965,0.16,39,56],[146.965,0.14,51,33],[148.269,0.03,99,22],[148.269,0.055,50,59],[148.329,0.16,39,56],[148.329,0.14,51,33],[149.178,0.191,76,12],[149.632,0.03,99,22],[149.632,0.055,50,59],[149.632,0.045,111,15],[149.692,0.16,39,56],[149.692,0.14,51,33],[150.314,0.045,111,15],[150.996,1.227,76,33],[150.996,0.03,99,22],[150.996,0.055,50,59],[151.056,0.16,39,56],[151.056,0.14,51,33],[151.223,0.191,72,12],[152.36,0.03,99,22],[152.36,0.055,50,59],[152.42,0.16,39,56],[152.42,0.14,51,33],[153.723,0.03,99,22],[153.723,0.055,50,59],[153.783,0.16,39,56],[153.783,0.14,51,33],[155.087,0.03,99,22],[155.087,0.055,50,59],[155.087,0.045,111,21],[155.147,0.16,39,56],[155.147,0.14,51,33],[155.769,0.045,111,9],[155.996,0.409,76,38],[155.996,0.191,76,14],[156.451,0.03,99,22],[156.451,0.055,50,59],[156.511,0.16,39,56],[156.511,0.14,51,33],[157.814,0.03,99,22],[157.814,0.055,50,59],[157.874,0.16,39,56],[157.874,0.14,51,33],[158.041,0.191,76,14],[158.723,0.409,71,38],[159.178,0.03,99,22],[159.178,0.055,50,59],[159.238,0.16,39,56],[159.238,0.14,51,33],[159.86,0.045,111,14],[160.541,0.045,111,18],[160.542,0.03,99,22],[160.542,0.055,50,59],[160.601,0.16,39,56],[160.601,0.14,51,33],[161.905,0.03,99,22],[161.905,0.055,50,59],[161.965,0.16,39,56],[161.965,0.14,51,33],[162.814,0.191,60,20],[163.269,0.818,77,17],[163.269,0.03,99,22],[163.269,0.055,50,59],[163.329,0.16,39,56],[163.329,0.14,51,33],[164.632,0.03,99,22],[164.632,0.055,50,59],[164.632,0.045,111,15],[164.692,0.16,39,56],[164.692,0.14,51,33],[164.86,0.191,71,20],[165.314,0.045,111,15],[165.996,0.03,99,22],[165.996,0.055,50,59],[166.056,0.16,39,56],[166.056,0.14,51,33],[167.36,0.818,73,17],[167.36,0.03,99,22],[167.36,0.055,50,59],[167.42,0.16,39,56],[167.42,0.14,51,33],[168.723,0.03,99,22],[168.723,0.055,50,59],[168.783,0.16,39,56],[168.783,0.14,51,33],[169.632,0.191,62,20],[170.087,0.03,99,22],[170.087,0.055,50,59],[170.087,0.045,111,21],[170.147,0.16,39,56],[170.147,0.14,51,33],[170.769,0.045,111,9],[171.451,0.818,73,16],[171.451,0.03,99,22],[171.451,0.055,50,59],[171.511,0.16,39,56],[171.511,0.14,51,33],[171.678,0.191,60,18],[172.814,0.03,99,22],[172.814,0.055,50,59],[172.874,0.16,39,56],[172.874,0.14,51,33],[174.178,0.03,99,22],[174.178,0.055,50,59],[174.238,0.16,39,56],[174.238,0.14,51,33],[174.86,0.045,111,14],[175.541,1.227,73,16],[175.541,0.045,111,18],[175.542,0.03,99,22],[175.542,0.055,50,59],[175.601,0.16,39,56],[175.601,0.14,51,33],[176.451,0.191,71,18],[176.905,0.03,99,22],[176.905,0.055,50,59],[176.965,0.16,39,56],[176.965,0.14,51,33],[178.269,0.03,99,22],[178.269,0.055,50,59],[178.329,0.16,39,56],[178.329,0.14,51,33],[178.496,0.191,65,18],[179.632,0.409,70,14],[179.632,0.03,99,22],[179.632,0.055,50,59],[179.632,0.045,111,15],[179.692,0.16,39,56],[179.692,0.14,51,33],[180.314,0.045,111,15],[180.996,0.03,99,22],[180.996,0.055,50,59],[181.056,0.16,39,56],[181.056,0.14,51,33],[182.36,0.03,99,22],[182.36,0.055,50,59],[182.42,0.16,39,56],[182.42,0.14,51,33],[183.811,0.03,99,22],[183.811,0.055,50,59],[183.871,0.16,39,56],[183.871,0.14,51,33],[185.263,0.03,99,22],[185.263,0.055,50,59],[185.323,0.16,39,56],[185.323,0.14,51,33],[186.714,0.03,99,22],[186.714,0.055,50,59],[186.774,0.16,39,56],[186.774,0.14,51,33],[188.166,0.03,99,22],[188.166,0.055,50,59],[188.226,0.16,39,56],[188.226,0.14,51,33],[189.773,0.03,99,22],[189.773,0.055,50,59],[189.833,0.16,39,56],[189.833,0.14,51,33],[191.38,0.03,99,22],[191.38,0.055,50,59],[191.44,0.16,39,56],[191.44,0.14,51,33],[192.988,1.607,45,28],[192.988,0.03,99,22],[192.988,0.055,50,59],[193.048,0.16,39,56],[193.048,0.14,51,33],[194.595,0.03,99,22],[194.595,0.055,50,59],[194.655,0.16,39,56],[194.655,0.14,51,33],[195.195,0.27,48,39],[195.195,0.03,83,14],[195.195,0.03,99,21],[195.195,0.055,50,56],[195.215,0.31,42,19],[195.255,0.16,39,52],[195.255,0.14,51,32],[195.589,0.158,69,15],[195.787,0.158,70,15],[195.984,0.27,48,39],[195.984,0.03,83,14],[195.984,0.03,99,21],[195.984,0.055,50,56],[196.004,0.31,42,19],[196.044,0.16,39,52],[196.044,0.14,51,32],[196.195,3,60,54],[196.774,0.27,48,39],[196.774,0.03,83,14],[196.774,0.03,99,21],[196.774,0.055,50,56],[196.794,0.31,42,19],[196.833,0.16,39,52],[196.833,0.14,51,32],[197.168,0.158,56,11],[197.366,0.158,55,11],[197.563,0.158,69,15],[197.563,0.27,48,39],[197.563,0.03,83,14],[197.563,0.03,99,21],[197.563,0.055,50,56],[197.583,0.31,42,19],[197.623,0.16,39,52],[197.623,0.14,51,32],[197.76,0.158,67,15],[198.352,0.27,48,39],[198.352,0.03,83,14],[198.352,0.03,99,21],[198.352,0.055,50,56],[198.373,0.31,42,19],[198.412,0.16,39,52],[198.412,0.14,51,32],[199.142,0.158,72,15],[199.142,0.27,48,39],[199.142,0.03,83,14],[199.142,0.03,99,21],[199.142,0.055,50,56],[199.162,0.31,42,19],[199.202,0.16,39,52],[199.202,0.14,51,32],[199.339,0.158,74,15],[199.931,0.27,48,39],[199.931,0.03,83,14],[199.931,0.03,99,21],[199.931,0.055,50,56],[199.952,0.31,42,19],[199.991,0.16,39,52],[199.991,0.14,51,32],[200.721,0.158,56,11],[200.721,0.27,48,39],[200.721,0.03,83,14],[200.721,0.03,99,21],[200.721,0.055,50,56],[200.741,0.31,42,19],[200.781,0.16,39,52],[200.781,0.14,51,32],[200.918,0.158,58,11],[201.51,0.27,48,39],[201.51,0.03,83,14],[201.51,0.03,99,21],[201.51,0.055,50,56],[201.53,0.31,42,19],[201.57,0.16,39,52],[201.57,0.14,51,32],[202.3,0.158,67,20],[202.3,0.27,48,39],[202.3,0.03,83,14],[202.3,0.03,99,21],[202.3,0.055,50,56],[202.32,0.31,42,19],[202.36,0.16,39,52],[202.36,0.14,51,32],[202.497,0.158,65,20],[202.695,0.158,76,27],[202.892,0.158,77,27],[203.089,0.27,48,39],[203.089,0.03,83,14],[203.089,0.03,99,21],[203.089,0.055,50,56],[203.109,0.31,42,19],[203.149,0.16,39,52],[203.149,0.14,51,32],[203.879,0.27,48,39],[203.879,0.03,83,14],[203.879,0.03,99,21],[203.879,0.055,50,56],[203.899,0.31,42,19],[203.939,0.16,39,52],[203.939,0.14,51,32],[204.274,0.158,60,20],[204.471,0.158,62,20],[204.668,0.27,48,39],[204.668,0.03,83,14],[204.668,0.03,99,21],[204.668,0.055,50,56],[204.688,0.31,42,19],[204.728,0.16,39,52],[204.728,0.14,51,32],[205.383,0.27,48,39],[205.383,0.03,83,14],[205.383,0.03,99,21],[205.383,0.055,50,56],[205.403,0.31,42,19],[205.443,0.16,39,52],[205.443,0.14,51,32],[205.74,0.143,63,20],[205.918,0.143,62,20],[206.097,0.143,76,27],[206.097,0.27,48,39],[206.097,0.03,83,14],[206.097,0.03,99,21],[206.097,0.055,50,56],[206.117,0.31,42,19],[206.157,0.16,39,52],[206.157,0.14,51,32],[206.275,0.143,74,27],[206.811,0.27,48,39],[206.811,0.03,83,14],[206.811,0.03,99,21],[206.811,0.055,50,56],[206.831,0.31,42,19],[206.871,0.16,39,52],[206.871,0.14,51,32],[207.525,0.143,63,17],[207.525,0.143,65,23],[207.525,0.27,48,39],[207.525,0.03,83,14],[207.525,0.03,99,21],[207.525,0.055,50,56],[207.546,0.31,42,19],[207.585,0.16,39,52],[207.585,0.14,51,32],[207.704,0.143,65,17],[207.704,0.143,67,23],[208.24,0.27,48,39],[208.24,0.03,83,14],[208.24,0.03,99,21],[208.24,0.055,50,56],[208.26,0.31,42,19],[208.3,0.16,39,52],[208.3,0.14,51,32],[208.954,0.143,60,17],[208.954,0.27,48,39],[208.954,0.03,83,14],[208.954,0.03,99,21],[208.954,0.055,50,56],[208.974,0.31,42,19],[209.014,0.16,39,52],[209.014,0.14,51,32],[209.133,0.143,58,17],[209.311,0.143,72,23],[209.49,0.143,70,23],[209.668,0.27,48,39],[209.668,0.03,83,14],[209.668,0.03,99,21],[209.668,0.055,50,56],[209.688,0.31,42,19],[209.728,0.16,39,52],[209.728,0.14,51,32],[210.383,0.27,48,39],[210.383,0.03,83,14],[210.383,0.03,99,21],[210.383,0.055,50,56],[210.403,0.31,42,19],[210.443,0.16,39,52],[210.443,0.14,51,32],[210.74,0.143,69,23],[210.918,0.143,70,23],[211.097,0.27,48,39],[211.097,0.03,83,14],[211.097,0.03,99,21],[211.097,0.055,50,56],[211.117,0.31,42,19],[211.157,0.16,39,52],[211.157,0.14,51,32],[211.811,0.27,48,39],[211.811,0.03,83,14],[211.811,0.03,99,21],[211.811,0.055,50,56],[211.831,0.31,42,19],[211.871,0.16,39,52],[211.871,0.14,51,32],[212.168,0.143,56,17],[212.347,0.143,55,17],[212.525,0.143,69,23],[212.525,0.27,48,39],[212.525,0.03,83,14],[212.525,0.03,99,21],[212.525,0.055,50,56],[212.546,0.31,42,19],[212.585,0.16,39,52],[212.585,0.14,51,32],[212.704,0.143,67,23],[213.24,0.27,48,39],[213.24,0.03,83,14],[213.24,0.03,99,21],[213.24,0.055,50,56],[213.26,0.31,42,19],[213.3,0.16,39,52],[213.3,0.14,51,32],[213.892,0.13,72,34],[213.892,0.27,48,39],[213.892,0.03,83,14],[213.892,0.03,99,21],[213.892,0.055,50,56],[213.912,0.31,42,19],[213.952,0.16,39,52],[213.952,0.14,51,32],[214.055,0.13,74,34],[214.544,0.27,48,39],[214.544,0.03,83,14],[214.544,0.03,99,21],[214.544,0.055,50,56],[214.564,0.31,42,19],[214.604,0.16,39,52],[214.604,0.14,51,32],[215.196,0.13,56,25],[215.196,0.27,48,39],[215.196,0.03,83,14],[215.196,0.03,99,21],[215.196,0.055,50,56],[215.216,0.31,42,19],[215.256,0.16,39,52],[215.256,0.14,51,32],[215.359,0.13,58,25],[215.848,0.27,48,39],[215.848,0.03,83,14],[215.848,0.03,99,21],[215.848,0.055,50,56],[215.868,0.31,42,19],[215.908,0.16,39,52],[215.908,0.14,51,32],[216.501,0.13,67,25],[216.501,0.27,48,39],[216.501,0.03,83,14],[216.501,0.03,99,21],[216.501,0.055,50,56],[216.521,0.31,42,19],[216.561,0.16,39,52],[216.561,0.14,51,32],[216.664,0.13,65,25],[216.827,0.13,76,34],[216.99,0.13,77,34],[217.153,0.27,48,39],[217.153,0.03,83,14],[217.153,0.03,99,21],[217.153,0.055,50,56],[217.173,0.31,42,19],[217.213,0.16,39,52],[217.213,0.14,51,32],[217.805,0.27,48,39],[217.805,0.03,83,14],[217.805,0.03,99,21],[217.805,0.055,50,56],[217.825,0.31,42,19],[217.865,0.16,39,52],[217.865,0.14,51,32],[218.131,0.13,60,35],[218.294,0.13,62,35],[218.457,0.114,65,53],[218.457,0.03,99,21],[218.457,0.055,50,56],[218.517,0.16,39,52],[218.517,0.14,51,32],[219.109,0.03,99,21],[219.109,0.055,50,56],[219.15,0.114,70,53],[219.169,0.16,39,52],[219.169,0.14,51,32],[219.598,0.114,75,53],[219.761,0.03,99,21],[219.761,0.055,50,56],[219.821,0.16,39,52],[219.821,0.14,51,32],[220.022,0.391,77,59],[220.414,0.5,102,108],[220.414,0.03,99,21],[220.414,0.055,50,56],[220.474,0.16,39,52],[220.474,0.14,51,32],[221.066,0.03,99,21],[221.066,0.055,50,56],[221.126,0.16,39,52],[221.126,0.14,51,32],[221.718,0.03,99,21],[221.718,0.055,50,56],[221.778,0.16,39,52],[221.778,0.14,51,32],[222.37,0.03,99,21],[222.37,0.055,50,56],[222.43,0.16,39,52],[222.43,0.14,51,32],[222.614,0.27,48,39],[222.614,0.03,83,14],[222.614,0.03,99,21],[222.614,0.055,50,56],[222.634,0.31,42,19],[222.674,0.16,39,52],[222.674,0.14,51,32],[223.328,0.27,48,39],[223.328,0.03,83,14],[223.328,0.03,99,21],[223.328,0.055,50,56],[223.348,0.31,42,19],[223.388,0.16,39,52],[223.388,0.14,51,32],[223.685,0.143,63,35],[223.864,0.143,62,35],[224.042,0.143,76,47],[224.042,0.27,48,39],[224.042,0.03,83,14],[224.042,0.03,99,21],[224.042,0.055,50,56],[224.062,0.31,42,19],[224.102,0.16,39,52],[224.102,0.14,51,32],[224.221,0.143,74,47],[224.756,0.27,48,39],[224.756,0.03,83,14],[224.757,0.03,99,21],[224.757,0.055,50,56],[224.776,0.31,42,19],[224.817,0.16,39,52],[224.817,0.14,51,32],[225.471,0.143,63,43],[225.471,0.143,65,57],[225.471,0.27,48,39],[225.471,0.03,83,14],[225.471,0.03,99,21],[225.471,0.055,50,56],[225.491,0.31,42,19],[225.531,0.16,39,52],[225.531,0.14,51,32],[225.649,0.143,65,43],[225.649,0.143,67,57],[226.185,0.27,48,39],[226.185,0.03,83,14],[226.185,0.03,99,21],[226.185,0.055,50,56],[226.205,0.31,42,19],[226.245,0.16,39,52],[226.245,0.14,51,32],[226.899,0.143,60,43],[226.899,0.27,48,39],[226.899,0.03,83,14],[226.899,0.03,99,21],[226.899,0.055,50,56],[226.919,0.31,42,19],[226.959,0.16,39,52],[226.959,0.14,51,32],[227.078,0.143,58,43],[227.256,0.143,72,57],[227.435,0.143,70,57],[227.614,0.27,48,39],[227.614,0.03,83,14],[227.614,0.03,99,21],[227.614,0.055,50,56],[227.634,0.31,42,19],[227.674,0.16,39,52],[227.674,0.14,51,32],[228.328,0.27,48,39],[228.328,0.03,83,14],[228.328,0.03,99,21],[228.328,0.055,50,56],[228.348,0.31,42,19],[228.388,0.16,39,52],[228.388,0.14,51,32],[228.654,0.13,69,57],[228.817,0.13,70,57],[228.98,0.27,48,39],[228.98,0.03,83,14],[228.98,0.03,99,21],[228.98,0.055,50,56],[229,0.31,42,19],[229.04,0.16,39,52],[229.04,0.14,51,32],[229.632,0.27,48,39],[229.632,0.03,83,14],[229.632,0.03,99,21],[229.632,0.055,50,56],[229.652,0.31,42,19],[229.692,0.16,39,52],[229.692,0.14,51,32],[229.958,0.13,56,43],[230.121,0.13,55,43],[230.284,0.03,99,21],[230.284,0.055,50,56],[230.285,0.13,69,57],[230.285,0.27,48,39],[230.285,0.03,83,14],[230.304,0.31,42,19],[230.344,0.16,39,52],[230.344,0.14,51,32],[230.447,0.13,67,57],[230.937,0.27,48,39],[230.937,0.03,83,14],[230.937,0.03,99,21],[230.937,0.055,50,56],[230.957,0.31,42,19],[230.997,0.16,39,52],[230.997,0.14,51,32],[231.589,0.13,72,67],[231.589,0.27,48,39],[231.589,0.03,83,14],[231.589,0.03,99,21],[231.589,0.055,50,56],[231.609,0.31,42,19],[231.649,0.16,39,52],[231.649,0.14,51,32],[231.752,0.13,74,67],[232.241,0.27,48,39],[232.241,0.03,83,14],[232.241,0.03,99,21],[232.241,0.055,50,56],[232.261,0.31,42,19],[232.301,0.16,39,52],[232.301,0.14,51,32],[232.893,0.13,56,50],[232.893,0.27,48,39],[232.893,0.03,83,14],[232.893,0.03,99,21],[232.893,0.055,50,56],[232.913,0.31,42,19],[232.953,0.16,39,52],[232.953,0.14,51,32],[233.056,0.13,58,50],[233.545,0.27,48,39],[233.545,0.03,83,14],[233.545,0.03,99,21],[233.545,0.055,50,56],[233.565,0.31,42,19],[233.605,0.16,39,52],[233.605,0.14,51,32],[234.145,0.12,67,50],[234.145,0.27,48,39],[234.145,0.03,83,14],[234.145,0.03,99,21],[234.145,0.055,50,56],[234.165,0.31,42,19],[234.205,0.16,39,52],[234.205,0.14,51,32],[234.295,0.12,65,50],[234.445,0.12,76,67],[234.595,0.12,77,67],[234.745,0.27,48,39],[234.745,0.03,83,14],[234.745,0.03,99,21],[234.745,0.055,50,56],[234.765,0.31,42,19],[234.805,0.16,39,52],[234.805,0.14,51,32],[235.345,0.27,48,39],[235.345,0.03,83,14],[235.345,0.03,99,21],[235.345,0.055,50,56],[235.365,0.31,42,19],[235.405,0.16,39,52],[235.405,0.14,51,32],[235.645,0.12,60,31],[235.795,0.12,62,31],[235.945,0.27,48,39],[235.945,0.03,83,14],[235.945,0.03,99,21],[235.945,0.055,50,56],[235.965,0.31,42,19],[236.005,0.16,39,52],[236.005,0.14,51,32],[236.545,0.27,48,39],[236.545,0.03,83,14],[236.545,0.03,99,21],[236.545,0.055,50,56],[236.565,0.31,42,19],[236.605,0.16,39,52],[236.605,0.14,51,32],[236.845,0.12,63,31],[236.995,0.12,62,31],[237.145,0.12,76,42],[237.145,0.27,48,39],[237.145,0.03,83,14],[237.145,0.03,99,21],[237.145,0.055,50,56],[237.165,0.31,42,19],[237.205,0.16,39,52],[237.205,0.14,51,32],[237.295,0.12,74,42],[237.745,0.27,48,39],[237.745,0.03,83,14],[237.745,0.03,99,21],[237.745,0.055,50,56],[237.765,0.31,42,19],[237.805,0.16,39,52],[237.805,0.14,51,32],[238.345,0.12,63,31],[238.345,0.105,65,47],[238.345,0.03,99,21],[238.345,0.055,50,56],[238.405,0.16,39,52],[238.405,0.14,51,32],[238.495,0.12,65,31],[238.945,0.03,99,21],[238.945,0.055,50,56],[238.983,0.105,70,47],[239.005,0.16,39,52],[239.005,0.14,51,32],[239.395,0.105,75,47],[239.545,0.03,99,21],[239.545,0.055,50,56],[239.605,0.16,39,52],[239.605,0.14,51,32],[239.785,0.36,77,52],[240.145,0.5,102,108],[240.145,0.03,99,21],[240.145,0.055,50,56],[240.205,0.16,39,52],[240.205,0.14,51,32],[240.745,0.03,99,21],[240.745,0.055,50,56],[240.805,0.16,39,52],[240.805,0.14,51,32],[241.345,0.03,99,21],[241.345,0.055,50,56],[241.405,0.16,39,52],[241.405,0.14,51,32],[241.945,0.03,99,21],[241.945,0.055,50,56],[242.005,0.16,39,52],[242.005,0.14,51,32],[242.145,0.65,60,16],[242.545,0.03,99,21],[242.545,0.055,50,56],[242.605,0.16,39,52],[242.605,0.14,51,32],[243.145,0.04,99,43],[243.145,0.03,99,16],[243.145,0.055,50,44],[243.205,0.16,39,41],[243.205,0.14,51,24],[243.86,0.16,48,49],[243.86,0.03,99,22],[244.574,0.03,99,16],[244.574,0.055,50,44],[244.634,0.16,39,41],[244.634,0.14,51,24],[245.145,1.5,60,33],[245.288,0.16,48,49],[245.288,0.03,99,22],[246.002,0.03,99,16],[246.002,0.055,50,44],[246.062,0.16,39,41],[246.062,0.14,51,24],[247.431,0.03,99,16],[247.431,0.055,50,44],[247.491,0.16,39,41],[247.491,0.14,51,24],[248.86,0.03,99,16],[248.86,0.055,50,44],[248.92,0.16,39,41],[248.92,0.14,51,24],[250.288,0.03,99,16],[250.288,0.055,50,44],[250.348,0.16,39,41],[250.348,0.14,51,24],[251.717,0.03,99,16],[251.717,0.055,50,44],[251.777,0.16,39,41],[251.777,0.14,51,24],[253.145,0.03,99,16],[253.145,0.055,50,44],[253.205,0.16,39,41],[253.205,0.14,51,24],[254.574,0.03,99,16],[254.574,0.055,50,44],[254.634,0.16,39,41],[254.634,0.14,51,24],[256.002,0.03,99,16],[256.002,0.055,50,44],[256.062,0.16,39,41],[256.062,0.14,51,24],[257.431,0.04,99,43],[257.431,0.03,99,16],[257.431,0.055,50,44],[257.491,0.16,39,41],[257.491,0.14,51,24],[258.145,0.16,43,49],[258.145,0.03,99,22],[258.86,0.03,99,16],[258.86,0.055,50,44],[258.92,0.16,39,41],[258.92,0.14,51,24],[259.574,0.16,43,49],[259.574,0.03,99,22],[260.288,0.03,99,16],[260.288,0.055,50,44],[260.348,0.16,39,41],[260.348,0.14,51,24],[261.717,0.03,99,16],[261.717,0.055,50,44],[261.777,0.16,39,41],[261.777,0.14,51,24],[263.145,0.03,99,16],[263.145,0.055,50,44],[263.205,0.16,39,41],[263.205,0.14,51,24],[264.574,0.03,99,16],[264.574,0.055,50,44],[264.634,0.16,39,41],[264.634,0.14,51,24],[266.002,0.25,59,40],[266.002,0.03,99,16],[266.002,0.055,50,44],[266.062,0.16,39,41],[266.062,0.14,51,24],[267.431,0.03,99,16],[267.431,0.055,50,44],[267.491,0.16,39,41],[267.491,0.14,51,24],[267.788,0.25,69,49],[268.86,0.03,99,16],[268.86,0.055,50,44],[268.92,0.16,39,41],[268.92,0.14,51,24],[270.288,0.03,99,16],[270.288,0.055,50,44],[270.348,0.16,39,41],[270.348,0.14,51,24],[271.717,0.04,99,43],[271.717,0.03,99,16],[271.717,0.055,50,44],[271.777,0.16,39,41],[271.777,0.14,51,24],[272.431,0.16,48,49],[272.431,0.03,99,22],[273.145,0.03,99,16],[273.145,0.055,50,44],[273.205,0.16,39,41],[273.205,0.14,51,24],[273.86,0.16,48,49],[273.86,0.03,99,22],[274.574,0.03,99,16],[274.574,0.055,50,44],[274.634,0.16,39,41],[274.634,0.14,51,24],[276.002,0.03,99,16],[276.002,0.055,50,44],[276.062,0.16,39,41],[276.062,0.14,51,24],[277.431,1.429,60,42],[277.431,0.03,99,16],[277.431,0.055,50,44],[277.491,0.16,39,41],[277.491,0.14,51,24],[278.86,0.03,99,16],[278.86,0.055,50,44],[278.92,0.16,39,41],[278.92,0.14,51,24],[280.288,0.03,99,16],[280.288,0.055,50,44],[280.348,0.16,39,41],[280.348,0.14,51,24],[281.717,0.03,99,16],[281.717,0.055,50,44],[281.777,0.16,39,41],[281.777,0.14,51,24],[283.145,0.03,99,16],[283.145,0.055,50,44],[283.205,0.16,39,41],[283.205,0.14,51,24],[284.574,0.03,99,16],[284.574,0.055,50,44],[284.634,0.16,39,41],[284.634,0.14,51,24],[286.002,0.04,99,43],[286.002,0.03,99,16],[286.002,0.055,50,44],[286.062,0.16,39,41],[286.062,0.14,51,24],[286.36,0.16,43,49],[286.36,0.03,99,22],[287.074,0.16,43,49],[287.074,0.03,99,22],[287.431,0.03,99,16],[287.431,0.055,50,44],[287.491,0.16,39,41],[287.491,0.14,51,24],[287.788,0.16,43,49],[287.788,0.03,99,22],[288.502,0.16,43,49],[288.502,0.03,99,22],[288.86,0.03,99,16],[288.86,0.055,50,44],[288.92,0.16,39,41],[288.92,0.14,51,24],[290.288,0.03,99,16],[290.288,0.055,50,44],[290.348,0.16,39,41],[290.348,0.14,51,24],[291.717,0.03,99,16],[291.717,0.055,50,44],[291.777,0.16,39,41],[291.777,0.14,51,24],[293.145,0.03,99,16],[293.145,0.055,50,44],[293.205,0.16,39,41],[293.205,0.14,51,24],[294.574,0.03,99,16],[294.574,0.055,50,44],[294.634,0.16,39,41],[294.634,0.14,51,24],[296.002,0.03,99,16],[296.002,0.055,50,44],[296.062,0.16,39,41],[296.062,0.14,51,24],[297.431,0.03,99,16],[297.431,0.055,50,44],[297.491,0.16,39,41],[297.491,0.14,51,24],[298.86,0.03,99,16],[298.86,0.055,50,44],[298.92,0.16,39,41],[298.92,0.14,51,24],[300.288,0.03,99,16],[300.288,0.055,50,44],[300.348,0.16,39,41],[300.348,0.14,51,24],[301.488,0.444,53,35],[301.488,0.03,99,20],[301.488,0.055,50,53],[301.488,6.333,65,17],[301.548,0.16,39,50],[301.548,0.14,51,30],[301.766,0.065,99,17],[302.044,0.065,99,17],[302.322,0.03,99,20],[302.322,0.055,50,53],[302.382,0.16,39,50],[302.382,0.14,51,30],[302.488,6,60,10],[302.877,0.444,72,35],[303.155,0.03,99,20],[303.155,0.055,50,53],[303.215,0.16,39,50],[303.215,0.14,51,30],[303.433,0.065,99,17],[303.71,0.065,99,17],[303.988,0.03,99,20],[303.988,0.055,50,53],[304.048,0.16,39,50],[304.048,0.14,51,30],[304.266,0.444,69,35],[304.822,0.03,99,20],[304.822,0.055,50,53],[304.882,0.16,39,50],[304.882,0.14,51,30],[305.099,0.065,99,17],[305.377,0.065,99,17],[305.655,0.444,70,35],[305.655,0.03,99,20],[305.655,0.055,50,53],[305.715,0.16,39,50],[305.715,0.14,51,30],[306.488,0.03,99,20],[306.488,0.055,50,53],[306.548,0.16,39,50],[306.548,0.14,51,30],[306.766,0.065,99,17],[307.044,0.444,67,35],[307.044,0.065,99,17],[307.322,0.03,99,20],[307.322,0.055,50,53],[307.382,0.16,39,50],[307.382,0.14,51,30],[308.155,0.03,99,20],[308.155,0.055,50,53],[308.155,6.333,65,8],[308.215,0.16,39,50],[308.215,0.14,51,30],[308.433,0.444,57,35],[308.433,0.065,99,17],[308.71,0.065,99,17],[308.988,0.03,99,20],[308.988,0.055,50,53],[309.048,0.16,39,50],[309.048,0.14,51,30],[309.822,0.444,50,35],[309.822,0.03,99,20],[309.822,0.055,50,53],[309.882,0.16,39,49],[309.882,0.14,51,30],[310.099,0.065,99,17],[310.377,0.065,99,17],[310.655,0.03,99,20],[310.655,0.055,50,52],[310.715,0.16,39,49],[310.715,0.14,51,30],[311.21,0.444,69,35],[311.488,0.03,99,20],[311.488,0.055,50,52],[311.548,0.16,39,49],[311.548,0.14,51,29],[311.766,0.065,99,16],[312.044,0.065,99,16],[312.322,0.444,70,10],[312.322,0.03,99,19],[312.322,0.055,50,52],[312.382,0.16,39,49],[312.382,0.14,51,29],[312.599,0.444,74,47],[313.155,0.03,99,19],[313.155,0.055,50,51],[313.215,0.16,39,48],[313.215,0.14,51,29],[313.433,0.065,99,16],[313.71,0.444,67,13],[313.71,0.065,99,16],[313.988,0.444,72,46],[313.988,0.03,99,19],[313.988,0.055,50,51],[314.048,0.16,39,47],[314.048,0.14,51,28],[314.822,0.03,99,19],[314.822,0.055,50,50],[314.822,6.333,72,16],[314.882,0.16,39,47],[314.882,0.14,51,28],[315.099,0.444,57,18],[315.099,0.065,99,15],[315.377,0.444,60,44],[315.377,0.065,99,15],[315.655,0.03,99,18],[315.655,0.055,50,48],[315.715,0.16,39,45],[315.715,0.14,51,27],[316.488,0.444,53,22],[316.488,0.03,99,18],[316.488,0.055,50,47],[316.548,0.16,39,44],[316.548,0.14,51,26],[316.766,0.444,57,42],[316.766,0.065,99,15],[317.044,0.065,99,14],[317.322,0.03,99,17],[317.322,0.055,50,45],[317.382,0.16,39,42],[317.382,0.14,51,25],[317.877,0.444,72,28],[318.155,0.444,58,39],[318.155,0.03,99,16],[318.155,0.055,50,43],[318.215,0.16,39,40],[318.215,0.14,51,24],[318.433,0.065,99,13],[318.71,0.065,99,13],[318.988,0.03,99,15],[318.988,0.055,50,40],[319.048,0.16,39,37],[319.048,0.14,51,22],[319.266,0.444,74,33],[319.544,0.444,77,34],[319.822,0.03,99,14],[319.822,0.055,50,36],[319.882,0.16,39,34],[319.882,0.14,51,20],[320.099,0.065,99,11],[320.377,0.065,99,11],[320.655,0.444,72,38],[320.655,0.03,99,12],[320.655,0.055,50,32],[320.715,0.16,39,30],[320.715,0.14,51,18],[320.933,0.444,76,28],[321.488,0.03,99,10],[321.488,0.055,50,28],[321.548,0.16,39,26],[321.548,0.14,51,16],[321.766,0.065,99,8],[322.044,0.444,60,43],[322.044,0.065,99,8],[322.322,0.444,65,21],[322.322,0.03,99,9],[322.322,0.055,50,23],[322.382,0.16,39,21],[322.382,0.14,51,13],[323.155,0.055,50,17],[323.215,0.16,39,16],[323.215,0.14,51,10],[323.433,0.444,53,28],[323.71,0.444,57,7],[323.988,0.055,50,11],[324.048,0.16,39,10],[324.822,0.444,58,29],[326.21,0.444,77,29],[327.322,0.444,72,9],[327.599,0.444,76,28],[328.155,6.333,69,9],[328.71,0.444,60,15],[328.988,0.444,65,24],[330.099,0.444,57,21],[330.377,0.444,60,20],[331.21,0.25,77,13],[331.488,0.444,58,26],[331.766,0.444,62,13],[332.322,0.75,77,23],[332.877,0.444,77,28],[334.266,0.444,76,26],[334.822,6.333,65,13],[335.655,0.444,65,25],[336.488,0.75,79,20],[336.766,0.444,53,13],[337.044,0.444,57,22],[337.599,0.065,99,10],[337.877,0.25,76,15],[337.877,0.065,99,11],[338.155,0.444,58,19],[338.433,0.444,62,18],[339.266,0.065,99,14],[339.544,0.444,77,23],[339.544,0.065,99,15],[339.822,0.444,60,11],[339.822,0.5,77,9],[340.933,0.444,76,26],[340.933,0.5,76,21],[340.933,0.065,99,16],[341.21,0.065,99,16],[341.488,6.333,72,8],[342.322,0.444,65,26],[342.599,0.065,99,17],[342.877,0.065,99,16],[343.71,0.444,60,18],[344.266,0.065,99,15],[344.544,0.065,99,15],[344.822,0.444,58,9],[344.822,0.75,64,11],[345.099,0.444,62,16],[345.933,0.065,99,12],[346.21,0.444,77,13],[346.21,0.065,99,12],[346.488,0.444,60,12],[346.488,0.5,67,10],[347.599,0.444,76,16],[347.599,0.065,99,9],[347.877,0.444,79,9],[347.877,0.065,99,8],[348.155,6.333,69,28],[348.988,0.444,65,18],[350.377,0.444,57,19],[350.655,0.5,65,13],[351.766,0.444,62,18],[352.322,0.055,50,12],[352.382,0.16,39,11],[353.155,0.444,60,18],[353.155,0.055,50,18],[353.215,0.16,39,17],[353.215,0.14,51,10],[353.71,0.5,67,12],[353.988,0.03,99,9],[353.988,0.055,50,23],[354.048,0.16,39,22],[354.048,0.14,51,13],[354.266,0.444,76,7],[354.544,0.444,79,13],[354.822,0.03,99,11],[354.822,0.055,50,28],[354.822,6.333,69,10],[354.882,0.16,39,27],[354.882,0.14,51,16],[355.099,0.065,99,9],[355.377,0.065,99,10],[355.655,0.444,65,10],[355.655,0.03,99,12],[355.655,0.055,50,33],[355.715,0.16,39,31],[355.715,0.14,51,19],[355.933,0.444,69,12],[356.488,0.03,99,14],[356.488,0.055,50,36],[356.548,0.16,39,34],[356.548,0.14,51,21],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,12],[357.322,0.444,65,10],[357.322,0.03,99,15],[357.322,0.055,50,40],[357.382,0.16,39,38],[357.382,0.14,51,23],[358.155,0.03,99,16],[358.155,0.055,50,43],[358.215,0.16,39,40],[358.215,0.14,51,24],[358.433,0.444,62,13],[358.433,0.065,99,14],[358.71,0.444,65,9],[358.71,0.065,99,14],[358.988,0.03,99,17],[358.988,0.055,50,45],[359.048,0.16,39,42],[359.048,0.14,51,25],[359.822,0.444,60,14],[359.822,0.03,99,18],[359.822,0.055,50,47],[359.882,0.16,39,44],[359.882,0.14,51,26],[360.099,0.065,99,15],[360.377,0.065,99,15],[360.655,0.03,99,18],[360.655,0.055,50,48],[360.715,0.16,39,46],[360.715,0.14,51,27],[361.21,0.444,79,14],[361.488,0.03,99,19],[361.488,0.055,50,50],[361.548,0.16,39,47],[361.548,0.14,51,28],[361.766,0.065,99,16],[362.044,0.065,99,16],[362.322,0.03,99,19],[362.322,0.055,50,51],[362.382,0.16,39,48],[362.382,0.14,51,29],[362.599,0.444,69,15],[363.155,0.03,99,19],[363.155,0.055,50,51],[363.215,0.16,39,48],[363.215,0.14,51,29],[363.433,0.065,99,16],[363.71,0.065,99,16],[363.988,0.444,62,13],[363.988,0.03,99,19],[363.988,0.055,50,52],[364.048,0.16,39,49],[364.048,0.14,51,29],[364.822,0.03,99,20],[364.822,0.055,50,52],[364.882,0.16,39,49],[364.882,0.14,51,29],[365.099,0.065,99,16],[365.377,0.444,65,23],[365.377,0.065,99,16],[365.655,0.03,99,20],[365.655,0.055,50,53],[365.715,0.16,39,49],[365.715,0.14,51,30],[366.488,0.03,99,20],[366.488,0.055,50,53],[366.548,0.16,39,49],[366.548,0.14,51,30],[366.766,0.444,64,19],[366.766,0.065,99,17],[367.044,0.065,99,17],[367.322,0.03,99,20],[367.322,0.055,50,53],[367.382,0.16,39,50],[367.382,0.14,51,30],[368.155,0.444,53,16],[368.155,0.03,99,20],[368.155,0.055,50,53],[368.215,0.16,39,50],[368.215,0.14,51,30],[368.433,0.065,99,17],[368.71,0.065,99,17],[368.988,0.03,99,20],[368.988,0.055,50,53],[369.048,0.16,39,50],[369.048,0.14,51,30],[369.544,0.444,72,16],[369.822,0.03,99,20],[369.822,0.055,50,53],[369.882,0.16,39,50],[369.882,0.14,51,30],[370.099,0.065,99,17],[370.377,0.065,99,17],[370.655,0.03,99,20],[370.655,0.055,50,53],[370.715,0.16,39,50],[370.715,0.14,51,30],[370.933,0.444,69,12],[371.488,0.03,99,20],[371.488,0.055,50,53],[371.548,0.16,39,50],[371.548,0.14,51,30],[371.766,0.065,99,17],[372.044,0.065,99,17],[372.322,0.444,70,8],[372.322,0.03,99,20],[372.322,0.055,50,53],[372.382,0.16,39,50],[372.382,0.14,51,30],[373.155,0.03,99,20],[373.155,0.055,50,53],[373.215,0.16,39,50],[373.215,0.14,51,30],[373.433,0.065,99,17],[373.71,0.065,99,17],[373.988,0.03,99,20],[373.988,0.055,50,53],[374.048,0.16,39,50],[374.048,0.14,51,30],[374.822,0.03,99,20],[374.822,0.055,50,53],[374.882,0.16,39,50],[374.882,0.14,51,30],[375.099,0.065,99,17],[375.377,0.065,99,17],[375.655,0.03,99,20],[375.655,0.055,50,53],[375.715,0.16,39,50],[375.715,0.14,51,30],[375.822,0.27,48,39],[375.822,0.03,83,14],[375.822,0.03,99,19],[375.822,0.055,50,50],[375.822,4.071,67,8],[375.841,0.31,42,19],[375.882,0.16,39,47],[375.882,0.14,51,28],[376.25,0.321,64,25],[376.893,0.27,48,39],[376.893,0.03,83,14],[376.893,0.03,99,19],[376.893,0.055,50,50],[376.913,0.31,42,19],[376.953,0.16,39,47],[376.953,0.14,51,28],[377.295,0.7,64,12],[377.964,0.321,60,27],[377.964,0.27,48,41],[377.964,0.03,83,14],[377.964,0.03,99,19],[377.964,0.055,50,50],[377.984,0.31,42,21],[378.024,0.16,39,47],[378.024,0.14,51,28],[379.036,0.27,48,41],[379.036,0.03,83,14],[379.036,0.03,99,19],[379.036,0.055,50,50],[379.056,0.31,42,21],[379.096,0.16,39,47],[379.096,0.14,51,28],[379.822,0.321,67,27],[380.107,0.27,48,44],[380.107,0.03,83,15],[380.107,0.03,99,19],[380.107,0.055,50,50],[380.107,4.071,64,10],[380.127,0.31,42,22],[380.167,0.16,39,47],[380.167,0.14,51,28],[381.179,0.27,48,44],[381.179,0.03,83,15],[381.179,0.03,99,19],[381.179,0.055,50,50],[381.199,0.31,42,22],[381.239,0.16,39,47],[381.239,0.14,51,28],[381.607,0.321,60,28],[382.25,0.27,48,46],[382.25,0.03,83,16],[382.25,0.03,99,19],[382.25,0.055,50,50],[382.27,0.31,42,23],[382.31,0.16,39,47],[382.31,0.14,51,28],[383.054,0.7,62,13],[383.322,0.321,57,30],[383.322,0.27,48,46],[383.322,0.03,83,16],[383.322,0.03,99,19],[383.322,0.055,50,50],[383.341,0.31,42,23],[383.382,0.16,39,47],[383.382,0.14,51,28],[384.393,0.27,48,48],[384.393,0.03,83,17],[384.393,0.03,99,19],[384.393,0.055,50,50],[384.393,4.071,60,18],[384.413,0.31,42,24],[384.453,0.16,39,47],[384.453,0.14,51,28],[384.795,0.7,60,28],[385.179,0.321,60,31],[385.464,0.27,48,48],[385.464,0.03,83,17],[385.464,0.03,99,19],[385.464,0.055,50,50],[385.484,0.31,42,24],[385.524,0.16,39,47],[385.524,0.14,51,28],[386.536,0.27,48,51],[386.536,0.03,83,18],[386.536,0.03,99,19],[386.536,0.055,50,50],[386.556,0.31,42,25],[386.596,0.16,39,47],[386.596,0.14,51,28],[386.804,0.204,60,28],[386.964,0.321,57,51],[387.607,0.27,48,51],[387.607,0.03,83,18],[387.607,0.03,99,19],[387.607,0.055,50,50],[387.627,0.31,42,25],[387.667,0.16,39,47],[387.667,0.14,51,28],[388.679,0.321,55,53],[388.679,0.27,48,53],[388.679,0.03,83,19],[388.679,0.03,99,19],[388.679,0.055,50,50],[388.679,4.071,62,10],[388.699,0.31,42,26],[388.739,0.16,39,47],[388.739,0.14,51,28],[389.75,0.27,48,53],[389.75,0.03,83,19],[389.75,0.03,99,19],[389.75,0.055,50,50],[389.77,0.31,42,26],[389.81,0.16,39,47],[389.81,0.14,51,28],[390.536,0.321,62,53],[390.554,0.7,71,45],[390.822,0.27,48,49],[390.822,0.03,83,17],[390.822,0.03,99,19],[390.822,0.055,50,50],[390.841,0.31,42,24],[390.882,0.16,39,47],[390.882,0.14,51,28],[391.223,0.7,64,86],[391.893,0.161,60,34],[391.893,0.03,99,19],[391.893,0.055,50,50],[391.953,0.16,39,47],[391.953,0.14,51,28],[392.964,0.27,48,41],[392.964,0.03,83,14],[392.964,0.03,99,19],[392.964,0.055,50,50],[392.964,3.931,64,31],[392.984,0.31,42,21],[393.024,0.16,39,47],[393.024,0.14,51,28],[393.223,0.197,79,23],[393.378,0.31,76,41],[393.999,0.27,48,41],[393.999,0.03,83,14],[393.999,0.03,99,19],[393.999,0.055,50,50],[394.019,0.31,42,21],[394.059,0.16,39,47],[394.059,0.14,51,28],[394.775,0.035,117,9],[395.033,0.31,72,55],[395.033,0.27,48,43],[395.033,0.03,83,15],[395.033,0.03,99,19],[395.033,0.055,50,50],[395.053,0.31,42,22],[395.093,0.16,39,47],[395.093,0.14,51,28],[395.292,0.035,117,12],[396.068,0.27,48,43],[396.068,0.03,83,15],[396.068,0.03,99,19],[396.068,0.055,50,50],[396.088,0.31,42,22],[396.128,0.16,39,47],[396.128,0.14,51,28],[396.827,0.31,79,55],[397.102,0.27,48,46],[397.102,0.03,83,16],[397.102,0.03,99,19],[397.102,0.055,50,50],[397.102,3.931,60,53],[397.122,0.31,42,23],[397.162,0.16,39,47],[397.162,0.14,51,28],[397.878,0.7,76,40],[398.137,0.197,72,32],[398.137,0.27,48,46],[398.137,0.03,83,16],[398.137,0.03,99,19],[398.137,0.055,50,50],[398.157,0.31,42,23],[398.197,0.16,39,47],[398.197,0.14,51,28],[398.525,0.7,79,33],[398.551,0.31,72,58],[399.171,0.27,48,48],[399.171,0.03,83,17],[399.171,0.03,99,19],[399.171,0.055,50,50],[399.191,0.31,42,24],[399.231,0.16,39,47],[399.231,0.14,51,28],[399.947,0.035,117,13],[400.206,0.31,69,61],[400.206,0.27,48,48],[400.206,0.03,83,17],[400.206,0.03,99,19],[400.206,0.055,50,50],[400.226,0.31,42,24],[400.266,0.16,39,47],[400.266,0.14,51,28],[400.464,0.035,117,12],[401.24,0.27,48,51],[401.24,0.03,83,18],[401.24,0.03,99,19],[401.24,0.055,50,50],[401.24,3.931,57,27],[401.26,0.31,42,25],[401.3,0.16,39,47],[401.3,0.14,51,28],[401.999,0.31,72,64],[402.275,0.27,48,51],[402.275,0.03,83,18],[402.275,0.03,99,19],[402.275,0.055,50,50],[402.295,0.31,42,25],[402.335,0.16,39,47],[402.335,0.14,51,28],[403.051,0.197,65,37],[403.309,0.27,48,53],[403.309,0.03,83,19],[403.309,0.03,99,19],[403.309,0.055,50,50],[403.329,0.31,42,27],[403.369,0.16,39,47],[403.369,0.14,51,28],[403.568,0.197,72,38],[403.723,0.31,69,68],[404.085,0.7,77,19],[404.344,0.27,48,53],[404.344,0.03,83,19],[404.344,0.03,99,19],[404.344,0.055,50,50],[404.364,0.31,42,27],[404.404,0.16,39,47],[404.404,0.14,51,28],[404.602,0.035,117,9],[405.12,0.035,117,15],[405.378,0.31,67,72],[405.378,0.27,48,56],[405.378,0.03,83,19],[405.378,0.03,99,19],[405.378,0.055,50,50],[405.378,3.931,59,23],[405.398,0.31,42,28],[405.438,0.16,39,47],[405.438,0.14,51,28],[405.637,0.035,117,11],[405.766,0.7,74,32],[406.413,0.27,48,56],[406.413,0.03,83,19],[406.413,0.03,99,19],[406.413,0.055,50,50],[406.433,0.31,42,28],[406.473,0.16,39,47],[406.473,0.14,51,28],[407.171,0.31,74,72],[407.447,0.27,48,52],[407.447,0.03,83,18],[407.447,0.03,99,19],[407.447,0.055,50,50],[407.467,0.31,42,26],[407.507,0.16,39,47],[407.507,0.14,51,28],[408.482,0.155,60,46],[408.482,0.03,99,19],[408.482,0.055,50,50],[408.542,0.16,39,47],[408.542,0.14,51,28],[409.516,0.27,48,43],[409.516,0.03,83,15],[409.516,0.03,99,19],[409.516,0.055,50,50],[409.536,0.31,42,22],[409.576,0.16,39,47],[409.576,0.14,51,28],[409.766,0.19,91,27],[409.766,0.035,117,10],[409.916,0.3,88,48],[410.266,0.035,117,12],[410.516,0.27,48,43],[410.516,0.03,83,15],[410.516,0.03,99,19],[410.516,0.055,50,50],[410.536,0.31,42,22],[410.576,0.16,39,47],[410.576,0.14,51,28],[411.266,0.7,88,11],[411.516,0.3,84,61],[411.516,0.27,48,46],[411.516,0.03,83,16],[411.516,0.03,99,19],[411.516,0.055,50,50],[411.536,0.31,42,23],[411.576,0.16,39,47],[411.576,0.14,51,28],[411.891,0.7,88,21],[412.516,0.27,48,46],[412.516,0.03,83,16],[412.516,0.03,99,19],[412.516,0.055,50,50],[412.536,0.31,42,23],[412.576,0.16,39,47],[412.576,0.14,51,28],[413.249,0.3,91,61],[413.516,0.27,48,48],[413.516,0.03,83,17],[413.516,0.03,99,19],[413.516,0.055,50,50],[413.516,3.8,57,40],[413.536,0.31,42,24],[413.576,0.16,39,47],[413.576,0.14,51,28],[414.516,0.19,84,36],[414.516,0.27,48,48],[414.516,0.03,83,17],[414.516,0.03,99,19],[414.516,0.055,50,50],[414.536,0.31,42,24],[414.576,0.16,39,47],[414.576,0.14,51,28],[414.766,0.035,117,11],[414.916,0.3,84,64],[415.266,0.035,117,13],[415.516,0.27,48,51],[415.516,0.03,83,18],[415.516,0.03,99,19],[415.516,0.055,50,50],[415.536,0.31,42,25],[415.576,0.16,39,47],[415.576,0.14,51,28],[415.766,0.035,117,8],[416.516,0.3,81,67],[416.516,0.27,48,51],[416.516,0.03,83,18],[416.516,0.03,99,19],[416.516,0.055,50,50],[416.536,0.31,42,25],[416.576,0.16,39,47],[416.576,0.14,51,28],[417.516,0.27,48,54],[417.516,0.03,83,19],[417.516,0.03,99,19],[417.516,0.055,50,50],[417.516,3.8,53,63],[417.536,0.31,42,27],[417.576,0.16,39,47],[417.576,0.14,51,28],[418.249,0.3,84,71],[418.266,0.7,84,40],[418.516,0.27,48,54],[418.516,0.03,83,19],[418.516,0.03,99,19],[418.516,0.055,50,50],[418.536,0.31,42,27],[418.576,0.16,39,47],[418.576,0.14,51,28],[418.891,0.7,91,75],[419.266,0.19,77,45],[419.516,0.27,48,56],[419.516,0.03,83,20],[419.516,0.03,99,19],[419.516,0.055,50,50],[419.536,0.31,42,28],[419.576,0.16,39,47],[419.576,0.14,51,28],[419.766,0.19,84,47],[419.766,0.035,117,13],[419.916,0.3,81,84],[420.266,0.035,117,15],[420.516,0.27,48,56],[420.516,0.03,83,20],[420.516,0.03,99,19],[420.516,0.055,50,50],[420.536,0.31,42,28],[420.576,0.16,39,47],[420.576,0.14,51,28],[420.766,0.035,117,9],[421.516,0.3,79,88],[421.516,0.27,48,59],[421.516,0.03,83,21],[421.516,0.03,99,19],[421.516,0.055,50,50],[421.516,3.8,55,65],[421.536,0.31,42,29],[421.576,0.16,39,47],[421.576,0.14,51,28],[422.516,0.27,48,59],[422.516,0.03,83,21],[422.516,0.03,99,19],[422.516,0.055,50,50],[422.536,0.31,42,29],[422.576,0.16,39,47],[422.576,0.14,51,28],[423.249,0.3,86,88],[423.516,0.27,48,54],[423.516,0.03,83,19],[423.516,0.03,99,19],[423.516,0.055,50,50],[423.536,0.31,42,27],[423.576,0.16,39,47],[423.576,0.14,51,28],[423.696,0.4,100,13],[423.926,0.52,102,9],[424.266,0.7,88,39],[424.516,0.15,72,57],[424.516,0.03,99,19],[424.516,0.055,50,50],[424.576,0.16,39,47],[424.576,0.14,51,28],[425.516,0.27,48,43],[425.516,0.03,83,15],[425.516,0.03,99,19],[425.516,0.055,50,50],[425.516,3.677,60,37],[425.516,0.027,117,35],[425.536,0.31,42,22],[425.576,0.16,39,47],[425.576,0.14,51,28],[425.758,0.184,96,31],[425.758,0.045,117,38],[425.879,0.7,96,47],[425.903,0.29,100,55],[426,0.027,117,10],[426.484,0.27,48,43],[426.484,0.03,83,15],[426.484,0.03,99,19],[426.484,0.055,50,50],[426.504,0.31,42,22],[426.544,0.16,39,47],[426.544,0.14,51,28],[427.452,0.29,96,55],[427.452,0.27,48,46],[427.452,0.03,83,16],[427.452,0.03,99,19],[427.452,0.055,50,50],[427.472,0.31,42,23],[427.512,0.16,39,47],[427.512,0.14,51,28],[428.419,0.27,48,46],[428.419,0.03,83,16],[428.419,0.03,99,19],[428.419,0.055,50,50],[428.439,0.31,42,23],[428.479,0.16,39,47],[428.479,0.14,51,28],[429.129,0.29,103,55],[429.387,0.27,48,48],[429.387,0.03,83,17],[429.387,0.03,99,19],[429.387,0.055,50,50],[429.387,3.677,57,15],[429.387,3.677,64,8],[429.387,0.027,117,16],[429.407,0.31,42,24],[429.447,0.16,39,47],[429.447,0.14,51,28],[429.629,0.045,117,49],[429.871,0.027,117,41],[430.113,0.045,117,72],[430.355,0.184,96,32],[430.355,0.27,48,48],[430.355,0.03,83,17],[430.355,0.03,99,19],[430.355,0.055,50,50],[430.355,0.027,117,44],[430.375,0.31,42,24],[430.415,0.16,39,47],[430.415,0.14,51,28],[430.597,0.045,117,56],[430.742,0.29,96,58],[430.839,0.027,117,22],[431.081,0.045,117,9],[431.323,0.27,48,51],[431.323,0.03,83,18],[431.323,0.03,99,19],[431.323,0.055,50,50],[431.343,0.31,42,25],[431.383,0.16,39,47],[431.383,0.14,51,28],[431.685,0.7,98,43],[432.29,0.29,93,61],[432.29,0.27,48,51],[432.29,0.03,83,18],[432.29,0.03,99,19],[432.29,0.055,50,50],[432.31,0.31,42,25],[432.35,0.16,39,47],[432.35,0.14,51,28],[433.258,0.27,48,54],[433.258,0.03,83,19],[433.258,0.03,99,19],[433.258,0.055,50,50],[433.258,3.677,60,31],[433.278,0.31,42,27],[433.318,0.16,39,47],[433.318,0.14,51,28],[433.968,0.29,96,55],[434.226,0.27,48,54],[434.226,0.03,83,19],[434.226,0.03,99,19],[434.226,0.055,50,50],[434.246,0.31,42,27],[434.286,0.16,39,47],[434.286,0.14,51,28],[434.468,0.045,117,38],[434.71,0.027,117,39],[434.952,0.184,89,31],[434.952,0.045,117,76],[435.193,0.27,48,56],[435.193,0.03,83,20],[435.193,0.03,99,19],[435.193,0.055,50,50],[435.193,0.027,117,53],[435.214,0.31,42,28],[435.253,0.16,39,47],[435.253,0.14,51,28],[435.435,0.184,96,32],[435.435,0.045,117,76],[435.581,0.29,93,58],[435.677,0.027,117,36],[435.919,0.045,117,31],[436.161,0.27,48,56],[436.161,0.03,83,20],[436.161,0.03,99,19],[436.161,0.055,50,50],[436.181,0.31,42,28],[436.221,0.16,39,47],[436.221,0.14,51,28],[437.129,0.29,91,60],[437.129,0.27,48,59],[437.129,0.03,83,21],[437.129,0.03,99,19],[437.129,0.055,50,50],[437.129,3.677,62,50],[437.149,0.31,42,29],[437.189,0.16,39,47],[437.189,0.14,51,28],[438.097,0.27,48,59],[438.097,0.03,83,21],[438.097,0.03,99,19],[438.097,0.055,50,50],[438.117,0.31,42,29],[438.157,0.16,39,47],[438.157,0.14,51,28],[438.46,0.7,107,52],[438.806,0.29,98,60],[439.065,0.218,62,79],[439.065,0.27,48,54],[439.065,0.03,83,19],[439.065,0.03,99,19],[439.065,0.055,50,50],[439.084,0.31,42,27],[439.125,0.16,39,47],[439.125,0.14,51,28],[440.032,0.03,99,19],[440.032,0.055,50,50],[440.092,0.16,39,47],[440.092,0.14,51,28],[441,0.055,50,15],[441,3.8,66,10],[441.06,0.16,39,70],[441.06,0.14,51,42],[441.5,0.23,66,64],[441.75,0.23,69,67],[442,0.03,99,61],[442,0.055,50,164],[442,0.69,66,67],[442.06,0.16,39,154],[442.06,0.14,51,92],[443,0.03,99,65],[443,0.055,50,174],[443.06,0.16,39,163],[443.06,0.14,51,98],[444,0.03,99,65],[444,0.055,50,174],[444.06,0.16,39,163],[444.06,0.14,51,98],[445,0.3,59,33],[445,0.03,99,69],[445,0.055,50,184],[445,3.8,66,16],[445.06,0.16,39,172],[445.06,0.14,51,103],[445.733,0.3,66,33],[445.75,0.7,66,9],[446,0.03,99,69],[446,0.055,50,184],[446.06,0.16,39,172],[446.06,0.14,51,103],[446.4,0.3,62,33],[446.75,0.7,69,9],[447,0.3,59,34],[447,0.03,99,73],[447,0.055,50,194],[447.06,0.16,39,182],[447.06,0.14,51,109],[447.4,0.3,62,34],[447.75,0.7,64,9],[448,0.3,59,34],[448,0.03,99,73],[448,0.055,50,194],[448.06,0.16,39,182],[448.06,0.14,51,109],[448.733,0.3,66,34],[448.75,0.03,99,73],[448.75,0.055,50,194],[448.81,0.16,39,182],[448.81,0.14,51,109],[449,0.03,99,76],[449,0.055,50,203],[449,3.8,62,9],[449.06,0.16,39,191],[449.06,0.14,51,114],[449.375,0.7,62,18],[449.4,0.3,59,36],[450,0.03,99,76],[450,0.055,50,203],[450.06,0.16,39,191],[450.06,0.14,51,114],[451,0.03,99,80],[451,0.055,50,213],[451.06,0.16,39,200],[451.06,0.14,51,120],[452,0.03,99,80],[452,0.055,50,213],[452.06,0.16,39,200],[452.06,0.14,51,120],[453,0.03,99,84],[453,0.055,50,223],[453,3.8,61,15],[453,0.46,64,91],[453.06,0.16,39,209],[453.06,0.14,51,125],[453.5,0.23,66,91],[453.75,0.23,69,91],[454,0.03,99,84],[454,0.055,50,223],[454,0.69,73,91],[454.06,0.16,39,209],[454.06,0.14,51,125],[455,0.03,99,78],[455,0.055,50,207],[455.06,0.16,39,194],[455.06,0.14,51,116],[456,0.03,99,78],[456,0.055,50,207],[456.06,0.16,39,194],[456.06,0.14,51,116],[456.75,0.03,99,78],[456.75,0.055,50,207],[456.81,0.16,39,194],[456.81,0.14,51,116],[457,0.03,99,65],[457,0.055,50,173],[457,3.8,66,18],[457.06,0.16,39,162],[457.06,0.14,51,97],[457.733,0.3,69,31],[458,0.03,99,65],[458,0.055,50,173],[458.06,0.16,39,162],[458.06,0.14,51,97],[458.4,0.3,66,31],[458.75,0.7,66,8],[459,0.3,62,33],[459,0.03,99,69],[459,0.055,50,183],[459.06,0.16,39,172],[459.06,0.14,51,103],[459.733,0.3,69,33],[459.75,0.7,66,8],[460,0.3,62,33],[460,0.03,99,69],[460,0.055,50,183],[460.06,0.16,39,172],[460.06,0.14,51,103],[460.733,0.3,69,33],[461,0.03,99,73],[461,0.055,50,194],[461,3.8,62,21],[461.06,0.16,39,181],[461.06,0.14,51,109],[461.375,0.7,66,17],[461.4,0.3,62,34],[462,0.3,59,34],[462,0.03,99,73],[462,0.055,50,194],[462.06,0.16,39,181],[462.06,0.14,51,109],[462.375,0.7,69,17],[463,0.03,99,76],[463,0.055,50,204],[463.06,0.16,39,191],[463.06,0.14,51,115],[464,0.03,99,76],[464,0.055,50,204],[464.06,0.16,39,191],[464.06,0.14,51,115],[464.75,0.03,99,76],[464.75,0.055,50,204],[464.81,0.16,39,191],[464.81,0.14,51,115],[465,0.03,99,80],[465,0.055,50,214],[465,3.8,59,19],[465,0.46,62,87],[465.06,0.16,39,201],[465.06,0.14,51,121],[465.5,0.46,67,87],[466,0.03,99,80],[466,0.055,50,214],[466,0.23,69,87],[466.06,0.16,39,201],[466.06,0.14,51,121],[466.25,0.23,71,87],[466.5,0.46,69,87],[467,0.03,99,84],[467,0.055,50,225],[467,0.46,67,87],[467.06,0.16,39,211],[467.06,0.14,51,126],[468,0.03,99,84],[468,0.055,50,225],[468.06,0.16,39,211],[468.06,0.14,51,126],[469,0.03,99,88],[469,0.055,50,235],[469,3.8,61,10],[469.06,0.16,39,220],[469.06,0.14,51,132],[470,0.03,99,88],[470,0.055,50,235],[470.06,0.16,39,220],[470.06,0.14,51,132],[470.4,0.3,61,59],[470.75,0.7,73,16],[471,0.3,62,54],[471,0.03,99,82],[471,0.055,50,218],[471.06,0.16,39,204],[471.06,0.14,51,122],[471.25,0.276,54,45],[471.733,0.3,69,54],[471.75,0.7,66,16],[471.75,0.276,52,45],[472,0.03,99,82],[472,0.055,50,218],[472.06,0.16,39,204],[472.06,0.14,51,122],[472.25,0.552,50,45],[472.733,0.3,69,54],[472.75,0.03,99,82],[472.75,0.055,50,218],[472.81,0.16,39,204],[472.81,0.14,51,122],[473,0.03,99,65],[473,0.055,50,173],[473,3.738,62,12],[473.06,0.16,39,162],[473.06,0.14,51,97],[473.369,0.7,62,22],[473.393,0.295,66,43],[473.984,0.295,62,43],[473.984,0.03,99,65],[473.984,0.055,50,173],[474.044,0.16,39,162],[474.044,0.14,51,97],[474.229,0.045,117,7],[474.352,0.7,66,22],[474.475,0.027,117,20],[474.705,0.295,69,43],[474.721,0.045,117,50],[474.967,0.03,99,69],[474.967,0.055,50,183],[474.967,0.027,117,42],[475.027,0.16,39,172],[475.027,0.14,51,103],[475.213,0.045,117,68],[475.459,0.027,117,39],[475.705,0.045,117,45],[475.951,0.03,99,69],[475.951,0.055,50,183],[475.951,0.027,117,14],[476.011,0.16,39,172],[476.011,0.14,51,103],[476.934,0.03,99,73],[476.934,0.055,50,194],[476.934,3.738,59,20],[476.994,0.16,39,181],[476.994,0.14,51,109],[477.426,0.226,69,120],[477.672,0.226,71,120],[477.918,0.03,99,73],[477.918,0.055,50,194],[477.918,0.453,69,120],[477.978,0.16,39,181],[477.978,0.14,51,109],[478.41,0.453,66,120],[478.902,0.03,99,76],[478.902,0.055,50,204],[478.902,0.679,64,120],[478.962,0.16,39,191],[478.962,0.14,51,115],[479.393,0.027,117,18],[479.639,0.226,62,120],[479.639,0.045,117,53],[479.885,0.03,99,76],[479.885,0.055,50,204],[479.885,0.027,117,44],[479.945,0.16,39,191],[479.945,0.14,51,115],[480.131,0.045,117,76],[480.377,0.027,117,46],[480.623,0.03,99,76],[480.623,0.055,50,204],[480.623,0.045,117,57],[480.683,0.16,39,191],[480.683,0.14,51,115],[480.869,0.03,99,80],[480.869,0.055,50,214],[480.869,3.738,55,24],[480.869,0.027,117,22],[480.929,0.16,39,201],[480.929,0.14,51,121],[481.852,0.03,99,80],[481.852,0.055,50,214],[481.912,0.16,39,201],[481.912,0.14,51,121],[482.836,0.295,55,56],[482.836,0.03,99,84],[482.836,0.055,50,225],[482.896,0.16,39,211],[482.896,0.14,51,126],[483.557,0.295,62,56],[483.574,0.7,67,14],[483.82,0.03,99,84],[483.82,0.055,50,225],[483.88,0.16,39,211],[483.88,0.14,51,126],[484.213,0.295,59,56],[484.312,0.027,117,13],[484.557,0.045,117,50],[484.803,0.03,99,88],[484.803,0.055,50,235],[484.803,3.738,57,21],[484.803,0.027,117,47],[484.863,0.16,39,220],[484.863,0.14,51,132],[485.049,0.045,117,87],[485.172,0.7,64,29],[485.197,0.295,61,59],[485.295,0.027,117,54],[485.541,0.045,117,73],[485.787,0.295,57,59],[485.787,0.03,99,88],[485.787,0.055,50,235],[485.787,0.027,117,31],[485.847,0.16,39,220],[485.847,0.14,51,132],[486.033,0.045,117,17],[486.156,0.7,73,29],[486.508,0.295,64,59],[486.771,0.03,99,82],[486.771,0.055,50,218],[486.83,0.16,39,204],[486.83,0.14,51,122],[487.016,0.272,54,45],[487.139,0.7,66,29],[487.164,0.295,66,54],[487.754,0.03,99,82],[487.754,0.055,50,218],[487.814,0.16,39,204],[487.814,0.14,51,122],[488.492,0.03,99,82],[488.492,0.055,50,218],[488.552,0.16,39,204],[488.552,0.14,51,122],[488.738,0.03,99,68],[488.738,0.055,50,181],[488.738,3.677,62,8],[488.798,0.16,39,170],[488.798,0.14,51,102],[489.464,0.045,117,32],[489.705,0.03,99,68],[489.705,0.055,50,181],[489.705,0.027,117,33],[489.765,0.16,39,170],[489.765,0.14,51,102],[489.947,0.045,117,65],[490.189,0.027,117,43],[490.431,0.223,64,112],[490.431,0.045,117,59],[490.673,0.03,99,71],[490.673,0.055,50,190],[490.673,0.445,78,112],[490.673,0.027,117,26],[490.733,0.16,39,178],[490.733,0.14,51,107],[490.915,0.045,117,13],[491.157,0.445,76,109],[491.641,0.03,99,65],[491.641,0.055,50,173],[491.641,0.89,74,101],[491.701,0.16,39,160],[491.701,0.14,51,96],[492.609,0.29,59,43],[492.609,0.03,99,40],[492.609,0.055,50,106],[492.609,3.677,66,23],[492.669,0.16,39,92],[492.669,0.14,51,55],[493.318,0.29,66,51],[493.334,0.7,66,13],[493.334,0.045,117,26],[493.576,0.29,59,16],[493.576,0.203,47,21],[493.576,0.027,117,40],[493.818,0.045,117,76],[493.939,0.7,69,17],[493.964,0.29,62,37],[494.06,0.027,117,36],[494.286,0.29,66,47],[494.302,0.203,47,63],[494.302,0.045,117,12],[494.544,0.203,47,71],[494.786,0.401,64,12],[494.907,0.7,76,22],[495.028,0.11,98,67],[495.028,0.095,54,76],[495.27,0.203,47,34],[495.27,0.223,74,111],[495.512,0.89,71,126],[495.512,0.134,62,29],[495.754,0.534,59,27],[495.996,0.11,98,72],[495.996,0.095,54,81],[495.996,0.027,117,28],[496.238,0.045,117,80],[496.48,0.29,55,11],[496.48,0.03,99,22],[496.48,0.055,50,58],[496.48,3.677,55,48],[496.48,0.027,117,38],[496.54,0.16,39,80],[496.54,0.14,51,48],[497.189,0.29,62,40],[497.205,0.7,62,11],[497.447,0.29,55,25],[497.447,0.03,99,50],[497.447,0.055,50,134],[497.507,0.16,39,98],[497.507,0.14,51,59],[497.931,0.445,69,91],[497.931,0.027,117,14],[498.173,0.203,43,51],[498.173,0.045,117,81],[498.415,0.203,43,52],[498.415,0.445,79,148],[498.415,0.027,117,40],[498.899,0.11,98,116],[498.899,0.095,54,130],[499.125,0.29,62,34],[499.141,0.7,79,9],[499.141,0.134,66,26],[499.383,0.03,99,8],[499.383,0.055,50,21],[499.383,0.134,64,32],[499.443,0.16,39,60],[499.443,0.14,51,36],[499.625,0.534,62,24],[499.867,0.027,117,51],[500.109,0.045,117,64],[500.351,3.677,61,48],[500.351,0.445,64,173],[500.834,0.11,98,18],[500.834,0.095,54,21],[501.06,0.29,64,37],[501.076,0.7,64,10],[501.076,0.203,45,32],[501.318,0.29,57,12],[501.318,0.027,117,29],[501.56,0.045,117,91],[501.681,0.7,73,23],[502.028,0.29,64,14],[502.286,0.03,99,69],[502.286,0.055,50,184],[502.286,0.445,78,140],[502.346,0.16,39,140],[502.346,0.14,51,84],[502.528,0.267,66,35],[502.77,0.027,117,14],[502.996,0.29,69,43],[503.012,0.7,78,12],[503.012,0.203,50,53],[503.012,0.045,117,86],[503.254,0.29,62,39],[503.254,0.203,50,24],[503.254,0.027,117,16],[503.738,0.11,98,23],[503.738,0.095,54,25],[503.98,0.03,99,57],[503.98,0.055,50,151],[504.04,0.16,39,174],[504.04,0.14,51,104],[504.222,0.03,99,68],[504.222,0.055,50,181],[504.222,3.677,69,48],[504.222,0.445,62,127],[504.222,0.027,117,7],[504.282,0.16,39,163],[504.282,0.14,51,98],[504.464,0.045,117,68],[504.705,0.027,117,16],[504.931,0.29,69,13],[504.947,0.7,62,9],[504.947,0.203,50,41],[505.189,0.29,62,28],[505.189,0.203,50,35],[505.673,0.11,98,60],[505.673,0.095,54,68],[505.915,0.223,64,126],[505.915,0.045,117,67],[506.157,0.03,99,63],[506.157,0.055,50,169],[506.157,0.445,78,61],[506.157,0.027,117,22],[506.217,0.16,39,173],[506.217,0.14,51,104],[506.867,0.29,69,32],[506.883,0.7,78,8],[506.883,0.203,50,24],[507.125,0.29,62,36],[507.125,0.203,50,45],[507.367,0.045,117,62],[507.609,0.11,98,96],[507.609,0.095,54,108],[507.609,0.027,117,35],[508.092,0.055,50,10],[508.092,3.677,66,59],[508.152,0.16,39,47],[508.152,0.14,51,28],[508.802,0.29,66,27],[508.818,0.045,117,23],[509.06,0.29,59,38],[509.06,0.027,117,48],[509.302,0.045,117,42],[509.423,0.7,69,8],[509.786,0.203,47,39],[510.028,0.203,47,13],[510.028,0.668,76,37],[510.27,0.401,64,27],[510.512,0.11,98,53],[510.512,0.095,54,59],[510.738,0.29,66,40],[510.754,0.7,76,10],[510.754,0.045,117,70],[510.996,0.29,59,27],[510.996,0.03,99,53],[510.996,0.055,50,142],[510.996,0.027,117,45],[511.056,0.16,39,154],[511.056,0.14,51,92],[511.238,0.045,117,10],[511.705,0.29,66,27],[511.722,0.03,99,52],[511.722,0.055,50,139],[511.782,0.16,39,109],[511.782,0.14,51,66],[511.964,0.03,99,15],[511.964,0.055,50,41],[511.964,3.677,59,69],[512.024,0.16,39,11],[512.447,0.445,67,109],[512.689,0.203,43,51],[512.689,0.045,117,43],[512.931,0.203,43,53],[512.931,0.027,117,52],[513.173,0.045,117,71],[513.318,0.29,59,30],[513.415,0.11,98,92],[513.415,0.095,54,103],[513.415,0.027,117,11],[513.657,0.7,69,11],[513.657,0.203,43,13],[513.899,0.29,55,44],[514.141,0.267,67,14],[514.262,0.7,79,12],[514.286,0.29,59,26],[514.383,0.11,98,87],[514.383,0.095,54,98],[514.609,0.29,62,24],[514.867,0.29,55,12],[515.351,0.027,117,26],[515.592,0.045,117,78],[515.835,0.03,99,50],[515.835,0.055,50,134],[515.835,3.677,64,38],[515.835,0.445,64,94],[515.835,0.027,117,58],[515.894,0.16,39,134],[515.894,0.14,51,81],[516.076,0.045,117,75],[516.318,0.223,66,134],[516.318,0.027,117,24],[516.56,0.223,69,147],[516.802,0.03,99,84],[516.802,0.055,50,223],[516.802,0.668,73,157],[516.862,0.16,39,212],[516.862,0.14,51,127],[517.528,0.223,69,33],[517.77,0.03,99,85],[517.77,0.055,50,226],[517.77,0.445,78,23],[517.83,0.16,39,213],[517.83,0.14,51,128],[518.254,0.445,76,10],[518.738,0.03,99,86],[518.738,0.055,50,228],[518.798,0.16,39,214],[518.798,0.14,51,129],[519.463,0.03,99,86],[519.463,0.055,50,229],[519.463,0.045,117,40],[519.524,0.16,39,214],[519.524,0.14,51,129],[519.705,0.03,99,65],[519.705,0.055,50,173],[519.705,3.738,66,56],[519.705,0.027,117,31],[519.765,0.16,39,162],[519.765,0.14,51,97],[519.951,0.045,117,61],[520.197,0.027,117,41],[520.427,0.295,69,32],[520.443,0.045,117,58],[520.689,0.03,99,65],[520.689,0.055,50,173],[520.689,0.027,117,27],[520.749,0.16,39,162],[520.749,0.14,51,97],[520.935,0.045,117,22],[521.082,0.295,66,32],[521.427,0.7,66,10],[521.673,0.295,62,40],[521.673,0.03,99,69],[521.673,0.055,50,183],[521.733,0.16,39,172],[521.733,0.14,51,103],[522.41,0.7,66,10],[522.656,0.295,62,40],[522.656,0.03,99,69],[522.656,0.055,50,183],[522.716,0.16,39,172],[522.716,0.14,51,103],[523.378,0.295,69,40],[523.64,0.03,99,73],[523.64,0.055,50,194],[523.64,3.738,62,56],[523.7,0.16,39,181],[523.7,0.14,51,109],[524.009,0.7,66,21],[524.033,0.295,62,42],[524.378,0.045,117,25],[524.624,0.295,59,42],[524.624,0.03,99,73],[524.624,0.055,50,194],[524.624,0.027,117,31],[524.683,0.16,39,181],[524.683,0.14,51,109],[524.869,0.045,117,65],[524.992,0.7,69,21],[525.115,0.027,117,46],[525.361,0.045,117,69],[525.607,0.03,99,76],[525.607,0.055,50,204],[525.607,0.027,117,37],[525.667,0.16,39,191],[525.667,0.14,51,115],[525.853,0.045,117,35],[526.591,0.03,99,76],[526.591,0.055,50,204],[526.651,0.16,39,191],[526.651,0.14,51,115],[527.328,0.03,99,76],[527.328,0.055,50,204],[527.388,0.16,39,191],[527.388,0.14,51,115],[527.574,0.03,99,80],[527.574,0.055,50,214],[527.574,3.738,59,38],[527.574,0.453,62,120],[527.634,0.16,39,201],[527.634,0.14,51,121],[528.066,0.453,67,120],[528.558,0.03,99,80],[528.558,0.055,50,214],[528.558,0.226,69,120],[528.618,0.16,39,201],[528.618,0.14,51,121],[528.804,0.226,71,120],[529.05,0.453,69,120],[529.296,0.045,117,17],[529.542,0.03,99,84],[529.542,0.055,50,225],[529.542,0.453,67,120],[529.542,0.027,117,30],[529.601,0.16,39,211],[529.601,0.14,51,126],[529.787,0.272,55,35],[529.787,0.045,117,70],[530.033,0.027,117,52],[530.279,0.136,54,35],[530.279,0.045,117,83],[530.525,0.03,99,84],[530.525,0.055,50,225],[530.525,0.136,52,35],[530.525,0.027,117,45],[530.585,0.16,39,211],[530.585,0.14,51,126],[530.771,0.543,50,35],[530.771,0.045,117,48],[531.017,0.027,117,12],[531.509,0.03,99,88],[531.509,0.055,50,235],[531.509,3.738,57,34],[531.569,0.16,39,220],[531.569,0.14,51,132],[532.492,0.03,99,88],[532.492,0.055,50,235],[532.552,0.16,39,220],[532.552,0.14,51,132],[532.886,0.295,61,51],[533.23,0.7,73,13],[533.476,0.295,62,47],[533.476,0.03,99,82],[533.476,0.055,50,218],[533.536,0.16,39,204],[533.536,0.14,51,122],[534.197,0.295,69,47],[534.214,0.7,66,13],[534.214,0.045,117,7],[534.46,0.03,99,82],[534.46,0.055,50,218],[534.46,0.027,117,24],[534.519,0.16,39,204],[534.519,0.14,51,122],[534.705,0.045,117,62],[534.951,0.027,117,49],[535.181,0.295,69,47],[535.197,0.03,99,82],[535.197,0.055,50,218],[535.197,0.045,117,81],[535.257,0.16,39,204],[535.257,0.14,51,122],[535.443,0.03,99,65],[535.443,0.055,50,173],[535.443,3.864,62,46],[535.503,0.16,39,162],[535.503,0.14,51,97],[535.824,0.7,62,19],[535.85,0.305,66,37],[536.46,0.305,62,37],[536.46,0.03,99,65],[536.46,0.055,50,173],[536.52,0.16,39,162],[536.52,0.14,51,97],[536.841,0.7,66,19],[537.206,0.305,69,37],[537.477,0.03,99,69],[537.477,0.055,50,183],[537.537,0.16,39,172],[537.537,0.14,51,103],[538.494,0.03,99,69],[538.494,0.055,50,183],[538.554,0.16,39,172],[538.554,0.14,51,103],[539.511,0.03,99,73],[539.511,0.055,50,194],[539.511,3.864,59,63],[539.571,0.16,39,181],[539.571,0.14,51,109],[540.019,0.234,69,109],[540.274,0.234,71,109],[540.528,0.03,99,73],[540.528,0.055,50,194],[540.528,0.468,69,109],[540.588,0.16,39,181],[540.588,0.14,51,109],[541.036,0.468,66,109],[541.545,0.03,99,76],[541.545,0.055,50,204],[541.545,0.702,64,109],[541.605,0.16,39,191],[541.605,0.14,51,115],[542.562,0.03,99,76],[542.562,0.055,50,204],[542.622,0.16,39,191],[542.622,0.14,51,115],[543.324,0.03,99,76],[543.324,0.055,50,204],[543.385,0.16,39,191],[543.385,0.14,51,115],[543.579,0.03,99,80],[543.579,0.055,50,214],[543.579,3.864,55,62],[543.639,0.16,39,201],[543.639,0.14,51,121],[544.596,0.03,99,80],[544.596,0.055,50,214],[544.656,0.16,39,201],[544.656,0.14,51,121],[545.003,0.305,59,46],[545.613,0.305,55,49],[545.613,0.03,99,84],[545.613,0.055,50,225],[545.673,0.16,39,211],[545.673,0.14,51,126],[546.358,0.305,62,49],[546.63,0.03,99,84],[546.63,0.055,50,225],[546.69,0.16,39,211],[546.69,0.14,51,126],[547.036,0.305,59,49],[547.375,0.305,62,49],[547.646,4.068,62,55],[547.646,0.03,99,88],[547.646,0.055,50,235],[547.646,3.864,57,41],[547.707,0.16,39,220],[547.707,0.14,51,132],[548.028,0.7,64,25],[548.053,0.305,61,51],[548.663,0.305,57,51],[548.663,0.03,99,88],[548.663,0.055,50,235],[548.723,0.16,39,220],[548.723,0.14,51,132],[549.045,0.7,73,25],[549.409,0.305,64,51],[549.68,0.03,99,82],[549.68,0.055,50,218],[549.74,0.16,39,204],[549.74,0.14,51,122],[550.062,0.7,66,25],[550.697,0.03,99,82],[550.697,0.055,50,218],[550.757,0.16,39,204],[550.757,0.14,51,122],[551.46,0.03,99,82],[551.46,0.055,50,218],[551.52,0.16,39,204],[551.52,0.14,51,122],[551.714,0.03,99,19],[551.714,0.055,50,50],[551.774,0.16,39,47],[551.774,0.14,51,28],[552.731,0.03,99,19],[552.731,0.055,50,50],[552.791,0.16,39,47],[552.791,0.14,51,28],[553.748,0.03,99,19],[553.748,0.055,50,50],[553.808,0.16,39,47],[553.808,0.14,51,28],[554.314,0.58,74,33],[554.314,0.8,48,33],[554.314,0.27,48,48],[554.314,0.03,83,17],[554.314,0.03,99,23],[554.314,0.055,50,62],[554.334,0.31,42,24],[554.374,0.16,39,58],[554.374,0.14,51,35],[555.223,0.773,79,33],[555.223,0.03,99,23],[555.223,0.055,50,62],[555.283,0.16,39,58],[555.283,0.14,51,35],[555.314,2.2,60,17],[556.133,0.27,48,48],[556.133,0.03,83,17],[556.133,0.03,99,23],[556.133,0.055,50,62],[556.153,0.31,42,24],[556.192,0.16,39,58],[556.192,0.14,51,35],[556.814,0.193,81,33],[557.042,0.03,99,23],[557.042,0.055,50,62],[557.102,0.16,39,58],[557.102,0.14,51,35],[557.951,0.27,48,48],[557.951,0.03,83,17],[557.951,0.03,99,23],[557.951,0.055,50,62],[557.971,0.31,42,24],[558.011,0.16,39,58],[558.011,0.14,51,35],[558.86,0.03,99,23],[558.86,0.055,50,62],[558.92,0.16,39,58],[558.92,0.14,51,35],[559.769,0.27,48,48],[559.769,0.03,83,17],[559.769,0.03,99,23],[559.769,0.055,50,62],[559.789,0.31,42,24],[559.829,0.16,39,58],[559.829,0.14,51,35],[560.678,0.03,99,23],[560.678,0.055,50,62],[560.738,0.16,39,58],[560.738,0.14,51,35],[561.587,0.58,74,33],[561.587,0.27,48,48],[561.587,0.03,83,17],[561.587,0.03,99,23],[561.587,0.055,50,62],[561.607,0.31,42,24],[561.647,0.16,39,58],[561.647,0.14,51,35],[562.496,0.773,79,33],[562.496,0.03,99,23],[562.496,0.055,50,62],[562.556,0.16,39,58],[562.556,0.14,51,35],[563.405,0.27,48,48],[563.405,0.03,83,17],[563.405,0.03,99,23],[563.405,0.055,50,62],[563.425,0.31,42,24],[563.465,0.16,39,58],[563.465,0.14,51,35],[564.087,0.193,81,33],[564.314,0.03,99,23],[564.314,0.055,50,62],[564.374,0.16,39,58],[564.374,0.14,51,35],[565.223,0.27,48,48],[565.223,0.03,83,17],[565.223,0.03,99,23],[565.223,0.055,50,62],[565.243,0.31,42,24],[565.283,0.16,39,58],[565.283,0.14,51,35],[566.133,0.03,99,23],[566.133,0.055,50,62],[566.192,0.16,39,58],[566.192,0.14,51,35],[567.042,0.27,48,48],[567.042,0.03,83,17],[567.042,0.03,99,23],[567.042,0.055,50,62],[567.062,0.31,42,24],[567.102,0.16,39,58],[567.102,0.14,51,35],[567.951,0.03,99,23],[567.951,0.055,50,62],[568.011,0.16,39,58],[568.011,0.14,51,35],[568.86,0.58,55,16],[568.86,0.03,99,23],[568.86,0.055,50,62],[568.92,0.16,39,58],[568.92,0.14,51,35],[569.542,0.193,55,22],[569.769,0.773,55,22],[569.769,0.03,99,23],[569.769,0.055,50,62],[569.829,0.16,39,58],[569.829,0.14,51,35],[570.678,0.58,55,22],[570.678,0.03,99,23],[570.678,0.055,50,62],[570.738,0.16,39,58],[570.738,0.14,51,35],[571.36,0.193,55,22],[571.587,0.773,55,22],[571.587,0.03,99,23],[571.587,0.055,50,62],[571.647,0.16,39,58],[571.647,0.14,51,35],[572.496,0.58,55,22],[572.496,0.03,99,23],[572.496,0.055,50,62],[572.556,0.16,39,58],[572.556,0.14,51,35],[573.178,0.193,55,16],[573.405,0.773,55,16],[573.405,0.03,99,23],[573.405,0.055,50,62],[573.465,0.16,39,58],[573.465,0.14,51,35],[574.314,0.58,55,16],[574.314,0.03,99,23],[574.314,0.055,50,62],[574.374,0.16,39,58],[574.374,0.14,51,35],[574.996,0.193,55,16],[575.223,0.773,55,16],[575.223,0.03,99,23],[575.223,0.055,50,62],[575.283,0.16,39,58],[575.283,0.14,51,35],[576.133,0.58,55,16],[576.133,0.03,99,23],[576.133,0.055,50,62],[576.192,0.16,39,58],[576.192,0.14,51,35],[576.814,0.193,55,16],[577.042,0.773,55,24],[577.042,0.03,99,23],[577.042,0.055,50,62],[577.102,0.16,39,58],[577.102,0.14,51,35],[577.951,0.58,55,24],[577.951,0.03,99,23],[577.951,0.055,50,62],[578.011,0.16,39,58],[578.011,0.14,51,35],[578.633,0.193,55,24],[578.86,0.773,55,24],[578.86,0.03,99,23],[578.86,0.055,50,62],[578.92,0.16,39,58],[578.92,0.14,51,35],[579.769,0.58,55,24],[579.769,0.03,99,23],[579.769,0.055,50,62],[579.829,0.16,39,58],[579.829,0.14,51,35],[580.451,0.193,55,24],[580.678,0.773,55,24],[580.678,0.03,99,23],[580.678,0.055,50,62],[580.738,0.16,39,58],[580.738,0.14,51,35],[581.587,0.58,55,29],[581.587,0.03,99,23],[581.587,0.055,50,62],[581.647,0.16,39,58],[581.647,0.14,51,35],[582.269,0.193,55,29],[582.496,0.773,55,29],[582.496,0.03,99,23],[582.496,0.055,50,62],[582.556,0.16,39,58],[582.556,0.14,51,35],[583.405,0.58,74,48],[583.405,0.27,48,48],[583.405,0.03,83,17],[583.405,0.03,99,23],[583.405,0.055,50,62],[583.425,0.31,42,24],[583.465,0.16,39,58],[583.465,0.14,51,35],[584.314,0.773,79,48],[584.314,0.03,99,23],[584.314,0.055,50,62],[584.374,0.16,39,58],[584.374,0.14,51,35],[585.223,0.27,48,48],[585.223,0.03,83,17],[585.223,0.03,99,23],[585.223,0.055,50,62],[585.243,0.31,42,24],[585.283,0.16,39,58],[585.283,0.14,51,35],[585.905,0.193,81,48],[586.133,0.03,99,23],[586.133,0.055,50,62],[586.192,0.16,39,58],[586.192,0.14,51,35],[587.042,0.27,48,48],[587.042,0.03,83,17],[587.042,0.03,99,23],[587.042,0.055,50,62],[587.062,0.31,42,24],[587.102,0.16,39,58],[587.102,0.14,51,35],[587.951,0.03,99,23],[587.951,0.055,50,62],[588.011,0.16,39,58],[588.011,0.14,51,35],[588.86,0.27,48,48],[588.86,0.03,83,17],[588.86,0.03,99,23],[588.86,0.055,50,62],[588.88,0.31,42,24],[588.92,0.16,39,58],[588.92,0.14,51,35],[589.769,0.03,99,23],[589.769,0.055,50,62],[589.829,0.16,39,58],[589.829,0.14,51,35],[590.678,0.159,67,54],[590.678,0.03,99,23],[590.678,0.055,50,62],[590.738,0.16,39,58],[590.738,0.14,51,35],[591.587,0.03,99,23],[591.587,0.055,50,62],[591.647,0.16,39,58],[591.647,0.14,51,35],[591.837,0.6,60,47],[592.437,0.346,72,23],[592.437,0.27,48,39],[592.437,0.03,83,14],[592.437,0.03,99,19],[592.437,0.055,50,50],[592.437,4.385,60,13],[592.457,0.31,42,19],[592.497,0.16,39,47],[592.497,0.14,51,28],[592.726,0.219,79,13],[593.591,0.27,48,39],[593.591,0.03,83,14],[593.591,0.03,99,19],[593.591,0.055,50,50],[593.611,0.31,42,19],[593.651,0.16,39,47],[593.651,0.14,51,28],[594.437,0.346,79,23],[594.745,0.27,48,41],[594.745,0.03,83,14],[594.745,0.03,99,18],[594.745,0.055,50,49],[594.765,0.31,42,20],[594.805,0.16,39,46],[594.805,0.14,51,28],[595.033,0.035,117,11],[595.899,0.346,72,7],[595.899,0.27,48,39],[595.899,0.03,83,14],[595.899,0.03,99,18],[595.899,0.055,50,47],[595.919,0.31,42,19],[595.958,0.16,39,44],[595.958,0.14,51,27],[596.36,0.346,76,22],[597.052,0.27,48,34],[597.052,0.03,83,12],[597.052,0.03,99,15],[597.052,0.055,50,39],[597.052,4.385,57,26],[597.072,0.31,42,17],[597.112,0.16,39,36],[597.112,0.14,51,22],[597.485,0.7,76,9],[597.899,0.346,76,22],[598.206,0.346,69,10],[598.206,0.27,48,17],[598.206,0.055,50,19],[598.226,0.31,42,8],[598.266,0.16,39,17],[598.266,0.14,51,10],[599.072,0.219,76,14],[599.072,0.035,117,12],[599.649,0.219,69,14],[599.793,0.277,52,13],[599.822,0.346,72,23],[600.514,0.219,72,12],[600.514,0.277,45,22],[601.206,0.27,64,32],[601.206,0.03,83,11],[601.226,0.31,57,16],[601.36,0.346,76,27],[601.379,0.277,40,26],[601.668,0.277,41,27],[601.668,4.385,60,17],[602.101,0.7,72,7],[602.101,0.277,48,23],[602.245,0.07,98,15],[602.36,0.27,64,23],[602.36,0.03,83,8],[602.38,0.31,57,12],[602.533,0.035,117,13],[602.822,0.346,65,25],[602.822,0.277,41,13],[603.399,0.07,98,24],[604.437,0.346,69,18],[604.552,0.07,98,19],[604.668,0.27,64,24],[604.668,0.03,83,8],[604.688,0.31,57,12],[604.822,0.346,72,18],[605.995,0.035,117,14],[606.283,0.346,67,30],[606.283,0.27,48,12],[606.283,0.055,50,11],[606.283,4.385,55,28],[606.343,0.16,39,12],[606.572,0.035,117,8],[607.437,0.27,48,37],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,34],[607.457,0.31,42,18],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.87,0.7,83,9],[607.899,0.346,71,25],[608.283,0.346,74,15],[608.302,0.219,74,8],[608.591,0.27,48,45],[608.591,0.03,83,16],[608.591,0.03,99,17],[608.591,0.055,50,46],[608.611,0.31,42,23],[608.651,0.16,39,43],[608.651,0.14,51,26],[609.745,0.173,60,20],[609.745,0.03,99,18],[609.745,0.055,50,49],[609.805,0.16,39,46],[609.805,0.14,51,28],[610.899,0.36,72,21],[610.899,0.27,48,37],[610.899,0.03,83,13],[610.899,0.03,99,19],[610.899,0.055,50,50],[610.899,4.56,67,8],[610.919,0.31,42,18],[610.959,0.16,39,47],[610.959,0.14,51,28],[612.099,0.36,72,27],[612.099,0.27,48,37],[612.099,0.03,83,13],[612.099,0.03,99,19],[612.099,0.055,50,50],[612.119,0.31,42,18],[612.159,0.16,39,47],[612.159,0.14,51,28],[613.299,0.36,72,28],[613.299,0.27,48,39],[613.299,0.03,83,14],[613.299,0.03,99,19],[613.299,0.055,50,50],[613.319,0.31,42,19],[613.359,0.16,39,47],[613.359,0.14,51,28],[613.749,0.7,76,13],[614.499,0.36,72,28],[614.499,0.27,48,39],[614.499,0.03,83,14],[614.499,0.03,99,19],[614.499,0.055,50,50],[614.519,0.31,42,19],[614.559,0.16,39,47],[614.559,0.14,51,28],[615.699,0.36,69,30],[615.699,0.27,48,41],[615.699,0.03,83,14],[615.699,0.03,99,19],[615.699,0.055,50,50],[615.699,4.56,64,22],[615.719,0.31,42,21],[615.759,0.16,39,47],[615.759,0.14,51,28],[616.899,0.36,69,30],[616.899,0.27,48,41],[616.899,0.03,83,14],[616.899,0.03,99,19],[616.899,0.055,50,50],[616.919,0.31,42,21],[616.959,0.16,39,47],[616.959,0.14,51,28],[618.099,0.36,69,32],[618.099,0.27,48,43],[618.099,0.03,83,15],[618.099,0.03,99,19],[618.099,0.055,50,50],[618.119,0.31,42,22],[618.159,0.16,39,47],[618.159,0.14,51,28],[619.299,0.36,69,32],[619.299,0.27,48,43],[619.299,0.03,83,15],[619.299,0.03,99,19],[619.299,0.055,50,50],[619.319,0.31,42,22],[619.359,0.16,39,47],[619.359,0.14,51,28],[620.499,0.27,48,46],[620.499,0.03,83,16],[620.499,0.03,99,19],[620.499,0.055,50,50],[620.499,4.56,60,21],[620.519,0.31,42,23],[620.559,0.16,39,47],[620.559,0.14,51,28],[621.399,0.7,72,9],[621.699,0.27,48,46],[621.699,0.03,83,16],[621.699,0.03,99,19],[621.699,0.055,50,50],[621.719,0.31,42,23],[621.759,0.16,39,47],[621.759,0.14,51,28],[622.149,0.7,79,17],[622.899,0.27,48,48],[622.899,0.03,83,17],[622.899,0.03,99,19],[622.899,0.055,50,50],[622.919,0.31,42,24],[622.959,0.16,39,47],[622.959,0.14,51,28],[623.199,0.228,72,20],[624.099,0.27,48,48],[624.099,0.03,83,17],[624.099,0.03,99,19],[624.099,0.055,50,50],[624.119,0.31,42,24],[624.159,0.16,39,47],[624.159,0.14,51,28],[625.299,0.27,48,50],[625.299,0.03,83,17],[625.299,0.03,99,19],[625.299,0.055,50,50],[625.299,4.56,62,18],[625.319,0.31,42,25],[625.359,0.16,39,47],[625.359,0.14,51,28],[626.499,0.27,48,50],[626.499,0.03,83,17],[626.499,0.03,99,19],[626.499,0.055,50,50],[626.519,0.31,42,25],[626.559,0.16,39,47],[626.559,0.14,51,28],[627.699,0.27,48,46],[627.699,0.03,83,16],[627.699,0.03,99,19],[627.699,0.055,50,50],[627.719,0.31,42,23],[627.759,0.16,39,47],[627.759,0.14,51,28],[628.599,0.7,76,10],[628.899,0.18,60,24],[628.899,0.03,99,19],[628.899,0.055,50,50],[628.959,0.16,39,47],[628.959,0.14,51,28],[630.099,0.375,72,24],[630.099,0.27,48,32],[630.099,0.03,83,11],[630.099,0.03,99,19],[630.099,0.055,50,50],[630.119,0.31,42,16],[630.159,0.16,39,47],[630.159,0.14,51,28],[630.567,0.7,72,12],[631.349,0.375,72,24],[631.349,0.27,48,32],[631.349,0.03,83,11],[631.349,0.03,99,19],[631.349,0.055,50,50],[631.369,0.31,42,16],[631.409,0.16,39,47],[631.409,0.14,51,28],[632.599,0.375,72,25],[632.599,0.27,48,34],[632.599,0.03,83,12],[632.599,0.03,99,19],[632.599,0.055,50,50],[632.619,0.31,42,17],[632.659,0.16,39,47],[632.659,0.14,51,28],[633.849,0.375,72,25],[633.849,0.27,48,34],[633.849,0.03,83,12],[633.849,0.03,99,19],[633.849,0.055,50,50],[633.869,0.31,42,17],[633.909,0.16,39,47],[633.909,0.14,51,28],[635.099,0.375,69,27],[635.099,0.27,48,36],[635.099,0.03,83,13],[635.099,0.03,99,19],[635.099,0.055,50,50],[635.099,4.75,60,13],[635.119,0.31,42,18],[635.159,0.16,39,47],[635.159,0.14,51,28],[636.349,0.375,69,27],[636.349,0.27,48,36],[636.349,0.03,83,13],[636.349,0.03,99,19],[636.349,0.055,50,50],[636.369,0.31,42,18],[636.409,0.16,39,47],[636.409,0.14,51,28],[637.599,0.375,69,28],[637.599,0.27,48,38],[637.599,0.03,83,13],[637.599,0.03,99,19],[637.599,0.055,50,50],[637.619,0.31,42,19],[637.659,0.16,39,47],[637.659,0.14,51,28],[638.067,0.7,74,13],[638.849,0.375,69,28],[638.849,0.27,48,38],[638.849,0.03,83,13],[638.849,0.03,99,19],[638.849,0.055,50,50],[638.869,0.31,42,19],[638.909,0.16,39,47],[638.909,0.14,51,28],[640.099,0.375,65,30],[640.099,0.27,48,40],[640.099,0.03,83,14],[640.099,0.03,99,19],[640.099,0.055,50,50],[640.099,4.75,57,19],[640.119,0.31,42,20],[640.159,0.16,39,47],[640.159,0.14,51,28],[641.349,0.375,65,30],[641.349,0.27,48,40],[641.349,0.03,83,14],[641.349,0.03,99,19],[641.349,0.055,50,50],[641.369,0.31,42,20],[641.409,0.16,39,47],[641.409,0.14,51,28],[642.599,0.375,65,31],[642.599,0.27,48,42],[642.599,0.03,83,15],[642.599,0.03,99,19],[642.599,0.055,50,50],[642.619,0.31,42,21],[642.659,0.16,39,47],[642.659,0.14,51,28],[643.849,0.375,65,31],[643.849,0.27,48,42],[643.849,0.03,83,15],[643.849,0.03,99,19],[643.849,0.055,50,50],[643.869,0.31,42,21],[643.909,0.16,39,47],[643.909,0.14,51,28],[645.099,0.375,67,32],[645.099,0.27,48,44],[645.099,0.03,83,15],[645.099,0.03,99,19],[645.099,0.055,50,50],[645.099,4.75,59,16],[645.119,0.31,42,22],[645.159,0.16,39,47],[645.159,0.14,51,28],[646.349,0.375,67,32],[646.349,0.27,48,44],[646.349,0.03,83,15],[646.349,0.03,99,19],[646.349,0.055,50,50],[646.369,0.31,42,22],[646.409,0.16,39,47],[646.409,0.14,51,28],[646.817,0.7,83,16],[647.599,0.375,72,30],[647.599,0.27,48,41],[647.599,0.03,83,14],[647.599,0.03,99,19],[647.599,0.055,50,50],[647.619,0.31,42,20],[647.659,0.16,39,47],[647.659,0.14,51,28],[648.849,0.188,60,21],[648.849,0.03,99,19],[648.849,0.055,50,50],[648.909,0.16,39,47],[648.909,0.14,51,28],[650.099,0.383,72,22],[650.099,0.03,99,19],[650.099,0.055,50,50],[650.159,0.16,39,47],[650.159,0.14,51,28],[651.375,0.383,72,22],[651.375,0.03,99,19],[651.375,0.055,50,50],[651.435,0.16,39,47],[651.435,0.14,51,28],[652.652,0.383,72,24],[652.652,0.03,99,19],[652.652,0.055,50,50],[652.712,0.16,39,47],[652.712,0.14,51,28],[653.928,0.383,72,24],[653.928,0.03,99,19],[653.928,0.055,50,50],[653.988,0.16,39,47],[653.988,0.14,51,28],[655.205,0.383,69,25],[655.205,0.03,99,19],[655.205,0.055,50,50],[655.265,0.16,39,47],[655.265,0.14,51,28],[655.684,0.7,76,12],[656.482,0.383,69,25],[656.482,0.03,99,19],[656.482,0.055,50,50],[656.542,0.16,39,47],[656.542,0.14,51,28],[657.758,0.383,69,26],[657.758,0.03,99,19],[657.758,0.055,50,50],[657.818,0.16,39,47],[657.818,0.14,51,28],[659.035,0.383,69,26],[659.035,0.03,99,19],[659.035,0.055,50,50],[659.095,0.16,39,47],[659.095,0.14,51,28],[660.311,0.383,65,24],[660.311,0.03,99,19],[660.311,0.055,50,50],[660.371,0.16,39,47],[660.371,0.14,51,28],[661.588,0.383,65,24],[661.588,0.03,99,19],[661.588,0.055,50,50],[661.648,0.16,39,47],[661.648,0.14,51,28],[662.865,0.383,65,25],[662.865,0.03,99,19],[662.865,0.055,50,50],[662.925,0.16,39,47],[662.925,0.14,51,28],[663.343,0.7,77,12],[664.141,0.383,65,25],[664.141,0.03,99,19],[664.141,0.055,50,50],[664.201,0.16,39,47],[664.201,0.14,51,28],[665.418,0.383,67,26],[665.418,0.03,99,19],[665.418,0.055,50,50],[665.478,0.16,39,47],[665.478,0.14,51,28],[666.694,0.383,67,26],[666.694,0.03,99,19],[666.694,0.055,50,50],[666.754,0.16,39,47],[666.754,0.14,51,28],[667.971,0.383,72,24],[667.971,0.03,99,19],[667.971,0.055,50,50],[668.031,0.16,39,47],[668.031,0.14,51,28],[669.247,0.192,60,17],[669.247,0.03,99,19],[669.247,0.055,50,50],[669.308,0.16,39,47],[669.308,0.14,51,28],[670.524,0.391,72,18],[670.524,0.03,99,19],[670.524,0.055,50,50],[670.584,0.16,39,47],[670.584,0.14,51,28],[671.046,0.391,76,18],[671.481,0.391,79,18],[671.828,0.391,72,18],[671.828,0.03,99,19],[671.828,0.055,50,50],[671.888,0.16,39,47],[671.888,0.14,51,28],[672.35,0.391,76,18],[672.785,0.391,79,18],[673.133,0.391,72,19],[673.133,0.03,99,19],[673.133,0.055,50,50],[673.193,0.16,39,47],[673.193,0.14,51,28],[673.655,0.391,76,19],[674.089,0.391,79,19],[674.437,0.391,72,19],[674.437,0.03,99,19],[674.437,0.055,50,50],[674.497,0.16,39,47],[674.497,0.14,51,28],[674.959,0.391,76,19],[675.394,0.391,79,19],[675.741,0.391,69,20],[675.741,0.03,99,19],[675.741,0.055,50,50],[675.802,0.16,39,47],[675.802,0.14,51,28],[676.263,0.391,72,20],[676.698,0.391,76,20],[677.046,0.391,69,20],[677.046,0.03,99,19],[677.046,0.055,50,50],[677.106,0.16,39,47],[677.106,0.14,51,28],[677.568,0.391,72,20],[678.002,0.391,76,20],[678.35,0.391,69,21],[678.35,0.03,99,19],[678.35,0.055,50,50],[678.41,0.16,39,47],[678.41,0.14,51,28],[678.872,0.391,72,21],[679.307,0.391,76,21],[679.654,0.03,99,19],[679.654,0.055,50,50],[679.655,0.391,69,21],[679.715,0.16,39,47],[679.715,0.14,51,28],[680.176,0.391,72,21],[680.611,0.391,76,21],[680.959,0.391,65,22],[680.959,0.03,99,19],[680.959,0.055,50,50],[681.019,0.16,39,47],[681.019,0.14,51,28],[681.481,0.391,69,22],[681.915,0.391,72,22],[682.263,0.391,65,22],[682.263,0.03,99,19],[682.263,0.055,50,50],[682.323,0.16,39,47],[682.323,0.14,51,28],[682.785,0.391,69,22],[683.22,0.391,72,22],[683.568,0.391,65,23],[683.568,0.03,99,19],[683.568,0.055,50,50],[683.628,0.16,39,47],[683.628,0.14,51,28],[684.089,0.391,69,23],[684.524,0.391,72,23],[684.872,0.391,65,23],[684.872,0.03,99,19],[684.872,0.055,50,50],[684.932,0.16,39,47],[684.932,0.14,51,28],[685.394,0.391,69,23],[685.828,0.391,72,23],[686.176,0.391,67,24],[686.176,0.03,99,19],[686.176,0.055,50,50],[686.236,0.16,39,47],[686.236,0.14,51,28],[686.698,0.391,71,24],[687.133,0.391,74,24],[687.481,0.391,67,24],[687.481,0.03,99,19],[687.481,0.055,50,50],[687.541,0.16,39,47],[687.541,0.14,51,28],[688.002,0.391,71,24],[688.437,0.391,74,24],[688.785,0.391,72,23],[688.785,0.03,99,19],[688.785,0.055,50,50],[688.845,0.16,39,47],[688.845,0.14,51,28],[689.307,0.391,76,23],[689.741,0.391,79,23],[690.089,0.196,60,16],[690.089,0.03,99,19],[690.089,0.055,50,50],[690.149,0.16,39,47],[690.149,0.14,51,28],[691.394,0.03,99,19],[691.394,0.055,50,50],[691.454,0.16,39,47],[691.454,0.14,51,28],[692.757,0.03,99,19],[692.757,0.055,50,50],[692.817,0.16,39,47],[692.817,0.14,51,28],[694.121,0.03,99,19],[694.121,0.055,50,50],[694.181,0.16,39,47],[694.181,0.14,51,28],[695.485,0.03,99,19],[695.485,0.055,50,50],[695.545,0.16,39,47],[695.545,0.14,51,28],[696.848,0.03,99,19],[696.848,0.055,50,50],[696.908,0.16,39,47],[696.908,0.14,51,28],[698.212,0.03,99,19],[698.212,0.055,50,50],[698.272,0.16,39,47],[698.272,0.14,51,28],[699.576,0.03,99,19],[699.576,0.055,50,50],[699.635,0.16,39,47],[699.635,0.14,51,28],[700.939,0.03,99,19],[700.939,0.055,50,50],[700.999,0.16,39,47],[700.999,0.14,51,28],[702.303,0.03,99,19],[702.303,0.055,50,50],[702.363,0.16,39,47],[702.363,0.14,51,28],[703.666,0.03,99,19],[703.666,0.055,50,50],[703.726,0.16,39,47],[703.726,0.14,51,28],[705.03,0.03,99,19],[705.03,0.055,50,50],[705.09,0.16,39,47],[705.09,0.14,51,28],[706.394,0.03,99,19],[706.394,0.055,50,50],[706.454,0.16,39,47],[706.454,0.14,51,28],[707.757,0.03,99,19],[707.757,0.055,50,50],[707.817,0.16,39,47],[707.817,0.14,51,28],[709.121,0.03,99,19],[709.121,0.055,50,50],[709.181,0.16,39,47],[709.181,0.14,51,28],[710.485,0.03,99,19],[710.485,0.055,50,50],[710.545,0.16,39,47],[710.545,0.14,51,28],[711.848,0.03,99,19],[711.848,0.055,50,50],[711.908,0.16,39,47],[711.908,0.14,51,28],[713.212,0.03,99,16],[713.212,0.055,50,44],[713.272,0.16,39,41],[713.272,0.14,51,24],[714.412,2.4,83,39],[715.212,0.03,99,16],[715.212,0.055,50,44],[715.272,0.16,39,41],[715.272,0.14,51,24],[717.212,0.03,99,16],[717.212,0.055,50,44],[717.272,0.16,39,41],[717.272,0.14,51,24],[718.212,2,60,27],[719.212,0.03,99,16],[719.212,0.055,50,44],[719.272,0.16,39,41],[719.272,0.14,51,24],[721.212,0.03,99,16],[721.212,0.055,50,44],[721.272,0.16,39,41],[721.272,0.14,51,24],[723.212,0.03,99,16],[723.212,0.055,50,44],[723.272,0.16,39,41],[723.272,0.14,51,24],[725.212,0.03,99,16],[725.212,0.055,50,44],[725.272,0.16,39,41],[725.272,0.14,51,24],[727.212,0.03,99,16],[727.212,0.055,50,44],[727.272,0.16,39,41],[727.272,0.14,51,24],[729.212,0.03,99,16],[729.212,0.055,50,44],[729.272,0.16,39,41],[729.272,0.14,51,24],[731.212,0.03,99,16],[731.212,0.055,50,44],[731.272,0.16,39,41],[731.272,0.14,51,24],[733.212,0.03,99,16],[733.212,0.055,50,44],[733.272,0.16,39,41],[733.272,0.14,51,24],[735.212,0.03,99,16],[735.212,0.055,50,44],[735.272,0.16,39,41],[735.272,0.14,51,24],[737.212,0.03,99,16],[737.212,0.055,50,44],[737.272,0.16,39,41],[737.272,0.14,51,24],[739.212,0.03,99,16],[739.212,0.055,50,44],[739.272,0.16,39,41],[739.272,0.14,51,24],[741.212,0.03,99,16],[741.212,0.055,50,44],[741.272,0.16,39,41],[741.272,0.14,51,24],[743.212,0.03,99,16],[743.212,0.055,50,44],[743.272,0.16,39,41],[743.272,0.14,51,24],[745.212,0.03,99,16],[745.212,0.055,50,44],[745.272,0.16,39,41],[745.272,0.14,51,24],[747.212,0.03,99,16],[747.212,0.055,50,44],[747.272,0.16,39,41],[747.272,0.14,51,24],[749.212,0.03,99,16],[749.212,0.055,50,44],[749.272,0.16,39,41],[749.272,0.14,51,24],[751.212,0.03,99,16],[751.212,0.055,50,44],[751.272,0.16,39,41],[751.272,0.14,51,24],[753.212,0.03,99,16],[753.212,0.055,50,44],[753.272,0.16,39,41],[753.272,0.14,51,24],[755.212,0.03,99,16],[755.212,0.055,50,44],[755.272,0.16,39,41],[755.272,0.14,51,24],[757.212,0.03,99,16],[757.212,0.055,50,44],[757.272,0.16,39,41],[757.272,0.14,51,24],[759.212,0.03,99,16],[759.212,0.055,50,44],[759.272,0.16,39,41],[759.272,0.14,51,24],[761.212,0.03,99,16],[761.212,0.055,50,44],[761.272,0.16,39,41],[761.272,0.14,51,24],[763.212,0.03,99,16],[763.212,0.055,50,44],[763.272,0.16,39,41],[763.272,0.14,51,24],[765.212,0.03,99,16],[765.212,0.055,50,44],[765.272,0.16,39,41],[765.272,0.14,51,24],[767.212,0.03,99,16],[767.212,0.055,50,44],[767.272,0.16,39,41],[767.272,0.14,51,24],[769.212,0.03,99,16],[769.212,0.055,50,44],[769.272,0.16,39,41],[769.272,0.14,51,24],[771.212,0.03,99,16],[771.212,0.055,50,44],[771.272,0.16,39,41],[771.272,0.14,51,24]],[[33.95,0.427,76,169],[37.75,0.855,74,199],[43.98,0.999,76,199],[49.9,0.504,72,199],[52.14,0.504,76,199],[56.16,0.25,79,199],[58.14,0.792,72,177],[59.78,0.15,62,173],[61.3,0.36,79,22],[62.5,0.36,79,22],[63.7,0.36,79,23],[64.9,0.36,79,23],[66.1,0.36,76,24],[67.3,0.36,76,24],[68.5,0.36,76,25],[69.7,0.36,76,21],[70.9,0.36,72,22],[72.1,0.36,72,22],[73.3,0.36,72,23],[74.5,0.36,72,23],[75.7,0.36,74,24],[76.9,0.36,74,24],[78.1,0.36,79,22],[78.66,0.18,62,22],[80.483,0.353,79,29],[81.659,0.353,79,29],[82.836,0.353,79,31],[84.012,0.353,79,31],[84.032,0.224,72,17],[85.189,0.353,76,32],[86.365,0.353,76,22],[87.542,0.353,76,23],[88.718,0.353,76,23],[97.502,0.176,62,31],[99.29,0.346,79,39],[100.444,0.346,79,19],[101.04,0.035,117,11],[101.597,0.346,79,20],[101.617,0.035,117,8],[102.751,0.346,79,20],[102.77,0.219,72,11],[103.347,0.219,69,12],[103.905,0.346,76,21],[104.645,0.7,79,11],[105.059,0.346,76,21],[105.655,0.035,117,9],[106.213,0.346,76,35],[106.232,0.035,117,12],[107.367,0.346,76,35],[108.828,0.219,69,20],[110.847,0.035,117,12],[111.424,0.035,117,13],[112.722,0.7,74,14],[114.309,0.219,74,16],[115.982,0.173,62,19],[117.36,0.227,57,10],[117.36,0.227,60,10],[117.36,0.227,64,10],[118.723,0.227,57,10],[118.723,0.227,60,10],[118.723,0.227,64,10],[120.087,0.227,62,10],[120.087,0.227,65,10],[120.087,0.227,69,10],[121.451,0.227,64,10],[121.451,0.227,68,10],[121.451,0.227,71,10],[122.814,0.227,57,10],[122.814,0.227,60,10],[122.814,0.227,64,10],[124.178,0.227,65,10],[124.178,0.227,69,10],[124.178,0.227,72,10],[125.541,0.227,62,10],[125.541,0.227,65,10],[125.541,0.227,69,10],[126.905,0.227,64,10],[126.905,0.227,68,10],[126.905,0.227,71,10],[128.269,0.227,57,10],[128.269,0.227,60,10],[128.269,0.227,64,10],[129.632,0.227,57,10],[129.632,0.227,60,10],[129.632,0.227,64,10],[130.996,0.227,62,10],[130.996,0.227,65,10],[130.996,0.227,69,10],[132.36,0.227,64,10],[132.36,0.227,68,10],[132.36,0.227,71,10],[133.723,0.227,57,10],[133.723,0.227,60,10],[133.723,0.227,64,10],[135.087,0.227,65,9],[135.087,0.227,69,9],[135.087,0.227,72,9],[136.451,0.227,64,9],[136.451,0.227,68,9],[136.451,0.227,71,9],[137.814,0.227,57,9],[137.814,0.227,60,9],[137.814,0.227,64,9],[139.178,0.227,57,9],[139.178,0.227,60,9],[139.178,0.227,64,9],[139.632,0.409,77,26],[140.541,0.227,57,9],[140.541,0.227,60,9],[140.541,0.227,64,9],[140.769,0.045,111,12],[140.996,0.191,69,10],[141.451,0.045,111,19],[141.905,0.227,62,9],[141.905,0.227,65,9],[141.905,0.227,69,9],[143.041,0.191,80,10],[143.269,0.227,64,9],[143.269,0.227,68,9],[143.269,0.227,71,9],[144.178,0.818,74,26],[144.632,0.227,57,9],[144.632,0.227,60,9],[144.632,0.227,64,9],[145.541,0.045,111,12],[145.996,0.227,65,11],[145.996,0.227,69,11],[145.996,0.227,72,11],[146.223,0.045,111,15],[146.905,0.045,111,8],[147.36,0.227,62,11],[147.36,0.227,65,11],[147.36,0.227,69,11],[147.814,0.409,72,31],[147.814,0.191,81,12],[148.723,0.227,64,11],[148.723,0.227,68,11],[148.723,0.227,71,11],[149.86,0.191,69,12],[150.087,0.227,57,11],[150.087,0.227,60,11],[150.087,0.227,64,11],[150.996,0.045,111,21],[151.451,0.227,57,11],[151.451,0.227,60,11],[151.451,0.227,64,11],[151.678,0.045,111,10],[152.36,0.818,81,33],[152.814,0.227,62,11],[152.814,0.227,65,11],[152.814,0.227,69,11],[154.178,0.227,64,13],[154.178,0.227,68,13],[154.178,0.227,71,13],[154.632,0.191,80,14],[155.541,0.227,57,13],[155.541,0.227,60,13],[155.541,0.227,64,13],[155.769,0.045,111,12],[156.451,0.818,77,38],[156.451,0.045,111,19],[156.678,0.191,84,14],[156.905,0.227,65,13],[156.905,0.227,69,13],[156.905,0.227,72,13],[158.269,0.227,64,13],[158.269,0.227,68,13],[158.269,0.227,71,13],[159.178,1.227,69,38],[159.632,0.227,57,13],[159.632,0.227,60,13],[159.632,0.227,64,13],[160.541,0.045,111,12],[160.996,0.227,57,15],[160.996,0.227,60,15],[160.996,0.227,64,15],[161.223,0.045,111,15],[161.451,0.191,57,17],[161.905,0.045,111,8],[162.36,0.227,57,17],[162.36,0.227,60,17],[162.36,0.227,64,17],[163.496,0.191,65,20],[163.723,0.227,62,17],[163.723,0.227,65,17],[163.723,0.227,69,17],[164.178,0.409,75,17],[165.087,0.227,64,17],[165.087,0.227,68,17],[165.087,0.227,71,17],[165.996,0.045,111,21],[166.451,0.227,57,17],[166.451,0.227,60,17],[166.451,0.227,64,17],[166.678,0.045,111,10],[167.814,0.227,65,17],[167.814,0.227,69,17],[167.814,0.227,72,17],[168.269,0.409,73,17],[168.269,0.191,72,20],[169.178,0.227,62,17],[169.178,0.227,65,17],[169.178,0.227,69,17],[170.314,0.191,64,20],[170.541,0.227,64,17],[170.541,0.227,68,17],[170.541,0.227,71,17],[170.769,0.045,111,12],[171.451,0.045,111,19],[171.905,0.227,57,15],[171.905,0.227,60,15],[171.905,0.227,64,15],[172.36,0.409,73,16],[173.269,0.227,57,15],[173.269,0.227,60,15],[173.269,0.227,64,15],[174.632,0.227,62,15],[174.632,0.227,65,15],[174.632,0.227,69,15],[175.087,0.191,65,18],[175.541,0.045,111,12],[175.996,0.227,64,15],[175.996,0.227,68,15],[175.996,0.227,71,15],[176.223,0.045,111,15],[176.905,0.818,70,16],[176.905,0.045,111,8],[177.132,0.191,64,18],[177.36,0.227,57,15],[177.36,0.227,60,15],[177.36,0.227,64,15],[178.723,0.227,65,15],[178.723,0.227,69,15],[178.723,0.227,72,15],[180.087,0.227,64,13],[180.087,0.227,68,13],[180.087,0.227,71,13],[180.087,0.409,68,14],[180.996,0.045,111,21],[181.451,0.227,57,13],[181.451,0.227,60,13],[181.451,0.227,64,13],[181.678,0.045,111,10],[181.905,0.191,57,15],[182.844,0.242,57,12],[182.844,0.242,60,12],[182.844,0.242,64,12],[184.295,0.242,65,12],[184.295,0.242,69,12],[184.295,0.242,72,12],[185.747,0.242,64,12],[185.747,0.242,68,12],[185.747,0.242,71,12],[187.198,0.242,57,12],[187.198,0.242,60,12],[187.198,0.242,64,12],[188.702,0.268,57,12],[188.702,0.268,60,12],[188.702,0.268,64,12],[190.309,0.268,65,12],[190.309,0.268,69,12],[190.309,0.268,72,12],[191.916,0.268,64,12],[191.916,0.268,68,12],[191.916,0.268,71,12],[192.988,1.607,57,28],[193.523,0.268,57,12],[193.523,0.268,60,12],[193.523,0.268,64,12],[195.984,0.158,72,15],[196.181,0.158,74,15],[197.563,0.158,56,11],[197.76,0.158,58,11],[199.142,0.158,67,11],[199.339,0.158,65,11],[199.537,0.158,76,15],[199.734,0.158,77,15],[201.116,0.158,60,11],[201.313,0.158,62,11],[202.695,0.158,63,20],[202.892,0.158,62,20],[203.089,0.158,76,27],[203.287,0.158,74,27],[204.668,0.158,63,20],[204.668,0.143,65,27],[204.847,0.143,67,27],[204.866,0.158,65,20],[206.097,0.143,60,20],[206.275,0.143,58,20],[206.454,0.143,72,27],[206.633,0.143,70,27],[207.883,0.143,69,23],[208.061,0.143,70,23],[209.311,0.143,56,17],[209.49,0.143,55,17],[209.668,0.143,69,23],[209.847,0.143,67,23],[211.097,0.143,72,23],[211.275,0.143,74,23],[212.525,0.143,56,17],[212.704,0.143,58,17],[213.892,0.13,67,25],[214.055,0.13,65,25],[214.218,0.13,76,34],[214.381,0.13,77,34],[215.522,0.13,60,25],[215.685,0.13,62,25],[216.827,0.13,63,25],[216.99,0.13,62,25],[217.153,0.13,76,34],[217.316,0.13,74,34],[218.457,0.13,63,35],[218.615,0.114,66,53],[218.62,0.13,65,35],[219.259,0.114,71,53],[219.659,0.114,76,53],[220.022,0.391,78,59],[220.426,0.5,102,108],[222.614,0.143,65,47],[222.792,0.143,67,47],[224.042,0.143,60,35],[224.221,0.143,58,35],[224.399,0.143,72,47],[224.578,0.143,70,47],[225.828,0.143,69,57],[226.006,0.143,70,57],[227.256,0.143,56,43],[227.435,0.143,55,43],[227.614,0.143,69,57],[227.792,0.143,67,57],[228.98,0.13,72,57],[229.143,0.13,74,57],[230.285,0.13,56,43],[230.447,0.13,58,43],[231.589,0.13,67,50],[231.752,0.13,65,50],[231.915,0.13,76,67],[232.078,0.13,77,67],[233.219,0.13,60,50],[233.382,0.13,62,50],[234.445,0.12,63,50],[234.595,0.12,62,50],[234.745,0.12,76,67],[234.895,0.12,74,67],[235.945,0.12,63,31],[235.945,0.12,65,42],[236.095,0.12,65,31],[236.095,0.12,67,42],[237.145,0.12,60,31],[237.295,0.12,58,31],[237.445,0.12,72,42],[237.595,0.12,70,42],[238.491,0.105,66,47],[239.083,0.105,71,47],[239.451,0.105,76,47],[239.785,0.36,78,52],[240.157,0.5,102,108],[246.002,0.04,99,43],[246.717,0.16,43,49],[246.717,0.03,99,22],[248.145,0.16,43,49],[248.145,0.03,99,22],[260.288,0.04,99,43],[261.002,0.16,48,49],[261.002,0.03,99,22],[262.431,0.16,48,49],[262.431,0.03,99,22],[266.36,0.25,61,40],[268.145,0.25,71,49],[274.574,0.04,99,43],[275.288,0.16,43,49],[275.288,0.03,99,22],[276.717,0.16,43,49],[276.717,0.03,99,22],[277.431,1.429,63,42],[288.86,0.04,99,43],[289.217,0.16,48,49],[289.217,0.03,99,22],[289.931,0.16,48,49],[289.931,0.03,99,22],[290.645,0.16,48,49],[290.645,0.03,99,22],[291.36,0.16,48,49],[291.36,0.03,99,22],[301.766,0.444,57,35],[303.155,0.444,53,35],[304.544,0.444,72,35],[305.933,0.444,74,35],[307.322,0.444,72,35],[308.155,6.333,65,16],[308.71,0.444,60,35],[310.099,0.444,53,35],[311.488,0.444,58,35],[311.488,0.055,50,8],[311.548,0.16,39,8],[312.322,0.055,50,11],[312.382,0.16,39,10],[312.599,0.444,74,10],[312.877,0.444,77,47],[313.155,0.055,50,13],[313.215,0.16,39,12],[313.215,0.14,51,7],[313.988,0.444,72,14],[313.988,0.055,50,15],[314.048,0.16,39,15],[314.048,0.14,51,9],[314.266,0.444,76,46],[314.822,0.055,50,18],[314.822,6.333,65,13],[314.882,0.16,39,17],[314.882,0.14,51,10],[315.377,0.444,60,18],[315.655,0.444,65,44],[315.655,0.03,99,8],[315.655,0.055,50,21],[315.715,0.16,39,20],[315.715,0.14,51,12],[316.488,0.03,99,9],[316.488,0.055,50,25],[316.548,0.16,39,23],[316.548,0.14,51,14],[316.766,0.444,57,23],[316.766,0.065,99,8],[317.044,0.444,60,41],[317.044,0.065,99,8],[317.322,0.03,99,11],[317.322,0.055,50,28],[317.382,0.16,39,27],[317.382,0.14,51,16],[318.155,0.444,58,29],[318.155,0.03,99,12],[318.155,0.055,50,32],[318.215,0.16,39,30],[318.215,0.14,51,18],[318.433,0.444,62,38],[318.433,0.065,99,10],[318.71,0.065,99,11],[318.988,0.03,99,13],[318.988,0.055,50,35],[319.048,0.16,39,33],[319.048,0.14,51,20],[319.544,0.444,77,34],[319.822,0.444,60,33],[319.822,0.03,99,14],[319.822,0.055,50,38],[319.882,0.16,39,36],[319.882,0.14,51,22],[320.099,0.065,99,12],[320.377,0.065,99,13],[320.655,0.03,99,16],[320.655,0.055,50,42],[320.715,0.16,39,39],[320.715,0.14,51,24],[320.933,0.444,76,39],[321.21,0.444,79,27],[321.488,0.03,99,17],[321.488,0.055,50,45],[321.488,6.333,72,15],[321.548,0.16,39,42],[321.548,0.14,51,25],[321.766,0.065,99,14],[322.044,0.065,99,15],[322.322,0.444,65,43],[322.322,0.03,99,18],[322.322,0.055,50,48],[322.382,0.16,39,45],[322.382,0.14,51,27],[322.599,0.444,69,12],[323.155,0.03,99,19],[323.155,0.055,50,50],[323.215,0.16,39,47],[323.215,0.14,51,28],[323.433,0.065,99,16],[323.71,0.444,57,28],[323.71,0.065,99,16],[323.988,0.03,99,19],[323.988,0.055,50,52],[324.048,0.16,39,49],[324.048,0.14,51,29],[324.822,0.03,99,20],[324.822,0.055,50,53],[324.882,0.16,39,50],[324.882,0.14,51,30],[325.099,0.444,62,29],[325.099,0.065,99,17],[325.377,0.065,99,17],[325.655,0.03,99,20],[325.655,0.055,50,53],[325.715,0.16,39,50],[325.715,0.14,51,30],[326.488,0.444,60,29],[326.488,0.03,99,20],[326.488,0.055,50,52],[326.548,0.16,39,49],[326.548,0.14,51,29],[326.766,0.065,99,16],[327.044,0.065,99,16],[327.322,0.03,99,19],[327.322,0.055,50,50],[327.382,0.16,39,47],[327.382,0.14,51,28],[327.599,0.444,76,10],[327.877,0.444,79,27],[328.155,0.03,99,18],[328.155,0.055,50,48],[328.215,0.16,39,45],[328.215,0.14,51,27],[328.433,0.065,99,15],[328.71,0.065,99,14],[328.988,0.444,65,16],[328.988,0.03,99,16],[328.988,0.055,50,44],[329.048,0.16,39,41],[329.048,0.14,51,25],[329.266,0.444,69,24],[329.822,0.75,81,18],[329.822,0.03,99,15],[329.822,0.055,50,39],[329.882,0.16,39,36],[329.882,0.14,51,22],[330.099,0.065,99,12],[330.377,0.444,60,22],[330.377,0.065,99,11],[330.655,0.444,65,18],[330.655,0.03,99,12],[330.655,0.055,50,33],[330.715,0.16,39,31],[330.715,0.14,51,18],[331.21,0.25,77,20],[331.488,0.03,99,10],[331.488,0.055,50,26],[331.548,0.16,39,24],[331.548,0.14,51,15],[331.766,0.444,62,26],[331.766,0.065,99,8],[332.044,0.444,65,12],[332.322,0.055,50,19],[332.382,0.16,39,17],[332.382,0.14,51,10],[333.155,0.444,60,26],[333.155,0.055,50,11],[333.215,0.16,39,9],[334.266,0.5,82,22],[334.544,0.444,79,26],[335.655,0.444,65,8],[335.933,0.444,69,25],[336.488,0.75,79,10],[337.044,0.444,57,14],[337.322,0.444,62,22],[338.155,0.75,74,15],[338.433,0.444,62,20],[338.71,0.444,65,16],[339.822,0.444,60,24],[339.822,0.5,77,20],[340.099,0.444,64,10],[341.21,0.444,79,26],[342.599,0.444,69,26],[343.988,0.444,65,17],[343.988,0.5,67,12],[344.544,0.065,99,8],[345.099,0.444,62,10],[345.377,0.444,65,15],[345.933,0.065,99,11],[346.21,0.065,99,12],[346.488,0.444,60,14],[346.766,0.444,64,12],[347.044,0.5,69,8],[347.599,0.065,99,14],[347.877,0.444,79,16],[347.877,0.065,99,15],[348.155,0.444,53,8],[348.155,1.5,69,12],[348.155,6.333,72,47],[349.266,0.444,69,18],[349.266,0.065,99,16],[349.544,0.065,99,16],[350.655,0.444,62,19],[350.933,0.065,99,17],[351.21,0.065,99,17],[352.044,0.444,65,18],[352.322,0.75,64,13],[352.599,0.065,99,16],[352.877,0.065,99,16],[353.433,0.444,64,17],[354.266,0.065,99,15],[354.544,0.444,79,8],[354.544,0.065,99,14],[354.822,0.444,53,13],[354.822,6.333,69,13],[355.933,0.444,69,10],[355.933,0.065,99,13],[356.21,0.444,72,12],[356.21,0.065,99,12],[357.322,0.444,65,12],[357.599,0.444,69,10],[357.599,0.065,99,11],[357.877,0.065,99,10],[358.71,0.444,65,13],[358.988,0.444,70,8],[359.266,0.065,99,8],[359.544,0.065,99,8],[360.099,0.444,64,14],[361.488,0.444,53,15],[362.877,0.444,72,15],[364.266,0.444,65,13],[365.655,0.444,70,23],[367.044,0.444,67,19],[368.433,0.444,57,16],[369.822,0.444,53,12],[371.21,0.444,72,12],[372.599,0.444,74,8],[375.822,4.071,60,8],[376.607,0.321,67,25],[378.366,0.7,64,12],[378.393,0.321,64,27],[379.839,0.204,60,15],[380.107,0.321,57,28],[381.964,0.321,64,28],[383.75,0.321,60,30],[384.393,4.071,60,12],[385.197,0.7,60,15],[385.464,0.321,53,31],[385.866,0.7,67,28],[387.322,0.321,60,51],[388.679,4.071,62,21],[389.107,0.321,59,53],[390.822,0.321,60,49],[391.625,0.7,64,45],[392.107,0.161,62,34],[392.964,3.931,67,50],[393.352,0.7,72,67],[393.723,0.31,79,41],[395.447,0.31,76,55],[395.809,0.035,117,10],[396.327,0.035,117,11],[396.844,0.197,72,31],[397.102,0.31,69,58],[397.102,3.931,64,45],[397.361,0.197,69,32],[398.895,0.31,76,58],[398.913,0.7,79,17],[399.559,0.7,74,33],[400.62,0.31,72,61],[400.982,0.035,117,13],[401.24,3.931,60,10],[401.499,0.035,117,12],[402.275,0.31,65,64],[402.275,0.197,69,36],[404.068,0.31,72,68],[405.378,3.931,59,20],[405.637,0.035,117,11],[405.792,0.31,71,72],[406.154,0.7,74,17],[406.154,0.035,117,15],[406.671,0.035,117,11],[406.801,0.7,83,32],[407.188,0.197,74,40],[407.447,0.31,72,66],[408.688,0.155,62,46],[409.516,3.8,64,18],[410.249,0.3,91,48],[410.766,0.035,117,10],[411.266,0.035,117,12],[411.766,0.035,117,7],[411.916,0.3,88,61],[412.266,0.7,88,11],[413.266,0.19,84,34],[413.516,0.3,81,64],[413.516,3.8,60,59],[413.766,0.19,81,36],[413.891,0.7,88,68],[415.249,0.3,88,64],[415.696,0.4,96,7],[415.766,0.035,117,11],[416.266,0.035,117,14],[416.766,0.035,117,8],[416.916,0.3,84,67],[417.516,3.8,57,50],[418.516,0.3,77,71],[418.516,0.19,81,40],[419.266,0.7,91,40],[419.696,0.4,93,12],[419.891,0.7,89,68],[419.926,0.52,95,8],[420.249,0.3,84,84],[420.766,0.035,117,13],[421.266,0.035,117,15],[421.516,3.8,55,13],[421.516,3.8,59,21],[421.766,0.035,117,9],[421.916,0.3,83,88],[423.266,0.19,86,49],[423.516,0.3,84,81],[424.716,0.15,74,57],[425.516,3.677,60,32],[425.516,0.027,117,22],[425.758,0.045,117,53],[426,0.027,117,40],[426.226,0.29,103,52],[426.242,0.045,117,64],[426.484,0.027,117,36],[426.726,0.045,117,41],[426.847,0.7,100,47],[426.968,0.027,117,12],[427.839,0.29,100,55],[429.145,0.184,96,31],[429.387,0.29,93,58],[429.387,3.677,57,42],[429.629,0.184,93,32],[430.355,0.027,117,14],[430.597,0.045,117,46],[430.839,0.027,117,40],[431.065,0.29,100,58],[431.081,0.045,117,72],[431.323,0.027,117,47],[431.565,0.045,117,61],[431.806,0.027,117,25],[432.048,0.045,117,13],[432.677,0.29,96,61],[433.258,3.677,53,48],[433.621,0.7,96,48],[434.226,0.29,89,55],[434.226,0.184,93,31],[435.435,0.045,117,36],[435.677,0.027,117,39],[435.903,0.29,96,58],[435.919,0.045,117,78],[436.161,0.027,117,53],[436.403,0.045,117,78],[436.645,0.027,117,38],[436.887,0.045,117,35],[437.129,3.677,55,42],[437.516,0.29,95,60],[438.823,0.184,96,34],[439.065,0.29,96,56],[439.306,0.218,64,79],[439.427,0.7,100,52],[441,0.03,99,61],[441,0.055,50,163],[441,3.8,69,18],[441,0.46,62,66],[441.06,0.16,39,137],[441.06,0.14,51,82],[441.4,0.3,66,8],[441.5,0.11,98,22],[441.5,0.095,54,25],[442,0.055,50,8],[442.75,0.23,64,67],[443,0.46,66,67],[443.5,0.46,64,67],[444,0.92,62,67],[445,3.8,66,12],[447.733,0.3,66,34],[448.4,0.3,62,34],[449,0.3,55,36],[449,3.8,62,21],[449.733,0.3,62,36],[449.75,0.7,62,10],[450,0.3,55,36],[450.375,0.7,69,18],[450.733,0.3,62,36],[451.375,0.7,67,18],[451.4,0.3,59,38],[452,0.3,55,38],[453,3.8,64,25],[454.75,0.23,69,91],[455,0.46,66,91],[455.5,0.46,64,91],[456,0.92,62,91],[457,3.8,69,15],[457,0.46,62,70],[460.4,0.3,66,33],[461,0.3,59,34],[461,3.8,66,8],[461.733,0.3,66,34],[461.75,0.7,66,9],[462.733,0.3,66,34],[462.75,0.7,69,9],[463.375,0.7,64,17],[463.4,0.3,62,36],[464,0.3,59,36],[464.733,0.3,66,36],[465,3.8,59,15],[467.25,0.276,55,29],[467.5,0.23,66,87],[467.75,0.23,64,87],[467.75,0.138,54,29],[468,0.92,62,87],[468,0.138,52,29],[468.25,0.552,50,29],[469,3.8,61,24],[469,0.46,64,146],[469.5,0.23,66,146],[472.4,0.3,66,54],[473,0.295,62,43],[473,3.738,66,19],[473.721,0.295,69,43],[473.738,0.7,62,11],[474.377,0.295,66,43],[474.721,0.7,66,11],[475.336,0.7,66,22],[475.361,0.295,66,46],[475.459,0.027,117,20],[475.705,0.045,117,52],[475.951,0.295,62,46],[475.951,0.027,117,41],[476.197,0.045,117,69],[476.443,0.027,117,39],[476.672,0.295,69,46],[476.688,0.045,117,46],[476.934,3.738,62,17],[476.934,0.027,117,16],[477.303,0.7,66,24],[479.885,0.905,59,120],[480.377,0.027,117,16],[480.623,0.045,117,51],[480.869,3.738,59,10],[480.869,0.453,62,133],[480.869,0.027,117,46],[481.115,0.045,117,80],[481.361,0.453,67,133],[481.361,0.027,117,48],[481.606,0.045,117,61],[481.852,0.226,69,133],[481.852,0.027,117,23],[482.098,0.226,71,133],[482.098,0.045,117,7],[483.082,0.272,55,41],[483.574,0.136,54,41],[483.82,0.136,52,41],[484.066,0.543,50,41],[484.803,0.295,57,59],[484.803,3.738,57,15],[485.295,0.027,117,12],[485.525,0.295,64,59],[485.541,0.7,64,16],[485.541,0.045,117,50],[485.787,0.027,117,47],[486.033,0.045,117,86],[486.18,0.295,61,59],[486.279,0.027,117,55],[486.525,0.7,73,16],[486.525,0.045,117,74],[486.771,0.295,62,54],[486.771,0.027,117,29],[487.016,0.045,117,18],[487.508,0.7,66,16],[487.754,0.295,62,54],[488.475,0.295,69,54],[488.738,3.677,62,18],[489.101,0.7,62,23],[489.125,0.29,66,45],[489.705,0.29,62,45],[490.068,0.7,66,23],[490.431,0.223,64,11],[490.431,0.045,117,34],[490.673,0.03,99,10],[490.673,0.055,50,27],[490.673,0.445,78,16],[490.673,0.027,117,37],[490.733,0.16,39,28],[490.733,0.14,51,17],[490.915,0.045,117,71],[491.157,0.445,76,30],[491.157,0.027,117,44],[491.399,0.045,117,53],[491.641,0.03,99,32],[491.641,0.055,50,85],[491.641,0.89,74,50],[491.641,0.027,117,16],[491.701,0.16,39,84],[491.701,0.14,51,50],[492.609,0.03,99,65],[492.609,0.055,50,173],[492.609,3.677,59,10],[492.609,0.445,66,66],[492.669,0.16,39,167],[492.669,0.14,51,100],[493.092,0.223,69,20],[493.576,0.03,99,72],[493.576,0.055,50,193],[493.636,0.16,39,177],[493.636,0.14,51,106],[493.964,0.29,62,35],[494.06,0.027,117,32],[494.302,0.7,69,13],[494.302,0.045,117,75],[494.544,0.29,59,54],[494.544,0.055,50,11],[494.544,0.027,117,43],[494.786,0.045,117,22],[494.907,0.7,76,12],[494.931,0.29,62,46],[495.27,0.203,47,63],[495.512,0.203,47,71],[495.754,0.534,59,11],[495.996,0.11,98,79],[495.996,0.095,54,89],[496.238,0.203,47,18],[496.48,3.677,55,55],[496.48,0.445,62,135],[496.48,0.027,117,37],[496.722,0.045,117,84],[496.964,0.11,98,26],[496.964,0.095,54,29],[496.964,0.445,67,36],[496.964,0.027,117,27],[497.189,0.29,62,13],[497.447,0.29,55,34],[497.447,0.03,99,68],[497.447,0.055,50,181],[497.507,0.16,39,187],[497.507,0.14,51,112],[497.81,0.7,69,20],[498.157,0.29,62,15],[498.415,0.203,43,20],[498.415,0.445,79,56],[498.415,0.027,117,39],[498.657,0.045,117,85],[498.899,0.11,98,23],[498.899,0.095,54,25],[498.899,0.223,78,155],[498.899,0.027,117,12],[499.141,0.203,43,34],[499.141,0.223,76,96],[499.77,0.29,59,11],[500.092,0.29,62,31],[500.109,0.045,117,61],[500.351,0.03,99,92],[500.351,0.055,50,246],[500.351,3.677,64,80],[500.351,0.445,64,13],[500.351,0.027,117,54],[500.411,0.16,39,223],[500.411,0.14,51,134],[500.834,0.223,66,171],[501.076,0.203,45,49],[501.076,0.223,69,95],[501.318,0.203,45,56],[501.56,0.045,117,18],[501.705,0.29,61,46],[501.802,0.11,98,112],[501.802,0.095,54,126],[501.802,0.027,117,58],[502.028,0.29,64,44],[502.044,0.045,117,39],[502.286,0.03,99,51],[502.286,0.055,50,135],[502.286,0.445,78,103],[502.346,0.16,39,162],[502.346,0.14,51,97],[502.77,0.445,76,113],[503.012,0.203,50,11],[503.012,0.267,64,35],[503.254,0.203,50,48],[503.254,0.027,117,52],[503.496,0.045,117,47],[503.641,0.29,66,23],[503.738,0.11,98,112],[503.738,0.095,54,126],[503.964,0.29,69,34],[504.222,0.055,50,13],[504.222,3.677,69,35],[504.222,0.445,62,9],[504.282,0.16,39,50],[504.282,0.14,51,30],[504.705,0.223,66,120],[504.705,0.027,117,40],[504.931,0.29,69,32],[504.947,0.045,117,41],[505.189,0.29,62,19],[505.189,0.203,50,24],[505.552,0.7,66,16],[505.673,0.11,98,68],[505.673,0.095,54,77],[505.915,0.223,64,22],[506.157,0.445,78,112],[506.157,0.027,117,40],[506.399,0.045,117,52],[506.641,0.445,76,38],[506.867,0.29,69,18],[507.125,0.03,99,10],[507.125,0.055,50,27],[507.609,0.027,117,29],[507.851,0.203,50,32],[507.851,0.045,117,68],[508.092,3.677,59,55],[508.092,0.445,66,143],[508.802,0.29,66,27],[508.818,0.7,66,8],[509.06,0.03,99,76],[509.06,0.055,50,203],[509.12,0.16,39,186],[509.12,0.14,51,112],[509.302,0.045,117,64],[509.423,0.7,69,17],[509.447,0.29,62,14],[509.544,0.027,117,42],[509.786,0.203,47,28],[510.028,0.203,47,49],[510.028,0.668,76,138],[510.27,0.401,64,12],[510.512,0.11,98,93],[510.512,0.095,54,105],[510.996,0.134,62,22],[510.996,0.027,117,23],[511.238,0.534,59,7],[511.238,0.045,117,80],[511.383,0.29,62,40],[511.48,0.027,117,35],[511.705,0.29,66,30],[511.722,0.03,99,61],[511.722,0.055,50,163],[511.782,0.16,39,168],[511.782,0.14,51,101],[511.964,0.29,55,8],[511.964,0.03,99,83],[511.964,0.055,50,221],[511.964,3.677,59,24],[511.964,3.677,62,14],[512.024,0.16,39,211],[512.024,0.14,51,126],[512.326,0.7,62,18],[512.447,0.445,67,114],[512.931,0.203,43,7],[512.931,0.223,69,157],[513.173,0.223,71,134],[513.173,0.045,117,46],[513.415,0.445,69,92],[513.415,0.027,117,52],[513.657,0.203,43,52],[513.657,0.045,117,72],[513.899,0.203,43,55],[513.899,0.027,117,17],[514.383,0.11,98,80],[514.383,0.095,54,89],[514.609,0.29,62,38],[514.625,0.7,79,10],[514.625,0.203,43,29],[514.867,0.29,55,43],[514.867,0.203,43,15],[515.351,0.11,98,116],[515.351,0.095,54,130],[515.576,0.29,62,41],[515.835,3.677,64,71],[516.076,0.045,117,53],[516.197,0.7,64,16],[516.222,0.29,61,31],[516.318,0.11,98,78],[516.318,0.095,54,88],[516.318,0.027,117,53],[516.56,0.045,117,92],[516.802,0.29,57,20],[516.802,0.027,117,49],[517.044,0.045,117,46],[517.286,0.11,98,32],[517.286,0.095,54,36],[517.528,0.223,69,170],[517.77,0.445,78,172],[518.254,0.095,54,7],[518.254,0.445,76,173],[518.738,0.89,74,173],[519.705,3.738,69,30],[519.705,0.453,62,121],[520.443,0.045,117,28],[520.689,0.027,117,30],[520.935,0.045,117,61],[521.181,0.027,117,41],[521.427,0.045,117,59],[521.673,0.027,117,30],[521.918,0.045,117,25],[522.394,0.295,69,40],[523.05,0.295,66,40],[523.64,0.295,59,42],[523.64,3.738,62,29],[524.361,0.295,66,42],[524.378,0.7,66,11],[525.345,0.295,66,42],[525.361,0.7,69,11],[525.361,0.045,117,23],[525.607,0.027,117,31],[525.853,0.045,117,68],[525.976,0.7,64,21],[526,0.295,62,44],[526.099,0.027,117,48],[526.345,0.045,117,73],[526.591,0.295,59,44],[526.591,0.136,50,32],[526.591,0.027,117,38],[526.837,0.543,47,32],[526.837,0.045,117,37],[527.574,3.738,59,58],[530.033,0.226,66,120],[530.279,0.226,64,120],[530.279,0.045,117,16],[530.525,0.905,62,120],[530.525,0.027,117,29],[530.771,0.045,117,69],[531.017,0.027,117,52],[531.263,0.045,117,83],[531.509,3.738,61,76],[531.509,0.453,64,132],[531.509,0.027,117,47],[531.755,0.045,117,52],[532,0.226,66,132],[532,0.027,117,13],[532.246,0.226,69,132],[534.853,0.295,66,47],[535.443,0.305,62,37],[535.443,3.864,66,51],[536.189,0.305,69,37],[536.867,0.305,66,37],[537.858,0.7,66,19],[537.884,0.305,66,40],[538.494,0.305,62,40],[539.24,0.305,69,40],[539.511,3.864,62,35],[539.892,0.7,66,21],[542.308,0.234,62,109],[542.562,0.936,59,109],[543.579,3.864,55,31],[543.579,0.468,62,120],[544.087,0.468,67,120],[544.596,0.234,69,120],[547.646,0.305,57,51],[547.646,4.068,66,55],[547.646,3.864,57,64],[548.392,0.305,64,51],[549.07,0.305,61,51],[549.68,0.305,62,47],[550.087,0.305,66,47],[550.697,0.305,62,47],[551.443,0.305,69,47],[554.996,0.193,74,33],[556.133,0.58,83,33],[557.042,0.773,79,33],[562.269,0.193,74,33],[563.405,0.58,83,33],[564.314,0.773,79,24],[568.86,0.58,59,16],[569.542,0.193,59,22],[569.769,0.773,59,22],[570.678,0.58,59,22],[571.36,0.193,59,22],[571.587,0.773,59,22],[572.496,0.58,59,22],[573.178,0.193,59,16],[573.405,0.773,59,16],[574.314,0.58,59,16],[574.996,0.193,59,16],[575.223,0.773,59,16],[576.133,0.58,59,16],[576.814,0.193,59,16],[577.042,0.773,59,24],[577.951,0.58,59,24],[578.633,0.193,59,24],[578.86,0.773,59,24],[579.769,0.58,59,24],[580.451,0.193,59,24],[580.678,0.773,59,24],[581.587,0.58,59,29],[582.269,0.193,59,29],[582.496,0.773,59,29],[584.087,0.193,74,48],[585.223,0.58,83,48],[586.133,0.773,79,45],[590.678,0.159,71,54],[592.437,4.385,64,24],[592.87,0.7,72,11],[592.899,0.346,76,23],[594.745,0.346,72,24],[595.61,0.035,117,9],[595.899,0.27,48,13],[595.899,0.055,50,15],[595.958,0.16,39,15],[595.958,0.14,51,9],[596.187,0.035,117,10],[596.36,0.346,76,10],[596.745,0.346,79,20],[596.764,0.219,72,11],[597.052,0.27,48,27],[597.052,0.03,83,10],[597.052,0.03,99,12],[597.052,0.055,50,31],[597.052,4.385,57,8],[597.072,0.31,42,14],[597.112,0.16,39,30],[597.112,0.14,51,18],[597.341,0.219,69,10],[598.206,0.346,69,23],[598.206,0.219,72,13],[598.206,0.27,48,40],[598.206,0.03,83,14],[598.206,0.03,99,17],[598.206,0.055,50,46],[598.226,0.31,42,20],[598.266,0.16,39,44],[598.266,0.14,51,26],[598.639,0.7,79,12],[599.36,0.27,48,44],[599.36,0.03,83,16],[599.36,0.03,99,18],[599.36,0.055,50,48],[599.38,0.31,42,22],[599.42,0.16,39,45],[599.42,0.14,51,27],[599.649,0.035,117,12],[599.822,0.346,72,13],[600.206,0.346,76,19],[600.226,0.035,117,8],[600.514,0.27,48,25],[600.514,0.03,83,9],[600.514,0.03,99,10],[600.514,0.055,50,27],[600.534,0.31,42,12],[600.574,0.16,39,24],[600.574,0.14,51,14],[601.668,0.346,65,27],[601.668,4.385,60,25],[602.101,0.277,48,14],[602.822,0.277,41,24],[603.11,0.035,117,12],[603.254,0.7,79,14],[603.283,0.346,69,28],[603.514,0.27,64,34],[603.514,0.03,83,12],[603.534,0.31,57,17],[603.687,0.277,40,27],[603.687,0.035,117,7],[603.976,0.277,41,35],[604.408,0.277,48,30],[604.552,0.07,98,17],[604.668,0.27,64,26],[604.668,0.03,83,9],[604.688,0.31,57,13],[604.822,0.346,72,23],[605.129,0.346,65,13],[605.129,0.277,41,16],[605.706,0.07,98,25],[606.283,4.385,59,29],[606.572,0.035,117,12],[606.745,0.346,71,28],[606.86,0.07,98,23],[606.976,0.27,64,31],[606.976,0.03,83,11],[606.995,0.31,57,16],[607.149,0.035,117,12],[607.437,0.219,71,12],[607.87,0.7,83,12],[608.014,0.07,98,15],[608.283,0.346,74,27],[608.302,0.219,74,15],[608.591,0.346,72,11],[609.976,0.173,62,20],[610.899,4.56,60,23],[611.779,0.36,79,27],[612.549,0.7,76,13],[612.979,0.36,79,27],[614.179,0.36,79,28],[615.379,0.36,79,28],[615.699,4.56,57,23],[616.579,0.36,76,30],[617.779,0.36,76,30],[618.399,0.228,69,18],[618.979,0.36,76,32],[618.999,0.7,74,8],[620.179,0.36,76,32],[620.499,4.56,53,9],[620.949,0.7,72,17],[624.099,0.228,69,20],[625.299,4.56,62,15],[627.399,0.7,83,10],[628.149,0.7,76,18],[629.859,0.18,67,24],[630.099,4.75,67,15],[630.599,0.375,76,24],[631.817,0.7,76,12],[631.849,0.375,76,24],[633.099,0.375,76,25],[634.349,0.375,76,25],[635.099,4.75,64,15],[635.599,0.375,72,27],[636.849,0.375,72,27],[638.099,0.375,72,28],[639.349,0.375,72,28],[640.099,4.75,60,9],[640.567,0.7,72,15],[640.599,0.375,69,30],[641.849,0.375,69,30],[643.099,0.375,69,31],[644.349,0.375,69,31],[645.099,4.75,59,13],[645.599,0.375,71,32],[646.849,0.375,71,32],[648.067,0.7,76,16],[648.099,0.375,76,30],[649.099,0.188,62,21],[651.035,0.383,79,22],[652.311,0.383,79,22],[653.13,0.7,76,11],[653.588,0.383,79,24],[654.865,0.383,79,24],[656.141,0.383,76,25],[657.418,0.383,76,25],[658.694,0.383,76,26],[659.971,0.383,76,23],[661.247,0.383,72,24],[662.067,0.7,79,12],[662.524,0.383,72,24],[663.801,0.383,72,25],[665.077,0.383,72,25],[666.354,0.383,74,26],[667.63,0.383,74,26],[668.907,0.383,79,24],[670.269,0.192,67,17],[690.35,0.196,62,16],[729.612,2.4,72,43]],[[1.1,0.27,64,34],[1.1,0.03,83,12],[1.12,0.31,57,17],[3.3,0.27,64,34],[3.3,0.03,83,12],[3.32,0.31,57,17],[5.5,0.27,64,34],[5.5,0.03,83,12],[5.52,0.31,57,17],[7.7,0.27,64,34],[7.7,0.03,83,12],[7.72,0.31,57,17],[9.9,0.27,64,34],[9.9,0.03,83,12],[9.92,0.31,57,17],[12.1,0.27,64,34],[12.1,0.03,83,12],[12.12,0.31,57,17],[14.3,0.27,64,34],[14.3,0.03,83,12],[14.32,0.31,57,17],[16.5,0.27,64,34],[16.5,0.03,83,12],[16.52,0.31,57,17],[18.7,0.27,64,34],[18.7,0.03,83,12],[18.72,0.31,57,17],[20.9,0.27,64,34],[20.9,0.03,83,12],[20.92,0.31,57,17],[23.1,0.27,64,34],[23.1,0.03,83,12],[23.12,0.31,57,17],[25.3,0.27,64,34],[25.3,0.03,83,12],[25.32,0.31,57,17],[27.5,0.27,64,34],[27.5,0.03,83,12],[27.52,0.31,57,17],[29.7,0.27,64,34],[29.7,0.03,83,12],[29.72,0.31,57,17],[31.9,0.27,64,34],[31.9,0.03,83,12],[31.92,0.31,57,17],[33.95,0.27,64,34],[33.95,0.03,83,12],[33.97,0.31,57,17],[34.425,0.427,79,169],[35.85,0.27,64,34],[35.85,0.03,83,12],[35.87,0.31,57,17],[37.75,0.27,64,34],[37.75,0.03,83,12],[37.77,0.31,57,17],[38.7,1.71,72,199],[39.65,0.27,64,34],[39.65,0.03,83,12],[39.67,0.31,57,17],[41.55,0.27,64,34],[41.55,0.03,83,12],[41.57,0.31,57,17],[43.24,0.27,64,34],[43.24,0.03,83,12],[43.26,0.31,57,17],[44.72,0.27,64,34],[44.72,0.03,83,12],[44.74,0.31,57,17],[45.09,0.333,74,199],[46.2,0.27,64,34],[46.2,0.03,83,12],[46.22,0.31,57,17],[47.68,0.27,64,34],[47.68,0.03,83,12],[47.7,0.31,57,17],[49.16,0.27,64,34],[49.16,0.03,83,12],[49.18,0.31,57,17],[50.46,0.252,76,199],[50.46,0.27,64,34],[50.46,0.03,83,12],[50.48,0.31,57,17],[51.58,0.27,64,34],[51.58,0.03,83,12],[51.6,0.31,57,17],[52.7,0.504,74,199],[52.7,0.27,64,34],[52.7,0.03,83,12],[52.72,0.31,57,17],[53.82,0.27,64,34],[53.82,0.03,83,12],[53.84,0.31,57,17],[54.94,0.27,64,34],[54.94,0.03,83,12],[54.96,0.31,57,17],[55.94,0.27,64,34],[55.94,0.03,83,12],[55.96,0.31,57,17],[56.38,0.594,76,199],[56.82,0.27,64,34],[56.82,0.03,83,12],[56.84,0.31,57,17],[57.7,0.27,64,34],[57.7,0.03,83,12],[57.72,0.31,57,17],[58.58,0.27,64,34],[58.58,0.03,83,12],[58.6,0.31,57,17],[59.46,0.27,64,34],[59.46,0.03,83,12],[59.48,0.31,57,17],[59.94,0.15,64,173],[60.34,0.27,64,34],[60.34,0.03,83,12],[60.36,0.31,57,17],[61.02,0.27,64,25],[61.02,0.03,83,9],[61.04,0.31,57,13],[61.14,0.27,64,21],[61.14,0.03,83,7],[61.16,0.31,57,11],[62.22,0.27,64,25],[62.22,0.03,83,9],[62.24,0.31,57,13],[63.42,0.27,64,25],[63.42,0.03,83,9],[63.44,0.31,57,13],[63.54,0.27,64,22],[63.54,0.03,83,8],[63.56,0.31,57,11],[64.62,0.27,64,25],[64.62,0.03,83,9],[64.64,0.31,57,13],[65.82,0.27,64,25],[65.82,0.03,83,9],[65.84,0.31,57,13],[65.94,0.27,64,24],[65.94,0.03,83,8],[65.96,0.31,57,12],[67.02,0.27,64,25],[67.02,0.03,83,9],[67.04,0.31,57,13],[68.22,0.27,64,25],[68.22,0.03,83,9],[68.24,0.31,57,13],[68.34,0.27,64,25],[68.34,0.03,83,9],[68.36,0.31,57,13],[69.42,0.27,64,25],[69.42,0.03,83,9],[69.44,0.31,57,13],[70.62,0.27,64,25],[70.62,0.03,83,9],[70.64,0.31,57,13],[70.74,0.27,64,26],[70.74,0.03,83,9],[70.76,0.31,57,13],[71.82,0.27,64,25],[71.82,0.03,83,9],[71.84,0.31,57,13],[73.02,0.27,64,25],[73.02,0.03,83,9],[73.04,0.31,57,13],[73.14,0.27,64,27],[73.14,0.03,83,10],[73.16,0.31,57,14],[74.22,0.27,64,25],[74.22,0.03,83,9],[74.24,0.31,57,13],[75.42,0.27,64,25],[75.42,0.03,83,9],[75.44,0.31,57,13],[75.54,0.27,64,29],[75.54,0.03,83,10],[75.56,0.31,57,14],[76.62,0.27,64,25],[76.62,0.03,83,9],[76.64,0.31,57,13],[77.82,0.27,64,25],[77.82,0.03,83,9],[77.84,0.31,57,13],[78.9,0.18,64,22],[79.02,0.27,64,25],[79.02,0.03,83,9],[79.04,0.31,57,13],[80.208,0.27,64,25],[80.208,0.03,83,9],[80.228,0.31,57,13],[80.326,0.27,64,24],[80.326,0.03,83,8],[80.346,0.31,57,12],[81.385,0.27,64,25],[81.385,0.03,83,9],[81.405,0.31,57,13],[82.561,0.27,64,25],[82.561,0.03,83,9],[82.581,0.31,57,13],[82.679,0.27,64,26],[82.679,0.03,83,9],[82.699,0.31,57,13],[83.149,0.224,76,17],[83.738,0.27,64,25],[83.738,0.03,83,9],[83.758,0.31,57,13],[84.914,0.27,64,25],[84.914,0.03,83,9],[84.934,0.31,57,13],[85.032,0.27,64,27],[85.032,0.03,83,10],[85.052,0.31,57,14],[86.091,0.27,64,25],[86.091,0.03,83,9],[86.111,0.31,57,13],[87.267,0.27,64,25],[87.267,0.03,83,9],[87.287,0.31,57,13],[87.385,0.27,64,29],[87.385,0.03,83,10],[87.405,0.31,57,14],[88.444,0.27,64,25],[88.444,0.03,83,9],[88.463,0.31,57,13],[88.738,0.224,76,13],[89.502,0.353,69,25],[89.62,0.27,64,25],[89.62,0.03,83,9],[89.64,0.31,57,13],[89.738,0.27,64,30],[89.738,0.03,83,11],[89.758,0.31,57,15],[90.208,0.353,65,25],[90.796,0.27,64,25],[90.796,0.03,83,9],[90.817,0.31,57,13],[91.071,0.353,72,25],[91.855,0.353,69,26],[91.973,0.27,64,25],[91.973,0.03,83,9],[91.993,0.31,57,13],[92.091,0.27,64,32],[92.091,0.03,83,11],[92.111,0.31,57,16],[92.561,0.353,65,26],[93.149,0.27,64,25],[93.149,0.03,83,9],[93.169,0.31,57,13],[93.424,0.353,72,26],[94.208,0.353,71,47],[94.326,0.27,64,25],[94.326,0.03,83,9],[94.346,0.31,57,13],[94.444,0.27,64,33],[94.444,0.03,83,11],[94.463,0.31,57,16],[94.914,0.353,67,47],[95.502,0.27,64,25],[95.502,0.03,83,9],[95.522,0.31,57,13],[95.777,0.353,74,47],[96.561,0.353,76,44],[96.679,0.27,64,25],[96.679,0.03,83,9],[96.699,0.31,57,13],[97.738,0.176,64,31],[97.855,0.27,64,25],[97.855,0.03,83,9],[97.875,0.31,57,13],[98.876,0.7,72,19],[99.02,0.07,98,19],[99.136,0.27,64,27],[99.136,0.03,83,10],[99.156,0.31,57,14],[100.174,0.07,98,19],[101.328,0.07,98,21],[101.444,0.27,64,29],[101.444,0.03,83,10],[101.463,0.31,57,14],[101.617,0.035,117,7],[101.905,0.219,76,11],[102.194,0.035,117,11],[102.482,0.07,98,21],[103.636,0.07,98,22],[103.751,0.27,64,30],[103.751,0.03,83,11],[103.771,0.31,57,15],[104.79,0.07,98,22],[105.799,0.7,74,16],[105.944,0.07,98,23],[106.059,0.27,64,32],[106.059,0.03,83,11],[106.079,0.31,57,16],[106.809,0.035,117,11],[107.097,0.07,98,23],[107.386,0.219,76,19],[107.386,0.035,117,12],[107.674,0.346,65,36],[107.963,0.219,72,20],[108.251,0.07,98,24],[108.367,0.27,64,34],[108.367,0.03,83,12],[108.387,0.31,57,17],[108.52,0.346,72,36],[109.29,0.346,69,36],[109.405,0.07,98,24],[109.982,0.346,65,38],[110.559,0.07,98,25],[110.674,0.27,64,35],[110.674,0.03,83,12],[110.694,0.31,57,18],[110.828,0.346,72,38],[111.597,0.346,69,27],[111.713,0.07,98,25],[112.001,0.035,117,13],[112.29,0.346,67,29],[112.578,0.035,117,11],[112.867,0.07,98,26],[112.982,0.27,64,37],[112.982,0.03,83,13],[113.002,0.31,57,19],[113.136,0.346,74,29],[113.444,0.219,71,16],[113.876,0.7,83,14],[113.905,0.346,71,29],[114.02,0.07,98,26],[114.597,0.346,72,27],[115.174,0.27,64,25],[115.174,0.03,83,9],[115.194,0.31,57,13],[115.444,0.346,79,27],[116.213,0.173,64,19],[116.328,0.27,64,25],[116.328,0.03,83,9],[116.348,0.31,57,13],[117.36,0.27,64,30],[117.36,0.03,83,10],[117.38,0.31,57,15],[119.178,0.27,64,30],[119.178,0.03,83,10],[119.198,0.31,57,15],[120.087,0.27,64,30],[120.087,0.03,83,10],[120.107,0.31,57,15],[121.905,0.27,64,30],[121.905,0.03,83,10],[121.925,0.31,57,15],[122.814,0.27,64,30],[122.814,0.03,83,10],[122.834,0.31,57,15],[124.632,0.27,64,30],[124.632,0.03,83,10],[124.652,0.31,57,15],[125.541,0.27,64,30],[125.541,0.03,83,10],[125.561,0.31,57,15],[127.36,0.27,64,30],[127.36,0.03,83,10],[127.38,0.31,57,15],[128.269,0.27,64,30],[128.269,0.03,83,10],[128.289,0.31,57,15],[130.087,0.27,64,30],[130.087,0.03,83,10],[130.107,0.31,57,15],[130.996,0.27,64,30],[130.996,0.03,83,10],[131.016,0.31,57,15],[132.814,0.27,64,30],[132.814,0.03,83,10],[132.834,0.31,57,15],[133.723,0.27,64,30],[133.723,0.03,83,10],[133.743,0.31,57,15],[135.542,0.27,64,30],[135.542,0.03,83,10],[135.561,0.31,57,15],[136.451,0.27,64,30],[136.451,0.03,83,10],[136.471,0.31,57,15],[138.269,0.27,64,30],[138.269,0.03,83,10],[138.289,0.31,57,15],[139.178,0.27,64,30],[139.178,0.03,83,10],[139.198,0.31,57,15],[139.632,0.191,76,10],[140.087,1.227,76,26],[140.996,0.27,64,30],[140.996,0.03,83,10],[141.016,0.31,57,15],[141.451,0.045,111,10],[141.678,0.191,74,10],[141.905,0.27,64,30],[141.905,0.03,83,10],[141.925,0.31,57,15],[142.132,0.045,111,15],[142.814,0.045,111,11],[143.723,0.27,64,30],[143.723,0.03,83,10],[143.743,0.31,57,15],[144.632,0.27,64,30],[144.632,0.03,83,10],[144.652,0.31,57,15],[145.087,0.409,76,31],[146.451,0.191,81,12],[146.451,0.27,64,30],[146.451,0.03,83,10],[146.471,0.31,57,15],[146.905,0.045,111,20],[147.36,0.27,64,30],[147.36,0.03,83,10],[147.38,0.31,57,15],[147.587,0.045,111,12],[148.269,1.227,71,31],[148.496,0.191,83,12],[149.178,0.27,64,30],[149.178,0.03,83,10],[149.198,0.31,57,15],[150.087,0.27,64,30],[150.087,0.03,83,10],[150.107,0.31,57,15],[151.678,0.045,111,11],[151.905,0.27,64,30],[151.905,0.03,83,10],[151.925,0.31,57,15],[152.36,0.045,111,21],[152.814,0.27,64,30],[152.814,0.03,83,10],[152.834,0.31,57,15],[153.269,0.409,79,33],[153.269,0.191,74,12],[154.632,0.27,64,30],[154.632,0.03,83,10],[154.652,0.31,57,15],[155.314,0.191,72,14],[155.542,0.27,64,30],[155.542,0.03,83,10],[155.561,0.31,57,15],[156.451,0.045,111,10],[157.132,0.045,111,15],[157.36,0.409,76,38],[157.36,0.27,64,30],[157.36,0.03,83,10],[157.38,0.31,57,15],[157.814,0.045,111,11],[158.269,0.27,64,30],[158.269,0.03,83,10],[158.289,0.31,57,15],[160.087,0.191,76,14],[160.087,0.27,64,30],[160.087,0.03,83,10],[160.107,0.31,57,15],[160.541,0.818,73,14],[160.996,0.27,64,30],[160.996,0.03,83,10],[161.016,0.31,57,15],[161.905,0.045,111,20],[162.132,0.191,57,17],[162.587,0.045,111,12],[162.814,0.27,64,30],[162.814,0.03,83,10],[162.834,0.31,57,15],[163.723,0.27,64,30],[163.723,0.03,83,10],[163.743,0.31,57,15],[164.632,1.227,73,17],[165.542,0.27,64,30],[165.542,0.03,83,10],[165.561,0.31,57,15],[166.451,0.27,64,30],[166.451,0.03,83,10],[166.471,0.31,57,15],[166.678,0.045,111,11],[166.905,0.191,60,20],[167.36,0.045,111,21],[168.269,0.27,64,30],[168.269,0.03,83,10],[168.289,0.31,57,15],[168.723,0.818,70,17],[168.951,0.191,69,20],[169.178,0.27,64,30],[169.178,0.03,83,10],[169.198,0.31,57,15],[170.996,0.27,64,30],[170.996,0.03,83,10],[171.016,0.31,57,15],[171.451,0.045,111,10],[171.905,0.27,64,30],[171.905,0.03,83,10],[171.925,0.31,57,15],[172.132,0.045,111,15],[172.814,1.227,73,16],[172.814,0.045,111,11],[173.723,0.191,57,18],[173.723,0.27,64,30],[173.723,0.03,83,10],[173.743,0.31,57,15],[174.632,0.27,64,30],[174.632,0.03,83,10],[174.652,0.31,57,15],[175.769,0.191,68,18],[176.451,0.27,64,30],[176.451,0.03,83,10],[176.471,0.31,57,15],[176.905,0.045,111,20],[177.36,0.27,64,30],[177.36,0.03,83,10],[177.38,0.31,57,15],[177.587,0.045,111,12],[177.814,0.409,73,16],[179.178,0.27,64,30],[179.178,0.03,83,10],[179.198,0.31,57,15],[180.087,0.27,64,30],[180.087,0.03,83,10],[180.107,0.31,57,15],[180.541,0.409,68,14],[180.541,0.191,71,15],[181.678,0.045,111,11],[181.905,0.27,64,30],[181.905,0.03,83,10],[181.925,0.31,57,15],[182.844,0.27,64,30],[182.844,0.03,83,10],[182.863,0.31,57,15],[184.779,0.27,64,30],[184.779,0.03,83,10],[184.799,0.31,57,15],[185.747,0.27,64,30],[185.747,0.03,83,10],[185.767,0.31,57,15],[187.682,0.27,64,30],[187.682,0.03,83,10],[187.702,0.31,57,15],[188.702,0.27,64,30],[188.702,0.03,83,10],[188.722,0.31,57,15],[190.845,0.27,64,30],[190.845,0.03,83,10],[190.865,0.31,57,15],[191.916,0.27,64,30],[191.916,0.03,83,10],[191.936,0.31,57,15],[192.988,1.607,60,28],[194.059,0.27,64,30],[194.059,0.03,83,10],[194.079,0.31,57,15],[195.13,0.27,64,30],[195.13,0.03,83,10],[195.15,0.31,57,15],[195.589,0.27,64,28],[195.589,0.03,83,10],[195.609,0.31,57,14],[195.984,0.158,67,11],[196.181,0.158,65,11],[196.379,0.158,76,15],[196.379,0.27,64,28],[196.379,0.03,83,10],[196.399,0.31,57,14],[196.576,0.158,77,15],[197.168,0.27,64,28],[197.168,0.03,83,10],[197.188,0.31,57,14],[197.958,0.158,60,11],[197.958,0.27,64,28],[197.958,0.03,83,10],[197.978,0.31,57,14],[198.155,0.158,62,11],[198.747,0.27,64,28],[198.747,0.03,83,10],[198.767,0.31,57,14],[199.537,0.158,63,11],[199.537,0.27,64,28],[199.537,0.03,83,10],[199.557,0.31,57,14],[199.734,0.158,62,11],[199.931,0.158,76,15],[200.129,0.158,74,15],[200.326,0.27,64,28],[200.326,0.03,83,10],[200.346,0.31,57,14],[201.116,0.27,64,28],[201.116,0.03,83,10],[201.136,0.31,57,14],[201.51,0.158,63,20],[201.51,0.158,65,27],[201.708,0.158,65,20],[201.708,0.158,67,27],[201.905,0.27,64,28],[201.905,0.03,83,10],[201.925,0.31,57,14],[202.695,0.27,64,28],[202.695,0.03,83,10],[202.715,0.31,57,14],[203.089,0.158,60,20],[203.287,0.158,58,20],[203.484,0.158,72,27],[203.484,0.27,64,28],[203.484,0.03,83,10],[203.504,0.31,57,14],[203.681,0.158,70,27],[204.274,0.27,64,28],[204.274,0.03,83,10],[204.293,0.31,57,14],[205.025,0.143,69,27],[205.025,0.27,64,28],[205.025,0.03,83,10],[205.045,0.31,57,14],[205.204,0.143,70,27],[205.74,0.27,64,28],[205.74,0.03,83,10],[205.76,0.31,57,14],[206.454,0.143,56,20],[206.454,0.27,64,28],[206.454,0.03,83,10],[206.474,0.31,57,14],[206.633,0.143,55,20],[206.811,0.143,69,27],[206.99,0.143,67,27],[207.168,0.27,64,28],[207.168,0.03,83,10],[207.188,0.31,57,14],[207.883,0.27,64,28],[207.883,0.03,83,10],[207.903,0.31,57,14],[208.24,0.143,72,23],[208.418,0.143,74,23],[208.597,0.27,64,28],[208.597,0.03,83,10],[208.617,0.31,57,14],[209.311,0.27,64,28],[209.311,0.03,83,10],[209.331,0.31,57,14],[209.668,0.143,56,17],[209.847,0.143,58,17],[210.025,0.27,64,28],[210.025,0.03,83,10],[210.045,0.31,57,14],[210.74,0.27,64,28],[210.74,0.03,83,10],[210.76,0.31,57,14],[211.097,0.143,67,17],[211.275,0.143,65,17],[211.454,0.143,76,23],[211.454,0.27,64,28],[211.454,0.03,83,10],[211.474,0.31,57,14],[211.633,0.143,77,23],[212.168,0.27,64,28],[212.168,0.03,83,10],[212.188,0.31,57,14],[212.883,0.143,60,17],[212.883,0.27,64,28],[212.883,0.03,83,10],[212.903,0.31,57,14],[213.061,0.143,62,25],[213.566,0.27,64,28],[213.566,0.03,83,10],[213.586,0.31,57,14],[214.218,0.13,63,25],[214.218,0.27,64,28],[214.218,0.03,83,10],[214.238,0.31,57,14],[214.381,0.13,62,25],[214.544,0.13,76,34],[214.707,0.13,74,34],[214.87,0.27,64,28],[214.87,0.03,83,10],[214.89,0.31,57,14],[215.522,0.27,64,28],[215.522,0.03,83,10],[215.542,0.31,57,14],[215.848,0.13,63,25],[215.848,0.13,65,34],[216.012,0.13,65,25],[216.012,0.13,67,34],[216.174,0.27,64,28],[216.174,0.03,83,10],[216.195,0.31,57,14],[216.827,0.27,64,28],[216.827,0.03,83,10],[216.847,0.31,57,14],[217.153,0.13,60,25],[217.316,0.13,58,25],[217.479,0.13,72,34],[217.479,0.27,64,28],[217.479,0.03,83,10],[217.499,0.31,57,14],[217.642,0.13,70,34],[218.131,0.27,64,28],[218.131,0.03,83,10],[218.151,0.31,57,14],[218.764,0.114,67,53],[218.783,0.27,64,28],[218.783,0.03,83,10],[218.803,0.31,57,14],[219.359,0.114,72,53],[219.435,0.27,64,28],[219.435,0.03,83,10],[219.455,0.31,57,14],[220.022,0.391,80,59],[220.088,0.27,64,28],[220.088,0.03,83,10],[220.107,0.31,57,14],[220.438,0.5,102,108],[220.74,0.27,64,28],[220.74,0.03,83,10],[220.76,0.31,57,14],[221.392,0.27,64,28],[221.392,0.03,83,10],[221.412,0.31,57,14],[222.044,0.27,64,28],[222.044,0.03,83,10],[222.064,0.31,57,14],[222.971,0.143,69,47],[222.971,0.27,64,28],[222.971,0.03,83,10],[222.991,0.31,57,14],[223.149,0.143,70,47],[223.685,0.27,64,28],[223.685,0.03,83,10],[223.705,0.31,57,14],[224.399,0.143,56,35],[224.399,0.27,64,28],[224.399,0.03,83,10],[224.419,0.31,57,14],[224.578,0.143,55,35],[224.756,0.143,69,47],[224.935,0.143,67,47],[225.114,0.27,64,28],[225.114,0.03,83,10],[225.134,0.31,57,14],[225.828,0.27,64,28],[225.828,0.03,83,10],[225.848,0.31,57,14],[226.185,0.143,72,57],[226.364,0.143,74,57],[226.542,0.27,64,28],[226.542,0.03,83,10],[226.562,0.31,57,14],[227.257,0.27,64,28],[227.257,0.03,83,10],[227.277,0.31,57,14],[227.614,0.143,56,43],[227.792,0.143,58,43],[227.971,0.27,64,28],[227.971,0.03,83,10],[227.991,0.31,57,14],[228.654,0.27,64,28],[228.654,0.03,83,10],[228.674,0.31,57,14],[228.98,0.13,67,43],[229.143,0.13,65,43],[229.306,0.13,76,57],[229.306,0.27,64,28],[229.306,0.03,83,10],[229.326,0.31,57,14],[229.469,0.13,77,57],[229.958,0.27,64,28],[229.958,0.03,83,10],[229.978,0.31,57,14],[230.611,0.13,60,43],[230.611,0.27,64,28],[230.611,0.03,83,10],[230.631,0.31,57,14],[230.774,0.13,62,50],[231.263,0.27,64,28],[231.263,0.03,83,10],[231.283,0.31,57,14],[231.915,0.13,63,50],[231.915,0.27,64,28],[231.915,0.03,83,10],[231.935,0.31,57,14],[232.078,0.13,62,50],[232.241,0.13,76,67],[232.404,0.13,74,67],[232.567,0.27,64,28],[232.567,0.03,83,10],[232.587,0.31,57,14],[233.219,0.27,64,28],[233.219,0.03,83,10],[233.239,0.31,57,14],[233.545,0.13,63,50],[233.545,0.12,65,67],[233.695,0.12,67,67],[233.708,0.13,65,50],[233.845,0.27,64,28],[233.845,0.03,83,10],[233.865,0.31,57,14],[234.445,0.27,64,28],[234.445,0.03,83,10],[234.465,0.31,57,14],[234.745,0.12,60,50],[234.895,0.12,58,50],[235.045,0.12,72,67],[235.045,0.27,64,28],[235.045,0.03,83,10],[235.065,0.31,57,14],[235.195,0.12,70,67],[235.645,0.27,64,28],[235.645,0.03,83,10],[235.665,0.31,57,14],[236.245,0.12,69,42],[236.245,0.27,64,28],[236.245,0.03,83,10],[236.265,0.31,57,14],[236.395,0.12,70,42],[236.845,0.27,64,28],[236.845,0.03,83,10],[236.865,0.31,57,14],[237.445,0.12,56,31],[237.445,0.27,64,28],[237.445,0.03,83,10],[237.465,0.31,57,14],[237.595,0.12,55,31],[237.745,0.12,69,42],[237.895,0.12,67,42],[238.045,0.27,64,28],[238.045,0.03,83,10],[238.065,0.31,57,14],[238.627,0.105,67,47],[238.645,0.27,64,28],[238.645,0.03,83,10],[238.665,0.31,57,14],[239.175,0.105,72,47],[239.245,0.27,64,28],[239.245,0.03,83,10],[239.265,0.31,57,14],[239.785,0.36,80,52],[239.845,0.27,64,28],[239.845,0.03,83,10],[239.865,0.31,57,14],[240.169,0.5,102,108],[240.445,0.27,64,28],[240.445,0.03,83,10],[240.465,0.31,57,14],[241.045,0.27,64,28],[241.045,0.03,83,10],[241.065,0.31,57,14],[241.645,0.27,64,28],[241.645,0.03,83,10],[241.665,0.31,57,14],[242.245,0.27,64,28],[242.245,0.03,83,10],[242.265,0.31,57,14],[242.845,0.27,64,28],[242.845,0.03,83,10],[242.865,0.31,57,14],[248.86,0.04,99,43],[249.574,0.16,48,49],[249.574,0.03,99,22],[251.002,0.16,48,49],[251.002,0.03,99,22],[263.145,0.04,99,43],[263.86,0.16,43,49],[263.86,0.03,99,22],[265.288,0.16,43,49],[265.288,0.03,99,22],[266.717,0.25,63,31],[268.502,0.25,73,38],[277.431,1.429,67,42],[278.145,0.27,64,22],[278.145,0.03,83,8],[278.165,0.31,57,11],[279.574,0.27,64,22],[279.574,0.03,83,8],[279.594,0.31,57,11],[281.002,0.27,64,22],[281.002,0.03,83,8],[281.022,0.31,57,11],[282.431,0.27,64,22],[282.431,0.03,83,8],[282.451,0.31,57,11],[283.86,0.27,64,22],[283.86,0.03,83,8],[283.88,0.31,57,11],[285.288,0.27,64,22],[285.288,0.03,83,8],[285.308,0.31,57,11],[286.717,0.27,64,22],[286.717,0.03,83,8],[286.737,0.31,57,11],[288.145,0.27,64,22],[288.145,0.03,83,8],[288.165,0.31,57,11],[289.574,0.27,64,22],[289.574,0.03,83,8],[289.594,0.31,57,11],[291.002,0.27,64,22],[291.002,0.03,83,8],[291.022,0.31,57,11],[291.717,0.04,99,43],[292.074,0.16,43,49],[292.074,0.03,99,22],[292.431,0.27,64,22],[292.431,0.03,83,8],[292.451,0.31,57,11],[292.788,0.16,43,49],[292.788,0.03,99,22],[293.502,0.16,43,49],[293.502,0.03,99,22],[293.86,0.27,64,22],[293.86,0.03,83,8],[293.88,0.31,57,11],[294.217,0.16,43,49],[294.217,0.03,99,22],[295.288,0.27,64,22],[295.288,0.03,83,8],[295.308,0.31,57,11],[296.717,0.27,64,22],[296.717,0.03,83,8],[296.737,0.31,57,11],[298.145,0.27,64,22],[298.145,0.03,83,8],[298.165,0.31,57,11],[299.574,0.27,64,22],[299.574,0.03,83,8],[299.594,0.31,57,11],[301.002,0.27,64,22],[301.002,0.03,83,8],[301.022,0.31,57,11],[301.488,6.333,69,17],[302.044,0.444,60,35],[302.599,0.065,99,17],[302.877,0.065,99,17],[303.433,0.444,57,35],[304.266,0.065,99,17],[304.544,0.065,99,17],[304.822,0.444,58,35],[305.933,0.065,99,17],[306.21,0.444,77,35],[306.21,0.065,99,17],[307.599,0.444,76,35],[307.599,0.065,99,17],[307.877,0.065,99,17],[308.155,6.333,69,15],[308.988,0.444,65,35],[309.266,0.065,99,17],[309.544,0.065,99,17],[310.377,0.444,57,35],[310.933,0.065,99,16],[311.21,0.065,99,16],[311.766,0.444,62,35],[312.599,0.065,99,16],[312.877,0.444,77,11],[312.877,0.065,99,16],[313.155,0.444,60,47],[314.266,0.444,76,15],[314.266,0.065,99,16],[314.544,0.444,79,45],[314.544,0.065,99,16],[314.822,6.333,65,11],[315.655,0.444,65,19],[315.933,0.444,69,44],[315.933,0.065,99,15],[316.21,0.065,99,15],[317.044,0.444,60,24],[317.322,0.444,65,41],[317.599,0.065,99,14],[317.877,0.065,99,14],[318.433,0.444,62,30],[318.71,0.444,65,37],[319.266,0.065,99,12],[319.544,0.065,99,12],[319.822,0.444,60,35],[320.099,0.444,64,32],[320.933,0.065,99,10],[321.21,0.444,79,40],[321.21,0.065,99,9],[321.488,0.444,53,25],[321.488,6.333,65,13],[322.599,0.444,69,27],[322.877,0.444,72,11],[323.988,0.444,62,29],[325.377,0.444,65,29],[326.488,0.055,50,9],[326.548,0.16,39,9],[326.766,0.444,64,29],[327.322,0.055,50,16],[327.382,0.16,39,15],[327.382,0.14,51,9],[327.877,0.444,79,11],[328.155,0.444,53,27],[328.155,0.03,99,9],[328.155,0.055,50,23],[328.155,6.333,72,10],[328.215,0.16,39,22],[328.215,0.14,51,13],[328.433,0.065,99,8],[328.71,0.065,99,9],[328.988,0.03,99,11],[328.988,0.055,50,30],[329.048,0.16,39,28],[329.048,0.14,51,17],[329.266,0.444,69,18],[329.544,0.444,72,23],[329.822,0.75,81,16],[329.822,0.03,99,13],[329.822,0.055,50,36],[329.882,0.16,39,34],[329.882,0.14,51,20],[330.099,0.065,99,12],[330.377,0.065,99,12],[330.655,0.444,65,23],[330.655,0.03,99,15],[330.655,0.055,50,41],[330.715,0.16,39,39],[330.715,0.14,51,23],[330.933,0.444,69,17],[331.488,0.75,76,12],[331.488,0.03,99,17],[331.488,0.055,50,46],[331.548,0.16,39,43],[331.548,0.14,51,26],[331.766,0.065,99,15],[332.044,0.444,65,27],[332.044,0.065,99,15],[332.322,0.444,70,10],[332.322,0.03,99,19],[332.322,0.055,50,49],[332.382,0.16,39,47],[332.382,0.14,51,28],[333.155,0.5,79,21],[333.155,0.03,99,19],[333.155,0.055,50,52],[333.215,0.16,39,49],[333.215,0.14,51,29],[333.433,0.444,64,26],[333.433,0.065,99,16],[333.71,0.065,99,17],[333.988,0.03,99,20],[333.988,0.055,50,53],[334.048,0.16,39,50],[334.048,0.14,51,30],[334.822,0.444,53,26],[334.822,0.03,99,20],[334.822,0.055,50,53],[334.822,6.333,69,11],[334.882,0.16,39,49],[334.882,0.14,51,30],[335.099,0.065,99,16],[335.377,0.065,99,16],[335.655,0.03,99,19],[335.655,0.055,50,51],[335.715,0.16,39,47],[335.715,0.14,51,28],[335.933,0.444,69,9],[336.21,0.444,72,24],[336.488,0.03,99,18],[336.488,0.055,50,48],[336.548,0.16,39,44],[336.548,0.14,51,27],[336.766,0.065,99,15],[337.044,0.065,99,14],[337.322,0.444,62,15],[337.322,0.5,77,18],[337.322,0.03,99,16],[337.322,0.055,50,43],[337.382,0.16,39,40],[337.382,0.14,51,24],[337.599,0.444,65,21],[338.155,0.75,74,15],[338.155,0.03,99,14],[338.155,0.055,50,37],[338.215,0.16,39,35],[338.215,0.14,51,21],[338.433,0.065,99,11],[338.71,0.444,65,21],[338.71,0.065,99,10],[338.988,0.444,70,15],[338.988,0.03,99,11],[338.988,0.055,50,31],[339.048,0.16,39,28],[339.048,0.14,51,17],[339.822,0.03,99,9],[339.822,0.055,50,23],[339.882,0.16,39,21],[339.882,0.14,51,13],[340.099,0.444,64,24],[340.377,0.444,67,9],[340.377,0.5,79,7],[340.655,0.055,50,15],[340.715,0.16,39,13],[340.715,0.14,51,8],[341.488,0.444,53,26],[341.488,1.5,77,22],[342.877,0.444,72,26],[344.266,0.444,69,17],[345.377,0.444,65,11],[345.655,0.444,70,14],[345.655,0.75,65,10],[346.766,0.444,64,14],[347.044,0.444,67,11],[347.044,0.5,69,11],[348.155,0.444,53,17],[348.155,6.333,65,20],[349.544,0.444,72,18],[350.933,0.444,65,19],[351.21,0.25,64,13],[352.322,0.444,70,18],[353.71,0.444,67,17],[354.266,0.5,64,10],[354.266,0.065,99,8],[354.544,0.065,99,8],[354.822,0.444,53,8],[354.822,6.333,72,15],[355.099,0.444,57,13],[355.933,0.065,99,11],[356.21,0.444,72,10],[356.21,0.065,99,11],[356.488,0.444,53,11],[357.599,0.444,69,12],[357.599,0.065,99,13],[357.877,0.444,72,10],[357.877,0.065,99,13],[358.988,0.444,70,13],[359.266,0.444,74,8],[359.266,0.065,99,14],[359.544,0.065,99,15],[360.377,0.444,67,14],[360.933,0.065,99,15],[361.21,0.065,99,15],[361.766,0.444,57,15],[362.599,0.065,99,16],[362.877,0.065,99,16],[363.155,0.444,50,13],[364.266,0.065,99,16],[364.544,0.444,69,27],[364.544,0.065,99,16],[365.933,0.444,74,23],[365.933,0.065,99,17],[366.21,0.065,99,17],[367.322,0.444,72,19],[367.599,0.065,99,17],[367.877,0.065,99,17],[368.71,0.444,60,16],[369.266,0.065,99,17],[369.544,0.065,99,17],[370.099,0.444,57,12],[370.933,0.065,99,17],[371.21,0.065,99,17],[371.488,0.444,58,8],[372.599,0.065,99,17],[372.877,0.444,77,8],[372.877,0.065,99,17],[374.266,0.065,99,17],[374.544,0.065,99,17],[376.357,0.27,64,25],[376.357,0.03,83,9],[376.377,0.31,57,13],[376.464,0.27,64,27],[376.464,0.03,83,10],[376.484,0.31,57,14],[376.893,0.321,60,25],[377.429,0.27,64,25],[377.429,0.03,83,9],[377.449,0.31,57,13],[378.5,0.27,64,25],[378.5,0.03,83,9],[378.52,0.31,57,13],[378.607,0.27,64,29],[378.607,0.03,83,10],[378.627,0.31,57,14],[378.75,0.321,67,27],[379.036,0.204,64,15],[379.572,0.27,64,25],[379.572,0.03,83,9],[379.591,0.31,57,13],[380.107,4.071,57,9],[380.509,0.7,64,13],[380.536,0.321,60,28],[380.643,0.27,64,25],[380.643,0.03,83,9],[380.663,0.31,57,13],[380.75,0.27,64,30],[380.75,0.03,83,11],[380.77,0.31,57,15],[381.714,0.27,64,25],[381.714,0.03,83,9],[381.734,0.31,57,13],[382.25,0.321,57,30],[382.786,0.27,64,25],[382.786,0.03,83,9],[382.806,0.31,57,13],[382.893,0.27,64,32],[382.893,0.03,83,11],[382.913,0.31,57,16],[383.857,0.27,64,25],[383.857,0.03,83,9],[383.877,0.31,57,13],[384.107,0.321,64,30],[384.125,0.204,64,17],[384.393,4.071,53,21],[384.929,0.27,64,25],[384.929,0.03,83,9],[384.949,0.31,57,13],[385.036,0.27,64,34],[385.036,0.03,83,12],[385.056,0.31,57,17],[385.893,0.321,57,48],[386,0.27,64,25],[386,0.03,83,9],[386.02,0.31,57,13],[386.268,0.7,67,15],[386.938,0.7,65,28],[387.072,0.27,64,25],[387.072,0.03,83,9],[387.091,0.31,57,13],[387.179,0.27,64,35],[387.179,0.03,83,12],[387.199,0.31,57,18],[387.607,0.321,53,51],[388.143,0.27,64,25],[388.143,0.03,83,9],[388.163,0.31,57,13],[388.679,4.071,55,19],[389.214,0.27,64,25],[389.214,0.03,83,9],[389.234,0.31,57,13],[389.322,0.27,64,37],[389.322,0.03,83,13],[389.341,0.31,57,19],[389.464,0.321,62,53],[390.286,0.27,64,25],[390.286,0.03,83,9],[390.306,0.31,57,13],[391.25,0.321,64,49],[391.357,0.27,64,25],[391.357,0.03,83,9],[391.377,0.31,57,13],[392.322,0.161,64,34],[392.429,0.27,64,25],[392.429,0.03,83,9],[392.449,0.31,57,13],[392.964,3.931,60,20],[393.482,0.07,98,21],[393.585,0.27,64,29],[393.585,0.03,83,10],[393.605,0.31,57,14],[393.74,0.7,72,35],[393.999,0.31,72,41],[394.387,0.7,76,67],[394.516,0.07,98,21],[395.551,0.07,98,22],[395.654,0.27,64,30],[395.654,0.03,83,11],[395.674,0.31,57,15],[395.792,0.31,79,55],[396.068,0.197,76,31],[396.585,0.07,98,22],[396.844,0.035,117,10],[397.102,3.931,64,35],[397.361,0.035,117,12],[397.516,0.31,72,58],[397.62,0.07,98,23],[397.723,0.27,64,32],[397.723,0.03,83,11],[397.743,0.31,57,16],[398.654,0.07,98,23],[399.171,0.31,69,61],[399.688,0.07,98,24],[399.792,0.27,64,34],[399.792,0.03,83,12],[399.812,0.31,57,17],[399.947,0.7,74,17],[400.723,0.07,98,24],[400.964,0.31,76,61],[400.982,0.197,76,34],[401.24,3.931,60,26],[401.499,0.197,72,36],[401.628,0.7,72,36],[401.757,0.07,98,25],[401.861,0.27,64,36],[401.861,0.03,83,13],[401.881,0.31,57,18],[402.016,0.035,117,14],[402.533,0.035,117,12],[402.688,0.31,69,64],[402.792,0.07,98,25],[403.827,0.07,98,27],[403.93,0.27,64,37],[403.93,0.03,83,13],[403.95,0.31,57,19],[404.344,0.31,65,68],[404.861,0.07,98,27],[405.378,3.931,62,30],[405.895,0.07,98,28],[405.999,0.27,64,39],[405.999,0.03,83,14],[406.019,0.31,57,19],[406.137,0.31,74,72],[406.413,0.197,71,40],[406.671,0.035,117,11],[406.93,0.07,98,28],[407.188,0.7,83,17],[407.188,0.035,117,15],[407.835,0.7,76,32],[407.861,0.31,76,66],[407.964,0.27,64,25],[407.964,0.03,83,9],[407.984,0.31,57,13],[408.895,0.155,64,46],[408.999,0.27,64,25],[408.999,0.03,83,9],[409.019,0.31,57,13],[409.516,3.8,67,14],[410.016,0.07,98,22],[410.116,0.27,64,30],[410.116,0.03,83,11],[410.136,0.31,57,15],[410.516,0.3,84,48],[411.016,0.07,98,22],[411.696,0.4,100,8],[411.766,0.035,117,10],[412.016,0.07,98,23],[412.116,0.27,64,32],[412.116,0.03,83,11],[412.136,0.31,57,16],[412.249,0.3,91,61],[412.266,0.035,117,12],[412.516,0.19,88,34],[412.766,0.035,117,7],[413.016,0.07,98,23],[413.516,3.8,60,12],[413.516,3.8,64,19],[413.916,0.3,84,64],[414.016,0.07,98,24],[414.116,0.27,64,34],[414.116,0.03,83,12],[414.136,0.31,57,17],[414.266,0.7,88,36],[414.891,0.7,91,68],[415.016,0.07,98,24],[415.516,0.3,81,67],[415.696,0.4,96,8],[416.016,0.07,98,25],[416.116,0.27,64,36],[416.116,0.03,83,13],[416.136,0.31,57,18],[416.766,0.035,117,11],[416.891,0.27,64,31],[416.891,0.03,83,11],[416.911,0.31,57,15],[417.016,0.07,98,25],[417.249,0.3,88,67],[417.266,0.19,88,38],[417.266,0.035,117,14],[417.516,3.8,57,44],[417.766,0.19,84,40],[417.766,0.035,117,8],[418.016,0.07,98,27],[418.116,0.27,64,38],[418.116,0.03,83,13],[418.136,0.31,57,19],[418.916,0.3,81,71],[419.016,0.07,98,27],[420.016,0.07,98,28],[420.116,0.27,64,39],[420.116,0.03,83,14],[420.136,0.31,57,20],[420.266,0.7,89,36],[420.516,0.3,77,84],[421.016,0.07,98,28],[421.516,3.8,59,63],[421.766,0.035,117,13],[421.891,0.7,86,75],[422.016,0.07,98,29],[422.116,0.27,64,41],[422.116,0.03,83,14],[422.136,0.31,57,21],[422.249,0.3,86,88],[422.266,0.035,117,16],[422.516,0.19,83,49],[422.766,0.035,117,9],[423.016,0.07,98,29],[423.916,0.3,88,81],[424.016,0.27,64,25],[424.016,0.03,83,9],[424.036,0.31,57,13],[424.916,0.15,76,57],[425.016,0.27,64,25],[425.016,0.03,83,9],[425.036,0.31,57,13],[425.516,3.677,64,48],[426,0.07,98,22],[426.097,0.27,64,30],[426.097,0.03,83,11],[426.117,0.31,57,15],[426.242,0.045,117,9],[426.484,0.29,96,52],[426.484,0.027,117,20],[426.726,0.045,117,51],[426.968,0.07,98,22],[426.968,0.027,117,39],[427.21,0.045,117,65],[427.452,0.027,117,39],[427.693,0.045,117,46],[427.815,0.7,100,47],[427.935,0.07,98,23],[427.935,0.027,117,15],[428.032,0.27,64,32],[428.032,0.03,83,11],[428.052,0.31,57,16],[428.161,0.29,103,55],[428.419,0.184,96,31],[428.903,0.07,98,23],[429.387,3.677,60,34],[429.774,0.29,96,58],[429.871,0.07,98,24],[429.968,0.27,64,34],[429.968,0.03,83,12],[429.988,0.31,57,17],[430.839,0.07,98,24],[431.323,0.29,93,61],[431.323,0.027,117,12],[431.565,0.045,117,46],[431.806,0.07,98,25],[431.806,0.027,117,41],[431.903,0.27,64,36],[431.903,0.03,83,13],[431.923,0.31,57,18],[432.048,0.045,117,75],[432.29,0.027,117,47],[432.532,0.045,117,64],[432.653,0.27,64,31],[432.653,0.03,83,11],[432.673,0.31,57,15],[432.774,0.07,98,25],[432.774,0.027,117,27],[433,0.29,100,61],[433.016,0.184,96,34],[433.016,0.045,117,17],[433.258,3.677,53,8],[433.258,3.677,57,17],[433.5,0.184,96,36],[433.742,0.07,98,27],[433.839,0.27,64,38],[433.839,0.03,83,13],[433.859,0.31,57,19],[434.589,0.7,103,48],[434.613,0.29,93,55],[434.71,0.07,98,27],[435.368,0.4,105,7],[435.677,0.07,98,28],[435.774,0.27,64,39],[435.774,0.03,83,14],[435.794,0.31,57,20],[436.161,0.29,89,58],[436.403,0.045,117,32],[436.645,0.07,98,28],[436.645,0.027,117,37],[436.887,0.045,117,77],[437.129,3.677,55,34],[437.129,0.027,117,56],[437.371,0.045,117,83],[437.613,0.07,98,29],[437.613,0.027,117,42],[437.71,0.27,64,41],[437.71,0.03,83,14],[437.73,0.31,57,21],[437.839,0.29,98,60],[437.855,0.045,117,40],[438.097,0.184,95,34],[438.581,0.07,98,29],[439.239,0.4,106,7],[439.452,0.29,100,56],[439.548,0.218,66,79],[439.548,0.27,64,25],[439.548,0.03,83,9],[439.568,0.31,57,13],[440.516,0.27,64,25],[440.516,0.03,83,9],[440.536,0.31,57,13],[441,3.8,62,9],[441.375,0.7,62,14],[441.4,0.3,66,28],[441.5,0.11,98,79],[441.5,0.095,54,89],[442,0.3,62,29],[442.375,0.7,66,15],[442.5,0.11,98,82],[442.5,0.095,54,92],[443.5,0.11,98,87],[443.5,0.095,54,98],[444.5,0.11,98,87],[444.5,0.095,54,98],[445,3.8,59,20],[445,0.46,66,75],[445.5,0.11,98,92],[445.5,0.095,54,103],[445.5,0.23,69,75],[445.75,0.23,71,75],[446,0.46,69,75],[446.5,0.11,98,92],[446.5,0.095,54,103],[446.5,0.46,66,75],[447,0.69,64,75],[447.5,0.11,98,97],[447.5,0.095,54,109],[448.5,0.11,98,97],[448.5,0.095,54,109],[449,3.8,55,18],[449.5,0.11,98,102],[449.5,0.095,54,114],[450.4,0.3,59,36],[450.5,0.11,98,102],[450.5,0.095,54,114],[450.75,0.7,69,10],[451,0.3,55,38],[451.5,0.11,98,107],[451.5,0.095,54,120],[451.733,0.3,62,38],[451.75,0.7,67,10],[452.5,0.11,98,107],[452.5,0.095,54,120],[452.733,0.3,62,38],[453,3.8,57,10],[453.375,0.7,64,20],[453.4,0.3,61,40],[453.5,0.11,98,112],[453.5,0.095,54,125],[454,0.3,57,40],[454.375,0.7,73,20],[454.5,0.11,98,112],[454.5,0.095,54,125],[454.733,0.3,64,40],[455.5,0.11,98,103],[455.5,0.095,54,116],[456.5,0.11,98,103],[456.5,0.095,54,116],[457,3.8,69,12],[457.5,0.11,98,86],[457.5,0.095,54,97],[457.5,0.23,66,70],[457.75,0.23,69,70],[458,0.69,66,70],[458.5,0.11,98,86],[458.5,0.095,54,97],[458.75,0.23,64,70],[459,0.46,66,70],[459.5,0.11,98,92],[459.5,0.095,54,103],[459.5,0.46,64,70],[460.5,0.11,98,92],[460.5,0.095,54,103],[461,3.8,66,20],[461.5,0.11,98,97],[461.5,0.095,54,109],[462.4,0.3,62,34],[462.5,0.11,98,97],[462.5,0.095,54,109],[463,0.3,59,36],[463.5,0.11,98,102],[463.5,0.095,54,115],[463.733,0.3,66,36],[463.75,0.7,64,9],[464,0.138,50,26],[464.25,0.552,47,26],[464.4,0.3,62,36],[464.5,0.11,98,102],[464.5,0.095,54,115],[465,3.8,62,24],[465.375,0.7,62,19],[465.4,0.3,59,38],[465.5,0.11,98,107],[465.5,0.095,54,121],[466,0.3,55,38],[466.375,0.7,69,19],[466.5,0.11,98,107],[466.5,0.095,54,121],[466.733,0.3,62,38],[467.375,0.7,67,19],[467.5,0.11,98,112],[467.5,0.095,54,126],[468.5,0.11,98,112],[468.5,0.095,54,126],[469,3.8,64,21],[469.5,0.11,98,118],[469.5,0.095,54,132],[469.75,0.23,69,146],[470,0.69,73,146],[470.5,0.11,98,118],[470.5,0.095,54,132],[470.75,0.23,69,146],[471,0.46,66,146],[471.5,0.11,98,109],[471.5,0.095,54,122],[471.5,0.46,64,146],[472,0.92,62,146],[472.5,0.11,98,109],[472.5,0.095,54,122],[473,3.738,69,7],[473,0.027,117,10],[473.492,0.11,98,86],[473.492,0.095,54,97],[474.475,0.11,98,86],[474.475,0.095,54,97],[474.967,0.295,62,46],[475.459,0.11,98,92],[475.459,0.095,54,103],[475.688,0.295,69,46],[475.705,0.7,66,11],[476.344,0.295,66,46],[476.443,0.11,98,92],[476.443,0.095,54,103],[476.443,0.027,117,19],[476.688,0.045,117,51],[476.934,0.295,59,48],[476.934,3.738,62,13],[476.934,0.027,117,43],[477.18,0.045,117,73],[477.328,0.295,62,48],[477.426,0.11,98,97],[477.426,0.095,54,109],[477.426,0.027,117,42],[477.672,0.7,66,13],[477.672,0.045,117,50],[477.918,0.295,59,48],[477.918,0.027,117,17],[478.287,0.7,69,24],[478.41,0.11,98,97],[478.41,0.095,54,109],[478.639,0.295,66,48],[479.147,0.407,52,37],[479.271,0.7,64,24],[479.295,0.295,62,51],[479.393,0.11,98,102],[479.393,0.095,54,115],[479.885,0.136,50,37],[480.131,0.543,47,37],[480.377,0.11,98,102],[480.377,0.095,54,115],[480.869,3.738,59,22],[481.361,0.11,98,107],[481.361,0.095,54,121],[481.361,0.027,117,16],[481.606,0.045,117,52],[481.852,0.027,117,45],[482.098,0.045,117,80],[482.344,0.11,98,107],[482.344,0.095,54,121],[482.344,0.453,69,133],[482.344,0.027,117,49],[482.59,0.045,117,62],[482.836,0.453,67,133],[482.836,0.027,117,26],[483.082,0.045,117,10],[483.328,0.11,98,112],[483.328,0.095,54,126],[483.328,0.226,66,133],[483.574,0.226,64,133],[483.82,0.905,62,133],[484.312,0.11,98,112],[484.312,0.095,54,126],[484.803,3.738,61,26],[485.295,0.11,98,118],[485.295,0.095,54,132],[486.279,0.11,98,118],[486.279,0.095,54,132],[486.279,0.027,117,11],[486.525,0.045,117,48],[486.771,0.027,117,42],[487.016,0.045,117,80],[487.262,0.11,98,109],[487.262,0.095,54,122],[487.262,0.027,117,51],[487.492,0.295,69,54],[487.508,0.045,117,69],[487.754,0.027,117,30],[488,0.045,117,20],[488.147,0.295,66,54],[488.246,0.11,98,109],[488.246,0.095,54,122],[488.738,0.29,62,45],[488.738,3.677,66,17],[489.222,0.11,98,91],[489.222,0.095,54,102],[489.447,0.29,69,45],[489.464,0.7,62,12],[490.189,0.11,98,91],[490.189,0.095,54,102],[490.415,0.29,69,45],[490.431,0.7,66,12],[491.036,0.7,78,22],[491.06,0.29,66,47],[491.157,0.11,98,93],[491.157,0.095,54,104],[491.157,0.027,117,12],[491.399,0.045,117,48],[491.641,0.29,62,43],[491.641,0.027,117,43],[491.883,0.045,117,71],[492.125,0.11,98,73],[492.125,0.095,54,83],[492.125,0.027,117,36],[492.367,0.045,117,27],[492.609,3.677,59,20],[492.609,0.445,66,108],[493.092,0.11,98,16],[493.092,0.095,54,18],[493.092,0.223,69,125],[493.334,0.223,71,126],[493.576,0.03,99,24],[493.576,0.055,50,64],[493.576,0.445,69,120],[493.636,0.16,39,71],[493.636,0.14,51,43],[494.06,0.445,66,81],[494.544,0.03,99,80],[494.544,0.055,50,214],[494.544,0.027,117,27],[494.604,0.16,39,201],[494.604,0.14,51,120],[494.786,0.045,117,77],[494.931,0.29,62,27],[495.028,0.027,117,45],[495.254,0.29,66,27],[495.27,0.7,76,9],[495.27,0.045,117,25],[495.512,0.29,59,40],[495.512,0.055,50,16],[496.222,0.29,66,11],[496.238,0.203,47,69],[496.48,0.203,43,51],[496.48,3.677,59,69],[496.48,0.445,62,36],[496.722,0.045,117,9],[496.964,0.11,98,110],[496.964,0.095,54,123],[496.964,0.445,67,154],[496.964,0.027,117,46],[497.205,0.045,117,77],[497.447,0.027,117,9],[497.834,0.29,59,40],[498.157,0.29,62,40],[498.415,0.03,99,83],[498.415,0.055,50,220],[498.475,0.16,39,190],[498.475,0.14,51,114],[498.657,0.045,117,24],[498.899,0.223,78,30],[498.899,0.027,117,55],[499.141,0.203,43,44],[499.141,0.223,76,126],[499.141,0.045,117,55],[499.383,0.203,43,56],[499.383,0.89,74,157],[499.77,0.29,59,43],[499.867,0.11,98,118],[499.867,0.095,54,132],[500.092,0.29,62,31],[500.351,0.055,50,18],[500.351,3.677,57,32],[500.351,3.677,64,10],[500.351,0.027,117,22],[500.411,0.16,39,63],[500.411,0.14,51,38],[500.592,0.045,117,92],[500.738,0.29,61,9],[500.834,0.223,66,26],[500.834,0.027,117,20],[501.076,0.223,69,145],[501.318,0.203,45,16],[501.318,0.668,73,167],[501.802,0.11,98,52],[501.802,0.095,54,59],[502.044,0.7,73,12],[502.044,0.203,45,15],[502.044,0.045,117,84],[502.286,0.027,117,36],[502.77,0.445,76,131],[503.254,0.03,99,38],[503.254,0.055,50,102],[503.254,0.89,74,77],[503.314,0.16,39,50],[503.314,0.14,51,30],[503.496,0.534,62,32],[503.496,0.045,117,72],[503.641,0.29,66,36],[503.738,0.027,117,41],[503.964,0.29,69,26],[503.98,0.203,50,41],[504.222,3.677,62,59],[504.705,0.223,66,42],[504.947,0.223,69,40],[504.947,0.045,117,54],[505.189,0.03,99,56],[505.189,0.055,50,150],[505.189,0.027,117,34],[505.249,0.16,39,115],[505.249,0.14,51,69],[505.576,0.29,66,30],[505.899,0.29,69,34],[505.915,0.203,50,42],[506.157,0.203,50,22],[506.399,0.045,117,50],[506.641,0.11,98,29],[506.641,0.095,54,32],[506.641,0.445,76,122],[506.641,0.027,117,41],[507.125,0.03,99,71],[507.125,0.055,50,190],[507.125,0.89,74,18],[507.185,0.16,39,180],[507.185,0.14,51,108],[507.512,0.29,66,13],[507.834,0.29,69,26],[507.851,0.203,50,33],[507.851,0.045,117,23],[508.092,0.203,47,48],[508.092,3.677,59,36],[508.092,0.027,117,48],[508.334,0.045,117,33],[508.576,0.11,98,101],[508.576,0.095,54,114],[508.576,0.223,69,143],[508.818,0.223,71,96],[509.12,0.16,39,39],[509.12,0.14,51,24],[509.447,0.29,62,36],[509.544,0.027,117,24],[509.77,0.29,66,32],[509.786,0.7,69,8],[509.786,0.045,117,76],[510.028,0.03,99,21],[510.028,0.055,50,56],[510.028,0.027,117,23],[510.088,0.16,39,19],[510.088,0.14,51,11],[510.754,0.203,47,50],[510.754,0.223,74,142],[510.996,0.203,47,38],[510.996,0.89,71,107],[510.996,0.134,62,19],[511.238,0.534,59,28],[511.48,0.11,98,102],[511.48,0.095,54,115],[511.48,0.027,117,37],[511.722,0.045,117,79],[511.964,0.29,55,42],[511.964,3.677,62,72],[511.964,0.027,117,25],[512.326,0.7,62,11],[512.351,0.29,59,35],[512.931,0.03,99,84],[512.931,0.055,50,223],[512.931,0.223,69,22],[512.991,0.16,39,205],[512.991,0.14,51,123],[513.173,0.223,71,83],[513.415,0.445,69,129],[513.657,0.045,117,43],[513.899,0.445,79,157],[513.899,0.027,117,53],[514.141,0.045,117,81],[514.383,0.223,78,117],[514.383,0.027,117,26],[514.625,0.203,43,48],[514.625,0.223,76,82],[514.867,0.203,43,54],[515.254,0.29,59,44],[515.351,0.11,98,22],[515.351,0.095,54,25],[515.576,0.29,62,16],[515.592,0.203,43,52],[515.835,0.29,57,39],[515.835,0.203,45,49],[515.835,3.677,57,68],[516.197,0.7,64,17],[516.222,0.29,61,34],[516.318,0.11,98,96],[516.318,0.095,54,108],[516.544,0.29,64,25],[516.56,0.203,45,31],[516.56,0.045,117,8],[516.802,0.29,57,42],[516.802,0.203,45,25],[516.802,0.027,117,32],[517.044,0.045,117,80],[517.165,0.7,73,22],[517.189,0.29,61,13],[517.286,0.11,98,119],[517.286,0.095,54,134],[517.286,0.027,117,58],[517.512,0.29,64,9],[517.528,0.203,45,11],[517.528,0.045,117,85],[517.77,0.203,50,7],[517.77,0.027,117,37],[518.012,0.045,117,27],[518.254,0.11,98,114],[518.254,0.095,54,128],[519.222,0.11,98,114],[519.222,0.095,54,129],[519.705,3.738,69,48],[520.197,0.11,98,86],[520.197,0.095,54,97],[520.197,0.226,66,121],[520.443,0.226,69,121],[520.689,0.679,66,121],[521.181,0.11,98,86],[521.181,0.095,54,97],[521.427,0.226,64,121],[521.427,0.045,117,27],[521.673,0.453,66,121],[521.673,0.027,117,31],[521.918,0.045,117,64],[522.164,0.11,98,92],[522.164,0.095,54,103],[522.164,0.453,64,121],[522.164,0.027,117,43],[522.41,0.045,117,63],[522.656,0.027,117,31],[522.902,0.045,117,27],[523.148,0.11,98,92],[523.148,0.095,54,103],[523.64,3.738,66,63],[524.132,0.11,98,97],[524.132,0.095,54,109],[525.017,0.295,62,42],[525.115,0.11,98,97],[525.115,0.095,54,109],[525.607,0.295,59,44],[525.853,0.407,52,32],[526.099,0.11,98,102],[526.099,0.095,54,115],[526.328,0.295,66,44],[526.345,0.7,64,11],[526.345,0.045,117,22],[526.591,0.027,117,31],[526.837,0.045,117,67],[526.984,0.295,62,44],[527.082,0.11,98,102],[527.082,0.095,54,115],[527.082,0.027,117,48],[527.312,0.295,66,44],[527.328,0.045,117,74],[527.574,3.738,62,62],[527.574,0.027,117,40],[527.82,0.045,117,40],[527.943,0.7,62,23],[527.968,0.295,59,46],[528.066,0.11,98,107],[528.066,0.095,54,121],[528.558,0.295,55,46],[528.927,0.7,69,23],[529.05,0.11,98,107],[529.05,0.095,54,121],[529.279,0.295,62,46],[529.91,0.7,67,23],[530.033,0.11,98,112],[530.033,0.095,54,126],[531.017,0.11,98,112],[531.017,0.095,54,126],[531.263,0.045,117,14],[531.509,3.738,64,42],[531.509,0.027,117,29],[531.755,0.045,117,71],[532,0.11,98,118],[532,0.095,54,132],[532,0.027,117,54],[532.246,0.045,117,87],[532.492,0.679,73,132],[532.492,0.027,117,48],[532.738,0.045,117,54],[532.984,0.11,98,118],[532.984,0.095,54,132],[532.984,0.027,117,15],[533.23,0.226,69,132],[533.476,0.453,66,132],[533.968,0.11,98,109],[533.968,0.095,54,122],[533.968,0.453,64,132],[534.46,0.905,62,132],[534.951,0.11,98,109],[534.951,0.095,54,122],[535.443,3.864,66,24],[535.952,0.11,98,86],[535.952,0.095,54,97],[536.969,0.11,98,86],[536.969,0.095,54,97],[537.477,0.305,62,40],[537.986,0.11,98,92],[537.986,0.095,54,103],[538.223,0.305,69,40],[538.901,0.305,66,40],[539.003,0.11,98,92],[539.003,0.095,54,103],[539.511,0.305,59,42],[539.511,3.864,62,52],[539.918,0.305,62,42],[540.019,0.11,98,97],[540.019,0.095,54,109],[540.528,0.305,59,42],[540.909,0.7,69,21],[541.036,0.11,98,97],[541.036,0.095,54,109],[541.274,0.305,66,42],[541.926,0.7,64,21],[541.952,0.305,62,44],[542.053,0.11,98,102],[542.053,0.095,54,115],[543.07,0.11,98,102],[543.07,0.095,54,115],[543.579,3.864,59,69],[544.087,0.11,98,107],[544.087,0.095,54,121],[544.85,0.234,71,120],[545.104,0.11,98,107],[545.104,0.095,54,121],[545.104,0.468,69,120],[545.613,0.468,67,120],[546.121,0.11,98,112],[546.121,0.095,54,126],[546.121,0.234,66,120],[546.375,0.234,64,120],[546.63,0.936,62,120],[547.138,0.11,98,112],[547.138,0.095,54,126],[547.646,4.068,69,55],[547.646,3.864,61,68],[548.155,0.11,98,118],[548.155,0.095,54,132],[549.172,0.11,98,118],[549.172,0.095,54,132],[550.189,0.27,64,25],[550.189,0.03,83,9],[550.209,0.31,57,13],[550.426,0.305,69,47],[551.104,0.305,66,47],[551.206,0.27,64,25],[551.206,0.03,83,9],[551.226,0.31,57,13],[552.223,0.27,64,25],[552.223,0.03,83,9],[552.243,0.31,57,13],[553.24,0.27,64,25],[553.24,0.03,83,9],[553.26,0.31,57,13],[554.257,0.27,64,25],[554.257,0.03,83,9],[554.277,0.31,57,13],[554.769,0.27,64,31],[554.769,0.03,83,11],[554.789,0.31,57,16],[555.678,0.27,64,31],[555.678,0.03,83,11],[555.698,0.31,57,16],[556.587,0.27,64,31],[556.587,0.03,83,11],[556.607,0.31,57,16],[557.496,0.27,64,31],[557.496,0.03,83,11],[557.516,0.31,57,16],[557.951,0.58,71,29],[558.405,0.27,64,31],[558.405,0.03,83,11],[558.425,0.31,57,16],[558.86,0.773,74,29],[559.314,0.27,64,31],[559.314,0.03,83,11],[559.334,0.31,57,16],[560.223,0.27,64,31],[560.223,0.03,83,11],[560.243,0.31,57,16],[560.451,0.193,78,30],[561.133,0.27,64,31],[561.133,0.03,83,11],[561.153,0.31,57,16],[562.042,0.27,64,31],[562.042,0.03,83,11],[562.062,0.31,57,16],[562.951,0.27,64,31],[562.951,0.03,83,11],[562.971,0.31,57,16],[563.86,0.27,64,31],[563.86,0.03,83,11],[563.88,0.31,57,16],[564.769,0.27,64,31],[564.769,0.03,83,11],[564.789,0.31,57,16],[565.223,0.58,71,22],[565.678,0.27,64,31],[565.678,0.03,83,11],[565.698,0.31,57,16],[566.133,0.773,74,22],[566.587,0.27,64,31],[566.587,0.03,83,11],[566.607,0.31,57,16],[567.496,0.27,64,31],[567.496,0.03,83,11],[567.516,0.31,57,16],[567.723,0.193,78,22],[568.405,0.27,64,31],[568.405,0.03,83,11],[568.425,0.31,57,16],[568.86,0.58,62,16],[569.314,0.27,64,31],[569.314,0.03,83,11],[569.334,0.31,57,16],[569.542,0.193,62,22],[569.769,0.773,62,22],[570.223,0.27,64,31],[570.223,0.03,83,11],[570.243,0.31,57,16],[570.678,0.58,62,22],[571.133,0.27,64,31],[571.133,0.03,83,11],[571.153,0.31,57,16],[571.36,0.193,62,22],[571.587,0.773,62,22],[572.042,0.27,64,31],[572.042,0.03,83,11],[572.062,0.31,57,16],[572.496,0.58,62,22],[572.951,0.27,64,31],[572.951,0.03,83,11],[572.971,0.31,57,16],[573.178,0.193,62,16],[573.405,0.773,62,16],[573.86,0.27,64,31],[573.86,0.03,83,11],[573.88,0.31,57,16],[574.314,0.58,62,16],[574.769,0.27,64,31],[574.769,0.03,83,11],[574.789,0.31,57,16],[574.996,0.193,62,16],[575.223,0.773,62,16],[575.678,0.27,64,31],[575.678,0.03,83,11],[575.698,0.31,57,16],[576.133,0.58,62,16],[576.587,0.27,64,31],[576.587,0.03,83,11],[576.607,0.31,57,16],[576.814,0.193,62,16],[577.042,0.773,62,24],[577.496,0.27,64,31],[577.496,0.03,83,11],[577.516,0.31,57,16],[577.951,0.58,62,24],[578.405,0.27,64,31],[578.405,0.03,83,11],[578.425,0.31,57,16],[578.633,0.193,62,24],[578.86,0.773,62,24],[579.314,0.27,64,31],[579.314,0.03,83,11],[579.334,0.31,57,16],[579.769,0.58,62,24],[580.223,0.27,64,31],[580.223,0.03,83,11],[580.243,0.31,57,16],[580.451,0.193,62,24],[580.678,0.773,62,24],[581.133,0.27,64,31],[581.133,0.03,83,11],[581.153,0.31,57,16],[581.587,0.58,62,29],[582.042,0.27,64,31],[582.042,0.03,83,11],[582.062,0.31,57,16],[582.269,0.193,62,29],[582.496,0.773,62,29],[582.951,0.27,64,31],[582.951,0.03,83,11],[582.971,0.31,57,16],[583.86,0.27,64,31],[583.86,0.03,83,11],[583.88,0.31,57,16],[584.769,0.27,64,31],[584.769,0.03,83,11],[584.789,0.31,57,16],[585.678,0.27,64,31],[585.678,0.03,83,11],[585.698,0.31,57,16],[586.587,0.27,64,31],[586.587,0.03,83,11],[586.607,0.31,57,16],[587.042,0.58,83,41],[587.496,0.27,64,31],[587.496,0.03,83,11],[587.516,0.31,57,16],[587.951,0.773,86,41],[588.405,0.27,64,31],[588.405,0.03,83,11],[588.425,0.31,57,16],[589.314,0.27,64,31],[589.314,0.03,83,11],[589.334,0.31,57,16],[589.542,0.193,90,41],[590.223,0.27,64,31],[590.223,0.03,83,11],[590.243,0.31,57,16],[590.678,0.159,74,54],[591.133,0.27,64,31],[591.133,0.03,83,11],[591.153,0.31,57,16],[592.042,0.27,64,31],[592.042,0.03,83,11],[592.062,0.31,57,16],[592.437,4.385,67,11],[593.014,0.07,98,19],[593.129,0.27,64,27],[593.129,0.03,83,10],[593.149,0.31,57,14],[593.283,0.346,79,23],[594.024,0.7,76,11],[594.168,0.07,98,19],[595.206,0.346,76,24],[595.322,0.07,98,20],[595.437,0.27,64,28],[595.437,0.03,83,10],[595.457,0.31,57,14],[595.899,0.219,76,13],[596.476,0.07,98,18],[596.745,0.346,79,13],[596.764,0.035,117,11],[597.052,0.346,69,20],[597.052,4.385,60,26],[597.341,0.219,69,10],[597.629,0.07,98,13],[597.745,0.27,64,18],[597.765,0.31,57,9],[598.668,0.346,72,25],[599.36,0.27,48,11],[599.36,0.055,50,12],[599.42,0.16,39,13],[599.42,0.14,51,8],[599.793,0.7,74,11],[600.206,0.346,76,19],[600.226,0.035,117,10],[600.514,0.346,69,15],[600.514,0.27,48,38],[600.514,0.03,83,13],[600.514,0.03,99,16],[600.514,0.055,50,42],[600.534,0.31,42,19],[600.574,0.16,39,40],[600.574,0.14,51,24],[600.802,0.035,117,10],[601.668,0.27,48,47],[601.668,0.03,83,16],[601.668,0.03,99,18],[601.668,0.055,50,48],[601.668,4.385,53,27],[601.688,0.31,42,23],[601.728,0.16,39,45],[601.728,0.14,51,27],[602.129,0.346,69,23],[602.822,0.27,48,23],[602.822,0.03,83,8],[602.822,0.03,99,9],[602.822,0.055,50,23],[602.842,0.31,42,11],[602.882,0.16,39,20],[602.882,0.14,51,12],[603.668,0.346,72,28],[603.687,0.7,79,7],[603.687,0.035,117,11],[603.976,0.277,41,13],[604.264,0.035,117,10],[604.408,0.7,77,11],[604.408,0.277,48,22],[605.129,0.346,65,26],[605.129,0.277,41,33],[605.822,0.27,64,35],[605.822,0.03,83,12],[605.842,0.31,57,18],[605.995,0.219,65,16],[605.995,0.277,42,37],[606.283,0.277,43,38],[606.283,4.385,59,16],[606.572,0.219,67,16],[606.716,0.277,50,35],[606.745,0.346,71,13],[606.86,0.07,98,13],[606.976,0.27,64,20],[606.995,0.31,57,10],[607.129,0.346,74,25],[607.149,0.035,117,9],[607.437,0.219,71,12],[607.437,0.277,43,28],[607.726,0.035,117,14],[608.014,0.07,98,22],[608.129,0.27,64,19],[608.149,0.31,57,10],[608.302,0.277,47,18],[608.591,0.346,72,26],[608.591,2.077,48,16],[609.024,0.7,76,15],[609.052,0.346,76,8],[609.168,0.27,64,24],[609.168,0.03,83,8],[609.188,0.31,57,12],[610.206,0.173,64,20],[610.322,0.27,64,25],[610.322,0.03,83,9],[610.342,0.31,57,12],[610.899,4.56,64,15],[611.349,0.7,72,13],[611.499,0.27,64,25],[611.499,0.03,83,9],[611.519,0.31,57,13],[611.619,0.27,64,26],[611.619,0.03,83,9],[611.639,0.31,57,13],[612.699,0.27,64,25],[612.699,0.03,83,9],[612.719,0.31,57,13],[613.599,0.228,79,16],[613.899,0.27,64,25],[613.899,0.03,83,9],[613.919,0.31,57,13],[614.019,0.27,64,27],[614.019,0.03,83,10],[614.039,0.31,57,14],[615.099,0.27,64,25],[615.099,0.03,83,9],[615.119,0.31,57,13],[615.699,4.56,57,12],[616.299,0.27,64,25],[616.299,0.03,83,9],[616.319,0.31,57,13],[616.419,0.27,64,29],[616.419,0.03,83,10],[616.439,0.31,57,14],[617.499,0.27,64,25],[617.499,0.03,83,9],[617.519,0.31,57,13],[617.799,0.7,79,8],[618.549,0.7,74,15],[618.699,0.27,64,25],[618.699,0.03,83,9],[618.719,0.31,57,13],[618.819,0.27,64,30],[618.819,0.03,83,11],[618.839,0.31,57,15],[619.299,0.228,72,18],[619.899,0.27,64,25],[619.899,0.03,83,9],[619.919,0.31,57,13],[620.499,4.56,53,19],[620.979,0.36,69,33],[621.099,0.27,64,25],[621.099,0.03,83,9],[621.119,0.31,57,13],[621.219,0.27,64,32],[621.219,0.03,83,11],[621.239,0.31,57,16],[621.699,0.36,65,33],[622.299,0.27,64,25],[622.299,0.03,83,9],[622.319,0.31,57,13],[622.579,0.36,72,33],[623.379,0.36,69,35],[623.499,0.27,64,25],[623.499,0.03,83,9],[623.519,0.31,57,13],[623.619,0.27,64,33],[623.619,0.03,83,12],[623.639,0.31,57,17],[624.099,0.36,65,35],[624.699,0.27,64,25],[624.699,0.03,83,9],[624.719,0.31,57,13],[624.979,0.36,72,35],[624.999,0.228,65,20],[625.299,4.56,55,23],[625.779,0.36,71,37],[625.899,0.27,64,25],[625.899,0.03,83,9],[625.919,0.31,57,13],[626.019,0.27,64,35],[626.019,0.03,83,12],[626.039,0.31,57,17],[626.199,0.7,74,10],[626.499,0.36,67,37],[626.949,0.7,83,18],[627.099,0.27,64,25],[627.099,0.03,83,9],[627.119,0.31,57,13],[627.379,0.36,74,37],[628.179,0.36,76,34],[628.299,0.27,64,25],[628.299,0.03,83,9],[628.319,0.31,57,13],[629.499,0.27,64,25],[629.499,0.03,83,9],[629.519,0.31,57,13],[629.619,0.18,65,24],[630.099,4.75,60,11],[630.724,0.27,64,25],[630.724,0.03,83,9],[630.744,0.31,57,13],[630.849,0.27,64,23],[630.849,0.03,83,8],[630.869,0.31,57,11],[631.974,0.27,64,25],[631.974,0.03,83,9],[631.994,0.31,57,13],[633.067,0.7,76,12],[633.224,0.27,64,25],[633.224,0.03,83,9],[633.244,0.31,57,13],[633.349,0.27,64,24],[633.349,0.03,83,8],[633.369,0.31,57,12],[634.474,0.27,64,25],[634.474,0.03,83,9],[634.494,0.31,57,13],[635.724,0.27,64,25],[635.724,0.03,83,9],[635.744,0.31,57,13],[635.849,0.27,64,25],[635.849,0.03,83,9],[635.869,0.31,57,13],[636.974,0.27,64,25],[636.974,0.03,83,9],[636.994,0.31,57,13],[638.224,0.27,64,25],[638.224,0.03,83,9],[638.244,0.31,57,13],[638.349,0.27,64,27],[638.349,0.03,83,9],[638.369,0.31,57,13],[639.474,0.27,64,25],[639.474,0.03,83,9],[639.494,0.31,57,13],[640.099,4.75,60,16],[640.724,0.27,64,25],[640.724,0.03,83,9],[640.744,0.31,57,13],[640.849,0.27,64,28],[640.849,0.03,83,10],[640.869,0.31,57,14],[641.817,0.7,79,15],[641.974,0.27,64,25],[641.974,0.03,83,9],[641.994,0.31,57,13],[643.224,0.27,64,25],[643.224,0.03,83,9],[643.244,0.31,57,13],[643.349,0.27,64,30],[643.349,0.03,83,10],[643.369,0.31,57,15],[644.474,0.27,64,25],[644.474,0.03,83,9],[644.494,0.31,57,13],[645.099,4.75,62,20],[645.724,0.27,64,25],[645.724,0.03,83,9],[645.744,0.31,57,13],[645.849,0.27,64,31],[645.849,0.03,83,11],[645.869,0.31,57,15],[646.974,0.27,64,25],[646.974,0.03,83,9],[646.994,0.31,57,13],[648.224,0.27,64,25],[648.224,0.03,83,9],[648.244,0.31,57,13],[649.349,0.188,64,21],[649.474,0.27,64,25],[649.474,0.03,83,9],[649.494,0.31,57,13],[650.737,0.27,64,25],[650.737,0.03,83,9],[650.757,0.31,57,13],[651.854,0.7,76,11],[652.014,0.27,64,25],[652.014,0.03,83,9],[652.034,0.31,57,13],[653.29,0.27,64,25],[653.29,0.03,83,9],[653.31,0.31,57,13],[654.567,0.27,64,25],[654.567,0.03,83,9],[654.587,0.31,57,13],[655.843,0.27,64,25],[655.843,0.03,83,9],[655.863,0.31,57,13],[657.12,0.27,64,25],[657.12,0.03,83,9],[657.14,0.31,57,13],[658.396,0.27,64,25],[658.396,0.03,83,9],[658.417,0.31,57,13],[659.673,0.27,64,25],[659.673,0.03,83,9],[659.693,0.31,57,13],[660.79,0.7,72,12],[660.95,0.27,64,25],[660.95,0.03,83,9],[660.97,0.31,57,13],[662.226,0.27,64,25],[662.226,0.03,83,9],[662.246,0.31,57,13],[663.503,0.27,64,25],[663.503,0.03,83,9],[663.523,0.31,57,13],[664.779,0.27,64,25],[664.779,0.03,83,9],[664.799,0.31,57,13],[666.056,0.27,64,25],[666.056,0.03,83,9],[666.076,0.31,57,13],[667.333,0.27,64,25],[667.333,0.03,83,9],[667.353,0.31,57,13],[668.45,0.7,76,13],[668.609,0.27,64,25],[668.609,0.03,83,9],[668.629,0.31,57,13],[669.886,0.27,64,25],[669.886,0.03,83,9],[669.906,0.31,57,13],[670.014,0.192,65,17],[671.176,0.27,64,25],[671.176,0.03,83,9],[671.196,0.31,57,13],[672.481,0.27,64,25],[672.481,0.03,83,9],[672.501,0.31,57,13],[673.785,0.27,64,25],[673.785,0.03,83,9],[673.805,0.31,57,13],[675.089,0.27,64,25],[675.089,0.03,83,9],[675.109,0.31,57,13],[676.394,0.27,64,25],[676.394,0.03,83,9],[676.414,0.31,57,13],[677.698,0.27,64,25],[677.698,0.03,83,9],[677.718,0.31,57,13],[679.002,0.27,64,25],[679.002,0.03,83,9],[679.022,0.31,57,13],[680.307,0.27,64,25],[680.307,0.03,83,9],[680.327,0.31,57,13],[681.611,0.27,64,25],[681.611,0.03,83,9],[681.631,0.31,57,13],[682.915,0.27,64,25],[682.915,0.03,83,9],[682.935,0.31,57,13],[684.22,0.27,64,25],[684.22,0.03,83,9],[684.24,0.31,57,13],[685.524,0.27,64,25],[685.524,0.03,83,9],[685.544,0.31,57,13],[686.828,0.27,64,25],[686.828,0.03,83,9],[686.848,0.31,57,13],[688.133,0.27,64,25],[688.133,0.03,83,9],[688.153,0.31,57,13],[689.437,0.27,64,25],[689.437,0.03,83,9],[689.457,0.31,57,13],[690.611,0.196,64,16],[690.741,0.27,64,25],[690.741,0.03,83,9],[690.761,0.31,57,13],[692.076,0.27,64,25],[692.076,0.03,83,9],[692.096,0.31,57,13],[693.439,0.27,64,25],[693.439,0.03,83,9],[693.459,0.31,57,13],[694.803,0.27,64,25],[694.803,0.03,83,9],[694.823,0.31,57,13],[696.166,0.27,64,25],[696.166,0.03,83,9],[696.186,0.31,57,13],[697.53,0.27,64,25],[697.53,0.03,83,9],[697.55,0.31,57,13],[698.894,0.27,64,25],[698.894,0.03,83,9],[698.914,0.31,57,13],[700.257,0.27,64,25],[700.257,0.03,83,9],[700.277,0.31,57,13],[701.621,0.27,64,25],[701.621,0.03,83,9],[701.641,0.31,57,13],[702.985,0.27,64,25],[702.985,0.03,83,9],[703.005,0.31,57,13],[704.348,0.27,64,25],[704.348,0.03,83,9],[704.368,0.31,57,13],[705.712,0.27,64,25],[705.712,0.03,83,9],[705.732,0.31,57,13],[707.076,0.27,64,25],[707.076,0.03,83,9],[707.096,0.31,57,13],[708.439,0.27,64,25],[708.439,0.03,83,9],[708.459,0.31,57,13],[709.803,0.27,64,25],[709.803,0.03,83,9],[709.823,0.31,57,13],[711.166,0.27,64,25],[711.166,0.03,83,9],[711.186,0.31,57,13],[712.53,0.27,64,25],[712.53,0.03,83,9],[712.55,0.31,57,13],[714.212,0.27,64,22],[714.212,0.03,83,8],[714.232,0.31,57,11],[716.212,0.27,64,22],[716.212,0.03,83,8],[716.232,0.31,57,11],[718.212,0.27,64,22],[718.212,0.03,83,8],[718.232,0.31,57,11],[720.212,0.27,64,22],[720.212,0.03,83,8],[720.232,0.31,57,11],[722.212,0.27,64,22],[722.212,0.03,83,8],[722.232,0.31,57,11],[724.212,0.27,64,22],[724.212,0.03,83,8],[724.232,0.31,57,11],[725.212,2.4,74,43],[726.212,0.27,64,22],[726.212,0.03,83,8],[726.232,0.31,57,11],[728.212,0.27,64,22],[728.212,0.03,83,8],[728.232,0.31,57,11],[730.212,0.27,64,22],[730.212,0.03,83,8],[730.232,0.31,57,11],[732.212,0.27,64,22],[732.212,0.03,83,8],[732.232,0.31,57,11],[734.212,0.27,64,22],[734.212,0.03,83,8],[734.232,0.31,57,11],[736.212,0.27,64,22],[736.212,0.03,83,8],[736.232,0.31,57,11],[738.212,0.27,64,22],[738.212,0.03,83,8],[738.232,0.31,57,11],[740.212,0.27,64,22],[740.212,0.03,83,8],[740.232,0.31,57,11],[742.212,0.27,64,22],[742.212,0.03,83,8],[742.232,0.31,57,11],[744.212,0.27,64,22],[744.212,0.03,83,8],[744.232,0.31,57,11],[746.212,0.27,64,22],[746.212,0.03,83,8],[746.232,0.31,57,11],[748.212,0.27,64,22],[748.212,0.03,83,8],[748.232,0.31,57,11],[750.212,0.27,64,22],[750.212,0.03,83,8],[750.232,0.31,57,11],[752.212,0.27,64,22],[752.212,0.03,83,8],[752.232,0.31,57,11],[754.212,0.27,64,22],[754.212,0.03,83,8],[754.232,0.31,57,11],[756.212,0.27,64,22],[756.212,0.03,83,8],[756.232,0.31,57,11],[758.212,0.27,64,22],[758.212,0.03,83,8],[758.232,0.31,57,11],[760.212,0.27,64,22],[760.212,0.03,83,8],[760.232,0.31,57,11],[762.212,0.27,64,22],[762.212,0.03,83,8],[762.232,0.31,57,11],[764.212,0.27,64,22],[764.212,0.03,83,8],[764.232,0.31,57,11],[766.212,0.27,64,22],[766.212,0.03,83,8],[766.232,0.31,57,11],[768.212,0.27,64,22],[768.212,0.03,83,8],[768.232,0.31,57,11],[770.212,0.27,64,22],[770.212,0.03,83,8],[770.232,0.31,57,11]],[[34.9,1.282,76,169],[42.5,0.666,72,199],[45.46,0.666,76,199],[50.74,0.252,79,199],[53.26,1.008,72,199],[57.04,0.25,74,177],[60.1,0.15,65,173],[60.42,0.96,48,26],[61.62,0.96,48,26],[62.34,0.27,64,21],[62.34,0.03,83,7],[62.36,0.31,57,11],[62.82,0.96,48,28],[64.02,0.96,48,28],[64.74,0.27,64,22],[64.74,0.03,83,8],[64.76,0.31,57,11],[65.22,0.96,45,29],[66.42,0.96,45,29],[67.14,0.27,64,24],[67.14,0.03,83,8],[67.16,0.31,57,12],[67.62,0.96,45,31],[68.82,0.96,45,31],[69.54,0.27,64,25],[69.54,0.03,83,9],[69.56,0.31,57,13],[70.02,0.96,41,24],[71.22,0.96,41,24],[71.94,0.27,64,26],[71.94,0.03,83,9],[71.96,0.31,57,13],[72.42,0.96,41,25],[73.62,0.96,41,25],[74.34,0.27,64,27],[74.34,0.03,83,10],[74.36,0.31,57,14],[74.82,0.96,43,26],[76.02,0.96,43,26],[76.74,0.27,64,29],[76.74,0.03,83,10],[76.76,0.31,57,14],[77.22,2.16,48,23],[79.14,0.18,65,22],[79.62,0.941,48,17],[80.796,0.941,48,17],[81.502,0.27,64,24],[81.502,0.03,83,8],[81.522,0.31,57,12],[81.973,0.941,48,18],[82.267,0.224,79,17],[83.149,0.941,48,18],[83.855,0.27,64,26],[83.855,0.03,83,9],[83.875,0.31,57,13],[84.326,0.941,45,19],[85.502,0.941,45,19],[86.208,0.27,64,27],[86.208,0.03,83,10],[86.228,0.31,57,14],[86.679,0.941,45,20],[87.855,0.224,72,13],[87.855,0.941,45,20],[88.561,0.27,64,29],[88.561,0.03,83,10],[88.581,0.31,57,14],[89.032,0.353,65,25],[89.032,0.941,41,29],[89.894,0.353,72,25],[90.208,0.941,41,29],[90.679,0.353,69,25],[90.914,0.27,64,30],[90.914,0.03,83,11],[90.934,0.31,57,15],[91.385,0.353,65,26],[91.385,0.941,41,30],[92.248,0.353,72,26],[92.561,0.941,41,30],[93.032,0.353,69,26],[93.267,0.27,64,32],[93.267,0.03,83,11],[93.287,0.31,57,16],[93.444,0.224,65,25],[93.738,0.353,67,47],[93.738,0.941,43,31],[94.6,0.353,74,47],[94.914,0.941,43,31],[95.385,0.353,71,47],[95.62,0.27,64,33],[95.62,0.03,83,11],[95.64,0.31,57,16],[96.091,0.353,72,44],[96.091,2.118,48,28],[96.953,0.353,79,44],[97.973,0.176,65,31],[98.444,0.277,48,18],[98.876,0.277,55,18],[99.597,0.277,48,18],[100.03,0.7,76,19],[100.29,0.27,64,27],[100.29,0.03,83,10],[100.31,0.31,57,14],[100.463,0.219,72,11],[100.463,0.277,47,18],[100.751,0.277,48,19],[101.04,0.219,79,11],[101.184,0.277,55,19],[101.905,0.277,48,19],[102.597,0.27,64,29],[102.597,0.03,83,10],[102.617,0.31,57,14],[102.77,0.277,44,17],[102.77,0.035,117,9],[103.059,0.277,45,18],[103.347,0.035,117,11],[103.492,0.277,52,18],[104.213,0.277,45,18],[104.905,0.27,64,30],[104.905,0.03,83,11],[104.925,0.31,57,15],[105.078,0.277,44,18],[105.367,0.277,45,19],[105.799,0.277,52,19],[106.52,0.219,72,19],[106.52,0.277,45,19],[107.213,0.27,64,32],[107.213,0.03,83,11],[107.233,0.31,57,16],[107.386,0.277,40,44],[107.674,0.277,41,46],[107.963,0.035,117,13],[108.107,0.7,72,18],[108.107,0.277,48,46],[108.136,0.346,69,36],[108.54,0.035,117,11],[108.828,0.346,65,36],[108.828,0.277,41,46],[109.52,0.27,64,34],[109.52,0.03,83,12],[109.54,0.31,57,17],[109.674,0.346,72,36],[109.694,0.277,40,46],[109.982,0.277,41,49],[110.415,0.277,48,49],[110.444,0.346,69,38],[111.136,0.346,65,38],[111.136,0.277,41,34],[111.828,0.27,64,35],[111.828,0.03,83,12],[111.848,0.31,57,18],[111.982,0.346,72,27],[112.001,0.219,65,15],[112.001,0.277,42,34],[112.29,0.277,43,36],[112.578,0.219,67,16],[112.578,0.035,117,9],[112.722,0.277,50,36],[112.751,0.346,71,29],[113.155,0.035,117,14],[113.444,0.346,67,29],[113.444,0.277,43,36],[113.732,0.035,117,9],[114.136,0.27,64,37],[114.136,0.03,83,13],[114.156,0.31,57,19],[114.29,0.346,74,29],[114.309,0.277,47,36],[114.597,2.077,48,37],[115.03,0.7,76,14],[115.059,0.346,76,27],[116.444,0.173,65,19],[116.905,0.25,45,46],[117.814,0.27,64,30],[117.814,0.03,83,10],[117.834,0.31,57,15],[118.269,0.25,45,46],[118.723,0.27,64,30],[118.723,0.03,83,10],[118.743,0.31,57,15],[119.632,0.25,50,46],[120.541,0.27,64,30],[120.541,0.03,83,10],[120.561,0.31,57,15],[120.996,0.25,52,46],[121.451,0.27,64,30],[121.451,0.03,83,10],[121.471,0.31,57,15],[122.36,0.25,45,46],[123.269,0.27,64,30],[123.269,0.03,83,10],[123.289,0.31,57,15],[123.723,0.25,53,46],[124.178,0.27,64,30],[124.178,0.03,83,10],[124.198,0.31,57,15],[125.087,0.25,50,46],[125.996,0.27,64,30],[125.996,0.03,83,10],[126.016,0.31,57,15],[126.451,0.25,52,46],[126.905,0.27,64,30],[126.905,0.03,83,10],[126.925,0.31,57,15],[127.814,0.25,45,46],[128.723,0.27,64,30],[128.723,0.03,83,10],[128.743,0.31,57,15],[129.178,0.25,45,46],[129.632,0.27,64,30],[129.632,0.03,83,10],[129.652,0.31,57,15],[130.541,0.25,50,46],[131.451,0.27,64,30],[131.451,0.03,83,10],[131.471,0.31,57,15],[131.905,0.25,52,46],[132.36,0.27,64,30],[132.36,0.03,83,10],[132.38,0.31,57,15],[133.269,0.25,45,46],[134.178,0.27,64,30],[134.178,0.03,83,10],[134.198,0.31,57,15],[134.632,0.25,53,46],[135.087,0.27,64,30],[135.087,0.03,83,10],[135.107,0.31,57,15],[135.996,0.25,52,46],[136.905,0.27,64,30],[136.905,0.03,83,10],[136.925,0.31,57,15],[137.36,0.25,45,46],[137.814,0.27,64,30],[137.814,0.03,83,10],[137.834,0.31,57,15],[138.723,0.25,45,49],[138.723,0.045,111,14],[139.632,0.27,64,30],[139.632,0.03,83,10],[139.652,0.31,57,15],[140.087,0.25,45,49],[140.314,0.191,76,10],[140.542,0.27,64,30],[140.542,0.03,83,10],[140.561,0.31,57,15],[141.451,0.818,81,26],[141.451,0.25,50,49],[142.36,0.27,64,30],[142.36,0.03,83,10],[142.38,0.31,57,15],[142.814,0.25,52,49],[142.814,0.045,111,19],[143.269,0.27,64,30],[143.269,0.03,83,10],[143.289,0.31,57,15],[143.496,0.045,111,13],[144.178,0.25,45,49],[145.087,0.191,69,12],[145.087,0.27,64,30],[145.087,0.03,83,10],[145.107,0.31,57,15],[145.541,0.818,77,31],[145.541,0.25,53,49],[145.996,0.27,64,30],[145.996,0.03,83,10],[146.016,0.31,57,15],[146.905,0.25,50,49],[147.132,0.191,77,12],[147.587,0.045,111,9],[147.814,0.27,64,30],[147.814,0.03,83,10],[147.834,0.31,57,15],[148.269,0.25,52,49],[148.269,0.045,111,21],[148.723,0.27,64,30],[148.723,0.03,83,10],[148.743,0.31,57,15],[149.632,0.818,76,33],[149.632,0.25,45,49],[150.542,0.27,64,30],[150.542,0.03,83,10],[150.561,0.31,57,15],[150.996,0.25,45,49],[151.451,0.27,64,30],[151.451,0.03,83,10],[151.471,0.31,57,15],[151.905,0.191,76,12],[152.36,0.25,50,49],[153.041,0.045,111,15],[153.269,0.27,64,30],[153.269,0.03,83,10],[153.289,0.31,57,15],[153.723,1.227,76,38],[153.723,0.25,52,49],[153.723,0.045,111,14],[153.951,0.191,76,14],[154.178,0.27,64,30],[154.178,0.03,83,10],[154.198,0.31,57,15],[155.087,0.25,45,49],[155.996,0.27,64,30],[155.996,0.03,83,10],[156.016,0.31,57,15],[156.451,0.25,53,49],[156.905,0.27,64,30],[156.905,0.03,83,10],[156.925,0.31,57,15],[157.814,0.409,74,38],[157.814,0.25,52,49],[157.814,0.045,111,19],[158.496,0.045,111,13],[158.723,0.191,80,14],[158.723,0.27,64,30],[158.723,0.03,83,10],[158.743,0.31,57,15],[159.178,0.25,45,49],[159.632,0.27,64,30],[159.632,0.03,83,10],[159.652,0.31,57,15],[160.541,0.25,45,55],[160.769,0.191,64,17],[161.451,0.409,73,14],[161.451,0.27,64,30],[161.451,0.03,83,10],[161.471,0.31,57,15],[161.678,0.127,44,23],[161.905,0.25,45,55],[162.36,0.27,64,30],[162.36,0.03,83,10],[162.38,0.31,57,15],[162.587,0.045,111,9],[163.041,0.127,49,23],[163.269,0.25,50,55],[163.269,0.045,111,21],[164.178,0.27,64,30],[164.178,0.03,83,10],[164.198,0.31,57,15],[164.405,0.127,51,23],[164.632,0.25,52,55],[165.087,0.27,64,30],[165.087,0.03,83,10],[165.107,0.31,57,15],[165.541,0.191,64,20],[165.996,0.818,70,17],[165.996,0.25,45,55],[166.905,0.27,64,30],[166.905,0.03,83,10],[166.925,0.31,57,15],[167.132,0.127,52,23],[167.36,0.25,53,55],[167.587,0.191,69,20],[167.814,0.27,64,30],[167.814,0.03,83,10],[167.834,0.31,57,15],[168.041,0.045,111,15],[168.496,0.127,49,23],[168.723,0.25,50,55],[168.723,0.045,111,14],[169.632,0.409,68,17],[169.632,0.27,64,30],[169.632,0.03,83,10],[169.652,0.31,57,15],[169.86,0.127,51,23],[170.087,0.25,52,55],[170.542,0.27,64,30],[170.542,0.03,83,10],[170.561,0.31,57,15],[171.451,0.25,45,55],[172.36,0.191,64,18],[172.36,0.27,64,30],[172.36,0.03,83,10],[172.38,0.31,57,15],[172.587,0.127,44,23],[172.814,0.25,45,55],[172.814,0.045,111,19],[173.269,0.27,64,30],[173.269,0.03,83,10],[173.289,0.31,57,15],[173.496,0.045,111,13],[173.951,0.127,49,23],[174.178,0.818,77,16],[174.178,0.25,50,55],[174.405,0.191,62,18],[175.087,0.27,64,30],[175.087,0.03,83,10],[175.107,0.31,57,15],[175.314,0.127,51,23],[175.541,0.25,52,55],[175.996,0.27,64,30],[175.996,0.03,83,10],[176.016,0.31,57,15],[176.905,0.25,45,55],[177.587,0.045,111,9],[177.814,0.27,64,30],[177.814,0.03,83,10],[177.834,0.31,57,15],[178.041,0.127,52,23],[178.269,0.818,73,16],[178.269,0.25,53,55],[178.269,0.045,111,21],[178.723,0.27,64,30],[178.723,0.03,83,10],[178.743,0.31,57,15],[179.178,0.191,69,18],[179.405,0.127,51,23],[179.632,0.25,52,55],[180.542,0.27,64,30],[180.542,0.03,83,10],[180.561,0.31,57,15],[180.769,0.127,44,23],[180.996,1.227,65,14],[180.996,0.25,45,55],[181.223,0.191,64,15],[181.451,0.27,64,30],[181.451,0.03,83,10],[181.471,0.31,57,15],[182.36,0.266,45,52],[183.327,0.27,64,30],[183.327,0.03,83,10],[183.347,0.31,57,15],[183.811,0.266,53,52],[184.295,0.27,64,30],[184.295,0.03,83,10],[184.315,0.31,57,15],[185.263,0.266,52,52],[186.231,0.27,64,30],[186.231,0.03,83,10],[186.251,0.31,57,15],[186.714,0.266,45,52],[187.198,0.27,64,30],[187.198,0.03,83,10],[187.218,0.31,57,15],[188.166,0.295,45,52],[189.238,0.27,64,30],[189.238,0.03,83,10],[189.257,0.31,57,15],[189.773,0.295,53,52],[190.309,0.27,64,30],[190.309,0.03,83,10],[190.329,0.31,57,15],[191.38,0.295,52,52],[192.452,0.27,64,30],[192.452,0.03,83,10],[192.472,0.31,57,15],[192.988,1.607,64,28],[192.988,0.295,45,52],[193.523,0.27,64,30],[193.523,0.03,83,10],[193.543,0.31,57,15],[196.379,0.158,63,11],[196.576,0.158,62,11],[196.774,0.158,76,15],[196.971,0.158,74,15],[198.352,0.158,63,11],[198.352,0.158,65,15],[198.55,0.158,65,11],[198.55,0.158,67,15],[199.931,0.158,60,11],[200.129,0.158,58,11],[200.326,0.158,72,15],[200.524,0.158,70,15],[201.905,0.158,69,27],[202.102,0.158,70,27],[203.484,0.158,56,20],[203.681,0.158,55,20],[203.879,0.158,69,27],[204.076,0.158,67,27],[205.383,0.143,72,27],[205.561,0.143,74,27],[206.811,0.143,56,20],[206.99,0.143,58,20],[208.24,0.143,67,17],[208.418,0.143,65,17],[208.597,0.143,76,23],[208.775,0.143,77,23],[210.025,0.143,60,17],[210.204,0.143,62,17],[211.454,0.143,63,17],[211.633,0.143,62,17],[211.811,0.143,76,23],[211.99,0.143,74,23],[213.24,0.143,63,25],[213.24,0.13,65,34],[213.403,0.13,67,34],[213.418,0.143,65,25],[214.544,0.13,60,25],[214.707,0.13,58,25],[214.87,0.13,72,34],[215.033,0.13,70,34],[216.174,0.13,69,34],[216.338,0.13,70,34],[217.479,0.13,56,25],[217.642,0.13,55,25],[217.805,0.13,69,34],[217.968,0.13,67,34],[218.902,0.114,68,53],[219.448,0.114,73,53],[220.022,0.391,83,59],[220.45,0.5,102,108],[223.328,0.143,72,47],[223.506,0.143,74,47],[224.756,0.143,56,35],[224.935,0.143,58,35],[226.185,0.143,67,43],[226.364,0.143,65,43],[226.542,0.143,76,57],[226.721,0.143,77,57],[227.971,0.143,60,43],[228.149,0.143,62,43],[229.306,0.13,63,43],[229.469,0.13,62,43],[229.632,0.13,76,57],[229.795,0.13,74,57],[230.937,0.13,63,50],[230.937,0.13,65,67],[231.1,0.13,65,50],[231.1,0.13,67,67],[232.241,0.13,60,50],[232.404,0.13,58,50],[232.567,0.13,72,67],[232.73,0.13,70,67],[233.845,0.12,69,67],[233.995,0.12,70,67],[235.045,0.12,56,50],[235.195,0.12,55,50],[235.345,0.12,69,67],[235.495,0.12,67,67],[236.545,0.12,72,42],[236.695,0.12,74,42],[237.745,0.12,56,31],[237.895,0.12,58,31],[238.755,0.105,68,47],[239.257,0.105,73,47],[239.785,0.36,83,52],[240.181,0.5,102,108],[251.717,0.04,99,43],[252.431,0.16,43,49],[252.431,0.03,99,22],[253.86,0.16,43,49],[253.86,0.03,99,22],[266.002,0.04,99,43],[266.717,0.16,48,49],[266.717,0.03,99,22],[267.074,0.25,65,31],[268.145,0.16,48,49],[268.145,0.03,99,22],[268.86,0.25,75,38],[277.431,1.429,72,42],[280.288,0.04,99,43],[280.645,0.16,43,49],[280.645,0.03,99,22],[281.36,0.16,43,49],[281.36,0.03,99,22],[282.074,0.16,43,49],[282.074,0.03,99,22],[282.788,0.16,43,49],[282.788,0.03,99,22],[294.574,0.04,99,43],[294.931,0.16,48,49],[294.931,0.03,99,22],[295.645,0.16,48,49],[295.645,0.03,99,22],[296.36,0.16,48,49],[296.36,0.03,99,22],[297.074,0.16,48,49],[297.074,0.03,99,22],[301.488,6.333,72,13],[302.322,0.444,65,35],[303.71,0.444,60,35],[305.099,0.444,62,35],[306.488,0.444,60,35],[307.877,0.444,79,35],[308.155,6.333,69,10],[309.266,0.444,69,35],[310.655,0.444,62,35],[312.044,0.444,65,47],[313.155,0.444,60,12],[313.433,0.444,64,46],[314.544,0.444,79,16],[314.822,0.444,53,45],[314.822,6.333,69,17],[315.933,0.444,69,20],[316.21,0.444,72,43],[316.21,0.065,99,7],[317.322,0.444,65,25],[317.599,0.444,69,40],[317.599,0.065,99,9],[317.877,0.065,99,10],[318.71,0.444,65,31],[318.988,0.444,70,36],[319.266,0.065,99,11],[319.544,0.065,99,12],[320.099,0.444,64,36],[320.377,0.444,67,31],[320.933,0.065,99,13],[321.21,0.065,99,14],[321.488,0.444,53,41],[321.488,6.333,65,10],[321.766,0.444,57,24],[322.599,0.065,99,15],[322.877,0.444,72,27],[322.877,0.065,99,15],[323.155,0.444,50,10],[324.266,0.444,65,29],[324.266,0.065,99,16],[324.544,0.065,99,16],[325.655,0.444,70,29],[325.933,0.065,99,17],[326.21,0.065,99,17],[327.044,0.444,67,28],[327.599,0.065,99,16],[327.877,0.065,99,15],[328.155,0.444,53,13],[328.433,0.444,57,26],[329.266,0.065,99,13],[329.544,0.444,72,19],[329.544,0.065,99,13],[329.822,0.444,53,22],[330.655,0.5,79,15],[330.933,0.444,69,24],[330.933,0.065,99,10],[331.21,0.444,72,16],[331.21,0.065,99,9],[331.488,0.75,76,21],[332.322,0.444,70,28],[332.599,0.444,74,9],[333.71,0.444,67,26],[334.822,1.5,81,22],[334.822,6.333,72,12],[335.099,0.444,57,26],[335.655,0.055,50,15],[335.715,0.16,39,15],[335.715,0.14,51,9],[336.21,0.444,72,10],[336.488,0.444,50,24],[336.488,0.03,99,9],[336.488,0.055,50,23],[336.548,0.16,39,22],[336.548,0.14,51,13],[336.766,0.065,99,8],[337.044,0.065,99,9],[337.322,0.5,77,13],[337.322,0.03,99,12],[337.322,0.055,50,31],[337.382,0.16,39,29],[337.382,0.14,51,18],[337.599,0.444,65,17],[337.877,0.444,69,20],[338.155,0.03,99,14],[338.155,0.055,50,38],[338.215,0.16,39,36],[338.215,0.14,51,21],[338.433,0.065,99,12],[338.71,0.065,99,13],[338.988,0.444,70,22],[338.988,0.75,76,13],[338.988,0.03,99,16],[338.988,0.055,50,43],[339.048,0.16,39,41],[339.048,0.14,51,25],[339.266,0.444,74,14],[339.822,0.03,99,18],[339.822,0.055,50,48],[339.882,0.16,39,45],[339.882,0.14,51,27],[340.099,0.065,99,15],[340.377,0.444,67,25],[340.377,0.5,79,21],[340.377,0.065,99,16],[340.655,0.444,72,7],[340.655,0.03,99,19],[340.655,0.055,50,51],[340.715,0.16,39,48],[340.715,0.14,51,29],[341.488,0.03,99,20],[341.488,0.055,50,53],[341.488,6.333,69,9],[341.548,0.16,39,49],[341.548,0.14,51,30],[341.766,0.444,57,26],[341.766,0.065,99,17],[342.044,0.065,99,17],[342.322,0.03,99,20],[342.322,0.055,50,53],[342.382,0.16,39,50],[342.382,0.14,51,30],[343.155,0.444,53,26],[343.155,0.03,99,19],[343.155,0.055,50,52],[343.215,0.16,39,48],[343.215,0.14,51,29],[343.433,0.065,99,16],[343.71,0.065,99,16],[343.988,0.03,99,19],[343.988,0.055,50,49],[344.048,0.16,39,46],[344.048,0.14,51,28],[344.266,0.444,69,8],[344.544,0.444,72,17],[344.544,0.25,65,12],[344.822,0.03,99,17],[344.822,0.055,50,46],[344.882,0.16,39,43],[344.882,0.14,51,26],[345.099,0.065,99,14],[345.377,0.065,99,13],[345.655,0.444,70,12],[345.655,0.75,65,8],[345.655,0.03,99,15],[345.655,0.055,50,41],[345.715,0.16,39,38],[345.715,0.14,51,23],[345.933,0.444,74,14],[346.488,0.03,99,13],[346.488,0.055,50,36],[346.548,0.16,39,33],[346.548,0.14,51,20],[346.766,0.065,99,11],[347.044,0.444,67,15],[347.044,0.065,99,10],[347.322,0.444,72,10],[347.322,0.03,99,11],[347.322,0.055,50,29],[347.382,0.16,39,27],[347.382,0.14,51,16],[348.155,0.03,99,9],[348.155,0.055,50,23],[348.155,6.333,65,43],[348.215,0.16,39,21],[348.215,0.14,51,13],[348.433,0.444,57,17],[348.988,0.055,50,16],[349.048,0.16,39,14],[349.048,0.14,51,9],[349.822,0.444,50,18],[349.822,0.75,67,13],[349.822,0.055,50,9],[349.882,0.16,39,8],[351.21,0.444,69,19],[352.599,0.444,74,18],[353.155,0.5,65,12],[353.71,0.444,67,7],[353.988,0.444,72,14],[355.099,0.444,57,9],[355.377,0.444,60,13],[356.488,0.444,53,11],[356.766,0.444,57,11],[357.877,0.444,72,12],[358.155,0.444,58,9],[359.266,0.444,74,13],[359.544,0.444,77,8],[360.655,0.444,72,14],[362.044,0.444,60,15],[363.433,0.444,53,13],[364.822,0.444,58,23],[366.21,0.444,77,23],[367.599,0.444,76,19],[368.988,0.444,65,16],[370.377,0.444,60,12],[371.766,0.444,62,8],[375.822,0.857,48,44],[375.822,4.071,64,9],[376.893,0.857,48,44],[377.322,0.321,64,25],[377.536,0.27,64,27],[377.536,0.03,83,10],[377.556,0.31,57,14],[377.964,0.857,48,46],[378.232,0.204,67,15],[379.036,0.321,60,27],[379.036,0.857,48,46],[379.679,0.27,64,29],[379.679,0.03,83,10],[379.699,0.31,57,14],[380.107,0.857,45,49],[380.107,4.071,60,9],[380.893,0.321,64,28],[381.179,0.857,45,49],[381.58,0.7,67,13],[381.822,0.27,64,30],[381.822,0.03,83,11],[381.841,0.31,57,15],[382.25,0.857,45,52],[382.679,0.321,60,30],[383.322,0.204,60,17],[383.322,0.857,45,52],[383.964,0.27,64,32],[383.964,0.03,83,11],[383.984,0.31,57,16],[384.393,0.321,53,31],[384.393,0.857,41,54],[384.393,4.071,57,10],[385.464,0.857,41,54],[386.107,0.27,64,34],[386.107,0.03,83,12],[386.127,0.31,57,17],[386.25,0.321,60,48],[386.536,0.857,41,57],[387.339,0.7,65,15],[387.607,0.857,41,57],[388.036,0.321,57,51],[388.25,0.27,64,35],[388.25,0.03,83,12],[388.27,0.31,57,18],[388.411,0.204,53,28],[388.679,0.857,43,59],[388.679,4.071,55,13],[389.08,0.7,62,31],[389.75,0.321,55,53],[389.75,0.857,43,59],[390.393,0.27,64,37],[390.393,0.03,83,13],[390.413,0.31,57,19],[390.822,1.929,48,52],[391.607,0.321,67,49],[392.536,0.161,65,34],[392.964,0.248,48,40],[392.964,3.931,60,47],[393.223,0.035,117,11],[393.352,0.248,55,40],[393.999,0.248,48,40],[394.413,0.31,76,41],[394.62,0.27,64,29],[394.62,0.03,83,10],[394.64,0.31,57,14],[394.775,0.7,76,35],[394.775,0.197,72,29],[394.775,0.248,47,40],[395.033,0.248,48,42],[395.292,0.197,79,31],[395.421,0.7,76,67],[395.421,0.248,55,42],[396.068,0.31,72,55],[396.068,0.248,48,42],[396.688,0.27,64,30],[396.688,0.03,83,11],[396.709,0.31,57,15],[396.844,0.248,44,42],[397.102,0.248,45,44],[397.102,3.931,57,56],[397.49,0.248,52,44],[397.861,0.31,76,58],[397.878,0.035,117,12],[398.137,0.248,45,44],[398.395,0.035,117,12],[398.757,0.27,64,32],[398.757,0.03,83,11],[398.777,0.31,57,16],[398.913,0.248,44,44],[399.171,0.248,45,47],[399.559,0.248,52,47],[399.585,0.31,72,61],[400.206,0.197,72,34],[400.206,0.248,45,47],[400.827,0.27,64,34],[400.827,0.03,83,12],[400.846,0.31,57,17],[400.982,0.248,40,47],[401.24,0.31,65,64],[401.24,0.248,41,49],[401.24,3.931,53,22],[401.628,0.248,48,49],[402.016,0.7,72,19],[402.275,0.248,41,49],[402.533,0.035,117,8],[402.663,0.7,79,36],[402.895,0.27,64,36],[402.895,0.03,83,13],[402.915,0.31,57,18],[403.033,0.31,72,64],[403.051,0.248,40,49],[403.051,0.035,117,14],[403.309,0.248,41,51],[403.568,0.035,117,12],[403.697,0.248,48,51],[404.344,0.248,41,51],[404.757,0.31,69,68],[404.964,0.27,64,37],[404.964,0.03,83,13],[404.984,0.31,57,19],[405.12,0.197,65,38],[405.12,0.248,42,51],[405.378,0.248,43,54],[405.378,3.931,55,10],[405.637,0.197,67,40],[405.766,0.248,50,54],[406.413,0.31,67,72],[406.413,0.248,43,54],[407.033,0.27,64,39],[407.033,0.03,83,14],[407.053,0.31,57,19],[407.188,0.248,47,54],[407.447,1.862,48,55],[408.206,0.31,79,66],[408.223,0.7,76,17],[409.102,0.155,65,46],[409.516,0.24,48,42],[409.516,3.8,67,12],[409.891,0.7,84,21],[409.891,0.24,55,42],[410.516,0.24,48,42],[410.916,0.3,88,48],[411.116,0.27,64,30],[411.116,0.03,83,11],[411.136,0.31,57,15],[411.266,0.19,84,27],[411.266,0.24,47,42],[411.516,0.24,48,44],[411.766,0.19,91,34],[411.891,0.24,55,44],[412.516,0.3,84,61],[412.516,0.24,48,44],[412.766,0.035,117,10],[413.116,0.27,64,32],[413.116,0.03,83,11],[413.136,0.31,57,16],[413.266,0.24,44,44],[413.266,0.035,117,12],[413.516,0.24,45,47],[413.516,3.8,64,57],[413.766,0.035,117,8],[413.891,0.24,52,47],[414.249,0.3,88,64],[414.516,0.24,45,47],[415.116,0.27,64,34],[415.116,0.03,83,12],[415.136,0.31,57,17],[415.266,0.7,91,36],[415.266,0.24,44,47],[415.516,0.24,45,49],[415.891,0.7,86,68],[415.891,0.24,52,49],[415.916,0.3,84,67],[416.516,0.19,84,38],[416.516,0.24,45,49],[417.116,0.27,64,36],[417.116,0.03,83,13],[417.136,0.31,57,18],[417.141,0.27,48,36],[417.141,0.03,83,13],[417.161,0.31,42,18],[417.266,0.24,40,49],[417.516,0.3,77,71],[417.516,0.24,41,52],[417.516,3.8,60,66],[417.766,0.035,117,12],[417.891,0.24,48,52],[418.266,0.035,117,14],[418.516,0.24,41,52],[418.766,0.035,117,8],[419.116,0.27,64,38],[419.116,0.03,83,13],[419.136,0.31,57,19],[419.249,0.3,84,80],[419.266,0.24,40,52],[419.516,0.24,41,54],[419.891,0.24,48,54],[420.516,0.24,41,54],[420.916,0.3,81,84],[421.116,0.27,64,39],[421.116,0.03,83,14],[421.136,0.31,57,20],[421.266,0.19,77,47],[421.266,0.24,42,54],[421.516,0.24,43,57],[421.516,3.8,62,50],[421.766,0.19,79,49],[421.891,0.24,50,57],[422.266,0.7,86,39],[422.516,0.3,79,88],[422.516,0.24,43,57],[422.766,0.035,117,13],[422.891,0.7,95,75],[423.116,0.27,64,41],[423.116,0.03,83,14],[423.136,0.31,57,21],[423.266,0.24,47,57],[423.266,0.035,117,16],[423.516,1.8,48,58],[424.249,0.3,91,81],[425.116,0.15,77,57],[425.516,0.232,48,42],[425.516,3.677,64,10],[425.516,3.677,67,16],[425.879,0.232,55,42],[426.484,0.232,48,42],[426.871,0.29,100,52],[427.065,0.27,64,30],[427.065,0.03,83,11],[427.084,0.31,57,15],[427.21,0.184,96,29],[427.21,0.232,47,42],[427.452,0.232,48,44],[427.452,0.027,117,19],[427.693,0.184,96,31],[427.693,0.045,117,51],[427.815,0.232,55,44],[427.935,0.027,117,41],[428.177,0.045,117,69],[428.419,0.29,96,55],[428.419,0.232,48,44],[428.419,0.027,117,40],[428.661,0.045,117,48],[428.903,0.027,117,17],[429,0.27,64,32],[429,0.03,83,11],[429.02,0.31,57,16],[429.145,0.232,44,44],[429.387,0.232,45,47],[429.387,3.677,60,29],[429.75,0.7,100,43],[429.75,0.232,52,47],[430.097,0.29,100,58],[430.355,0.232,45,47],[430.935,0.27,64,34],[430.935,0.03,83,12],[430.955,0.31,57,17],[431.081,0.232,44,47],[431.323,0.232,45,49],[431.497,0.4,106,9],[431.685,0.232,52,49],[431.71,0.29,96,61],[432.29,0.184,96,34],[432.29,0.232,45,49],[432.29,0.027,117,10],[432.532,0.045,117,43],[432.774,0.027,117,40],[432.871,0.27,64,36],[432.871,0.03,83,13],[432.891,0.31,57,18],[432.895,0.27,48,36],[432.895,0.03,83,13],[432.915,0.31,42,18],[433.016,0.232,40,49],[433.016,0.045,117,75],[433.258,0.29,89,65],[433.258,0.232,41,52],[433.258,3.677,57,46],[433.258,0.027,117,50],[433.5,0.045,117,69],[433.621,0.232,48,52],[433.742,0.027,117,31],[433.984,0.045,117,21],[434.226,0.232,41,52],[434.806,0.27,64,38],[434.806,0.03,83,13],[434.826,0.31,57,19],[434.935,0.29,96,55],[434.952,0.232,40,52],[435.193,0.232,41,54],[435.556,0.7,101,48],[435.556,0.232,48,54],[436.161,0.232,41,54],[436.548,0.29,93,58],[436.742,0.27,64,39],[436.742,0.03,83,14],[436.762,0.31,57,20],[436.887,0.184,89,32],[436.887,0.232,42,54],[437.129,0.232,43,57],[437.129,3.677,59,53],[437.371,0.184,91,34],[437.371,0.045,117,29],[437.492,0.232,50,57],[437.613,0.027,117,37],[437.855,0.045,117,78],[438.097,0.29,91,60],[438.097,0.232,43,57],[438.097,0.027,117,55],[438.339,0.045,117,85],[438.581,0.027,117,44],[438.677,0.27,64,41],[438.677,0.03,83,14],[438.697,0.31,57,21],[438.823,0.232,47,57],[438.823,0.045,117,44],[439.065,1.742,48,58],[439.774,0.29,103,56],[439.79,0.218,67,79],[441,3.8,62,16],[441.733,0.3,69,29],[441.75,0.7,62,8],[441.75,0.21,50,55],[442,0.21,50,55],[442.733,0.3,69,29],[442.75,0.7,66,8],[442.75,0.21,50,55],[443,0.21,50,58],[443.375,0.7,66,15],[443.4,0.3,66,31],[443.75,0.21,50,58],[444,0.3,62,31],[444,0.21,50,58],[444.733,0.3,69,31],[444.75,0.21,50,58],[445,0.21,47,61],[445,3.8,62,8],[445.75,0.21,47,61],[446,0.21,47,61],[446.75,0.21,47,61],[447,0.21,47,65],[447.75,0.21,47,65],[447.75,0.23,62,75],[448,0.21,47,65],[448,0.92,59,75],[448.75,0.21,47,65],[449,0.21,43,68],[449,3.8,55,14],[449,0.46,62,83],[449.5,0.46,67,83],[449.75,0.21,43,68],[450,0.21,43,68],[450.75,0.21,43,68],[451,0.21,43,71],[451.75,0.21,43,71],[452,0.21,43,71],[452.4,0.3,59,38],[452.75,0.21,43,71],[453,0.3,57,40],[453,0.21,45,75],[453,3.8,57,23],[453.733,0.3,64,40],[453.75,0.7,64,11],[453.75,0.21,45,75],[454,0.21,45,75],[454.4,0.3,61,40],[454.75,0.7,73,11],[454.75,0.21,45,75],[455,0.21,50,69],[455.375,0.7,66,20],[455.4,0.3,66,37],[455.75,0.21,50,69],[456,0.3,62,37],[456,0.21,50,69],[456.733,0.3,69,37],[456.75,0.21,50,69],[457,0.21,50,58],[457,3.8,62,19],[457.375,0.7,62,15],[457.75,0.21,50,58],[458,0.21,50,58],[458.75,0.21,50,58],[459,0.21,50,61],[459.75,0.21,50,61],[460,0.21,50,61],[460,0.92,62,70],[460.75,0.21,50,61],[461,0.21,47,65],[461,3.8,59,17],[461,0.46,66,79],[461.5,0.23,69,79],[461.75,0.21,47,65],[461.75,0.23,71,79],[462,0.21,47,65],[462,0.46,69,79],[462.75,0.21,47,65],[463,0.21,47,68],[463.25,0.414,52,26],[463.75,0.21,47,68],[464,0.21,47,68],[464.75,0.21,47,68],[465,0.3,55,38],[465,0.21,43,72],[465,3.8,55,9],[465.733,0.3,62,38],[465.75,0.7,62,10],[465.75,0.21,43,72],[466,0.21,43,72],[466.4,0.3,59,38],[466.75,0.7,69,10],[466.75,0.21,43,72],[467,0.3,55,40],[467,0.21,43,75],[467.4,0.3,59,40],[467.75,0.7,67,10],[467.75,0.21,43,75],[468,0.3,55,40],[468,0.21,43,75],[468.733,0.3,62,40],[468.75,0.21,43,75],[469,0.21,45,79],[469,3.8,64,16],[469.375,0.7,64,29],[469.4,0.3,61,59],[469.75,0.21,45,79],[470,0.21,45,79],[470.75,0.21,45,79],[471,0.21,50,73],[471.75,0.21,50,73],[472,0.21,50,73],[472.75,0.21,50,73],[473,0.207,50,58],[473,3.738,69,18],[473,0.453,62,107],[473,0.027,117,40],[473.246,0.045,117,64],[473.492,0.226,66,107],[473.492,0.027,117,35],[473.738,0.207,50,58],[473.738,0.226,69,107],[473.738,0.045,117,40],[473.984,0.207,50,58],[473.984,0.679,66,107],[473.984,0.027,117,11],[474.721,0.207,50,58],[474.721,0.226,64,107],[474.967,0.207,50,61],[475.705,0.207,50,61],[475.951,0.207,50,61],[476.688,0.207,50,61],[476.934,0.207,47,65],[476.934,3.738,66,21],[477.426,0.027,117,19],[477.656,0.295,66,48],[477.672,0.207,47,65],[477.672,0.045,117,53],[477.918,0.207,47,65],[477.918,0.027,117,43],[478.164,0.045,117,73],[478.312,0.295,62,48],[478.41,0.027,117,42],[478.656,0.7,69,13],[478.656,0.207,47,65],[478.656,0.045,117,51],[478.902,0.295,59,51],[478.902,0.207,47,68],[478.902,0.027,117,19],[479.623,0.295,66,51],[479.639,0.7,64,13],[479.639,0.207,47,68],[479.885,0.295,59,51],[479.885,0.207,47,68],[480.606,0.295,66,51],[480.623,0.207,47,68],[480.869,0.207,43,72],[480.869,3.738,62,19],[481.238,0.7,62,27],[481.262,0.295,59,54],[481.606,0.207,43,72],[481.852,0.295,55,54],[481.852,0.207,43,72],[482.221,0.7,69,27],[482.344,0.027,117,15],[482.59,0.207,43,72],[482.59,0.045,117,51],[482.836,0.207,43,75],[482.836,0.027,117,47],[483.082,0.045,117,84],[483.328,0.027,117,51],[483.574,0.207,43,75],[483.574,0.045,117,67],[483.82,0.207,43,75],[483.82,0.027,117,27],[484.066,0.045,117,12],[484.557,0.207,43,75],[484.803,0.207,45,79],[484.803,3.738,64,11],[484.803,0.453,64,146],[485.295,0.226,66,146],[485.541,0.207,45,79],[485.541,0.226,69,146],[485.787,0.207,45,79],[485.787,0.679,73,146],[486.525,0.207,45,79],[486.525,0.226,69,146],[486.771,0.207,50,73],[486.771,0.453,66,146],[487.262,0.027,117,9],[487.508,0.207,50,73],[487.508,0.045,117,43],[487.754,0.207,50,73],[487.754,0.027,117,42],[488,0.045,117,79],[488.246,0.027,117,51],[488.492,0.207,50,73],[488.492,0.045,117,71],[488.738,0.203,50,61],[488.738,3.677,66,12],[488.738,0.027,117,26],[488.98,0.045,117,19],[489.464,0.203,50,61],[489.705,0.203,50,61],[490.092,0.29,66,45],[490.431,0.203,50,60],[490.673,0.29,62,48],[490.673,0.203,50,64],[491.06,0.29,66,11],[491.157,0.11,98,26],[491.157,0.095,54,29],[491.383,0.29,69,45],[491.399,0.7,78,11],[491.399,0.203,50,60],[491.641,0.29,62,21],[491.641,0.203,50,58],[491.883,0.045,117,10],[492.028,0.29,66,38],[492.125,0.11,98,62],[492.125,0.095,54,70],[492.125,0.027,117,28],[492.351,0.29,69,32],[492.367,0.203,50,42],[492.367,0.045,117,67],[492.609,0.203,47,35],[492.609,3.677,62,19],[492.609,0.027,117,48],[492.851,0.045,117,57],[492.996,0.29,62,12],[493.092,0.11,98,100],[493.092,0.095,54,113],[493.092,0.027,117,12],[493.334,0.223,71,9],[493.576,0.445,69,40],[494.06,0.11,98,65],[494.06,0.095,54,73],[494.06,0.445,66,97],[494.544,0.668,76,126],[495.028,0.027,117,23],[495.254,0.29,66,46],[495.27,0.045,117,76],[495.512,0.03,99,80],[495.512,0.055,50,213],[495.512,0.027,117,45],[495.572,0.16,39,201],[495.572,0.14,51,120],[495.754,0.045,117,21],[495.899,0.29,62,32],[496.222,0.29,66,39],[496.238,0.03,99,20],[496.238,0.055,50,53],[496.298,0.16,39,25],[496.298,0.14,51,15],[496.48,0.203,43,14],[496.48,3.677,59,23],[496.48,3.677,62,15],[496.842,0.7,62,10],[496.867,0.29,59,19],[497.205,0.203,43,50],[497.205,0.045,117,34],[497.447,0.203,43,32],[497.447,0.223,69,94],[497.447,0.027,117,53],[497.689,0.045,117,58],[497.834,0.29,59,15],[497.931,0.11,98,92],[497.931,0.095,54,104],[498.173,0.7,69,11],[498.415,0.29,55,41],[498.415,0.03,99,32],[498.415,0.055,50,84],[498.475,0.16,39,113],[498.475,0.14,51,68],[498.657,0.267,67,16],[498.778,0.7,79,21],[498.802,0.29,59,44],[499.141,0.045,117,69],[499.383,0.89,74,14],[499.383,0.027,117,50],[500.109,0.203,43,37],[500.351,0.29,57,46],[500.351,3.677,57,74],[500.714,0.7,64,22],[500.738,0.29,61,46],[500.834,0.027,117,55],[501.076,0.045,117,60],[501.318,0.03,99,89],[501.318,0.055,50,238],[501.318,0.668,73,46],[501.378,0.16,39,205],[501.378,0.14,51,123],[502.044,0.203,45,56],[502.044,0.223,69,44],[502.286,0.29,62,35],[502.286,0.203,50,43],[502.286,0.027,117,40],[502.528,0.045,117,73],[502.649,0.7,78,21],[502.673,0.29,66,38],[502.77,0.11,98,74],[502.77,0.095,54,84],[503.254,0.03,99,77],[503.254,0.055,50,205],[503.254,0.89,74,155],[503.314,0.16,39,208],[503.314,0.14,51,125],[503.496,0.534,62,16],[503.738,0.027,117,36],[503.98,0.203,50,36],[503.98,0.045,117,77],[504.222,0.29,62,34],[504.222,0.203,50,43],[504.222,3.677,66,24],[504.584,0.7,62,17],[504.609,0.29,66,34],[504.705,0.11,98,86],[504.705,0.095,54,96],[504.947,0.223,69,121],[505.189,0.03,99,38],[505.189,0.055,50,102],[505.189,0.668,66,105],[505.189,0.027,117,26],[505.249,0.16,39,125],[505.249,0.14,51,75],[505.431,0.045,117,63],[505.576,0.29,66,16],[505.915,0.7,66,9],[505.915,0.203,50,8],[506.157,0.29,62,17],[506.157,0.203,50,40],[506.52,0.7,78,12],[506.544,0.29,66,22],[506.641,0.11,98,92],[506.641,0.095,54,103],[506.641,0.027,117,20],[506.883,0.045,117,71],[507.125,0.89,74,126],[507.125,0.027,117,9],[507.185,0.16,39,13],[507.185,0.14,51,8],[507.512,0.29,66,34],[507.834,0.29,69,25],[508.092,3.677,62,66],[508.334,0.045,117,69],[508.48,0.29,62,9],[508.576,0.095,54,7],[508.576,0.223,69,9],[508.576,0.027,117,36],[508.818,0.203,47,32],[508.818,0.223,71,106],[509.06,0.445,69,143],[509.544,0.11,98,9],[509.544,0.095,54,10],[509.544,0.445,66,12],[509.77,0.29,66,21],[510.028,0.29,59,10],[510.028,0.03,99,78],[510.028,0.055,50,207],[510.028,0.027,117,45],[510.088,0.16,39,200],[510.088,0.14,51,120],[510.27,0.045,117,67],[510.391,0.7,76,14],[510.415,0.29,62,28],[510.754,0.223,74,16],[510.996,0.203,47,34],[510.996,0.89,71,95],[511.48,0.11,98,33],[511.48,0.095,54,37],[511.722,0.203,47,33],[511.722,0.045,117,14],[511.964,0.203,43,10],[511.964,3.677,55,48],[511.964,0.445,62,28],[511.964,0.027,117,47],[512.205,0.045,117,78],[512.351,0.29,59,24],[512.447,0.11,98,78],[512.447,0.095,54,88],[512.447,0.027,117,16],[512.673,0.29,62,14],[512.689,0.7,62,11],[512.931,0.29,55,42],[512.931,0.03,99,12],[512.931,0.055,50,31],[512.991,0.16,39,51],[512.991,0.14,51,30],[513.294,0.7,69,15],[513.641,0.29,62,11],[513.899,0.03,99,88],[513.899,0.055,50,235],[513.899,0.445,79,16],[513.959,0.16,39,217],[513.959,0.14,51,130],[514.141,0.045,117,35],[514.383,0.223,78,107],[514.383,0.027,117,50],[514.625,0.223,76,135],[514.625,0.134,66,17],[514.625,0.045,117,87],[514.867,0.03,99,24],[514.867,0.055,50,65],[514.867,0.89,74,44],[514.867,0.134,64,9],[514.867,0.027,117,38],[514.927,0.16,39,48],[514.927,0.14,51,29],[515.109,0.045,117,10],[515.592,0.203,43,21],[515.835,0.29,57,25],[515.835,0.203,45,32],[515.835,3.677,57,42],[516.544,0.29,64,39],[516.56,0.7,64,10],[516.56,0.203,45,50],[516.802,0.203,45,53],[517.189,0.29,61,44],[517.512,0.29,64,46],[517.528,0.7,73,12],[517.528,0.203,45,57],[517.528,0.045,117,35],[517.77,0.203,50,53],[517.77,0.027,117,40],[518.012,0.045,117,81],[518.133,0.7,78,23],[518.157,0.29,66,43],[518.254,0.027,117,54],[518.496,0.203,50,54],[518.496,0.045,117,75],[518.738,0.29,62,43],[518.738,0.203,50,54],[518.738,0.027,117,34],[518.98,0.045,117,24],[519.447,0.29,69,43],[519.463,0.203,50,54],[519.705,0.207,50,41],[519.705,3.738,62,50],[520.074,0.7,62,16],[520.443,0.207,50,41],[520.689,0.207,50,41],[521.427,0.207,50,41],[521.673,0.207,50,43],[522.41,0.207,50,43],[522.41,0.045,117,27],[522.656,0.207,50,43],[522.656,0.905,62,121],[522.656,0.027,117,31],[522.902,0.045,117,63],[523.148,0.027,117,43],[523.394,0.207,50,43],[523.394,0.045,117,64],[523.64,0.207,47,46],[523.64,3.738,59,34],[523.64,0.453,66,136],[523.64,0.027,117,33],[523.886,0.045,117,30],[524.132,0.226,69,109],[524.378,0.207,47,46],[524.378,0.226,71,109],[524.624,0.207,47,46],[524.624,0.453,69,109],[525.361,0.207,47,46],[525.607,0.207,47,48],[526.345,0.207,47,48],[526.591,0.207,47,48],[527.328,0.207,47,48],[527.328,0.045,117,20],[527.574,0.295,55,46],[527.574,0.207,43,51],[527.574,3.738,62,31],[527.574,0.027,117,31],[527.82,0.045,117,69],[528.066,0.027,117,50],[528.296,0.295,62,46],[528.312,0.7,62,12],[528.312,0.207,43,51],[528.312,0.045,117,78],[528.558,0.207,43,51],[528.558,0.027,117,41],[528.804,0.045,117,42],[528.951,0.295,59,46],[529.05,0.027,117,8],[529.296,0.7,69,12],[529.296,0.207,43,51],[529.542,0.295,55,49],[529.542,0.207,43,53],[529.935,0.295,59,49],[530.279,0.7,67,12],[530.279,0.207,43,53],[530.525,0.295,55,49],[530.525,0.207,43,53],[531.246,0.295,62,49],[531.263,0.207,43,53],[531.509,0.207,45,56],[531.509,3.738,64,64],[531.878,0.7,64,25],[531.902,0.295,61,51],[532.246,0.207,45,56],[532.246,0.045,117,12],[532.492,0.207,45,56],[532.492,0.027,117,28],[532.738,0.045,117,70],[532.984,0.027,117,54],[533.23,0.207,45,56],[533.23,0.045,117,88],[533.476,0.207,50,51],[533.476,0.027,117,45],[533.722,0.045,117,51],[533.968,0.027,117,15],[534.214,0.207,50,51],[534.46,0.207,50,51],[535.197,0.207,50,51],[535.443,0.214,50,41],[535.443,3.864,69,56],[535.443,0.468,62,97],[535.952,0.234,66,97],[536.206,0.214,50,41],[536.206,0.234,69,97],[536.46,0.214,50,41],[536.46,0.702,66,97],[537.223,0.214,50,41],[537.223,0.234,64,97],[537.477,0.214,50,43],[538.24,0.214,50,43],[538.494,0.214,50,43],[539.257,0.214,50,43],[539.511,0.214,47,46],[539.511,3.864,66,57],[540.257,0.305,66,42],[540.274,0.214,47,46],[540.528,0.214,47,46],[540.935,0.305,62,42],[541.291,0.214,47,46],[541.545,0.305,59,44],[541.545,0.214,47,48],[542.308,0.214,47,48],[542.562,0.305,59,44],[542.562,0.214,47,48],[543.308,0.305,66,44],[543.324,0.214,47,48],[543.579,0.214,43,51],[543.579,3.864,62,38],[543.96,0.7,62,23],[543.986,0.305,59,46],[544.341,0.214,43,51],[544.596,0.305,55,46],[544.596,0.214,43,51],[544.977,0.7,69,23],[545.358,0.214,43,51],[545.613,0.214,43,53],[546.375,0.214,43,53],[546.63,0.214,43,53],[547.392,0.214,43,53],[547.646,4.068,74,55],[547.646,0.214,45,56],[547.646,4.068,50,41],[547.646,3.864,61,35],[547.646,0.468,64,132],[548.155,0.234,66,132],[548.409,0.214,45,56],[548.409,0.234,69,132],[548.663,0.214,45,56],[548.663,0.702,73,132],[549.426,0.214,45,56],[549.426,0.234,69,132],[549.68,0.214,50,51],[549.68,0.468,66,132],[550.443,0.214,50,51],[550.697,0.214,50,51],[551.46,0.214,50,51],[558.633,0.193,71,29],[559.769,0.58,79,30],[560.678,0.773,74,30],[565.905,0.193,71,22],[567.042,0.58,79,22],[567.951,0.773,74,22],[568.86,0.58,67,16],[568.86,0.227,43,58],[569.542,0.193,67,22],[569.769,0.773,67,22],[569.769,0.227,50,52],[570.678,0.58,67,22],[570.678,0.227,43,58],[571.36,0.193,67,22],[571.587,0.773,67,22],[571.587,0.227,50,52],[572.496,0.58,67,22],[572.496,0.227,43,58],[573.178,0.193,67,16],[573.405,0.773,67,16],[573.405,0.227,50,52],[574.314,0.58,67,16],[574.314,0.227,43,58],[574.996,0.193,67,16],[575.223,0.773,67,16],[575.223,0.227,50,52],[576.133,0.58,67,16],[576.133,0.227,43,58],[576.814,0.193,67,16],[577.042,0.773,67,24],[577.042,0.227,50,52],[577.951,0.58,67,24],[577.951,0.227,43,58],[578.633,0.193,67,24],[578.86,0.773,67,24],[578.86,0.227,50,52],[579.769,0.58,67,24],[579.769,0.227,43,58],[580.451,0.193,67,24],[580.678,0.773,67,24],[580.678,0.227,50,52],[581.587,0.58,67,29],[581.587,0.227,43,58],[582.269,0.193,67,29],[582.496,0.773,67,29],[582.496,0.227,50,52],[587.723,0.193,83,41],[588.86,0.58,91,41],[589.769,0.773,86,41],[590.678,0.159,79,54],[590.678,0.159,43,69],[592.437,0.277,48,21],[592.437,4.385,67,22],[592.726,0.035,117,8],[592.87,0.277,55,21],[593.302,0.035,117,11],[593.591,0.346,72,23],[593.591,0.277,48,21],[594.283,0.27,64,27],[594.283,0.03,83,9],[594.303,0.31,57,14],[594.456,0.219,72,13],[594.456,0.277,47,21],[594.745,0.277,48,22],[595.033,0.219,79,13],[595.177,0.7,76,11],[595.177,0.277,55,22],[595.591,0.346,79,23],[595.899,0.277,48,21],[596.476,0.07,98,9],[596.591,0.27,64,25],[596.591,0.03,83,9],[596.611,0.31,57,13],[596.764,0.277,44,19],[597.052,0.346,69,16],[597.052,0.277,45,19],[597.052,4.385,64,19],[597.341,0.035,117,10],[597.485,0.277,52,16],[597.514,0.346,72,17],[597.629,0.07,98,17],[597.745,0.27,64,25],[597.745,0.03,83,9],[597.765,0.31,57,13],[597.918,0.035,117,9],[598.206,0.277,45,10],[598.783,0.07,98,22],[599.052,0.346,76,25],[599.937,0.07,98,19],[600.052,0.27,64,25],[600.052,0.03,83,9],[600.072,0.31,57,12],[600.514,0.346,69,22],[600.802,0.035,117,7],[601.379,0.035,117,12],[601.668,0.27,48,11],[601.668,0.055,50,12],[601.668,4.385,53,13],[601.728,0.16,39,13],[601.728,0.14,51,8],[602.129,0.346,69,15],[602.514,0.346,72,18],[602.822,0.219,69,7],[602.822,0.27,48,43],[602.822,0.03,83,15],[602.822,0.03,99,16],[602.822,0.055,50,44],[602.842,0.31,42,22],[602.882,0.16,39,42],[602.882,0.14,51,25],[603.687,0.219,65,15],[603.976,0.346,65,28],[603.976,0.27,48,48],[603.976,0.03,83,17],[603.976,0.03,99,17],[603.976,0.055,50,47],[603.995,0.31,42,24],[604.035,0.16,39,43],[604.035,0.14,51,26],[604.264,0.219,72,14],[604.264,0.035,117,9],[604.408,0.7,77,8],[604.841,0.035,117,13],[605.129,0.219,69,15],[605.129,0.27,48,22],[605.129,0.03,83,8],[605.129,0.03,99,8],[605.129,0.055,50,22],[605.149,0.31,42,11],[605.189,0.16,39,19],[605.189,0.14,51,11],[605.591,0.346,69,29],[606.283,0.277,43,9],[606.283,4.385,62,33],[606.716,0.277,50,17],[607.129,0.346,74,18],[607.437,0.346,67,22],[607.437,0.277,43,27],[608.129,0.27,64,32],[608.129,0.03,83,11],[608.149,0.31,57,16],[608.302,0.277,47,34],[608.302,0.035,117,14],[608.591,2.077,48,37],[609.052,0.346,76,27],[609.456,0.7,76,8],[610.437,0.173,65,20],[610.899,4.56,64,18],[612.819,0.27,64,26],[612.819,0.03,83,9],[612.839,0.31,57,13],[614.499,0.228,76,16],[615.219,0.27,64,27],[615.219,0.03,83,10],[615.239,0.31,57,14],[615.699,4.56,60,26],[616.599,0.7,76,8],[617.349,0.7,79,15],[617.619,0.27,64,29],[617.619,0.03,83,10],[617.639,0.31,57,14],[620.019,0.27,64,30],[620.019,0.03,83,11],[620.039,0.31,57,15],[620.199,0.228,76,18],[620.499,0.36,65,33],[620.499,4.56,57,18],[621.379,0.36,72,33],[622.179,0.36,69,33],[622.419,0.27,64,32],[622.419,0.03,83,11],[622.439,0.31,57,16],[622.899,0.36,65,35],[623.779,0.36,72,35],[623.799,0.7,77,9],[624.579,0.36,69,35],[624.819,0.27,64,33],[624.819,0.03,83,12],[624.839,0.31,57,17],[625.299,0.36,67,37],[625.299,4.56,59,8],[625.749,0.7,74,18],[626.179,0.36,74,37],[626.979,0.36,71,37],[627.219,0.27,64,35],[627.219,0.03,83,12],[627.239,0.31,57,17],[627.699,0.36,72,34],[628.579,0.36,79,34],[629.379,0.18,64,24],[630.099,4.75,60,11],[632.099,0.27,64,23],[632.099,0.03,83,8],[632.119,0.31,57,11],[634.599,0.27,64,24],[634.599,0.03,83,8],[634.619,0.31,57,12],[635.099,4.75,57,17],[635.567,0.7,76,13],[637.099,0.27,64,25],[637.099,0.03,83,9],[637.119,0.31,57,13],[639.599,0.27,64,27],[639.599,0.03,83,9],[639.619,0.31,57,13],[640.099,4.75,53,16],[642.099,0.27,64,28],[642.099,0.03,83,10],[642.119,0.31,57,14],[643.067,0.7,77,15],[644.599,0.27,64,30],[644.599,0.03,83,10],[644.619,0.31,57,15],[645.099,4.75,55,8],[647.099,0.27,64,31],[647.099,0.03,83,11],[647.119,0.31,57,15],[649.599,0.188,65,21],[650.577,0.7,72,11],[658.237,0.7,74,12],[667.173,0.7,83,13],[669.758,0.192,64,17],[690.872,0.196,65,16],[721.212,2.4,76,39],[771.412,0.27,48,65],[771.412,0.03,83,23],[771.432,0.31,42,32]],[[36.325,0.427,74,169],[43.24,0.333,76,199],[46.2,0.666,74,199],[51.02,0.756,76,199],[55.5,0.396,72,199],[57.26,0.396,76,177],[60.26,0.15,67,173],[60.42,0.36,72,22],[61.62,0.36,72,22],[62.82,0.36,72,23],[64.02,0.36,72,23],[65.22,0.36,69,24],[66.42,0.36,69,24],[67.62,0.36,69,25],[68.82,0.36,69,25],[70.02,0.36,65,22],[71.22,0.36,65,22],[72.42,0.36,65,23],[73.62,0.36,65,23],[74.82,0.36,67,24],[76.02,0.36,67,24],[77.22,0.36,72,22],[79.38,0.18,67,22],[79.62,0.353,72,29],[80.796,0.353,72,29],[81.973,0.353,72,31],[83.149,0.353,72,31],[84.326,0.353,69,32],[85.502,0.353,69,32],[86.679,0.353,69,23],[86.973,0.224,69,13],[87.855,0.353,69,23],[92.561,0.224,69,14],[98.208,0.176,67,31],[98.444,0.346,72,39],[98.732,0.035,117,8],[99.309,0.035,117,10],[99.597,0.346,72,39],[99.597,0.219,76,22],[100.751,0.346,72,20],[101.184,0.7,76,9],[101.905,0.346,72,20],[103.059,0.346,69,21],[103.924,0.035,117,11],[104.213,0.346,69,21],[104.501,0.035,117,10],[105.078,0.219,76,12],[105.367,0.346,69,22],[105.655,0.219,69,13],[106.52,0.346,69,35],[108.54,0.035,117,7],[109.117,0.035,117,13],[109.261,0.7,79,18],[109.694,0.035,117,9],[111.136,0.219,69,21],[113.732,0.035,117,11],[114.309,0.035,117,14],[116.674,0.173,67,19],[117.814,0.227,57,10],[117.814,0.227,60,10],[117.814,0.227,64,10],[119.178,0.227,57,10],[119.178,0.227,60,10],[119.178,0.227,64,10],[120.541,0.227,62,10],[120.541,0.227,65,10],[120.541,0.227,69,10],[121.905,0.227,64,10],[121.905,0.227,68,10],[121.905,0.227,71,10],[123.269,0.227,57,10],[123.269,0.227,60,10],[123.269,0.227,64,10],[124.632,0.227,65,10],[124.632,0.227,69,10],[124.632,0.227,72,10],[125.996,0.227,62,10],[125.996,0.227,65,10],[125.996,0.227,69,10],[127.36,0.227,64,10],[127.36,0.227,68,10],[127.36,0.227,71,10],[128.723,0.227,57,10],[128.723,0.227,60,10],[128.723,0.227,64,10],[130.087,0.227,57,10],[130.087,0.227,60,10],[130.087,0.227,64,10],[131.451,0.227,62,10],[131.451,0.227,65,10],[131.451,0.227,69,10],[132.814,0.227,64,10],[132.814,0.227,68,10],[132.814,0.227,71,10],[134.178,0.227,57,10],[134.178,0.227,60,10],[134.178,0.227,64,10],[135.541,0.227,65,9],[135.541,0.227,69,9],[135.541,0.227,72,9],[136.905,0.227,64,9],[136.905,0.227,68,9],[136.905,0.227,71,9],[138.269,0.227,57,9],[138.269,0.227,60,9],[138.269,0.227,64,9],[138.723,0.045,111,17],[138.951,0.191,72,10],[139.405,0.045,111,14],[139.632,0.227,57,9],[139.632,0.227,60,9],[139.632,0.227,64,9],[140.996,0.227,57,9],[140.996,0.227,60,9],[140.996,0.227,64,9],[142.36,0.227,62,9],[142.36,0.227,65,9],[142.36,0.227,69,9],[142.36,0.409,79,26],[143.496,0.045,111,8],[143.723,0.227,64,9],[143.723,0.227,68,9],[143.723,0.227,71,9],[143.723,0.191,83,10],[144.178,0.045,111,22],[145.087,0.227,57,11],[145.087,0.227,60,11],[145.087,0.227,64,11],[145.769,0.191,77,12],[146.451,0.227,65,11],[146.451,0.227,69,11],[146.451,0.227,72,11],[146.451,0.409,76,31],[147.814,0.227,62,11],[147.814,0.227,65,11],[147.814,0.227,69,11],[148.951,0.045,111,14],[149.178,0.227,64,11],[149.178,0.227,68,11],[149.178,0.227,71,11],[149.632,0.045,111,16],[150.541,0.227,57,11],[150.541,0.227,60,11],[150.541,0.227,64,11],[150.541,0.409,77,33],[150.541,0.191,72,12],[151.905,0.227,57,11],[151.905,0.227,60,11],[151.905,0.227,64,11],[152.587,0.191,81,12],[153.269,0.227,62,11],[153.269,0.227,65,11],[153.269,0.227,69,11],[153.723,0.045,111,17],[154.405,0.045,111,14],[154.632,0.227,64,13],[154.632,0.227,68,13],[154.632,0.227,71,13],[155.087,0.818,74,38],[155.996,0.227,57,13],[155.996,0.227,60,13],[155.996,0.227,64,13],[157.36,0.227,65,13],[157.36,0.227,69,13],[157.36,0.227,72,13],[157.36,0.191,77,14],[158.269,0.409,72,38],[158.496,0.045,111,8],[158.723,0.227,64,13],[158.723,0.227,68,13],[158.723,0.227,71,13],[159.178,0.045,111,22],[159.405,0.191,72,14],[160.087,0.227,57,13],[160.087,0.227,60,13],[160.087,0.227,64,13],[161.451,0.227,57,15],[161.451,0.227,60,15],[161.451,0.227,64,15],[161.905,1.227,73,14],[162.814,0.227,57,17],[162.814,0.227,60,17],[162.814,0.227,64,17],[163.951,0.045,111,14],[164.178,0.227,62,17],[164.178,0.227,65,17],[164.178,0.227,69,17],[164.178,0.191,69,20],[164.632,0.045,111,16],[165.541,0.227,64,17],[165.541,0.227,68,17],[165.541,0.227,71,17],[166.223,0.191,57,20],[166.905,0.227,57,17],[166.905,0.227,60,17],[166.905,0.227,64,17],[166.905,0.409,73,17],[168.269,0.227,65,17],[168.269,0.227,69,17],[168.269,0.227,72,17],[168.723,0.045,111,17],[169.405,0.045,111,14],[169.632,0.227,62,17],[169.632,0.227,65,17],[169.632,0.227,69,17],[170.087,1.227,68,17],[170.996,0.227,64,15],[170.996,0.227,68,15],[170.996,0.227,71,15],[170.996,0.191,68,18],[172.36,0.227,57,15],[172.36,0.227,60,15],[172.36,0.227,64,15],[173.041,0.191,64,18],[173.496,0.045,111,8],[173.723,0.227,57,15],[173.723,0.227,60,15],[173.723,0.227,64,15],[174.178,0.045,111,22],[175.087,0.227,62,15],[175.087,0.227,65,15],[175.087,0.227,69,15],[175.087,0.409,75,16],[176.451,0.227,64,15],[176.451,0.227,68,15],[176.451,0.227,71,15],[177.814,0.227,57,15],[177.814,0.227,60,15],[177.814,0.227,64,15],[177.814,0.191,57,18],[178.951,0.045,111,14],[179.178,0.227,65,15],[179.178,0.227,69,15],[179.178,0.227,72,15],[179.178,0.409,73,16],[179.632,0.045,111,16],[179.86,0.191,68,15],[180.541,0.227,64,13],[180.541,0.227,68,13],[180.541,0.227,71,13],[181.905,0.227,57,13],[181.905,0.227,60,13],[181.905,0.227,64,13],[183.327,0.242,57,12],[183.327,0.242,60,12],[183.327,0.242,64,12],[184.779,0.242,65,12],[184.779,0.242,69,12],[184.779,0.242,72,12],[186.231,0.242,64,12],[186.231,0.242,68,12],[186.231,0.242,71,12],[187.682,0.242,57,12],[187.682,0.242,60,12],[187.682,0.242,64,12],[189.238,0.268,57,12],[189.238,0.268,60,12],[189.238,0.268,64,12],[190.845,0.268,65,12],[190.845,0.268,69,12],[190.845,0.268,72,12],[192.452,0.268,64,12],[192.452,0.268,68,12],[192.452,0.268,71,12],[192.988,1.607,69,28],[194.059,0.268,57,12],[194.059,0.268,60,12],[194.059,0.268,64,12],[195.195,0.158,65,15],[195.392,0.158,67,15],[196.774,0.158,60,11],[196.971,0.158,58,11],[197.168,0.158,72,15],[197.366,0.158,70,15],[198.747,0.158,69,15],[198.945,0.158,70,15],[200.326,0.158,56,11],[200.524,0.158,55,11],[200.721,0.158,69,15],[200.918,0.158,67,15],[202.3,0.158,72,27],[202.497,0.158,74,27],[203.879,0.158,56,20],[204.076,0.158,58,20],[205.383,0.143,67,20],[205.561,0.143,65,20],[205.74,0.143,76,27],[205.918,0.143,77,27],[207.168,0.143,60,20],[207.347,0.143,62,17],[208.597,0.143,63,17],[208.775,0.143,62,17],[208.954,0.143,76,23],[209.133,0.143,74,23],[210.383,0.143,63,17],[210.383,0.143,65,23],[210.561,0.143,65,17],[210.561,0.143,67,23],[211.811,0.143,60,17],[211.99,0.143,58,17],[212.168,0.143,72,23],[212.347,0.143,70,23],[213.566,0.13,69,34],[213.729,0.13,70,34],[214.87,0.13,56,25],[215.033,0.13,55,25],[215.196,0.13,69,34],[215.359,0.13,67,34],[216.501,0.13,72,34],[216.664,0.13,74,34],[217.805,0.13,56,25],[217.968,0.13,58,25],[219.031,0.114,69,53],[219.528,0.114,74,53],[220.462,0.5,102,108],[223.328,0.143,67,35],[223.506,0.143,65,35],[223.685,0.143,76,47],[223.864,0.143,77,47],[225.114,0.143,60,35],[225.292,0.143,62,35],[226.542,0.143,63,43],[226.721,0.143,62,43],[226.899,0.143,76,57],[227.078,0.143,74,57],[228.328,0.143,63,43],[228.328,0.13,65,57],[228.491,0.13,67,57],[228.506,0.143,65,43],[229.632,0.13,60,43],[229.795,0.13,58,43],[229.958,0.13,72,57],[230.121,0.13,70,57],[231.263,0.13,69,67],[231.426,0.13,70,67],[232.567,0.13,56,50],[232.73,0.13,55,50],[232.893,0.13,69,67],[233.056,0.13,67,67],[234.145,0.12,72,67],[234.295,0.12,74,67],[235.345,0.12,56,50],[235.495,0.12,58,50],[236.545,0.12,67,31],[236.695,0.12,65,31],[236.845,0.12,76,42],[236.995,0.12,77,42],[238.045,0.12,60,31],[238.195,0.12,62,31],[238.873,0.105,69,47],[239.331,0.105,74,47],[240.193,0.5,102,108],[254.574,0.04,99,43],[255.288,0.16,48,49],[255.288,0.03,99,22],[256.717,0.16,48,49],[256.717,0.03,99,22],[267.431,0.25,67,55],[268.86,0.04,99,43],[269.217,0.25,77,46],[269.574,0.16,43,49],[269.574,0.03,99,22],[271.002,0.16,43,49],[271.002,0.03,99,22],[277.431,1.429,75,42],[283.145,0.04,99,43],[283.502,0.16,48,49],[283.502,0.03,99,22],[284.217,0.16,48,49],[284.217,0.03,99,22],[284.931,0.16,48,49],[284.931,0.03,99,22],[285.645,0.16,48,49],[285.645,0.03,99,22],[297.431,1.071,36,58],[301.488,6.333,72,12],[302.599,0.444,69,35],[303.988,0.444,65,35],[305.377,0.444,65,35],[306.766,0.444,64,35],[308.155,0.444,53,35],[308.155,6.333,72,18],[309.544,0.444,72,35],[310.933,0.444,65,35],[312.044,0.444,65,9],[312.322,0.444,70,47],[313.433,0.444,64,12],[313.71,0.444,67,46],[314.822,0.444,53,17],[315.099,0.444,57,45],[316.21,0.444,72,21],[316.488,0.444,53,43],[317.599,0.444,69,26],[317.877,0.444,72,39],[318.988,0.444,70,32],[319.266,0.444,74,35],[320.377,0.444,67,37],[320.655,0.444,72,29],[321.488,6.333,69,16],[321.766,0.444,57,42],[322.044,0.444,60,22],[323.155,0.444,50,28],[323.433,0.444,53,9],[324.544,0.444,69,29],[325.933,0.444,74,29],[327.044,0.444,67,8],[327.322,0.444,72,28],[328.155,6.333,65,8],[328.433,0.444,57,14],[328.71,0.444,60,25],[329.266,0.065,99,10],[329.544,0.065,99,11],[329.822,0.444,53,20],[330.099,0.444,57,21],[330.655,0.5,79,19],[330.933,0.065,99,13],[331.21,0.444,72,25],[331.21,0.065,99,14],[331.488,0.444,58,15],[332.322,0.75,77,9],[332.599,0.444,74,28],[332.599,0.065,99,16],[332.877,0.444,77,7],[332.877,0.065,99,16],[333.71,0.5,81,22],[333.988,0.444,72,26],[334.266,0.065,99,17],[334.544,0.065,99,17],[335.377,0.444,60,26],[335.933,0.065,99,16],[336.21,0.065,99,15],[336.488,0.444,50,12],[336.766,0.444,53,23],[337.599,0.065,99,13],[337.877,0.444,69,18],[337.877,0.25,76,16],[337.877,0.065,99,12],[338.155,0.444,58,19],[338.988,0.75,76,18],[339.266,0.444,74,22],[339.266,0.065,99,9],[339.544,0.444,77,13],[339.544,0.065,99,8],[340.655,0.444,72,25],[342.044,0.444,60,26],[343.155,0.75,69,18],[343.155,0.055,50,11],[343.215,0.16,39,11],[343.433,0.444,57,18],[343.988,0.055,50,19],[344.048,0.16,39,18],[344.048,0.14,51,11],[344.544,0.444,72,8],[344.822,0.444,58,16],[344.822,0.03,99,10],[344.822,0.055,50,27],[344.882,0.16,39,25],[344.882,0.14,51,15],[345.099,0.065,99,9],[345.377,0.065,99,10],[345.655,0.03,99,13],[345.655,0.055,50,33],[345.715,0.16,39,32],[345.715,0.14,51,19],[345.933,0.444,74,12],[346.21,0.444,77,13],[346.488,0.5,67,9],[346.488,0.03,99,15],[346.488,0.055,50,39],[346.548,0.16,39,37],[346.548,0.14,51,22],[346.766,0.065,99,13],[347.044,0.065,99,13],[347.322,0.444,72,15],[347.322,0.03,99,17],[347.322,0.055,50,44],[347.382,0.16,39,42],[347.382,0.14,51,25],[347.599,0.444,76,10],[347.599,0.5,70,11],[348.155,0.03,99,18],[348.155,0.055,50,48],[348.155,6.333,69,39],[348.215,0.16,39,45],[348.215,0.14,51,27],[348.433,0.065,99,15],[348.71,0.444,60,17],[348.71,0.065,99,16],[348.988,0.03,99,19],[348.988,0.055,50,51],[349.048,0.16,39,48],[349.048,0.14,51,29],[349.822,0.03,99,20],[349.822,0.055,50,52],[349.882,0.16,39,49],[349.882,0.14,51,29],[350.099,0.444,53,18],[350.099,0.065,99,17],[350.377,0.065,99,17],[350.655,0.03,99,20],[350.655,0.055,50,53],[350.715,0.16,39,50],[350.715,0.14,51,30],[351.488,0.444,58,18],[351.488,0.75,62,13],[351.488,0.03,99,20],[351.488,0.055,50,53],[351.548,0.16,39,49],[351.548,0.14,51,30],[351.766,0.065,99,16],[352.044,0.065,99,16],[352.322,0.03,99,19],[352.322,0.055,50,52],[352.382,0.16,39,48],[352.382,0.14,51,29],[352.877,0.444,77,18],[353.155,0.03,99,19],[353.155,0.055,50,50],[353.215,0.16,39,47],[353.215,0.14,51,28],[353.433,0.065,99,15],[353.71,0.065,99,15],[353.988,0.03,99,18],[353.988,0.055,50,48],[354.048,0.16,39,45],[354.048,0.14,51,27],[354.266,0.444,76,14],[354.822,1.5,65,9],[354.822,0.03,99,17],[354.822,0.055,50,45],[354.822,6.333,65,16],[354.882,0.16,39,42],[354.882,0.14,51,25],[355.099,0.065,99,14],[355.377,0.444,60,9],[355.377,0.065,99,13],[355.655,0.444,65,12],[355.655,0.03,99,16],[355.655,0.055,50,42],[355.715,0.16,39,39],[355.715,0.14,51,23],[356.488,0.03,99,14],[356.488,0.055,50,38],[356.548,0.16,39,36],[356.548,0.14,51,21],[356.766,0.444,57,11],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,11],[357.322,0.03,99,13],[357.322,0.055,50,35],[357.382,0.16,39,33],[357.382,0.14,51,20],[358.155,0.444,58,12],[358.155,0.03,99,12],[358.155,0.055,50,31],[358.215,0.16,39,29],[358.215,0.14,51,18],[358.433,0.444,62,9],[358.433,0.065,99,9],[358.71,0.065,99,9],[358.988,0.03,99,10],[358.988,0.055,50,28],[359.048,0.16,39,26],[359.048,0.14,51,16],[359.544,0.444,77,14],[359.822,0.03,99,9],[359.822,0.055,50,25],[359.882,0.16,39,23],[359.882,0.14,51,14],[360.099,0.065,99,7],[360.655,0.03,99,8],[360.655,0.055,50,21],[360.715,0.16,39,20],[360.715,0.14,51,12],[360.933,0.444,76,14],[361.488,0.055,50,18],[361.548,0.16,39,17],[361.548,0.14,51,10],[362.322,0.444,65,15],[362.322,0.055,50,15],[362.382,0.16,39,14],[362.382,0.14,51,9],[363.155,0.055,50,13],[363.215,0.16,39,12],[363.71,0.444,57,13],[363.988,0.055,50,11],[364.048,0.16,39,10],[364.822,0.055,50,8],[364.882,0.16,39,8],[365.099,0.444,62,23],[366.488,0.444,60,19],[367.877,0.444,79,19],[369.266,0.444,69,16],[370.655,0.444,65,12],[372.044,0.444,65,8],[375.822,0.321,60,25],[376.223,0.7,60,12],[377.679,0.321,67,25],[379.464,0.321,64,27],[381.179,0.321,57,28],[382.518,0.204,57,17],[382.652,0.7,62,13],[383.036,0.321,64,30],[384.393,4.071,57,19],[384.822,0.321,57,31],[386.536,0.321,53,51],[387.607,0.204,57,28],[388.393,0.321,60,51],[388.679,4.071,59,23],[389.482,0.7,62,16],[390.152,0.7,71,31],[390.179,0.321,59,53],[392.75,0.161,67,34],[392.964,0.31,72,41],[392.964,3.931,64,40],[393.74,0.035,117,9],[393.999,0.197,76,23],[394.257,0.035,117,11],[394.757,0.31,79,52],[395.809,0.7,76,35],[396.482,0.31,76,55],[397.102,3.931,57,8],[397.102,3.931,60,21],[397.49,0.7,76,75],[398.137,0.31,69,58],[398.913,0.197,76,32],[398.913,0.035,117,12],[399.43,0.197,69,34],[399.43,0.035,117,12],[399.93,0.31,76,61],[401.24,3.931,53,18],[401.654,0.31,69,64],[403.051,0.7,79,19],[403.309,0.31,65,68],[403.568,0.035,117,9],[403.697,0.7,77,36],[404.085,0.035,117,15],[404.344,0.197,69,38],[404.602,0.035,117,11],[405.102,0.31,72,68],[405.378,3.931,55,29],[406.827,0.31,71,72],[409.309,0.155,67,46],[409.516,0.3,84,48],[409.516,3.8,60,18],[410.266,0.7,84,11],[410.516,0.19,88,27],[410.891,0.7,88,21],[411.249,0.3,91,48],[412.916,0.3,88,61],[413.516,3.8,57,46],[413.766,0.035,117,11],[414.266,0.035,117,13],[414.516,0.3,81,64],[414.766,0.035,117,8],[415.266,0.19,88,36],[415.766,0.19,81,38],[416.249,0.3,88,67],[416.266,0.7,86,36],[417.516,3.8,53,21],[417.516,3.8,60,13],[417.891,0.7,84,75],[417.916,0.3,81,71],[418.766,0.035,117,12],[419.266,0.035,117,14],[419.516,0.3,77,84],[419.766,0.035,117,9],[420.516,0.19,81,47],[421.249,0.3,84,84],[421.516,3.8,62,44],[422.916,0.3,83,88],[423.266,0.7,95,39],[423.891,0.7,88,75],[425.316,0.15,79,57],[425.516,0.29,96,55],[425.516,3.677,67,46],[426.484,0.184,96,29],[427.193,0.29,103,52],[427.626,0.4,106,9],[428.419,0.027,117,17],[428.661,0.045,117,49],[428.806,0.29,100,55],[428.903,0.027,117,40],[429.145,0.045,117,69],[429.387,3.677,64,44],[429.387,0.027,117,43],[429.629,0.045,117,53],[429.871,0.027,117,20],[430.355,0.29,93,58],[430.718,0.7,103,43],[431.081,0.184,96,32],[431.565,0.184,93,34],[432.032,0.29,100,61],[433.258,3.677,60,38],[433.258,0.027,117,8],[433.5,0.045,117,41],[433.645,0.29,93,55],[433.742,0.027,117,41],[433.984,0.045,117,77],[434.226,0.027,117,51],[434.468,0.045,117,71],[434.71,0.027,117,33],[434.952,0.045,117,25],[435.193,0.29,89,58],[436.161,0.184,93,32],[436.871,0.29,96,58],[437.129,3.677,59,8],[437.129,3.677,62,20],[437.492,0.7,98,52],[438.339,0.045,117,25],[438.484,0.29,95,60],[438.581,0.027,117,34],[438.823,0.045,117,76],[440.032,0.218,69,79],[441,0.3,62,29],[441,0.21,50,55],[441,3.8,66,15],[441.5,0.23,66,18],[442.4,0.3,66,29],[443,0.3,62,31],[443.733,0.3,69,31],[443.75,0.7,66,8],[444.4,0.3,66,31],[445,3.8,62,19],[445.375,0.7,66,16],[445.4,0.3,62,33],[446,0.3,59,33],[446.375,0.7,69,16],[446.733,0.3,66,33],[447.375,0.7,64,16],[449,3.8,59,22],[450,0.23,69,83],[450.25,0.23,71,83],[450.5,0.46,69,83],[451,0.46,67,83],[451.5,0.23,66,83],[451.75,0.23,64,83],[452,0.92,62,83],[453,3.8,61,20],[455,0.3,62,37],[455.733,0.3,69,37],[455.75,0.7,66,11],[456.4,0.3,66,37],[457,0.3,62,31],[457,3.8,66,7],[457.4,0.3,66,31],[457.75,0.7,62,8],[458,0.3,62,31],[458.375,0.7,66,15],[458.733,0.3,69,31],[459.375,0.7,66,15],[459.4,0.3,66,33],[461,3.8,59,13],[462.5,0.46,66,79],[463,0.69,64,79],[463.75,0.23,62,79],[464,0.92,59,79],[465,3.8,55,22],[467.733,0.3,62,40],[468.4,0.3,59,40],[469,0.3,57,42],[469,3.8,57,26],[469.733,0.3,64,59],[469.75,0.7,64,16],[470,0.3,57,59],[470.375,0.7,73,29],[470.733,0.3,64,59],[471.375,0.7,66,29],[471.4,0.3,66,54],[472,0.3,62,54],[473,3.738,62,15],[473.246,0.045,117,9],[473.492,0.027,117,21],[473.738,0.045,117,51],[473.984,0.027,117,40],[474.229,0.045,117,64],[474.475,0.027,117,36],[474.721,0.045,117,41],[474.967,0.453,66,107],[474.967,0.027,117,13],[475.459,0.453,64,107],[475.951,0.905,62,107],[476.934,3.738,59,8],[476.934,0.453,66,120],[478.41,0.027,117,18],[478.656,0.045,117,51],[478.902,0.027,117,45],[479.147,0.045,117,76],[479.393,0.027,117,45],[479.639,0.045,117,55],[479.885,0.027,117,20],[480.279,0.295,62,51],[480.869,0.295,55,54],[480.869,3.738,62,14],[481.59,0.295,62,54],[481.606,0.7,62,14],[482.246,0.295,59,54],[482.574,0.295,62,54],[482.59,0.7,69,14],[483.205,0.7,67,27],[483.229,0.295,59,56],[483.328,0.027,117,14],[483.574,0.045,117,51],[483.82,0.295,55,56],[483.82,0.027,117,46],[484.066,0.045,117,83],[484.312,0.027,117,52],[484.541,0.295,62,56],[484.557,0.045,117,68],[484.803,3.738,64,24],[484.803,0.027,117,29],[485.049,0.045,117,15],[487.262,0.453,64,146],[487.508,0.272,52,45],[487.754,0.905,62,146],[488,0.543,50,45],[488.246,0.027,117,7],[488.492,0.045,117,41],[488.738,3.677,69,20],[488.738,0.445,62,113],[488.738,0.027,117,34],[488.98,0.045,117,65],[489.222,0.223,66,113],[489.222,0.027,117,43],[489.464,0.223,69,113],[489.464,0.045,117,60],[489.705,0.668,66,113],[489.705,0.027,117,27],[489.947,0.045,117,20],[490.673,0.203,50,9],[491.383,0.29,69,16],[491.399,0.203,50,22],[491.641,0.203,50,28],[492.028,0.29,66,29],[492.351,0.29,69,36],[492.367,0.203,50,48],[492.609,0.29,59,27],[492.609,0.203,47,58],[492.609,3.677,62,12],[492.609,0.027,117,8],[492.851,0.045,117,51],[492.972,0.7,66,25],[492.996,0.29,62,49],[493.092,0.027,117,47],[493.334,0.203,47,68],[493.334,0.045,117,72],[493.576,0.29,59,48],[493.576,0.203,47,65],[493.576,0.027,117,27],[493.939,0.7,69,19],[494.06,0.11,98,78],[494.06,0.095,54,88],[494.286,0.29,66,20],[494.302,0.203,47,25],[494.786,0.401,64,37],[495.028,0.11,98,83],[495.028,0.095,54,94],[495.27,0.223,74,60],[495.512,0.89,71,9],[495.512,0.027,117,24],[495.754,0.045,117,78],[495.899,0.29,62,24],[495.996,0.027,117,42],[496.238,0.03,99,78],[496.238,0.055,50,207],[496.238,0.045,117,10],[496.298,0.16,39,199],[496.298,0.14,51,120],[496.48,0.29,55,41],[496.48,0.03,99,82],[496.48,0.055,50,218],[496.48,3.677,62,72],[496.54,0.16,39,195],[496.54,0.14,51,117],[496.842,0.7,62,18],[496.867,0.29,59,38],[497.205,0.203,43,18],[497.447,0.203,43,43],[497.447,0.223,69,127],[497.689,0.223,71,158],[497.689,0.045,117,61],[497.931,0.11,98,65],[497.931,0.095,54,73],[497.931,0.445,69,129],[497.931,0.027,117,52],[498.173,0.203,43,16],[498.173,0.045,117,23],[498.415,0.29,55,16],[498.657,0.267,67,28],[499.125,0.29,62,29],[499.141,0.134,66,20],[499.383,0.29,55,44],[499.383,0.03,99,88],[499.383,0.055,50,235],[499.383,0.027,117,24],[499.443,0.16,39,213],[499.443,0.14,51,128],[499.625,0.534,62,21],[499.625,0.045,117,89],[499.867,0.027,117,22],[500.109,0.203,43,42],[500.351,0.203,45,58],[500.351,3.677,61,64],[500.834,0.11,98,122],[500.834,0.095,54,137],[501.06,0.29,64,28],[501.076,0.045,117,70],[501.318,0.29,57,45],[501.318,0.03,99,25],[501.318,0.055,50,66],[501.318,0.027,117,51],[501.378,0.16,39,108],[501.378,0.14,51,65],[502.044,0.223,69,168],[502.286,0.29,62,25],[502.286,0.203,50,32],[502.528,0.045,117,44],[502.649,0.7,78,9],[502.673,0.29,66,21],[502.77,0.11,98,87],[502.77,0.095,54,97],[502.77,0.027,117,52],[503.254,0.29,62,19],[503.98,0.03,99,64],[503.98,0.055,50,172],[503.98,0.045,117,37],[504.04,0.16,39,125],[504.04,0.14,51,75],[504.222,3.677,66,54],[504.222,0.027,117,43],[504.705,0.11,98,30],[504.705,0.095,54,34],[504.947,0.203,50,13],[505.189,0.668,66,72],[505.431,0.045,117,25],[505.673,0.027,117,43],[505.915,0.045,117,14],[506.157,0.29,62,32],[506.157,0.03,99,35],[506.157,0.055,50,92],[506.217,0.16,39,50],[506.217,0.14,51,30],[506.52,0.7,78,13],[506.544,0.29,66,29],[506.883,0.203,50,38],[506.883,0.045,117,10],[507.125,0.027,117,45],[507.367,0.045,117,37],[508.092,0.29,59,38],[508.092,0.03,99,76],[508.092,0.055,50,203],[508.092,3.677,66,30],[508.152,0.16,39,185],[508.152,0.14,51,111],[508.455,0.7,66,18],[508.48,0.29,62,37],[508.576,0.027,117,32],[508.818,0.203,47,36],[508.818,0.045,117,73],[509.06,0.203,47,48],[509.544,0.11,98,101],[509.544,0.095,54,114],[509.544,0.445,66,142],[510.028,0.29,59,39],[510.27,0.045,117,44],[510.391,0.7,76,13],[510.415,0.29,62,29],[510.512,0.027,117,51],[510.754,0.045,117,40],[510.996,0.29,59,30],[510.996,0.03,99,60],[510.996,0.055,50,160],[511.056,0.16,39,129],[511.056,0.14,51,77],[511.722,0.203,47,38],[511.964,0.203,43,52],[511.964,3.677,55,55],[511.964,0.445,62,155],[512.205,0.045,117,33],[512.447,0.11,98,81],[512.447,0.095,54,91],[512.447,0.027,117,51],[512.673,0.29,62,40],[512.689,0.203,43,16],[512.689,0.045,117,73],[512.931,0.027,117,11],[513.294,0.7,69,14],[513.318,0.29,59,30],[513.415,0.11,98,65],[513.415,0.095,54,74],[513.641,0.29,62,41],[513.899,0.03,99,9],[513.899,0.055,50,24],[513.959,0.16,39,41],[513.959,0.14,51,25],[514.141,0.267,67,29],[514.262,0.7,79,18],[514.286,0.29,59,36],[514.625,0.134,66,28],[514.625,0.045,117,17],[514.867,0.03,99,85],[514.867,0.055,50,227],[514.867,0.89,74,152],[514.867,0.134,64,31],[514.867,0.027,117,42],[514.927,0.16,39,216],[514.927,0.14,51,130],[515.109,0.534,62,32],[515.109,0.045,117,88],[515.351,0.027,117,49],[515.592,0.045,117,42],[515.835,0.03,99,78],[515.835,0.055,50,207],[515.835,3.677,61,80],[515.835,0.445,64,145],[515.894,0.16,39,188],[515.894,0.14,51,113],[516.318,0.223,66,109],[516.56,0.223,69,91],[516.802,0.03,99,39],[516.802,0.055,50,105],[516.802,0.668,73,74],[516.862,0.16,39,93],[516.862,0.14,51,56],[517.77,0.29,62,43],[517.77,0.03,99,12],[517.77,0.055,50,31],[517.83,0.16,39,26],[517.83,0.14,51,16],[518.012,0.267,66,35],[518.48,0.29,69,43],[518.496,0.7,78,12],[518.496,0.267,64,35],[518.496,0.045,117,41],[518.738,0.027,117,42],[518.98,0.534,62,35],[518.98,0.045,117,82],[519.125,0.29,66,43],[519.222,0.027,117,54],[519.463,0.045,117,76],[519.705,0.295,62,32],[519.705,3.738,62,26],[519.705,0.027,117,27],[519.951,0.045,117,21],[520.099,0.295,66,32],[520.443,0.7,62,9],[520.689,0.295,62,32],[521.058,0.7,66,16],[521.41,0.295,69,37],[522.042,0.7,66,19],[522.066,0.295,66,40],[523.394,0.045,117,25],[523.64,3.738,59,53],[523.64,0.027,117,32],[523.886,0.045,117,66],[524.132,0.027,117,46],[524.378,0.045,117,68],[524.624,0.027,117,34],[524.869,0.045,117,32],[525.115,0.453,66,109],[525.607,0.679,64,109],[526.345,0.226,62,109],[526.591,0.905,59,109],[527.574,3.738,55,69],[528.312,0.045,117,19],[528.558,0.027,117,30],[528.804,0.045,117,68],[529.05,0.027,117,50],[529.296,0.045,117,78],[529.542,0.027,117,44],[529.787,0.045,117,46],[530.033,0.027,117,10],[530.263,0.295,62,49],[530.918,0.295,59,49],[531.509,0.295,57,51],[531.509,3.738,57,69],[532.23,0.295,64,51],[532.246,0.7,64,13],[532.492,0.295,57,51],[532.861,0.7,73,25],[533.214,0.295,64,51],[533.23,0.045,117,10],[533.476,0.027,117,25],[533.722,0.272,54,39],[533.722,0.045,117,63],[533.845,0.7,66,25],[533.869,0.295,66,47],[533.968,0.027,117,49],[534.214,0.272,52,39],[534.214,0.045,117,81],[534.46,0.295,62,47],[534.46,0.027,117,46],[534.705,0.543,50,39],[534.705,0.045,117,53],[534.951,0.027,117,16],[535.443,3.864,62,32],[537.477,0.468,66,97],[537.986,0.468,64,97],[538.494,0.936,62,97],[539.511,3.864,66,28],[539.511,0.468,66,109],[542.291,0.305,66,44],[542.969,0.305,62,44],[543.579,0.305,55,46],[543.579,3.864,62,58],[544.324,0.305,62,46],[545.341,0.305,62,46],[545.994,0.7,67,23],[546.019,0.305,59,49],[546.63,0.305,55,49],[547.646,4.068,78,55],[547.646,3.864,64,76],[550.189,0.468,64,132],[550.697,0.936,62,132],[568.86,0.58,71,16],[569.542,0.193,71,22],[569.769,0.773,71,22],[570.678,0.58,71,22],[571.36,0.193,71,22],[571.587,0.773,71,22],[572.496,0.58,71,22],[573.178,0.193,71,16],[573.405,0.773,71,16],[574.314,0.58,71,16],[574.996,0.193,71,16],[575.223,0.773,71,16],[576.133,0.58,71,16],[576.814,0.193,71,16],[577.042,0.773,71,24],[577.951,0.58,71,24],[578.633,0.193,71,24],[578.86,0.773,71,24],[579.769,0.58,71,24],[580.451,0.193,71,24],[580.678,0.773,71,24],[581.587,0.58,71,29],[582.269,0.193,71,29],[582.496,0.773,71,29],[590.678,0.159,83,54],[592.437,4.385,60,20],[593.591,0.219,76,13],[593.879,0.035,117,10],[594.052,0.346,76,23],[594.456,0.035,117,9],[595.899,0.346,72,23],[596.591,0.27,64,14],[596.764,0.277,44,12],[597.052,0.277,45,15],[597.052,4.385,64,20],[597.485,0.7,76,8],[597.485,0.277,52,18],[597.514,0.346,72,19],[597.899,0.346,76,13],[597.918,0.035,117,7],[598.206,0.277,45,23],[598.495,0.035,117,11],[598.899,0.27,64,30],[598.899,0.03,83,11],[598.919,0.31,57,15],[599.072,0.277,44,25],[599.36,0.346,69,26],[599.36,0.277,45,25],[599.793,0.277,52,23],[599.937,0.07,98,13],[600.052,0.27,64,20],[600.072,0.31,57,10],[600.514,0.219,72,8],[600.514,0.277,45,14],[600.976,0.346,72,26],[601.091,0.07,98,23],[601.379,0.219,76,15],[601.668,4.385,57,30],[601.956,0.219,72,14],[601.956,0.035,117,13],[602.101,0.7,72,12],[602.245,0.07,98,19],[602.36,0.27,64,25],[602.36,0.03,83,9],[602.38,0.31,57,12],[602.514,0.346,72,21],[602.822,0.346,65,13],[602.822,0.219,69,14],[603.976,0.346,65,10],[603.976,0.27,48,17],[603.976,0.055,50,17],[603.995,0.31,42,9],[604.035,0.16,39,18],[604.035,0.14,51,11],[604.264,0.219,72,8],[604.437,0.346,69,23],[605.129,0.27,48,45],[605.129,0.03,83,16],[605.129,0.03,99,17],[605.129,0.055,50,45],[605.149,0.31,42,23],[605.189,0.16,39,43],[605.189,0.14,51,26],[605.418,0.035,117,14],[605.976,0.346,72,29],[606.283,0.27,48,52],[606.283,0.03,83,18],[606.283,0.03,99,18],[606.283,0.055,50,48],[606.283,4.385,55,17],[606.303,0.31,42,26],[606.343,0.16,39,45],[606.343,0.14,51,27],[606.716,0.7,74,14],[607.437,0.346,67,21],[607.437,0.27,48,38],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,36],[607.457,0.31,42,19],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.899,0.346,71,18],[608.591,0.27,48,19],[608.591,0.03,99,7],[608.591,0.055,50,20],[608.611,0.31,42,9],[608.651,0.16,39,18],[608.651,0.14,51,11],[609.437,0.346,79,28],[609.745,0.055,50,7],[610.668,0.173,67,20],[610.899,4.56,67,22],[611.379,0.36,76,27],[612.579,0.36,76,27],[613.779,0.36,76,28],[614.979,0.36,76,28],[615.399,0.228,72,16],[615.699,4.56,64,14],[616.149,0.7,76,15],[616.179,0.36,72,30],[617.379,0.36,72,30],[618.579,0.36,72,32],[619.779,0.36,72,32],[620.499,4.56,57,12],[622.599,0.7,79,9],[623.349,0.7,77,17],[625.299,4.56,59,22],[629.139,0.18,62,24],[630.099,4.75,64,15],[631.015,0.375,79,24],[632.265,0.375,79,24],[633.515,0.375,79,25],[634.765,0.375,79,25],[635.099,4.75,60,10],[636.015,0.375,76,27],[636.817,0.7,79,13],[637.265,0.375,76,27],[638.515,0.375,76,28],[639.765,0.375,76,28],[640.099,4.75,53,10],[641.015,0.375,72,30],[642.265,0.375,72,30],[643.515,0.375,72,31],[644.765,0.375,72,31],[645.099,4.75,55,19],[645.567,0.7,74,16],[646.015,0.375,74,32],[647.265,0.375,74,32],[648.515,0.375,79,30],[649.849,0.188,67,21],[650.609,0.383,76,22],[651.886,0.383,76,22],[653.162,0.383,76,24],[654.439,0.383,76,24],[655.716,0.383,72,25],[656.96,0.7,79,12],[656.992,0.383,72,25],[658.269,0.383,72,26],[659.545,0.383,72,23],[660.822,0.383,69,24],[662.099,0.383,69,24],[663.375,0.383,69,25],[664.652,0.383,69,25],[665.896,0.7,74,13],[665.928,0.383,71,26],[667.205,0.383,71,26],[668.482,0.383,76,24],[669.503,0.192,62,17],[691.133,0.196,67,16],[717.612,2.4,79,39]],[[0,3.2,60,77],[5.8,3.4,67,77],[11.2,3,64,80],[16,3.6,60,80],[22,0.99,72,85],[23.1,0.495,76,85],[23.65,0.495,79,115],[24.2,1.485,76,115],[25.85,0.495,74,36],[26.4,0.99,76,36],[27.5,0.99,74,40],[28.6,1.98,72,40],[38.7,1.9,72,30],[46.94,1.48,72,30],[53.26,1.12,72,53],[98.444,0.531,72,46],[99.02,0.265,76,46],[99.309,0.265,79,46],[99.597,0.796,76,46],[100.463,0.265,74,46],[100.751,0.531,76,57],[101.328,0.531,74,57],[101.905,1.062,72,57],[103.059,0.531,76,64],[103.636,0.265,79,47],[103.924,0.265,81,47],[104.213,0.531,79,47],[104.79,0.531,76,47],[105.367,0.796,74,55],[106.232,0.265,72,55],[106.52,1.062,69,55],[107.674,0.531,72,61],[108.251,0.531,77,52],[108.828,0.265,79,52],[109.117,0.265,81,52],[109.405,0.531,79,52],[109.982,0.531,77,65],[110.559,0.265,76,65],[110.847,0.265,74,65],[111.136,1.062,72,65],[112.29,0.531,74,81],[112.867,0.265,76,81],[113.155,0.265,79,81],[113.444,0.796,83,81],[114.309,0.265,79,45],[114.597,0.531,76,45],[115.174,0.531,74,45],[115.751,1.062,72,45],[116.905,0.818,76,22],[117.814,0.409,77,22],[118.269,1.227,76,22],[119.632,0.818,81,22],[120.541,0.409,79,22],[120.996,1.227,76,22],[122.36,0.818,74,22],[123.269,0.409,76,22],[123.723,0.818,77,22],[124.632,0.409,76,22],[125.087,0.818,74,22],[125.996,0.409,72,22],[126.451,1.227,71,22],[127.814,0.818,76,22],[128.723,0.409,77,22],[129.178,1.227,76,22],[130.541,0.818,81,22],[131.451,0.409,79,22],[131.905,1.227,76,22],[133.269,0.818,74,22],[134.178,0.409,76,22],[134.632,0.818,77,21],[135.541,0.409,76,21],[135.996,0.409,74,21],[136.451,0.409,72,21],[136.905,0.409,71,21],[137.36,1.227,69,21],[138.723,2.618,72,15],[141.451,1.309,77,15],[142.814,1.309,76,15],[144.178,2.618,68,15],[146.905,2.618,72,14],[149.632,1.309,77,14],[150.996,1.309,76,14],[152.36,2.618,71,14],[155.087,2.618,69,14],[157.814,1.309,72,14],[159.178,1.309,74,14],[160.541,0.818,76,21],[161.451,0.409,77,21],[161.905,1.227,76,21],[163.269,0.818,81,24],[164.178,0.409,79,24],[164.632,1.227,76,24],[165.996,0.818,74,24],[166.905,0.409,76,24],[167.36,0.818,77,24],[168.269,0.409,76,24],[168.723,0.818,74,24],[169.632,0.409,72,24],[170.087,1.227,71,24],[171.451,0.818,76,24],[172.36,0.409,77,24],[172.814,1.227,76,24],[174.178,0.818,81,24],[175.087,0.409,79,24],[175.541,1.227,76,24],[176.905,0.818,74,24],[177.814,0.409,76,24],[178.269,0.818,77,24],[179.178,0.409,76,24],[179.632,0.409,74,23],[180.087,0.409,72,23],[180.541,0.409,71,23],[180.996,1.227,69,23],[182.36,0.871,74,20],[183.327,0.435,76,20],[183.811,0.871,77,20],[184.779,0.435,76,20],[185.263,0.435,74,20],[185.747,0.435,72,20],[186.231,0.435,71,22],[186.714,1.306,69,22],[188.166,0.964,74,22],[189.238,0.482,76,22],[189.773,0.964,77,22],[190.845,0.482,76,22],[191.38,0.482,74,22],[191.916,0.482,72,22],[192.452,0.482,71,22],[192.988,1.446,69,22],[197.958,0.355,84,42],[201.116,0.355,77,42],[204.274,0.355,84,42],[207.168,0.321,84,47],[210.025,0.321,77,47],[212.883,0.321,84,46],[215.522,0.293,84,46],[218.131,0.293,77,79],[220.022,0.391,86,113],[220.414,0.4,102,65],[221.414,1,72,37],[225.114,0.321,84,44],[227.971,0.321,77,39],[230.611,0.293,84,39],[233.219,0.293,77,29],[235.645,0.27,84,29],[238.045,0.27,77,151],[239.785,0.36,86,216],[240.145,0.4,102,65],[243.145,0.393,75,91],[243.86,0.393,73,91],[244.574,0.393,71,91],[246.002,0.393,69,91],[246.717,0.393,67,91],[247.431,0.393,65,91],[248.86,0.393,63,91],[249.574,0.393,61,91],[250.288,0.393,59,91],[254.574,0.393,63,86],[255.288,0.393,61,86],[256.002,0.393,59,86],[257.431,0.393,57,86],[258.145,0.393,55,86],[258.86,0.393,53,86],[260.288,0.393,51,86],[261.002,0.393,49,86],[261.717,0.393,47,86],[274.574,1.429,79,23],[277.431,1.429,84,42],[280.288,0.214,75,82],[281.002,0.214,73,82],[281.717,0.214,71,82],[283.145,0.214,69,82],[283.86,0.214,67,82],[284.574,0.214,65,82],[286.002,0.214,63,82],[286.717,0.214,61,82],[287.431,0.214,59,82],[297.431,1.429,60,32],[301.488,0.767,81,95],[302.322,0.511,79,95],[302.877,0.256,77,95],[303.155,0.767,76,95],[303.988,0.767,77,95],[304.228,0.4,77,17],[304.822,0.511,79,95],[305.062,0.383,79,17],[305.377,0.511,81,95],[305.617,0.383,81,17],[305.933,0.511,82,95],[306.173,0.383,82,17],[306.488,1.533,81,95],[306.728,0.4,81,17],[308.155,0.767,79,95],[308.395,0.4,79,17],[308.988,0.511,77,95],[309.228,0.383,77,17],[309.544,0.256,76,95],[309.784,0.192,76,17],[309.822,0.767,74,95],[310.062,0.4,74,17],[310.655,0.767,76,95],[310.895,0.4,76,17],[311.488,0.511,77,95],[311.728,0.383,77,17],[312.044,0.511,79,130],[312.284,0.383,79,23],[312.524,0.383,79,9],[312.599,0.511,76,130],[312.839,0.383,76,23],[313.079,0.383,76,9],[313.155,1.533,77,130],[313.395,0.4,77,23],[313.635,0.4,77,9],[314.822,0.767,81,136],[315.062,0.4,81,24],[315.301,0.4,81,10],[315.655,0.511,79,136],[315.895,0.383,79,24],[316.135,0.383,79,10],[316.21,0.256,77,136],[316.45,0.192,77,24],[316.488,0.767,76,136],[316.69,0.192,77,10],[316.728,0.4,76,24],[316.968,0.4,76,10],[317.322,0.767,77,136],[317.562,0.4,77,24],[317.801,0.4,77,10],[318.155,0.511,79,136],[318.395,0.383,79,24],[318.635,0.383,79,10],[318.71,0.511,81,136],[318.95,0.383,81,24],[319.19,0.383,81,10],[319.266,0.511,82,136],[319.506,0.383,82,24],[319.746,0.383,82,10],[319.822,1.533,81,136],[320.062,0.4,81,24],[320.301,0.4,81,10],[321.488,0.767,79,136],[321.728,0.4,79,24],[321.968,0.4,79,10],[322.322,0.511,77,136],[322.562,0.383,77,24],[322.801,0.383,77,10],[322.877,0.256,76,83],[323.117,0.192,76,15],[323.155,0.767,74,83],[323.395,0.4,74,15],[323.988,0.767,76,83],[324.228,0.4,76,15],[324.822,0.511,77,83],[325.062,0.383,77,15],[325.377,0.511,79,83],[325.617,0.383,79,15],[325.933,0.511,76,83],[326.173,0.383,76,15],[326.488,1.533,77,83],[326.728,0.4,77,15],[328.155,0.767,69,73],[328.395,0.4,69,13],[328.988,0.511,67,73],[329.228,0.383,67,13],[329.544,0.256,65,73],[329.784,0.192,65,13],[329.822,0.767,64,73],[330.062,0.4,64,13],[330.655,0.767,65,73],[330.895,0.4,65,13],[331.488,0.511,67,73],[331.728,0.383,67,13],[332.044,0.511,69,73],[332.284,0.383,69,13],[332.599,0.511,70,73],[332.839,0.383,70,13],[333.155,1.533,69,65],[333.395,0.4,69,12],[334.822,0.767,67,65],[335.062,0.4,67,12],[335.655,0.511,65,65],[335.895,0.383,65,12],[336.21,0.256,64,65],[336.45,0.192,64,12],[336.488,0.767,62,65],[336.728,0.4,62,12],[337.322,0.767,64,65],[337.562,0.4,64,12],[338.155,0.511,65,65],[338.395,0.383,65,12],[338.71,0.511,67,65],[338.95,0.383,67,12],[339.266,0.511,64,65],[339.506,0.383,64,12],[339.822,1.533,65,65],[340.062,0.4,65,12],[341.488,0.767,69,62],[341.728,0.4,69,11],[342.322,0.511,67,62],[342.562,0.383,67,11],[342.877,0.256,65,62],[343.117,0.192,65,11],[343.155,0.767,64,62],[343.395,0.4,64,11],[343.988,0.767,65,44],[344.228,0.4,65,8],[344.822,0.511,67,44],[345.062,0.383,67,8],[345.377,0.511,69,44],[345.617,0.383,69,8],[345.933,0.511,70,44],[346.173,0.383,70,8],[346.488,1.533,69,44],[346.728,0.4,69,8],[348.155,0.767,67,44],[348.395,0.4,67,8],[348.988,0.511,65,44],[349.228,0.383,65,8],[349.544,0.256,64,44],[349.784,0.192,64,8],[349.822,0.767,62,44],[350.062,0.4,62,8],[350.655,0.767,64,44],[350.895,0.4,64,8],[351.488,0.511,65,44],[351.728,0.383,65,8],[352.044,0.511,67,44],[352.284,0.383,67,8],[352.599,0.511,64,44],[352.839,0.383,64,8],[353.155,1.533,65,44],[353.395,0.4,65,8],[368.155,6.667,65,64],[368.395,0.4,65,12],[375.822,0.493,60,37],[376.357,0.246,64,37],[376.625,0.246,67,37],[376.893,0.739,64,37],[377.697,0.246,62,37],[377.964,0.493,64,37],[378.5,0.493,62,37],[379.036,0.986,60,37],[380.107,0.493,64,41],[380.643,0.246,67,41],[380.911,0.246,69,41],[381.179,0.493,67,41],[381.714,0.493,64,41],[382.25,0.739,62,41],[383.054,0.246,60,41],[383.322,0.986,57,41],[384.393,0.493,60,46],[384.929,0.493,65,46],[385.464,0.246,67,46],[385.732,0.246,69,71],[386,0.493,67,71],[386.536,0.493,65,71],[387.072,0.246,64,71],[387.339,0.246,62,71],[387.607,0.986,60,71],[388.679,0.493,62,78],[389.214,0.246,64,78],[389.482,0.246,67,78],[389.75,0.739,71,78],[390.554,0.246,67,78],[390.822,0.493,64,78],[391.357,0.493,62,78],[391.893,0.986,60,78],[392.964,0.476,72,61],[393.482,0.238,76,61],[393.74,0.238,79,61],[393.999,0.714,76,61],[394.775,0.238,74,76],[395.033,0.476,76,76],[395.551,0.476,74,76],[396.068,0.952,72,76],[397.102,0.476,76,85],[397.62,0.238,79,85],[397.878,0.238,81,85],[398.137,0.476,79,85],[398.654,0.476,76,85],[399.171,0.714,74,85],[399.947,0.238,72,85],[400.206,0.952,69,85],[401.24,0.476,72,94],[401.757,0.476,77,94],[402.275,0.238,79,94],[402.533,0.238,81,94],[402.792,0.476,79,94],[403.309,0.476,77,96],[403.827,0.238,76,96],[404.085,0.238,74,96],[404.344,0.952,72,96],[405.378,0.476,74,105],[405.895,0.238,76,105],[406.154,0.238,79,105],[406.413,0.714,83,105],[407.188,0.238,79,105],[407.447,0.476,76,105],[407.964,0.476,74,105],[408.482,0.952,72,105],[409.516,0.46,84,70],[410.016,0.23,88,70],[410.266,0.23,91,70],[410.516,0.69,88,70],[411.266,0.23,86,70],[411.516,0.46,88,84],[412.016,0.46,86,84],[412.516,0.92,84,84],[413.516,0.46,88,94],[414.016,0.23,91,94],[414.266,0.23,93,94],[414.516,0.46,91,94],[415.016,0.46,88,94],[415.516,0.69,86,94],[416.266,0.23,84,94],[416.516,0.92,81,94],[417.516,0.46,84,104],[418.016,0.46,89,104],[418.516,0.23,91,104],[418.766,0.23,93,104],[419.016,0.46,91,118],[419.516,0.46,89,118],[420.016,0.23,88,118],[420.266,0.23,86,118],[420.516,0.92,84,118],[421.516,0.46,86,129],[422.016,0.23,88,129],[422.266,0.23,91,129],[422.516,0.69,95,129],[423.266,0.23,91,129],[423.516,0.46,88,129],[424.016,0.46,86,129],[424.516,0.92,84,129],[425.516,0.445,96,82],[426,0.223,100,82],[426.242,0.223,103,76],[426.484,0.668,100,76],[427.21,0.223,98,76],[427.452,0.445,100,76],[427.935,0.445,98,76],[428.419,0.89,96,76],[429.387,0.445,100,86],[429.871,0.223,103,86],[430.113,0.223,105,86],[430.355,0.445,103,86],[430.839,0.445,100,86],[431.323,0.668,98,86],[432.048,0.223,96,86],[432.29,0.89,93,86],[433.258,0.445,96,95],[433.742,0.445,101,81],[434.226,0.223,103,81],[434.468,0.223,105,81],[434.71,0.445,103,81],[435.193,0.445,101,81],[435.677,0.223,100,81],[435.919,0.223,98,81],[436.161,0.89,96,81],[437.129,0.445,98,89],[437.613,0.223,100,89],[437.855,0.223,103,89],[438.097,0.668,107,89],[438.823,0.223,103,89],[439.065,0.445,100,89],[439.548,0.445,98,89],[440.032,0.89,96,89],[547.646,4.068,86,97],[568.86,0.409,79,30],[569.314,0.204,83,30],[569.542,0.204,86,40],[569.769,0.614,83,40],[570.451,0.204,81,40],[570.678,0.409,83,40],[571.133,0.409,81,40],[571.587,0.818,79,40],[576.133,0.409,81,29],[576.587,0.204,83,29],[576.814,0.204,86,29],[577.042,0.614,90,44],[577.723,0.204,86,44],[577.951,0.409,83,44],[578.405,0.409,81,44],[578.86,0.818,79,44],[590.678,0.159,91,54],[592.437,0.531,72,69],[593.014,0.265,76,69],[593.302,0.265,79,69],[593.591,0.796,76,69],[594.456,0.265,74,69],[594.696,0.199,74,12],[594.745,0.531,76,69],[594.985,0.398,76,12],[595.322,0.531,74,69],[595.562,0.398,74,12],[595.899,1.062,72,69],[596.139,0.4,72,12],[597.052,0.531,76,77],[597.292,0.398,76,14],[597.629,0.265,79,77],[597.869,0.199,79,14],[597.918,0.265,81,77],[598.158,0.199,81,14],[598.206,0.531,79,77],[598.446,0.398,79,14],[598.783,0.531,76,77],[599.023,0.398,76,14],[599.36,0.796,74,77],[599.6,0.4,74,14],[600.226,0.265,72,77],[600.466,0.199,72,14],[600.514,1.062,69,77],[600.754,0.4,69,14],[601.668,0.531,72,85],[601.908,0.398,72,15],[602.245,0.531,77,85],[602.485,0.398,77,15],[602.822,0.265,79,85],[603.062,0.199,79,15],[603.11,0.265,81,85],[603.35,0.199,81,15],[603.399,0.531,79,85],[603.639,0.398,79,15],[603.976,0.531,77,85],[604.216,0.398,77,15],[604.552,0.265,76,85],[604.792,0.199,76,15],[604.841,0.265,74,85],[605.081,0.199,74,15],[605.129,1.062,72,85],[605.369,0.4,72,15],[606.283,0.531,74,94],[606.523,0.398,74,17],[606.86,0.265,76,94],[607.1,0.199,76,17],[607.149,0.265,79,94],[607.389,0.199,79,17],[607.437,0.796,83,94],[607.677,0.4,83,17],[608.302,0.265,79,94],[608.542,0.199,79,17],[608.591,0.531,76,94],[608.831,0.398,76,17],[609.168,0.531,74,94],[609.408,0.398,74,17],[609.745,1.062,72,94],[609.985,0.4,72,17],[610.899,0.552,72,65],[611.139,0.4,72,12],[611.499,0.276,76,65],[611.739,0.207,76,12],[611.799,0.276,79,65],[612.039,0.207,79,12],[612.099,0.828,76,65],[612.339,0.4,76,12],[612.999,0.276,74,65],[613.239,0.207,74,12],[613.299,0.552,76,65],[613.539,0.4,76,12],[613.899,0.552,74,65],[614.139,0.4,74,12],[614.499,1.104,72,65],[614.739,0.4,72,12],[615.699,0.552,76,73],[615.939,0.4,76,13],[616.299,0.276,79,73],[616.539,0.207,79,13],[616.599,0.276,81,73],[616.839,0.207,81,13],[616.899,0.552,79,73],[617.139,0.4,79,13],[617.499,0.552,76,73],[617.739,0.4,76,13],[618.099,0.828,74,73],[618.339,0.4,74,13],[618.999,0.276,72,73],[619.239,0.207,72,13],[619.299,1.104,69,73],[619.539,0.4,69,13],[620.499,0.552,72,81],[620.739,0.4,72,15],[621.099,0.552,77,38],[621.699,0.276,79,38],[621.999,0.276,81,38],[622.299,0.552,79,38],[622.899,0.552,77,38],[623.499,0.276,76,38],[623.799,0.276,74,38],[624.099,1.104,72,38],[625.299,0.552,74,42],[625.539,0.4,74,8],[625.899,0.276,76,42],[626.139,0.207,76,8],[626.199,0.276,79,42],[626.439,0.207,79,8],[626.499,0.828,83,42],[626.739,0.4,83,8],[627.399,0.276,79,42],[627.639,0.207,79,8],[627.699,0.552,76,42],[627.939,0.4,76,8],[628.299,0.552,74,42],[628.539,0.4,74,8],[628.899,1.104,72,42],[629.139,0.4,72,8],[630.099,0.575,72,27],[630.724,0.287,76,27],[631.036,0.287,79,27],[631.349,0.863,76,27],[632.286,0.287,74,27],[632.599,0.575,76,27],[633.224,0.575,74,27],[633.849,1.15,72,27],[635.099,0.575,76,30],[635.724,0.287,79,30],[636.036,0.287,81,30],[636.349,0.575,79,30],[636.974,0.575,76,30],[637.599,0.863,74,30],[638.536,0.287,72,30],[638.849,1.15,69,30],[640.099,0.575,72,34],[640.724,0.575,77,34],[641.349,0.287,79,34],[641.661,0.287,81,34],[641.974,0.575,79,34],[642.599,0.575,77,34],[643.224,0.287,76,34],[643.536,0.287,74,34],[643.849,1.15,72,34],[645.099,0.575,74,37],[645.724,0.287,76,37],[646.036,0.287,79,37],[646.349,0.863,83,37],[647.286,0.287,79,37],[647.599,0.575,76,37],[648.224,0.575,74,37],[648.849,1.15,72,37],[650.099,0.587,72,38],[650.737,0.294,76,38],[651.056,0.294,79,38],[651.375,0.881,76,38],[652.333,0.294,74,38],[652.652,0.587,76,38],[653.29,0.587,74,38],[653.928,1.175,72,38],[655.205,0.587,76,43],[655.445,0.4,76,8],[655.843,0.294,79,43],[656.083,0.22,79,8],[656.162,0.294,81,43],[656.402,0.22,81,8],[656.482,0.587,79,43],[656.722,0.4,79,8],[657.12,0.587,76,43],[657.36,0.4,76,8],[657.758,0.881,74,43],[657.998,0.4,74,8],[658.716,0.294,72,43],[658.956,0.22,72,8],[659.035,1.175,69,43],[659.275,0.4,69,8],[660.311,0.587,72,48],[660.551,0.4,72,9],[660.95,0.587,77,48],[661.19,0.4,77,9],[661.588,0.294,79,48],[661.828,0.22,79,9],[661.907,0.294,81,48],[662.147,0.22,81,9],[662.226,0.587,79,48],[662.466,0.4,79,9],[662.865,0.587,77,48],[663.105,0.4,77,9],[663.503,0.294,76,48],[663.743,0.22,76,9],[663.822,0.294,74,48],[664.062,0.22,74,9],[664.141,1.175,72,48],[664.381,0.4,72,9],[665.418,0.587,74,52],[665.658,0.4,74,9],[666.056,0.294,76,52],[666.296,0.22,76,9],[666.375,0.294,79,52],[666.615,0.22,79,9],[666.694,0.881,83,52],[666.934,0.4,83,9],[667.652,0.294,79,52],[667.892,0.22,79,9],[667.971,0.587,76,52],[668.211,0.4,76,9],[668.609,0.587,74,52],[668.849,0.4,74,9],[669.247,1.175,72,52],[669.487,0.4,72,9],[670.524,0.6,72,36],[671.176,0.3,76,36],[671.502,0.3,79,36],[671.828,0.9,76,36],[672.807,0.3,74,36],[673.133,0.6,76,36],[673.785,0.6,74,36],[674.437,1.2,72,36],[675.741,0.6,76,40],[675.981,0.4,76,7],[676.394,0.3,79,40],[676.634,0.225,79,7],[676.72,0.3,81,40],[676.96,0.225,81,7],[677.046,0.6,79,40],[677.286,0.4,79,7],[677.698,0.6,76,40],[677.938,0.4,76,7],[678.35,0.9,74,40],[678.59,0.4,74,7],[679.328,0.3,72,40],[679.568,0.225,72,7],[679.655,1.2,69,40],[679.895,0.4,69,7],[680.959,0.6,72,44],[681.199,0.4,72,8],[681.611,0.6,77,174],[681.851,0.4,77,31],[682.091,0.4,77,12],[682.263,0.3,79,174],[682.503,0.225,79,31],[682.589,0.3,81,174],[682.743,0.225,79,12],[682.829,0.225,81,31],[682.915,0.6,79,174],[683.069,0.225,81,12],[683.155,0.4,79,31],[683.395,0.4,79,12],[683.568,0.6,77,174],[683.808,0.4,77,31],[684.048,0.4,77,12],[684.22,0.3,76,174],[684.46,0.225,76,31],[684.546,0.3,74,174],[684.7,0.225,76,12],[684.786,0.225,74,31],[684.872,1.2,72,174],[685.026,0.225,74,12],[685.112,0.4,72,31],[685.352,0.4,72,12],[686.176,0.6,74,191],[686.416,0.4,74,34],[686.656,0.4,74,13],[686.828,0.3,76,191],[687.068,0.225,76,34],[687.155,0.3,79,191],[687.308,0.225,76,13],[687.395,0.225,79,34],[687.481,0.9,83,191],[687.635,0.225,79,13],[687.721,0.4,83,34],[687.961,0.4,83,13],[688.459,0.3,79,191],[688.699,0.225,79,34],[688.785,0.6,76,191],[688.939,0.225,79,13],[689.025,0.4,76,34],[689.265,0.4,76,13],[689.437,0.6,74,191],[689.677,0.4,74,34],[689.917,0.4,74,13],[690.089,1.2,72,191],[690.329,0.4,72,34],[690.569,0.4,72,13],[691.394,0.627,72,108],[691.634,0.4,72,19],[691.874,0.4,72,8],[692.076,0.314,76,108],[692.316,0.235,76,19],[692.416,0.314,79,108],[692.556,0.235,76,8],[692.656,0.235,79,19],[692.757,0.941,76,108],[692.896,0.235,79,8],[692.997,0.4,76,19],[693.237,0.4,76,8],[693.78,0.314,74,108],[694.02,0.235,74,19],[694.121,0.627,76,108],[694.26,0.235,74,8],[694.361,0.4,76,19],[694.601,0.4,76,8],[694.803,0.627,74,108],[695.043,0.4,74,19],[695.283,0.4,74,8],[695.485,1.254,72,108],[695.725,0.4,72,19],[695.965,0.4,72,8],[696.848,0.627,76,121],[697.088,0.4,76,22],[697.328,0.4,76,8],[697.53,0.314,79,121],[697.77,0.235,79,22],[697.871,0.314,81,121],[698.01,0.235,79,8],[698.111,0.235,81,22],[698.212,0.627,79,121],[698.351,0.235,81,8],[698.452,0.4,79,22],[698.692,0.4,79,8],[698.894,0.627,76,121],[699.134,0.4,76,22],[699.374,0.4,76,8],[699.576,0.941,74,121],[699.816,0.4,74,22],[700.056,0.4,74,8],[700.598,0.314,72,121],[700.838,0.235,72,22],[700.939,1.254,69,121],[701.078,0.235,72,8],[701.179,0.4,69,22],[701.419,0.4,69,8],[702.303,0.627,72,134],[702.543,0.4,72,24],[702.783,0.4,72,9],[702.985,0.627,77,134],[703.225,0.4,77,24],[703.465,0.4,77,9],[703.666,0.314,79,134],[703.906,0.235,79,24],[704.007,0.314,81,134],[704.146,0.235,79,9],[704.247,0.235,81,24],[704.348,0.627,79,134],[704.487,0.235,81,9],[704.588,0.4,79,24],[704.828,0.4,79,9],[705.03,0.627,77,134],[705.27,0.4,77,24],[705.51,0.4,77,9],[705.712,0.314,76,134],[705.952,0.235,76,24],[706.053,0.314,74,134],[706.192,0.235,76,9],[706.293,0.235,74,24],[706.394,1.254,72,134],[706.533,0.235,74,9],[706.634,0.4,72,24],[706.874,0.4,72,9],[707.757,0.627,74,147],[707.997,0.4,74,26],[708.237,0.4,74,10],[708.439,0.314,76,147],[708.679,0.235,76,26],[708.78,0.314,79,147],[708.919,0.235,76,10],[709.02,0.235,79,26],[709.121,0.941,83,147],[709.26,0.235,79,10],[709.361,0.4,83,26],[709.601,0.4,83,10],[710.144,0.314,79,147],[710.384,0.235,79,26],[710.485,0.627,76,147],[710.624,0.235,79,10],[710.725,0.4,76,26],[710.965,0.4,76,10],[711.166,0.627,74,147],[711.406,0.4,74,26],[711.646,0.4,74,10],[711.848,1.254,72,147],[734.412,3.4,67,46],[740.812,3.8,64,69],[748.812,4.4,60,69],[758.812,10,60,97]],[[0,0.055,38,103],[0.06,0.16,27,96],[0.06,0.14,39,58],[2.2,0.055,38,103],[2.26,0.16,27,96],[2.26,0.14,39,58],[4.4,0.055,38,103],[4.46,0.16,27,96],[4.46,0.14,39,58],[6.6,0.055,38,103],[6.66,0.16,27,96],[6.66,0.14,39,58],[8.8,0.055,38,103],[8.86,0.16,27,96],[8.86,0.14,39,58],[11,0.055,38,103],[11.06,0.16,27,96],[11.06,0.14,39,58],[13.2,0.055,38,103],[13.26,0.16,27,96],[13.26,0.14,39,58],[15.4,0.055,38,103],[15.46,0.16,27,96],[15.46,0.14,39,58],[17.6,0.055,38,103],[17.66,0.16,27,96],[17.66,0.14,39,58],[19.8,0.055,38,103],[19.86,0.16,27,96],[19.86,0.14,39,58],[22,0.055,38,103],[22.06,0.16,27,96],[22.06,0.14,39,58],[24.2,0.055,38,103],[24.26,0.16,27,96],[24.26,0.14,39,58],[26.4,0.055,38,103],[26.46,0.16,27,96],[26.46,0.14,39,58],[28.6,0.055,38,103],[28.66,0.16,27,96],[28.66,0.14,39,58],[30.8,0.055,38,103],[30.86,0.16,27,96],[30.86,0.14,39,58],[33,0.055,38,103],[33.06,0.16,27,96],[33.06,0.14,39,58],[34.9,0.055,38,103],[34.96,0.16,27,96],[34.96,0.14,39,58],[36.8,0.055,38,103],[36.86,0.16,27,96],[36.86,0.14,39,58],[38.7,0.055,38,103],[38.76,0.16,27,96],[38.76,0.14,39,58],[40.6,0.055,38,103],[40.66,0.16,27,96],[40.66,0.14,39,58],[42.5,0.055,38,103],[42.56,0.16,27,96],[42.56,0.14,39,58],[43.98,0.055,38,103],[44.04,0.16,27,96],[44.04,0.14,39,58],[45.46,0.055,38,103],[45.52,0.16,27,96],[45.52,0.14,39,58],[46.94,0.055,38,103],[47,0.16,27,96],[47,0.14,39,58],[48.42,0.055,38,103],[48.48,0.16,27,96],[48.48,0.14,39,58],[49.9,0.055,38,103],[49.96,0.16,27,96],[49.96,0.14,39,58],[51.02,0.055,38,103],[51.08,0.16,27,96],[51.08,0.14,39,58],[52.14,0.055,38,103],[52.2,0.16,27,96],[52.2,0.14,39,58],[53.26,0.055,38,103],[53.32,0.16,27,96],[53.32,0.14,39,58],[54.38,0.055,38,103],[54.44,0.16,27,96],[54.44,0.14,39,58],[55.5,0.055,38,103],[55.56,0.16,27,96],[55.56,0.14,39,58],[56.38,0.055,38,103],[56.44,0.16,27,96],[56.44,0.14,39,58],[57.26,0.055,38,103],[57.32,0.16,27,96],[57.32,0.14,39,58],[58.14,0.055,38,103],[58.2,0.16,27,96],[58.2,0.14,39,58],[59.02,0.055,38,103],[59.08,0.16,27,96],[59.08,0.14,39,58],[59.9,0.055,38,103],[59.96,0.16,27,96],[59.96,0.14,39,58],[60.42,0.96,36,95],[60.42,0.055,38,75],[60.48,0.16,27,70],[60.48,0.14,39,42],[61.62,0.96,36,95],[61.62,0.055,38,75],[61.68,0.16,27,70],[61.68,0.14,39,42],[62.82,0.96,36,101],[62.82,0.055,38,75],[62.88,0.16,27,70],[62.88,0.14,39,42],[64.02,0.96,36,101],[64.02,0.055,38,75],[64.08,0.16,27,70],[64.08,0.14,39,42],[65.22,0.96,33,107],[65.22,0.055,38,75],[65.28,0.16,27,70],[65.28,0.14,39,42],[66.42,0.96,33,107],[66.42,0.055,38,75],[66.48,0.16,27,70],[66.48,0.14,39,42],[67.62,0.96,33,112],[67.62,0.055,38,75],[67.68,0.16,27,70],[67.68,0.14,39,42],[68.82,0.96,33,112],[68.82,0.055,38,75],[68.88,0.16,27,70],[68.88,0.14,39,42],[70.02,0.96,29,118],[70.02,0.055,38,75],[70.08,0.16,27,70],[70.08,0.14,39,42],[71.22,0.96,29,118],[71.22,0.055,38,75],[71.28,0.16,27,70],[71.28,0.14,39,42],[72.42,0.96,29,124],[72.42,0.055,38,75],[72.48,0.16,27,70],[72.48,0.14,39,42],[73.62,0.96,29,124],[73.62,0.055,38,75],[73.68,0.16,27,70],[73.68,0.14,39,42],[74.82,0.96,31,130],[74.82,0.055,38,75],[74.88,0.16,27,70],[74.88,0.14,39,42],[76.02,0.96,31,130],[76.02,0.055,38,75],[76.08,0.16,27,70],[76.08,0.14,39,42],[77.22,2.16,36,114],[77.22,0.055,38,75],[77.28,0.16,27,70],[77.28,0.14,39,42],[78.42,0.055,38,75],[78.48,0.16,27,70],[78.48,0.14,39,42],[79.62,0.941,36,109],[79.62,0.055,38,75],[79.68,0.16,27,70],[79.68,0.14,39,42],[80.796,0.941,36,109],[80.796,0.055,38,75],[80.856,0.16,27,70],[80.856,0.14,39,42],[81.973,0.941,36,115],[81.973,0.055,38,75],[82.033,0.16,27,70],[82.033,0.14,39,42],[83.149,0.941,36,115],[83.149,0.055,38,75],[83.209,0.16,27,70],[83.209,0.14,39,42],[84.326,0.941,33,122],[84.326,0.055,38,75],[84.386,0.16,27,70],[84.386,0.14,39,42],[85.502,0.941,33,122],[85.502,0.055,38,75],[85.562,0.16,27,70],[85.562,0.14,39,42],[86.679,0.941,33,128],[86.679,0.055,38,75],[86.739,0.16,27,70],[86.739,0.14,39,42],[87.855,0.941,33,128],[87.855,0.055,38,75],[87.915,0.16,27,70],[87.915,0.14,39,42],[89.032,0.941,29,135],[89.032,0.055,38,75],[89.092,0.16,27,70],[89.092,0.14,39,42],[90.208,0.941,29,135],[90.208,0.055,38,75],[90.268,0.16,27,70],[90.268,0.14,39,42],[91.385,0.941,29,142],[91.385,0.055,38,75],[91.445,0.16,27,70],[91.445,0.14,39,42],[92.561,0.941,29,142],[92.561,0.055,38,75],[92.621,0.16,27,70],[92.621,0.14,39,42],[93.738,0.941,31,148],[93.738,0.055,38,75],[93.798,0.16,27,70],[93.798,0.14,39,42],[94.914,0.941,31,148],[94.914,0.055,38,75],[94.974,0.16,27,70],[94.974,0.14,39,42],[96.091,2.118,36,131],[96.091,0.055,38,75],[96.151,0.16,27,70],[96.151,0.14,39,42],[97.267,0.055,38,75],[97.327,0.16,27,70],[97.327,0.14,39,42],[98.444,0.277,36,105],[98.444,0.055,38,75],[98.504,0.16,27,70],[98.504,0.14,39,42],[98.876,0.277,43,105],[99.597,0.055,38,75],[99.597,0.277,36,105],[99.657,0.16,27,70],[99.657,0.14,39,42],[100.463,0.277,35,105],[100.751,0.277,36,111],[100.751,0.055,38,75],[100.811,0.16,27,70],[100.811,0.14,39,42],[101.184,0.277,43,111],[101.905,0.055,38,75],[101.905,0.277,36,111],[101.965,0.16,27,70],[101.965,0.14,39,42],[102.77,0.277,32,111],[103.059,0.277,33,118],[103.059,0.055,38,75],[103.119,0.16,27,70],[103.119,0.14,39,42],[103.492,0.277,40,118],[104.213,0.055,38,75],[104.213,0.277,33,118],[104.273,0.16,27,70],[104.273,0.14,39,42],[105.078,0.277,32,118],[105.367,0.277,33,124],[105.367,0.055,38,75],[105.427,0.16,27,70],[105.427,0.14,39,42],[105.799,0.277,40,124],[106.52,0.055,38,75],[106.52,0.277,33,124],[106.58,0.16,27,70],[106.58,0.14,39,42],[107.386,0.277,28,124],[107.674,0.277,29,130],[107.674,0.055,38,75],[107.734,0.16,27,70],[107.734,0.14,39,42],[108.107,0.277,36,130],[108.828,0.277,29,130],[108.828,0.055,38,75],[108.888,0.16,27,70],[108.888,0.14,39,42],[109.694,0.277,28,130],[109.982,0.277,29,136],[109.982,0.055,38,75],[110.042,0.16,27,70],[110.042,0.14,39,42],[110.415,0.277,36,136],[111.136,0.277,29,136],[111.136,0.055,38,75],[111.196,0.16,27,70],[111.196,0.14,39,42],[112.001,0.277,30,136],[112.29,0.277,31,143],[112.29,0.055,38,75],[112.35,0.16,27,70],[112.35,0.14,39,42],[112.722,0.277,38,143],[113.444,0.277,31,143],[113.444,0.055,38,75],[113.504,0.16,27,70],[113.504,0.14,39,42],[114.309,0.277,35,143],[114.597,0.055,38,75],[114.597,2.077,36,147],[114.657,0.16,27,70],[114.657,0.14,39,42],[115.751,0.055,38,75],[115.811,0.16,27,70],[115.811,0.14,39,42],[116.905,0.25,33,130],[116.905,0.055,38,89],[116.965,0.16,27,83],[116.965,0.14,39,50],[118.269,0.25,33,130],[118.269,0.055,38,89],[118.329,0.16,27,83],[118.329,0.14,39,50],[119.632,0.25,38,130],[119.632,0.055,38,89],[119.692,0.16,27,83],[119.692,0.14,39,50],[120.996,0.25,40,130],[120.996,0.055,38,89],[121.056,0.16,27,83],[121.056,0.14,39,50],[122.36,0.25,33,130],[122.36,0.055,38,89],[122.42,0.16,27,83],[122.42,0.14,39,50],[123.723,0.25,41,130],[123.723,0.055,38,89],[123.783,0.16,27,83],[123.783,0.14,39,50],[125.087,0.25,38,130],[125.087,0.055,38,89],[125.147,0.16,27,83],[125.147,0.14,39,50],[126.451,0.25,40,130],[126.451,0.055,38,89],[126.511,0.16,27,83],[126.511,0.14,39,50],[127.814,0.25,33,130],[127.814,0.055,38,89],[127.874,0.16,27,83],[127.874,0.14,39,50],[129.178,0.25,33,130],[129.178,0.055,38,89],[129.238,0.16,27,83],[129.238,0.14,39,50],[130.541,0.25,38,130],[130.542,0.055,38,89],[130.601,0.16,27,83],[130.601,0.14,39,50],[131.905,0.25,40,130],[131.905,0.055,38,89],[131.965,0.16,27,83],[131.965,0.14,39,50],[133.269,0.25,33,130],[133.269,0.055,38,89],[133.329,0.16,27,83],[133.329,0.14,39,50],[134.632,0.25,41,130],[134.632,0.055,38,89],[134.692,0.16,27,83],[134.692,0.14,39,50],[135.996,0.25,40,130],[135.996,0.055,38,89],[136.056,0.16,27,83],[136.056,0.14,39,50],[137.36,0.25,33,130],[137.36,0.055,38,89],[137.42,0.16,27,83],[137.42,0.14,39,50],[138.723,0.25,33,138],[138.723,0.055,38,89],[138.783,0.16,27,83],[138.783,0.14,39,50],[140.087,0.25,33,138],[140.087,0.055,38,89],[140.147,0.16,27,83],[140.147,0.14,39,50],[141.451,0.25,38,138],[141.451,0.055,38,89],[141.511,0.16,27,83],[141.511,0.14,39,50],[142.814,0.25,40,138],[142.814,0.055,38,89],[142.874,0.16,27,83],[142.874,0.14,39,50],[144.178,0.25,33,138],[144.178,0.055,38,89],[144.238,0.16,27,83],[144.238,0.14,39,50],[145.541,0.25,41,138],[145.542,0.055,38,89],[145.601,0.16,27,83],[145.601,0.14,39,50],[146.905,0.25,38,138],[146.905,0.055,38,89],[146.965,0.16,27,83],[146.965,0.14,39,50],[148.269,0.25,40,138],[148.269,0.055,38,89],[148.329,0.16,27,83],[148.329,0.14,39,50],[149.632,0.25,33,138],[149.632,0.055,38,89],[149.692,0.16,27,83],[149.692,0.14,39,50],[150.996,0.25,33,138],[150.996,0.055,38,89],[151.056,0.16,27,83],[151.056,0.14,39,50],[152.36,0.25,38,138],[152.36,0.055,38,89],[152.42,0.16,27,83],[152.42,0.14,39,50],[153.723,0.25,40,138],[153.723,0.055,38,89],[153.783,0.16,27,83],[153.783,0.14,39,50],[155.087,0.25,33,138],[155.087,0.055,38,89],[155.147,0.16,27,83],[155.147,0.14,39,50],[156.451,0.25,41,138],[156.451,0.055,38,89],[156.511,0.16,27,83],[156.511,0.14,39,50],[157.814,0.25,40,138],[157.814,0.055,38,89],[157.874,0.16,27,83],[157.874,0.14,39,50],[159.178,0.25,33,138],[159.178,0.055,38,89],[159.238,0.16,27,83],[159.238,0.14,39,50],[160.541,0.25,33,154],[160.542,0.055,38,89],[160.601,0.16,27,83],[160.601,0.14,39,50],[161.678,0.127,32,65],[161.905,0.25,33,154],[161.905,0.055,38,89],[161.965,0.16,27,83],[161.965,0.14,39,50],[163.041,0.127,37,65],[163.269,0.25,38,154],[163.269,0.055,38,89],[163.329,0.16,27,83],[163.329,0.14,39,50],[164.405,0.127,39,65],[164.632,0.25,40,154],[164.632,0.055,38,89],[164.692,0.16,27,83],[164.692,0.14,39,50],[165.996,0.25,33,154],[165.996,0.055,38,89],[166.056,0.16,27,83],[166.056,0.14,39,50],[167.132,0.127,40,65],[167.36,0.25,41,154],[167.36,0.055,38,89],[167.42,0.16,27,83],[167.42,0.14,39,50],[168.496,0.127,37,65],[168.723,0.25,38,154],[168.723,0.055,38,89],[168.783,0.16,27,83],[168.783,0.14,39,50],[169.86,0.127,39,65],[170.087,0.25,40,154],[170.087,0.055,38,89],[170.147,0.16,27,83],[170.147,0.14,39,50],[171.451,0.25,33,154],[171.451,0.055,38,89],[171.511,0.16,27,83],[171.511,0.14,39,50],[172.587,0.127,32,65],[172.814,0.25,33,154],[172.814,0.055,38,89],[172.874,0.16,27,83],[172.874,0.14,39,50],[173.951,0.127,37,65],[174.178,0.25,38,154],[174.178,0.055,38,89],[174.238,0.16,27,83],[174.238,0.14,39,50],[175.314,0.127,39,65],[175.541,0.25,40,154],[175.542,0.055,38,89],[175.601,0.16,27,83],[175.601,0.14,39,50],[176.905,0.25,33,154],[176.905,0.055,38,89],[176.965,0.16,27,83],[176.965,0.14,39,50],[178.041,0.127,40,65],[178.269,0.25,41,154],[178.269,0.055,38,89],[178.329,0.16,27,83],[178.329,0.14,39,50],[179.405,0.127,39,65],[179.632,0.25,40,154],[179.632,0.055,38,89],[179.692,0.16,27,83],[179.692,0.14,39,50],[180.769,0.127,32,65],[180.996,0.25,33,154],[180.996,0.055,38,89],[181.056,0.16,27,83],[181.056,0.14,39,50],[182.36,0.266,33,146],[182.36,0.055,38,89],[182.42,0.16,27,83],[182.42,0.14,39,50],[183.811,0.266,41,146],[183.811,0.055,38,89],[183.871,0.16,27,83],[183.871,0.14,39,50],[185.263,0.266,40,146],[185.263,0.055,38,89],[185.323,0.16,27,83],[185.323,0.14,39,50],[186.714,0.055,38,89],[186.714,0.266,33,146],[186.774,0.16,27,83],[186.774,0.14,39,50],[188.166,0.295,33,146],[188.166,0.055,38,89],[188.226,0.16,27,83],[188.226,0.14,39,50],[189.773,0.295,41,146],[189.773,0.055,38,89],[189.833,0.16,27,83],[189.833,0.14,39,50],[191.38,0.295,40,146],[191.38,0.055,38,89],[191.44,0.16,27,83],[191.44,0.14,39,50],[192.988,0.295,33,146],[192.988,0.055,38,89],[193.048,0.16,27,83],[193.048,0.14,39,50],[194.595,0.055,38,89],[194.655,0.16,27,83],[194.655,0.14,39,50],[195.195,0.055,38,84],[195.255,0.16,27,79],[195.255,0.14,39,47],[195.984,0.055,38,84],[196.044,0.16,27,79],[196.044,0.14,39,47],[196.774,0.055,38,84],[196.833,0.16,27,79],[196.833,0.14,39,47],[197.563,0.055,38,84],[197.623,0.16,27,79],[197.623,0.14,39,47],[198.352,0.055,38,84],[198.412,0.16,27,79],[198.412,0.14,39,47],[199.142,0.055,38,84],[199.202,0.16,27,79],[199.202,0.14,39,47],[199.931,0.055,38,84],[199.991,0.16,27,79],[199.991,0.14,39,47],[200.721,0.055,38,84],[200.781,0.16,27,79],[200.781,0.14,39,47],[201.51,0.055,38,84],[201.57,0.16,27,79],[201.57,0.14,39,47],[202.3,0.055,38,84],[202.36,0.16,27,79],[202.36,0.14,39,47],[203.089,0.055,38,84],[203.149,0.16,27,79],[203.149,0.14,39,47],[203.879,0.055,38,84],[203.939,0.16,27,79],[203.939,0.14,39,47],[204.668,0.055,38,84],[204.728,0.16,27,79],[204.728,0.14,39,47],[205.383,0.055,38,84],[205.443,0.16,27,79],[205.443,0.14,39,47],[206.097,0.055,38,84],[206.157,0.16,27,79],[206.157,0.14,39,47],[206.811,0.055,38,84],[206.871,0.16,27,79],[206.871,0.14,39,47],[207.525,0.055,38,84],[207.585,0.16,27,79],[207.585,0.14,39,47],[208.24,0.055,38,84],[208.3,0.16,27,79],[208.3,0.14,39,47],[208.954,0.055,38,84],[209.014,0.16,27,79],[209.014,0.14,39,47],[209.668,0.055,38,84],[209.728,0.16,27,79],[209.728,0.14,39,47],[210.383,0.055,38,84],[210.443,0.16,27,79],[210.443,0.14,39,47],[211.097,0.055,38,84],[211.157,0.16,27,79],[211.157,0.14,39,47],[211.811,0.055,38,84],[211.871,0.16,27,79],[211.871,0.14,39,47],[212.525,0.055,38,84],[212.585,0.16,27,79],[212.585,0.14,39,47],[213.24,0.055,38,84],[213.3,0.16,27,79],[213.3,0.14,39,47],[213.892,0.055,38,84],[213.952,0.16,27,79],[213.952,0.14,39,47],[214.544,0.055,38,84],[214.604,0.16,27,79],[214.604,0.14,39,47],[215.196,0.055,38,84],[215.256,0.16,27,79],[215.256,0.14,39,47],[215.848,0.055,38,84],[215.908,0.16,27,79],[215.908,0.14,39,47],[216.501,0.055,38,84],[216.561,0.16,27,79],[216.561,0.14,39,47],[217.153,0.055,38,84],[217.213,0.16,27,79],[217.213,0.14,39,47],[217.805,0.055,38,84],[217.865,0.16,27,79],[217.865,0.14,39,47],[218.457,0.055,38,84],[218.517,0.16,27,79],[218.517,0.14,39,47],[219.109,0.055,38,84],[219.169,0.16,27,79],[219.169,0.14,39,47],[219.761,0.055,38,84],[219.821,0.16,27,79],[219.821,0.14,39,47],[220.414,0.055,38,84],[220.474,0.16,27,79],[220.474,0.14,39,47],[221.066,0.055,38,84],[221.126,0.16,27,79],[221.126,0.14,39,47],[221.718,0.055,38,84],[221.778,0.16,27,79],[221.778,0.14,39,47],[222.37,0.055,38,84],[222.43,0.16,27,79],[222.43,0.14,39,47],[222.614,0.055,38,84],[222.674,0.16,27,79],[222.674,0.14,39,47],[223.328,0.055,38,84],[223.388,0.16,27,79],[223.388,0.14,39,47],[224.042,0.055,38,84],[224.102,0.16,27,79],[224.102,0.14,39,47],[224.757,0.055,38,84],[224.817,0.16,27,79],[224.817,0.14,39,47],[225.471,0.055,38,84],[225.531,0.16,27,79],[225.531,0.14,39,47],[226.185,0.055,38,84],[226.245,0.16,27,79],[226.245,0.14,39,47],[226.899,0.055,38,84],[226.959,0.16,27,79],[226.959,0.14,39,47],[227.614,0.055,38,84],[227.674,0.16,27,79],[227.674,0.14,39,47],[228.328,0.055,38,84],[228.388,0.16,27,79],[228.388,0.14,39,47],[228.98,0.055,38,84],[229.04,0.16,27,79],[229.04,0.14,39,47],[229.632,0.055,38,84],[229.692,0.16,27,79],[229.692,0.14,39,47],[230.284,0.055,38,84],[230.344,0.16,27,79],[230.344,0.14,39,47],[230.937,0.055,38,84],[230.997,0.16,27,79],[230.997,0.14,39,47],[231.589,0.055,38,84],[231.649,0.16,27,79],[231.649,0.14,39,47],[232.241,0.055,38,84],[232.301,0.16,27,79],[232.301,0.14,39,47],[232.893,0.055,38,84],[232.953,0.16,27,79],[232.953,0.14,39,47],[233.545,0.055,38,84],[233.605,0.16,27,79],[233.605,0.14,39,47],[234.145,0.055,38,84],[234.205,0.16,27,79],[234.205,0.14,39,47],[234.745,0.055,38,84],[234.805,0.16,27,79],[234.805,0.14,39,47],[235.345,0.055,38,84],[235.405,0.16,27,79],[235.405,0.14,39,47],[235.945,0.055,38,84],[236.005,0.16,27,79],[236.005,0.14,39,47],[236.545,0.055,38,84],[236.605,0.16,27,79],[236.605,0.14,39,47],[237.145,0.055,38,84],[237.205,0.16,27,79],[237.205,0.14,39,47],[237.745,0.055,38,84],[237.805,0.16,27,79],[237.805,0.14,39,47],[238.345,0.055,38,84],[238.405,0.16,27,79],[238.405,0.14,39,47],[238.945,0.055,38,84],[239.005,0.16,27,79],[239.005,0.14,39,47],[239.545,0.055,38,84],[239.605,0.16,27,79],[239.605,0.14,39,47],[240.145,0.055,38,84],[240.205,0.16,27,79],[240.205,0.14,39,47],[240.745,0.055,38,84],[240.805,0.16,27,79],[240.805,0.14,39,47],[241.345,0.055,38,84],[241.405,0.16,27,79],[241.405,0.14,39,47],[241.945,0.055,38,84],[242.005,0.16,27,79],[242.005,0.14,39,47],[242.545,0.055,38,84],[242.605,0.16,27,79],[242.605,0.14,39,47],[243.145,0.055,38,65],[243.205,0.16,27,61],[243.205,0.14,39,37],[244.574,0.055,38,65],[244.634,0.16,27,61],[244.634,0.14,39,37],[246.002,0.055,38,65],[246.062,0.16,27,61],[246.062,0.14,39,37],[247.431,0.055,38,65],[247.491,0.16,27,61],[247.491,0.14,39,37],[248.86,0.055,38,65],[248.92,0.16,27,61],[248.92,0.14,39,37],[250.288,0.055,38,65],[250.348,0.16,27,61],[250.348,0.14,39,37],[251.717,0.055,38,65],[251.777,0.16,27,61],[251.777,0.14,39,37],[253.145,0.055,38,65],[253.205,0.16,27,61],[253.205,0.14,39,37],[254.574,0.055,38,65],[254.634,0.16,27,61],[254.634,0.14,39,37],[256.002,0.055,38,65],[256.062,0.16,27,61],[256.062,0.14,39,37],[257.431,0.055,38,65],[257.491,0.16,27,61],[257.491,0.14,39,37],[258.86,0.055,38,65],[258.92,0.16,27,61],[258.92,0.14,39,37],[260.288,0.055,38,65],[260.348,0.16,27,61],[260.348,0.14,39,37],[261.717,0.055,38,65],[261.777,0.16,27,61],[261.777,0.14,39,37],[263.145,0.055,38,65],[263.205,0.16,27,61],[263.205,0.14,39,37],[264.574,0.055,38,65],[264.634,0.16,27,61],[264.634,0.14,39,37],[266.002,0.055,38,65],[266.062,0.16,27,61],[266.062,0.14,39,37],[267.431,0.055,38,65],[267.491,0.16,27,61],[267.491,0.14,39,37],[268.86,0.055,38,65],[268.92,0.16,27,61],[268.92,0.14,39,37],[270.288,0.055,38,65],[270.348,0.16,27,61],[270.348,0.14,39,37],[271.717,0.055,38,65],[271.777,0.16,27,61],[271.777,0.14,39,37],[273.145,0.055,38,65],[273.205,0.16,27,61],[273.205,0.14,39,37],[274.574,0.055,38,65],[274.634,0.16,27,61],[274.634,0.14,39,37],[276.002,0.055,38,65],[276.062,0.16,27,61],[276.062,0.14,39,37],[277.431,0.055,38,65],[277.491,0.16,27,61],[277.491,0.14,39,37],[278.86,0.055,38,65],[278.92,0.16,27,61],[278.92,0.14,39,37],[280.288,0.055,38,65],[280.348,0.16,27,61],[280.348,0.14,39,37],[281.717,0.055,38,65],[281.777,0.16,27,61],[281.777,0.14,39,37],[283.145,0.055,38,65],[283.205,0.16,27,61],[283.205,0.14,39,37],[284.574,0.055,38,65],[284.634,0.16,27,61],[284.634,0.14,39,37],[286.002,0.055,38,65],[286.062,0.16,27,61],[286.062,0.14,39,37],[287.431,0.055,38,65],[287.491,0.16,27,61],[287.491,0.14,39,37],[288.86,0.055,38,65],[288.92,0.16,27,61],[288.92,0.14,39,37],[290.288,0.055,38,65],[290.348,0.16,27,61],[290.348,0.14,39,37],[291.717,0.055,38,65],[291.777,0.16,27,61],[291.777,0.14,39,37],[293.145,0.055,38,65],[293.205,0.16,27,61],[293.205,0.14,39,37],[294.574,0.055,38,65],[294.634,0.16,27,61],[294.634,0.14,39,37],[296.002,0.055,38,65],[296.062,0.16,27,61],[296.062,0.14,39,37],[297.431,0.055,38,65],[297.491,0.16,27,61],[297.491,0.14,39,37],[298.86,0.055,38,65],[298.92,0.16,27,61],[298.92,0.14,39,37],[300.288,0.055,38,65],[300.348,0.16,27,61],[300.348,0.14,39,37],[301.488,0.055,38,79],[301.548,0.16,27,75],[301.548,0.14,39,45],[302.322,0.055,38,79],[302.382,0.16,27,75],[302.382,0.14,39,45],[303.155,0.055,38,79],[303.215,0.16,27,75],[303.215,0.14,39,45],[303.988,0.055,38,79],[304.048,0.16,27,75],[304.048,0.14,39,45],[304.822,0.055,38,79],[304.882,0.16,27,75],[304.882,0.14,39,45],[305.655,0.055,38,79],[305.715,0.16,27,75],[305.715,0.14,39,45],[306.488,0.055,38,79],[306.548,0.16,27,75],[306.548,0.14,39,45],[307.322,0.055,38,79],[307.382,0.16,27,75],[307.382,0.14,39,45],[308.155,0.055,38,79],[308.215,0.16,27,75],[308.215,0.14,39,45],[308.988,0.055,38,79],[309.048,0.16,27,75],[309.048,0.14,39,45],[309.822,0.055,38,79],[309.882,0.16,27,75],[309.882,0.14,39,45],[310.655,0.055,38,79],[310.715,0.16,27,75],[310.715,0.14,39,45],[311.488,0.055,38,79],[311.548,0.16,27,75],[311.548,0.14,39,45],[312.322,0.055,38,79],[312.382,0.16,27,75],[312.382,0.14,39,45],[313.155,0.055,38,79],[313.215,0.16,27,75],[313.215,0.14,39,45],[313.988,0.055,38,79],[314.048,0.16,27,75],[314.048,0.14,39,45],[314.822,0.055,38,79],[314.882,0.16,27,75],[314.882,0.14,39,45],[315.655,0.055,38,79],[315.715,0.16,27,75],[315.715,0.14,39,45],[316.488,0.055,38,79],[316.548,0.16,27,75],[316.548,0.14,39,45],[317.322,0.055,38,79],[317.382,0.16,27,75],[317.382,0.14,39,45],[318.155,0.055,38,79],[318.215,0.16,27,75],[318.215,0.14,39,45],[318.988,0.055,38,79],[319.048,0.16,27,75],[319.048,0.14,39,45],[319.822,0.055,38,79],[319.882,0.16,27,75],[319.882,0.14,39,45],[320.655,0.055,38,79],[320.715,0.16,27,75],[320.715,0.14,39,45],[321.488,0.055,38,79],[321.548,0.16,27,75],[321.548,0.14,39,45],[322.322,0.055,38,79],[322.382,0.16,27,75],[322.382,0.14,39,45],[323.155,0.055,38,79],[323.215,0.16,27,75],[323.215,0.14,39,45],[323.988,0.055,38,79],[324.048,0.16,27,75],[324.048,0.14,39,45],[324.822,0.055,38,79],[324.882,0.16,27,75],[324.882,0.14,39,45],[325.655,0.055,38,79],[325.715,0.16,27,75],[325.715,0.14,39,45],[326.488,0.055,38,79],[326.548,0.16,27,75],[326.548,0.14,39,45],[327.322,0.055,38,79],[327.382,0.16,27,75],[327.382,0.14,39,45],[328.155,0.055,38,79],[328.215,0.16,27,75],[328.215,0.14,39,45],[328.988,0.055,38,79],[329.048,0.16,27,75],[329.048,0.14,39,45],[329.822,0.055,38,79],[329.882,0.16,27,75],[329.882,0.14,39,45],[330.655,0.055,38,79],[330.715,0.16,27,75],[330.715,0.14,39,45],[331.488,0.055,38,79],[331.548,0.16,27,75],[331.548,0.14,39,45],[332.322,0.055,38,79],[332.382,0.16,27,75],[332.382,0.14,39,45],[333.155,0.055,38,79],[333.215,0.16,27,75],[333.215,0.14,39,45],[333.988,0.055,38,79],[334.048,0.16,27,75],[334.048,0.14,39,45],[334.822,0.055,38,79],[334.882,0.16,27,75],[334.882,0.14,39,45],[335.655,0.055,38,79],[335.715,0.16,27,75],[335.715,0.14,39,45],[336.488,0.055,38,79],[336.548,0.16,27,75],[336.548,0.14,39,45],[337.322,0.055,38,79],[337.382,0.16,27,75],[337.382,0.14,39,45],[338.155,0.055,38,79],[338.215,0.16,27,75],[338.215,0.14,39,45],[338.988,0.055,38,79],[339.048,0.16,27,75],[339.048,0.14,39,45],[339.822,0.055,38,79],[339.882,0.16,27,75],[339.882,0.14,39,45],[340.655,0.055,38,79],[340.715,0.16,27,75],[340.715,0.14,39,45],[341.488,0.055,38,79],[341.548,0.16,27,75],[341.548,0.14,39,45],[342.322,0.055,38,79],[342.382,0.16,27,75],[342.382,0.14,39,45],[343.155,0.055,38,79],[343.215,0.16,27,75],[343.215,0.14,39,45],[343.988,0.055,38,79],[344.048,0.16,27,75],[344.048,0.14,39,45],[344.822,0.055,38,79],[344.882,0.16,27,75],[344.882,0.14,39,45],[345.655,0.055,38,79],[345.715,0.16,27,75],[345.715,0.14,39,45],[346.488,0.055,38,79],[346.548,0.16,27,75],[346.548,0.14,39,45],[347.322,0.055,38,79],[347.382,0.16,27,75],[347.382,0.14,39,45],[348.155,0.055,38,79],[348.215,0.16,27,75],[348.215,0.14,39,45],[348.988,0.055,38,79],[349.048,0.16,27,75],[349.048,0.14,39,45],[349.822,0.055,38,79],[349.882,0.16,27,75],[349.882,0.14,39,45],[350.655,0.055,38,79],[350.715,0.16,27,75],[350.715,0.14,39,45],[351.488,0.055,38,79],[351.548,0.16,27,75],[351.548,0.14,39,45],[352.322,0.055,38,79],[352.382,0.16,27,75],[352.382,0.14,39,45],[353.155,0.055,38,79],[353.215,0.16,27,75],[353.215,0.14,39,45],[353.988,0.055,38,79],[354.048,0.16,27,75],[354.048,0.14,39,45],[354.822,0.055,38,79],[354.882,0.16,27,75],[354.882,0.14,39,45],[355.655,0.055,38,79],[355.715,0.16,27,75],[355.715,0.14,39,45],[356.488,0.055,38,79],[356.548,0.16,27,75],[356.548,0.14,39,45],[357.322,0.055,38,79],[357.382,0.16,27,75],[357.382,0.14,39,45],[358.155,0.055,38,79],[358.215,0.16,27,75],[358.215,0.14,39,45],[358.988,0.055,38,79],[359.048,0.16,27,75],[359.048,0.14,39,45],[359.822,0.055,38,79],[359.882,0.16,27,75],[359.882,0.14,39,45],[360.655,0.055,38,79],[360.715,0.16,27,75],[360.715,0.14,39,45],[361.488,0.055,38,79],[361.548,0.16,27,75],[361.548,0.14,39,45],[362.322,0.055,38,79],[362.382,0.16,27,75],[362.382,0.14,39,45],[363.155,0.055,38,79],[363.215,0.16,27,75],[363.215,0.14,39,45],[363.988,0.055,38,79],[364.048,0.16,27,75],[364.048,0.14,39,45],[364.822,0.055,38,79],[364.882,0.16,27,75],[364.882,0.14,39,45],[365.655,0.055,38,79],[365.715,0.16,27,75],[365.715,0.14,39,45],[366.488,0.055,38,79],[366.548,0.16,27,75],[366.548,0.14,39,45],[367.322,0.055,38,79],[367.382,0.16,27,75],[367.382,0.14,39,45],[368.155,0.055,38,79],[368.215,0.16,27,75],[368.215,0.14,39,45],[368.988,0.055,38,79],[369.048,0.16,27,75],[369.048,0.14,39,45],[369.822,0.055,38,79],[369.882,0.16,27,75],[369.882,0.14,39,45],[370.655,0.055,38,79],[370.715,0.16,27,75],[370.715,0.14,39,45],[371.488,0.055,38,79],[371.548,0.16,27,75],[371.548,0.14,39,45],[372.322,0.055,38,79],[372.382,0.16,27,75],[372.382,0.14,39,45],[373.155,0.055,38,79],[373.215,0.16,27,75],[373.215,0.14,39,45],[373.988,0.055,38,79],[374.048,0.16,27,75],[374.048,0.14,39,45],[374.822,0.055,38,79],[374.882,0.16,27,75],[374.882,0.14,39,45],[375.655,0.055,38,79],[375.715,0.16,27,75],[375.715,0.14,39,45],[375.822,0.857,36,122],[375.822,0.055,38,75],[375.882,0.16,27,70],[375.882,0.14,39,42],[376.893,0.055,38,75],[376.893,0.857,36,122],[376.953,0.16,27,70],[376.953,0.14,39,42],[377.964,0.857,36,130],[377.964,0.055,38,75],[378.024,0.16,27,70],[378.024,0.14,39,42],[379.036,0.857,36,130],[379.036,0.055,38,75],[379.096,0.16,27,70],[379.096,0.14,39,42],[380.107,0.857,33,137],[380.107,0.055,38,75],[380.167,0.16,27,70],[380.167,0.14,39,42],[381.179,0.055,38,75],[381.179,0.857,33,137],[381.239,0.16,27,70],[381.239,0.14,39,42],[382.25,0.857,33,145],[382.25,0.055,38,75],[382.31,0.16,27,70],[382.31,0.14,39,42],[383.322,0.857,33,145],[383.322,0.055,38,75],[383.382,0.16,27,70],[383.382,0.14,39,42],[384.393,0.055,38,75],[384.393,0.857,29,152],[384.453,0.16,27,70],[384.453,0.14,39,42],[385.464,0.857,29,152],[385.464,0.055,38,75],[385.524,0.16,27,70],[385.524,0.14,39,42],[386.536,0.857,29,159],[386.536,0.055,38,75],[386.596,0.16,27,70],[386.596,0.14,39,42],[387.607,0.857,29,159],[387.607,0.055,38,75],[387.667,0.16,27,70],[387.667,0.14,39,42],[388.679,0.055,38,75],[388.679,0.857,31,167],[388.739,0.16,27,70],[388.739,0.14,39,42],[389.75,0.857,31,167],[389.75,0.055,38,75],[389.81,0.16,27,70],[389.81,0.14,39,42],[390.822,1.929,36,147],[390.822,0.055,38,75],[390.882,0.16,27,70],[390.882,0.14,39,42],[391.893,0.055,38,75],[391.953,0.16,27,70],[391.953,0.14,39,42],[392.964,0.248,36,111],[392.964,0.055,38,75],[393.024,0.16,27,70],[393.024,0.14,39,42],[393.352,0.248,43,111],[393.999,0.248,36,111],[393.999,0.055,38,75],[394.059,0.16,27,70],[394.059,0.14,39,42],[394.775,0.248,35,111],[395.033,0.248,36,118],[395.033,0.055,38,75],[395.093,0.16,27,70],[395.093,0.14,39,42],[395.421,0.248,43,118],[396.068,0.248,36,118],[396.068,0.055,38,75],[396.128,0.16,27,70],[396.128,0.14,39,42],[396.844,0.248,32,118],[397.102,0.248,33,124],[397.102,0.055,38,75],[397.162,0.16,27,70],[397.162,0.14,39,42],[397.49,0.248,40,124],[398.137,0.248,33,124],[398.137,0.055,38,75],[398.197,0.16,27,70],[398.197,0.14,39,42],[398.913,0.248,32,124],[399.171,0.248,33,131],[399.171,0.055,38,75],[399.231,0.16,27,70],[399.231,0.14,39,42],[399.559,0.248,40,131],[400.206,0.248,33,131],[400.206,0.055,38,75],[400.266,0.16,27,70],[400.266,0.14,39,42],[400.982,0.248,28,131],[401.24,0.248,29,137],[401.24,0.055,38,75],[401.3,0.16,27,70],[401.3,0.14,39,42],[401.628,0.248,36,137],[402.275,0.248,29,137],[402.275,0.055,38,75],[402.335,0.16,27,70],[402.335,0.14,39,42],[403.051,0.248,28,137],[403.309,0.248,29,144],[403.309,0.055,38,75],[403.369,0.16,27,70],[403.369,0.14,39,42],[403.697,0.248,36,144],[404.344,0.248,29,144],[404.344,0.055,38,75],[404.404,0.16,27,70],[404.404,0.14,39,42],[405.12,0.248,30,144],[405.378,0.248,31,151],[405.378,0.055,38,75],[405.438,0.16,27,70],[405.438,0.14,39,42],[405.766,0.248,38,151],[406.413,0.248,31,151],[406.413,0.055,38,75],[406.473,0.16,27,70],[406.473,0.14,39,42],[407.188,0.248,35,151],[407.447,1.862,36,155],[407.447,0.055,38,75],[407.507,0.16,27,70],[407.507,0.14,39,42],[408.482,0.055,38,75],[408.542,0.16,27,70],[408.542,0.14,39,42],[409.516,0.24,36,117],[409.516,0.055,38,75],[409.576,0.16,27,70],[409.576,0.14,39,42],[409.891,0.24,43,117],[410.516,0.24,36,117],[410.516,0.055,38,75],[410.576,0.16,27,70],[410.576,0.14,39,42],[411.266,0.24,35,117],[411.516,0.24,36,124],[411.516,0.055,38,75],[411.576,0.16,27,70],[411.576,0.14,39,42],[411.891,0.24,43,124],[412.516,0.24,36,124],[412.516,0.055,38,75],[412.576,0.16,27,70],[412.576,0.14,39,42],[413.266,0.24,32,124],[413.516,0.24,33,131],[413.516,0.055,38,75],[413.576,0.16,27,70],[413.576,0.14,39,42],[413.891,0.24,40,131],[414.516,0.24,33,131],[414.516,0.055,38,75],[414.576,0.16,27,70],[414.576,0.14,39,42],[415.266,0.24,32,131],[415.516,0.24,33,138],[415.516,0.055,38,75],[415.576,0.16,27,70],[415.576,0.14,39,42],[415.891,0.24,40,138],[416.516,0.24,33,138],[416.516,0.055,38,75],[416.576,0.16,27,70],[416.576,0.14,39,42],[417.266,0.24,28,138],[417.516,0.24,29,145],[417.516,0.055,38,75],[417.576,0.16,27,70],[417.576,0.14,39,42],[417.891,0.24,36,145],[418.516,0.24,29,145],[418.516,0.055,38,75],[418.576,0.16,27,70],[418.576,0.14,39,42],[419.266,0.24,28,145],[419.516,0.24,29,152],[419.516,0.055,38,75],[419.576,0.16,27,70],[419.576,0.14,39,42],[419.891,0.24,36,152],[420.516,0.24,29,152],[420.516,0.055,38,75],[420.576,0.16,27,70],[420.576,0.14,39,42],[421.266,0.24,30,152],[421.516,0.24,31,159],[421.516,0.055,38,75],[421.576,0.16,27,70],[421.576,0.14,39,42],[421.891,0.24,38,159],[422.516,0.24,31,159],[422.516,0.055,38,75],[422.576,0.16,27,70],[422.576,0.14,39,42],[423.266,0.24,35,159],[423.516,1.8,36,163],[423.516,0.055,38,75],[423.576,0.16,27,70],[423.576,0.14,39,42],[424.516,0.055,38,75],[424.576,0.16,27,70],[424.576,0.14,39,42],[425.516,0.232,36,117],[425.516,0.055,38,75],[425.576,0.16,27,70],[425.576,0.14,39,42],[425.879,0.232,43,117],[426.484,0.055,38,75],[426.484,0.232,36,117],[426.544,0.16,27,70],[426.544,0.14,39,42],[427.21,0.232,35,117],[427.452,0.232,36,124],[427.452,0.055,38,75],[427.512,0.16,27,70],[427.512,0.14,39,42],[427.815,0.232,43,124],[428.419,0.232,36,124],[428.419,0.055,38,75],[428.479,0.16,27,70],[428.479,0.14,39,42],[429.145,0.232,32,124],[429.387,0.232,33,131],[429.387,0.055,38,75],[429.447,0.16,27,70],[429.447,0.14,39,42],[429.75,0.232,40,131],[430.355,0.232,33,131],[430.355,0.055,38,75],[430.415,0.16,27,70],[430.415,0.14,39,42],[431.081,0.232,32,131],[431.323,0.232,33,138],[431.323,0.055,38,75],[431.383,0.16,27,70],[431.383,0.14,39,42],[431.685,0.232,40,138],[432.29,0.232,33,138],[432.29,0.055,38,75],[432.35,0.16,27,70],[432.35,0.14,39,42],[433.016,0.232,28,138],[433.258,0.232,29,145],[433.258,0.055,38,75],[433.318,0.16,27,70],[433.318,0.14,39,42],[433.621,0.232,36,145],[434.226,0.232,29,145],[434.226,0.055,38,75],[434.286,0.16,27,70],[434.286,0.14,39,42],[434.952,0.232,28,145],[435.193,0.232,29,152],[435.193,0.055,38,75],[435.253,0.16,27,70],[435.253,0.14,39,42],[435.556,0.232,36,152],[436.161,0.232,29,152],[436.161,0.055,38,75],[436.221,0.16,27,70],[436.221,0.14,39,42],[436.887,0.232,30,152],[437.129,0.232,31,159],[437.129,0.055,38,75],[437.189,0.16,27,70],[437.189,0.14,39,42],[437.492,0.232,38,159],[438.097,0.055,38,75],[438.097,0.232,31,159],[438.157,0.16,27,70],[438.157,0.14,39,42],[438.823,0.232,35,159],[439.065,1.742,36,163],[439.065,0.055,38,75],[439.125,0.16,27,70],[439.125,0.14,39,42],[440.032,0.055,38,75],[440.092,0.16,27,70],[440.092,0.14,39,42],[441,0.21,38,154],[441,0.055,38,246],[441.06,0.16,27,231],[441.06,0.14,39,138],[441.75,0.21,38,154],[442,0.21,38,154],[442,0.055,38,246],[442.06,0.16,27,231],[442.06,0.14,39,138],[442.75,0.21,38,154],[443,0.21,38,163],[443,0.055,38,255],[443.06,0.16,27,245],[443.06,0.14,39,147],[443.75,0.21,38,163],[444,0.21,38,163],[444,0.055,38,255],[444.06,0.16,27,245],[444.06,0.14,39,147],[444.75,0.21,38,163],[445,0.21,35,172],[445,0.055,38,255],[445.06,0.16,27,255],[445.06,0.14,39,155],[445.75,0.21,35,172],[446,0.21,35,172],[446,0.055,38,255],[446.06,0.16,27,255],[446.06,0.14,39,155],[446.75,0.21,35,172],[447,0.21,35,181],[447,0.055,38,255],[447.06,0.16,27,255],[447.06,0.14,39,163],[447.75,0.21,35,181],[448,0.21,35,181],[448,0.055,38,255],[448.06,0.16,27,255],[448.06,0.14,39,163],[448.75,0.21,35,181],[448.75,0.055,38,255],[448.81,0.16,27,255],[448.81,0.14,39,163],[449,0.21,31,191],[449,0.055,38,255],[449.06,0.16,27,255],[449.06,0.14,39,172],[449.75,0.21,31,191],[450,0.21,31,191],[450,0.055,38,255],[450.06,0.16,27,255],[450.06,0.14,39,172],[450.75,0.21,31,191],[451,0.21,31,200],[451,0.055,38,255],[451.06,0.16,27,255],[451.06,0.14,39,180],[451.75,0.21,31,200],[452,0.21,31,200],[452,0.055,38,255],[452.06,0.16,27,255],[452.06,0.14,39,180],[452.75,0.21,31,200],[453,0.21,33,209],[453,0.055,38,255],[453.06,0.16,27,255],[453.06,0.14,39,188],[453.75,0.21,33,209],[454,0.21,33,209],[454,0.055,38,255],[454.06,0.16,27,255],[454.06,0.14,39,188],[454.75,0.21,33,209],[455,0.21,38,194],[455,0.055,38,255],[455.06,0.16,27,255],[455.06,0.14,39,175],[455.75,0.21,38,194],[456,0.21,38,194],[456,0.055,38,255],[456.06,0.16,27,255],[456.06,0.14,39,175],[456.75,0.21,38,194],[456.75,0.055,38,255],[456.81,0.16,27,255],[456.81,0.14,39,175],[457,0.21,38,162],[457,0.055,38,255],[457.06,0.16,27,243],[457.06,0.14,39,146],[457.75,0.21,38,162],[458,0.21,38,162],[458,0.055,38,255],[458.06,0.16,27,243],[458.06,0.14,39,146],[458.75,0.21,38,162],[459,0.21,38,172],[459,0.055,38,255],[459.06,0.16,27,255],[459.06,0.14,39,155],[459.75,0.21,38,172],[460,0.21,38,172],[460,0.055,38,255],[460.06,0.16,27,255],[460.06,0.14,39,155],[460.75,0.21,38,172],[461,0.21,35,181],[461,0.055,38,255],[461.06,0.16,27,255],[461.06,0.14,39,163],[461.75,0.21,35,181],[462,0.21,35,181],[462,0.055,38,255],[462.06,0.16,27,255],[462.06,0.14,39,163],[462.75,0.21,35,181],[463,0.21,35,191],[463,0.055,38,255],[463.06,0.16,27,255],[463.06,0.14,39,172],[463.75,0.21,35,191],[464,0.21,35,191],[464,0.055,38,255],[464.06,0.16,27,255],[464.06,0.14,39,172],[464.75,0.21,35,191],[464.75,0.055,38,255],[464.81,0.16,27,255],[464.81,0.14,39,172],[465,0.21,31,201],[465,0.055,38,255],[465.06,0.16,27,255],[465.06,0.14,39,181],[465.75,0.21,31,201],[466,0.21,31,201],[466,0.055,38,255],[466.06,0.16,27,255],[466.06,0.14,39,181],[466.75,0.21,31,201],[467,0.21,31,211],[467,0.055,38,255],[467.06,0.16,27,255],[467.06,0.14,39,190],[467.75,0.21,31,211],[468,0.21,31,211],[468,0.055,38,255],[468.06,0.16,27,255],[468.06,0.14,39,190],[468.75,0.21,31,211],[469,0.21,33,220],[469,0.055,38,255],[469.06,0.16,27,255],[469.06,0.14,39,198],[469.75,0.21,33,220],[470,0.21,33,220],[470,0.055,38,255],[470.06,0.16,27,255],[470.06,0.14,39,198],[470.75,0.21,33,220],[471,0.21,38,204],[471,0.055,38,255],[471.06,0.16,27,255],[471.06,0.14,39,184],[471.75,0.21,38,204],[472,0.21,38,204],[472,0.055,38,255],[472.06,0.16,27,255],[472.06,0.14,39,184],[472.75,0.21,38,204],[472.75,0.055,38,255],[472.81,0.16,27,255],[472.81,0.14,39,184],[473,0.207,38,162],[473,0.055,38,255],[473.06,0.16,27,243],[473.06,0.14,39,146],[473.738,0.207,38,162],[473.984,0.207,38,162],[473.984,0.055,38,255],[474.044,0.16,27,243],[474.044,0.14,39,146],[474.721,0.207,38,162],[474.967,0.207,38,172],[474.967,0.055,38,255],[475.027,0.16,27,255],[475.027,0.14,39,155],[475.705,0.207,38,172],[475.951,0.207,38,172],[475.951,0.055,38,255],[476.011,0.16,27,255],[476.011,0.14,39,155],[476.688,0.207,38,172],[476.934,0.207,35,181],[476.934,0.055,38,255],[476.994,0.16,27,255],[476.994,0.14,39,163],[477.672,0.207,35,181],[477.918,0.207,35,181],[477.918,0.055,38,255],[477.978,0.16,27,255],[477.978,0.14,39,163],[478.656,0.207,35,181],[478.902,0.207,35,191],[478.902,0.055,38,255],[478.962,0.16,27,255],[478.962,0.14,39,172],[479.639,0.207,35,191],[479.885,0.207,35,191],[479.885,0.055,38,255],[479.945,0.16,27,255],[479.945,0.14,39,172],[480.623,0.207,35,191],[480.623,0.055,38,255],[480.683,0.16,27,255],[480.683,0.14,39,172],[480.869,0.207,31,201],[480.869,0.055,38,255],[480.929,0.16,27,255],[480.929,0.14,39,181],[481.606,0.207,31,201],[481.852,0.207,31,201],[481.852,0.055,38,255],[481.912,0.16,27,255],[481.912,0.14,39,181],[482.59,0.207,31,201],[482.836,0.207,31,211],[482.836,0.055,38,255],[482.896,0.16,27,255],[482.896,0.14,39,190],[483.574,0.207,31,211],[483.82,0.207,31,211],[483.82,0.055,38,255],[483.88,0.16,27,255],[483.88,0.14,39,190],[484.557,0.207,31,211],[484.803,0.207,33,220],[484.803,0.055,38,255],[484.863,0.16,27,255],[484.863,0.14,39,198],[485.541,0.207,33,220],[485.787,0.207,33,220],[485.787,0.055,38,255],[485.847,0.16,27,255],[485.847,0.14,39,198],[486.525,0.207,33,220],[486.771,0.207,38,204],[486.771,0.055,38,255],[486.83,0.16,27,255],[486.83,0.14,39,184],[487.508,0.207,38,204],[487.754,0.207,38,204],[487.754,0.055,38,255],[487.814,0.16,27,255],[487.814,0.14,39,184],[488.492,0.207,38,204],[488.492,0.055,38,255],[488.552,0.16,27,255],[488.552,0.14,39,184],[488.738,0.203,38,170],[488.738,0.055,38,255],[488.798,0.16,27,255],[488.798,0.14,39,153],[489.464,0.203,38,170],[489.705,0.203,38,170],[489.705,0.055,38,255],[489.765,0.16,27,255],[489.765,0.14,39,153],[490.431,0.203,38,170],[490.673,0.203,38,180],[490.673,0.055,38,255],[490.733,0.16,27,255],[490.733,0.14,39,162],[491.399,0.203,38,180],[491.641,0.203,38,180],[491.641,0.055,38,255],[491.701,0.16,27,255],[491.701,0.14,39,162],[492.367,0.203,38,180],[492.609,0.203,35,191],[492.609,0.055,38,255],[492.669,0.16,27,255],[492.669,0.14,39,171],[493.334,0.203,35,191],[493.576,0.203,35,191],[493.576,0.055,38,255],[493.636,0.16,27,255],[493.636,0.14,39,171],[494.302,0.203,35,191],[494.544,0.203,35,201],[494.544,0.055,38,255],[494.604,0.16,27,255],[494.604,0.14,39,181],[495.27,0.203,35,201],[495.512,0.203,35,201],[495.512,0.055,38,255],[495.572,0.16,27,255],[495.572,0.14,39,181],[496.238,0.203,35,201],[496.238,0.055,38,255],[496.298,0.16,27,255],[496.298,0.14,39,181],[496.48,0.203,31,211],[496.48,0.055,38,255],[496.54,0.16,27,255],[496.54,0.14,39,190],[497.205,0.203,31,211],[497.447,0.203,31,211],[497.447,0.055,38,255],[497.507,0.16,27,255],[497.507,0.14,39,190],[498.173,0.203,31,211],[498.415,0.203,31,221],[498.415,0.055,38,255],[498.475,0.16,27,255],[498.475,0.14,39,199],[499.141,0.203,31,221],[499.383,0.203,31,221],[499.383,0.055,38,255],[499.443,0.16,27,255],[499.443,0.14,39,199],[500.109,0.203,31,221],[500.351,0.203,33,231],[500.351,0.055,38,255],[500.411,0.16,27,255],[500.411,0.14,39,208],[501.076,0.203,33,231],[501.318,0.203,33,231],[501.318,0.055,38,255],[501.378,0.16,27,255],[501.378,0.14,39,208],[502.044,0.203,33,231],[502.286,0.203,38,214],[502.286,0.055,38,255],[502.346,0.16,27,255],[502.346,0.14,39,193],[503.012,0.203,38,214],[503.254,0.203,38,214],[503.254,0.055,38,255],[503.314,0.16,27,255],[503.314,0.14,39,193],[503.98,0.203,38,214],[503.98,0.055,38,255],[504.04,0.16,27,255],[504.04,0.14,39,193],[504.222,0.203,38,170],[504.222,0.055,38,255],[504.282,0.16,27,255],[504.282,0.14,39,153],[504.947,0.203,38,170],[505.189,0.203,38,170],[505.189,0.055,38,255],[505.249,0.16,27,255],[505.249,0.14,39,153],[505.915,0.203,38,170],[506.157,0.203,38,180],[506.157,0.055,38,255],[506.217,0.16,27,255],[506.217,0.14,39,162],[506.883,0.203,38,180],[507.125,0.203,38,180],[507.125,0.055,38,255],[507.185,0.16,27,255],[507.185,0.14,39,162],[507.851,0.203,38,180],[508.092,0.203,35,191],[508.092,0.055,38,255],[508.152,0.16,27,255],[508.152,0.14,39,171],[508.818,0.203,35,191],[509.06,0.203,35,191],[509.06,0.055,38,255],[509.12,0.16,27,255],[509.12,0.14,39,171],[509.786,0.203,35,191],[510.028,0.203,35,201],[510.028,0.055,38,255],[510.088,0.16,27,255],[510.088,0.14,39,181],[510.754,0.203,35,201],[510.996,0.203,35,201],[510.996,0.055,38,255],[511.056,0.16,27,255],[511.056,0.14,39,181],[511.722,0.203,35,201],[511.722,0.055,38,255],[511.782,0.16,27,255],[511.782,0.14,39,181],[511.964,0.203,31,211],[511.964,0.055,38,255],[512.024,0.16,27,255],[512.024,0.14,39,190],[512.689,0.203,31,211],[512.931,0.203,31,211],[512.931,0.055,38,255],[512.991,0.16,27,255],[512.991,0.14,39,190],[513.657,0.203,31,211],[513.899,0.203,31,221],[513.899,0.055,38,255],[513.959,0.16,27,255],[513.959,0.14,39,199],[514.625,0.203,31,221],[514.867,0.203,31,221],[514.867,0.055,38,255],[514.927,0.16,27,255],[514.927,0.14,39,199],[515.592,0.203,31,221],[515.835,0.203,33,231],[515.835,0.055,38,255],[515.894,0.16,27,255],[515.894,0.14,39,208],[516.56,0.203,33,231],[516.802,0.203,33,231],[516.802,0.055,38,255],[516.862,0.16,27,255],[516.862,0.14,39,208],[517.528,0.203,33,231],[517.77,0.203,38,214],[517.77,0.055,38,255],[517.83,0.16,27,255],[517.83,0.14,39,193],[518.496,0.203,38,214],[518.738,0.203,38,214],[518.738,0.055,38,255],[518.798,0.16,27,255],[518.798,0.14,39,193],[519.463,0.203,38,214],[519.463,0.055,38,255],[519.524,0.16,27,255],[519.524,0.14,39,193],[519.705,0.207,38,162],[519.705,0.055,38,255],[519.765,0.16,27,243],[519.765,0.14,39,146],[520.443,0.207,38,162],[520.689,0.207,38,162],[520.689,0.055,38,255],[520.749,0.16,27,243],[520.749,0.14,39,146],[521.427,0.207,38,162],[521.673,0.207,38,172],[521.673,0.055,38,255],[521.733,0.16,27,255],[521.733,0.14,39,155],[522.41,0.207,38,172],[522.656,0.207,38,172],[522.656,0.055,38,255],[522.716,0.16,27,255],[522.716,0.14,39,155],[523.394,0.207,38,172],[523.64,0.207,35,181],[523.64,0.055,38,255],[523.7,0.16,27,255],[523.7,0.14,39,163],[524.378,0.207,35,181],[524.624,0.207,35,181],[524.624,0.055,38,255],[524.683,0.16,27,255],[524.683,0.14,39,163],[525.361,0.207,35,181],[525.607,0.207,35,191],[525.607,0.055,38,255],[525.667,0.16,27,255],[525.667,0.14,39,172],[526.345,0.207,35,191],[526.591,0.207,35,191],[526.591,0.055,38,255],[526.651,0.16,27,255],[526.651,0.14,39,172],[527.328,0.207,35,191],[527.328,0.055,38,255],[527.388,0.16,27,255],[527.388,0.14,39,172],[527.574,0.207,31,201],[527.574,0.055,38,255],[527.634,0.16,27,255],[527.634,0.14,39,181],[528.312,0.207,31,201],[528.558,0.207,31,201],[528.558,0.055,38,255],[528.618,0.16,27,255],[528.618,0.14,39,181],[529.296,0.207,31,201],[529.542,0.207,31,211],[529.542,0.055,38,255],[529.601,0.16,27,255],[529.601,0.14,39,190],[530.279,0.207,31,211],[530.525,0.207,31,211],[530.525,0.055,38,255],[530.585,0.16,27,255],[530.585,0.14,39,190],[531.263,0.207,31,211],[531.509,0.207,33,220],[531.509,0.055,38,255],[531.569,0.16,27,255],[531.569,0.14,39,198],[532.246,0.207,33,220],[532.492,0.207,33,220],[532.492,0.055,38,255],[532.552,0.16,27,255],[532.552,0.14,39,198],[533.23,0.207,33,220],[533.476,0.207,38,204],[533.476,0.055,38,255],[533.536,0.16,27,255],[533.536,0.14,39,184],[534.214,0.207,38,204],[534.46,0.207,38,204],[534.46,0.055,38,255],[534.519,0.16,27,255],[534.519,0.14,39,184],[535.197,0.207,38,204],[535.197,0.055,38,255],[535.257,0.16,27,255],[535.257,0.14,39,184],[535.443,0.214,38,162],[535.443,0.055,38,255],[535.503,0.16,27,243],[535.503,0.14,39,146],[536.206,0.214,38,162],[536.46,0.214,38,162],[536.46,0.055,38,255],[536.52,0.16,27,243],[536.52,0.14,39,146],[537.223,0.214,38,162],[537.477,0.214,38,172],[537.477,0.055,38,255],[537.537,0.16,27,255],[537.537,0.14,39,155],[538.24,0.214,38,172],[538.494,0.214,38,172],[538.494,0.055,38,255],[538.554,0.16,27,255],[538.554,0.14,39,155],[539.257,0.214,38,172],[539.511,0.214,35,181],[539.511,0.055,38,255],[539.571,0.16,27,255],[539.571,0.14,39,163],[540.274,0.214,35,181],[540.528,0.214,35,181],[540.528,0.055,38,255],[540.588,0.16,27,255],[540.588,0.14,39,163],[541.291,0.214,35,181],[541.545,0.214,35,191],[541.545,0.055,38,255],[541.605,0.16,27,255],[541.605,0.14,39,172],[542.308,0.214,35,191],[542.562,0.214,35,191],[542.562,0.055,38,255],[542.622,0.16,27,255],[542.622,0.14,39,172],[543.324,0.214,35,191],[543.324,0.055,38,255],[543.385,0.16,27,255],[543.385,0.14,39,172],[543.579,0.214,31,201],[543.579,0.055,38,255],[543.639,0.16,27,255],[543.639,0.14,39,181],[544.341,0.214,31,201],[544.596,0.214,31,201],[544.596,0.055,38,255],[544.656,0.16,27,255],[544.656,0.14,39,181],[545.358,0.214,31,201],[545.613,0.214,31,211],[545.613,0.055,38,255],[545.673,0.16,27,255],[545.673,0.14,39,190],[546.375,0.214,31,211],[546.63,0.214,31,211],[546.63,0.055,38,255],[546.69,0.16,27,255],[546.69,0.14,39,190],[547.392,0.214,31,211],[547.646,0.214,33,220],[547.646,4.068,38,162],[547.646,0.055,38,255],[547.707,0.16,27,255],[547.707,0.14,39,198],[548.409,0.214,33,220],[548.663,0.214,33,220],[548.663,0.055,38,255],[548.723,0.16,27,255],[548.723,0.14,39,198],[549.426,0.214,33,220],[549.68,0.214,38,204],[549.68,0.055,38,255],[549.74,0.16,27,255],[549.74,0.14,39,184],[550.443,0.214,38,204],[550.697,0.214,38,204],[550.697,0.055,38,255],[550.757,0.16,27,255],[550.757,0.14,39,184],[551.46,0.214,38,204],[551.46,0.055,38,255],[551.52,0.16,27,255],[551.52,0.14,39,184],[551.714,0.055,38,75],[551.774,0.16,27,70],[551.774,0.14,39,42],[552.731,0.055,38,75],[552.791,0.16,27,70],[552.791,0.14,39,42],[553.748,0.055,38,75],[553.808,0.16,27,70],[553.808,0.14,39,42],[554.314,0.055,38,93],[554.374,0.16,27,87],[554.374,0.14,39,52],[555.223,0.055,38,93],[555.283,0.16,27,87],[555.283,0.14,39,52],[556.133,0.055,38,93],[556.192,0.16,27,87],[556.192,0.14,39,52],[557.042,0.055,38,93],[557.102,0.16,27,87],[557.102,0.14,39,52],[557.951,0.055,38,93],[558.011,0.16,27,87],[558.011,0.14,39,52],[558.86,0.055,38,93],[558.92,0.16,27,87],[558.92,0.14,39,52],[559.769,0.055,38,93],[559.829,0.16,27,87],[559.829,0.14,39,52],[560.678,0.055,38,93],[560.738,0.16,27,87],[560.738,0.14,39,52],[561.587,0.055,38,93],[561.647,0.16,27,87],[561.647,0.14,39,52],[562.496,0.055,38,93],[562.556,0.16,27,87],[562.556,0.14,39,52],[563.405,0.055,38,93],[563.465,0.16,27,87],[563.465,0.14,39,52],[564.314,0.055,38,93],[564.374,0.16,27,87],[564.374,0.14,39,52],[565.223,0.055,38,93],[565.283,0.16,27,87],[565.283,0.14,39,52],[566.133,0.055,38,93],[566.192,0.16,27,87],[566.192,0.14,39,52],[567.042,0.055,38,93],[567.102,0.16,27,87],[567.102,0.14,39,52],[567.951,0.055,38,93],[568.011,0.16,27,87],[568.011,0.14,39,52],[568.86,0.227,31,162],[568.86,0.055,38,93],[568.92,0.16,27,87],[568.92,0.14,39,52],[569.769,0.055,38,93],[569.769,0.227,38,146],[569.829,0.16,27,87],[569.829,0.14,39,52],[570.678,0.055,38,93],[570.678,0.227,31,162],[570.738,0.16,27,87],[570.738,0.14,39,52],[571.587,0.227,38,146],[571.587,0.055,38,93],[571.647,0.16,27,87],[571.647,0.14,39,52],[572.496,0.227,31,162],[572.496,0.055,38,93],[572.556,0.16,27,87],[572.556,0.14,39,52],[573.405,0.227,38,146],[573.405,0.055,38,93],[573.465,0.16,27,87],[573.465,0.14,39,52],[574.314,0.227,31,162],[574.314,0.055,38,93],[574.374,0.16,27,87],[574.374,0.14,39,52],[575.223,0.227,38,146],[575.223,0.055,38,93],[575.283,0.16,27,87],[575.283,0.14,39,52],[576.133,0.227,31,162],[576.133,0.055,38,93],[576.192,0.16,27,87],[576.192,0.14,39,52],[577.042,0.227,38,146],[577.042,0.055,38,93],[577.102,0.16,27,87],[577.102,0.14,39,52],[577.951,0.227,31,162],[577.951,0.055,38,93],[578.011,0.16,27,87],[578.011,0.14,39,52],[578.86,0.227,38,146],[578.86,0.055,38,93],[578.92,0.16,27,87],[578.92,0.14,39,52],[579.769,0.055,38,93],[579.769,0.227,31,162],[579.829,0.16,27,87],[579.829,0.14,39,52],[580.678,0.055,38,93],[580.678,0.227,38,146],[580.738,0.16,27,87],[580.738,0.14,39,52],[581.587,0.227,31,162],[581.587,0.055,38,93],[581.647,0.16,27,87],[581.647,0.14,39,52],[582.496,0.227,38,146],[582.496,0.055,38,93],[582.556,0.16,27,87],[582.556,0.14,39,52],[583.405,0.055,38,93],[583.465,0.16,27,87],[583.465,0.14,39,52],[584.314,0.055,38,93],[584.374,0.16,27,87],[584.374,0.14,39,52],[585.223,0.055,38,93],[585.283,0.16,27,87],[585.283,0.14,39,52],[586.133,0.055,38,93],[586.192,0.16,27,87],[586.192,0.14,39,52],[587.042,0.055,38,93],[587.102,0.16,27,87],[587.102,0.14,39,52],[587.951,0.055,38,93],[588.011,0.16,27,87],[588.011,0.14,39,52],[588.86,0.055,38,93],[588.92,0.16,27,87],[588.92,0.14,39,52],[589.769,0.055,38,93],[589.829,0.16,27,87],[589.829,0.14,39,52],[590.678,0.055,38,93],[590.678,0.159,31,194],[590.738,0.16,27,87],[590.738,0.14,39,52],[591.587,0.055,38,93],[591.647,0.16,27,87],[591.647,0.14,39,52],[592.437,0.277,36,105],[592.437,0.055,38,75],[592.497,0.16,27,70],[592.497,0.14,39,42],[592.87,0.277,43,105],[593.591,0.055,38,75],[593.591,0.277,36,105],[593.651,0.16,27,70],[593.651,0.14,39,42],[594.456,0.277,35,105],[594.745,0.277,36,111],[594.745,0.055,38,75],[594.805,0.16,27,70],[594.805,0.14,39,42],[595.177,0.277,43,111],[595.899,0.055,38,75],[595.899,0.277,36,111],[595.958,0.16,27,70],[595.958,0.14,39,42],[596.764,0.277,32,111],[597.052,0.277,33,118],[597.052,0.055,38,75],[597.112,0.16,27,70],[597.112,0.14,39,42],[597.485,0.277,40,118],[598.206,0.055,38,75],[598.206,0.277,33,118],[598.266,0.16,27,70],[598.266,0.14,39,42],[599.072,0.277,32,118],[599.36,0.277,33,124],[599.36,0.055,38,75],[599.42,0.16,27,70],[599.42,0.14,39,42],[599.793,0.277,40,124],[600.514,0.055,38,75],[600.514,0.277,33,124],[600.574,0.16,27,70],[600.574,0.14,39,42],[601.379,0.277,28,124],[601.668,0.277,29,130],[601.668,0.055,38,75],[601.728,0.16,27,70],[601.728,0.14,39,42],[602.101,0.277,36,130],[602.822,0.055,38,75],[602.822,0.277,29,130],[602.882,0.16,27,70],[602.882,0.14,39,42],[603.687,0.277,28,130],[603.976,0.277,29,136],[603.976,0.055,38,75],[604.035,0.16,27,70],[604.035,0.14,39,42],[604.408,0.277,36,136],[605.129,0.055,38,75],[605.129,0.277,29,136],[605.189,0.16,27,70],[605.189,0.14,39,42],[605.995,0.277,30,136],[606.283,0.277,31,143],[606.283,0.055,38,75],[606.343,0.16,27,70],[606.343,0.14,39,42],[606.716,0.277,38,143],[607.437,0.277,31,143],[607.437,0.055,38,75],[607.497,0.16,27,70],[607.497,0.14,39,42],[608.302,0.277,35,143],[608.591,0.055,38,75],[608.591,2.077,36,147],[608.651,0.16,27,70],[608.651,0.14,39,42],[609.745,0.055,38,75],[609.805,0.16,27,70],[609.805,0.14,39,42],[610.899,0.055,38,75],[610.959,0.16,27,70],[610.959,0.14,39,42],[612.099,0.055,38,75],[612.159,0.16,27,70],[612.159,0.14,39,42],[613.299,0.055,38,75],[613.359,0.16,27,70],[613.359,0.14,39,42],[614.499,0.055,38,75],[614.559,0.16,27,70],[614.559,0.14,39,42],[615.699,0.055,38,75],[615.759,0.16,27,70],[615.759,0.14,39,42],[616.899,0.055,38,75],[616.959,0.16,27,70],[616.959,0.14,39,42],[618.099,0.055,38,75],[618.159,0.16,27,70],[618.159,0.14,39,42],[619.299,0.055,38,75],[619.359,0.16,27,70],[619.359,0.14,39,42],[620.499,0.055,38,75],[620.559,0.16,27,70],[620.559,0.14,39,42],[621.699,0.055,38,75],[621.759,0.16,27,70],[621.759,0.14,39,42],[622.899,0.055,38,75],[622.959,0.16,27,70],[622.959,0.14,39,42],[624.099,0.055,38,75],[624.159,0.16,27,70],[624.159,0.14,39,42],[625.299,0.055,38,75],[625.359,0.16,27,70],[625.359,0.14,39,42],[626.499,0.055,38,75],[626.559,0.16,27,70],[626.559,0.14,39,42],[627.699,0.055,38,75],[627.759,0.16,27,70],[627.759,0.14,39,42],[628.899,0.055,38,75],[628.959,0.16,27,70],[628.959,0.14,39,42],[630.099,0.055,38,75],[630.159,0.16,27,70],[630.159,0.14,39,42],[631.349,0.055,38,75],[631.409,0.16,27,70],[631.409,0.14,39,42],[632.599,0.055,38,75],[632.659,0.16,27,70],[632.659,0.14,39,42],[633.849,0.055,38,75],[633.909,0.16,27,70],[633.909,0.14,39,42],[635.099,0.055,38,75],[635.159,0.16,27,70],[635.159,0.14,39,42],[636.349,0.055,38,75],[636.409,0.16,27,70],[636.409,0.14,39,42],[637.599,0.055,38,75],[637.659,0.16,27,70],[637.659,0.14,39,42],[638.849,0.055,38,75],[638.909,0.16,27,70],[638.909,0.14,39,42],[640.099,0.055,38,75],[640.159,0.16,27,70],[640.159,0.14,39,42],[641.349,0.055,38,75],[641.409,0.16,27,70],[641.409,0.14,39,42],[642.599,0.055,38,75],[642.659,0.16,27,70],[642.659,0.14,39,42],[643.849,0.055,38,75],[643.909,0.16,27,70],[643.909,0.14,39,42],[645.099,0.055,38,75],[645.159,0.16,27,70],[645.159,0.14,39,42],[646.349,0.055,38,75],[646.409,0.16,27,70],[646.409,0.14,39,42],[647.599,0.055,38,75],[647.659,0.16,27,70],[647.659,0.14,39,42],[648.849,0.055,38,75],[648.909,0.16,27,70],[648.909,0.14,39,42],[650.099,0.055,38,75],[650.159,0.16,27,70],[650.159,0.14,39,42],[651.375,0.055,38,75],[651.435,0.16,27,70],[651.435,0.14,39,42],[652.652,0.055,38,75],[652.712,0.16,27,70],[652.712,0.14,39,42],[653.928,0.055,38,75],[653.988,0.16,27,70],[653.988,0.14,39,42],[655.205,0.055,38,75],[655.265,0.16,27,70],[655.265,0.14,39,42],[656.482,0.055,38,75],[656.542,0.16,27,70],[656.542,0.14,39,42],[657.758,0.055,38,75],[657.818,0.16,27,70],[657.818,0.14,39,42],[659.035,0.055,38,75],[659.095,0.16,27,70],[659.095,0.14,39,42],[660.311,0.055,38,75],[660.371,0.16,27,70],[660.371,0.14,39,42],[661.588,0.055,38,75],[661.648,0.16,27,70],[661.648,0.14,39,42],[662.865,0.055,38,75],[662.925,0.16,27,70],[662.925,0.14,39,42],[664.141,0.055,38,75],[664.201,0.16,27,70],[664.201,0.14,39,42],[665.418,0.055,38,75],[665.478,0.16,27,70],[665.478,0.14,39,42],[666.694,0.055,38,75],[666.754,0.16,27,70],[666.754,0.14,39,42],[667.971,0.055,38,75],[668.031,0.16,27,70],[668.031,0.14,39,42],[669.247,0.055,38,75],[669.308,0.16,27,70],[669.308,0.14,39,42],[670.524,0.055,38,75],[670.584,0.16,27,70],[670.584,0.14,39,42],[671.828,0.055,38,75],[671.888,0.16,27,70],[671.888,0.14,39,42],[673.133,0.055,38,75],[673.193,0.16,27,70],[673.193,0.14,39,42],[674.437,0.055,38,75],[674.497,0.16,27,70],[674.497,0.14,39,42],[675.741,0.055,38,75],[675.802,0.16,27,70],[675.802,0.14,39,42],[677.046,0.055,38,75],[677.106,0.16,27,70],[677.106,0.14,39,42],[678.35,0.055,38,75],[678.41,0.16,27,70],[678.41,0.14,39,42],[679.654,0.055,38,75],[679.715,0.16,27,70],[679.715,0.14,39,42],[680.959,0.055,38,75],[681.019,0.16,27,70],[681.019,0.14,39,42],[682.263,0.055,38,75],[682.323,0.16,27,70],[682.323,0.14,39,42],[683.568,0.055,38,75],[683.628,0.16,27,70],[683.628,0.14,39,42],[684.872,0.055,38,75],[684.932,0.16,27,70],[684.932,0.14,39,42],[686.176,0.055,38,75],[686.236,0.16,27,70],[686.236,0.14,39,42],[687.481,0.055,38,75],[687.541,0.16,27,70],[687.541,0.14,39,42],[688.785,0.055,38,75],[688.845,0.16,27,70],[688.845,0.14,39,42],[690.089,0.055,38,75],[690.149,0.16,27,70],[690.149,0.14,39,42],[691.394,0.055,38,75],[691.454,0.16,27,70],[691.454,0.14,39,42],[692.757,0.055,38,75],[692.817,0.16,27,70],[692.817,0.14,39,42],[694.121,0.055,38,75],[694.181,0.16,27,70],[694.181,0.14,39,42],[695.485,0.055,38,75],[695.545,0.16,27,70],[695.545,0.14,39,42],[696.848,0.055,38,75],[696.908,0.16,27,70],[696.908,0.14,39,42],[698.212,0.055,38,75],[698.272,0.16,27,70],[698.272,0.14,39,42],[699.576,0.055,38,75],[699.635,0.16,27,70],[699.635,0.14,39,42],[700.939,0.055,38,75],[700.999,0.16,27,70],[700.999,0.14,39,42],[702.303,0.055,38,75],[702.363,0.16,27,70],[702.363,0.14,39,42],[703.666,0.055,38,75],[703.726,0.16,27,70],[703.726,0.14,39,42],[705.03,0.055,38,75],[705.09,0.16,27,70],[705.09,0.14,39,42],[706.394,0.055,38,75],[706.454,0.16,27,70],[706.454,0.14,39,42],[707.757,0.055,38,75],[707.817,0.16,27,70],[707.817,0.14,39,42],[709.121,0.055,38,75],[709.181,0.16,27,70],[709.181,0.14,39,42],[710.485,0.055,38,75],[710.545,0.16,27,70],[710.545,0.14,39,42],[711.848,0.055,38,75],[711.908,0.16,27,70],[711.908,0.14,39,42],[713.212,0.055,38,65],[713.272,0.16,27,61],[713.272,0.14,39,37],[715.212,0.055,38,65],[715.272,0.16,27,61],[715.272,0.14,39,37],[717.212,0.055,38,65],[717.272,0.16,27,61],[717.272,0.14,39,37],[719.212,0.055,38,65],[719.272,0.16,27,61],[719.272,0.14,39,37],[721.212,0.055,38,65],[721.272,0.16,27,61],[721.272,0.14,39,37],[723.212,0.055,38,65],[723.272,0.16,27,61],[723.272,0.14,39,37],[725.212,0.055,38,65],[725.272,0.16,27,61],[725.272,0.14,39,37],[727.212,0.055,38,65],[727.272,0.16,27,61],[727.272,0.14,39,37],[729.212,0.055,38,65],[729.272,0.16,27,61],[729.272,0.14,39,37],[731.212,0.055,38,65],[731.272,0.16,27,61],[731.272,0.14,39,37],[733.212,0.055,38,65],[733.272,0.16,27,61],[733.272,0.14,39,37],[735.212,0.055,38,65],[735.272,0.16,27,61],[735.272,0.14,39,37],[737.212,0.055,38,65],[737.272,0.16,27,61],[737.272,0.14,39,37],[739.212,0.055,38,65],[739.272,0.16,27,61],[739.272,0.14,39,37],[741.212,0.055,38,65],[741.272,0.16,27,61],[741.272,0.14,39,37],[743.212,0.055,38,65],[743.272,0.16,27,61],[743.272,0.14,39,37],[745.212,0.055,38,65],[745.272,0.16,27,61],[745.272,0.14,39,37],[747.212,0.055,38,65],[747.272,0.16,27,61],[747.272,0.14,39,37],[749.212,0.055,38,65],[749.272,0.16,27,61],[749.272,0.14,39,37],[751.212,0.055,38,65],[751.272,0.16,27,61],[751.272,0.14,39,37],[753.212,0.055,38,65],[753.272,0.16,27,61],[753.272,0.14,39,37],[755.212,0.055,38,65],[755.272,0.16,27,61],[755.272,0.14,39,37],[757.212,0.055,38,65],[757.272,0.16,27,61],[757.272,0.14,39,37],[759.212,0.055,38,65],[759.272,0.16,27,61],[759.272,0.14,39,37],[761.212,0.055,38,65],[761.272,0.16,27,61],[761.272,0.14,39,37],[763.212,0.055,38,65],[763.272,0.16,27,61],[763.272,0.14,39,37],[765.212,0.055,38,65],[765.272,0.16,27,61],[765.272,0.14,39,37],[767.212,0.055,38,65],[767.272,0.16,27,61],[767.272,0.14,39,37],[769.212,0.055,38,65],[769.272,0.16,27,61],[769.272,0.14,39,37],[771.212,0.055,38,65],[771.272,0.16,27,61],[771.272,0.14,39,37]]],"overview":[[2,2,2,2,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,4,4,4,4,4,4,3,3,3,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,2,2,2,3,3,2,4,4,4,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0],[1,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,3,3,3,4,3,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,3,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,2],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,2,3,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,0,0,0,0,0,0],[2,2,2,2,1,1,1,0,0,0,0,0,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,2,2,2,0,2,2,1,2,3,3,3,2,2,1,0,1,1,2,2,2,2,2,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,2,2,2,2,1,1,1,1,1,1,1,3,3,2,3,3,0,0,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,3,3,3,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],"maxDur":[6.333,6.333,6.333,6.333,6.333,10,4.068]}; +// Whole-piece density above, routed note onsets in a moving 20-second window below. +let notepatTvClock=null; +function smoothNotepatTvTime(music,target){ + const now=Date.now()/1000,run=music.runId||'notepat'; + if(!notepatTvClock||notepatTvClock.run!==run||Math.abs(target-notepatTvClock.time)>5){ + notepatTvClock={run,time:target,wall:now};return target; + } + const dt=Math.max(0,Math.min(.1,now-notepatTvClock.wall));notepatTvClock.wall=now; + const error=target-notepatTvClock.time; + // Rate corrections absorb packet jitter without moving the playhead backwards. + notepatTvClock.time+=dt*(1+clamp(error*.7,-.12,.12)); + return Math.min(music.duration||774.4119,notepatTvClock.time); +} +function fitNotepatSectionLabel(label, size, maxWidth) { + const text=String(label).replace(/^the /i,''); + if(handleWidth(text,size)<=maxWidth)return text; + let short=text; + while(short.length && handleWidth(short+'..',size)>maxWidth)short=short.slice(0,-1); + return short.length>=2 ? short+'..' : ''; +} +function notepatScoreLayout(w,h) { + const left=w*.16,right=w*.97,width=right-left; + const sectionY=Math.max(48,h*.075-30),sectionHeight=26; + const top=sectionY+sectionHeight+6; + const overviewRow=Math.max(22,h*.026),overviewHeight=overviewRow*7; + const detailTop=Math.max(h*.35,top+overviewHeight+58); + // Keep the last instrument row and its note glow above the shared title footer. + const detailBottom=h-150; + return {left,right,width,sectionY,sectionHeight,top,overviewRow,overviewHeight, + detailTop,rowHeight:Math.max(24,(detailBottom-detailTop)/7)}; +} +function drawNotepatScore(music, elapsed) { + elapsed=smoothNotepatTvTime(music,elapsed); + const score=NOTEPAT_TV_SCORE; + if(music.scoreHash && music.scoreHash!==score.hash)return; + const w=viewWidth(),h=viewHeight; + const {left,right,width,sectionY,sectionHeight,top,overviewRow,overviewHeight, + detailTop,rowHeight}=notepatScoreLayout(w,h); + const names=['Left front','Right front','Right rear','Left rear','Center rear','Held center','Sub']; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[248,151,91],[232,227,166]]; + triangleDepth=-.8; + const palette=music.look?.color||[100,150,220]; + wipe(Math.round(palette[0]*.035),Math.round(palette[1]*.035),Math.round(palette[2]*.055)); + const labelSize=Math.max(17,Math.min(26,w*.015)); + // All section boundaries stay visible for the entire piece. + for(let i=0;i=a&&elapsedMath.round(v*gain))); + } + } + const overviewX=left+clamp(elapsed/score.duration,0,1)*width; + screenRect(overviewX-6,top-5,12,overviewHeight+7,[67,71,72]); + screenRect(overviewX-1,top-5,3,overviewHeight+7,[255,255,242]); + // A fixed NOW line; score notes approach it from the right. + const from=elapsed-4,span=20,nowX=left+width*.2; + for(let dt=0;dt<=16;dt+=4){const x=nowX+dt/span*width; + screenRect(x,detailTop-10,1,rowHeight*7+10,[34,45,61]); + const label=dt?'+'+dt+'s':'NOW',labelWidth=handleWidth(label,22); + typeWrite(label,clamp(x+5,left,right-labelWidth-4),detailTop-35,22,210,221,235); + } + for(let row=0;row<7;row++){ + const y=detailTop+row*rowHeight,events=score.rows[row]; + typeWrite(names[row],w*.016,y+rowHeight*.28,labelSize,...colors[row]); + screenRect(left,y+rowHeight-3,width,1,[37,49,65]); + screenRect(nowX-22,y+2,44,rowHeight-5,colors[row].map(v=>Math.round(v*.065))); + let lo=0,hi=events.length; + while(lo>1;if(events[m][0]elapsed; + const gain=endMath.round(v*.15))); + screenRect(x-1,py-2,noteWidth+2,14,colors[row].map(v=>Math.round(v*.32))); + } + screenRect(x,py,noteWidth,sounding?10:6,colors[row].map(v=>Math.round(v*gain))); + if(sounding)screenRect(nowX-2,py-2,4,14+attack*6,[255,248,224]); + } + } + screenRect(nowX-2,detailTop-8,4,rowHeight*7+6,[255,255,242]); +} + +// NOTEPAT_SCORE_VISUAL_V1_END diff --git a/xbox/live/oskiewar.js.before-light2-20260925234455 b/xbox/live/oskiewar.js.before-light2-20260925234455 new file mode 100644 index 0000000000..6a3666344b --- /dev/null +++ b/xbox/live/oskiewar.js.before-light2-20260925234455 @@ -0,0 +1,17627 @@ +// @bundle-qr +// The console's monotonic clock can hand back a negative number: App.cpp +// converts QPC ticks with `counter * 1000000`, which overflows int64 past +// about ten days of uptime. Every deadline in this piece starts at 0 and is +// compared with `now >=` or `now <`, so a negative clock made `hitStunUntil` +// permanently in the future -- no attack could fire and no round could be +// won -- stranded the title, silenced the input log, and indexed off the +// front of a palette. Rebase once, here, so time starts at zero whatever the +// host reports. The host builds a fresh object per call, so this rewrites +// that copy rather than allocating another. +const hostRuntime = runtime; +let clockEpoch = null; +// Rollback netplay's hooks into the clock and the side effects. The session +// itself lives further down (search "Rollback netplay"); these four sit here +// because the wrapper below and the signal emitters read them. +let netSession = null; +// Windows and Linux libm differ by a few ULPs. Network simulation uses the +// same elementary operations on both hosts, including geometry sampled for +// collision. Keep native math for ordinary local play. +const platformMath = globalThis.Math; +let Math = Object.create(platformMath); +function netSin(x) { + x %= 6.283185307179586; + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +function netAtan(x) { + const sign = x < 0 ? -1 : 1; + x = platformMath.abs(x); + const inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + platformMath.sqrt(1 + x * x)); + const square = x * x; + let term = x, sum = x; + for (let n = 1; n <= 20; n++) { + term *= -square; + sum += term / (2 * n + 1); + } + const angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +function netAtan2(y, x) { + if (x > 0) return netAtan(y / x); + if (x < 0) return netAtan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +function netExp(x) { + if (x > 709.782712893384) return Infinity; + if (x < -745.1332191019411) return 0; + const exponent = platformMath.round(x / .6931471805599453); + const remainder = x - exponent * .6931471805599453; + let sum = 1, term = 1; + for (let n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * 2 ** exponent; +} +function netHypot(...values) { + let scale = 0; + for (const value of values) scale = platformMath.max(scale, platformMath.abs(value)); + if (!scale || !Number.isFinite(scale)) return scale; + let sum = 0; + for (const value of values) { const ratio = value / scale; sum += ratio * ratio; } + return platformMath.sqrt(sum) * scale; +} +// The interpreter's deterministic transcendental series are expensive on +// Xbox. Poses repeatedly ask for the same angles; retain exact results in a +// bounded cache, including a distinct key for negative zero. Native AC math +// bypasses these fallbacks entirely. No rounding or approximation is added. +const netMathMemoStats = { hits: 0, misses: 0 }; +function memoizeNetUnary(calculate) { + const cache = new Map(); + return value => { + if (typeof value !== "number") return calculate(value); + const key = Object.is(value, -0) ? "negative-zero" : value; + const cached = cache.get(key); + if (cached !== undefined) { netMathMemoStats.hits++; return cached; } + netMathMemoStats.misses++; + const result = calculate(value); + if (cache.size >= 1024) cache.clear(); + cache.set(key, result); + return result; + }; +} +netSin = memoizeNetUnary(netSin); +netAtan = memoizeNetUnary(netAtan); +netExp = memoizeNetUnary(netExp); +const netMath = {sin: netSin, cos: x => netSin(x + 1.5707963267948966), + tan: x => netSin(x) / netSin(x + 1.5707963267948966), atan: netAtan, + atan2: netAtan2, asin: x => netAtan2(x, platformMath.sqrt(1 - x * x)), + exp: netExp, hypot: netHypot}; +for (const [name, fallback] of Object.entries(netMath)) { + const native = globalThis.__oskiewarNativeMath; + const calculate = native?.version === "oskiewar-libm-v1" && typeof native[name] === "function" + ? native[name] : fallback; + Math[name] = (...args) => netSession ? calculate(...args) : platformMath[name](...args); +} + +// While non-null, runtime() reports this clock: the sim is stepping frame f +// and must read f's time whatever the wall says. +let netClockUs = null; +// While true the sim is replaying frames it already showed once — no drums, +// no signals, no telemetry, no publishing. The state changes; nothing else. +let netSilent = false; +let netFrameInputs = null; +// Game speed is the clock, not a patch on top of it. Every deadline, spring, +// bot die-roll and animation in this piece reads one monotonic stream, so +// scaling the stream's increments scales the whole game coherently — physics, +// input windows, round timers, all in step. Set from the title screen with +// +/- on a keyboard, in quarter steps between a quarter and double speed; +// the offline reel harness drives simMonotonicUs itself and never touches +// this, so recordings always run at one. +let gameSpeed = 1; +let roundModifier = ""; +let netRoundClockDebtUs = 0; +function airRoundActive() { return roundModifier === "air"; } +function unarmedRoundActive() { return roundModifier === "unarmed"; } +function roundSpeed() { return roundModifier === "slow" ? .5 : 1; } +let gameSpeedChangedAt = 0; +let scaledClockUs = 0; +let lastRawClockUs = null; +runtime = function acRuntime() { + const info = hostRuntime(); + const raw = Number(info.monotonicUs) || 0; + if (clockEpoch === null) clockEpoch = raw; + if (lastRawClockUs === null) lastRawClockUs = raw; + scaledClockUs += (raw - lastRawClockUs) * gameSpeed * roundSpeed(); + lastRawClockUs = raw; + info.monotonicUs = Math.round(scaledClockUs); + if (typeof info.simMonotonicUs === "number") + info.simMonotonicUs -= clockEpoch; + // A rollback fight keeps its own clock: frame f reads f's time while it is + // simulated, and the paint between frames reads the current frame's time + // plus how far the display is into it, so animation and HUD stay on the + // fight's timeline rather than the wall's. + if (netClockUs !== null) { + info.monotonicUs = netClockUs - netRoundClockDebtUs; + info.simMonotonicUs = info.monotonicUs; + } else if (netSession) { + const alpha = Math.max(0, Math.min(1, Number(info.renderAlpha) || 0)); + const at = netSession.originUs + netSession.frame * NET_TICK_US + + Math.round(alpha * NET_TICK_US * roundSpeed()) - netRoundClockDebtUs; + info.monotonicUs = at; + info.simMonotonicUs = at; + } + if (finalKillReplayClockUs !== null) { + info.paintMonotonicUs ??= info.monotonicUs; + info.monotonicUs = finalKillReplayClockUs; + info.simMonotonicUs = finalKillReplayClockUs; + } + return info; +}; +// Replayed frames are silent: the wall already saw them once. +// +// These two hooks belong to the host, and the hosts disagree about which of +// them exist: the native shell installs `telemetry` and no `analytics` at all. +// Reading an undeclared binding throws, and this runs at the top level of one +// program, so that throw took every `let` below it with it — the shell then +// reported the first of those (`gameMode`) as uninitialized, a good half a +// file away from the actual cause. `typeof` is the one way to ask whether a +// binding exists without touching it, so ask, and only wrap what is there. +const hostTelemetry = typeof telemetry === "function" ? telemetry : null; +if (hostTelemetry) + telemetry = function netTelemetry(...args) { + if (netSilent) return; + return hostTelemetry(...args); + }; +const hostAnalytics = typeof analytics === "function" ? analytics : null; +if (hostAnalytics) + analytics = function netAnalytics(...args) { + if (netSilent) return; + return hostAnalytics(...args); + }; + +// Monotonic count of committed revisions to this piece (next revision included). +const buildVersion = 178; +const floorY = 1800; +// Oskiewar now opens as a versus game. An ordinary web visit hosts a room — +// the URL becomes the invitation — and until a friend opens it, all you can +// do is move: a training floor with your own moves named back at you and one +// standing instruction, find a friend. Survival (the solo ascent) and the +// bot/dummy doors remain modes behind `?opponent=`, and the regression +// harness still enters combat directly. Keeping player two as explicit mode +// state, rather than deleting the chair, preserves replays and the fight +// laboratory while ensuring no route quietly seats an adversary. +let gameMode = "fight"; +const survivalActive = () => gameMode === "survival"; +// The versus lane's two rooms-of-play: alone in the cube waiting on a rival, +// or fighting the rival the relay seated. Both publish to the same room so +// the shared URL is the lobby, the fight and the grandstand at once. +const lobbyActive = () => gameMode === "fight" && fightOpponent === "versus-lobby"; +const versusActive = () => gameMode === "fight" && fightOpponent === "versus"; +const versusLane = () => lobbyActive() || versusActive(); +// The station. The tower became a cube, and the cube has now been opened to +// vacuum: @jeffrey asked for "a large space map", and the cube's own comment +// had already named the condition for growing one — "a tile-authored map is +// exactly the shape a future rung would be written in." So the lattice is +// what grew. Twenty tiles wide by fourteen tall at the same 90 units a side, +// which is four times the cube's floor area and still frames whole on one +// screen at the widest shot, because a fighter you cannot see is a fighter +// you cannot read. +// +// What changed besides the number: the plaster shell is gone. There is no +// back wall, no ceiling slab and no side wall, because the map is outside +// now — stars behind, a planet below the deck, and a hull you stand on +// rather than a room you are sealed into. Gravity is station gravity, a +// little over half a G (`spaceGravityScale`), so a jump hangs and the +// floating decks overhead are reachable on legs alone. Simulation stays +// continuous — nothing about motion quantizes — but the STRUCTURE is +// addressable: spawns, pickups, decks and lanes are authored in tile +// coordinates, the lattice draws as a faint nav hologram, and `gridField` +// below holds one number per tile so per-tile computation (heat, ownership, +// weather) has a surface to run on. +const tileSize = 90; +let gridCols = 40; +const gridRows = 16; +// Tile (0, 0) starts flush at the floor-left corner of the PLAYABLE box, so +// every tile edge lands on a clean multiple of 90. The walls stand outside +// the lattice: the structural shell is one wallThickness beyond each face, +// and `resolveRunnerBounds` pushes off the faces themselves. +const wallThickness = 40; +const gridLeft = 0; +let gridWidth = gridCols * tileSize; +const gridHeight = gridRows * tileSize; +const worldLeft = gridLeft - wallThickness; +let worldRight = gridLeft + gridWidth + wallThickness; +// Keep the authored ground grid while giving launches four times the headroom. +const ceilingY = floorY - gridHeight * 4 - wallThickness; +// Depth is the eye's dimension, not the fight's — fighters live near z = 0 — +// so it is authored rather than derived. It was the cube's own width back +// when those were the same number; widening the map to twenty tiles must not +// also push the far plane twice as far out, because every camera stand-off, +// every killcam orbit and the whole ±30000 native coordinate budget were +// tuned against this depth and not against the floor's span. +const roomDepth = 900; +const worldNear = -roomDepth / 2; +const worldFar = roomDepth / 2; +// Address helpers: world position to tile and back. Rows count UP from the +// floor, because in a fight the floor is where everything starts. All three +// clamp, so a body pressed into a wall still names a real tile. +const tileCol = (x) => + Math.min(gridCols - 1, Math.max(0, Math.floor((x - gridLeft) / tileSize))); +const tileRow = (y) => + Math.min(gridRows - 1, Math.max(0, Math.floor((floorY - y) / tileSize))); +const tileCenterX = (col) => gridLeft + (col + .5) * tileSize; +// One number per tile, row-major from the floor-left corner. Today impacts +// write heat into it and the overlay draws that heat fading; tomorrow it is +// wherever tiled computation over the map wants to live. +let gridField = new Float32Array(gridCols * gridRows); +const gridFieldIndex = (x, y) => tileRow(y) * gridCols + tileCol(x); +// Whether a point is on the lattice at all. `tileCol` and `tileRow` CLAMP, +// which is right for a body pressed into a wall — it still stands somewhere — +// and wrong for anything that happens off the map, because every one of those +// lands on the same corner cell. On plaster that was invisible. Against black +// space it was a lit bar across the top corners of the frame: the title +// screen's own bouncing letters, stamping heat outside the box, all of it +// clamped into row thirteen at columns zero and nineteen. +const onGridField = (x, y) => + x >= gridLeft && x <= gridLeft + gridWidth && + y <= floorY && y >= floorY - gridHeight; +// The park. The floor stopped being flat. +// +// Every piece of this was already here and switched off: `terrainFloorAt` has +// carried a heightfield since the tower, `terrainTangentAt` differentiates it, +// and the skate physics have been feeding that slope into `skateVx` all along +// — `player.skateVx += terrainSlope * 1900 * dt` is a line that has done +// nothing for months because the amplitude was zero. What was missing was a +// shape worth riding. +// +// So the profile is authored rather than noised. A run of segments in tile +// coordinates, each one a real skatepark feature, walked left to right: +// +// flat the ground, and the halfpipe's own flat bottom +// transition a quarter-circle, horizontal where it meets the flat and +// vertical at the coping — which is what a transition IS, and +// why it is an arc and not a straight ramp +// bank a straight incline, for launching off rather than carving in +// +// A transition's run equals its height because a quarter circle's does. That +// is not a simplification, it is the geometry: radius R gives you R of run +// and R of rise, tangent flat at the bottom and vertical at the lip. +// `lift` raises the segment's base off the ground, or — negative — digs it in. +// That sign is what makes a halfpipe possible in a game seen from the side: a +// pipe built UP from the floor is two humps with their ridable faces pointing +// away from you, and you would have to climb the back of one to use it. Dug +// IN, the same two arcs face each other, the flat bottom is genuinely a floor, +// and a skater can ride straight through at speed from either end. So the +// halfpipe here is a bowl, which is what a halfpipe is from the side anyway. +// Read it left to right and it is a run: drop off the left quarterpipe, carry +// the speed into the halfpipe, out across the middle, up the kicker and over +// the funbox, and finish on the right quarterpipe. The middle ten tiles are +// deliberately flat and deliberately in the middle — that is where the bell +// rings, and a fight that opens with both fighters sliding down a transition +// is a fight nobody chose the start of. +const parkFeatures = [ + { from: 0, to: 4, kind: "transition", rise: 360, dir: -1 }, + { from: 4, to: 6, kind: "flat" }, + { from: 6, to: 9, kind: "transition", rise: 270, dir: -1, lift: -270 }, + { from: 9, to: 12, kind: "flat", lift: -270 }, + { from: 12, to: 15, kind: "transition", rise: 270, dir: 1, lift: -270 }, + { from: 15, to: 25, kind: "flat" }, + { from: 25, to: 28, kind: "bank", rise: 180, dir: 1 }, + { from: 28, to: 30, kind: "flat", lift: 180 }, + { from: 30, to: 33, kind: "bank", rise: 180, dir: -1 }, + { from: 33, to: 36, kind: "flat" }, + { from: 36, to: 40, kind: "transition", rise: 360, dir: 1 }, +]; +// Resolved once into world units so the per-frame walk compares numbers +// rather than rebuilding them. `terrainFloorAt` runs for every foot, every +// grass blade and every render sample, so it is worth the twenty bytes. +let parkSegments = parkFeatures.map((feature) => ({ + ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, + lift: feature.lift || 0, +})); +const parkLeft = parkSegments[0].left; +let parkRight = parkSegments[parkSegments.length - 1].right; +// The lowest ground in the park. `floorY` used to be it — it +// was the whole world's bottom, and a dozen places lean on that: the camera +// clamps its aim to it, the ground's near skirt hangs from it, the terrain +// span stops at it. A bowl dug three tiles into the floor makes every one of +// those assumptions wrong by exactly the depth of the bowl, and the symptom +// is a fighter riding out of frame at the bottom of the pipe. +let parkDeepest = floorY + Math.max(0, + ...parkSegments.map((segment) => -segment.lift)); +// Enough samples that an arc reads as an arc. One per tile drew the halfpipe +// as a staircase — 90 units is most of a fighter wide, and a transition turns +// through ninety degrees in three of them. +let terrainSamples = gridCols * 6; +let terrainPhase = 0; +// The long park is selected by ?map=skatepark; the host's deal owns the map. +let skateparkMap = globalThis.__oskiewarMap === "skatepark"; +const skateLoops = [ + { x: 6300, radius: 320 }, { x: 15300, radius: 420 }, + { x: 24300, radius: 500 }, +]; +const skateBoosts = [2400, 5400, 10800, 14400, 19800, 23400, 27000] + .map((x) => ({ left: x, right: x + 240, speed: 3900 })); +const skateRopes = []; +const chainLinks = 16; +const chainLength = 44; + +function configureWorldMap(name) { + // A normal round keeps its current workshop/local variant. Only entering + // or leaving the long course needs to replace the world dimensions. + if (name !== "skatepark" && !skateparkMap) return; + skateparkMap = name === "skatepark"; + gridCols = skateparkMap ? 320 : 40; + gridWidth = gridCols * tileSize; + if (gridField.length !== gridCols * gridRows) gridField = new Float32Array(gridCols * gridRows); + worldRight = gridLeft + gridWidth + wallThickness; + const features = skateparkMap ? [ + ...parkFeatures.slice(0, -1), + { from: 36, to: 40, kind: "flat" }, + ...[40, 140, 240].flatMap((from) => [ + { from, to: from + 40, kind: "flat" }, + { from: from + 40, to: from + 46, kind: "bank", rise: 270, dir: 1 }, + { from: from + 46, to: from + 50, kind: "flat", lift: 270 }, + { from: from + 50, to: from + 56, kind: "bank", rise: 270, dir: -1 }, + { from: from + 56, to: Math.min(320, from + 100), kind: "flat" }, + ]), + ] : parkFeatures; + parkSegments = features.map((feature) => ({ ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, lift: feature.lift || 0 })); + parkRight = gridLeft + gridWidth; + terrainSamples = gridCols * 6; +} + +function resetSkateRopes() { + skateRopes.length = 0; + if (!skateparkMap) return; + for (const x of [3600, 9900, 18900]) { + const anchorY = floorY - 850; + skateRopes.push({ x, y: anchorY, z: 0, + nodes: Array.from({ length: chainLinks + 1 }, (_, index) => ({ + x, y: anchorY + index * chainLength, + px: x, py: anchorY + index * chainLength, + })) }); + } +} + +function releaseSkateRope(player) { + const rope = skateRopes[player.ropeIndex]; + const node = rope?.nodes[Math.round(player.ropeLink)]; + if (node) { + player.vx = clamp((node.x - node.px) / (rope.dt || 1 / 60), -4200, 4200); + player.vy = clamp((node.y - node.py) / (rope.dt || 1 / 60), -4200, 4200); + player.skateVx = player.vx; + player.knockVx = player.skateboard ? 0 : player.vx; + } + player.ropeIndex = -1; + player.grounded = false; +} + +// Hold grab through a crossing to latch. A fresh grab edge detaches. +function skateRopeInput(player, input, grabHeld, dt, grabPressed = grabHeld) { + if (!grabHeld) player.ropeGrabLocked = false; + if (player.ropeIndex >= 0 && (!player.alive || isHeadOnly(player) || + isPogo(player) || player.hitStunUntil > runtime().monotonicUs)) { + releaseSkateRope(player); + return false; + } + if (player.ropeIndex >= 0 && grabPressed) { + releaseSkateRope(player); + player.ropeGrabLocked = true; + return false; + } + if (player.ropeIndex < 0 && grabHeld && !player.ropeGrabLocked && player.heldBall < 0 && + player.heldPart < 0 && player.heldPlayer < 0) { + let nearest = null; + // Test the swept hand volume against each link, so a fast crossing counts. + const hand = { x1: player.x, y1: player.y - 125, z1: player.z, + x2: player.x + player.vx * dt, y2: player.y - 125 + player.vy * dt, + z2: player.z, width: 64 }; + skateRopes.forEach((rope, ropeIndex) => { + rope.nodes.slice(1).forEach((node, index) => { + const before = rope.nodes[index]; + const box = { left: Math.min(node.x, before.x) - 6, + right: Math.max(node.x, before.x) + 6, + top: Math.min(node.y, before.y) - 6, bottom: Math.max(node.y, before.y) + 6, + near: rope.z - 8, far: rope.z + 8 }; + const hit = segmentBoxEntry(hand, box, hand.width / 2); + const distance = Math.hypot(node.x - hand.x1, node.y - hand.y1); + if (hit !== null && (!nearest || distance < nearest.distance)) + nearest = { ropeIndex, link: index + 1, distance }; + }); + }); + if (nearest) { + player.ropeIndex = nearest.ropeIndex; + player.ropeLink = nearest.link; + const node = skateRopes[player.ropeIndex].nodes[nearest.link]; + node.px = node.x - clamp(player.vx, -3000, 3000) / 60; + node.py = node.y - clamp(player.vy, -3000, 3000) / 60; + player.skateLoop = -1; + player.lastButton = "ROPE"; + emitSignal("rope-grab", player.pad, nearest.ropeIndex, nearest.link); + } + } + if (!(player.ropeIndex >= 0)) return false; + player.ropeLink = clamp(player.ropeLink - input.vertical * dt * 3, + 2, chainLinks); + const rope = skateRopes[player.ropeIndex]; + const node = rope.nodes[Math.round(player.ropeLink)]; + node.px -= input.horizontal * 2100 * dt * dt; + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grounded = false; + player.attackKind = ""; + player.attackUntil = 0; + player.blocking = false; + player.stance = "ROPE"; + return true; +} + +// Verlet chain with a fixed anchor and distance constraints, stepped once per +// simulation tick. Nodes, previous positions and attachments all roll back. +function updateSkateRopes(dt) { + if (!skateparkMap || survivalActive()) return; + for (const rope of skateRopes) { + const timeScale = dt / (rope.dt || dt); + rope.dt = dt; + for (let i = 1; i < rope.nodes.length; i++) { + const node = rope.nodes[i]; + const vx = (node.x - node.px) * .997 * timeScale; + const vy = (node.y - node.py) * .997 * timeScale; + node.px = node.x; node.py = node.y; + node.x += vx; node.y += vy + fallGravity() * dt * dt; + } + const riders = players.filter((player) => player.alive && + skateRopes[player.ropeIndex] === rope); + const inverseMass = (index) => index === 0 ? 0 : + riders.some((rider) => Math.abs(rider.ropeLink - index) < 1) ? .125 : 1; + for (let pass = 0; pass < 32; pass++) { + rope.nodes[0].x = rope.x; rope.nodes[0].y = rope.y; + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + const dx = b.x - a.x, dy = b.y - a.y; + const length = Math.hypot(dx, dy) || 1; + const error = (length - chainLength) / length; + const wa = inverseMass(i - 1), wb = inverseMass(i); + const sum = wa + wb; + b.x -= dx * error * wb / sum; b.y -= dy * error * wb / sum; + a.x += dx * error * wa / sum; a.y += dy * error * wa / sum; + } + } + } + for (const player of players) { + if (!(player.ropeIndex >= 0)) continue; + if (!player.alive) { releaseSkateRope(player); continue; } + const rope = skateRopes[player.ropeIndex]; + const link = Math.floor(player.ropeLink), blend = player.ropeLink - link; + const a = rope.nodes[link], b = rope.nodes[Math.min(link + 1, chainLinks)]; + const x = lerp(a.x, b.x, blend), y = lerp(a.y, b.y, blend) + 125; + player.vx = (x - player.x) / Math.max(dt, .001); + player.vy = (y - player.y) / Math.max(dt, .001); + player.x = x; player.y = y; player.z = rope.z; + player.grounded = false; + } +} + +function skateLoopStep(player, input, dt, now) { + if (!(player.skateLoop >= 0)) { + if (!player.skateboard || !player.grounded || Math.abs(player.skateVx) < 1300) + return false; + const nextX = player.x + player.skateVx * dt; + const index = skateLoops.findIndex((loop) => + Math.min(player.x, nextX) <= loop.x && Math.max(player.x, nextX) >= loop.x && + Math.abs(player.y - floorY) < 30 && Math.abs(player.z) < 90 && + now >= (player.loopCooldownUntil || 0)); + if (index < 0) return false; + player.skateLoop = index; + player.loopAngle = 0; + player.loopSpeed = player.skateVx; + } + const loop = skateLoops[player.skateLoop]; + const angle = player.loopAngle; + player.loopSpeed += (-fallGravity() * Math.sin(angle) + input.horizontal * 500) * dt; + player.loopAngle += player.loopSpeed / loop.radius * dt; + const theta = player.loopAngle; + player.x = loop.x + Math.sin(theta) * loop.radius; + player.y = floorY - loop.radius + Math.cos(theta) * loop.radius; + player.vx = Math.cos(theta) * player.loopSpeed; + player.vy = -Math.sin(theta) * player.loopSpeed; + player.grounded = false; + player.skateRotation = -theta; + const completed = Math.abs(theta) >= Math.PI * 2; + const lostGrip = Math.cos(theta) < 0 && player.loopSpeed ** 2 / loop.radius < + -fallGravity() * Math.cos(theta); + if (completed || lostGrip || !player.skateboard) { + if (completed) { player.x = loop.x + Math.sign(player.loopSpeed) * 12; + player.y = floorY; player.vy = 0; player.grounded = true; } + player.skateVx = player.vx; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = now + 600000; + } + return true; +} + +function skateBoostStep(player, previousX, now) { + if (!skateparkMap || !player.skateboard || !player.grounded || + Math.abs(player.y - terrainFloorAt(player.x)) > 12 || + Math.abs(player.z) > 100 || now < (player.boostUntil || 0)) return; + const pad = skateBoosts.find((pad) => Math.max(previousX, player.x) >= pad.left && + Math.min(previousX, player.x) <= pad.right); + if (!pad) return; + player.skateVx = (Math.sign(player.skateVx) || player.facing) * pad.speed; + player.vx = player.skateVx; + player.boostUntil = now + 350000; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + emitSignal("skate-boost", player.pad, player.facing, pad.speed); + playDrum("whoosh", 1, panPlayer(player)); +} + +function drawSkateParkFeatures() { + if (!skateparkMap || survivalActive()) return; + const visible = (x, radius = 0) => Math.abs(x - cameraCenter) < cameraWidth + radius; + for (const loop of skateLoops) { + if (!visible(loop.x, loop.radius)) continue; + for (let i = 0; i < 96; i++) { + const a = i / 96 * Math.PI * 2, b = (i + 1) / 96 * Math.PI * 2; + for (const z of [-90, 90]) worldCapsule( + loop.x + Math.sin(a) * loop.radius, floorY - loop.radius + Math.cos(a) * loop.radius, z, + loop.x + Math.sin(b) * loop.radius, floorY - loop.radius + Math.cos(b) * loop.radius, z, + 10, [92, 212, 240]); + } + } + for (const pad of skateBoosts) { + if (!visible(pad.left, 240)) continue; + for (let x = pad.left; x < pad.right; x += 40) { + const y = terrainFloorAt(x) - 8; + worldCapsule(x, y, -70, x + 22, y, 0, 9, [255, 212, 66]); + worldCapsule(x + 22, y, 0, x, y, 70, 9, [255, 212, 66]); + } + } + for (const rope of skateRopes) { + if (!visible(rope.x, chainLinks * chainLength)) continue; + worldCapsule(rope.x - 70, rope.y, rope.z, rope.x + 70, rope.y, rope.z, + 18, [108, 130, 150]); + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + worldCapsule(a.x, a.y, rope.z, b.x, b.y, rope.z, 8, + i % 2 ? [220, 225, 236] : [120, 150, 178]); + } + } +} + +function terrainSeed(value) { + let hash = 2166136261; + for (const character of String(value || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967296 * Math.PI * 2; +} +function terrainFloorAt(x) { + if (airRoundActive()) return floorY + 1e9; + // Outside the park the ground is flat, so the walls have something square + // to stand out of and a body pushed past the lip still has a floor. + if (x <= parkLeft) return floorY - parkSegments[0].lift - (parkSegments[0].rise || 0); + if (x >= parkRight) return floorY - + (parkSegments[parkSegments.length - 1].rise || 0) - + parkSegments[parkSegments.length - 1].lift; + for (const segment of parkSegments) { + if (x < segment.left || x > segment.right) continue; + if (segment.kind === "flat") return floorY - segment.lift; + const run = segment.right - segment.left; + // How far up the feature we are, measured from ITS bottom: `dir` says + // which end that is. A transition rising to the right has its flat end on + // the left, and the same arc mirrored has it on the right. + const along = segment.dir > 0 + ? (x - segment.left) / run : (segment.right - x) / run; + if (segment.kind === "bank") + return floorY - segment.lift - segment.rise * along; + // The quarter circle. Centre sits one radius below the flat end, so the + // surface leaves the ground horizontally and arrives at the coping + // vertical — which is the difference between a transition you can pump + // and a ramp you merely climb. + const radius = segment.rise; + const dx = along * radius; + return floorY - segment.lift - + (radius - Math.sqrt(Math.max(0, radius * radius - dx * dx))); + } + return floorY; +} +function terrainTangentAt(x, span = 12) { + const left = terrainFloorAt(clamp(x - span, worldLeft, worldRight)); + const right = terrainFloorAt(clamp(x + span, worldLeft, worldRight)); + return (right - left) / Math.max(1, Math.min(worldRight, x + span) - + Math.max(worldLeft, x - span)); +} +const stageLeft = 0; +let stageRight = 1920; +let stageTop = 112; +// Leave a narrow projection gutter beneath the floor for the screen-edge HUD. +let stageBottom = 930; +let viewHeight = 1080; +let cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); +// `PLATFORM` is the TOWER's single centre platform, and it stays off. It is +// not a general "are there ledges" switch, however much it reads like one: +// the tower hung one slab over a floor, `platformY` still names that slab, +// and a dormant family of tower-era regressions is gated on this constant +// being true. The station's decks are a different object with a different +// shape, so they get their own table below rather than borrowing this flag +// and waking tests that ask whether a tapped hop clears a platform that no +// longer exists. The wind flag rides its own switch and is still off. +const PLATFORM = false; +const WIND_FLAG = false; +const survivalLevelCount = 32; +const survivalStepY = 235; +const survivalCeilingY = floorY - (survivalLevelCount + 2) * survivalStepY; +// A deterministic, hand-tuned zig-zag. Adjacent decks always overlap a +// normal jump's horizontal budget and sit below its 322-unit apex; variation +// comes from where the safe landing moves, not from impossible dice rolls. +// +// These numbers were authored against the cube's 900-unit floor and the +// climb still wants exactly that column of air — so when the station doubled +// the floor's width the ladder was RECENTRED, not respaced. The rung spacing +// is the tuned part; where the column stands is not. `survivalFrameWidth` is +// the cube's old framing kept by the same argument: a lens wide enough for a +// twenty-tile station would shrink the climb to a thread up the middle. +const survivalCenterShift = gridWidth / 2 - 450; +const survivalFrameWidth = 1020; +const survivalCenters = [450, 280, 620, 390, 680, 250, 520, 710]; +const survivalWidths = [470, 390, 420, 360, 440, 380, 410, 370]; +const platforms = Array.from({ length: survivalLevelCount }, (_, index) => { + const center = survivalCenters[index % survivalCenters.length] + + survivalCenterShift; + const width = survivalWidths[index % survivalWidths.length]; + return { level: index + 1, left: center - width / 2, + right: center + width / 2, y: floorY - (index + 1) * survivalStepY }; +}); +// The station's decks. This is the sentence the cube's own comment promised — +// "a tile-authored map is exactly the shape a future rung would be written +// in" — being cashed. The cube had no room for a deck a fighter could stand +// under; twenty by fourteen tiles under station gravity has room for five. +// +// Said in tiles because the map is a lattice: which column a deck starts at, +// which row its surface sits on, how many tiles wide it runs. Two low decks +// out at the flanks, two mid decks pinched toward the middle, one high deck +// straddling the centre line — so the shape of the map is a funnel upward, +// and the fighter who takes the top deck has taken the one place both mid +// decks feed into. +// +// The rows are chosen against one number: 586, the apex station gravity buys +// a held jump. Every step between ADJACENT decks is under it — floor to a low +// deck is 270, low to mid is 360, mid to top is 270 — and every step that +// skips a tier is over it. Floor to a mid deck is 630, and that 630 is the +// whole design: it is what stops the stack from being a straight hop up the +// middle and makes the climb a route instead. Out to a flank, up, back in +// along the mid deck, up again. +// +// This is what the first layout got wrong. Mid decks at row 6 put them 540 +// off the floor — under the apex, so a player could take one straight up and +// `jumpReach` would offer it to a bot, and the flanks stopped meaning +// anything. A deck you can only reach with a perfect double-tap is a deck the +// bots stand under and stare at; a deck you reach by going somewhere first is +// a route; and a deck you can reach from anywhere is not a deck, it is a step. +// Decks over the park, not instead of it. The rows are still priced against +// the 586-unit apex — the flat reaches row 3, row 3 reaches row 7, and the +// floor does NOT reach row 7 at 630 — so the climb keeps its route. What +// changed is that the park is now the interesting way to travel and the decks +// are the high ground above it. The bridge over the halfpipe is reachable +// from the flat beside the bowl and not from the bottom of it, which is the +// point of a bowl. +const parkDeckPlan = [ + { col: 8, row: 5, cols: 5 }, + { col: 15, row: 3, cols: 4 }, + { col: 21, row: 3, cols: 4 }, + { col: 18, row: 7, cols: 4 }, + { col: 31, row: 5, cols: 4 }, +]; +const parkDecks = parkDeckPlan.map((deck, index) => ({ + level: index + 1, + left: gridLeft + deck.col * tileSize, + right: gridLeft + (deck.col + deck.cols) * tileSize, + y: floorY - deck.row * tileSize, +})); +// Two ladders, one machinery. The climb's thirty-two rungs and the station's +// five decks are the same shape and are read by the same four routines, but +// they must never be visible at the same time — a survival runner standing +// on a station deck would be standing on furniture from another map. So the +// mode picks the table, once, and everything downstream asks here. +const activeLedges = () => survivalActive() ? platforms : parkDecks; +// The station's landmarks, by column. On a ten-wide cube a bare `3` was +// readable as "left of centre"; on twenty it is just a digit, and there were +// a dozen of them scattered through spawn, pickup and re-serve code all +// meaning something. Name them once. +// +// The spawns stayed close. It is tempting to open a map four times the size +// by standing the fighters four times as far apart, and it is wrong twice +// over: the opening exchange is the tuned part of this game, and the intro +// camera and the reel's opening lens are both built to travel between two +// faces 270 units apart — spreading the spawns whipped the intro at 207px a +// frame and opened the reel's close lens before the first blow. So the bell +// is unchanged from the cube: two fighters three tiles apart, astride the +// centre line. The map's size is where you GO, not where you start, and the +// corners, the decks and the climb are what spend it. +const spawnColLeft = 18; +const spawnColRight = 21; +// Not corners any more: the ends of this map are quarterpipe transitions, and +// a pistol resting on a vertical wall is a pistol nobody can pick up. These +// are the two flat aprons either side of the park instead — still a run away +// from the bell, still costing you your back to reach. +const cornerColLeft = 5; +const cornerColRight = 34; +const centerX = gridLeft + gridWidth / 2; +const platformsEnabled = () => survivalActive() || parkDecks.length > 0; +// Version-one furniture — the wind flag's pole, the store's demos, the tests — +// still asks for "the platform" by name. In a one-room cube the floor is the +// only platform, so the name now means the whole playable span of it. +const platformLeft = gridLeft; +const platformRight = gridLeft + gridWidth; +const platformY = floorY; +// The surface a thing at (x, y) is standing over: the nearest rung at or below +// it, and the floor when there is no rung. Shadows, pickups and the bot all +// ask this, so a rung that moves takes its furniture with it. +function surfaceYAt(x, y) { + let surface = terrainFloorAt(x); + if (platformsEnabled()) for (const ledge of activeLedges()) + if (ledge.y < surface && ledge.y >= y - 1 && + x >= ledge.left && x <= ledge.right) surface = ledge.y; + return surface; +} +// Which rung a falling thing just crossed, or null. `rise` lifts the contact +// line off the rung by an object's radius and `inset` keeps its edges on the +// span, so one answer serves fighters, grenades and the ball alike — and a +// lattice change lands in all three at once. The highest crossed rung wins, +// because that is the one a fall meets first. +function ledgeCrossed(x, previousY, y, rise = 0, inset = 0) { + if (!platformsEnabled()) return null; + let hit = null; + for (const ledge of activeLedges()) { + const top = ledge.y - rise; + if (previousY > top || y < top) continue; + if (x < ledge.left + inset || x > ledge.right - inset) continue; + if (!hit || ledge.y < hit.y) hit = ledge; + } + return hit; +} +// Resting on a rung rather than falling through one: the ball asks this to +// know whether it is supported and whether it may be booted. +function ledgeSupports(x, y, radius = 0) { + if (!platformsEnabled()) return false; + for (const ledge of activeLedges()) + if (x >= ledge.left + radius && x <= ledge.right - radius && + Math.abs(y - (ledge.y - radius)) <= 2) return true; + return false; +} +const doubleTapUs = 280000; +const doubleTapReleaseUs = 40000; +const roundDurationUs = 90000000; +const roundResultUs = 6000000; +const matchResultUs = 6000000; +const introDurationUs = 3000000; +// A reel gets one branded beat, then motion. Three portrait seconds cost the +// swipe decision before either fighter could move; the live game keeps that +// introduction, while the unattended 9:16 lane reaches the fight inside the +// first second without changing a combat rule. +const reelIntroDurationUs = 650000; +const survivalIntroDurationUs = 900000; +// Keep the close face-off lens through the first exchange. The seeded bots +// meet at about .81s; releasing at the bell made that hit happen as two tiny +// figures at the foot of an empty portrait wall. +const reelOpeningHoldUs = 1350000; +function roundIntroDurationUs() { + if (survivalActive()) return survivalIntroDurationUs; + return reelGroundCamera() ? reelIntroDurationUs : introDurationUs; +} +const dummyGuideDurationUs = 150000000; +const matchWins = 5; +const errorRestartUs = 16000000; +const errorDumpBase = "https://oskiewar.com/api/oskiewar-dump?d="; +const powerupIntervalUs = 10000000; +const shieldRadius = 160; +const shieldForward = 30; +const grenadeBlastDuration = .68; +const grenadeBlastRadius = 620; +// Ground pound. Double-tapping DOWN in the air used to be a plain fast drop +// that did nothing on arrival; now it commits you. Holding DOWN through the +// fall buys speed, the crater scales with how far you actually fell, and the +// landing balls you — so the move is a trade, never a free hit. +const poundLaunchVelocity = 1500; +const poundHoldAcceleration = 5600; +const poundMaxVelocity = 4600; +// Roughly a jump-and-a-half of floor-to-ceiling travel. Falling further than +// this cannot buy a bigger crater, so the ceiling is not a weapon. +const poundFullFall = 900; +// A first-stage landing is deliberately body-sized: the visible ring is the +// attack, not a warning decal for a much larger invisible hit. Repeated DOWN +// taps still grow it, but never into a room-clearing shortcut. +const poundMinRadius = 165; +const poundMaxRadius = 420; +const boosterXs = []; +const boosterRadius = 115; +const boosterVelocity = 6500; +const replayTickUs = 16667; +// The store's demos hold one checkpoint a second — cheap enough to keep +// hundreds of matches. A marketing render replays its demo AS the footage, +// and a fight smoothed through one-second keyframes stops feeling like a +// fight, so the reel factory asks for a checkpoint every simulation tick. +// The dense interval sits just under one true sim step (16666.67us) — at +// exactly one tick the < gate loses the rounding race and records every +// OTHER step, which halves a re-simulation's drift meter. +const replayCheckpointUs = () => + globalThis.__oskiewarDenseReplay ? 16000 : 1000000; +const liveSnapshotIntervalUs = 50000; +const fighterAnimationSpecs = { + // WALK ran a whole stride in 12 ticks — five cycles a second, which the eye + // reads as a vibrating fighter rather than as legs taking steps. Three ticks + // a frame puts the cycle at 600ms, close to a real walk, so the steps count. + IDLE: [72, 3, "BREATHE", true], WALK: [12, 3, "STRIDE", true], + RUN: [10, 1, "RUN", true], MEDITATE: [24, 2, "STILL", true], + DASH: [8, 1, "BURST", true], CROUCH: [8, 1, "TUCK", true], + "AIR CROUCH": [8, 1, "TUCK", true], JUMP: [12, 1, "ASCEND", true], + FALL: [12, 1, "DESCEND", true], PUNCH: [14, 1, "ATTACK", false], + KICK: [14, 1, "ATTACK", false], SHIELD: [12, 2, "GUARD", true], + REACH: [10, 1, "REACH", false], HOLD: [16, 2, "CLUTCH", true], + FIRE: [11, 1, "FIRE", false], THROW: [16, 1, "THROW", false], + WHIP: [11, 1, "ATTACK", false], BASH: [17, 1, "ATTACK", false], + HIT: [10, 1, "STUN", false], POGO: [12, 1, "BOUNCE", true], + "CROUCH HOP": [8, 1, "HOP", true], SINK: [10, 1, "SINK", true], + KO: [16, 2, "BREAK", false], +}; +// Every melee kind in one table: how far the limb reaches at rest and at full +// extension, how long each of its two bones is (the real reach ceiling), how +// high it lands, how wide it reads against the ball, how long the hitbox +// lives, and what it does on contact. A loaded hand cannot make a clean fist, +// so an item swing is its own kind rather than a punch modifier — a pistol +// lengthens the arm into a fast light lash, a grenade shortens it into a club. +// A blade in the item hand stretches every hand strike. Kicks are legs. +const meleeSpecFor = (player, kind) => { + const spec = meleeSpecs[kind] || meleeSpecs.PUNCH; + if (unarmedRoundActive() || !player?.swordHeld || kind === "KICK") return spec; + return { ...spec, reach: spec.reach * 1.5, span: spec.span * 1.45, + swell: spec.swell * 1.3, force: spec.force * 1.15 }; +}; +const meleeSpecs = { + PUNCH: { reach: 58, swell: 50, span: 58, height: 115, radius: 28, + windowUs: 220000, force: 1200, lift: 140, + cue: ["snare", 1.05], thud: ["block", 1] }, + KICK: { reach: 75, swell: 62, span: 74, height: 55, radius: 35, + windowUs: 220000, force: 1550, lift: 220, + cue: ["kick", 1.05], thud: ["block", 1] }, + WHIP: { reach: 92, swell: 74, span: 76, height: 122, radius: 24, + windowUs: 190000, force: 1000, lift: 110, + cue: ["whoosh", 1.15], thud: ["hat", 1.35] }, + BASH: { reach: 62, swell: 40, span: 58, height: 108, radius: 40, + windowUs: 280000, force: 1750, lift: 210, + cue: ["kick", 1.3], thud: ["kick", 1.4] }, +}; +// One lookup serves both Y and the loaded punch, so the thing you can see in +// the fighter's hand is always the thing that fires and the thing that swings. +const itemMelee = { GUN: "WHIP", GRENADE: "BASH" }; +const instantReplayStepUs = 33333; +// Replay speed ramping: how far a full-force hit drags the playhead down, how +// many frames of warning the ramp gets, and how fast the speed itself may +// change — the last one is what keeps a slowdown from reading as a stutter. +const replaySlowest = .18; +const replayActionLead = 8; +const replayRampPerSecond = 3.2; +const instantReplayMaxFrames = 240; +// Legs, slowed about a sixth on @jeffrey's ear. The station is twice the +// cube's width, and the first thing a bigger floor does is make a fighter +// read as skating across it -- the same stride that felt urgent crossing 900 +// units looks weightless crossing 1,800. Every number here moved by the same +// fraction, including the acceleration, so time-to-top-speed is unchanged and +// only the ground covered is: a run still winds up over the same beat. +// +// This is load-bearing beyond feel. `jumpReach` prices a bot's jump in +// walkSpeed, so the arcs it will commit to narrow with the stride, and the +// deck spacing above stays exactly as reachable as it was. +// What a pump is worth, and how much upward speed a lip has to be giving you +// before it counts as an air rather than a bump. The launch floor exists so +// rolling over a gentle crest does not pop a rider off the ground every time. +const skatePumpAcceleration = 2600; +const skateLaunchFloor = 380; +const walkSpeed = 880; +const runStartSpeed = 1100; +const runTopSpeed = 1950; +const runAcceleration = 690; +// Vertical feel. The apex is the design constant — how high a fighter can +// reach never changed — so every impulse here is paired with a gravity that +// spends less time getting there. Rise is lighter than fall so the arc reads +// as intent going up and commitment coming down. +const riseGravityFull = 4800; +const fallGravityFull = 7200; +// Station gravity. The space map spins up a little over half a G, and that +// one number is what makes the floating decks a place you can go: at full +// weight a jump tops out at 322 units — three and a half tiles — and the +// lowest deck sits three tiles up with nothing above it worth reaching. At +// .55 the apex is 586, so the deck stack overhead is climbable on legs, a +// knocked fighter sails instead of dropping, and the hover board's airtime +// becomes the traversal it is for. The climb keeps full weight: survival's +// thirty-two rungs are spaced against the 322 apex, and floating that run +// would let a runner skip rungs the ladder exists to make them earn. +const spaceGravityScale = .55; +const gravityScale = () => survivalActive() ? 1 : spaceGravityScale; +const riseGravity = () => riseGravityFull * gravityScale(); +const fallGravity = () => fallGravityFull * gravityScale(); +const jumpVelocity = 1760; +const crouchJumpVelocity = 1960; +const ultraJumpVelocity = 3960; +const crouchHopVelocity = 980; +const pogoBounceVelocity = 2100; +const headBounceVelocity = 1100; +const jumpAnticipationUs = 50000; +// Letting go of up mid-rise snips the arc: a tap is a hop, a hold is a jump. +const jumpCutScale = .55; +const jumpPoseUs = 75000; +const crouchJumpPoseUs = 145000; +const crouchHopPoseUs = 190000; +const sinkDurationUs = 250000; +const hudTypeSize = 42; +// The command stream is a record of what you just did, so it is long enough to +// hold a whole exchange and it does not start dissolving while you are still +// playing. Only once the pad goes quiet does it age out, oldest glyph first, +// so the last thing you pressed is the last thing to leave. +const commandStreamDepth = 20; +const commandStreamRows = 5; +const commandStreamColumns = 8; +const commandStreamColumnsNow = () => compactLayout() ? 4 : commandStreamColumns; +const commandStreamTypeSize = (handleSize) => Math.max(18, + Math.round(handleSize * (compactLayout() ? .8 : .88))); +const commandHoldUs = 1100000; +const commandFadeUs = 1900000; +const replayButtons = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", + "A", "B", "X", "Y"]; +let cameraCenter = (worldLeft + worldRight) / 2; +let cameraWidth = worldRight - worldLeft; +let cameraCenterY = floorY - cameraWidth / cameraAspect / 2; +let cameraContainFloor = 0; +// What the containment floor was last frame, so its rate of growth can be +// measured. See `updateCameraDoll` — the doll eases toward the floor, and an +// ease that is not led always sits behind a target that keeps moving. +let previousContainmentWidth = 0; +// Two different distances, because they answer two different questions. +// +// `cameraPin` is where a single projected point stops being allowed to get any +// nearer. Nothing can clip a point — a shadow ellipse or a capsule end is one +// coordinate, not a face — so the best available answer is to hold it at a +// sane depth and accept that a thing behind the lens is drawn wrong. This is +// the distance the projection has always used. +const cameraPin = 80; +// `cameraNear` is the real near plane, and faces are cut at it. It is much +// closer than the pin on purpose. The cut is a straight line at constant +// depth, and where that line lands on screen is decided by how much the lens +// magnifies at the plane -- and this lens is only a tenth perspective in +// normal play, which dilutes that magnification tenfold. Clipping the floor at +// the pin distance put its cut line just inside the bottom of the frame and +// opened a band of sky under the fighters' feet. Ten times nearer drives the +// cut off screen for any camera that is meaningfully above the floor, and the +// coordinates it asks for in exchange are what the guard band is for. +const cameraNear = 8; +// World projection occupies [-1.4, 1.4]; the photo must stay behind even +// distant AIR DROP fighters. Native sprite depth accepts [-1.5, 1.5]. +const photoBackdropDepth = 1.49; +// Projected faces are cut to a band one viewport wide on every side before +// they are handed over. The scene is allowed to run off screen; it is not +// allowed to run off into coordinates the rasterizer cannot hold, which is +// what a vertex sitting on the near plane will otherwise ask for. +const guardBand = 1; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); +const mixColor = (dark, light, amount) => dark.map((value, index) => + Math.round(value + (light[index] - value) * amount)); +const lerp = (from, to, amount) => from + (to - from) * amount; +const normalize3 = (point) => { + const length = Math.hypot(point.x, point.y, point.z) || 1; + return { x: point.x / length, y: point.y / length, z: point.z / length }; +}; +const globalLight = normalize3({ x: -.42, y: 1, z: -.28 }); +const cross3 = (a, b) => ({ x: a.y * b.z - a.z * b.y, + y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }); +const dot3 = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z; +const viewWidth = () => stageRight; +const viewCenterX = () => (stageLeft + stageRight) / 2; +const viewOffsetX = () => (stageRight - 1920) / 2; +const compactLayout = () => stageRight < 1500; +// Keep the HUD inside a traditional five-percent title-safe frame. On a +// 16:9 television this is deliberately deeper than the action-safe camera so +// a bezel, soundbar, or object in front of the screen does not hide status. +const hudSafeInset = () => clamp( + Math.round(Math.min(stageRight, viewHeight) * .05), + compactLayout() ? 24 : 48, 72); +const hudSafeRect = () => { + // The title-safe hedge and a hardware occlusion answer different threats, + // and only the deeper one matters at each edge: a bezel might hide the + // frame's rim, a notch definitely does. + const inset = hudSafeInset(); + return { left: stageLeft + Math.max(inset, viewInset.left + 14), + top: Math.max(inset, viewInset.top + 10), + right: stageRight - Math.max(inset, viewInset.right + 14), + bottom: viewHeight - Math.max(inset, viewInset.bottom + 10) }; +}; +const actionSafeRect = () => { + // A television is watched across a room behind a bezel; a reel is held at + // arm's length with nothing over its edges, so the action-safe frame there is + // a courtesy rather than a hedge against overscan. + const portrait = stageBottom - stageTop > stageRight - stageLeft; + // A landscape notch bites into the stage's own sides; fighters framed + // behind it are as lost as fighters past the edge. + const marginX = (portrait ? 18 : (compactLayout() ? 34 : 64)) + + Math.max(viewInset.left, viewInset.right); + const marginY = portrait ? 14 : 26; + return { left: stageLeft + marginX, top: stageTop + marginY, + right: stageRight - marginX, bottom: stageBottom - marginY }; +}; + +// The device's own occlusions, in game units: a phone's home indicator, a +// notch, rounded corners. The host measures them (env() on the web, native +// injection in the iOS shell, where a pinned scroll view zeroes env() out) +// and hands them through gameView; everything drawn against a screen edge — +// the stage bounds, the HUD safe frame, the touch clusters — stands off by +// them, because a control under the home indicator is a control the system +// swallows. +let viewInset = { top: 0, right: 0, bottom: 0, left: 0 }; + +function syncGameView() { + const next = typeof gameView === "function" ? gameView() : null; + const width = clamp(Math.round(Number(next?.width) || 1920), 480, 2880); + const height = clamp(Math.round(Number(next?.height) || 1080), 480, 2160); + const nextInset = {}; + for (const edge of ["top", "right", "bottom", "left"]) + nextInset[edge] = clamp(Math.round(Number(next?.inset?.[edge]) || 0), + 0, 220); + const inputFamily = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + const touch = inputFamily === "touch"; + const compact = width < 1500; + const inset = compact ? 22 : 30; + const nextTop = Math.max(82, inset + hudTypeSize + 16) + nextInset.top; + const bottomReserve = (touch + ? clamp(height * .36, 300, 390) + : clamp(height * .13, 112, 150)) + nextInset.bottom; + const nextBottom = Math.max(nextTop + 280, height - bottomReserve); + if (width === stageRight && height === viewHeight && + nextTop === stageTop && nextBottom === stageBottom && + ["top", "right", "bottom", "left"].every((edge) => + nextInset[edge] === viewInset[edge])) return; + stageRight = width; + viewHeight = height; + stageTop = nextTop; + stageBottom = nextBottom; + viewInset = nextInset; + cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); + if (typeof cameraDoll !== "undefined") cameraDoll.dirty = true; +} + +class FightCamDoll { + constructor() { + this.position = { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.4 }; + this.target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + this.width = cameraWidth; + this.perspective = 0; + this.fov = 55; + this.roll = 0; + this.dirty = true; + this.view = null; + } + + track(spec, dt, speed = 5) { + // Exponential easing is continuous across frame rates. Move the dolly and + // its look target together so follow motion cannot shear into a sudden + // swivel when fighters cross a framing threshold. + const amount = 1 - Math.exp(-Math.max(0, dt) * speed); + const previousTarget = { ...this.target }; + for (const axis of ["x", "y", "z"]) + this.target[axis] = lerp(this.target[axis], spec.target[axis], amount); + for (const axis of ["x", "y", "z"]) + this.position[axis] += this.target[axis] - previousTarget[axis]; + for (const axis of ["x", "y", "z"]) { + this.position[axis] = lerp(this.position[axis], spec.position[axis], amount); + } + // Pull back promptly but never in a single frame; return close more + // slowly so small changes at the action-safe edge do not pump the lens. + const zoomSpeed = spec.width > this.width ? speed * 1.9 : speed * .58; + const zoomAmount = 1 - Math.exp(-Math.max(0, dt) * zoomSpeed); + this.width = lerp(this.width, spec.width, zoomAmount); + this.perspective = lerp(this.perspective, spec.perspective, amount); + this.fov = lerp(this.fov, spec.fov || 55, amount); + this.roll = lerp(this.roll, spec.roll || 0, amount); + this.dirty = true; + } + + snap(spec) { + this.target = { ...spec.target }; + this.position = { ...spec.position }; + this.width = spec.width; + this.perspective = spec.perspective; + this.fov = spec.fov || 55; + this.roll = spec.roll || 0; + this.dirty = true; + collapseRenderCameraInterpolation(); + } + + prepare() { + const forward = normalize3({ x: this.target.x - this.position.x, + y: this.target.y - this.position.y, z: this.target.z - this.position.z }); + const baseRight = normalize3(cross3(forward, { x: 0, y: -1, z: 0 })); + const baseUp = normalize3(cross3(baseRight, forward)); + const rollCos = Math.cos(this.roll); + const rollSin = Math.sin(this.roll); + const right = { x: baseRight.x * rollCos + baseUp.x * rollSin, + y: baseRight.y * rollCos + baseUp.y * rollSin, + z: baseRight.z * rollCos + baseUp.z * rollSin }; + const up = { x: baseUp.x * rollCos - baseRight.x * rollSin, + y: baseUp.y * rollCos - baseRight.y * rollSin, + z: baseUp.z * rollCos - baseRight.z * rollSin }; + this.view = { forward, right, up, + centerX: (stageLeft + stageRight) / 2, + centerY: (stageTop + stageBottom) / 2, + orthoScale: (stageRight - stageLeft) / this.width, + focal: (stageRight - stageLeft) / + (2 * Math.tan(this.fov * Math.PI / 360)) }; + this.dirty = false; + } + + // World space to camera space, with the near distance left alone. Anything + // that wants to survive contact with the near plane has to see the honest + // depth first — `project` is where it gets clamped, and a clamp is a lie for + // anything behind the lens. + toView(point, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { forward, right, up } = this.view; + const x = point.x - this.position.x, y = point.y - this.position.y; + const z = point.z - this.position.z; + out.x = x * right.x + y * right.y + z * right.z; + out.y = x * up.x + y * up.y + z * up.z; + out.z = x * forward.x + y * forward.y + z * forward.z; + return out; + } + + projectView(view, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { centerX, centerY, orthoScale, focal } = this.view; + const depth = Math.max(cameraNear, view.z); + const orthoX = centerX + view.x * orthoScale; + const orthoY = centerY - view.y * orthoScale; + const perspectiveX = centerX + view.x * focal / depth; + const perspectiveY = centerY - view.y * focal / depth; + out.x = lerp(orthoX, perspectiveX, this.perspective); + out.y = lerp(orthoY, perspectiveY, this.perspective); + // Preserve depth ordering beyond the old 16k cutoff. A hard clamp made + // distant walls, floors and fighters coplanar during wide result shots. + out.z = depth <= 12000 ? depth / 16000 * 2.8 - 1.4 + : .7 + .7 * (depth - 12000) / (depth - 8000); + return out; + } + + // A lone point cannot be clipped, so it is held at the pin rather than + // allowed to divide by a depth it does not have. Faces go through + // `worldTriangle`, which cuts them at the near plane and then comes back + // here with vertices that are already in front of it. + project(point) { + const view = this.toView(point); + view.z = Math.max(cameraPin, view.z); + return this.projectView(view); + } +} + +const cameraDoll = new FightCamDoll(); +const cameraScale = () => (stageRight - stageLeft) / cameraDoll.width; +let playerCameraYaw = 0; +let playerCameraPitch = 0; +// A multiplier on the framed width, so zoom rides on top of automatic framing +// rather than fighting it: the camera still guarantees both fighters are in +// shot, and this scales the result. Above 1 is wider. The ceiling is low on +// purpose -- a wide shot draws a wider span of terrain, and span IS the frame +// budget on a console whose JS never gets a JIT. +let playerCameraZoom = 1; +let triangleDepth = -1.4; +// A match frame submits ~2100 faces. Buffering them into a Float32Array first +// cost 5.7ms a frame where handing each one straight over costs 1.8ms — +// twelve typed-array element writes in QuickJS are dearer than twelve +// arguments to one C call. The batched host call itself measured 0.05ms, so +// the boundary crossing was never the expense. +const emitTriangle = typeof triangle3d === "function" ? triangle3d + : (x1, y1, z1, x2, y2, z2, x3, y3, z3, r, g, b) => + triangle(x1, y1, x2, y2, x3, y3, r, g, b); +// r/g/b stay positional so the hottest path in the piece doesn't build a rest +// array per face; the host defaults every missing channel to 255 the same way. +// +// The native buffer speaks int16: a coordinate past ±32768 — or the NaN a +// projection returns after crossing the camera plane — is a RangeError and a +// dead frame on console. Geometry that broken was never going to be visible, +// so the seam culls it instead of crashing. NaN fails a comparison on its +// own, which keeps the guard to plain compares on the hottest path. +const triangleSafe = (value) => value > -32200 && value < 32200; +function screenTriangle(x1, y1, x2, y2, x3, y3, r = 255, g = 255, b = 255) { + if (!(triangleSafe(x1) && triangleSafe(y1) && triangleSafe(x2) && + triangleSafe(y2) && triangleSafe(x3) && triangleSafe(y3))) return; + emitTriangle(x1, y1, triangleDepth, x2, y2, triangleDepth, + x3, y3, triangleDepth, r, g, b); +} +function screenRect(x, y, width, height, color) { + const [r, g, b] = color; + screenTriangle(x, y, x + width, y, x + width, y + height, r, g, b); + screenTriangle(x, y, x + width, y + height, x, y + height, r, g, b); +} +// On the native shell `box` and `line` are CPU-composited UNDER every GPU +// triangle — App.cpp paints rects, lines and block text into the CPU frame, +// uploads that as the scene texture, then draws the depth pass over it — so +// the frame meter, keycaps, clock and bot scaffolding sank behind the +// fighters and terrain. @jeffrey on the console, 2026-09-20: "the frame +// counter and stuff in the debug ui ... feels like its behind stuff". HUD +// boxes and lines ride the triangle pass there, at a depth in front of any +// body (bodies bottom out near -1.42; the shell maps (z + 1.5) / 3 into the +// depth buffer, LESS_EQUAL). The web shell keeps box/line as they were. +const nativeTrianglePass = typeof triangle3d === "function"; +// Native AC can composite diagnostic lines and rectangles after the scene. +let nativeHudOverlay = false; +const hudDepth = -1.48; +function hudBox(x, y, width, height, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { box(x, y, width, height, ...color); return; } + const previous = triangleDepth; + triangleDepth = hudDepth; + screenRect(x, y, width, height, color); + triangleDepth = previous; +} +function hudLine(x1, y1, x2, y2, width, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy) || 1; + const nx = -dy / length * Math.max(1, width) / 2; + const ny = dx / length * Math.max(1, width) / 2; + const previous = triangleDepth; + triangleDepth = hudDepth; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x2 + nx, y2 + ny, x2 - nx, y2 - ny, r, g, b); + screenTriangle(x1 + nx, y1 + ny, x2 - nx, y2 - ny, x1 - nx, y1 - ny, r, g, b); + triangleDepth = previous; +} +function hudWorldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + hudLine(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} +function hudCircle(x, y, radius, width, color) { + let lastX = x + radius, lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + hudLine(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; lastY = nextY; + } +} +function screenStrokeRect(x, y, width, height, thickness, color) { + screenRect(x, y, width, thickness, color); + screenRect(x, y + height - thickness, width, thickness, color); + screenRect(x, y + thickness, thickness, height - thickness * 2, color); + screenRect(x + width - thickness, y + thickness, + thickness, height - thickness * 2, color); +} +function projectedTriangle(a, b, c, color) { + if (!(triangleSafe(a.x) && triangleSafe(a.y) && triangleSafe(a.z) && + triangleSafe(b.x) && triangleSafe(b.y) && triangleSafe(b.z) && + triangleSafe(c.x) && triangleSafe(c.y) && triangleSafe(c.z))) return; + // Positional, not spread: see the note on emitTriangle above. Every face a + // frame submits comes through here, and `...color` built one throwaway + // iterator apiece for ~2100 of them. + emitTriangle(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z, + color[0], color[1], color[2]); +} +// Sutherland-Hodgman, one plane at a time. Both clips below are the same walk: +// step the polygon's edges, keep the vertices that are inside, and whenever an +// edge crosses out or in, keep the crossing point too. +function clipPolygon(polygon, distance, mix) { + const kept = []; + for (let index = 0; index < polygon.length; index++) { + const current = polygon[index]; + const next = polygon[(index + 1) % polygon.length]; + const here = distance(current); + const there = distance(next); + if (here >= 0) kept.push(current); + if ((here >= 0) !== (there >= 0)) + kept.push(mix(current, next, here / (here - there))); + } + return kept; +} +const mixVertex = (a, b, amount) => ({ x: lerp(a.x, b.x, amount), + y: lerp(a.y, b.y, amount), z: lerp(a.z, b.z, amount) }); +// The near plane, in camera space, before the divide. This is the whole point: +// a vertex behind the lens has a negative depth, and pinning it to the near +// distance keeps its sideways offset while dividing by a distance it never +// had — so a face that crosses the plane used to shear halfway across the +// screen, or blow past the coordinate guard and vanish outright. Cutting it at +// the plane leaves only geometry that is honestly in front of the camera. +const clipViewNear = (polygon) => + clipPolygon(polygon, (vertex) => vertex.z - cameraNear, mixVertex); +// And the guard band, in screen space, after it. A vertex sitting exactly on +// the near plane projects to focal/near times its offset — twenty-three times, +// at this lens — so a legitimately visible floor can still ask for coordinates +// far outside anything the rasterizer will take. Cut it to a band a viewport +// wide instead of dropping the face and leaving a hole in the ground. +// The four band edges live at module scope over mutable bounds instead of +// being rebuilt as an array of closures per face — the walls cross the band +// every frame, and that little array was steady interpreter garbage. +let bandMinX = 0, bandMaxX = 0, bandMinY = 0, bandMaxY = 0; +const bandEdges = [ + (vertex) => vertex.x - bandMinX, + (vertex) => bandMaxX - vertex.x, + (vertex) => vertex.y - bandMinY, + (vertex) => bandMaxY - vertex.y, +]; +function clipScreenBand(polygon) { + const width = viewWidth(); + bandMinX = -width * guardBand; + bandMaxX = width * (1 + guardBand); + bandMinY = -viewHeight * guardBand; + bandMaxY = viewHeight * (1 + guardBand); + let clipped = polygon; + for (const distance of bandEdges) { + if (clipped.length < 3) return []; + clipped = clipPolygon(clipped, distance, mixVertex); + } + return clipped; +} +// One world-space face, all the way through: to camera space, cut at the near +// plane, projected, cut to the guard band, then fanned into whatever triangles +// are left. Zero of them is a face entirely behind the camera, which is a +// perfectly good answer. +// Whether a projected vertex already sits inside the guard band. A NaN fails +// every compare, so a broken projection falls through to the clipper. +function bandContains(vertex) { + const width = viewWidth(); + return vertex.x >= -width * guardBand && vertex.x <= width * (1 + guardBand) && + vertex.y >= -viewHeight * guardBand && + vertex.y <= viewHeight * (1 + guardBand); +} +// Scratch vertices never escape synchronous face submission or clipping. +const triangleView = [{}, {}, {}]; +const triangleScreen = [{}, {}, {}]; +function worldTriangle(a, b, c, color) { + const viewA = cameraDoll.toView(a, triangleView[0]); + const viewB = cameraDoll.toView(b, triangleView[1]); + const viewC = cameraDoll.toView(c, triangleView[2]); + // Nearly every face a frame submits sits whole in front of the lens and + // whole inside the guard band, and the console's interpreter was paying + // for six array allocations per face on the way to discovering that. + // Plain compares decide the common case; only a face that actually + // crosses a plane pays for the Sutherland-Hodgman walk. + if (viewA.z >= cameraNear && viewB.z >= cameraNear && viewC.z >= cameraNear) { + const pa = cameraDoll.projectView(viewA, triangleScreen[0]); + const pb = cameraDoll.projectView(viewB, triangleScreen[1]); + const pc = cameraDoll.projectView(viewC, triangleScreen[2]); + if (bandContains(pa) && bandContains(pb) && bandContains(pc)) { + projectedTriangle(pa, pb, pc, color); + return; + } + const banded = clipScreenBand([pa, pb, pc]); + for (let corner = 2; corner < banded.length; corner++) + projectedTriangle(banded[0], banded[corner - 1], banded[corner], color); + return; + } + const near = clipViewNear([viewA, viewB, viewC]); + if (near.length < 3) return; + const projected = near.map((vertex) => cameraDoll.projectView(vertex)); + if (projected.some((point) => !Number.isFinite(point.x) || + !Number.isFinite(point.y))) return; + // A near-plane fan can be a quad; fanning it before the band clip would + // clip the same interior edge twice, so the band takes the whole polygon. + const face = clipScreenBand(projected); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], color); +} +function projectPoint(x, y, z = 0) { + return cameraDoll.project({ x, y, z }); +} +const panAt = (x, z = 0) => clamp( + (projectPoint(x, cameraCenterY, z).x - viewCenterX()) / + Math.max(1, (stageRight - stageLeft) / 2 - 55), -1, 1); +const panPlayer = (player) => panAt(player.x, player.z); +let visualTheme = { light: 0, sunset: 0 }; + +const fighterRoster = [ + { handle: "@JEFFREY", color: [190, 42, 58], colors: [ + [255,105,190],[111,232,210],[255,105,190],[255,232,92], + [130,150,255],[255,105,190],[111,232,210],[255,232,92]], + mood: "New Media Instruments", + lastChat: "hmm this chat could use some ui love" }, + { handle: "@FIFI", color: [209, 100, 216], colors: [ + [209,100,216],[204,253,71],[35,100,255],[82,67,17],[5,249,137]], + mood: "nap", lastChat: "" }, + { handle: "@OSKIE", color: [38, 82, 176], colors: [ + [255,232,92],[255,105,190],[111,232,210],[255,232,92],[130,150,255],[255,105,190]], + mood: "", lastChat: "" }, + { handle: "@SAT", color: [130, 204, 213], colors: [ + [130,204,213],[161,232,0],[253,122,2],[222,90,205]], + mood: "i hope its not ai generated", lastChat: "meow" }, +]; +// Per-glyph color is how a community @handle carries its owner's identity. +// The house opponents are not people, so they hold one flat color each and +// let the glyph walk fall back to it. +const npcFighter = { handle: "DUMMY", color: [105, 125, 150], colors: [], + mood: "TRAINING DUMMY · NO BOT AI", lastChat: "" }; +const anonymousFighter = { handle: "", color: [72, 176, 156], colors: [ + [72,176,156],[118,214,188],[54,128,168],[230,205,92]], + mood: "ANONYMOUS", lastChat: "" }; +const spiderDummyFighter = { handle: "SPIDERDUMMY", color: [76, 88, 108], + colors: [], mood: "GIANT SEGMENTED TRAINING FOE · NO BOT AI", lastChat: "" }; +const botFighter = { handle: "BOT", color: [205, 48, 72], colors: [], + mood: "ANGRY TRAINING BOT", lastChat: "" }; +const peopleFighter = { handle: "PPL", color: [116, 122, 136], colors: [], + mood: "", lastChat: "" }; +// Self-play needs two nameplates nobody can mix up, or the result card reads +// "BOT WINS" with no way to tell which bot won. The colors here are only the +// fallback — each round deals fresh ones from the CSS color book below. +const selfPlayFighters = [ + { handle: "BOT 1", color: [205, 48, 72], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, + { handle: "BOT 2", color: [48, 118, 205], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, +]; + +// Self-play dresses its bots from the CSS color book instead of the house +// red and blue. The picks hash out of the round name, so the offline replay +// that repaints a reel deals the same pairing the live pass wore, and every +// round is a fresh matchup. The book carries only names that can hold a +// nameplate on either theme — the washed-out and near-black entries stay +// home — and the second pick stands off a sixth of the color wheel from the +// first so the result card never reads as a mirror match. +const cssColorBook = ("crimson dc143c,firebrick b22222,red ff0000," + + "orangered ff4500,tomato ff6347,coral ff7f50,darkorange ff8c00," + + "orange ffa500,gold ffd700,goldenrod daa520,darkgoldenrod b8860b," + + "yellowgreen 9acd32,chartreuse 7fff00,lawngreen 7cfc00,limegreen 32cd32," + + "forestgreen 228b22,green 008000,seagreen 2e8b57,mediumseagreen 3cb371," + + "springgreen 00ff7f,mediumspringgreen 00fa9a,lightseagreen 20b2aa," + + "teal 008080,darkcyan 008b8b,darkturquoise 00ced1,turquoise 40e0d0," + + "mediumturquoise 48d1cc,cadetblue 5f9ea0,deepskyblue 00bfff," + + "dodgerblue 1e90ff,cornflowerblue 6495ed,steelblue 4682b4," + + "royalblue 4169e1,blue 0000ff,mediumblue 0000cd,darkslateblue 483d8b," + + "slateblue 6a5acd,mediumslateblue 7b68ee,mediumpurple 9370db," + + "blueviolet 8a2be2,darkviolet 9400d3,darkorchid 9932cc," + + "mediumorchid ba55d3,orchid da70d6,violet ee82ee,magenta ff00ff," + + "mediumvioletred c71585,deeppink ff1493,hotpink ff69b4," + + "palevioletred db7093,indianred cd5c5c,salmon fa8072,darksalmon e9967a," + + "lightcoral f08080,rosybrown bc8f8f,sienna a0522d,chocolate d2691e," + + "peru cd853f,sandybrown f4a460,olivedrab 6b8e23,olive 808000," + + "darkkhaki bdb76b,rebeccapurple 663399,aquamarine 7fffd4," + + "mediumaquamarine 66cdaa,lightgreen 90ee90,skyblue 87ceeb," + + "lightskyblue 87cefa,plum dda0dd,khaki f0e68c,greenyellow adff2f," + + "yellow ffff00,cyan 00ffff,lime 00ff00").split(",").map((entry) => { + const [name, hex] = entry.split(" "); + const value = parseInt(hex, 16); + return { name, rgb: [value >> 16 & 255, value >> 8 & 255, value & 255] }; + }).filter(({ rgb }) => { + const high = Math.max(...rgb); + const low = Math.min(...rgb); + return high - low >= 60 && high + low >= 140 && high + low <= 400; + }); + +const hueOf = ([red, green, blue]) => { + const high = Math.max(red, green, blue); + const low = Math.min(red, green, blue); + const span = high - low || 1; + const sixth = high === red ? (green - blue) / span + : high === green ? 2 + (blue - red) / span : 4 + (red - green) / span; + return (sixth * 60 + 360) % 360; +}; + +function selfPlayWardrobe(pad) { + if (typeof globalThis.__oskiewarJevPad === 'function') + return { name: pad === 0 ? 'JEV PINK' : 'JEV BLUE', rgb: pad === 0 ? [255, 90, 170] : [65, 195, 255] }; + const round = matchName || seriesName; + const first = cssColorBook[Math.floor( + hashUnit(round + " one") * cssColorBook.length) % cssColorBook.length]; + if (pad === 0) return first; + const start = Math.floor(hashUnit(round + " two") * cssColorBook.length); + for (let step = 0; step < cssColorBook.length; step++) { + const pick = cssColorBook[(start + step) % cssColorBook.length]; + const apart = Math.abs(hueOf(pick.rgb) - hueOf(first.rgb)); + if (Math.min(apart, 360 - apart) >= 60) return pick; + } + return cssColorBook[(start + 1) % cssColorBook.length]; +} + +function losAngelesSun() { + const radians = Math.PI / 180; + const days = Date.now() / 86400000 + 2440587.5 - 2451545; + const meanLongitude = (280.46 + .9856474 * days) % 360; + const meanAnomaly = (357.528 + .9856003 * days) % 360; + const eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly * radians) + + .02 * Math.sin(2 * meanAnomaly * radians); + const obliquity = 23.439 - .0000004 * days; + const rightAscension = Math.atan2(Math.cos(obliquity * radians) * + Math.sin(eclipticLongitude * radians), Math.cos(eclipticLongitude * radians)) / + radians; + const declination = Math.asin(Math.sin(obliquity * radians) * + Math.sin(eclipticLongitude * radians)); + const siderealHours = 18.697374558 + 24.06570982441908 * days; + let hourAngle = ((siderealHours * 15 - 118.2437 - rightAscension + 540) % 360) - 180; + const latitude = 34.0522 * radians; + const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) + + Math.cos(latitude) * Math.cos(declination) * + Math.cos(hourAngle * radians)) / radians; + const light = clamp((altitude + 6) / 14, 0, 1); + const sunset = clamp(1 - Math.abs(altitude - 1) / 11, 0, 1) * + (hourAngle > 0 ? 1 : .42); + return { light: light * light * (3 - 2 * light), sunset }; +} + +function displayTheme() { + if (globalThis.__oskiewarTheme === "dark") return {light:0, sunset:0}; + // A lit room washes out the night palette; the venue pins daylight. + if (globalThis.__oskiewarTheme === "light") return {light:1, sunset:0}; + const sun = losAngelesSun(); + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.platform === "web" || caps.platform === "macos") { + return { ...sun, light: caps.colorScheme === "light" ? 1 : 0 }; + } + return sun; +} +// Nameless until somebody says who they are. These two used to boot as +// @JEFFREY and @OSKIE — the first and third entries of the local roster — and +// every path that failed to learn a real identity quietly fell through to +// them. That is how an anonymous visitor alone in a dead room was shown +// "@JEFFREY vs @OSKIE" and told "YOU ARE @OSKIE — RIGHT SIDE". An empty name +// is the honest state and the wire already speaks it: spectatorState sends "" +// as NOBODY, and the HUD reads it as "THE SECOND FIGHTER". +const players = [ + { name: "", rosterIndex: -1, handleColors: anonymousFighter.colors, + // Spawn marks stand on the centers of tiles 3 and 6 — mirrored across + // the cube's middle, three tiles from the pistol's corner. Three + // matters: a pickup takes any limb within 90, a standing fighter's arms + // reach most of a tile past the mark, and two tiles of gap was close + // enough that the bell handed the weapon out before anyone moved. + pad: 0, spawnX: tileCenterX(spawnColLeft), x: tileCenterX(spawnColLeft), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: 1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: anonymousFighter.color.slice(), hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: 1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, + { name: "", rosterIndex: -1, handleColors: [], + npc: false, bot: false, remote: false, + pad: 1, spawnX: tileCenterX(spawnColRight), x: tileCenterX(spawnColRight), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: -1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: [38, 82, 176], hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: -1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, +]; +const thirdPlayerTemplate = JSON.stringify(players[1]); +const freeForAll = () => localVersusActive() && players.length === 3; +const rivalsOf = (player) => players.filter((other) => + other !== player && other.alive).sort((a, b) => + Math.hypot(a.x - player.x, a.y - player.y, a.z - player.z) - + Math.hypot(b.x - player.x, b.y - player.y, b.z - player.z)); +const nearestRival = (player) => rivalsOf(player)[0] || + players.find((other) => other !== player); +function roundWinner() { + const contenders = freeForAll() ? players.filter((player) => player.alive) : players; + if (freeForAll() && contenders.length <= 1) return contenders[0] || null; + const best = Math.max(...contenders.map((player) => player.score)); + const leaders = contenders.filter((player) => player.score === best); + return leaders.length === 1 ? leaders[0] : null; +} +function setLocalPlayerCount(count) { + if (count === 3 && players.length === 2) { + const third = JSON.parse(thirdPlayerTemplate); + third.pad = 2; + players.push(third); + frameMeters.push([]); + } else if (count === 2) { + players.length = 2; + frameMeters.length = 2; + } +} +// Who the camera, the scorekeeping and the reactions believe is on stage. +// Survival and the versus lobby are both one-body rooms — the second chair +// is parked off the map until somebody takes it. +const activePlayers = () => + survivalActive() || lobbyActive() ? [players[0]] : players; +const impacts = []; + +// Every impact gets a number, in order, for the life of the run. A watcher +// cannot be told "here is a new spark" by a stateless frame that repeats the +// same list ten times — it has to be able to tell which ones it has already +// seen, and a position is not an identity. The counter is simulation state: +// a rollback that re-spawns an impact must re-issue the same number. +let impactSequence = 0; + +function spawnImpact(impact) { + impact.id = ++impactSequence; + impacts.push(impact); + return impact; +} + +const detachedParts = []; +const bullets = []; +const grenades = []; +// The station's arsenal, said out loud: a pistol on the floor, a space laser +// at the top of the climb, a light saber over each fighter's own head. The +// cube could carry exactly one weapon, and the comment here used to say why +// — "a one-room box has no shelf to price them on". A station HAS shelves. +// Height is the price again, the way it was in the tower, and each of the +// three is priced differently on purpose: +// +// pistol — floor, far corner, behind the right spawn. The oldest bargain +// in this game and unchanged: turn your back on the other fighter to arm +// up, or rush the middle bare-handed. Six rounds that ricochet forever. +// space laser — the high centre deck, three jumps up, contested from both +// sides. Four bolts, no ricochet, and fast enough that it is a line you +// draw rather than a shot you lead. Missing it costs the bolt outright. +// light saber — one on each low deck, mirrored, one jump off your own +// spawn. It is the only free weapon and the only fair one, and it buys +// reach on every hand strike rather than a projectile. +// +// The blade came and went inside one build back in the cube — @jeffrey tried +// a sword-and-pistol standoff and asked for fists and one gun instead. The +// objection was to a duel in a phone booth, and the whole drawing machinery +// (`swordHeld`, the hilt pinned to the item forearm) survived it intact. A +// map with distance in it is the condition that was missing. +// +// `cycle` marks the slot the ten-second powerup rotation owns. Only the +// pistol carries it, so an untouched laser can never stall the reload that +// keeps the floor fight fed. +const gunPickups = [ + { kind: "HANDGUN", amount: 6, x: tileCenterX(cornerColRight), + startsActive: true, cycle: true, y: floorY, z: 0 }, + { kind: "SPACE LASER", amount: 4, x: centerX, startsActive: true, + cycle: false, y: parkDecks[3].y, z: 0 }, + { kind: "ROCKET LAUNCHER", amount: 3, x: tileCenterX(cornerColLeft), + startsActive: true, cycle: false, y: floorY, z: 0 }, +]; +// A saber is not ammunition, so it is not a gun pickup: taking one sets a +// state a fighter keeps until the arm holding it comes off. Mirrored across +// the two low decks, centred on each deck rather than on a tile, because the +// deck is the landmark a player actually reads. +const saberPickups = [ + { kind: "LIGHT SABER", x: (parkDecks[1].left + parkDecks[1].right) / 2, + y: parkDecks[1].y, z: 0, startsActive: true }, + { kind: "LIGHT SABER", x: (parkDecks[2].left + parkDecks[2].right) / 2, + y: parkDecks[2].y, z: 0, startsActive: true }, +]; +const grenadePickups = [ + { amount: 3, x: centerX - 450, y: floorY, z: 0, startsActive: true }, + { amount: 3, x: centerX + 450, y: floorY, z: 0, startsActive: true }, +]; +// No trees. Two grew out of the tower's side walls and were the only thing +// in a round that gave a body back; in the cube their ripe fruit read as a +// coconut hanging over the fight, and @jeffrey asked for it gone. The +// consequence is the point now: a fighter taken apart limb by limb stays +// that way until the bell. The grower/harvest machinery below sleeps on +// this empty list. +const bodyTrees = []; +const treeRipenUs = 18000000; +const treeTimeBonusUs = 15000000; +const airParticles = []; +for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + // A pickup names its tile and floats seventy above that tile's surface — + // the same float the old ledges used, and it keeps a real-sized weapon + // from reading as a decal painted on the floor. + pickup.y = surfaceYAt(pickup.x, pickup.y) - 70; +} +// Every kind carries a gravity factor so redressing the match ball in place +// can never leave a previous kind's float behind. +// +// The skateboard is map furniture; it never replaces the match ball. +const ballKinds = [ + { type: "soccer", spawnOwner: 0, radius: 38, mass: .72, hitScale: 1.12, + bounce: .58, drag: .994, windFactor: .58, gravityFactor: 1 }, + { type: "basketball", spawnOwner: 1, radius: 42, mass: 1.08, hitScale: .86, + bounce: .76, drag: .989, windFactor: .34, gravityFactor: 1 }, + { type: "beach", spawnOwner: -1, radius: 46, mass: .34, hitScale: 1.25, + bounce: .82, drag: .998, windFactor: 1.35, gravityFactor: .62 }, + { type: "skateboard", spawnOwner: -1, radius: 52, mass: .9, hitScale: .7, + bounce: .34, drag: .992, windFactor: .5, gravityFactor: .5, + series: false }, +]; +let matchBallType = ballKinds[0].type; +const skateBoardKind = ballKinds.find((kind) => kind.type === "skateboard"); +// A match inflates exactly one ball and keeps it for every round, and the +// station parks exactly one board on the floor at centre. Two entries in one +// array because they are the same kind of object to every routine that +// touches them — swept contact, ledge support, shadows, the wire format — +// and because the board's whole mount path is written against a ball rolling +// into a shin. +const balls = [{ ...ballKinds[0], z: 0, vx: 0, vy: 0, rotation: 0, + x: players[0].spawnX, y: floorY - ballKinds[0].radius, + active: true, serveAt: 0, lastHitBy: 0, safeUntil: 0, safePlayers: 0, + heldBy: -1 }, +...[cornerColLeft, 20, 32].map((spawnCol) => ({ ...skateBoardKind, spawnCol, riderPad: -1, z: 0, vx: 0, vy: 0, rotation: 0, + x: tileCenterX(spawnCol), y: floorY - skateBoardKind.radius, + active: true, serveAt: 0, lastHitBy: -1, safeUntil: 0, safePlayers: 0, + heldBy: -1 }))]; +// Version-one replay/spectator consumers still read the first ball by name. +const ball = balls[0]; +// The board is not gated by `ballEnabled`. That switch is the ball's — it +// takes the serve, the cross-wack and the BALLED death off the map together — +// and the board shares none of them. +let skateBoardEnabled = true; +// The ball is out of the round — @jeffrey asked for the cube bare. All of +// the ball's machinery (serve, boot, carry, cross-wack, the BALLED death) +// sleeps behind this switch exactly as it always did for the test harness; +// flipping it back on is the whole re-installation. +let ballEnabled = false; + +function mapHash(text) { + let hash = 2166136261; + for (const character of String(text || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} +let currentMapName = "HALFPIPE"; +let currentMapId = "halfpipe"; +let workshopBase = null; +// Workshop edits are local practice state. They never enter rollback matches +// or the competitive replay ledger; documents are saved separately. +let workshopMap = null; +let workshopRevision = 0; +let workshopHistory = []; +let workshopHighlight = false; +let workshopTainted = false; + +let localMapIndex = -1; +let localMapMode = ""; +let localMapInstalled = false; +let netRoundMapIndex = -1; +const localMapVariants = [null, { + name: "BOWL", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "transition", rise: 360, dir: -1, lift: -360 }, + { from: 16, to: 24, kind: "flat", lift: -360 }, + { from: 24, to: 28, kind: "transition", rise: 360, dir: 1, lift: -360 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 9, cols: 4, row: 3 }, { col: 27, cols: 4, row: 3 }], +}, { + name: "HIGH GROUND", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "bank", rise: 270, dir: 1 }, + { from: 16, to: 24, kind: "flat", lift: 270 }, + { from: 24, to: 28, kind: "bank", rise: 270, dir: -1 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 7, cols: 4, row: 3 }, { col: 18, cols: 4, row: 7 }, + { col: 29, cols: 4, row: 3 }], +}, { + name: "PUMP TRACK", + features: [ + { from: 0, to: 6, kind: "flat" }, + ...[6, 14, 22, 30].flatMap(from => [ + { from, to: from + 3, kind: "bank", rise: 180, dir: 1 }, + { from: from + 3, to: from + 5, kind: "flat", lift: 180 }, + { from: from + 5, to: from + 8, kind: "bank", rise: 180, dir: -1 }, + ]), + { from: 38, to: 40, kind: "flat" }, + ], + decks: [{col: 17, cols: 6, row: 6}], +}, { + name: "TWIN BOWLS", + features: [ + {from: 0, to: 4, kind: "flat"}, + ...[4, 22].flatMap(from => [ + {from, to: from + 3, kind: "transition", rise: 270, dir: -1, lift: -270}, + {from: from + 3, to: from + 9, kind: "flat", lift: -270}, + {from: from + 9, to: from + 12, kind: "transition", rise: 270, dir: 1, lift: -270}, + {from: from + 12, to: from + 18, kind: "flat"}, + ]), + ], + decks: [{col: 8, cols: 4, row: 3}, {col: 26, cols: 4, row: 3}], +}, { + name: "LAUNCH PAD", + features: [ + {from: 0, to: 6, kind: "flat", lift: 360}, + {from: 6, to: 10, kind: "bank", rise: 360, dir: -1}, + {from: 10, to: 16, kind: "flat"}, + {from: 16, to: 20, kind: "bank", rise: 270, dir: 1}, + {from: 20, to: 24, kind: "bank", rise: 270, dir: -1}, + {from: 24, to: 30, kind: "flat"}, + {from: 30, to: 34, kind: "bank", rise: 360, dir: 1}, + {from: 34, to: 40, kind: "flat", lift: 360}, + ], + decks: [{col: 8, cols: 4, row: 6}, {col: 18, cols: 4, row: 9}, + {col: 28, cols: 4, row: 6}], +}]; +localMapVariants.push({ + name: "CORAL STEPS", + features: [ + {from:0, to:8, kind:"flat"}, + {from:8, to:12, kind:"bank", rise:180, dir:1}, + {from:12, to:16, kind:"flat", lift:180}, + {from:16, to:20, kind:"bank", lift:180, rise:180, dir:1}, + {from:20, to:24, kind:"bank", lift:180, rise:180, dir:-1}, + {from:24, to:28, kind:"flat", lift:180}, + {from:28, to:32, kind:"bank", rise:180, dir:-1}, + {from:32, to:40, kind:"flat"}, + ], + decks:[{col:4,cols:4,row:4},{col:18,cols:4,row:8},{col:32,cols:4,row:4}], +}, { + ...localMapVariants[1], name:"SLOW MOTION", modifier:"slow", +}, { + name:"AIR DROP", modifier:"air", skateboard:false, + features:[{from:0,to:40,kind:"flat"}], decks:[], +}, { + name:"UNARMED", modifier:"unarmed", + features:[{from:0,to:40,kind:"flat"}], decks:[], pickups:[], +}); +const roundMapIds = ["halfpipe", "bowl", "high-ground", "pump-track", "twin-bowls", "launch-pad", + "coral-steps", "slow-motion", "air-drop", "unarmed"]; +const roundMapColors = [ + {sky:[218,239,255], night:[8,23,34], floor:[45,191,185], deck:[255,154,72]}, + {sky:[246,225,255], night:[27,13,39], floor:[181,107,237], deck:[76,220,188]}, + {sky:[255,231,203], night:[34,19,18], floor:[246,150,58], deck:[74,177,232]}, + {sky:[225,247,214], night:[9,29,27], floor:[119,192,66], deck:[234,103,169]}, + {sky:[255,224,231], night:[34,12,29], floor:[231,101,146], deck:[93,193,222]}, + {sky:[224,234,255], night:[13,19,43], floor:[90,139,234], deck:[250,202,67]}, + {sky:[255,235,205], night:[34,15,30], floor:[248,108,92], deck:[66,214,201]}, + {sky:[239,222,255], night:[25,15,43], floor:[122,94,201], deck:[245,176,238]}, + {sky:[125,208,255], night:[8,18,39], floor:[93,158,243], deck:[255,244,168]}, + {sky:[230,250,212], night:[18,27,23], floor:[101,199,144], deck:[255,191,103]}, +]; +// Temporarily excluded while AIR readability is revised. Keep authored IDs stable. +const airRoundInRotation = false; +function nextRoundMapIndex(index) { + for (let step = 0; step < localMapVariants.length; step++) { + index = (index + 1) % localMapVariants.length; + if (airRoundInRotation || localMapVariants[index]?.modifier !== "air") return index; + } + return 0; +} +function roundMapDocument(index) { + const variant = localMapVariants[index]; + return variant ? {...workshopBase, ...variant, + features: variant.features.map(f => ({lift:0, rise:0, dir:1, ...f}))} : workshopBase; +} +function installRoundMap(index) { + installWorkshopMap(roundMapDocument(index), true); + currentMapId = roundMapIds[index]; +} + +function rotateLocalMap(keepMap, resetMatch) { + const local = localVersusActive(); + const training = !selfPlay && ["dummy", "spiderdummy", "trainingbot", "bot"] + .includes(fightOpponent); + if (skateparkMap || (!local && !training) || workshopTainted || + globalThis.__oskiewarPublishedMap) return; + const mode = local ? "local" : "training"; + if (localMapMode !== mode) { localMapIndex = -1; localMapMode = mode; } + // Returning to the title mid-round keeps its map. A completed solo round + // advances before the next START, just like the local versus rollover. + if (localMapIndex < 0 || (!keepMap && (local || !resetMatch || roundResult))) + localMapIndex = nextRoundMapIndex(localMapIndex); + const variant = localMapVariants[localMapIndex]; + const map = variant ? { ...workshopBase, ...variant, + features: variant.features.map(f => ({ lift: 0, rise: 0, dir: 1, ...f })) } + : workshopBase; + if (local || variant) installWorkshopMap(map, true); + else currentMapName = "HALFPIPE"; + currentMapId = roundMapIds[localMapIndex]; + localMapInstalled = local || Boolean(variant); +} + +function workshopSnapshot() { + return { format: "ac.oskiewar.map", version: 1, + name: workshopMap?.name || currentMapName, + features: parkSegments.map(({ from, to, kind, lift, rise, dir }) => + ({ from, to, kind, lift: lift || 0, rise: rise || 0, dir: dir || 1 })), + decks: parkDecks.map(d => ({ col: (d.left - gridLeft) / tileSize, + cols: (d.right - d.left) / tileSize, row: (floorY - d.y) / tileSize })), + spawns: players.slice(0, 2).map(p => (p.spawnX - gridLeft) / tileSize - .5), + pickups: workshopMap?.pickups.map(p => ({ ...p })) || + [...gunPickups, ...saberPickups, ...grenadePickups].filter(p => p.startsActive) + .map(p => ({ kind: p.kind || "GRENADE", col: tileCol(p.x), amount: p.amount || 0 })), + skateboard: skateBoardEnabled }; +} + +function installWorkshopMap(map, cycleHandgun = false) { + if (skateparkMap) { configureWorldMap("station"); resetSkateRopes(); } + localMapInstalled = false; + workshopMap = map; + roundModifier = map.modifier || ""; + parkSegments.splice(0, parkSegments.length, ...map.features.map(f => ({ ...f, + left: gridLeft + f.from * tileSize, right: gridLeft + f.to * tileSize }))); + parkDeepest = floorY + Math.max(0, ...parkSegments.map(s => -s.lift)); + rebuildTerrainProfile(); + parkDecks.splice(0, parkDecks.length, ...map.decks.map((d, i) => ({ level: i + 1, + left: gridLeft + d.col * tileSize, right: gridLeft + (d.col + d.cols) * tileSize, + y: floorY - d.row * tileSize }))); + players.forEach((p, i) => { p.spawnX = tileCenterX(map.spawns[i] ?? + (map.spawns[0] + map.spawns[1]) / 2); }); + const weapons = unarmedRoundActive() ? [] : map.pickups; + if (unarmedRoundActive()) { + for (const player of players) clearWeaponLoadout(player); + bullets.length = 0; grenades.length = 0; + } + installMapPickups(gunPickups, weapons.filter(p => + !["GRENADE", "LIGHT SABER"].includes(p.kind)), "gun"); + // Portable maps contain authored pickups, not the built-in refill policy. + const pistol = gunPickups.find(p => p.kind === "HANDGUN"); + if (cycleHandgun && pistol) pistol.cycle = true; + installMapPickups(saberPickups, weapons.filter(p => p.kind === "LIGHT SABER"), "saber"); + installMapPickups(grenadePickups, weapons.filter(p => p.kind === "GRENADE"), "grenade"); + skateBoardEnabled = map.skateboard; + currentMapName = map.name; + currentMapId = "workshop-" + mapHash(JSON.stringify(map)).toString(36); + // Reconcile newly raised floors without restarting the players' exchange. + for (const p of players) { + const ground = terrainFloorAt(p.x); + if (p.y > ground || p.grounded) { p.y = ground; p.vy = 0; p.grounded = true; } + } + renderPreviousState = null; +} + +function workshopCommand(command) { + if (!globalThis.__oskiewarWorkshopEnabled) throw new Error("Coach editing is off"); + if ((netSession && netSession.seat !== 0) || roundViewer || survivalActive() || resimActive) + throw new Error("Edit through the room host; survival and replay editing are unavailable"); + if (!command || typeof command !== "object") throw new Error("Expected a workshop command"); + const { op } = command; + if (op === "inspect") return { room: "ow-" + (versusRoomName || sessionName), + revision: workshopRevision, map: workshopSnapshot(), + highlights: workshopHighlight, undo: workshopHistory.length, + units: { columns: gridCols, tileSize, floorY }, + players: players.map(p => ({ x: p.x, y: p.y, spawnX: p.spawnX })) }; + if (op === "highlight") { + if (typeof command.enabled !== "boolean") throw new Error("Supply enabled: true or false"); + workshopHighlight = command.enabled; + return workshopCommand({ op: "inspect" }); + } + if (command.revision !== workshopRevision) throw new Error("Map changed; inspect and use its revision"); + if (!["apply", "drop", "undo", "reset-round", "restart-level"].includes(op)) + throw new Error("Unknown workshop operation"); + let map; + if (op === "undo") { + if (!workshopHistory.length) throw new Error("Nothing to undo"); + map = workshopHistory[workshopHistory.length - 1]; + } else { + map = op === "apply" ? command.map : workshopSnapshot(); + if (op === "drop") map.pickups.push(command.item); + } + map = globalThis.__oskiewarValidateMap(map); + if (netSession) { + const session = netSession; + if (session.send({ t: "workshop", o: session.originUs }) === false) + throw new Error("The peer connection is not ready for editing"); + workshopTainted = true; + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + } + if (op === "undo") workshopHistory.pop(); + else if (!["reset-round", "restart-level"].includes(op)) { + workshopHistory.push(workshopSnapshot()); + if (workshopHistory.length > 20) workshopHistory.shift(); + } + workshopTainted = true; + workshopRevision++; + installWorkshopMap(map); + if (op === "reset-round" || op === "restart-level") + resetRound(runtime().monotonicUs, op === "restart-level"); + return workshopCommand({ op: "inspect" }); +} + +function installMapPickups(target, authored, type) { + target.length = 0; + for (const entry of authored) { + const x = tileCenterX(entry.col); + target.push({ + ...(type === "gun" ? { kind: entry.kind, amount: entry.amount, + cycle: Boolean(entry.cycle) } : {}), + ...(type === "saber" ? { kind: "LIGHT SABER" } : {}), + ...(type === "grenade" ? { amount: entry.amount } : {}), + x, y: terrainFloorAt(x) - 70, z: 0, + active: true, startsActive: true, respawnAt: 0, + }); + } +} + +function resetWorkshopMap() { + if (!workshopMap) return; + if (!localMapInstalled && + (globalThis.__oskiewarWorkshopEnabled || globalThis.__oskiewarPublishedMap) && + !survivalActive() && !roundViewer && !resimActive) { + installWorkshopMap(workshopMap); + return; + } + const spawns = players.map(p => p.spawnX); + installWorkshopMap(workshopBase, true); + workshopMap = null; + workshopHistory = []; + workshopRevision++; + currentMapName = "HALFPIPE"; + currentMapId = "halfpipe"; + if (versusLane() || survivalActive()) players.forEach((p, i) => { p.spawnX = spawns[i]; }); +} + + +// Physics remains an exact 60 Hz story. Rendering may happen between those +// authored instants—especially during slow motion—so retain the state that +// entered each tick and blend only presentation coordinates toward the state +// that left it. The authoritative objects are restored immediately after +// paint; collision, replay capture and networking never see interpolated data. +let renderPreviousState = null; +const renderInterpolationFields = { + player: ["x", "y", "z", "headRoll", "crouchBlend"], + bullet: ["x", "y", "z", "previousX", "previousY"], + grenade: ["x", "y", "z", "previousX", "previousY", "blastRadius"], + ball: ["x", "y", "z", "rotation"], + detached: ["x1", "y1", "z1", "x2", "y2", "z2"], + debris: ["x", "y", "z"], + camera: ["width", "roll", "perspective", "fov"], + cameraPoint: ["x", "y", "z"], +}; + +function renderInterpolationObjects() { + return [ + ...players.map((object) => [object, renderInterpolationFields.player]), + ...bullets.map((object) => [object, renderInterpolationFields.bullet]), + ...grenades.map((object) => [object, renderInterpolationFields.grenade]), + ...balls.map((object) => [object, renderInterpolationFields.ball]), + ...detachedParts.map((object) => [object, renderInterpolationFields.detached]), + ...impacts.flatMap((impact) => (impact.debris || []) + .map((object) => [object, renderInterpolationFields.debris])), + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]; +} + +function captureRenderInterpolationState() { + renderPreviousState = new Map(); + for (const [object, fields] of renderInterpolationObjects()) + renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +// A camera snap is an edit, not motion. If it happens inside a simulation +// tick, replace the retained camera sample too; otherwise fractional-speed +// paint blends the new close-up with the old wide shot and frame one lands +// halfway between them. +function collapseRenderCameraInterpolation() { + if (!renderPreviousState) return; + for (const [object, fields] of [ + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]) renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +function beginRenderInterpolation(alpha) { + const amount = clamp(Number(alpha), 0, 1); + if (!renderPreviousState || amount >= .999) return () => {}; + const restore = []; + for (const [object, fields] of renderInterpolationObjects()) { + const previous = renderPreviousState.get(object); + if (!previous) continue; + for (const field of fields) { + if (!Number.isFinite(previous[field]) || !Number.isFinite(object[field])) + continue; + restore.push([object, field, object[field]]); + object[field] = lerp(previous[field], object[field], amount); + } + } + cameraDoll.dirty = true; + return () => { + for (const [object, field, value] of restore) object[field] = value; + cameraDoll.dirty = true; + }; +} +let padSnapshots = [null, null]; +// The pad each fighter actually feels. A bot writes its synthesized presses +// here, so the HUD, the debug read-out, the replay and the physics all read +// bot input off the same wire as a hand on a controller. +let inputPads = [null, null]; +let startedAt = 0; +let roundStartedAt = 0; +let lastSimAt = 0; +let roundElapsedUs = 0; +const fightHitMarks = []; +globalThis.__oskiewarFightHitMarks = fightHitMarks; +let lastCountdownSecond = -1; +// The intro's own clock: which "3, 2, 1" second last rang, and whether the +// round-open accent has fired. -1 means the accent is still owed. +let lastIntroSecond = 0; +// The scored tail's clocks: the next heartbeat of the killcam dwell, and +// whether the result card has had its sting. +let resultPulseAt = 0; +let resultLaughAt = 0; +let resultLaughStep = 0; +let resultCardStung = false; +const resultReactionPrevious = [[], [], []]; +let roundOverAt = 0; +let roundResult = ""; +// How long a reel holds the opening matchup card. Long enough to read two +// names on a phone, short enough that the fight plays under a clean frame. +const REEL_MATCHUP_SECONDS = 2.6; +let matchOver = false; +let roundCause = ""; +let deathCinematic = null; +let impactHitboxesUntil = 0; +let nextPowerupAtUs = powerupIntervalUs; +let powerupSequence = 0; +let acFeed = {}; +// Pal select is retired: you are your own handle, so there is nobody to pick, +// and the dummy is already the default opponent. The whole two-step screen +// stays behind this one flag rather than being deleted, because the entry UI +// is still moving and this is the shape we may want to compare against. Flip +// it true and the wheel comes back exactly as it was. +const PAL_SELECT = false; +// The frame recorder remains intact for future review tooling, but replay is +// not part of the match flow. One flag restores the viewer, its controls and +// its offer together; production currently moves directly through results. +const INSTANT_REPLAY = false; +let selecting = false; +// Self-play is a harness mode: both fighters run the bot, no pad can enter or +// leave it, and rounds roll over on their own. +let selfPlay = false; +// Which kind the round on screen was opened against. Training and the bot door +// seat the same fighter with the same brain now, so `players[1].bot` can no +// longer say which door a round came through — and only one of those doors is +// allowed on the wire. +let fightOpponent = ""; +// Survival uses the round clock only as an elapsed-time source. Height is the +// score, the lava line is the opponent, and a run ends only when the runner +// touches it or reaches the final authored deck. +const survivalLavaStart = floorY + 360; +const survivalLavaBaseSpeed = 52; +let survivalStartedAt = 0; +let survivalLavaY = survivalLavaStart; +let survivalHeight = 0; +let survivalBestHeight = 0; +let survivalPeakLevel = 0; +let hudLeftPad = 0; +// The title is also the attract screen. Half of sessions get the quiet, +// cross-legged tableau; half get a standing face-off. Both remain still so +// the wordmark stays readable until the player asks the fight to begin. +// Hashing the already-created round name keeps the split stable for a visit +// without spending a second Math.random call (reel seeding relies on one). +let titleAttractMode = "still"; +// What a fresh session is dealt. @jeffrey, playtesting: "can we switch dummy +// to bot now?" — the free front door was a post that never hit back, so a solo +// visit was target practice rather than a fight. `trainingbot` is that same +// fighter with the bot's brain switched on, carrying its own kind name so the +// wire gate in `roundIsTimed` can still tell the free door from the one a +// handle buys. The inert dummy and the spider stay reachable by name, because +// damage, geometry and sync work all want a target that stands still. +let trainingOpponent = ""; +function trainingOpponentKind() { + const requested = String(globalThis.__oskiewarOpponent || "").toLowerCase(); + if (requested === "dummy" || requested === "spiderdummy" || + requested === "trainingbot") return requested; + // One kind for the whole visit: a title returned to after a knockout must + // not re-deal the opponent out from under the player. The web's empty + // door spars with the bot; the console's stands a dummy up instead — + // @jeffrey on the Xbox, 2026-09-20: "make it so we can play against dummy + // as opposed to bot ... the dummy goes away and gets replaced by players" + // (a second local controller promotes that chair through + // `updateLocalVersus`). An inert dummy is also one bot brain fewer in the + // console's interpreted sim. + if (!trainingOpponent) trainingOpponent = + globalThis.__oskiewarVersusCapable === true ? "trainingbot" : "dummy"; + return trainingOpponent; +} +// The versus lane's room. One name for the whole visit — the shell writes it +// into the address bar, the QR encodes it, and a friend opening that address +// takes the second chair. A visit that arrived THROUGH such an address and +// found nobody hosting claims the name instead, so a shared link survives +// its sender refreshing. +let versusRoomName = ""; +let versusNextAt = 0; +let versusRivalName = ""; +// The raw handle the seat last offered, kept beside the name it produced. The +// comparison that decides whether to re-dress has to be against this and not +// against the result: an anonymous arrival offers "", which is falsy, so the +// old guard skipped the re-dress entirely and left the PREVIOUS player's name +// and colors on the chair. Leaving and rejoining inside the 2.5 s grace is +// exactly how somebody ends up wearing a stranger. +let versusRivalOffered = ""; + +// The handle riding the freshest pad frame, cleaned to the shape a nameplate +// and the state schema both accept. One reader, so the re-dress test and the +// dressing itself can never disagree about what was offered. +function versusOfferedName() { + return String(globalThis.__oskiewarRemotePad?.name || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); +} +// How long an empty wire keeps the rival seated. Long enough to ride out a +// dropped packet or a phone switching antennas, short enough that a closed +// tab reads as "they left" while the fighter is still warm. +const versusChallengerGraceMs = 2500; +// The fight streams faster than a grandstand needs, because for the +// challenger this feed IS the game — their own presses come back to them +// as pictures through it. +const versusSnapshotIntervalMs = 33; +// How long a visitor who arrived through a shared address waits for a host +// before deciding the room is theirs to claim. +const versusClaimAfterUs = 2500000; +let versusClaimArmedAt = 0; +let versusInputSeq = 0; +let versusInputLastSent = ""; +let versusInputNextAt = 0; +let versusInputMinNextAt = 0; +// The bridge a claiming visitor stepped off of, kept so a lost publisher +// race can walk them right back on as a challenger. +let versusFallbackBridge = null; + +let versusSeatGraceUntil = 0; + +function versusChallengerFresh() { + // In a rollback fight the rival's presence is the session itself; the + // sim must not read the wall clock to decide whether the fight goes on. + if (netSession) return true; + // And for a moment after one ends badly, while the rival is changing lanes. + if (Date.now() < versusSeatGraceUntil) return true; + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return false; + return Date.now() - remote.at < versusChallengerGraceMs; +} + +// The remote rival's pad, read off the same wire shape a hand or a bot +// writes. A stale global answers neutral rather than holding the last +// press — a vanished friend must drop their guard, not run into a corner +// forever. +// The seat whoever is at this screen is holding. Seat one everywhere except a +// rollback fight's challenger, who plays the second fighter — their keycap +// legend, touch discs and move names must follow their own hands rather than +// lighting up when the other player presses something. +const localSeat = () => netSession ? netSession.seat : 0; +const localPad = () => inputPads[localSeat()] || + { connected: true, down: [], leftX: 0, leftY: 0 }; + +function remotePadSnapshot() { + const remote = globalThis.__oskiewarRemotePad; + const fresh = remote && Number.isFinite(remote.at) && + Date.now() - remote.at < versusChallengerGraceMs; + if (!fresh) return { connected: true, down: [], leftX: 0, leftY: 0, + rightX: 0, rightY: 0 }; + return { connected: true, + down: Array.isArray(remote.down) ? remote.down.slice() : [], + leftX: Number(remote.leftX) || 0, leftY: Number(remote.leftY) || 0, + rightX: 0, rightY: 0 }; +} +const selectionReady = [false, false]; +const selectionPrevious = [[], []]; +let selectionStep = 0; +let selectionCursor = 0; +let windMph = 0; +let windDirection = 1; +let windAcceleration = 0; +let windTargetMph = 0; +let windTargetDirection = 1; +let nextWindChangeAt = 0; +let replay = null; +// Round names in the order they were minted, each with the demo tick it was +// minted on. A rollback can rewind past a round rollover, so this ledger has +// to rewind with it — `replay.roundIds` is derived from it rather than being +// appended to directly, which is what keeps a re-simulated rollover from +// filing the same round twice. +let replayRoundMarks = []; +// The frame a finished round is waiting to be confirmed past before it is +// filed. -1 when nothing is waiting. See saveRoundReplay. +let replayPendingSaveFrame = -1; +let replayLastCommand = [-1, -1]; +let replayNextCheckpointAt = 0; +let matchName = ""; +let seriesName = ""; +// The app run's own name, distinct from any round or series: rounds are born +// and buried every thirty seconds, but the console sitting on the title screen +// is still a running program somebody may want to attach to. One name from +// boot to quit, drawn beside the debug bug, carried as sessionId in every live +// frame, and used as the relay room while no timed round is publishing. +let sessionName = ""; +let previousRoundName = ""; +let roundReplayFrames = []; +let roundReplayLastAt = 0; +let instantReplay = null; +let replayOfferPrevious = []; +let shellMode = "MENU"; +let gameplayStarted = false; +let shellPrevious = []; +let startInputPending = false; +let shellRawPrevious = []; +// Whether the stick was already leaned last frame, so a held lean reads as +// one gesture at the title rather than a machine-gun of entries. +let shellStickLive = false; +// Training teaches for two and a half minutes once the title lifts. This is +// session time, not round time: a knockout or a visit back to the title must +// not restart onboarding that the player has already outgrown. +let dummyGuideStartedAt = null; +// Unset is null, never -1: the console's monotonic clock can read negative +// (App.cpp overflows int64 converting QPC ticks past ~10 days of uptime), +// and a >= 0 sentinel then swallows every legitimate timestamp. +let titleTransitionAt = null; +// The wordmark is a toy: every letter of "oskiewar" and of "start" keeps its +// own swell and shudder, and the prompt keeps one shared bounce the letters +// take in turn. Paint owns these because they are pointer feel, not state. +const titleToys = []; +const promptToys = []; +let promptBounce = 0; +let titleToyAt = -1; +// Which letter the pointer currently owns. The letters never hold still — each +// one bobs and drifts a good fraction of its own width — so a bare hit test +// against a moving cell hands a resting cursor a letter that slides out from +// under it and back several times a second. That reads as a flickering glyph, +// a cursor blinking between two shapes, and a hover tick that will not stop. +// Holding the grab until the pointer leaves a cell grown by the letter's own +// travel is the same hysteresis the camera uses at the safe-zone edge. +let titleGlyphHot = -1; +let navigationPrevious = [[], []]; +// Remote render experiment flags. An attached agent can flip these through +// the relay — the shell merges oskiewar:flags into the global and the paint +// below reads it once per frame — so what each layer costs can be measured +// on the machine that is actually struggling, not a workstation imitating +// it. Every flag missing means the full picture; xbox/tools/oskiewar-ablate +// walks them and reads the price back out of the live fps telemetry. +let renderFlags = {}; +// Temporary live combat inspector. Keep this explicit so the production view +// can return to a clean presentation without changing combat geometry. +let debugHitboxes = false; +// The frame meter, the way a training mode has one: one pip per simulation +// frame, colored by what the fighter was DOING on that frame, so a player can +// read an exchange back instead of guessing at it. +// +// Street Fighter 6's legend, kept because it is the one people already know: +// green is startup, red is active, blue is recovery, yellow is stun. What +// those mean HERE is a question about this game rather than that one, and the +// honest answers are not all flattering: +// +// Startup, active and recovery come from the same integer-frame table as +// the collision sampler. A landed strike remains in recovery until its +// original action deadline. Stun still takes precedence over the action. +// +// Shielding gets a color of its own because holding a shield is a stance in +// this game rather than a reaction, and folding it into stun would say +// something false about who is in control. +const frameMeterLength = 120; +const frameMeterStates = { + neutral: { ink: [92, 100, 124], label: "" }, + startup: { ink: [86, 226, 120], label: "STARTUP" }, + active: { ink: [255, 66, 72], label: "ACTIVE" }, + recovery: { ink: [72, 150, 255], label: "RECOVERY" }, + stun: { ink: [255, 208, 64], label: "STUN" }, + shield: { ink: [186, 118, 255], label: "SHIELD" }, + airborne: { ink: [54, 62, 86], label: "" }, +}; +const frameMeters = [[], []]; +// What a fighter is on this exact frame, in one word. Ordered by what beats +// what: being stunned outranks anything you were trying to do, and a swing +// outranks the shield you are no longer really holding. +function frameMeterState(player, now) { + if (!player.alive) return "neutral"; + if (now < player.hitStunUntil) return "stun"; + if (player.attackKind && now < player.attackUntil) { + if (player.attackHit) return "recovery"; + return meleeFrame(player, now).phase; + } + if (player.blocking) return "shield"; + if (!player.grounded) return "airborne"; + return "neutral"; +} +function recordFrameMeter(now) { + if (!debugHitboxes) return; + for (const player of players) { + const meter = frameMeters[player.pad]; + meter.push(frameMeterState(player, now)); + if (meter.length > frameMeterLength) meter.shift(); + } +} +// One FIGHT_DEBUG_PERF telemetry line per debug toggle, so the console's log +// can prove the fps row drew without narrating every frame. +let debugPerfReported = false; +let nextInputDebugAt = 0; +let frameTelemetry = []; +let frameTelemetryFlushAt = 0; +let lastPaintAt = 0; +let displayFps = 0; +let liveSequence = 0; +let liveNextAt = 0; +// The session room ticks slower than a round room: nobody spectates a title +// screen at 20Hz, and an agent reading fps is happy at four. +const sessionSnapshotIntervalUs = 250000; +let sessionNextAt = 0; +// Which round the session room was last told about, so the hand-off frame +// goes out exactly once per round instead of flapping the native shell's +// single publisher socket every tick. +let sessionAnnouncedRound = ""; +let spectatorQr = null; +// Encoding a code costs about 59ms and is the whole 50-100ms tail in the +// frame histogram: it ran at every round reset, for a URL that changes once +// per round. Same URL, same code -- so keep the last one. +let spectatorQrUrl = ""; +let spectatorQrCache = null; +function spectatorCode(url) { + if (typeof qrcode !== "function") return null; + if (url === spectatorQrUrl && spectatorQrCache) return spectatorQrCache; + spectatorQrUrl = url; + spectatorQrCache = qrcode(url, { errorCorrectLevel: 1 }); + return spectatorQrCache; +} + +let roundViewer = null; +let roundViewerStop = null; +let roundViewerMode = ""; +// The chair-holder's own View presses, remembered across viewer ticks — the +// debug toggle needs an edge, and the host's echo never carries system keys. +let viewerSystemPrevious = []; +let roundViewerStatus = "CONNECTING"; +let roundViewerDemo = null; +let roundViewerDemoStartedAt = 0; +// When the last authoritative LIVE frame landed, on the WALL clock in +// milliseconds. Wall, not sim: the frame arrives in a socket callback, where +// the sim clock is not running, and comparing an arrival stamped by one clock +// against a deadline read from the other drifted by every dropped tick until +// the coast fuse below stopped tripping at all. +let roundViewerLiveAt = 0; +// The grandstand's playout buffer. Wire frames are no longer painted the +// instant they land — they queue here with their arrival time and the render +// reads a clock held a little behind the newest of them, so every frame is +// drawn by interpolating the two that bracket it. Extrapolation is what is +// left when the buffer runs dry, not the normal case: a body that coasts on +// stale velocity walks through the floor and then snaps back, which is the +// whole of what "glitchy" meant on a guest screen. +let roundViewerFrames = []; +// The playout clock, in the same wall milliseconds the queue is stamped in. +// It advances on the simulation's own dt so the picture moves at the sim's +// rate, and leans gently toward (now − delay) so it neither runs dry nor +// falls further and further behind. +let roundViewerPlayoutMs = 0; +// How far behind the newest arrival the playout clock sits. One wire frame +// plus the jitter we have actually measured — enough that the next frame is +// usually already in hand when the clock reaches the last one. +let roundViewerDelayMs = 70; +// Wire health, measured from arrivals alone: mean gap, jitter (mean absolute +// deviation of the gap), and the share of sequence numbers that never came. +// These are what the connection meter reads, and what sizes the delay above. +let roundViewerGapMs = 33; +let roundViewerJitterMs = 0; +let roundViewerLossPct = 0; +let roundViewerSeq = -1; +let roundViewerSeqHeard = 0; +let roundViewerSeqExpected = 0; +let roundViewerImpactTick = -1; +// The newest impact number this watcher has spawned. The host repeats a mark +// on every frame it is still burning, so this is what tells a repeat from a +// new spark. +let roundViewerImpactId = 0; +// Whether the round being watched has a clock. The wire says so; the watcher +// must not answer from its own `roundIsTimed()`, which reads a local fight +// that is not happening. +let roundViewerTimed = true; +let livePublishFailed = false; + +// Match names are public URLs and must not collide, so they take real +// entropy — but a recorded round has to reproduce, and the ball kind is +// hashed from the series name and carries radius and mass. So the entropy is +// drawn once per match, carried in the demo, and every name after it falls +// out deterministically. +let nameSeed = 1; +function seedNames(seed) { + nameSeed = (seed >>> 0) || 1; +} +function nameRandom() { + nameSeed = (nameSeed + 0x6d2b79f5) >>> 0; + let value = nameSeed; + value = Math.imul(value ^ (value >>> 15), value | 1); + value ^= value + Math.imul(value ^ (value >>> 7), value | 61); + return ((value ^ (value >>> 14)) >>> 0) / 4294967296; +} + +function pronounceableMatchName() { + const onsets = ["b", "d", "f", "g", "k", "l", "m", "n", "p", "r", + "s", "t", "v", "z", "ch", "sh", "th"]; + const consonants = "bdfgklmnprstvz"; + const vowels = "aeiou"; + const onset = onsets[Math.floor(nameRandom() * onsets.length)]; + const vowel = vowels[Math.floor(nameRandom() * vowels.length)]; + const middle = consonants[Math.floor(nameRandom() * consonants.length)]; + const ending = (vowels + "y")[Math.floor(nameRandom() * (vowels.length + 1))]; + return onset + vowel + middle + middle + ending + + Math.floor(nameRandom() * 1000); +} + +function demoTick(now) { + return replay ? Math.max(0, Math.round((now - replay.startedMonotonicUs) / + replayTickUs)) : 0; +} + +function trackMatchStarted() { + // Versus has its own host-authored remote-player event in startVersusFight. + if (versusLane() || !roundIsTimed() || typeof analytics !== "function") return; + const device = typeof capabilities === "function" ? capabilities() : {}; + const platform = String(device.platform || "").toLowerCase(); + const surface = platform === "xbox-uwp" || platform === "xbox" + ? "xbox" + : platform === "macos" ? "macos" : "web"; + const family = String(device.inputFamily || "").toLowerCase(); + analytics("match_started", { + source_system: "browser", + surface, + input_family: ["gamepad", "keyboard", "xbox"].includes(family) + ? family + : "unknown", + opponent_type: selfPlay ? "self-play" + : players[1].bot ? "bot" + : players[1].npc ? "dummy" : "local-player", + }); +} + +function startReplay(now) { + const run = runtime(); + if (!roundIsRecorded()) { + seriesName = ""; + matchName = ""; + previousRoundName = ""; + // Spiderdummy training carries one plain ball; there is no board to + // carry anymore. + matchBallType = "soccer"; + replay = null; + spectatorQr = null; + return; + } + seedNames(Math.floor(Math.random() * 4294967296)); + const nameSeedUsed = nameSeed; + seriesName = pronounceableMatchName(); + // The deal owns the ball in a versus fight — both seats set it from the same + // word — so rolling a series ball here would put the two of them in + // different fights. + if (!versusActive()) matchBallType = seriesBallType(seriesName); + matchName = ""; + previousRoundName = ""; + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = { + format: "ac.oskiedemo", version: 1, game: "oskiewar", + simulation: "oskiewar-physics-1", tickRate: 60, + matchId: "ow-" + seriesName, matchName: seriesName, + seriesId: "ow-" + seriesName, seriesName, roundIds: [], + recordedDisplay: { + width: Number(run.width) || viewWidth(), + height: Number(run.height) || viewHeight, + aspectRatio: (Number(run.width) || viewWidth()) / + Math.max(1, Number(run.height) || viewHeight), + surfaceWidth: Number(run.surfaceWidth) || Number(run.width) || viewWidth(), + surfaceHeight: Number(run.surfaceHeight) || Number(run.height) || viewHeight, + refreshHz: Number(run.refreshHz) || Number(run.measuredHz) || 0, + }, + startedAt: run.unixMs || 0, startedMonotonicUs: now, + // Which room this was played in, so a room can be asked for its own + // history. Only a versus fight has one: in the broadcast lane each round + // IS its own room and the round id already says so. + ...(versusActive() && versusRoomName + ? { roomId: "ow-" + versusRoomName, roomName: versusRoomName } : {}), + // Preserve the original round's clock policy, including timed versus. + // Older demos carry no flag and default to timed in the reader. + timed: roundIsTimed(), + nameSeed: nameSeedUsed, ballType: matchBallType, + map: skateparkMap ? "skatepark" : "station", + fighters: players.map((player) => player.name), + nations: players.map((player) => player.nation || ""), + commands: [], events: [], checkpoints: [], rounds: [], impacts: [], + }; + replayLastCommand = [-1, -1]; + replayNextCheckpointAt = now; + // The sequence counter survives the match: every round room is born empty, + // so a fresh room takes any first number — but the session room lives from + // boot to quit, and the relay silently drops a frame whose sequence ever + // runs backwards. One counter, never rewound, serves them both. + liveNextAt = now; + livePublishFailed = false; + spectatorQr = null; + trackMatchStarted(); +} + +// Whether the round on screen is on the wire: clocked, named, recorded, +// published, counted. The free training round never is, whatever its opponent +// does. An opponent with no bot AI used to be a safe stand-in for "nobody is +// watching this" — the day training started sparring back, that stand-in would +// have put every anonymous session on a series, a demo and a live feed, so the +// gate reads the door the round came through instead. Versus rounds share +// the same ninety-second limit on both deterministic simulations. +function roundIsTimed() { + // A watcher is answering about somebody else's round. Everything below reads + // this machine's own fight, which for a watcher is not running — and a + // watcher that has not been served a frame yet has no round to report at + // all, so it must not paint a countdown for one. A stored demo still falls + // through: it IS a local re-run, and it was a timed round when recorded. + if (roundViewer && roundViewerMode !== "DEMO") + return roundViewerMode === "LIVE" && roundViewerTimed; + if (survivalActive()) return false; + // Training runs without a clock — except under the reel harness, where a + // scripted dummy bout wants the full round apparatus (clock, demo, result + // card) so it can be recorded and repainted like any match. + if (globalThis.__oskiewarTimedTraining === true) return true; + // Every round that reaches a re-simulation was a timed, recorded round. + if (resimActive) return resimTimed; + if (fightOpponent === "trainingbot") return false; + if (versusLane()) return true; + return !(players[1].npc && !players[1].bot); +} + +// This machine is the one that writes a versus fight down. Both seats +// simulate it, but the record needs exactly one author or the two would race +// for the same round id — the same reason only the host narrates the stream. +const versusRecorder = () => + versusActive() && (!netSession || netSession.seat === 0); + +// Which rounds leave a record. Timed rounds always did, and a versus fight +// does now: a room's history is the point of the room. The clock was never +// what made a round worth keeping, it was just the only lane that had one. +// The public demo/relay contract has two seats. Local three-player battles +// retain their in-memory round replay without publishing incompatible demos. +const roundIsRecorded = () => !freeForAll() && + (versusLane() ? versusRecorder() : roundIsTimed()); + +// The frame numbers the debug HUD already prints, packed for the wire. Only +// stages the host actually measured go in — a console reports a real frame and +// present time, a browser reports its rAF span and its own paint cost and +// nothing else — because a zeroed field on a public feed reads as a stall +// rather than as silence. Two decimals is the resolution AC_NATIVE_PROFILE +// prints at, and it holds the whole block under sixty bytes. +function spectatorPerf(run) { + const perf = { fps: Math.round(displayFps || 0) }; + const frameMs = Number(run.frameMs) || 0; + const renderMs = Number(run.renderCpuMs) || 0; + const hz = Number(run.refreshHz) || 0; + if (frameMs) perf.frameMs = Math.round(frameMs * 100) / 100; + if (renderMs) perf.renderMs = Math.round(renderMs * 100) / 100; + if (hz) perf.hz = Math.round(hz); + return perf; +} + +function spectatorState(now, nextRoundId = "") { + const run = runtime(); + const introAge = now - roundStartedAt; + const phase = instantReplay ? "replay" : matchOver ? "match" + : roundResult ? "round" : selecting ? "select" + : introAge < roundIntroDurationUs() ? "intro" : "fight"; + const timed = roundIsTimed(); + // An untimed frame reports zero rather than null: the relay reads every + // remainingMs as an integer, and the title screen's attract fight has no + // clock to misreport. + const remainingMs = roundResult || !timed ? 0 : Math.max(0, + Math.round((roundDurationUs - roundElapsedUs) / 1000)); + const state = { + format: "ac.oskiewar.live", version: 1, seq: liveSequence++, + map: { id: currentMapId, name: currentMapName, highlights: workshopHighlight, + ...(workshopMap ? { workshop: workshopMap } : {}) }, + at: run.unixMs || 0, phase, + course: skateparkMap ? "skatepark" : "station", + ropes: skateRopes.map((rope) => rope.nodes.map((node) => + [node.x, node.y, node.px, node.py].map((value) => Math.round(value * 100) / 100))), + previousRoundId: previousRoundName ? "ow-" + previousRoundName : "", + fighters: players.map((player) => ({ + // The title's still variant seats a fighter with no name yet, and the + // relay turns away a nameless one — so the empty seat gets called what + // it is rather than costing the whole frame. + name: player.name || "NOBODY", nation: player.nation || "", color: player.color, + x: player.x, y: player.y, + z: player.z, vx: player.vx, vy: player.vy, vz: player.vz, + skateboard: player.skateboard, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, + facing: player.facing, alive: player.alive, + grounded: player.grounded, ducking: player.ducking, + sinking: now < player.sinkUntil, + blocking: player.blocking, score: player.score, + roundWins: player.roundWins, attack: player.attackKind || "", + removedParts: player.removedParts.slice(), + // Three numbers the grandstand already knew how to read and had never + // been sent. `applyRoundViewerState` reconstructs the strike spark, the + // limb burst and the swing's real arc from them; without them a live + // watcher saw a body come apart in silence and every swing froze at one + // canned mid-pose. Two decimals is all a fade needs. + hit: Math.round((player.hit || 0) * 100) / 100, + blockFlash: Math.round((player.blockFlash || 0) * 100) / 100, + attackTicks: player.attackKind + ? Math.max(0, Math.round((now - player.attackStartedAt) / replayTickUs)) + : 0, + })), + // Shots and lobs, the fight's projectiles. These used to stay home: a + // watcher — and a challenger on an older build — watched fighters flinch + // and die with nothing visible in the air between them. Flat number rows + // rather than objects, because the relay caps a frame at 8 KiB and 24 + // rounds plus 12 grenades named longhand is most of that cap on its own. + // Velocity rides along so the playout buffer can carry a round smoothly + // between arrivals instead of stepping it 140 units at a time. + shots: bullets.filter((shot) => shot.life > 0).map((shot) => [ + Math.round(shot.x), Math.round(shot.y), Math.round(shot.z), + Math.round(shot.previousX ?? shot.x), + Math.round(shot.previousY ?? shot.y), + Math.round(shot.vx || 0), Math.round(shot.vy || 0), shot.owner | 0, + (shot.spit ? 1 : 0) | (shot.heavy ? 2 : 0) | (shot.rubber ? 4 : 0)]), + // The host's own impact track. A watcher was reconstructing sparks from + // the flag edges it could see, which covers a punch landing and nothing + // else: a ricochet, a spit splat, a ground pound's crater and a grenade's + // own blast raise no flag on any fighter, so they happened in silence on + // every screen but the host's. Newest twelve, each with the number that + // says whether a watcher has already seen it, and its remaining life so + // it is spawned at the age it really is. + impacts: impacts.filter((mark) => mark.life > 0).slice(-12) + .map((mark) => [mark.id | 0, Math.round(mark.x), Math.round(mark.y), + Math.round(mark.z), Math.round((mark.duration || .3) * 1000), + Math.round(Math.max(0, mark.life) * 1000), + (mark.death ? 1 : 0) | (mark.explosion ? 2 : 0)]), + lobs: grenades.filter((lob) => lob.alive).map((lob) => [ + Math.round(lob.x), Math.round(lob.y), Math.round(lob.z), + Math.round(lob.vx || 0), Math.round(lob.vy || 0), lob.owner | 0, + (lob.rocket ? 1 : 0) | (lob.exploding ? 2 : 0), + Math.round(lob.blastRadius || 0), + Math.round(Math.max(0, lob.fuse || 0) * 1000)]), + ball: { active: ball.active, x: ball.x, y: ball.y, + z: ball.z, radius: ball.radius, type: ball.type, mass: ball.mass }, + balls: balls.map((item) => ({ active: item.active, x: item.x, + y: item.y, z: item.z, radius: item.radius, type: item.type, + mass: item.mass, heldBy: item.heldBy, + spawnOwner: item.spawnOwner })), + camera: { x: cameraCenter, y: cameraCenterY, width: cameraWidth, + position: { ...cameraDoll.position }, target: { ...cameraDoll.target }, + perspective: cameraDoll.perspective, fov: cameraDoll.fov, + roll: cameraDoll.roll }, + wind: { direction: windDirection, mph: windMph }, + round: { remainingMs, timed, result: roundResult || "", + cause: roundCause || "", + // How long this round has been running, intro included. A timed round + // could be reconstructed from `remainingMs` alone, but the versus lane + // reports zero there — and a watcher deriving its clock from that zero + // pinned itself thirty seconds in the past, which is why it never + // counted a round off and never played an intro card. + elapsedMs: clamp(Math.round((now - roundStartedAt) / 1000), 0, 3600000) }, + // @jeffrey plays oskiewar.com in Edge on an Xbox, where there are no + // devtools and the console's own AC_NATIVE_PROFILE line only reaches a + // Device Portal on the same LAN. The live socket is the one channel that + // already leaves the box, so the frame rate rides out with the round and + // can be read from anywhere the round can. + perf: spectatorPerf(run), + }; + // A title-screen frame has no series, no round and no demo to link — the + // relay rejects an id it cannot parse, so an empty name stays off the wire + // entirely rather than riding out as "ow-". + if (seriesName) state.seriesId = "ow-" + seriesName; + if (matchName) { + state.roundId = "ow-" + matchName; + state.replayUrl = "/api/oskiewar-replays?id=ow-" + matchName; + } + if (sessionName) state.sessionId = "ow-" + sessionName; + if (nextRoundId) state.nextRoundId = nextRoundId; + return state; +} + +function publishSpectator(now, { target = matchName, nextRoundId = "", + force = false } = {}) { + // A timed versus round still uses its stable room via publishVersus. + if (versusLane() || !roundIsTimed() || !target || livePublishFailed || + typeof publishLive !== "function" || + (!force && now < liveNextAt)) return; + liveNextAt = now + liveSnapshotIntervalUs; + try { + publishLive("ow-" + target, + JSON.stringify(spectatorState(now, nextRoundId))); + } catch (error) { + // A native host with an older room-ID contract must never take down play. + // Disable only spectator publishing until the next match/host upgrade. + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// The session channel. Rounds publish their own rooms, but the app run itself +// keeps one room under its own name so an agent has somewhere to attach while +// nothing is being scored — the title screen included. It runs only while the +// debug bug is lit: every anonymous visitor idling on oskiewar.com would +// otherwise claim one of the relay's 128 rooms, and this channel exists for a +// maintainer who asked for it, not for an audience. While a timed round is on +// the wire the session room instead gets exactly one frame naming that round, +// which both points any watcher at the fight and retires this room's publisher +// so the native shell's single socket is free to follow. +function publishSession(now) { + if (freeForAll() || (!debugHitboxes && !globalThis.__oskiewarWorkshopEnabled) || + !sessionName || livePublishFailed || + typeof publishLive !== "function") return; + const liveRound = !versusLane() && roundIsTimed() && matchName ? matchName : ""; + if (liveRound) { + if (sessionAnnouncedRound === liveRound) return; + sessionAnnouncedRound = liveRound; + try { + publishLive("ow-" + sessionName, + JSON.stringify(spectatorState(now, "ow-" + liveRound))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } + return; + } + sessionAnnouncedRound = ""; + if (now < sessionNextAt) return; + sessionNextAt = now + sessionSnapshotIntervalUs; + try { + publishLive("ow-" + sessionName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +function inputCommand(pad) { + const input = quantizedInput(pad); + let mask = 0; + if (input.horizontal < 0) mask |= 1; + if (input.horizontal > 0) mask |= 2; + if (input.vertical > 0) mask |= 4; + if (input.vertical < 0) mask |= 8; + for (let index = 4; index < replayButtons.length; index++) + if (pad.down.includes(replayButtons[index])) mask |= 1 << index; + return mask; +} + +function recordReplayCommands(now, inputs = padSnapshots) { + if (!replay) return; + for (let pad = 0; pad < players.length; pad++) { + const command = players[pad].npc && !players[pad].bot + ? 0 : inputCommand(inputs[pad]); + if (command !== replayLastCommand[pad]) { + replay.commands.push([demoTick(now), pad, command]); + replayLastCommand[pad] = command; + } + } +} + +function replayFlags(player) { + // Bit 12 carries which way the fighter faces. Older demos lack it, so a + // replay treats "no facing bits" as "guess from velocity" — bit 13 marks + // that the pair below is real rather than an old demo's zero. + return (player.alive ? 1 : 0) | (player.grounded ? 2 : 0) | + (player.ducking ? 4 : 0) | (player.blocking ? 8 : 0) | + [...limbParts, "torso"].reduce((flags, part, index) => + flags | (hasPart(player, part) ? 0 : 1 << (index + 4)), 0) | + (player.facing > 0 ? 4096 : 0) | 8192 | + (player.hit > .05 ? 16384 : 0) | (player.blockFlash > .05 ? 32768 : 0); +} + +function recordReplayCheckpoint(now, force = false) { + if (!replay || (!force && now < replayNextCheckpointAt)) return; + replayNextCheckpointAt = now + replayCheckpointUs(); + const values = [demoTick(now)]; + for (const player of players) values.push( + Math.round(player.x), Math.round(player.y), Math.round(player.z), + Math.round(player.vx), Math.round(player.vy), replayFlags(player), + player.score, player.roundWins); + values.push(Math.round(ball.x), Math.round(ball.y), Math.round(ball.z), + Math.round(ball.vx), Math.round(ball.vy), ball.active ? 1 : 0, + Math.round(cameraCenter), Math.round(cameraCenterY), Math.round(cameraWidth)); + // The full camera pose rides along so a replay can stand the lens exactly + // where the live pass stood it — re-deriving position from width parks the + // camera inside close shots and near-clips the bodies it came to frame. + values.push(Math.round(cameraDoll.position.x), + Math.round(cameraDoll.position.y), Math.round(cameraDoll.position.z), + cameraDoll.perspective || 0, cameraDoll.fov || 55, cameraDoll.roll || 0); + replay.checkpoints.push(values); + // Dense demos also carry every impact the fight spawned, so the repaint + // can put the sparks and debris back instead of only moving bodies. + if (replayCheckpointUs() < 100000) for (const impact of impacts) + if (!impact.recordedTick) { + impact.recordedTick = demoTick(now) + 1; + replay.impacts?.push([demoTick(now), Math.round(impact.x), + Math.round(impact.y), Math.round(impact.z || 0), + impact.death ? 1 : impact.explosion ? 2 : 0, + Math.round((impact.duration || .3) * 1000)]); + } +} + +function makeRoundReplayFrame(now) { + const poseTime = (now - startedAt) / 1000000; + return { + ropes: structuredClone(skateRopes), + players: players.map((player) => ({ + x: player.x, y: player.y, z: player.z, + vx: player.vx, vy: player.vy, vz: player.vz, + facing: player.facing, grounded: player.grounded, + ducking: player.ducking, alive: player.alive, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, skateboard: player.skateboard, + blocking: player.blocking, blockFlash: player.blockFlash, hit: player.hit, + attackKind: player.attackKind, + attackStartedOffset: player.attackStartedAt - now, + attackUntilOffset: player.attackUntil - now, + geometry: runnerWorldGeometry(player, poseTime), + })), + ball: { x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, + active: ball.active }, + balls: balls.map((item) => ({ x: item.x, y: item.y, z: item.z, + vx: item.vx, vy: item.vy, active: item.active })), + camera: { center: cameraCenter, centerY: cameraCenterY, width: cameraWidth }, + }; +} + +function captureRoundReplay(now, force = false) { + if (!INSTANT_REPLAY) return; + if (!force && now - roundReplayLastAt < instantReplayStepUs) return; + roundReplayLastAt = now; + roundReplayFrames.push(makeRoundReplayFrame(now)); + while (roundReplayFrames.length > instantReplayMaxFrames) + roundReplayFrames.shift(); +} + +// A local picture history, never a simulation rewind. At 20Hz this keeps +// 1.2 seconds of rendered poses/effects; playback interpolates those poses +// while the authoritative round clock, inputs and rollback state keep running. +let finalKillReplayClockUs = null; +let finalKillReplayRendering = false; +let finalKillReplayHistory = []; +let finalKillReplayLastAt = -Infinity; +let finalKillReplayRound = ""; +let finalKillReplay = null; +let finalKillReplayResultAt = null; +const finalKillReplayStepUs = 50000; +const finalKillReplayMaxFrames = 26; +const finalKillReplaySceneArrays = () => ({ + balls, bullets, grenades, impacts, detachedParts, skateRopes, + gunPickups, saberPickups, grenadePickups, +}); +function resetFinalKillReplay() { + finalKillReplayHistory = []; finalKillReplay = null; finalKillReplayResultAt = null; + finalKillReplayLastAt = -Infinity; finalKillReplayRound = ""; + globalThis.__oskiewarFinalKillReplay = null; +} +function finalKillReplayActive() { + return !!(roundResult && finalKillReplay && finalKillReplay.round === matchName); +} +function captureFinalKillReplay(now, force = false) { + if (netSilent || finalKillReplayRendering || shellMode !== "GAME" || selecting) return; + if (finalKillReplayRound !== matchName || now < finalKillReplayLastAt) { + resetFinalKillReplay(); finalKillReplayRound = matchName; + } + // A rollback can retract a predicted KO. Its picture must retract too. + if (!roundResult && (finalKillReplay || finalKillReplayResultAt !== null)) {resetFinalKillReplay();finalKillReplayRound=matchName;} + if (finalKillReplay && (finalKillReplay.overAt !== roundOverAt || finalKillReplay.result !== roundResult)) { + resetFinalKillReplay();finalKillReplayRound=matchName; + } + if (finalKillReplay) return; + const firstResult = !!roundResult && finalKillReplayResultAt === null; + if (!force && now-finalKillReplayLastAt < finalKillReplayStepUs && !firstResult) return; + if (firstResult) finalKillReplayResultAt = now; + finalKillReplayLastAt = now; + const t = (now-startedAt)/1000000; + const frame = {now, players:players.map(player => { + const state = {}; + // Scalar pose/wardrobe flags only; no bot planner or net/input history. + for (const key in player) { + const value = player[key], type = typeof value; + if (value === null || type === "number" || type === "string" || type === "boolean") state[key] = value; + } + for (const key of ["removedParts","color","handleColors"]) + if (player[key]) state[key] = cloneFinalKillPicture(player[key]); + state.replayGeometry = cloneFinalKillPicture(player.replayGeometry || player.frozenGeometry || runnerWorldGeometry(player,t)); + return state; + }), arrays:{}}; + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) { + const limit = name === "impacts" ? 16 : name === "detachedParts" ? 48 : 64; + frame.arrays[name] = cloneFinalKillPicture(array.slice(-limit)); + } + finalKillReplayHistory.push(frame); + if (finalKillReplayHistory.length > finalKillReplayMaxFrames) finalKillReplayHistory.shift(); + if (roundResult && now-finalKillReplayResultAt >= 250000) { + finalKillReplay = {round:matchName,overAt:roundOverAt,result:roundResult,frames:finalKillReplayHistory.slice(), + wallStarted:hostRuntime().monotonicUs, endedAt:now}; + } +} +// These are plain visual records. Native QuickJS also runs without a browser +// structuredClone, so keep the recorder independent of the LAN adapter. +function cloneFinalKillPicture(value) { + if (value === null || typeof value !== "object") return value; + if (Array.isArray(value)) return value.map(cloneFinalKillPicture); + const copy = {}; + for (const key of Object.keys(value)) copy[key] = cloneFinalKillPicture(value[key]); + return copy; +} +function blendFinalKillPicture(a,b,alpha) { + if (typeof a === "number" && typeof b === "number" && Number.isFinite(a) && Number.isFinite(b)) + return lerp(a,b,alpha); + if (Array.isArray(a) && Array.isArray(b)) { + if (a.length !== b.length) return cloneFinalKillPicture(alpha < .5 ? a : b); + return a.map((item,index)=>blendFinalKillPicture(item,b[index],alpha)); + } + if (a && b && typeof a === "object" && typeof b === "object") { + if (a.part !== b.part || a.id !== b.id) return cloneFinalKillPicture(alpha < .5 ? a : b); + const out = {}; + for (const key of Object.keys(alpha < .5 ? a : b)) + out[key] = key in a && key in b ? blendFinalKillPicture(a[key],b[key],alpha) + : cloneFinalKillPicture((alpha < .5 ? a : b)[key]); + return out; + } + return alpha < .5 ? a : b; +} +function beginFinalKillReplay(wallNow = hostRuntime().monotonicUs) { + if (!finalKillReplayActive()) return () => {}; + const replay = finalKillReplay, frames = replay.frames; + const elapsed = Math.max(0,wallNow-replay.wallStarted); + // Each angle shows the same final impact. No empty interval between loops. + const shotUs = 1800000, shot = Math.floor(elapsed/shotUs)%3; + const phase = (elapsed%shotUs)/shotUs; + const end = frames[frames.length-1].now; + const start = Math.max(frames[0].now,end-800000); + const at = lerp(start,end,Math.min(1,phase/.86)); + let index = 0; + while(index+1({...originals.players[i],...sample}))); + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) { + originals.arrays[name] = array.slice(); + array.splice(0,array.length,...blendFinalKillPicture(a.arrays[name],b.arrays[name],alpha)); + } + finalKillReplayClockUs = at; finalKillReplayRendering = true; + const xs = players.map(p=>p.x), ys = players.map(p=>p.y); + // Detached heads and fragments remain inside the shot rather than being + // lost behind a dramatic lens. Stay in front of the arena's back wall. + const fighterLeft=Math.min(...xs)-700, fighterRight=Math.max(...xs)+700; + const fighterTop=Math.min(...ys)-700, fighterBottom=Math.max(...ys)+700; + for (const part of detachedParts) { + if (![part.x1,part.x2,part.y1,part.y2].every(Number.isFinite) || + part.x1fighterRight || + part.y1fighterBottom) continue; + xs.push(clamp(part.x1,fighterLeft,fighterRight),clamp(part.x2,fighterLeft,fighterRight)); + ys.push(clamp(part.y1,fighterTop,fighterBottom),clamp(part.y2,fighterTop,fighterBottom)); + } + const left=Math.min(...xs),right=Math.max(...xs),top=Math.min(...ys)-230,bottom=Math.max(...ys)+80; + cameraCenter=(left+right)/2;cameraCenterY=(top+bottom)/2; + cameraWidth=Math.max(850,(right-left+520)*1.3,(bottom-top+220)*cameraAspect*1.3); + const angle=[-.40,.40,0][shot]+Math.sin(phase*Math.PI)*.13; + const distance=cameraWidth*1.55; + cameraDoll.position={x:cameraCenter+Math.sin(angle)*distance, + y:cameraCenterY-cameraWidth*(shot===2?.52:.16),z:-Math.cos(angle)*distance}; + cameraDoll.target={x:cameraCenter,y:cameraCenterY,z:0}; + cameraDoll.width=cameraWidth;cameraDoll.roll=0;cameraDoll.perspective=.75;cameraDoll.fov=48;cameraDoll.dirty=true; + globalThis.__oskiewarFinalKillReplay={active:true,shot,phase,frames:frames.length,speed:.52}; + return () => { + players.splice(0,players.length,...originals.players); + for (const [name,array] of Object.entries(finalKillReplaySceneArrays())) + array.splice(0,array.length,...originals.arrays[name]); + cameraCenter=originals.cameraCenter;cameraCenterY=originals.cameraCenterY; + cameraWidth=originals.cameraWidth;cameraContainFloor=originals.cameraContainFloor; + Object.assign(cameraDoll,originals.doll); + finalKillReplayClockUs=originals.clock;finalKillReplayRendering=false; + }; +} + +// Keep a replay's impact visible through overhead platforms. This changes +// presentation only: supporting decks and platforms behind the action remain. +function finalKillLedgeOccludes(ledge,near,far) { + if (!finalKillReplayRendering) return false; + const eye=cameraDoll.position; + const targets=players.flatMap(player=>{ + const head=player.replayGeometry?.head; + return head ? [head,{x:head.x-head.radius,y:head.y,z:head.z}, + {x:head.x+head.radius,y:head.y,z:head.z}, + {x:player.x,y:player.y-90,z:player.z}] : []; + }); + for(const part of detachedParts) targets.push({x:part.x1,y:part.y1,z:part.z1}); + for(const effect of impacts) targets.push({x:effect.x,y:effect.y,z:effect.z||0}); + for(const point of targets) { + const dy=point.y-eye.y; + if(Math.abs(dy)<.001) continue; + const along=(ledge.y-eye.y)/dy; + if(along<=0 || along>=1) continue; + const x=lerp(eye.x,point.x,along),z=lerp(eye.z,point.z,along); + if(x>=ledge.left-24 && x<=ledge.right+24 && z>=near-24 && z<=far+24) return true; + } + return false; +} + +const frameTelemetrySchema = ["us", "cameraX", "cameraY", "cameraWidth", + "dollX", "dollY", "dollZ", "targetX", "targetY", "targetZ", + "dollWidth", "roll", "p1x", "p1y", "p1z", "p1vx", "p1vy", + "p2x", "p2y", "p2z", "p2vx", "p2vy"]; + +function captureFrameTelemetry(now, force = false) { + if (netSilent || selecting || shellMode === "MENU") return; + const round = (value) => Math.round(Number(value || 0) * 100) / 100; + frameTelemetry.push([ + Math.round(now - roundStartedAt), round(cameraCenter), round(cameraCenterY), + round(cameraWidth), round(cameraDoll.position.x), round(cameraDoll.position.y), + round(cameraDoll.position.z), round(cameraDoll.target.x), + round(cameraDoll.target.y), round(cameraDoll.target.z), + round(cameraDoll.width), round(cameraDoll.roll), + ...players.flatMap((player) => [round(player.x), round(player.y), + round(player.z), round(player.vx), round(player.vy)]), + ]); + if (!force && now < frameTelemetryFlushAt) return; + telemetry("FIGHT_TRACE", JSON.stringify({ + format: "ac.oskiewar.frames", version: 1, round: "ow-" + matchName, + schema: freeForAll() ? [...frameTelemetrySchema, "p3x", "p3y", "p3z", "p3vx", "p3vy"] + : frameTelemetrySchema, frames: frameTelemetry, + })); + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; +} + +function applyRoundReplayFrame(frame, now) { + if (frame.ropes) skateRopes.splice(0, skateRopes.length, ...structuredClone(frame.ropes)); + for (let index = 0; index < players.length; index++) { + const player = players[index]; + const state = frame.players[index]; + for (const key of ["x", "y", "z", "vx", "vy", "vz", "facing", + "grounded", "ducking", "alive", "blocking", "blockFlash", "hit", + "attackKind", "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) player[key] = state[key]; + player.attackStartedAt = now + state.attackStartedOffset; + player.attackUntil = now + state.attackUntilOffset; + player.replayGeometry = state.geometry; + } + const frameBalls = frame.balls || [frame.ball]; + for (let index = 0; index < balls.length; index++) { + const state = frameBalls[index]; + if (!state) continue; + for (const key of ["x", "y", "z", "vx", "vy", "active"]) + balls[index][key] = state[key]; + } + cameraCenter = frame.camera.center; + cameraCenterY = frame.camera.centerY; + cameraWidth = frame.camera.width; +} + +function finishInstantReplay(now) { + if (!instantReplay) return; + applyRoundReplayFrame(instantReplay.endFrame, now); + for (const player of players) delete player.replayGeometry; + instantReplay = null; + roundOverAt = now; + replayOfferPrevious = padSnapshots[0]?.down?.slice() || []; +} + +// A replay is worth watching at the speed the eye needs, not the speed the +// clock kept. Frames already record what a hit looks like, so the playhead can +// read its own footage and slow itself into the action rather than being told +// where the action is — which means every replay already in the store gets +// this without being re-recorded. +function frameAction(frame) { + let action = 0; + for (const player of frame.players) { + if (!player.alive) action = Math.max(action, 1); + if (player.hit) action = Math.max(action, 1); + if (player.blockFlash > 0) action = Math.max(action, .7 * player.blockFlash); + // A swing that has started but not yet landed is the part worth stretching. + if (player.attackKind && player.attackUntilOffset > 0) + action = Math.max(action, .35); + } + return action; +} + +// Look ahead, so the ramp is already down by the time the punch arrives. A +// slowdown that begins on the frame of impact has missed the impact. +function replayActionCurve(frames) { + const raw = frames.map(frameAction); + return raw.map((_, index) => { + let peak = 0; + for (let at = index; at < Math.min(raw.length, index + replayActionLead); at++) + peak = Math.max(peak, raw[at] * (1 - (at - index) / replayActionLead * .35)); + return peak; + }); +} + +// One step of the speed ramp, kept pure so it can be tested and so the demo +// viewer can share it when its playhead learns to accumulate. Easing rather +// than snapping — and capping how far the speed may travel per second of real +// time — is what keeps a dense run of hits reading as one long stretch rather +// than a stutter. +function replayRampStep(speed, action, elapsedSeconds) { + const target = lerp(1, replaySlowest, clamp(action, 0, 1)); + return speed + (target - speed) * + Math.min(1, Math.max(0, elapsedSeconds) * replayRampPerSecond); +} + +function startInstantReplay(now) { + if (!INSTANT_REPLAY) return false; + if (roundReplayFrames.length < 2) return false; + const frames = roundReplayFrames.slice(); + instantReplay = { frames, cursor: 0, lastAt: now, paused: false, + previous: padSnapshots[0]?.down?.slice() || [], + action: replayActionCurve(frames), speed: 1, + endFrame: frames[frames.length - 1] }; + impacts.length = 0; + detachedParts.length = 0; + applyRoundReplayFrame(frames[0], now); + telemetry("ROUND_REPLAY", "start frames=" + frames.length); + return true; +} + +function updateInstantReplay(now, dt) { + if (!instantReplay) return; + const down = padSnapshots[0]?.down || []; + const pressed = (button) => down.includes(button) && + !instantReplay.previous.includes(button); + if (pressed("B")) { + finishInstantReplay(now); + return; + } + if (pressed("A")) instantReplay.paused = !instantReplay.paused; + if (pressed("ArrowLeft") || pressed("ArrowRight")) { + instantReplay.paused = true; + instantReplay.cursor += pressed("ArrowLeft") ? -15 : 15; + } + const elapsed = Math.max(0, now - instantReplay.lastAt) / 1000000; + instantReplay.speed = replayRampStep(instantReplay.speed, + instantReplay.action?.[Math.floor(instantReplay.cursor)] || 0, elapsed); + if (!instantReplay.paused) + instantReplay.cursor += (now - instantReplay.lastAt) / + instantReplayStepUs * instantReplay.speed; + instantReplay.lastAt = now; + instantReplay.cursor = clamp(instantReplay.cursor, 0, + instantReplay.frames.length); + if (instantReplay.cursor >= instantReplay.frames.length) { + finishInstantReplay(now); + return; + } + applyRoundReplayFrame(instantReplay.frames[Math.floor(instantReplay.cursor)], now); + instantReplay.previous = down.slice(); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter - cameraWidth * .06, + y: cameraCenterY - cameraWidth * .04, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: 0, fov: 55 }, dt, 18); +} + +// A finished round in a rollback fight is not finished yet: the frames that +// ended it are still inside the rollback window, and a rival pad arriving late +// can take the knockout back. So the round is marked and filed later, from +// netTick, once both seats have confirmed past its end. A re-simulation +// reaches this line again and simply re-marks the frame. +function saveRoundReplay(now) { + if (!replay) return; + if (netSession) { replayPendingSaveFrame = netSession.frame; return; } + uploadRoundReplay(now); +} + +// Everything that is waiting, filed now whatever the wire is doing. A rival +// who has gone will never confirm anything, and the round they lost still +// happened. +function flushPendingRoundReplay(now) { + if (replayPendingSaveFrame < 0 || !replay) return; + replayPendingSaveFrame = -1; + uploadRoundReplay(now); + if (matchOver) finishReplay(); +} + +function uploadRoundReplay(now) { + if (!replay || workshopTainted) return; + recordReplayCheckpoint(now, true); + const demo = JSON.parse(JSON.stringify(replay)); + demo.matchId = "ow-" + matchName; + demo.matchName = matchName; + demo.roundId = demo.matchId; + demo.roundName = matchName; + demo.roundIndex = Math.max(0, replay.roundIds.length - 1); + // Read off the ledger rather than off `previousRoundName`, so a rollback + // that took a rollover back cannot leave the linkage pointing at a round + // that no longer exists. + demo.previousRoundId = demo.roundIndex > 0 + ? replay.roundIds[demo.roundIndex - 1] : ""; + demo.durationTicks = demoTick(now); + // The names as they were when the round was PLAYED. `replay.fighters` was + // taken when the series opened, which in a versus fight is before the deal + // has dressed either seat — so the winner below could be somebody the demo + // never listed, and the store refused the round with "Invalid winner". + demo.fighters = players.map((player) => player.name); + demo.nations = players.map((player) => player.nation || ""); + demo.winner = players[0].score === players[1].score ? null + : players[0].score > players[1].score ? players[0].name : players[1].name; + demo.finalRoundWins = players.map((player) => player.roundWins); + delete demo.startedMonotonicUs; + const payload = JSON.stringify(demo); + // A dense reel demo is fat by design and never leaves the local shell; the + // half-megabyte gate is for demos headed to the production store. + const payloadLimit = globalThis.__oskiewarDenseReplay ? 8388608 : 524288; + if (payload.length <= payloadLimit && typeof saveReplay === "function") { + const upload = saveReplay(payload); + // Only promise-returning hosts can prove the upload completed. The web + // host does; older native hosts keep saving silently until they adopt the + // same acknowledgement contract. + if (upload && typeof upload.then === "function") + upload.then((saved) => { + if (saved !== true) return; + playDrum("modem", .72, 0); + telemetry("REPLAY", "uploaded " + demo.roundId); + }).catch((error) => telemetry("REPLAY", "upload-error " + error.message)); + telemetry("REPLAY", "queued " + demo.roundId + " bytes=" + payload.length); + } else telemetry("REPLAY", "not-saved bytes=" + payload.length); +} + +function finishReplay() { + if (replayPendingSaveFrame >= 0 && replay) { + replayPendingSaveFrame = -1; + uploadRoundReplay(runtime().monotonicUs); + } + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = null; +} + +function emitSignal(event, player = -1, value = 0, value2 = 0) { + // Filed first, and filed even while re-simulating: a rollback truncated + // these rows and the silent pass is what puts the corrected ones back. What + // the silence is for is the PERFORMANCE below — nobody hears a frame twice. + if (replay) replay.events.push([demoTick(runtime().monotonicUs), event, + player, Math.round(value * 1000) / 1000, Math.round(value2 * 1000) / 1000]); + if (netSilent) return; + if (typeof gameSignal === "function") gameSignal(event, player, value, value2); +} + +// Revision 37 exposes native bell/woosh voices in the mixer but its QuickJS +// allowlist predates those names. Fall back without stopping the match; newer +// hosts and the browser still receive the authored voice unchanged. +function playDrum(name, velocity = 1, pan = 0) { + if (performanceStageActive()) return; + if (netSilent || typeof drum !== "function") return; + try { + drum(name, velocity, pan); + } catch (error) { + if (name !== "bell" && name !== "whoosh") throw error; + if (name === "bell" && typeof synth === "function") { + try { synth(880, .12); } catch (_) {} + } + try { + drum(name === "bell" ? "hat" : "block", velocity * .65, pan); + } catch (_) {} + } +} + +function playSine(frequency, duration = .12) { + if (performanceStageActive()) return; + if (netSilent || typeof synth !== "function") return; + try { synth(frequency, duration); } catch (_) {} +} + +let clientError = ""; +let clientErrorDetail = null; +let clientErrorAt = -1; +let clientErrorQr = null; +let clientErrorDumpUrl = ""; + +function clientStateDump() { + try { + const run = runtime(); + return { + build: "v" + buildVersion, + shell: shellMode, + round: { + id: matchName || "local", + result: roundResult || "active", + elapsedMs: Math.round(roundElapsedUs / 1000), + }, + runtime: { + sim: Number(run?.simCount || 0), + paint: Number(run?.paintCount || 0), + unixMs: Number(run?.unixMs || 0), + }, + camera: { + x: Math.round(cameraCenter), y: Math.round(cameraCenterY), + width: Math.round(cameraWidth), aspect: Math.round(cameraAspect * 1000) / 1000, + }, + players: players.map((player) => ({ + handle: player.name, stance: player.stance, alive: player.alive, + x: Math.round(player.x), y: Math.round(player.y), z: Math.round(player.z), + vx: Math.round(player.vx), vy: Math.round(player.vy), + input: [player.inputX, player.inputY], + removed: player.removedParts?.slice() || [], + })), + balls: balls.filter((item) => item.active).map((item) => ({ + type: item.type, x: Math.round(item.x), y: Math.round(item.y), + vx: Math.round(item.vx), vy: Math.round(item.vy), heldBy: item.heldBy, + })), + }; + } catch (error) { + return { dumpError: String(error?.message || error || "state unavailable") }; + } +} + +function errorNowUs() { + try { + const value = Number(runtime()?.monotonicUs); + if (Number.isFinite(value)) return value; + } catch (_) {} + return 0; +} + +// btoa only speaks latin-1, so the dump flattens to ASCII before encoding. +function base64Url(text) { + if (typeof btoa !== "function") return ""; + return btoa(String(text).replace(/[^\x20-\x7e]/g, "?")) + .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +// The QR carries the entire dump in its own URL, so a crash stays shareable +// even when the console never managed to post its report. Fat fields drop +// away until the payload fits a code that is still scannable off a TV. +function buildClientErrorDump(detail) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + const stack = String(detail.stack || "").split(/\r?\n/).slice(0, 4) + .map((line) => line.trim()).filter(Boolean).join(" | ").slice(0, 240); + for (const trace of [stack, ""]) { + const url = errorDumpBase + base64Url(JSON.stringify({ + v: 1, p: detail.phase, n: detail.name, m: detail.message, + src: detail.source, k: trace || undefined, s: detail.state, + })); + if (url.length <= 2048 && typeof qrcode === "function") { + try { + clientErrorQr = qrcode(url, { errorCorrectLevel: 1 }); + clientErrorDumpUrl = url; + return; + } catch (_) {} + } + } +} + +function errorRestartSeconds() { + if (clientErrorAt < 0) return 0; + return Math.max(0, + Math.ceil((errorRestartUs - (errorNowUs() - clientErrorAt)) / 1000000)); +} + +// A crashed console should not sit on a dead screen forever. The error holds +// long enough to read and scan, then the piece boots itself again. +function restartAfterClientError() { + if (clientErrorAt < 0 || errorNowUs() - clientErrorAt < errorRestartUs) return; + clientError = ""; + clientErrorDetail = null; + clientErrorAt = -1; + clientErrorQr = null; + clientErrorDumpUrl = ""; + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + try { telemetry("SHELL", "error->restart"); } catch (_) {} + boot(); +} + +function errorSource(stack) { + const match = String(stack || "").match( + /(?:\(|\s|^)((?:[a-z]+:\/\/)?[^\s()]+):(\d+):(\d+)\)?/i); + return match ? { file: match[1], line: Number(match[2]), column: Number(match[3]) } + : null; +} + +function captureClientError(phase, error) { + if (clientErrorDetail) return; + const stack = error?.stack ? String(error.stack) : ""; + const message = error?.message ? String(error.message) + : String(error || "unknown error"); + const name = String(error?.name || "Error"); + const state = clientStateDump(); + clientErrorDetail = { + phase: String(phase || "runtime"), name, message, stack, + source: errorSource(stack), state, + reportStatus: "queued for server", + }; + const detail = stack || (name + ": " + message); + clientError = (clientErrorDetail.phase + ": " + detail) + .replace(/[^\x20-\x7e]+/g, " ").replace(/\s+/g, " ").trim(); + clientErrorAt = errorNowUs(); + try { buildClientErrorDump(clientErrorDetail); } catch (_) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + } + try { + telemetry("CLIENT_ERROR", JSON.stringify({ + phase: clientErrorDetail.phase, name, message, stack, + source: clientErrorDetail.source, state, + })); + } catch (_) { + clientErrorDetail.reportStatus = "local report only"; + } +} + +function clientErrorLines(text, limit = 58) { + const words = String(text).split(" "); + const lines = []; + let line = ""; + for (let word of words) { + if (word.length > limit) { + if (line) { lines.push(line); line = ""; } + while (word.length > limit) { + lines.push(word.slice(0, limit)); + word = word.slice(limit); + } + if (!word) continue; + } + if (!line) line = word; + else if (line.length + word.length + 1 <= limit) line += " " + word; + else { lines.push(line); line = word; } + } + if (line) lines.push(line); + return lines.slice(0, 9); +} + +function errorTypeWrite(text, x, y, size, ...color) { + try { + typeWrite(text, x, y, size, ...color); + } catch (_) { + // Error reporting must survive a font renderer failure of its own. + try { systemWrite(String(text).toLowerCase(), x, y, size, ...color); } + catch (_) {} + } +} + +// Diagnostic lines are dense, so every token gets its own ink: handles read as +// people, numbers as measurements, units as scale, and the rest as labels. +const dumpUnits = new Set(["px", "ms", "us", "fps", "vx", "vy", "vz", "in", + "stk", "pos", "vel", "t", "pts"]); + +function dumpTokens(text) { + return String(text).match(/@[a-z0-9_]+|[-+]?\d*\.?\d+|[a-z]+|\s+|./gi) || []; +} + +function dumpTokenInk(token) { + if (token[0] === "@") return [255, 126, 205]; + if (/^[-+]?[\d.]+$/.test(token)) return [116, 255, 184]; + if (/^[a-z]+$/i.test(token)) return dumpUnits.has(token.toLowerCase()) + ? [255, 205, 74] : [188, 204, 230]; + return [112, 234, 255]; +} + +function writeTokens(write, text, x, y, size) { + let cursor = x; + for (const token of dumpTokens(text)) { + if (token.trim()) write(token, cursor, y, size, ...dumpTokenInk(token)); + cursor += handleWidth(token, size); + } +} + +const writeDumpLine = (text, x, y, size) => + writeTokens(errorTypeWrite, text, x, y, size); + +// The HUD sits over sky and ground, so each token carries its own contrast +// shadow the way a handle glyph does. +function writeHudLine(text, x, y, size) { + writeTokens((token, tx, ty, ts, ...color) => + typeWrite(token, tx + 3, ty + 4, ts, ...runShadow(color)), + text, x, y, size); + writeTokens(typeWrite, text, x, y, size); +} + +function errorReportStatus() { + try { + const status = String(runtime()?.clientErrorReportStatus || "").trim(); + if (status) return status; + } catch (_) {} + return clientErrorDetail?.reportStatus || "queued for server"; +} + +function stateDumpRows(state) { + if (!state) return [{ icon: "mode", text: "state unavailable" }]; + if (state.dumpError) + return [{ icon: "mode", text: "state unavailable: " + state.dumpError }]; + const playerRow = (player, index) => ({ icon: "player", + text: "p" + (index + 1) + " " + player.handle + " " + + player.stance.toLowerCase() + " pos " + player.x + "," + player.y + + "," + player.z + " vel " + player.vx + "," + player.vy + + (player.removed?.length ? " lost " + player.removed.join(",") : "") }); + return [ + { icon: "build", text: "build " + state.build }, + { icon: "mode", text: "mode " + state.shell.toLowerCase() + + " round " + state.round.id + " " + state.round.result.toLowerCase() + + " " + state.round.elapsedMs + "ms" }, + { icon: "camera", text: "camera " + state.camera.x + "," + state.camera.y + + " width " + state.camera.width + " aspect " + state.camera.aspect }, + ...(state.players || []).map(playerRow), + { icon: "ball", text: "balls " + (state.balls || []).map((ball) => + ball.type + "@" + ball.x + "," + ball.y + " v" + ball.vx + "," + ball.vy) + .join(" ") }, + ]; +} + +const dumpIconInk = { build: [116, 128, 156], mode: [255, 205, 74], + camera: [112, 214, 255], player: [206, 166, 255], ball: [116, 255, 184] }; + +function drawDumpIcon(kind, x, y, size) { + const ink = dumpIconInk[kind] || [112, 234, 255]; + const unit = Math.max(2, Math.round(size / 9)); + try { + if (kind === "build") + for (let row = 0; row < 3; row++) + hudBox(x, y + row * unit * 3, size - row * unit * 2, unit * 2, ...ink); + else if (kind === "camera") { + strokeBox(x, y + unit, size, size - unit * 2, unit, ink); + hudBox(x + unit * 3, y + unit * 3, size - unit * 6, size - unit * 6, ...ink); + } else if (kind === "player") { + hudBox(x + unit * 2, y, size - unit * 4, unit * 3, ...ink); + hudBox(x, y + unit * 4, size, size - unit * 4, ...ink); + } else if (kind === "ball") { + hudBox(x + unit * 2, y, size - unit * 4, size, ...ink); + hudBox(x, y + unit * 2, size, size - unit * 4, ...ink); + } else strokeBox(x, y, size, size, unit, ink); + } catch (_) {} +} + +// Sized for a phone pointed at a television, so modules stay chunky and the +// state dump wraps narrower to keep clear of the code. +function errorQrGeometry(width, height) { + if (!clientErrorQr || typeof clientErrorQr.getModuleCount !== "function") + return null; + const count = clientErrorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor(Math.min(width * .3, height * .52) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + return { count, quiet, cell, size, + left: width - 92 - size, top: height - 96 - size }; +} + +// Drawn with raw boxes rather than the projected screenRect the HUD uses — +// the triangle pipeline is exactly what may have just died. Dark modules +// coalesce into horizontal runs so a full code stays a few hundred draws. +function drawErrorQr(qr) { + if (!qr) return; + hudBox(qr.left, qr.top, qr.size, qr.size, 250, 250, 247); + for (let row = 0; row < qr.count; row++) { + let run = 0; + for (let column = 0; column <= qr.count; column++) { + if (column < qr.count && clientErrorQr.isDark(row, column)) { run++; continue; } + if (run) hudBox(qr.left + (column - run + qr.quiet) * qr.cell, + qr.top + (row + qr.quiet) * qr.cell, run * qr.cell, qr.cell, 7, 8, 14); + run = 0; + } + } +} + +// Same two-digit face as the round timer, reddening as the restart lands. +function drawErrorCountdown(width) { + const remaining = errorRestartSeconds(); + const text = String(Math.min(99, remaining)).padStart(2, "0"); + const danger = remaining <= 10; + const shake = danger + ? Math.sin(errorNowUs() / 1000000 * 35) * (11 - remaining) * .45 : 0; + let textWidth = 64; + try { textWidth = handleWidth(text, 52); } catch (_) {} + errorTypeWrite(text, width - 92 - textWidth + shake, 82, 52, + ...(danger ? [255, 92, 116] : [255, 205, 74])); +} + +function drawClientError() { + let width = 1920; + let height = 1080; + try { + const view = typeof gameView === "function" ? gameView() : null; + if (view && Number.isFinite(view.width)) width = view.width; + if (view && Number.isFinite(view.height)) height = view.height; + } catch (_) {} + const detail = clientErrorDetail || { + phase: "runtime", name: "Error", message: clientError, + stack: "", source: null, state: null, + }; + const qr = errorQrGeometry(width, height); + wipe(7, 9, 18); + box(48, 48, width - 96, height - 96, 30, 14, 27); + errorTypeWrite("the game needs a moment", 92, 82, 52, 255, 92, 116); + drawErrorCountdown(width); + errorTypeWrite("restarting safely", 94, 158, 31, 255, 205, 74); + const messageLines = clientErrorLines(detail.message, 66).slice(0, 2); + for (let index = 0; index < messageLines.length; index++) + errorTypeWrite(messageLines[index], 94, 226 + index * 42, + 31, 248, 244, 255); + let cursorY = 226 + messageLines.length * 42 + 28; + if (detail.source) { + errorTypeWrite("source", 94, cursorY, 29, 112, 234, 255); + errorTypeWrite(detail.source.file, 214, cursorY, 29, 190, 216, 255); + errorTypeWrite("line " + detail.source.line + " column " + detail.source.column, + Math.min(width - 430, 214 + detail.source.file.length * 17), cursorY, + 29, 116, 255, 184); + cursorY += 48; + } + errorTypeWrite("state dump", 94, cursorY, 29, 116, 255, 184); + cursorY += 42; + for (const row of stateDumpRows(detail.state).slice(0, 6)) { + let leading = true; + for (const wrapped of clientErrorLines(row.text, qr ? 68 : 78).slice(0, 2)) { + if (cursorY > height - 196) break; + if (leading) drawDumpIcon(row.icon, 94, cursorY + 4, 22); + writeDumpLine(wrapped, 132, cursorY, 27); + cursorY += 36; + leading = false; + } + } + drawErrorQr(qr); + if (qr) errorTypeWrite("scan to share this dump", + qr.left, qr.top - 42, 27, 116, 255, 184); + const report = errorReportStatus(); + const posted = report.startsWith("posted"); + errorTypeWrite(report, 94, height - 150, 30, + ...(posted ? [116, 255, 184] : [255, 205, 74])); + errorTypeWrite("relaunch or deploy an update", 94, height - 104, + 30, 190, 202, 230); +} + +function drawClientErrorFallback() { + try { wipe(7, 9, 18); } catch (_) {} + try { systemWrite("aesthetic.computer error", 72, 72, 48, 255, 92, 116); } catch (_) {} + try { systemWrite(errorReportStatus(), 72, 146, 30, 255, 205, 74); } catch (_) {} + try { + systemWrite("restart in " + errorRestartSeconds() + "s", 72, 200, 30, + 255, 205, 74); + } catch (_) {} +} + +function fighterProfile(handle) { + const live = Array.isArray(acFeed.fighters) + ? acFeed.fighters.find((profile) => profile.handle.toUpperCase() === handle.toUpperCase()) + : null; + const fallback = handle === "DUMMY" ? npcFighter + : handle === "SPIDERDUMMY" ? spiderDummyFighter + : handle === "BOT" ? botFighter + : selfPlayFighters.find((profile) => profile.handle === handle) || + fighterRoster.find((profile) => profile.handle === handle); + return { + mood: live?.mood || (handle === "@JEFFREY" && acFeed.moodHandle === "@jeffrey" + ? acFeed.mood : "") || fallback?.mood || "", + lastChat: live?.lastChat || fallback?.lastChat || "", + colors: live?.colors?.length + ? live.colors.map((color) => [color.r, color.g, color.b]) + : fallback?.colors || [], + }; +} + +function syncSignedInFighter() { + if (localVersusActive()) return; + const identity = acFeed?.player; + if (!identity?.handle || players[0].npc) return; + const handle = String(identity.handle).toUpperCase(); + if (players[0].name !== handle) players[0].name = handle; + const colors = Array.isArray(identity.colors) + ? identity.colors.map((color) => Array.isArray(color) + ? color.slice(0, 3) : [color.r, color.g, color.b]) + .filter((color) => color.every(Number.isFinite)) : []; + if (colors.length) { + players[0].handleColors = colors; + players[0].color = colors.reduce((sum, color) => sum.map((value, index) => + value + color[index] / colors.length), [0, 0, 0]).map(Math.round); + } +} + +function applyRoster(player, index) { + if (localVersusActive()) { + player.rosterIndex = [0, 2, 1][player.pad]; + player.name = "PLAYER " + (player.pad + 1); + player.color = fighterRoster[player.rosterIndex].color.slice(); + player.handleColors = []; + return; + } + if (player.npc) { + const fighter = selfPlay && player.bot ? selfPlayFighters[player.pad] + : player.bot ? botFighter + : player.spiderDummy ? spiderDummyFighter : npcFighter; + player.rosterIndex = -1; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = fighter.colors; + if (selfPlay && player.bot) { + // The color IS the nameplate: a self-play bot is called what it wears, + // so the card reads "CORAL WINS ROUND" and the demo carries the color + // name out to any replay that wants to dress the fighter again. The + // harness may force the first seat's color by name for a proof bout. + const forcedName = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const forcedWorn = player.pad === 0 && forcedName && + cssColorBook.find((entry) => entry.name === forcedName); + const dressed = forcedWorn || selfPlayWardrobe(player.pad); + player.color = dressed.rgb.slice(); + player.colorName = dressed.name; + player.name = dressed.name.toUpperCase(); + } + return; + } + if (player.pad === 0 && !acFeed?.player?.handle) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + // A test harness may dress the anonymous seat by CSS color name — + // "YELLOW vs DUMMY" is a scripted sonic and orientation proof, so the + // fighter's look has to be as reproducible as the fight. + const forced = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const worn = forced && cssColorBook.find((entry) => entry.name === forced); + if (worn) { + player.name = worn.name.toUpperCase(); + player.color = worn.rgb.slice(); + player.handleColors = []; + } + return; + } + // A negative index means there is no roster fighter here — an anonymous + // seat, or a remote one whose handle has not arrived. It used to wrap: -1 + // came out as the LAST roster entry, so an unnamed chair was dressed as a + // real person, and `Math.max(0, rosterIndex)` at the two versus callers + // floored it to the FIRST one instead. Between them an anonymous fight read + // as @JEFFREY against @SAT. Nobody is nobody. + if (index < 0) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + return; + } + const rosterIndex = index % fighterRoster.length; + const fighter = fighterRoster[rosterIndex]; + const profile = fighterProfile(fighter.handle); + player.rosterIndex = rosterIndex; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = profile.colors; +} + +// The one door into a fight. Training is free and anonymous — it is the front +// door and must never ask for anything, and `trainingbot` is that door's +// sparring partner: the bot's brain in a round that stays off the wire. Bot +// and ppl are what a handle buys, because they persist: a series, a published +// match, a replay, a ranking. Nothing opens those two doors yet, so only +// training reaches here and this call asks for nothing. +// +// The seam the sign-in actually landed on is `versusAllowed()`, because versus +// is the door that opened first: see `startVersusFight`. When bot and ppl open, +// they gate here on the same reader. +function startFightAgainst(kind, now) { + if (kind !== "local") setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + players[0].spawnX = tileCenterX(spawnColLeft); + players[1].spawnX = tileCenterX(spawnColRight); + if (players[2]) players[2].spawnX = tileCenterX((spawnColLeft + spawnColRight) / 2); + const opponent = players[1]; + fightOpponent = kind; + opponent.npc = kind === "dummy" || kind === "spiderdummy" || + kind === "bot" || kind === "trainingbot"; + opponent.bot = kind === "bot" || kind === "trainingbot"; + opponent.spiderDummy = kind === "spiderdummy"; + opponent.remote = false; + // Pad two is @OSKIE until ppl arrives carrying a handle of its own. + applyRoster(opponent, opponent.npc ? -1 : 2); + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + startReplay(now); + resetRound(now, true); + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +function survivalRequested() { + // The climb is a door asked for by name, and only by name. It used to be + // the empty door on any shell that could not raise the versus flag — the + // native consoles, whose publisher reads the relay and discards — which + // left the Xbox opening on the climb every boot. @jeffrey, on the console: + // "i dont like the climbing mode / map ... i want it in vs / dummy mode". + // So where versus cannot happen the empty door is the training fight + // (`beginTraining`, a sparring partner on the floor), the same landing the + // web gets when the relay is out of reach. + return String(globalThis.__oskiewarOpponent || "") + .trim().toLowerCase() === "survival"; +} + +const localVersusActive = () => fightOpponent === "local"; +// The web shell marks a pad `localController` when a physical gamepad is +// behind it; the console's pad object (QuickJsEngine PadObject) never +// carried the field, so `localControllerPair()` was false on the Xbox with +// three controllers plugged in and the dummy's chair never went to player +// two — @jeffrey, 2026-09-20: "it only sees one controller hmm". The native +// pad object carries no name or id either (PadObject: index, connected, +// sticks, triggers, down). What the console does have is `controllers()`, +// its enumeration of real hardware — a pad whose index sits inside that +// list is a local controller. The test harness stubs `gamepad` with two +// always-connected pads and defines no `controllers`, so its fights stay +// what they were; "connected" alone turned every harness fight into local +// versus (131 tests). +let nativeControllerCount = 0; +let nativeControllerPolls = 0; +function samplePad(index) { + let pad; + try { pad = gamepad(index); } catch (error) { + if (index < 2) throw error; + } + if (!pad) pad = { connected: false, down: [], leftX: 0, leftY: 0 }; + if (pad && pad.localController === undefined && pad.connected === true && + typeof controllers === "function") { + // Re-enumerate about twice a second; a pad joining mid-title waits at + // most that long for its chair. + if (index === 0 && nativeControllerPolls++ % 30 === 0) + nativeControllerCount = controllers().length; + if (index < nativeControllerCount) pad.localController = true; + } + return pad; +} +const localControllerPair = () => + padSnapshots.slice(0, 2).every((pad) => pad?.localController === true); +let localControllerPairSeen = false; +let localControllerMissing = -1; + +function startLocalVersus(now) { + finishReplay(); + fightOpponent = "local"; + setLocalPlayerCount(padSnapshots[2]?.localController === true ? 3 : 2); + telemetry("FIGHT_LOCAL_PLAYERS", String(players.length)); + for (const player of players) { + player.npc = false; + player.bot = false; + player.spiderDummy = false; + player.remote = false; + } + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + localControllerMissing = -1; + globalThis.__oskiewarVersusRoom = ""; + gameSpeed = 1; + startFightAgainst("local", now); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); +} + +function updateLocalVersus(now) { + const paired = localControllerPair(); + const arrived = paired && !localControllerPairSeen; + localControllerPairSeen = paired; + // A second local pad must never take over a remote fight or a recording. + if (roundViewer || netSession || selfPlay || resimActive || versusActive()) + return false; + if ((arrived && !localVersusActive()) || + (localVersusActive() && paired && players.length === 2 && + padSnapshots[2]?.localController === true)) startLocalVersus(now); + if (!localVersusActive()) { localControllerMissing = -1; return false; } + if (!paired || players.some((player) => + padSnapshots[player.pad]?.localController !== true)) { + localControllerMissing = padSnapshots.slice(0, players.length).findIndex( + (pad) => pad?.localController !== true); + return true; + } + if (localControllerMissing !== -1) { + localControllerMissing = -1; + // Restart the interrupted round with the match tally intact. Absolute + // attack/death timers cannot safely resume after an arbitrary unplug. + if (matchOver) startLocalVersus(now); + else resetRound(now, false, true); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); + } + return false; +} + +function versusRequested() { + return !String(globalThis.__oskiewarOpponent || "").trim() && + globalThis.__oskiewarVersusCapable === true; +} + +// --------------------------------------------------------------------------- +// The door. @jeffrey: "i think we should require users to axtually login in +// order to play... and also to make a handle in order to play". +// +// Training stays free and anonymous — it is the front door and must never ask +// for anything — and so does watching: the link a friend sends has to work for +// whoever opens it, account or no account. What a handle buys is the half of +// the game with another person on the other end of it, because that half is +// the half that persists. A fight against a stranger called RIVAL is not worth +// having; those placeholder names were the symptom, not the problem. +// +// The shell owns the account and the panel; this file owns the question of +// when the door is in the way. Two globals carry it: +// +// __oskiewarAccount { ready, signedIn, handle, colors } shell → game +// __oskiewarAccountDoor "" | "login" | "handle" game → shell +// The door is built, tested and wired on both sides, and it is held open until +// the tenant can actually let somebody through it. Native sign-in needs +// "Passwordless OTP" ticked on the Auth0 application, and as of 26.09.11 the +// tenant answers `unauthorized_client` — so the only way in is the redirect, +// which lands on the Universal Login page's Turnstile, which is the loop this +// whole flow exists to avoid. Requiring an account before there is a working +// way to make one does not gate the game, it closes it. +// +// Flip this to true the moment that grant is on. Everything behind it is +// already written and covered by tests, which drive it through +// `setVersusRequiresAccount`. +let versusRequiresAccount = false; + +const webAccountState = () => globalThis.__oskiewarAccount || null; +// Nobody is turned away before the shell has finished asking. A silent session +// check takes a moment, and a door that flashed up inside it would send a +// signed-in player off to sign in again. +const accountReady = () => webAccountState()?.ready === true; +const accountHandle = () => String(webAccountState()?.handle || ""); +// A shell with no account system at all is not a locked-out visitor, it is an +// older build, and it must not be left standing in a waiting room that can +// never start. The two halves of this door — the panel over there, the refusal +// here — ship together, and until the shell offers one there is nothing for +// this to hold shut. +// +// Which is the honest shape of it: this is a door, not a lock. The name on the +// wire has always been whatever the client says it is, and a console can set +// any global it likes. Enforcement would mean the relay verifying a token on +// the seat, and that is a different piece of work. +const versusAllowed = () => !versusRequiresAccount || !webAccountState() || + (accountReady() && webAccountState().signedIn === true && + Boolean(accountHandle())); + +// Which door, if any, stands between this visitor and a fight. Empty while the +// shell is still asking, and empty for anyone already through. +function versusDoor() { + if (!versusRequiresAccount) return ""; + if (!webAccountState() || !accountReady()) return ""; + if (webAccountState().signedIn !== true) return "login"; + if (!accountHandle()) return "handle"; + return ""; +} + +// Raised only while somebody is actually trying to play a person: standing in +// the waiting room, or holding a chair. A spectator is never asked for +// anything, and neither is the title screen. +// What this file last asked the shell for, so a panel that closes on its own +// can be told from one that was never open. +let accountDoorAsked = ""; + +function updateAccountDoor() { + const wanted = shellMode === "GAME" && versusLane() && !roundViewer + ? versusDoor() : ""; + const showing = globalThis.__oskiewarAccountDoor || ""; + // "never mind" drops every request the panel is holding, this one included. + // Left alone, the next frame would simply ask again and the panel would + // spring back up — which is not a dismissal, it is a trap. Somebody who + // backs out goes to the title screen instead, where the account button + // lives, where training is one press away, and where nothing is asking them + // for anything. + if (accountDoorAsked && wanted && !showing) { + accountDoorAsked = ""; + returnToTitle(runtime().monotonicUs, "account"); + return; + } + if (showing !== wanted) globalThis.__oskiewarAccountDoor = wanted; + accountDoorAsked = wanted; +} + +function startSurvivalRun(now, botControlled = false) { + gameMode = "survival"; + selfPlay = botControlled; + fightOpponent = "survival"; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + finishReplay(); + + const runner = players[0]; + runner.spawnX = centerX; + runner.npc = botControlled; + runner.bot = botControlled; + runner.spiderDummy = false; + applyRoster(runner, botControlled ? -1 : Math.max(0, runner.rosterIndex)); + + const absent = players[1]; + absent.spawnX = tileCenterX(cornerColRight); + absent.npc = true; + absent.bot = false; + absent.spiderDummy = false; + absent.remote = false; + applyRoster(absent, -1); + + resetRound(now, true); + absent.alive = false; + absent.respawnAt = Infinity; + absent.x = worldRight + gridWidth; + absent.y = floorY; + survivalStartedAt = now + survivalIntroDurationUs; + survivalLavaY = survivalLavaStart; + survivalHeight = 0; + survivalPeakLevel = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; + cameraWidth = survivalFrameWidth; + cameraContainFloor = 0; + cameraDoll.snap({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, + z: -survivalFrameWidth * 1.35 }, + width: survivalFrameWidth, perspective: 0, fov: 55, roll: 0 }); + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + pickup.active = false; + for (const item of balls) item.active = false; + emitSignal("survival", 0, 1, 0); +} + +// The title is a frozen first foothold, not an attract fight. START resets the +// runner and the lava together, so nobody loses a run beneath the wordmark. +function beginSurvival(now) { + setLocalPlayerCount(2); + startSurvivalRun(now, false); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - survivalIntroDurationUs; + survivalStartedAt = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; +} + +// Whatever you land on is already a live training fight; the wordmark simply +// floats over it. The intro countdown is spent before the first frame so +// somebody arriving from a QR code is moving, not watching a number. +function beginTraining(now) { + setLocalPlayerCount(2); + startFightAgainst(trainingOpponentKind(), now); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - roundIntroDurationUs(); + const forcedAttract = globalThis.__oskiewarAttractVariant; + titleAttractMode = forcedAttract === "still" || forcedAttract === "action" + ? forcedAttract : hashUnit(matchName) < .5 ? "still" : "action"; + if (titleAttractMode === "action") { + // The title demonstration is a bot working a training dummy, not two + // anonymous red bots. Preserve the dummy's cool neutral material so the + // matchup is legible before START is pressed. + players[0].npc = true; + players[0].bot = true; + players[0].spiderDummy = false; + applyRoster(players[0], -1); + players[1].npc = true; + players[1].bot = false; + players[1].spiderDummy = false; + applyRoster(players[1], -1); + } +} + +// The versus lobby: one fighter, an empty chair, and the address as the +// invitation. Everything a visitor can do here is practice — their own moves +// are named back at them — until the relay seats a rival, at which point +// updateVersusSeat opens the real fight. The empty chair is parked out past +// the wall the way survival parks it, so the camera, the scorekeeping and +// the reactions all read a one-body room. +function beginVersusLobby(now, { title = false } = {}) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus-lobby"; + finishReplay(); + seriesName = ""; + matchName = ""; + previousRoundName = ""; + if (!versusRoomName) versusRoomName = sessionName; + globalThis.__oskiewarVersusRoom = versusRoomName; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const chair = players[1]; + chair.spawnX = tileCenterX(spawnColRight); + chair.npc = true; + chair.bot = false; + chair.spiderDummy = false; + chair.remote = false; + applyRoster(chair, -1); + selecting = false; + shellMode = title ? "MENU" : "GAME"; + gameplayStarted = !title; + titleTransitionAt = null; + resetRound(now, true); + chair.alive = false; + chair.respawnAt = Infinity; + chair.x = worldRight + gridWidth; + chair.y = floorY; + // An empty chair wears no dummy's name — the wire calls it NOBODY. And the + // room forgets who was last in it, so the next person to sit down is dressed + // from their own offer rather than inheriting the last one's. + chair.name = ""; + versusRivalName = ""; + versusRivalOffered = ""; + // Spend the countdown before the first frame: arriving is moving, and + // there is nobody here to count in against anyway. + roundStartedAt = now - roundIntroDurationUs(); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + versusRoomName) : null; + emitSignal("versus-lobby", 0, 1, 0); +} + +// A rival took the chair. Seat them as a real second fighter — no bot brain, +// no npc stillness, their presses riding in off the relay — and open the +// round with the full countdown so both screens see the same three seconds. +function startVersusFight(now, resetMatch = true) { + // The one gate that matters: this is the call that puts two people in a + // round. Everything below it — publishing, the seat, the score — assumes + // both ends have a name worth writing down. + if (!versusAllowed()) return; + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus"; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const rival = players[1]; + rival.spawnX = tileCenterX(spawnColRight); + rival.npc = false; + rival.bot = false; + rival.spiderDummy = false; + rival.remote = true; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + // A fresh match is a fresh series, and a versus series is now recorded like + // any other. A round rollover inside a match keeps the one it has. + if (resetMatch) startReplay(now); + resetRound(now, resetMatch); + dressVersusRival(); + if (resetMatch && versusRecorder() && typeof analytics === "function") { + analytics("match_started", { + source_system: "browser", + surface: "web", + opponent_type: "remote-player", + }); + } + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +// What the rival is called and what they wear, read off the freshest input +// frame — the challenger mails their handle and colors with every press, so +// a name arriving late still lands. The relay already shape-checked both; +// the sanitize here is for the state schema's sake, because one bent name +// would cost every published frame. +function dressVersusRival() { + if (netSession) { netApplyIdentities(netSession.deal); return; } + const rival = players[1]; + if (!rival.remote) return; + const remote = globalThis.__oskiewarRemotePad; + const offered = versusOfferedName(); + versusRivalOffered = offered; + versusRivalName = /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : ""; + rival.name = versusRivalName; + const colors = (Array.isArray(remote?.colors) ? remote.colors : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)); + if (colors.length) { + rival.handleColors = colors; + rival.color = colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); + } else { + rival.handleColors = []; + rival.color = [38, 82, 176]; + } +} + +// The versus lane's own wire: one room, streamed faster than a grandstand +// needs because for the challenger this feed IS the game. It runs from the +// title screen on — a friend can arrive while the host is still reading the +// wordmark — and rides the same publisher socket the round rooms use. +function publishVersus(now) { + // Both seats simulate, but only the host narrates: the grandstand keeps + // the stream it always had, and the challenger never races the host for + // the room's one publisher socket. + if (netSession && netSession.seat !== 0) return; + if (netSilent || !versusLane() || !versusRoomName || livePublishFailed || + typeof publishLive !== "function") return; + // A waiting room nobody can be invited into is not a room. Publishing it + // would put it in front of the matchmaker as a chair to take. + if (!versusAllowed()) return; + // Paced on the WALL clock, not the simulation's. The driver runs up to four + // owed ticks in one instant to catch up, and a sim-clocked gate let every + // one of those emit its own frame — two or three full state builds in the + // same millisecond, arriving at the relay as a burst it can only coalesce. + // Catch-up is exactly when the fight is busiest, so the cost landed where + // there was least room for it. Wall time makes a burst one frame. + const wall = runtime().unixMs || 0; + if (wall && wall < versusNextAt) return; + versusNextAt = wall + versusSnapshotIntervalMs; + try { + publishLive("ow-" + versusRoomName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// Two visitors can arrive through the same dead address and both decide to +// host it. The relay lets exactly one publish; the other's shell hears "this +// match already has a publisher" and raises a flag, and this walks that +// loser back into the room as a challenger through the bridge it kept. +function updateVersusConflict(now) { + if (!versusLane() || !versusFallbackBridge) return false; + if (globalThis.__oskiewarPublishConflict !== "ow-" + versusRoomName) + return false; + globalThis.__oskiewarPublishConflict = ""; + const bridge = versusFallbackBridge; + versusFallbackBridge = null; + bridge.role = "challenger"; + roundViewer = bridge; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + roundResult = ""; + matchOver = false; + matchName = bridge.name || ""; + roundStartedAt = now - roundIntroDurationUs(); + roundViewerStop = bridge.start(handleRoundViewer); + telemetry("VERSUS_CONFLICT", versusRoomName); + return true; +} + +// The seat, watched every tick. Fresh presses in the lobby open the fight; +// a wire gone quiet mid-fight sends the room back to waiting. The rival's +// wardrobe follows their freshest frame because the handle can arrive after +// the chair was taken. +function updateVersusSeat(now) { + if (netSession) return; + if (updateVersusConflict(now)) return; + if (!versusLane()) return; + // A rival who can roll back says so on the net channel. Their first pad + // usually lands first, so the offer is taken here rather than only from + // the lobby — a streamed fight one second old is upgraded in place. + if (netPeerHello && netHostBegin(now)) return; + const fresh = versusChallengerFresh(); + if (lobbyActive() && fresh && versusAllowed()) { + startVersusFight(now, true); + return; + } + if (versusActive() && !fresh) { + beginVersusLobby(now); + return; + } + if (versusActive() && fresh && versusOfferedName() !== versusRivalOffered) + dressVersusRival(); +} + +// A dead body falling. No input, no collision with anybody, no ledges: a +// corpse is not a fighter and must not catch a rung it would have caught +// alive. It drops, it lands on the ground under it, and it stops. +function settleCorpse(player, dt) { + if (player.grounded) return; + player.vy += fallGravity() * dt; + player.x += player.vx * dt; + player.y += player.vy * dt; + player.vx *= .96; + const terrainY = terrainFloorAt(player.x); + if (player.y < terrainY) return; + player.y = terrainY; + player.vy = 0; + player.vx = 0; + player.grounded = true; +} + +// Lobby deaths have a respawn beat, but no round or killcam to reset state. +function updateLobbyMortality(now) { + if (!lobbyActive()) return; + const player = players[0]; + if (player.alive && hasPart(player, "torso")) return; + if (player.lobbyDeathDressed) return; + if (player.alive) { + player.alive = false; + player.lastButton = "DESTROYED"; + player.lastButtonAt = now; + spawnImpact({ x: player.x, y: player.y - 60, z: player.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(player)); + } + player.lobbyDeathDressed = true; + player.respawnAt = Math.max(player.respawnAt || 0, now + 2500000); + releaseCarriedBall(player, now); + releaseCarriedPart(player, now); + releaseCarriedFighter(player, now); + dismountSkateboard(player, now); + player.attackKind = player.itemAction = ""; + player.attackUntil = player.itemActionUntil = player.dashUntil = 0; + player.attackHit = player.blocking = player.grabHeld = false; + player.pounding = player.pogoDive = player.pogoHit = false; + player.jumpHeld = false; + player.runSince = player.walkSince = 0; + player.jumpPoseUntil = player.landPoseUntil = player.hopUntil = 0; + player.inputX = player.inputY = player.vx = 0; + player.stance = "HIT"; + delete player.frozenGeometry; + delete player.frozenAt; + deathCinematic = null; +} + +// Deprecated with PAL_SELECT — see the flag. +function beginSelect(now) { + selecting = true; + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + selectionReady[1] = false; + selectionPrevious[0] = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + roundResult = ""; + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + fightHitMarks.length = 0; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) + for (const mark of globalThis.__oskiewarFightHitForecast) + fightHitMarks.push({ at: clamp(Number(mark.at) || 0, 0, 1), + color: Array.isArray(mark.color) ? mark.color.slice(0, 3) : [226, 42, 66], + decisive: mark.decisive === true }); + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + roundStartedAt = now; + for (const player of activePlayers()) { + player.roundWins = 0; + player.score = 0; + player.alive = true; + } +} + +function returnToTitle(now, reason = "back") { + finishReplay(); + if (survivalActive()) beginSurvival(now); + else if (versusLane()) beginVersusLobby(now, { title: true }); + else beginTraining(now); + // Menu is a hard navigation boundary: discard the prior fight's zoom and + // right-stick diorama angle before the very first title frame is painted. + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + // The lobby frames its one fighter — the empty chair is parked past the + // wall, and averaging it in would sling the lens a map-width off stage. + cameraCenter = survivalActive() ? (worldLeft + worldRight) / 2 + : lobbyActive() ? players[0].x + : (players[0].x + players[1].x) / 2; + cameraCenterY = survivalActive() ? floorY - 240 + : lobbyActive() ? players[0].y - 90 + : (players[0].y + players[1].y) / 2 - 90; + cameraWidth = survivalActive() ? survivalFrameWidth + : lobbyActive() ? 980 + : Math.max(980, Math.abs(players[1].x - players[0].x) + 760); + cameraContainFloor = 0; + const cameraTarget = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.snap({ target: cameraTarget, + position: { x: cameraCenter, y: cameraCenterY, + z: -cameraWidth * 1.2 }, + width: cameraWidth, perspective: 0, fov: 55, roll: 0 }); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[0] = shellPrevious.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + playDrum("block", .8, 0); + telemetry("SHELL", "game->title " + reason + " " + now); +} + +// A mechanical test drives both fighters with the same bot and says so on the +// nameplates, instead of flying a handle nobody is holding. Entered through +// `__oskiewarSelfPlay` before boot or by calling this — never from a button, +// so normal play cannot fall into it. +function startSelfPlay(now) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = true; + // The harness is not the free door. A self-play run armed from a live title + // inherits whatever training was seated, and leaving that behind would keep + // the whole mechanical test off the wire — no demo, no rollover. + fightOpponent = ""; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of activePlayers()) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.remote = false; + player.rosterIndex = -1; + } + // The reel harness may seat the training dummy in the second chair — a + // scripted "COLOR vs DUMMY" proof bout. The dummy has no bot AI, so the + // timed-training flag keeps the round on the clock it would otherwise + // drop. + if (globalThis.__oskiewarSelfPlayOpponent === "dummy") + players[1].bot = false; + startReplay(now); + resetRound(now, true); + // No dealt equipment. The cube's blade and pistol wait on their floor + // tiles in self-play exactly as they do in a live match, and the bots arm + // themselves by walking over them — or don't. + // The bots' dice are seeded off the round clock, which a re-simulation + // cannot reproduce — so a dense demo carries the seeds themselves, and a + // replayed sim rolls exactly what the live pass rolled. Spawns ride along + // for the same reason: the fight can only rerun from where it stood. + if (replay && replayCheckpointUs() < 100000) { + replay.botSeeds = players.map((player) => player.botRngState >>> 0); + replay.spawns = players.map((player) => Math.round(player.spawnX)); + // Animation runs off the page-boot clock, and limb pose decides where a + // strike lands — a rerun needs the same phase or contacts wander. + replay.posePhaseUs = Math.round(now - startedAt); + } +} + +// Re-simulation: the offline renderer's honest path. Instead of puppeting +// recorded state, the page reruns the ACTUAL fight — same name stream, same +// ball, same bot dice — through the real simulation at the fixed step. Every +// limb tint, item drop, and debris mote is the engine's own, in the current +// build, with nothing lost to the demo schema. State checkpoints remain as a +// drift meter, not as the picture. +let resimActive = false; +// Whether the demo being re-run was a round on a clock. Versus rounds are not, +// and handing one a countdown it never had would end the re-run early on a +// fight the original played past. Demos recorded before this field carry no +// answer and were all timed. +let resimTimed = true; +let resimPending = null; +let resimTick = -1; +let resimCheckpoints = null; +let resimCommands = null; +let resimFirstRowTick = 0; +let resimCommandCursor = 0; +let resimMask = [0, 0]; + +// The inverse of `inputCommand`: a recorded mask back into the pad shape the +// sim reads. Replaying the live pass's actual inputs — instead of letting +// bot AI re-decide — pins every action to its recorded tick, which is what +// keeps the rerun's hits on the audio's timestamps. +function resimPad(pad) { + const mask = resimMask[pad] || 0; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + return { connected: true, down, leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; +} + +function advanceResimCommands() { + if (!resimCommands) return; + while (resimCommandCursor < resimCommands.length && + resimCommands[resimCommandCursor][0] <= resimTick) { + const [, pad, mask] = resimCommands[resimCommandCursor]; + resimMask[pad] = mask; + resimCommandCursor++; + } +} +function startResim(demo, now) { + configureWorldMap(demo.map); + gameMode = "fight"; + resimActive = true; + resimTimed = demo.timed !== false; + // The reset step is demo tick zero; every later sim step counts one. + resimTick = 0; + resimCheckpoints = new Map( + (demo.checkpoints || []).map((row) => [row[0], row])); + resimFirstRowTick = demo.checkpoints?.[0]?.[0] ?? 0; + resimCommands = demo.commands || null; + resimCommandCursor = 0; + resimMask = [0, 0]; + globalThis.__oskiewarResimDrift = { ticks: 0, maxDrift: 0, atTick: 0 }; + selfPlay = true; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of players) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.rosterIndex = -1; + } + if (demo.fighters?.[1] === "DUMMY") players[1].bot = false; + // A forced first-seat color survives in the demo as the fighter's own + // name, so the rerun dresses itself without being told. + const worn = String(demo.fighters?.[0] || "").toLowerCase(); + if (cssColorBook.some((entry) => entry.name === worn)) + globalThis.__oskiewarWardrobe = worn; + seedNames(demo.nameSeed >>> 0); + seriesName = demo.seriesName || demo.matchName || ""; + matchBallType = demo.ballType || seriesBallType(seriesName); + matchName = String(demo.roundName || "").replace(/^ow-/, ""); + if (Array.isArray(demo.spawns)) + players.forEach((player, index) => { + if (demo.spawns[index] != null) player.spawnX = demo.spawns[index]; + }); + replay = null; + resetRound(now, true); + // Self-play deals nothing at the bell, so the rerun starts from the same + // bare table: both weapons still on their tiles. + if (Array.isArray(demo.botSeeds)) + players.forEach((player, index) => { + if (demo.botSeeds[index] != null) + player.botRngState = demo.botSeeds[index] >>> 0; + }); + // The recording says which tick its fight opened on; anchoring the intro + // clock to that tick removes the ±1-step phase that clock rounding deals + // each pass, so replayed inputs land exactly where they were pressed. + const fightOpen = demo.checkpoints?.[0]?.[0]; + if (fightOpen) roundStartedAt = now + fightOpen * 16667 - + roundIntroDurationUs() - 8000; + if (demo.posePhaseUs != null) startedAt = now - demo.posePhaseUs; +} + +function trackResimDrift(now) { + if (!resimActive || !resimCheckpoints) return; + const report = globalThis.__oskiewarResimDrift; + // The intro's length lands ±1 tick depending on each pass's clock + // rounding, so tick spaces are aligned on the fight's own first physics + // step — this call site is only reached once the fight is live, and the + // recording likewise begins there. + if (report.tickOffset === undefined) + report.tickOffset = resimFirstRowTick - resimTick; + const alignedTick = resimTick + report.tickOffset; + if (roundResult && !report.endedAt) { + report.endedAt = resimTick; + report.endedWith = roundResult; + report.endedCause = roundCause; + } + const row = resimCheckpoints.get(alignedTick); + if (!row) return; + report.ticks++; + for (let pad = 0; pad < players.length; pad++) { + const offset = 1 + pad * 8; + const drift = Math.hypot(players[pad].x - row[offset], + players[pad].y - row[offset + 1]); + if (drift > 4 && report.firstDriftTick === undefined) { + report.firstDriftTick = alignedTick; + report.firstDriftPad = pad; + report.firstDrift = Math.round(drift * 10) / 10; + report.liveAt = [row[offset], row[offset + 1]]; + report.resimAt = [Math.round(players[pad].x), Math.round(players[pad].y)]; + } + if (drift > report.maxDrift) { + report.maxDrift = Math.round(drift * 10) / 10; + report.atTick = alignedTick; + } + } +} + +function consumeSystemButtons(now) { + let pressed = false; + for (let index = 0; index < padSnapshots.length; index++) { + const down = padSnapshots[index]?.down || []; + const previous = navigationPrevious[index] || []; + if (down.includes("RightStick") && !previous.includes("RightStick")) { + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + } + if (down.includes("View") && !previous.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + if (down.includes("Menu") && !previous.includes("Menu")) pressed = true; + navigationPrevious[index] = down.slice(); + } + // Self-play has no title to return to — a stray Menu press would strand the + // loop on a screen nobody is there to start. + if (!pressed || selfPlay || shellMode !== "GAME" || selecting) return false; + returnToTitle(now, "menu"); + return true; +} + +// Start lifts the wordmark off a fight that is already running underneath. +function enterGame(now) { + startInputPending = true; + if (localControllerPair() && !roundViewer && !netSession && !versusActive()) { + startLocalVersus(now); + return; + } + if (survivalActive()) { + startSurvivalRun(now, false); + globalThis.__oskiewarStartLine = "climb!"; + playDrum("bell", 1.05, 0); + playSine(660, .12); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + return; + } + if (titleAttractMode === "action") { + selfPlay = false; + players[0].npc = false; + players[0].bot = false; + players[0].spiderDummy = false; + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + // Attract keeps a cool neutral body in the second chair so the tableau + // reads as a matchup rather than two identical red bots. Start hands the + // first seat back and re-seats whichever sparring partner this session was + // actually dealt: hardcoding the inert dummy here left every session the + // clock dealt the action tableau — half of them — still punching a post + // after training switched to the bot. + const training = trainingOpponentKind(); + players[1].npc = true; + players[1].bot = training === "trainingbot"; + players[1].spiderDummy = training === "spiderdummy"; + applyRoster(players[1], -1); + } + shellMode = "GAME"; + gameplayStarted = true; + if (dummyGuideStartedAt === null && players[1].npc && !players[1].bot) + dummyGuideStartedAt = now; + shellPrevious = padSnapshots[0]?.down?.slice() || []; + if (PAL_SELECT) beginSelect(now); +} + +// Comma and period step the pace mid-fight the way +/- do on the title — a +// quarter at a time, but never past full speed: slow motion is for reading a +// bot's tells. A wired fight keeps the clock both seats agreed on, so the +// keys go dead the moment a rival is real, and a watcher's playout is the +// host's clock too. Edge-detected against the same unfiltered pad memory the +// title uses, so a key held across the start steps exactly once. +const paceLocked = () => netSession !== null || versusActive() || + roundViewer !== null; +function updateMatchPace(now) { + const rawDown = padSnapshots[0]?.down || []; + const tap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + const faster = tap("SpeedUp"); + const slower = tap("SpeedDown"); + shellRawPrevious = rawDown.slice(); + if (!faster && !slower) return; + const next = paceLocked() ? gameSpeed + : clamp(gameSpeed + (faster ? .25 : -.25), .25, 1); + if (next === gameSpeed) { playDrum("block", .3, 0); return; } + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, faster ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); +} + +function updateShell(now, tapped = false) { + const pad = padSnapshots[0] || {}; + // The title screen is where the game's pace is set: +/- on a keyboard + // step the clock a quarter at a time, from a quarter speed to double. + // Handled before anything else so a speed tap can never read as "start", + // and edge-detected against the unfiltered pad so holding the key steps + // exactly once. + const rawDown = pad.down || []; + const speedTap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + if (speedTap("SpeedUp") || speedTap("SpeedDown")) { + const stepped = gameSpeed + (speedTap("SpeedUp") ? .25 : -.25); + const next = clamp(stepped, .25, 2); + if (next !== gameSpeed) { + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, speedTap("SpeedUp") ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); + } else playDrum("block", .3, 0); + } + shellRawPrevious = rawDown.slice(); + // View and Menu are the system's buttons — View toggles the debug HUD and + // must not double as "start the game". Everything else, and a real lean on + // the analog stick, says the player wants in. + const down = rawDown + .filter((button) => button !== "View" && button !== "Menu" && + button !== "SpeedUp" && button !== "SpeedDown"); + const stickLive = Math.abs(pad.leftX || 0) > .5 || Math.abs(pad.leftY || 0) > .5; + if (titleTransitionAt !== null) { + if (now - titleTransitionAt >= 700000) { + titleTransitionAt = null; + enterGame(now); + } + shellPrevious = down.slice(); + shellStickLive = stickLive; + return; + } + if (tapped || down.some((button) => !shellPrevious.includes(button)) || + (stickLive && !shellStickLive)) { + playDrum("hat", .55, 0); + if (typeof titleBeep === "function") titleBeep(); + if (typeof titleVoice === "function") titleVoice(); + emitSignal("select", -1, 1, 0); + titleTransitionAt = now; + startInputPending = true; + } + shellPrevious = down.slice(); + shellStickLive = stickLive; +} + +// Everything from here through `updateSelect` is the deprecated pal select, +// held behind PAL_SELECT — see the flag. +function selectionOptions() { + if (selectionStep === 0) return fighterRoster.map((fighter, rosterIndex) => ({ + kind: "pal", fighter, rosterIndex, + })); + return [ + { kind: "bot", fighter: botFighter, rosterIndex: -1 }, + { kind: "dummy", fighter: npcFighter, rosterIndex: -1 }, + { kind: "spiderdummy", fighter: spiderDummyFighter, rosterIndex: -1 }, + { kind: "people", fighter: peopleFighter, rosterIndex: -1, disabled: true }, + ]; +} + +function startSelectedRound(now) { + selectionReady[0] = true; + selectionReady[1] = true; + startFightAgainst( + players[1].bot ? "bot" : players[1].spiderDummy ? "spiderdummy" + : players[1].npc ? "dummy" : "ppl", now); +} + +function chooseSelection(index, now) { + const option = selectionOptions()[index]; + if (!option) return; + if (option.disabled) { + playDrum("block", .45, 0); + return; + } + if (selectionStep === 0) { + applyRoster(players[0], option.rosterIndex); + selectionReady[0] = true; + selectionStep = 1; + // The dummy is where a fight should start: it stands still and lets you + // learn the buttons. Picking the bot is a decision, not a default. + selectionCursor = Math.max(0, + selectionOptions().findIndex((option) => option.kind === "dummy")); + playDrum("hat", .9, -.55); + emitSignal("select", 0, option.rosterIndex, 0); + return; + } + const opponent = players[1]; + opponent.npc = option.kind === "dummy" || option.kind === "spiderdummy" || + option.kind === "bot"; + opponent.bot = option.kind === "bot"; + opponent.spiderDummy = option.kind === "spiderdummy"; + applyRoster(opponent, option.rosterIndex); + playDrum("clap", 1, .55); + emitSignal("select", 1, option.rosterIndex, opponent.bot ? 2 : opponent.npc ? 1 : 0); + startSelectedRound(now); +} + +function selectionBack(now) { + if (selectionStep === 1) { + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + playDrum("block", .7, 0); + return; + } + returnToTitle(now, "back"); +} + +// One pal at a time: the cursor holds the middle of the screen and its two +// neighbours recede to either side, so the roster reads as a wheel you turn +// rather than a board you scan. +function selectionTouchLayout() { + const count = selectionOptions().length; + const compact = compactLayout(); + const centerX = viewCenterX(); + const cardWidth = compact ? Math.min(280, viewWidth() * .44) : 680; + const cardHeight = compact ? 360 : 720; + const top = compact ? 176 : 190; + const sideScale = compact ? .5 : .66; + const reach = cardWidth * (1 + sideScale) / 2 + (compact ? 6 : 26); + const slots = count > 2 ? [-1, 0, 1] : count > 1 ? [0, 1] : [0]; + return { + back: compact + ? { x: 24, y: 126, width: 112, height: 50 } + : { x: viewOffsetX() + 90, y: 112, width: 170, height: 70 }, + options: slots.map((slot) => { + const scale = slot === 0 ? 1 : sideScale; + const width = cardWidth * scale; + const height = cardHeight * scale; + return { index: (selectionCursor + slot + count) % count, slot, + x: centerX + slot * reach - width / 2, + y: top + (cardHeight - height) / 2, width, height }; + }), + }; +} + +const pointInRect = (point, rect) => rect && point.x >= rect.x && + point.x <= rect.x + rect.width && point.y >= rect.y && + point.y <= rect.y + rect.height; + +function selectionHover(layout = selectionTouchLayout()) { + const pointer = globalThis.__oskiewarTouch?.pointer; + if (!pointer?.active || !Number.isFinite(pointer.x) || + !Number.isFinite(pointer.y)) return null; + if (pointInRect(pointer, layout.back)) return { back: true }; + const option = layout.options.find((rect) => pointInRect(pointer, rect)); + return option && !selectionOptions()[option.index]?.disabled + ? { option: option.index } : null; +} + +function consumeSelectTouches(now) { + const queue = globalThis.__oskiewarTouch?.taps; + if (!Array.isArray(queue) || !queue.length) return; + const touches = queue.splice(0); + const layout = selectionTouchLayout(); + const options = selectionOptions(); + for (const point of touches) { + if (pointInRect(point, layout.back)) selectionBack(now); + else { + const rect = layout.options.find((option) => pointInRect(point, option)); + // A receding neighbour turns the wheel; the focused card commits. A + // disabled card duds either way. + if (rect && (rect.slot === 0 || options[rect.index]?.disabled)) + chooseSelection(rect.index, now); + else if (rect) { + selectionCursor = rect.index; + playDrum("hat", .55, 0); + } + } + if (!selecting || shellMode === "MENU") break; + } +} + +function updateSelect(now) { + consumeSelectTouches(now); + if (!selecting || shellMode === "MENU") return; + const down = padSnapshots[0]?.down || []; + const previous = selectionPrevious[0]; + const pressed = (button) => down.includes(button) && !previous.includes(button); + const optionCount = selectionOptions().length; + let movement = 0; + if (pressed("ArrowLeft") || pressed("ArrowUp")) movement = -1; + else if (pressed("ArrowRight") || pressed("ArrowDown")) movement = 1; + if (movement) { + let next = selectionCursor; + for (let index = 0; index < optionCount; index++) { + next = (next + movement + optionCount) % optionCount; + if (!selectionOptions()[next]?.disabled) break; + } + if (next !== selectionCursor) { + selectionCursor = next; + playDrum("hat", .55, 0); + } + } + if (pressed("B") || pressed("Menu")) selectionBack(now); + else if (pressed("A")) chooseSelection(selectionCursor, now); + selectionPrevious[0] = down.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; +} + +function randomWindMph() { + return 0; +} + +function rollWind(now = runtime().monotonicUs, immediate = true) { + windTargetMph = 0; + windTargetDirection = 1; + nextWindChangeAt = Infinity; + windMph = 0; + windDirection = 1; + windAcceleration = 0; + emitSignal("wind", -1, windTargetDirection, windTargetMph); +} + +function updateWind(dt, now) { + windMph = 0; + windDirection = 1; + windAcceleration = 0; +} + +// The match ball is drawn from the series identity. That identity is itself +// seeded once per match and recorded, so re-running a demo's inputs inflates +// the same ball -- the name this hashes used to come straight from +// Math.random, which silently made ball radius and mass unreproducible. +function seriesBallType(name) { + // Only the kinds marked for the series. The hover board lives in `ballKinds` + // because it IS one of these objects to the physics, but a match that + // inflated a board as its ball would put two boards on a station that is + // supposed to hold exactly one. + const deck = ballKinds.filter((kind) => kind.series !== false); + const roll = hashUnit("ball:" + (name || "oskiewar")); + return deck[Math.min(deck.length - 1, Math.floor(roll * deck.length))].type; +} + +function resetBalls(now) { + Object.assign(balls[0], + ballKinds.find((kind) => kind.type === matchBallType && kind.series !== false) || + ballKinds[0]); + for (const item of balls) { + // The board is placed, not served. It lies in the far floor corner from + // the pistol, so the bell offers three ways to spend the same seconds: + // rush the middle bare-handed, break left for the board, or break right + // for the gun. Putting it on the centre line instead would have made it + // the only opening move worth making. + if (item.type === "skateboard") { + item.x = tileCenterX(Math.floor((item.spawnCol ?? cornerColLeft) * gridCols / 40)); + item.riderPad = -1; + item.y = skateContact(item.x, terrainFloorAt(item.x)).y - skateAxleDrop - skateWheelRadius; + item.z = 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.skateSpin = 0; + item.heldBy = -1; + const rider = skateparkMap ? players[balls.indexOf(item) - 1] : null; + item.riderPad = rider?.skateboard ? rider.pad : -1; + item.active = skateBoardEnabled && item.riderPad < 0; + item.serveAt = 0; + item.lastHitBy = -1; + item.safeUntil = 0; + item.safePlayers = 0; + continue; + } + const owner = item.spawnOwner >= 0 ? players[item.spawnOwner] : null; + item.x = owner ? owner.spawnX + owner.facing * 180 + : centerX; + item.y = owner ? terrainFloorAt(item.x) - item.radius + : terrainFloorAt(item.x) - gridHeight + item.radius + 40; + // An unowned ball begins airborne over the cube's center tile seam and + // drops onto the middle of the fight. + item.z = owner ? owner.z : 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.heldBy = -1; + item.active = ballEnabled; + item.serveAt = now + roundIntroDurationUs() + 150000; + item.lastHitBy = owner ? owner.pad : -1; + item.safeUntil = item.serveAt; + item.safePlayers = owner ? 1 << owner.pad : 0; + // A serve call for a ball that will never inflate is a sound cue lying. + if (ballEnabled) emitSignal("ballserve", owner ? owner.pad : -1, + owner ? owner.facing : 0, windMph); + } +} + +const buttonLabel = (button) => ({ + ArrowUp: "UP", ArrowDown: "DOWN", ArrowLeft: "LEFT", ArrowRight: "RIGHT", + LeftShoulder: "LB", RightShoulder: "RB", LeftStick: "LEFT STICK", + RightStick: "RIGHT STICK", View: "VIEW", Menu: "MENU", + LeftTrigger: "LT", RightTrigger: "RT", +}[button] || String(button).toUpperCase()); + +function roundDemoState(demo, now) { + const checkpoints = demo?.checkpoints || []; + if (!checkpoints.length) return null; + const roundIndex = Number.isInteger(demo.roundIndex) ? demo.roundIndex + : Math.max(0, (demo.rounds?.length || 1) - 1); + const startTick = demo.rounds?.[roundIndex]?.[0] || 0; + const finalCheckpoint = checkpoints[checkpoints.length - 1]; + const endTick = Math.max(startTick + 1, demo.durationTicks || finalCheckpoint[0]); + const elapsed = Math.floor((now - roundViewerDemoStartedAt) / replayTickUs); + const tick = startTick + elapsed % (endTick - startTick + 1); + let before = checkpoints[0], after = finalCheckpoint; + for (const row of checkpoints) { + if (row[0] <= tick) before = row; + if (row[0] >= tick) { after = row; break; } + } + const amount = clamp((tick - before[0]) / Math.max(1, after[0] - before[0]), 0, 1); + const value = (index) => lerp(before[index], after[index], amount); + const recentAttack = (pad) => { + let kind = ""; + let age = 0; + for (const event of demo.events || []) { + if (event[0] > tick || event[0] < tick - 18 || event[2] !== pad) continue; + if (meleeSpecs[event[1].toUpperCase()]) { + kind = event[1].toUpperCase(); + age = tick - event[0]; + } + } + return { kind, age }; + }; + const fighters = [0, 1].map((pad) => { + const offset = 1 + pad * 8; + const flags = before[offset + 5]; + const name = demo.fighters?.[pad] || `P${pad + 1}`; + const profile = name === "DUMMY" ? npcFighter : name === "BOT" ? botFighter + : fighterRoster.find((fighter) => fighter.handle === name); + // A self-play fighter is called what it wears, so a demo's fighter name + // is first tried against the color book itself — the repaint dresses + // straight from the nameplate. Older demos still say "BOT 1"/"BOT 2"; + // those deal from the wardrobe hash so they don't fall back to the + // house red and blue. + const wornColor = cssColorBook.find( + (entry) => entry.name === name.toLowerCase()); + const selfPlayPad = selfPlayFighters.findIndex( + (fighter) => fighter.handle === name); + const swing = recentAttack(pad); + const vx = value(offset + 3); + return { name, nation: demo.nations?.[pad] || "", + color: wornColor ? wornColor.rgb.slice() + : selfPlayPad >= 0 ? selfPlayWardrobe(selfPlayPad).rgb.slice() + : profile?.color || players[pad].color, + x: value(offset), y: value(offset + 1), z: value(offset + 2), + vx, vy: value(offset + 4), vz: 0, + facing: flags & 8192 ? (flags & 4096 ? 1 : -1) + : vx ? Math.sign(vx) : pad ? -1 : 1, + alive: Boolean(flags & 1), grounded: Boolean(flags & 2), + ducking: Boolean(flags & 4), blocking: Boolean(flags & 8), + removedParts: [...limbParts, "torso"].filter((part, index) => + Boolean(flags & (1 << (index + 4)))), + hit: flags & 16384 ? .9 : 0, blockFlash: flags & 32768 ? 1 : 0, + score: Math.round(value(offset + 6)), + roundWins: Math.round(value(offset + 7)), attack: swing.kind, + attackTicks: swing.age }; + }); + const round = demo.rounds?.[roundIndex] || [startTick, 1, 0, 1]; + const nearEnd = tick >= endTick - 20; + const replayBall = { x: value(17), y: value(18), z: value(19), + radius: 42, active: Boolean(before[22]), spawnOwner: 0 }; + const camera = { x: value(23), y: value(24), + width: Math.max(100, value(25)) }; + // Newer demos carry the live pass's whole camera pose; without it the + // lens position is re-derived from width and close shots near-clip. + if (before.length > 26) { + camera.position = { x: value(26), y: value(27), z: value(28) }; + camera.perspective = value(29); + camera.fov = value(30); + camera.roll = value(31); + } + return { phase: "replay", map: demo.map || "station", tick, fighters, ball: replayBall, + balls: [replayBall], camera, + wind: { direction: round[1], mph: round[2] }, + round: { remainingMs: Math.max(0, Math.round((endTick - tick) * 1000 / + (demo.tickRate || 60))), result: nearEnd + ? demo.winner ? `${demo.winner} WINS ROUND` : "TIE" : "" } }; +} + +function applyRoundViewerState(state, now, dt = 1 / 60) { + if (!state?.fighters?.length || !state.camera || !state.round) return; + workshopHighlight = state.map?.highlights === true; + if (state.map?.id && state.map.id !== currentMapId) { + if (state.map.workshop && globalThis.__oskiewarValidateMap) { + try { installWorkshopMap(globalThis.__oskiewarValidateMap(state.map.workshop)); } + catch { return; } + } else if (workshopMap) { + installWorkshopMap(workshopBase, true); + workshopMap = null; + currentMapId = "halfpipe"; + currentMapName = "HALFPIPE"; + } + } + if (((state.course || state.map) === "skatepark") !== skateparkMap) { + configureWorldMap(state.course || state.map); resetSkateRopes(); + } + if (skateparkMap && Array.isArray(state.ropes) && state.ropes.length === skateRopes.length) + state.ropes.forEach((nodes, index) => { + if (!Array.isArray(nodes) || nodes.length !== chainLinks + 1 || + nodes.some((row) => !Array.isArray(row) || row.length !== 4 || + row.some((n) => !Number.isFinite(n) || Math.abs(n) > 100000))) return; + skateRopes[index].nodes = nodes.map(([x, y, px, py]) => ({ x, y, px, py })); + }); + for (let index = 0; index < players.length; index++) { + const source = state.fighters[index]; + const player = players[index]; + const previousX = player.x; + const previousY = player.y; + // Held to spot the edges the live wire reports as flags but never as the + // sparks and debris the host spawned locally. A demo carries its own + // impact track (replayViewerImpacts), so this reconstruction is LIVE-only. + const wasAlive = player.alive; + const wasHit = player.hit || 0; + const priorParts = player.removedParts?.slice() || []; + for (const key of ["name", "nation", "color", "x", "y", "z", "facing", "alive", + "grounded", "ducking", "blocking", "score", "roundWins", "removedParts", + "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) + if (source[key] !== undefined) player[key] = source[key]; + player.vx = source.vx ?? (player.x - previousX) / Math.max(.001, dt); + player.vy = source.vy ?? (player.y - previousY) / Math.max(.001, dt); + player.vz = source.vz || 0; + // Grandstand coasting rides ONLY a velocity the host actually reported. + // The vx/vy above fall back to a frame-to-frame difference for the walk + // cycle's sake, but that difference is a teleport artifact on the first + // snap and after a wire gap — dead-reckoning it would fling the body. + player.wireVx = Number.isFinite(source.vx) ? source.vx : 0; + player.wireVy = Number.isFinite(source.vy) ? source.vy : 0; + player.attackKind = source.attack || ""; + // A demo knows which tick a swing began on, so the replayed pose can run + // its real arc instead of freezing at one canned mid-swing phase. + player.attackStartedAt = player.attackKind + ? now - (source.attackTicks != null + ? source.attackTicks * replayTickUs : 80000) : 0; + player.attackUntil = player.attackKind ? now + 120000 : 0; + player.hit = source.hit || 0; + player.blockFlash = source.blockFlash || 0; + // The host spawns sparks on a strike, a burst on a lost limb and a + // whoosh-lit puff on a kill; none of that rides the state wire, so the + // grandstand used to watch a body silently pop apart. Reconstruct the + // burst from the flag edges the wire DOES carry — a fresh hit, a new + // missing part, a death — so live watchers see the blow land. + if (roundViewerMode === "LIVE") { + // Reconstructing the strike spark is the fallback for a host too old to + // send its impact track. When the real track is on the frame it wins: + // it is the same spark, in the right place, and doubling them reads as + // a heavier hit than the one that landed. + if (!state.impacts && player.hit > .4 && wasHit <= .4) + impacts.push({ x: player.x, y: player.y - 90, z: player.z, + life: .32, duration: .32, death: false, explosion: true }); + const nowParts = player.removedParts || []; + // A fighter who came back whole is a new round, not a healed limb. + const lost = nowParts.length < priorParts.length ? [] + : nowParts.filter((part) => !priorParts.includes(part)); + if (nowParts.length < priorParts.length) clearRoundViewerEffects(); + if (!state.impacts && (lost.length || (wasAlive && !player.alive))) + impacts.push({ x: player.x, y: player.y - 60, z: player.z, + life: .55, duration: .55, death: true, explosion: false }); + // And the limb itself goes flying. The wire says which part is gone; it + // does not say where the pieces went, and the pieces are the part of a + // dismemberment anybody actually watches. They are spawned from the + // fighter's own pose here and then fall under local physics, so they + // land where the body stands rather than where a packet said it did. + if (lost.length && detachedParts.length < 48) { + // Posed from BEFORE the loss, on a copy: the wire's removedParts are + // already applied to the live fighter, and a body's geometry no + // longer carries the limbs it has lost — so asking the fighter as it + // stands now returns no segments to throw. + const pose = runnerWorldGeometry({ ...player, removedParts: priorParts }, + (now - startedAt) / 1000000); + const rival = players[player.pad === 0 ? 1 : 0]; + for (const part of lost) + spawnDetachedPart(player, part, pose, rival?.x ?? player.x, now); + } + } + } + const sources = state.balls || [state.ball]; + for (let index = 0; index < balls.length; index++) { + const source = sources[index]; + if (!source) { balls[index].active = false; continue; } + for (const key of ["x", "y", "z", "radius", "active", "spawnOwner", + "type", "mass", "heldBy"]) + if (source[key] !== undefined) balls[index][key] = source[key]; + } + // A frame that carries no projectile rows is an older host or a stored + // demo, and its shots are simply unknown — leaving the arrays alone is the + // honest answer. A frame that carries an empty row set is a host saying the + // air is clear, and that clears it. + if (state.shots) applyWireShots(state.shots); + if (state.lobs) applyWireLobs(state.lobs); + if (state.impacts) applyWireImpacts(state.impacts); + cameraCenter = state.camera.x; + cameraCenterY = state.camera.y; + cameraWidth = state.camera.width; + if (state.wind) { + windDirection = state.wind.direction; + windMph = state.wind.mph; + windAcceleration = windDirection * windMph * 16; + } + const hadResult = Boolean(roundResult); + roundResult = state.round.result || ""; + roundCause = state.round.cause || + (roundResult.includes("BALLED") ? "BALLED" : roundResult ? "ROUND" : ""); + // Whether the round on the wire has a clock is the HOST's fact, not a thing + // to re-derive locally: `roundIsTimed()` answers from the machine it runs + // on, and a watcher's machine is not in the fight. A demo carries no flag + // and was always a timed, recorded round. + roundViewerTimed = state.round.timed !== false; + // The round's own age, intro included, straight off the wire. Deriving it + // from `remainingMs` instead is what broke the versus lane: that field is + // zero on an untimed round, so the clock landed a full round duration in + // the past, `counting` was never true, and the intro card never drew. + const elapsedUs = Number.isFinite(state.round.elapsedMs) + ? state.round.elapsedMs * 1000 : null; + roundElapsedUs = roundViewerTimed + ? Math.max(0, roundDurationUs - state.round.remainingMs * 1000) + : elapsedUs === null ? 0 + : Math.max(0, elapsedUs - roundIntroDurationUs()); + matchOver = state.phase === "match"; + roundStartedAt = elapsedUs === null + ? now - roundIntroDurationUs() - roundElapsedUs : now - elapsedUs; + if (roundResult && !hadResult) roundOverAt = now; + const target = state.camera.target || { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: state.camera.position || + { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: state.camera.perspective || 0, + fov: state.camera.fov || 55, roll: state.camera.roll || 0 }, dt, 1000); +} + +// Shots and lobs arrive as the flat number rows spectatorState packs (owner +// and kind folded into one flag word). They are rebuilt rather than merged: +// a round has no identity on the wire, so matching this frame's third bullet +// to last frame's third bullet would be a guess, and a wrong guess teleports +// a streak across the arena. The arrays themselves keep their identity — the +// camera's swept-path packer and the render interpolator both hold references +// to them. +function applyWireShots(rows) { + bullets.length = 0; + for (const row of rows) { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + bullets.push({ x, y, z, previousX, previousY, vx, vy, + owner: owner === 1 ? 1 : 0, life: 1, safeUntil: 0, + spit: Boolean(flags & 1), heavy: Boolean(flags & 2), + rubber: Boolean(flags & 4), + // No bounce history came up the wire, so a watched round draws its + // streak and no ricochet tail. drawBulletTrail reads the count first + // and an empty one costs it nothing. + trail: [], trailCount: 0 }); + } +} + +// The host's impact track, which repeats each mark for as long as it burns. +// The id is what makes a repeat readable as a repeat: a watcher spawns only +// the numbers it has not seen, at the age the frame reports, and then runs +// them out on its own physics. +function applyWireImpacts(rows) { + if (!rows.length) return; + const newest = rows[rows.length - 1][0]; + // Numbers only climb within one host's run. A lower one is a different + // host, or the same one restarted, and nothing before it has been seen. + if (newest < roundViewerImpactId) roundViewerImpactId = 0; + for (const row of rows) { + const [id, x, y, z, durationMs, lifeMs, flags] = row; + if (id <= roundViewerImpactId) continue; + impacts.push({ x, y, z, duration: durationMs / 1000, + life: Math.max(.001, lifeMs / 1000), + death: Boolean(flags & 1), explosion: Boolean(flags & 2) }); + } + roundViewerImpactId = Math.max(roundViewerImpactId, newest); +} + +function applyWireLobs(rows) { + grenades.length = 0; + for (const row of rows) { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + // Only live grenades ride out, so anything here is alive by definition — + // which is also what puts it in the render list. + grenades.push({ x, y, z, vx, vy, owner: owner === 1 ? 1 : 0, alive: true, + rocket: Boolean(flags & 1), exploding: Boolean(flags & 2), + blastRadius, blastAge: 0, fuse: fuseMs / 1000, hitPlayers: 0 }); + } +} + +function handleRoundViewer(message) { + const now = runtime().monotonicUs; + matchName = message.roundName || matchName; + if (message.type === "round") { + roundViewerDemo = null; + roundViewerMode = ""; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + return; + } + if (message.type === "status") { + roundViewerStatus = String(message.content?.label || "waiting").toUpperCase(); + // A room that goes dark keeps no queue: whatever arrives next belongs to + // a new timeline, and a stale frame blended into it is a teleport. + if (message.content?.live === false) resetRoundViewerPlayout(); + return; + } + if (message.type === "demo") { + // A demo with bot seeds can be re-simulated — the honest path. The + // bridge hands over the recording and steps aside so the real sim runs; + // seedless demos (older, or human-driven) still puppet through the + // viewer below. + if (globalThis.__oskiewarResim && Array.isArray(message.content?.botSeeds)) { + roundViewerStop?.(); + roundViewer = null; + // The reset waits for the first stepped tick so it lands inside the + // sim clock the way a live round roll does — resetting here, on the + // bridge's wall clock, would skew the intro against the recording. + resimPending = message.content; + globalThis.__oskiewarReplayReady = true; + return; + } + roundViewerDemo = message.content; + roundViewerDemoStartedAt = now; + roundViewerMode = "DEMO"; + resetRoundViewerPlayout(); + globalThis.__oskiewarReplayReady = true; + return; + } + if (message.type === "net") { + if (netSession) netInbox.push(message.content); + else netHandlePreSession(message.content); + return; + } + if (netSession && message.type === "state") return; + if (message.type === "state") { + // The room says whether anybody is publishing, and it says so before it + // hands over any frame. A frame that arrives while nobody is is the last + // thing a host said before it left — kept by the relay and given to + // whoever opens the door next. Going LIVE on it paints that frozen round + // as a fight in progress, and since one frame can never bracket the + // playout clock, nothing in it is ever applied: the fighters keep + // whatever names this engine was already holding and the HUD tells the + // new arrival which of those two strangers they are. + if (!message.live) return; + if (roundViewerDemo && message.content?.phase === "match") return; + roundViewerMode = "LIVE"; + queueRoundViewerState(message.content); + } +} + +// A fresh timeline: a room change, a takeover, a host that went away. The +// queue, the playout clock and the measured health all start over, because +// every one of them is a statement about a wire that no longer exists. +// Sparks, debris and fallen limbs belong to one round on one wire. A new +// round, a new room or a host that went away takes them with it. +function clearRoundViewerEffects() { + impacts.length = 0; + detachedParts.length = 0; + roundViewerImpactId = 0; +} + +function resetRoundViewerPlayout() { + clearRoundViewerEffects(); + roundViewerFrames = []; + roundViewerPlayoutMs = 0; + roundViewerLiveAt = 0; + roundViewerGapMs = 33; + roundViewerJitterMs = 0; + roundViewerLossPct = 0; + roundViewerSeq = -1; + roundViewerSeqHeard = 0; + roundViewerSeqExpected = 0; +} + +// A frame lands here, in a socket callback, between one simulation tick and +// the next paint. Painting it from inside that callback is what smeared every +// correction across two frames: the render interpolator had already captured +// the pre-frame pose, so the next paint landed partway into the new state and +// the one after finished the jump. So the frame is only filed — stamped with +// its arrival and measured — and the tick decides when it is due. +function queueRoundViewerState(state) { + const at = Date.now(); + const gap = roundViewerLiveAt ? at - roundViewerLiveAt : 0; + roundViewerLiveAt = at; + if (gap > 0 && gap < 2000) { + roundViewerGapMs += (gap - roundViewerGapMs) * .12; + roundViewerJitterMs += + (Math.abs(gap - roundViewerGapMs) - roundViewerJitterMs) * .12; + } + // Loss read off the host's own sequence numbers, over a rolling window. + // This is where the relay's coalescing shows: a frame it dropped inside its + // 25 ms gate leaves a hole in the count that nothing else on this side can + // see. A takeover or a fresh room rewinds the sequence, which restarts the + // window rather than reading as a hundred lost frames. + const seq = Number(state?.seq); + if (Number.isFinite(seq)) { + if (roundViewerSeq >= 0 && seq > roundViewerSeq) { + roundViewerSeqExpected += seq - roundViewerSeq; + roundViewerSeqHeard += 1; + if (roundViewerSeqExpected >= 180) { + roundViewerLossPct = clamp(Math.round( + (1 - roundViewerSeqHeard / roundViewerSeqExpected) * 100), 0, 100); + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + } else { + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + roundViewerSeq = seq; + } + // One wire frame plus twice the jitter actually measured, held inside a + // window where a buffer is still worth more than it costs. The delay itself + // moves slowly: resizing it quickly would time-warp the picture. + const want = clamp(roundViewerGapMs + roundViewerJitterMs * 2 + 8, 45, 220); + roundViewerDelayMs += (want - roundViewerDelayMs) * .05; + roundViewerFrames.push({ state, at }); + // A ceiling, not a working depth: the playout holds about three frames. + // This only catches a tab whose simulation parked while the wire kept + // arriving, and the clock's own thousand-millisecond reset sorts out the + // rest when the tab comes back. + if (roundViewerFrames.length > 32) roundViewerFrames.shift(); +} + +// How far past the newest frame in hand the grandstand keeps coasting on wire +// velocity before it holds still. Inside the buffer nothing coasts at all — +// the pose is blended between two frames the host really sent. Past the +// buffer the velocity goes stale fast enough that coasting walks a fighter +// through a wall or floats them past a jump's apex, so a long gap freezes the +// pose instead of inventing motion. +const liveDeadReckonMaxMs = 150; + +function updateRoundViewer(now, dt) { + if (roundViewerDemo && roundViewerMode === "DEMO") { + const state = roundDemoState(roundViewerDemo, now); + if (state) { + applyRoundViewerState(state, now, dt); + replayViewerImpacts(state.tick, dt); + } + return; + } + if (roundViewerMode !== "LIVE" || !roundViewerFrames.length) return; + const wall = Date.now(); + const target = wall - roundViewerDelayMs; + // A first frame, or a wire that stopped and came back, sets the clock + // outright. Every other tick advances it by the simulation's own dt and + // leans a twentieth of the way toward where it belongs. Leaning rather than + // snapping is what keeps the picture's rate the sim's rate: a clock pinned + // to the wall every tick replays the network's jitter as motion. + if (!roundViewerPlayoutMs || Math.abs(target - roundViewerPlayoutMs) > 1000) + roundViewerPlayoutMs = target; + else roundViewerPlayoutMs += dt * 1000 + + (target - roundViewerPlayoutMs) * .05; + const play = roundViewerPlayoutMs; + // Hold exactly one frame behind the clock: it is the left end of the pair + // being blended, and the one to coast from if the buffer runs dry. + while (roundViewerFrames.length > 1 && roundViewerFrames[1].at <= play) + roundViewerFrames.shift(); + const before = roundViewerFrames[0].at <= play ? roundViewerFrames[0] : null; + const after = before ? roundViewerFrames[1] : roundViewerFrames[0]; + if (before && after) { + const span = Math.max(1, after.at - before.at); + const alpha = clamp((play - before.at) / span, 0, 1); + applyRoundViewerState(blendRoundViewerStates(before.state, after.state, + alpha, (play - before.at) / 1000), now, dt); + updateRoundViewerEffects(dt); + return; + } + // Starved, or not yet arrived at the first frame. The newest thing in hand + // is the truth; past it the bodies coast on the velocity that frame + // reported — measured from that frame's own position, so the reckoning is + // never compounded and the next arrival needs no correcting snap. + const edge = before || after; + applyRoundViewerState(edge.state, now, dt); + if (before) + coastRoundViewer(Math.min(play - before.at, liveDeadReckonMaxMs) / 1000); + updateRoundViewerEffects(dt); +} + +// The half of the fight a watcher is allowed to run for itself. Sparks, their +// debris and the limbs that came off are cosmetic: nothing here decides a hit +// or a score, so none of it has to agree with the host bit for bit — it only +// has to happen. Before this, `impacts` grew for the life of the connection +// and never drew a mote, because the function that grows an impact's debris +// ran only in a demo or a hosted sim. +function updateRoundViewerEffects(dt) { + updateResultImpactDebris(dt); + if (detachedParts.length) updateDetachedParts(dt, false); +} + +// Dead reckoning, and only past the end of the buffer. +function coastRoundViewer(seconds) { + if (seconds <= 0) return; + for (const player of players) { + if (!player.alive) continue; + // Coast the delta only — the host's reported position is truth and may + // sit anywhere it says (legacy rooms even ran off the cube). + player.x += (player.wireVx || 0) * seconds; + player.y += (player.wireVy || 0) * seconds; + } + for (const item of balls) { + if (!item.active) continue; + item.x += (item.vx || 0) * seconds; + item.y += (item.vy || 0) * seconds; + } + // Both ends of a shot move together: the streak's length is the round's + // speed, not the size of the gap we are papering over. + for (const shot of bullets) { + shot.x += (shot.vx || 0) * seconds; + shot.y += (shot.vy || 0) * seconds; + shot.previousX += (shot.vx || 0) * seconds; + shot.previousY += (shot.vy || 0) * seconds; + } + for (const lob of grenades) { + if (lob.exploding) continue; + lob.x += (lob.vx || 0) * seconds; + lob.y += (lob.vy || 0) * seconds; + } +} + +// The pose the grandstand actually paints: two frames the host really sent, +// blended. Continuous quantities interpolate; everything discrete — who is +// alive, which limbs are gone, what phase the round is in — comes from the +// frame already reached, because a fighter must not die before the pose that +// killed them has finished arriving. +const blendFighterKeys = ["x", "y", "z", "vx", "vy", "vz", "hit", + "blockFlash", "attackTicks"]; +const blendCameraKeys = ["x", "y", "width", "perspective", "fov", "roll"]; +const blendPointKeys = ["x", "y", "z"]; + +function blendNumbers(from, to, keys, t) { + const out = { ...from }; + if (!to) return out; + for (const key of keys) { + const a = Number(from?.[key]); + const b = Number(to[key]); + if (Number.isFinite(a) && Number.isFinite(b)) out[key] = a + (b - a) * t; + } + return out; +} + +function blendRoundViewerStates(from, to, t, seconds) { + const state = { ...from }; + state.fighters = (from.fighters || []).map((fighter, index) => + blendNumbers(fighter, to.fighters?.[index], blendFighterKeys, t)); + const blendBall = (ball, other) => + ball ? blendNumbers(ball, other, blendPointKeys, t) : ball; + if (from.balls) + state.balls = from.balls.map((ball, index) => + blendBall(ball, to.balls?.[index])); + if (from.ball) state.ball = blendBall(from.ball, to.ball); + if (from.camera) { + state.camera = blendNumbers(from.camera, to.camera, blendCameraKeys, t); + for (const part of ["position", "target"]) + if (from.camera[part]) state.camera[part] = + blendNumbers(from.camera[part], to.camera?.[part], blendPointKeys, t); + } + // Projectiles have no identity on the wire, so they are carried forward on + // their own reported velocity rather than matched against the next frame's + // rows — a wrong match teleports a streak across the arena. A shot flies + // straight, so this is not an approximation of the host's path, it IS it. + if (from.shots) state.shots = from.shots.map((row) => { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + return [x + vx * seconds, y + vy * seconds, z, + previousX + vx * seconds, previousY + vy * seconds, vx, vy, owner, flags]; + }); + if (from.lobs) state.lobs = from.lobs.map((row, index) => { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + const next = to.lobs?.[index]; + // A blast's ring grows over a fifth of a second, which is six wire + // frames — steppy enough to see. It blends when the next frame plainly + // holds the same blast; otherwise the radius stands. + const radius = next && next[6] === flags && next[5] === owner + ? blastRadius + (next[7] - blastRadius) * t : blastRadius; + const moving = flags & 2 ? 0 : seconds; + return [x + vx * moving, y + vy * moving, z, vx, vy, owner, flags, + radius, fuseMs]; + }); + return state; +} + +// The buttons a challenger's pad may carry up the wire — the fight's own +// vocabulary, no system keys. View and Menu stay local: a rival must never +// toggle the host's debug overlay or send their game back to the title. +const versusInputButtons = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"]; +// The buttons of the last frame the wire actually took, held apart from the +// whole frame so a press can be told from a stick twitch. +let versusInputLastDown = "[]"; + +// The challenger's half of the versus wire: sample the local pad, ship it on +// change, and heartbeat while idle so silence can mean absence. Sends pace +// themselves a hair above the relay's own floor — a press that lands inside +// the pause simply leaves on the next tick rather than being dropped. +function sendChallengerInput(now) { + if (roundViewer?.seat !== "challenger" || + typeof roundViewer.sendInput !== "function") return; + // Holding the chair is not the same as sitting in it. A visitor who has not + // come through the door sends nothing, so the host reads the seat as empty + // and the room stays open for somebody who has — and this visitor keeps + // watching the fight, which was never gated. + if (!versusAllowed()) return; + const pad = typeof gamepad === "function" ? gamepad(0) : null; + if (!pad) return; + const down = (pad.down || []) + .filter((button) => versusInputButtons.includes(button)).slice(0, 10); + const round2 = (value) => Math.round((Number(value) || 0) * 100) / 100; + const frame = { down, leftX: round2(pad.leftX), leftY: round2(pad.leftY) }; + const worn = JSON.stringify(frame); + // A button edge leaves at once. The 33 ms floor was written to pace a + // stick, which drifts continuously and would otherwise send every tick — + // but a press is a discrete event, and holding one back for up to two + // frames put a third of a display's lag into the one thing a player feels + // most. Only the analog half still waits. + const pressed = JSON.stringify(down); + const edge = pressed !== versusInputLastDown; + if (!edge) { + if (worn !== versusInputLastSent) { + if (now < versusInputMinNextAt) return; + } else if (now < versusInputNextAt) return; + } + versusInputMinNextAt = now + 33000; + // An unchanged frame is repeated once soon after a change, then settles + // into the idle heartbeat. The relay drops what arrives too fast and says + // nothing about it, so a lost edge used to be invisible for a quarter of a + // second; one cheap echo closes that window without adding a protocol. + versusInputNextAt = now + (edge ? 50000 : 250000); + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + if (roundViewer.sendInput({ seq: versusInputSeq++, ...frame, + name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors })) { + versusInputLastSent = worn; + versusInputLastDown = pressed; + } +} + +// --------------------------------------------------------------------------- +// Rollback netplay. Both seats run the whole fight; nobody streams it to the +// other. Each tick a seat schedules its own pad a couple of frames ahead, +// mails it, and simulates the current frame with the rival's last known pad +// standing in for the one that has not arrived. When the real pad lands and +// differs, the sim steps back to the snapshot before that frame and replays +// forward in silence. That is what Street Fighter 6 does; the price is a +// simulation that is a pure function of (frame, both pads), and a snapshot of +// every variable that simulation touches. The list lives in netSimScalars / +// netSimArrays below and the netplay test pins it: two seats fed the same +// pads must hash identical states, round after round. +const NET_TICK_US = replayTickUs; +// Frames a press waits before it is simulated. Two at 60 Hz is 33 ms — the +// same order as a display's own lag, and it means a rival packet arriving +// within ~33 ms costs no rollback at all. +const NET_INPUT_DELAY = 2; +// How far past the rival's newest pad we will guess before we stop and wait. +// Eight frames is 133 ms of one-way silence, well past the relay's p99. +const NET_MAX_ROLLBACK = 8; +// Pads per packet. Every packet re-sends this many recent frames so a lost +// packet costs nothing unless several vanish in a row. +const NET_REDUNDANCY = 10; +const NET_HASH_EVERY = 30; +// The floor of frame zero's clock. The host offers its own clock rounded up +// to a tick so its timeline runs straight into the fight; this floor keeps +// every "0 means unset" deadline in the sim unset whatever the host reports. +const NET_ORIGIN_US = 1000000; +// Wall-clock silence after which the rival is gone and the fight ends. +const NET_PEER_LOST_MS = 4000; +const NET_HELLO_INTERVAL_MS = 1000; +let netInbox = []; +let netPeerHello = null; +let netHelloSentAt = 0; +const netPadCache = new Map(); + +// A recorded mask back into the pad shape the sim reads (see resimPad). One +// object per mask value, frozen, so a frame costs no allocation. +function netPadFromMask(mask) { + mask = mask | 0; + let pad = netPadCache.get(mask); + if (pad) return pad; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + pad = Object.freeze({ connected: true, down: Object.freeze(down), + leftX: 0, leftY: 0, rightX: 0, rightY: 0 }); + netPadCache.set(mask, pad); + return pad; +} + +// Everything the simulation reads or writes that is not a constant, a render +// cache, or the wire. Scalars are captured and restored by name; the arrays +// are deep-copied. The netplay test pins that this list covers the round clock. +function netSimScalars() { + return { + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + }; +} +function netRestoreScalars(saved) { + ({ + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + } = saved); +} +const netSimArrays = () => ({ + players, balls, bullets, grenades, impacts, detachedParts, skateRopes, + // `saberPickups` belongs here for the same reason every other array does, + // and leaving it out was a real desync: a rollback that does not restore it + // re-simulates frames in which a blade was already taken, or takes one that + // the rewound timeline had not yet dropped. `swordHeld` itself rides on the + // player and was always restored -- which is what made this so quiet. The + // two seats agreed about every number they hashed while disagreeing about + // whether somebody was holding a sword, and a sword is a 1.5x reach + // multiplier in `meleeSpecFor`, so they went on agreeing right up until a + // strike landed one frame apart on one screen and not the other. + gunPickups, saberPickups, grenadePickups, bodyTrees, gridField, + resultReactionPrevious, fightHitMarks, +}); + +function netSnapshot() { + const arrays = {}; + for (const [name, live] of Object.entries(netSimArrays())) + arrays[name] = structuredClone(live); + return { scalars: netSimScalars(), arrays }; +} + +// Restore in place: the live arrays are `const` and referenced everywhere, so +// their identity stays and their contents are replaced. Keys the live object +// grew since the snapshot are removed too — a key the sim added later must not +// survive a rewind. +function netRestore(snapshot) { + if (!snapshot.scalars.skateparkMap && snapshot.scalars.netRoundMapIndex >= 0 && + netRoundMapIndex !== snapshot.scalars.netRoundMapIndex) + installRoundMap(snapshot.scalars.netRoundMapIndex); + configureWorldMap(snapshot.scalars.skateparkMap ? "skatepark" : "station"); + netRestoreScalars(structuredClone(snapshot.scalars)); + const live = netSimArrays(); + for (const [name, saved] of Object.entries(snapshot.arrays)) { + const target = live[name]; + const copy = structuredClone(saved); + if (ArrayBuffer.isView(target)) { target.set(copy); continue; } + if (target.length === copy.length && copy.every((entry) => + entry && typeof entry === "object" && !Array.isArray(entry))) { + for (let index = 0; index < target.length; index++) { + const item = target[index]; + if (!item || typeof item !== "object") { target[index] = copy[index]; continue; } + for (const key of Object.keys(item)) + if (!(key in copy[index])) delete item[key]; + Object.assign(item, copy[index]); + } + } else { + target.length = 0; + target.push(...copy); + } + } +} + +// FNV-1a over the state that decides a fight. Exact doubles, not rounded: a +// last-bit difference is a real desync and must read as one. +// Debug only: the exact JSON the last hash was taken over, and a ring of it +// per frame while `__oskiewarHashTrace` is set. A desync report names a +// frame and two numbers; this is what turns those numbers back into fields. +let netLastHashText = ""; +const netHashTexts = new Map(); +function netStateHash() { + const view = players.map((player) => [player.x, player.y, player.z, + player.vx, player.vy, player.vz, player.facing, player.alive, + player.grounded, player.ducking, player.blocking, player.score, + player.roundWins, player.attackKind, player.attackUntil, + player.hitStunUntil, player.stance, player.gunAmmo, player.grenadeAmmo, + player.heldBall, player.removedParts, player.dashUntil, + // Holding a blade decides how far a hand reaches, so it decides the + // fight and belongs in the hash. It is here because it was NOT here: two + // seats disagreeing about a sword hashed identically for hundreds of + // frames and were found apart only once the reach changed an outcome, + // which is the most expensive way to learn about a desync. + player.skateboard, player.skateVx, player.skateWallSide, + player.skatePitch || 0, player.skateContacts || 0, player.swordHeld, player.ropeIndex, player.ropeLink, player.ropeGrabLocked, player.skateLoop, + player.loopAngle, player.loopSpeed, player.loopCooldownUntil, player.skateRotation, player.boostUntil, + player.headBounceCharge || 0, player.headPumpDirection || 0, player.headPumpAt || 0, + player.headRoll || 0, player.headRollRate || 0, + player.knockVx, player.windVx, player.dashVx, player.inputX, player.inputY, + player.previous, player.suppressedDirections, player.lastTap, player.lastRelease]); + view.push(skateparkMap, netRoundMapIndex, roundModifier, netRoundClockDebtUs, skateRopes); + view.push(balls.map((item) => [item.active, item.x, item.y, item.z, + item.vx, item.vy, item.heldBy])); + // Projectiles by position, not just by count. A round whose flight differs + // between the two machines kills different fighters, and hashing only the + // length let that drift silently: the count matched right up to the frame + // one seat's bullet connected and the other's missed. + view.push(bullets.map((shot) => [shot.x, shot.y, shot.z, shot.vx, shot.vy, + shot.owner, shot.life])); + view.push(grenades.map((lob) => [lob.x, lob.y, lob.z, lob.vx, lob.vy, + lob.owner, lob.fuse, lob.alive, lob.exploding, lob.blastRadius, + lob.hitPlayers])); + view.push([...gunPickups, ...saberPickups, ...grenadePickups].map(p => + [p.kind || "GRENADE", p.active, p.x, p.y, p.dropVy || 0, + p.dropping || false, p.dropLandingY ?? null, p.respawnAt || 0])); + view.push(roundResult, roundElapsedUs, + matchOver, roundStartedAt, roundOverAt); + const text = JSON.stringify(view); + if (globalThis.__oskiewarHashTrace) netLastHashText = text; + let hash = 0x811c9dc5; + for (let index = 0; index < text.length; index++) { + hash ^= text.charCodeAt(index); + hash = Math.imul(hash, 0x01000193) >>> 0; + } + return hash; +} + +// The local seat's handle and wardrobe, in the shape the pad frames already +// carry, so the host can dress both fighters the same way on both screens. +function netLocalIdentity() { + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + return { name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors }; +} + +function netCleanName(value, fallback) { + const offered = String(value || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); + return /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : fallback; +} + +function netCleanColors(value) { + return (Array.isArray(value) ? value : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)).slice(0, 4); +} + +function netAverageColor(colors, fallback) { + if (!colors.length) return fallback.slice(); + return colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); +} + +// The deal the host writes and both seats apply: who sits where, wearing +// what, and the clock and ball they share. Everything the first frame's +// state derives from that is not already a constant of the build. +function netMakeDeal() { + const local = players[0]; + const rival = netPeerHello || {}; + const rivalColors = netCleanColors(rival.colors); + const hostNow = Math.max(NET_ORIGIN_US, runtime().monotonicUs); + const origin = Math.ceil((hostNow + NET_TICK_US) / NET_TICK_US) * NET_TICK_US; + return { t: "start", v: 2, origin, delay: NET_INPUT_DELAY, + ballType: matchBallType, map: skateparkMap ? "skatepark" : "station", + fighters: [ + { name: netCleanName(local.name, ""), rosterIndex: local.rosterIndex, + color: local.color.slice(0, 3), + handleColors: netCleanColors(local.handleColors) }, + { name: netCleanName(rival.name, ""), rosterIndex: -1, + color: netAverageColor(rivalColors, [38, 82, 176]), + handleColors: rivalColors }, + ] }; +} + +function netApplyIdentities(deal) { + deal.fighters.forEach((entry, index) => { + const player = players[index]; + player.name = entry.name; + player.rosterIndex = entry.rosterIndex; + player.color = entry.color.slice(); + player.handleColors = entry.handleColors.map((c) => c.slice()); + }); + versusRivalName = deal.fighters[1].name; +} + +// Frame zero. Both seats run this with the same deal under the same clock, +// and the state that comes out is the state the fight starts from — the +// hash exchange on the first frame says whether it really is. +function netBegin(deal, seat, send) { + netEnd("restart"); + const session = { seat, deal, frame: 0, originUs: deal.origin, + delay: deal.delay, send, + local: new Map(), remote: new Map(), used: new Map(), snapshots: new Map(), + remoteFrame: -1, remoteSimFrame: 0, remoteLead: null, lastRemoteMask: 0, ackFrame: -1, + confirmed: -1, hashes: new Map(), peerHashes: new Map(), + lastPacketAt: Date.now(), startedAt: Date.now(), ticks: 0, + // peerStamp is the newest wall-clock mark heard from the rival, echoed + // back on our next packet so they can read their own round trip; pingMs is + // ours, read from the echoes coming the other way. + peerStamp: 0, + stats: { rollbacks: 0, rolledFrames: 0, maxRollback: 0, stalls: 0, + waits: 0, sent: 0, received: 0, desyncs: 0, snapshotMs: 0, resimMs: 0, + // `pings` counts measurements, not milliseconds: a round trip under half + // a millisecond rounds to zero, and a meter that reads "no measurement + // yet" on a LAN would be wrong at exactly the moment it is best. + pings: 0, pingMs: 0 } }; + for (let frame = 0; frame < deal.delay; frame++) session.local.set(frame, 0); + netSession = session; + // The relay's clock is the fight's clock: a host who was reading tells at + // quarter speed is back at full the moment the rival is real. + if (gameSpeed !== 1) { + gameSpeed = 1; + gameSpeedChangedAt = 0; + emitSignal("game-speed", -1, 1, 0); + } + netRoundClockDebtUs = 0; + netClockUs = deal.origin; + netFrameInputs = [0, 0]; // Never inherit either machine's local Menu/held pad. + try { + configureWorldMap(deal.map); + netRoundMapIndex = -1; + matchBallType = deal.ballType; + // The limb poses that collide are phased off this epoch, so both seats + // must share it; and a rollback fight is never a recorded one. + startedAt = deal.origin; + lastSimAt = deal.origin; + replay = null; + startVersusFight(deal.origin, true); + netApplyIdentities(deal); + } finally { + netFrameInputs = null; + netClockUs = null; + } + telemetry("NET_BEGIN", "seat " + seat + " delay " + deal.delay); +} + +// Leaving on purpose tells the rival at once instead of costing them the +// silence timeout; whatever the leaving seat's game did next stands. +function netLeave(reason) { + if (!netSession) return; + try { netSession.send({ t: "bye", o: netSession.originUs, r: reason }); } + catch (_) {} + netEnd(reason); +} + +function netEnd(reason) { + if (!netSession) return; + // A rival who has gone will never confirm anything, and the round they lost + // still happened — the frames past the frontier cannot change with nobody + // left to press anything. + flushPendingRoundReplay(runtime().monotonicUs); + const stats = netSession.stats; + // A seat in a rollback fight sends net packets, not pads, so the moment + // this lane closes the host has heard nothing on the pad wire for as long + // as the fight lasted. Read literally that is an empty chair, and an empty + // chair resets the match — which would turn a repaired desync into a lost + // score. The grace covers the changeover; a rival who has genuinely gone + // still times out, just three seconds later. + if (reason === "desync" || reason === "desync-peer" || reason === "workshop") + versusSeatGraceUntil = Date.now() + 3000; + // The stream this seat is about to start watching again is a new timeline. + if (roundViewer) resetRoundViewerPlayout(); + // Time never runs backwards: the local clock picks up where the fight's + // clock stood, so every deadline the fight left behind is still meaningful. + scaledClockUs = Math.max(scaledClockUs, + netSession.originUs + netSession.frame * NET_TICK_US - netRoundClockDebtUs); + telemetry("NET_END", reason + " frames " + netSession.frame + + " rollbacks " + stats.rollbacks + " rolled " + stats.rolledFrames + + " max " + stats.maxRollback + " stalls " + stats.stalls + + " waits " + stats.waits + " desyncs " + stats.desyncs); + netSession = null; + netInbox.length = 0; + netPeerHello = null; + globalThis.__oskiewarNetStats = null; +} + +// The rival's pad for a frame: the real one if it came, otherwise the newest +// one we have — a hand mostly keeps doing what it was doing. +function netRemoteInputFor(session, frame) { + const known = session.remote.get(frame); + if (known !== undefined) return known; + for (let back = frame - 1; back >= 0 && back >= frame - NET_MAX_ROLLBACK * 2; back--) { + const older = session.remote.get(back); + if (older !== undefined) return older; + } + return session.lastRemoteMask; +} + +function netInputsFor(session, frame) { + const local = session.local.get(frame) ?? 0; + const remote = netRemoteInputFor(session, frame); + return session.seat === 0 ? [local, remote] : [remote, local]; +} + +function netSimulateFrame(session, frame, silent) { + const started = performance.now(); + session.snapshots.set(frame, netSnapshot()); + session.stats.snapshotMs += performance.now() - started; + const inputs = netInputsFor(session, frame); + session.used.set(frame, inputs); + netFrameInputs = inputs; + netRoundClockDebtUs += NET_TICK_US * (1 - roundSpeed()); + netClockUs = session.originUs + (frame + 1) * NET_TICK_US; + netSilent = silent; + try { + gameSim(); + } finally { + netClockUs = null; + netSilent = false; + netFrameInputs = null; + } +} + +// A rollback un-happens frames, and the frames it un-happens were written +// down. Every row in a demo's logs is stamped with the tick it belongs to, so +// taking the record back to a frame is a truncation — and the silent +// re-simulation that follows re-files the corrected rows itself, which is why +// the recorders are NOT muted while it runs. The two cursors that decide when +// the next row is due are rebuilt from what survives, so they rewind too +// without having to ride in the snapshot. +// +// Without this a versus demo was written from mispredicted frames: it recorded +// the rival pad this seat had GUESSED, so the stored fight replayed into a +// different one. That is what "a rollback fight is never a recorded one" meant. +function replayRewind(session, toFrame) { + if (!replay) return; + const tick = demoTick(session.originUs + (toFrame + 1) * NET_TICK_US); + const keep = (rows) => { + if (!Array.isArray(rows)) return rows; + let length = rows.length; + while (length > 0 && rows[length - 1][0] >= tick) length--; + rows.length = length; + return rows; + }; + keep(replay.commands); + keep(replay.checkpoints); + keep(replay.events); + keep(replay.impacts); + keep(replay.rounds); + keep(replayRoundMarks); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + // The dedupe cursor is whatever each pad was last recorded as saying; a + // command that was truncated must be writable again. + replayLastCommand = [-1, -1]; + for (const row of replay.commands) replayLastCommand[row[1]] = row[2]; + replayNextCheckpointAt = replay.checkpoints.length + ? session.originUs + (toFrame + 1) * NET_TICK_US : 0; + // A round whose end was taken back is not a round to file. + if (replayPendingSaveFrame >= toFrame) replayPendingSaveFrame = -1; +} + +// The earliest frame we simulated with a guessed rival pad that has since +// been contradicted. Frames past `confirmed` are the only candidates. +function netEarliestMisprediction(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + for (let frame = session.confirmed + 1; frame < session.frame; frame++) { + const real = session.remote.get(frame); + if (real === undefined) return null; + const used = session.used.get(frame); + if (used && used[remoteSeat] !== real) return frame; + session.confirmed = frame; + } + return null; +} + +function netRollback(session, toFrame) { + const started = performance.now(); + const depth = session.frame - toFrame; + netRestore(session.snapshots.get(toFrame)); + replayRewind(session, toFrame); + for (let frame = toFrame; frame < session.frame; frame++) + netSimulateFrame(session, frame, true); + session.stats.rollbacks++; + session.stats.rolledFrames += depth; + session.stats.maxRollback = Math.max(session.stats.maxRollback, depth); + session.stats.resimMs += performance.now() - started; +} + +function netPrune(session) { + const floor = Math.min(session.confirmed, session.frame - NET_MAX_ROLLBACK - 2); + for (const frame of session.snapshots.keys()) + if (frame < floor) session.snapshots.delete(frame); + for (const frame of session.used.keys()) + if (frame < floor) session.used.delete(frame); + const inputFloor = floor - NET_REDUNDANCY * 2; + for (const frame of session.local.keys()) + if (frame < inputFloor) session.local.delete(frame); + for (const frame of session.remote.keys()) + if (frame < inputFloor) session.remote.delete(frame); + for (const frame of session.hashes.keys()) + if (frame < inputFloor) session.hashes.delete(frame); + for (const frame of session.peerHashes.keys()) + if (frame < inputFloor) session.peerHashes.delete(frame); +} + +function netDrainInbox(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + // Taken as a batch: a hash mismatch inside this loop ends the session and + // empties the inbox underneath it. + const batch = netInbox.splice(0, netInbox.length); + for (const packet of batch) { + if (!packet || typeof packet !== "object") continue; + // A hello inside a session is never the rival still talking: the + // challenger stops saying hello the moment it has one. It is somebody with + // no session — the same person having reloaded, or a new arrival in the + // chair — and it has to be read that way BEFORE the clock below is + // touched. Stamping it as a live packet was the deadlock: a tab that is + // killed sends no `bye`, so this seat waited on four seconds of silence + // that the rejoiner's own 1 Hz hello refreshed forever. This seat went on + // simulating against a rival who only ever said hello, and the rejoiner + // never got a deal back. Neither could leave. Treating it as a departure + // frees both: the lobby is one tick away, and the next hello a second + // later deals a fresh session with the fresh identity. + if (packet.t === "hello") { + // Except a straggler still in flight from before the deal was made, + // which would kill a session one frame old. + if (Date.now() - session.startedAt > NET_HELLO_INTERVAL_MS * 2) + session.peerLeft = true; + continue; + } + // A straggler from the fight before. The shell's inbox is not emptied when + // a session ends and packets stay in flight across the changeover, so + // without this the old rival's last presses were written into the new + // fight at frames it had not reached — on the seat that received them and + // nowhere else. Measured: two seats agreed through frame 330 of a rejoined + // fight and were found apart at the next checkpoint. An older build sends + // no tag and is taken at its word, as it always was. + if (packet.o !== undefined && packet.o !== session.originUs) continue; + session.lastPacketAt = Date.now(); + session.stats.received++; + if (packet.t === "workshop" && session.seat === 1) { session.peerWorkshop = true; continue; } + if (packet.t === "bye") { session.peerLeft = true; continue; } + // The rival noticed the divergence first. Same repair from this side, and + // no answering packet: a desync that echoed would ping-pong. + if (packet.t === "desync") { session.peerDesync = true; continue; } + if (packet.t === "i" && Array.isArray(packet.m) && + Number.isInteger(packet.f)) { + // m[k] is the pad for frame f + k; the newest is the last. + for (let index = 0; index < packet.m.length && index < NET_REDUNDANCY * 2; index++) { + const frame = packet.f + index; + const mask = packet.m[index] | 0; + if (frame < 0 || session.remote.has(frame)) continue; + session.remote.set(frame, mask); + if (frame > session.remoteFrame) { + session.remoteFrame = frame; + session.lastRemoteMask = mask; + } + } + if (Number.isInteger(packet.a)) session.ackFrame = Math.max(session.ackFrame, packet.a); + if (Number.isInteger(packet.s) && packet.s >= session.remoteSimFrame) { + session.remoteSimFrame = packet.s; + if (Number.isInteger(packet.l)) session.remoteLead = packet.l; + } + // Ping, by echo. `w` is the rival's own mark, which we hold and send + // back; `e` is one of ours coming home, so the round trip is a + // subtraction in OUR clock and the two machines need no shared time. + // It reads up to one frame long, because the rival holds our mark until + // their next tick — an honest part of what a press actually costs. + if (Number.isInteger(packet.w)) session.peerStamp = packet.w; + if (Number.isInteger(packet.e) && packet.e > 0) { + const trip = Date.now() - packet.e; + if (trip >= 0 && trip < 4000) { + session.stats.pingMs = session.stats.pings + ? session.stats.pingMs + (trip - session.stats.pingMs) * .15 : trip; + session.stats.pings++; + } + } + if (Array.isArray(packet.h) && packet.h.length === 2) + netNotePeerHash(session, packet.h[0], packet.h[1], remoteSeat); + if (netSession !== session) return; + } + } +} + +function netNotePeerHash(session, frame, hash) { + if (!Number.isInteger(frame)) return; + const mine = session.hashes.get(frame); + if (mine === undefined) { session.peerHashes.set(frame, hash); return; } + if (mine !== hash) { + session.stats.desyncs++; + telemetry("NET_DESYNC", "frame " + frame + " mine " + mine + " theirs " + hash); + netDesyncRepair(session, frame); + } +} + +// A desync used to be counted and then lived with: two machines that are no +// longer playing the same fight went on playing their different ones, and the +// two people found out when one of them died on a screen where they had not +// been hit. +// +// The repair is to stop pretending there are two authorities. The host has +// one, so both seats fall back to the lane where the host IS the authority: +// the challenger goes back to watching the host's stream with its pads going +// up the wire, and the host resumes the streamed versus fight it was already +// publishing for the grandstand. The fight does not stop, it does not rewind, +// and nobody has to re-adopt a state that will not fit through a 2 KiB +// channel. What it costs is the rollback lane's latency, which is the honest +// price of one machine having been wrong. +// +// Both seats have to agree, or the host sits waiting for packets that are not +// coming — so the seat that notices says so, and both then refuse to open a +// rollback session again for a while. Without that cooldown the challenger's +// next hello would deal a fresh session into the same divergence, one second +// later, forever. +const NET_DESYNC_COOLDOWN_MS = 60000; +let netLaneBlockedUntil = 0; + +function netDesyncRepair(session, frame) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + try { session.send({ t: "desync", o: session.originUs, f: frame }); } + catch (_) {} + netEnd("desync"); +} + +// Our state hash at the newest frame both pads are known for — a frame that +// will never be rolled back again, so both seats hash the same thing if +// they are the same game. +function netExchangeHash(session) { + const frame = session.confirmed; + if (frame < 0 || frame % NET_HASH_EVERY !== 0 || session.hashes.has(frame)) return; + const snapshotAfter = session.snapshots.get(frame + 1); + if (!snapshotAfter) return; + // Hash the snapshot taken before frame+1, i.e. the state after `frame`, + // without disturbing the live state: restore is destructive, so hash the + // live state only when it IS that frame. + let hash; + if (session.frame === frame + 1) hash = netStateHash(); + else { + const live = netSnapshot(); + netRestore(snapshotAfter); + hash = netStateHash(); + netRestore(live); + } + session.hashes.set(frame, hash); + if (globalThis.__oskiewarHashTrace) { + netHashTexts.set(frame, netLastHashText); + if (netHashTexts.size > 600) + netHashTexts.delete(netHashTexts.keys().next().value); + } + const theirs = session.peerHashes.get(frame); + if (theirs !== undefined) netNotePeerHash(session, frame, theirs); + session.pendingHash = [frame, hash]; +} + +function netSendInputs(session) { + // Every local pad we have decided on, including the one just scheduled for + // frame + delay. Sending one short of it starves the rival: they stall for + // the frame we are holding, we stall for the frame they are holding, and + // both fights crawl (measured in the browser harness: two thirds of ticks + // spent waiting) even on a wire with no latency at all. + const newest = session.frame + session.delay; + const first = Math.max(0, newest - NET_REDUNDANCY + 1); + const masks = []; + for (let frame = first; frame <= newest; frame++) + masks.push(session.local.get(frame) ?? 0); + // `o` is the deal's own origin, which is to say: which fight this is. Frame + // numbers restart at zero every session, so an input packet from the fight + // before is indistinguishable from a current one by its contents alone — and + // it lands on frames the new fight has not reached yet, on one seat only. + const packet = { t: "i", o: session.originUs, f: first, m: masks, + a: session.remoteFrame, s: session.frame, + l: session.frame - session.remoteSimFrame, w: Date.now() }; + if (session.peerStamp) packet.e = session.peerStamp; + if (session.pendingHash) { packet.h = session.pendingHash; session.pendingHash = null; } + if (session.send(packet)) session.stats.sent++; +} + +// One driver tick of a rollback fight. Ingest the rival, repair the past if +// it was guessed wrong, schedule and mail our own pad, then either step one +// frame or hold — hold when we have guessed as far as we dare past the +// rival's last real pad, or when we are simply running ahead of them. +function netTick() { + const session = netSession; + netDrainInbox(session); + if (!netSession) return; + // The rival told us the two fights came apart. Drop to the streamed lane, + // where there is only one authority, and stay out of the rollback lane long + // enough that the next hello is not just the same divergence again. + if (session.peerWorkshop) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + return; + } + if (session.peerDesync) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("desync-peer"); + return; + } + if (session.peerLeft || Date.now() - session.lastPacketAt > NET_PEER_LOST_MS) { + const seat = session.seat; + netEnd(session.peerLeft ? "rival-left" : "peer-lost"); + globalThis.__oskiewarRemotePad = null; + // The host is left alone in its room; the challenger's bridge is still + // up and goes back to watching whatever the room shows next. + if (seat === 0 && versusActive()) beginVersusLobby(runtime().monotonicUs); + return; + } + const earliest = netEarliestMisprediction(session); + if (earliest !== null) netRollback(session, earliest); + // A round whose end is now behind the confirmed frontier is a round that + // happened. Past this line no rival pad can reach back and unmake it. + if (replayPendingSaveFrame >= 0 && session.confirmed >= replayPendingSaveFrame) + flushPendingRoundReplay(runtime().monotonicUs); + const scheduled = session.frame + session.delay; + if (!session.local.has(scheduled)) { + const pad = typeof gamepad === "function" ? gamepad(0) : null; + session.local.set(scheduled, pad ? inputCommand(pad) : 0); + } + netSendInputs(session); + session.ticks++; + if (session.frame > session.remoteFrame + NET_MAX_ROLLBACK) { + session.stats.waits++; + return; + } + // Frame advantage: if we are more than a delay's worth ahead of where the + // rival says they are, give back one tick in four until we are level. Paced + // by ticks, not frames — a frame that stalls does not advance, and a stall + // keyed on the frame number would hold that frame forever. + // Each observation includes travel time. Equal-speed peers across a WAN + // both appear ahead of the other's old frame; throttling that raw lead + // slowed BOTH games by 25%. Exchange the peer's observation and cancel + // their shared transit lag. The remaining half-difference measures the + // actual clock advantage. Older peers retain the conservative old rule. + const observedLead = session.frame - session.remoteSimFrame; + const ahead = session.remoteLead === null ? observedLead + : (observedLead - session.remoteLead) / 2; + if (ahead > session.delay + 1 && session.ticks % 4 === 0) { + session.stats.stalls++; + return; + } + netSimulateFrame(session, session.frame, false); + session.frame++; + netPrune(session); + netExchangeHash(session); + // The hash exchange can find the mismatch that ends this session. + if (netSession !== session) return; + // A window into the lane for the debug overlay, the agent tools and the + // browser harness: what the fight is costing and whether it is one game. + globalThis.__oskiewarNetStats = { seat: session.seat, frame: session.frame, + // Who this fight believes is in it. A desync hash cannot see an identity + // fault — two machines can agree perfectly about a fight between two + // people who are not there — so the deal's names ride the same window the + // harness and the debug overlay already read. + names: session.deal.fighters.map((entry) => entry.name), + confirmed: session.confirmed, remoteFrame: session.remoteFrame, + hash: session.hashes.get(session.confirmed) ?? 0, + hashFrame: session.confirmed, ...session.stats, + behind: Math.max(0, session.frame - 1 - session.remoteFrame) }; +} + +// The challenger announces itself on the net channel until the host answers +// with a deal; a host that never answers is an older build, and the fight +// falls back to the streamed lane it always had. +function netChallengerHello(now) { + if (workshopMap) return; + if (netSession || roundViewer?.seat !== "challenger" || + typeof roundViewer.sendNet !== "function" || !versusAllowed()) return; + // Not before the shell has finished asking who is here. Identity rides this + // packet once and is then frozen into the deal for the whole fight, and a + // rejoin IS a fresh page load — so the 1 Hz hello below routinely beat the + // session check and dealt a signed-in player in under no name at all. Worse, + // resetRound re-applies the deal every round, so the wrong name was restamped + // even after the real one arrived. A shell with no account system is an older + // build, not a visitor still being asked, and is never held here. + if (webAccountState() && !accountReady()) return; + const at = Date.now(); + if (at < netLaneBlockedUntil) return; + if (at - netHelloSentAt < NET_HELLO_INTERVAL_MS) return; + netHelloSentAt = at; + roundViewer.sendNet({ t: "hello", v: 2, ...netLocalIdentity() }); +} + +// Packets that arrive before a session exists: the challenger's hello lands +// on the host, the host's deal lands on the challenger. Anything else waits +// in the inbox for the session to drain. +function netHandlePreSession(packet) { + if (!packet || typeof packet !== "object") return; + // A packet from the lane we have just fallen out of. Both ends are watching + // the same cooldown, so this is a straggler in flight, not an offer. + if (Date.now() < netLaneBlockedUntil) return; + if (packet.t === "hello" && packet.v !== 2) return; + if (packet.t === "hello" && !roundViewer) { + netPeerHello = { name: packet.name, colors: packet.colors, at: Date.now() }; + return; + } + if (packet.t === "start" && roundViewer?.seat === "challenger" && + packet.v === 2 && Number.isInteger(packet.origin) && + Number.isInteger(packet.delay) && Array.isArray(packet.fighters) && + packet.fighters.length === 2) { + const bridge = roundViewer; + netBegin(packet, 1, (content) => bridge.sendNet(content)); + return; + } + netInbox.push(packet); +} + +// The host's side of the opening: a fresh challenger who said hello gets a +// deal instead of the streamed fight. +function netHostBegin(now) { + if (workshopMap) return false; + // Same door, other side: a deal struck before this seat knows its own handle + // names the host for the rest of the fight, on both screens. + if (webAccountState() && !accountReady()) return false; + const deal = netMakeDeal(); + const room = "ow-" + versusRoomName; + const send = (content) => typeof globalThis.__oskiewarNetSend === "function" + ? globalThis.__oskiewarNetSend(room, content) : false; + if (!send(deal)) return false; + netBegin(deal, 0, send); + return true; +} + +function netDrainHostInbox() { + const inbox = globalThis.__oskiewarNetInbox; + if (!Array.isArray(inbox) || !inbox.length) return; + for (const packet of inbox) { + if (netSession) netInbox.push(packet); + else netHandlePreSession(packet); + } + inbox.length = 0; +} + +// A visitor who arrived through a shared address and found nobody hosting +// takes the room over — the link a friend sent must keep working after the +// sender's tab closed. The chair-holder claims first; a seat-denied watcher +// waits three times as long, so two arrivals at a dead address stagger +// instead of racing, and updateVersusConflict catches the tie anyway. +function updateVersusClaim(now) { + if (globalThis.__oskiewarVersusCapable !== true || !roundViewer) return false; + // Claiming a dead address means hosting, and hosting is playing. Whoever + // arrives next deserves a room with a named fighter standing in it. + if (!versusAllowed()) return false; + // A room with a live host is a fight to join; a room with a stored demo is + // a replay page and keeps being one — versus rooms never record, so only a + // truly empty address falls through to the claim. + if (roundViewer.live || roundViewerDemo || roundViewerMode === "DEMO") { + versusClaimArmedAt = 0; + return false; + } + if (!versusClaimArmedAt) { + versusClaimArmedAt = now; + return false; + } + const wait = roundViewer.seat === "challenger" + ? versusClaimAfterUs : versusClaimAfterUs * 3; + if (now - versusClaimArmedAt < wait) return false; + const name = roundViewer.name; + versusFallbackBridge = roundViewer; + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + versusClaimArmedAt = 0; + versusRoomName = name; + globalThis.__oskiewarRemotePad = null; + beginVersusLobby(now); + telemetry("VERSUS_CLAIM", name); + return true; +} + +// A demo carries the impacts the live pass spawned. Replaying them puts the +// sparks and debris back into a repaint that otherwise only moves bodies. +// The demo loops, so a tick that runs backwards restarts the sweep clean. +function replayViewerImpacts(tick, dt) { + const rows = roundViewerDemo?.impacts || []; + if (tick < roundViewerImpactTick) { + roundViewerImpactTick = -1; + impacts.length = 0; + } + for (const row of rows) + if (row[0] > roundViewerImpactTick && row[0] <= tick) { + const seconds = (row[5] || 300) / 1000; + impacts.push({ x: row[1], y: row[2], z: row[3], + life: seconds, duration: seconds, + death: row[4] === 1, explosion: row[4] === 2 }); + } + roundViewerImpactTick = tick; + updateResultImpactDebris(dt); +} + +function gameBoot() { + nativeHudOverlay = typeof capabilities === "function" && capabilities().hudOverlay === true; + globalThis.__oskiewarWorkshopCommand = workshopCommand; + workshopBase ||= workshopSnapshot(); + if (globalThis.__oskiewarPublishedMap && globalThis.__oskiewarValidateMap) { + workshopMap = globalThis.__oskiewarValidateMap(globalThis.__oskiewarPublishedMap); + workshopTainted = true; + } + syncGameView(); + // The reel harness may boot with the debug overlay lit — safe-zone crops, + // stat chassis, input read-outs — to diagnose framing on a rendered reel. + if (globalThis.__oskiewarDebugOverlay === true) debugHitboxes = true; + // Name the session once. A client-error restart re-runs boot inside the + // same app run, and whoever attached to the session should not lose it to + // a crash the restart exists to paper over. + if (!sessionName) { + seedNames(Math.floor(Math.random() * 4294967296)); + sessionName = pronounceableMatchName(); + } + startedAt = runtime().monotonicUs; + roundStartedAt = startedAt; + lastSimAt = startedAt; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + emitSignal("hello", -1, 1, 0); + shellMode = "MENU"; + titleTransitionAt = null; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + shellPrevious = []; + startInputPending = false; + localControllerPairSeen = false; + localControllerMissing = -1; + navigationPrevious = [[], []]; + roundViewer = globalThis.__oskiewarRoundBridge || null; + if (roundViewer?.start) { + shellMode = "GAME"; + selecting = false; + roundResult = ""; + matchOver = false; + // Watching a fight IS gameplay for the person doing it. This was false on + // every watcher, and the whole match HUD hangs off it: no round clock, no + // VS or WAITING FOR HOST label, no "you are ..." seat line, no status + // tray. That is the "no state updates on screen" @jeffrey reported. + gameplayStarted = true; + matchName = roundViewer.name || ""; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + matchName) : spectatorQr; + roundStartedAt = startedAt - roundIntroDurationUs(); + roundViewerStop = roundViewer.start(handleRoundViewer); + return; + } + if (globalThis.__oskiewarSelfPlay) { + // A harness cast keeps the pre-versus reading of the empty door: nobody + // is holding a controller, so "no opponent" means the climb, never a + // lobby waiting on a friend who cannot exist. + if (!String(globalThis.__oskiewarOpponent || "").trim() || + survivalRequested()) + startSurvivalRun(startedAt, true); + else startSelfPlay(startedAt); + return; + } + if (survivalRequested()) beginSurvival(startedAt); + else if (versusRequested()) { + versusRoomName = sessionName; + beginVersusLobby(startedAt, { title: true }); + } else beginTraining(startedAt); +} + +function resetRound(now, resetMatch = false, keepMap = false) { + if (!netSilent) resetFinalKillReplay(); + resetWorkshopMap(); + rotateLocalMap(keepMap, resetMatch); + if (netSession && !skateparkMap) { + if (netRoundMapIndex < 0) netRoundMapIndex = 0; + else if (!keepMap && roundResult) + netRoundMapIndex = nextRoundMapIndex(netRoundMapIndex); + installRoundMap(netRoundMapIndex); + } + if (replay) { + const nextRoundName = pronounceableMatchName(); + // A versus room is one address for a whole match — the link a friend was + // sent, the socket the fight is riding, the code on the wall. Handing over + // to a new room between rounds would move every watcher and close the + // publisher out from under the fight. Only the broadcast lane hands over, + // where each round IS its own room. + if (!versusLane()) { + if (matchName) publishSpectator(now, { + target: matchName, nextRoundId: "ow-" + nextRoundName, force: true, + }); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + nextRoundName) : null; + } + previousRoundName = matchName; + matchName = nextRoundName; + // Stamped, so a rollback across this rollover takes the entry back with it. + replayRoundMarks.push([demoTick(now), matchName]); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + } + // Terrain belongs to the simulation contract, not the spectator URL. A + // network series keeps one landscape; local rounds rotate authored maps + // independently of their public room names. + configureWorldMap(skateparkMap ? "skatepark" : "station"); + resetSkateRopes(); + terrainPhase = terrainSeed("oskiewar-physics-1-hills"); + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + roundReplayFrames = []; + roundReplayLastAt = 0; + instantReplay = null; + replayOfferPrevious = []; + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; + for (const player of players) { + applyRoster(player, player.rosterIndex); + player.x = player.spawnX; + player.y = airRoundActive() ? floorY - 400 : terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.facing = player.pad === 0 ? 1 : -1; + player.grounded = !airRoundActive(); + player.ducking = false; + player.alive = true; + player.respawnAt = 0; + player.score = 0; + if (resetMatch) player.roundWins = 0; + player.inputX = 0; + player.inputY = 0; + player.lastTap = {}; + player.lastRelease = {}; + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + player.walkSince = 0; + player.attackKind = ""; + player.attackUntil = 0; + player.attackHit = false; + player.blocking = false; + player.blockFlash = 0; + player.shieldLocked = false; + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + player.shieldBrokenAt = 0; + player.windVx = 0; + player.knockVx = 0; + player.shieldVx = 0; + player.gunAmmo = 0; + player.grenadeAmmo = 0; + player.gunAimX = player.facing; + player.gunAimY = 0; + player.gunAimLive = false; + player.gunMode = "HANDGUN"; + player.itemArm = ""; + player.nextGunShotAt = 0; + player.nextSpitAt = 0; + player.spitAt = -Infinity; + player.spitHeavy = false; + player.resultReaction = ""; + player.resultReactionAt = 0; + resultReactionPrevious[player.pad] = []; + player.stance = "NEUTRAL"; + player.itemAction = ""; + player.itemActionStartedAt = 0; + player.itemActionUntil = 0; + player.heldBall = -1; + player.heldPart = -1; + player.heldPlayer = -1; + player.carryArm = ""; + player.grabbedBy = -1; + resetSkate(player); + player.skateboard = skateparkMap && !survivalActive(); + player.ropeIndex = -1; + player.ropeGrabLocked = false; + player.ropeLink = chainLinks; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = 0; + player.boostUntil = 0; + player.skateVx = 0; + player.skateWallSide = 0; + player.swordHeld = false; + player.grabHeld = false; + player.commandStream = []; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + player.partDamage = {}; + player.removedParts = []; + player.fallenBodyGeometry = null; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.poundFrom = 0; + player.poundLevel = 0; + player.standingOn = -1; + player.previousY = player.y; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.botPresses = {}; + player.botAttackAt = now + 420000; + player.botItemAt = now + 600000; + player.botSinkAt = now + 900000; + player.botSinkTaps = 0; + player.botSinkNextAt = 0; + player.botAttackSequence = 0; + player.botJumpAt = now + 900000; + player.survivalTargetLevel = 1; + player.botThreatSeen = 0; + player.botShieldAt = Infinity; + player.botPunishedAt = 0; + player.botScene = null; + player.botGoal = ""; + player.botSubgoal = null; + player.botRngState = (Math.round(now / 1000) ^ + Math.imul(player.pad + 1, 0x9e3779b9)) >>> 0; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.headRoll = 0; + player.headRollRate = 0; + player.headBounceCharge = 0; + player.headPumpDirection = 0; + player.headPumpAt = 0; + // Only a LOCAL hand can still be leaning on a button across the reset; a + // bot's presses were just cleared, and a remote rival's ride their own + // wire — inheriting pad two's local snapshot would suppress them. + player.previous = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]).down.slice() + : player.npc || player.bot || player.remote ? [] + : padSnapshots[player.pad]?.down?.slice() || []; + player.suppressedDirections = player.previous.filter((button) => + button.startsWith("Arrow")); + player.lastButton = "NONE"; + player.lastButtonAt = 0; + } + // A blade dropped by a severed arm is round furniture, not map furniture: + // it exists because a hand stopped existing, and the bell undoes that. Drop + // the dropped ones rather than parking them inactive forever, so a long + // match cannot walk this array up one entry per lost arm. + saberPickups.length = saberPickups.filter((pickup) => pickup.startsActive) + .length; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + if (pickup.active) beginPickupDrop(pickup); + } + for (const tree of bodyTrees) { + tree.growth = 0; + tree.spent = false; + tree.y = terrainFloorAt(tree.x) - 60; + } + gridField.fill(0); + // A new round is a new exchange. Carrying the last one's frames across the + // bell would draw a history that never happened. + for (const meter of frameMeters) meter.length = 0; + nextPowerupAtUs = powerupIntervalUs; + powerupSequence = 0; + roundResult = ""; + roundOverAt = 0; // A fresh round cannot inherit a previous match's deadline. + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + lastSimAt = now; + roundStartedAt = now; + rollWind(now); + resetBalls(now); + if (replay) replay.rounds.push([demoTick(now), windDirection, windMph, + balls.length]); + // Live frame one belongs to fighter one: snap to the head, then let the + // authored sequence cross to the other fighter and pull out. A reel has a + // shorter contract and takes the whole face-off on frame zero below. + cameraCenter = (players[0].x + players[1].x) / 2; + cameraWidth = 960; + cameraCenterY = (players[0].y + players[1].y) / 2 - 90; + cameraContainFloor = 0; + const poseTime = (now - startedAt) / 1000000; + if (reelGroundCamera()) { + // Frame zero is the face-off, not one isolated portrait. The short reel + // intro cannot afford to spend half of itself finding the other fighter. + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.snap({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }); + } else { + const firstHead = runnerWorldGeometry(players[0], poseTime).head; + const portraitWidth = Math.max(96, firstHead.radius * 6.5); + const portraitTarget = { x: firstHead.x, y: firstHead.y, z: firstHead.z }; + cameraDoll.snap({ target: portraitTarget, + position: { x: portraitTarget.x, y: portraitTarget.y, + z: portraitTarget.z - Math.max(portraitWidth * 1.35, + Math.abs(worldNear) + 400) }, + width: portraitWidth, perspective: 0, fov: 55, roll: 0 }); + } + // A rollback fight's fighters are named by the deal, not by whichever + // machine ran the reset: applyRoster above dresses seat one from the local + // account, which on the challenger's screen is the challenger. + if (netSession) netApplyIdentities(netSession.deal); +} + +// The box the camera packs. It is a fighting-game pushbox rather than the +// animated silhouette on purpose: breathing and stride would otherwise pump +// the lens once per idle cycle. Reach spans a fully extended punch or kick so +// throwing one never shoves the frame; live limbs still set the containment +// floor for anything this box misses. +function fighterFrameRect() { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + for (const player of activePlayers()) { + // Trimmed 2026-08-09 — @jeffrey wanted the lens closer to the fight. + // The rect still tracks live position, so jumps and knockbacks widen + // the frame as they happen; this is standing headroom, not arc room. + // Rise trimmed 2026-08-11 — @jeffrey read the old headroom as fighters + // sitting too low in a vertical frame; less sky, more fighter. + // Reach is an anticipation margin, not containment — the live-silhouette + // floor catches an actual extended limb. On a narrow stage every world + // unit of width costs its height times the aspect, so the margin is + // priced by the same factor the fixed shot widths already pay; a phone + // spends its width on fighters, a television on room to swing. + const reach = (isHeadOnly(player) ? 34 : isPogo(player) ? 56 : 104) * + portraitPull(); + const rise = isHeadOnly(player) ? 48 : isPogo(player) ? 128 : 150; + left = Math.min(left, player.x - reach); + right = Math.max(right, player.x + reach); + top = Math.min(top, player.y - rise); + // Feet swing below the terrain contact point on slopes. Pack their full + // projected arc so camera yaw cannot shave them off at a safe-zone edge. + bottom = Math.max(bottom, player.y + (isHeadOnly(player) ? 18 : 38)); + } + // A shot remains physical until it hits something, so it remains a camera + // subject too. Include both ends of its swept path to prevent a fast round + // flickering outside the action-safe frame between simulation ticks — + // but only while it stays near the fight. In the padded room the leash + // spans the whole map, so every shot is framed like it always was; it + // exists because on the old street a ricocheting stray dragged the lens + // twenty thousand units from two idle fighters and the draw span took + // the Xbox to eleven frames a second. + const bulletLeash = 5200; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + if (!players.some((player) => + Math.abs(bullet.x - player.x) < bulletLeash && + Math.abs(bullet.y - player.y) < bulletLeash)) continue; + const previousX = bullet.previousX ?? bullet.x; + const previousY = bullet.previousY ?? bullet.y; + left = Math.min(left, previousX - 32, bullet.x - 32); + right = Math.max(right, previousX + 32, bullet.x + 32); + top = Math.min(top, previousY - 32, bullet.y - 32); + bottom = Math.max(bottom, previousY + 32, bullet.y + 32); + } + return { left, right, top, bottom }; +} + +// How far this stage is from a 16:9 television, as a lens factor. The fixed +// shot widths in this file — the framing floor, the killcam stand-off, the +// intro and result close-ups — are all width constants tuned on a widescreen, +// and the same width on a narrow stage reads twice as distant because the +// screen has no width to spare. Multiplying a CONSTANT by this converts it to +// the stage at hand. Multiplying a packed rect by it is how portrait play used +// to lose fighters off the screen edges: the pack already knows the aspect, +// and shrinking its answer shrinks the one axis that was load-bearing. +const portraitPull = () => clamp(cameraAspect / (16 / 9), .52, 1); +// A reel ends on the win. Nobody is holding a controller, so there is no wide +// shot to hand back to — the last thing in frame should be the winner's face. +const reelCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true && + capabilities().reelFullUi !== true; +// Ground coverage belongs to every 9:16 oven burn, including the full-UI +// lane. `reelCamera` is narrower: it also opts into minimal-HUD winner framing. +// Reusing that narrower predicate for terrain left full-UI reels with the TV +// slab edge behind the lens, exposing a hard cut beneath the floor. +const reelGroundCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true; + +// Rect-pack: the camera width that makes a world rect exactly fill the +// action-safe frame. Whichever axis runs out first decides the lens, so a +// stacked pair frames as tightly as a spread one — and because each term +// carries the live stage aspect, the answer is exact for a phone held +// upright, a television, and an ultrawide alike. +// +// A reel is the one place the pack is allowed to lie. A 9:16 render with +// nobody steering trades its side margins for bigger fighters on purpose — +// that is how the reels were tuned to read. Live play never gets that trade: +// a fighter cropped off a screen edge is a fighter you cannot play. +function rectPackWidth(rect) { + const safe = actionSafeRect(); + return Math.max( + (rect.right - rect.left) * (stageRight - stageLeft) / + Math.max(1, safe.right - safe.left), + (rect.bottom - rect.top) * cameraAspect * (stageBottom - stageTop) / + Math.max(1, safe.bottom - safe.top)) * + (reelCamera() ? portraitPull() : 1); +} +// A fighter reduced to a bouncing head is a few dozen units tall. Without a +// floor the pack would keep closing until one limb filled the screen. +// Lowered with the reach/rise trim above: the closest the lens may sit. +// The tightest the automatic camera may go. It scales with the same pull, or a +// portrait shot closes to the pull and then hits a floor sized for a television. +// The versus lobby holds a mid shot instead: one body under a close-up lens +// filled the screen and sat on top of the very instruction the room exists to +// show, and a visitor deciding whether to share the address wants to see the +// room they are inviting somebody into. Under the wordmark the same lobby +// sits for a portrait — the title is a face, and starting is the pullback +// that reveals the room. +const frameFloorWidth = () => + (lobbyActive() ? shellMode === "MENU" ? 430 : 860 + : compactLayout() ? 215 : 315) * portraitPull(); + +// Terrain is flat color, so it only has to reach as far as the lens can see. +// Submitting the whole arena pushed its far corners past the native ±30000 +// coordinate guard whenever the camera closed in or sat against a wall, which +// culled the ground quad and left the clear color where the stage should be. +function terrainSpan() { + // A lens sees more floor than its nominal width says — perspective, yaw, + // and the orbiting killcam all sweep past it, and a close shot's bottom + // corners un-project far along the ground plane. A fixed apron past the + // width keeps the sheet under every corner of the frame without doubling + // the whole street's quad count when the camera is wide; the near clipper + // has owned the old ±30000 native guard since it learned to cut faces + // instead of culling them. + const reach = cameraDoll.width + 2600; + const worldTop = survivalActive() ? survivalCeilingY : ceilingY; + return { left: Math.max(worldLeft, cameraCenter - reach), + right: Math.min(worldRight, cameraCenter + reach), + top: Math.max(worldTop, cameraCenterY - reach), + bottom: Math.min(parkDeepest, cameraCenterY + reach) }; +} + +function updateCamera(dt) { + if (survivalActive() || skateparkMap) return; + const rect = fighterFrameRect(); + // Look slightly ahead of fast movement so zoom starts before a fighter + // reaches the safe edge instead of reacting after the crossing. + const lookAhead = .2; + let leftDrift = 0; + let rightDrift = 0; + let upDrift = 0; + let downDrift = 0; + for (const player of activePlayers()) { + const dx = (player.vx + (player.windVx || 0) + (player.knockVx || 0) + + (player.shieldVx || 0)) * lookAhead; + const dy = player.vy * lookAhead; + leftDrift = Math.min(leftDrift, dx); + rightDrift = Math.max(rightDrift, dx); + upDrift = Math.min(upDrift, dy); + downDrift = Math.max(downDrift, dy); + } + rect.left += leftDrift; + rect.right += rightDrift; + rect.top += upDrift; + rect.bottom += downDrift; + // AIR DROP has no floor: the starting room cannot cap vertical framing + // once fighters fall farther apart than that room was tall. + const maxWidth = airRoundActive() ? Infinity : Math.max(worldRight - worldLeft, + (floorY - ceilingY) * cameraAspect); + // Perspective orbit and uneven ground skew the projected silhouette beyond + // its orthographic pushbox. A small fixed overscan keeps complete bodies in + // the action-safe rectangle without making the compact room feel distant. + const packWidth = rectPackWidth(rect); + const desiredWidth = clamp(packWidth * 1.08, frameFloorWidth(), maxWidth); + const widthSpeed = desiredWidth > cameraWidth ? 17 : 5.5; + const widthBlend = 1 - Math.exp(-Math.max(0, dt) * widthSpeed); + cameraWidth += (desiredWidth - cameraWidth) * widthBlend; + // An exponential ease always runs a fixed distance behind a target that is + // moving steadily, and the distance is the target's rate over the blend — + // about 160 units of width when the pair is separating at a walk. In the + // cube that debt was invisible: the two walls were 980 apart, so separation + // stopped growing before the debt could show. On a station twice that wide + // it is ten pixels of fighter hanging outside the action-safe rect, every + // frame, for as long as the two of them keep running apart. + // + // So containment gets a floor, and the ease keeps the rest. `rectPackWidth` + // is exactly the width that fits the pack inside the safe rect with nothing + // to spare; the 8% overscan above it is comfort and may arrive late. The + // camera may therefore be behind on looking good, and never behind on + // holding the fight. + cameraWidth = Math.max(cameraWidth, Math.min(packWidth, maxWidth)); + const halfWidth = cameraWidth / 2; + const halfHeight = cameraWidth / cameraAspect / 2; + // Center comes from the same rect the width did, so the frame pans down as + // the action drops and rides up onto the platform with it. + let desiredCenter = cameraWidth >= worldRight - worldLeft + ? (worldLeft + worldRight) / 2 + : clamp((rect.left + rect.right) / 2, + worldLeft + halfWidth, worldRight - halfWidth); + // Feet plant a capsule radius under the floor line, and the ground plane + // keeps covering that far past it, so the frame may sit that low rather + // than widening just to recentre a standing pair. + const footRoom = 40; + // Aim below the fighters' middle, not at it. A vertical frame centered on + // the bodies spends its whole upper half on sky; leaning the aim down + // rides them into the upper third with ground filling in beneath. The + // lean is priced against how much of the frame the pack already fills: + // in the cube's close-ups two fighters stand most of the view tall, and + // the full tower-era lean pushed their heads over the action-safe line — + // so it fades out as the pack closes on the frame's height. + const packFill = clamp((rect.bottom - rect.top) / Math.max(1, halfHeight), + 0, 2); + const aimLean = halfHeight * .22 * clamp((1.8 - packFill) / .8, 0, 1); + let desiredCenterY = airRoundActive() ? (rect.top + rect.bottom) / 2 + aimLean + : halfHeight * 2 >= floorY - ceilingY + ? (ceilingY + floorY) / 2 + : clamp((rect.top + rect.bottom) / 2 + aimLean, + ceilingY + halfHeight, parkDeepest + footRoom - halfHeight); + // Fold containment into the target before easing. Clamping the live camera + // after easing caused a one-frame reset whenever a fighter crossed the safe + // edge; the pack width now absorbs that motion while the center remains + // continuous. + const containLeft = rect.right - halfWidth * .92; + const containRight = rect.left + halfWidth * .92; + if (containLeft <= containRight) + desiredCenter = clamp(desiredCenter, containLeft, containRight); + const containTop = rect.bottom - halfHeight * .92; + const containBottom = rect.top + halfHeight * .92; + if (containTop <= containBottom) + desiredCenterY = clamp(desiredCenterY, containTop, containBottom); + const centerBlend = 1 - Math.exp(-Math.max(0, dt) * 9); + cameraCenter += (desiredCenter - cameraCenter) * centerBlend; + cameraCenterY += (desiredCenterY - cameraCenterY) * centerBlend; +} + +function updateCameraDoll(dt, now) { + if (freeForAll() || airRoundActive()) { + updateCamera(dt); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + const growth = dt > 0 ? Math.max(0, + containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, containmentWidth + growth / 19); + const naturalWidth = cameraWidth * 1.015; + if (naturalWidth < cameraContainFloor * .92) + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, 1 - Math.exp(-dt * 1.6)); + const width = Math.max(naturalWidth, cameraContainFloor) * playerCameraZoom; + cameraDoll.track({ target, position: { + x: target.x + Math.sin(playerCameraYaw) * width * 1.35, + y: target.y - width * (.026 + playerCameraPitch), + z: -Math.cos(playerCameraYaw) * width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (skateparkMap && !survivalActive() && shellMode === "GAME") { + const rider = players[netSession?.seat || 0]; + const width = Math.max(1100, 900 * cameraAspect) * playerCameraZoom; + const half = width / 2; + const desiredX = clamp(rider.x + clamp(rider.vx * .18, -300, 300), + worldLeft + half, worldRight - half); + const desiredY = rider.y - 180; + const blend = 1 - Math.exp(-dt * 9); + cameraCenter += (desiredX - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth = width; + cameraDoll.track({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, z: -width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + const introAge = now - roundStartedAt; + if (survivalActive()) { + const runner = players[0]; + const framedWidth = survivalFrameWidth * playerCameraZoom; + const halfHeight = framedWidth / cameraAspect / 2; + const desiredY = clamp(runner.y + halfHeight * .18, + survivalCeilingY + halfHeight, floorY + 40 - halfHeight); + const blend = 1 - Math.exp(-Math.max(0, dt) * 7); + cameraCenter += ((worldLeft + worldRight) / 2 - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth += (framedWidth - cameraWidth) * blend; + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter, y: cameraCenterY, + z: -framedWidth * 1.35 }, + width: framedWidth, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (roundResult) { + updateResultReactions(now); + const age = Math.max(0, (now - roundOverAt) / 1000000); + // The cinematic hands back to the wide shot at 1.45s so play can resume. + // A reel has no play to resume into, and handing back mid-celebration + // pulled the camera off the winner's face just as the hearts arrived, so + // there the shot is allowed to hold until the recording stops. + if (deathCinematic && (age < 1.45 || (reelCamera() && age < 6))) { + if (age < .11) return; + const loser = players[deathCinematic.loserPad]; + const winner = players[deathCinematic.winnerPad]; + const loserHead = loser.frozenGeometry?.head || + runnerWorldGeometry(loser, (now - startedAt) / 1000000).head; + const winnerHead = winner?.frozenGeometry?.head || (winner + ? runnerWorldGeometry(winner, (now - startedAt) / 1000000).head + : { x: cameraCenter, y: cameraCenterY, z: 0 }); + // The killcam used to sit inside the winner's own head, so the winner + // had to be culled or their body would have filled the lens — which is + // why the fighter who had just won blinked out for three quarters of a + // second. It stands off their shoulder now: back along the line between + // the two of them, raised, and aimed at a point most of the way to the + // fighter going down. Both are in the frustum, so nothing is hidden to + // make the shot and nobody vanishes. + // + // Every distance is drawn from the gap between the heads, because the + // pair can be a step apart or the width of the stage apart, and a fixed + // stand-off frames only one of those. + const headGap = Math.max(320, Math.abs(loserHead.x - winnerHead.x)); + // Center the complete pair. Favoring the loser pushed the winner across + // the viewport edge during the eased handoff. + const focus = { x: lerp(winnerHead.x, loserHead.x, .5), + y: lerp(winnerHead.y, loserHead.y, .5), + z: lerp(winnerHead.z, loserHead.z, .5) }; + const shoulder = { x: focus.x, y: focus.y, + // Stay outside the whole arena depth. The old close killcam entered + // the world volume and near-clipped limbs, floor, and wall polygons. + z: focus.z - Math.max(headGap * 1.3, Math.abs(worldNear) + headGap) }; + // Wider than the old close-up had to be, because it now has to hold two + // fighters rather than one — the 64° lens buys most of that back. Past + // about a 1300 gap this would open onto empty stage, so beyond there it + // settles toward the span the returning wide shot uses. + const shotWidth = Math.min(headGap * 1.7, headGap + 900) * portraitPull(); + if (age < .86) { + cameraDoll.track({ target: focus, position: shoulder, + width: shotWidth, perspective: 0, fov: 55, roll: 0 }, dt, 11); + return; + } + // Reels celebrate instead of returning. The lens narrows onto the + // winner's head rather than the camera dollying toward it: the standoff + // above is deliberately outside the arena depth, and flying in would put + // the floor and the winner's own limbs back through the near plane. + if (reelCamera() && winner) { + const push = clamp((age - .86) / .5, 0, 1); + const headFocus = { x: winnerHead.x, y: winnerHead.y, z: winnerHead.z }; + cameraDoll.track({ target: headFocus, position: { + x: headFocus.x, y: headFocus.y, z: shoulder.z }, + width: lerp(shotWidth, 430 * portraitPull(), push), + perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const returnAmount = clamp((age - .86) / .59, 0, 1); + const midpoint = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const span = Math.max(900, Math.abs(players[1].x - players[0].x) + 540) * + portraitPull(); + cameraDoll.track({ target: midpoint, + position: { x: midpoint.x, y: midpoint.y, + z: lerp(shoulder.z, midpoint.z - span * 1.2, returnAmount) }, + width: lerp(shotWidth, span, returnAmount), + perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const horizontalSpan = Math.abs(players[1].x - players[0].x); + const verticalSpan = Math.abs(players[1].y - players[0].y) * cameraAspect; + const closeWidth = Math.max( + Math.max(820, horizontalSpan + 540, verticalSpan + 520) * portraitPull(), + rectPackWidth(fighterFrameRect()) * 1.22); + cameraDoll.track({ target, + position: { x: target.x, + y: target.y, + z: target.z - closeWidth * 1.2 }, + width: closeWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 7); + return; + } + if (reelGroundCamera() && introAge < reelOpeningHoldUs) { + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + if (introAge < roundIntroDurationUs()) { + // One elapsed-time story: first fighter, second fighter, title pullback, + // then the fight. + // Nothing is counted in rendered frames, so live variable speed and an + // offline slow-motion burn tell the identical introduction. + const age = introAge / 1000000; + const firstEnd = 1; + const secondEnd = 2; + const poseTime = (now - startedAt) / 1000000; + const headOf = (player) => + (player.frozenGeometry || runnerWorldGeometry(player, poseTime)).head; + // Enough room around a head to read as a portrait rather than an eyeball. + const faceWidth = (head) => Math.max(96, head.radius * 6.5); + + const opening = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const openingWidth = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + + let target; + let width; + if (age < secondEnd) { + // Frame one is already on player one. Track easing carries the camera + // across to player two without a cut. + const head = headOf(players[age < firstEnd ? 0 : 1]); + target = { x: head.x, y: head.y, z: head.z }; + width = faceWidth(head); + } else { + const out = clamp((age - secondEnd) / + (roundIntroDurationUs() / 1000000 - secondEnd), 0, 1); + const eased = out * out * (3 - out * 2); + const head = headOf(players[1]); + target = { x: lerp(head.x, opening.x, eased), + y: lerp(head.y, opening.y, eased), + z: lerp(head.z, opening.z, eased) }; + width = lerp(faceWidth(head), openingWidth, eased); + } + // Stand off outside the arena depth. The framing is orthographic, so the + // distance costs nothing and `width` alone decides how close the shot + // reads — but a lens parked a face's width from a head sits inside the + // world volume and near-clips the head it came to look at, which is the + // same trap the killcam fell into and had to be pulled back out of. + const standOff = Math.max(width * 1.35, Math.abs(worldNear) + 400); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, z: target.z - standOff }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + // Measure complete animated silhouettes before rendering. This used to run + // as a final paint-time correction, which made the viewport skip a frame at + // the safe-zone edge. + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + // Lead the floor by exactly the debt the doll's own ease is about to run up. + // `track` pulls back at speed * 1.9 — 19 here — so a floor growing at R units + // a second settles 19 times slower than that, and the doll sits R/19 units of + // width behind it for as long as the growth lasts. In the cube that debt was + // unreachable: the walls were 980 apart and separation stopped growing long + // before it could accumulate. On a station twice that wide, two fighters + // running in opposite directions hold the growth up indefinitely, and the + // debt reads as a hand hanging outside the action-safe rect every frame. + // + // Adding the debt to the target is not a fudge — it is what makes the ease + // arrive where the fighters actually are rather than where they were. It + // costs nothing when nothing is moving apart, because the growth is zero and + // the lead is zero, so a settled fight frames exactly as it always did. + const containmentGrowth = dt > 0 + ? Math.max(0, containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, + containmentWidth + containmentGrowth / 19); + // A small overscan absorbs animated hands and feet before + // they reach the action-safe edge without loosening the close fight shot. + const naturalWidth = cameraWidth * 1.015; + // Hysteresis prevents a fighter hovering at the safe edge from repeatedly + // switching between close and wide framing. The band and the pushbox above + // are tuned together so the floor never has to release during an idle cycle; + // if it does, the lens breathes in time with the fighter's own animation. + if (cameraContainFloor > naturalWidth && + naturalWidth < cameraContainFloor * .92) { + const release = 1 - Math.exp(-Math.max(0, dt) * 1.6); + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, release); + } + const framedWidth = Math.max(naturalWidth, cameraContainFloor) * + (reelCamera() ? 1 : playerCameraZoom); + // Automatic framing stays orthographic, preventing camera movement from + // bending the arena. The right stick may still rotate the diorama explicitly. + const tilt = .026 + playerCameraPitch; + const dolly = 1.35; + cameraDoll.track({ target, + position: { + x: cameraCenter + Math.sin(playerCameraYaw) * framedWidth * dolly, + y: cameraCenterY - framedWidth * tilt, + z: -Math.cos(playerCameraYaw) * framedWidth * dolly }, + width: framedWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 10); +} + +function freezeFinalFrame(now, livePad = -1) { + const poseTime = (now - startedAt) / 1000000; + for (const player of activePlayers()) { + if (player.pad === livePad) { + delete player.frozenGeometry; + delete player.frozenAt; + continue; + } + player.frozenGeometry = runnerWorldGeometry(player, poseTime); + player.frozenAt = now; + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); +} + +function finishRound(now) { + if (roundResult) return; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + captureRoundReplay(now, true); + let roundPan = 0; + const winner = roundWinner(); + if (!winner) { + roundResult = "TIE"; + emitSignal("tie", -1, players[0].score, players[1].score); + } + else { + roundPan = panPlayer(winner); + winner.roundWins += 1; + matchOver = winner.roundWins >= matchWins; + roundResult = winner.name + (matchOver ? " WINS MATCH" : " WINS ROUND"); + emitSignal(matchOver ? "matchwin" : "roundwin", winner.pad, + winner.roundWins, winner.score); + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); + roundOverAt = now; + for (const player of players) player.vx = 0; + playDrum("clap", 1.2, roundPan); + captureFrameTelemetry(now, true); + saveRoundReplay(now); + // A deferred round still needs its replay to be filed from; the flush that + // files it closes the match out afterwards. + if (matchOver && !netSession) finishReplay(); +} + +function resultCardText(display = false) { + if (roundResult === "TIE") return { winner: "tie", action: "" }; + const encoded = roundResult.match(/^(@\S+)\s+WINS\b/i); + const winner = encoded?.[1] || + (roundWinner()?.name || "TIE"); + const handle = display && globalThis.__oskiewarDeviceHandles?.[roundWinner()?.pad]; + return { winner: (handle || winner).toLowerCase(), action: "" }; +} + +function updateResultReactions(now) { + const winningPad = roundWinner()?.pad ?? -1; + for (const player of players) { + const down = inputPads[player.pad]?.down || []; + const previous = resultReactionPrevious[player.pad]; + const laughChord = down.includes("A") && down.includes("B") && + (!previous.includes("A") || !previous.includes("B")); + const pressed = laughChord ? "LAUGH" : down.find((button) => + !previous.includes(button)); + if (pressed) { + const winner = player.pad === winningPad; + if (pressed === "ArrowLeft") player.facing = -1; + if (pressed === "ArrowRight") player.facing = 1; + player.resultReaction = winner + ? ({ LAUGH: "LAUGH", A: "KICK", B: "PUNCH", X: "POSE", Y: "DANCE", + ArrowLeft: "DASH", ArrowRight: "DASH", ArrowUp: "AIR", + ArrowDown: "CROUCH" }[pressed] || "DANCE") + : ({ A: "CRY", B: "WOE", X: "SULK", Y: "WIGGLE" }[pressed] || + "WOE"); + player.resultReactionAt = now; + if (player.resultReaction === "LAUGH") + emitSignal("laugh", player.pad, 1, 0); + else { + playSine(winner ? 520 : 145, .1); + emitSignal("reaction", player.pad, winner ? 1 : -1, 0); + } + } + resultReactionPrevious[player.pad] = down.slice(); + } +} + +function quantizedInput(pad, suppressed = []) { + const held = pad.down; + const active = (button) => held.includes(button) && !suppressed.includes(button); + let horizontal = (active("ArrowRight") ? 1 : 0) - + (active("ArrowLeft") ? 1 : 0); + let vertical = (active("ArrowUp") ? 1 : 0) - + (active("ArrowDown") ? 1 : 0); + if (!horizontal && Math.abs(pad.leftX) >= 0.48) horizontal = pad.leftX > 0 ? 1 : -1; + if (!vertical && Math.abs(pad.leftY) >= 0.48) vertical = pad.leftY > 0 ? 1 : -1; + return { horizontal, vertical }; +} + +function remember(player, button) { + player.lastButton = buttonLabel(button); + player.lastButtonAt = runtime().monotonicUs; + const command = { A: "/", B: "*", X: ")", Y: "+", + LeftShoulder: "+", RightShoulder: "+" }[button] || player.lastButton; + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"].includes(button)) + recordCommand(player, command, player.lastButtonAt); + telemetry("FIGHT_BUTTON", player.name + " " + player.lastButton); +} + +function recordCommand(player, label, now) { + const previous = player.commandStream.at(-1); + if (previous?.label === label && now - previous.at < 40000) return; + player.commandStream.push({ label, at: now }); + while (player.commandStream.length > commandStreamDepth) + player.commandStream.shift(); +} + +function clearWeaponLoadout(player) { + player.gunAmmo = 0; player.grenadeAmmo = 0; player.swordHeld = false; + player.gunMode = "HANDGUN"; player.itemArm = ""; + player.itemAction = ""; player.itemActionUntil = 0; + player.gunAimLive = false; player.itemAimLocked = false; +} + +function fireGun(player, input) { + if (unarmedRoundActive()) { clearWeaponLoadout(player); return; } + const now = runtime().monotonicUs; + const pose = gunPose(player, now, input); + player.gunAimX = pose.dx; + player.gunAimY = pose.dy; + const smg = player.gunMode === "RUBBER SMG"; + const rocket = player.gunMode === "ROCKET LAUNCHER"; + const laser = player.gunMode === "SPACE LASER"; + if (rocket) { + grenades.push({ x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * 2850, vy: pose.dy * 2850, owner: player.pad, + fuse: 3.2, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0, rocket: true }); + while (grenades.length > 12) grenades.shift(); + player.gunAmmo -= 1; + player.nextGunShotAt = now + 650000; + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 240000; + player.pendingMoveLabel = "ROCKET " + player.gunAmmo; + playDrum("kick", 1.15, panPlayer(player)); + playSine(92, .22); + emitSignal("rocket", player.pad, pose.dx, pose.dy); + return; + } + // Automatic means a fast succession of discrete rounds, never a shotgun + // fan. Holding fire schedules the next SMG round below. + const shots = 1; + for (let shot = 0; shot < shots; shot++) { + bullets.push({ + x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * (laser ? 9600 : smg ? 5000 : 4200), + vy: pose.dy * (laser ? 9600 : smg ? 5000 : 4200), + owner: player.pad, life: 1, rubber: smg, laser, + safeUntil: now + 100000, + }); + } + while (bullets.length > 24) bullets.shift(); + player.gunAmmo -= shots; + player.nextGunShotAt = now + (laser ? 340000 : smg ? 85000 : 220000); + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + (laser ? 210000 : 170000); + player.pendingMoveLabel = + (laser ? "LASER " : smg ? "RUBBER SMG " : "FIRE ") + player.gunAmmo; + for (let shot = 0; shot < shots; shot++) { + playDrum(laser ? "whoosh" : smg ? "block" : "hat", + laser ? 1.35 : smg ? .62 + shot * .08 : 1.05, panPlayer(player)); + playSine(laser ? 1180 : (smg ? 310 : 760) + shot * 55, + laser ? .13 : smg ? .055 : .08); + } + emitSignal(laser ? "laser" : "bullet", player.pad, pose.dx, pose.dy); +} + +// The mouth used by both face paint and projectile spawn. Its coordinates are +// authored in face-space, then rotated with a bodyless head. Keeping this one +// transform prevents the visible lips and the physical glob from separating +// while the head rolls. +function spitMouthPose(player) { + const radius = 22; + const direction = player.facing || 1; + const head = { x: player.x, y: player.y - radius }; + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const localX = direction * radius * .2; + const localY = radius * .3; + const offsetX = localX * cosRoll - localY * sinRoll; + const offsetY = localX * sinRoll + localY * cosRoll; + // Position and aim are related but not identical: the mouth sits low on the + // face, while spit travels mostly forward with only a small downward pitch. + // Using center->mouth as velocity made that low placement dominate the shot + // and swing it sideways as the head rolled. + // The runner's `facing` sign names its mirrored drawing side; the visible + // face normal points away from that sign. Treating it as the normal sent the + // release upper-left while the mouth presented lower-right. + const aimLocalX = -direction; + const aimLocalY = -.22; + const aimX = aimLocalX * cosRoll - aimLocalY * sinRoll; + const aimY = aimLocalX * sinRoll + aimLocalY * cosRoll; + // Screen/world Y grows downward. Head roll owns the sideways swing, but a + // spit release always pitches below the mouth instead of becoming an + // upward shot during the top half of a roll. + const downwardAimY = Math.abs(aimY); + const aimLength = Math.hypot(aimX, downwardAimY) || 1; + return { + x: head.x + offsetX, + y: head.y + offsetY, + outX: aimX / aimLength, + outY: downwardAimY / aimLength, + roll, direction, + }; +} + +function spit(player, heavy = false) { + const now = runtime().monotonicUs; + if (now < (player.nextSpitAt || 0)) return; + const mouth = spitMouthPose(player); + const direction = mouth.direction; + // A rolling head spits WHERE ITS MOUTH POINTS. The lob leaves along the + // head's current angle, so aim on a bodyless head is a timing skill — wait + // for the roll to face your rival, or spit skyward and let it rain. Bodied + // fighters have no roll and lob flat-forward as before. headRoll is sim + // state (integrated in updatePlayers), so the re-sim agrees. + // Release at the visible lips, mostly face-forward with a slight downward + // pitch. Both the spawn and aim use the same rolling face transform. + const speed = heavy ? 520 : 680; + const toss = { x: mouth.outX * speed, y: mouth.outY * speed }; + bullets.push({ + x: mouth.x, y: mouth.y, z: player.z, + previousX: mouth.x, previousY: mouth.y, + vx: toss.x, vy: toss.y, + owner: player.pad, life: 1, spit: true, heavy, + // Let the glob visibly clear the lips and the spitter's own fallen limbs. + // Without this, a bodyless fighter often spat directly into its debris + // halo and produced only a yellow impact puff on the release frame. + safeUntil: now + 220000, + }); + while (bullets.length > 24) bullets.shift(); + player.nextSpitAt = now + (heavy ? 520000 : 260000); + player.spitAt = now; + player.spitHeavy = heavy; + player.lastButton = heavy ? "HEAVY SPIT" : "SPIT"; + player.lastButtonAt = now; + player.pendingMoveLabel = player.lastButton; + playSine(heavy ? 118 : 190, heavy ? .16 : .1); + playDrum(heavy ? "kick" : "hat", heavy ? .82 : .55, panPlayer(player)); + emitSignal("spit", player.pad, heavy ? 2 : 1, direction); +} + +function throwGrenade(player, input = null) { + if (unarmedRoundActive()) { clearWeaponLoadout(player); return; } + const now = runtime().monotonicUs; + const aimX = input?.horizontal || player.facing; + const aimY = input ? -input.vertical : -.25; + const length = Math.hypot(aimX, aimY) || 1; + grenades.push({ x: player.x + player.facing * 150, + y: player.y - (player.ducking ? 80 : 145), z: player.z, + vx: aimX / length * 1950, vy: aimY / length * 1950, + owner: player.pad, + fuse: 1.15, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0 }); + while (grenades.length > 12) grenades.shift(); + player.grenadeAmmo -= 1; + player.itemAction = "THROW"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 260000; + player.pendingMoveLabel = "GRENADE " + player.grenadeAmmo; + playDrum("kick", .95, panPlayer(player)); + emitSignal("grenade", player.pad, player.facing, player.ducking ? 1 : 0); +} + +function beginPickupDrop(pickup) { + if (unarmedRoundActive()) { pickup.active = false; pickup.dropping = false; return; } + const live = activePlayers().filter(p => p.alive); + const all = [...gunPickups, ...saberPickups, ...grenadePickups]; + const slot = Math.max(0, all.indexOf(pickup)); + if (airRoundActive()) { + const middle = live.reduce((sum, p) => sum + p.x, 0) / Math.max(1, live.length); + pickup.x = clamp(middle + ((slot % 5) - 2) * 190, + worldLeft + 150, worldRight - 150); + pickup.y = Math.min(...live.map(p => p.y), floorY + 1e9) - 800 - slot * 110; + pickup.dropLandingY = null; + pickup.dropVy = 960; + } else { + pickup.dropLandingY = surfaceYAt(pickup.x, floorY) - 70; + pickup.y = Math.min(pickup.dropLandingY - 520, floorY - 900); + pickup.dropVy = 0; + } + pickup.dropping = true; + pickup.respawnAt = 0; +} + +function updateFallingPickups(dt, now) { + if (unarmedRoundActive()) return; + const live = activePlayers().filter(p => p.alive); + const lower = live.length ? Math.max(...live.map(p => p.y)) + 1000 : floorY + 1000; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + if (!pickup.active) { + if (airRoundActive() && pickup.startsActive) { + if (!pickup.respawnAt) pickup.respawnAt = now + 4000000; + if (now >= pickup.respawnAt) { pickup.active = true; beginPickupDrop(pickup); } + } + continue; + } + if (!pickup.dropping) continue; + pickup.dropVy = Math.min(airRoundActive() ? 1100 : 1400, + (pickup.dropVy || 0) + 1900 * dt); + pickup.y += pickup.dropVy * dt; + if (airRoundActive()) { + if (pickup.y > lower) beginPickupDrop(pickup); + } else if (pickup.y >= pickup.dropLandingY) { + pickup.y = pickup.dropLandingY; + pickup.dropVy = 0; + pickup.dropping = false; + } + } +} + +function updateGunPickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of gunPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.gunAmmo = Math.min(30, player.gunAmmo + pickup.amount); + player.gunMode = pickup.kind || "HANDGUN"; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, player.gunMode + " +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 1, pickup.amount); + break; + } + } +} + +// A saber is picked up the way a gun is and kept the way a limb is. It needs +// a free arm to take, it lives on `swordHeld` rather than in an ammo count, +// and `meleeSpecFor` is what spends it — every hand strike gets half again +// its reach while the blade is in the hand. Nothing here fires. +function updateSaberPickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of saberPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || player.swordHeld || + !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, + pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.swordHeld = true; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "LIGHT SABER"); + playDrum("clap", 1.25, panPlayer(player)); + playSine(520, .14); + emitSignal("saber", player.pad, 1, 0); + break; + } + } +} + +function updateGrenadePickups(now) { + if (unarmedRoundActive()) return; + const poseTime = (now - startedAt) / 1000000; + for (const pickup of grenadePickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.grenadeAmmo = Math.min(4, player.grenadeAmmo + pickup.amount); + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "GRENADE +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 2, pickup.amount); + break; + } + } +} + +// Ripe fruit is a new body and fifteen seconds. The clock is `roundElapsedUs` +// counting up toward `roundDurationUs`, so winding it back is what "adds +// time" means here — and it is clamped at zero, because a tree cannot make +// the round longer than a round. +// The tree leans in off its wall, so both the picture and the pickup test have +// to agree about where the fruit ended up. One function owns that. +// The tree climbs its wall more than it leans off it, because a fighter pinned +// against that wall still has to be able to reach the fruit from a jump. One +// function owns the geometry so the picture and the pickup test agree. +function treeFruit(tree) { + const toward = tree.x < (worldLeft + worldRight) / 2 ? 1 : -1; + // Cube-scale tree. The tower's tree leaned three tiles into a room that + // had thirty; the same lean in a ten-tile cube put ripe fruit inside a + // spawn-idle fighter's reach, and two fighters who never moved wound the + // clock back fifteen seconds every eighteen — no round could end. This + // tree climbs about two tiles of wall, leans under one tile in, and hangs + // its fruit high enough that picking it is a jump at the wall, never a + // side effect of standing near one. + const reach = 45 + 150 * tree.growth; + return { x: tree.x + toward * (reach * .35 + 30), y: tree.y - reach * 1.3, + z: tree.z, toward, reach, + tipX: tree.x + toward * reach * .5, tipY: tree.y - reach * .9 }; +} + +function updateBodyTrees(dt, now) { + const poseTime = (now - startedAt) / 1000000; + for (const tree of bodyTrees) { + // One harvest a round, said out loud. Eighteen seconds of ripening against + // a thirty second round used to say it on its own, and the padded room's + // quarter-pipe said it again by holding the fruit a wall's height above a + // standing fighter. The tower's floor is flat, which put the fruit back + // inside arm's reach — and two fighters then stood at the wall winding + // fifteen seconds off the clock every eighteen, so the round could not + // end. A round that cannot end is worse than a body that stays broken. + if (tree.spent) continue; + if (tree.growth < 1) { + tree.growth = Math.min(1, tree.growth + dt * 1000000 / treeRipenUs); + continue; + } + const fruit = treeFruit(tree); + for (const player of players) { + if (!player.alive) continue; + // A tile and a third — a hand up at the fruit, not the whole corner of + // the room. Sized with treeFruit above so a spawn-mark idler stays out + // of range; the two limits only hold together. + if (runnerDistanceToPoint(player, poseTime, fruit.x, fruit.y, fruit.z) > 120) + continue; + tree.growth = 0; + tree.spent = true; + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + roundElapsedUs = Math.max(0, roundElapsedUs - treeTimeBonusUs); + remember(player, "NEW BODY"); + playDrum("bell", 1.15, panPlayer(player)); + emitSignal("powerup", player.pad, 3, treeTimeBonusUs / 1000000); + break; + } + } +} + +function drawBodyTree(tree, t) { + const scale = cameraScale(); + const ripe = tree.growth >= 1; + // Unripe reads as a sapling rather than a dimmed icon: the trunk and canopy + // are literally shorter, so the stage tells you how long the walk can wait. + const { x: fruitX, y: fruitY, toward, tipX, tipY: crownY } = treeFruit(tree); + const sway = Math.sin(t * 1.4 + tree.x * .0007) * (3 + 9 * tree.growth); + const bark = mixColor([120, 92, 64], [58, 46, 38], visualTheme.light); + const leaf = ripe + ? mixColor([120, 226, 138], [46, 150, 84], visualTheme.light) + : mixColor([96, 140, 104], [44, 84, 60], visualTheme.light); + const tipY = crownY + sway; + worldCapsule(tree.x, tree.y, tree.z, tipX, tipY, tree.z, + Math.max(2, (11 + 9 * tree.growth) * scale), bark); + // Canopy sized with treeFruit's cube-scale lean: fronds stay under a tile + // long so the tree dresses its wall without reaching into the fight. + for (const spread of [-1, -.35, .35, 1]) { + worldCapsule(tipX, tipY, tree.z, + tipX + toward * (30 + 45 * tree.growth), + tipY + spread * (30 + 35 * tree.growth), tree.z, + Math.max(2, (8 + 8 * tree.growth) * scale), leaf); + } + if (!ripe) return; + // The fruit is the part you aim at, so it only exists once it can be taken. + const point = projectPoint(fruitX, fruitY + sway, tree.z); + filledDisc(point.x, point.y, Math.max(3, 46 * scale), + mixColor([236, 108, 132], [188, 62, 92], visualTheme.light)); +} + +function updatePowerups(now) { + if (unarmedRoundActive()) return; + while (roundElapsedUs >= nextPowerupAtUs) { + // Only the slot marked `cycle` is the rotation's business. Asking whether + // ANY gun pickup is on the map would let an untouched space laser sitting + // on the top deck stall the pistol reload for the whole round. + const pickup = gunPickups.find((slot) => slot.cycle); + // Authored maps may intentionally have no replenishing weapon. + if (pickup && !pickup.active) { + // The cycle's whole job is to keep six more rounds of ammo appearing + // somewhere worth crossing the station for — the corner tiles, + // alternating, so the reload never lives on one fighter's side. + pickup.active = true; + pickup.x = tileCenterX(powerupSequence % 2 === 0 + ? cornerColLeft : cornerColRight); + pickup.z = 0; + beginPickupDrop(pickup); + powerupSequence += 1; + emitSignal("powerup", -1, powerupSequence, nextPowerupAtUs / 1000000); + playDrum("clap", .9, 0); + } + nextPowerupAtUs += powerupIntervalUs; + } + updateGunPickups(now); + updateSaberPickups(now); + updateGrenadePickups(now); +} + +// Ghost trails map a ricochet's whole path. The fixed length is the entire +// point: shots here have no clock-based expiry, they bounce until they hit +// somebody, so a trail that grew with flight time would be the eleven-frames-a +// -second stray all over again — measured in line segments instead of terrain +// span. A ring buffer costs the same on the thousandth bounce as on the first. +// +// Sampling every third tick buys three times the arc for the same sixteen +// points, and a bounce records out of turn so the corner lands on the wall +// rather than being chorded through it. +const bulletTrailPoints = 12; +const bulletTrailStride = 4; + +function recordBulletTrail(bullet) { + if (!bullet.trail) { + // One allocation at birth, never per frame. + bullet.trail = new Array(bulletTrailPoints * 2).fill(0); + bullet.trailCount = 0; + } + const slot = (bullet.trailCount % bulletTrailPoints) * 2; + bullet.trail[slot] = bullet.x; + bullet.trail[slot + 1] = bullet.y; + bullet.trailCount++; +} + +function updateBullets(dt, now, combat = true) { + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + bullet.vx += windAcceleration * .12 * dt; + // A glob is a ball, not a round: gravity pulls the toss back down, and it + // dries out in flight rather than flying forever. The gravity is soft on + // purpose — the lob should hang for over a second, analog and watchable. + if (bullet.spit) { + bullet.vy += 700 * dt; + bullet.life -= dt * .22; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + continue; + } + } + bullet.previousX = bullet.x; + bullet.previousY = bullet.y; + bullet.x += bullet.vx * dt; + bullet.y += bullet.vy * dt; + // Held so the ricochets below can be spotted by the sign they flip. + const enteredVx = bullet.vx; + const enteredVy = bullet.vy; + // A laser bolt does not ricochet. Everything else in this game's ballistics + // is built on the opposite rule — "shots have no clock-based expiry, arena + // surfaces ricochet them so a long-travelling round remains part of the + // fight" — and that rule is what makes the pistol frightening in a closed + // room. The bolt is the other half of the pair: four of them, travelling + // more than twice as fast, each spent outright the moment it touches + // anything. Fast and honest against slow and haunting, and a laser miss is + // a miss for good. + if (bullet.laser && (bullet.x - 24 <= worldLeft + wallThickness || + bullet.x + 24 >= worldRight - wallThickness || + (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) || + bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness)) { + bullet.life = 0; + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .14, duration: .14, death: false, explosion: false }); + playDrum("hat", 1.4, panAt(bullet.x, bullet.z)); + continue; + } + // Shots have no clock-based expiry. Arena surfaces ricochet them so a + // long-travelling round remains part of the fight until contact. + if (bullet.x - 24 <= worldLeft + wallThickness) { + bullet.x = worldLeft + wallThickness + 24; + bullet.vx = Math.abs(bullet.vx); + } else if (bullet.x + 24 >= worldRight - wallThickness) { + bullet.x = worldRight - wallThickness - 24; + bullet.vx = -Math.abs(bullet.vx); + } + if (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) { + bullet.y = ceilingY + wallThickness + 24; + bullet.vy = Math.abs(bullet.vy); + } else if (bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness) { + bullet.y = terrainFloorAt(bullet.x) - wallThickness - 24; + if (bullet.spit) { + // A bouncing ball, not a ricochet: each bounce keeps half the height + // and costs a bite of the glob, and once the bounce is too small to + // read it dissipates where it lies instead of buzzing along the floor. + bullet.vy = -Math.abs(bullet.vy) * .56; + bullet.vx *= .84; + bullet.life -= .18; + if (Math.abs(bullet.vy) < 90) bullet.life = 0; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + } else playDrum("hat", .3, panAt(bullet.x, bullet.z)); + // A splash bounces any bodyless head standing in it — including the + // spitter's own, so spitting straight down is a little hop. Popcorn + // physics for the intimate spit fight. + for (const target of players) { + if (!target?.alive || !isHeadOnly(target)) continue; + if (Math.abs(target.x - bullet.x) > 70 || + Math.abs(target.y - bullet.y) > 90) continue; + target.vy = Math.min(target.vy, 0) - 240; + target.grounded = false; + } + } else bullet.vy = -Math.abs(bullet.vy); + } + // A bounce is worth a point of its own: on the stride alone the segment + // spanning a ricochet would cut the corner straight through the wall. + if (bullet.vx !== enteredVx || bullet.vy !== enteredVy || + bullet.trailTick === undefined) { + bullet.trailTick = 0; + recordBulletTrail(bullet); + } else if (++bullet.trailTick % bulletTrailStride === 0) + recordBulletTrail(bullet); + } + for (let left = 0; left < bullets.length; left++) { + const a = bullets[left]; + if (a.life <= 0) continue; + for (let right = left + 1; right < bullets.length; right++) { + const b = bullets[right]; + if (b.life <= 0 || a.owner === b.owner) continue; + if (Math.abs(a.x - b.x) <= 96 && Math.abs(a.y - b.y) <= 52 && + Math.abs(a.z - b.z) <= 48) { + a.life = 0; + b.life = 0; + spawnImpact({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, + z: (a.z + b.z) / 2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", 1, 0); + emitSignal("cancel", -1, a.owner, b.owner); + break; + } + } + } + if (!combat) return; + const poseTime = (now - startedAt) / 1000000; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + const shot = { x1: bullet.previousX ?? bullet.x, + y1: bullet.previousY ?? bullet.y, z1: bullet.z, + x2: bullet.x, y2: bullet.y, z2: bullet.z, width: 48 }; + for (const fragment of detachedParts) { + if (fragment.owner === bullet.owner && now < bullet.safeUntil) continue; + const contact = segmentSegmentClosest(shot, fragment); + if (contact.distance > (shot.width + fragment.width) / 2) continue; + const impulse = bullet.heavy ? 1500 : bullet.spit ? 900 : 1200; + fragment.vx += Math.sign(bullet.vx || 1) * impulse; + fragment.vy -= bullet.heavy ? 520 : 300; + fragment.owner = bullet.owner; + fragment.hitAfter = now + 120000; + bullet.life = 0; + spawnImpact({ x: contact.secondPoint.x, y: contact.secondPoint.y, + z: contact.secondPoint.z, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", .72, panAt(fragment.x1, fragment.z1)); + break; + } + if (bullet.life <= 0) continue; + const targets = [...players.filter((player) => player.pad !== bullet.owner), players[bullet.owner]]; + for (const target of targets) { + if (!target?.alive || (target.pad === bullet.owner && now < bullet.safeUntil)) + continue; + // Reflect across the circular shield's local surface normal. A square hit + // returns home; a glancing hit leaves at the corresponding ricochet angle. + // Flipping `owner` lets the returned shot hurt whoever fired it. + if (target.blocking) { + const shield = shieldGeometry(target); + const guard = sampleCombatBoxes(target,now,null,false).guard[0]; + if (guard && segmentBoxEntry({x1:bullet.previousX??bullet.x,y1:bullet.previousY??bullet.y, + z1:bullet.z,x2:bullet.x,y2:bullet.y,z2:bullet.z},guard,24)!==null) { + let nx = bullet.x - shield.x; + let ny = bullet.y - shield.y; + const normalLength = Math.hypot(nx, ny); + if (normalLength > .001) { + nx /= normalLength; + ny /= normalLength; + } else { + const speed = Math.hypot(bullet.vx, bullet.vy) || 1; + nx = -bullet.vx / speed; + ny = -bullet.vy / speed; + } + const normalVelocity = bullet.vx * nx + bullet.vy * ny; + bullet.vx -= 2 * normalVelocity * nx; + bullet.vy -= 2 * normalVelocity * ny; + bullet.x = shield.x + nx * (shield.radius + 25); + bullet.y = shield.y + ny * (shield.radius + 25); + bullet.owner = target.pad; + bullet.life = Math.max(bullet.life, .55); + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .18, duration: .18, death: false, explosion: false }); + breakShield(target, now); + emitSignal("ballblock", target.pad, 1, 0); + continue; + } + } + const contact = sweptProjectileContact([{ + x1: bullet.previousX ?? bullet.x, y1: bullet.previousY ?? bullet.y, + z1: bullet.z, x2: bullet.x, y2: bullet.y, z2: bullet.z, + width: 48, role: "bullet", part: "bullet", + }], target, poseTime); + if (contact && contact.separation <= 3) { + const pointContact = runnerContactToPoint(target, poseTime, + bullet.x, bullet.y, bullet.z); + const endpointHit = Math.min(pointContact.headDistance, + pointContact.bodyDistance) <= 24; + const headshot = endpointHit + ? pointContact.headDistance <= pointContact.bodyDistance + : contact.headshot; + const segmentIndex = endpointHit && !headshot + ? pointContact.segmentIndex : contact.segmentIndex; + bullet.life = 0; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: headshot, + explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + if (headshot) + killPlayer(target, bullet.owner, now, "SHOT"); + else { + applyBodyHit(target, segmentIndex, + bullet.x - bullet.vx, bullet.owner, now, + bullet.heavy ? 1680 : bullet.spit ? 920 : 1180, + bullet.heavy ? 260 : bullet.spit ? 90 : 125); + playDrum("block", .9, panPlayer(target)); + } + break; + } + } + } + for (let index = bullets.length - 1; index >= 0; index--) + if (bullets[index].life <= 0) bullets.splice(index, 1); +} + +function updateGrenades(dt, now, combat = true) { + for (const grenade of grenades) { + if (!grenade.alive) continue; + if (grenade.exploding) { + grenade.blastAge += dt; + grenade.blastRadius = grenadeBlastRadius * + Math.min(1, grenade.blastAge / grenadeBlastDuration); + const poseTime = (now - startedAt) / 1000000; + for (const player of combat ? players : []) { + if (!player.alive || (grenade.hitPlayers & (1 << player.pad))) continue; + const contact = runnerContactToPoint(player, poseTime, + grenade.x, grenade.y, grenade.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > + grenade.blastRadius) continue; + grenade.hitPlayers |= 1 << player.pad; + if (contact.headDistance <= grenade.blastRadius) + killPlayer(player, grenade.owner, now, "BLASTED"); + else { + const blastForce = 1250 + 850 * + (1 - clamp(contact.bodyDistance / grenadeBlastRadius, 0, 1)); + applyBodyHit(player, contact.segmentIndex, grenade.x, + grenade.owner, now, blastForce, 300); + } + } + if (grenade.blastAge >= grenadeBlastDuration) grenade.alive = false; + continue; + } + const previousY = grenade.y; + if (!grenade.rocket) { + grenade.vx += windAcceleration * .45 * dt; + grenade.vy += 1800 * dt; + } + grenade.x += grenade.vx * dt; + grenade.y += grenade.vy * dt; + grenade.fuse -= dt; + if (grenade.rocket) { + const poseTime = (now - startedAt) / 1000000; + for (const target of combat ? players : []) { + if (!target.alive || target.pad === grenade.owner) continue; + if (runnerDistanceToPoint(target, poseTime, + grenade.x, grenade.y, grenade.z) > 34) continue; + grenade.fuse = 0; + break; + } + } + const inset = wallThickness + 35; + if (grenade.x < worldLeft + inset) { + grenade.x = worldLeft + inset; + grenade.vx = Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } else if (grenade.x > worldRight - inset) { + grenade.x = worldRight - inset; + grenade.vx = -Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + if (!airRoundActive() && grenade.y < ceilingY + inset) { + grenade.y = ceilingY + inset; + grenade.vy = Math.abs(grenade.vy) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + const ledge = grenade.vy >= 0 && + ledgeCrossed(grenade.x, previousY, grenade.y, 30); + if (ledge) { + grenade.y = ledge.y - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + } else if (grenade.y >= terrainFloorAt(grenade.x) - 30) { + grenade.y = terrainFloorAt(grenade.x) - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + if (grenade.rocket) grenade.fuse = 0; + } + if (grenade.fuse <= 0) { + grenade.exploding = true; + grenade.blastAge = 0; + grenade.blastRadius = 0; + grenade.vx = 0; + grenade.vy = 0; + playDrum("kick", 1.25, panPlayer(players[grenade.owner])); + emitSignal("blast", grenade.owner, + grenade.x / worldRight, grenade.y / floorY); + } + } + for (let index = grenades.length - 1; index >= 0; index--) + if (!grenades[index].alive) grenades.splice(index, 1); +} + +function startMelee(player, kind, now) { + if (isHeadOnly(player) || isPogo(player)) return; + // Every fresh press starts a strike, including during the previous swing. + // updatePlayer detects the edge; holding a button does not auto-repeat. + const spec = meleeSpecs[kind]; + if (!spec) return; + const attackingPart = kind === "KICK" + ? player.facing > 0 ? "right-leg" : "left-leg" + : itemHand(player); + if (!hasPart(player, attackingPart)) return; + player.attackKind = kind; + player.lowKick = kind === "KICK" && + (player.ducking || (player.crouchBlend || 0) > .35); + player.attackStartedAt = now; + player.attackUntil = now + spec.windowUs; + player.attackHit = false; + player.attackMomentum = now < player.dashUntil + ? clamp(Math.abs(player.vx) / walkSpeed, 1.35, 2.25) : 1; + player.stance = "ATTACK"; + player.pendingMoveLabel = kind; + playDrum(spec.cue[0], spec.cue[1], panPlayer(player)); + emitSignal(kind.toLowerCase(), player.pad, player.facing, 0); +} + +const limbParts = ["left-arm", "right-arm", "left-leg", "right-leg"]; +const spiderLegParts = Array.from({ length: 8 }, (_, index) => + `spider-leg-${index + 1}`); +const hasPart = (player, part) => !player.removedParts?.includes(part); +const isPogo = (player) => hasPart(player, "torso") && + limbParts.every((part) => !hasPart(player, part)); +const isHeadOnly = (player) => !hasPart(player, "torso"); +const availableArm = (player) => { + const lead = player.facing > 0 ? "right-arm" : "left-arm"; + if (hasPart(player, lead)) return lead; + const other = lead === "right-arm" ? "left-arm" : "right-arm"; + return hasPart(player, other) ? other : ""; +}; +// Ownership stays attached to the arm that picked the object up; turning or +// boarding cannot teleport a gun between hands. +const itemHand = (player) => player.itemArm || availableArm(player); +// Gun before grenade, always: the pistol is the sustained item and the one +// drawn in the hand, so "use what you are holding" needs no mode toggle. +const heldItem = (player) => + unarmedRoundActive() ? "" : isHeadOnly(player) ? player.gunAmmo > 0 ? "GUN" : "" + : isPogo(player) || !itemHand(player) || !hasPart(player, itemHand(player)) + ? "" : player.gunAmmo > 0 ? "GUN" + : player.grenadeAmmo > 0 ? "GRENADE" : ""; +const itemSwinging = (player, now) => + (player.attackKind === "WHIP" || player.attackKind === "BASH") && + meleePulse(player, now) > 0; + +function meleePulse(player, now) { + if (now >= player.attackUntil || player.attackUntil <= player.attackStartedAt) return 0; + const phase = (now - player.attackStartedAt) / + (player.attackUntil - player.attackStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +// Collision starts on the input frame and lasts through the original short +// swing. A landed strike still hits only once; another tap starts a new one. +const meleeFrames = { + PUNCH: { startup: 0, active: 14, recovery: 0 }, + KICK: { startup: 0, active: 14, recovery: 0 }, + WHIP: { startup: 0, active: 12, recovery: 0 }, + BASH: { startup: 0, active: 17, recovery: 0 }, +}; +function meleeFrame(player, now) { + const timing = meleeFrames[player.attackKind]; + if (!timing || now < player.attackStartedAt || now >= player.attackUntil) + return { frame: 0, phase: 'neutral', startup: 0, active: 0, recovery: 0 }; + const frame = Math.floor((now - player.attackStartedAt) / replayTickUs + 1e-7) + 1; + return { ...timing, frame, phase: frame <= timing.startup ? 'startup' + : frame <= timing.startup + timing.active ? 'active' : 'recovery' }; +} + +function meleeTarget(player, now) { + const pulse = meleePulse(player, now); + const spec = meleeSpecFor(player, player.attackKind); + const lowKick = player.attackKind === "KICK" && player.lowKick; + const reachX = player.x + player.facing * (spec.reach + spec.swell * pulse); + // A low kick sweeps the ground in front of the kicker — the ground he is + // standing on. The bare terrain probe read the arena floor, so a low kick + // thrown on a rung aimed a storey down through the rung it stood on. + const sweepY = lowKick + ? Math.min(surfaceYAt(reachX, player.y), player.y + 20) - 5 : 0; + return { + x: player.x + player.facing * (spec.reach + spec.swell * pulse + + (lowKick ? 34 * pulse : 0)), + y: lowKick ? sweepY : player.y - (player.attackKind !== 'KICK' && + (player.ducking || player.crouchBlend > .35) ? 68 : spec.height), + z: player.z, + }; +} + +function itemActionPulse(player, now) { + if (!player.itemAction || now >= player.itemActionUntil) return 0; + const phase = (now - player.itemActionStartedAt) / + Math.max(1, player.itemActionUntil - player.itemActionStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +function itemHandTarget(player, now) { + // A surviving head grips the pistol at the mouth. It can still aim and fire, + // but grenades and melee weapons remain limb-dependent. + if (isHeadOnly(player)) return { + x: player.x + player.facing * 18, + y: player.y - 20, z: player.z, + }; + // A swung weapon rides the striking hand, so the drawn pistol or grenade + // sits on the live attack capsule instead of floating out in front. + if (itemSwinging(player, now)) return meleeTarget(player, now); + const pulse = itemActionPulse(player, now); + if (player.itemAction === "THROW") return { + x: player.x + player.facing * (42 + 52 * pulse), + y: player.y - 118 - 52 * pulse, z: player.z, + }; + if (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil)) { + const aimX = player.gunAimX || player.facing; + const aimY = player.gunAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { x: player.x + aimX / length * 108, + y: player.y - 102 + aimY / length * 92, z: player.z }; + } + return { x: player.x + player.facing * 108, + y: player.y - 115, z: player.z }; +} + +function itemForearm(player, geometry) { + const arm = itemHand(player); + return geometry.segments.find(segment => segment.part === arm && + (segment.role === "item-forearm" || segment.role === "attack-forearm")) || + geometry.segments.find(segment => segment.part === arm && + segment.role?.endsWith("forearm")); +} + +function gunPose(player, now, input = null) { + let aimX = input?.horizontal || player.facing; + let aimY = input ? -input.vertical : 0; + if (!input && (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil))) { + aimX = player.gunAimX || player.facing; + aimY = player.gunAimY || 0; + } + const length = Math.hypot(aimX, aimY) || 1; + const dx = aimX / length; + const dy = aimY / length; + // The arm solver can clamp its reach, and skating rotates/translates the + // whole skeleton. Use its solved wrist rather than the untransformed aim + // target for both the held weapon and the projectile's muzzle. + const forearm = !isHeadOnly(player) && itemForearm(player, + player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, (now - startedAt) / 1000000)); + const hand = forearm ? {x:forearm.x2, y:forearm.y2, z:forearm.z2} + : itemHandTarget(player, now); + return { + hand, dx, dy, + muzzle: { x: hand.x + dx * 54, y: hand.y + dy * 54, z: hand.z }, + }; +} + +function meleeStrike(player, now) { + const target = meleeTarget(player, now); + return { + x: target.x, y: target.y, z: target.z, + radius: meleeSpecFor(player, player.attackKind).radius, + }; +} + +function shieldGeometry(player) { + const aimX = player.shieldAimX || player.facing; + const aimY = player.shieldAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { + x: player.x + aimX / length * shieldForward, + y: player.y - (player.shieldCrouched ? 58 : 90) - + aimY / length * shieldForward, + z: player.z, + radius: shieldRadius, + }; +} + +// A shield is spent the moment it does its job. It eats exactly one hit, then +// drops — and `shieldLocked` keeps a still-held B from raising it again on the +// very next frame, which is what turns the break into a real opening instead +// of a flicker nobody can see. The shielder is deliberately left free to act: +// breaking the shield is what buys them the swing. +function breakShield(player, now) { + player.blocking = false; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blockFlash = 1; + player.stance = "SHIELD BREAK"; + player.pendingMoveLabel = "SHIELD BREAK"; + playDrum("bell", 1, panPlayer(player)); + emitSignal("shieldbreak", player.pad, 1, 0); +} + +// Stun scales with what the shield ate, so a BASH buys a longer punish than a +// WHIP. The floor is still long enough to answer at 60fps (~8 frames) and the +// ceiling short enough (~18) that a blocked attacker is opened, not deleted. +function shieldStunUs(force) { + return Math.round(140000 + clamp((force - 1000) / 750, 0, 1) * 160000); +} + +function returnBall(ball, player, now, shielded, intensity = 1) { + const incomingVx = ball.vx; + const incomingVy = ball.vy; + const direction = ball.x >= player.x ? 1 : -1; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const response = ball.hitScale || 1; + const momentum = shielded ? 1 : player.attackMomentum || 1; + const normalSpeed = (currentSpeed * 1.34 + 720) * intensity * + momentum * response; + const shieldMinimum = (1800 + clamp(intensity, 0, 1) * 1000) * response; + const speed = shielded + ? Math.min(4200 * response, Math.max(shieldMinimum, normalSpeed * 1.65)) + : Math.min(4800, normalSpeed); + ball.vx = direction * speed; + const lift = shielded ? .72 : player.inputY > 0 ? .58 + : player.attackKind === "KICK" ? .34 : .2; + ball.vy = -speed * lift; + ball.x = player.x + direction * (ball.radius + 85); + ball.y = Math.min(ball.y, player.y - 55); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 140000; + ball.safePlayers = 1 << player.pad; + if (!shielded) { + player.attackHit = true; + player.lastButton = "WACK"; + player.lastButtonAt = now; + } + else { + player.blockFlash = 1; + player.knockVx += incomingVx * .55; + player.vy = Math.min(player.vy + incomingVy * .16, -Math.max(520, speed * .28)); + player.grounded = false; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .22, duration: .22, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum(shielded ? "block" : "clap", shielded ? 1.1 : 1.25, + panAt(ball.x, ball.z)); + emitSignal(shielded ? "ballblock" : "wack", player.pad, + direction, Math.round(speed)); +} + +function crossWackBall(ball, hitters, now) { + const first = hitters[0]; + const second = hitters[1]; + const fighterDistance = Math.abs(first.player.x - second.player.x); + const convergence = clamp(1 - fighterDistance / 520, 0, 1); + const contact = (first.contact + second.contact) * .5; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.min(7600, (4100 + currentSpeed * .72 + + convergence * 2300 + contact * 900) * (ball.hitScale || 1)); + const stronger = first.contact >= second.contact ? first.player : second.player; + const direction = Math.sign(ball.vx) || stronger.facing || 1; + ball.vx = direction * speed; + ball.vy = -speed * (.3 + convergence * .18); + ball.x += direction * 35; + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 8); + ball.lastHitBy = -1; + ball.safeUntil = now + 180000; + ball.safePlayers = 3; + for (const hit of hitters) { + hit.player.attackHit = true; + hit.player.lastButton = "CROSS WACK"; + hit.player.lastButtonAt = now; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .32, duration: .32, death: false, explosion: true }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("clap", 1.55, panAt(ball.x, ball.z)); + emitSignal("crosswack", -1, direction, Math.round(speed)); +} + +function bootBall(ball, player, now) { + // Walking contact carries the grounded ball in the player's travel + // direction. A melee strike remains the intentionally stronger launch. + const direction = Math.sign(player.vx) || Math.sign(ball.x - player.x) || + player.facing || 1; + const dashing = now < player.dashUntil && Math.abs(player.dashVx) > walkSpeed; + const speed = Math.min(dashing ? 2600 : 1450, + (420 + Math.abs(player.vx) * (dashing ? .58 : .32)) * + (ball.hitScale || 1)); + ball.vx = direction * speed; + ball.vy = -Math.max(dashing ? 420 : 80, speed * (dashing ? .24 : .06)); + ball.x = player.x + direction * (ball.radius + 58); + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 2); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 180000; + ball.safePlayers = 1 << player.pad; + player.lastButton = dashing ? "DASH BOOT" : "BOOT"; + player.lastButtonAt = now; + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("kick", 1.12, panAt(ball.x, ball.z)); + emitSignal("boot", player.pad, direction, Math.round(speed)); +} + +function bounceBallOffBody(ball, player, now, segmentIndex = -1) { + const direction = Math.sign(ball.x - player.x) || -Math.sign(ball.vx) || + player.facing || 1; + const incomingSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.max(760, Math.min(3600, incomingSpeed * .86 / + Math.sqrt(ball.mass || 1))); + ball.vx = direction * speed; + ball.vy = -Math.max(260, Math.abs(ball.vy) * .42 + speed * .12); + ball.x += direction * (ball.radius + 18); + ball.lastHitBy = player.pad === 0 ? 1 : 0; + ball.safeUntil = now + 160000; + ball.safePlayers = 1 << player.pad; + applyBodyHit(player, segmentIndex, ball.x - ball.vx, + ball.lastHitBy, now, 760, 110, false); + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("block", .82, panAt(ball.x, ball.z)); + emitSignal("bodybounce", player.pad, direction, Math.round(speed)); +} + +function updateBall(ball, dt, now) { + // A popped ball is gone, not retired — a crater should cost the round its + // ball for a moment, not for good. It re-inflates over the middle once its + // serve time comes round. + if (!ball.active && ballEnabled && ball.serveAt && now >= ball.serveAt) { + ball.active = true; + // Re-inflate on the far side from wherever it popped, so the fighter who + // owned the ball's exit does not also own its return. + ball.x = ball.x > centerX + ? tileCenterX(cornerColLeft + 1) : tileCenterX(cornerColRight - 1); + ball.y = ceilingY + ball.radius + 120; + ball.z = 0; + ball.vx = 0; + ball.vy = 0; + ball.rotation = 0; + ball.lastHitBy = -1; + ball.safeUntil = now + 250000; + ball.safePlayers = 0; + emitSignal("ballserve", -1, 0, 0); + } + if (!ball.active || now < ball.serveAt) return; + if (ball.heldBy >= 0) { + const carrier = players[ball.heldBy]; + if (!carrier?.alive || carrier.heldBall !== balls.indexOf(ball)) { + ball.heldBy = -1; + } else { + ball.x = carrier.x + carrier.facing * (ball.radius + 54); + ball.y = carrier.y - (carrier.ducking ? 58 : 94); + ball.z = carrier.z - 6; + ball.vx = carrier.vx; + ball.vy = carrier.vy; + return; + } + } + const isBoard = ball.type === "skateboard"; + const contactRadius = isBoard ? skateAxleDrop + skateWheelRadius : ball.radius; + const platformSupported = ledgeSupports(ball.x, ball.y, contactRadius); + const floorSupported = ball.y >= terrainFloorAt(ball.x) - contactRadius - 2; + const grounded = (platformSupported || floorSupported) && Math.abs(ball.vy) < 180; + if (!grounded) ball.vx += windAcceleration * (ball.windFactor || .45) * dt; + ball.vy += 1900 * (ball.gravityFactor || 1) * dt; + const previous = { x: ball.x, y: ball.y, z: ball.z }; + ball.x += ball.vx * dt; + ball.y += ball.vy * dt; + if (Math.abs(ball.vx) > 20) { + if (isBoard) ball.skateSpin = (ball.skateSpin || 0) + ball.vx * dt / skateWheelRadius; + else ball.rotation += ball.vx * dt / Math.max(1, contactRadius); + } + const inset = wallThickness + contactRadius; + if (ball.x < worldLeft + inset) { + ball.x = worldLeft + inset; + ball.vx = Math.abs(ball.vx); + } else if (ball.x > worldRight - inset) { + ball.x = worldRight - inset; + ball.vx = -Math.abs(ball.vx); + } + if (!airRoundActive() && ball.y < ceilingY + inset) { + ball.y = ceilingY + inset; + ball.vy = Math.abs(ball.vy); + } + const ledge = ball.vy >= 0 && + ledgeCrossed(ball.x, previous.y, ball.y, contactRadius, contactRadius); + if (ledge) { + ball.y = ledge.y - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .58) : 0; + ball.vx *= ball.drag || .992; + } else if (ball.y > terrainFloorAt(ball.x) - contactRadius) { + ball.y = terrainFloorAt(ball.x) - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .62) : 0; + ball.vx *= ball.drag || .992; + } + const onSurface = (ledgeSupports(ball.x, ball.y, contactRadius) || + ball.y >= terrainFloorAt(ball.x) - contactRadius - 2) && Math.abs(ball.vy) < 180; + if (isBoard && onSurface) { + const contact = skateContact(ball.x, previous.y + contactRadius); + ball.y = contact.y - contactRadius; + ball.rotation = contact.pitch; + const slope = Math.tan(contact.pitch); + ball.vx += fallGravity() * slope / (1 + slope * slope) * dt; + ball.vx *= Math.exp(-dt * .65); + } + const poseTime = (now - startedAt) / 1000000; + const hitters = []; + // The head test below sweeps from `previous`, so the reach margin carries + // this tick's travel as well as the ball's radius. + const travel = Math.hypot(ball.x - previous.x, ball.y - previous.y); + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + const boxes = sampleCombatBoxes(player, now, null, false); + for (const strike of boxes.hit) { + const distance = pointBoxDistance(strike, ball.x, ball.y, ball.z); + if (distance <= ball.radius) { + hitters.push({ player, contact: clamp(1-distance/ball.radius,0,1) }); break; + } + } + } + if (hitters.length >= 2) { + crossWackBall(ball, hitters, now); + return; + } + if (hitters.length === 1) { + returnBall(ball, hitters[0].player, now, false, + .92 + hitters[0].contact * .38); + return; + } + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + if (player.blocking) { + const guard = sampleCombatBoxes(player, now, null, false).guard[0]; + const distance = guard ? pointBoxDistance(guard, ball.x, ball.y, ball.z) : Infinity; + if (distance <= ball.radius) { + const shield = shieldGeometry(player); + const proximity = clamp(1-Math.max(0,Math.hypot(ball.x-shield.x, + ball.y-shield.y,ball.z-shield.z)-ball.radius)/shield.radius,0,1); + returnBall(ball, player, now, true, proximity); + return; + } + } + const headBox = sampleCombatBoxes(player,now,null,false).hurt.find(b=>b.part==='head'); + const currentHeadDistance = pointBoxDistance(headBox,ball.x,ball.y,ball.z); + const sweptHeadDistance = segmentBoxEntry( + { x1: previous.x, y1: previous.y, z1: previous.z, + x2: ball.x, y2: ball.y, z2: ball.z },headBox,ball.radius)!==null ? 0 : Infinity; + const headDistance = Math.min(currentHeadDistance, sweptHeadDistance); + const bodyContact = runnerContactToPoint(player, poseTime, + ball.x, ball.y, ball.z); + const bodyDistance = bodyContact.bodyDistance; + if (Math.min(headDistance, bodyDistance) > ball.radius) continue; + if (ball.type === "skateboard" && headDistance > ball.radius && + bodyDistance <= ball.radius && !player.skateboard && + // A thrown deck is a weapon until it slows down — nobody catches a + // board shot out of the air with their shins. + Math.hypot(ball.vx, ball.vy) < 900) { + resetSkate(player); + player.skateboard = true; + ball.riderPad = player.pad; + player.skateVx = player.vx; + player.skatePitch = skateContact(player.x, player.y).pitch; + ball.active = false; + ball.heldBy = -1; + player.lastButton = "SKATEBOARD"; + player.lastButtonAt = now; + playDrum("clap", .9, panPlayer(player)); + emitSignal("skate-mount", player.pad, 1, 0); + return; + } + const runningContact = player.grounded && Math.abs(player.vx) > 40 && + (onSurface || ball.y >= player.y - ball.radius - 55); + if (runningContact) { + bootBall(ball, player, now); + return; + } + if (headDistance <= ball.radius) { + const sourcePad = ball.lastHitBy >= 0 && ball.lastHitBy !== player.pad + ? ball.lastHitBy : player.pad === 0 ? 1 : 0; + dismountSkateboard(player, now); + damageAllLimbs(player, ball.x - ball.vx, sourcePad, now); + bounceBallOffBody(ball, player, now, -1); + player.lastButton = "HEAD HIT"; + player.lastButtonAt = now; + return; + } + bounceBallOffBody(ball, player, now, bodyContact.segmentIndex); + return; + } +} + +// Returns whether the tap was spent on a double-tap move, so a single tap can +// still mean something else to the caller. +function directionTap(player, direction, now) { + const previousTap = player.lastTap[direction] || -10000000; + const releasedAt = player.lastRelease[direction] || -10000000; + player.lastTap[direction] = now; + if (now - previousTap > doubleTapUs || releasedAt <= previousTap || + now - releasedAt < doubleTapReleaseUs) return false; + player.lastTap[direction] = -10000000; + player.pendingMoveLabel = direction === "UP" ? "ULTRA AIR" : "DASH " + direction; + playDrum("clap", 1.05, panPlayer(player)); + if (direction === "UP") { + player.vy = -ultraJumpVelocity; + player.grounded = false; + player.jumpHeld = false; + emitSignal("ultrajump", player.pad, 1, 0); + } else if (direction === "DOWN") { + if (player.skateboard && !player.grounded) { + // Airborne on the board, the second tap is a throw, not a dive: the + // deck shoots straight down like a spiked item, and whoever it lands + // on takes it like one. The rider pops up off the release. + // The one-ball economy: like a dismount, the round's ball is + // redressed as the board so exactly one object ever exists. + // The station carries its own board, so there is nothing to redress: + // the old one-object economy borrowed the round's ball and handed it + // back at the bell, which is exactly the trick that stopped being + // necessary when the board became furniture with an entry of its own. + const board = boardForRider(player); + resetSkate(player); + if (board) { + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.spawnOwner = player.pad; + board.lastHitBy = player.pad; + board.x = player.x; + board.y = player.y + 40; + board.z = player.z; + board.vx = player.vx * .35; + board.vy = Math.max(2600, player.vy + 2600); + } + player.vy = Math.min(player.vy, -420); + player.pendingMoveLabel = "BOARD SHOT"; + playDrum("whoosh", 1, panPlayer(player)); + playDrum("kick", .8, panPlayer(player)); + emitSignal("board-shot", player.pad, 1, 0); + return true; + } + if (player.pounding) { + player.poundLevel = Math.min(3, Math.max(1, player.poundLevel) + 1); + const cap = poundMaxVelocity * (1 + .5 * (player.poundLevel - 1)); + player.vy = Math.min(cap, Math.max(poundLaunchVelocity, player.vy * 1.55)); + player.pendingMoveLabel = "GROUND POUND " + player.poundLevel; + playSine(620 + player.poundLevel * 190, .12 + player.poundLevel * .04); + emitSignal("fastdrop", player.pad, player.poundLevel, player.vy); + return true; + } + // Grounded anywhere above the real floor and not riding a head means the + // platform, wherever it has been placed. Double-crouch sinks through it. + if (player.grounded && player.standingOn < 0 && + player.y < terrainFloorAt(player.x) - 2) + sink(player, now); + // Standing on the floor there is nothing under you to drop through and no + // height to convert, so the double-tap is spent rather than sold cheap. + else if (player.grounded) return true; + else { + // In the air this is a ground pound, and the height it starts from is + // the whole economy of the move — remember it now, because the crater + // is measured against where the fall actually began. + player.pounding = true; + player.poundFrom = player.y; + player.poundLevel = 1; + player.vy = Math.max(player.vy, poundLaunchVelocity); + player.grounded = false; + player.ducking = false; + player.pendingMoveLabel = "GROUND POUND"; + playSine(520, .16); + emitSignal("fastdrop", player.pad, 1, 0); + } + } else { + player.facing = direction === "RIGHT" ? 1 : -1; + player.dashVx = player.facing * 2400; + player.dashUntil = now + 110000; + emitSignal("dash", player.pad, player.facing, 0); + } + return true; +} + +function sink(player, now) { + player.sinkUntil = now + sinkDurationUs; + // The rung being dropped through, so the sink cannot also eat the next one. + player.sinkFrom = player.y; + player.grounded = false; + player.jumpHeld = false; + player.vy = Math.max(player.vy, 260); + player.pendingMoveLabel = "SINK"; + playDrum("whoosh", .55, panPlayer(player)); + emitSignal("sink", player.pad, -1, 0); +} + +// A short low hop out of crouch. Crouching pins horizontal movement, so a +// direction flick from a tuck has nothing else to mean. +function crouchHop(player, direction, now) { + player.facing = direction; + player.vy = -crouchHopVelocity; + player.grounded = false; + player.jumpHeld = false; + player.hopUntil = now + crouchHopPoseUs; + player.pendingMoveLabel = "CROUCH HOP"; + playDrum("block", .58, panPlayer(player)); + emitSignal("crouchhop", player.pad, direction, 0); +} + +function killPlayer(target, killerPad, now, cause = "KO") { + if (!target.alive) return; + recordFightHit(killerPad, true); + releaseCarriedBall(target, now); + if (!lobbyActive() && (!freeForAll() || + players.filter((player) => player.alive).length <= 2)) { + if (!deathCinematic && killerPad !== target.pad) + deathCinematic = { startedAt: now, loserPad: target.pad, + winnerPad: killerPad, cause }; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + } + target.alive = false; + target.headBustedAt = now; + target.respawnAt = now + 1200000; + target.vx = 0; + if (!lobbyActive()) target.vy = 0; + target.stance = "HIT"; + target.lastButton = cause; + target.lastButtonAt = now; + if (killerPad !== target.pad) players[killerPad].score += 1; + emitSignal(cause === "BALLED" ? "balled" : "ko", + killerPad, target.pad, players[killerPad]?.score || 0); + roundCause = cause; + spawnImpact({ x: target.x, y: target.y - 120, z: target.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(target)); + if (!lobbyActive()) emitSignal("killcam", killerPad, target.pad, 1); + playDrum("snare", 1.15, panPlayer(target)); + updateLobbyMortality(now); + // The training opponent is the one everybody gets for free, and its fight is + // already running under the title screen — so its head is the one number + // the whole site can share without anybody signing in. The count follows the + // free door rather than the missing AI: once training started sparring back, + // an `!target.bot` gate would have silenced the site's only shared number. + // Balling yourself does not count; somebody has to have popped it. + if (target.npc && killerPad !== target.pad && + (!target.bot || fightOpponent === "trainingbot")) + emitSignal("dummy-popped", killerPad, target.pad, 1); +} + +// The crater. Everything about it is decided by the fall: a pound from a hop +// is a shove, a pound from the ceiling clears the stage. Whoever is standing +// inside the ring when it lands wears it; whoever is in the air over it has +// jumped it, which is the only defence and is meant to be readable from the +// silhouette alone. The ball in the ring is popped and re-served. +// +// The landing consumes the pounder's body but not their life. They continue as +// the existing controllable bouncing-head form, making the move a permanent +// mobility trade without prematurely ending the round. +function groundPound(player, now) { + player.pounding = false; + const poundLevel = Math.max(1, player.poundLevel || 1); + player.poundLevel = 0; + const fall = clamp(player.y - player.poundFrom, 0, poundFullFall); + const power = clamp(fall / poundFullFall + (poundLevel - 1) * .22, 0, 1); + const radius = Math.min(poundMaxRadius, + poundMinRadius + power * 70 + (poundLevel - 1) * 88); + const poseTime = (now - startedAt) / 1000000; + player.stance = "HIT"; + player.lastButton = "GROUND POUND"; + player.lastButtonAt = now; + const terrainY = terrainFloorAt(player.x); + spawnImpact({ x: player.x, y: terrainY, z: player.z, + life: .58, duration: .58, death: false, explosion: true, + blastRadius: radius, power }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("kick", 1.3, panPlayer(player)); + playSine(76 + power * 34 + poundLevel * 18, .32 + poundLevel * .09); + emitSignal("blast", player.pad, player.x / worldRight, power); + + for (const target of players) { + if (target.pad === player.pad || !target.alive) continue; + const contact = runnerContactToPoint(target, poseTime, + player.x, terrainY, player.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > radius) continue; + if (!target.grounded) { + // Airborne over the ring is the dodge. It still throws you. + applyBodyHit(target, contact.segmentIndex, player.x, player.pad, now, + 900 + 700 * power, 620); + continue; + } + killPlayer(target, player.pad, now, "BLASTED"); + } + + for (const item of balls) { + if (!item.active) continue; + if (Math.hypot(item.x - player.x, item.y - terrainY) > radius + item.radius) + continue; + item.active = false; + item.heldBy = -1; + item.vx = 0; + item.vy = 0; + item.serveAt = now + 1200000; + spawnImpact({ x: item.x, y: item.y, z: item.z, + life: .22, duration: .22, death: false, explosion: false }); + emitSignal("ballblock", player.pad, 1, power); + } + + const geometry = runnerWorldGeometry(player, poseTime); + for (const limb of limbParts) + detachPart(player, limb, geometry, player.x, now); + detachPart(player, "torso", geometry, player.x, now); + player.alive = true; + player.stance = "BOUNCE"; + player.lastButton = "HEAD ONLY"; + player.lastButtonAt = now; +} + +// Keep the head at its visible position when its body is released. Impact +// momentum lives in knockVx, so releasing the stick cannot erase the kick. +function launchHead(target, sourceX, sourcePad, now, force, lift, incomingVy = 0) { + if (!isHeadOnly(target)) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + target.fallenBodyGeometry = geometry; + releaseCarriedBall(target, now); + releaseCarriedPart(target, now); + releaseCarriedFighter(target, now); + dismountSkateboard(target, now); + target.removedParts = [...limbParts, "torso"]; + target.partDamage = {}; + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + } + const direction = Math.sign(target.x - sourceX) || + players[sourcePad]?.facing || -target.facing || 1; + const velocity = clamp(target.vx * .3 + direction * force, -4200, 4200); + target.knockVx = velocity - (target.windVx || 0); + target.vx = velocity; + target.vy = clamp(target.vy * .25 + incomingVy * .25 - lift, -2600, 2600); + target.headRollRate = clamp(velocity / 260, -8, 8); + target.grounded = false; + target.jumpHeld = false; + target.jumpLaunchAt = 0; + target.attackKind = ""; + target.attackUntil = target.dashUntil = 0; + target.dashVx = 0; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 180000); + target.stance = "HEAD ONLY"; + target.lastButton = "HEAD VOLLEY"; + target.lastButtonAt = now; +} + +function bounceHeadOnSurface(player, incomingVy, horizontal) { + // Restitution keeps hard landings lively and eventually lets a slow head + // settle, so the existing up/down pumping controls remain useful. + if (incomingVy > 360) { + player.vy = -incomingVy * .62; + player.knockVx *= .86; + player.headRollRate = clamp(player.vx / 260, -8, 8); + player.grounded = false; + player.stance = "BOUNCE"; + } else { + player.vy = 0; + player.grounded = true; + player.stance = horizontal ? "ROLL" : "HEAD ONLY"; + } +} + +// Conservative cheap superset of sampleCombatBoxes' hitbox eligibility. +// Missing attack limbs/head-only may pass this gate, but an active hitbox never +// fails it. Pogo contacts remain eligible even without an attackKind. +function mayHaveMeleeHit(player, now) { + if (!player.alive) return false; + if (isPogo(player) && !player.grounded && !player.pogoHit) return true; + return !player.attackHit && !player.blocking && now >= player.hitStunUntil && + meleeFrame(player, now).phase === "active"; +} + +function resolveMelee(now) { + // Most movement ticks have no strike. Avoid building every fighter's full + // skeletal pose and hurtbox tree when no melee contact can possibly occur. + if (!players.some(player => mayHaveMeleeHit(player, now))) return; + const poseTime = (now - startedAt) / 1000000; + const contacts = []; + const samples = players.map(player => sampleCombatBoxes(player, now)); + for (const attacker of players) { + const attacking = samples[attacker.pad]; + if (!attacker.alive || !attacking.hit.length) continue; + for (const fragment of detachedParts) { + const r = fragment.width/2; + const bounds = combatRect('fragment',Math.min(fragment.x1,fragment.x2)-r, + Math.min(fragment.y1,fragment.y2)-r,Math.max(fragment.x1,fragment.x2)+r, + Math.max(fragment.y1,fragment.y2)+r,(fragment.z1+fragment.z2)/2, + Math.abs(fragment.z2-fragment.z1)/2+r); + if (!attacking.hit.some(hit=>boxesOverlap(hit,bounds))) continue; + const spec = meleeSpecFor(attacker, attacker.attackKind); + fragment.vx += attacker.facing * spec.force * .8; + fragment.vy -= Math.max(220, spec.lift); + fragment.owner = attacker.pad; + fragment.hitAfter = now + 120000; + attacker.attackHit = true; + spawnImpact({ x: (bounds.left+bounds.right)/2, y: (bounds.top+bounds.bottom)/2, + z: (bounds.near+bounds.far)/2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("clap", .82, panPlayer(attacker)); + emitSignal("part-hit", attacker.pad, -1, spec.force); + break; + } + if (attacker.attackHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(attacking, samples[target.pad]); + if (contact?.separation <= 3) { + attacker.attackHit = true; + contacts.push({ attacker, target, + strike: { x: contact.x, y: contact.y, z: contact.z }, + headshot: contact.headshot, segmentIndex: contact.segmentIndex }); + break; + } + } + } + for (const { attacker, target, strike, headshot, segmentIndex } of contacts) { + if (!target.alive && contacts.length < 2) continue; + spawnImpact({ x: strike.x, y: strike.y, z: strike.z, + life: .2, duration: .2, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + const away = Math.sign(target.x - attacker.x) || -attacker.facing; + const backBlocking = !isHeadOnly(target) && target.inputX === away; + if (target.blocking || backBlocking) { + target.stance = "DEFEND"; + target.blockFlash = 1; + target.lastButton = target.blocking ? "BLOCK" : "BACK BLOCK"; + target.lastButtonAt = now; + // An explicit shield returns the attacker's commitment as durable + // knockback. Keep it separate from controlled velocity so holding toward + // the defender cannot erase the recoil on the next simulation frame. + const recoil = target.blocking ? 2400 : 900; + attacker.dashUntil = 0; + attacker.dashVx = 0; + attacker.knockVx = -attacker.facing * recoil; + attacker.vx = attacker.knockVx + attacker.windVx; + if (target.blocking) attacker.vy = Math.min(attacker.vy, -415); + else target.vx = 0; + playDrum("block", 1.2, panPlayer(target)); + emitSignal("block", target.pad, attacker.pad, target.blocking ? 1 : 2); + // Only a real shield trades. A back-block still just shoves, because it + // costs nothing to hold a direction. + if (target.blocking) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const stun = shieldStunUs(spec.force * (attacker.attackMomentum || 1)); + attacker.hitStunUntil = Math.max(attacker.hitStunUntil, now + stun); + attacker.attackHit = true; + attacker.attackKind = ""; + attacker.attackUntil = 0; + attacker.stance = "STUN"; + breakShield(target, now); + } + } else if (headshot) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + const wasHead = isHeadOnly(target); + launchHead(target, attacker.x, attacker.pad, now, + spec.force * momentum * 1.2, + Math.max(620, spec.lift * 3) * momentum, attacker.vy); + playDrum("snare", 1.2, panPlayer(target)); + emitSignal(wasHead ? "head-volley" : "decapitate", + attacker.pad, target.pad, momentum); + } + else { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + applyBodyHit(target, segmentIndex, attacker.x, attacker.pad, now, + spec.force * momentum, spec.lift * momentum); + playDrum(spec.thud[0], spec.thud[1], panPlayer(target)); + } + } +} + +function resolvePogoAttacks(now) { + const poseTime = (now - startedAt) / 1000000; + for (const attacker of players) { + if (!attacker.alive || !isPogo(attacker) || attacker.grounded || + attacker.pogoHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(sampleCombatBoxes(attacker,now),sampleCombatBoxes(target,now)); + if (!contact || contact.separation > 3) continue; + attacker.pogoHit = true; + attacker.vy = Math.min(attacker.vy, -985); + attacker.lastButton = "POGO"; + attacker.lastButtonAt = now; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: contact.headshot, explosion: false }); + if (contact.headshot) killPlayer(target, attacker.pad, now, "POGO"); + else applyBodyHit(target, contact.segmentIndex, attacker.x, + attacker.pad, now, 1350, 260); + playDrum("kick", 1.1, panPlayer(attacker)); + emitSignal("pogo", attacker.pad, contact.headshot ? 1 : 0, 0); + break; + } + } +} + +function resolvePlayerPushboxes() { + for (let a = 0; a < players.length; a++) + for (let b = a + 1; b < players.length; b++) + resolvePlayerPushboxPair(players[a], players[b]); +} + +function resolvePlayerPushboxPair(first, second) { + if ([first, second].some((p) => p.ropeIndex >= 0 || p.skateLoop >= 0)) return; + if (!first.alive || !second.alive) return; + const poseTime = (runtime().monotonicUs - startedAt) / 1000000; + const firstBounds = combatPushbox(first); + const secondBounds = combatPushbox(second); + const verticalOverlap = Math.min(firstBounds.bottom, secondBounds.bottom) - + Math.max(firstBounds.top, secondBounds.top); + // Grounded fighters nudge one another. Once a jumper is clearly above the + // other fighter, the pushboxes separate so cross-over jumps are possible. + if (verticalOverlap <= 18 || + ((!first.grounded || !second.grounded) && + Math.abs(first.y - second.y) > 58)) return; + const left = first.x <= second.x ? first : second; + const right = left === first ? second : first; + const pushRadius = (player) => (combatPushbox(player).right-combatPushbox(player).left)/2; + const minimumGap = pushRadius(left) + pushRadius(right); + const overlap = minimumGap - (right.x - left.x); + if (overlap <= 0) return; + const leftAdvancing = left.vx > 30; + const rightAdvancing = right.vx < -30; + const leftShare = leftAdvancing && !rightAdvancing ? .25 + : rightAdvancing && !leftAdvancing ? .75 : .5; + left.x -= overlap * leftShare; + right.x += overlap * (1 - leftShare); + if (leftAdvancing && !rightAdvancing) { + right.knockVx += Math.min(180, left.vx * .12); + left.vx *= .35; + } else if (rightAdvancing && !leftAdvancing) { + left.knockVx += Math.max(-180, right.vx * .12); + right.vx *= .35; + } else { + if (left.vx > 0) left.vx *= .35; + if (right.vx < 0) right.vx *= .35; + } + resolveRunnerBounds(left, 0); + resolveRunnerBounds(right, 0); +} + +function resolvePlayerStanding(now) { + const poseTime = (now - startedAt) / 1000000; + const previousStanding = players.map((player) => player.standingOn); + for (const player of players) player.standingOn = -1; + for (const rider of players) { + for (const base of rivalsOf(rider)) { + // A committed dive passes through a head contact and completes against + // the terrain. Treating it as ordinary standing used to zero its velocity + // and leave the fighter strangely paused on the opponent's scalp. + if (!rider.alive || !base.alive || rider.vy < 0 || rider.pounding) continue; + const head = runnerWorldGeometry(base, poseTime).head; + const top = head.y - head.radius; + const horizontal = Math.abs(rider.x - head.x) <= head.radius + 42; + const depth = Math.abs(rider.z - head.z) <= head.radius + 32; + const crossed = (rider.previousY ?? rider.y) <= top + 8 && + rider.y >= top - 3; + const stayed = previousStanding[rider.pad] === base.pad && + rider.y <= top + 34; + if (!horizontal || !depth || (!crossed && !stayed)) continue; + const wasGrounded = rider.grounded; + rider.y = top; + rider.vy = Math.min(0, base.vy); + rider.grounded = true; + rider.standingOn = base.pad; + rider.sinkUntil = 0; + rider.hopUntil = 0; + if (!wasGrounded) rider.landPoseUntil = now + 110000; + break; + } + } +} + +function updateStance(player, input, now) { + const opponent = nearestRival(player); + const toward = Math.sign(opponent.x - player.x) || player.facing || 1; + player.stance = !player.alive ? "HIT" + : now < player.hitStunUntil ? "STUN" + : player.blocking ? "DEFEND" + : player.heldBall >= 0 ? "HOLDING" + : player.grabHeld ? "REACHING" + : player.attackKind ? "ATTACK" + : now < player.sinkUntil ? "SINK" + : !player.grounded && now < player.hopUntil ? "CROUCH HOP" + : player.ducking ? player.grounded ? "CROUCH" : "AIR CROUCH" + : player.pogoDive ? "POGO DOWN" + : player.skateboard && player.grounded ? "SKATE" + : !player.grounded ? "AIR" + : now < player.dashUntil ? "DASH" + : input.horizontal === toward ? "ADVANCE" + : input.horizontal === -toward ? "RETREAT" + : "NEUTRAL"; +} + +function grabNearestBall(player, now) { + let nearest = null; + let nearestDistance = 240; + for (let index = 0; index < balls.length; index++) { + const item = balls[index]; + if (!item.active || item.heldBy >= 0) continue; + const distance = Math.hypot(item.x - player.x, + item.y - (player.y - 82), item.z - player.z); + if (distance >= nearestDistance) continue; + nearest = { item, index }; + nearestDistance = distance; + } + if (!nearest) return false; + player.heldBall = nearest.index; + player.carryArm = availableArm(player); + nearest.item.heldBy = player.pad; + nearest.item.safeUntil = now + 180000; + nearest.item.safePlayers = 1 << player.pad; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + emitSignal("grab", player.pad, nearest.index, nearest.item.mass); + playDrum("clap", .72, panPlayer(player)); + return true; +} + +function grabNearestFighter(player, now) { + const target = players.find((candidate) => candidate.pad !== player.pad && + candidate.alive && candidate.grabbedBy < 0 && + Math.hypot(candidate.x - player.x, + candidate.y - (player.y - 72), candidate.z - player.z) < 210); + if (!target) return false; + player.heldPlayer = target.pad; + player.carryArm = availableArm(player); + target.grabbedBy = player.pad; + target.vx = target.vy = target.vz = 0; + target.lastButton = "GRABBED"; + target.lastButtonAt = now; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + playDrum("clap", .82, panPlayer(player)); + emitSignal("grab-player", player.pad, target.pad, isHeadOnly(target) ? 1 : 0); + return true; +} + +function grabNearestPart(player, now) { + let bestIndex = -1; + let bestDistance = 190; + for (let index = 0; index < detachedParts.length; index++) { + const part = detachedParts[index]; + if (part.heldBy >= 0) continue; + const x = (part.x1 + part.x2) / 2; + const y = (part.y1 + part.y2) / 2; + const z = (part.z1 + part.z2) / 2; + const distance = Math.hypot(x - player.x, y - (player.y - 78), z - player.z); + if (distance >= bestDistance) continue; + bestIndex = index; + bestDistance = distance; + } + if (bestIndex < 0) return false; + const part = detachedParts[bestIndex]; + player.heldPart = bestIndex; + player.carryArm = availableArm(player); + part.heldBy = player.pad; + part.owner = player.pad; + part.vx = part.vy = 0; + player.lastButton = "HOLDING " + part.part.toUpperCase(); + player.lastButtonAt = now; + emitSignal("grab-part", player.pad, bestIndex, 1); + return true; +} + +function stealHeldObject(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.hypot(target.x - player.x, + target.y - player.y, target.z - player.z) > 220) return false; + let label = ""; + if (target.heldBall >= 0) { + const index = target.heldBall; + const item = balls[index]; + target.heldBall = -1; + player.heldBall = index; + if (item) item.heldBy = player.pad; + label = "BALL"; + } else if (target.heldPart >= 0) { + const index = target.heldPart; + const part = detachedParts[index]; + target.heldPart = -1; + player.heldPart = index; + if (part) { part.heldBy = player.pad; part.owner = player.pad; } + label = part?.part?.toUpperCase() || "LIMB"; + } else if (!unarmedRoundActive() && target.gunAmmo > 0) { + player.gunAmmo = target.gunAmmo; + player.gunMode = target.gunMode; + target.gunAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + target.gunMode = "HANDGUN"; + label = player.gunMode; + } else if (!unarmedRoundActive() && target.grenadeAmmo > 0) { + player.grenadeAmmo = target.grenadeAmmo; + target.grenadeAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + label = "GRENADES"; + } + if (!label) return false; + target.lastButton = label + " TAKEN"; + target.lastButtonAt = now; + player.lastButton = "STOLE " + label; + player.lastButtonAt = now; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 160000); + playDrum("clap", 1, panPlayer(player)); + emitSignal("steal", player.pad, target.pad, 1); + return true; +} + +function releaseCarriedPart(player, now) { + if (player.heldPart < 0) return; + const part = detachedParts[player.heldPart]; + if (part) { + part.heldBy = -1; + part.owner = player.pad; + part.vx = player.vx + player.facing * 1900; + part.vy = Math.min(player.vy, -460); + part.hitAfter = now + 90000; + part.life = Math.max(part.life, 3.4); + emitSignal("throw-part", player.pad, player.heldPart, player.facing); + } + player.heldPart = -1; + player.carryArm = ""; +} + +function releaseCarriedFighter(player, now) { + if (player.heldPlayer < 0) return; + const target = players[player.heldPlayer]; + if (target) { + target.grabbedBy = -1; + target.x = player.x + player.facing * 118; + target.y = player.y - 74; + target.z = player.z; + target.vx = player.vx + player.facing * 1500; + target.vy = Math.min(player.vy, -620); + target.grounded = false; + target.hitStunUntil = now + 260000; + emitSignal("throw-player", player.pad, target.pad, player.facing); + } + player.heldPlayer = -1; + player.carryArm = ""; +} + +function releaseCarriedBall(player, now) { + if (player.heldBall < 0) return; + const item = balls[player.heldBall]; + if (item) { + item.heldBy = -1; + item.x = player.x + player.facing * (item.radius + 70); + item.y = player.y - 88; + item.z = player.z; + item.vx = player.vx; + item.vy = player.vy; + item.safeUntil = now + 120000; + item.safePlayers = 1 << player.pad; + emitSignal("release", player.pad, player.heldBall, item.mass); + } + player.heldBall = -1; + player.carryArm = ""; +} + +function bouncePogoOnSurface(player, surfaceY, now) { + player.y = surfaceY; + player.vy = -pogoBounceVelocity; + player.grounded = false; + player.pogoDive = false; + player.pogoHit = false; + player.stance = "POGO BOUNCE"; + player.lastButton = "POGO BOUNCE"; + player.lastButtonAt = now; + playDrum("kick", .9, panPlayer(player)); + emitSignal("pogo", player.pad, -2, pogoBounceVelocity); +} + +function shieldBash(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.abs(target.x - player.x) > shieldRadius * 1.35 || + Math.abs(target.y - player.y) > 170) return; + const direction = Math.sign(target.x - player.x) || player.facing; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blocking = false; + player.knockVx -= direction * 620; + player.hitStunUntil = Math.max(player.hitStunUntil, now + 180000); + target.knockVx += direction * 1250; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 240000); + target.grounded = false; + target.vy = Math.min(target.vy, -180); + if (target.blocking) { + target.shieldLocked = true; + target.shieldBrokenAt = now; + target.blocking = false; + target.knockVx += direction * 420; + } + spawnImpact({ x: (player.x + target.x) / 2, y: player.y - 90, + z: (player.z + target.z) / 2, life: .26, duration: .26, + death: false, explosion: true, blastRadius: 180, power: .35 }); + playDrum("block", 1.25, panPlayer(player)); + emitSignal("shield-bash", player.pad, target.pad, target.shieldLocked ? 1 : 0); +} + +function updatePlayer(player, pad, dt, now) { + const parkPreviousX = player.x; + player.previousY = player.y; + if (player.grabbedBy >= 0) { + const carrier = players[player.grabbedBy]; + if (!carrier?.alive || carrier.heldPlayer !== player.pad) { + player.grabbedBy = -1; + } else { + player.x = carrier.x + carrier.facing * 108; + player.y = carrier.y - 76; + player.z = carrier.z; + player.vx = player.vy = player.vz = 0; + player.grounded = false; + player.blocking = false; + player.attackKind = ""; + player.previous = pad.down.slice(); + return; + } + } + if (!player.alive) { + player.previous = pad.down.slice(); + // A body that dies off the ground still has to come down. Everything + // below this branch is skipped while dead, gravity included, which is + // right in a round — the round ends and rebuilds the body, and the + // killcam wants the pose held. The waiting room has no round, so a + // fighter blasted out of a jump hung in mid-air in its jump pose for the + // whole respawn beat. @jeffrey: "it seems possible to die in the waiting + // room but keep jumping stilll" — that is what a frozen hop looks like. + if (lobbyActive() && now < player.respawnAt) settleCorpse(player, dt); + if (now >= player.respawnAt && !freeForAll()) { + player.x = player.spawnX; + player.y = terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.windVx = 0; + player.knockVx = 0; + player.grounded = true; + player.ducking = false; + player.inputX = 0; + player.inputY = 0; + player.dashUntil = 0; + player.stance = "NEUTRAL"; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + // The waiting room hands back a whole body and a swept floor: parts, + // corpses and scattered limbs are round furniture, and the lobby has + // no round to rebuild the one or clear the others. + if (lobbyActive()) { + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + player.lobbyDeathDressed = false; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.lastTap = {}; + player.lastRelease = {}; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + deathCinematic = null; + detachedParts.length = 0; + } + player.alive = true; + } + return; + } + player.suppressedDirections = player.suppressedDirections.filter((button) => + pad.down.includes(button)); + const headOnly = isHeadOnly(player); + const pogo = isPogo(player); + const legCount = ["left-leg", "right-leg"] + .filter((part) => hasPart(player, part)).length; + const armCount = ["left-arm", "right-arm"] + .filter((part) => hasPart(player, part)).length; + const rawInput = quantizedInput(pad, player.suppressedDirections); + const hitStunned = now < player.hitStunUntil; + const wasBlocking = player.blocking; + const carrying = player.heldBall >= 0 || player.heldPart >= 0 || + player.heldPlayer >= 0 || Boolean(heldItem(player)); + const aimLocked = carrying && pad.down.includes("X"); + player.itemAimLocked = aimLocked; + if (aimLocked && (rawInput.horizontal || rawInput.vertical)) { + player.gunAimX = rawInput.horizontal; + player.gunAimY = -rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } + // A held gun used to point dead ahead unless you also held X, so the one + // thing a player is plainly doing with it — pointing it somewhere — never + // reached the fighter. A vertical direction now tilts the hand on its own. + // The X lock still earns its keep: it pins an aim while you stand still and + // it turns you. This does neither, deliberately — steering the drawn arm + // must not steer the walk, or every upward shot would rewrite your footing. + player.gunAimLive = false; + if (!aimLocked && player.gunAmmo > 0 && rawInput.vertical) { + player.gunAimX = rawInput.horizontal || player.facing; + player.gunAimY = -rawInput.vertical; + player.gunAimLive = true; + } + // A broken shield stays down until X is let go, so the opening it bought is + // spent on attacking rather than on re-guarding by reflex. + if (player.shieldLocked && !pad.down.includes("X")) player.shieldLocked = false; + player.blocking = !carrying && !headOnly && pad.down.includes("X") && + !player.shieldLocked; + if (player.blocking && !wasBlocking) { + player.attackKind = ""; + player.attackUntil = 0; + player.shieldCrouched = rawInput.vertical < 0 || player.ducking || + player.crouchBlend >= .35; + player.shieldVx = 0; + player.vx = player.windVx + player.knockVx; + player.dashUntil = 0; + player.dashVx = 0; + player.lastTap = {}; + player.lastRelease = {}; + shieldBash(player, now); + } + if (player.blocking && rawInput.vertical < 0) player.shieldCrouched = true; + if (player.blocking) { + player.shieldAimX = rawInput.horizontal; + player.shieldAimY = rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } else { + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + } + // Guard plants the fighter immediately, but DOWN remains meaningful: a + // standing guard can settle into a crouching guard. Once crouched, the pose + // latches until the shield itself drops even if DOWN is released first. + const input = player.blocking + ? { horizontal: 0, vertical: player.shieldCrouched ? -1 : 0 } : rawInput; + const grabHeld = armCount > 0 && !pogo && !hitStunned && !player.blocking && + pad.down.includes("A") && pad.down.includes("B"); + if (skateparkMap && !survivalActive()) { + const ropeHeld = skateRopeInput(player, input, grabHeld, dt, grabHeld && !player.grabHeld); + if (ropeHeld || skateLoopStep(player, input, dt, now)) { + player.previous = pad.down.slice(); + player.grabHeld = grabHeld; + return; + } + } + if (grabHeld && !player.grabHeld && player.heldBall < 0 && + player.heldPart < 0 && + player.heldPlayer < 0) { + if (!stealHeldObject(player, now) && !grabNearestBall(player, now) && + !grabNearestPart(player, now) && + !grabNearestFighter(player, now)) { + player.lastButton = "REACHING"; + player.lastButtonAt = now; + emitSignal("reach", player.pad, player.facing, 0); + } + } + else if (!grabHeld && player.heldBall >= 0) + releaseCarriedBall(player, now); + else if (!grabHeld && player.heldPart >= 0) + releaseCarriedPart(player, now); + else if (!grabHeld && player.heldPlayer >= 0) + releaseCarriedFighter(player, now); + const inputChanged = input.horizontal !== player.inputX || + input.vertical !== player.inputY; + if (inputChanged && + (input.horizontal || input.vertical)) + emitSignal("move", player.pad, input.horizontal, input.vertical); + player.pendingMoveLabel = ""; + // An ultra jump IS a second press of UP, so the air-jump gate below used to + // see the same press the double-tap had just spent: the ultra fired, a + // double jump launched on top of it a tick later, the move read-out said + // DOUBLE JUMP, and the air jump the fighter never asked for was gone. The + // horizontal branch has always honored the "tap was spent" answer; this is + // the vertical one doing the same. It matters more in a tower, where the + // crow's nest is the one rung an ultra jump is the only way onto. + let verticalTapSpent = false; + const upPressed = input.vertical > 0 && !player.previous.includes("MOVE_UP"); + const downPressed = input.vertical < 0 && player.inputY >= 0; + const wasCrouched = player.ducking || player.crouchBlend >= .35; + const crouchTarget = input.vertical < 0 || + (!player.grounded && player.crouchJump && now < player.jumpPoseUntil) || + (!player.grounded && now < player.hopUntil) ? 1 : 0; + const crouchStep = dt * (crouchTarget ? 9 : 11); + player.crouchBlend += clamp(crouchTarget - player.crouchBlend, + -crouchStep, crouchStep); + player.ducking = player.crouchBlend >= .52; + if (player.attackKind && now >= player.attackUntil) { + player.attackKind = ""; + player.attackHit = false; + player.attackMomentum = 1; + } + if (player.itemAction && now >= player.itemActionUntil) + player.itemAction = ""; + if (player.inputX && input.horizontal !== player.inputX) + player.lastRelease[player.inputX > 0 ? "RIGHT" : "LEFT"] = now; + if (player.inputY && input.vertical !== player.inputY) + player.lastRelease[player.inputY > 0 ? "UP" : "DOWN"] = now; + if (input.horizontal && input.horizontal !== player.inputX) { + const direction = input.horizontal > 0 ? "RIGHT" : "LEFT"; + recordCommand(player, direction, now); + if (!directionTap(player, direction, now) && player.grounded && + player.ducking && !headOnly && !pogo && !hitStunned) + crouchHop(player, input.horizontal, now); + } + if (input.vertical && input.vertical !== player.inputY) { + const direction = input.vertical > 0 ? "UP" : "DOWN"; + recordCommand(player, direction, now); + verticalTapSpent = directionTap(player, direction, now); + if (headOnly) { + const alternating = player.headPumpDirection && + player.headPumpDirection !== input.vertical && + now - (player.headPumpAt || 0) <= 520000; + player.headBounceCharge = clamp((player.headBounceCharge || 0) + + (alternating ? .2 : .035), 0, 1); + player.headPumpDirection = input.vertical; + player.headPumpAt = now; + if (alternating && player.grounded) { + player.vy = -lerp(420, headBounceVelocity * 1.7, + player.headBounceCharge); + player.grounded = false; + player.stance = "BOUNCE " + Math.round(player.headBounceCharge * 5); + playDrum("block", .45 + player.headBounceCharge * .45, + panPlayer(player)); + emitSignal("head-bounce", player.pad, input.vertical, + player.headBounceCharge); + } + } + } + + if (headOnly) { + const sincePump = now - (player.headPumpAt || 0); + if (sincePump > 650000) + player.headBounceCharge = Math.max(0, + (player.headBounceCharge || 0) - dt * .22); + } + + if (input.horizontal) player.facing = input.horizontal; + // Fighting-game directions are digital: full movement begins and ends on + // the sampled edge. The analog stick is only an eight-way gate. + if (player.grounded) player.windVx *= Math.max(0, 1 - dt * 10); + else player.windVx = clamp(player.windVx + windAcceleration * dt, -900, 900); + player.knockVx *= Math.max(0, 1 - dt * (headOnly + ? player.grounded ? 1.6 : .22 : player.grounded ? 7 : 1.8)); + if (now < player.dashUntil && input.horizontal && + Math.sign(player.dashVx) !== input.horizontal) { + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + } + const dashRunningOut = player.grounded && input.horizontal && + player.dashUntil > 0 && now >= player.dashUntil; + if (dashRunningOut && !player.runSince) { + player.runSince = now; + } + if (!player.grounded || !input.horizontal || player.blocking || + player.ducking || hitStunned) player.runSince = 0; + const walkingCleanly = player.grounded && input.horizontal && !player.blocking && + !player.ducking && !hitStunned && now >= player.dashUntil; + if (!walkingCleanly) player.walkSince = 0; + else if (!player.walkSince) player.walkSince = now; + else if (!player.runSince && now - player.walkSince >= 650000) + player.runSince = now; + const headAirControl = player.grounded ? .55 + : lerp(.55, .9, player.headBounceCharge || 0); + const mobility = headOnly ? headAirControl + : pogo ? .68 : legCount === 1 ? .72 : 1; + const runSpeed = player.runSince + ? Math.min(runTopSpeed, runStartSpeed + + (now - player.runSince) / 1000000 * runAcceleration) : 0; + let controlledVx = aimLocked ? 0 + : player.blocking ? player.shieldVx || 0 + : now < player.dashUntil && Math.abs(player.dashVx) > 0 + ? player.dashVx + : player.runSince ? input.horizontal * runSpeed * mobility + : player.ducking && player.grounded ? 0 + : input.horizontal * walkSpeed * mobility; + if (player.skateboard && player.skateWallSide) { + // Once the board reaches a coping, horizontal momentum has become upward + // wall momentum. Keep the root on that wall until gravity spends it; the + // player can also steer away to peel off early. + const peelAway = input.horizontal === -player.skateWallSide; + if (player.vy >= 0 || peelAway) { + const side = player.skateWallSide; + player.skateWallSide = 0; + player.skateVx = -side * Math.max(720, Math.abs(player.skateVx) * .42); + controlledVx = player.skateVx; + } else controlledVx = 0; + } else if (player.skateboard && player.grounded && !player.blocking) { + // Steering, and ONLY while steering. This used to run every frame against + // a target of `input.horizontal * 2700`, which on an idle stick is zero — + // so a coasting skater was being dragged to a standstill at 3.2 a second + // by the same line that turns them. On a flat cube nobody could tell; + // dropped into a three-tile bowl it is the difference between a 1,400-unit + // drop and a 268-unit one, because the servo ate gravity as fast as + // gravity arrived. Let go of the stick now and you coast, which is what + // rolling IS. + const skateTarget = input.horizontal * 2700; + // Carving is steering against the roll, and it has to stay in scope: the + // scrape it makes is played further down, and hoisting the steer into a + // block took both of these with it. + const carving = Boolean(input.horizontal) && + Math.sign(skateTarget) !== Math.sign(player.skateVx); + if (input.horizontal) { + const turnRate = carving ? 1.8 : 3.2; + player.skateVx += (skateTarget - player.skateVx) * + (1 - Math.exp(-dt * turnRate)); + } + // Gravity along the surface, resolved honestly rather than by a tuned + // constant. The old line was `slope * 1900`, and `slope` is tan(angle) — + // which runs away to infinity as a transition goes vertical and had to be + // clamped at 2.5 to stop it. The horizontal share of gravity on a slope is + // g·sin·cos, which in terms of tan is g·t/(1+t²): it peaks at 45° exactly + // as it should, falls off toward vertical exactly as it should, and needs + // no clamp because it cannot exceed half of g. + const contact = skateContact(player.x, player.y); + const terrainSlope = Math.tan(contact.pitch); + player.skateVx += fallGravity() * terrainSlope / + (1 + terrainSlope * terrainSlope) * dt; + // Pumping. The one thing a skater does that a rolling object does not: + // crouch through the bottom of a transition and stand up through the + // face, and come out with more speed than you went in with. Holding DOWN + // on a slope is that, and it is the only way to gain speed in the bowl + // without pushing — which is what makes a bowl worth being in rather than + // a hole to cross. + // + // Priced against the slope, so it pays on a transition and pays nothing + // on the flat: a crouch in the middle of the park is a crouch, not a + // cheat code. Direction comes from the roll rather than the stick, + // because pumping adds to the speed you have, it does not steer. + const pumping = input.vertical < 0 && Math.abs(terrainSlope) > .18; + if (pumping && player.skateVx) + player.skateVx += Math.sign(player.skateVx) * + Math.abs(terrainSlope) * skatePumpAcceleration * dt; + player.skateVx = clamp(player.skateVx, -4200, 4200); + // Leaving the lip. A rider climbing a transition is carrying real upward + // speed -- `skateVx * slope` -- and the moment the ground stops climbing + // under them, that speed has nowhere to go but into the air. Reading the + // ground a frame ahead is what catches the crest: the coping at the top + // of a quarterpipe, the edge of the funbox, the lip of the bowl. + // + // Without this a skater simply walks over the top of every ramp with the + // speed quietly deleted, which is the difference between a skatepark and + // a set of hills. + const surfaceVy = player.skateVx * terrainSlope; + const aheadSlope = clamp(terrainTangentAt( + player.x + player.skateVx * .05), -2.5, 2.5); + if (surfaceVy < -skateLaunchFloor && + (aheadSlope - terrainSlope) * Math.sign(player.skateVx) > .2) { + player.vy = surfaceVy; + player.grounded = false; + player.skateAirAt = now; + playDrum("whoosh", .5 + Math.min(.45, -surfaceVy / 4000), + panPlayer(player)); + emitSignal("skate-air", player.pad, + Math.round(-surfaceVy), Math.round(player.skateVx)); + } + if (!input.horizontal) player.skateVx *= Math.exp(-dt * .65); + controlledVx = player.skateVx; + const skateSpeed = Math.abs(player.skateVx); + const carveDir = carving ? Math.sign(skateTarget) : 0; + if (carveDir && skateSpeed > 900 && player.skateCarveDir !== carveDir) { + playDrum("whoosh", .45 + Math.min(.4, skateSpeed / 4200 * .5), + panPlayer(player)); + emitSignal("skate-carve", player.pad, carveDir, + Math.round(skateSpeed / 42) / 100); + } + player.skateCarveDir = carveDir; + } else if (player.skateboard && !player.grounded) { + // Keep the board's launch momentum instead of borrowing walking speed + // in the air and reviving a different skateVx on landing. + controlledVx = player.skateVx; + } else if (!player.skateboard) player.skateVx = 0; + player.vx = controlledVx + player.windVx + player.knockVx; + if (inputChanged) telemetry("FIGHT_MOVE", player.name + + " pad=" + (player.pad + 1) + + " held=" + (pad.down.filter((button) => button.startsWith("Arrow")).join("+") || "NONE") + + " stick=" + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + + " quant=" + input.horizontal + "," + input.vertical + + " controlled=" + Math.round(controlledVx) + + " shield=" + (player.blocking ? 1 : 0) + + " wind=" + Math.round(player.windVx) + + " knock=" + Math.round(player.knockVx) + + " vx=" + Math.round(player.vx) + + " x=" + Math.round(player.x)); + + // Checked before liftoff so the launch frame itself can never be cut. + if (player.jumpHeld && player.vy < 0 && !player.blocking && + input.vertical <= 0) { + player.vy *= jumpCutScale; + player.jumpHeld = false; + } + if (airRoundActive()) player.airJumpsUsed = 0; + if (!aimLocked && !headOnly && upPressed && !verticalTapSpent && + !player.jumpLaunchAt && + (player.grounded || player.airJumpsUsed < 1)) { + const airJump = !player.grounded; + player.jumpLaunchAt = now + (airJump ? 1 : jumpAnticipationUs); + player.crouchJump = !airJump && wasCrouched; + if (airJump) { + player.airJumpsUsed++; + player.doubleJumpLinesUntil = now + 280000; + } + player.pendingMoveLabel = player.skateboard ? "OLLIE" + : airJump ? "DOUBLE AIR" + : wasCrouched ? "CROUCH AIR" : "AIR"; + } + if (player.jumpLaunchAt && now >= player.jumpLaunchAt) { + player.jumpLaunchAt = 0; + player.jumpPoseUntil = now + + (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs); + const jumpScale = player.skateboard ? 1.12 + : pogo ? .88 : legCount === 1 ? .78 : 1; + player.vy = Math.min(player.vy, + -(player.crouchJump ? crouchJumpVelocity : jumpVelocity) * jumpScale); + player.jumpHeld = true; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.grounded = false; + player.skateWallSide = 0; + player.ducking = player.crouchJump; + playDrum("block", 0.72, panPlayer(player)); + emitSignal("jump", player.pad, 1, 0); + } + if (pogo && !player.grounded && !hitStunned && downPressed) { + player.vy = Math.max(player.vy, 2250); + player.pogoDive = true; + player.pogoHit = false; + player.pendingMoveLabel = "POGO DOWN"; + player.stance = "POGO DOWN"; + playDrum("kick", .78, panPlayer(player)); + playSine(620, .13); + emitSignal("pogo", player.pad, -1, player.vy); + } + if (!player.grounded && !pogo && input.vertical < 0) { + player.ducking = true; + player.pendingMoveLabel ||= "AIR CROUCH"; + } + + // Y and either shoulder spend an item, so reaching for a kick can no + // longer empty a magazine. A loaded hand still colors the punch — into a + // swing, never a shot. + const acting = !headOnly && !pogo && !hitStunned && !player.blocking; + if (acting && player.gunMode === "RUBBER SMG" && player.gunAmmo > 0 && + pad.down.includes("Y") && player.previous.includes("Y") && + now >= player.nextGunShotAt) + fireGun(player, input); + for (const button of pad.down) { + if (!player.previous.includes(button)) { + remember(player, button); + if (button === "X" && !headOnly) { + player.pendingMoveLabel = "SHIELD"; + playDrum("block", .7, panPlayer(player)); + emitSignal("shield", player.pad, 1, 0); + } + else if (acting && !grabHeld && button === "A") + startMelee(player, "KICK", now); + else if (acting && !grabHeld && button === "B") + startMelee(player, itemMelee[heldItem(player)] || "PUNCH", now); + else if (headOnly && !hitStunned && button === "A") + spit(player, false); + else if (headOnly && !hitStunned && button === "B") + spit(player, true); + else if ((acting || (headOnly && !hitStunned)) && + ["Y", "LeftShoulder", "RightShoulder"].includes(button)) { + const item = heldItem(player); + if (item === "GUN") fireGun(player, input); + else if (item === "GRENADE") throwGrenade(player, input); + } + } + } + if (grabHeld) { + player.lastButton = player.heldBall >= 0 ? "HOLDING" : "REACHING"; + player.lastButtonAt = now; + } + if (player.pendingMoveLabel) remember(player, player.pendingMoveLabel); + + const previousX = player.x; + const previousY = player.y; + const wasGrounded = player.grounded; + player.vy += (player.vy < 0 ? riseGravity() : fallGravity()) * dt; + // Keeping DOWN held through a pound drives it down harder. The button is + // the only thing that makes a pound faster, so the height you fell from and + // the pressure you kept on it are the two dials on the crater. + if (player.pounding && input.vertical < 0) + player.vy = Math.min(poundMaxVelocity * + (1 + .5 * Math.max(0, player.poundLevel - 1)), + player.vy + poundHoldAcceleration * dt); + if (airRoundActive()) { + // A shared terminal fall keeps the duel within reach; UP can flap again, + // DOWN dives. The world has no floor and falling never eliminates anyone. + player.vy = Math.min(player.vy, input.vertical < 0 ? 1050 : 760); + player.skateboard = false; + } + player.x += player.vx * dt; + player.y += player.vy * dt; + // A bodyless head is a ball, and a ball that slides without turning reads + // as a sticker on the floor. Ground contact sets the spin to the true + // rolling rate for the 22-unit radius; the spin then integrates every + // frame, because a head that leaves the floor mid-bounce keeps turning — + // spinning only while grounded left the bouncing head (which is how a head + // mostly travels) with a face nailed bolt upright between landings. + // `grounded` still holds last frame's answer here — it resets just below. + if (isHeadOnly(player)) { + // Clamped well below the true rolling rate: honest physics for a 22-unit + // ball at fight speed is eleven revolutions a second, which on screen is + // not a rolling face but a whirl of spinning lines. A lazy tumble — about + // a turn per second, capped — keeps the eyes and mouth readable while + // still saying which way the head is traveling. + if (player.grounded) player.headRollRate = clamp(player.vx / 22, -6, 6); + player.headRoll = (player.headRoll || 0) + (player.headRollRate || 0) * dt; + } + // Walking down a slope is not a new landing on every other tick. + const nextFloor = terrainFloorAt(player.x); + const followingFloor = wasGrounded && player.vy >= 0 && + Math.abs(previousY - terrainFloorAt(previousX)) < 3 && + nextFloor - previousY <= Math.max(20, Math.abs(player.vx * dt) * 2.5); + if (followingFloor) player.y = Math.max(player.y, nextFloor); + const landingSpeed = player.vy; + player.grounded = false; + // A sinking fighter is transparent to the rung it left and to nothing else. + // A window long enough to clear one lip — .25s, 290 units of fall — is + // already long enough to fall past the next rung 260 below, and a + // double-tap that dropped two storeys read as a fall rather than a step + // down. Remembering where the sink started is what keeps it one storey. + // The floor is never transparent, which is why it stays in the else. + const ledge = player.vy >= 0 && ledgeCrossed(player.x, previousY, player.y); + const sinking = now < player.sinkUntil && + ledge && ledge.y <= player.sinkFrom + 4; + if (ledge && !sinking) { + player.y = ledge.y; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, ledge.y, now); + } else { + player.vy = 0; + player.grounded = true; + } + } else if (player.y >= terrainFloorAt(player.x) && + (!player.skateboard || player.vy >= 0)) { + const terrainY = terrainFloorAt(player.x); + player.y = terrainY; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, terrainY, now); + } else { + player.vy = 0; + player.grounded = true; + } + } + if (player.skateboard) { + const contact = skateContact(player.x, previousY); + const supported = player.grounded || (wasGrounded && player.vy >= 0 && + Math.abs(player.y - contact.y) < Math.max(24, Math.abs(player.vx * dt) * 2.5)); + if (supported && !player.skateWallSide) { + player.y = contact.y; + const tangentX = Math.cos(contact.pitch); + const tangentY = Math.sin(contact.pitch); + if (!wasGrounded) { + // Inelastic contact removes normal velocity. A downward impact at a + // lip must count against uphill momentum, not become an upward boost. + player.skateVx = (player.vx * tangentX + landingSpeed * tangentY) * tangentX; + } else { + // Carry tangent speed around the curve; fixed horizontal speed would + // invent vertical energy whenever the slope steepens. + player.skateVx *= tangentX / Math.max(.001, + Math.cos(player.skatePitch || 0)); + } + player.vx = player.skateVx; + player.skatePitch = contact.pitch; + player.skateContacts = Number(contact.left) + Number(contact.right); + player.grounded = true; + player.vy = 0; + const distance = (player.x - previousX) / Math.max(.15, Math.cos(contact.pitch)); + player.skateSpin = (player.skateSpin || 0) + distance / skateWheelRadius; + player.skateRollDistance = (player.skateRollDistance || 0) + Math.abs(distance); + if (player.skateContacts && player.skateRollDistance >= 100) { + player.skateRollDistance %= 100; + playDrum("hat", .12 + Math.min(.35, Math.abs(player.vx) / 8400), panPlayer(player)); + emitSignal("skate-roll", player.pad, Math.round(Math.abs(player.vx)), player.skateContacts); + } + if (!wasGrounded) { + playDrum("clap", clamp(landingSpeed / 2000, .2, 1), panPlayer(player)); + playDrum("block", clamp(landingSpeed / 2800, .15, .7), panPlayer(player)); + emitSignal("skate-land", player.pad, Math.round(landingSpeed), player.skateContacts); + } + } else player.skateContacts = 0; + } + if (!wasGrounded && player.grounded) { + const onBooster = boosterXs.some((x) => Math.abs(player.x - x) <= boosterRadius); + player.landPoseUntil = now + 110000; + player.crouchJump = false; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + if (player.pounding) groundPound(player, now); + else if (!headOnly && onBooster) { + player.vy = -boosterVelocity; + player.grounded = false; + player.jumpHeld = true; + player.airJumpsUsed = 0; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + playSine(880, .22); + playDrum("clap", 1.2, panPlayer(player)); + emitSignal("boost", player.pad, 1, 0); + } else player.airJumpsUsed = 0; + } + resolveRunnerBounds(player, (now - startedAt) / 1000000); + skateBoostStep(player, parkPreviousX, now); + player.hit = Math.max(0, player.hit - dt * 4); + player.blockFlash = Math.max(0, player.blockFlash - dt * 6); + player.previous = pad.down.slice(); + if (input.vertical > 0) player.previous.push("MOVE_UP"); + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grabHeld = grabHeld; + updateStance(player, input, now); +} + +// How long a bot leans on a button, per action rather than one house number. +// A jump has to outlast the whole rise (1760 / 4800 ≈ .37s) or jumpCutScale +// clips the arc to a third of its height and the platform goes out of reach; +// a strike is a stab; a sink tap is half of a double-tap. +const botHoldUs = { + walk: 90000, jump: 440000, sinkTap: 60000, + strike: 70000, shield: 120000, item: 110000, +}; +// A press cannot reopen until it has been up this long, so `lastRelease` +// always sees a real gap — that gap is what keeps dash, ultra jump and sink +// readable from synthetic input. Four frames clears doubleTapReleaseUs even +// when the release lands a frame late. +const botRestUs = 66668; +// A thumb cannot hold both ends of an axis, so opening one closes the other. +const botAxis = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft", + ArrowUp: "ArrowDown", ArrowDown: "ArrowUp" }; + +// The bot's dice. Not Math.random, deliberately: two fresh sims must roll +// identically (the determinism test holds that line), and the reel factory +// reserves the global stream for the match name. Seeded per fighter at round +// start from the round clock, so rounds differ live while a replayed sim +// replays exactly. +function botRoll(player) { + let s = player.botRngState = (player.botRngState + 0x6d2b79f5) >>> 0; + s = Math.imul(s ^ (s >>> 15), s | 1); + s ^= s + Math.imul(s ^ (s >>> 7), s | 61); + return ((s ^ (s >>> 14)) >>> 0) / 4294967296; +} + +// The one door every synthetic press goes through. Pressing a button that is +// already down extends it, so a pursuit reads as one lean instead of a +// stutter; pressing one that is still resting is refused. +function botPress(player, button, holdUs, now) { + const press = player.botPresses[button]; + if (press && now < press.until) { + press.until = Math.max(press.until, now + holdUs); + return true; + } + if (press && now < press.until + botRestUs) return false; + const other = player.botPresses[botAxis[button]]; + if (other && now < other.until) other.until = now; + player.botPresses[button] = { until: now + holdUs }; + return true; +} + +const botHeld = (player, button, now) => + now < (player.botPresses[button]?.until || 0); + +function botDown(player, now) { + return Object.keys(player.botPresses) + .filter((button) => now < player.botPresses[button].until); +} + +// ── What a bot sees ───────────────────────────────────────────────────────── +// The bots used to steer off the whole table. The climb bot read the ladder +// by index — `platforms[level]` — and the fight bot read the opponent's +// coordinates wherever they were, on screen or not. Neither is what a hand on +// a pad has. A player sees a screen: the rungs the lens has in frame, the lava +// once it has climbed into view, the other fighter while the camera holds +// them — and picks the next move from what that frame offers. +// +// `botScene` is that frame. It is rebuilt every simulation tick from the same +// projection the stage paints with, so a rung is in the scene exactly when +// its lip lands on the screen a person would be watching. `botOptions` is the +// list of moves the scene affords from where the bot is standing: which of +// those rungs one jump reaches, from where; the span it can walk; the deck it +// could sink through. The brains below hold a goal (the summit, the +// opponent), pick the option that advances it as this tick's subgoal, and +// press for that — nothing in them reaches past the frame. +// +// One jump's ceiling, from the same numbers the fighter's legs use: with up +// held, the rise is v²/2g, and everything above it is out of reach. +const jumpApex = () => jumpVelocity * jumpVelocity / (2 * riseGravity()); +// A jump's horizontal budget onto a deck `dy` above the takeoff: the whole +// rise, then the fall from the apex down to the deck's height, walked at +// walking speed. Scaled down hard — the bot is committing to a lip, and a +// landing at the very end of the arc is a landing it can miss by one frame. +const botAirCommit = .6; +function jumpReach(dy) { + const riseSeconds = jumpVelocity / riseGravity(); + const fallSeconds = Math.sqrt(2 * Math.max(0, jumpApex() - dy) / fallGravity()); + return walkSpeed * (riseSeconds + fallSeconds) * botAirCommit; +} +// Where the feet are. Level 0 is the arena floor; a rung answers by its level. +function botFooting(player) { + if (!player.grounded) return null; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (Math.abs(player.y - ledge.y) <= 3 && + player.x >= ledge.left && player.x <= ledge.right) return { ...ledge }; + return { level: 0, left: platformLeft, right: platformRight, y: floorY }; +} +// The screen. The whole screen, not the action-safe rect: a person watching +// a television reads the rung above out of the sky the HUD floats over. +const botViewport = () => + ({ left: stageLeft, right: stageRight, top: 0, bottom: viewHeight }); +function pointInView(view, x, y, z = 0) { + const point = projectPoint(x, y, z); + return Number.isFinite(point.x) && Number.isFinite(point.y) && + point.x >= view.left && point.x <= view.right && + point.y >= view.top && point.y <= view.bottom; +} +// A rung is in view when any of its lip is: both ends projected, the span +// clipped against the screen's sides, its height inside the screen's top and +// bottom. A deck half off the right edge still offers its visible half. +function rungInView(view, ledge) { + const a = projectPoint(ledge.left, ledge.y, 0); + const b = projectPoint(ledge.right, ledge.y, 0); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite)) return false; + const y = (a.y + b.y) / 2; + return y >= view.top && y <= view.bottom && + Math.max(a.x, b.x) >= view.left && Math.min(a.x, b.x) <= view.right; +} + +function botScene(player, opponent, now) { + const view = botViewport(); + const footing = botFooting(player); + const rungs = []; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (rungInView(view, ledge)) + rungs.push({ level: ledge.level, left: ledge.left, right: ledge.right, + y: ledge.y, dy: player.y - ledge.y }); + const scene = { + at: now, + view, + lens: { width: cameraDoll.width, x: cameraDoll.target.x, + y: cameraDoll.target.y }, + self: { x: player.x, y: player.y, vx: player.vx, vy: player.vy, + grounded: player.grounded, facing: player.facing, footing }, + floor: pointInView(view, clamp(player.x, platformLeft, platformRight), + floorY) ? { y: floorY, left: platformLeft, right: platformRight } : null, + rungs, + lava: survivalActive() && + pointInView(view, clamp(player.x, worldLeft, worldRight), survivalLavaY) + ? { y: survivalLavaY, below: survivalLavaY - player.y } : null, + opponent: null, + pickups: [], + }; + if (opponent && opponent.alive && opponent !== player && + pointInView(view, opponent.x, opponent.y - 90, opponent.z || 0)) { + const dx = opponent.x - player.x; + scene.opponent = { x: opponent.x, y: opponent.y, dx, dy: player.y - opponent.y, + distance: Math.abs(dx), facing: opponent.facing, + attacking: Boolean(opponent.attackKind) && now < opponent.attackUntil, + attackStartedAt: opponent.attackStartedAt }; + } + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + if (pickup.active && pointInView(view, pickup.x, pickup.y)) + scene.pickups.push({ kind: pickup.kind || "item", + x: pickup.x, y: pickup.y, dx: pickup.x - player.x }); + scene.options = botOptions(player, scene); + return scene; +} + +// The moves the scene affords from this footing. Every option names the deck +// it ends on, so a brain can pick by destination and then read off how to +// get there. In the air there is nothing to enumerate; the brain keeps the +// subgoal it left the ground with. +function botOptions(player, scene) { + const options = []; + const footing = scene.self.footing; + if (!footing) return options; + options.push({ kind: "walk", level: footing.level, y: footing.y, + left: footing.left, right: footing.right }); + const inset = survivalTune().landingInset; + const visible = new Set(scene.rungs.map(r=>r.level)); + const maxReach = jumpReach(0); + const nearby = queryBoxTree(platformBoxTree(), combatRect('jump-window', + footing.left-maxReach, footing.y-jumpApex(), footing.right+maxReach, footing.y)); + for (const box of nearby) { + const rung = box.ledge; + if (!visible.has(rung.level)) continue; + const dy = footing.y - rung.y; + if (dy <= 0 || dy > jumpApex()) continue; + const landLeft = rung.left + inset; + const landRight = rung.right - inset; + if (landRight < landLeft) continue; + const reach = jumpReach(dy); + // Where on this footing a jump can start and still come down on the + // landing band. An empty window is a deck the lens shows but the legs + // cannot have from here. + const takeoffLeft = Math.max(footing.left, landLeft - reach); + const takeoffRight = Math.min(footing.right, landRight + reach); + if (takeoffLeft > takeoffRight) continue; + const aim = clamp(player.x, landLeft, landRight); + options.push({ kind: "jump", level: rung.level, y: rung.y, dy, reach, + landLeft, landRight, takeoffLeft, takeoffRight, aim, + cost: Math.abs(aim - player.x) }); + } + if (footing.level > 0) { + // Sinking drops to whatever is under the feet — and only what is in + // frame counts, the same as a person deciding to fall. + let below = scene.floor ? { level: 0, y: floorY } : null; + for (const rung of scene.rungs) + if (rung.y > footing.y && player.x >= rung.left && + player.x <= rung.right && (!below || rung.y < below.y)) + below = { level: rung.level, y: rung.y }; + if (below) options.push({ kind: "sink", level: below.level, y: below.y, + dy: footing.y - below.y }); + } + return options; +} + +let platformTreeSource = null, platformTreeRevision = -1, platformTree = null; +function platformBoxTree() { + const ledges = activeLedges(); + if (platformTreeSource !== ledges || platformTreeRevision !== workshopRevision) { + platformTreeSource = ledges; platformTreeRevision = workshopRevision; + platformTree = buildBoxTree(ledges.map(ledge => combatRect('platform-'+ledge.level, + ledge.left,ledge.y,ledge.right,ledge.y+12,0,18,{ledge}))); + } + return platformTree; +} + +// The climb's subgoal: the highest deck one jump reaches from this footing, +// the nearest of them when two tie. On the ladder that is the deck above — +// two decks is 470 and the apex is 322 — but the choice is made from the +// scene, so a deck the lens has not shown yet is a deck the bot waits for. +function highestJump(options) { + let best = null; + for (const option of options) { + if (option.kind !== "jump") continue; + if (!best || option.y < best.y || + (option.y === best.y && option.cost < best.cost)) best = option; + } + return best; +} + +function botPad(player, opponent, now) { + if (selfPlay && typeof globalThis.__oskiewarJevPad === 'function') { + const scene = botScene(player, opponent, now); + scene.self.ducking = player.ducking; + scene.self.attackFrame = meleeFrame(player, now).frame; + scene.self.recoveryMs = Math.max(0, (player.attackUntil-now)/1000); + scene.self.combat = { + punch: Boolean(availableArm(player)), + kickLeft: hasPart(player, 'left-leg'), kickRight: hasPart(player, 'right-leg'), + item: Boolean(heldItem(player)), stunned: now < player.hitStunUntil, + headOnly: isHeadOnly(player), pogo: isPogo(player), + }; + if (scene.opponent) { + scene.opponent.grounded = opponent.grounded; + scene.opponent.vx = opponent.vx; scene.opponent.vy = opponent.vy; + scene.opponent.ducking = opponent.ducking; + scene.opponent.headOnly = isHeadOnly(opponent); + scene.opponent.pogo = isPogo(opponent); + scene.opponent.blocking = opponent.blocking; + scene.opponent.attackFrame = meleeFrame(opponent, now).frame; + scene.opponent.recoveryMs = Math.max(0, (opponent.attackUntil-now)/1000); + // The parent calls this only when preparing a model request, not every + // simulation tick. Probes read clones and never advance the live fight. + scene.strikeOptions = () => jevStrikeOptions(player, opponent, + runtime().simMonotonicUs || runtime().monotonicUs); + } + const down = globalThis.__oskiewarJevPad(player.pad, { ...scene, + round: matchName, alive: player.alive && opponent.alive }); + return { connected: true, down: Array.isArray(down) ? down.filter(button => + ['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','A','B','X','Y'].includes(button)) : [], leftX: 0, leftY: 0 }; + } + if (!player.bot) { + player.botPresses = {}; + return { connected: true, down: [], leftX: 0, leftY: 0 }; + } + // Downed, or standing over a downed opponent, the bot opens nothing new — + // but presses already out still run their length instead of vanishing + // mid-hold, which would read as a poke. + if (!player.alive || !opponent.alive) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + + // A scored bot plays its sheet instead of thinking: rows of {at, button, + // hold} in µs from round start, through the same botPress door so holds + // and releases stay human-shaped. An empty score is a dummy that stands + // there and takes it — which is exactly what a sync lab needs on the + // receiving end. Scores arrive via globalThis.__oskiewarBotScores at round + // start; no score, and the brain below plays as always. + if (player.botScore) { + const at = now - roundStartedAt; + while (player.botScoreAt < player.botScore.length && + player.botScore[player.botScoreAt].at <= at) { + const row = player.botScore[player.botScoreAt]; + if (botPress(player, row.button, row.hold ?? botHoldUs.strike, now)) + player.botScoreAt += 1; + else break; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + + // The frame, and the opponent only as the frame shows them. The fight + // camera holds both fighters, so an opponent out of view is the rare case — + // but when it happens the bot has nothing to chase and opens nothing new. + const scene = botScene(player, opponent, now); + player.botScene = scene; + player.botGoal = "opponent"; + const seen = scene.opponent; + if (!seen) { + player.botSubgoal = null; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + const dx = seen.dx; + const distance = seen.distance; + const toward = Math.sign(dx) || player.facing || -1; + const opponentThreatening = seen.attacking && distance < 245 && + seen.facing === -toward; + const striking = botHeld(player, "A", now) || botHeld(player, "X", now); + + // A guard that answers every swing the frame it starts turns the round into + // punch-into-shield until the clock dies — the signal census reads punch×6, + // shield×6 per five seconds and nothing else. So the guard is human now: + // each incoming swing is noticed once, answered late, and sometimes not at + // all. The lapse is what lets damage through, and damage is what ends + // rounds. + if (opponentThreatening) { + if (player.botThreatSeen !== seen.attackStartedAt) { + player.botThreatSeen = seen.attackStartedAt; + const roll = botRoll(player); + player.botShieldAt = roll < 0.55 + ? now + 70000 + Math.round(roll * 250000) : Infinity; + } + } else player.botShieldAt = Infinity; + + // A shield that just ate a swing bought a stun. Swing into it now — the + // neutral-game cooldown would let the opening close unanswered. + if (player.shieldBrokenAt && + player.shieldBrokenAt !== player.botPunishedAt && + now - player.shieldBrokenAt < 80000) { + player.botPunishedAt = player.shieldBrokenAt; + player.botAttackAt = now; + } + + if (opponentThreatening && !striking && now >= player.botShieldAt) + botPress(player, "X", botHoldUs.shield, now); + else { + // The old spacing was tuned for a bigger fighter: stop walking at 155, + // swing at 225. A punch capsule tops out near 130 of separation and a + // kick near 170, so that band was whiff purgatory — the census read + // punch after punch with no body hit until the clock died. Close to + // where a swing actually lands, and swing only from there — and only on + // the ground: steering mid-air wedged the bot against a platform lip it + // used to clear. + if (player.grounded && distance > 95) + botPress(player, toward > 0 ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + // Items are ranged, so the bot spends them while closing rather than + // trading one for a swing it could land anyway. The grenade needs its arc. + const item = heldItem(player); + if (item && now >= player.botItemAt && + distance >= (item === "GUN" ? 320 : 1200) && + botPress(player, "Y", botHoldUs.item, now)) + player.botItemAt = now + 600000; + if (distance < 165 && now >= player.botAttackAt && + botPress(player, player.botAttackSequence % 2 ? "A" : "B", + botHoldUs.strike, now)) { + player.botAttackSequence += 1; + player.botAttackAt = now + 330000 + (player.botAttackSequence % 3) * 70000; + } + } + + // Up and down are read off the scene's options. An opponent a storey up + // is reached by the jump that lands on their deck when the frame offers + // one, and by a plain jump at them when it does not — the cube has no + // rungs, and there the old leap is the only vertical move there is. + const climb = seen.dy > 180 + ? scene.options.find((option) => option.kind === "jump" && + Math.abs(option.y - seen.y) <= 3) || null + : null; + player.botSubgoal = climb; + if (climb && Math.abs(climb.aim - player.x) > 24) + botPress(player, climb.aim > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + const canLeap = climb + ? player.x >= climb.takeoffLeft && player.x <= climb.takeoffRight + : seen.dy > 180; + if (player.grounded && canLeap && now >= player.botJumpAt && + botPress(player, "ArrowUp", botHoldUs.jump, now)) + player.botJumpAt = now + 1250000; + // Knocked up onto a deck the bot would camp out of reach, so it plays the + // same double-tap-down a player would: two real presses with a real + // release between them — and only through a deck the frame shows a floor + // under. + const sink = scene.options.find((option) => option.kind === "sink"); + if (sink && player.grounded && player.standingOn < 0 && + seen.dy < -200 && now >= player.botSinkAt) { + player.botSinkAt = now + 900000; + player.botSinkTaps = 2; + player.botSinkNextAt = now; + } + if (player.botSinkTaps > 0 && now >= player.botSinkNextAt && + botPress(player, "ArrowDown", botHoldUs.sinkTap, now)) { + player.botSinkTaps -= 1; + player.botSinkNextAt = now + botHoldUs.sinkTap + botRestUs; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The climb bot's four numbers, gathered so they can be priced instead of +// guessed. `survival-lab.mjs` runs the ladder headlessly and sweeps one of +// these at a time; the defaults are exactly what the bot shipped with, and +// ordinary play never sets the override, so a human's attract-mode climb is +// unchanged by the seam existing. +const survivalTuneDefaults = { + landingInset: 72, // how far inside a deck's edge still counts as footing + walkThreshold: 24, // closer than this and walking is only jitter + // How far off the aim point the runner may still commit to a jump. This was + // 34, and 34 is why no reel ever summited: decks 5 and 6 do not overlap + // horizontally, so `dx` there never falls below 92 and the bot stood on the + // lip jumping straight up until the lava took it. Committing while the walk + // is still carrying it is what crosses a gap. Measured by `survival-lab.mjs`: + // ≤100 dies on deck 5, ≥110 summits all 32, and it still summits at 420 — + // 160 sits well inside that shelf rather than on its edge. + jumpThreshold: 160, + jumpCooldownUs: 580000, // the floor under one jump per deck + jumpHoldUs: botHoldUs.jump, // held past apex, or `jumpCutScale` clips the rise + // Per-reel variation. The ladder is fixed, the bot is fixed, and under the + // oven's fixed-step clock the round clock the bot's dice seed from is fixed + // too — so every slot rendered a frame-identical climb, and three reels + // shipped the same run. The oven passes a seed; it is folded into the + // fighter's dice once, which moves the aim from deck to deck while leaving + // any single seed exactly reproducible. Zero means no variation, which is + // what ordinary play uses, so a human's attract-mode climb is untouched. + seed: 0, + // Share of the landing band the aim may wander. Bought with `survival-lab`: + // .15 and .3 both summit 4/4, .45 and .6 drop to 3/4 because a hard bias + // toward a deck's edge can leave the next jump unmakeable. .3 is the most + // visible variation that still costs nothing. + aimJitter: .3, +}; +function survivalTune() { + const override = globalThis.__oskiewarSurvivalTune; + if (!override) return survivalTuneDefaults; + return { ...survivalTuneDefaults, ...override }; +} + +function survivalBotPad(player, now) { + if (!player.bot || !player.alive) + return { connected: true, down: [], leftX: 0, leftY: 0 }; + const tune = survivalTune(); + // Folded in once per run, before the first aim is taken. + if (tune.seed && player.survivalSeed !== tune.seed) { + player.survivalSeed = tune.seed; + player.botRngState = + (player.botRngState ^ Math.imul(tune.seed, 0x9e3779b9)) >>> 0; + } + // The frame, every tick. The goal is the summit; the subgoal is the deck + // this frame offers a jump onto. On the ground that is re-chosen from the + // scene each tick — in the air the runner holds the deck it left for. + const scene = botScene(player, null, now); + player.botScene = scene; + player.botGoal = "summit"; + const footing = scene.self.footing; + if (footing) { + const next = highestJump(scene.options); + if (next && next.level !== player.survivalTargetLevel) { + player.survivalTargetLevel = next.level; + // One roll per deck, not per tick: the runner should commit to a line + // and hold it, and rolling every frame would average the wander back + // to zero. + player.survivalAimBias = tune.seed ? botRoll(player) - .5 : 0; + } + player.botSubgoal = next; + if (!next) { + // Nothing above in frame. Stand where a deck cannot end under you — + // the lens is catching up, and the next rung arrives in it. + const middle = (footing.left + footing.right) / 2; + if (Math.abs(middle - player.x) > tune.walkThreshold) + botPress(player, middle > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + } + const target = player.botSubgoal; + if (!target) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + // Aim for the nearest safe point on the landing band, not the deck's + // center: a centered aim walked the bot to the lip of an overlapping pair + // and waited forever when the remaining seven units were smaller than its + // jump threshold. The seeded wander moves the aim along the band. + const aim = clamp(clamp(player.x, target.landLeft, target.landRight) + + (player.survivalAimBias || 0) * (target.landRight - target.landLeft) * + tune.aimJitter, target.landLeft, target.landRight); + const dx = aim - player.x; + if (Math.abs(dx) > tune.walkThreshold) + botPress(player, dx > 0 ? "ArrowRight" : "ArrowLeft", botHoldUs.walk, now); + // Commit inside the option's own budget or the tuned threshold, whichever + // is tighter — the threshold was priced by `survival-lab.mjs`, and the + // budget keeps a lab sweep from asking for a jump the legs cannot land. + if (player.grounded && Math.abs(dx) <= Math.min(tune.jumpThreshold, target.reach) && + player.x >= target.takeoffLeft && player.x <= target.takeoffRight && + now >= player.botJumpAt && + botPress(player, "ArrowUp", tune.jumpHoldUs, now)) + player.botJumpAt = now + tune.jumpCooldownUs; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The replay oven needs a bounded completion record, not a production replay. +// Its injected fetch keeps this envelope inside the local shell; ordinary +// survival never records, publishes, or analyzes a run. Keeping the seam +// explicit prevents a `?replay-oven` URL typed in a normal browser from +// turning an anonymous climb into stored match data. +function captureSurvivalRun(now, result) { + if (globalThis.__oskiewarCaptureSurvival !== true || + typeof saveReplay !== "function") return; + const tickUs = 1000000 / 60; + const durationTicks = Math.max(1, + Math.round((now - survivalStartedAt) / tickUs)); + // The clock this is built from is fixed under an offline fixed-step pass, so + // without the seed every reel in a day filed the same name — and that name + // becomes the reel's Instagram `audio_name` (`audioNameFor`), which is only + // honoured on the post that mints it. Live climbs pass no seed and keep the + // original name. + const runSeed = survivalTune().seed >>> 0; + const roundName = "survival-v" + buildVersion + "-" + + Math.max(0, Math.round(survivalStartedAt / tickUs)) + + (runSeed ? "-" + runSeed.toString(36) : ""); + const runner = players[0]; + const height = Math.round(survivalHeight); + const demo = { + format: "ac.oskiewar.survival", version: 1, game: "oskiewar", + simulation: "oskiewar-survival-1", tickRate: 60, + matchId: "ow-" + roundName, matchName: roundName, + roundId: "ow-" + roundName, roundName, roundIndex: 0, + startedAt: runtime().unixMs - Math.round(durationTicks / 60 * 1000), + durationTicks, fighters: [runner.name], nations: [runner.nation || ""], + winner: result === "SUMMIT" ? runner.name : null, + finalRoundWins: [result === "SUMMIT" ? 1 : 0], + cause: result, height, + commands: [], checkpoints: [], impacts: [], + events: [[0, "climb", 0, 1, 0], + [durationTicks, "survival-end", 0, height, + result === "SUMMIT" ? 1 : 0]], + }; + const upload = saveReplay(JSON.stringify(demo)); + if (upload && typeof upload.catch === "function") + upload.catch((error) => telemetry("SURVIVAL_CAPTURE", + "local-error " + error.message)); +} + +function finishSurvival(now, result) { + if (roundResult) return; + const runner = players[0]; + survivalBestHeight = Math.max(survivalBestHeight, survivalHeight); + roundResult = result; + roundCause = result; + roundOverAt = now; + runner.vx = 0; + runner.vy = 0; + if (result === "LAVA") { + runner.alive = false; + runner.stance = "HIT"; + spawnImpact({ x: runner.x, y: survivalLavaY, z: runner.z, + life: 1.2, duration: 1.2, death: true, explosion: true, + blastRadius: 240, power: .8 }); + playDrum("kick", 1.25, panPlayer(runner)); + playSine(92, .45); + } else { + playDrum("clap", 1.2, 0); + playSine(880, .3); + } + globalThis.__oskiewarResultLine = result === "SUMMIT" + ? "summit!" : Math.round(survivalHeight) + " high"; + emitSignal("survival-end", 0, Math.round(survivalHeight), + result === "SUMMIT" ? 1 : 0); + captureSurvivalRun(now, result); +} + +function updateSurvival(dt, now) { + const runner = players[0]; + const height = Math.max(0, floorY - runner.y); + survivalHeight = Math.max(survivalHeight, height); + runner.score = Math.round(survivalHeight); + while (survivalPeakLevel < platforms.length && + runner.y <= platforms[survivalPeakLevel].y + 2) + survivalPeakLevel++; + const lavaSpeed = survivalLavaBaseSpeed + + Math.min(76, survivalHeight * .008); + survivalLavaY -= lavaSpeed * dt; + const body = runnerBounds(runner, (now - startedAt) / 1000000); + if (body.bottom >= survivalLavaY) finishSurvival(now, "LAVA"); + else if (survivalPeakLevel >= platforms.length && runner.grounded) + finishSurvival(now, "SUMMIT"); +} + +function drawAirDropSky(t) { + const shift = ((cameraCenterY * .14) % viewHeight + viewHeight) % viewHeight; + const ink = mixColor([65,115,155], [230,248,255], visualTheme.light); + for (let i = 0; i < 14; i++) { + const x = ((i * 197 + 53) % 997) / 997 * viewWidth(); + const y = ((i * 113) % viewHeight - shift + viewHeight) % viewHeight; + screenRect(x, y, 2 + i % 2, 16 + i % 4 * 9, ink); + } +} + +function gameSim() { + captureRenderInterpolationState(); + syncGameView(); + const now = runtime().monotonicUs; + const dt = Math.min(0.04, Math.max(0.001, (now - lastSimAt) / 1000000)); + lastSimAt = now; + // Whether a door is in the way is state, not decoration: the same answer + // gates the fight, the claim and the wire, so it is settled once on the tick + // rather than re-asked by each of them mid-paint. + updateAccountDoor(); + if (resimPending) { + startResim(resimPending, now); + resimPending = null; + } else if (resimActive) { + // Demo ticks count every sim step from the reset, intro included — the + // drift meter has to count in the same currency. + resimTick++; + advanceResimCommands(); + } + if (roundViewer && !netSession) { + // The chair-holder's hands are local even when the fight is not. The + // control legend, the M30 manual page and the touch discs all light off + // inputPads[0], and the debug toggle wants a View edge — none of that + // may wait on the host's echo, so the local pad is sampled here exactly + // as it would be in a hosted fight. + padSnapshots[0] = samplePad(0); + inputPads[0] = padSnapshots[0]; + const down = padSnapshots[0]?.down || []; + if (down.includes("View") && !viewerSystemPrevious.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + viewerSystemPrevious = down.slice(); + updateRoundViewer(now, dt); + // A visitor who holds the second chair plays through this screen: their + // pad goes up the wire every tick it changes, and a room found hostless + // becomes theirs to host. + sendChallengerInput(now); + netChallengerHello(now); + updateVersusClaim(now); + return; + } + padSnapshots[0] = samplePad(0); + padSnapshots[1] = samplePad(1); + padSnapshots[2] = samplePad(2); + inputPads[0] = padSnapshots[0]; + inputPads[1] = padSnapshots[1]; + if (updateLocalVersus(now)) { + consumeSystemButtons(now); + return; + } + const cameraPads = localVersusActive() ? padSnapshots : [padSnapshots[0]]; + const cameraX = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightX) || 0), 0), -1, 1); + const cameraY = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightY) || 0), 0), -1, 1); + if (Math.abs(cameraX) > .08) + playerCameraYaw = clamp(playerCameraYaw + cameraX * dt * 1.15, -.62, .62); + if (Math.abs(cameraY) > .08) + playerCameraPitch = clamp(playerCameraPitch + cameraY * dt * .72, -.24, .28); + // Triggers zoom, but only on a pad whose triggers are analog -- on anything + // else the shell is still aliasing them to A and X, and stealing those two + // buttons would cost a small pad its item and shield. + // Either couch seat can steer the shared camera. Digital M30 shoulders + // remain combat buttons, even beside a controller with analog triggers. + const push = clamp(cameraPads.reduce((sum, pad) => sum + (pad?.analogTriggers + ? (Number(pad.leftTrigger) || 0) - (Number(pad.rightTrigger) || 0) : 0), 0), -1, 1); + if (Math.abs(push) > .08) + playerCameraZoom = clamp(playerCameraZoom + push * dt * .9, .55, 1.9); + // A mouse or a finger on the shell's canvas orbits the same lens the + // right stick does: a drag turns yaw and pitch, the wheel or a pinch + // dollies. The shell banks the gesture between ticks and this drains it, + // so a fast flick is not lost to a slow frame. + const orbit = globalThis.__oskiewarTouch?.orbit; + if (orbit) { + if (orbit.yaw) + playerCameraYaw = clamp(playerCameraYaw + orbit.yaw, -.62, .62); + if (orbit.pitch) + playerCameraPitch = clamp(playerCameraPitch + orbit.pitch, -.24, .28); + if (orbit.zoom) + playerCameraZoom = clamp(playerCameraZoom * Math.exp(orbit.zoom), .55, 1.9); + orbit.yaw = orbit.pitch = orbit.zoom = 0; + } + // A tap anywhere on the wordmark screen is a start press — read before + // the tap queue is wiped for the tick. The shell already turns first-visit + // taps into a button; this catches every visit after that. + const titleTapped = shellMode === "MENU" && !selecting && + (globalThis.__oskiewarTouch?.taps?.length || 0) > 0; + if (!selecting && Array.isArray(globalThis.__oskiewarTouch?.taps)) + globalThis.__oskiewarTouch.taps.length = 0; + if (consumeSystemButtons(now)) { + if (netSession) netLeave("system-button"); + return; + } + // The wordmark screen is a live training round, so the shell reads start + // and then falls straight through into the fight it is sitting on top of. + if (shellMode === "MENU") updateShell(now, titleTapped); + else updateMatchPace(now); + // The versus seat watches from the title on — a friend can take the chair + // while the host is still reading the wordmark, and the fight lifts it. + updateVersusSeat(now); + updateLobbyMortality(now); + if (survivalActive() && shellMode === "MENU") { + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + for (const player of players) + inputPads[player.pad] = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]) + : resimActive && resimCommands + ? resimPad(player.pad) + : player.remote ? remotePadSnapshot() + : player.bot && shellMode === "GAME" + ? survivalActive() && player.pad === 0 + ? survivalBotPad(player, now) + : botPad(player, players[player.pad ? 0 : 1], now) + : player.npc ? { connected: true, down: [], leftX: 0, leftY: 0 } + : padSnapshots[player.pad]; + // Start belongs to the shell, including its hold and transition frames. + // The first neutral sample releases gameplay for the next fresh press. + if (!players[0].bot && !players[0].remote && !netFrameInputs && !resimActive) { + const pad = inputPads[0]; + if (shellMode === "MENU" || startInputPending) { + startInputPending = shellMode === "MENU" || pad.down.length > 0 || + Math.abs(pad.leftX || 0) > .08 || Math.abs(pad.leftY || 0) > .08; + inputPads[0] = { ...pad, down: [], leftX: 0, leftY: 0 }; + } + } + if (debugHitboxes && now >= nextInputDebugAt) { + nextInputDebugAt = now + 500000; + const values = players.map((player) => { + const pad = inputPads[player.pad]; + const input = quantizedInput(pad, player.suppressedDirections); + return "P" + (player.pad + 1) + " down=" + + (pad.down.join("+") || "NONE") + " stick=" + + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + " q=" + + input.horizontal + "," + input.vertical + " vx=" + + Math.round(player.vx); + }); + telemetry("FIGHT_INPUT", values.join(" | ")); + } + recordReplayCommands(now, inputPads); + // Session first: the hand-off frame must leave before the round's first + // frame walks the native shell's one socket over to the round room. + publishSession(now); + publishSpectator(now); + publishVersus(now); + if (survivalActive() && roundResult) { + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + if (now - roundOverAt >= roundResultUs) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSurvivalRun(now, true); + else returnToTitle(now, "survival-end"); + } + return; + } + if (roundResult) { + // The scored tail. The killcam dwell used to be the reel's quietest + // seconds under its most dramatic frames, so the dwell keeps a slow + // heartbeat and the result card lands with a sting of its own. Voice on + // the drum channel, record on unrouted signal names, as everywhere. + if (!resultPulseAt) resultPulseAt = roundOverAt + 900000; + if (now >= resultPulseAt) { + resultPulseAt = now + 1050000; + playDrum("kick", .3, 0); + emitSignal("result-pulse", -1, 0, 0); + } + if (!resultCardStung && now - roundOverAt >= 1100000) { + resultCardStung = true; + playDrum("bell", .95, 0); + // The card's own line rides a global for whichever shell can speak: + // the web shell reads it back through speech synthesis on this same + // signal. Signals carry numbers, and the sentence is presentation. + // The anonymous seat wears a blank nameplate, and a blank name read + // aloud is a stumble — but only the local first seat can be nameless, + // so a nameless winner is always "you". + const card = resultCardText(); + const spokenWinner = card.winner.replace(/^@/, ""); + globalThis.__oskiewarResultLine = roundResult === "TIE" ? "tie!" + : (spokenWinner ? spokenWinner + " wins the " : "you win the ") + + (matchOver ? "match" : "round"); + emitSignal("result-card", -1, roundResult === "TIE" ? 0 : 1, 0); + // The winner gets the last word: a staccato synthesized laugh rides + // out of the bell. A tie amuses nobody. + if (roundResult !== "TIE") { + resultLaughAt = now + 420000; + resultLaughStep = 0; + // The mouth opens on the sting and the laugh lands in it — the same + // open-ring LAUGH face the A+B chord earns, dealt automatically to + // the winner unless they have already chosen their own gloat. + const winner = roundWinner(); + if (winner?.alive && !winner.resultReaction) { + winner.resultReaction = "LAUGH"; + winner.resultReactionAt = now; + } + } + } + if (resultLaughAt && resultLaughStep < 5 && now >= resultLaughAt) { + playSine([760, 640, 700, 580, 500][resultLaughStep], .09); + playDrum("hat", .16, 0); + if (resultLaughStep === 0) emitSignal("victory-laugh", -1, 1, 0); + resultLaughAt = now + 112000 + resultLaughStep * 24000; + resultLaughStep++; + } + if (INSTANT_REPLAY && instantReplay) { + updateInstantReplay(now, dt); + return; + } + if (INSTANT_REPLAY) { + const replayDown = padSnapshots[0]?.down || []; + if (replayDown.includes("Y") && !replayOfferPrevious.includes("Y") && + startInstantReplay(now)) return; + replayOfferPrevious = replayDown.slice(); + } + const cinematicWinner = deathCinematic + ? players[deathCinematic.winnerPad] : null; + if (cinematicWinner?.alive) updatePlayer(cinematicWinner, + { connected: true, down: [], leftX: 0, leftY: 0 }, dt, now); + // Severed pieces belong to the action too; the result clock must not pin + // them in mid-air while the surviving body completes its landing. + updateBullets(dt, now, false); + updateGrenades(dt, now, false); + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + const resultDuration = matchOver ? matchResultUs : roundResultUs; + if (now - roundOverAt >= resultDuration) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSelfPlay(now); + // A versus result rolls straight into the next round while the rival's + // wire stays warm — the room, not the title, is home base. A finished + // match deals fresh, a finished round keeps the tally. + else if (versusActive() && versusChallengerFresh()) + startVersusFight(now, matchOver); + else if (versusActive()) beginVersusLobby(now); + else if (localVersusActive()) { + if (matchOver) startLocalVersus(now); + else resetRound(now, false); + } + else returnToTitle(now, "round-end"); + } + return; + } + if (PAL_SELECT && selecting) { + updateSelect(now); + return; + } + if (now - roundStartedAt < roundIntroDurationUs()) { + // The intro used to pass in silence — a reel that opens on the countdown + // opened on three mute seconds, and a player heard the round begin with + // nothing. Ring the "3, 2, 1" on the same two channels the round clock + // uses: the drum for the ear, the signal for the record. + const introSecond = Math.ceil( + (roundIntroDurationUs() - (now - roundStartedAt)) / 1000000); + if (introSecond !== lastIntroSecond) { + lastIntroSecond = introSecond; + // playDrum is the voice, the signal is the record — the "countdown" + // name is deliberately not in the sfx routes, or the web would voice + // every bell twice. value2 marks these as the intro's. + playDrum("bell", .72 + (3 - introSecond) * .12, 0); + emitSignal("countdown", -1, introSecond, 1); + } + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + if (lastIntroSecond > 0) { + // The first live tick after the intro is the mode opening — one accent, + // so the callout is a sound and not just a vanished word. + lastIntroSecond = -1; + playDrum("block", 1.1, 0); + if (survivalActive()) { + globalThis.__oskiewarStartLine = "climb!"; + emitSignal("climb", 0, 1, 0); + } else emitSignal("fighters-lock", -1, 0, 0); + } + roundElapsedUs += dt * 1000000; + const timedRound = roundIsTimed(); + if (timedRound) { + const countdownSecond = Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + if (countdownSecond > 0 && countdownSecond <= 10 && + countdownSecond !== lastCountdownSecond) { + lastCountdownSecond = countdownSecond; + playDrum("bell", 1 + (10 - countdownSecond) * .025, 0); + emitSignal("countdown", -1, countdownSecond, 0); + } + } + if (survivalActive()) { + updatePlayer(players[0], inputPads[0], dt, now); + updateSurvival(dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + } else { + updateWind(dt, now); + for (const player of players) updatePlayer(player, inputPads[player.pad], dt, now); + updateSkateRopes(dt); + resolvePlayerStanding(now); + resolvePlayerPushboxes(); + updateFallingPickups(dt, now); + updatePowerups(now); + updateBodyTrees(dt, now); + updateBullets(dt, now); + updateGrenades(dt, now); + resolveMelee(now); + resolvePogoAttacks(now); + updateLobbyMortality(now); + // After the exchange resolves, so a frame that landed a hit reads as the + // recovery it has become rather than as the active frame it was. + recordFrameMeter(now); + for (const item of balls) updateBall(item, dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + captureRoundReplay(now); + recordReplayCheckpoint(now); + trackResimDrift(now); + } + for (const impact of impacts) { + if (!impact.debris) { + // A fresh impact heats the tile it landed in. The debris check is the + // once-per-impact gate — the first sim tick is the only tick an impact + // exists without motes — so a hit stamps its cell exactly once, and + // the overlay on the back wall shows the fight's last half-second as + // cooling squares. + if (onGridField(impact.x, impact.y)) { + const cell = gridFieldIndex(impact.x, impact.y); + gridField[cell] = Math.min(1, gridField[cell] + + (impact.explosion ? 1 : impact.death ? .9 : .55)); + } + const count = impact.explosion ? 24 : impact.death ? 10 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.explosion + ? 1180 + (impact.power || 0) * 720 + : impact.death ? 660 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 260, + vz: Math.sin(angle * 1.7) * force * .22, + radius: impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; + mote.y += mote.vy * dt; + mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; + mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); + // The tile field cools between stamps — a fixed exponential against the + // fixed 60 Hz step, so a replayed round heats and fades identically. Cells + // snap to zero below a hundredth so a quiet map is exactly zeros. + for (let cell = 0; cell < gridField.length; cell++) + gridField[cell] = gridField[cell] < .01 ? 0 + : gridField[cell] * Math.exp(-dt * 1.6); + if (!survivalActive() && !lobbyActive() && + ((freeForAll() ? players.filter((player) => player.alive).length <= 1 + : players.some((player) => !player.alive)) || + (timedRound && roundElapsedUs >= roundDurationUs))) { + if (timedRound && roundElapsedUs >= roundDurationUs && + players.every((player) => player.alive)) + roundCause = "TIME"; + finishRound(now); + } +} + +function updateResultImpactDebris(dt) { + for (const impact of impacts) { + if (!impact.debris) { + const count = impact.death ? 20 : impact.explosion ? 24 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.death ? 920 : impact.explosion ? 1180 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 360, + vz: Math.sin(angle * 1.7) * force * .28, + radius: impact.death ? 7 : impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; mote.y += mote.vy * dt; mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); +} + +function circle(x, y, radius, width, color) { + let lastX = x + radius; + let lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + line(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; + lastY = nextY; + } +} + +// Discs are the piece's bulk geometry — every capsule end, every joint. The +// unit ring is constant, so the trig runs once at load, and fanning from a rim +// vertex covers the identical decagon in 8 faces instead of 10 from the center +// (cull is off, depth is flat, colors are flat — the rasterized pixels match). +// A silhouette only has to be as fine as its size on screen. A limb cap a few +// pixels across reads round at six sides; a head at ninety does not, and used +// to show its corners. Rings are precomputed per step so no trig runs inside a +// frame, and the small end is cheaper than the one fixed ring it replaces. +const discRings = [6, 8, 12, 16, 24, 32].map((sides) => { + const ring = []; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + ring.push(Math.cos(a), Math.sin(a)); + } + return ring; +}); +const discRingFor = (radius) => discRings[ + radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 + : radius < 52 ? 3 : radius < 110 ? 4 : 5]; + +function filledDisc(x, y, radius, color) { + const [r, g, b] = color; + if (typeof disc3d === "function" && disc3d(x, y, triangleDepth, radius, r, g, b)) return; + const ring = discRingFor(radius); + const originX = x + ring[0] * radius, originY = y + ring[1] * radius; + let lastX = x + ring[2] * radius, lastY = y + ring[3] * radius; + for (let side = 4; side < ring.length; side += 2) { + const nextX = x + ring[side] * radius; + const nextY = y + ring[side + 1] * radius; + screenTriangle(originX, originY, lastX, lastY, nextX, nextY, r, g, b); + lastX = nextX; + lastY = nextY; + } +} + +function filledRing(x, y, outerRadius, innerRadius, color) { + const [r, g, b] = color; + const sides = 14; + const inner = Math.max(0, Math.min(outerRadius, innerRadius)); + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + const outerA = { x: x + Math.cos(a) * outerRadius, + y: y + Math.sin(a) * outerRadius }; + const outerB = { x: x + Math.cos(b) * outerRadius, + y: y + Math.sin(b) * outerRadius }; + const innerA = { x: x + Math.cos(a) * inner, + y: y + Math.sin(a) * inner }; + const innerB = { x: x + Math.cos(b) * inner, + y: y + Math.sin(b) * inner }; + screenTriangle(outerA.x, outerA.y, innerA.x, innerA.y, + outerB.x, outerB.y, r, g, b); + screenTriangle(innerA.x, innerA.y, innerB.x, innerB.y, + outerB.x, outerB.y, r, g, b); + } +} + +function filledCapsule(x1, y1, x2, y2, width, color) { + const [r, g, b] = color; + const dx = x2 - x1; + const dy = y2 - y1; + const length = Math.hypot(dx, dy); + const radius = width / 2; + if (length < .001) { + filledDisc(x1, y1, radius, color); + return; + } + const nx = -dy / length * radius; + const ny = dx / length * radius; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + filledDisc(x1, y1, radius, color); + filledDisc(x2, y2, radius, color); +} + +// Xbox batches GPU triangles above its D2D line layer, so every bone and joint +// must share this triangle path. The wider silhouette pass and color pass form +// conventional rounded capsules without the native renderer reordering them. +function damagedPartColor(color, player, part) { + const damage = Number(player?.partDamage?.[part] || 0); + if (!damage) return color; + const durability = part === "torso" ? 3 : 2; + const amount = clamp(damage / durability * .92, 0, .92); + return mixColor(color, [244, 34, 50], amount); +} + +function generatedAppearance(player) { + const selected = globalThis.__oskiewarFighterAppearance; + if (!selected || Date.now() >= selected.validUntil || player?.pad !== 0 || player.npc || + netSession || roundViewer || versusLane() || survivalActive() || shellMode !== "GAME") return null; + return selected.appearance; +} +function generatedPartColor(appearance, segment) { + const role = segment.role || ""; + if (/foot/.test(role)) return appearance.shoes; + if (/thigh|shin|leg/.test(role)) return appearance.pants; + if (/forearm|hand/.test(role) && appearance.sleeves === "short") return appearance.skin; + return appearance.shirt; +} + +// Retained photographic materials use the same projected poses and collision +// surfaces as the vector theme. Assets are uploaded by the native host once. +let photoThemeActive = false; +let photoEffectsActive = false, photoWeaponsActive = false; +function roundGraphicsTheme() { + const requested = globalThis.__oskiewarGraphicsTheme; + if (requested === "flat" || requested === "photorealistic") return requested; + // Both peers already agree on map rotation; rendering needs no new wire state. + const round = Math.max(0, roundMapIds.indexOf(currentMapId)); + return Math.floor(round / 5) % 2 ? "flat" : "photorealistic"; +} +function refreshPhotoTheme() { + photoThemeActive = roundGraphicsTheme() === "photorealistic" && + typeof themeReady === "function" && typeof themeSprite === "function" && themeReady(); + photoEffectsActive = photoThemeActive && typeof themeAssetReady === "function" && themeAssetReady(2); + photoWeaponsActive = photoThemeActive && typeof themeAssetReady === "function" && themeAssetReady(3); +} +const photoExplosionFrames = [[24,64,400,400],[462,53,400,400], + [908,34,400,400],[1352,37,400,400],[37,458,400,400], + [472,453,400,400],[917,470,400,400],[1368,484,400,400]]; +const photoWeaponRegions = { grenade:[160,82,330,520], + launcher:[629,218,610,270], smg:[8,780,624,320], flash:[640,760,606,370] }; +function photoEffectSprite(asset, region, x, y, width, height, + angle = 0, flip = false, depth = triangleDepth, depthWrite = true) { + if (!(asset === 2 ? photoEffectsActive : photoWeaponsActive) || + ![x,y,width,height,angle,depth].every(Number.isFinite) || + width <= 0 || height <= 0 || width > 30000 || height > 30000 || + Math.abs(x) > 30000 || Math.abs(y) > 30000) return false; + return themeSprite(asset,...region,x,y,width,height,angle,flip, + clamp(depth,-1.49,1.49),depthWrite) !== false; +} +function photoExplosionFrame(age) { + return photoExplosionFrames[Math.min(7,Math.floor(clamp(age,0,1)*8))]; +} +function drawPhotoExplosion(x,y,radius,age,depth=triangleDepth) { + if (!photoEffectsActive || !Number.isFinite(age) || !Number.isFinite(radius)) return false; + const diameter = Math.min(1800,Math.max(12,radius*2.25)); + if (x+diameter/2<0 || y+diameter/2<0 || x-diameter/2>viewWidth() || y-diameter/2>viewHeight) return true; + return photoEffectSprite(2,photoExplosionFrame(age),x,y,diameter,diameter,0,false,depth,false); +} +// The caller owns the single readable WIN/LOSE/TIE word and all controls. +function drawPhotoRoundOutcome(result,age,x,y,width,height) { + refreshPhotoTheme(); + if (!photoEffectsActive || ![age,x,y,width,height].every(Number.isFinite) || width<=0 || height<=0) return false; + const win = String(result).toUpperCase()==="WIN"; + const phase = ((Math.max(0,age)%2.4)/2.4); + const frame = win ? phase : .55+phase*.45; + const size = Math.min(viewHeight*.46,Math.max(height*1.5,180)); + for (const side of [-1,1]) { + const cx = clamp(x+width/2+side*width*.46,size*.42,viewWidth()-size*.42); + photoEffectSprite(2,photoExplosionFrame(frame),cx,y+height*.48, + size,size,side*.22,side<0,-1.465,false); + } + return true; +} +function drawPhotoHeldWeapon(mode,hand,barrel,flip,depth) { + if (!photoWeaponsActive || !["RUBBER SMG","ROCKET LAUNCHER"].includes(mode)) return false; + const region = photoWeaponRegions[mode === "ROCKET LAUNCHER" ? "launcher" : "smg"]; + const dx=barrel.x-hand.x,dy=barrel.y-hand.y; + const angle=Math.atan2(dy,dx)-(flip?Math.PI:0),c=Math.cos(angle),s=Math.sin(angle); + const width=Math.max(24,Math.hypot(dx,dy)/.58),height=width*region[3]/region[2]; + const ox=(flip?-1:1)*width*.08,oy=-height*.25; + return photoEffectSprite(3,region,hand.x+ox*c-oy*s,hand.y+ox*s+oy*c, + width,height,angle,flip,depth,true); +} +const photoRegions = { + acHead: [80, 104, 285, 285], xboxHead: [524, 104, 285, 285], + acLimb: [1058, 48, 104, 372], xboxLimb: [1503, 48, 104, 372], + gun: [51, 543, 365, 253], skateboard: [460, 611, 412, 136], + platform: [900, 606, 418, 162], rocket: [1368, 542, 372, 236], + concrete: [970, 625, 270, 43], wall: [930, 698, 350, 55], +}; +function photoSprite(region, x, y, width, height, angle = 0, flip = false, + depth = triangleDepth) { + if (!photoThemeActive || ![x, y, width, height, angle, depth].every(Number.isFinite) || + width <= 0 || height <= 0 || width > 30000 || height > 30000 || + Math.abs(x) > 30000 || Math.abs(y) > 30000) return false; + return themeSprite(1, ...photoRegions[region], x, y, width, height, + angle, flip, depth) !== false; +} +function photoLimb(segment, seat) { + const dx = segment.x2 - segment.x1, dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy); + if (length < .001) return; + const width = Math.max(2, segment.width); + photoSprite(seat === 0 ? "acLimb" : "xboxLimb", + (segment.x1 + segment.x2) / 2, (segment.y1 + segment.y2) / 2, + width, length + width, + Math.atan2(dy, dx) - Math.PI / 2); +} +function photoSurface(region, a, b, c, d) { + // Tall structural faces keep their shaded map color. Stretching a thin + // texture strip over them made the back of the arena look like a curtain. + if (region === "wall") return false; + if (!photoThemeActive || typeof themeQuad !== "function") return false; + const points = [a, b, c, d]; + if (points.some(p => ![p.x,p.y,p.z].every(Number.isFinite) || + Math.abs(p.x) > 30000 || Math.abs(p.y) > 30000)) return false; + // Structural faces use the material atlas, never a stretched skybox crop. + return themeQuad(1, ...photoRegions[region], + a.x,a.y,a.z, b.x,b.y,b.z, c.x,c.y,c.z, d.x,d.y,d.z) !== false; +} + +function drawSkeletonSegments(segments, color, outline, player = null) { + if (photoThemeActive && player) { + for (const segment of segments) + if (!segment.hitboxOnly) photoLimb(segment, player.pad); + return; + } + const edge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + if (player?.skateboard) segments = segments.slice().sort((a, b) => b.depth - a.depth); + for (const segment of segments) { + if (segment.hitboxOnly) continue; + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + edge * 2, outline); + } + for (const [index, segment] of segments.entries()) { + if (segment.hitboxOnly) continue; + const appearance = generatedAppearance(player); + drawPaletteCapsule(segment, appearance ? null : player && !player.npc + ? player.handleColors : null, index, appearance ? generatedPartColor(appearance, segment) : color, player); + } +} + +function paletteColorAt(colors, coordinate, fallback) { + if (!colors?.length) return fallback; + const wrapped = ((coordinate % colors.length) + colors.length) % colors.length; + const first = Math.floor(wrapped); + const second = (first + 1) % colors.length; + return mixColor(colors[first], colors[second], wrapped - first); +} + +function drawPaletteCapsule(segment, colors, coordinate, fallback, player = null) { + // The gradient's resolution is an experiment dial: six bands is the look, + // one band is a flat capsule at a third of the faces. + const bands = colors?.length > 1 + ? clamp(Math.round(renderFlags.bands ?? 6), 1, 6) : 1; + if (bands === 1) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width, damagedPartColor(fallback, player, segment.part)); + return; + } + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy) || 1; + const radius = segment.width / 2; + const nx = -dy / length * radius; + const ny = dx / length * radius; + let firstColor = fallback; + let lastColor = fallback; + for (let band = 0; band < bands; band++) { + const from = band / bands; + const to = (band + 1) / bands; + // A small overlap keeps the gradient continuous after integer projection. + const overlap = bands > 1 ? .012 : 0; + const x1 = lerp(segment.x1, segment.x2, Math.max(0, from - overlap)); + const y1 = lerp(segment.y1, segment.y2, Math.max(0, from - overlap)); + const x2 = lerp(segment.x1, segment.x2, Math.min(1, to + overlap)); + const y2 = lerp(segment.y1, segment.y2, Math.min(1, to + overlap)); + const mapped = paletteColorAt(colors, + coordinate + (from + to) * .5, fallback); + const color = damagedPartColor(mapped, player, segment.part); + if (band === 0) firstColor = color; + if (band === bands - 1) lastColor = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, ...color); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, ...color); + } + filledDisc(segment.x1, segment.y1, radius, firstColor); + filledDisc(segment.x2, segment.y2, radius, lastColor); +} + +function distantFighterLocator(player, head) { + if (!player?.alive || shellMode !== "GAME" || head.radius >= 12 || + ![head.x, head.y, head.radius].every(Number.isFinite)) return null; + const safe = actionSafeRect(); + const size = compactLayout() ? 24 : 28; + const fullName = visibleHandle(player); + const label = fullName.length > 16 ? fullName.slice(0, 14) + ".." : fullName; + const width = handleWidth(label, size) + 24; + const height = size + 12; + // Leave the top controls/debug block and bottom player/music HUD clear. + const top = Math.max(safe.top + 64, viewHeight * .24); + const bottom = Math.min(safe.bottom - 96, viewHeight * .78); + const anchorX = clamp(head.x, safe.left + 10, safe.right - 10); + const anchorY = clamp(head.y, safe.top + 10, safe.bottom - 10); + const x = clamp(anchorX - width / 2, safe.left + 8, safe.right - width - 8); + // All labels sit above their fighter; stagger nearby seats vertically. + const offset = -height - 24 - (player.pad === 0 ? height + 8 : player.pad === 2 ? 2 * (height + 8) : 0); + const y = clamp(anchorY + offset, top, bottom - height); + return { x, y, width, height, size, label, anchorX, anchorY, color: player.color }; +} + +function drawDistantFighterLocator(player, head) { + const marker = distantFighterLocator(player, head); + if (!marker) return; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + try { + const { x, y, width, height, anchorX: ax, anchorY: ay, color } = marker; + const edgeY = ay < y ? y : y + height; + filledCapsule(ax, ay - Math.max(4, head.radius) - 5, + clamp(ax, x + 10, x + width - 10), edgeY, 1.5, color); + typeWrite(marker.label, x + 14, y + 9, marker.size, 4, 5, 12); + typeWrite(marker.label, x + 12, y + 6, marker.size, ...color); + } finally { triangleDepth = previousDepth; } +} + +function drawFighterSilhouette(geometry, color, outline, player = null) { + drawSkeletonSegments(geometry.segments, color, outline, player); + if (photoThemeActive && player) { + const head = geometry.head, seat = player.pad === 0 ? 0 : 1; + const radius = Math.max(2, head.radius); + photoSprite(seat ? "xboxHead" : "acHead", head.x, head.y, + radius * 2, radius * 2, + isHeadOnly(player) ? player.headRoll || 0 : player.skateRotation || 0, + (seat === 0 ? 1 : -1) !== (player.facing || 1), triangleDepth - .01); + return; + } + const headEdge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + // The neck connector and solid head are emitted into the same triangle + // silhouette pass, so the head cannot detach as a separate line-layer ring. + filledDisc(geometry.head.x, geometry.head.y, + geometry.head.radius + headEdge, outline); + // AC stores the @ glyph first; the face is the identity anchor for the same + // palette that distorts continuously across the body below it. + const appearance = generatedAppearance(player); + const headColor = appearance ? appearance.skin : player && !player.npc && player.handleColors?.length + ? player.handleColors[0] : color; + filledDisc(geometry.head.x, geometry.head.y, geometry.head.radius, headColor); + if (appearance) { + const { x, y, radius: r } = geometry.head; + if (appearance.hairStyle !== "none") { + filledCapsule(x - r * .7, y - r * .65, x + r * .7, y - r * .65, + r * (appearance.hairStyle === "curly" ? .75 : .48), appearance.hair); + if (appearance.hairStyle === "long") for (const side of [-1, 1]) + filledCapsule(x + side * r * .86, y - r * .3, x + side * r * .86, y + r * .85, r * .3, appearance.hair); + } + if (appearance.beard) filledCapsule(x - r * .4, y + r * .68, x + r * .4, y + r * .68, r * .4, appearance.hair); + if (appearance.glasses) { + for (const side of [-1, 1]) hudCircle(x + side * r * .34, y - r * .08, r * .23, Math.max(1, r * .08), [18, 20, 28]); + filledCapsule(x - r * .1, y - r * .08, x + r * .1, y - r * .08, Math.max(1, r * .06), [18, 20, 28]); + } + } + if (player && isHeadOnly(player)) { + // The shell rolls from distance travelled while the face is drawn later in + // stable screen space. A visible chord makes circular geometry's rotation + // readable without tumbling the eyes or changing their gaze. + const angle = player.x / Math.max(12, geometry.head.radius) + + player.facing * Math.PI * .18; + const reach = geometry.head.radius * .7; + const dx = Math.cos(angle) * reach; + const dy = Math.sin(angle) * reach; + filledCapsule(geometry.head.x - dx, geometry.head.y - dy, + geometry.head.x + dx, geometry.head.y + dy, + Math.max(2, geometry.head.radius * .1), mixColor(headColor, outline, .55)); + } +} + +function fighterAnimationPhase(player, now = null) { + const run = runtime(); + now ??= run.simMonotonicUs || run.monotonicUs; + let state = "IDLE"; + let stateStartedAt = startedAt; + if (!player.alive) { + state = "KO"; + stateStartedAt = player.headBustedAt || player.lastButtonAt || now; + } else if (now < player.hitStunUntil) { + state = "HIT"; + stateStartedAt = player.lastButtonAt || now; + } else if (roundResult && ["KICK", "PUNCH", "POSE", "DANCE", "DASH", + "JUMP", "CROUCH"].includes(player.resultReaction)) { + state = player.resultReaction === "POSE" || player.resultReaction === "DANCE" + ? "MEDITATE" : player.resultReaction; + stateStartedAt = player.resultReactionAt || now; + } else if (player.blocking) { + state = "SHIELD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.heldBall >= 0) { + state = "HOLD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.grabHeld) { + state = "REACH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.itemAction && now < player.itemActionUntil) { + state = player.itemAction; + stateStartedAt = player.itemActionStartedAt || now; + } else if (player.attackKind && now < player.attackUntil) { + state = player.attackKind; + stateStartedAt = player.attackStartedAt || now; + } else if (isPogo(player)) { + state = "POGO"; + } else if (now < player.sinkUntil) { + state = "SINK"; + stateStartedAt = player.sinkUntil - sinkDurationUs; + } else if (!player.grounded && now < player.hopUntil) { + state = "CROUCH HOP"; + stateStartedAt = player.hopUntil - crouchHopPoseUs; + } else if (player.ducking) { + state = player.grounded ? "CROUCH" : "AIR CROUCH"; + } else if (!player.grounded) { + state = player.vy < 0 ? "JUMP" : "FALL"; + stateStartedAt = player.jumpPoseUntil + ? player.jumpPoseUntil - (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs) + : player.lastButtonAt || now; + } else if (shellMode === "MENU" && titleAttractMode === "still") { + state = "MEDITATE"; + } else if (now < player.dashUntil) { + state = "DASH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.runSince) { + state = "RUN"; + stateStartedAt = player.runSince; + } else if (Math.abs(player.vx) > 40) { + state = "WALK"; + } + const [authoredSteps, authoredTicksPerStep, basePhase, loop] = + fighterAnimationSpecs[state] || fighterAnimationSpecs.IDLE; + const timing = meleeFrames[state]; + const steps = timing ? timing.startup+timing.active+timing.recovery : authoredSteps; + // Descending terrain advances planted-foot exchanges faster. The result is + // still integer-tick animation, but the legs keep pace with downhill speed + // instead of the body skating through a leisurely flat-ground cycle. + const travel = Math.sign(player.vx); + const downhill = player.grounded && travel + ? Math.max(0, terrainFloorAt(player.x + travel * 150) - + terrainFloorAt(player.x)) / 150 : 0; + const ticksPerStep = ["WALK", "RUN", "DASH"].includes(state) + ? Math.max(1, Math.round(authoredTicksPerStep / + (1 + downhill * 1.9 + Math.min(1, Math.abs(player.vx) / 1800) * .28))) + : authoredTicksPerStep; + const rawTick = Math.max(0, + Math.floor((now - stateStartedAt) / replayTickUs)); + const rawStep = Math.floor(rawTick / ticksPerStep); + const step = loop ? rawStep % steps : Math.min(steps - 1, rawStep); + let phase = basePhase; + if (timing) phase = meleeFrame(player,now).phase.toUpperCase(); + else if (["FIRE", "THROW", "REACH"].includes(state)) { + const section = step / Math.max(1, steps - 1); + phase = section < .3 ? "STARTUP" : section < .68 ? "ACTIVE" : "RECOVERY"; + } else if (state === "JUMP" || state === "FALL") { + phase = Math.abs(player.vy) < 150 ? "APEX" : state === "JUMP" + ? "ASCEND" : "DESCEND"; + } + // `frameNow` is the clock, not the cycle. It has to keep climbing with real + // time — the looping states anchor `stateStartedAt` at match start, so a + // cycle-position clock wraps back to the first second forever and every + // "is this timestamp still in the future" test answers yes for the rest of + // the round. That is what pinned a landed fighter in the crouch pose and + // froze the legs. Quantizing to the tick grid keeps the pose on the sim's + // 60 Hz phase without inventing in-between frames. + return { state, phase, step: step + 1, steps, tick: rawTick, + ticksPerStep, progress: step / Math.max(1, steps - 1), + frameNow: stateStartedAt + rawTick * replayTickUs }; +} + +// Only share poses during one interpolated paint. Simulation and rollback +// always rebuild, because a hit may change limbs between queries in one tick. +const renderPoses = new Map(); +let sharingRenderPoses = false; +function runnerWorldGeometry(player, t) { + const cached = sharingRenderPoses && renderPoses.get(player); + if (cached && (!player.spiderDummy || cached.t === t)) return cached.pose; + const pose = buildRunnerWorldGeometry(player, t); + if (player.skateRotation) { + const c = Math.cos(player.skateRotation), s = Math.sin(player.skateRotation); + const rotate = (x, y) => ({ x: player.x + (x - player.x) * c - (y - player.y) * s, + y: player.y + (x - player.x) * s + (y - player.y) * c }); + Object.assign(pose.head, rotate(pose.head.x, pose.head.y)); + for (const segment of pose.segments) { + const a = rotate(segment.x1, segment.y1), b = rotate(segment.x2, segment.y2); + segment.x1 = a.x; segment.y1 = a.y; segment.x2 = b.x; segment.y2 = b.y; + } + } + if (sharingRenderPoses) renderPoses.set(player, { t, pose }); + return pose; +} + +function buildRunnerWorldGeometry(player, t, at = null) { + if (player.spiderDummy) return spiderDummyWorldGeometry(player, t); + // Rendering consumes the same fixed 60 Hz phase clock as simulation. The + // display can remain uncapped without inventing in-between combat poses. + const animation = fighterAnimationPhase(player, at); + const poseNow = animation.frameNow; + const poseCycle = animation.progress * Math.PI * 2; + const speed = Math.min(1, Math.abs(player.vx) / 1500); + const meditating = shellMode === "MENU" && titleTransitionAt === null && + titleAttractMode === "still"; + const idle = player.grounded && !player.ducking && speed < .03; + const breath = idle ? Math.sin(poseCycle + player.pad * .7) * 5 : 0; + const idleSway = idle ? Math.sin(poseCycle + player.pad) * 7 : 0; + const stride = Math.sin(poseCycle + player.pad * Math.PI) * + 32 * speed; + const pogo = isPogo(player); + const headOnly = isHeadOnly(player); + const noLegs = !hasPart(player, "left-leg") && + !hasPart(player, "right-leg") && !headOnly; + const jumpAnticipation = player.jumpLaunchAt > poseNow + ? clamp(1 - (player.jumpLaunchAt - poseNow) / jumpAnticipationUs, 0, 1) : 0; + const landingRecovery = player.landPoseUntil > poseNow + ? clamp((player.landPoseUntil - poseNow) / 110000, 0, 1) : 0; + const crouchPose = clamp(Math.max(player.crouchBlend || 0, + Math.sin(jumpAnticipation * Math.PI) * .72, + landingRecovery * .45, noLegs ? .45 : 0), 0, 1); + const height = lerp(180, 108, crouchPose); + const formDrop = pogo ? 54 : noLegs ? 31 : 0; + const aimPose = player.itemAimLocked || player.gunAimLive + ? player.gunAimX || player.facing : 0; + const lean = player.facing * (idle ? 5 : 3 + speed * 10) + aimPose * 7; + const x = player.x; + const feet = player.y; + const z = player.z; + // With neither leg present the pelvis itself becomes the ground contact. + // Keeping its capsule tangent to the floor prevents a floating torso pose. + const hipY = noLegs ? feet - 5 + : feet - lerp(58, 40, crouchPose) + formDrop; + const neckX = x + lean; + const neckY = feet - height + 54 - breath + formDrop + + (player.itemAimLocked || player.gunAimLive + ? (player.gunAimY || 0) * 8 : 0); + const attackPulse = meleePulse(player, poseNow); + const head = headOnly + ? { x, y: feet - 22, z, radius: 22 } + : { x: neckX + lean * .2, + y: feet - height + 22 - breath * 1.6 + formDrop, z, radius: 22 }; + const segments = []; + // `startMelee` and `heldItem` both gate on `itemHand`, so the drawn striking + // arm has to name that same part. Naming it by facing alone tagged the + // reaching capsules with the opposite arm the moment a fighter turned around + // while armed — shooting off one arm then erased the other one's limb. + const actionArm = itemHand(player) || + (player.facing > 0 ? "right-arm" : "left-arm"); + const rearArm = actionArm === "right-arm" ? "left-arm" : "right-arm"; + const actionLeg = player.facing > 0 ? "right-leg" : "left-leg"; + const rearLeg = actionLeg === "right-leg" ? "left-leg" : "right-leg"; + const partForRole = (role, startX) => { + if (["neck", "torso", "shoulders"].includes(role)) return "torso"; + if (role.startsWith("attack-") || role.startsWith("item-")) + return role.includes("arm") || role.includes("forearm") + ? actionArm : actionLeg; + if (role.startsWith("rest-")) return rearArm; + if (role.startsWith("lead-")) return actionLeg; + if (role.startsWith("rear-")) + return role.includes("arm") || role.includes("forearm") + ? rearArm : rearLeg; + if (role.startsWith("grab-")) + return startX <= neckX ? "left-arm" : "right-arm"; + if (role.startsWith("left-")) + return role.includes("arm") || role.includes("forearm") + ? "left-arm" : "left-leg"; + if (role.startsWith("right-")) + return role.includes("arm") || role.includes("forearm") + ? "right-arm" : "right-leg"; + return "torso"; + }; + const segment = (x1, y1, x2, y2, width, role = "body") => { + const part = partForRole(role, x1); + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1: z, x2, y2, z2: z, width, role, part }); + }; + const twoBone = (startX, startY, targetX, targetY, length, bend) => { + let dx = targetX - startX; + let dy = targetY - startY; + let distance = Math.hypot(dx, dy) || 1; + const maximum = length * 1.94; + if (distance > maximum) { + targetX = startX + dx / distance * maximum; + targetY = startY + dy / distance * maximum; + dx = targetX - startX; + dy = targetY - startY; + distance = maximum; + } + const middleX = (startX + targetX) / 2; + const middleY = (startY + targetY) / 2; + const height = Math.sqrt(Math.max(0, length * length - + distance * distance / 4)); + return { jointX: middleX - dy / distance * height * bend, + jointY: middleY + dx / distance * height * bend, + targetX, targetY }; + }; + // Where a grounded foot may actually plant. The bare terrain probe reads + // the arena floor, so a fighter standing on a rung planted his feet a + // storey down and the shins stretched to reach — the long legs @jeffrey + // called out. The probe now asks for the surface the fighter is actually + // standing on, and a foot hanging past a rung's lip stops at the leg's own + // reach — a short dangle — instead of the floor below. + const footPlant = (footX) => Math.min(surfaceYAt(footX, feet), feet + 20); + segment(head.x, head.y + head.radius * .78, neckX, neckY, 10, "neck"); + segment(neckX, neckY, x, hipY, 10, "torso"); + // An elbow sags downward whichever way the hand actually reaches. Bending + // by facing alone flipped the joint whenever a hand crossed behind the + // body — the crossed, double-elbowed arms @jeffrey called out. + const armBend = (shoulderX, targetX) => targetX >= shoulderX ? 1 : -1; + const shoulderY = neckY + 11; + const shoulderSpread = 12; + const leftShoulderX = neckX - shoulderSpread; + const rightShoulderX = neckX + shoulderSpread; + // The working hand always reaches out front and the idle one always trails + // behind, so both shoulders follow facing. Anchoring them on the arm that + // owns the item instead meant a fighter who armed himself facing right and + // then turned around hung his reaching arm off the rear shoulder and his + // trailing arm off the front one: the pair crossed once at the neck and + // again past the elbows, boxing the double diamond @jeffrey called out. + const actionShoulderX = neckX + player.facing * shoulderSpread; + const restShoulderX = neckX - player.facing * shoulderSpread; + segment(leftShoulderX, shoulderY, rightShoulderX, shoulderY, 10, + "shoulders"); + if (player.attackKind === "KICK" && attackPulse > 0) { + const target = meleeTarget(player, poseNow); + const lowKick = player.lowKick; + const leg = twoBone(x, hipY, target.x, target.y, + meleeSpecs.KICK.span, lowKick ? player.facing * .35 : -player.facing); + segment(x, hipY, leg.jointX, leg.jointY, 12, "attack-thigh"); + segment(leg.jointX, leg.jointY, leg.targetX, leg.targetY, 12, + "attack-shin"); + segment(x, hipY, x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), 10, "rear-thigh"); + segment(x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), x - player.facing * 8, feet, + 10, "rear-shin"); + } else if (meditating) { + segment(x, hipY, x - 48, feet - 12, 11, "left-thigh"); + segment(x - 48, feet - 12, x + 8, feet, 11, "left-shin"); + segment(x, hipY, x + 48, feet - 12, 11, "right-thigh"); + segment(x + 48, feet - 12, x - 8, feet, 11, "right-shin"); + } else if (player.skateboard) { + // The deck is drawn tilted along the terrain, so each foot plants on + // the deck's own top at its x — flat foot heights ran the board + // through the shins on every slope. + const deckAt = (footX) => footPlant(footX) - 6; + const plantedX = x + player.facing * 28; + const push = Math.sin(poseCycle) * 34; + const leadFootX = plantedX + player.facing * 18; + segment(x, hipY, plantedX, deckAt(plantedX) - 21, 11, "lead-thigh"); + segment(plantedX, deckAt(plantedX) - 21, leadFootX, + deckAt(leadFootX), 11, "lead-shin"); + const pushKnee = x - player.facing * (22 + push * .3); + const pushFootX = x - player.facing * (46 + Math.max(0, push)); + segment(x, hipY, pushKnee, deckAt(pushKnee) - 25, 10, "rear-thigh"); + segment(pushKnee, deckAt(pushKnee) - 25, pushFootX, + deckAt(pushFootX), 10, "rear-shin"); + } else if (crouchPose > .08) { + segment(x, hipY, x - 36, feet - 22, 10, "left-thigh"); + segment(x - 36, feet - 22, x - 4, feet, 10, "left-shin"); + segment(x, hipY, x + 36, feet - 22, 10, "right-thigh"); + segment(x + 36, feet - 22, x + 58, feet, 10, "right-shin"); + } else if (player.grounded) { + // The facing-side foot is visibly planted forward even at rest. + const leadKnee = x + player.facing * 18 + stride * .38; + const leadFoot = x + player.facing * 42 + stride; + const rearKnee = x - player.facing * 16 - stride * .38; + const rearFoot = x - player.facing * 28 - stride; + // The animation phase still chooses the discrete stride; ground probes + // constrain that frame onto the surface underfoot without new sim steps. + const leadGround = footPlant(leadFoot); + const rearGround = footPlant(rearFoot); + segment(x, hipY, leadKnee, leadGround - 30, 10, "lead-thigh"); + segment(leadKnee, leadGround - 30, leadFoot, leadGround, 10, "lead-shin"); + segment(x, hipY, rearKnee, rearGround - 30, 10, "rear-thigh"); + segment(rearKnee, rearGround - 30, rearFoot, rearGround, 10, "rear-shin"); + } else { + segment(x, hipY, x - 32, feet - 32, 10, "left-thigh"); + segment(x - 32, feet - 32, x - 7, feet - 11, 10, "left-shin"); + segment(x, hipY, x + 32, feet - 43, 10, "right-thigh"); + segment(x + 32, feet - 43, x + 50, feet - 22, 10, "right-shin"); + } + const arm = idle ? idleSway : player.grounded ? -stride * .7 : 12; + const elbowY = feet - lerp(94, 76, crouchPose) - breath; + const handY = feet - lerp(65, 50, crouchPose) - breath * .5; + const actionNow = poseNow; + const armAttack = attackPulse > 0 && player.attackKind && + player.attackKind !== "KICK"; + if (player.skateboard && player.grounded && !armAttack && !heldItem(player)) { + const balance = Math.sin(poseCycle) * 18; + segment(leftShoulderX, shoulderY, x - 42, elbowY - 10 - balance, + 10, "left-upper-arm"); + segment(x - 42, elbowY - 10 - balance, x - 66, handY - balance, + 10, "left-forearm"); + segment(rightShoulderX, shoulderY, x + 42, elbowY - 10 + balance, + 10, "right-upper-arm"); + segment(x + 42, elbowY - 10 + balance, x + 66, handY + balance, + 10, "right-forearm"); + } else if (player.grabHeld || player.ropeIndex >= 0) { + const held = player.heldBall >= 0 ? balls[player.heldBall] : null; + const clutchX = player.ropeIndex >= 0 ? x : held?.x ?? x + player.facing * 126; + const clutchY = player.ropeIndex >= 0 ? feet - 125 : held?.y ?? feet - 92; + const spread = held ? Math.max(12, held.radius * .34) : 20; + const hands = [ + { shoulderX: leftShoulderX, x: clutchX - player.facing * 5, + y: clutchY - spread }, + { shoulderX: rightShoulderX, x: clutchX - player.facing * 5, + y: clutchY + spread }, + ]; + for (const hand of hands) { + const pose = twoBone(hand.shoulderX, shoulderY, + hand.x, hand.y, 58, armBend(hand.shoulderX, hand.x)); + segment(hand.shoulderX, shoulderY, pose.jointX, pose.jointY, 12, + "grab-upper-arm"); + segment(pose.jointX, pose.jointY, pose.targetX, pose.targetY, 12, + "grab-forearm"); + } + } else if (armAttack) { + // The striking arm outranks the carry pose: a whip or bash has to publish + // attack capsules or an armed fighter could never land a hand strike. + const target = meleeTarget(player, poseNow); + const armPose = twoBone(actionShoulderX, shoulderY, target.x, target.y, + meleeSpecFor(player, player.attackKind).span, + armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "attack-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "attack-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else if ((player.itemAction && actionNow < player.itemActionUntil) || + (player.gunAmmo > 0 && player.itemAction !== "THROW")) { + const target = itemHandTarget(player, actionNow); + const armPose = twoBone(actionShoulderX, shoulderY, + target.x, target.y, 58, armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "item-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "item-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else { + segment(leftShoulderX, shoulderY, x - 30 + arm * .45, elbowY, 10, + "left-upper-arm"); + segment(x - 30 + arm * .45, elbowY, x - 36 + arm * .6, handY, 10, + "left-forearm"); + segment(rightShoulderX, shoulderY, x + 30 - arm * .45, elbowY, 10, + "right-upper-arm"); + segment(x + 30 - arm * .45, elbowY, x + 36 - arm * .6, handY, 10, + "right-forearm"); + } + if (player.skateboard && !headOnly) { + const deck = skateFrame(player); + const pitch = (player.skatePitch || 0) * .35; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const transform = (px, py, depth) => ({ + x: x + (px - x) * c - (py - feet) * sn, + y: feet - skateAxleDrop - skateWheelRadius + (px - x) * sn + (py - feet) * c, + z: z + depth, + }); + Object.assign(head, transform(head.x, head.y, 0)); + for (const bone of segments) { + const side = bone.part.startsWith("left-") ? -1 : bone.part.startsWith("right-") ? 1 : 0; + const depth = side * (bone.part.includes("arm") ? 15 : 9); + const a = transform(bone.x1, bone.y1, depth); + const b = transform(bone.x2, bone.y2, depth); + if (bone.role === "shoulders") { + a.z = z - 15; + b.z = z + 15; + } + Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, x2: b.x, y2: b.y, z2: b.z }); + } + if (player.attackKind !== "KICK" || !attackPulse) { + for (const [role, direction, part] of [["lead", player.facing, actionLeg], + ["rear", -player.facing, rearLeg]]) { + if (!hasPart(player, part)) continue; + const side = part === "left-leg" ? -1 : 1; + const hip = transform(x, hipY, side * 7); + const foot = deck(direction * skateTruck, -4, side * 9); + const dx = foot.x - hip.x, dy = foot.y - hip.y, dz = foot.z - hip.z; + const distance = Math.hypot(dx, dy, dz) || 1; + const length = Math.max(48, distance / 1.98); + const bend = Math.sqrt(Math.max(0, length * length - distance * distance / 4)); + const norm = Math.hypot(dx, dy) || 1; + const knee = { x: (hip.x + foot.x) / 2 + dy / norm * bend * player.facing, + y: (hip.y + foot.y) / 2 - dx / norm * bend * player.facing, + z: (hip.z + foot.z) / 2 }; + const thigh = segments.find((bone) => bone.role === role + "-thigh"); + const shin = segments.find((bone) => bone.role === role + "-shin"); + for (const [bone, a, b] of [[thigh, hip, knee], [shin, knee, foot]]) + if (bone) Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, + x2: b.x, y2: b.y, z2: b.z }); + } + } + } + return { head, segments }; +} + +// The first spider dummy deliberately shares the inert dummy controller. Its +// threat is physical scale: four independently destructible leg-pairs spread +// across a daddy-long-legs silhouette around one large central body. +function spiderDummyWorldGeometry(player, t) { + const x = player.x; + const feet = player.y; + const z = player.z; + const bodyY = feet - 176; + const sway = Math.sin(t * 1.7 + player.pad) * 5; + const head = { x, y: bodyY + sway, z, radius: 22 }; + const segments = []; + const add = (x1, y1, x2, y2, width, role, part, + z1 = z, z2 = z, hitboxOnly = false) => { + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1, x2, y2, z2, width, role, part, hitboxOnly }); + }; + add(x - 42, bodyY, x + 42, bodyY, 38, "torso", "torso"); + add(x, bodyY - 30, x, bodyY + 31, 34, "spider-body", "torso"); + const legs = [ + [-1, -1], [-1, -.55], [-1, .25], [-1, .72], + [1, -1], [1, -.55], [1, .25], [1, .72], + ]; + for (let index = 0; index < legs.length; index++) { + const [side, lane] = legs[index]; + const part = spiderLegParts[index]; + const rootX = x + side * 31; + const rootY = bodyY + lane * 31 + sway; + const lift = 34 + Math.abs(lane) * 28; + const depthLane = (index - 3.5) * 72; + const points = [ + [rootX, rootY, z + depthLane * .2], + [x + side * 76, bodyY - lift, z + depthLane * .48], + [x + side * 126, bodyY - lift * .42, z + depthLane * .72], + [x + side * 171, bodyY + 24 + Math.abs(lane) * 19, z + depthLane], + [x + side * 211, feet - 51 - (index % 2) * 12, z + depthLane * 1.08], + [x + side * 246, feet, z + depthLane], + ]; + for (let joint = 0; joint < points.length - 1; joint++) { + const [x1, y1, z1] = points[joint]; + const [x2, y2, z2] = points[joint + 1]; + add(x1, y1, x2, y2, 13 - joint, + `spider-leg-${index + 1}-segment-${joint + 1}`, part, z1, z2); + } + // One broad top-level combat proxy per complete leg keeps the boss + // readable to melee even though the visible joints fan through Z. + add(rootX, rootY, points.at(-1)[0], points.at(-1)[1], 32, + `spider-hitbox-${index + 1}`, part, z, z, true); + } + return { head, segments }; +} + +function runnerGeometry(player, t) { + return projectRunnerWorldGeometry(runnerWorldGeometry(player, t)); +} + +function projectRunnerWorldGeometry(world) { + const headPoint = projectPoint(world.head.x, world.head.y, world.head.z); + return { + head: { x: headPoint.x, y: headPoint.y, + radius: Math.max(1.5, world.head.radius * cameraScale()) }, + segments: world.segments.map((segment) => { + const a = projectPoint(segment.x1, segment.y1, segment.z1); + const b = projectPoint(segment.x2, segment.y2, segment.z2); + return { x1: a.x, y1: a.y, x2: b.x, y2: b.y, depth: (a.z + b.z) / 2, + width: Math.max(1.5, segment.width * cameraScale()), + role: segment.role, part: segment.part, + hitboxOnly: segment.hitboxOnly }; + }), + }; +} + +function runnerBounds(player, t) { + const geometry = runnerWorldGeometry(player, t); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function runnerScreenBounds(player, t) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + const geometry = projectRunnerWorldGeometry(world); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function fighterContainmentRequiredWidth(t) { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + const include = (x, y, radius) => { + left = Math.min(left, x - radius); + right = Math.max(right, x + radius); + top = Math.min(top, y - radius); + bottom = Math.max(bottom, y + radius); + }; + for (const player of activePlayers()) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + include(world.head.x, world.head.y, world.head.radius); + for (const segment of world.segments) { + const radius = segment.width / 2; + include(segment.x1, segment.y1, radius); + include(segment.x2, segment.y2, radius); + } + } + return Math.max(rectPackWidth({ left, right, top, bottom }), + frameFloorWidth()); +} + +// Final render invariant: both complete animated fighter geometries must fit +// inside the action-safe viewport. Camera modes may orbit or focus, but this +// aspect-aware correction recenters their shared frame and moves the dolly +// back far enough for landscape, portrait, live, and replay projection alike. +function containFighters(t) { + if (skateparkMap && !survivalActive()) return; + const gameplayContainment = !roundResult && + runtime().monotonicUs - roundStartedAt >= roundIntroDurationUs(); + if (gameplayContainment) { + cameraContainFloor = Math.max(cameraContainFloor, + fighterContainmentRequiredWidth(t) * 1.11); + return; + } + const worlds = activePlayers().map((player) => player.replayGeometry || + player.frozenGeometry || runnerWorldGeometry(player, t)); + if (!worlds.length) return; + const points = []; + for (const world of worlds) { + const { head } = world; + points.push( + { x: head.x - head.radius, y: head.y, z: head.z }, + { x: head.x + head.radius, y: head.y, z: head.z }, + { x: head.x, y: head.y - head.radius, z: head.z }, + { x: head.x, y: head.y + head.radius, z: head.z }, + ); + for (const segment of world.segments) { + const radius = segment.width / 2; + for (const endpoint of [ + { x: segment.x1, y: segment.y1, z: segment.z1 }, + { x: segment.x2, y: segment.y2, z: segment.z2 }, + ]) { + points.push( + { x: endpoint.x - radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x + radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y - radius, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y + radius, z: endpoint.z }, + ); + } + } + } + const minX = Math.min(...points.map((point) => point.x)); + const maxX = Math.max(...points.map((point) => point.x)); + const minY = Math.min(...points.map((point) => point.y)); + const maxY = Math.max(...points.map((point) => point.y)); + // Keep the smoothly tracked root target. Animated limb extrema are allowed + // to affect containment scale, but never camera aim. + const target = cameraDoll.target; + + const safe = actionSafeRect(); + const safeWidth = Math.max(1, safe.right - safe.left); + const safeHeight = Math.max(1, safe.bottom - safe.top); + const requiredWidth = Math.max( + rectPackWidth({ left: minX, right: maxX, top: minY, bottom: maxY }), + frameFloorWidth()); + if (requiredWidth > cameraDoll.width) { + const amount = requiredWidth / Math.max(1, cameraDoll.width) * 1.04; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + + // Perspective and z-depth can make the world-space estimate asymmetric. + // Iteratively measure the actual projection and expand along the existing + // camera ray until every point satisfies the screen-space safe rectangle. + const centerX = (safe.left + safe.right) / 2; + const centerY = (safe.top + safe.bottom) / 2; + for (let pass = 0; pass < 4; pass++) { + cameraDoll.dirty = true; + cameraDoll.prepare(); + const projected = points.map((point) => cameraDoll.project(point)); + const left = Math.min(...projected.map((point) => point.x)); + const right = Math.max(...projected.map((point) => point.x)); + const top = Math.min(...projected.map((point) => point.y)); + const bottom = Math.max(...projected.map((point) => point.y)); + const factor = Math.max(1, + (centerX - left) / (safeWidth / 2), + (right - centerX) / (safeWidth / 2), + (centerY - top) / (safeHeight / 2), + (bottom - centerY) / (safeHeight / 2)); + if (factor <= 1.001) break; + const amount = factor * 1.025; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + cameraDoll.dirty = true; +} + +function resolveRunnerBounds(player, t) { + // Walls use a stable pushbox independent of the character renderer. + const halfWidth = isHeadOnly(player) ? 24 : isPogo(player) ? 38 + : player.ducking ? 76 : 62; + const leftWall = worldLeft + wallThickness; + const rightWall = worldRight - wallThickness; + if (player.x - halfWidth < leftWall) { + player.x = leftWall + halfWidth; + if (player.skateboard && player.grounded && player.skateVx < -900) { + player.skateWallSide = -1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, -1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx < 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.max(0, player.vx); + player.knockVx = Math.max(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + if (player.x + halfWidth > rightWall) { + player.x = rightWall - halfWidth; + if (player.skateboard && player.grounded && player.skateVx > 900) { + player.skateWallSide = 1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, 1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx > 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.min(0, player.vx); + player.knockVx = Math.min(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + const ceiling = (survivalActive() ? survivalCeilingY : ceilingY) + + wallThickness; + const standingTop = runnerBounds(player, t).top; + if (!airRoundActive() && standingTop < ceiling) { + player.y += ceiling - standingTop; + if (player.vy < 0) player.vy = isHeadOnly(player) ? -player.vy * .62 : 0; + } +} + +function pointSegmentDistance(px, py, pz, segment) { + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const dz = segment.z2 - segment.z1; + const lengthSquared = dx * dx + dy * dy + dz * dz; + const amount = lengthSquared > 0 + ? Math.max(0, Math.min(1, + ((px - segment.x1) * dx + (py - segment.y1) * dy + + (pz - segment.z1) * dz) / lengthSquared)) + : 0; + return Math.hypot(px - (segment.x1 + dx * amount), + py - (segment.y1 + dy * amount), pz - (segment.z1 + dz * amount)); +} + +// Closest points for loose debris, independent of the character renderer. +function segmentSegmentClosest(first, second) { + const d1x = first.x2 - first.x1; + const d1y = first.y2 - first.y1; + const d1z = first.z2 - first.z1; + const d2x = second.x2 - second.x1; + const d2y = second.y2 - second.y1; + const d2z = second.z2 - second.z1; + const rx = first.x1 - second.x1; + const ry = first.y1 - second.y1; + const rz = first.z1 - second.z1; + const a = d1x * d1x + d1y * d1y + d1z * d1z; + const e = d2x * d2x + d2y * d2y + d2z * d2z; + const b = d1x * d2x + d1y * d2y + d1z * d2z; + const c = d1x * rx + d1y * ry + d1z * rz; + const f = d2x * rx + d2y * ry + d2z * rz; + const epsilon = .000000001; + let firstAmount = 0; + let secondAmount = 0; + if (a <= epsilon && e <= epsilon) { + firstAmount = 0; + secondAmount = 0; + } else if (a <= epsilon) { + secondAmount = clamp(f / e, 0, 1); + } else if (e <= epsilon) { + firstAmount = clamp(-c / a, 0, 1); + } else { + const denominator = a * e - b * b; + firstAmount = Math.abs(denominator) > epsilon + ? clamp((b * f - c * e) / denominator, 0, 1) : 0; + const secondNumerator = b * firstAmount + f; + if (secondNumerator < 0) { + secondAmount = 0; + firstAmount = clamp(-c / a, 0, 1); + } else if (secondNumerator > e) { + secondAmount = 1; + firstAmount = clamp((b - c) / a, 0, 1); + } else secondAmount = secondNumerator / e; + } + const firstPoint = { + x: first.x1 + d1x * firstAmount, + y: first.y1 + d1y * firstAmount, + z: first.z1 + d1z * firstAmount, + }; + const secondPoint = { + x: second.x1 + d2x * secondAmount, + y: second.y1 + d2y * secondAmount, + z: second.z1 + d2z * secondAmount, + }; + return { firstPoint, secondPoint, + distance: Math.hypot(firstPoint.x - secondPoint.x, + firstPoint.y - secondPoint.y, firstPoint.z - secondPoint.z) }; +} + + +function meleeLimbContact(attacker, target, t) { + const now = runtime().simMonotonicUs || runtime().monotonicUs; + return combatBoxContact(sampleCombatBoxes(attacker, now), sampleCombatBoxes(target, now)); +} + +// World-space rectangles with a shallow Z interval. Visual line width never +// changes these authored radii. The same records feed collision, Tab and Jev. +function combatRect(id, left, top, right, bottom, z = 0, depth = 18, extra = {}) { + return { id, left, top, right, bottom, near: z - depth, far: z + depth, ...extra }; +} +function boxesOverlap(a, b) { + return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && + a.bottom >= b.top && a.near <= b.far && a.far >= b.near; +} +function boxBounds(items) { + return { left: Math.min(...items.map(b => b.left)), right: Math.max(...items.map(b => b.right)), + top: Math.min(...items.map(b => b.top)), bottom: Math.max(...items.map(b => b.bottom)), + near: Math.min(...items.map(b => b.near)), far: Math.max(...items.map(b => b.far)) }; +} +function buildBoxTree(items) { + if (!items.length) return null; + const bounds = boxBounds(items); + if (items.length <= 3) return { bounds, items }; + const horizontal = bounds.right - bounds.left >= bounds.bottom - bounds.top; + const sorted = items.slice().sort((a,b) => horizontal + ? (a.left+a.right)-(b.left+b.right) : (a.top+a.bottom)-(b.top+b.bottom)); + const middle = Math.floor(sorted.length / 2); + return { bounds, children: [buildBoxTree(sorted.slice(0,middle)), buildBoxTree(sorted.slice(middle))] }; +} +function queryBoxTree(tree, area, found = []) { + if (!tree || !boxesOverlap(tree.bounds, area)) return found; + if (tree.items) for (const item of tree.items) { if (boxesOverlap(item, area)) found.push(item); } + else for (const child of tree.children) queryBoxTree(child, area, found); + return found; +} +function pointBoxDistance(box, x, y, z = 0) { + return Math.hypot(Math.max(box.left-x,0,x-box.right), + Math.max(box.top-y,0,y-box.bottom), Math.max(box.near-z,0,z-box.far)); +} +// Slab test on an expanded AABB: a fast projectile cannot skip a thin hurtbox. +function segmentBoxEntry(segment, box, radius = 0) { + let enter = 0, leave = 1; + for (const [axis,low,high] of [['x','left','right'],['y','top','bottom'],['z','near','far']]) { + const origin = segment[axis+'1'], delta = segment[axis+'2']-origin; + if (Math.abs(delta)<1e-9) { + if (originbox[high]+radius) return null; + } else { + const a=(box[low]-radius-origin)/delta,b=(box[high]+radius-origin)/delta; + enter=Math.max(enter,Math.min(a,b));leave=Math.min(leave,Math.max(a,b)); + if(enter>leave)return null; + } + } + return enter; +} +function sweptProjectileContact(segments,target,t) { + const now=runtime().simMonotonicUs || runtime().monotonicUs; + const boxes=sampleCombatBoxes(target,now); + let result=null; + for(const s of segments) { + const r=s.width/2; + const area=combatRect('sweep',Math.min(s.x1,s.x2)-r,Math.min(s.y1,s.y2)-r, + Math.max(s.x1,s.x2)+r,Math.max(s.y1,s.y2)+r,(s.z1+s.z2)/2,Math.abs(s.z2-s.z1)/2+r); + for(const hurt of queryBoxTree(boxes.tree,area)) { + const amount=segmentBoxEntry(s,hurt,r); + if(amount===null || (result && amount>=result.amount))continue; + result={amount,x:s.x1+(s.x2-s.x1)*amount,y:s.y1+(s.y2-s.y1)*amount, + z:s.z1+(s.z2-s.z1)*amount,separation:0,headshot:hurt.part==='head',segmentIndex:hurt.segmentIndex}; + } + } + return result; +} +function combatPushbox(player) { + const half = isHeadOnly(player) ? 24 : isPogo(player) ? 38 : 69; + const height = isHeadOnly(player) ? 44 : isPogo(player) ? 116 : player.ducking ? 118 : 180; + return combatRect('push', player.x-half, player.y-height, player.x+half, player.y, player.z); +} +function sampleCombatBoxes(player, now, world = null, buildTree = true) { + world ||= runnerWorldGeometry(player, (now-startedAt)/1e6); + const hurt = []; + const head = world.head; + hurt.push(combatRect('head', head.x-22, head.y-22, head.x+22, head.y+22, head.z, 22, + { part: 'head', segmentIndex: -1 })); + for (let i=0; is.role==='torso'); + if(torso)hit.push(combatRect('pogo',torso.x2-10,torso.y2-10, + torso.x2+10,torso.y2+10,torso.z2,10,{part:'torso'})); + } + if (player.alive && !player.attackHit && !player.blocking && now >= player.hitStunUntil && + frame.phase === 'active' && !isHeadOnly(player) && !isPogo(player)) { + const kick = player.attackKind === 'KICK'; + const part = kick ? player.facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (part && hasPart(player, part)) { + const tip = meleeTarget(player, now); + const halfX = kick ? 26 : 22; + const halfY = kick && player.lowKick ? 17 : 20; + const inner = player.x+player.facing*(kick ? 42 : 30); + const outer = tip.x+player.facing*halfX; + hit.push(combatRect(player.attackKind.toLowerCase(), Math.min(inner,outer), + tip.y-halfY, Math.max(inner,outer), tip.y+halfY, tip.z, 18, { part })); + } + } + const guard = []; + if (player.blocking) { + const shield = shieldGeometry(player); + guard.push(combatRect('guard', shield.x-shield.radius, shield.y-shield.radius, + shield.x+shield.radius, shield.y+shield.radius, shield.z, shield.radius)); + } + return { hurt, hit, guard, push: combatPushbox(player), frame, + tree: buildTree ? buildBoxTree(hurt) : null }; +} +function combatBoxContact(attacker, target) { + let result = null; + for (const hit of attacker.hit) { + const overlaps = queryBoxTree(target.tree, hit).sort((a,b) => + (a.part === 'head' ? -1 : b.part === 'head' ? 1 : a.segmentIndex-b.segmentIndex)); + const hurt = overlaps[0]; + if (!hurt) continue; + result = { x:(Math.max(hit.left,hurt.left)+Math.min(hit.right,hurt.right))/2, + y:(Math.max(hit.top,hurt.top)+Math.min(hit.bottom,hurt.bottom))/2, + z:(Math.max(hit.near,hurt.near)+Math.min(hit.far,hurt.far))/2, + separation: 0, headshot:hurt.part === 'head', segmentIndex:hurt.segmentIndex, + hitbox:hit.id, hurtbox:hurt.id }; + if (result.headshot) break; + } + return result; +} + +// Sample the game's real strike capsules against the opponent's current +// hurtboxes. This is reach evidence at fixed positions, not a predicted hit: +// travel, input latency, shields and the opponent's next move can change it. +function jevStrikeOptions(player, opponent, now) { + if (!player.alive || !opponent.alive || isHeadOnly(player) || isPogo(player)) return {}; + const t = (now - startedAt) / 1000000; + const target = sampleCombatBoxes(opponent, now); + const facing = Math.sign(opponent.x - player.x) || player.facing; + const result = {}; + for (const [action, kind, crouched] of [ + ['punch', itemMelee[heldItem(player)] || 'PUNCH', false], + ['kick', 'KICK', false], ['low_kick', 'KICK', true], + ['crouch_punch', itemMelee[heldItem(player)] || 'PUNCH', true], + ]) { + const part = kind === 'KICK' ? facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (!part || !hasPart(player, part) || (crouched && !player.grounded)) continue; + const probe = { ...player, facing, vx: 0, blocking: false, + ducking: crouched, crouchBlend: crouched ? 1 : 0, + grabHeld: false, itemAction: '', hitStunUntil: 0, attackHit: false, + attackKind: kind, lowKick: crouched && kind === 'KICK', + attackStartedAt: now, attackUntil: now + meleeSpecs[kind].windowUs }; + let closest = null, clearance = Infinity; + const timing = meleeFrames[kind]; + for (let frame=timing.startup; frame + item.part === part && !item.hitboxOnly)) { + const paletteCoordinate = geometry.segments.indexOf(segment); + detachedParts.push({ ...segment, color: player.color.slice(), + colors: player.npc ? [] : player.handleColors?.map((value) => value.slice()) || [], + paletteCoordinate, + vx: direction * (420 + detachedParts.length % 3 * 90), + vy: -520 - detachedParts.length % 2 * 120, + spin: direction * (3.5 + detachedParts.length % 4), + life: 2.6, part, owner: player.pad, heldBy: -1, hitAfter: now + 180000 }); + } +} + +function detachPart(player, part, geometry, sourceX, now) { + if (!hasPart(player, part)) return; + spawnDetachedPart(player, part, geometry, sourceX, now); + player.removedParts.push(part); + player.partDamage[part] = Math.max(player.partDamage[part] || 0, + part === "torso" ? 3 : 2); + emitSignal("partremoved", player.pad, + [...limbParts, "torso"].indexOf(part), 1); +} + +function damagePart(target, segmentIndex, sourceX, sourcePad, now) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const segment = geometry.segments[segmentIndex]; + const part = segment?.part; + if (!part || !hasPart(target, part)) return; + const durability = target.spiderDummy + ? part === "torso" ? 5 : 3 + : part === "torso" ? 3 : 2; + target.partDamage[part] = (target.partDamage[part] || 0) + 1; + emitSignal("partdamage", target.pad, + [...limbParts, "torso"].indexOf(part), target.partDamage[part] / durability); + if (target.partDamage[part] < durability) return; + if (part === "torso") { + // Removing the body's attachment point releases every surviving limb; + // the circular head remains as the final playable form. + for (const limb of target.spiderDummy ? spiderLegParts : limbParts) + detachPart(target, limb, geometry, sourceX, now); + } + detachPart(target, part, geometry, sourceX, now); + if (part === "torso") { + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + launchHead(target, sourceX, sourcePad, now, 650, 620); + } + if (target.itemArm === part) { + if (!unarmedRoundActive() && target.gunAmmo > 0) gunPickups.push({ kind: target.gunMode, + amount: target.gunAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + if (!unarmedRoundActive() && target.grenadeAmmo > 0) grenadePickups.push({ + amount: target.grenadeAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + // The blade goes where the hand went. A saber is held, not carried, so + // losing the item arm has to put it back on the map — otherwise the one + // weapon a fighter can keep all round would quietly cease to exist and + // the reach it was buying would vanish with no object to explain it. + if (target.swordHeld) { + if (!unarmedRoundActive()) saberPickups.push({ kind: "LIGHT SABER", x: target.x, + y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + target.swordHeld = false; + } + target.gunAmmo = 0; + target.grenadeAmmo = 0; + target.itemArm = ""; + emitSignal("item-drop", target.pad, sourcePad, 1); + } + if (target.carryArm === part) { + if (target.heldBall >= 0) releaseCarriedBall(target, now); + if (target.heldPart >= 0) releaseCarriedPart(target, now); + if (target.heldPlayer >= 0) releaseCarriedFighter(target, now); + target.carryArm = ""; + } + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.lastButton = part.toUpperCase() + " LOST"; + target.lastButtonAt = now; + playDrum("clap", 1.2, panPlayer(target)); +} + +function damageAllLimbs(target, sourceX, sourcePad, now) { + for (const part of limbParts) { + if (!hasPart(target, part)) continue; + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const index = geometry.segments.findIndex((segment) => segment.part === part); + if (index >= 0) damagePart(target, index, sourceX, sourcePad, now); + } +} + +const skateTruck = 32; +const skateWheelRadius = 8; +const skateAxleDrop = 10; + +function skateContact(x, y) { + // Solve the truck chord against the supporting ledge or heightfield. + let pitch = 0, left = 0, right = 0; + for (let i = 0; i < 6; i++) { + const span = skateTruck * Math.cos(pitch); + left = surfaceYAt(x - span, y - 2); + right = surfaceYAt(x + span, y - 2); + pitch = Math.atan2(right - left, span * 2); + } + const c = Math.cos(pitch), sn = Math.sin(pitch); + const wheelX = -sn * skateAxleDrop; + left = surfaceYAt(x - skateTruck * c + wheelX, y - 2); + right = surfaceYAt(x + skateTruck * c + wheelX, y - 2); + const deckY = Math.min(left + skateTruck * sn, right - skateTruck * sn) - + skateAxleDrop * c - skateWheelRadius; + return { pitch, y: deckY + skateAxleDrop + skateWheelRadius, + left: Math.abs(deckY - skateTruck * sn + skateAxleDrop * c + skateWheelRadius - left) < 3, + right: Math.abs(deckY + skateTruck * sn + skateAxleDrop * c + skateWheelRadius - right) < 3 }; +} + +function skateFrame(player) { + const pitch = player.skateWallSide ? Math.PI / 2 : player.skatePitch || 0; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const down = player.skateWallSide > 0 ? -1 : 1; + return (along, height = 0, across = 0) => ({ + x: player.x + c * along - sn * height * down, + y: player.y - skateAxleDrop - skateWheelRadius + sn * along + c * height * down, + z: player.z + across, + }); +} + +function resetSkate(player) { + player.skateboard = false; + player.skateVx = player.skateWallSide = player.skatePitch = 0; + player.skateSpin = player.skateRollDistance = player.skateCarveDir = 0; + player.skateContacts = 0; + player.walkSince = player.runSince = 0; +} + +function boardForRider(player) { + return balls.find(item => item.type === "skateboard" && item.riderPad === player.pad) || + balls.find(item => item.type === "skateboard" && !item.active && item.heldBy < 0 && + (item.riderPad ?? -1) < 0); +} + +function dismountSkateboard(target, now) { + if (!target.skateboard) return false; + resetSkate(target); + const board = boardForRider(target); + if (!board) return true; + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.x = target.x - target.facing * 58; + board.y = target.y - skateAxleDrop - skateWheelRadius; + board.z = target.z; + board.vx = -target.facing * 720; + board.vy = -260; + board.safeUntil = now + 260000; + board.safePlayers = 1 << target.pad; + emitSignal("skate-dismount", target.pad, 1, 0); + return true; +} + +function applyBodyHit(target, segmentIndex, sourceX, sourcePad, now, + force = 1100, lift = 150, damageParts = true) { + recordFightHit(sourcePad, false); + const direction = Math.sign(target.x - sourceX) || + (sourcePad === target.pad ? -target.facing : target.facing) || 1; + releaseCarriedBall(target, now); + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.dashUntil = 0; + target.dashVx = 0; + target.hit = Math.max(target.hit, .52); + target.hitSegment = segmentIndex; + target.hitSegmentUntil = Math.max(target.hitSegmentUntil, now + 190000); + if (dismountSkateboard(target, now)) damageParts = false; + // Balls transfer recoil but are sporting hazards, not damaging attacks. + if (damageParts) + damagePart(target, segmentIndex, sourceX, sourcePad, now); + target.hitStunUntil = Math.max(target.hitStunUntil, now + 145000); + if (isHeadOnly(target)) { + launchHead(target, sourceX, sourcePad, now, force * 1.15, + Math.max(420, lift * 2)); + } else { + target.knockVx += direction * force; + target.vx = target.knockVx + target.windVx; + target.vy = Math.min(target.vy, -lift); + } + target.grounded = false; + target.stance = "STUN"; + target.lastButton = "BODY HIT"; + target.lastButtonAt = now; + emitSignal("bodyhit", sourcePad, target.pad, segmentIndex); +} + +// `combat` is false on a watcher: the limbs still tumble, settle and draw, +// but they do not damage anybody. The fight they belong to is being decided +// on another machine, and a watcher that scored its own hits would fight the +// wire for the rest of the round. Same switch `updateBullets` already has. +function updateDetachedParts(dt, combat = true) { + const now = runtime().monotonicUs; + for (const fragment of detachedParts) { + if (fragment.heldBy >= 0) { + const carrier = players[fragment.heldBy]; + if (!carrier?.alive || carrier.heldPart !== detachedParts.indexOf(fragment)) { + fragment.heldBy = -1; + } else { + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const dx = carrier.x + carrier.facing * 112 - centerX; + const dy = carrier.y - 78 - centerY; + fragment.x1 += dx; fragment.x2 += dx; + fragment.y1 += dy; fragment.y2 += dy; + fragment.vx = fragment.vy = 0; + fragment.life = Math.max(fragment.life, 1); + continue; + } + } + fragment.vy += 1900 * dt; + const dx = fragment.vx * dt; + const dy = fragment.vy * dt; + fragment.x1 += dx; + fragment.y1 += dy; + fragment.x2 += dx; + fragment.y2 += dy; + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const angle = fragment.spin * dt; + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + for (const endpoint of [1, 2]) { + const xKey = "x" + endpoint; + const yKey = "y" + endpoint; + const localX = fragment[xKey] - centerX; + const localY = fragment[yKey] - centerY; + fragment[xKey] = centerX + localX * cosine - localY * sine; + fragment[yKey] = centerY + localX * sine + localY * cosine; + } + const bottom = Math.max(fragment.y1, fragment.y2) + fragment.width / 2; + const terrainY = terrainFloorAt(centerX); + if (bottom > terrainY) { + const correction = terrainY - bottom; + fragment.y1 += correction; + fragment.y2 += correction; + fragment.vy = -Math.abs(fragment.vy) * .42; + fragment.vx *= .82; + fragment.spin *= .78; + } + const speed = Math.hypot(fragment.vx, fragment.vy); + if (combat && speed > 650 && now >= (fragment.hitAfter || 0)) { + for (const target of players) { + if (!target.alive || target.pad === fragment.owner) continue; + const contact = runnerContactToPoint(target, + (now - startedAt) / 1000000, centerX, centerY, + (fragment.z1 + fragment.z2) / 2); + if (Math.min(contact.headDistance, contact.bodyDistance) > + fragment.width / 2 + 18) continue; + applyBodyHit(target, contact.segmentIndex, centerX, fragment.owner, + now, Math.min(1800, speed * .72), 240); + fragment.vx *= -.38; + fragment.vy = -Math.abs(fragment.vy) * .45; + fragment.hitAfter = now + 260000; + playDrum("clap", 1, panPlayer(target)); + emitSignal("part-hit", fragment.owner, target.pad, speed); + break; + } + } + // Dismembered anatomy remains a physical arena object. It can settle, + // be picked up again, thrown, and strike either fighter for the rest of + // the round rather than evaporating on a cosmetic timer. On a watcher it + // is only scenery, and scenery that never expires is a leak: the wire + // says which limbs are gone, not which pieces are still worth drawing. + if (combat) fragment.life = Math.max(fragment.life, 1); + else fragment.life -= dt; + } + for (let index = detachedParts.length - 1; index >= 0; index--) { + if (detachedParts[index].life > 0 || detachedParts[index].heldBy >= 0) continue; + detachedParts.splice(index, 1); + for (const player of players) { + if (player.heldPart === index) player.heldPart = -1; + else if (player.heldPart > index) player.heldPart--; + } + } +} + +// Comic Relief's packaged horizontal metrics, normalized from its 2048-unit +// em. Colored text is drawn glyph-by-glyph on every host, so using the font's +// real advances here keeps the web canvas and Xbox DirectWrite runs identical. +const comicAdvanceEm = { + a:.512, b:.593, c:.514, d:.587, e:.548, f:.508, g:.531, h:.578, + i:.28, j:.403, k:.54, l:.274, m:.777, n:.523, o:.526, p:.535, + q:.52, r:.48, s:.487, t:.471, u:.52, v:.486, w:.684, x:.59, + y:.521, z:.538, "0":.61, "1":.45, "2":.61, "3":.61, "4":.61, + "5":.61, "6":.61, "7":.61, "8":.61, "9":.61, "@":.931, + "!":.238, "?":.524, ".":.249, ",":.277, ":":.299, ";":.299, + "<":.381, ">":.381, "^":.581, " ":.299, "/":.512, "-":.417, + "+":.48, "∞":.837, +}; + +function comicGlyphAdvance(character, size) { + if (typeof systemWrite.measureGlyph === "function") + return systemWrite.measureGlyph(String(character).toLowerCase(), size); + return size * (comicAdvanceEm[String(character).toLowerCase()] ?? .58); +} + +function handleWidth(handle, size) { + return [...handle].reduce((width, character) => + width + comicGlyphAdvance(character, size), 0); +} + +function typeWrite(text, x, y, size, ...color) { + const visibleText = String(text).toLowerCase(); + if (typeof comicWrite === "function") comicWrite(visibleText, x, y, size, ...color); + else if (typeof ywftWrite === "function") + ywftWrite(visibleText, x, y, size, ...color); + else systemWrite(visibleText, x, y, size, ...color); +} + +function contrastShadow(color) { + const luminance = color[0] * .2126 + color[1] * .7152 + color[2] * .0722; + return luminance > 142 ? [8, 12, 24] : [232, 238, 248]; +} + +// Per-glyph contrast flips a single mid-tone letter to the opposite shadow +// while its neighbors keep theirs, which reads as a mistake rather than as +// depth. A run of type picks its direction once, from the sky behind it, and +// each shadow keeps a trace of its own glyph's hue. +function runShadow(color) { + // Match disk.mjs corner labels: the shadow is always dark, with a trace of + // the foreground hue. Dark mode must never turn a dark glyph's shadow white. + return mixColor(color, visualTheme.light > .5 ? [30, 20, 50] : [6, 4, 16], + .78); +} + +// Handle colors are authored per name and can be shorter than the name they +// dress. Cycling keeps every glyph on the same palette instead of dropping +// the tail onto a different color source. +function glyphColor(colors, index, fallback) { + return colors?.length ? colors[index % colors.length] : fallback; +} + +function controlLocale() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + const keyboard = caps.inputFamily === "keyboard"; + const touch = caps.inputFamily === "touch"; + if (touch) return { + title: "start", select: "", replayPaused: "paused", + replayPlaying: "", replay: "", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM", + }; + return keyboard ? { + title: "start", + select: "P1 A/D + SPACE P2 LEFT/RIGHT + K H P2/DUMMY/BOT G BACK", + replayPaused: "PAUSED F PLAY A D SCRUB G EXIT", + replayPlaying: "F PAUSE A D SCRUB G EXIT", + replay: "Q REPLAY", + combat: "SPACE KICK ENTER PUNCH SHIFT SHIELD ALT USE ITEM W AIR", + } : { + title: "start", + select: "LEFT RIGHT SELECT A READY X P2 / DUMMY / BOT B BACK", + replayPaused: "PAUSED A PLAY LEFT RIGHT SCRUB B EXIT", + replayPlaying: "A PAUSE LEFT RIGHT SCRUB B EXIT", + replay: "Y REPLAY", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM UP AIR", + }; +} + +// Each entry is the cap to draw, what it does, and the button that lights it, +// so the legend can show a key rather than spell one. +function combatKeys() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.inputFamily === "keyboard") return [ + [["A", "D"], "MOVE", "ArrowLeft"], [["D", "D"], ">> DASH", "ArrowRight"], + ["SPACE", "KICK", "A"], ["ENTER", "PUNCH", "B"], + ["SHIFT", "SHIELD", "X"], ["ALT", "USE ITEM", "Y"], + ["W", "AIR", "ArrowUp"]]; + if (caps.inputFamily === "touch") return [ + ["A", "KICK", "A"], ["B", "PUNCH", "B"], + ["X", "SHIELD", "X"], ["Y", "USE ITEM", "Y"]]; + return [ + [["LEFT", "RIGHT"], "MOVE", "ArrowLeft"], + [["RIGHT", "RIGHT"], ">> DASH", "ArrowRight"], + ["A", "KICK", "A"], ["B", "PUNCH", "B"], ["X", "SHIELD", "X"], + ["Y", "USE ITEM", "Y"], ["STICK_UP", "AIR", "ArrowUp"]]; +} + +// What the buttons do, named on the way into a round. B changes meaning with +// what the hand is carrying, so the legend reads the fighter rather than +// reciting a fixed map. +function combatLegendKeys(player) { + const swing = itemMelee[heldItem(player)]; + return combatKeys().map(([cap, action, button]) => + [cap, swing && action === "PUNCH" ? swing : action, button]); +} + +function combatLegend(player) { + return combatLegendKeys(player) + .map(([cap, action]) => (cap === "STICK_UP" ? "STICK" : cap) + + " " + action).join(" "); +} + +function selectionControlKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + [["A", "D"], "SELECT", "ArrowLeft"], ["SPACE", "READY", "A"], + ["SHIFT", "OPPONENT", "X"], ["ENTER", "BACK", "B"]]; + return [[["LEFT", "RIGHT"], "SELECT", "ArrowLeft"], ["A", "READY", "A"], + ["X", "OPPONENT", "X"], ["B", "BACK", "B"]]; +} + +function replayControlKeys(paused) { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + ["F", paused ? "PLAY" : "PAUSE", "A"], + [["A", "D"], "SCRUB", "ArrowLeft"], ["G", "EXIT", "B"]]; + return [["A", paused ? "PLAY" : "PAUSE", "A"], + [["LEFT", "RIGHT"], "SCRUB", "ArrowLeft"], ["B", "EXIT", "B"]]; +} + +function replayOfferKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + return family === "keyboard" ? [["Q", "REPLAY", "Y"]] + : [["Y", "REPLAY", "Y"]]; +} + +// A key drawn as a key: a gray cap with a line around it, sunk and brightened +// while it is actually held. +// `fade` is how present the cap is: 1 draws it, 0 dissolves it into the stage +// behind. The legend always passes 1; only the command stream ages its caps +// out, and it needs the whole cap to go — face, edge and letter together. +// A controller button drawn as a controller button: the letter in its Xbox +// color on a dark disc with a colored rim; pressed inverts to a filled disc. +// Directions are the same disc with an arrow glyph in neutral ink. Keyboard +// input keeps its keycaps; every other family gets these. +const padButtonInk = { + A: [96, 200, 80], B: [235, 78, 78], X: [86, 148, 235], Y: [240, 198, 60], + // The M30's face wears its own colorway — green A, yellow B, blue C, all + // three top-row buttons gray — which is NOT the Xbox palette above, so the + // cluster keys its own inks rather than borrowing the Xbox letters'. + M30A: [96, 200, 80], M30B: [240, 198, 60], M30C: [86, 148, 235], + M30X: [168, 176, 190], M30Y: [168, 176, 190], M30Z: [168, 176, 190], + M30S: [235, 78, 78], +}; +const padGlyph = { UP: "↑", DOWN: "↓", LEFT: "←", RIGHT: "→" }; +const padButtonDiameter = (size) => Math.round(size * .78) * 2; +function drawPadButton(label, x, y, size, pressed, fade = 1, display = null) { + const radius = Math.round(size * .78); + if (fade <= .01) return radius * 2; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const ink = padButtonInk[label] || mixColor([148, 158, 178], [96, 104, 124], + visualTheme.light); + // Filled like the real thing: the color IS the button. Held brightens it + // and rims it white; the glyph stays dark and dead-center either way. + const face = pressed ? mixColor(ink, [255, 255, 255], .3) : ink; + const cx = x + radius; + const cy = y + Math.round(size * .75); + filledDisc(cx, cy, radius, veil(face)); + if (pressed) filledRing(cx, cy, radius, radius - 3, veil([245, 248, 255])); + const text = display ?? (padGlyph[label] || label).toUpperCase(); + const glyphSize = Math.round(size * .82); + if (label === "STICK_UP" || label === "DOWN" || + label === "LEFT" || label === "RIGHT") { + const arrowInk = veil([12, 14, 26]); + const thickness = Math.max(2, Math.round(radius * .11)); + const dx = label === "LEFT" ? -1 : label === "RIGHT" ? 1 : 0; + const dy = label === "STICK_UP" ? -1 : label === "DOWN" ? 1 : 0; + const tipX = cx + dx * radius * .42; + const tipY = cy + dy * radius * .42; + const tailX = cx - dx * radius * .4; + const tailY = cy - dy * radius * .4; + const perpendicularX = -dy * radius * .32; + const perpendicularY = dx * radius * .32; + const wingX = tipX - dx * radius * .34; + const wingY = tipY - dy * radius * .34; + filledCapsule(tailX, tailY, tipX, tipY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX + perpendicularX, + wingY + perpendicularY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX - perpendicularX, + wingY - perpendicularY, thickness, arrowInk); + return radius * 2; + } + const glyphX = Math.round(cx - handleWidth(text, glyphSize) / 2); + // DirectWrite's cap shapes carry more visual weight below their nominal + // midpoint. Lift the Xbox face letters together so A/B/X/Y read centered in + // the colored hardware circles rather than sitting on their lower halves. + const glyphY = Math.round(cy - glyphSize * (padButtonInk[label] ? .56 : .5)); + if (padButtonInk[label] || Object.hasOwn(padGlyph, label) || + /^[KPSI<>^v]$/.test(text)) + systemWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + else typeWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + return radius * 2; +} + +function drawKeycap(label, x, y, size, pressed, fade = 1) { + const padX = Math.round(size * .42); + const height = Math.round(size * 1.5); + const width = handleWidth(label, size) + padX * 2; + if (fade <= .01) return width; + const drop = pressed ? 2 : 0; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const face = veil(pressed + ? mixColor([96, 104, 126], [206, 214, 232], visualTheme.light) + : mixColor([44, 50, 66], [176, 184, 202], visualTheme.light)); + const edge = veil(pressed + ? mixColor([210, 220, 240], [40, 46, 62], visualTheme.light) + : mixColor([112, 122, 146], [96, 104, 124], visualTheme.light)); + if (!pressed) + hudBox(x + 2, y + 4, width, height, ...veil(mixColor([6, 8, 18], [92, 99, 112], + visualTheme.light * .7))); + hudBox(x, y + drop, width, height, ...face); + strokeBox(x, y + drop, width, height, 2, edge); + typeWrite(label, x + padX, y + drop + Math.round((height - size) / 2), size, + ...veil(pressed ? [12, 14, 26] : [238, 242, 252])); + return width; +} + +// `controllers()` walks the whole pad list and the legend asks every painted +// frame, so the name check breathes once a second instead. +let m30CheckAt = 0; +let m30Present = false; +function m30Seated() { + const now = runtime().monotonicUs; + if (now >= m30CheckAt) { + m30CheckAt = now + 1000000; + m30Present = typeof controllers === "function" && + (controllers() || []).some((pad) => /8bitdo\s+m30/i.test(pad?.name || "")); + } + return m30Present; +} + +// The M30 folds two extra moves into its Sega face: C and the top-edge R +// reach the game as the trigger pair, Z and the top-edge L as the shoulders — +// the pad's factory Xbox map wearing Sega names. Which trigger C sends was +// read off the live hardware, not the leaflet; flip this table if 8BitDo's +// firmware ever swaps the pair. +const m30FaceSends = { C: "RightTrigger", Z: "RightShoulder" }; +const m30SendLabel = { RightTrigger: "SHIELD", RightShoulder: "USE ITEM", + LeftTrigger: "KICK", LeftShoulder: "USE ITEM" }; + +// The M30's own manual page, drawn from the device itself: the white +// dogbone body with red L/R nubs over its shoulders, the dark cross on its +// round base, the red start pill, and the two button arcs climbing to the +// right — gray X/Y/Z small on top, green A / yellow B / blue C big below, +// the bottom row shifted toward the thumb. Proportions transcribed from +// 8BitDo's top-down of the M30 2.4G (white), the unit in @jeffrey's hand. +// Every drawn control lights with the live press, so the mapping is not a +// diagram of faith: plug in, press, and the page answers. +function drawM30Cluster(x, y, size, held, directionActive, ink) { + const small = Math.round(size * .58); + const d = padButtonDiameter(size); + const light = visualTheme.light; + const lobeR = Math.round(d * 1.62); + const bodyMidY = y + Math.round(d * .3) + lobeR; + const leftLobeX = x + lobeR; + const rightLobeX = x + Math.round(d * 7.5) - lobeR; + const plastic = mixColor([176, 182, 194], [246, 248, 251], light); + const print = mixColor([92, 98, 112], [118, 124, 138], light); + // Shoulder nubs first, so the body covers their roots. + const nub = mixColor([196, 44, 58], [206, 48, 62], light); + filledCapsule(leftLobeX - d, bodyMidY - lobeR, leftLobeX + Math.round(d * .2), + bodyMidY - lobeR, Math.round(d * .4), nub); + filledCapsule(rightLobeX - Math.round(d * .2), bodyMidY - lobeR, + rightLobeX + d, bodyMidY - lobeR, Math.round(d * .4), nub); + filledDisc(leftLobeX, bodyMidY, lobeR, plastic); + filledDisc(rightLobeX, bodyMidY, lobeR, plastic); + filledCapsule(leftLobeX, bodyMidY, rightLobeX, bodyMidY, + Math.round(lobeR * 1.7), plastic); + // The silkscreen wordmark rides the body's top center. + const markSize = Math.round(small * .9); + typeWrite("8BITDO M30", Math.round((leftLobeX + rightLobeX) / 2 - + handleWidth("8BITDO M30", markSize) / 2), + bodyMidY - lobeR + Math.round(d * .1), markSize, ...print); + // D-pad: the dark cross on its round base, each arm lighting alone. + const dpadBase = mixColor([44, 48, 60], [58, 62, 74], light); + filledDisc(leftLobeX, bodyMidY, Math.round(d * 1.02), dpadBase); + const crossInk = mixColor([24, 27, 36], [32, 35, 44], light); + const armLen = Math.round(d * .8); + const armWidth = Math.round(d * .5); + const arms = [["ArrowUp", 0, -1], ["ArrowDown", 0, 1], + ["ArrowLeft", -1, 0], ["ArrowRight", 1, 0]]; + for (const [button, dx, dy] of arms) + filledCapsule(leftLobeX, bodyMidY, leftLobeX + dx * armLen, + bodyMidY + dy * armLen, armWidth, directionActive(button) + ? mixColor(crossInk, [245, 248, 255], .5) : crossInk); + filledDisc(leftLobeX, bodyMidY, Math.max(2, Math.round(d * .14)), + mixColor([16, 18, 26], [22, 24, 32], light)); + // START — the red pill mid-body, its name silkscreened beneath, with the + // 2.4G's three tiny extras below. Pressed wears the discs' white rim. + const startPressed = held.includes("Menu"); + const midX = Math.round((leftLobeX + rightLobeX) / 2); + const pillHalf = Math.round(size * .5); + const pillY = bodyMidY - Math.round(d * .28); + if (startPressed) filledCapsule(midX - pillHalf, pillY, midX + pillHalf, + pillY, Math.round(size * .44) + 4, [245, 248, 255]); + filledCapsule(midX - pillHalf, pillY, midX + pillHalf, pillY, + Math.round(size * .44), startPressed + ? mixColor(padButtonInk.M30S, [255, 255, 255], .3) : padButtonInk.M30S); + const startLabelSize = Math.round(small * .8); + typeWrite("START", Math.round(midX - handleWidth("START", startLabelSize) / 2), + pillY + Math.round(size * .32), startLabelSize, ...print); + for (let dot = 0; dot < 3; dot++) + filledDisc(midX + (dot - 1) * Math.round(d * .42), + pillY + Math.round(d * .85), Math.max(2, Math.round(d * .09)), print); + // The face arcs climb to the right like the hardware; the top row runs + // smaller and the bottom row leans into the thumb. + const pitch = Math.round(d * 1.05); + const drop = Math.round(d * .3); + const smallFace = Math.round(size * .82); + const disc = (key, cap, cx, cy, buttonSize, pressed) => + drawPadButton(key, cx - Math.round(buttonSize * .78), + cy - Math.round(buttonSize * .75), buttonSize, pressed, 1, cap); + const face = [ + ["M30X", "X", 0, 0, smallFace, held.includes("X")], + ["M30Y", "Y", 1, 0, smallFace, held.includes("Y")], + ["M30Z", "Z", 2, 0, smallFace, held.includes(m30FaceSends.Z)], + ["M30A", "A", 0, 1, size, held.includes("A")], + ["M30B", "B", 1, 1, size, held.includes("B")], + ["M30C", "C", 2, 1, size, held.includes(m30FaceSends.C)], + ]; + for (const [key, cap, column, row, buttonSize, pressed] of face) + disc(key, cap, + rightLobeX + Math.round((column - 1) * pitch - d * .35) + + (row ? Math.round(d * .34) : 0), + bodyMidY - Math.round(d * .8) + (2 - column) * drop + + (row ? Math.round(d * .92) : 0), + buttonSize, pressed); + let rowY = bodyMidY + lobeR + Math.round(small * 1.2); + const captions = [ + `A KICK B PUNCH C ${m30SendLabel[m30FaceSends.C]}`, + `X SHIELD Y USE ITEM Z ${m30SendLabel[m30FaceSends.Z]}`, + `L ${m30SendLabel.LeftShoulder} R ${m30SendLabel.LeftTrigger}`, + "A+B GRAB START PAUSE", + ]; + for (const caption of captions) { + typeWrite(caption, x, rowY, small, ...ink); + rowY += Math.round(small * 1.55); + } + return rowY + Math.round(small * .6); +} + +// Lifted clear of the bottom edge, because the signed-in handle and its +// logout button now sit in that corner and the legend used to run straight +// through them on a narrow view. +function drawControlLegend(ink) { + const device = typeof capabilities === "function" ? capabilities() : {}; + if (device.showControlLegend === false || device.inputFamily === "touch") return; + const safe = hudSafeRect(); + const pad = localPad(); + const held = pad.down || []; + const directionActive = (button) => held.includes(button) || + (button === "ArrowLeft" && pad.leftX < -.12) || + (button === "ArrowRight" && pad.leftX > .12) || + (button === "ArrowUp" && pad.leftY > .12) || + (button === "ArrowDown" && pad.leftY < -.12); + const size = compactLayout() ? 18 : 24; + const x = safe.left + 8; + const both = held.includes("A") && held.includes("B"); + const legendFighter = players[localSeat()]; + const dash = legendFighter.lastButton === "DASH" && + runtime().monotonicUs - legendFighter.lastButtonAt < 700000; + const controls = [ + ["LEFT", "ArrowLeft", "MOVE"], + ["RIGHT", "ArrowRight", dash ? "DASH >>" : "MOVE"], + ["STICK_UP", "ArrowUp", "AIR"], + ["DOWN", "ArrowDown", "CROUCH"], + ["A", "A", both ? "GRAB" : "KICK"], + ["B", "B", both ? "GRAB" : itemMelee[heldItem(legendFighter)] || "PUNCH"], + ["X", "X", "SHIELD"], + ["Y", "Y", "USE ITEM"], + ]; + if (survivalActive()) controls.length = 4; + const keyboard = keycapFamily(); + // A seated M30 trades the whole legend column for the pad's own manual + // page — the drawn controller carries its d-pad, so no rows remain. + const m30 = device.showControllerDiagram !== false && + !keyboard && !survivalActive() && m30Seated(); + if (m30) controls.length = 0; + const keyboardCap = { LEFT: "A", RIGHT: "D", STICK_UP: "W", DOWN: "S", + A: "SPACE", B: "ENTER", X: "SHIFT", Y: "ALT" }; + const step = Math.round(size * 1.82); + for (const [row, [cap, button, action]] of controls.entries()) { + const y = safe.top + row * step; + const width = keyboard + ? drawKeycap(keyboardCap[cap] || cap, + x, y, size, + directionActive(button)) + : drawPadButton(cap, x, y, size, + button.startsWith("Arrow") ? directionActive(button) : held.includes(button)); + if (action) { + const labelX = x + width + 10, labelY = y + Math.round(size * .25); + typeWrite(action, labelX + 2, labelY + 3, size, ...contrastShadow(ink)); + typeWrite(action, labelX, labelY, size, ...ink); + } + } + let legendBottom = safe.top + controls.length * step; + if (m30) legendBottom = drawM30Cluster(x, legendBottom, size, held, + directionActive, ink); + drawStickGate(x, legendBottom, size, pad, ink); +} + +// The legend named the stick's directions but never its ANGLE, so a fighter +// walking on a half-tilted stick looked identical to one at full lean, and +// the camera stick had no read-out at all. Only drawn while a stick is off +// center: an always-present gate would be one more permanently-lit widget in +// a corner that is already busy. +function drawStickGate(x, y, size, pad, ink) { + const gate = (label, dx, dy, column) => { + const radius = Math.round(size * .82); + const cx = x + radius + column * Math.round(radius * 2.6); + const cy = y + radius; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + // The gate ring is drawn as a disc under a smaller ground-colored disc: + // filledDisc is the only circle primitive the piece owns, and two of them + // cost less than an arc walked out of line segments. + filledDisc(cx, cy, radius, idle); + filledDisc(cx, cy, radius - 3, + mixColor([7, 8, 28], [230, 239, 247], visualTheme.light)); + // Screen y grows downward while the pad reports up as positive. + const knobX = cx + dx * (radius - 5); + const knobY = cy - dy * (radius - 5); + filledDisc(knobX, knobY, Math.max(3, Math.round(size * .26)), ink); + typeWrite(label, cx - radius, cy + radius + 2, + Math.round(size * .62), ...ink); + }; + const live = (dx, dy) => Math.abs(dx) > .12 || Math.abs(dy) > .12; + const leftX = Number(pad.leftX) || 0; + const leftY = Number(pad.leftY) || 0; + const rightX = Number(pad.rightX) || 0; + const rightY = Number(pad.rightY) || 0; + let column = 0; + if (live(leftX, leftY)) gate("move", leftX, leftY, column++); + if (live(rightX, rightY)) gate("cam", rightX, rightY, column++); +} + +const controlRailWidth = () => compactLayout() ? 138 : 188; + +// Touch is part of the game surface, not a DOM overlay. One drawn d-pad and +// four action discs share the exact centers used by mac-test's canvas hit zones. +function drawTouchControls() { + if (typeof capabilities !== "function" || + capabilities().inputFamily !== "touch" || capabilities().socialPreview) + return; + const held = localPad().down || []; + const spread = 64; + // The clusters stand clear of the home indicator and any notch ear; the + // shell's touchKeyAt mirrors this arithmetic, so a shift here must land + // there too or the drawing and the hit test come apart. + const cy = viewHeight - 140 - viewInset.bottom; + const dpadX = 130 + viewInset.left; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + const live = mixColor([110, 220, 150], [38, 128, 88], visualTheme.light); + const arm = 38; + const thick = 18; + const directions = [[0, -1, "ArrowUp"], [0, 1, "ArrowDown"], + [-1, 0, "ArrowLeft"], [1, 0, "ArrowRight"]]; + for (const [dx, dy, key] of directions) + filledCapsule(dpadX + dx * 8, cy + dy * 8, + dpadX + dx * arm, cy + dy * arm, thick, + held.includes(key) ? live : idle); + filledDisc(dpadX, cy, thick, held.some((key) => key.startsWith("Arrow")) + ? live : idle); + const actionX = viewWidth() - 130 - viewInset.right; + const commandGlyph = { A: "/", B: "*", X: ")", Y: "+" }; + for (const [dx, dy, key] of [[0, -1, "Y"], [0, 1, "A"], + [-1, 0, "X"], [1, 0, "B"]]) + drawPadButton(key, actionX + dx * spread - 27, + cy + dy * spread - 25, 35, held.includes(key), 1, commandGlyph[key]); +} + +function keycapRunWidth(entries, size) { + const keyboard = keycapFamily(); + const padX = Math.round(size * .42); + const capWidth = (label) => keyboard + ? handleWidth(label, size) + padX * 2 : padButtonDiameter(size); + return entries.reduce((total, [cap, action]) => + total + (Array.isArray(cap) ? cap : [cap]).reduce((width, label, index) => + width + capWidth(label) + (index ? 5 : 0), 0) + 8 + + handleWidth(action, size) + 26, 0) - 26; +} + +// Keyboard reads as keycaps; every other family reads as controller discs. +const keycapFamily = () => (typeof capabilities === "function" + ? String(capabilities().inputFamily || "") : "") === "keyboard"; + +function drawKeycapRun(entries, x, y, size, held, ink, revealAction = null) { + const keyboard = keycapFamily(); + let cursor = x; + for (const [cap, action, button] of entries) { + for (const [index, label] of (Array.isArray(cap) ? cap : [cap]).entries()) { + if (index) cursor += 5; + cursor += keyboard + ? drawKeycap(label, cursor, y, size, held.includes(button)) + : drawPadButton(label, cursor, y, size, held.includes(button)); + } + cursor += 8; + if (!revealAction || revealAction([cap, action, button])) + typeWrite(action, cursor, y + Math.round(size * .25), size, ...ink); + cursor += handleWidth(action, size) + 26; + } + return cursor; +} + +function drawCenteredKeycapRun(entries, y, size, held, ink) { + if (!entries.length) return; + drawKeycapRun(entries, viewCenterX() - keycapRunWidth(entries, size) / 2, + y, size, held, ink); +} + +function drawHandle(handle, x, y, size, colors, fallback) { + let cursor = x; + const characters = [...String(handle)]; + for (let index = 0; index < characters.length; index++) { + typeWrite(characters[index], cursor, y, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(characters[index], size); + } +} + +function drawFace(player, head, color, t, now = runtime().monotonicUs) { + if (photoThemeActive) color = [20, 12, 26]; + if (head.radius < 5) return; + const bodyDepth = triangleDepth; + triangleDepth = bodyDepth - .012; + const r = head.radius; + const direction = player.facing || 1; + // The whole face turns with a rolling head. Every feature below is placed + // in flat face-space and spun around the head's center on the way to the + // canvas — eyes, mouth, hair, tears, hearts, all of it — instead of the old + // look where the head traveled and the face stayed nailed upright. + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const spin = (x, y) => roll === 0 ? { x, y } : { + x: head.x + (x - head.x) * cosRoll - (y - head.y) * sinRoll, + y: head.y + (x - head.x) * sinRoll + (y - head.y) * cosRoll }; + const stroke = (x1, y1, x2, y2, width, ink = color) => { + const a = spin(x1, y1), b = spin(x2, y2); + filledCapsule(a.x, a.y, b.x, b.y, width, ink); + }; + const ring = (x, y, ringRadius, thickness, ink) => { + const point = spin(x, y); + filledRing(point.x, point.y, ringRadius, thickness, ink); + }; + const disc = (x, y, discRadius, ink) => { + const point = spin(x, y); + filledDisc(point.x, point.y, discRadius, ink); + }; + const glyph = (text, x, y, size, ...ink) => { + const point = spin(x, y); + systemWrite(text, point.x, point.y, size, ...ink); + }; + const celebrating = ["DANCE", "LAUGH", "POSE", "WIGGLE"] + .includes(player.resultReaction); + const grieving = ["CRY", "WOE", "SULK"].includes(player.resultReaction); + if (player.name === "@FIFI") { + const hair = visualTheme.light > .55 ? [105, 38, 116] : [245, 118, 230]; + const sway = Math.sin(t * 2.2 + player.pad) * r * .08; + const width = Math.max(2, r * .13); + stroke(head.x - r * .72, head.y - r * .48, + head.x - r * .32, head.y - r * .9, width, hair); + stroke(head.x - r * .32, head.y - r * .9, + head.x + r * .35, head.y - r * .88, width, hair); + stroke(head.x + r * .35, head.y - r * .88, + head.x + r * .76, head.y - r * .38, width, hair); + stroke(head.x - r * .76, head.y - r * .38, + head.x - r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x + r * .76, head.y - r * .38, + head.x + r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x - r * .48, head.y - r * .46, + head.x - r * .08, head.y - r * .18, width * .72, hair); + stroke(head.x - r * .08, head.y - r * .18, + head.x + r * .42, head.y - r * .5, width * .72, hair); + } + const eyeY = head.y - r * (photoThemeActive ? .07 : .18); + const eyeGap = r * (photoThemeActive ? .30 : .34); + const faceX = head.x + direction * r * (photoThemeActive ? .22 : .08); + const eyeWidth = Math.max(1.4, r * (photoThemeActive ? .125 : .1)); + const lineWidth = Math.max(1.2, r * .1); + const blink = player.alive && !player.blocking && !player.attackKind && + Math.sin(t * .73 + player.pad * 2.1) > .985; + const spitAge = now - (player.spitAt || -Infinity); + const spitting = isHeadOnly(player) && spitAge >= 0 && spitAge < 190000; + const inertDummy = player.npc && !player.bot; + const victoryAmount = deathCinematic?.winnerPad === player.pad + ? clamp(deathCinematicAge(now) / 1.15, 0, 1) : 0; + if (photoThemeActive) { + // Cover the photographed eyes completely before drawing live gaze and + // expressions. Closed lids are opaque, including the baked pupils. + const socket = blink ? (player.pad === 0 ? [135,101,190] : [115,162,53]) : [237,234,221]; + for (const offset of [-eyeGap,eyeGap]) disc(faceX+offset,eyeY,r*.315,socket); + } + if (!player.alive || player.hit > .6 || inertDummy) { + for (const offset of [-eyeGap, eyeGap]) { + stroke(faceX + offset - eyeWidth, eyeY - eyeWidth, + faceX + offset + eyeWidth, eyeY + eyeWidth, lineWidth); + stroke(faceX + offset + eyeWidth, eyeY - eyeWidth, + faceX + offset - eyeWidth, eyeY + eyeWidth, lineWidth); + } + } else if (spitting) { + // The release reads on the face before the glob clears it: both eyes + // squeeze inward for the same short beat as the pursed lips below. + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset - eyeWidth * 1.35, + eyeY + (offset < 0 ? -1 : 1) * r * .035, + faceX + offset + eyeWidth * 1.35, + eyeY + (offset < 0 ? 1 : -1) * r * .035, + lineWidth * 1.15); + } else if (blink) { + stroke(faceX - eyeGap - eyeWidth, eyeY, faceX - eyeGap + eyeWidth, + eyeY, lineWidth); + stroke(faceX + eyeGap - eyeWidth, eyeY, faceX + eyeGap + eyeWidth, + eyeY, lineWidth); + } else { + const pad = inputPads[player.pad] || {}; + const rawX = Number(pad.leftX) || 0; + const rawY = Number(pad.leftY) || 0; + const movementDeadzone = .48; + const gazeNoiseFloor = .015; + const digitalX = (pad.down || []).includes("ArrowRight") ? 1 + : (pad.down || []).includes("ArrowLeft") ? -1 : 0; + const digitalY = (pad.down || []).includes("ArrowUp") ? 1 + : (pad.down || []).includes("ArrowDown") ? -1 : 0; + const rawMagnitude = Math.hypot(rawX, rawY); + const gazeAmount = rawMagnitude <= gazeNoiseFloor ? 0 + : clamp((rawMagnitude - gazeNoiseFloor) / + (movementDeadzone - gazeNoiseFloor), 0, 1); + const defeated = victoryAmount > 0 + ? players[deathCinematic.loserPad] : null; + const lookX = defeated + ? Math.sign(defeated.x - player.x) || direction + : digitalX || lerp(direction * .2, rawX, gazeAmount); + const lookY = defeated + ? clamp((player.y - defeated.y) / 180, -1, 1) + : digitalY || lerp(0, rawY, gazeAmount); + const pupilX = clamp(lookX, -1, 1) * eyeWidth * 1.05; + const pupilY = clamp(-lookY, -1, 1) * eyeWidth * 1.05; + const socketRadius = eyeWidth * 2.35; + const pupilRadius = eyeWidth * .9; + const socketInk = [246, 248, 244]; + const pupilInk = [8, 12, 24]; + for (const offset of [-eyeGap, eyeGap]) { + disc(faceX + offset, eyeY, socketRadius, socketInk); + triangleDepth = bodyDepth - .02; + disc(faceX + offset + pupilX, eyeY + pupilY, + pupilRadius, pupilInk); + triangleDepth = bodyDepth - .012; + } + } + if (player.bot && player.alive && !player.blocking) { + const browY = eyeY - r * .32; + stroke(faceX - eyeGap - eyeWidth * 1.25, browY - r * .08, + faceX - eyeGap + eyeWidth * 1.25, browY + r * .1, + lineWidth * 1.15); + stroke(faceX + eyeGap - eyeWidth * 1.25, browY + r * .1, + faceX + eyeGap + eyeWidth * 1.25, browY - r * .08, + lineWidth * 1.15); + } + if (grieving) { + const tear = [112, 208, 255]; + const fall = (t * 34) % Math.max(3, r * .55); + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset, eyeY + eyeWidth * 1.5, + faceX + offset, eyeY + eyeWidth * 1.5 + r * .34 + fall, + Math.max(1.5, lineWidth * .72), tear); + } + const mouthY = head.y + r * .3; + if (spitting) { + const release = 1 - clamp(spitAge / 190000, 0, 1); + const lip = player.spitHeavy ? [226, 58, 126] : [232, 92, 132]; + // faceX already carries .08r of facing offset; another .12r makes this + // exactly the .20r face-space mouth used by spitMouthPose(). + ring(faceX + direction * r * .12, mouthY, + r * (.105 + release * .055), Math.max(.7, r * .055), lip); + } else if (player.resultReaction === "LAUGH") { + const age = Math.max(0, (now - player.resultReactionAt) / 1000000); + const open = .35 + Math.abs(Math.sin(age * 18)) * .65; + ring(faceX + direction * r * .08, mouthY, + r * (.12 + open * .1), r * .045, color); + for (let index = 0; index < 3; index++) { + const noteAge = (age * .72 + index * .27) % 1; + const note = index % 2 ? "♫" : "♪"; + glyph(note, + faceX + direction * r * (.34 + noteAge * 1.25) + index * direction * 3, + mouthY - r * (.25 + noteAge * 1.75), + Math.max(8, r * (.55 - noteAge * .16)), ...color); + } + } else if (celebrating || victoryAmount > 0) { + const grin = r * (.09 + victoryAmount * .2); + const width = r * (.23 + victoryAmount * .12); + stroke(faceX - width, mouthY - grin * .18, faceX, + mouthY + grin, lineWidth); + stroke(faceX, mouthY + grin, faceX + width, + mouthY - grin * .18, lineWidth); + // Hearts off a winner, on the laugh notes' trick: a few glyphs on + // staggered loops. A reel carries no HUD to announce the win, so the + // celebration has to be legible on the face itself. + if (victoryAmount > 0) { + const age = deathCinematicAge(now); + for (let index = 0; index < 3; index++) { + const rise = (age * .6 + index * .34) % 1; + const drift = Math.sin(age * 2.2 + index * 2.4) * r * .22; + glyph("♥", + faceX + drift + (index - 1) * r * .42, + mouthY - r * (.95 + rise * 2.1), + Math.max(7, r * (.46 - rise * .17) * victoryAmount), + 255, 96 + index * 22, 148); + } + } + } else if (player.attackKind && meleePulse(player, now) > 0) { + ring(faceX + direction * r * .12, mouthY, + Math.max(1.8, r * .13), Math.max(.4, r * .05), color); + } else if (player.blocking) { + stroke(faceX - r * .26, mouthY, faceX + r * .26, mouthY, lineWidth); + } else if (grieving || !player.alive || player.hit > .6) { + stroke(faceX - r * .24, mouthY + r * .08, faceX, + mouthY - r * .06, lineWidth); + stroke(faceX, mouthY - r * .06, faceX + r * .24, + mouthY + r * .08, lineWidth); + } else { + const smile = Math.sin(t * 2.4 + player.pad) * r * .035; + stroke(faceX - r * .23, mouthY - smile, faceX, + mouthY + r * .09, lineWidth); + stroke(faceX, mouthY + r * .09, faceX + r * .23, + mouthY - smile, lineWidth); + } + triangleDepth = bodyDepth; +} + +function drawInventory(player, now, geometry) { + // A bodyless head carries nothing visible. The sword rode a phantom + // forearm and read as a dark clock hand sweeping through the rolled face — + // steel that never turned with the head it was stuck to. The head keeps its + // items and can still fire; it just doesn't brandish them. + if (isHeadOnly(player)) return; + const scale = cameraScale(); + const gunColor = player.gunMode === "ROCKET LAUNCHER" ? [48, 61, 52] + : player.gunMode === "RUBBER SMG" ? [38, 53, 72] + : player.gunMode === "SPACE LASER" ? [58, 92, 122] : [63, 43, 76]; + const grenadeColor = [255, 105, 105]; + const firing = player.itemAction === "FIRE" && now < player.itemActionUntil; + const throwing = player.itemAction === "THROW" && now < player.itemActionUntil; + // A bash keeps the grenade visible in the fist; itemHandTarget already + // parks both weapons on the swinging hand. + const bashing = player.attackKind === "BASH" && itemSwinging(player, now); + if (player.swordHeld && player.gunAmmo <= 0 && !throwing && + hasPart(player, itemHand(player))) { + // The hilt pins to the hand the silhouette actually draws — the far end + // of the item arm's forearm capsule — and the blade lies along that + // forearm, so grip and angle ride the limb through idle sway, stride, + // whips, freezes, and replays. The gun's aim pose floated here: with no + // ammo the arm never presents, leaving steel mid-air at a fixed angle. + const limbs = geometry.segments; + const forearm = limbs.find((segment) => segment.role === "item-forearm" || + segment.role === "attack-forearm") || + limbs.find((segment) => segment.role?.endsWith("forearm") && + segment.part === itemHand(player)) || + limbs.find((segment) => segment.role?.endsWith("forearm")); + if (forearm) { + const hand = { x: forearm.x2, y: forearm.y2 }; + const alongX = hand.x - forearm.x1; + // A hanging arm would drive the tip into the dirt, so the fist rolls + // the blade skyward at rest; swings still lay steel along the striking + // forearm because melee targets sit at shoulder height. + const alongY = -Math.abs(hand.y - forearm.y1); + const length = Math.hypot(alongX, alongY) || 1; + const tipX = hand.x + alongX / length * 118 * scale; + const tipY = hand.y + alongY / length * 118 * scale; + const acrossX = -alongY / length; + const acrossY = alongX / length; + // Steel became light. Three passes down the same line — a wide halo in + // the fighter's OWN color, then a narrower saturated sheath, then a + // white core — because a blade drawn in one flat tone reads as a stick, + // and because in a versus round the two blades then say which fighter + // is which from across the map, the way the handle colors already do. + // The hum lives in the halo's width: it breathes on the same clock the + // pickups bob on, so a held saber is never a still object. + const hum = 1 + .12 * Math.sin(now / 82000); + const halo = mixColor(player.color, [14, 20, 36], .35); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(4, 13 * scale * hum), halo); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(3, 8 * scale), player.color); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(1.5, 3.5 * scale), [244, 252, 255]); + // The hilt stays machined and dark: it is the one part of a saber that + // is an object, and it is what keeps the blade from reading as a beam + // fired out of a bare fist. + filledCapsule(hand.x + acrossX * 11 * scale, hand.y + acrossY * 11 * scale, + hand.x - acrossX * 11 * scale, hand.y - acrossY * 11 * scale, + Math.max(2, 5 * scale), [148, 156, 172]); + filledCapsule(hand.x, hand.y, + hand.x - alongX / length * 18 * scale, + hand.y - alongY / length * 18 * scale, + Math.max(2, 6 * scale), [34, 30, 40]); + } + } + if ((player.gunAmmo > 0 || firing) && !throwing) { + const forearm = itemForearm(player, geometry); + if (!forearm) return; + const pose = gunPose(player, now); + const projectedHand = projectPoint(pose.hand.x, pose.hand.y, pose.hand.z); + // Render reactions and replay poses may move the drawn skeleton after + // projection. Its actual wrist remains the final attachment point. + const hand = {x:forearm.x2, y:forearm.y2}; + const offsetX = hand.x - projectedHand.x, offsetY = hand.y - projectedHand.y; + const projectWeapon = (x, y, z) => { + const point = projectPoint(x, y, z); + return {x:point.x + offsetX, y:point.y + offsetY}; + }; + const barrel = projectWeapon(pose.muzzle.x, pose.muzzle.y, pose.muzzle.z); + const barrelWidth = Math.max(3, 9 * scale); + const gripWidth = Math.max(2, 6 * scale); + // Xbox batches its native line layer underneath GPU fighter triangles. + // Held items therefore use the same depth-aware capsule path as the hand. + if (photoThemeActive) { + // Place the photograph's grip at the solved wrist. Reflect its local X + // before rotation so aiming left does not turn the grip upside down. + const dx = barrel.x - hand.x, dy = barrel.y - hand.y; + const length = Math.hypot(dx, dy) || 1; + const flip = player.facing < 0; + const width = Math.max(18, length / .72), height = width * 253 / 365; + const angle = Math.atan2(dy, dx) - (flip ? Math.PI : 0); + const ox = (flip ? -1 : 1) * width * .25, oy = -height * .1; + const c = Math.cos(angle), s = Math.sin(angle); + if (!drawPhotoHeldWeapon(player.gunMode,hand,barrel,flip,triangleDepth-.025)) + photoSprite("gun", hand.x + ox*c - oy*s, hand.y + ox*s + oy*c, + width, height, angle, flip, triangleDepth - .025); + } else { + filledCapsule(hand.x, hand.y, barrel.x, barrel.y, + barrelWidth, gunColor); + const gripX = hand.x - player.facing * 8 * scale; + const gripY = hand.y + 20 * scale; + filledCapsule(hand.x, hand.y, gripX, gripY, gripWidth, gunColor); + if (player.gunMode === "RUBBER SMG") { + // One uninterrupted dark silhouette: longer receiver, rear stock, and a + // forward magazine distinguish it from the short pistol in-hand. + const stockX = hand.x - pose.dx * 32 * scale; + const stockY = hand.y - pose.dy * 32 * scale; + filledCapsule(hand.x, hand.y, stockX, stockY, + barrelWidth * 1.12, gunColor); + const magazineX = hand.x + pose.dx * 18 * scale - pose.dy * 17 * scale; + const magazineY = hand.y + pose.dy * 18 * scale + pose.dx * 17 * scale; + filledCapsule(hand.x + pose.dx * 18 * scale, + hand.y + pose.dy * 18 * scale, magazineX, magazineY, + gripWidth, gunColor); + } + if (player.gunMode === "ROCKET LAUNCHER") { + const rearX = hand.x - pose.dx * 38 * scale; + const rearY = hand.y - pose.dy * 38 * scale; + filledCapsule(rearX, rearY, barrel.x, barrel.y, + barrelWidth * 1.8, gunColor); + filledDisc(barrel.x, barrel.y, barrelWidth * 1.45, [104, 62, 48]); + } + } + if (firing) { + const flashAngle=Math.atan2(barrel.y-hand.y,barrel.x-hand.x); + const flashSize=Math.max(18,54*scale); + const photoFlash=photoEffectSprite(3,photoWeaponRegions.flash, + barrel.x+Math.cos(flashAngle)*flashSize*.43, + barrel.y+Math.sin(flashAngle)*flashSize*.43, + flashSize,flashSize*.61,flashAngle,false,triangleDepth-.03,false); + if (!photoFlash) { + const normalX = -pose.dy; + const normalY = pose.dx; + const flashA = projectWeapon( + pose.muzzle.x + pose.dx * 28 + normalX * 18, + pose.muzzle.y + pose.dy * 28 + normalY * 18, pose.muzzle.z); + const flashB = projectWeapon( + pose.muzzle.x + pose.dx * 28 - normalX * 18, + pose.muzzle.y + pose.dy * 28 - normalY * 18, pose.muzzle.z); + filledCapsule(barrel.x, barrel.y, flashA.x, flashA.y, + Math.max(2, 5 * scale), [255, 248, 190]); + filledCapsule(barrel.x, barrel.y, flashB.x, flashB.y, + Math.max(2, 5 * scale), [255, 248, 190]); + } + } + } + if (throwing || bashing) { + const target = itemHandTarget(player, now); + const hand = projectPoint(target.x, target.y, target.z); + if (!photoEffectSprite(3,photoWeaponRegions.grenade,hand.x,hand.y, + Math.max(8,24*scale),Math.max(12,38*scale),0,false,triangleDepth-.03,true)) + hudCircle(hand.x, hand.y, Math.max(5, 15 * scale), + Math.max(2, 5 * scale), grenadeColor); + } +} + +function drawDigitalHeadBurst(player, headWorld, age) { + const burstAge = Math.max(0, age - .11); + const origin = projectPoint(headWorld.x, headWorld.y, headWorld.z); + if (![origin.x, origin.y, origin.z].every(Number.isFinite) || + Math.abs(origin.x) > 30000 || Math.abs(origin.y) > 30000) return; + const palette = [ + [255, 48, 96], [176, 18, 54], [255, 92, 126], + player.color, [116, 8, 38], + ]; + const directions = [-2.92, -2.61, -2.3, -2.01, -1.72, -1.43, + -1.14, -.83, -.52, -.21, .1, .41, .72, 1.03]; + for (let index = 0; index < directions.length; index++) { + const angle = directions[index] + (player.pad ? .14 : -.14); + const speed = 48 + index * 4; + const fall = 10 * burstAge + 72 * burstAge * burstAge; + for (let speck = 0; speck < 3; speck++) { + const spread = .38 + speck * .29; + const distance = (5 + speed * burstAge) * spread; + const depth = (index % 3 - 1) * (3 + burstAge * 9) * spread; + const point = projectPoint( + headWorld.x + Math.cos(angle) * distance, + headWorld.y + Math.sin(angle) * distance + fall * spread, + headWorld.z + depth); + if (![point.x, point.y, point.z].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + triangleDepth = point.z; + const pixel = clamp((2.6 - speck * .48) * cameraScale(), 1.5, 4); + screenRect(point.x - pixel / 2, point.y - pixel / 2, + pixel, pixel, palette[(index + speck) % palette.length]); + } + } + // The face becomes a small broken core rather than remaining an intact disc. + const core = Math.max(2, headWorld.radius * cameraScale() * + Math.max(.08, 1 - burstAge * 6.2)); + triangleDepth = origin.z; + for (let index = 0; index < 4; index++) { + const side = index % 2 ? 1 : -1; + const row = index < 2 ? -1 : 1; + const size = core * (.62 + index * .05); + screenRect(origin.x + side * core * .32 - size / 2, + origin.y + row * core * .3 - size / 2, size, size, + palette[index % palette.length]); + } +} + +function drawBrokenRunner(player, age) { + const world = player.frozenGeometry || + runnerWorldGeometry(player, (runtime().monotonicUs - startedAt) / 1000000); + const slow = Math.max(0, age - .11) * .32; + const gravity = 420 * slow * slow; + const outline = [8, 12, 24]; + for (let index = 0; index < world.segments.length; index++) { + const segment = world.segments[index]; + const midX = (segment.x1 + segment.x2) / 2; + const midY = (segment.y1 + segment.y2) / 2; + const side = index % 2 ? 1 : -1; + const dx = (side * (72 + index * 9) - player.facing * 34) * slow; + const dy = -(150 + index * 13) * slow + gravity; + const dz = side * (24 + index * 4) * slow; + const angle = side * slow * (1.15 + index * .08); + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + const move = (x, y, z) => { + const localX = x - midX; + const localY = y - midY; + return { x: midX + localX * cosine - localY * sine + dx, + y: midY + localX * sine + localY * cosine + dy, + z: z + dz }; + }; + const first = move(segment.x1, segment.y1, segment.z1); + const second = move(segment.x2, segment.y2, segment.z2); + const a = projectPoint(first.x, first.y, first.z); + const b = projectPoint(second.x, second.y, second.z); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite) || + [a.x, a.y, b.x, b.y].some((value) => Math.abs(value) > 30000)) + continue; + triangleDepth = projectPoint(midX + dx, midY + dy, + (segment.z1 + segment.z2) / 2 + dz).z; + const width = Math.max(2, segment.width * cameraScale()); + if (photoThemeActive) photoLimb({x1:a.x,y1:a.y,x2:b.x,y2:b.y,width}, player.pad); + else { + filledCapsule(a.x, a.y, b.x, b.y, width + 3, outline); + filledCapsule(a.x, a.y, b.x, b.y, width, player.color); + } + } + drawDigitalHeadBurst(player, world.head, age); +} + +function deathCinematicAge(now = runtime().monotonicUs) { + return deathCinematic ? (now - deathCinematic.startedAt) / 1000000 : -1; +} + +function drawDeathFlash() { + // Results and every replay angle keep the arena visible, including pre-hit frames. + if (roundResult || finalKillReplayRendering) return; + const age = deathCinematicAge(); + if (age < 0 || age >= .11) return; + const previousDepth = triangleDepth; + triangleDepth = -1.425; + const flash = age < .055 ? [255, 255, 255] : [255, 226, 116]; + screenRect(0, 0, viewWidth(), viewHeight, flash); + triangleDepth = previousDepth; +} + +function drawRunner(player, t, showLabel = true) { + // A fighter who is down is still on the stage: they read as the broken body + // rather than as nothing. There is no state in which a fighter is skipped. + const headBurstAge = player.headBustedAt + ? Math.max(0, (runtime().monotonicUs - player.headBustedAt) / 1000000) : -1; + if (!player.alive && headBurstAge >= .11) { + drawBrokenRunner(player, headBurstAge); + if (["CRY", "WOE", "SULK"].includes(player.resultReaction)) { + const head = player.frozenGeometry?.head; + if (head) { + // In screen proportion to the head, not in pixels: the celebration + // camera can fill the frame with this face, and fixed-size tears on a + // huge head read as dust. Ratios match the old look at the old + // distance (a ~22px head wore 7/34/3px tears). + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const r = Math.max(4, Math.hypot(edge.x - point.x, edge.y - point.y)); + const sway = Math.sin(t * 11) * r * .22; + for (const side of [-1, 1]) + filledCapsule(point.x + side * r * .32 + sway, point.y, + point.x + side * r * .32 - sway, + point.y + r * 1.5 + (t * 31) % (r * .8), + Math.max(1.5, r * .14), [112, 208, 255]); + } + } + return; + } + if (player.fallenBodyGeometry) { + const fallen = projectRunnerWorldGeometry(player.fallenBodyGeometry); + drawSkeletonSegments(fallen.segments, player.color, [8, 12, 24], photoThemeActive ? player : null); + } + const geometry = player.replayGeometry + ? projectRunnerWorldGeometry(player.replayGeometry) + : player.frozenGeometry + ? projectRunnerWorldGeometry(player.frozenGeometry) + : runnerGeometry(player, t); + if (roundResult && player.resultReaction) { + const age = (runtime().monotonicUs - player.resultReactionAt) / 1000000; + const amount = player.resultReaction === "POSE" || + player.resultReaction === "SULK" ? 3 : 8; + const dx = Math.sin(age * (player.resultReaction === "DANCE" ? 15 : 9)) * amount; + const dy = player.resultReaction === "DANCE" + ? -Math.abs(Math.sin(age * 9)) * 15 + : Math.sin(age * 12) * amount * .35; + geometry.head.x += dx; + geometry.head.y += dy; + for (const segment of geometry.segments) { + segment.x1 += dx; segment.x2 += dx; + segment.y1 += dy; segment.y2 += dy; + } + } + // Preserve the fighter's identity color during hit flash. A pure white body + // disappeared against the daylight arena, so impact now changes only its rim. + const color = player.color; + const outline = player.hit > 0 + ? mixColor([255, 232, 92], [28, 34, 52], visualTheme.light) + : [8, 12, 24]; + const displayNow = player.frozenAt || runtime().monotonicUs; + if (player.skateboard) drawSkateboard(player); + drawFighterSilhouette(geometry, color, outline, player); + const hitNow = runtime().monotonicUs; + if (player.hitSegment >= 0 && hitNow < player.hitSegmentUntil && + Math.floor(hitNow / 45000) % 2 === 0) { + const segment = geometry.segments[player.hitSegment]; + if (segment) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + Math.max(3, 5 * cameraScale()), [255, 238, 102]); + } + } + // Every fighter wears its face everywhere now, the title included. The + // still tableau used to sit faceless — a sparring-partner special case + // grown from the old dummy door — but the wordmark screen is the + // storefront, and whoever sits under it should look back. + drawFace(player, geometry.head, contrastShadow(color), t, displayNow); + drawInventory(player, displayNow, geometry); + drawDistantFighterLocator(player, geometry.head); + if (player.blocking) { + const worldShield = shieldGeometry(player); + const shield = projectPoint(worldShield.x, worldShield.y, worldShield.z); + const radius = Math.max(18, worldShield.radius * cameraScale()); + const shieldColor = player.blockFlash > 0 ? [255, 255, 255] : player.color; + const outerWidth = Math.max(4, 11 * cameraScale()); + filledRing(shield.x, shield.y, radius, + Math.max(0, radius - outerWidth), shieldColor); + } + +} + +function drawDiveMotion(player, t) { + if (player.grounded || (!player.pounding && !player.pogoDive)) return; + const level = player.pounding ? Math.max(1, player.poundLevel || 1) : 1; + const speed = clamp(Math.abs(player.vy) / poundMaxVelocity, .25, 1.8); + const color = mixColor(player.color, + level === 3 ? [255, 80, 92] : level === 2 ? [255, 190, 62] : [255, 245, 196], + .46 + level * .12); + const count = 3 + level * 3; + for (let index = 0; index < count; index++) { + const spread = (index - (count - 1) / 2) * 24; + const wobble = Math.sin(t * 13 + index * 2.1) * 9; + const x = player.x + spread + wobble; + const startY = player.y - 125 - index % 2 * 36; + const endY = startY - (95 + index * 17) * speed; + worldCapsule(x, startY, player.z + 18, x, endY, player.z + 18, + 3 + speed * 3 + level, color, .028); + } +} + +function drawDoubleJumpMotion(player, t) { + const now = runtime().monotonicUs; + if (now >= (player.doubleJumpLinesUntil || 0)) return; + const life = clamp((player.doubleJumpLinesUntil - now) / 280000, 0, 1); + const color = mixColor(player.color, [244, 250, 255], .55); + for (let index = 0; index < 7; index++) { + const spread = (index - 3) * 24 + Math.sin(t * 18 + index) * 5; + const startY = player.y + 28 + (index % 2) * 18; + const endY = startY + (70 + index * 11) * life; + worldCapsule(player.x + spread, startY, player.z + 16, + player.x + spread, endY, player.z + 16, + 3 + life * 3, color, .029); + } +} + +// Hitboxes are an inspector, not a garnish. They used to flash on every +// impact for anyone watching, which put green boxes over ordinary play and +// over every recording of it. VIEW (tab) is now the only thing that shows +// them — `impactHitboxesUntil` still times the flash, but only for someone +// who has already asked to see the geometry. +// Rectangle outlines need square joins, not tessellated semicircle caps. +function debugCapsule(x1, y1, x2, y2, width, color) { + if (nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy); + const c = length ? dx / length : 1, sn = length ? dy / length : 0; + const radius = width / 2; + const nx = -sn * radius, ny = c * radius; + x1 -= c * radius; y1 -= sn * radius; + x2 += c * radius; y2 += sn * radius; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); +} + +function drawDebugHitboxes(player, t) { + if (renderFlags.hud === false || !debugHitboxes || !player.alive) return; + const now = player.frozenAt || runtime().simMonotonicUs || runtime().monotonicUs; + const boxes = sampleCombatBoxes(player, now, null, false); + const hurtColor = [82, 226, 116]; + const pushColor = [255, 158, 54]; + const attackColor = [255, 58, 64]; + const guardColor = [186, 118, 255]; + const draw = (b, color, width = 2) => { + const z = (b.near+b.far)/2; + const points = [[b.left,b.top],[b.right,b.top],[b.right,b.bottom],[b.left,b.bottom]] + .map(([x,y])=>projectPoint(x,y,z)); + for (let i=0;i<4;i++) { + const a=points[i], next=points[(i+1)%4]; + debugCapsule(a.x,a.y,next.x,next.y,width,color); + } + }; + for (const b of boxes.hurt) draw(b,hurtColor); + draw(boxes.push,pushColor); + for (const b of boxes.guard) draw(b,guardColor,3); + for (const b of boxes.hit) draw(b,attackColor,4); +} + +// The frame meter. One pip per simulation frame, oldest on the left, the +// frame happening now at the right edge -- so an exchange reads left to +// right the way it happened, and the thing you just did is under your eye +// rather than across the screen. +// +// Two rows, one per fighter, stacked so the frames line up vertically: that +// column alignment IS the instrument. Reading "my recovery sits under their +// active" off two rows is the whole reason a frame meter exists, and it is +// why this is a stacked pair rather than one row per player somewhere +// convenient. +function drawFrameMeter() { + if (!debugHitboxes || renderFlags.hud === false) return; + if (!frameMeters.some((meter) => meter.length)) return; + const safe = hudSafeRect(); + const pip = Math.max(2, Math.min(7, Math.floor( + (safe.right - safe.left) * .55 / frameMeterLength) - 1)); + // Native meters draw contiguous color runs, preserving each frame boundary + // while avoiding hundreds of separate triangle submissions per frame. + const gap = pip > 3 && !nativeHudOverlay && !nativeTrianglePass ? 1 : 0; + // Tall enough to read a color at a glance. The pips are the resolution; + // the row height is only whether you can see them, and a meter you have to + // lean toward is a meter nobody reads mid-fight. + const rowHeight = Math.max(11, pip * 2); + const width = frameMeterLength * (pip + gap); + // Centred, and lifted clear of the bottom furniture -- the session name, + // the bug and the opponent label all live along that edge, and the first + // placement laid the meter straight across them. + const left = Math.round((safe.left + safe.right - width) / 2); + const top = safe.bottom - rowHeight * 2 - 58; + for (const player of players) { + const meter = frameMeters[player.pad]; + const y = top + player.pad * (rowHeight + 3); + // The empty track, so a meter that has not filled yet reads as a meter + // rather than as nothing having happened. + hudBox(left, y, width, rowHeight, 16, 19, 30); + // Adjacent equal pips without a gap are one rectangle. + for (let index = 0; index < meter.length;) { + const key = meter[index]; + let end = index + 1; + if (!gap) while (end < meter.length && meter[end] === key) end++; + const state = frameMeterStates[key] || frameMeterStates.neutral; + const x = left + width - (meter.length - index) * (pip + gap); + hudBox(x, y, pip * (end - index), rowHeight, ...state.ink); + index = end; + } + // Whose row this is, in their own color, at the left end where it cannot + // sit on top of the frames anybody is actually reading. + typeWrite("P" + (player.pad + 1), left - 30, y, 15, ...player.color); + } + // The legend, once, above the pair -- and only the states the last two + // seconds actually contained, because a legend listing colors that are not + // on screen is a thing to decode rather than a thing to read. + const seen = new Set(); + for (const meter of frameMeters) for (const state of meter) + if (frameMeterStates[state]?.label) seen.add(state); + let x = left; + for (const state of seen) { + const entry = frameMeterStates[state]; + hudBox(x, top - 17, 9, 9, ...entry.ink); + typeWrite(entry.label, x + 13, top - 19, 13, 168, 178, 200); + x += 20 + entry.label.length * 8; + } +} + +function drawPlayerHud(player, x, pad) { + const color = visualTheme.light > .55 + ? player.pad === 0 ? [155, 34, 108] : [105, 78, 0] + : player.color; + let label = "P" + (player.pad + 1) + " " + player.roundWins + "/" + + matchWins + " PTS " + player.score; + typeWrite(label, x, 14, 22, ...color); +} + +function visibleHandle(player) { + return (globalThis.__oskiewarDeviceHandles?.[player.pad] || player.name).toLowerCase(); +} + +function nationFlag(country) { + const code = String(country || "").toUpperCase(); + if (!/^[A-Z]{2}$/.test(code)) return ""; + return [...code].map((letter) => String.fromCodePoint( + 0x1f1e6 + letter.charCodeAt(0) - 65)).join(""); +} + +const reelProgressInset = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelFullUi === true + ? compactLayout() ? 42 : 50 : 0; + +function playerHandleLayout(player, side) { + const safe = hudSafeRect(); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 24 : hudTypeSize; + const width = handleWidth(visibleHandle(player), size); + // One name per corner: the left fighter reads from the left edge, the + // right fighter from the right. The command phrase mirrors to the inside, + // so neither name has to give up its corner to make room for it. + const x = freeForAll() ? (side === 0 ? safe.left + 8 + : side === 1 ? (safe.left + safe.right - width) / 2 : safe.right - 8 - width) + : side === 0 ? safe.left + 8 : safe.right - 8 - width; + const y = safe.bottom - size - (touch ? 250 : 18) - reelProgressInset(); + return { x, y, size, width }; +} + +function drawFloatingHandle(player, x, y, size) { + const handle = visibleHandle(player); + const shadows = player.handleColors?.map(runShadow); + drawHandle(handle, x + 3, y + 4, size, shadows, runShadow(player.color)); + drawHandle(handle, x, y, size, player.handleColors, player.color); +} + +function drawPlayerHandle(player, t, side) { + const { x, y, size } = playerHandleLayout(player, side); + const handle = visibleHandle(player); + const colors = globalThis.__oskiewarDeviceHandles?.[player.pad] + ? globalThis.__oskiewarDeviceHandleColors?.[player.pad] : player.handleColors; + const drawGlyphs = (dx, dy, colors, fallback) => { + let cursor = x + dx; + for (let index = 0; index < handle.length; index++) { + const character = handle[index]; + typeWrite(character, cursor, y + dy, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + drawGlyphs(3, 4, colors?.map(runShadow), runShadow(player.color)); + drawGlyphs(0, 0, colors, player.color); + const flag = nationFlag(player.nation); + if (flag) { + const flagSize = Math.round(size * .92); + const flagX = side === 0 ? x : x + Math.max(0, handleWidth(handle, size)); + systemWrite(flag, flagX, y - flagSize * 1.05, flagSize, 255, 255, 255); + } +} + +// One name at reel scale: the fighter's own per-glyph palette, every letter on +// its own phase, shadow pass under color pass. Shared by the opening matchup +// and the winner's card, so the only two frames of a reel that carry type +// carry it identically. Advance is keyed to the flat size, so the swell never +// walks the letters apart. +function drawReelName(text, y, size, player, t) { + const total = handleWidth(text, size); + const pass = (dx, dy, colors, fallback) => { + let cursor = viewCenterX() - total / 2 + dx; + for (let index = 0; index < text.length; index++) { + const character = text[index]; + const swell = size * (1 + .07 * Math.sin(t * 6 + index * .9)); + const bob = Math.sin(t * 5.2 + index * .8) * size * .09; + typeWrite(character, cursor - (swell - size) * .5, + y + dy + bob - (swell - size) * .5, swell, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + const plain = player?.color || [245, 248, 255]; + pass(4, 5, player?.handleColors?.map(runShadow), runShadow(plain)); + pass(0, 0, player?.handleColors, plain); +} + +function playerStatLines(player) { + const pad = inputPads[player.pad] || + { connected: false, down: [], leftX: 0, leftY: 0 }; + const input = quantizedInput(pad, player.suppressedDirections); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const phase = "anim " + animation.state + " " + animation.step + "/" + animation.steps + + " tick " + animation.tick; + if (player.npc && !player.bot) { + const parts = player.spiderDummy + ? [...spiderLegParts, "torso"] : [...limbParts, "torso"]; + const remaining = parts.filter((part) => hasPart(player, part)).length; + const damage = parts.reduce((total, part) => + total + Number(player.partDamage?.[part] || 0), 0); + return [ + "p" + (player.pad + 1) + " " + (player.spiderDummy ? "spider dummy" : "training dummy"), + "parts " + remaining + "/" + parts.length + " damage " + damage, + phase, + ]; + } + return [ + "p" + (player.pad + 1) + " " + player.stance + + (player.attackKind ? " + " + player.attackKind : ""), + "input " + input.horizontal + "," + input.vertical + + " stick " + pad.leftX.toFixed(2) + " vx " + Math.round(player.vx), + phase, + ]; +} + +const playerStatSize = () => compactLayout() ? 16 : 22; +const playerStatPanelHeight = () => { + const size = playerStatSize(); + return 16 + 3 * (size + 7) + 10; +}; + +const debugReadoutMetaSize = () => compactLayout() ? 19 : 24; +const debugReadoutTimingSize = () => + Math.max(17, Math.round(debugReadoutMetaSize() * .76)); +// The band the measured-performance read-out owns, just above the nameplate. +// Everything that stacks over a handle reserves it rather than sharing it: the +// console has always printed a second timing row there and it landed exactly on +// the state card's `anim::` line, and the browser started printing one the day +// it began timing its own frames. Both rows are reserved whether or not the +// host fills the second — the card above must not breathe when a measurement +// finally arrives, the same fixed-chassis rule the card itself follows. +const debugReadoutHeight = () => debugHitboxes + ? debugReadoutMetaSize() + 6 + debugReadoutTimingSize() + 5 + : bareFrameRateShown() ? debugReadoutMetaSize() + 11 : 0; + +// The state trace owns a fixed stack over each handle without a container. +const statStackHeight = () => debugHitboxes + ? debugReadoutHeight() + playerStatPanelHeight() + 8 : debugReadoutHeight(); + +function drawPlayerStats(player, side, t) { + if (!debugHitboxes) return; + const lines = playerStatLines(player); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const size = playerStatSize(); + const padding = 8; + const lineHeight = size + 7; + const safe = hudSafeRect(); + // A diagnostic instrument has fixed columns: changing signs and tick counts + // must not make its chassis breathe every frame. + // The tick and velocity columns are the longest legal row, so the chassis + // reserves their full Xbox-width footprint instead of clipping their tail. + const width = compactLayout() ? 360 : 520; + const height = playerStatPanelHeight(); + const handle = playerHandleLayout(player, side); + const x = side === 0 ? safe.left : safe.right - width; + const y = handle.y - debugReadoutHeight() - height - 12; + const previousDepth = triangleDepth; + triangleDepth = -1.445; + for (let row = 0; row < lines.length; row++) { + const rowY = y + padding + row * lineHeight; + writeHudLine(lines[row], x + padding, rowY, size); + } + triangleDepth = previousDepth; +} + +function drawHudInventory(player, side) { + const items = []; + if (player.gunAmmo > 0) items.push("gun " + player.gunAmmo); + if (player.grenadeAmmo > 0) items.push("grenade " + player.grenadeAmmo); + if (!items.length) return; + const text = items.join(" "); + const handle = playerHandleLayout(player, side); + const size = Math.round(hudTypeSize * .62); + const width = handleWidth(text, size); + const x = side === 0 ? handle.x : handle.x + handle.width - width; + // Commands own the rows immediately above the fighter's name. Inventory + // starts above whichever of those rows are still visible, so neither can + // drift over the other as the command history dissolves. + const y = handle.y - statStackHeight() - commandStreamStackHeight(player) - + size - 7; + const shadow = contrastShadow(player.color); + typeWrite(text, x + 2, y + 3, size, ...shadow); + typeWrite(text, x, y, size, ...player.color); +} + +function spatialHudPlayers() { + if (freeForAll()) return players.slice().sort((a, b) => a.x - b.x); + const left = players[hudLeftPad] || players[0]; + const other = players[left.pad === 0 ? 1 : 0]; + // Preserve the lane through the instant of overlap, then swap once the + // crossing is visually unambiguous. This prevents one-frame HUD chatter. + if (other.x < left.x - 36) hudLeftPad = other.pad; + return [players[hudLeftPad], players[hudLeftPad === 0 ? 1 : 0]]; +} + +// How present one glyph of the buffer is. `settle` is how far into the idle +// the dissolve has travelled: 0 for as long as the pad is still saying +// something, 1 once the whole stream has left. Doubling it and offsetting by +// each glyph's place in the stream spends the first half on the oldest glyph +// and the last half on the newest, so the buffer leaves in reading order +// rather than dimming as one sheet. +function commandFade(index, count, idle) { + const settle = clamp((idle - commandHoldUs) / commandFadeUs, 0, 1); + return clamp(index / Math.max(1, count - 1) + 1 - settle * 2, 0, 1); +} + +function commandStreamStackHeight(player, now = runtime().monotonicUs) { + const count = player.commandStream.length; + if (!count) return 0; + const idle = now - (player.commandStream.at(-1)?.at || now); + const visible = player.commandStream.reduce((total, entry, index) => + total + (commandFade(index, count, idle) > .01 ? 1 : 0), 0); + const handle = playerHandleLayout(player, player.pad); + const size = commandStreamTypeSize(handle.size); + const rows = Math.min(commandStreamRows, + Math.ceil(Math.min(commandStreamDepth, visible) / + commandStreamColumnsNow())); + return rows ? rows * (size + 7) + Math.ceil(size * .8) + 4 : 0; +} + +function drawCommandStream(player, side) { + const glyph = { LEFT: "<", RIGHT: ">", UP: "^", DOWN: "v" }; + const buttonFor = { LEFT: "ArrowLeft", RIGHT: "ArrowRight", + UP: "ArrowUp", DOWN: "ArrowDown", "/": "A", "*": "B", ")": "X", + "+": ["Y", "LeftShoulder", "RightShoulder"] }; + const now = runtime().monotonicUs; + const idle = now - (player.commandStream.at(-1)?.at || now); + const count = player.commandStream.length; + const held = inputPads[player.pad]?.down || []; + const entries = player.commandStream.map((entry, index) => ({ ...entry, + text: glyph[entry.label] || entry.label, + fade: commandFade(index, count, idle), + held: Array.isArray(buttonFor[entry.label]) + ? buttonFor[entry.label].some((button) => held.includes(button)) + : held.includes(buttonFor[entry.label]), + })).filter((entry) => entry.fade > .01); + // A held button lights only its newest appearance — not every earlier + // press of the same button still sitting in the buffer's history. + const claimed = new Set(); + for (let index = entries.length - 1; index >= 0; index--) { + const entry = entries[index]; + if (!entry.held) continue; + if (claimed.has(entry.label)) entry.held = false; + else claimed.add(entry.label); + } + if (!entries.length) return; + // The name owns its row. Commands stack in distinct rows above it, aligned + // to the same outside edge, so a long handle can never sit underneath its + // own input history. + entries.reverse(); + const handle = playerHandleLayout(player, side); + const size = commandStreamTypeSize(handle.size); + const columns = commandStreamColumnsNow(); + const lineEntries = entries.slice(0, commandStreamDepth); + const gap = Math.round(size * .34); + const rows = []; + for (let index = 0; index < lineEntries.length; index += columns) + rows.push(lineEntries.slice(index, index + columns)); + const safe = hudSafeRect(); + for (let row = 0; row < rows.length; row++) { + const rowEntries = rows[row]; + const width = rowEntries.reduce((sum, entry, index) => sum + + handleWidth(entry.text, size) + (index ? gap : 0), 0); + let cursor = side === 0 ? handle.x : handle.x + handle.width - width; + cursor = clamp(cursor, safe.left, safe.right - width); + const newestAt = Math.max(...rowEntries.map((entry) => entry.at)); + const rise = clamp((now - newestAt) / 900000, 0, 1) * size * .8; + const y = handle.y - statStackHeight() - (row + 1) * (size + 7) - rise; + for (const entry of rowEntries) { + const quiet = mixColor([104, 114, 136], [82, 90, 108], visualTheme.light); + const live = entry.held ? player.color : quiet; + const glyphInk = entry.fade >= 1 ? live + : mixColor(visualTheme.light > .5 ? [230, 239, 247] : [7, 8, 28], + live, entry.fade); + typeWrite(entry.text, cursor + 2, y + 3, size, + ...contrastShadow(glyphInk)); + typeWrite(entry.text, cursor, y, size, ...glyphInk); + cursor += handleWidth(entry.text, size) + gap; + } + } +} + +function drawFightIntro(introSeconds, titleInk, statusShadow) { + const centerX = viewCenterX(); + const centerY = (stageTop + stageBottom) / 2; + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const nameSize = touch ? 28 : compactLayout() ? 38 : 54; + const drawHeadName = (player) => { + const head = runnerWorldGeometry(player, + (runtime().monotonicUs - startedAt) / 1000000).head; + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const flash = .5 + .5 * Math.sin(introSeconds * Math.PI * 8); + const flashingSize = nameSize * (1 + flash * .1); + const width = handleWidth(visibleHandle(player), flashingSize); + drawFloatingHandle(player, point.x - width / 2, + point.y - radius - flashingSize * 1.28, flashingSize); + }; + if (freeForAll()) { + for (const player of players) drawHeadName(player); + return; + } + if (!reelGroundCamera() && introSeconds < 1) { + drawHeadName(players[0]); + return; + } + if (!reelGroundCamera() && introSeconds < 2) { + drawHeadName(players[1]); + return; + } + { + const title = "oskiewar"; + const titleSize = touch ? 54 : compactLayout() ? 72 : 98; + const width = handleWidth(title, titleSize); + let cursor = centerX - width / 2; + const titleTime = (runtime().monotonicUs - startedAt) / 1000000; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const advance = comicGlyphAdvance(character, titleSize); + typeWrite(character, cursor + 5, centerY - titleSize / 2 + 6, + titleSize, ...statusShadow); + typeWrite(character, cursor, centerY - titleSize / 2, + titleSize, ...animatedTitleColor(index, titleTime)); + cursor += advance; + } + return; + } +} + +function drawSurvivalIntro(titleInk, statusShadow) { + const callout = "climb!"; + const size = compactLayout() ? 74 : 112; + const width = handleWidth(callout, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(callout, x + 5, y + 7, size, ...statusShadow); + typeWrite(callout, x, y, size, ...titleInk); +} + +function drawSurvivalHud(titleInk) { + const safe = hudSafeRect(); + const score = Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 34 : 46; + const width = handleWidth(score, size); + const x = viewCenterX() - width / 2; + const y = safe.top + 2; + typeWrite(score, x + 3, y + 4, size, ...contrastShadow(titleInk)); + typeWrite(score, x, y, size, ...titleInk); +} + +function drawSurvivalResult(titleInk, statusShadow) { + const result = roundResult === "SUMMIT" ? "summit!" + : Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 58 : 82; + const width = handleWidth(result, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(result, x + 5, y + 7, size, ...statusShadow); + typeWrite(result, x, y, size, ...titleInk); +} + +function drawReelSectionProgress(now, titleInk) { + const safe = hudSafeRect(); + const gap = compactLayout() ? 5 : 8; + const widths = [.16, .68, .16]; + const labels = ["INTRO", "FIGHT", "OUTRO"]; + const available = safe.right - safe.left - gap * 2; + const resultDuration = matchOver ? matchResultUs : roundResultUs; + const introAge = Math.max(0, now - roundStartedAt); + const introLimit = roundIntroDurationUs(); + const section = roundResult ? 2 : introAge < introLimit ? 0 : 1; + const progress = section === 0 + ? clamp(introAge / introLimit, 0, 1) + : section === 1 + ? clamp(roundElapsedUs / roundDurationUs, 0, 1) + : clamp((now - roundOverAt) / resultDuration, 0, 1); + const labelSize = compactLayout() ? 18 : 22; + const barHeight = compactLayout() ? 6 : 8; + const barY = safe.bottom - barHeight; + const labelY = barY - labelSize - 7; + const track = mixColor([52, 58, 76], [170, 157, 137], visualTheme.light); + const done = mixColor([96, 222, 154], [31, 92, 76], visualTheme.light); + const hitMarks = Array.isArray(globalThis.__oskiewarFightHitForecast) + ? globalThis.__oskiewarFightHitForecast : fightHitMarks; + let x = safe.left; + for (let index = 0; index < widths.length; index++) { + const width = index === widths.length - 1 + ? safe.right - x : Math.round(available * widths[index]); + const amount = index < section ? 1 : index === section ? progress : 0; + hudBox(x, barY, width, barHeight, ...track); + if (amount > 0) hudBox(x, barY, width * amount, barHeight, + ...(index === section ? titleInk : done)); + if (index === 1) { + const markWidth = compactLayout() ? 5 : 6; + for (const mark of hitMarks) { + const markX = x + clamp(mark.at, 0, 1) * width; + const reached = roundElapsedUs / roundDurationUs >= mark.at; + const impactInk = mark.decisive ? [226, 42, 66] : mark.color; + hudBox(markX - markWidth / 2, barY - 3, + markWidth, barHeight + 6, + ...(reached ? impactInk : mixColor(track, impactInk, .72))); + } + } + const labelWidth = handleWidth(labels[index], labelSize); + typeWrite(labels[index], x + (width - labelWidth) / 2, + labelY, labelSize, ...(index === section ? titleInk : track)); + x += width + gap; + } +} + +function recordFightHit(sourcePad, decisive) { + if (roundResult || roundElapsedUs <= 0) return; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) return; + const fighter = players[sourcePad]; + fightHitMarks.push({ + at: clamp(roundElapsedUs / roundDurationUs, 0, 1), + color: fighter?.color ? [...fighter.color] : [226, 42, 66], + decisive: decisive === true, + }); +} + +// A pole or a branch crossing the near plane has the same problem a face does, +// and the same cure — trim the segment at the plane rather than letting the +// far end pin itself to the near distance and rake across the screen. Null is +// a segment wholly behind the camera. +// The band a face gets, for a line. A segment is two points with no polygon +// to cut, which is why this used to trim at the pin instead: cutting at the +// near plane and handing the result over whole let a line crossing the plane +// rake the length of the guard band. Trimming the PROJECTED segment gives the +// same protection without throwing the line away, so the cut can move back to +// the plane where it belongs. Liang–Barsky, carrying depth along t so a capsule +// still knows how far away its ends are. +function clipSegmentBand(from, to) { + const width = viewWidth(); + const minX = -width * guardBand, maxX = width * (1 + guardBand); + const minY = -viewHeight * guardBand, maxY = viewHeight * (1 + guardBand); + // Most segments sit whole inside the band — every grass blade, most limbs. + // Plain compares answer those; only a segment that actually crosses an + // edge pays for the parametric walk and its rebuilt endpoints. + if (from.x >= minX && from.x <= maxX && from.y >= minY && from.y <= maxY && + to.x >= minX && to.x <= maxX && to.y >= minY && to.y <= maxY) + return { from, to }; + const dx = to.x - from.x, dy = to.y - from.y; + let enter = 0, exit = 1; + for (const [edge, room] of [[-dx, from.x - minX], [dx, maxX - from.x], + [-dy, from.y - minY], [dy, maxY - from.y]]) { + if (edge === 0) { if (room < 0) return null; continue; } + const at = room / edge; + if (edge < 0) { if (at > exit) return null; if (at > enter) enter = at; } + else { if (at < enter) return null; if (at < exit) exit = at; } + } + const along = (t) => ({ x: from.x + dx * t, y: from.y + dy * t, + z: lerp(from.z, to.z, t) }); + return { from: along(enter), to: along(exit) }; +} +// Cut at the real near plane, the same one faces get. The pin is ten times +// further out, and while nothing in normal play passes within eighty units of +// the lens, the death cinematic drives the camera right down to the ground — +// so every limb and blade of grass in front of it was being dropped whole, +// which is what hollowed out the front of the frame on the zoom. +function worldSegment(x1, y1, z1, x2, y2, z2) { + let a = cameraDoll.toView({ x: x1, y: y1, z: z1 }); + let b = cameraDoll.toView({ x: x2, y: y2, z: z2 }); + if (a.z < cameraNear && b.z < cameraNear) return null; + if (a.z < cameraNear) + a = mixVertex(a, b, (cameraNear - a.z) / (b.z - a.z)); + else if (b.z < cameraNear) + b = mixVertex(b, a, (cameraNear - b.z) / (a.z - b.z)); + const from = cameraDoll.projectView(a); + const to = cameraDoll.projectView(b); + // Six plain checks instead of an array built per segment per frame. + return Number.isFinite(from.x) && Number.isFinite(from.y) && + Number.isFinite(from.z) && Number.isFinite(to.x) && + Number.isFinite(to.y) && Number.isFinite(to.z) + ? clipSegmentBand(from, to) : null; +} + +function worldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + line(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} + +function worldCapsule(x1, y1, z1, x2, y2, z2, width, color, + depthBias = -.004) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + const { from, to } = segment; + const previousDepth = triangleDepth; + triangleDepth = Math.min(from.z, to.z) + depthBias; + filledCapsule(from.x, from.y, to.x, to.y, width, color); + triangleDepth = previousDepth; +} + +function litQuadColor(a, b, c, color) { + // Lighting is decided in world space, off the surface the quad names, so it + // is the same shade however the clipper ends up cutting the face up. The + // cross, normalize and dot run in scalars: this is every wall panel every + // frame, and the vector objects were pure interpreter garbage. + const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z; + const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z; + const nx = aby * acz - abz * acy; + const ny = abz * acx - abx * acz; + const nz = abx * acy - aby * acx; + const magnitude = Math.hypot(nx, ny, nz) || 1; + const toward = (nx * -globalLight.x + ny * -globalLight.y + + nz * -globalLight.z) / magnitude; + const illumination = .72 + Math.max(0, toward) * .28; + return [Math.round(color[0] * illumination), + Math.round(color[1] * illumination), + Math.round(color[2] * illumination)]; +} +function worldQuad(a, b, c, d, color) { + const lit = litQuadColor(a, b, c, color); + worldTriangle(a, b, c, lit); + worldTriangle(a, c, d, lit); +} + +// Preserve the sampled silhouette, merging only collinear edges. +const terrainProfile = []; +function rebuildTerrainProfile() { + const points = []; + const step = (worldRight - worldLeft) / terrainSamples; + for (let i = 0; i <= terrainSamples; i++) { + const x = worldLeft + i * step; + const point = { x, y: terrainFloorAt(x) }; + while (points.length > 1) { + const a = points[points.length - 2], b = points[points.length - 1]; + if (Math.abs((b.y - a.y) * (point.x - b.x) - + (point.y - b.y) * (b.x - a.x)) > .00001) break; + points.pop(); + } + points.push(point); + } + terrainProfile.splice(0, terrainProfile.length, ...points); + rebuildTerrainDrawProfile(); +} +// The drawn silhouette. `terrainProfile` keeps every sampled height exactly +// (physics and the fidelity test read it); the console draws each profile +// point as six projections and two faces per pass, so the passes read this +// thinned copy instead — a point is dropped while every point it stood for +// stays within `terrainDrawTolerance` world units of the chord that +// replaces it (about a pixel at fight zoom). Flats were already one edge; +// this is for the ramps, where six samples a tile all survived. +const terrainDrawProfile = []; +const terrainDrawTolerance = 1; +function rebuildTerrainDrawProfile() { + const kept = []; + let anchor = 0; + kept.push(terrainProfile[0]); + for (let index = 2; index <= terrainProfile.length; index++) { + const a = terrainProfile[anchor]; + const candidate = terrainProfile[index] || null; + // Try to stretch the chord from the anchor over `index - 1` to `index`; + // when a point in between falls off it, `index - 1` becomes the anchor. + let fits = candidate !== null; + if (fits) { + const dx = candidate.x - a.x, dy = candidate.y - a.y; + const length = Math.hypot(dx, dy) || 1; + for (let between = anchor + 1; between < index; between++) { + const point = terrainProfile[between]; + const distance = Math.abs((point.x - a.x) * dy - (point.y - a.y) * dx) / length; + if (distance > terrainDrawTolerance) { fits = false; break; } + } + } + if (!fits) { + anchor = index - 1; + kept.push(terrainProfile[anchor]); + } + } + terrainDrawProfile.splice(0, terrainDrawProfile.length, ...kept); +} +rebuildTerrainProfile(); + +// The three terrain passes (surface, front wall, back wall) used to hand +// `worldQuad` four fresh corner objects per segment, and each quad ran its +// six vertices through the camera — so every profile point was projected +// twelve times per pass, and the terrain alone cost 8.4 ms of the console's +// interpreted frame (measured on the Xbox 2026-09-20; sim 5.6 + paint 14 ms +// at 1080p). Each pass now projects each point ONCE for its top vertex and +// once for its bottom, keeps the results in two flat scratch arrays, and +// reads a segment's four corners back from them. Segments that sit wholly +// in front of the camera and inside the guard band — nearly all of them — +// go straight to `projectedTriangle`; the rest fall back to `worldQuad`, so +// the near-plane and band clipping is exactly what it was. +const terrainScratch = { top: [], bottom: [] }; +function terrainVertex(slot, index, x, y, z) { + let vertex = slot[index]; + if (!vertex) vertex = slot[index] = { view: { x: 0, y: 0, z: 0 }, + screen: { x: 0, y: 0, z: 0 }, front: false, inBand: false, x: 0, y: 0, z: 0 }; + vertex.x = x; vertex.y = y; vertex.z = z; + const view = cameraDoll.toView(vertex, vertex.view); + vertex.front = view.z >= cameraNear; + vertex.inBand = vertex.front && + bandContains(cameraDoll.projectView(view, vertex.screen)); + return vertex; +} +// `bottomY` null: the bottom vertex shares the profile's y (the surface +// pass, top at z `zTop`, bottom at z `zBottom`). Otherwise a wall: both +// vertices at `zTop`, the bottom one dropped to `bottomY`. +function terrainPass(left, right, zTop, zBottom, bottomY, shadeOf) { + const { top, bottom } = terrainScratch; + const wall = bottomY !== null; + const terrainProfile = terrainDrawProfile; + const count = terrainProfile.length; + let previous = -1; + for (let index = 0; index < count; index++) { + const point = terrainProfile[index]; + const next = terrainProfile[index + 1]; + // A point is projected only when a drawn segment touches it. + const inSpan = (next && !(next.x < left || point.x > right)) || + (index > 0 && !(point.x < left || terrainProfile[index - 1].x > right)); + if (!inSpan) { previous = -1; continue; } + const a = terrainVertex(top, index, point.x, point.y, zTop); + const b = terrainVertex(bottom, index, point.x, wall ? bottomY : point.y, + wall ? zTop : zBottom); + if (previous >= 0 && previous === index - 1 && + !(point.x < left || terrainProfile[previous].x > right)) { + const a1 = top[previous], b1 = bottom[previous]; + const shade = shadeOf(previous); + if (a1.front && a.front && b.front && b1.front) { + // Reject fully offscreen quads before lighting and guard-band + // clipping. The generous world apron includes many invisible ramps. + const p=a1.screen, q=a.screen, r=b.screen, s=b1.screen; + const width=viewWidth(); + if ((p.x<0 && q.x<0 && r.x<0 && s.x<0) || + (p.x>width && q.x>width && r.x>width && s.x>width) || + (p.y<0 && q.y<0 && r.y<0 && s.y<0) || + (p.y>viewHeight && q.y>viewHeight && r.y>viewHeight && s.y>viewHeight)) { + previous=index; + continue; + } + if (photoSurface(wall ? "wall" : "concrete", p, q, r, s)) { + previous = index; + continue; + } + const lit = litQuadColor(a1, a, b, shade); + if (a1.inBand && a.inBand && b.inBand && b1.inBand) { + projectedTriangle(a1.screen, a.screen, b.screen, lit); + projectedTriangle(a1.screen, b.screen, b1.screen, lit); + } else { + // Off the guard band on one side: clip the projected quad once + // rather than re-projecting it as two triangles. + const face = clipScreenBand([a1.screen, a.screen, b.screen, b1.screen]); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], lit); + } + } else worldQuad(a1, a, b, b1, shade); + } + previous = index; + } +} +// Per-segment surface shade, cached against the ground color it was mixed +// from: the slope never changes between rebuilds, and mixing 240 colours a +// frame was measurable on the console. +let terrainShadeKey = ""; +const terrainShades = []; +function terrainSurfaceShades(color) { + const terrainProfile = terrainDrawProfile; + const key = currentMapId + "/" + color.join(",") + "/" + terrainProfile.length; + if (key === terrainShadeKey) return terrainShades; + terrainShadeKey = key; + terrainShades.length = 0; + for (let index = 1; index < terrainProfile.length; index++) { + const { x: x1, y: y1 } = terrainProfile[index - 1]; + const { x: x2, y: y2 } = terrainProfile[index]; + const slope = Math.abs(y2 - y1) / Math.max(1, x2 - x1); + terrainShades[index - 1] = + mixColor(color, [110, 120, 90], .16 + Math.min(1, slope) * .22); + } + return terrainShades; +} +function drawTerrainSurface(left, right, near, far, color) { + const shades = terrainSurfaceShades(color); + terrainPass(left, right, near, far, null, (segment) => shades[segment]); +} + +function drawTerrainFrontWall(left, right, near, color) { + // Close the near edge with a terrain-following skirt so camera pitch never + // exposes what lies beneath the floor. + // + // WHERE the skirt hangs is the whole fix for the reel's under-floor gap. + // The reel lens is orthographic, so the floor plane projects to a line and + // can never cover the bottom of a 9:16 frame — only a vertical surface can. + // The TV skirt at the slab's near edge sits BEHIND the reel camera and gets + // near-clipped (tinting it magenta proved it never reached the frame), which + // left the buried room wall showing through as purple under the grass. For + // reels the skirt hangs just behind the fighters' plane instead, deep enough + // that no frame sees under it, and wears the ground color — so everything + // below the floor line reads as earth. + const reel = reelGroundCamera(); + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = reel ? 55 : near - 2; + const wallBottom = parkDeepest + (reel ? 9000 : 720); + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawTerrainBackWall(left, right, far, color) { + // The far edge was simply open. Yaw clamps at +/-.62rad, which is more than + // enough to swing the diorama around and look straight through the back of + // the slab into the buried room wall. The near edge has hung a skirt since + // the reel work; this is its mirror, and it exists for the ordinary TV lens + // where the right stick can actually reach around. + // + // Reels return early. That lens already hangs its single skirt just behind + // the fighters at z=55, and a second wall out at worldFar would sit behind + // that one where no reel frame ever looks -- pure cost, and a change to + // footage whose framing is test-enshrined. + if (reelGroundCamera()) return; + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = far + 2; + const wallBottom = floorY + 720; + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawRoomSurfaces(left, right, top, bottom, color) { + // A map-colored architectural backing sits between the arena and global sky. + if (survivalActive()) { + const wallBottom = floorY + 3000; + const roomTop = top - 500; + const shade = mixColor(color, [226, 172, 168], .12); + worldQuad({ x: worldLeft, y: roomTop, z: worldFar }, + { x: worldRight, y: roomTop, z: worldFar }, + { x: worldRight, y: wallBottom, z: worldFar }, + { x: worldLeft, y: wallBottom, z: worldFar }, shade); + const sideFloor = terrainFloorAt(worldLeft) + 120; + const sideShade = mixColor(color, [232, 170, 153], .13); + for (let row = 0; row < 2; row++) { + for (let depth = 0; depth < 2; depth++) { + const y1 = lerp(roomTop, sideFloor, row / 2); + const y2 = lerp(roomTop, sideFloor, (row + 1) / 2); + const z1 = lerp(0, worldFar, depth / 2); + const z2 = lerp(0, worldFar, (depth + 1) / 2); + worldQuad({ x: worldLeft, y: y1, z: z1 }, + { x: worldLeft, y: y1, z: z2 }, + { x: worldLeft, y: y2, z: z2 }, + { x: worldLeft, y: y2, z: z1 }, sideShade); + } + } + const climbEdge = mixColor(color, [64, 78, 72], .24); + worldLine(worldLeft, top, worldFar - 4, worldLeft, bottom, worldFar - 4, + 9, climbEdge); + worldLine(worldRight, top, worldFar - 4, worldRight, bottom, worldFar - 4, + 9, climbEdge); + return; + } + const palette = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const back = mixColor(palette.night, palette.floor, .09); + const backZ = worldFar + 160; + // A low stepped architectural backdrop follows the map's actual bounds. + // Its top stays below launches, so a wide lens still sees the surrounding sky. + const bayWidth = (worldRight - worldLeft) / 5; + for (let i=0; i<5; i++) { + const x1=Math.max(left,worldLeft+bayWidth*i); + const x2=Math.min(right,worldLeft+bayWidth*(i+1)); + if (x1>=x2) continue; + const roof=floorY-gridHeight*[.48,.62,.72,.62,.48][i]; + worldQuad({x:x1,y:roof,z:backZ}, {x:x2,y:roof,z:backZ}, + {x:x2,y:floorY+720,z:backZ}, {x:x1,y:floorY+720,z:backZ}, back); + worldQuad({x:x1,y:roof,z:backZ}, {x:x2,y:roof,z:backZ}, + {x:x2,y:roof,z:backZ+100}, {x:x1,y:roof,z:backZ+100}, + mixColor(back,palette.deck,.10)); + } + // The heat's base is the vacuum it hangs in, so a cooling tile fades to + // nothing rather than settling into a visible panel with edges. Only the + // bloom is meant to be seen. + drawGridOverlay(mixColor(color, [6, 8, 20], .97), false); + const pulse = .5 + .5 * Math.sin(runtime().monotonicUs / 520000); + const field = mixColor([54, 120, 186], [136, 214, 255], .3 + pulse * .35); + for (const edgeX of [worldLeft, worldRight]) { + worldLine(edgeX, ceilingY, worldFar - 4, edgeX, floorY, worldFar - 4, + 9, field); + worldLine(edgeX, ceilingY, worldNear + 4, edgeX, floorY, worldNear + 4, + 5, mixColor(field, [8, 12, 28], .5)); + } +} + +function drawSurvivalLava(t) { + if (!survivalActive()) return; + const pulse = .5 + .5 * Math.sin(t * 3.1); + const surface = mixColor([255, 58, 24], [255, 212, 42], pulse * .42); + const body = mixColor([116, 10, 26], [238, 50, 18], .58 + pulse * .18); + const far = worldFar - 8; + const bottom = Math.max(floorY + 3000, survivalLavaY + 3200); + worldQuad({ x: worldLeft, y: survivalLavaY, z: far }, + { x: worldRight, y: survivalLavaY, z: far }, + { x: worldRight, y: bottom, z: far }, + { x: worldLeft, y: bottom, z: far }, body); + worldQuad({ x: worldLeft, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldFar }, + { x: worldLeft, y: survivalLavaY, z: worldFar }, surface); + for (let step = 0; step < 9; step++) { + const x1 = lerp(worldLeft, worldRight, step / 9); + const x2 = lerp(worldLeft, worldRight, (step + 1) / 9); + const y1 = survivalLavaY + Math.sin(t * 4.2 + step * 1.7) * 9; + const y2 = survivalLavaY + Math.sin(t * 4.2 + (step + 1) * 1.7) * 9; + worldLine(x1, y1, worldNear - 2, x2, y2, worldNear - 2, 7, surface); + } +} + +// The map's addressing, made visible: the same lattice the spawn marks and +// pickups are authored on, with the heat of `gridField` showing where the +// last half-second of the fight landed. Seams are thin quads rather than +// worldLines because the native renderer buries the whole line stratum +// beneath the world's triangles — the grid would vanish behind its own wall +// on console, the same way the gun once drew under the floor. +// +// A heated cell used to paint its entire ninety-unit face — a square as tall +// as a standing fighter, and a busy exchange flipped a dozen of them on and +// off at once. That is the stripes and the starfield again: a pattern the eye +// keeps reading behind the two things it is supposed to be watching. On the +// light theme it was worse than busy, because the slab's base is the vacuum, +// so what bloomed over the arena was a dark panel rather than heat. +// +// So the cell keeps its job and loses its size. Each hot tile draws a small +// jittered grain patch at its own centre, under half a tile across so two lit +// neighbours can never fuse back into a checker square. Heat sets how many +// specks are lit as well as how bright, so cooling reads as a patch thinning +// out — texture, at a scale that stays decoration. +function drawGridOverlay(shade, seamInk = null) { + const gridZ = worldFar - 2; + const gridTop = floorY - gridHeight; + const hot = mixColor([255, 138, 92], [204, 58, 46], visualTheme.light); + // Sixteen specks over a patch half a tile across, each of them a few units + // on a side against the tile's ninety, so the grain is a texture with air in + // it rather than a smaller solid square. + const grainSteps = 4; + const grainSpan = tileSize * .5; + for (let cell = 0; cell < gridField.length; cell++) { + const heat = gridField[cell]; + if (heat < .05) continue; + const centerX = gridLeft + (cell % gridCols + .5) * tileSize; + const centerY = floorY - (Math.floor(cell / gridCols) + .5) * tileSize; + const ink = mixColor(shade, hot, .4 + heat * .55); + for (let speck = 0; speck < grainSteps * grainSteps; speck++) { + // Hashed off the cell and the speck rather than noised, so a replayed + // round grains exactly the way the live one did. + const seed = .5 + .5 * Math.sin(cell * 12.9898 + speck * 78.233); + // Cooling puts specks out one at a time instead of dimming the lot. + if (seed > heat) continue; + const size = 2 + seed * 2 + heat * 2.5; + const x = centerX + (speck % grainSteps / (grainSteps - 1) - .5) * + grainSpan + (seed - .5) * 11; + const y = centerY + (Math.floor(speck / grainSteps) / (grainSteps - 1) - + .5) * grainSpan + (.5 - seed) * 11; + worldQuad({ x: x - size, y: y - size, z: gridZ }, + { x: x + size, y: y - size, z: gridZ }, + { x: x + size, y: y + size, z: gridZ }, + { x: x - size, y: y + size, z: gridZ }, ink); + } + } + // The climb's lattice is ruled onto plaster and takes its seam from that + // plaster. The station has no plaster, and ruling the same seams across + // vacuum drew a cage over the whole frame — brighter than the starfield it + // was supposed to hang behind, and carrying a hard bright bar wherever the + // ceiling row crossed the top of the shot. + // + // So the space map passes `false` and gets no seams at all. What it keeps + // is the half of this that was always the point: the heat. Cold tiles draw + // nothing, so the lattice is invisible until a blow lands and then blooms + // where it landed — the tile field showing its own contents rather than + // its own graph paper. The ruled version stays for the climb, where there + // is a wall to rule it onto. + if (seamInk === false) return; + const seam = seamInk || mixColor(shade, [30, 34, 48], .22); + const seamZ = gridZ - 1; + for (let col = 0; col <= gridCols; col++) { + const x = gridLeft + col * tileSize; + worldQuad({ x: x - 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: floorY, z: seamZ }, + { x: x - 1.5, y: floorY, z: seamZ }, seam); + } + for (let row = 0; row <= gridRows; row++) { + const y = floorY - row * tileSize; + worldQuad({ x: gridLeft, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y + 1.5, z: seamZ }, + { x: gridLeft, y: y + 1.5, z: seamZ }, seam); + } +} + +function drawTerrainGrass(left, right, color) { + // Twenty deterministic tufts cost forty native lines total. Keeping them on + // the line layer avoids turning background dressing into hundreds of faces. + const count = 100; + for (let index = 0; index < count; index++) { + const seed = .5 + .5 * Math.sin(index * 91.73 + terrainPhase * 2.31); + const x = lerp(worldLeft, worldRight, (index + .5) / count); + if (x < left || x > right) continue; + // Keep dressing in the near half of the floor. At the far plane the same + // blades collapse into horizon ticks instead of reading as foreground grass. + const z = lerp(worldNear * .88, worldNear * .22, + .5 + .5 * Math.sin(index * 37.11 + terrainPhase)); + const y = terrainFloorAt(x) - 2; + const height = 22 + seed * 22; + const tuft = mixColor(color, [48, 92, 54], .42 + seed * .22); + worldLine(x, y, z, x - 8 - seed * 5, y - height, z, 3, tuft); + worldLine(x, y, z, x + 7 + seed * 6, y - height * .82, z, 3, tuft); + } +} + +function drawBoosterPad(t) { + const pulse = .5 + .5 * Math.sin(t * 4); + const color = mixColor([55, 174, 244], [255, 224, 74], pulse * .55); + for (const boosterX of boosterXs) { + const y = terrainFloorAt(boosterX) - 7; + worldQuad( + { x: boosterX - boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: 86 }, + { x: boosterX - boosterRadius, y, z: 86 }, color); + } +} + +function drawSkyAtmosphere(sky, arena) { + // The station's background is one plain color, and the `wipe` at the top of + // the frame has already painted it -- so the space map draws no backdrop at + // all, and this function is the climb's weather again. + // + // It was a starfield: a hundred and twenty parallaxing stars, six gradient + // bands and a planet limb with a lit rim. @jeffrey asked for the same thing + // here he asked for of the cube's plaster -- "can the level background be + // plain colored? not stripey?" -- and the answer is the same both times. A + // decorative background is a pattern the eye keeps reading during a fight + // that has two small figures in it, and every one of those stars was + // competing with the thing you are supposed to be watching. The pattern went + // and about two hundred screen-space draws a frame went with it. + if (!survivalActive()) return; + // Broad D2D bands are effectively free compared with projected meshes and + // make the sky feel spatial without rebuilding a textured skybox each frame. + const bands = 6; + const bottom = Math.round(viewHeight * .78); + for (let band = 0; band < bands; band++) { + const y1 = Math.round(bottom * band / bands); + const y2 = Math.round(bottom * (band + 1) / bands); + const amount = (band + .5) / bands; + const color = mixColor(sky, arena, amount * .22); + box(0, y1, viewWidth(), y2 - y1 + 1, ...color); + } + const haze = mixColor(sky, arena, .34); + for (let streak = 0; streak < 11; streak++) { + const seed = .5 + .5 * Math.sin(streak * 41.37 + terrainPhase * 1.9); + const x = (streak + .18 + seed * .6) / 11 * viewWidth(); + const y = 88 + (.5 + .5 * Math.sin(streak * 19.17 - terrainPhase)) * + viewHeight * .43; + const reach = 32 + seed * 86; + line(x - reach, y, x + reach, y + (seed - .5) * 7, + 2 + seed * 2, ...haze); + } +} + +function shadowSurfaceY(x, y) { + return surfaceYAt(x, y); +} + +function drawSpotShadow(x, y, z, radius, color) { + const surfaceY = shadowSurfaceY(x, y); + const height = Math.max(0, surfaceY - y); + const reach = Math.min(520, height * .22); + const focus = clamp(1 - height / 5200, .42, 1); + const shadowX = x + globalLight.x * reach; + const shadowZ = z + globalLight.z * reach; + const center = projectPoint(shadowX, surfaceY - 2, shadowZ); + const edge = projectPoint(shadowX + radius, surfaceY - 2, shadowZ); + if (![center.x, center.y, edge.x, edge.y].every(Number.isFinite) || + [center.x, center.y, edge.x, edge.y].some((value) => Math.abs(value) > 30000)) + return; + const radiusX = Math.max(4, Math.abs(edge.x - center.x) * + (.5 + .18 * focus)); + const radiusY = Math.max(2, radiusX * (.2 + .08 * focus)); + // Bind the shadow to the owning object's depth, then bias it away from the + // camera. It remains above the terrain pass but can never win against the + // object that casts it. Restore the depth after — this used to leak, and + // everything drawn until the next assignment inherited the last shadow + // caster's depth: nondeterministic layering, frame to frame, on console. + const previousDepth = triangleDepth; + triangleDepth = projectPoint(x, y, z).z + .018; + const sides = 14; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + screenTriangle(center.x, center.y, + center.x + Math.cos(a) * radiusX, + center.y + Math.sin(a) * radiusY, + center.x + Math.cos(b) * radiusX, + center.y + Math.sin(b) * radiusY, ...color); + } + triangleDepth = previousDepth; +} + +function projectedBallRadius(ball) { + const center = projectPoint(ball.x, ball.y, ball.z); + const edge = projectPoint(ball.x + ball.radius, ball.y, ball.z); + // Do not impose a screen-space minimum: on the long street the camera can + // pull far back, and a fixed eight-pixel prop looked as if it grew relative + // to fighters and terrain. + return Math.max(.5, Math.abs(edge.x - center.x)); +} + +function drawSkateboard(player) { + const at = skateFrame(player); + if (photoThemeActive) { + const centerWorld = at(0, 5, 0); + const center = projectPoint(centerWorld.x, centerWorld.y, centerWorld.z); + const left = at(-64, 5, 0), right = at(64, 5, 0); + const a = projectPoint(left.x,left.y,left.z), b = projectPoint(right.x,right.y,right.z); + const width = Math.hypot(b.x-a.x,b.y-a.y); + photoSprite("skateboard", center.x, center.y, width, width * 136 / 412, + Math.atan2(b.y-a.y,b.x-a.x), false, center.z - .01); + return; + } + const deck = [236, 76, 118], grip = [34, 25, 39], truck = [174, 184, 202]; + const quad = (a, b, c, d, color) => worldQuad(at(...a), at(...b), at(...c), at(...d), color); + const axle = (a, b, width, color) => { + const p = at(...a), q = at(...b); + worldCapsule(p.x, p.y, p.z, q.x, q.y, q.z, Math.max(.4, width * cameraScale()), color); + }; + // Far wheels, deck, near wheels: preserve occlusion in the Canvas2D host. + const wheel = (along, side) => { + const spin = player.skateSpin || 0; + const center = at(along, skateAxleDrop, side * 15); + for (let i = 0; i < 10; i++) { + const a = spin + i * Math.PI / 5, b = spin + (i + 1) * Math.PI / 5; + worldTriangle(center, + at(along + Math.cos(a) * skateWheelRadius, + skateAxleDrop + Math.sin(a) * skateWheelRadius, side * 15), + at(along + Math.cos(b) * skateWheelRadius, + skateAxleDrop + Math.sin(b) * skateWheelRadius, side * 15), + i % 5 === 0 ? truck : [243, 210, 103]); + } + }; + const near = cameraDoll.position.z < player.z ? -1 : 1; + for (const along of [-skateTruck, skateTruck]) wheel(along, -near); + quad([-48, -4, -12], [48, -4, -12], [48, -4, 12], [-48, -4, 12], grip); + quad([-48, -4, near * 12], [48, -4, near * 12], [48, 0, near * 12], [-48, 0, near * 12], deck); + for (const end of [-1, 1]) + quad([end * 48, -4, -12], [end * 64, -12, -10], + [end * 64, -12, 10], [end * 48, -4, 12], deck); + for (const along of [-skateTruck, skateTruck]) { + axle([along, 0, 0], [along, skateAxleDrop, 0], 4, truck); + axle([along, skateAxleDrop, -15], [along, skateAxleDrop, 15], 3, truck); + wheel(along, near); + } +} + +function drawBall(ball) { + if (!ball.active) return; + const point = projectPoint(ball.x, ball.y, ball.z); + // A ball is a sphere in the orthographic world. Measuring its projected + // world radius keeps the screen hit shape circular while still respecting + // the perspective intro and loss cameras. + const radius = projectedBallRadius(ball); + if (!Number.isFinite(point.x) || !Number.isFinite(point.y) || + !Number.isFinite(radius) || radius > 12000 || point.x + radius < 0 || + point.x - radius > viewWidth() || point.y + radius < 0 || + point.y - radius > viewHeight) return; + const soccer = ball.type === "soccer"; + const beach = ball.type === "beach"; + const skateboard = ball.type === "skateboard"; + const polygon = (x, y, polygonRadius, sides, rotation, color) => { + for (let side = 0; side < sides; side++) { + const a = rotation + side * Math.PI * 2 / sides; + const b = rotation + (side + 1) * Math.PI * 2 / sides; + screenTriangle(x, y, + x + Math.cos(a) * polygonRadius, + y + Math.sin(a) * polygonRadius, + x + Math.cos(b) * polygonRadius, + y + Math.sin(b) * polygonRadius, ...color); + } + }; + if (skateboard) { + drawSkateboard({ x: ball.x, y: ball.y + skateAxleDrop + skateWheelRadius, + z: ball.z, skatePitch: ball.rotation, skateSpin: ball.skateSpin || 0 }); + return; + } + if (beach) { + const panels = [ + [244, 66, 96], [255, 146, 52], [255, 226, 66], [72, 210, 126], + [54, 196, 224], [70, 112, 238], [184, 82, 224], + ]; + const palettePhase = runtime().monotonicUs / 850000; + const paletteStep = Math.floor(palettePhase); + const paletteMix = palettePhase - paletteStep; + const sides = 16; + for (let side = 0; side < sides; side++) { + const a = ball.rotation + side * Math.PI * 2 / sides; + const b = ball.rotation + (side + 1) * Math.PI * 2 / sides; + // Native monotonic time can read negative, and a negative remainder + // would index off the front of the palette. + const panel = ((Math.floor(side / 2) + paletteStep) % panels.length + + panels.length) % panels.length; + const panelColor = mixColor(panels[panel], + panels[(panel + 1) % panels.length], paletteMix); + screenTriangle(point.x, point.y, + point.x + Math.cos(a) * radius * .92, + point.y + Math.sin(a) * radius * .92, + point.x + Math.cos(b) * radius * .92, + point.y + Math.sin(b) * radius * .92, + ...panelColor); + } + filledDisc(point.x, point.y, radius * .13, [246, 241, 220]); + return; + } + filledDisc(point.x, point.y, radius * .92, + soccer ? [226, 232, 224] : [232, 104, 28]); + const seam = [42, 31, 29]; + if (soccer) { + polygon(point.x, point.y, radius * .22, 5, + ball.rotation - Math.PI / 2, seam); + for (let patch = 0; patch < 5; patch++) { + const angle = ball.rotation + patch * Math.PI * 2 / 5; + const patchX = point.x + Math.cos(angle) * radius * .58; + const patchY = point.y + Math.sin(angle) * radius * .58; + filledCapsule(point.x + Math.cos(angle) * radius * .2, + point.y + Math.sin(angle) * radius * .2, + patchX, patchY, Math.max(1.5, radius * .035), seam); + polygon(patchX, patchY, radius * .13, 5, + angle - Math.PI / 2, seam); + } + } else { + const width = Math.max(2, radius * .075); + for (const angle of [ball.rotation, ball.rotation + Math.PI / 2]) { + const dx = Math.cos(angle) * radius * .84; + const dy = Math.sin(angle) * radius * .84; + filledCapsule(point.x - dx, point.y - dy, + point.x + dx, point.y + dy, width, seam); + } + for (const direction of [-1, 1]) { + let previous = null; + for (let step = -6; step <= 6; step++) { + const y = step / 6 * radius * .82; + const x = direction * Math.cos(step / 6 * Math.PI / 2) * radius * .42; + const next = { x: point.x + x, y: point.y + y }; + if (previous) filledCapsule(previous.x, previous.y, + next.x, next.y, width, seam); + previous = next; + } + } + filledDisc(point.x, point.y, Math.max(1.5, width * .55), seam); + } +} + +// What the bot saw this tick, drawn where it saw it: every rung in its frame +// gets a lip line, the deck it is jumping for gets its landing band, and the +// footing gets the window a jump may start from. A person watching a bot +// stand still can now read whether it is waiting for a deck to enter frame. +function drawBotScene(player) { + if (renderFlags.hud === false) return; + if (!debugHitboxes || !player.bot || !player.botScene) return; + const scene = player.botScene; + const seen = [58, 222, 255]; + for (const rung of scene.rungs) + hudWorldLine(rung.left, rung.y, 0, rung.right, rung.y, 0, 3, seen); + const goal = player.botSubgoal; + if (goal && goal.kind === "jump") { + const band = [120, 255, 120]; + hudWorldLine(goal.landLeft, goal.y, 0, goal.landRight, goal.y, 0, 6, band); + hudWorldLine(goal.aim, goal.y, 0, goal.aim, goal.y - 40, 0, 3, band); + const footing = scene.self.footing; + if (footing) + hudWorldLine(goal.takeoffLeft, footing.y, 0, goal.takeoffRight, + footing.y, 0, 6, [255, 214, 90]); + } + if (scene.lava) + hudWorldLine(worldLeft, scene.lava.y, 0, worldRight, scene.lava.y, 0, 3, + [255, 110, 70]); +} + +function drawBallHitboxes() { + if (renderFlags.hud === false) return; + if (!debugHitboxes) return; + for (const item of balls) { + if (!item.active) continue; + const point = projectPoint(item.x, item.y, item.z); + const radius = projectedBallRadius(item); + if (![point.x, point.y, radius].every(Number.isFinite) || radius > 5000 || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledRing(point.x, point.y, radius + 5, radius + 2, [58, 222, 255]); + } +} + +function drawGunPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const scale = cameraScale(); + if (photoThemeActive) { + const point = projectPoint(pickup.x,bobY,pickup.z); + const width = (pickup.kind === "ROCKET LAUNCHER" ? 105 : 56) * scale; + const region=photoWeaponRegions[pickup.kind === "ROCKET LAUNCHER" ? "launcher" : "smg"]; + if (["ROCKET LAUNCHER","RUBBER SMG"].includes(pickup.kind) && + photoEffectSprite(3,region,point.x,point.y,width,width*region[3]/region[2],0,false,point.z-.02,true)) return; + photoSprite("gun", point.x,point.y,width,width * 253 / 365,0,false,point.z-.02); + return; + } + const metal = mixColor([202, 212, 228], [52, 59, 72], visualTheme.light); + const grip = mixColor([126, 106, 88], [40, 43, 52], visualTheme.light); + const barrelWidth = Math.max(2, 5 * scale); + const gripWidth = Math.max(2, 4 * scale); + const smg = pickup.kind === "RUBBER SMG"; + const rocket = pickup.kind === "ROCKET LAUNCHER"; + if (pickup.kind === "SPACE LASER") { + // Short body, long emitter, and a lit coil at the breech so the thing on + // the top deck is identifiable as light-bearing from the floor three + // decks below. The pulse is on the same 3 Hz bob as every other pickup. + const glow = mixColor([96, 226, 255], [236, 255, 255], + .4 + .35 * Math.sin(t * 5.2)); + const shell = mixColor([206, 224, 240], [44, 54, 78], visualTheme.light); + worldCapsule(pickup.x - 22, bobY, pickup.z, + pickup.x + 14, bobY, pickup.z, barrelWidth * 1.5, shell, -.02); + worldCapsule(pickup.x + 14, bobY, pickup.z, + pickup.x + 40, bobY, pickup.z, barrelWidth * .7, glow, -.02); + worldCapsule(pickup.x - 14, bobY - 9, pickup.z, + pickup.x - 2, bobY - 9, pickup.z, barrelWidth * .6, glow, -.02); + worldCapsule(pickup.x - 6, bobY + 2, pickup.z, + pickup.x - 1, bobY + 22, pickup.z, gripWidth * 1.2, grip, -.02); + return; + } + // A handgun-sized world object in gunmetal and grip material, not a glowing + // pickup glyph with a second silhouette around it. + // Capsules, not line() — the native renderer buries the whole line + // stratum beneath the world's triangles, which is how the gun spent a day + // drawn under the floor on console while the web shell showed it fine. + worldCapsule(pickup.x - (rocket ? 58 : smg ? 42 : 16), bobY, pickup.z, + pickup.x + (rocket ? 62 : smg ? 48 : 20), bobY, pickup.z, + rocket ? barrelWidth * 2.2 : smg ? barrelWidth * 1.45 : barrelWidth, + rocket ? [48, 61, 52] : metal, -.02); + worldCapsule(pickup.x + (smg ? 8 : 2), bobY + 1, pickup.z, + pickup.x + (smg ? 13 : 8), bobY + (smg ? 27 : 18), pickup.z, + smg ? gripWidth * 1.5 : gripWidth, grip, -.02); + if (smg) { + worldCapsule(pickup.x - 42, bobY, pickup.z, + pickup.x - 65, bobY + 18, pickup.z, barrelWidth, grip, -.02); + worldCapsule(pickup.x - 6, bobY + 4, pickup.z, + pickup.x - 1, bobY + 30, pickup.z, gripWidth * 1.4, metal, -.02); + } + if (rocket) { + worldCapsule(pickup.x + 50, bobY, pickup.z, + pickup.x + 68, bobY, pickup.z, barrelWidth * 2.8, [104, 62, 48], -.02); + worldCapsule(pickup.x - 8, bobY + 3, pickup.z, + pickup.x - 3, bobY + 30, pickup.z, gripWidth * 1.5, [38, 45, 42], -.02); + } +} + +// A saber waiting on a deck: the hilt standing upright with a stub of blade +// lit above it, bobbing on the same clock as every other pickup so the map's +// loose objects share one heartbeat. Drawn short on purpose — a full-length +// blade planted in a deck would read as scenery, and this is something you +// pick up. Capsules rather than lines, for the same reason the pistol is +// capsules: the native renderer buries the whole line stratum under the +// world's triangles, and the blade would vanish into the deck it sits on. +function drawSaberPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const pulse = .5 + .5 * Math.sin(t * 5.6 + pickup.x * .002); + const glow = mixColor([120, 226, 255], [244, 252, 255], .35 + pulse * .4); + const hilt = mixColor([172, 182, 198], [46, 52, 68], visualTheme.light); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 34, pickup.z, 13, glow, -.02); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 30, pickup.z, 6, [244, 252, 255], -.02); + worldCapsule(pickup.x, bobY + 6, pickup.z, + pickup.x, bobY + 34, pickup.z, 9, hilt, -.02); + worldCapsule(pickup.x - 13, bobY + 8, pickup.z, + pickup.x + 13, bobY + 8, pickup.z, 5, hilt, -.02); +} + +function drawBullet(bullet) { + const previous = projectPoint(bullet.previousX ?? bullet.x, + bullet.previousY ?? bullet.y, bullet.z); + const point = projectPoint(bullet.x, bullet.y, bullet.z); + const blink = Math.floor(runtime().monotonicUs / 65000 + bullet.owner) % 2; + // A bolt does not blink. The pistol round's alternating white is what makes + // a slow ricochet findable against a busy floor; the laser is gone in four + // frames and wants to read as one continuous line of light instead. + const core = bullet.spit + ? bullet.heavy ? [255, 92, 174] : [118, 255, 196] + : bullet.laser ? [236, 255, 255] + : blink ? [255, 255, 248] + : bullet.rubber ? [255, 226, 58] : [255, 178, 76]; + const trail = bullet.spit + ? bullet.heavy ? [182, 48, 116] : [58, 190, 132] + : bullet.laser ? [96, 226, 255] + : blink ? [255, 244, 178] + : bullet.rubber ? [214, 178, 42] : [224, 116, 62]; + const scale = cameraScale(); + // Project the complete projectile. The old 2px/4px floors made both the + // trail and blinking core behave like HUD icons once the street zoomed out. + // + // Spit is dots, not tracers: the streak between frames is the thing that + // says "bullet", so a glob doesn't draw one — just a little ball with a + // couple of droplets falling off the arc behind it. + if (bullet.spit) { + // A glob must survive the wide portrait camera as a ball, not sub-pixel + // dust. The darker halo keeps its circular edge legible over sky or earth. + const radius = Math.max(2, (bullet.heavy ? 10 : 7) * scale); + filledDisc(point.x, point.y, radius * 1.35, trail); + filledDisc(point.x, point.y, radius, core); + filledDisc(lerp(point.x, previous.x, .5), lerp(point.y, previous.y, .5), + radius * .45, trail); + filledDisc(previous.x, previous.y, radius * .25, trail); + return; + } + drawBulletTrail(bullet, trail, scale); + if (bullet.laser) { + // Drawn as the stride itself: at 9,600 units a second the gap between two + // frames IS the beam, so a wide cyan sheath over a white core along that + // gap is the whole shot. No round cap at the tip — a bolt has a leading + // edge, not a head. + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(1.2, 9 * scale), trail); + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, 3.5 * scale), core); + return; + } + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, (bullet.rubber ? 4 : 3) * scale), trail); + filledDisc(point.x, point.y, Math.max(.9, 7 * scale), core); +} + +// The ghost of where a round has been. Walked oldest to newest so the fade +// runs the right way down the path, and drawn thin: the live tracer is the +// bullet, this is only the shape its bounces have written. +// +// Bare quads, NOT filledCapsule. A capsule is two triangles plus two discs and +// a small disc is a six-sided fan, so it costs ten faces — at the 24-bullet cap +// that is 3,600 faces of ghost against a ~2,100-face frame, which is the eleven +// -frames-a-second stray wearing a different hat. Two faces a segment caps the +// worst case at 528, and a trail wants no round caps anyway. +function drawBulletTrail(bullet, ink, scale) { + const stored = Math.min(bullet.trailCount || 0, bulletTrailPoints); + if (stored < 2) return; + // The same leash the camera uses. A round that has sailed out of the fight + // is off screen, and its ghost should not be paid for either. + if (!players.some((player) => + Math.abs(bullet.x - player.x) < 5200 && + Math.abs(bullet.y - player.y) < 5200)) return; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const oldest = (bullet.trailCount || 0) - stored; + let previous = null; + for (let step = 0; step < stored; step++) { + const slot = ((oldest + step) % bulletTrailPoints) * 2; + const here = projectPoint(bullet.trail[slot], bullet.trail[slot + 1], + bullet.z); + if (previous) { + // Newer segments carry more of the tracer's weight and colour, so the + // tail thins toward nothing rather than stopping on a hard edge. + const age = step / stored; + const radius = Math.max(.4, (bullet.rubber ? 3 : 2.2) * scale * age) / 2; + const dx = here.x - previous.x; + const dy = here.y - previous.y; + const length = Math.hypot(dx, dy); + if (length > .001) { + const nx = -dy / length * radius; + const ny = dx / length * radius; + const [r, g, b] = mixColor(ground, ink, .18 + age * .55); + screenTriangle(previous.x + nx, previous.y + ny, + previous.x - nx, previous.y - ny, here.x + nx, here.y + ny, r, g, b); + screenTriangle(previous.x - nx, previous.y - ny, + here.x - nx, here.y - ny, here.x + nx, here.y + ny, r, g, b); + } + } + previous = here; + } +} + +function drawGrenadePickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3.2 + pickup.x * .001) * 8; + const point = projectPoint(pickup.x, bobY, pickup.z); + const scale = cameraScale(); + if (photoEffectSprite(3,photoWeaponRegions.grenade,point.x,point.y, + Math.max(7,20*scale),Math.max(11,32*scale),0,false,point.z-.02,true)) return; + const shell = mixColor([166, 194, 112], [72, 96, 58], visualTheme.light); + const fuse = mixColor([210, 218, 232], [45, 50, 60], visualTheme.light); + const radius = Math.max(3, 9 * scale); + const previousDepth = triangleDepth; + triangleDepth = point.z - .02; + filledDisc(point.x, point.y, radius, shell); + triangleDepth = previousDepth; + worldCapsule(pickup.x + 1, bobY - 10, pickup.z, + pickup.x + 11, bobY - 20, pickup.z, Math.max(2, 3 * scale), fuse, -.02); +} + +function drawGrenade(grenade) { + const point = projectPoint(grenade.x, grenade.y, grenade.z); + if (grenade.exploding) { + if (drawPhotoExplosion(point.x,point.y,grenadeBlastRadius*cameraScale(), + grenade.blastAge/grenadeBlastDuration,point.z-.025)) return; + const radius = grenade.blastRadius * cameraScale(); + const width = Math.max(3, 10 * cameraScale()); + filledRing(point.x, point.y, radius, + Math.max(0, radius - width), [255, 105, 105]); + return; + } + if (grenade.rocket) { + if (photoThemeActive) { + const scale = cameraScale(); + const angle = Math.atan2(grenade.vy,grenade.vx); + photoSprite("rocket",point.x,point.y,64*scale,41*scale,angle,false,point.z-.02); + return; + } + const length = Math.hypot(grenade.vx, grenade.vy) || 1; + const tail = projectPoint(grenade.x - grenade.vx / length * 54, + grenade.y - grenade.vy / length * 54, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(5, 13 * cameraScale()), [52, 65, 56]); + filledDisc(point.x, point.y, Math.max(5, 12 * cameraScale()), [190, 74, 54]); + const flame = projectPoint(grenade.x - grenade.vx / length * 88, + grenade.y - grenade.vy / length * 88, grenade.z); + filledCapsule(flame.x, flame.y, tail.x, tail.y, + Math.max(3, 7 * cameraScale()), [255, 214, 72]); + return; + } + const blink = grenade.fuse < .45 && Math.floor(grenade.fuse * 20) % 2 === 0; + if (photoEffectSprite(3,photoWeaponRegions.grenade,point.x,point.y, + Math.max(9,30*cameraScale()),Math.max(14,48*cameraScale()), + grenade.fuse*5,grenade.vx<0,point.z-.02,true)) return; + const color = blink ? [255, 255, 255] : players[grenade.owner].color; + filledDisc(point.x, point.y, Math.max(4, 22 * cameraScale()), color); + const tail = projectPoint(grenade.x - Math.sign(grenade.vx) * 90, + grenade.y - 14, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(2, 6 * cameraScale()), color); +} + +function drawWindFlag(t, color) { + const poleX = (platformLeft + platformRight) / 2; + const poleZ = 480; + const poleBottom = platformY; + const poleTop = platformY - 150; + const calm = windMph < .35; + const flagHeight = 68; + const length = calm ? 58 : 78 + windMph * 7; + const gust = calm ? 0 + : Math.sin(t * (4 + windMph * .16)) * (10 + windMph * .8); + const tipX = poleX + windDirection * length; + const tipY = poleTop + flagHeight * .5 + gust; + const width = Math.max(3, 13 * cameraScale()); + const poleInk = mixColor([214, 222, 236], [50, 57, 70], visualTheme.light); + const edgeInk = mixColor([242, 246, 252], [26, 31, 44], visualTheme.light); + const fabric = calm + ? mixColor([92, 205, 255], [35, 112, 190], visualTheme.light) : color; + const flagPoints = [ + projectPoint(poleX, poleTop, poleZ), + projectPoint(tipX, tipY, poleZ), + projectPoint(poleX, poleTop + flagHeight, poleZ), + ]; + if (flagPoints.every((point) => [point.x, point.y, point.z].every(Number.isFinite))) + projectedTriangle(flagPoints[0], flagPoints[1], flagPoints[2], fabric); + worldCapsule(poleX, poleBottom, poleZ, + poleX, poleTop, poleZ, width, poleInk); + const edgeWidth = Math.max(2, width * .34); + worldCapsule(poleX, poleTop, poleZ, + tipX, tipY, poleZ, edgeWidth, edgeInk); + worldCapsule(tipX, tipY, poleZ, + poleX, poleTop + flagHeight, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX, poleTop + flagHeight, poleZ, + poleX, poleTop, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX - 35, poleBottom, poleZ, + poleX + 35, poleBottom, poleZ, width, poleInk); +} + +function hashUnit(text) { + let hash = 2166136261; + for (let cursor = 0; cursor < text.length; cursor++) { + hash ^= text.charCodeAt(cursor); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967295; +} + +function airSeedValue(index, channel = 0) { + return hashUnit("oskiewar-air:" + index + ":" + channel); +} + +function resetAirParticles() { + const count = 18; + const spanX = worldRight - worldLeft; + const spanY = floorY - ceilingY; + const spanZ = worldFar - worldNear; + airParticles.length = 0; + for (let index = 0; index < count; index++) + airParticles.push({ + id: "air:" + index, + kind: "air", + position: { + x: worldLeft + airSeedValue(index, 1) * spanX, + y: ceilingY + 180 + airSeedValue(index, 2) * (spanY - 360), + z: worldNear + 100 + airSeedValue(index, 3) * (spanZ - 200), + }, + velocity: { x: 0, y: 0, z: 0 }, + radius: 8 + airSeedValue(index, 4) * 14, + phase: airSeedValue(index, 5) * Math.PI * 2, + }); +} + +// A stream-function curl gives the air a divergence-free-looking circulation +// instead of independent sine wiggles. Entities relax toward this velocity, +// advect in fixed simulation time, and wrap at arena boundaries. +function airFlowAt(position, seconds, phase) { + const nx = (position.x - worldLeft) / (worldRight - worldLeft) * Math.PI * 2; + const ny = (position.y - ceilingY) / (floorY - ceilingY) * Math.PI * 2; + const age = seconds * .32 + phase; + const circulation = 96; + return { + x: windDirection * (42 + windMph * 12) + + circulation * Math.sin(nx + age) * Math.cos(ny - age * .7), + y: -circulation * Math.cos(nx + age) * Math.sin(ny - age * .7), + z: 44 * Math.sin(nx + ny + age * .55), + }; +} + +const wrapWorld = (value, low, high) => { + const span = high - low; + return low + ((value - low) % span + span) % span; +}; + +function simulateAirParticles(dt, now) { + if (!airParticles.length) resetAirParticles(); + const seconds = now / 1000000; + const response = 1 - Math.exp(-dt * 2.8); + for (const entity of airParticles) { + const flow = airFlowAt(entity.position, seconds, entity.phase); + entity.velocity.x = lerp(entity.velocity.x, flow.x, response); + entity.velocity.y = lerp(entity.velocity.y, flow.y, response); + entity.velocity.z = lerp(entity.velocity.z, flow.z, response); + entity.position.x = wrapWorld(entity.position.x + entity.velocity.x * dt, + worldLeft, worldRight); + entity.position.y = wrapWorld(entity.position.y + entity.velocity.y * dt, + ceilingY + 120, floorY - 120); + entity.position.z = wrapWorld(entity.position.z + entity.velocity.z * dt, + worldNear + 80, worldFar - 80); + } +} + +function drawAmbientMotes(color) { + const previousDepth = triangleDepth; + for (const entity of airParticles) { + const { x, y, z } = entity.position; + const point = projectPoint(x, y, z); + const edge = projectPoint(x + entity.radius, y, z); + const radius = Math.max(.8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const depthAmount = (z - worldNear) / (worldFar - worldNear); + const ink = mixColor([18, 24, 48], color, .24 + (1 - depthAmount) * .34); + if (![point.x, point.y, point.z, radius].every(Number.isFinite) || + point.x < stageLeft - radius || point.x > stageRight + radius || + point.y < -radius || point.y > viewHeight + radius) continue; + triangleDepth = point.z; + filledDisc(point.x, point.y, radius, ink); + } + triangleDepth = previousDepth; +} + +function drawSelectPortrait(player, x, y, scale, t) { + const color = player.color; + const head = { x, y: y - 130 * scale, radius: 34 * scale }; + filledDisc(head.x, head.y, head.radius + Math.max(2, 3 * scale), [8, 12, 24]); + filledDisc(head.x, head.y, head.radius, color); + hudLine(x, y - 94 * scale, x, y + 20 * scale, 12 * scale, ...color); + hudLine(x, y - 65 * scale, x - 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y - 65 * scale, x + 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y + 20 * scale, x - 48 * scale, y + 112 * scale, 11 * scale, ...color); + hudLine(x, y + 20 * scale, x + 48 * scale, y + 112 * scale, 11 * scale, ...color); + drawFace(player, head, contrastShadow(color), t); +} + +function selectionPreview(option) { + return { ...players[1], name: option.fighter.handle, + color: option.fighter.color, + npc: option.kind === "dummy" || option.kind === "bot", + bot: option.kind === "bot" }; +} + +function drawSelectionScreen(t, ink, panel) { + const layout = selectionTouchLayout(); + const hover = selectionHover(layout); + if (globalThis.__oskiewarTouch) globalThis.__oskiewarTouch.hover = hover; + const compact = compactLayout(); + const title = selectionStep === 0 ? "pick your pal" : "who are you fighting?"; + const titleSize = compact ? 36 : 58; + const titleY = compact ? 58 : 86; + const titleWidth = handleWidth(title, titleSize); + typeWrite(title, viewCenterX() - titleWidth / 2, titleY, titleSize, ...ink); + const stepText = (selectionStep + 1) + "/2"; + const stepSize = compact ? 24 : 32; + typeWrite(stepText, layout.back.x + layout.back.width + (compact ? 18 : 28), + layout.back.y + (compact ? 11 : 18), stepSize, + ...mixColor([140, 150, 185], ink, .35)); + const backHovered = hover?.back; + const options = selectionOptions(); + // Neighbours first so the focused card always lands on top of them. + const wheel = [...layout.options].sort((a, b) => + Math.abs(b.slot) - Math.abs(a.slot)); + for (const rect of wheel) { + const option = options[rect.index]; + const player = selectionPreview(option); + const disabled = Boolean(option.disabled); + const hovered = !disabled && hover?.option === rect.index; + const focused = !disabled && rect.slot === 0; + const disabledInk = mixColor([74, 80, 96], [164, 168, 178], + visualTheme.light); + const optionColor = disabled ? disabledInk : option.fighter.color; + if (hovered || focused) + box(rect.x, rect.y + rect.height - (hovered ? 8 : 5), rect.width, + hovered ? 8 : 5, ...optionColor); + const scale = rect.height / 520 * 1.05; + const portraitY = rect.y + rect.height * (compact ? .55 : .53); + drawSelectPortrait(player, rect.x + rect.width / 2, portraitY, scale, t); + const label = option.fighter.handle.toLowerCase(); + const labelSize = Math.max(16, Math.round(rect.width * .085)); + const labelWidth = handleWidth(label, labelSize); + drawHandle(label, rect.x + (rect.width - labelWidth) / 2, + rect.y + rect.height - labelSize - (compact ? 10 : 18), labelSize, + disabled ? [disabledInk] : option.fighter.colors, optionColor); + } + // Chevrons inside the focused card name the gesture that turns the wheel, + // without crowding the neighbours they point at. + if (layout.options.length > 1) { + const focus = layout.options.find((rect) => rect.slot === 0); + const arrowSize = compact ? 30 : 52; + const arrowY = focus.y + focus.height / 2 - arrowSize / 2; + const inset = (compact ? 8 : 14) + Math.sin(t * 3.4) * (compact ? 3 : 6); + typeWrite("<", focus.x + inset, arrowY, arrowSize, ...ink); + typeWrite(">", focus.x + focus.width - inset - + comicGlyphAdvance(">", arrowSize), arrowY, arrowSize, ...ink); + } + // Keep navigation above every option on narrow/tall browser layouts. + box(layout.back.x, layout.back.y, layout.back.width, layout.back.height, + ...mixColor(panel, ink, backHovered ? .25 : .08)); + typeWrite("< back", layout.back.x + (compact ? 12 : 20), + layout.back.y + (compact ? 10 : 17), compact ? 25 : 34, ...ink); + const controls = selectionControlKeys(); + drawCenteredKeycapRun(controls, viewHeight - (compact ? 52 : 66), + compact ? 15 : 20, inputPads[0]?.down || [], ink); +} + +const titlePaletteNight = [ + [255, 105, 190], [111, 232, 210], [255, 232, 92], [130, 150, 255], + [255, 126, 92], [188, 128, 255], [92, 205, 255], [246, 248, 255], +]; +const titlePaletteDay = [ + [190, 32, 118], [0, 126, 124], [176, 112, 0], [73, 82, 190], + [204, 59, 43], [114, 68, 185], [24, 107, 181], [47, 56, 82], +]; + +function animatedTitleColor(index, t, daylight = visualTheme.light) { + const count = titlePaletteNight.length; + // Native monotonic time can begin a fraction before startedAt settles. + // Normalize the remainder so that first frame still lands in the palette. + const phase = ((index + t * .42) % count + count) % count; + const from = Math.floor(phase); + const amount = phase - from; + const eased = amount * amount * (3 - amount * 2); + const night = mixColor(titlePaletteNight[from], + titlePaletteNight[(from + 1) % count], eased); + const day = mixColor(titlePaletteDay[from], + titlePaletteDay[(from + 1) % count], eased); + return mixColor(night, day, daylight); +} + +// The dummy count, as a sentence. The host hands over a window and a total; +// the window is already the shortest one that had anything in it, so all that +// is left here is to say it in English. Zero returns nothing at all — an +// arcade does not advertise that nobody played today. +function dummyPopLine(stat) { + const pops = Math.floor(Number(stat?.pops) || 0); + const hours = Math.floor(Number(stat?.hours) || 0); + if (pops <= 0 || hours <= 0 || hours > 48) return ""; + return pops + " dummy head" + (pops === 1 ? "" : "s") + " popped in the last " + + (hours === 1 ? "hour" : hours + " hours"); +} + +function drawDummyPopLine(titleY, titleSize, transitionInk) { + // Not on the poster: the social preview is burned to a file whose hash is + // checked at deploy, and a number that moves would make it stale hourly. + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const line = dummyPopLine(capabilities().pops); + if (!line) return; + const size = Math.round(hudTypeSize * (compactLayout() ? .46 : .56)); + const width = handleWidth(line, size); + const x = viewCenterX() - width / 2; + const y = titleY + titleSize + (compactLayout() ? 12 : 18); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || + mixColor([198, 206, 232], [58, 70, 104], visualTheme.light); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); +} + +// "Add your coach." @jeffrey: "itd be cool so any user can claude into an +// oskiewar game ... 'coach' would be the feature ... which could then analyze +// your matches / do things / get ur data". The relay has always counted a +// read-only `agent` seat apart from the grandstand; this offers that seat on +// the title as a thing a player can do — hand oskiewar.com/coach.mjs to their +// own Claude and it sits in on this room, reading every frame a phone reads. +// The room name is the whole invitation, since it is what a coach attaches +// to, so it is printed here under START where a newcomer is already looking. +// Once a coach is seated the line says so, with the antenna the debug +// read-out lights, and keeps the name up so the player can tell the coach is +// watching this room and not an earlier one. Never on the poster: the social +// preview is hash-bound, and a room name changes with every burn. +function drawCoachLine(button, transitionInk) { + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const room = versusRoomName || sessionName; + if (!room) return; + const compact = compactLayout(); + const linked = linkedAgents(); + const line = linked ? "coach linked " + room + : "add your coach oskiewar.com/coach " + room; + const size = Math.round(hudTypeSize * (compact ? .46 : .56)); + const width = handleWidth(line, size); + const glyph = linked ? Math.round(size * 1.2) : 0; + const x = viewCenterX() - (width + glyph) / 2 + glyph; + const y = button.y + button.height + (compact ? 6 : 10); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || (linked ? [120, 226, 255] + : mixColor([198, 206, 232], [58, 70, 104], visualTheme.light)); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); + if (linked) drawAgentLink(x - glyph * .6, y + size * .55, size / 26, linked); +} + +function titleButtonRect() { + const compact = compactLayout(); + const textSize = hudTypeSize; + const textWidth = handleWidth("start", textSize); + const width = textWidth + (compact ? 54 : 76); + const height = textSize + (compact ? 24 : 34); + return { x: viewCenterX() - width / 2, + y: viewHeight * (compact ? .61 : .64) - (compact ? 10 : 15), + width, height, textSize, textWidth }; +} + +// A letter you can push around. `grow` eases toward 1 while the pointer is on +// it and `kick` is a decaying shudder fired the frame it is first touched, so +// the word answers one letter at a time instead of inflating as a block. +function toyGlyph(toys, index, hot, dt) { + const toy = toys[index] || (toys[index] = { grow: 0, kick: 0, hot: false }); + toy.grow += ((hot ? 1 : 0) - toy.grow) * (1 - Math.exp(-dt * (hot ? 16 : 7))); + if (hot && !toy.hot) toy.kick = 1; + toy.hot = hot; + toy.kick *= Math.exp(-dt * 5.5); + return toy; +} + +const pointInCell = (point, x, y, width, height) => point && x <= point.x && + point.x <= x + width && y <= point.y && point.y <= y + height; + +// Screen-space outline, four boxes, no projection — safe anywhere. +function strokeBox(x, y, width, height, thickness, color) { + hudBox(x, y, width, thickness, ...color); + hudBox(x, y + height - thickness, width, thickness, ...color); + hudBox(x, y, thickness, height, ...color); + hudBox(x + width - thickness, y, thickness, height, ...color); +} + +function drawTitleScreen(t, ink, transitionAge = -1) { + const compact = compactLayout(); + const socialPreview = typeof capabilities === "function" && + capabilities().socialPreview === true; + // Keep the game identity visible on the opening frame. The live fighters + // and START remain interactive beneath the wordmark. + const title = "oskiewar"; + const version = "v" + buildVersion; + const breath = 1 + Math.sin(t * .9) * .018; + const socialLockupGap = compact ? 10 : 18; + const socialTitleSize = Math.min(220, + (viewWidth() - 56 - socialLockupGap) / + (handleWidth(title, 1) + handleWidth(version, .3))); + const titleSize = (socialPreview ? socialTitleSize : compact ? 88 : 154) * breath; + const titleWidth = handleWidth(title, titleSize); + const versionSize = Math.round(titleSize * .3); + const versionWidth = handleWidth(version, versionSize); + const lockupGap = socialPreview ? socialLockupGap : compact ? 10 : 18; + const lockupWidth = titleWidth + lockupGap + versionWidth; + const titleX = viewCenterX() - lockupWidth / 2; + const titleY = viewHeight * (compact ? .38 : .35); + + // Air fuzzies: sparse motes drifting the whole frame, no panels or stripes + // behind the wordmark. + if (transitionAge < 0 && renderFlags.dust !== false) + for (let index = 0; index < (compact ? 10 : 16); index++) { + const phase = index * 2.39996; + const x = stageLeft + (stageRight - stageLeft) * + (.5 + .47 * Math.sin(t * (.055 + index % 5 * .01) + phase)); + const y = viewHeight * + (.5 + .45 * Math.cos(t * (.043 + index % 4 * .012) + phase * 1.7)); + const radius = (compact ? 2 : 3) + (index % 3); + hudCircle(x, y, radius, Math.max(1.5, radius * .48), + animatedTitleColor(index, t * .7)); + } + + let cursor = titleX; + // Kerning scaffold: one cell per glyph, taken from the same advance the + // layout walks, so drift and bob read against their own metrics. + const glyphCells = debugHitboxes && transitionAge < 0 && !socialPreview && + renderFlags.hud !== false ? [] : null; + const flashPalette = [[255, 226, 48], [70, 224, 92], [181, 255, 48]]; + const flash = transitionAge >= 0 + ? flashPalette[Math.floor(transitionAge / .065) % flashPalette.length] : null; + const fade = transitionAge >= 0 ? clamp((transitionAge - .46) / .24, 0, 1) : 0; + const transitionInk = flash ? mixColor(flash, [7, 10, 26], fade) : null; + // Toys ease in real time, and the burn renders headless with no pointer, so + // the poster stays the same picture it always was. + const dt = titleToyAt < 0 ? 0 : clamp(t - titleToyAt, 0, .1); + titleToyAt = t; + const raw = globalThis.__oskiewarTouch?.pointer; + const pointer = transitionAge < 0 && !socialPreview && raw?.active && + Number.isFinite(raw.x) && Number.isFinite(raw.y) ? raw : null; + let held = -1; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const bob = Math.sin(t * 2.05 + index * .72) * (compact ? 5 : 8); + const drift = Math.cos(t * 1.12 + index * .91) * (compact ? 3 : 5) + + Math.sin(t * .63 + index * 1.71) * (compact ? 7 : 12); + const advance = comicGlyphAdvance(character, titleSize); + // The cell is what the pointer touches, so a letter that has swollen out + // of it cannot chase the cursor or shove its neighbours along the line. + // + // The letter the pointer already holds is tested against a cell grown by + // exactly how far this letter can travel — the sum of its drift terms + // across, its bob down — so the whole of its wander happens without the + // grab ever being dropped. Every other letter is tested honestly, or a + // held letter would keep stealing the pointer from its neighbours. + const slackX = titleGlyphHot === index ? (compact ? 10 : 17) : 0; + const slackY = titleGlyphHot === index ? (compact ? 5 : 8) : 0; + const hot = pointInCell(pointer, cursor + drift - slackX, + titleY + bob - slackY, advance + slackX * 2, titleSize + slackY * 2); + if (hot) held = index; + const toy = toyGlyph(titleToys, index, hot, dt); + const size = titleSize * + (1 + toy.grow * .38 + toy.kick * Math.sin(t * 31 + index) * .17); + const shudder = toy.kick * Math.sin(t * 27 + index * 1.3) * + (compact ? 6 : 11); + const glyphX = cursor + drift + + (advance - comicGlyphAdvance(character, size)) / 2 + shudder; + const glyphY = titleY + bob - (size - titleSize) * .5 - + toy.grow * (compact ? 6 : 11); + const shadowOffset = Math.max(4, Math.min(5, Math.round(size * .025))); + typeWrite(character, glyphX + shadowOffset, glyphY + shadowOffset, + size, ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(character, glyphX, glyphY, + size, ...(transitionInk || animatedTitleColor(index, t))); + if (glyphCells) glyphCells.push([cursor + drift, titleY + bob, advance]); + cursor += advance; + } + const versionX = titleX + titleWidth + lockupGap; + const versionY = titleY + titleSize - versionSize * 1.15; + const versionEdge = contrastShadow(transitionInk || ink); + for (const [dx, dy] of [[-2, 0], [2, 0], [0, -2], [0, 2]]) + typeWrite(version, versionX + dx, versionY + dy, versionSize, ...versionEdge); + typeWrite(version, versionX, versionY, versionSize, + ...(transitionInk || ink)); + if (survivalActive()) { + const mode = "survival"; + const modeSize = Math.round(titleSize * .28); + const modeWidth = handleWidth(mode, modeSize); + const modeX = viewCenterX() - modeWidth / 2; + const modeY = titleY + titleSize + (compact ? 8 : 12); + typeWrite(mode, modeX + 2, modeY + 3, modeSize, + ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(mode, modeX, modeY, modeSize, ...(transitionInk || ink)); + } else drawDummyPopLine(titleY, titleSize, transitionInk); + if (glyphCells) { + strokeBox(titleX, titleY, titleWidth, titleSize, 2, [92, 132, 255]); + for (const [x, y, advance] of glyphCells) { + strokeBox(x, y, advance, titleSize, 2, [255, 92, 116]); + hudBox(x, y, 2, titleSize, 116, 255, 184); + } + } + + const prompt = "start"; + const button = titleButtonRect(); + const hovered = Boolean(pointer) && pointInRect(pointer, button); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.titleButton = button; + globalThis.__oskiewarTouch.titleHover = hovered; + globalThis.__oskiewarTouch.titleGlyph = held; + } + titleGlyphHot = held; + promptBounce += ((hovered ? 1 : 0) - promptBounce) * + (1 - Math.exp(-dt * (hovered ? 14 : 6))); + const promptPulse = .68 + (Math.sin(t * 3.2) + 1) * .16; + const promptInk = transitionInk || + mixColor([196, 142, 18], [255, 238, 82], promptPulse); + // The word floats on its own; the rect survives only as the touch target. + // Yellow type on a bright sky needs an edge, so a sharp offset shadow + // deepens as the background lightens and lifts as it goes to night. + if (!socialPreview) { + let promptCursor = button.x + (button.width - button.textWidth) / 2; + const promptY = button.y + (button.height - button.textSize) / 2 - 2; + const offset = Math.max(3, Math.round(button.textSize * .1)); + const shadowInk = mixColor([10, 12, 30], [86, 26, 116], visualTheme.light); + const litInk = hovered + ? mixColor(promptInk, [255, 255, 255], .35) : promptInk; + for (let index = 0; index < prompt.length; index++) { + const character = prompt[index]; + const advance = comicGlyphAdvance(character, button.textSize); + const toy = toyGlyph(promptToys, index, + pointInCell(pointer, promptCursor, promptY, advance, button.textSize), + dt); + // The whole word takes the bounce, but each letter takes it a beat after + // the one before, so start reads as a hop travelling along the word. + const hop = promptBounce * button.textSize * .3 * + Math.abs(Math.sin(t * 5.4 - index * .62)); + const size = button.textSize * (1 + toy.grow * .2 + toy.kick * .12); + const x = promptCursor + (advance - comicGlyphAdvance(character, size)) / 2; + const y = promptY - hop - (size - button.textSize) * .5; + if (!transitionInk) + typeWrite(character, x + offset, y + offset, size, ...shadowInk); + typeWrite(character, x, y, size, ...litInk); + promptCursor += advance; + } + // The pace dial. Quiet unless the clock is off its default — or was just + // touched, so stepping back to one still answers the keypress — and it + // lives large in the bottom-right corner, a dashboard readout rather + // than a footnote under the start word. + const paceNow = runtime().monotonicUs; + if (gameSpeed !== 1 || (gameSpeedChangedAt && + paceNow - gameSpeedChangedAt < 2400000)) { + const pace = "×" + gameSpeed; + const paceSize = Math.max(30, Math.round(button.textSize * .8)); + const hud = hudSafeRect(); + const paceX = hud.right - handleWidth(pace, paceSize); + const paceY = hud.bottom - paceSize; + typeWrite(pace, paceX + 3, paceY + 4, paceSize, ...shadowInk); + typeWrite(pace, paceX, paceY, paceSize, ...promptInk); + } + drawCoachLine(button, transitionInk); + } + // Touch play keeps its thumbs in the bottom corners, and the fight is live + // under this screen now, so the stamp yields the pad rather than sit on it. + if (transitionAge >= 0 || socialPreview || (typeof capabilities === + "function" && capabilities().inputFamily === "touch")) return; + const titleUnixMs = runtime().unixMs || Date.now(); + const safe = hudSafeRect(); + // No frame rate under the wordmark. The read-out has one home — the + // bottom-left lane above the nameplate, where a fight already shows it — + // and a second copy parked in the middle of the poster only crowded the + // kerning cells it was sitting next to. + const clock = hudClockBox(titleUnixMs); + drawHudClock(clock, safe.top + 2, ink, titleUnixMs); + drawHudStatusTray(clock, ink, titleUnixMs); +} + +function pacificTimeLabel(unixMs) { + // The arena clock follows Pacific time without displaying a zone suffix. + const date = new Date(unixMs); + const year = date.getUTCFullYear(); + const nthSunday = (month, occurrence, hour) => { + const first = new Date(Date.UTC(year, month, 1)); + const day = 1 + ((7 - first.getUTCDay()) % 7) + (occurrence - 1) * 7; + return Date.UTC(year, month, day, hour); + }; + const daylight = unixMs >= nthSunday(2, 2, 10) && + unixMs < nthSunday(10, 1, 9); + const local = new Date(unixMs - (daylight ? 7 : 8) * 3600000); + const hour = local.getUTCHours(); + const minute = String(local.getUTCMinutes()).padStart(2, "0"); + const second = String(local.getUTCSeconds()).padStart(2, "0"); + return String(hour % 12 || 12) + ":" + minute + ":" + second; +} + +// Status indicators share one lane rather than each finding its own corner, so +// they read as a set: same cell, same row, in the title-safe frame just left of +// the wall clock. The lane is right-aligned because the clock and the round QR +// grow leftward from the same edge. +const statusGap = 6; +const statusCellSize = () => shellMode === "GAME" && debugHitboxes ? 56 : 26; + +function hudStatusIcons() { + const icons = []; + if (typeof capabilities === "function" && capabilities().midi) icons.push("midi"); + return icons; +} + +// The clock's footprint is computed once and shared, so the lane cannot drift +// out of step with where the clock actually lands. +function hudClockBox(unixMs) { + const safe = hudSafeRect(); + const label = pacificTimeLabel(unixMs); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 16 : hudTypeSize; + const qrBox = spectatorQrBox(); + const anchor = qrBox ? qrBox.left - 14 : safe.right; + // National identity begins at this corner: the local country's flag flies + // just left of the QR and the clock lane slides over to make room. US + // first — more flags join as they are drawn. + const flagCode = typeof capabilities === "function" && + capabilities().country === "US" ? "US" : ""; + const flagWidth = flagCode ? Math.round(size * 2.1) : 0; + const right = anchor - (flagCode ? flagWidth + 12 : 0); + const dialRadius = Math.max(6, Math.round(size * .38)); + const dialGap = Math.max(5, Math.round(size * .2)); + const textRight = right - dialRadius * 2 - dialGap; + return { label, size, right, textRight, dialRadius, anchor, flagCode, + flagWidth, dialX: right - dialRadius, + left: textRight - handleWidth(label, size) }; +} + +// Old Glory at corner scale: seven stripes and a starred canton read as the +// flag long before thirteen would, and the stars stay dots — real stars need +// more pixels than the corner owns. Shadowed like the type beside it so it +// flies on any sky. +function drawUsFlag(x, y, width, height, ink) { + hudBox(x + 2, y + 2, width, height, ...contrastShadow(ink)); + const stripes = 7; + for (let stripe = 0; stripe < stripes; stripe++) { + const top = y + Math.round(stripe * height / stripes); + const bottom = y + Math.round((stripe + 1) * height / stripes); + hudBox(x, top, width, bottom - top, + ...(stripe % 2 ? [238, 242, 247] : [188, 32, 46])); + } + const cantonWidth = Math.round(width * .44); + const cantonHeight = Math.round(height * 4 / stripes); + hudBox(x, y, cantonWidth, cantonHeight, 38, 52, 122); + for (let star = 0; star < 6; star++) + filledDisc(x + Math.round(cantonWidth * (.22 + (star % 3) * .28)), + y + Math.round(cantonHeight * (star < 3 ? .3 : .7)), + Math.max(1, Math.round(height * .05)), [238, 242, 247]); +} + +function drawHudClock(clock, y, ink, unixMs) { + typeWrite(clock.label, clock.left + 3, y + 3, + clock.size, ...contrastShadow(ink)); + const match = clock.label.match(/^(\d+)(:)(\d{2})(:)(\d{2})$/); + const parts = match ? match.slice(1) : [clock.label]; + const syntax = visualTheme.light ? titlePaletteDay : titlePaletteNight; + const colors = [syntax[0], ink, syntax[1], ink, syntax[2]]; + let x = clock.left; + parts.forEach((part, index) => { + typeWrite(part, x, y, clock.size, ...(colors[index] || ink)); + x += handleWidth(part, clock.size); + }); + const centerY = y + clock.size * .48; + const seconds = ((unixMs / 1000) % 60 + 60) % 60; + const segments = 24; + const filled = seconds / 60 * segments; + filledDisc(clock.dialX + 2, centerY + 2, clock.dialRadius, + contrastShadow(ink)); + filledDisc(clock.dialX, centerY, clock.dialRadius, + mixColor([20, 24, 38], [238, 241, 247], visualTheme.light)); + for (let segment = 0; segment < Math.ceil(filled); segment++) { + const start = -Math.PI / 2 + segment / segments * Math.PI * 2; + const end = -Math.PI / 2 + Math.min(segment + 1, filled) / + segments * Math.PI * 2; + screenTriangle(clock.dialX, centerY, + clock.dialX + Math.cos(start) * clock.dialRadius, + centerY + Math.sin(start) * clock.dialRadius, + clock.dialX + Math.cos(end) * clock.dialRadius, + centerY + Math.sin(end) * clock.dialRadius, ...syntax[2]); + } + hudCircle(clock.dialX, centerY, clock.dialRadius, 2, ink); +} + +function hudStatusTray(clock = null) { + const icons = hudStatusIcons(); + if (!icons.length) return null; + const statusCell = statusCellSize(); + const safe = hudSafeRect(); + const qrBox = spectatorQrBox(); + const right = clock ? clock.left - 14 + : qrBox ? qrBox.left - 14 : safe.right; + const width = icons.length * statusCell + (icons.length - 1) * statusGap; + return { icons, right, left: right - width, top: safe.top, + height: statusCell }; +} + +// A one-octave keyboard: seven equal white keys with the black keys only on the +// boundaries that have them, so it reads as a piano at this size instead of an +// approximate smear. It brightens for a beat whenever a note leaves. +function drawStatusPiano(x, y, lit) { + const width = 21, height = 14, key = width / 7; + const left = Math.round(x - width / 2), top = Math.round(y - height / 2); + hudBox(left, top, width, height, ...(lit ? [108, 240, 168] : [176, 184, 202])); + for (const step of [1, 2, 4, 5, 6]) + hudBox(Math.round(left + step * key) - 1, top, 2, Math.round(height * .58), + 23, 27, 40); +} + +function drawHudStatusTray(clock, ink, unixMs) { + const tray = hudStatusTray(clock); + const statusCell = statusCellSize(); + // Debug is global state, so its large indicator owns bottom-center rather than + // masquerading as another peripheral in the clock-side status tray. + if (debugHitboxes && !performanceFooterVisible()) { + const safe = hudSafeRect(); + const top = safe.bottom - statusCell; + drawDebugBug(viewCenterX(), top + statusCell / 2 + 2, + statusCell / 26); + // The session's name rides beside the bug: it is what a telemetry agent + // attaches to, and debug mode is exactly the moment somebody wants to + // read that name off the screen and type it into a terminal. + if (sessionName) { + const size = Math.max(17, Math.round(statusCell * .4)); + typeWrite(sessionName, viewCenterX() + statusCell * .62, + top + statusCell / 2 + 2 - size / 2, size, ...ink); + } + // And the linked-agent mark keeps the bug company on its other side — + // @jeffrey: "can the little agent icon be near the debug ladybug, not by + // the fps". The name says where to attach; the antenna says who has. + const agents = linkedAgents(); + if (agents) { + const scale = statusCell / 34; + drawAgentLink(viewCenterX() - statusCell * .62 - 14 * scale, + top + statusCell / 2 + 2, scale, agents); + } + } + if (!tray) return; + const lit = typeof capabilities === "function" && + unixMs - (capabilities().midiPulse || 0) < 140; + tray.icons.forEach((name, index) => { + const x = tray.left + index * (statusCell + statusGap) + statusCell / 2; + const y = tray.top + tray.height / 2; + if (name === "midi") drawStatusPiano(x, y, lit); + }); +} + +function drawDebugBug(x, y, scale = 1) { + const shell = [255, 86, 126]; + const detail = [22, 12, 34]; + const limb = (x1, y1, x2, y2, width, color) => + filledCapsule(x1, y1, x2, y2, width, color); + filledDisc(x, y + 2 * scale, 8 * scale, shell); + filledDisc(x, y - 6 * scale, 5 * scale, shell); + limb(x, y - 7 * scale, x - 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x, y - 7 * scale, x + 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x - 5 * scale, y, x - 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x + 5 * scale, y, x + 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x - 5 * scale, y + 5 * scale, x - 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x + 5 * scale, y + 5 * scale, x + 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x, y - scale, x, y + 9 * scale, 2 * scale, detail); + filledDisc(x - 2 * scale, y - 7 * scale, 1.2 * scale, detail); + filledDisc(x + 2 * scale, y - 7 * scale, 1.2 * scale, detail); +} + +// The title owns the share code; active maps keep the corner clear. +function spectatorQrBox() { + if (shellMode === "GAME") return null; + if (typeof capabilities === "function" && capabilities().socialPreview) + return null; + if (!spectatorQr || typeof spectatorQr.getModuleCount !== "function") + return null; + const safe = hudSafeRect(); + const count = spectatorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor((compactLayout() ? 108 : 158) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + // The QR anchors on the safe rect's top-right corner — the exact spot the + // debug overlay draws its yellow corner crop. With the bug lit the + // instrument wins: the code steps below the crop instead of covering it, + // and every lane that asks this box (the clock included) follows it down. + const top = safe.top + (debugHitboxes ? 52 : 0); + return { left: safe.right - size, top, size, cell, count, quiet }; +} + +// Where the bare frame rate shows with the overlay off: the console, in a +// fight. The debug read-out itself never asks which screen it is on. +const bareFrameRateShown = () => nativeTrianglePass && shellMode === "GAME"; +function drawDebugPerformance(ink) { + // The wordmark screen used to hide this row, but the title is a running + // fight with a frame budget of its own — debug mode reads the machine, not + // the match, so the numbers stay up wherever the bug is lit. Only a round's + // result card still clears the lane, because the card owns it. + if (roundResult) return; + // The console keeps a bare frame rate on the HUD through a fight even + // with the debug overlay off — @jeffrey, 2026-09-20: "when game is + // playing lets still show fps in hud". One short word, so the read-out + // costs the frame it measures almost nothing. + const bare = !debugHitboxes; + if (bare && !bareFrameRateShown()) return; + const metaSize = debugReadoutMetaSize(); + const run = runtime(); + // Every line waits for a real measurement. The read-out used to answer with + // the logical stage size, the measured frame rate wearing a Hz label, and a + // row of zeroed milliseconds — three numbers that looked like instruments and + // were not. The browser now times its own frame span and its own paint, so it + // fills the rate and two of the three stages honestly; the render surface is + // still the console's alone, and a browser can never time the compositor's + // present, so that stage stays out of the row rather than reading 0.00ms. + // Native frameMs measures the whole host frame. Its legacy refreshHz + // field is also measured FPS, not the display mode's refresh rate. + const measuredFrameMs = Number(run.frameMs) || 0; + const measuredFps = measuredFrameMs > 0 ? 1000 / measuredFrameMs : displayFps; + const rate = Math.round(measuredFps || 0) + " fps"; + if (bare) { + const lane = playerHandleLayout(players[0], 0); + typeWrite(rate, lane.x, lane.y - metaSize - 6, metaSize, ...ink); + return; + } + const renderWidth = Math.round(Number(run.renderWidth) || Number(run.width) || 0); + const renderHeight = Math.round(Number(run.renderHeight) || Number(run.height) || 0); + const aa = Math.max(1, Math.round(Number(run.antialiasingSamples) || 1)); + const surface = renderWidth && renderHeight + ? " · " + renderWidth + "x" + renderHeight + " · " + + String(run.antialiasingMode || (aa + "x")) : ""; + const frameMs = Number(run.frameMs) || 0; + const presentMs = Number(run.presentMs) || 0; + const timing = frameMs + ? "frame " + frameMs.toFixed(2) + "ms render " + + (Number(run.renderCpuMs) || 0).toFixed(2) + "ms" + + (presentMs ? " present " + presentMs.toFixed(2) + "ms" : "") : ""; + // The bottom-left corner belongs to a fighter's nameplate, so the read-out + // stacks upward from just above it instead of printing across a handle. The + // ammo row keeps its own lane a stat card further up, well clear of this. + const lane = playerHandleLayout(players[0], 0); + let y = lane.y - metaSize - 6; + // One line of proof per debug toggle: the console renders this read-out + // where no devtools can confirm it, so the Device Portal log gets told the + // row was actually drawn, with what, and where. + if (!debugPerfReported) { + debugPerfReported = true; + telemetry("FIGHT_DEBUG_PERF", rate + (timing ? " | " + timing : "") + + " | lane=" + Math.round(lane.x) + "," + Math.round(y) + + " session=" + sessionName); + } + for (const [index, label] of [rate + surface, timing].entries()) { + if (!label) continue; + const size = index ? debugReadoutTimingSize() : metaSize; + typeWrite(label, lane.x, y, size, ...ink); + y -= size + 5; + } +} + +// How many telemetry watchers are reading this round. The relay counts +// `role=agent` sockets apart from phone spectators and tells the publishing +// game; a host that has not wired that up answers nothing and the mark stays +// off. Note this can only ever see the live socket: the console's +// AC_NATIVE_PROFILE line goes out one way through OutputDebugStringA, so a +// Device Portal reading it is invisible from in here. +function linkedAgents() { + if (typeof capabilities !== "function") return 0; + return Math.max(0, Math.round(Number(capabilities().liveAgents) || 0)); +} + +// @jeffrey: "if we are in debug mode and reading telemetry on a device can we +// show a little agent icon to show our linked in connection on the telemetry of +// that round". An antenna'd head, so it cannot be read as the debug bug beside +// it or as one more human in the grandstand — a phone that scanned the round QR +// is a viewer and lights nothing here. The mark means a machine is reading +// these numbers right now. +function drawAgentLink(x, y, scale = 1, count = 1) { + const shell = [120, 226, 255]; + const detail = [10, 16, 30]; + // Antenna first so the head caps its stalk: the bulb on the air is the + // "linked" half of the mark and the head is the "agent" half. + filledCapsule(x, y - 5 * scale, x, y - 10 * scale, 1.6 * scale, shell); + filledDisc(x, y - 11 * scale, 2.2 * scale, shell); + filledCapsule(x - 4 * scale, y, x + 4 * scale, y, 12 * scale, shell); + filledDisc(x - 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledDisc(x + 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledCapsule(x - 3 * scale, y + 3 * scale, x + 3 * scale, y + 3 * scale, + 1.6 * scale, detail); + // A second watcher is rare enough to say plainly rather than by stacking + // heads sideways across a read-out that has no room for them. + if (count > 1) typeWrite(String(count), x + 13 * scale, y - 6 * scale, + Math.max(12, Math.round(13 * scale)), ...shell); +} + +// Connection health, as four bars and one number — the thing every online +// game owes a player and oskiewar had no way to say. @jeffrey: "can we show a +// connection health like wifi meter, on the top right of the game". +// +// The number is whatever this seat can honestly measure, which is not the same +// on both lanes: +// +// A rollback fight knows its round trip exactly (see netSendInputs: our own +// wall mark comes home on the rival's next packet), so it reports ping. +// A grandstand or an older-build guest never gets a packet back, so it can +// only measure the wire it is being served: how irregular the frames are and +// how many of them the relay ate. It reports jitter, and loss when there is +// any. +// A host in the streamed lane hears the rival only through pads, so its one +// honest reading is how long ago the last one arrived. +// +// Nothing is invented. A lane with no rival on it draws nothing at all. +const netHealthPalette = [[245, 90, 96], [250, 200, 80], [180, 235, 120], + [108, 240, 168]]; + +function netHealth() { + if (netSession) { + const stats = netSession.stats; + const ping = Math.round(stats.pingMs || 0); + // Nothing has come home yet; a meter that reads four bars before it has + // measured anything is a lie told at exactly the moment somebody is + // deciding whether the connection is good. + let bars = !stats.pings ? 0 + : ping < 50 ? 4 : ping < 100 ? 3 : ping < 170 ? 2 : 1; + // A desync means the two machines are no longer playing the same fight. + // The wire may be fast and the connection is still not healthy. + if (bars && stats.desyncs) bars = Math.min(bars, 1); + return { bars, label: stats.pings ? ping + "MS" : "···", + note: stats.desyncs ? "DESYNC" : "" }; + } + if (roundViewerMode === "LIVE" && roundViewerFrames.length) { + const jitter = Math.round(roundViewerJitterMs); + const loss = roundViewerLossPct; + const bars = jitter < 12 && loss < 3 ? 4 + : jitter < 30 && loss < 10 ? 3 + : jitter < 60 && loss < 25 ? 2 : 1; + return { bars, label: "±" + jitter + "MS", + note: loss ? loss + "% LOST" : "" }; + } + // The host's side of a streamed fight. Only while somebody is actually + // sitting in the second chair — an empty room has no connection to rate. + if (versusLane() && !roundViewer) { + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return null; + const age = Date.now() - remote.at; + if (age > versusChallengerGraceMs) return null; + return { bars: age < 150 ? 4 : age < 400 ? 3 : age < 1000 ? 2 : 1, + label: age + "MS", note: "" }; + } + return null; +} + +// Where the meter stands, and whether it stands at all. Split out so the rest +// of the top-right corner can measure around it: with no QR up the meter owns +// that corner, and a label that assumed the corner was free landed on it. +function netHealthBox() { + if (typeof capabilities === "function" && + (capabilities().socialPreview || capabilities().replayOven === true)) + return null; + if (shellMode !== "GAME") return null; + const health = netHealth(); + if (!health) return null; + const safe = hudSafeRect(); + const qr = spectatorQrBox(); + const compact = compactLayout(); + const bar = compact ? 5 : 7; + const gap = compact ? 3 : 4; + const tall = compact ? 19 : 26; + const count = 4; + const width = count * bar + (count - 1) * gap; + // Under the code, never over it: the QR is the address a friend types and + // the meter is a readout about the friend who already did. + const top = (qr ? qr.top + qr.size + 8 : safe.top) + 2; + // Sized off the bars rather than the HUD's own type scale: the reading is a + // caption to the meter, and at hudTypeSize it swamped the thing it labels. + const size = Math.max(14, Math.round(tall * .8)); + const label = health.note ? health.label + " " + health.note : health.label; + return { health, bar, gap, tall, count, width, top, base: top + tall, + right: safe.right, left: safe.right - Math.max(width, + handleWidth(label, size)), size, label }; +} + +// The left edge of whatever owns the top-right corner — the round's QR, or +// the connection meter when no code is up. Anything else that wants to sit up +// there measures from here instead of from the safe rect, or it draws on top +// of the corner's furniture. +function hudTopRightLeft() { + const qr = spectatorQrBox(); + if (qr) return qr.left; + return netHealthBox()?.left ?? hudSafeRect().right; +} + +function drawNetHealth(ink) { + const box = netHealthBox(); + if (!box) return; + const { health, bar, gap, tall, count, width, base, right, size, label } = box; + const lit = netHealthPalette[Math.max(0, health.bars - 1)]; + const dim = mixColor([58, 64, 78], [196, 201, 212], visualTheme.light); + const previousDepth = triangleDepth; + triangleDepth = -1.43; + for (let index = 0; index < count; index++) { + const height = Math.round(tall * (index + 1) / count); + const x = right - width + index * (bar + gap); + screenRect(x + 2, base - height + 2, bar, height, [24, 26, 34]); + screenRect(x, base - height, bar, height, + index < health.bars ? lit : dim); + } + const labelWidth = handleWidth(label, size); + const labelY = base + 7; + typeWrite(label, right - labelWidth + 2, labelY + 2, size, + ...contrastShadow(ink)); + typeWrite(label, right - labelWidth, labelY, size, + ...(health.note ? netHealthPalette[0] : ink)); + triangleDepth = previousDepth; +} + +function drawMapName(ink) { + const safe = hudSafeRect(), health = netHealthBox(), qr = spectatorQrBox(); + const label = currentMapName.toLowerCase(); + let size = compactLayout() ? 22 : 26; + while (size > 14 && handleWidth(label, size) > (safe.right - safe.left) * .35) size--; + const x = safe.right - handleWidth(label, size); + // Stack below connection/QR furniture; keep the center clear all round. + const y = Math.max(safe.top + 8, + health ? health.base + health.size + 21 : 0, + qr ? qr.top + qr.size + 14 : 0); + typeWrite(label, x + 2, y + 2, size, ...contrastShadow(ink)); + typeWrite(label, x, y, size, ...ink); +} + +function drawSpectatorQr(ink, placement = null) { + if (typeof globalThis.__oskiewarJevPad === 'function') return; + if (typeof capabilities === "function" && capabilities().socialPreview) return; + const qr = placement || spectatorQrBox(); + if (!qr) return; + const { count, quiet, cell, size, left, top } = qr; + // National identity flies beside the code, wherever the code goes. US + // first — more flags join as they are drawn. Reel placements opt out with + // the rest of the HUD furniture. + if (!placement && typeof capabilities === "function" && + capabilities().country === "US") + drawUsFlag(left - Math.round(hudTypeSize * 2.1) - 12, top + 2, + Math.round(hudTypeSize * 2.1), Math.round(hudTypeSize * 1.2), ink); + const shadow = [24, 26, 34]; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + screenRect(left + 3, top + 3, size, size, shadow); + screenRect(left, top, size, size, [250, 250, 247]); + // Dark modules coalesce into horizontal runs so a full code stays a few + // dozen faces instead of a few hundred — drawErrorQr already draws this way. + const dark = [7, 8, 14]; + for (let row = 0; row < count; row++) { + let run = 0; + for (let column = 0; column <= count; column++) { + if (column < count && spectatorQr.isDark(row, column)) { run++; continue; } + if (run) screenRect(left + (column - run + quiet) * cell, + top + (row + quiet) * cell, run * cell, cell, dark); + run = 0; + } + } + triangleDepth = previousDepth; +} + +// Framing marks rather than a full box: the corners state the bounds without +// drawing four lines through the fight. +function drawCornerCrops(rect, reach, width, color) { + const arm = Math.min(reach, (rect.right - rect.left) / 3, + (rect.bottom - rect.top) / 3); + for (const [x, towardX] of [[rect.left, 1], [rect.right, -1]]) + for (const [y, towardY] of [[rect.top, 1], [rect.bottom, -1]]) { + filledCapsule(x, y, x + towardX * arm, y, width, color); + filledCapsule(x, y, x, y + towardY * arm, width, color); + } +} + +function drawImpacts() { + for (const impact of impacts) { + if (impact.explosion && impact.blastRadius) { + const age = clamp(1 - impact.life / impact.duration, 0, 1); + const center = projectPoint(impact.x, impact.y - 3, impact.z || 0); + const edge = projectPoint(impact.x + impact.blastRadius, + impact.y - 3, impact.z || 0); + const radius = Math.abs(edge.x - center.x); + if ([center.x, center.y, radius].every(Number.isFinite) && radius < 4000 && + !drawPhotoExplosion(center.x,center.y,radius,age,center.z-.025)) { + filledRing(center.x, center.y, radius, + Math.max(0, radius - Math.max(7, 22 * (1 - age))), + mixColor([255, 218, 86], [111, 74, 48], age)); + const shockRadius = radius * (.18 + age * .72); + filledRing(center.x, center.y, shockRadius, + Math.max(0, shockRadius - Math.max(4, 13 * (1 - age))), + mixColor([255, 246, 184], [164, 92, 52], age)); + } + } + for (const mote of impact.debris || []) { + const point = projectPoint(mote.x, mote.y, mote.z); + const radius = Math.max(2, mote.radius * cameraScale()); + if (![point.x, point.y, radius].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledDisc(point.x, point.y, radius, + impact.death ? [255, 105, 190] : [255, 232, 92]); + } + } +} + +function drawDetachedPart(fragment) { + const first = projectPoint(fragment.x1, fragment.y1, fragment.z1); + const second = projectPoint(fragment.x2, fragment.y2, fragment.z2); + const width = Math.max(2, fragment.width * cameraScale()); + const values = [first.x, first.y, second.x, second.y, width]; + if (!values.every(Number.isFinite) || width > 2000) return; + const margin = width + 4; + if (Math.abs(first.x) + margin > 30000 || + Math.abs(first.y) + margin > 30000 || + Math.abs(second.x) + margin > 30000 || + Math.abs(second.y) + margin > 30000 || + Math.hypot(second.x - first.x, second.y - first.y) > 30000) return; + if (photoThemeActive) { + // Ownership changes when a limb is hit; its material keeps its source color. + const seat = fragment.color[1] > fragment.color[0] ? 1 : 0; + photoLimb({x1:first.x,y1:first.y,x2:second.x,y2:second.y,width}, seat); + return; + } + filledCapsule(first.x, first.y, second.x, second.y, width + 3, [9, 12, 22]); + drawPaletteCapsule({ x1: first.x, y1: first.y, x2: second.x, y2: second.y, + width, part: fragment.part }, fragment.colors, + fragment.paletteCoordinate || 0, fragment.color); +} + +function drawSafeZones() { + if (!debugHitboxes || renderFlags.hud === false) return; + drawCornerCrops(hudSafeRect(), 46, 3, [255, 214, 84]); + drawCornerCrops(actionSafeRect(), 34, 2, [105, 255, 118]); +} + +// The head is the second door on the title screen. START is still anywhere — +// `tapTitle` in the shell makes the whole frame the button — so the one place +// that must NOT start a fight is the face, because that is where a player who +// wants to BE the fighter is already looking. The game publishes the head's +// screen circle and the shell hit-tests it ahead of the anywhere-button; the +// ring is drawn here rather than in the shell because only the game knows +// where the head went this frame. +// +// Nothing is drawn unless a wizard is actually mounted (`__oskiewarWizard`), +// so the Xbox and the reel renderer — which have no DOM to open — never show +// an affordance that would dud. +function drawTitleHeadDoor(t, ink, suppressed) { + const touch = globalThis.__oskiewarTouch; + if (!touch) return; + const onTitle = shellMode === "MENU" && titleTransitionAt === null; + if (!onTitle || suppressed || !globalThis.__oskiewarWizard) { + if (touch.titleHead) touch.titleHead = null; + return; + } + // Only over a seat that is actually yours. The attract loop's "action" + // variant dresses BOTH fighters as bots (`beginTraining`), and a ring that + // says "add yourself" on a bot's head invites a player to replace somebody + // who was never there. No local body on screen, no door. + const seat = players[0]; + if (!seat || !seat.alive || seat.npc || seat.bot) { touch.titleHead = null; return; } + const head = runnerWorldGeometry(seat, t).head; + if (!head) { touch.titleHead = null; return; } + // Radius in screen units is measured, not guessed: the title camera pushes + // in and out across the attract loop, and a fixed pixel radius would drift + // off the face. Same idiom the killcam tears use. + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(9, Math.hypot(edge.x - point.x, edge.y - point.y)); + const reach = radius * 1.22; + touch.titleHead = { x: point.x, y: point.y, radius: reach }; + // On the screen-UI lane, so a fighter standing in front of their own face + // cannot draw through the invitation. + triangleDepth = -1.42; + const pulse = (Math.sin(t * 2.4) + 1) / 2; + // Gold on its own rather than mixed toward the title ink: ink is near-white + // on the night sky and near-black at noon, so mixing gave a different — and + // on the light theme, muddy — colour every hour. The dark under-ring is what + // carries it across both, the same trick the type beside it uses. + const glow = mixColor([230, 205, 92], [255, 250, 226], pulse * .55); + const stroke = Math.max(1.5, radius * .085); + hudCircle(point.x, point.y, reach, stroke * 2.1, [16, 20, 34]); + hudCircle(point.x, point.y, reach, stroke, glow); + // The words ride a plate. A meditating fighter fills the whole column under + // their own chin, so unplated type landed on shoulders and arms and read as + // part of the body; the plate is dark on both themes because the gold is. + const label = "add yourself"; + const size = Math.max(11, Math.round(radius * .44)); + const width = handleWidth(label, size); + const padX = Math.round(size * .55), padY = Math.round(size * .34); + const left = point.x - width / 2; + const top = point.y + reach + size * .45; + hudBox(left - padX, top - padY, width + padX * 2, size + padY * 2, 16, 20, 34); + typeWrite(label, left, top, size, ...glow); +} + +function gamePaint() { + syncGameView(); + globalThis.__oskiewarLocalVersus = localVersusActive(); + const run = runtime(); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.screen = shellMode === "MENU" + ? titleTransitionAt !== null ? "title-transition" : "title" + : selecting ? "select" : "game"; + } + // Each fighter's cues sit where the fighter stands — @jeffrey: "can audio + // be mixed according to the player's position, stereo, for each player, if + // its not local multiplayer". Two humans on one couch share one speaker + // image, so their mix stays centered; against the machine — or a rival on + // the far end of a wire — the stage pans. + const couchVersus = !players[1].npc && !players[1].bot && + !players[1].remote && !selfPlay; + globalThis.__oskiewarPlayerPans = players.map((player) => couchVersus ? 0 : panPlayer(player)); + // The shell's resolution governor steers by this — the game's own measured + // rate, because the host's profile numbers never made it off the Xbox. + globalThis.__oskiewarDisplayFps = displayFps; + const paintAt = run.paintMonotonicUs ?? run.monotonicUs; + if (lastPaintAt > 0 && paintAt > lastPaintAt) { + const sample = clamp(1000000 / (paintAt - lastPaintAt), 1, 240); + displayFps = displayFps ? lerp(displayFps, sample, .12) : sample; + } + lastPaintAt = paintAt; + const t = (run.monotonicUs - startedAt) / 1000000; + if (typeof ac === "function") acFeed = ac(); + syncSignedInFighter(); + const localNation = typeof capabilities === "function" + ? String(capabilities().country || "").toUpperCase() : ""; + if (/^[A-Z]{2}$/.test(localNation)) { + players[0].nation = localNation; + if (!players[1].npc) players[1].nation = localNation; + } + // The remote rival's wardrobe came up the wire, not out of the roster — + // a profile lookup here would answer empty and strip them every frame. + for (const player of players) + if (!player.remote) player.handleColors = fighterProfile(player.name).colors; + visualTheme = displayTheme(); + const replayOven = typeof capabilities === "function" && + capabilities().replayOven === true; + const reelHud = typeof capabilities === "function" && + capabilities().reelHud === true; + const matchHud = !replayOven || reelHud; + // A reel is watched at arm's length with no controller in hand, and the + // corner furniture a player needs — nameplates, stats, inventory, the + // command stream — crowds a 9:16 crop and competes with the fight for the + // eye. So a reel carries no HUD at all while the round is live, and states + // the outcome afterward in the middle of the frame, one line at a time. + const reelMinimal = replayOven && reelHud && + capabilities().reelFullUi !== true; + triangleDepth = -1.4; + // The station uses a plain light or dark backdrop matching the HUD theme. + const space = !survivalActive(); + const mapColors = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const skyDay = mixColor([176, 215, 245], [255, 160, 112], + visualTheme.sunset * .7); + const sky = space ? mixColor(mapColors.night, mapColors.sky, visualTheme.light) + : mixColor([7, 8, 28], skyDay, visualTheme.light); + // Match the clear color to the arena sky. Camera framing can reveal the + // clear layer during a jump; a different clear color looked like a flash. + const outside = sky; + // Keep the room's planes materially distinct: blue atmosphere, warm plaster + // behind the fighters, and green earth under them. Day/night can tint the + // palette without washing every surface into the same gray. + const arenaDay = mixColor([244, 211, 178], [235, 154, 150], + visualTheme.sunset * .48); + const arena = mixColor([24, 18, 42], arenaDay, visualTheme.light); + // Pale steel in light mode stays distinct from the brighter backdrop. + const groundDay = mixColor([142, 184, 116], [190, 151, 103], + visualTheme.sunset * .38); + const ground = space + ? mixColor(mapColors.floor.map(c => Math.round(c * .32)), mapColors.floor, visualTheme.light) + : mixColor([13, 25, 29], groundDay, visualTheme.light); + // The floating decks are steel with a lit edge. The plate itself stays + // near the hull's own value — a near-white slab against vacuum reads as a + // UI bar laid over the game rather than as a thing in it — and the LIP + // carries the brightness instead, which is the part a player actually has + // to judge. On plaster the relationship is the other way round: the deck is + // the pale thing and the lip is the dark line under it, because there the + // background is what is bright. + const platformColor = space + ? mixColor(mapColors.deck.map(c => Math.round(c * .42)), mapColors.deck, visualTheme.light) + : mixColor([24, 29, 46], [211, 198, 171], visualTheme.light); + const titleInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + const statusShadow = contrastShadow(titleInk); + const menuArena = mixColor([7, 10, 26], [235, 241, 248], visualTheme.light); + const menuPanel = mixColor([20, 28, 56], [215, 225, 239], visualTheme.light); + const menuInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + renderFlags = globalThis.__oskiewarRenderFlags || renderFlags; + wipe(...outside); + if (airRoundActive() && typeof themeAssetReady === "function" && themeAssetReady(4)) { + themeSprite(4,0,0,1672,940,viewCenterX(),viewHeight/2, + viewWidth(),viewHeight,0,false,photoBackdropDepth); + } else if (photoThemeActive && !airRoundActive() && visualTheme.light < .5) { + themeSprite(0,0,0,1672,941,viewCenterX(),viewHeight/2, + viewWidth(),viewHeight,0,false,photoBackdropDepth); + } else if (renderFlags.sky !== false) drawSkyAtmosphere(sky, arena); + if (PAL_SELECT && selecting) { + box(0, 0, viewWidth(), viewHeight, ...menuArena); + drawSelectionScreen(t, menuInk, menuPanel); + return; + } + const cinematicAge = deathCinematicAge(run.monotonicUs); + const introAge = run.monotonicUs - roundStartedAt; + const inRoundIntro = !roundResult && introAge >= 0 && + introAge < roundIntroDurationUs(); + // The intro deliberately owns its lens: wide title, two face portraits, + // then a pullback. Final-frame containment would widen every portrait until + // both fighters fitted, erasing the zoom story it was meant to protect. + if (!finalKillReplayRendering && !inRoundIntro && (cinematicAge < 0 || cinematicAge >= 1.45)) + containFighters(t); + cameraDoll.prepare(); + const { left: spanLeft, right: spanRight, + top: spanTop, bottom: spanBottom } = terrainSpan(); + if (!airRoundActive()) drawRoomSurfaces(spanLeft, spanRight, spanTop, spanBottom, arena); + // The reel camera puts the floor's own front edge (worldNear) in front of + // the lens, where it crosses the frame as a hard horizontal step with the + // skirt showing under it. Extending the slab past the camera hands the cut + // to the near plane, which faces already handle correctly, so the ground + // reads as ground all the way down the frame. Past the camera means PAST + // THE CAMERA — a fixed extension was still shy of the wide fight shot, + // which stands several thousand units back, and the step came back on + // every wide frame. Reels only: on the TV lens the visible front edge IS + // the padded-room look. + const groundNear = reelGroundCamera() + ? Math.min(worldNear, cameraDoll.position.z - 400) : worldNear; + if (airRoundActive()) drawAirDropSky(t); + else { + drawTerrainBackWall(spanLeft, spanRight, worldFar, ground); + drawTerrainSurface(spanLeft, spanRight, groundNear, worldFar, ground); + drawTerrainFrontWall(spanLeft, spanRight, groundNear, ground); + drawSkateParkFeatures(); + } + // No grass in vacuum. The blades were the tower's lawn and the cube kept + // them out of habit; on a hull they read as moss on a spaceship. + if (renderFlags.grass !== false && !space) + drawTerrainGrass(spanLeft, spanRight, ground); + if (!airRoundActive()) drawBoosterPad(t); + const platformNear = -520; + const platformFar = 520; + // A rung wants to be a slab, but the stage paints in order with no depth + // buffer — the volume's faces landed over the fighters on console. So each + // one is a plane plus a front-edge line: the plane is the deck a fighter + // stands on, and the line is the lip, which is what keeps a rung readable + // when the camera happens to sit at its height and the deck goes edge-on. + // The line rides the line layer, so twelve rungs cost twenty-four faces and + // the lips cost none. The span clamp is the same one the terrain uses, and + // in a room this size its 2600-unit apron usually covers everything — it is + // here to bound the worst case, not because it culls much today. + const ledgeInk = space + ? mixColor(platformColor, [196, 224, 255], .62) + : mixColor(platformColor, [26, 24, 34], .42); + if (platformsEnabled()) for (const ledge of activeLedges()) { + if (finalKillLedgeOccludes(ledge,platformNear,platformFar)) continue; + if (ledge.right < spanLeft || ledge.left > spanRight) continue; + if (ledge.y < spanTop || ledge.y > spanBottom) continue; + const ledgeLeft = Math.max(ledge.left, spanLeft); + const ledgeRight = Math.min(ledge.right, spanRight); + if (ledgeLeft >= ledgeRight) continue; + const photoLedge = photoThemeActive && photoSurface("concrete", + projectPoint(ledgeLeft,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformFar), + projectPoint(ledgeLeft,ledge.y,platformFar)); + if (!photoLedge) worldQuad( + { x: ledgeLeft, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformFar }, + { x: ledgeLeft, y: ledge.y, z: platformFar }, platformColor); + worldLine(ledgeLeft, ledge.y, platformNear, + ledgeRight, ledge.y, platformNear, 5, ledgeInk); + } + if (workshopHighlight && globalThis.__oskiewarWorkshopEnabled) { + for (const player of players) { + const x = player.spawnX, y = terrainFloorAt(x); + const ink = player.pad === 0 ? [80, 240, 255] : [255, 100, 210]; + worldLine(x - 55, y - 4, -50, x + 55, y - 4, -50, 6, ink); + worldLine(x, y, 0, x, y - 240, 0, 6, ink); + worldLine(x, y - 240, 0, x + 65, y - 210, 0, 6, ink); + } + } + drawSurvivalLava(t); + const shadowInk = mixColor([3, 5, 14], [92, 99, 101], + visualTheme.light * .72); + if (renderFlags.shadows !== false && !airRoundActive()) { + for (const player of activePlayers()) + if (player.alive || roundResult) + drawSpotShadow(player.x, player.y, player.z, player.ducking ? 52 : 64, + shadowInk); + for (const item of balls) + if (item.active) + drawSpotShadow(item.x, item.y, item.z, item.radius * 1.18, shadowInk); + } + const windInk = windDirection < 0 + ? mixColor([72, 174, 255], [28, 88, 188], visualTheme.light) + : mixColor([255, 92, 132], [184, 35, 62], visualTheme.light); + if (WIND_FLAG && shellMode === "GAME") drawWindFlag(t, windInk); + // The round keeps match time and spectator state only. Time of day belongs + // to the title screen; carrying it into gameplay confused two unrelated + // clocks and spent the top-right lane on non-match information. + if (matchHud && !reelMinimal && shellMode === "GAME" && gameplayStarted) { + const timedRound = roundIsTimed(); + const remainingSeconds = roundResult || !timedRound ? 0 : Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + const timerText = !roundResult && timedRound + ? Math.floor(remainingSeconds / 60) + ":" + String(remainingSeconds % 60).padStart(2, "0") : ""; + const hud = hudSafeRect(); + const timerSize = compactLayout() ? 52 : 64; + if (timerText) { + const timerWidth = handleWidth(timerText, timerSize); + const timerDanger = timedRound && remainingSeconds > 0 && + remainingSeconds <= 10; + const timerShake = timerDanger + ? Math.sin(t * 35) * (11 - remainingSeconds) * .45 : 0; + const timerInk = timerDanger + ? mixColor(titleInk, [235, 38, 58], (11 - remainingSeconds) / 10) + : titleInk; + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake + 2, + hud.top + 5, timerSize, 4, 5, 12); + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake, + hud.top + 2, timerSize, ...timerInk); + } + if (roundViewer) { + const viewerLabel = roundViewer.seat === "challenger" + ? roundViewerMode === "LIVE" ? "VS" : "WAITING FOR HOST" + : roundViewerMode || roundViewerStatus; + // Left of the corner's furniture, never on it: that corner is the + // round's QR, or the connection meter when there is no code up. + const labelSize = 24; + const labelRight = hudTopRightLeft() - 14; + typeWrite(viewerLabel, + labelRight - handleWidth(viewerLabel, labelSize), hud.top + 7, + labelSize, ...(roundViewerMode === "LIVE" ? [210, 42, 62] : titleInk)); + // The chair-holder plays through this feed: say which body is theirs + // while the matchup is still fresh, then get out of the fight's way. + if (roundViewer.seat === "challenger" && roundViewerMode === "LIVE" && + t < 8) { + const seatLine = "YOU ARE " + + (players[1].name || "THE SECOND FIGHTER") + " — RIGHT SIDE"; + const seatSize = compactLayout() ? 13 : 17; + const seatWidth = handleWidth(seatLine, seatSize); + typeWrite(seatLine, viewCenterX() - seatWidth / 2, + hud.top + hudTypeSize + 16, seatSize, ...titleInk); + } + } + const nowMs = run.unixMs || Date.now(); + drawHudStatusTray(null, titleInk, nowMs); + const updateReady = typeof capabilities === "function" && + capabilities().updateReady === true; + if (updateReady) { + const label = "update ready"; + const size = Math.round(hudTypeSize * .58); + const width = handleWidth(label, size); + const x = hudTopRightLeft() - 14 - width; + const y = hud.top + hudTypeSize + 12; + typeWrite(label, x + 2, y + 3, size, ...contrastShadow(titleInk)); + typeWrite(label, x, y, size, ...titleInk); + if (globalThis.__oskiewarTouch) + globalThis.__oskiewarTouch.updateButton = + { x: x - 8, y: y - 6, width: width + 16, height: size + 12 }; + } else if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.updateButton = null; + } + } + if (!survivalActive()) { + for (const tree of bodyTrees) drawBodyTree(tree, t); + for (const pickup of gunPickups) drawGunPickup(pickup, t); + for (const pickup of saberPickups) drawSaberPickup(pickup, t); + for (const pickup of grenadePickups) drawGrenadePickup(pickup, t); + } + const showRunnerLabels = matchHud && !reelMinimal && + (Boolean(roundResult) || introAge >= roundIntroDurationUs()); + const viewDirection = normalize3({ + x: cameraDoll.target.x - cameraDoll.position.x, + y: cameraDoll.target.y - cameraDoll.position.y, + z: cameraDoll.target.z - cameraDoll.position.z, + }); + const renderables = [ + ...bullets.map((item) => ({ + kind: "bullet", item, x: item.x, y: item.y, z: item.z })), + ...grenades.filter((item) => item.alive).map((item) => ({ + kind: "grenade", item, x: item.x, y: item.y, z: item.z })), + ...balls.filter((item) => item.active).map((item) => ({ + kind: "ball", item, x: item.x, y: item.y, z: item.z })), + ...detachedParts.map((item) => ({ kind: "detached", item, + x: (item.x1 + item.x2) / 2, y: (item.y1 + item.y2) / 2, + z: (item.z1 + item.z2) / 2 })), + // Both fighters are always in this list. A fighter is never removed from + // the frame to make a camera move work — the shot is what moves. + ...activePlayers().map((item) => ({ + kind: "player", item, x: item.x, y: item.y, z: item.z })), + ]; + const depth = (item) => dot3({ + x: item.x - cameraDoll.position.x, + y: item.y - cameraDoll.position.y, + z: item.z - cameraDoll.position.z, + }, viewDirection); + renderables.sort((a, b) => depth(b) - depth(a)); + for (const renderable of renderables) { + triangleDepth = projectPoint(renderable.x, renderable.y, renderable.z).z; + if (renderable.kind === "bullet") drawBullet(renderable.item); + else if (renderable.kind === "grenade") drawGrenade(renderable.item); + else if (renderable.kind === "ball") drawBall(renderable.item); + else if (renderable.kind === "detached") drawDetachedPart(renderable.item); + else { + drawDiveMotion(renderable.item, t); + drawDoubleJumpMotion(renderable.item, t); + drawRunner(renderable.item, t, showRunnerLabels); + } + } + // Debug geometry sits above the world but below the -1.42 screen-UI lane. + // It must remain visible through fighter bodies without cutting across the + // title, controls, command notation, names, clock, or other HUD furniture. + triangleDepth = -1.4; + drawDebugHitboxes(players[0], t); + if (!survivalActive()) for (const player of players.slice(1)) drawDebugHitboxes(player, t); + for (const player of players) drawBotScene(player); + drawBallHitboxes(); + drawSafeZones(); + triangleDepth = -1.42; + // On the SCREEN UI layer, not the debug-geometry one above it. The meter is + // an instrument being read rather than scenery in the room, and the layering + // test is what caught it sitting at the debug depth where a tall enough + // piece of world could have drawn straight through it. + drawFrameMeter(); + drawImpacts(); + drawTitleHeadDoor(t, titleInk, reelMinimal); + const counting = !roundResult && introAge < roundIntroDurationUs(); + // The matchup card announces two names in the middle of the screen, which + // is exactly where the wordmark sits. On the entry fight the word wins. + if (matchHud && !reelMinimal && counting && shellMode === "GAME") + survivalActive() + ? drawSurvivalIntro(titleInk, statusShadow) + : drawFightIntro(introAge / 1000000, titleInk, statusShadow); + // The keys belong wherever a newcomer is looking: under the wordmark on the + // way in, and again while a round counts itself off. Self-play has no + // newcomer — two bots need no tutorial, and neither does a reel of them. + // The legend is the stable key for the score written beneath it. Keep it + // present throughout every player-controlled screen; only unattended bot + // self-play and marketing reels have no learner to serve. + if (!replayOven && !selfPlay && renderFlags.keys !== false) + drawControlLegend(titleInk); + const resultUiReady = cinematicAge < 0 || cinematicAge >= 1.1; + // A reel opens on the matchup. Both names, both palettes, stacked up top + // where the fighters are not — a stranger scrolling past should know who is + // who before the first hit lands. It clears out early so the round itself + // still plays under nothing at all. + if (reelMinimal && shellMode === "GAME" && !roundResult && + introAge / 1000000 < REEL_MATCHUP_SECONDS) { + const nameSize = compactLayout() ? 40 : 54; + const top = Math.round(viewHeight * .14); + const names = activePlayers(); + for (let side = 0; side < names.length; side++) { + drawReelName(String(names[side].name).toLowerCase(), + top + side * Math.round(nameSize * 1.5), nameSize, names[side], t); + } + } + if (matchHud && survivalActive() && shellMode === "GAME" && + gameplayStarted && !roundResult && !counting) + drawSurvivalHud(titleInk); + if (survivalActive() && roundResult && resultUiReady) { + drawSurvivalResult(titleInk, statusShadow); + } else if (reelMinimal && roundResult && resultUiReady) { + // One fact, in the middle of the frame: who won. The recording stops on + // the result card, so anything queued behind the name would never survive + // the trim — and a name alone is the whole story a reel owes a stranger. + const result = resultCardText(true); + const winnerSize = compactLayout() ? 46 : 64; + // Up top, where the fight is not. The celebration push puts the winner's + // head in the middle of the frame, so a name anywhere near center lands on + // their face. + const champion = players.find((player) => + String(player.name).toLowerCase() === result.winner) || null; + drawReelName(result.winner, Math.round(viewHeight * .17), + winnerSize, champion, t); + } else if (matchHud && roundResult && resultUiReady) { + if (INSTANT_REPLAY && instantReplay) { + const frame = Math.min(instantReplay.frames.length, + Math.floor(instantReplay.cursor) + 1); + const replayLabel = "REPLAY " + frame + "/" + instantReplay.frames.length; + typeWrite(replayLabel, viewCenterX() - replayLabel.length * 10, + 820, 30, ...titleInk); + drawCenteredKeycapRun(replayControlKeys(instantReplay.paused), + 940, 19, inputPads[0]?.down || [], titleInk); + } else { + const result = resultCardText(true); + // The result is a small ownership mark, not a second title screen. + // Character reactions carry the emotional result in the arena. + const winnerSize = compactLayout() ? 30 : 42; + const winnerWidth = handleWidth(result.winner, winnerSize); + const resultY = hudSafeRect().top + 62; + typeWrite(result.winner, viewCenterX() - winnerWidth / 2 + 3, resultY + 4, + winnerSize, ...statusShadow); + typeWrite(result.winner, viewCenterX() - winnerWidth / 2, resultY, + winnerSize, ...titleInk); + if (result.action) { + const actionSize = Math.min(44, winnerSize * .54); + const actionWidth = handleWidth(result.action, actionSize); + typeWrite(result.action, viewCenterX() - actionWidth / 2 + 3, 900, + actionSize, ...statusShadow); + typeWrite(result.action, viewCenterX() - actionWidth / 2, 896, + actionSize, ...titleInk); + } + if (!roundViewer && INSTANT_REPLAY) { + drawCenteredKeycapRun(replayOfferKeys(), 940, 19, + inputPads[0]?.down || [], titleInk); + } + } + } + // Nameplates and stats wait for the wordmark to lift; the entry frame is + // the word, the keys, and the two fighters, and nothing else. + if (!survivalActive() && matchHud && !reelMinimal && shellMode === "GAME" && + ((roundResult && resultUiReady) || + (!roundResult && introAge >= roundIntroDurationUs()))) { + const hudPlayers = spatialHudPlayers(); + for (let side = 0; side < hudPlayers.length; side++) { + const player = hudPlayers[side]; + drawPlayerHandle(player, t, side); + drawPlayerStats(player, side, t); + drawHudInventory(player, side); + drawCommandStream(player, side); + } + } + if (!survivalActive() && replayOven && capabilities().reelFullUi === true && + shellMode === "GAME") + drawReelSectionProgress(run.monotonicUs, titleInk); + if (!replayOven) drawDebugPerformance(titleInk); + drawDeathFlash(); + if (shellMode === "MENU") { + const transitionAge = titleTransitionAt !== null + ? (run.monotonicUs - titleTransitionAt) / 1000000 : -1; + drawTitleScreen(t, menuInk, transitionAge); + if (transitionAge >= 0) return; + } + if (!replayOven) { + // Over the fighters, deliberately: the lobby's lone body stands center + // frame, and an instruction painted under it was an instruction hidden. + if (!reelMinimal) drawVersusHud(t, titleInk, run); + drawSpectatorQr(titleInk); + if (!reelMinimal) drawNetHealth(titleInk); + if (matchHud && !reelMinimal && renderFlags.hud !== false && + shellMode === "GAME" && !survivalActive()) drawMapName(titleInk); + drawTouchControls(); + if (localVersusActive() && localControllerMissing !== -1) { + const label = "reconnect player " + (localControllerMissing + 1); + const size = compactLayout() ? 30 : 48; + const width = handleWidth(label, size); + const left = viewCenterX() - width / 2; + const top = viewHeight * .43; + box(left - 20, top - 16, width + 40, size + 32, 9, 12, 22); + typeWrite(label, left, top, size, 255, 235, 130); + } + } +} + +// The raw pad words remember() files between real moves. The training floor +// captions moves, not fingers — "KICK" teaches, "B" nags. +const versusLabelNoise = new Set(["NONE", "UP", "DOWN", "LEFT", "RIGHT", + "A", "B", "X", "Y", "LB", "RB", "VIEW", "MENU"]); + +// The lobby's interface is a challenge and a code: fight a friend, share +// the address, and until they arrive every move the lone fighter makes is +// named back at them — the empty room as training mode. +function drawVersusHud(t, ink, run) { + if (!versusLane() || shellMode !== "GAME") return; + if (!lobbyActive()) return; + const hud = hudSafeRect(); + const compact = compactLayout(); + const door = versusDoor(); + // Behind the door the address is a lie: nothing is published, so nobody + // could arrive at it. Say what is actually in the way instead. The panel + // that takes the email or the handle is the shell's, over the top of this; + // this is the part that stays legible on a television across a room. + const headline = door === "login" ? "SIGN IN TO PLAY" + : door === "handle" ? "CHOOSE A HANDLE" : "WAITING ROOM"; + const headSize = compact ? 30 : 44; + const pulse = .5 + Math.sin(t * 2.4) * .5; + const headInk = mixColor(ink, [235, 205, 74], .35 + pulse * .45); + const headWidth = handleWidth(headline, headSize); + const headX = viewCenterX() - headWidth / 2; + const headY = hud.top + (compact ? 30 : 42); + typeWrite(headline, headX + 3, headY + 3, headSize, ...contrastShadow(ink)); + typeWrite(headline, headX, headY, headSize, ...headInk); + const address = door === "login" + ? "A FIGHT NEEDS A NAME ON BOTH ENDS" + : door === "handle" ? "YOUR HANDLE IS WHAT THE FIGHT WRITES DOWN" + : "FIGHT A FRIEND OSKIEWAR.COM/" + versusRoomName.toUpperCase(); + const addressSize = compact ? 16 : 23; + const addressWidth = handleWidth(address, addressSize); + const addressY = headY + headSize + 10; + typeWrite(address, viewCenterX() - addressWidth / 2 + 2, addressY + 2, + addressSize, ...contrastShadow(ink)); + typeWrite(address, viewCenterX() - addressWidth / 2, addressY, + addressSize, ...ink); + const player = players[0]; + // The death card owns the middle of the screen for the whole down beat — + // the loop is die, read it, stand back up whole. + if (!player.alive) { + const deadLabel = "YOU DIED"; + const deadSize = compact ? 44 : 66; + const deadWidth = handleWidth(deadLabel, deadSize); + const deadX = viewCenterX() - deadWidth / 2; + const deadY = Math.round(viewHeight * .44 + Math.sin(t * 3.2) * 3); + typeWrite(deadLabel, deadX + 4, deadY + 4, deadSize, + ...contrastShadow(ink)); + typeWrite(deadLabel, deadX, deadY, deadSize, + ...mixColor(ink, [235, 38, 58], .8)); + return; + } + if (!player.lastButtonAt || versusLabelNoise.has(player.lastButton)) return; + const age = (run.monotonicUs - player.lastButtonAt) / 1000000; + if (age < 0 || age > .9) return; + // The caption swells on landing and lets go through the tail — spoken, + // not filed. + const fade = 1 - age / .9; + const moveSize = Math.round((compact ? 26 : 38) * (1.06 - fade * .06)); + const moveWidth = handleWidth(player.lastButton, moveSize); + const moveX = viewCenterX() - moveWidth / 2; + const moveY = Math.round(viewHeight * .62) - Math.round((1 - fade) * 26); + const moveInk = fade > .4 ? ink : mixColor(contrastShadow(ink), ink, fade / .4); + typeWrite(player.lastButton, moveX + 3, moveY + 3, moveSize, + ...contrastShadow(ink)); + typeWrite(player.lastButton, moveX, moveY, moveSize, ...moveInk); +} + +function boot() { + try { + gameBoot(); + } catch (error) { + captureClientError("boot", error); + } +} + +function sim() { + if (!netSession && performanceStageActive()) return; + if (clientError) { restartAfterClientError(); return; } + try { + netDrainHostInbox(); + if (netSession) netTick(); + else gameSim(); + } catch (error) { + captureClientError("sim", error); + } +} + +function paint() { + refreshPhotoTheme(); + globalThis.__oskiewarGraphicsThemeStatus = photoThemeActive ? "photorealistic" : "flat"; + if (drawPerformanceStage()) return; + if (clientError) { + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + return; + } + const previousMath = Math; + Math = platformMath; // Display-only geometry can use the host's fast intrinsics. + const restore = beginRenderInterpolation(runtime().renderAlpha ?? 1); + sharingRenderPoses = true; + // Capture after paint while its solved pose cache is still alive. + let restoreReplay = () => {}; + try { + restoreReplay = beginFinalKillReplay(); + gamePaint(); + captureFinalKillReplay(runtime().monotonicUs); + drawPerformanceFooter(); + } catch (error) { + captureClientError("paint", error); + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + } finally { + sharingRenderPoses = false; + renderPoses.clear(); + restoreReplay(); + restore(); + Math = previousMath; + } +} +function act() {} +function leave() { + try { + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + } catch (error) { + captureClientError("leave", error); + } +} + + +// Included in Neo's existing Oskiewar renderer; primitive-only and silent. +function drawFemragDance(music, elapsed) { + const width=viewWidth(), height=viewHeight, beat=elapsed*(Number(music.bpm)||144)/60; + const reverse=/ragga/.test(music.section||'')?-1:1; + const gather=/build/.test(music.section||'')?.7:1; + const fade=/outro/.test(music.section||'')?clamp((music.duration-elapsed)/8,0,1):1; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[249,154,103]]; + const hits=(music.hits||[]).map(e=>({t:music.elapsed+e[0]/100,seat:e[1]===6?'sub':e[1],midi:e[2]<0?null:e[2]})); + const sub=hits.reduce((v,e)=>e.seat==='sub'&&elapsed>=e.t?Math.max(v,Math.exp(-(elapsed-e.t)*9)):v,0); + triangleDepth=-.8; + const scale=Math.min(width,height)*.047; + for(let seat=0;seat<6;seat++) { + let hit=null, level=0; + for(const e of hits)if(e.seat===seat&&elapsed>=e.t&&elapsed-e.t<.6){ + const amp=Math.exp(-(elapsed-e.t)*7);if(amp>level){level=amp;hit=e;} + } + const a=seat*2*Math.PI/5+reverse*beat*Math.PI/32; + const x=seat===5?viewCenterX():viewCenterX()+platformMath.sin(a)*width*.30*gather; + const y=seat===5?height*.40:height*.40+platformMath.cos(a)*height*.23*gather; + const step=platformMath.sin(beat*Math.PI+seat)*(.15+level*.55); + const bob=level*scale*.55; + const color=colors[seat].map(v=>Math.round(v*(.55+.45*fade))); + const limb=scale*.17, bodyY=y-bob; + filledCapsule(x,bodyY-scale*.25,x,bodyY+scale*.65,limb,color); + filledDisc(x,bodyY-scale*.8,scale*.42,color); + for(const side of [-1,1]) { + filledCapsule(x,bodyY,x+side*scale*.8,bodyY-scale*(.15+level*.9)+side*step*scale,limb,color); + filledCapsule(x,bodyY+scale*.6,x+side*scale*(.45+step*.25),y+scale*1.35,limb,color); + } + if(hit&&Number.isFinite(hit.midi)) { + const note=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'][Math.round(hit.midi)%12]; + const size=Math.max(20,scale*.65); + typeWrite(note,x-handleWidth(note,size)/2,bodyY-scale*1.9,size,...color); + } + } + // Sub notes swell a steady floor; no full-screen flash or second soundtrack. + screenRect(width*.12,height*.76,width*.76,3+sub*8,[94,110,143]); +} + +// The MacNeoPolitan Trio: only the word being sung — huge, centred, in the +// singer's colour, the singer's name small above it. The word owning the sung +// syllable is found the way the laptops find it (fleet/native-trio.mjs paint): +// syllables run through the line's words in order. Answers draw a size bigger +// and linger 2.5 s after the line ends; other lines' last word lingers 0.8 s. +// The six seats stand as dim breathing figures; the stage keeps its footer. +const TRIO_SEAT_RGB=[[143,209,63],[90,87,211],[242,167,185],[143,209,63],[90,87,211],[242,167,185]]; +let trioLastWord=null; +function drawTrioLyric(music, elapsed) { + const width=viewWidth(), height=viewHeight, centerX=viewCenterX(), centerY=height*.46; + const measure=(text,size)=>handleWidth(String(text).toLowerCase(),size); + const beat=60/(Number(music.bpm)||100), pulse=Math.max(0,1-((elapsed/beat)%1)*1.4); + triangleDepth=-.8; + const ring=Math.min(width,height)*.42, scale=Math.min(width,height)*.024, limb=scale*.17; + for(let i=0;i<6;i++) { + const a=-Math.PI/2+i*Math.PI/3, x=centerX+platformMath.cos(a)*ring, y=centerY+platformMath.sin(a)*ring*.78; + const color=TRIO_SEAT_RGB[i].map(v=>Math.round(v*(.22+.12*pulse))); + filledDisc(x,y-scale*.8,scale*.42,color); + filledCapsule(x,y-scale*.25,x,y+scale*.65,limb,color); + for(const side of [-1,1]) { + filledCapsule(x,y,x+side*scale*.6,y+scale*.4,limb,color); + filledCapsule(x,y+scale*.6,x+side*scale*.35,y+scale*1.35,limb,color); + } + } + // The line being sung: hums are never words. Remember it so its last word can linger. + const lyric=music.lyric&&typeof music.lyric.text==='string'&&music.lyric.role!=='hum'?music.lyric:null; + if(lyric)trioLastWord=lyric; + const cur=lyric||(trioLastWord&&elapsed>=Number(trioLastWord.t)?trioLastWord:null); + if(!cur)return; + const t0=Number(cur.t)||0, dur=Number(cur.dur)||0, linger=cur.answer?2.5:.8; + if(dur&&elapsed>t0+dur+linger)return; + const syls=Array.isArray(cur.syllables)?cur.syllables.map(s=>({t:Number(s.t),text:String(s.text??'')})) + :(cur.syl||[]).map(([t,text])=>({t:Number(t),text:String(text??'')})); + const words=String(cur.text).trim().split(/\s+/).filter(Boolean); + let word=null; + if(!syls.length) word=words.join(' '); + else { + let sung=-1; for(let i=0;i=0)sung=cur.syllable; + if(sung<0)return; + // The word that owns the sung syllable: each word takes the syllables that spell it. + let k=0; word=words[0]||''; + for(const wd of words){let acc='',take=0;while(k+take=3?cur.rgb.slice(0,3).map(v=>clamp(Math.round(Number(v)||0),0,255)):[240,240,240]; + let size=Math.round(height*(cur.answer?.34:.28)); + while(size>24&&measure(word,size)>width*.9)size-=4; + const name=String(cur.member||music.section||''), nameSize=Math.max(18,Math.round(size*.22)); + const top=centerY-size/2; + if(name)typeWrite(name,centerX-measure(name,nameSize)/2,top-nameSize*1.7,nameSize,...color.map(v=>Math.round(v*.75))); + typeWrite(word,centerX-measure(word,size)/2,top,size,...color); +} + +function performanceStageActive() { + const stage = globalThis.__oskiewarStageState; + return Boolean(stage?.curtain || stage?.performance?.active); +} + +// A room-performance display: the transport supplies title, time and notes; +// it never touches fighter physics or creates a second musical soundtrack. +function drawPerformanceStage() { + const stage = globalThis.__oskiewarStageState; + if (!performanceStageActive()) return false; + syncGameView(); + wipe(3, 5, 10); + const music = stage.performance; + const notepatPlaying = music?.visual === 'notepat-score-v1' && music.playing && music.look && music.movement; + if (stage.curtain && !notepatPlaying) { drawCurtainDirections(stage); return true; } + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp(Number(music.elapsed) + (music.playing ? age : 0), 0, Number(music.duration) || 0); + const duration = Math.max(0, Number(music.duration) || 0); + const width = viewWidth(), center = viewCenterX(); + const pulse = clamp(Number(music.intensity) || 0, 0, 1); + const t = elapsed; + triangleDepth = -.8; + if (music.visual === 'notepat-score-v1' && music.playing) drawNotepatScore(music, elapsed); + else if (music.dance === 'trio-round-v1') drawTrioLyric(music, elapsed); + else if (music.dance === 'femrag-round-v1') drawFemragDance(music, elapsed); + else + for (let index = 0; index < 2; index++) { + const note = music.notes?.[index % Math.max(1, music.notes?.length || 1)]; + const singing = music.playing && Number.isFinite(note); + const level = singing ? .25 + pulse * .75 : pulse * .35; + const radius = Math.min(width * .12, 116); + const x = center + (index ? 1 : -1) * Math.min(width * .19, 225); + const y = viewHeight * .43 + platformMath.sin(t * 1.7 + index * 1.8) * (5 + level * 6); + const color = index ? [77, 188, 222] : [239, 133, 152]; + filledDisc(x, y, radius, color); + triangleDepth = -.85; + const ink = [12, 19, 35]; + const blink = platformMath.sin(t * .73 + index * 2.1) > .988; + for (const side of [-1, 1]) { + const ex = x + side * radius * .32, ey = y - radius * .18; + if (blink) filledCapsule(ex - radius * .09, ey, ex + radius * .09, ey, radius * .055, ink); + else { + filledDisc(ex, ey, radius * .085, ink); + filledDisc(ex + radius * .019, ey - radius * .026, radius * .025, [245, 248, 255]); + } + } + const mouthY = y + radius * .3; + filledCapsule(x - radius * .12, mouthY, x + radius * .12, mouthY, + radius * (.055 + level * .26), ink); + triangleDepth = -.8; + } + const title = String(music.title || "Untitled composition").slice(0, 110); + let size = 38; + while (size > 18 && handleWidth(title, size) > width - 72) size -= 2; + typeWrite(title, center - handleWidth(title, size) / 2, viewHeight - 126, size, 240, 243, 251); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 20) / 2, viewHeight - 76, 20, 150, 168, 193); + const trackWidth = Math.min(width - 100, 620), left = center - trackWidth / 2; + hudBox(left, viewHeight - 37, trackWidth, 4, 31, 42, 61); + if (duration) hudBox(left, viewHeight - 37, trackWidth * elapsed / duration, 4, 105, 205, 213); + return true; +} + +// The composition remains visible during a fight, independently of the +// full-screen performance mode. Its lane replaces the debug session label. +function performanceFooterVisible() { + const stage = globalThis.__oskiewarStageState; + const music = stage?.performance; + return Boolean(!stage?.curtain && music?.title && + (music.playing || music.phase === "countdown" || music.phase === "stale")); +} +function drawPerformanceFooter() { + if (!performanceFooterVisible()) return; + const stage = globalThis.__oskiewarStageState, music = stage.performance; + const duration = Math.max(0, Number(music.duration) || 0); + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp((Number(music.elapsed) || 0) + (music.playing ? age : 0), 0, duration); + const width = Math.min(viewWidth() * .66, 1000), center = viewCenterX(); + const left = center - width / 2, top = viewHeight - 88; + const previousDepth = triangleDepth; + triangleDepth = -1.49; + // Use screen rectangles so the Xbox's GPU pass does not cover the strip. + screenRect(left, top, width, 74, [8, 14, 25]); + const title = String(music.title).slice(0, 110); + let size = 25; + while (size > 16 && handleWidth(title, size) > width - 24) size--; + typeWrite(title, center - handleWidth(title, size) / 2, top + 7, size, 243, 247, 255); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 17) / 2, top + 42, 17, 166, 189, 213); + screenRect(left + 12, top + 68, width - 24, 3, [36, 51, 68]); + if (duration) screenRect(left + 12, top + 68, (width - 24) * elapsed / duration, 3, [105, 222, 213]); + triangleDepth = previousDepth; +} + +function drawCurtainDirections(stage = globalThis.__oskiewarStageState) { + const width = viewWidth(), center = viewCenterX(), left = center - width / 2; + const music = stage?.performance; + const age = Math.max(0, (Date.now() - (stage?.receivedAt || Date.now())) / 1000); + const elapsed = (Number(music?.elapsed) || 0) + Math.min(age, 1); + const lyrics = music?.curtainStyle !== "directions" && music?.playing && age < 2.5 + ? (music.lyrics || []).filter(line => elapsed >= line.start - 1.5 && elapsed < line.end + .35).slice(0, 3) : []; + // Wall-clock motion continues while both match simulations are frozen. + const time = Date.now() / 1000; + const palette = [[244, 128, 179], [91, 215, 227], [163, 223, 91], [255, 191, 90], [169, 142, 248]]; + triangleDepth = -1; + for (let lane = 0; lane < 2; lane++) { + const spacing = width / 5, length = spacing * .47, height = length * .55; + const y = viewHeight * (lane ? .85 : .16); + for (let index = -1; index < 6; index++) { + const x = left + index * spacing + ((time * width * .12 + lane * spacing * .5) % spacing); + const base = palette[((index + lane * 2) % 5 + 5) % 5]; + const glow = .52 + .3 * platformMath.sin(time * 2.4 - index * .8); + const color = base.map(v => Math.round(v * glow)); + screenRect(x, y - height * .13, length * .58, height * .26, color); + screenTriangle(x + length * .5, y - height / 2, + x + length, y, x + length * .5, y + height / 2, ...color); + } + } + drawCurtainFighter(left + width * (lyrics.length ? .08 : .24), + viewHeight * (lyrics.length ? .68 : .52), Math.min(width, viewHeight) * (lyrics.length ? .052 : .095), time); + if (lyrics.length) { + for (let row = 0; row < lyrics.length; row++) { + const line = lyrics[row], words = line.words || []; + const text = words.map(word => word.text).join(" "); + let size = Math.min(50, width * .043); + while (size > 16 && handleWidth(text, size) > width * .82) size--; + const y = viewHeight * (.4 + (row - (lyrics.length - 1) / 2) * .16); + let x = center - handleWidth(text, size) / 2; + const color = /^#[a-f0-9]{6}$/i.test(line.color || "") + ? [1, 3, 5].map(i => parseInt(line.color.slice(i, i + 2), 16)) : [163, 223, 91]; + for (const word of words) { + const active = elapsed >= word.start && elapsed < word.end; + const ink = elapsed < word.start ? [129, 141, 158] : color; + typeWrite(word.text, x, y, size, ...ink); + const w = handleWidth(word.text, size); + if (active) screenRect(x, y + size * 1.18, w, Math.max(2, size * .06), color); + x += handleWidth(word.text + " ", size); + } + } + return; + } + const label = "look that way ->", size = Math.min(46, width * .045); + typeWrite(label, center - handleWidth(label, size) / 2, + viewHeight * .68, size, 229, 240, 248); + // A large arrow completes the character's pointing gesture. + const x = center + width * .04, y = viewHeight * .46, length = width * .27; + const color = palette[Math.floor(time / 2) % palette.length]; + screenRect(x, y - length * .07, length * .6, length * .14, color); + screenTriangle(x + length * .55, y - length * .26, + x + length, y, x + length * .55, y + length * .26, ...color); +} + +function drawCurtainFighter(x, y, r, time) { + const bob = platformMath.sin(time * 3) * r * .05; + y += bob; + const ink = [20, 29, 42], skin = [166, 225, 103], boot = [239, 125, 166]; + triangleDepth = -.9; + filledCapsule(x, y + r * .8, x - r * .38, y + r * 1.7, r * .16, skin); + filledCapsule(x, y + r * .8, x + r * .45, y + r * 1.7, r * .16, skin); + filledCapsule(x - r * .52, y + r * 1.72, x - r * .2, y + r * 1.72, r * .17, boot); + filledCapsule(x + r * .4, y + r * 1.72, x + r * .78, y + r * 1.72, r * .17, boot); + filledCapsule(x, y + r * .26, x, y + r * .86, r * .26, boot); + filledCapsule(x + r * .1, y + r * .38, x + r * 1.35, y + r * .13, r * .13, skin); + filledDisc(x + r * 1.35, y + r * .13, r * .19, skin); + filledCapsule(x + r * 1.3, y + r * .05, x + r * 1.68, y + r * .05, r * .08, skin); + filledDisc(x, y - r * .62, r, skin); + // Eyes and nose sit on the right side: gaze agrees with the gesture. + triangleDepth = -1.05; + for (const ex of [x + r * .12, x + r * .62]) { + filledDisc(ex, y - r * .82, r * .22, [243, 248, 232]); + filledDisc(ex + r * .09, y - r * .8, r * .095, ink); + } + filledDisc(x + r * .98, y - r * .44, r * .18, skin); + filledCapsule(x + r * .33, y - r * .13, x + r * .7, y - r * .18, r * .055, ink); + triangleDepth = -1; +} + +// NOTEPAT_SCORE_VISUAL_V1_BEGIN +const NOTEPAT_TV_SCORE={"hash":"139a77d1758773680fe08038f4a39f8e7a6b48838a687369a4d9e17a28cd2a5c","duration":774.4119,"sections":[[0,60.42,"Overture"],[60.42,116.9051,"The Walk"],[116.9051,195.1946,"Waltz"],[195.1946,243.1453,"Chase"],[243.1453,301.4882,"Sneak"],[301.4882,375.8215,"Lullaby"],[375.8215,441,"The Climb"],[441,554.3143,"The Lift"],[554.3143,592.437,"Fanfare"],[592.437,713.2119,"Return"],[713.2119,774.4119,"Vanish"]],"rows":[[[0,0.03,99,26],[0,0.055,50,68],[0.06,0.16,39,64],[0.06,0.14,51,38],[0.4,1.1,60,36],[2.2,0.03,99,26],[2.2,0.055,50,68],[2.26,0.16,39,64],[2.26,0.14,51,38],[4.4,0.03,99,26],[4.4,0.055,50,68],[4.46,0.16,39,64],[4.46,0.14,51,38],[6.6,0.03,99,26],[6.6,0.055,50,68],[6.66,0.16,39,64],[6.66,0.14,51,38],[8.8,0.03,99,26],[8.8,0.055,50,68],[8.86,0.16,39,64],[8.86,0.14,51,38],[11,0.03,99,26],[11,0.055,50,68],[11.06,0.16,39,64],[11.06,0.14,51,38],[13.2,0.03,99,26],[13.2,0.055,50,68],[13.26,0.16,39,64],[13.26,0.14,51,38],[15.4,0.03,99,26],[15.4,0.055,50,68],[15.46,0.16,39,64],[15.46,0.14,51,38],[17.6,0.03,99,26],[17.6,0.055,50,68],[17.66,0.16,39,64],[17.66,0.14,51,38],[19.8,0.03,99,26],[19.8,0.055,50,68],[19.86,0.16,39,64],[19.86,0.14,51,38],[22,0.03,99,26],[22,0.055,50,68],[22.06,0.16,39,64],[22.06,0.14,51,38],[24.2,0.03,99,26],[24.2,0.055,50,68],[24.26,0.16,39,64],[24.26,0.14,51,38],[26.4,0.03,99,26],[26.4,0.055,50,68],[26.46,0.16,39,64],[26.46,0.14,51,38],[28.6,0.03,99,26],[28.6,0.055,50,68],[28.66,0.16,39,64],[28.66,0.14,51,38],[30.8,0.03,99,26],[30.8,0.055,50,68],[30.86,0.16,39,64],[30.86,0.14,51,38],[33,0.855,72,169],[33,0.03,99,26],[33,0.055,50,68],[33.06,0.16,39,64],[33.06,0.14,51,38],[34.9,0.03,99,26],[34.9,0.055,50,68],[34.96,0.16,39,64],[34.96,0.14,51,38],[36.8,0.855,76,199],[36.8,0.03,99,26],[36.8,0.055,50,68],[36.86,0.16,39,64],[36.86,0.14,51,38],[38.7,0.03,99,26],[38.7,0.055,50,68],[38.76,0.16,39,64],[38.76,0.14,51,38],[40.6,0.03,99,26],[40.6,0.055,50,68],[40.66,0.16,39,64],[40.66,0.14,51,38],[42.5,0.03,99,26],[42.5,0.055,50,68],[42.56,0.16,39,64],[42.56,0.14,51,38],[43.61,0.333,79,199],[43.98,0.03,99,26],[43.98,0.055,50,68],[44.04,0.16,39,64],[44.04,0.14,51,38],[45.46,0.03,99,26],[45.46,0.055,50,68],[45.52,0.16,39,64],[45.52,0.14,51,38],[46.94,1.332,72,199],[46.94,0.03,99,26],[46.94,0.055,50,68],[47,0.16,39,64],[47,0.14,51,38],[48.42,0.03,99,26],[48.42,0.055,50,68],[48.48,0.16,39,64],[48.48,0.14,51,38],[49.9,0.03,99,26],[49.9,0.055,50,68],[49.96,0.16,39,64],[49.96,0.14,51,38],[51.02,0.03,99,26],[51.02,0.055,50,68],[51.08,0.16,39,64],[51.08,0.14,51,38],[51.86,0.252,74,199],[52.14,0.03,99,26],[52.14,0.055,50,68],[52.2,0.16,39,64],[52.2,0.14,51,38],[53.26,0.03,99,26],[53.26,0.055,50,68],[53.32,0.16,39,64],[53.32,0.14,51,38],[54.38,0.03,99,26],[54.38,0.055,50,68],[54.44,0.16,39,64],[54.44,0.14,51,38],[55.5,0.03,99,26],[55.5,0.055,50,68],[55.56,0.16,39,64],[55.56,0.14,51,38],[55.94,0.25,76,199],[56.38,0.03,99,26],[56.38,0.055,50,68],[56.44,0.16,39,64],[56.44,0.14,51,38],[57.26,0.03,99,26],[57.26,0.055,50,68],[57.32,0.16,39,64],[57.32,0.14,51,38],[57.7,0.396,74,177],[58.14,0.03,99,26],[58.14,0.055,50,68],[58.2,0.16,39,64],[58.2,0.14,51,38],[59.02,0.03,99,26],[59.02,0.055,50,68],[59.08,0.16,39,64],[59.08,0.14,51,38],[59.62,0.15,60,154],[59.9,0.03,99,26],[59.9,0.055,50,68],[59.96,0.16,39,64],[59.96,0.14,51,38],[60.42,0.27,48,30],[60.42,0.03,83,11],[60.42,0.03,99,19],[60.42,0.055,50,50],[60.44,0.31,42,15],[60.48,0.16,39,47],[60.48,0.14,51,28],[60.9,0.36,76,22],[61.42,0.65,60,60],[61.62,0.27,48,30],[61.62,0.03,83,11],[61.62,0.03,99,19],[61.62,0.055,50,50],[61.64,0.31,42,15],[61.68,0.16,39,47],[61.68,0.14,51,28],[62.1,0.36,76,22],[62.82,0.27,48,32],[62.82,0.03,83,11],[62.82,0.03,99,19],[62.82,0.055,50,50],[62.84,0.31,42,16],[62.88,0.16,39,47],[62.88,0.14,51,28],[63.3,0.36,76,23],[64.02,0.27,48,32],[64.02,0.03,83,11],[64.02,0.03,99,19],[64.02,0.055,50,50],[64.04,0.31,42,16],[64.08,0.16,39,47],[64.08,0.14,51,28],[64.5,0.36,76,23],[65.22,0.27,48,34],[65.22,0.03,83,12],[65.22,0.03,99,19],[65.22,0.055,50,50],[65.24,0.31,42,17],[65.28,0.16,39,47],[65.28,0.14,51,28],[65.7,0.36,72,24],[66.42,0.27,48,34],[66.42,0.03,83,12],[66.42,0.03,99,19],[66.42,0.055,50,50],[66.44,0.31,42,17],[66.48,0.16,39,47],[66.48,0.14,51,28],[66.9,0.36,72,24],[67.62,0.27,48,36],[67.62,0.03,83,13],[67.62,0.03,99,19],[67.62,0.055,50,50],[67.64,0.31,42,18],[67.68,0.16,39,47],[67.68,0.14,51,28],[68.1,0.36,72,25],[68.82,0.27,48,36],[68.82,0.03,83,13],[68.82,0.03,99,19],[68.82,0.055,50,50],[68.84,0.31,42,18],[68.88,0.16,39,47],[68.88,0.14,51,28],[69.3,0.36,72,25],[70.02,0.27,48,38],[70.02,0.03,83,13],[70.02,0.03,99,19],[70.02,0.055,50,50],[70.04,0.31,42,19],[70.08,0.16,39,47],[70.08,0.14,51,28],[70.5,0.36,69,22],[71.22,0.27,48,38],[71.22,0.03,83,13],[71.22,0.03,99,19],[71.22,0.055,50,50],[71.24,0.31,42,19],[71.28,0.16,39,47],[71.28,0.14,51,28],[71.7,0.36,69,22],[72.42,0.27,48,39],[72.42,0.03,83,14],[72.42,0.03,99,19],[72.42,0.055,50,50],[72.44,0.31,42,20],[72.48,0.16,39,47],[72.48,0.14,51,28],[72.9,0.36,69,23],[73.62,0.27,48,39],[73.62,0.03,83,14],[73.62,0.03,99,19],[73.62,0.055,50,50],[73.64,0.31,42,20],[73.68,0.16,39,47],[73.68,0.14,51,28],[74.1,0.36,69,23],[74.82,0.27,48,41],[74.82,0.03,83,14],[74.82,0.03,99,19],[74.82,0.055,50,50],[74.84,0.31,42,21],[74.88,0.16,39,47],[74.88,0.14,51,28],[75.3,0.36,71,24],[76.02,0.27,48,41],[76.02,0.03,83,14],[76.02,0.03,99,19],[76.02,0.055,50,50],[76.04,0.31,42,21],[76.08,0.16,39,47],[76.08,0.14,51,28],[76.5,0.36,71,24],[77.22,0.27,48,38],[77.22,0.03,83,13],[77.22,0.03,99,19],[77.22,0.055,50,50],[77.24,0.31,42,19],[77.28,0.16,39,47],[77.28,0.14,51,28],[77.7,0.36,76,22],[78.42,0.18,60,15],[78.42,0.03,99,19],[78.42,0.055,50,50],[78.48,0.16,39,47],[78.48,0.14,51,28],[79.62,0.27,48,35],[79.62,0.03,83,12],[79.62,0.03,99,19],[79.62,0.055,50,50],[79.64,0.31,42,17],[79.68,0.16,39,47],[79.68,0.14,51,28],[80.091,0.353,76,29],[80.796,0.27,48,35],[80.796,0.03,83,12],[80.796,0.03,99,19],[80.796,0.055,50,50],[80.817,0.31,42,17],[80.856,0.16,39,47],[80.856,0.14,51,28],[81.267,0.353,76,29],[81.973,0.27,48,37],[81.973,0.03,83,13],[81.973,0.03,99,19],[81.973,0.055,50,50],[81.993,0.31,42,18],[82.033,0.16,39,47],[82.033,0.14,51,28],[82.444,0.353,76,31],[83.149,0.27,48,37],[83.149,0.03,83,13],[83.149,0.03,99,19],[83.149,0.055,50,50],[83.169,0.31,42,18],[83.209,0.16,39,47],[83.209,0.14,51,28],[83.62,0.353,76,31],[84.326,0.27,48,39],[84.326,0.03,83,14],[84.326,0.03,99,19],[84.326,0.055,50,50],[84.346,0.31,42,19],[84.386,0.16,39,47],[84.386,0.14,51,28],[84.796,0.353,72,32],[85.502,0.27,48,39],[85.502,0.03,83,14],[85.502,0.03,99,19],[85.502,0.055,50,50],[85.522,0.31,42,19],[85.562,0.16,39,47],[85.562,0.14,51,28],[85.973,0.353,72,32],[86.679,0.27,48,41],[86.679,0.03,83,14],[86.679,0.03,99,19],[86.679,0.055,50,50],[86.699,0.31,42,20],[86.739,0.16,39,47],[86.739,0.14,51,28],[87.149,0.353,72,23],[87.855,0.27,48,41],[87.855,0.03,83,14],[87.855,0.03,99,19],[87.855,0.055,50,50],[87.875,0.31,42,20],[87.915,0.16,39,47],[87.915,0.14,51,28],[88.326,0.353,72,23],[89.032,0.27,48,43],[89.032,0.03,83,15],[89.032,0.03,99,19],[89.032,0.055,50,50],[89.052,0.31,42,21],[89.092,0.16,39,47],[89.092,0.14,51,28],[90.208,0.27,48,43],[90.208,0.03,83,15],[90.208,0.03,99,19],[90.208,0.055,50,50],[90.228,0.31,42,21],[90.268,0.16,39,47],[90.268,0.14,51,28],[91.385,0.27,48,45],[91.385,0.03,83,16],[91.385,0.03,99,19],[91.385,0.055,50,50],[91.405,0.31,42,22],[91.445,0.16,39,47],[91.445,0.14,51,28],[91.679,0.224,72,14],[92.561,0.27,48,45],[92.561,0.03,83,16],[92.561,0.03,99,19],[92.561,0.055,50,50],[92.581,0.31,42,22],[92.621,0.16,39,47],[92.621,0.14,51,28],[93.738,0.27,48,47],[93.738,0.03,83,16],[93.738,0.03,99,19],[93.738,0.055,50,50],[93.758,0.31,42,24],[93.798,0.16,39,47],[93.798,0.14,51,28],[94.914,0.27,48,47],[94.914,0.03,83,16],[94.914,0.03,99,19],[94.914,0.055,50,50],[94.934,0.31,42,24],[94.974,0.16,39,47],[94.974,0.14,51,28],[96.091,0.27,48,44],[96.091,0.03,83,15],[96.091,0.03,99,19],[96.091,0.055,50,50],[96.111,0.31,42,22],[96.151,0.16,39,47],[96.151,0.14,51,28],[97.267,0.176,60,31],[97.267,0.03,99,19],[97.267,0.055,50,50],[97.327,0.16,39,47],[97.327,0.14,51,28],[98.444,0.27,48,39],[98.444,0.03,83,14],[98.444,0.03,99,19],[98.444,0.055,50,50],[98.463,0.31,42,19],[98.504,0.16,39,47],[98.504,0.14,51,28],[98.732,0.219,79,22],[98.905,0.346,76,39],[99.597,0.27,48,39],[99.597,0.03,83,14],[99.597,0.03,99,19],[99.597,0.055,50,50],[99.617,0.31,42,19],[99.657,0.16,39,47],[99.657,0.14,51,28],[99.886,0.035,117,10],[100.059,0.346,76,39],[100.463,0.035,117,10],[100.751,0.27,48,41],[100.751,0.03,83,14],[100.751,0.03,99,19],[100.751,0.055,50,50],[100.771,0.31,42,21],[100.811,0.16,39,47],[100.811,0.14,51,28],[101.213,0.346,76,20],[101.905,0.27,48,41],[101.905,0.03,83,14],[101.905,0.03,99,19],[101.905,0.055,50,50],[101.925,0.31,42,21],[101.965,0.16,39,47],[101.965,0.14,51,28],[102.367,0.346,76,20],[103.059,0.27,48,44],[103.059,0.03,83,15],[103.059,0.03,99,19],[103.059,0.055,50,50],[103.079,0.31,42,22],[103.119,0.16,39,47],[103.119,0.14,51,28],[103.492,0.7,76,11],[103.52,0.346,72,21],[104.213,0.219,72,12],[104.213,0.27,48,44],[104.213,0.03,83,15],[104.213,0.03,99,19],[104.213,0.055,50,50],[104.233,0.31,42,22],[104.273,0.16,39,47],[104.273,0.14,51,28],[104.674,0.346,72,21],[105.078,0.035,117,12],[105.367,0.27,48,46],[105.367,0.03,83,16],[105.367,0.03,99,19],[105.367,0.055,50,50],[105.387,0.31,42,23],[105.427,0.16,39,47],[105.427,0.14,51,28],[105.655,0.035,117,9],[105.828,0.346,72,35],[106.52,0.27,48,46],[106.52,0.03,83,16],[106.52,0.03,99,19],[106.52,0.055,50,50],[106.54,0.31,42,23],[106.58,0.16,39,47],[106.58,0.14,51,28],[106.982,0.346,72,35],[107.674,0.27,48,48],[107.674,0.03,83,17],[107.674,0.03,99,19],[107.674,0.055,50,50],[107.694,0.31,42,24],[107.734,0.16,39,47],[107.734,0.14,51,28],[108.828,0.27,48,48],[108.828,0.03,83,17],[108.828,0.03,99,19],[108.828,0.055,50,50],[108.848,0.31,42,24],[108.888,0.16,39,47],[108.888,0.14,51,28],[109.694,0.219,65,20],[109.694,0.035,117,10],[109.982,0.27,48,51],[109.982,0.03,83,18],[109.982,0.03,99,19],[109.982,0.055,50,50],[110.002,0.31,42,25],[110.042,0.16,39,47],[110.042,0.14,51,28],[110.27,0.219,72,21],[110.27,0.035,117,14],[110.415,0.7,77,18],[111.136,0.27,48,51],[111.136,0.03,83,18],[111.136,0.03,99,19],[111.136,0.055,50,50],[111.156,0.31,42,25],[111.196,0.16,39,47],[111.196,0.14,51,28],[112.29,0.27,48,53],[112.29,0.03,83,19],[112.29,0.03,99,19],[112.29,0.055,50,50],[112.31,0.31,42,26],[112.35,0.16,39,47],[112.35,0.14,51,28],[113.444,0.27,48,53],[113.444,0.03,83,19],[113.444,0.03,99,19],[113.444,0.055,50,50],[113.463,0.31,42,26],[113.504,0.16,39,47],[113.504,0.14,51,28],[114.597,0.27,48,49],[114.597,0.03,83,17],[114.597,0.03,99,19],[114.597,0.055,50,50],[114.617,0.31,42,24],[114.657,0.16,39,47],[114.657,0.14,51,28],[115.751,0.173,60,19],[115.751,0.03,99,19],[115.751,0.055,50,50],[115.811,0.16,39,47],[115.811,0.14,51,28],[116.905,0.03,99,22],[116.905,0.055,50,59],[116.965,0.16,39,56],[116.965,0.14,51,33],[118.269,0.03,99,22],[118.269,0.055,50,59],[118.329,0.16,39,56],[118.329,0.14,51,33],[119.632,0.03,99,22],[119.632,0.055,50,59],[119.692,0.16,39,56],[119.692,0.14,51,33],[120.996,0.03,99,22],[120.996,0.055,50,59],[121.056,0.16,39,56],[121.056,0.14,51,33],[122.36,0.03,99,22],[122.36,0.055,50,59],[122.42,0.16,39,56],[122.42,0.14,51,33],[123.723,0.03,99,22],[123.723,0.055,50,59],[123.783,0.16,39,56],[123.783,0.14,51,33],[125.087,0.03,99,22],[125.087,0.055,50,59],[125.147,0.16,39,56],[125.147,0.14,51,33],[126.451,0.03,99,22],[126.451,0.055,50,59],[126.511,0.16,39,56],[126.511,0.14,51,33],[127.814,0.03,99,22],[127.814,0.055,50,59],[127.874,0.16,39,56],[127.874,0.14,51,33],[129.178,0.03,99,22],[129.178,0.055,50,59],[129.238,0.16,39,56],[129.238,0.14,51,33],[130.542,0.03,99,22],[130.542,0.055,50,59],[130.601,0.16,39,56],[130.601,0.14,51,33],[131.905,0.03,99,22],[131.905,0.055,50,59],[131.965,0.16,39,56],[131.965,0.14,51,33],[133.269,0.03,99,22],[133.269,0.055,50,59],[133.329,0.16,39,56],[133.329,0.14,51,33],[134.632,0.03,99,22],[134.632,0.055,50,59],[134.692,0.16,39,56],[134.692,0.14,51,33],[135.996,0.03,99,22],[135.996,0.055,50,59],[136.056,0.16,39,56],[136.056,0.14,51,33],[137.36,0.03,99,22],[137.36,0.055,50,59],[137.42,0.16,39,56],[137.42,0.14,51,33],[138.723,0.818,76,26],[138.723,0.03,99,22],[138.723,0.055,50,59],[138.783,0.16,39,56],[138.783,0.14,51,33],[140.087,0.03,99,22],[140.087,0.055,50,59],[140.087,0.045,111,21],[140.147,0.16,39,56],[140.147,0.14,51,33],[140.769,0.045,111,9],[141.451,0.03,99,22],[141.451,0.055,50,59],[141.511,0.16,39,56],[141.511,0.14,51,33],[142.36,0.191,77,10],[142.814,1.227,76,26],[142.814,0.03,99,22],[142.814,0.055,50,59],[142.874,0.16,39,56],[142.874,0.14,51,33],[144.178,0.03,99,22],[144.178,0.055,50,59],[144.238,0.16,39,56],[144.238,0.14,51,33],[144.405,0.191,76,10],[144.86,0.045,111,14],[145.541,0.045,111,18],[145.542,0.03,99,22],[145.542,0.055,50,59],[145.601,0.16,39,56],[145.601,0.14,51,33],[146.905,0.818,74,31],[146.905,0.03,99,22],[146.905,0.055,50,59],[146.965,0.16,39,56],[146.965,0.14,51,33],[148.269,0.03,99,22],[148.269,0.055,50,59],[148.329,0.16,39,56],[148.329,0.14,51,33],[149.178,0.191,76,12],[149.632,0.03,99,22],[149.632,0.055,50,59],[149.632,0.045,111,15],[149.692,0.16,39,56],[149.692,0.14,51,33],[150.314,0.045,111,15],[150.996,1.227,76,33],[150.996,0.03,99,22],[150.996,0.055,50,59],[151.056,0.16,39,56],[151.056,0.14,51,33],[151.223,0.191,72,12],[152.36,0.03,99,22],[152.36,0.055,50,59],[152.42,0.16,39,56],[152.42,0.14,51,33],[153.723,0.03,99,22],[153.723,0.055,50,59],[153.783,0.16,39,56],[153.783,0.14,51,33],[155.087,0.03,99,22],[155.087,0.055,50,59],[155.087,0.045,111,21],[155.147,0.16,39,56],[155.147,0.14,51,33],[155.769,0.045,111,9],[155.996,0.409,76,38],[155.996,0.191,76,14],[156.451,0.03,99,22],[156.451,0.055,50,59],[156.511,0.16,39,56],[156.511,0.14,51,33],[157.814,0.03,99,22],[157.814,0.055,50,59],[157.874,0.16,39,56],[157.874,0.14,51,33],[158.041,0.191,76,14],[158.723,0.409,71,38],[159.178,0.03,99,22],[159.178,0.055,50,59],[159.238,0.16,39,56],[159.238,0.14,51,33],[159.86,0.045,111,14],[160.541,0.045,111,18],[160.542,0.03,99,22],[160.542,0.055,50,59],[160.601,0.16,39,56],[160.601,0.14,51,33],[161.905,0.03,99,22],[161.905,0.055,50,59],[161.965,0.16,39,56],[161.965,0.14,51,33],[162.814,0.191,60,20],[163.269,0.818,77,17],[163.269,0.03,99,22],[163.269,0.055,50,59],[163.329,0.16,39,56],[163.329,0.14,51,33],[164.632,0.03,99,22],[164.632,0.055,50,59],[164.632,0.045,111,15],[164.692,0.16,39,56],[164.692,0.14,51,33],[164.86,0.191,71,20],[165.314,0.045,111,15],[165.996,0.03,99,22],[165.996,0.055,50,59],[166.056,0.16,39,56],[166.056,0.14,51,33],[167.36,0.818,73,17],[167.36,0.03,99,22],[167.36,0.055,50,59],[167.42,0.16,39,56],[167.42,0.14,51,33],[168.723,0.03,99,22],[168.723,0.055,50,59],[168.783,0.16,39,56],[168.783,0.14,51,33],[169.632,0.191,62,20],[170.087,0.03,99,22],[170.087,0.055,50,59],[170.087,0.045,111,21],[170.147,0.16,39,56],[170.147,0.14,51,33],[170.769,0.045,111,9],[171.451,0.818,73,16],[171.451,0.03,99,22],[171.451,0.055,50,59],[171.511,0.16,39,56],[171.511,0.14,51,33],[171.678,0.191,60,18],[172.814,0.03,99,22],[172.814,0.055,50,59],[172.874,0.16,39,56],[172.874,0.14,51,33],[174.178,0.03,99,22],[174.178,0.055,50,59],[174.238,0.16,39,56],[174.238,0.14,51,33],[174.86,0.045,111,14],[175.541,1.227,73,16],[175.541,0.045,111,18],[175.542,0.03,99,22],[175.542,0.055,50,59],[175.601,0.16,39,56],[175.601,0.14,51,33],[176.451,0.191,71,18],[176.905,0.03,99,22],[176.905,0.055,50,59],[176.965,0.16,39,56],[176.965,0.14,51,33],[178.269,0.03,99,22],[178.269,0.055,50,59],[178.329,0.16,39,56],[178.329,0.14,51,33],[178.496,0.191,65,18],[179.632,0.409,70,14],[179.632,0.03,99,22],[179.632,0.055,50,59],[179.632,0.045,111,15],[179.692,0.16,39,56],[179.692,0.14,51,33],[180.314,0.045,111,15],[180.996,0.03,99,22],[180.996,0.055,50,59],[181.056,0.16,39,56],[181.056,0.14,51,33],[182.36,0.03,99,22],[182.36,0.055,50,59],[182.42,0.16,39,56],[182.42,0.14,51,33],[183.811,0.03,99,22],[183.811,0.055,50,59],[183.871,0.16,39,56],[183.871,0.14,51,33],[185.263,0.03,99,22],[185.263,0.055,50,59],[185.323,0.16,39,56],[185.323,0.14,51,33],[186.714,0.03,99,22],[186.714,0.055,50,59],[186.774,0.16,39,56],[186.774,0.14,51,33],[188.166,0.03,99,22],[188.166,0.055,50,59],[188.226,0.16,39,56],[188.226,0.14,51,33],[189.773,0.03,99,22],[189.773,0.055,50,59],[189.833,0.16,39,56],[189.833,0.14,51,33],[191.38,0.03,99,22],[191.38,0.055,50,59],[191.44,0.16,39,56],[191.44,0.14,51,33],[192.988,1.607,45,28],[192.988,0.03,99,22],[192.988,0.055,50,59],[193.048,0.16,39,56],[193.048,0.14,51,33],[194.595,0.03,99,22],[194.595,0.055,50,59],[194.655,0.16,39,56],[194.655,0.14,51,33],[195.195,0.27,48,39],[195.195,0.03,83,14],[195.195,0.03,99,21],[195.195,0.055,50,56],[195.215,0.31,42,19],[195.255,0.16,39,52],[195.255,0.14,51,32],[195.589,0.158,69,15],[195.787,0.158,70,15],[195.984,0.27,48,39],[195.984,0.03,83,14],[195.984,0.03,99,21],[195.984,0.055,50,56],[196.004,0.31,42,19],[196.044,0.16,39,52],[196.044,0.14,51,32],[196.195,3,60,54],[196.774,0.27,48,39],[196.774,0.03,83,14],[196.774,0.03,99,21],[196.774,0.055,50,56],[196.794,0.31,42,19],[196.833,0.16,39,52],[196.833,0.14,51,32],[197.168,0.158,56,11],[197.366,0.158,55,11],[197.563,0.158,69,15],[197.563,0.27,48,39],[197.563,0.03,83,14],[197.563,0.03,99,21],[197.563,0.055,50,56],[197.583,0.31,42,19],[197.623,0.16,39,52],[197.623,0.14,51,32],[197.76,0.158,67,15],[198.352,0.27,48,39],[198.352,0.03,83,14],[198.352,0.03,99,21],[198.352,0.055,50,56],[198.373,0.31,42,19],[198.412,0.16,39,52],[198.412,0.14,51,32],[199.142,0.158,72,15],[199.142,0.27,48,39],[199.142,0.03,83,14],[199.142,0.03,99,21],[199.142,0.055,50,56],[199.162,0.31,42,19],[199.202,0.16,39,52],[199.202,0.14,51,32],[199.339,0.158,74,15],[199.931,0.27,48,39],[199.931,0.03,83,14],[199.931,0.03,99,21],[199.931,0.055,50,56],[199.952,0.31,42,19],[199.991,0.16,39,52],[199.991,0.14,51,32],[200.721,0.158,56,11],[200.721,0.27,48,39],[200.721,0.03,83,14],[200.721,0.03,99,21],[200.721,0.055,50,56],[200.741,0.31,42,19],[200.781,0.16,39,52],[200.781,0.14,51,32],[200.918,0.158,58,11],[201.51,0.27,48,39],[201.51,0.03,83,14],[201.51,0.03,99,21],[201.51,0.055,50,56],[201.53,0.31,42,19],[201.57,0.16,39,52],[201.57,0.14,51,32],[202.3,0.158,67,20],[202.3,0.27,48,39],[202.3,0.03,83,14],[202.3,0.03,99,21],[202.3,0.055,50,56],[202.32,0.31,42,19],[202.36,0.16,39,52],[202.36,0.14,51,32],[202.497,0.158,65,20],[202.695,0.158,76,27],[202.892,0.158,77,27],[203.089,0.27,48,39],[203.089,0.03,83,14],[203.089,0.03,99,21],[203.089,0.055,50,56],[203.109,0.31,42,19],[203.149,0.16,39,52],[203.149,0.14,51,32],[203.879,0.27,48,39],[203.879,0.03,83,14],[203.879,0.03,99,21],[203.879,0.055,50,56],[203.899,0.31,42,19],[203.939,0.16,39,52],[203.939,0.14,51,32],[204.274,0.158,60,20],[204.471,0.158,62,20],[204.668,0.27,48,39],[204.668,0.03,83,14],[204.668,0.03,99,21],[204.668,0.055,50,56],[204.688,0.31,42,19],[204.728,0.16,39,52],[204.728,0.14,51,32],[205.383,0.27,48,39],[205.383,0.03,83,14],[205.383,0.03,99,21],[205.383,0.055,50,56],[205.403,0.31,42,19],[205.443,0.16,39,52],[205.443,0.14,51,32],[205.74,0.143,63,20],[205.918,0.143,62,20],[206.097,0.143,76,27],[206.097,0.27,48,39],[206.097,0.03,83,14],[206.097,0.03,99,21],[206.097,0.055,50,56],[206.117,0.31,42,19],[206.157,0.16,39,52],[206.157,0.14,51,32],[206.275,0.143,74,27],[206.811,0.27,48,39],[206.811,0.03,83,14],[206.811,0.03,99,21],[206.811,0.055,50,56],[206.831,0.31,42,19],[206.871,0.16,39,52],[206.871,0.14,51,32],[207.525,0.143,63,17],[207.525,0.143,65,23],[207.525,0.27,48,39],[207.525,0.03,83,14],[207.525,0.03,99,21],[207.525,0.055,50,56],[207.546,0.31,42,19],[207.585,0.16,39,52],[207.585,0.14,51,32],[207.704,0.143,65,17],[207.704,0.143,67,23],[208.24,0.27,48,39],[208.24,0.03,83,14],[208.24,0.03,99,21],[208.24,0.055,50,56],[208.26,0.31,42,19],[208.3,0.16,39,52],[208.3,0.14,51,32],[208.954,0.143,60,17],[208.954,0.27,48,39],[208.954,0.03,83,14],[208.954,0.03,99,21],[208.954,0.055,50,56],[208.974,0.31,42,19],[209.014,0.16,39,52],[209.014,0.14,51,32],[209.133,0.143,58,17],[209.311,0.143,72,23],[209.49,0.143,70,23],[209.668,0.27,48,39],[209.668,0.03,83,14],[209.668,0.03,99,21],[209.668,0.055,50,56],[209.688,0.31,42,19],[209.728,0.16,39,52],[209.728,0.14,51,32],[210.383,0.27,48,39],[210.383,0.03,83,14],[210.383,0.03,99,21],[210.383,0.055,50,56],[210.403,0.31,42,19],[210.443,0.16,39,52],[210.443,0.14,51,32],[210.74,0.143,69,23],[210.918,0.143,70,23],[211.097,0.27,48,39],[211.097,0.03,83,14],[211.097,0.03,99,21],[211.097,0.055,50,56],[211.117,0.31,42,19],[211.157,0.16,39,52],[211.157,0.14,51,32],[211.811,0.27,48,39],[211.811,0.03,83,14],[211.811,0.03,99,21],[211.811,0.055,50,56],[211.831,0.31,42,19],[211.871,0.16,39,52],[211.871,0.14,51,32],[212.168,0.143,56,17],[212.347,0.143,55,17],[212.525,0.143,69,23],[212.525,0.27,48,39],[212.525,0.03,83,14],[212.525,0.03,99,21],[212.525,0.055,50,56],[212.546,0.31,42,19],[212.585,0.16,39,52],[212.585,0.14,51,32],[212.704,0.143,67,23],[213.24,0.27,48,39],[213.24,0.03,83,14],[213.24,0.03,99,21],[213.24,0.055,50,56],[213.26,0.31,42,19],[213.3,0.16,39,52],[213.3,0.14,51,32],[213.892,0.13,72,34],[213.892,0.27,48,39],[213.892,0.03,83,14],[213.892,0.03,99,21],[213.892,0.055,50,56],[213.912,0.31,42,19],[213.952,0.16,39,52],[213.952,0.14,51,32],[214.055,0.13,74,34],[214.544,0.27,48,39],[214.544,0.03,83,14],[214.544,0.03,99,21],[214.544,0.055,50,56],[214.564,0.31,42,19],[214.604,0.16,39,52],[214.604,0.14,51,32],[215.196,0.13,56,25],[215.196,0.27,48,39],[215.196,0.03,83,14],[215.196,0.03,99,21],[215.196,0.055,50,56],[215.216,0.31,42,19],[215.256,0.16,39,52],[215.256,0.14,51,32],[215.359,0.13,58,25],[215.848,0.27,48,39],[215.848,0.03,83,14],[215.848,0.03,99,21],[215.848,0.055,50,56],[215.868,0.31,42,19],[215.908,0.16,39,52],[215.908,0.14,51,32],[216.501,0.13,67,25],[216.501,0.27,48,39],[216.501,0.03,83,14],[216.501,0.03,99,21],[216.501,0.055,50,56],[216.521,0.31,42,19],[216.561,0.16,39,52],[216.561,0.14,51,32],[216.664,0.13,65,25],[216.827,0.13,76,34],[216.99,0.13,77,34],[217.153,0.27,48,39],[217.153,0.03,83,14],[217.153,0.03,99,21],[217.153,0.055,50,56],[217.173,0.31,42,19],[217.213,0.16,39,52],[217.213,0.14,51,32],[217.805,0.27,48,39],[217.805,0.03,83,14],[217.805,0.03,99,21],[217.805,0.055,50,56],[217.825,0.31,42,19],[217.865,0.16,39,52],[217.865,0.14,51,32],[218.131,0.13,60,35],[218.294,0.13,62,35],[218.457,0.114,65,53],[218.457,0.03,99,21],[218.457,0.055,50,56],[218.517,0.16,39,52],[218.517,0.14,51,32],[219.109,0.03,99,21],[219.109,0.055,50,56],[219.15,0.114,70,53],[219.169,0.16,39,52],[219.169,0.14,51,32],[219.598,0.114,75,53],[219.761,0.03,99,21],[219.761,0.055,50,56],[219.821,0.16,39,52],[219.821,0.14,51,32],[220.022,0.391,77,59],[220.414,0.5,102,108],[220.414,0.03,99,21],[220.414,0.055,50,56],[220.474,0.16,39,52],[220.474,0.14,51,32],[221.066,0.03,99,21],[221.066,0.055,50,56],[221.126,0.16,39,52],[221.126,0.14,51,32],[221.718,0.03,99,21],[221.718,0.055,50,56],[221.778,0.16,39,52],[221.778,0.14,51,32],[222.37,0.03,99,21],[222.37,0.055,50,56],[222.43,0.16,39,52],[222.43,0.14,51,32],[222.614,0.27,48,39],[222.614,0.03,83,14],[222.614,0.03,99,21],[222.614,0.055,50,56],[222.634,0.31,42,19],[222.674,0.16,39,52],[222.674,0.14,51,32],[223.328,0.27,48,39],[223.328,0.03,83,14],[223.328,0.03,99,21],[223.328,0.055,50,56],[223.348,0.31,42,19],[223.388,0.16,39,52],[223.388,0.14,51,32],[223.685,0.143,63,35],[223.864,0.143,62,35],[224.042,0.143,76,47],[224.042,0.27,48,39],[224.042,0.03,83,14],[224.042,0.03,99,21],[224.042,0.055,50,56],[224.062,0.31,42,19],[224.102,0.16,39,52],[224.102,0.14,51,32],[224.221,0.143,74,47],[224.756,0.27,48,39],[224.756,0.03,83,14],[224.757,0.03,99,21],[224.757,0.055,50,56],[224.776,0.31,42,19],[224.817,0.16,39,52],[224.817,0.14,51,32],[225.471,0.143,63,43],[225.471,0.143,65,57],[225.471,0.27,48,39],[225.471,0.03,83,14],[225.471,0.03,99,21],[225.471,0.055,50,56],[225.491,0.31,42,19],[225.531,0.16,39,52],[225.531,0.14,51,32],[225.649,0.143,65,43],[225.649,0.143,67,57],[226.185,0.27,48,39],[226.185,0.03,83,14],[226.185,0.03,99,21],[226.185,0.055,50,56],[226.205,0.31,42,19],[226.245,0.16,39,52],[226.245,0.14,51,32],[226.899,0.143,60,43],[226.899,0.27,48,39],[226.899,0.03,83,14],[226.899,0.03,99,21],[226.899,0.055,50,56],[226.919,0.31,42,19],[226.959,0.16,39,52],[226.959,0.14,51,32],[227.078,0.143,58,43],[227.256,0.143,72,57],[227.435,0.143,70,57],[227.614,0.27,48,39],[227.614,0.03,83,14],[227.614,0.03,99,21],[227.614,0.055,50,56],[227.634,0.31,42,19],[227.674,0.16,39,52],[227.674,0.14,51,32],[228.328,0.27,48,39],[228.328,0.03,83,14],[228.328,0.03,99,21],[228.328,0.055,50,56],[228.348,0.31,42,19],[228.388,0.16,39,52],[228.388,0.14,51,32],[228.654,0.13,69,57],[228.817,0.13,70,57],[228.98,0.27,48,39],[228.98,0.03,83,14],[228.98,0.03,99,21],[228.98,0.055,50,56],[229,0.31,42,19],[229.04,0.16,39,52],[229.04,0.14,51,32],[229.632,0.27,48,39],[229.632,0.03,83,14],[229.632,0.03,99,21],[229.632,0.055,50,56],[229.652,0.31,42,19],[229.692,0.16,39,52],[229.692,0.14,51,32],[229.958,0.13,56,43],[230.121,0.13,55,43],[230.284,0.03,99,21],[230.284,0.055,50,56],[230.285,0.13,69,57],[230.285,0.27,48,39],[230.285,0.03,83,14],[230.304,0.31,42,19],[230.344,0.16,39,52],[230.344,0.14,51,32],[230.447,0.13,67,57],[230.937,0.27,48,39],[230.937,0.03,83,14],[230.937,0.03,99,21],[230.937,0.055,50,56],[230.957,0.31,42,19],[230.997,0.16,39,52],[230.997,0.14,51,32],[231.589,0.13,72,67],[231.589,0.27,48,39],[231.589,0.03,83,14],[231.589,0.03,99,21],[231.589,0.055,50,56],[231.609,0.31,42,19],[231.649,0.16,39,52],[231.649,0.14,51,32],[231.752,0.13,74,67],[232.241,0.27,48,39],[232.241,0.03,83,14],[232.241,0.03,99,21],[232.241,0.055,50,56],[232.261,0.31,42,19],[232.301,0.16,39,52],[232.301,0.14,51,32],[232.893,0.13,56,50],[232.893,0.27,48,39],[232.893,0.03,83,14],[232.893,0.03,99,21],[232.893,0.055,50,56],[232.913,0.31,42,19],[232.953,0.16,39,52],[232.953,0.14,51,32],[233.056,0.13,58,50],[233.545,0.27,48,39],[233.545,0.03,83,14],[233.545,0.03,99,21],[233.545,0.055,50,56],[233.565,0.31,42,19],[233.605,0.16,39,52],[233.605,0.14,51,32],[234.145,0.12,67,50],[234.145,0.27,48,39],[234.145,0.03,83,14],[234.145,0.03,99,21],[234.145,0.055,50,56],[234.165,0.31,42,19],[234.205,0.16,39,52],[234.205,0.14,51,32],[234.295,0.12,65,50],[234.445,0.12,76,67],[234.595,0.12,77,67],[234.745,0.27,48,39],[234.745,0.03,83,14],[234.745,0.03,99,21],[234.745,0.055,50,56],[234.765,0.31,42,19],[234.805,0.16,39,52],[234.805,0.14,51,32],[235.345,0.27,48,39],[235.345,0.03,83,14],[235.345,0.03,99,21],[235.345,0.055,50,56],[235.365,0.31,42,19],[235.405,0.16,39,52],[235.405,0.14,51,32],[235.645,0.12,60,31],[235.795,0.12,62,31],[235.945,0.27,48,39],[235.945,0.03,83,14],[235.945,0.03,99,21],[235.945,0.055,50,56],[235.965,0.31,42,19],[236.005,0.16,39,52],[236.005,0.14,51,32],[236.545,0.27,48,39],[236.545,0.03,83,14],[236.545,0.03,99,21],[236.545,0.055,50,56],[236.565,0.31,42,19],[236.605,0.16,39,52],[236.605,0.14,51,32],[236.845,0.12,63,31],[236.995,0.12,62,31],[237.145,0.12,76,42],[237.145,0.27,48,39],[237.145,0.03,83,14],[237.145,0.03,99,21],[237.145,0.055,50,56],[237.165,0.31,42,19],[237.205,0.16,39,52],[237.205,0.14,51,32],[237.295,0.12,74,42],[237.745,0.27,48,39],[237.745,0.03,83,14],[237.745,0.03,99,21],[237.745,0.055,50,56],[237.765,0.31,42,19],[237.805,0.16,39,52],[237.805,0.14,51,32],[238.345,0.12,63,31],[238.345,0.105,65,47],[238.345,0.03,99,21],[238.345,0.055,50,56],[238.405,0.16,39,52],[238.405,0.14,51,32],[238.495,0.12,65,31],[238.945,0.03,99,21],[238.945,0.055,50,56],[238.983,0.105,70,47],[239.005,0.16,39,52],[239.005,0.14,51,32],[239.395,0.105,75,47],[239.545,0.03,99,21],[239.545,0.055,50,56],[239.605,0.16,39,52],[239.605,0.14,51,32],[239.785,0.36,77,52],[240.145,0.5,102,108],[240.145,0.03,99,21],[240.145,0.055,50,56],[240.205,0.16,39,52],[240.205,0.14,51,32],[240.745,0.03,99,21],[240.745,0.055,50,56],[240.805,0.16,39,52],[240.805,0.14,51,32],[241.345,0.03,99,21],[241.345,0.055,50,56],[241.405,0.16,39,52],[241.405,0.14,51,32],[241.945,0.03,99,21],[241.945,0.055,50,56],[242.005,0.16,39,52],[242.005,0.14,51,32],[242.145,0.65,60,16],[242.545,0.03,99,21],[242.545,0.055,50,56],[242.605,0.16,39,52],[242.605,0.14,51,32],[243.145,0.04,99,43],[243.145,0.03,99,16],[243.145,0.055,50,44],[243.205,0.16,39,41],[243.205,0.14,51,24],[243.86,0.16,48,49],[243.86,0.03,99,22],[244.574,0.03,99,16],[244.574,0.055,50,44],[244.634,0.16,39,41],[244.634,0.14,51,24],[245.145,1.5,60,33],[245.288,0.16,48,49],[245.288,0.03,99,22],[246.002,0.03,99,16],[246.002,0.055,50,44],[246.062,0.16,39,41],[246.062,0.14,51,24],[247.431,0.03,99,16],[247.431,0.055,50,44],[247.491,0.16,39,41],[247.491,0.14,51,24],[248.86,0.03,99,16],[248.86,0.055,50,44],[248.92,0.16,39,41],[248.92,0.14,51,24],[250.288,0.03,99,16],[250.288,0.055,50,44],[250.348,0.16,39,41],[250.348,0.14,51,24],[251.717,0.03,99,16],[251.717,0.055,50,44],[251.777,0.16,39,41],[251.777,0.14,51,24],[253.145,0.03,99,16],[253.145,0.055,50,44],[253.205,0.16,39,41],[253.205,0.14,51,24],[254.574,0.03,99,16],[254.574,0.055,50,44],[254.634,0.16,39,41],[254.634,0.14,51,24],[256.002,0.03,99,16],[256.002,0.055,50,44],[256.062,0.16,39,41],[256.062,0.14,51,24],[257.431,0.04,99,43],[257.431,0.03,99,16],[257.431,0.055,50,44],[257.491,0.16,39,41],[257.491,0.14,51,24],[258.145,0.16,43,49],[258.145,0.03,99,22],[258.86,0.03,99,16],[258.86,0.055,50,44],[258.92,0.16,39,41],[258.92,0.14,51,24],[259.574,0.16,43,49],[259.574,0.03,99,22],[260.288,0.03,99,16],[260.288,0.055,50,44],[260.348,0.16,39,41],[260.348,0.14,51,24],[261.717,0.03,99,16],[261.717,0.055,50,44],[261.777,0.16,39,41],[261.777,0.14,51,24],[263.145,0.03,99,16],[263.145,0.055,50,44],[263.205,0.16,39,41],[263.205,0.14,51,24],[264.574,0.03,99,16],[264.574,0.055,50,44],[264.634,0.16,39,41],[264.634,0.14,51,24],[266.002,0.25,59,40],[266.002,0.03,99,16],[266.002,0.055,50,44],[266.062,0.16,39,41],[266.062,0.14,51,24],[267.431,0.03,99,16],[267.431,0.055,50,44],[267.491,0.16,39,41],[267.491,0.14,51,24],[267.788,0.25,69,49],[268.86,0.03,99,16],[268.86,0.055,50,44],[268.92,0.16,39,41],[268.92,0.14,51,24],[270.288,0.03,99,16],[270.288,0.055,50,44],[270.348,0.16,39,41],[270.348,0.14,51,24],[271.717,0.04,99,43],[271.717,0.03,99,16],[271.717,0.055,50,44],[271.777,0.16,39,41],[271.777,0.14,51,24],[272.431,0.16,48,49],[272.431,0.03,99,22],[273.145,0.03,99,16],[273.145,0.055,50,44],[273.205,0.16,39,41],[273.205,0.14,51,24],[273.86,0.16,48,49],[273.86,0.03,99,22],[274.574,0.03,99,16],[274.574,0.055,50,44],[274.634,0.16,39,41],[274.634,0.14,51,24],[276.002,0.03,99,16],[276.002,0.055,50,44],[276.062,0.16,39,41],[276.062,0.14,51,24],[277.431,1.429,60,42],[277.431,0.03,99,16],[277.431,0.055,50,44],[277.491,0.16,39,41],[277.491,0.14,51,24],[278.86,0.03,99,16],[278.86,0.055,50,44],[278.92,0.16,39,41],[278.92,0.14,51,24],[280.288,0.03,99,16],[280.288,0.055,50,44],[280.348,0.16,39,41],[280.348,0.14,51,24],[281.717,0.03,99,16],[281.717,0.055,50,44],[281.777,0.16,39,41],[281.777,0.14,51,24],[283.145,0.03,99,16],[283.145,0.055,50,44],[283.205,0.16,39,41],[283.205,0.14,51,24],[284.574,0.03,99,16],[284.574,0.055,50,44],[284.634,0.16,39,41],[284.634,0.14,51,24],[286.002,0.04,99,43],[286.002,0.03,99,16],[286.002,0.055,50,44],[286.062,0.16,39,41],[286.062,0.14,51,24],[286.36,0.16,43,49],[286.36,0.03,99,22],[287.074,0.16,43,49],[287.074,0.03,99,22],[287.431,0.03,99,16],[287.431,0.055,50,44],[287.491,0.16,39,41],[287.491,0.14,51,24],[287.788,0.16,43,49],[287.788,0.03,99,22],[288.502,0.16,43,49],[288.502,0.03,99,22],[288.86,0.03,99,16],[288.86,0.055,50,44],[288.92,0.16,39,41],[288.92,0.14,51,24],[290.288,0.03,99,16],[290.288,0.055,50,44],[290.348,0.16,39,41],[290.348,0.14,51,24],[291.717,0.03,99,16],[291.717,0.055,50,44],[291.777,0.16,39,41],[291.777,0.14,51,24],[293.145,0.03,99,16],[293.145,0.055,50,44],[293.205,0.16,39,41],[293.205,0.14,51,24],[294.574,0.03,99,16],[294.574,0.055,50,44],[294.634,0.16,39,41],[294.634,0.14,51,24],[296.002,0.03,99,16],[296.002,0.055,50,44],[296.062,0.16,39,41],[296.062,0.14,51,24],[297.431,0.03,99,16],[297.431,0.055,50,44],[297.491,0.16,39,41],[297.491,0.14,51,24],[298.86,0.03,99,16],[298.86,0.055,50,44],[298.92,0.16,39,41],[298.92,0.14,51,24],[300.288,0.03,99,16],[300.288,0.055,50,44],[300.348,0.16,39,41],[300.348,0.14,51,24],[301.488,0.444,53,35],[301.488,0.03,99,20],[301.488,0.055,50,53],[301.488,6.333,65,17],[301.548,0.16,39,50],[301.548,0.14,51,30],[301.766,0.065,99,17],[302.044,0.065,99,17],[302.322,0.03,99,20],[302.322,0.055,50,53],[302.382,0.16,39,50],[302.382,0.14,51,30],[302.488,6,60,10],[302.877,0.444,72,35],[303.155,0.03,99,20],[303.155,0.055,50,53],[303.215,0.16,39,50],[303.215,0.14,51,30],[303.433,0.065,99,17],[303.71,0.065,99,17],[303.988,0.03,99,20],[303.988,0.055,50,53],[304.048,0.16,39,50],[304.048,0.14,51,30],[304.266,0.444,69,35],[304.822,0.03,99,20],[304.822,0.055,50,53],[304.882,0.16,39,50],[304.882,0.14,51,30],[305.099,0.065,99,17],[305.377,0.065,99,17],[305.655,0.444,70,35],[305.655,0.03,99,20],[305.655,0.055,50,53],[305.715,0.16,39,50],[305.715,0.14,51,30],[306.488,0.03,99,20],[306.488,0.055,50,53],[306.548,0.16,39,50],[306.548,0.14,51,30],[306.766,0.065,99,17],[307.044,0.444,67,35],[307.044,0.065,99,17],[307.322,0.03,99,20],[307.322,0.055,50,53],[307.382,0.16,39,50],[307.382,0.14,51,30],[308.155,0.03,99,20],[308.155,0.055,50,53],[308.155,6.333,65,8],[308.215,0.16,39,50],[308.215,0.14,51,30],[308.433,0.444,57,35],[308.433,0.065,99,17],[308.71,0.065,99,17],[308.988,0.03,99,20],[308.988,0.055,50,53],[309.048,0.16,39,50],[309.048,0.14,51,30],[309.822,0.444,50,35],[309.822,0.03,99,20],[309.822,0.055,50,53],[309.882,0.16,39,49],[309.882,0.14,51,30],[310.099,0.065,99,17],[310.377,0.065,99,17],[310.655,0.03,99,20],[310.655,0.055,50,52],[310.715,0.16,39,49],[310.715,0.14,51,30],[311.21,0.444,69,35],[311.488,0.03,99,20],[311.488,0.055,50,52],[311.548,0.16,39,49],[311.548,0.14,51,29],[311.766,0.065,99,16],[312.044,0.065,99,16],[312.322,0.444,70,10],[312.322,0.03,99,19],[312.322,0.055,50,52],[312.382,0.16,39,49],[312.382,0.14,51,29],[312.599,0.444,74,47],[313.155,0.03,99,19],[313.155,0.055,50,51],[313.215,0.16,39,48],[313.215,0.14,51,29],[313.433,0.065,99,16],[313.71,0.444,67,13],[313.71,0.065,99,16],[313.988,0.444,72,46],[313.988,0.03,99,19],[313.988,0.055,50,51],[314.048,0.16,39,47],[314.048,0.14,51,28],[314.822,0.03,99,19],[314.822,0.055,50,50],[314.822,6.333,72,16],[314.882,0.16,39,47],[314.882,0.14,51,28],[315.099,0.444,57,18],[315.099,0.065,99,15],[315.377,0.444,60,44],[315.377,0.065,99,15],[315.655,0.03,99,18],[315.655,0.055,50,48],[315.715,0.16,39,45],[315.715,0.14,51,27],[316.488,0.444,53,22],[316.488,0.03,99,18],[316.488,0.055,50,47],[316.548,0.16,39,44],[316.548,0.14,51,26],[316.766,0.444,57,42],[316.766,0.065,99,15],[317.044,0.065,99,14],[317.322,0.03,99,17],[317.322,0.055,50,45],[317.382,0.16,39,42],[317.382,0.14,51,25],[317.877,0.444,72,28],[318.155,0.444,58,39],[318.155,0.03,99,16],[318.155,0.055,50,43],[318.215,0.16,39,40],[318.215,0.14,51,24],[318.433,0.065,99,13],[318.71,0.065,99,13],[318.988,0.03,99,15],[318.988,0.055,50,40],[319.048,0.16,39,37],[319.048,0.14,51,22],[319.266,0.444,74,33],[319.544,0.444,77,34],[319.822,0.03,99,14],[319.822,0.055,50,36],[319.882,0.16,39,34],[319.882,0.14,51,20],[320.099,0.065,99,11],[320.377,0.065,99,11],[320.655,0.444,72,38],[320.655,0.03,99,12],[320.655,0.055,50,32],[320.715,0.16,39,30],[320.715,0.14,51,18],[320.933,0.444,76,28],[321.488,0.03,99,10],[321.488,0.055,50,28],[321.548,0.16,39,26],[321.548,0.14,51,16],[321.766,0.065,99,8],[322.044,0.444,60,43],[322.044,0.065,99,8],[322.322,0.444,65,21],[322.322,0.03,99,9],[322.322,0.055,50,23],[322.382,0.16,39,21],[322.382,0.14,51,13],[323.155,0.055,50,17],[323.215,0.16,39,16],[323.215,0.14,51,10],[323.433,0.444,53,28],[323.71,0.444,57,7],[323.988,0.055,50,11],[324.048,0.16,39,10],[324.822,0.444,58,29],[326.21,0.444,77,29],[327.322,0.444,72,9],[327.599,0.444,76,28],[328.155,6.333,69,9],[328.71,0.444,60,15],[328.988,0.444,65,24],[330.099,0.444,57,21],[330.377,0.444,60,20],[331.21,0.25,77,13],[331.488,0.444,58,26],[331.766,0.444,62,13],[332.322,0.75,77,23],[332.877,0.444,77,28],[334.266,0.444,76,26],[334.822,6.333,65,13],[335.655,0.444,65,25],[336.488,0.75,79,20],[336.766,0.444,53,13],[337.044,0.444,57,22],[337.599,0.065,99,10],[337.877,0.25,76,15],[337.877,0.065,99,11],[338.155,0.444,58,19],[338.433,0.444,62,18],[339.266,0.065,99,14],[339.544,0.444,77,23],[339.544,0.065,99,15],[339.822,0.444,60,11],[339.822,0.5,77,9],[340.933,0.444,76,26],[340.933,0.5,76,21],[340.933,0.065,99,16],[341.21,0.065,99,16],[341.488,6.333,72,8],[342.322,0.444,65,26],[342.599,0.065,99,17],[342.877,0.065,99,16],[343.71,0.444,60,18],[344.266,0.065,99,15],[344.544,0.065,99,15],[344.822,0.444,58,9],[344.822,0.75,64,11],[345.099,0.444,62,16],[345.933,0.065,99,12],[346.21,0.444,77,13],[346.21,0.065,99,12],[346.488,0.444,60,12],[346.488,0.5,67,10],[347.599,0.444,76,16],[347.599,0.065,99,9],[347.877,0.444,79,9],[347.877,0.065,99,8],[348.155,6.333,69,28],[348.988,0.444,65,18],[350.377,0.444,57,19],[350.655,0.5,65,13],[351.766,0.444,62,18],[352.322,0.055,50,12],[352.382,0.16,39,11],[353.155,0.444,60,18],[353.155,0.055,50,18],[353.215,0.16,39,17],[353.215,0.14,51,10],[353.71,0.5,67,12],[353.988,0.03,99,9],[353.988,0.055,50,23],[354.048,0.16,39,22],[354.048,0.14,51,13],[354.266,0.444,76,7],[354.544,0.444,79,13],[354.822,0.03,99,11],[354.822,0.055,50,28],[354.822,6.333,69,10],[354.882,0.16,39,27],[354.882,0.14,51,16],[355.099,0.065,99,9],[355.377,0.065,99,10],[355.655,0.444,65,10],[355.655,0.03,99,12],[355.655,0.055,50,33],[355.715,0.16,39,31],[355.715,0.14,51,19],[355.933,0.444,69,12],[356.488,0.03,99,14],[356.488,0.055,50,36],[356.548,0.16,39,34],[356.548,0.14,51,21],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,12],[357.322,0.444,65,10],[357.322,0.03,99,15],[357.322,0.055,50,40],[357.382,0.16,39,38],[357.382,0.14,51,23],[358.155,0.03,99,16],[358.155,0.055,50,43],[358.215,0.16,39,40],[358.215,0.14,51,24],[358.433,0.444,62,13],[358.433,0.065,99,14],[358.71,0.444,65,9],[358.71,0.065,99,14],[358.988,0.03,99,17],[358.988,0.055,50,45],[359.048,0.16,39,42],[359.048,0.14,51,25],[359.822,0.444,60,14],[359.822,0.03,99,18],[359.822,0.055,50,47],[359.882,0.16,39,44],[359.882,0.14,51,26],[360.099,0.065,99,15],[360.377,0.065,99,15],[360.655,0.03,99,18],[360.655,0.055,50,48],[360.715,0.16,39,46],[360.715,0.14,51,27],[361.21,0.444,79,14],[361.488,0.03,99,19],[361.488,0.055,50,50],[361.548,0.16,39,47],[361.548,0.14,51,28],[361.766,0.065,99,16],[362.044,0.065,99,16],[362.322,0.03,99,19],[362.322,0.055,50,51],[362.382,0.16,39,48],[362.382,0.14,51,29],[362.599,0.444,69,15],[363.155,0.03,99,19],[363.155,0.055,50,51],[363.215,0.16,39,48],[363.215,0.14,51,29],[363.433,0.065,99,16],[363.71,0.065,99,16],[363.988,0.444,62,13],[363.988,0.03,99,19],[363.988,0.055,50,52],[364.048,0.16,39,49],[364.048,0.14,51,29],[364.822,0.03,99,20],[364.822,0.055,50,52],[364.882,0.16,39,49],[364.882,0.14,51,29],[365.099,0.065,99,16],[365.377,0.444,65,23],[365.377,0.065,99,16],[365.655,0.03,99,20],[365.655,0.055,50,53],[365.715,0.16,39,49],[365.715,0.14,51,30],[366.488,0.03,99,20],[366.488,0.055,50,53],[366.548,0.16,39,49],[366.548,0.14,51,30],[366.766,0.444,64,19],[366.766,0.065,99,17],[367.044,0.065,99,17],[367.322,0.03,99,20],[367.322,0.055,50,53],[367.382,0.16,39,50],[367.382,0.14,51,30],[368.155,0.444,53,16],[368.155,0.03,99,20],[368.155,0.055,50,53],[368.215,0.16,39,50],[368.215,0.14,51,30],[368.433,0.065,99,17],[368.71,0.065,99,17],[368.988,0.03,99,20],[368.988,0.055,50,53],[369.048,0.16,39,50],[369.048,0.14,51,30],[369.544,0.444,72,16],[369.822,0.03,99,20],[369.822,0.055,50,53],[369.882,0.16,39,50],[369.882,0.14,51,30],[370.099,0.065,99,17],[370.377,0.065,99,17],[370.655,0.03,99,20],[370.655,0.055,50,53],[370.715,0.16,39,50],[370.715,0.14,51,30],[370.933,0.444,69,12],[371.488,0.03,99,20],[371.488,0.055,50,53],[371.548,0.16,39,50],[371.548,0.14,51,30],[371.766,0.065,99,17],[372.044,0.065,99,17],[372.322,0.444,70,8],[372.322,0.03,99,20],[372.322,0.055,50,53],[372.382,0.16,39,50],[372.382,0.14,51,30],[373.155,0.03,99,20],[373.155,0.055,50,53],[373.215,0.16,39,50],[373.215,0.14,51,30],[373.433,0.065,99,17],[373.71,0.065,99,17],[373.988,0.03,99,20],[373.988,0.055,50,53],[374.048,0.16,39,50],[374.048,0.14,51,30],[374.822,0.03,99,20],[374.822,0.055,50,53],[374.882,0.16,39,50],[374.882,0.14,51,30],[375.099,0.065,99,17],[375.377,0.065,99,17],[375.655,0.03,99,20],[375.655,0.055,50,53],[375.715,0.16,39,50],[375.715,0.14,51,30],[375.822,0.27,48,39],[375.822,0.03,83,14],[375.822,0.03,99,19],[375.822,0.055,50,50],[375.822,4.071,67,8],[375.841,0.31,42,19],[375.882,0.16,39,47],[375.882,0.14,51,28],[376.25,0.321,64,25],[376.893,0.27,48,39],[376.893,0.03,83,14],[376.893,0.03,99,19],[376.893,0.055,50,50],[376.913,0.31,42,19],[376.953,0.16,39,47],[376.953,0.14,51,28],[377.295,0.7,64,12],[377.964,0.321,60,27],[377.964,0.27,48,41],[377.964,0.03,83,14],[377.964,0.03,99,19],[377.964,0.055,50,50],[377.984,0.31,42,21],[378.024,0.16,39,47],[378.024,0.14,51,28],[379.036,0.27,48,41],[379.036,0.03,83,14],[379.036,0.03,99,19],[379.036,0.055,50,50],[379.056,0.31,42,21],[379.096,0.16,39,47],[379.096,0.14,51,28],[379.822,0.321,67,27],[380.107,0.27,48,44],[380.107,0.03,83,15],[380.107,0.03,99,19],[380.107,0.055,50,50],[380.107,4.071,64,10],[380.127,0.31,42,22],[380.167,0.16,39,47],[380.167,0.14,51,28],[381.179,0.27,48,44],[381.179,0.03,83,15],[381.179,0.03,99,19],[381.179,0.055,50,50],[381.199,0.31,42,22],[381.239,0.16,39,47],[381.239,0.14,51,28],[381.607,0.321,60,28],[382.25,0.27,48,46],[382.25,0.03,83,16],[382.25,0.03,99,19],[382.25,0.055,50,50],[382.27,0.31,42,23],[382.31,0.16,39,47],[382.31,0.14,51,28],[383.054,0.7,62,13],[383.322,0.321,57,30],[383.322,0.27,48,46],[383.322,0.03,83,16],[383.322,0.03,99,19],[383.322,0.055,50,50],[383.341,0.31,42,23],[383.382,0.16,39,47],[383.382,0.14,51,28],[384.393,0.27,48,48],[384.393,0.03,83,17],[384.393,0.03,99,19],[384.393,0.055,50,50],[384.393,4.071,60,18],[384.413,0.31,42,24],[384.453,0.16,39,47],[384.453,0.14,51,28],[384.795,0.7,60,28],[385.179,0.321,60,31],[385.464,0.27,48,48],[385.464,0.03,83,17],[385.464,0.03,99,19],[385.464,0.055,50,50],[385.484,0.31,42,24],[385.524,0.16,39,47],[385.524,0.14,51,28],[386.536,0.27,48,51],[386.536,0.03,83,18],[386.536,0.03,99,19],[386.536,0.055,50,50],[386.556,0.31,42,25],[386.596,0.16,39,47],[386.596,0.14,51,28],[386.804,0.204,60,28],[386.964,0.321,57,51],[387.607,0.27,48,51],[387.607,0.03,83,18],[387.607,0.03,99,19],[387.607,0.055,50,50],[387.627,0.31,42,25],[387.667,0.16,39,47],[387.667,0.14,51,28],[388.679,0.321,55,53],[388.679,0.27,48,53],[388.679,0.03,83,19],[388.679,0.03,99,19],[388.679,0.055,50,50],[388.679,4.071,62,10],[388.699,0.31,42,26],[388.739,0.16,39,47],[388.739,0.14,51,28],[389.75,0.27,48,53],[389.75,0.03,83,19],[389.75,0.03,99,19],[389.75,0.055,50,50],[389.77,0.31,42,26],[389.81,0.16,39,47],[389.81,0.14,51,28],[390.536,0.321,62,53],[390.554,0.7,71,45],[390.822,0.27,48,49],[390.822,0.03,83,17],[390.822,0.03,99,19],[390.822,0.055,50,50],[390.841,0.31,42,24],[390.882,0.16,39,47],[390.882,0.14,51,28],[391.223,0.7,64,86],[391.893,0.161,60,34],[391.893,0.03,99,19],[391.893,0.055,50,50],[391.953,0.16,39,47],[391.953,0.14,51,28],[392.964,0.27,48,41],[392.964,0.03,83,14],[392.964,0.03,99,19],[392.964,0.055,50,50],[392.964,3.931,64,31],[392.984,0.31,42,21],[393.024,0.16,39,47],[393.024,0.14,51,28],[393.223,0.197,79,23],[393.378,0.31,76,41],[393.999,0.27,48,41],[393.999,0.03,83,14],[393.999,0.03,99,19],[393.999,0.055,50,50],[394.019,0.31,42,21],[394.059,0.16,39,47],[394.059,0.14,51,28],[394.775,0.035,117,9],[395.033,0.31,72,55],[395.033,0.27,48,43],[395.033,0.03,83,15],[395.033,0.03,99,19],[395.033,0.055,50,50],[395.053,0.31,42,22],[395.093,0.16,39,47],[395.093,0.14,51,28],[395.292,0.035,117,12],[396.068,0.27,48,43],[396.068,0.03,83,15],[396.068,0.03,99,19],[396.068,0.055,50,50],[396.088,0.31,42,22],[396.128,0.16,39,47],[396.128,0.14,51,28],[396.827,0.31,79,55],[397.102,0.27,48,46],[397.102,0.03,83,16],[397.102,0.03,99,19],[397.102,0.055,50,50],[397.102,3.931,60,53],[397.122,0.31,42,23],[397.162,0.16,39,47],[397.162,0.14,51,28],[397.878,0.7,76,40],[398.137,0.197,72,32],[398.137,0.27,48,46],[398.137,0.03,83,16],[398.137,0.03,99,19],[398.137,0.055,50,50],[398.157,0.31,42,23],[398.197,0.16,39,47],[398.197,0.14,51,28],[398.525,0.7,79,33],[398.551,0.31,72,58],[399.171,0.27,48,48],[399.171,0.03,83,17],[399.171,0.03,99,19],[399.171,0.055,50,50],[399.191,0.31,42,24],[399.231,0.16,39,47],[399.231,0.14,51,28],[399.947,0.035,117,13],[400.206,0.31,69,61],[400.206,0.27,48,48],[400.206,0.03,83,17],[400.206,0.03,99,19],[400.206,0.055,50,50],[400.226,0.31,42,24],[400.266,0.16,39,47],[400.266,0.14,51,28],[400.464,0.035,117,12],[401.24,0.27,48,51],[401.24,0.03,83,18],[401.24,0.03,99,19],[401.24,0.055,50,50],[401.24,3.931,57,27],[401.26,0.31,42,25],[401.3,0.16,39,47],[401.3,0.14,51,28],[401.999,0.31,72,64],[402.275,0.27,48,51],[402.275,0.03,83,18],[402.275,0.03,99,19],[402.275,0.055,50,50],[402.295,0.31,42,25],[402.335,0.16,39,47],[402.335,0.14,51,28],[403.051,0.197,65,37],[403.309,0.27,48,53],[403.309,0.03,83,19],[403.309,0.03,99,19],[403.309,0.055,50,50],[403.329,0.31,42,27],[403.369,0.16,39,47],[403.369,0.14,51,28],[403.568,0.197,72,38],[403.723,0.31,69,68],[404.085,0.7,77,19],[404.344,0.27,48,53],[404.344,0.03,83,19],[404.344,0.03,99,19],[404.344,0.055,50,50],[404.364,0.31,42,27],[404.404,0.16,39,47],[404.404,0.14,51,28],[404.602,0.035,117,9],[405.12,0.035,117,15],[405.378,0.31,67,72],[405.378,0.27,48,56],[405.378,0.03,83,19],[405.378,0.03,99,19],[405.378,0.055,50,50],[405.378,3.931,59,23],[405.398,0.31,42,28],[405.438,0.16,39,47],[405.438,0.14,51,28],[405.637,0.035,117,11],[405.766,0.7,74,32],[406.413,0.27,48,56],[406.413,0.03,83,19],[406.413,0.03,99,19],[406.413,0.055,50,50],[406.433,0.31,42,28],[406.473,0.16,39,47],[406.473,0.14,51,28],[407.171,0.31,74,72],[407.447,0.27,48,52],[407.447,0.03,83,18],[407.447,0.03,99,19],[407.447,0.055,50,50],[407.467,0.31,42,26],[407.507,0.16,39,47],[407.507,0.14,51,28],[408.482,0.155,60,46],[408.482,0.03,99,19],[408.482,0.055,50,50],[408.542,0.16,39,47],[408.542,0.14,51,28],[409.516,0.27,48,43],[409.516,0.03,83,15],[409.516,0.03,99,19],[409.516,0.055,50,50],[409.536,0.31,42,22],[409.576,0.16,39,47],[409.576,0.14,51,28],[409.766,0.19,91,27],[409.766,0.035,117,10],[409.916,0.3,88,48],[410.266,0.035,117,12],[410.516,0.27,48,43],[410.516,0.03,83,15],[410.516,0.03,99,19],[410.516,0.055,50,50],[410.536,0.31,42,22],[410.576,0.16,39,47],[410.576,0.14,51,28],[411.266,0.7,88,11],[411.516,0.3,84,61],[411.516,0.27,48,46],[411.516,0.03,83,16],[411.516,0.03,99,19],[411.516,0.055,50,50],[411.536,0.31,42,23],[411.576,0.16,39,47],[411.576,0.14,51,28],[411.891,0.7,88,21],[412.516,0.27,48,46],[412.516,0.03,83,16],[412.516,0.03,99,19],[412.516,0.055,50,50],[412.536,0.31,42,23],[412.576,0.16,39,47],[412.576,0.14,51,28],[413.249,0.3,91,61],[413.516,0.27,48,48],[413.516,0.03,83,17],[413.516,0.03,99,19],[413.516,0.055,50,50],[413.516,3.8,57,40],[413.536,0.31,42,24],[413.576,0.16,39,47],[413.576,0.14,51,28],[414.516,0.19,84,36],[414.516,0.27,48,48],[414.516,0.03,83,17],[414.516,0.03,99,19],[414.516,0.055,50,50],[414.536,0.31,42,24],[414.576,0.16,39,47],[414.576,0.14,51,28],[414.766,0.035,117,11],[414.916,0.3,84,64],[415.266,0.035,117,13],[415.516,0.27,48,51],[415.516,0.03,83,18],[415.516,0.03,99,19],[415.516,0.055,50,50],[415.536,0.31,42,25],[415.576,0.16,39,47],[415.576,0.14,51,28],[415.766,0.035,117,8],[416.516,0.3,81,67],[416.516,0.27,48,51],[416.516,0.03,83,18],[416.516,0.03,99,19],[416.516,0.055,50,50],[416.536,0.31,42,25],[416.576,0.16,39,47],[416.576,0.14,51,28],[417.516,0.27,48,54],[417.516,0.03,83,19],[417.516,0.03,99,19],[417.516,0.055,50,50],[417.516,3.8,53,63],[417.536,0.31,42,27],[417.576,0.16,39,47],[417.576,0.14,51,28],[418.249,0.3,84,71],[418.266,0.7,84,40],[418.516,0.27,48,54],[418.516,0.03,83,19],[418.516,0.03,99,19],[418.516,0.055,50,50],[418.536,0.31,42,27],[418.576,0.16,39,47],[418.576,0.14,51,28],[418.891,0.7,91,75],[419.266,0.19,77,45],[419.516,0.27,48,56],[419.516,0.03,83,20],[419.516,0.03,99,19],[419.516,0.055,50,50],[419.536,0.31,42,28],[419.576,0.16,39,47],[419.576,0.14,51,28],[419.766,0.19,84,47],[419.766,0.035,117,13],[419.916,0.3,81,84],[420.266,0.035,117,15],[420.516,0.27,48,56],[420.516,0.03,83,20],[420.516,0.03,99,19],[420.516,0.055,50,50],[420.536,0.31,42,28],[420.576,0.16,39,47],[420.576,0.14,51,28],[420.766,0.035,117,9],[421.516,0.3,79,88],[421.516,0.27,48,59],[421.516,0.03,83,21],[421.516,0.03,99,19],[421.516,0.055,50,50],[421.516,3.8,55,65],[421.536,0.31,42,29],[421.576,0.16,39,47],[421.576,0.14,51,28],[422.516,0.27,48,59],[422.516,0.03,83,21],[422.516,0.03,99,19],[422.516,0.055,50,50],[422.536,0.31,42,29],[422.576,0.16,39,47],[422.576,0.14,51,28],[423.249,0.3,86,88],[423.516,0.27,48,54],[423.516,0.03,83,19],[423.516,0.03,99,19],[423.516,0.055,50,50],[423.536,0.31,42,27],[423.576,0.16,39,47],[423.576,0.14,51,28],[423.696,0.4,100,13],[423.926,0.52,102,9],[424.266,0.7,88,39],[424.516,0.15,72,57],[424.516,0.03,99,19],[424.516,0.055,50,50],[424.576,0.16,39,47],[424.576,0.14,51,28],[425.516,0.27,48,43],[425.516,0.03,83,15],[425.516,0.03,99,19],[425.516,0.055,50,50],[425.516,3.677,60,37],[425.516,0.027,117,35],[425.536,0.31,42,22],[425.576,0.16,39,47],[425.576,0.14,51,28],[425.758,0.184,96,31],[425.758,0.045,117,38],[425.879,0.7,96,47],[425.903,0.29,100,55],[426,0.027,117,10],[426.484,0.27,48,43],[426.484,0.03,83,15],[426.484,0.03,99,19],[426.484,0.055,50,50],[426.504,0.31,42,22],[426.544,0.16,39,47],[426.544,0.14,51,28],[427.452,0.29,96,55],[427.452,0.27,48,46],[427.452,0.03,83,16],[427.452,0.03,99,19],[427.452,0.055,50,50],[427.472,0.31,42,23],[427.512,0.16,39,47],[427.512,0.14,51,28],[428.419,0.27,48,46],[428.419,0.03,83,16],[428.419,0.03,99,19],[428.419,0.055,50,50],[428.439,0.31,42,23],[428.479,0.16,39,47],[428.479,0.14,51,28],[429.129,0.29,103,55],[429.387,0.27,48,48],[429.387,0.03,83,17],[429.387,0.03,99,19],[429.387,0.055,50,50],[429.387,3.677,57,15],[429.387,3.677,64,8],[429.387,0.027,117,16],[429.407,0.31,42,24],[429.447,0.16,39,47],[429.447,0.14,51,28],[429.629,0.045,117,49],[429.871,0.027,117,41],[430.113,0.045,117,72],[430.355,0.184,96,32],[430.355,0.27,48,48],[430.355,0.03,83,17],[430.355,0.03,99,19],[430.355,0.055,50,50],[430.355,0.027,117,44],[430.375,0.31,42,24],[430.415,0.16,39,47],[430.415,0.14,51,28],[430.597,0.045,117,56],[430.742,0.29,96,58],[430.839,0.027,117,22],[431.081,0.045,117,9],[431.323,0.27,48,51],[431.323,0.03,83,18],[431.323,0.03,99,19],[431.323,0.055,50,50],[431.343,0.31,42,25],[431.383,0.16,39,47],[431.383,0.14,51,28],[431.685,0.7,98,43],[432.29,0.29,93,61],[432.29,0.27,48,51],[432.29,0.03,83,18],[432.29,0.03,99,19],[432.29,0.055,50,50],[432.31,0.31,42,25],[432.35,0.16,39,47],[432.35,0.14,51,28],[433.258,0.27,48,54],[433.258,0.03,83,19],[433.258,0.03,99,19],[433.258,0.055,50,50],[433.258,3.677,60,31],[433.278,0.31,42,27],[433.318,0.16,39,47],[433.318,0.14,51,28],[433.968,0.29,96,55],[434.226,0.27,48,54],[434.226,0.03,83,19],[434.226,0.03,99,19],[434.226,0.055,50,50],[434.246,0.31,42,27],[434.286,0.16,39,47],[434.286,0.14,51,28],[434.468,0.045,117,38],[434.71,0.027,117,39],[434.952,0.184,89,31],[434.952,0.045,117,76],[435.193,0.27,48,56],[435.193,0.03,83,20],[435.193,0.03,99,19],[435.193,0.055,50,50],[435.193,0.027,117,53],[435.214,0.31,42,28],[435.253,0.16,39,47],[435.253,0.14,51,28],[435.435,0.184,96,32],[435.435,0.045,117,76],[435.581,0.29,93,58],[435.677,0.027,117,36],[435.919,0.045,117,31],[436.161,0.27,48,56],[436.161,0.03,83,20],[436.161,0.03,99,19],[436.161,0.055,50,50],[436.181,0.31,42,28],[436.221,0.16,39,47],[436.221,0.14,51,28],[437.129,0.29,91,60],[437.129,0.27,48,59],[437.129,0.03,83,21],[437.129,0.03,99,19],[437.129,0.055,50,50],[437.129,3.677,62,50],[437.149,0.31,42,29],[437.189,0.16,39,47],[437.189,0.14,51,28],[438.097,0.27,48,59],[438.097,0.03,83,21],[438.097,0.03,99,19],[438.097,0.055,50,50],[438.117,0.31,42,29],[438.157,0.16,39,47],[438.157,0.14,51,28],[438.46,0.7,107,52],[438.806,0.29,98,60],[439.065,0.218,62,79],[439.065,0.27,48,54],[439.065,0.03,83,19],[439.065,0.03,99,19],[439.065,0.055,50,50],[439.084,0.31,42,27],[439.125,0.16,39,47],[439.125,0.14,51,28],[440.032,0.03,99,19],[440.032,0.055,50,50],[440.092,0.16,39,47],[440.092,0.14,51,28],[441,0.055,50,15],[441,3.8,66,10],[441.06,0.16,39,70],[441.06,0.14,51,42],[441.5,0.23,66,64],[441.75,0.23,69,67],[442,0.03,99,61],[442,0.055,50,164],[442,0.69,66,67],[442.06,0.16,39,154],[442.06,0.14,51,92],[443,0.03,99,65],[443,0.055,50,174],[443.06,0.16,39,163],[443.06,0.14,51,98],[444,0.03,99,65],[444,0.055,50,174],[444.06,0.16,39,163],[444.06,0.14,51,98],[445,0.3,59,33],[445,0.03,99,69],[445,0.055,50,184],[445,3.8,66,16],[445.06,0.16,39,172],[445.06,0.14,51,103],[445.733,0.3,66,33],[445.75,0.7,66,9],[446,0.03,99,69],[446,0.055,50,184],[446.06,0.16,39,172],[446.06,0.14,51,103],[446.4,0.3,62,33],[446.75,0.7,69,9],[447,0.3,59,34],[447,0.03,99,73],[447,0.055,50,194],[447.06,0.16,39,182],[447.06,0.14,51,109],[447.4,0.3,62,34],[447.75,0.7,64,9],[448,0.3,59,34],[448,0.03,99,73],[448,0.055,50,194],[448.06,0.16,39,182],[448.06,0.14,51,109],[448.733,0.3,66,34],[448.75,0.03,99,73],[448.75,0.055,50,194],[448.81,0.16,39,182],[448.81,0.14,51,109],[449,0.03,99,76],[449,0.055,50,203],[449,3.8,62,9],[449.06,0.16,39,191],[449.06,0.14,51,114],[449.375,0.7,62,18],[449.4,0.3,59,36],[450,0.03,99,76],[450,0.055,50,203],[450.06,0.16,39,191],[450.06,0.14,51,114],[451,0.03,99,80],[451,0.055,50,213],[451.06,0.16,39,200],[451.06,0.14,51,120],[452,0.03,99,80],[452,0.055,50,213],[452.06,0.16,39,200],[452.06,0.14,51,120],[453,0.03,99,84],[453,0.055,50,223],[453,3.8,61,15],[453,0.46,64,91],[453.06,0.16,39,209],[453.06,0.14,51,125],[453.5,0.23,66,91],[453.75,0.23,69,91],[454,0.03,99,84],[454,0.055,50,223],[454,0.69,73,91],[454.06,0.16,39,209],[454.06,0.14,51,125],[455,0.03,99,78],[455,0.055,50,207],[455.06,0.16,39,194],[455.06,0.14,51,116],[456,0.03,99,78],[456,0.055,50,207],[456.06,0.16,39,194],[456.06,0.14,51,116],[456.75,0.03,99,78],[456.75,0.055,50,207],[456.81,0.16,39,194],[456.81,0.14,51,116],[457,0.03,99,65],[457,0.055,50,173],[457,3.8,66,18],[457.06,0.16,39,162],[457.06,0.14,51,97],[457.733,0.3,69,31],[458,0.03,99,65],[458,0.055,50,173],[458.06,0.16,39,162],[458.06,0.14,51,97],[458.4,0.3,66,31],[458.75,0.7,66,8],[459,0.3,62,33],[459,0.03,99,69],[459,0.055,50,183],[459.06,0.16,39,172],[459.06,0.14,51,103],[459.733,0.3,69,33],[459.75,0.7,66,8],[460,0.3,62,33],[460,0.03,99,69],[460,0.055,50,183],[460.06,0.16,39,172],[460.06,0.14,51,103],[460.733,0.3,69,33],[461,0.03,99,73],[461,0.055,50,194],[461,3.8,62,21],[461.06,0.16,39,181],[461.06,0.14,51,109],[461.375,0.7,66,17],[461.4,0.3,62,34],[462,0.3,59,34],[462,0.03,99,73],[462,0.055,50,194],[462.06,0.16,39,181],[462.06,0.14,51,109],[462.375,0.7,69,17],[463,0.03,99,76],[463,0.055,50,204],[463.06,0.16,39,191],[463.06,0.14,51,115],[464,0.03,99,76],[464,0.055,50,204],[464.06,0.16,39,191],[464.06,0.14,51,115],[464.75,0.03,99,76],[464.75,0.055,50,204],[464.81,0.16,39,191],[464.81,0.14,51,115],[465,0.03,99,80],[465,0.055,50,214],[465,3.8,59,19],[465,0.46,62,87],[465.06,0.16,39,201],[465.06,0.14,51,121],[465.5,0.46,67,87],[466,0.03,99,80],[466,0.055,50,214],[466,0.23,69,87],[466.06,0.16,39,201],[466.06,0.14,51,121],[466.25,0.23,71,87],[466.5,0.46,69,87],[467,0.03,99,84],[467,0.055,50,225],[467,0.46,67,87],[467.06,0.16,39,211],[467.06,0.14,51,126],[468,0.03,99,84],[468,0.055,50,225],[468.06,0.16,39,211],[468.06,0.14,51,126],[469,0.03,99,88],[469,0.055,50,235],[469,3.8,61,10],[469.06,0.16,39,220],[469.06,0.14,51,132],[470,0.03,99,88],[470,0.055,50,235],[470.06,0.16,39,220],[470.06,0.14,51,132],[470.4,0.3,61,59],[470.75,0.7,73,16],[471,0.3,62,54],[471,0.03,99,82],[471,0.055,50,218],[471.06,0.16,39,204],[471.06,0.14,51,122],[471.25,0.276,54,45],[471.733,0.3,69,54],[471.75,0.7,66,16],[471.75,0.276,52,45],[472,0.03,99,82],[472,0.055,50,218],[472.06,0.16,39,204],[472.06,0.14,51,122],[472.25,0.552,50,45],[472.733,0.3,69,54],[472.75,0.03,99,82],[472.75,0.055,50,218],[472.81,0.16,39,204],[472.81,0.14,51,122],[473,0.03,99,65],[473,0.055,50,173],[473,3.738,62,12],[473.06,0.16,39,162],[473.06,0.14,51,97],[473.369,0.7,62,22],[473.393,0.295,66,43],[473.984,0.295,62,43],[473.984,0.03,99,65],[473.984,0.055,50,173],[474.044,0.16,39,162],[474.044,0.14,51,97],[474.229,0.045,117,7],[474.352,0.7,66,22],[474.475,0.027,117,20],[474.705,0.295,69,43],[474.721,0.045,117,50],[474.967,0.03,99,69],[474.967,0.055,50,183],[474.967,0.027,117,42],[475.027,0.16,39,172],[475.027,0.14,51,103],[475.213,0.045,117,68],[475.459,0.027,117,39],[475.705,0.045,117,45],[475.951,0.03,99,69],[475.951,0.055,50,183],[475.951,0.027,117,14],[476.011,0.16,39,172],[476.011,0.14,51,103],[476.934,0.03,99,73],[476.934,0.055,50,194],[476.934,3.738,59,20],[476.994,0.16,39,181],[476.994,0.14,51,109],[477.426,0.226,69,120],[477.672,0.226,71,120],[477.918,0.03,99,73],[477.918,0.055,50,194],[477.918,0.453,69,120],[477.978,0.16,39,181],[477.978,0.14,51,109],[478.41,0.453,66,120],[478.902,0.03,99,76],[478.902,0.055,50,204],[478.902,0.679,64,120],[478.962,0.16,39,191],[478.962,0.14,51,115],[479.393,0.027,117,18],[479.639,0.226,62,120],[479.639,0.045,117,53],[479.885,0.03,99,76],[479.885,0.055,50,204],[479.885,0.027,117,44],[479.945,0.16,39,191],[479.945,0.14,51,115],[480.131,0.045,117,76],[480.377,0.027,117,46],[480.623,0.03,99,76],[480.623,0.055,50,204],[480.623,0.045,117,57],[480.683,0.16,39,191],[480.683,0.14,51,115],[480.869,0.03,99,80],[480.869,0.055,50,214],[480.869,3.738,55,24],[480.869,0.027,117,22],[480.929,0.16,39,201],[480.929,0.14,51,121],[481.852,0.03,99,80],[481.852,0.055,50,214],[481.912,0.16,39,201],[481.912,0.14,51,121],[482.836,0.295,55,56],[482.836,0.03,99,84],[482.836,0.055,50,225],[482.896,0.16,39,211],[482.896,0.14,51,126],[483.557,0.295,62,56],[483.574,0.7,67,14],[483.82,0.03,99,84],[483.82,0.055,50,225],[483.88,0.16,39,211],[483.88,0.14,51,126],[484.213,0.295,59,56],[484.312,0.027,117,13],[484.557,0.045,117,50],[484.803,0.03,99,88],[484.803,0.055,50,235],[484.803,3.738,57,21],[484.803,0.027,117,47],[484.863,0.16,39,220],[484.863,0.14,51,132],[485.049,0.045,117,87],[485.172,0.7,64,29],[485.197,0.295,61,59],[485.295,0.027,117,54],[485.541,0.045,117,73],[485.787,0.295,57,59],[485.787,0.03,99,88],[485.787,0.055,50,235],[485.787,0.027,117,31],[485.847,0.16,39,220],[485.847,0.14,51,132],[486.033,0.045,117,17],[486.156,0.7,73,29],[486.508,0.295,64,59],[486.771,0.03,99,82],[486.771,0.055,50,218],[486.83,0.16,39,204],[486.83,0.14,51,122],[487.016,0.272,54,45],[487.139,0.7,66,29],[487.164,0.295,66,54],[487.754,0.03,99,82],[487.754,0.055,50,218],[487.814,0.16,39,204],[487.814,0.14,51,122],[488.492,0.03,99,82],[488.492,0.055,50,218],[488.552,0.16,39,204],[488.552,0.14,51,122],[488.738,0.03,99,68],[488.738,0.055,50,181],[488.738,3.677,62,8],[488.798,0.16,39,170],[488.798,0.14,51,102],[489.464,0.045,117,32],[489.705,0.03,99,68],[489.705,0.055,50,181],[489.705,0.027,117,33],[489.765,0.16,39,170],[489.765,0.14,51,102],[489.947,0.045,117,65],[490.189,0.027,117,43],[490.431,0.223,64,112],[490.431,0.045,117,59],[490.673,0.03,99,71],[490.673,0.055,50,190],[490.673,0.445,78,112],[490.673,0.027,117,26],[490.733,0.16,39,178],[490.733,0.14,51,107],[490.915,0.045,117,13],[491.157,0.445,76,109],[491.641,0.03,99,65],[491.641,0.055,50,173],[491.641,0.89,74,101],[491.701,0.16,39,160],[491.701,0.14,51,96],[492.609,0.29,59,43],[492.609,0.03,99,40],[492.609,0.055,50,106],[492.609,3.677,66,23],[492.669,0.16,39,92],[492.669,0.14,51,55],[493.318,0.29,66,51],[493.334,0.7,66,13],[493.334,0.045,117,26],[493.576,0.29,59,16],[493.576,0.203,47,21],[493.576,0.027,117,40],[493.818,0.045,117,76],[493.939,0.7,69,17],[493.964,0.29,62,37],[494.06,0.027,117,36],[494.286,0.29,66,47],[494.302,0.203,47,63],[494.302,0.045,117,12],[494.544,0.203,47,71],[494.786,0.401,64,12],[494.907,0.7,76,22],[495.028,0.11,98,67],[495.028,0.095,54,76],[495.27,0.203,47,34],[495.27,0.223,74,111],[495.512,0.89,71,126],[495.512,0.134,62,29],[495.754,0.534,59,27],[495.996,0.11,98,72],[495.996,0.095,54,81],[495.996,0.027,117,28],[496.238,0.045,117,80],[496.48,0.29,55,11],[496.48,0.03,99,22],[496.48,0.055,50,58],[496.48,3.677,55,48],[496.48,0.027,117,38],[496.54,0.16,39,80],[496.54,0.14,51,48],[497.189,0.29,62,40],[497.205,0.7,62,11],[497.447,0.29,55,25],[497.447,0.03,99,50],[497.447,0.055,50,134],[497.507,0.16,39,98],[497.507,0.14,51,59],[497.931,0.445,69,91],[497.931,0.027,117,14],[498.173,0.203,43,51],[498.173,0.045,117,81],[498.415,0.203,43,52],[498.415,0.445,79,148],[498.415,0.027,117,40],[498.899,0.11,98,116],[498.899,0.095,54,130],[499.125,0.29,62,34],[499.141,0.7,79,9],[499.141,0.134,66,26],[499.383,0.03,99,8],[499.383,0.055,50,21],[499.383,0.134,64,32],[499.443,0.16,39,60],[499.443,0.14,51,36],[499.625,0.534,62,24],[499.867,0.027,117,51],[500.109,0.045,117,64],[500.351,3.677,61,48],[500.351,0.445,64,173],[500.834,0.11,98,18],[500.834,0.095,54,21],[501.06,0.29,64,37],[501.076,0.7,64,10],[501.076,0.203,45,32],[501.318,0.29,57,12],[501.318,0.027,117,29],[501.56,0.045,117,91],[501.681,0.7,73,23],[502.028,0.29,64,14],[502.286,0.03,99,69],[502.286,0.055,50,184],[502.286,0.445,78,140],[502.346,0.16,39,140],[502.346,0.14,51,84],[502.528,0.267,66,35],[502.77,0.027,117,14],[502.996,0.29,69,43],[503.012,0.7,78,12],[503.012,0.203,50,53],[503.012,0.045,117,86],[503.254,0.29,62,39],[503.254,0.203,50,24],[503.254,0.027,117,16],[503.738,0.11,98,23],[503.738,0.095,54,25],[503.98,0.03,99,57],[503.98,0.055,50,151],[504.04,0.16,39,174],[504.04,0.14,51,104],[504.222,0.03,99,68],[504.222,0.055,50,181],[504.222,3.677,69,48],[504.222,0.445,62,127],[504.222,0.027,117,7],[504.282,0.16,39,163],[504.282,0.14,51,98],[504.464,0.045,117,68],[504.705,0.027,117,16],[504.931,0.29,69,13],[504.947,0.7,62,9],[504.947,0.203,50,41],[505.189,0.29,62,28],[505.189,0.203,50,35],[505.673,0.11,98,60],[505.673,0.095,54,68],[505.915,0.223,64,126],[505.915,0.045,117,67],[506.157,0.03,99,63],[506.157,0.055,50,169],[506.157,0.445,78,61],[506.157,0.027,117,22],[506.217,0.16,39,173],[506.217,0.14,51,104],[506.867,0.29,69,32],[506.883,0.7,78,8],[506.883,0.203,50,24],[507.125,0.29,62,36],[507.125,0.203,50,45],[507.367,0.045,117,62],[507.609,0.11,98,96],[507.609,0.095,54,108],[507.609,0.027,117,35],[508.092,0.055,50,10],[508.092,3.677,66,59],[508.152,0.16,39,47],[508.152,0.14,51,28],[508.802,0.29,66,27],[508.818,0.045,117,23],[509.06,0.29,59,38],[509.06,0.027,117,48],[509.302,0.045,117,42],[509.423,0.7,69,8],[509.786,0.203,47,39],[510.028,0.203,47,13],[510.028,0.668,76,37],[510.27,0.401,64,27],[510.512,0.11,98,53],[510.512,0.095,54,59],[510.738,0.29,66,40],[510.754,0.7,76,10],[510.754,0.045,117,70],[510.996,0.29,59,27],[510.996,0.03,99,53],[510.996,0.055,50,142],[510.996,0.027,117,45],[511.056,0.16,39,154],[511.056,0.14,51,92],[511.238,0.045,117,10],[511.705,0.29,66,27],[511.722,0.03,99,52],[511.722,0.055,50,139],[511.782,0.16,39,109],[511.782,0.14,51,66],[511.964,0.03,99,15],[511.964,0.055,50,41],[511.964,3.677,59,69],[512.024,0.16,39,11],[512.447,0.445,67,109],[512.689,0.203,43,51],[512.689,0.045,117,43],[512.931,0.203,43,53],[512.931,0.027,117,52],[513.173,0.045,117,71],[513.318,0.29,59,30],[513.415,0.11,98,92],[513.415,0.095,54,103],[513.415,0.027,117,11],[513.657,0.7,69,11],[513.657,0.203,43,13],[513.899,0.29,55,44],[514.141,0.267,67,14],[514.262,0.7,79,12],[514.286,0.29,59,26],[514.383,0.11,98,87],[514.383,0.095,54,98],[514.609,0.29,62,24],[514.867,0.29,55,12],[515.351,0.027,117,26],[515.592,0.045,117,78],[515.835,0.03,99,50],[515.835,0.055,50,134],[515.835,3.677,64,38],[515.835,0.445,64,94],[515.835,0.027,117,58],[515.894,0.16,39,134],[515.894,0.14,51,81],[516.076,0.045,117,75],[516.318,0.223,66,134],[516.318,0.027,117,24],[516.56,0.223,69,147],[516.802,0.03,99,84],[516.802,0.055,50,223],[516.802,0.668,73,157],[516.862,0.16,39,212],[516.862,0.14,51,127],[517.528,0.223,69,33],[517.77,0.03,99,85],[517.77,0.055,50,226],[517.77,0.445,78,23],[517.83,0.16,39,213],[517.83,0.14,51,128],[518.254,0.445,76,10],[518.738,0.03,99,86],[518.738,0.055,50,228],[518.798,0.16,39,214],[518.798,0.14,51,129],[519.463,0.03,99,86],[519.463,0.055,50,229],[519.463,0.045,117,40],[519.524,0.16,39,214],[519.524,0.14,51,129],[519.705,0.03,99,65],[519.705,0.055,50,173],[519.705,3.738,66,56],[519.705,0.027,117,31],[519.765,0.16,39,162],[519.765,0.14,51,97],[519.951,0.045,117,61],[520.197,0.027,117,41],[520.427,0.295,69,32],[520.443,0.045,117,58],[520.689,0.03,99,65],[520.689,0.055,50,173],[520.689,0.027,117,27],[520.749,0.16,39,162],[520.749,0.14,51,97],[520.935,0.045,117,22],[521.082,0.295,66,32],[521.427,0.7,66,10],[521.673,0.295,62,40],[521.673,0.03,99,69],[521.673,0.055,50,183],[521.733,0.16,39,172],[521.733,0.14,51,103],[522.41,0.7,66,10],[522.656,0.295,62,40],[522.656,0.03,99,69],[522.656,0.055,50,183],[522.716,0.16,39,172],[522.716,0.14,51,103],[523.378,0.295,69,40],[523.64,0.03,99,73],[523.64,0.055,50,194],[523.64,3.738,62,56],[523.7,0.16,39,181],[523.7,0.14,51,109],[524.009,0.7,66,21],[524.033,0.295,62,42],[524.378,0.045,117,25],[524.624,0.295,59,42],[524.624,0.03,99,73],[524.624,0.055,50,194],[524.624,0.027,117,31],[524.683,0.16,39,181],[524.683,0.14,51,109],[524.869,0.045,117,65],[524.992,0.7,69,21],[525.115,0.027,117,46],[525.361,0.045,117,69],[525.607,0.03,99,76],[525.607,0.055,50,204],[525.607,0.027,117,37],[525.667,0.16,39,191],[525.667,0.14,51,115],[525.853,0.045,117,35],[526.591,0.03,99,76],[526.591,0.055,50,204],[526.651,0.16,39,191],[526.651,0.14,51,115],[527.328,0.03,99,76],[527.328,0.055,50,204],[527.388,0.16,39,191],[527.388,0.14,51,115],[527.574,0.03,99,80],[527.574,0.055,50,214],[527.574,3.738,59,38],[527.574,0.453,62,120],[527.634,0.16,39,201],[527.634,0.14,51,121],[528.066,0.453,67,120],[528.558,0.03,99,80],[528.558,0.055,50,214],[528.558,0.226,69,120],[528.618,0.16,39,201],[528.618,0.14,51,121],[528.804,0.226,71,120],[529.05,0.453,69,120],[529.296,0.045,117,17],[529.542,0.03,99,84],[529.542,0.055,50,225],[529.542,0.453,67,120],[529.542,0.027,117,30],[529.601,0.16,39,211],[529.601,0.14,51,126],[529.787,0.272,55,35],[529.787,0.045,117,70],[530.033,0.027,117,52],[530.279,0.136,54,35],[530.279,0.045,117,83],[530.525,0.03,99,84],[530.525,0.055,50,225],[530.525,0.136,52,35],[530.525,0.027,117,45],[530.585,0.16,39,211],[530.585,0.14,51,126],[530.771,0.543,50,35],[530.771,0.045,117,48],[531.017,0.027,117,12],[531.509,0.03,99,88],[531.509,0.055,50,235],[531.509,3.738,57,34],[531.569,0.16,39,220],[531.569,0.14,51,132],[532.492,0.03,99,88],[532.492,0.055,50,235],[532.552,0.16,39,220],[532.552,0.14,51,132],[532.886,0.295,61,51],[533.23,0.7,73,13],[533.476,0.295,62,47],[533.476,0.03,99,82],[533.476,0.055,50,218],[533.536,0.16,39,204],[533.536,0.14,51,122],[534.197,0.295,69,47],[534.214,0.7,66,13],[534.214,0.045,117,7],[534.46,0.03,99,82],[534.46,0.055,50,218],[534.46,0.027,117,24],[534.519,0.16,39,204],[534.519,0.14,51,122],[534.705,0.045,117,62],[534.951,0.027,117,49],[535.181,0.295,69,47],[535.197,0.03,99,82],[535.197,0.055,50,218],[535.197,0.045,117,81],[535.257,0.16,39,204],[535.257,0.14,51,122],[535.443,0.03,99,65],[535.443,0.055,50,173],[535.443,3.864,62,46],[535.503,0.16,39,162],[535.503,0.14,51,97],[535.824,0.7,62,19],[535.85,0.305,66,37],[536.46,0.305,62,37],[536.46,0.03,99,65],[536.46,0.055,50,173],[536.52,0.16,39,162],[536.52,0.14,51,97],[536.841,0.7,66,19],[537.206,0.305,69,37],[537.477,0.03,99,69],[537.477,0.055,50,183],[537.537,0.16,39,172],[537.537,0.14,51,103],[538.494,0.03,99,69],[538.494,0.055,50,183],[538.554,0.16,39,172],[538.554,0.14,51,103],[539.511,0.03,99,73],[539.511,0.055,50,194],[539.511,3.864,59,63],[539.571,0.16,39,181],[539.571,0.14,51,109],[540.019,0.234,69,109],[540.274,0.234,71,109],[540.528,0.03,99,73],[540.528,0.055,50,194],[540.528,0.468,69,109],[540.588,0.16,39,181],[540.588,0.14,51,109],[541.036,0.468,66,109],[541.545,0.03,99,76],[541.545,0.055,50,204],[541.545,0.702,64,109],[541.605,0.16,39,191],[541.605,0.14,51,115],[542.562,0.03,99,76],[542.562,0.055,50,204],[542.622,0.16,39,191],[542.622,0.14,51,115],[543.324,0.03,99,76],[543.324,0.055,50,204],[543.385,0.16,39,191],[543.385,0.14,51,115],[543.579,0.03,99,80],[543.579,0.055,50,214],[543.579,3.864,55,62],[543.639,0.16,39,201],[543.639,0.14,51,121],[544.596,0.03,99,80],[544.596,0.055,50,214],[544.656,0.16,39,201],[544.656,0.14,51,121],[545.003,0.305,59,46],[545.613,0.305,55,49],[545.613,0.03,99,84],[545.613,0.055,50,225],[545.673,0.16,39,211],[545.673,0.14,51,126],[546.358,0.305,62,49],[546.63,0.03,99,84],[546.63,0.055,50,225],[546.69,0.16,39,211],[546.69,0.14,51,126],[547.036,0.305,59,49],[547.375,0.305,62,49],[547.646,4.068,62,55],[547.646,0.03,99,88],[547.646,0.055,50,235],[547.646,3.864,57,41],[547.707,0.16,39,220],[547.707,0.14,51,132],[548.028,0.7,64,25],[548.053,0.305,61,51],[548.663,0.305,57,51],[548.663,0.03,99,88],[548.663,0.055,50,235],[548.723,0.16,39,220],[548.723,0.14,51,132],[549.045,0.7,73,25],[549.409,0.305,64,51],[549.68,0.03,99,82],[549.68,0.055,50,218],[549.74,0.16,39,204],[549.74,0.14,51,122],[550.062,0.7,66,25],[550.697,0.03,99,82],[550.697,0.055,50,218],[550.757,0.16,39,204],[550.757,0.14,51,122],[551.46,0.03,99,82],[551.46,0.055,50,218],[551.52,0.16,39,204],[551.52,0.14,51,122],[551.714,0.03,99,19],[551.714,0.055,50,50],[551.774,0.16,39,47],[551.774,0.14,51,28],[552.731,0.03,99,19],[552.731,0.055,50,50],[552.791,0.16,39,47],[552.791,0.14,51,28],[553.748,0.03,99,19],[553.748,0.055,50,50],[553.808,0.16,39,47],[553.808,0.14,51,28],[554.314,0.58,74,33],[554.314,0.8,48,33],[554.314,0.27,48,48],[554.314,0.03,83,17],[554.314,0.03,99,23],[554.314,0.055,50,62],[554.334,0.31,42,24],[554.374,0.16,39,58],[554.374,0.14,51,35],[555.223,0.773,79,33],[555.223,0.03,99,23],[555.223,0.055,50,62],[555.283,0.16,39,58],[555.283,0.14,51,35],[555.314,2.2,60,17],[556.133,0.27,48,48],[556.133,0.03,83,17],[556.133,0.03,99,23],[556.133,0.055,50,62],[556.153,0.31,42,24],[556.192,0.16,39,58],[556.192,0.14,51,35],[556.814,0.193,81,33],[557.042,0.03,99,23],[557.042,0.055,50,62],[557.102,0.16,39,58],[557.102,0.14,51,35],[557.951,0.27,48,48],[557.951,0.03,83,17],[557.951,0.03,99,23],[557.951,0.055,50,62],[557.971,0.31,42,24],[558.011,0.16,39,58],[558.011,0.14,51,35],[558.86,0.03,99,23],[558.86,0.055,50,62],[558.92,0.16,39,58],[558.92,0.14,51,35],[559.769,0.27,48,48],[559.769,0.03,83,17],[559.769,0.03,99,23],[559.769,0.055,50,62],[559.789,0.31,42,24],[559.829,0.16,39,58],[559.829,0.14,51,35],[560.678,0.03,99,23],[560.678,0.055,50,62],[560.738,0.16,39,58],[560.738,0.14,51,35],[561.587,0.58,74,33],[561.587,0.27,48,48],[561.587,0.03,83,17],[561.587,0.03,99,23],[561.587,0.055,50,62],[561.607,0.31,42,24],[561.647,0.16,39,58],[561.647,0.14,51,35],[562.496,0.773,79,33],[562.496,0.03,99,23],[562.496,0.055,50,62],[562.556,0.16,39,58],[562.556,0.14,51,35],[563.405,0.27,48,48],[563.405,0.03,83,17],[563.405,0.03,99,23],[563.405,0.055,50,62],[563.425,0.31,42,24],[563.465,0.16,39,58],[563.465,0.14,51,35],[564.087,0.193,81,33],[564.314,0.03,99,23],[564.314,0.055,50,62],[564.374,0.16,39,58],[564.374,0.14,51,35],[565.223,0.27,48,48],[565.223,0.03,83,17],[565.223,0.03,99,23],[565.223,0.055,50,62],[565.243,0.31,42,24],[565.283,0.16,39,58],[565.283,0.14,51,35],[566.133,0.03,99,23],[566.133,0.055,50,62],[566.192,0.16,39,58],[566.192,0.14,51,35],[567.042,0.27,48,48],[567.042,0.03,83,17],[567.042,0.03,99,23],[567.042,0.055,50,62],[567.062,0.31,42,24],[567.102,0.16,39,58],[567.102,0.14,51,35],[567.951,0.03,99,23],[567.951,0.055,50,62],[568.011,0.16,39,58],[568.011,0.14,51,35],[568.86,0.58,55,16],[568.86,0.03,99,23],[568.86,0.055,50,62],[568.92,0.16,39,58],[568.92,0.14,51,35],[569.542,0.193,55,22],[569.769,0.773,55,22],[569.769,0.03,99,23],[569.769,0.055,50,62],[569.829,0.16,39,58],[569.829,0.14,51,35],[570.678,0.58,55,22],[570.678,0.03,99,23],[570.678,0.055,50,62],[570.738,0.16,39,58],[570.738,0.14,51,35],[571.36,0.193,55,22],[571.587,0.773,55,22],[571.587,0.03,99,23],[571.587,0.055,50,62],[571.647,0.16,39,58],[571.647,0.14,51,35],[572.496,0.58,55,22],[572.496,0.03,99,23],[572.496,0.055,50,62],[572.556,0.16,39,58],[572.556,0.14,51,35],[573.178,0.193,55,16],[573.405,0.773,55,16],[573.405,0.03,99,23],[573.405,0.055,50,62],[573.465,0.16,39,58],[573.465,0.14,51,35],[574.314,0.58,55,16],[574.314,0.03,99,23],[574.314,0.055,50,62],[574.374,0.16,39,58],[574.374,0.14,51,35],[574.996,0.193,55,16],[575.223,0.773,55,16],[575.223,0.03,99,23],[575.223,0.055,50,62],[575.283,0.16,39,58],[575.283,0.14,51,35],[576.133,0.58,55,16],[576.133,0.03,99,23],[576.133,0.055,50,62],[576.192,0.16,39,58],[576.192,0.14,51,35],[576.814,0.193,55,16],[577.042,0.773,55,24],[577.042,0.03,99,23],[577.042,0.055,50,62],[577.102,0.16,39,58],[577.102,0.14,51,35],[577.951,0.58,55,24],[577.951,0.03,99,23],[577.951,0.055,50,62],[578.011,0.16,39,58],[578.011,0.14,51,35],[578.633,0.193,55,24],[578.86,0.773,55,24],[578.86,0.03,99,23],[578.86,0.055,50,62],[578.92,0.16,39,58],[578.92,0.14,51,35],[579.769,0.58,55,24],[579.769,0.03,99,23],[579.769,0.055,50,62],[579.829,0.16,39,58],[579.829,0.14,51,35],[580.451,0.193,55,24],[580.678,0.773,55,24],[580.678,0.03,99,23],[580.678,0.055,50,62],[580.738,0.16,39,58],[580.738,0.14,51,35],[581.587,0.58,55,29],[581.587,0.03,99,23],[581.587,0.055,50,62],[581.647,0.16,39,58],[581.647,0.14,51,35],[582.269,0.193,55,29],[582.496,0.773,55,29],[582.496,0.03,99,23],[582.496,0.055,50,62],[582.556,0.16,39,58],[582.556,0.14,51,35],[583.405,0.58,74,48],[583.405,0.27,48,48],[583.405,0.03,83,17],[583.405,0.03,99,23],[583.405,0.055,50,62],[583.425,0.31,42,24],[583.465,0.16,39,58],[583.465,0.14,51,35],[584.314,0.773,79,48],[584.314,0.03,99,23],[584.314,0.055,50,62],[584.374,0.16,39,58],[584.374,0.14,51,35],[585.223,0.27,48,48],[585.223,0.03,83,17],[585.223,0.03,99,23],[585.223,0.055,50,62],[585.243,0.31,42,24],[585.283,0.16,39,58],[585.283,0.14,51,35],[585.905,0.193,81,48],[586.133,0.03,99,23],[586.133,0.055,50,62],[586.192,0.16,39,58],[586.192,0.14,51,35],[587.042,0.27,48,48],[587.042,0.03,83,17],[587.042,0.03,99,23],[587.042,0.055,50,62],[587.062,0.31,42,24],[587.102,0.16,39,58],[587.102,0.14,51,35],[587.951,0.03,99,23],[587.951,0.055,50,62],[588.011,0.16,39,58],[588.011,0.14,51,35],[588.86,0.27,48,48],[588.86,0.03,83,17],[588.86,0.03,99,23],[588.86,0.055,50,62],[588.88,0.31,42,24],[588.92,0.16,39,58],[588.92,0.14,51,35],[589.769,0.03,99,23],[589.769,0.055,50,62],[589.829,0.16,39,58],[589.829,0.14,51,35],[590.678,0.159,67,54],[590.678,0.03,99,23],[590.678,0.055,50,62],[590.738,0.16,39,58],[590.738,0.14,51,35],[591.587,0.03,99,23],[591.587,0.055,50,62],[591.647,0.16,39,58],[591.647,0.14,51,35],[591.837,0.6,60,47],[592.437,0.346,72,23],[592.437,0.27,48,39],[592.437,0.03,83,14],[592.437,0.03,99,19],[592.437,0.055,50,50],[592.437,4.385,60,13],[592.457,0.31,42,19],[592.497,0.16,39,47],[592.497,0.14,51,28],[592.726,0.219,79,13],[593.591,0.27,48,39],[593.591,0.03,83,14],[593.591,0.03,99,19],[593.591,0.055,50,50],[593.611,0.31,42,19],[593.651,0.16,39,47],[593.651,0.14,51,28],[594.437,0.346,79,23],[594.745,0.27,48,41],[594.745,0.03,83,14],[594.745,0.03,99,18],[594.745,0.055,50,49],[594.765,0.31,42,20],[594.805,0.16,39,46],[594.805,0.14,51,28],[595.033,0.035,117,11],[595.899,0.346,72,7],[595.899,0.27,48,39],[595.899,0.03,83,14],[595.899,0.03,99,18],[595.899,0.055,50,47],[595.919,0.31,42,19],[595.958,0.16,39,44],[595.958,0.14,51,27],[596.36,0.346,76,22],[597.052,0.27,48,34],[597.052,0.03,83,12],[597.052,0.03,99,15],[597.052,0.055,50,39],[597.052,4.385,57,26],[597.072,0.31,42,17],[597.112,0.16,39,36],[597.112,0.14,51,22],[597.485,0.7,76,9],[597.899,0.346,76,22],[598.206,0.346,69,10],[598.206,0.27,48,17],[598.206,0.055,50,19],[598.226,0.31,42,8],[598.266,0.16,39,17],[598.266,0.14,51,10],[599.072,0.219,76,14],[599.072,0.035,117,12],[599.649,0.219,69,14],[599.793,0.277,52,13],[599.822,0.346,72,23],[600.514,0.219,72,12],[600.514,0.277,45,22],[601.206,0.27,64,32],[601.206,0.03,83,11],[601.226,0.31,57,16],[601.36,0.346,76,27],[601.379,0.277,40,26],[601.668,0.277,41,27],[601.668,4.385,60,17],[602.101,0.7,72,7],[602.101,0.277,48,23],[602.245,0.07,98,15],[602.36,0.27,64,23],[602.36,0.03,83,8],[602.38,0.31,57,12],[602.533,0.035,117,13],[602.822,0.346,65,25],[602.822,0.277,41,13],[603.399,0.07,98,24],[604.437,0.346,69,18],[604.552,0.07,98,19],[604.668,0.27,64,24],[604.668,0.03,83,8],[604.688,0.31,57,12],[604.822,0.346,72,18],[605.995,0.035,117,14],[606.283,0.346,67,30],[606.283,0.27,48,12],[606.283,0.055,50,11],[606.283,4.385,55,28],[606.343,0.16,39,12],[606.572,0.035,117,8],[607.437,0.27,48,37],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,34],[607.457,0.31,42,18],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.87,0.7,83,9],[607.899,0.346,71,25],[608.283,0.346,74,15],[608.302,0.219,74,8],[608.591,0.27,48,45],[608.591,0.03,83,16],[608.591,0.03,99,17],[608.591,0.055,50,46],[608.611,0.31,42,23],[608.651,0.16,39,43],[608.651,0.14,51,26],[609.745,0.173,60,20],[609.745,0.03,99,18],[609.745,0.055,50,49],[609.805,0.16,39,46],[609.805,0.14,51,28],[610.899,0.36,72,21],[610.899,0.27,48,37],[610.899,0.03,83,13],[610.899,0.03,99,19],[610.899,0.055,50,50],[610.899,4.56,67,8],[610.919,0.31,42,18],[610.959,0.16,39,47],[610.959,0.14,51,28],[612.099,0.36,72,27],[612.099,0.27,48,37],[612.099,0.03,83,13],[612.099,0.03,99,19],[612.099,0.055,50,50],[612.119,0.31,42,18],[612.159,0.16,39,47],[612.159,0.14,51,28],[613.299,0.36,72,28],[613.299,0.27,48,39],[613.299,0.03,83,14],[613.299,0.03,99,19],[613.299,0.055,50,50],[613.319,0.31,42,19],[613.359,0.16,39,47],[613.359,0.14,51,28],[613.749,0.7,76,13],[614.499,0.36,72,28],[614.499,0.27,48,39],[614.499,0.03,83,14],[614.499,0.03,99,19],[614.499,0.055,50,50],[614.519,0.31,42,19],[614.559,0.16,39,47],[614.559,0.14,51,28],[615.699,0.36,69,30],[615.699,0.27,48,41],[615.699,0.03,83,14],[615.699,0.03,99,19],[615.699,0.055,50,50],[615.699,4.56,64,22],[615.719,0.31,42,21],[615.759,0.16,39,47],[615.759,0.14,51,28],[616.899,0.36,69,30],[616.899,0.27,48,41],[616.899,0.03,83,14],[616.899,0.03,99,19],[616.899,0.055,50,50],[616.919,0.31,42,21],[616.959,0.16,39,47],[616.959,0.14,51,28],[618.099,0.36,69,32],[618.099,0.27,48,43],[618.099,0.03,83,15],[618.099,0.03,99,19],[618.099,0.055,50,50],[618.119,0.31,42,22],[618.159,0.16,39,47],[618.159,0.14,51,28],[619.299,0.36,69,32],[619.299,0.27,48,43],[619.299,0.03,83,15],[619.299,0.03,99,19],[619.299,0.055,50,50],[619.319,0.31,42,22],[619.359,0.16,39,47],[619.359,0.14,51,28],[620.499,0.27,48,46],[620.499,0.03,83,16],[620.499,0.03,99,19],[620.499,0.055,50,50],[620.499,4.56,60,21],[620.519,0.31,42,23],[620.559,0.16,39,47],[620.559,0.14,51,28],[621.399,0.7,72,9],[621.699,0.27,48,46],[621.699,0.03,83,16],[621.699,0.03,99,19],[621.699,0.055,50,50],[621.719,0.31,42,23],[621.759,0.16,39,47],[621.759,0.14,51,28],[622.149,0.7,79,17],[622.899,0.27,48,48],[622.899,0.03,83,17],[622.899,0.03,99,19],[622.899,0.055,50,50],[622.919,0.31,42,24],[622.959,0.16,39,47],[622.959,0.14,51,28],[623.199,0.228,72,20],[624.099,0.27,48,48],[624.099,0.03,83,17],[624.099,0.03,99,19],[624.099,0.055,50,50],[624.119,0.31,42,24],[624.159,0.16,39,47],[624.159,0.14,51,28],[625.299,0.27,48,50],[625.299,0.03,83,17],[625.299,0.03,99,19],[625.299,0.055,50,50],[625.299,4.56,62,18],[625.319,0.31,42,25],[625.359,0.16,39,47],[625.359,0.14,51,28],[626.499,0.27,48,50],[626.499,0.03,83,17],[626.499,0.03,99,19],[626.499,0.055,50,50],[626.519,0.31,42,25],[626.559,0.16,39,47],[626.559,0.14,51,28],[627.699,0.27,48,46],[627.699,0.03,83,16],[627.699,0.03,99,19],[627.699,0.055,50,50],[627.719,0.31,42,23],[627.759,0.16,39,47],[627.759,0.14,51,28],[628.599,0.7,76,10],[628.899,0.18,60,24],[628.899,0.03,99,19],[628.899,0.055,50,50],[628.959,0.16,39,47],[628.959,0.14,51,28],[630.099,0.375,72,24],[630.099,0.27,48,32],[630.099,0.03,83,11],[630.099,0.03,99,19],[630.099,0.055,50,50],[630.119,0.31,42,16],[630.159,0.16,39,47],[630.159,0.14,51,28],[630.567,0.7,72,12],[631.349,0.375,72,24],[631.349,0.27,48,32],[631.349,0.03,83,11],[631.349,0.03,99,19],[631.349,0.055,50,50],[631.369,0.31,42,16],[631.409,0.16,39,47],[631.409,0.14,51,28],[632.599,0.375,72,25],[632.599,0.27,48,34],[632.599,0.03,83,12],[632.599,0.03,99,19],[632.599,0.055,50,50],[632.619,0.31,42,17],[632.659,0.16,39,47],[632.659,0.14,51,28],[633.849,0.375,72,25],[633.849,0.27,48,34],[633.849,0.03,83,12],[633.849,0.03,99,19],[633.849,0.055,50,50],[633.869,0.31,42,17],[633.909,0.16,39,47],[633.909,0.14,51,28],[635.099,0.375,69,27],[635.099,0.27,48,36],[635.099,0.03,83,13],[635.099,0.03,99,19],[635.099,0.055,50,50],[635.099,4.75,60,13],[635.119,0.31,42,18],[635.159,0.16,39,47],[635.159,0.14,51,28],[636.349,0.375,69,27],[636.349,0.27,48,36],[636.349,0.03,83,13],[636.349,0.03,99,19],[636.349,0.055,50,50],[636.369,0.31,42,18],[636.409,0.16,39,47],[636.409,0.14,51,28],[637.599,0.375,69,28],[637.599,0.27,48,38],[637.599,0.03,83,13],[637.599,0.03,99,19],[637.599,0.055,50,50],[637.619,0.31,42,19],[637.659,0.16,39,47],[637.659,0.14,51,28],[638.067,0.7,74,13],[638.849,0.375,69,28],[638.849,0.27,48,38],[638.849,0.03,83,13],[638.849,0.03,99,19],[638.849,0.055,50,50],[638.869,0.31,42,19],[638.909,0.16,39,47],[638.909,0.14,51,28],[640.099,0.375,65,30],[640.099,0.27,48,40],[640.099,0.03,83,14],[640.099,0.03,99,19],[640.099,0.055,50,50],[640.099,4.75,57,19],[640.119,0.31,42,20],[640.159,0.16,39,47],[640.159,0.14,51,28],[641.349,0.375,65,30],[641.349,0.27,48,40],[641.349,0.03,83,14],[641.349,0.03,99,19],[641.349,0.055,50,50],[641.369,0.31,42,20],[641.409,0.16,39,47],[641.409,0.14,51,28],[642.599,0.375,65,31],[642.599,0.27,48,42],[642.599,0.03,83,15],[642.599,0.03,99,19],[642.599,0.055,50,50],[642.619,0.31,42,21],[642.659,0.16,39,47],[642.659,0.14,51,28],[643.849,0.375,65,31],[643.849,0.27,48,42],[643.849,0.03,83,15],[643.849,0.03,99,19],[643.849,0.055,50,50],[643.869,0.31,42,21],[643.909,0.16,39,47],[643.909,0.14,51,28],[645.099,0.375,67,32],[645.099,0.27,48,44],[645.099,0.03,83,15],[645.099,0.03,99,19],[645.099,0.055,50,50],[645.099,4.75,59,16],[645.119,0.31,42,22],[645.159,0.16,39,47],[645.159,0.14,51,28],[646.349,0.375,67,32],[646.349,0.27,48,44],[646.349,0.03,83,15],[646.349,0.03,99,19],[646.349,0.055,50,50],[646.369,0.31,42,22],[646.409,0.16,39,47],[646.409,0.14,51,28],[646.817,0.7,83,16],[647.599,0.375,72,30],[647.599,0.27,48,41],[647.599,0.03,83,14],[647.599,0.03,99,19],[647.599,0.055,50,50],[647.619,0.31,42,20],[647.659,0.16,39,47],[647.659,0.14,51,28],[648.849,0.188,60,21],[648.849,0.03,99,19],[648.849,0.055,50,50],[648.909,0.16,39,47],[648.909,0.14,51,28],[650.099,0.383,72,22],[650.099,0.03,99,19],[650.099,0.055,50,50],[650.159,0.16,39,47],[650.159,0.14,51,28],[651.375,0.383,72,22],[651.375,0.03,99,19],[651.375,0.055,50,50],[651.435,0.16,39,47],[651.435,0.14,51,28],[652.652,0.383,72,24],[652.652,0.03,99,19],[652.652,0.055,50,50],[652.712,0.16,39,47],[652.712,0.14,51,28],[653.928,0.383,72,24],[653.928,0.03,99,19],[653.928,0.055,50,50],[653.988,0.16,39,47],[653.988,0.14,51,28],[655.205,0.383,69,25],[655.205,0.03,99,19],[655.205,0.055,50,50],[655.265,0.16,39,47],[655.265,0.14,51,28],[655.684,0.7,76,12],[656.482,0.383,69,25],[656.482,0.03,99,19],[656.482,0.055,50,50],[656.542,0.16,39,47],[656.542,0.14,51,28],[657.758,0.383,69,26],[657.758,0.03,99,19],[657.758,0.055,50,50],[657.818,0.16,39,47],[657.818,0.14,51,28],[659.035,0.383,69,26],[659.035,0.03,99,19],[659.035,0.055,50,50],[659.095,0.16,39,47],[659.095,0.14,51,28],[660.311,0.383,65,24],[660.311,0.03,99,19],[660.311,0.055,50,50],[660.371,0.16,39,47],[660.371,0.14,51,28],[661.588,0.383,65,24],[661.588,0.03,99,19],[661.588,0.055,50,50],[661.648,0.16,39,47],[661.648,0.14,51,28],[662.865,0.383,65,25],[662.865,0.03,99,19],[662.865,0.055,50,50],[662.925,0.16,39,47],[662.925,0.14,51,28],[663.343,0.7,77,12],[664.141,0.383,65,25],[664.141,0.03,99,19],[664.141,0.055,50,50],[664.201,0.16,39,47],[664.201,0.14,51,28],[665.418,0.383,67,26],[665.418,0.03,99,19],[665.418,0.055,50,50],[665.478,0.16,39,47],[665.478,0.14,51,28],[666.694,0.383,67,26],[666.694,0.03,99,19],[666.694,0.055,50,50],[666.754,0.16,39,47],[666.754,0.14,51,28],[667.971,0.383,72,24],[667.971,0.03,99,19],[667.971,0.055,50,50],[668.031,0.16,39,47],[668.031,0.14,51,28],[669.247,0.192,60,17],[669.247,0.03,99,19],[669.247,0.055,50,50],[669.308,0.16,39,47],[669.308,0.14,51,28],[670.524,0.391,72,18],[670.524,0.03,99,19],[670.524,0.055,50,50],[670.584,0.16,39,47],[670.584,0.14,51,28],[671.046,0.391,76,18],[671.481,0.391,79,18],[671.828,0.391,72,18],[671.828,0.03,99,19],[671.828,0.055,50,50],[671.888,0.16,39,47],[671.888,0.14,51,28],[672.35,0.391,76,18],[672.785,0.391,79,18],[673.133,0.391,72,19],[673.133,0.03,99,19],[673.133,0.055,50,50],[673.193,0.16,39,47],[673.193,0.14,51,28],[673.655,0.391,76,19],[674.089,0.391,79,19],[674.437,0.391,72,19],[674.437,0.03,99,19],[674.437,0.055,50,50],[674.497,0.16,39,47],[674.497,0.14,51,28],[674.959,0.391,76,19],[675.394,0.391,79,19],[675.741,0.391,69,20],[675.741,0.03,99,19],[675.741,0.055,50,50],[675.802,0.16,39,47],[675.802,0.14,51,28],[676.263,0.391,72,20],[676.698,0.391,76,20],[677.046,0.391,69,20],[677.046,0.03,99,19],[677.046,0.055,50,50],[677.106,0.16,39,47],[677.106,0.14,51,28],[677.568,0.391,72,20],[678.002,0.391,76,20],[678.35,0.391,69,21],[678.35,0.03,99,19],[678.35,0.055,50,50],[678.41,0.16,39,47],[678.41,0.14,51,28],[678.872,0.391,72,21],[679.307,0.391,76,21],[679.654,0.03,99,19],[679.654,0.055,50,50],[679.655,0.391,69,21],[679.715,0.16,39,47],[679.715,0.14,51,28],[680.176,0.391,72,21],[680.611,0.391,76,21],[680.959,0.391,65,22],[680.959,0.03,99,19],[680.959,0.055,50,50],[681.019,0.16,39,47],[681.019,0.14,51,28],[681.481,0.391,69,22],[681.915,0.391,72,22],[682.263,0.391,65,22],[682.263,0.03,99,19],[682.263,0.055,50,50],[682.323,0.16,39,47],[682.323,0.14,51,28],[682.785,0.391,69,22],[683.22,0.391,72,22],[683.568,0.391,65,23],[683.568,0.03,99,19],[683.568,0.055,50,50],[683.628,0.16,39,47],[683.628,0.14,51,28],[684.089,0.391,69,23],[684.524,0.391,72,23],[684.872,0.391,65,23],[684.872,0.03,99,19],[684.872,0.055,50,50],[684.932,0.16,39,47],[684.932,0.14,51,28],[685.394,0.391,69,23],[685.828,0.391,72,23],[686.176,0.391,67,24],[686.176,0.03,99,19],[686.176,0.055,50,50],[686.236,0.16,39,47],[686.236,0.14,51,28],[686.698,0.391,71,24],[687.133,0.391,74,24],[687.481,0.391,67,24],[687.481,0.03,99,19],[687.481,0.055,50,50],[687.541,0.16,39,47],[687.541,0.14,51,28],[688.002,0.391,71,24],[688.437,0.391,74,24],[688.785,0.391,72,23],[688.785,0.03,99,19],[688.785,0.055,50,50],[688.845,0.16,39,47],[688.845,0.14,51,28],[689.307,0.391,76,23],[689.741,0.391,79,23],[690.089,0.196,60,16],[690.089,0.03,99,19],[690.089,0.055,50,50],[690.149,0.16,39,47],[690.149,0.14,51,28],[691.394,0.03,99,19],[691.394,0.055,50,50],[691.454,0.16,39,47],[691.454,0.14,51,28],[692.757,0.03,99,19],[692.757,0.055,50,50],[692.817,0.16,39,47],[692.817,0.14,51,28],[694.121,0.03,99,19],[694.121,0.055,50,50],[694.181,0.16,39,47],[694.181,0.14,51,28],[695.485,0.03,99,19],[695.485,0.055,50,50],[695.545,0.16,39,47],[695.545,0.14,51,28],[696.848,0.03,99,19],[696.848,0.055,50,50],[696.908,0.16,39,47],[696.908,0.14,51,28],[698.212,0.03,99,19],[698.212,0.055,50,50],[698.272,0.16,39,47],[698.272,0.14,51,28],[699.576,0.03,99,19],[699.576,0.055,50,50],[699.635,0.16,39,47],[699.635,0.14,51,28],[700.939,0.03,99,19],[700.939,0.055,50,50],[700.999,0.16,39,47],[700.999,0.14,51,28],[702.303,0.03,99,19],[702.303,0.055,50,50],[702.363,0.16,39,47],[702.363,0.14,51,28],[703.666,0.03,99,19],[703.666,0.055,50,50],[703.726,0.16,39,47],[703.726,0.14,51,28],[705.03,0.03,99,19],[705.03,0.055,50,50],[705.09,0.16,39,47],[705.09,0.14,51,28],[706.394,0.03,99,19],[706.394,0.055,50,50],[706.454,0.16,39,47],[706.454,0.14,51,28],[707.757,0.03,99,19],[707.757,0.055,50,50],[707.817,0.16,39,47],[707.817,0.14,51,28],[709.121,0.03,99,19],[709.121,0.055,50,50],[709.181,0.16,39,47],[709.181,0.14,51,28],[710.485,0.03,99,19],[710.485,0.055,50,50],[710.545,0.16,39,47],[710.545,0.14,51,28],[711.848,0.03,99,19],[711.848,0.055,50,50],[711.908,0.16,39,47],[711.908,0.14,51,28],[713.212,0.03,99,16],[713.212,0.055,50,44],[713.272,0.16,39,41],[713.272,0.14,51,24],[714.412,2.4,83,39],[715.212,0.03,99,16],[715.212,0.055,50,44],[715.272,0.16,39,41],[715.272,0.14,51,24],[717.212,0.03,99,16],[717.212,0.055,50,44],[717.272,0.16,39,41],[717.272,0.14,51,24],[718.212,2,60,27],[719.212,0.03,99,16],[719.212,0.055,50,44],[719.272,0.16,39,41],[719.272,0.14,51,24],[721.212,0.03,99,16],[721.212,0.055,50,44],[721.272,0.16,39,41],[721.272,0.14,51,24],[723.212,0.03,99,16],[723.212,0.055,50,44],[723.272,0.16,39,41],[723.272,0.14,51,24],[725.212,0.03,99,16],[725.212,0.055,50,44],[725.272,0.16,39,41],[725.272,0.14,51,24],[727.212,0.03,99,16],[727.212,0.055,50,44],[727.272,0.16,39,41],[727.272,0.14,51,24],[729.212,0.03,99,16],[729.212,0.055,50,44],[729.272,0.16,39,41],[729.272,0.14,51,24],[731.212,0.03,99,16],[731.212,0.055,50,44],[731.272,0.16,39,41],[731.272,0.14,51,24],[733.212,0.03,99,16],[733.212,0.055,50,44],[733.272,0.16,39,41],[733.272,0.14,51,24],[735.212,0.03,99,16],[735.212,0.055,50,44],[735.272,0.16,39,41],[735.272,0.14,51,24],[737.212,0.03,99,16],[737.212,0.055,50,44],[737.272,0.16,39,41],[737.272,0.14,51,24],[739.212,0.03,99,16],[739.212,0.055,50,44],[739.272,0.16,39,41],[739.272,0.14,51,24],[741.212,0.03,99,16],[741.212,0.055,50,44],[741.272,0.16,39,41],[741.272,0.14,51,24],[743.212,0.03,99,16],[743.212,0.055,50,44],[743.272,0.16,39,41],[743.272,0.14,51,24],[745.212,0.03,99,16],[745.212,0.055,50,44],[745.272,0.16,39,41],[745.272,0.14,51,24],[747.212,0.03,99,16],[747.212,0.055,50,44],[747.272,0.16,39,41],[747.272,0.14,51,24],[749.212,0.03,99,16],[749.212,0.055,50,44],[749.272,0.16,39,41],[749.272,0.14,51,24],[751.212,0.03,99,16],[751.212,0.055,50,44],[751.272,0.16,39,41],[751.272,0.14,51,24],[753.212,0.03,99,16],[753.212,0.055,50,44],[753.272,0.16,39,41],[753.272,0.14,51,24],[755.212,0.03,99,16],[755.212,0.055,50,44],[755.272,0.16,39,41],[755.272,0.14,51,24],[757.212,0.03,99,16],[757.212,0.055,50,44],[757.272,0.16,39,41],[757.272,0.14,51,24],[759.212,0.03,99,16],[759.212,0.055,50,44],[759.272,0.16,39,41],[759.272,0.14,51,24],[761.212,0.03,99,16],[761.212,0.055,50,44],[761.272,0.16,39,41],[761.272,0.14,51,24],[763.212,0.03,99,16],[763.212,0.055,50,44],[763.272,0.16,39,41],[763.272,0.14,51,24],[765.212,0.03,99,16],[765.212,0.055,50,44],[765.272,0.16,39,41],[765.272,0.14,51,24],[767.212,0.03,99,16],[767.212,0.055,50,44],[767.272,0.16,39,41],[767.272,0.14,51,24],[769.212,0.03,99,16],[769.212,0.055,50,44],[769.272,0.16,39,41],[769.272,0.14,51,24],[771.212,0.03,99,16],[771.212,0.055,50,44],[771.272,0.16,39,41],[771.272,0.14,51,24]],[[33.95,0.427,76,169],[37.75,0.855,74,199],[43.98,0.999,76,199],[49.9,0.504,72,199],[52.14,0.504,76,199],[56.16,0.25,79,199],[58.14,0.792,72,177],[59.78,0.15,62,173],[61.3,0.36,79,22],[62.5,0.36,79,22],[63.7,0.36,79,23],[64.9,0.36,79,23],[66.1,0.36,76,24],[67.3,0.36,76,24],[68.5,0.36,76,25],[69.7,0.36,76,21],[70.9,0.36,72,22],[72.1,0.36,72,22],[73.3,0.36,72,23],[74.5,0.36,72,23],[75.7,0.36,74,24],[76.9,0.36,74,24],[78.1,0.36,79,22],[78.66,0.18,62,22],[80.483,0.353,79,29],[81.659,0.353,79,29],[82.836,0.353,79,31],[84.012,0.353,79,31],[84.032,0.224,72,17],[85.189,0.353,76,32],[86.365,0.353,76,22],[87.542,0.353,76,23],[88.718,0.353,76,23],[97.502,0.176,62,31],[99.29,0.346,79,39],[100.444,0.346,79,19],[101.04,0.035,117,11],[101.597,0.346,79,20],[101.617,0.035,117,8],[102.751,0.346,79,20],[102.77,0.219,72,11],[103.347,0.219,69,12],[103.905,0.346,76,21],[104.645,0.7,79,11],[105.059,0.346,76,21],[105.655,0.035,117,9],[106.213,0.346,76,35],[106.232,0.035,117,12],[107.367,0.346,76,35],[108.828,0.219,69,20],[110.847,0.035,117,12],[111.424,0.035,117,13],[112.722,0.7,74,14],[114.309,0.219,74,16],[115.982,0.173,62,19],[117.36,0.227,57,10],[117.36,0.227,60,10],[117.36,0.227,64,10],[118.723,0.227,57,10],[118.723,0.227,60,10],[118.723,0.227,64,10],[120.087,0.227,62,10],[120.087,0.227,65,10],[120.087,0.227,69,10],[121.451,0.227,64,10],[121.451,0.227,68,10],[121.451,0.227,71,10],[122.814,0.227,57,10],[122.814,0.227,60,10],[122.814,0.227,64,10],[124.178,0.227,65,10],[124.178,0.227,69,10],[124.178,0.227,72,10],[125.541,0.227,62,10],[125.541,0.227,65,10],[125.541,0.227,69,10],[126.905,0.227,64,10],[126.905,0.227,68,10],[126.905,0.227,71,10],[128.269,0.227,57,10],[128.269,0.227,60,10],[128.269,0.227,64,10],[129.632,0.227,57,10],[129.632,0.227,60,10],[129.632,0.227,64,10],[130.996,0.227,62,10],[130.996,0.227,65,10],[130.996,0.227,69,10],[132.36,0.227,64,10],[132.36,0.227,68,10],[132.36,0.227,71,10],[133.723,0.227,57,10],[133.723,0.227,60,10],[133.723,0.227,64,10],[135.087,0.227,65,9],[135.087,0.227,69,9],[135.087,0.227,72,9],[136.451,0.227,64,9],[136.451,0.227,68,9],[136.451,0.227,71,9],[137.814,0.227,57,9],[137.814,0.227,60,9],[137.814,0.227,64,9],[139.178,0.227,57,9],[139.178,0.227,60,9],[139.178,0.227,64,9],[139.632,0.409,77,26],[140.541,0.227,57,9],[140.541,0.227,60,9],[140.541,0.227,64,9],[140.769,0.045,111,12],[140.996,0.191,69,10],[141.451,0.045,111,19],[141.905,0.227,62,9],[141.905,0.227,65,9],[141.905,0.227,69,9],[143.041,0.191,80,10],[143.269,0.227,64,9],[143.269,0.227,68,9],[143.269,0.227,71,9],[144.178,0.818,74,26],[144.632,0.227,57,9],[144.632,0.227,60,9],[144.632,0.227,64,9],[145.541,0.045,111,12],[145.996,0.227,65,11],[145.996,0.227,69,11],[145.996,0.227,72,11],[146.223,0.045,111,15],[146.905,0.045,111,8],[147.36,0.227,62,11],[147.36,0.227,65,11],[147.36,0.227,69,11],[147.814,0.409,72,31],[147.814,0.191,81,12],[148.723,0.227,64,11],[148.723,0.227,68,11],[148.723,0.227,71,11],[149.86,0.191,69,12],[150.087,0.227,57,11],[150.087,0.227,60,11],[150.087,0.227,64,11],[150.996,0.045,111,21],[151.451,0.227,57,11],[151.451,0.227,60,11],[151.451,0.227,64,11],[151.678,0.045,111,10],[152.36,0.818,81,33],[152.814,0.227,62,11],[152.814,0.227,65,11],[152.814,0.227,69,11],[154.178,0.227,64,13],[154.178,0.227,68,13],[154.178,0.227,71,13],[154.632,0.191,80,14],[155.541,0.227,57,13],[155.541,0.227,60,13],[155.541,0.227,64,13],[155.769,0.045,111,12],[156.451,0.818,77,38],[156.451,0.045,111,19],[156.678,0.191,84,14],[156.905,0.227,65,13],[156.905,0.227,69,13],[156.905,0.227,72,13],[158.269,0.227,64,13],[158.269,0.227,68,13],[158.269,0.227,71,13],[159.178,1.227,69,38],[159.632,0.227,57,13],[159.632,0.227,60,13],[159.632,0.227,64,13],[160.541,0.045,111,12],[160.996,0.227,57,15],[160.996,0.227,60,15],[160.996,0.227,64,15],[161.223,0.045,111,15],[161.451,0.191,57,17],[161.905,0.045,111,8],[162.36,0.227,57,17],[162.36,0.227,60,17],[162.36,0.227,64,17],[163.496,0.191,65,20],[163.723,0.227,62,17],[163.723,0.227,65,17],[163.723,0.227,69,17],[164.178,0.409,75,17],[165.087,0.227,64,17],[165.087,0.227,68,17],[165.087,0.227,71,17],[165.996,0.045,111,21],[166.451,0.227,57,17],[166.451,0.227,60,17],[166.451,0.227,64,17],[166.678,0.045,111,10],[167.814,0.227,65,17],[167.814,0.227,69,17],[167.814,0.227,72,17],[168.269,0.409,73,17],[168.269,0.191,72,20],[169.178,0.227,62,17],[169.178,0.227,65,17],[169.178,0.227,69,17],[170.314,0.191,64,20],[170.541,0.227,64,17],[170.541,0.227,68,17],[170.541,0.227,71,17],[170.769,0.045,111,12],[171.451,0.045,111,19],[171.905,0.227,57,15],[171.905,0.227,60,15],[171.905,0.227,64,15],[172.36,0.409,73,16],[173.269,0.227,57,15],[173.269,0.227,60,15],[173.269,0.227,64,15],[174.632,0.227,62,15],[174.632,0.227,65,15],[174.632,0.227,69,15],[175.087,0.191,65,18],[175.541,0.045,111,12],[175.996,0.227,64,15],[175.996,0.227,68,15],[175.996,0.227,71,15],[176.223,0.045,111,15],[176.905,0.818,70,16],[176.905,0.045,111,8],[177.132,0.191,64,18],[177.36,0.227,57,15],[177.36,0.227,60,15],[177.36,0.227,64,15],[178.723,0.227,65,15],[178.723,0.227,69,15],[178.723,0.227,72,15],[180.087,0.227,64,13],[180.087,0.227,68,13],[180.087,0.227,71,13],[180.087,0.409,68,14],[180.996,0.045,111,21],[181.451,0.227,57,13],[181.451,0.227,60,13],[181.451,0.227,64,13],[181.678,0.045,111,10],[181.905,0.191,57,15],[182.844,0.242,57,12],[182.844,0.242,60,12],[182.844,0.242,64,12],[184.295,0.242,65,12],[184.295,0.242,69,12],[184.295,0.242,72,12],[185.747,0.242,64,12],[185.747,0.242,68,12],[185.747,0.242,71,12],[187.198,0.242,57,12],[187.198,0.242,60,12],[187.198,0.242,64,12],[188.702,0.268,57,12],[188.702,0.268,60,12],[188.702,0.268,64,12],[190.309,0.268,65,12],[190.309,0.268,69,12],[190.309,0.268,72,12],[191.916,0.268,64,12],[191.916,0.268,68,12],[191.916,0.268,71,12],[192.988,1.607,57,28],[193.523,0.268,57,12],[193.523,0.268,60,12],[193.523,0.268,64,12],[195.984,0.158,72,15],[196.181,0.158,74,15],[197.563,0.158,56,11],[197.76,0.158,58,11],[199.142,0.158,67,11],[199.339,0.158,65,11],[199.537,0.158,76,15],[199.734,0.158,77,15],[201.116,0.158,60,11],[201.313,0.158,62,11],[202.695,0.158,63,20],[202.892,0.158,62,20],[203.089,0.158,76,27],[203.287,0.158,74,27],[204.668,0.158,63,20],[204.668,0.143,65,27],[204.847,0.143,67,27],[204.866,0.158,65,20],[206.097,0.143,60,20],[206.275,0.143,58,20],[206.454,0.143,72,27],[206.633,0.143,70,27],[207.883,0.143,69,23],[208.061,0.143,70,23],[209.311,0.143,56,17],[209.49,0.143,55,17],[209.668,0.143,69,23],[209.847,0.143,67,23],[211.097,0.143,72,23],[211.275,0.143,74,23],[212.525,0.143,56,17],[212.704,0.143,58,17],[213.892,0.13,67,25],[214.055,0.13,65,25],[214.218,0.13,76,34],[214.381,0.13,77,34],[215.522,0.13,60,25],[215.685,0.13,62,25],[216.827,0.13,63,25],[216.99,0.13,62,25],[217.153,0.13,76,34],[217.316,0.13,74,34],[218.457,0.13,63,35],[218.615,0.114,66,53],[218.62,0.13,65,35],[219.259,0.114,71,53],[219.659,0.114,76,53],[220.022,0.391,78,59],[220.426,0.5,102,108],[222.614,0.143,65,47],[222.792,0.143,67,47],[224.042,0.143,60,35],[224.221,0.143,58,35],[224.399,0.143,72,47],[224.578,0.143,70,47],[225.828,0.143,69,57],[226.006,0.143,70,57],[227.256,0.143,56,43],[227.435,0.143,55,43],[227.614,0.143,69,57],[227.792,0.143,67,57],[228.98,0.13,72,57],[229.143,0.13,74,57],[230.285,0.13,56,43],[230.447,0.13,58,43],[231.589,0.13,67,50],[231.752,0.13,65,50],[231.915,0.13,76,67],[232.078,0.13,77,67],[233.219,0.13,60,50],[233.382,0.13,62,50],[234.445,0.12,63,50],[234.595,0.12,62,50],[234.745,0.12,76,67],[234.895,0.12,74,67],[235.945,0.12,63,31],[235.945,0.12,65,42],[236.095,0.12,65,31],[236.095,0.12,67,42],[237.145,0.12,60,31],[237.295,0.12,58,31],[237.445,0.12,72,42],[237.595,0.12,70,42],[238.491,0.105,66,47],[239.083,0.105,71,47],[239.451,0.105,76,47],[239.785,0.36,78,52],[240.157,0.5,102,108],[246.002,0.04,99,43],[246.717,0.16,43,49],[246.717,0.03,99,22],[248.145,0.16,43,49],[248.145,0.03,99,22],[260.288,0.04,99,43],[261.002,0.16,48,49],[261.002,0.03,99,22],[262.431,0.16,48,49],[262.431,0.03,99,22],[266.36,0.25,61,40],[268.145,0.25,71,49],[274.574,0.04,99,43],[275.288,0.16,43,49],[275.288,0.03,99,22],[276.717,0.16,43,49],[276.717,0.03,99,22],[277.431,1.429,63,42],[288.86,0.04,99,43],[289.217,0.16,48,49],[289.217,0.03,99,22],[289.931,0.16,48,49],[289.931,0.03,99,22],[290.645,0.16,48,49],[290.645,0.03,99,22],[291.36,0.16,48,49],[291.36,0.03,99,22],[301.766,0.444,57,35],[303.155,0.444,53,35],[304.544,0.444,72,35],[305.933,0.444,74,35],[307.322,0.444,72,35],[308.155,6.333,65,16],[308.71,0.444,60,35],[310.099,0.444,53,35],[311.488,0.444,58,35],[311.488,0.055,50,8],[311.548,0.16,39,8],[312.322,0.055,50,11],[312.382,0.16,39,10],[312.599,0.444,74,10],[312.877,0.444,77,47],[313.155,0.055,50,13],[313.215,0.16,39,12],[313.215,0.14,51,7],[313.988,0.444,72,14],[313.988,0.055,50,15],[314.048,0.16,39,15],[314.048,0.14,51,9],[314.266,0.444,76,46],[314.822,0.055,50,18],[314.822,6.333,65,13],[314.882,0.16,39,17],[314.882,0.14,51,10],[315.377,0.444,60,18],[315.655,0.444,65,44],[315.655,0.03,99,8],[315.655,0.055,50,21],[315.715,0.16,39,20],[315.715,0.14,51,12],[316.488,0.03,99,9],[316.488,0.055,50,25],[316.548,0.16,39,23],[316.548,0.14,51,14],[316.766,0.444,57,23],[316.766,0.065,99,8],[317.044,0.444,60,41],[317.044,0.065,99,8],[317.322,0.03,99,11],[317.322,0.055,50,28],[317.382,0.16,39,27],[317.382,0.14,51,16],[318.155,0.444,58,29],[318.155,0.03,99,12],[318.155,0.055,50,32],[318.215,0.16,39,30],[318.215,0.14,51,18],[318.433,0.444,62,38],[318.433,0.065,99,10],[318.71,0.065,99,11],[318.988,0.03,99,13],[318.988,0.055,50,35],[319.048,0.16,39,33],[319.048,0.14,51,20],[319.544,0.444,77,34],[319.822,0.444,60,33],[319.822,0.03,99,14],[319.822,0.055,50,38],[319.882,0.16,39,36],[319.882,0.14,51,22],[320.099,0.065,99,12],[320.377,0.065,99,13],[320.655,0.03,99,16],[320.655,0.055,50,42],[320.715,0.16,39,39],[320.715,0.14,51,24],[320.933,0.444,76,39],[321.21,0.444,79,27],[321.488,0.03,99,17],[321.488,0.055,50,45],[321.488,6.333,72,15],[321.548,0.16,39,42],[321.548,0.14,51,25],[321.766,0.065,99,14],[322.044,0.065,99,15],[322.322,0.444,65,43],[322.322,0.03,99,18],[322.322,0.055,50,48],[322.382,0.16,39,45],[322.382,0.14,51,27],[322.599,0.444,69,12],[323.155,0.03,99,19],[323.155,0.055,50,50],[323.215,0.16,39,47],[323.215,0.14,51,28],[323.433,0.065,99,16],[323.71,0.444,57,28],[323.71,0.065,99,16],[323.988,0.03,99,19],[323.988,0.055,50,52],[324.048,0.16,39,49],[324.048,0.14,51,29],[324.822,0.03,99,20],[324.822,0.055,50,53],[324.882,0.16,39,50],[324.882,0.14,51,30],[325.099,0.444,62,29],[325.099,0.065,99,17],[325.377,0.065,99,17],[325.655,0.03,99,20],[325.655,0.055,50,53],[325.715,0.16,39,50],[325.715,0.14,51,30],[326.488,0.444,60,29],[326.488,0.03,99,20],[326.488,0.055,50,52],[326.548,0.16,39,49],[326.548,0.14,51,29],[326.766,0.065,99,16],[327.044,0.065,99,16],[327.322,0.03,99,19],[327.322,0.055,50,50],[327.382,0.16,39,47],[327.382,0.14,51,28],[327.599,0.444,76,10],[327.877,0.444,79,27],[328.155,0.03,99,18],[328.155,0.055,50,48],[328.215,0.16,39,45],[328.215,0.14,51,27],[328.433,0.065,99,15],[328.71,0.065,99,14],[328.988,0.444,65,16],[328.988,0.03,99,16],[328.988,0.055,50,44],[329.048,0.16,39,41],[329.048,0.14,51,25],[329.266,0.444,69,24],[329.822,0.75,81,18],[329.822,0.03,99,15],[329.822,0.055,50,39],[329.882,0.16,39,36],[329.882,0.14,51,22],[330.099,0.065,99,12],[330.377,0.444,60,22],[330.377,0.065,99,11],[330.655,0.444,65,18],[330.655,0.03,99,12],[330.655,0.055,50,33],[330.715,0.16,39,31],[330.715,0.14,51,18],[331.21,0.25,77,20],[331.488,0.03,99,10],[331.488,0.055,50,26],[331.548,0.16,39,24],[331.548,0.14,51,15],[331.766,0.444,62,26],[331.766,0.065,99,8],[332.044,0.444,65,12],[332.322,0.055,50,19],[332.382,0.16,39,17],[332.382,0.14,51,10],[333.155,0.444,60,26],[333.155,0.055,50,11],[333.215,0.16,39,9],[334.266,0.5,82,22],[334.544,0.444,79,26],[335.655,0.444,65,8],[335.933,0.444,69,25],[336.488,0.75,79,10],[337.044,0.444,57,14],[337.322,0.444,62,22],[338.155,0.75,74,15],[338.433,0.444,62,20],[338.71,0.444,65,16],[339.822,0.444,60,24],[339.822,0.5,77,20],[340.099,0.444,64,10],[341.21,0.444,79,26],[342.599,0.444,69,26],[343.988,0.444,65,17],[343.988,0.5,67,12],[344.544,0.065,99,8],[345.099,0.444,62,10],[345.377,0.444,65,15],[345.933,0.065,99,11],[346.21,0.065,99,12],[346.488,0.444,60,14],[346.766,0.444,64,12],[347.044,0.5,69,8],[347.599,0.065,99,14],[347.877,0.444,79,16],[347.877,0.065,99,15],[348.155,0.444,53,8],[348.155,1.5,69,12],[348.155,6.333,72,47],[349.266,0.444,69,18],[349.266,0.065,99,16],[349.544,0.065,99,16],[350.655,0.444,62,19],[350.933,0.065,99,17],[351.21,0.065,99,17],[352.044,0.444,65,18],[352.322,0.75,64,13],[352.599,0.065,99,16],[352.877,0.065,99,16],[353.433,0.444,64,17],[354.266,0.065,99,15],[354.544,0.444,79,8],[354.544,0.065,99,14],[354.822,0.444,53,13],[354.822,6.333,69,13],[355.933,0.444,69,10],[355.933,0.065,99,13],[356.21,0.444,72,12],[356.21,0.065,99,12],[357.322,0.444,65,12],[357.599,0.444,69,10],[357.599,0.065,99,11],[357.877,0.065,99,10],[358.71,0.444,65,13],[358.988,0.444,70,8],[359.266,0.065,99,8],[359.544,0.065,99,8],[360.099,0.444,64,14],[361.488,0.444,53,15],[362.877,0.444,72,15],[364.266,0.444,65,13],[365.655,0.444,70,23],[367.044,0.444,67,19],[368.433,0.444,57,16],[369.822,0.444,53,12],[371.21,0.444,72,12],[372.599,0.444,74,8],[375.822,4.071,60,8],[376.607,0.321,67,25],[378.366,0.7,64,12],[378.393,0.321,64,27],[379.839,0.204,60,15],[380.107,0.321,57,28],[381.964,0.321,64,28],[383.75,0.321,60,30],[384.393,4.071,60,12],[385.197,0.7,60,15],[385.464,0.321,53,31],[385.866,0.7,67,28],[387.322,0.321,60,51],[388.679,4.071,62,21],[389.107,0.321,59,53],[390.822,0.321,60,49],[391.625,0.7,64,45],[392.107,0.161,62,34],[392.964,3.931,67,50],[393.352,0.7,72,67],[393.723,0.31,79,41],[395.447,0.31,76,55],[395.809,0.035,117,10],[396.327,0.035,117,11],[396.844,0.197,72,31],[397.102,0.31,69,58],[397.102,3.931,64,45],[397.361,0.197,69,32],[398.895,0.31,76,58],[398.913,0.7,79,17],[399.559,0.7,74,33],[400.62,0.31,72,61],[400.982,0.035,117,13],[401.24,3.931,60,10],[401.499,0.035,117,12],[402.275,0.31,65,64],[402.275,0.197,69,36],[404.068,0.31,72,68],[405.378,3.931,59,20],[405.637,0.035,117,11],[405.792,0.31,71,72],[406.154,0.7,74,17],[406.154,0.035,117,15],[406.671,0.035,117,11],[406.801,0.7,83,32],[407.188,0.197,74,40],[407.447,0.31,72,66],[408.688,0.155,62,46],[409.516,3.8,64,18],[410.249,0.3,91,48],[410.766,0.035,117,10],[411.266,0.035,117,12],[411.766,0.035,117,7],[411.916,0.3,88,61],[412.266,0.7,88,11],[413.266,0.19,84,34],[413.516,0.3,81,64],[413.516,3.8,60,59],[413.766,0.19,81,36],[413.891,0.7,88,68],[415.249,0.3,88,64],[415.696,0.4,96,7],[415.766,0.035,117,11],[416.266,0.035,117,14],[416.766,0.035,117,8],[416.916,0.3,84,67],[417.516,3.8,57,50],[418.516,0.3,77,71],[418.516,0.19,81,40],[419.266,0.7,91,40],[419.696,0.4,93,12],[419.891,0.7,89,68],[419.926,0.52,95,8],[420.249,0.3,84,84],[420.766,0.035,117,13],[421.266,0.035,117,15],[421.516,3.8,55,13],[421.516,3.8,59,21],[421.766,0.035,117,9],[421.916,0.3,83,88],[423.266,0.19,86,49],[423.516,0.3,84,81],[424.716,0.15,74,57],[425.516,3.677,60,32],[425.516,0.027,117,22],[425.758,0.045,117,53],[426,0.027,117,40],[426.226,0.29,103,52],[426.242,0.045,117,64],[426.484,0.027,117,36],[426.726,0.045,117,41],[426.847,0.7,100,47],[426.968,0.027,117,12],[427.839,0.29,100,55],[429.145,0.184,96,31],[429.387,0.29,93,58],[429.387,3.677,57,42],[429.629,0.184,93,32],[430.355,0.027,117,14],[430.597,0.045,117,46],[430.839,0.027,117,40],[431.065,0.29,100,58],[431.081,0.045,117,72],[431.323,0.027,117,47],[431.565,0.045,117,61],[431.806,0.027,117,25],[432.048,0.045,117,13],[432.677,0.29,96,61],[433.258,3.677,53,48],[433.621,0.7,96,48],[434.226,0.29,89,55],[434.226,0.184,93,31],[435.435,0.045,117,36],[435.677,0.027,117,39],[435.903,0.29,96,58],[435.919,0.045,117,78],[436.161,0.027,117,53],[436.403,0.045,117,78],[436.645,0.027,117,38],[436.887,0.045,117,35],[437.129,3.677,55,42],[437.516,0.29,95,60],[438.823,0.184,96,34],[439.065,0.29,96,56],[439.306,0.218,64,79],[439.427,0.7,100,52],[441,0.03,99,61],[441,0.055,50,163],[441,3.8,69,18],[441,0.46,62,66],[441.06,0.16,39,137],[441.06,0.14,51,82],[441.4,0.3,66,8],[441.5,0.11,98,22],[441.5,0.095,54,25],[442,0.055,50,8],[442.75,0.23,64,67],[443,0.46,66,67],[443.5,0.46,64,67],[444,0.92,62,67],[445,3.8,66,12],[447.733,0.3,66,34],[448.4,0.3,62,34],[449,0.3,55,36],[449,3.8,62,21],[449.733,0.3,62,36],[449.75,0.7,62,10],[450,0.3,55,36],[450.375,0.7,69,18],[450.733,0.3,62,36],[451.375,0.7,67,18],[451.4,0.3,59,38],[452,0.3,55,38],[453,3.8,64,25],[454.75,0.23,69,91],[455,0.46,66,91],[455.5,0.46,64,91],[456,0.92,62,91],[457,3.8,69,15],[457,0.46,62,70],[460.4,0.3,66,33],[461,0.3,59,34],[461,3.8,66,8],[461.733,0.3,66,34],[461.75,0.7,66,9],[462.733,0.3,66,34],[462.75,0.7,69,9],[463.375,0.7,64,17],[463.4,0.3,62,36],[464,0.3,59,36],[464.733,0.3,66,36],[465,3.8,59,15],[467.25,0.276,55,29],[467.5,0.23,66,87],[467.75,0.23,64,87],[467.75,0.138,54,29],[468,0.92,62,87],[468,0.138,52,29],[468.25,0.552,50,29],[469,3.8,61,24],[469,0.46,64,146],[469.5,0.23,66,146],[472.4,0.3,66,54],[473,0.295,62,43],[473,3.738,66,19],[473.721,0.295,69,43],[473.738,0.7,62,11],[474.377,0.295,66,43],[474.721,0.7,66,11],[475.336,0.7,66,22],[475.361,0.295,66,46],[475.459,0.027,117,20],[475.705,0.045,117,52],[475.951,0.295,62,46],[475.951,0.027,117,41],[476.197,0.045,117,69],[476.443,0.027,117,39],[476.672,0.295,69,46],[476.688,0.045,117,46],[476.934,3.738,62,17],[476.934,0.027,117,16],[477.303,0.7,66,24],[479.885,0.905,59,120],[480.377,0.027,117,16],[480.623,0.045,117,51],[480.869,3.738,59,10],[480.869,0.453,62,133],[480.869,0.027,117,46],[481.115,0.045,117,80],[481.361,0.453,67,133],[481.361,0.027,117,48],[481.606,0.045,117,61],[481.852,0.226,69,133],[481.852,0.027,117,23],[482.098,0.226,71,133],[482.098,0.045,117,7],[483.082,0.272,55,41],[483.574,0.136,54,41],[483.82,0.136,52,41],[484.066,0.543,50,41],[484.803,0.295,57,59],[484.803,3.738,57,15],[485.295,0.027,117,12],[485.525,0.295,64,59],[485.541,0.7,64,16],[485.541,0.045,117,50],[485.787,0.027,117,47],[486.033,0.045,117,86],[486.18,0.295,61,59],[486.279,0.027,117,55],[486.525,0.7,73,16],[486.525,0.045,117,74],[486.771,0.295,62,54],[486.771,0.027,117,29],[487.016,0.045,117,18],[487.508,0.7,66,16],[487.754,0.295,62,54],[488.475,0.295,69,54],[488.738,3.677,62,18],[489.101,0.7,62,23],[489.125,0.29,66,45],[489.705,0.29,62,45],[490.068,0.7,66,23],[490.431,0.223,64,11],[490.431,0.045,117,34],[490.673,0.03,99,10],[490.673,0.055,50,27],[490.673,0.445,78,16],[490.673,0.027,117,37],[490.733,0.16,39,28],[490.733,0.14,51,17],[490.915,0.045,117,71],[491.157,0.445,76,30],[491.157,0.027,117,44],[491.399,0.045,117,53],[491.641,0.03,99,32],[491.641,0.055,50,85],[491.641,0.89,74,50],[491.641,0.027,117,16],[491.701,0.16,39,84],[491.701,0.14,51,50],[492.609,0.03,99,65],[492.609,0.055,50,173],[492.609,3.677,59,10],[492.609,0.445,66,66],[492.669,0.16,39,167],[492.669,0.14,51,100],[493.092,0.223,69,20],[493.576,0.03,99,72],[493.576,0.055,50,193],[493.636,0.16,39,177],[493.636,0.14,51,106],[493.964,0.29,62,35],[494.06,0.027,117,32],[494.302,0.7,69,13],[494.302,0.045,117,75],[494.544,0.29,59,54],[494.544,0.055,50,11],[494.544,0.027,117,43],[494.786,0.045,117,22],[494.907,0.7,76,12],[494.931,0.29,62,46],[495.27,0.203,47,63],[495.512,0.203,47,71],[495.754,0.534,59,11],[495.996,0.11,98,79],[495.996,0.095,54,89],[496.238,0.203,47,18],[496.48,3.677,55,55],[496.48,0.445,62,135],[496.48,0.027,117,37],[496.722,0.045,117,84],[496.964,0.11,98,26],[496.964,0.095,54,29],[496.964,0.445,67,36],[496.964,0.027,117,27],[497.189,0.29,62,13],[497.447,0.29,55,34],[497.447,0.03,99,68],[497.447,0.055,50,181],[497.507,0.16,39,187],[497.507,0.14,51,112],[497.81,0.7,69,20],[498.157,0.29,62,15],[498.415,0.203,43,20],[498.415,0.445,79,56],[498.415,0.027,117,39],[498.657,0.045,117,85],[498.899,0.11,98,23],[498.899,0.095,54,25],[498.899,0.223,78,155],[498.899,0.027,117,12],[499.141,0.203,43,34],[499.141,0.223,76,96],[499.77,0.29,59,11],[500.092,0.29,62,31],[500.109,0.045,117,61],[500.351,0.03,99,92],[500.351,0.055,50,246],[500.351,3.677,64,80],[500.351,0.445,64,13],[500.351,0.027,117,54],[500.411,0.16,39,223],[500.411,0.14,51,134],[500.834,0.223,66,171],[501.076,0.203,45,49],[501.076,0.223,69,95],[501.318,0.203,45,56],[501.56,0.045,117,18],[501.705,0.29,61,46],[501.802,0.11,98,112],[501.802,0.095,54,126],[501.802,0.027,117,58],[502.028,0.29,64,44],[502.044,0.045,117,39],[502.286,0.03,99,51],[502.286,0.055,50,135],[502.286,0.445,78,103],[502.346,0.16,39,162],[502.346,0.14,51,97],[502.77,0.445,76,113],[503.012,0.203,50,11],[503.012,0.267,64,35],[503.254,0.203,50,48],[503.254,0.027,117,52],[503.496,0.045,117,47],[503.641,0.29,66,23],[503.738,0.11,98,112],[503.738,0.095,54,126],[503.964,0.29,69,34],[504.222,0.055,50,13],[504.222,3.677,69,35],[504.222,0.445,62,9],[504.282,0.16,39,50],[504.282,0.14,51,30],[504.705,0.223,66,120],[504.705,0.027,117,40],[504.931,0.29,69,32],[504.947,0.045,117,41],[505.189,0.29,62,19],[505.189,0.203,50,24],[505.552,0.7,66,16],[505.673,0.11,98,68],[505.673,0.095,54,77],[505.915,0.223,64,22],[506.157,0.445,78,112],[506.157,0.027,117,40],[506.399,0.045,117,52],[506.641,0.445,76,38],[506.867,0.29,69,18],[507.125,0.03,99,10],[507.125,0.055,50,27],[507.609,0.027,117,29],[507.851,0.203,50,32],[507.851,0.045,117,68],[508.092,3.677,59,55],[508.092,0.445,66,143],[508.802,0.29,66,27],[508.818,0.7,66,8],[509.06,0.03,99,76],[509.06,0.055,50,203],[509.12,0.16,39,186],[509.12,0.14,51,112],[509.302,0.045,117,64],[509.423,0.7,69,17],[509.447,0.29,62,14],[509.544,0.027,117,42],[509.786,0.203,47,28],[510.028,0.203,47,49],[510.028,0.668,76,138],[510.27,0.401,64,12],[510.512,0.11,98,93],[510.512,0.095,54,105],[510.996,0.134,62,22],[510.996,0.027,117,23],[511.238,0.534,59,7],[511.238,0.045,117,80],[511.383,0.29,62,40],[511.48,0.027,117,35],[511.705,0.29,66,30],[511.722,0.03,99,61],[511.722,0.055,50,163],[511.782,0.16,39,168],[511.782,0.14,51,101],[511.964,0.29,55,8],[511.964,0.03,99,83],[511.964,0.055,50,221],[511.964,3.677,59,24],[511.964,3.677,62,14],[512.024,0.16,39,211],[512.024,0.14,51,126],[512.326,0.7,62,18],[512.447,0.445,67,114],[512.931,0.203,43,7],[512.931,0.223,69,157],[513.173,0.223,71,134],[513.173,0.045,117,46],[513.415,0.445,69,92],[513.415,0.027,117,52],[513.657,0.203,43,52],[513.657,0.045,117,72],[513.899,0.203,43,55],[513.899,0.027,117,17],[514.383,0.11,98,80],[514.383,0.095,54,89],[514.609,0.29,62,38],[514.625,0.7,79,10],[514.625,0.203,43,29],[514.867,0.29,55,43],[514.867,0.203,43,15],[515.351,0.11,98,116],[515.351,0.095,54,130],[515.576,0.29,62,41],[515.835,3.677,64,71],[516.076,0.045,117,53],[516.197,0.7,64,16],[516.222,0.29,61,31],[516.318,0.11,98,78],[516.318,0.095,54,88],[516.318,0.027,117,53],[516.56,0.045,117,92],[516.802,0.29,57,20],[516.802,0.027,117,49],[517.044,0.045,117,46],[517.286,0.11,98,32],[517.286,0.095,54,36],[517.528,0.223,69,170],[517.77,0.445,78,172],[518.254,0.095,54,7],[518.254,0.445,76,173],[518.738,0.89,74,173],[519.705,3.738,69,30],[519.705,0.453,62,121],[520.443,0.045,117,28],[520.689,0.027,117,30],[520.935,0.045,117,61],[521.181,0.027,117,41],[521.427,0.045,117,59],[521.673,0.027,117,30],[521.918,0.045,117,25],[522.394,0.295,69,40],[523.05,0.295,66,40],[523.64,0.295,59,42],[523.64,3.738,62,29],[524.361,0.295,66,42],[524.378,0.7,66,11],[525.345,0.295,66,42],[525.361,0.7,69,11],[525.361,0.045,117,23],[525.607,0.027,117,31],[525.853,0.045,117,68],[525.976,0.7,64,21],[526,0.295,62,44],[526.099,0.027,117,48],[526.345,0.045,117,73],[526.591,0.295,59,44],[526.591,0.136,50,32],[526.591,0.027,117,38],[526.837,0.543,47,32],[526.837,0.045,117,37],[527.574,3.738,59,58],[530.033,0.226,66,120],[530.279,0.226,64,120],[530.279,0.045,117,16],[530.525,0.905,62,120],[530.525,0.027,117,29],[530.771,0.045,117,69],[531.017,0.027,117,52],[531.263,0.045,117,83],[531.509,3.738,61,76],[531.509,0.453,64,132],[531.509,0.027,117,47],[531.755,0.045,117,52],[532,0.226,66,132],[532,0.027,117,13],[532.246,0.226,69,132],[534.853,0.295,66,47],[535.443,0.305,62,37],[535.443,3.864,66,51],[536.189,0.305,69,37],[536.867,0.305,66,37],[537.858,0.7,66,19],[537.884,0.305,66,40],[538.494,0.305,62,40],[539.24,0.305,69,40],[539.511,3.864,62,35],[539.892,0.7,66,21],[542.308,0.234,62,109],[542.562,0.936,59,109],[543.579,3.864,55,31],[543.579,0.468,62,120],[544.087,0.468,67,120],[544.596,0.234,69,120],[547.646,0.305,57,51],[547.646,4.068,66,55],[547.646,3.864,57,64],[548.392,0.305,64,51],[549.07,0.305,61,51],[549.68,0.305,62,47],[550.087,0.305,66,47],[550.697,0.305,62,47],[551.443,0.305,69,47],[554.996,0.193,74,33],[556.133,0.58,83,33],[557.042,0.773,79,33],[562.269,0.193,74,33],[563.405,0.58,83,33],[564.314,0.773,79,24],[568.86,0.58,59,16],[569.542,0.193,59,22],[569.769,0.773,59,22],[570.678,0.58,59,22],[571.36,0.193,59,22],[571.587,0.773,59,22],[572.496,0.58,59,22],[573.178,0.193,59,16],[573.405,0.773,59,16],[574.314,0.58,59,16],[574.996,0.193,59,16],[575.223,0.773,59,16],[576.133,0.58,59,16],[576.814,0.193,59,16],[577.042,0.773,59,24],[577.951,0.58,59,24],[578.633,0.193,59,24],[578.86,0.773,59,24],[579.769,0.58,59,24],[580.451,0.193,59,24],[580.678,0.773,59,24],[581.587,0.58,59,29],[582.269,0.193,59,29],[582.496,0.773,59,29],[584.087,0.193,74,48],[585.223,0.58,83,48],[586.133,0.773,79,45],[590.678,0.159,71,54],[592.437,4.385,64,24],[592.87,0.7,72,11],[592.899,0.346,76,23],[594.745,0.346,72,24],[595.61,0.035,117,9],[595.899,0.27,48,13],[595.899,0.055,50,15],[595.958,0.16,39,15],[595.958,0.14,51,9],[596.187,0.035,117,10],[596.36,0.346,76,10],[596.745,0.346,79,20],[596.764,0.219,72,11],[597.052,0.27,48,27],[597.052,0.03,83,10],[597.052,0.03,99,12],[597.052,0.055,50,31],[597.052,4.385,57,8],[597.072,0.31,42,14],[597.112,0.16,39,30],[597.112,0.14,51,18],[597.341,0.219,69,10],[598.206,0.346,69,23],[598.206,0.219,72,13],[598.206,0.27,48,40],[598.206,0.03,83,14],[598.206,0.03,99,17],[598.206,0.055,50,46],[598.226,0.31,42,20],[598.266,0.16,39,44],[598.266,0.14,51,26],[598.639,0.7,79,12],[599.36,0.27,48,44],[599.36,0.03,83,16],[599.36,0.03,99,18],[599.36,0.055,50,48],[599.38,0.31,42,22],[599.42,0.16,39,45],[599.42,0.14,51,27],[599.649,0.035,117,12],[599.822,0.346,72,13],[600.206,0.346,76,19],[600.226,0.035,117,8],[600.514,0.27,48,25],[600.514,0.03,83,9],[600.514,0.03,99,10],[600.514,0.055,50,27],[600.534,0.31,42,12],[600.574,0.16,39,24],[600.574,0.14,51,14],[601.668,0.346,65,27],[601.668,4.385,60,25],[602.101,0.277,48,14],[602.822,0.277,41,24],[603.11,0.035,117,12],[603.254,0.7,79,14],[603.283,0.346,69,28],[603.514,0.27,64,34],[603.514,0.03,83,12],[603.534,0.31,57,17],[603.687,0.277,40,27],[603.687,0.035,117,7],[603.976,0.277,41,35],[604.408,0.277,48,30],[604.552,0.07,98,17],[604.668,0.27,64,26],[604.668,0.03,83,9],[604.688,0.31,57,13],[604.822,0.346,72,23],[605.129,0.346,65,13],[605.129,0.277,41,16],[605.706,0.07,98,25],[606.283,4.385,59,29],[606.572,0.035,117,12],[606.745,0.346,71,28],[606.86,0.07,98,23],[606.976,0.27,64,31],[606.976,0.03,83,11],[606.995,0.31,57,16],[607.149,0.035,117,12],[607.437,0.219,71,12],[607.87,0.7,83,12],[608.014,0.07,98,15],[608.283,0.346,74,27],[608.302,0.219,74,15],[608.591,0.346,72,11],[609.976,0.173,62,20],[610.899,4.56,60,23],[611.779,0.36,79,27],[612.549,0.7,76,13],[612.979,0.36,79,27],[614.179,0.36,79,28],[615.379,0.36,79,28],[615.699,4.56,57,23],[616.579,0.36,76,30],[617.779,0.36,76,30],[618.399,0.228,69,18],[618.979,0.36,76,32],[618.999,0.7,74,8],[620.179,0.36,76,32],[620.499,4.56,53,9],[620.949,0.7,72,17],[624.099,0.228,69,20],[625.299,4.56,62,15],[627.399,0.7,83,10],[628.149,0.7,76,18],[629.859,0.18,67,24],[630.099,4.75,67,15],[630.599,0.375,76,24],[631.817,0.7,76,12],[631.849,0.375,76,24],[633.099,0.375,76,25],[634.349,0.375,76,25],[635.099,4.75,64,15],[635.599,0.375,72,27],[636.849,0.375,72,27],[638.099,0.375,72,28],[639.349,0.375,72,28],[640.099,4.75,60,9],[640.567,0.7,72,15],[640.599,0.375,69,30],[641.849,0.375,69,30],[643.099,0.375,69,31],[644.349,0.375,69,31],[645.099,4.75,59,13],[645.599,0.375,71,32],[646.849,0.375,71,32],[648.067,0.7,76,16],[648.099,0.375,76,30],[649.099,0.188,62,21],[651.035,0.383,79,22],[652.311,0.383,79,22],[653.13,0.7,76,11],[653.588,0.383,79,24],[654.865,0.383,79,24],[656.141,0.383,76,25],[657.418,0.383,76,25],[658.694,0.383,76,26],[659.971,0.383,76,23],[661.247,0.383,72,24],[662.067,0.7,79,12],[662.524,0.383,72,24],[663.801,0.383,72,25],[665.077,0.383,72,25],[666.354,0.383,74,26],[667.63,0.383,74,26],[668.907,0.383,79,24],[670.269,0.192,67,17],[690.35,0.196,62,16],[729.612,2.4,72,43]],[[1.1,0.27,64,34],[1.1,0.03,83,12],[1.12,0.31,57,17],[3.3,0.27,64,34],[3.3,0.03,83,12],[3.32,0.31,57,17],[5.5,0.27,64,34],[5.5,0.03,83,12],[5.52,0.31,57,17],[7.7,0.27,64,34],[7.7,0.03,83,12],[7.72,0.31,57,17],[9.9,0.27,64,34],[9.9,0.03,83,12],[9.92,0.31,57,17],[12.1,0.27,64,34],[12.1,0.03,83,12],[12.12,0.31,57,17],[14.3,0.27,64,34],[14.3,0.03,83,12],[14.32,0.31,57,17],[16.5,0.27,64,34],[16.5,0.03,83,12],[16.52,0.31,57,17],[18.7,0.27,64,34],[18.7,0.03,83,12],[18.72,0.31,57,17],[20.9,0.27,64,34],[20.9,0.03,83,12],[20.92,0.31,57,17],[23.1,0.27,64,34],[23.1,0.03,83,12],[23.12,0.31,57,17],[25.3,0.27,64,34],[25.3,0.03,83,12],[25.32,0.31,57,17],[27.5,0.27,64,34],[27.5,0.03,83,12],[27.52,0.31,57,17],[29.7,0.27,64,34],[29.7,0.03,83,12],[29.72,0.31,57,17],[31.9,0.27,64,34],[31.9,0.03,83,12],[31.92,0.31,57,17],[33.95,0.27,64,34],[33.95,0.03,83,12],[33.97,0.31,57,17],[34.425,0.427,79,169],[35.85,0.27,64,34],[35.85,0.03,83,12],[35.87,0.31,57,17],[37.75,0.27,64,34],[37.75,0.03,83,12],[37.77,0.31,57,17],[38.7,1.71,72,199],[39.65,0.27,64,34],[39.65,0.03,83,12],[39.67,0.31,57,17],[41.55,0.27,64,34],[41.55,0.03,83,12],[41.57,0.31,57,17],[43.24,0.27,64,34],[43.24,0.03,83,12],[43.26,0.31,57,17],[44.72,0.27,64,34],[44.72,0.03,83,12],[44.74,0.31,57,17],[45.09,0.333,74,199],[46.2,0.27,64,34],[46.2,0.03,83,12],[46.22,0.31,57,17],[47.68,0.27,64,34],[47.68,0.03,83,12],[47.7,0.31,57,17],[49.16,0.27,64,34],[49.16,0.03,83,12],[49.18,0.31,57,17],[50.46,0.252,76,199],[50.46,0.27,64,34],[50.46,0.03,83,12],[50.48,0.31,57,17],[51.58,0.27,64,34],[51.58,0.03,83,12],[51.6,0.31,57,17],[52.7,0.504,74,199],[52.7,0.27,64,34],[52.7,0.03,83,12],[52.72,0.31,57,17],[53.82,0.27,64,34],[53.82,0.03,83,12],[53.84,0.31,57,17],[54.94,0.27,64,34],[54.94,0.03,83,12],[54.96,0.31,57,17],[55.94,0.27,64,34],[55.94,0.03,83,12],[55.96,0.31,57,17],[56.38,0.594,76,199],[56.82,0.27,64,34],[56.82,0.03,83,12],[56.84,0.31,57,17],[57.7,0.27,64,34],[57.7,0.03,83,12],[57.72,0.31,57,17],[58.58,0.27,64,34],[58.58,0.03,83,12],[58.6,0.31,57,17],[59.46,0.27,64,34],[59.46,0.03,83,12],[59.48,0.31,57,17],[59.94,0.15,64,173],[60.34,0.27,64,34],[60.34,0.03,83,12],[60.36,0.31,57,17],[61.02,0.27,64,25],[61.02,0.03,83,9],[61.04,0.31,57,13],[61.14,0.27,64,21],[61.14,0.03,83,7],[61.16,0.31,57,11],[62.22,0.27,64,25],[62.22,0.03,83,9],[62.24,0.31,57,13],[63.42,0.27,64,25],[63.42,0.03,83,9],[63.44,0.31,57,13],[63.54,0.27,64,22],[63.54,0.03,83,8],[63.56,0.31,57,11],[64.62,0.27,64,25],[64.62,0.03,83,9],[64.64,0.31,57,13],[65.82,0.27,64,25],[65.82,0.03,83,9],[65.84,0.31,57,13],[65.94,0.27,64,24],[65.94,0.03,83,8],[65.96,0.31,57,12],[67.02,0.27,64,25],[67.02,0.03,83,9],[67.04,0.31,57,13],[68.22,0.27,64,25],[68.22,0.03,83,9],[68.24,0.31,57,13],[68.34,0.27,64,25],[68.34,0.03,83,9],[68.36,0.31,57,13],[69.42,0.27,64,25],[69.42,0.03,83,9],[69.44,0.31,57,13],[70.62,0.27,64,25],[70.62,0.03,83,9],[70.64,0.31,57,13],[70.74,0.27,64,26],[70.74,0.03,83,9],[70.76,0.31,57,13],[71.82,0.27,64,25],[71.82,0.03,83,9],[71.84,0.31,57,13],[73.02,0.27,64,25],[73.02,0.03,83,9],[73.04,0.31,57,13],[73.14,0.27,64,27],[73.14,0.03,83,10],[73.16,0.31,57,14],[74.22,0.27,64,25],[74.22,0.03,83,9],[74.24,0.31,57,13],[75.42,0.27,64,25],[75.42,0.03,83,9],[75.44,0.31,57,13],[75.54,0.27,64,29],[75.54,0.03,83,10],[75.56,0.31,57,14],[76.62,0.27,64,25],[76.62,0.03,83,9],[76.64,0.31,57,13],[77.82,0.27,64,25],[77.82,0.03,83,9],[77.84,0.31,57,13],[78.9,0.18,64,22],[79.02,0.27,64,25],[79.02,0.03,83,9],[79.04,0.31,57,13],[80.208,0.27,64,25],[80.208,0.03,83,9],[80.228,0.31,57,13],[80.326,0.27,64,24],[80.326,0.03,83,8],[80.346,0.31,57,12],[81.385,0.27,64,25],[81.385,0.03,83,9],[81.405,0.31,57,13],[82.561,0.27,64,25],[82.561,0.03,83,9],[82.581,0.31,57,13],[82.679,0.27,64,26],[82.679,0.03,83,9],[82.699,0.31,57,13],[83.149,0.224,76,17],[83.738,0.27,64,25],[83.738,0.03,83,9],[83.758,0.31,57,13],[84.914,0.27,64,25],[84.914,0.03,83,9],[84.934,0.31,57,13],[85.032,0.27,64,27],[85.032,0.03,83,10],[85.052,0.31,57,14],[86.091,0.27,64,25],[86.091,0.03,83,9],[86.111,0.31,57,13],[87.267,0.27,64,25],[87.267,0.03,83,9],[87.287,0.31,57,13],[87.385,0.27,64,29],[87.385,0.03,83,10],[87.405,0.31,57,14],[88.444,0.27,64,25],[88.444,0.03,83,9],[88.463,0.31,57,13],[88.738,0.224,76,13],[89.502,0.353,69,25],[89.62,0.27,64,25],[89.62,0.03,83,9],[89.64,0.31,57,13],[89.738,0.27,64,30],[89.738,0.03,83,11],[89.758,0.31,57,15],[90.208,0.353,65,25],[90.796,0.27,64,25],[90.796,0.03,83,9],[90.817,0.31,57,13],[91.071,0.353,72,25],[91.855,0.353,69,26],[91.973,0.27,64,25],[91.973,0.03,83,9],[91.993,0.31,57,13],[92.091,0.27,64,32],[92.091,0.03,83,11],[92.111,0.31,57,16],[92.561,0.353,65,26],[93.149,0.27,64,25],[93.149,0.03,83,9],[93.169,0.31,57,13],[93.424,0.353,72,26],[94.208,0.353,71,47],[94.326,0.27,64,25],[94.326,0.03,83,9],[94.346,0.31,57,13],[94.444,0.27,64,33],[94.444,0.03,83,11],[94.463,0.31,57,16],[94.914,0.353,67,47],[95.502,0.27,64,25],[95.502,0.03,83,9],[95.522,0.31,57,13],[95.777,0.353,74,47],[96.561,0.353,76,44],[96.679,0.27,64,25],[96.679,0.03,83,9],[96.699,0.31,57,13],[97.738,0.176,64,31],[97.855,0.27,64,25],[97.855,0.03,83,9],[97.875,0.31,57,13],[98.876,0.7,72,19],[99.02,0.07,98,19],[99.136,0.27,64,27],[99.136,0.03,83,10],[99.156,0.31,57,14],[100.174,0.07,98,19],[101.328,0.07,98,21],[101.444,0.27,64,29],[101.444,0.03,83,10],[101.463,0.31,57,14],[101.617,0.035,117,7],[101.905,0.219,76,11],[102.194,0.035,117,11],[102.482,0.07,98,21],[103.636,0.07,98,22],[103.751,0.27,64,30],[103.751,0.03,83,11],[103.771,0.31,57,15],[104.79,0.07,98,22],[105.799,0.7,74,16],[105.944,0.07,98,23],[106.059,0.27,64,32],[106.059,0.03,83,11],[106.079,0.31,57,16],[106.809,0.035,117,11],[107.097,0.07,98,23],[107.386,0.219,76,19],[107.386,0.035,117,12],[107.674,0.346,65,36],[107.963,0.219,72,20],[108.251,0.07,98,24],[108.367,0.27,64,34],[108.367,0.03,83,12],[108.387,0.31,57,17],[108.52,0.346,72,36],[109.29,0.346,69,36],[109.405,0.07,98,24],[109.982,0.346,65,38],[110.559,0.07,98,25],[110.674,0.27,64,35],[110.674,0.03,83,12],[110.694,0.31,57,18],[110.828,0.346,72,38],[111.597,0.346,69,27],[111.713,0.07,98,25],[112.001,0.035,117,13],[112.29,0.346,67,29],[112.578,0.035,117,11],[112.867,0.07,98,26],[112.982,0.27,64,37],[112.982,0.03,83,13],[113.002,0.31,57,19],[113.136,0.346,74,29],[113.444,0.219,71,16],[113.876,0.7,83,14],[113.905,0.346,71,29],[114.02,0.07,98,26],[114.597,0.346,72,27],[115.174,0.27,64,25],[115.174,0.03,83,9],[115.194,0.31,57,13],[115.444,0.346,79,27],[116.213,0.173,64,19],[116.328,0.27,64,25],[116.328,0.03,83,9],[116.348,0.31,57,13],[117.36,0.27,64,30],[117.36,0.03,83,10],[117.38,0.31,57,15],[119.178,0.27,64,30],[119.178,0.03,83,10],[119.198,0.31,57,15],[120.087,0.27,64,30],[120.087,0.03,83,10],[120.107,0.31,57,15],[121.905,0.27,64,30],[121.905,0.03,83,10],[121.925,0.31,57,15],[122.814,0.27,64,30],[122.814,0.03,83,10],[122.834,0.31,57,15],[124.632,0.27,64,30],[124.632,0.03,83,10],[124.652,0.31,57,15],[125.541,0.27,64,30],[125.541,0.03,83,10],[125.561,0.31,57,15],[127.36,0.27,64,30],[127.36,0.03,83,10],[127.38,0.31,57,15],[128.269,0.27,64,30],[128.269,0.03,83,10],[128.289,0.31,57,15],[130.087,0.27,64,30],[130.087,0.03,83,10],[130.107,0.31,57,15],[130.996,0.27,64,30],[130.996,0.03,83,10],[131.016,0.31,57,15],[132.814,0.27,64,30],[132.814,0.03,83,10],[132.834,0.31,57,15],[133.723,0.27,64,30],[133.723,0.03,83,10],[133.743,0.31,57,15],[135.542,0.27,64,30],[135.542,0.03,83,10],[135.561,0.31,57,15],[136.451,0.27,64,30],[136.451,0.03,83,10],[136.471,0.31,57,15],[138.269,0.27,64,30],[138.269,0.03,83,10],[138.289,0.31,57,15],[139.178,0.27,64,30],[139.178,0.03,83,10],[139.198,0.31,57,15],[139.632,0.191,76,10],[140.087,1.227,76,26],[140.996,0.27,64,30],[140.996,0.03,83,10],[141.016,0.31,57,15],[141.451,0.045,111,10],[141.678,0.191,74,10],[141.905,0.27,64,30],[141.905,0.03,83,10],[141.925,0.31,57,15],[142.132,0.045,111,15],[142.814,0.045,111,11],[143.723,0.27,64,30],[143.723,0.03,83,10],[143.743,0.31,57,15],[144.632,0.27,64,30],[144.632,0.03,83,10],[144.652,0.31,57,15],[145.087,0.409,76,31],[146.451,0.191,81,12],[146.451,0.27,64,30],[146.451,0.03,83,10],[146.471,0.31,57,15],[146.905,0.045,111,20],[147.36,0.27,64,30],[147.36,0.03,83,10],[147.38,0.31,57,15],[147.587,0.045,111,12],[148.269,1.227,71,31],[148.496,0.191,83,12],[149.178,0.27,64,30],[149.178,0.03,83,10],[149.198,0.31,57,15],[150.087,0.27,64,30],[150.087,0.03,83,10],[150.107,0.31,57,15],[151.678,0.045,111,11],[151.905,0.27,64,30],[151.905,0.03,83,10],[151.925,0.31,57,15],[152.36,0.045,111,21],[152.814,0.27,64,30],[152.814,0.03,83,10],[152.834,0.31,57,15],[153.269,0.409,79,33],[153.269,0.191,74,12],[154.632,0.27,64,30],[154.632,0.03,83,10],[154.652,0.31,57,15],[155.314,0.191,72,14],[155.542,0.27,64,30],[155.542,0.03,83,10],[155.561,0.31,57,15],[156.451,0.045,111,10],[157.132,0.045,111,15],[157.36,0.409,76,38],[157.36,0.27,64,30],[157.36,0.03,83,10],[157.38,0.31,57,15],[157.814,0.045,111,11],[158.269,0.27,64,30],[158.269,0.03,83,10],[158.289,0.31,57,15],[160.087,0.191,76,14],[160.087,0.27,64,30],[160.087,0.03,83,10],[160.107,0.31,57,15],[160.541,0.818,73,14],[160.996,0.27,64,30],[160.996,0.03,83,10],[161.016,0.31,57,15],[161.905,0.045,111,20],[162.132,0.191,57,17],[162.587,0.045,111,12],[162.814,0.27,64,30],[162.814,0.03,83,10],[162.834,0.31,57,15],[163.723,0.27,64,30],[163.723,0.03,83,10],[163.743,0.31,57,15],[164.632,1.227,73,17],[165.542,0.27,64,30],[165.542,0.03,83,10],[165.561,0.31,57,15],[166.451,0.27,64,30],[166.451,0.03,83,10],[166.471,0.31,57,15],[166.678,0.045,111,11],[166.905,0.191,60,20],[167.36,0.045,111,21],[168.269,0.27,64,30],[168.269,0.03,83,10],[168.289,0.31,57,15],[168.723,0.818,70,17],[168.951,0.191,69,20],[169.178,0.27,64,30],[169.178,0.03,83,10],[169.198,0.31,57,15],[170.996,0.27,64,30],[170.996,0.03,83,10],[171.016,0.31,57,15],[171.451,0.045,111,10],[171.905,0.27,64,30],[171.905,0.03,83,10],[171.925,0.31,57,15],[172.132,0.045,111,15],[172.814,1.227,73,16],[172.814,0.045,111,11],[173.723,0.191,57,18],[173.723,0.27,64,30],[173.723,0.03,83,10],[173.743,0.31,57,15],[174.632,0.27,64,30],[174.632,0.03,83,10],[174.652,0.31,57,15],[175.769,0.191,68,18],[176.451,0.27,64,30],[176.451,0.03,83,10],[176.471,0.31,57,15],[176.905,0.045,111,20],[177.36,0.27,64,30],[177.36,0.03,83,10],[177.38,0.31,57,15],[177.587,0.045,111,12],[177.814,0.409,73,16],[179.178,0.27,64,30],[179.178,0.03,83,10],[179.198,0.31,57,15],[180.087,0.27,64,30],[180.087,0.03,83,10],[180.107,0.31,57,15],[180.541,0.409,68,14],[180.541,0.191,71,15],[181.678,0.045,111,11],[181.905,0.27,64,30],[181.905,0.03,83,10],[181.925,0.31,57,15],[182.844,0.27,64,30],[182.844,0.03,83,10],[182.863,0.31,57,15],[184.779,0.27,64,30],[184.779,0.03,83,10],[184.799,0.31,57,15],[185.747,0.27,64,30],[185.747,0.03,83,10],[185.767,0.31,57,15],[187.682,0.27,64,30],[187.682,0.03,83,10],[187.702,0.31,57,15],[188.702,0.27,64,30],[188.702,0.03,83,10],[188.722,0.31,57,15],[190.845,0.27,64,30],[190.845,0.03,83,10],[190.865,0.31,57,15],[191.916,0.27,64,30],[191.916,0.03,83,10],[191.936,0.31,57,15],[192.988,1.607,60,28],[194.059,0.27,64,30],[194.059,0.03,83,10],[194.079,0.31,57,15],[195.13,0.27,64,30],[195.13,0.03,83,10],[195.15,0.31,57,15],[195.589,0.27,64,28],[195.589,0.03,83,10],[195.609,0.31,57,14],[195.984,0.158,67,11],[196.181,0.158,65,11],[196.379,0.158,76,15],[196.379,0.27,64,28],[196.379,0.03,83,10],[196.399,0.31,57,14],[196.576,0.158,77,15],[197.168,0.27,64,28],[197.168,0.03,83,10],[197.188,0.31,57,14],[197.958,0.158,60,11],[197.958,0.27,64,28],[197.958,0.03,83,10],[197.978,0.31,57,14],[198.155,0.158,62,11],[198.747,0.27,64,28],[198.747,0.03,83,10],[198.767,0.31,57,14],[199.537,0.158,63,11],[199.537,0.27,64,28],[199.537,0.03,83,10],[199.557,0.31,57,14],[199.734,0.158,62,11],[199.931,0.158,76,15],[200.129,0.158,74,15],[200.326,0.27,64,28],[200.326,0.03,83,10],[200.346,0.31,57,14],[201.116,0.27,64,28],[201.116,0.03,83,10],[201.136,0.31,57,14],[201.51,0.158,63,20],[201.51,0.158,65,27],[201.708,0.158,65,20],[201.708,0.158,67,27],[201.905,0.27,64,28],[201.905,0.03,83,10],[201.925,0.31,57,14],[202.695,0.27,64,28],[202.695,0.03,83,10],[202.715,0.31,57,14],[203.089,0.158,60,20],[203.287,0.158,58,20],[203.484,0.158,72,27],[203.484,0.27,64,28],[203.484,0.03,83,10],[203.504,0.31,57,14],[203.681,0.158,70,27],[204.274,0.27,64,28],[204.274,0.03,83,10],[204.293,0.31,57,14],[205.025,0.143,69,27],[205.025,0.27,64,28],[205.025,0.03,83,10],[205.045,0.31,57,14],[205.204,0.143,70,27],[205.74,0.27,64,28],[205.74,0.03,83,10],[205.76,0.31,57,14],[206.454,0.143,56,20],[206.454,0.27,64,28],[206.454,0.03,83,10],[206.474,0.31,57,14],[206.633,0.143,55,20],[206.811,0.143,69,27],[206.99,0.143,67,27],[207.168,0.27,64,28],[207.168,0.03,83,10],[207.188,0.31,57,14],[207.883,0.27,64,28],[207.883,0.03,83,10],[207.903,0.31,57,14],[208.24,0.143,72,23],[208.418,0.143,74,23],[208.597,0.27,64,28],[208.597,0.03,83,10],[208.617,0.31,57,14],[209.311,0.27,64,28],[209.311,0.03,83,10],[209.331,0.31,57,14],[209.668,0.143,56,17],[209.847,0.143,58,17],[210.025,0.27,64,28],[210.025,0.03,83,10],[210.045,0.31,57,14],[210.74,0.27,64,28],[210.74,0.03,83,10],[210.76,0.31,57,14],[211.097,0.143,67,17],[211.275,0.143,65,17],[211.454,0.143,76,23],[211.454,0.27,64,28],[211.454,0.03,83,10],[211.474,0.31,57,14],[211.633,0.143,77,23],[212.168,0.27,64,28],[212.168,0.03,83,10],[212.188,0.31,57,14],[212.883,0.143,60,17],[212.883,0.27,64,28],[212.883,0.03,83,10],[212.903,0.31,57,14],[213.061,0.143,62,25],[213.566,0.27,64,28],[213.566,0.03,83,10],[213.586,0.31,57,14],[214.218,0.13,63,25],[214.218,0.27,64,28],[214.218,0.03,83,10],[214.238,0.31,57,14],[214.381,0.13,62,25],[214.544,0.13,76,34],[214.707,0.13,74,34],[214.87,0.27,64,28],[214.87,0.03,83,10],[214.89,0.31,57,14],[215.522,0.27,64,28],[215.522,0.03,83,10],[215.542,0.31,57,14],[215.848,0.13,63,25],[215.848,0.13,65,34],[216.012,0.13,65,25],[216.012,0.13,67,34],[216.174,0.27,64,28],[216.174,0.03,83,10],[216.195,0.31,57,14],[216.827,0.27,64,28],[216.827,0.03,83,10],[216.847,0.31,57,14],[217.153,0.13,60,25],[217.316,0.13,58,25],[217.479,0.13,72,34],[217.479,0.27,64,28],[217.479,0.03,83,10],[217.499,0.31,57,14],[217.642,0.13,70,34],[218.131,0.27,64,28],[218.131,0.03,83,10],[218.151,0.31,57,14],[218.764,0.114,67,53],[218.783,0.27,64,28],[218.783,0.03,83,10],[218.803,0.31,57,14],[219.359,0.114,72,53],[219.435,0.27,64,28],[219.435,0.03,83,10],[219.455,0.31,57,14],[220.022,0.391,80,59],[220.088,0.27,64,28],[220.088,0.03,83,10],[220.107,0.31,57,14],[220.438,0.5,102,108],[220.74,0.27,64,28],[220.74,0.03,83,10],[220.76,0.31,57,14],[221.392,0.27,64,28],[221.392,0.03,83,10],[221.412,0.31,57,14],[222.044,0.27,64,28],[222.044,0.03,83,10],[222.064,0.31,57,14],[222.971,0.143,69,47],[222.971,0.27,64,28],[222.971,0.03,83,10],[222.991,0.31,57,14],[223.149,0.143,70,47],[223.685,0.27,64,28],[223.685,0.03,83,10],[223.705,0.31,57,14],[224.399,0.143,56,35],[224.399,0.27,64,28],[224.399,0.03,83,10],[224.419,0.31,57,14],[224.578,0.143,55,35],[224.756,0.143,69,47],[224.935,0.143,67,47],[225.114,0.27,64,28],[225.114,0.03,83,10],[225.134,0.31,57,14],[225.828,0.27,64,28],[225.828,0.03,83,10],[225.848,0.31,57,14],[226.185,0.143,72,57],[226.364,0.143,74,57],[226.542,0.27,64,28],[226.542,0.03,83,10],[226.562,0.31,57,14],[227.257,0.27,64,28],[227.257,0.03,83,10],[227.277,0.31,57,14],[227.614,0.143,56,43],[227.792,0.143,58,43],[227.971,0.27,64,28],[227.971,0.03,83,10],[227.991,0.31,57,14],[228.654,0.27,64,28],[228.654,0.03,83,10],[228.674,0.31,57,14],[228.98,0.13,67,43],[229.143,0.13,65,43],[229.306,0.13,76,57],[229.306,0.27,64,28],[229.306,0.03,83,10],[229.326,0.31,57,14],[229.469,0.13,77,57],[229.958,0.27,64,28],[229.958,0.03,83,10],[229.978,0.31,57,14],[230.611,0.13,60,43],[230.611,0.27,64,28],[230.611,0.03,83,10],[230.631,0.31,57,14],[230.774,0.13,62,50],[231.263,0.27,64,28],[231.263,0.03,83,10],[231.283,0.31,57,14],[231.915,0.13,63,50],[231.915,0.27,64,28],[231.915,0.03,83,10],[231.935,0.31,57,14],[232.078,0.13,62,50],[232.241,0.13,76,67],[232.404,0.13,74,67],[232.567,0.27,64,28],[232.567,0.03,83,10],[232.587,0.31,57,14],[233.219,0.27,64,28],[233.219,0.03,83,10],[233.239,0.31,57,14],[233.545,0.13,63,50],[233.545,0.12,65,67],[233.695,0.12,67,67],[233.708,0.13,65,50],[233.845,0.27,64,28],[233.845,0.03,83,10],[233.865,0.31,57,14],[234.445,0.27,64,28],[234.445,0.03,83,10],[234.465,0.31,57,14],[234.745,0.12,60,50],[234.895,0.12,58,50],[235.045,0.12,72,67],[235.045,0.27,64,28],[235.045,0.03,83,10],[235.065,0.31,57,14],[235.195,0.12,70,67],[235.645,0.27,64,28],[235.645,0.03,83,10],[235.665,0.31,57,14],[236.245,0.12,69,42],[236.245,0.27,64,28],[236.245,0.03,83,10],[236.265,0.31,57,14],[236.395,0.12,70,42],[236.845,0.27,64,28],[236.845,0.03,83,10],[236.865,0.31,57,14],[237.445,0.12,56,31],[237.445,0.27,64,28],[237.445,0.03,83,10],[237.465,0.31,57,14],[237.595,0.12,55,31],[237.745,0.12,69,42],[237.895,0.12,67,42],[238.045,0.27,64,28],[238.045,0.03,83,10],[238.065,0.31,57,14],[238.627,0.105,67,47],[238.645,0.27,64,28],[238.645,0.03,83,10],[238.665,0.31,57,14],[239.175,0.105,72,47],[239.245,0.27,64,28],[239.245,0.03,83,10],[239.265,0.31,57,14],[239.785,0.36,80,52],[239.845,0.27,64,28],[239.845,0.03,83,10],[239.865,0.31,57,14],[240.169,0.5,102,108],[240.445,0.27,64,28],[240.445,0.03,83,10],[240.465,0.31,57,14],[241.045,0.27,64,28],[241.045,0.03,83,10],[241.065,0.31,57,14],[241.645,0.27,64,28],[241.645,0.03,83,10],[241.665,0.31,57,14],[242.245,0.27,64,28],[242.245,0.03,83,10],[242.265,0.31,57,14],[242.845,0.27,64,28],[242.845,0.03,83,10],[242.865,0.31,57,14],[248.86,0.04,99,43],[249.574,0.16,48,49],[249.574,0.03,99,22],[251.002,0.16,48,49],[251.002,0.03,99,22],[263.145,0.04,99,43],[263.86,0.16,43,49],[263.86,0.03,99,22],[265.288,0.16,43,49],[265.288,0.03,99,22],[266.717,0.25,63,31],[268.502,0.25,73,38],[277.431,1.429,67,42],[278.145,0.27,64,22],[278.145,0.03,83,8],[278.165,0.31,57,11],[279.574,0.27,64,22],[279.574,0.03,83,8],[279.594,0.31,57,11],[281.002,0.27,64,22],[281.002,0.03,83,8],[281.022,0.31,57,11],[282.431,0.27,64,22],[282.431,0.03,83,8],[282.451,0.31,57,11],[283.86,0.27,64,22],[283.86,0.03,83,8],[283.88,0.31,57,11],[285.288,0.27,64,22],[285.288,0.03,83,8],[285.308,0.31,57,11],[286.717,0.27,64,22],[286.717,0.03,83,8],[286.737,0.31,57,11],[288.145,0.27,64,22],[288.145,0.03,83,8],[288.165,0.31,57,11],[289.574,0.27,64,22],[289.574,0.03,83,8],[289.594,0.31,57,11],[291.002,0.27,64,22],[291.002,0.03,83,8],[291.022,0.31,57,11],[291.717,0.04,99,43],[292.074,0.16,43,49],[292.074,0.03,99,22],[292.431,0.27,64,22],[292.431,0.03,83,8],[292.451,0.31,57,11],[292.788,0.16,43,49],[292.788,0.03,99,22],[293.502,0.16,43,49],[293.502,0.03,99,22],[293.86,0.27,64,22],[293.86,0.03,83,8],[293.88,0.31,57,11],[294.217,0.16,43,49],[294.217,0.03,99,22],[295.288,0.27,64,22],[295.288,0.03,83,8],[295.308,0.31,57,11],[296.717,0.27,64,22],[296.717,0.03,83,8],[296.737,0.31,57,11],[298.145,0.27,64,22],[298.145,0.03,83,8],[298.165,0.31,57,11],[299.574,0.27,64,22],[299.574,0.03,83,8],[299.594,0.31,57,11],[301.002,0.27,64,22],[301.002,0.03,83,8],[301.022,0.31,57,11],[301.488,6.333,69,17],[302.044,0.444,60,35],[302.599,0.065,99,17],[302.877,0.065,99,17],[303.433,0.444,57,35],[304.266,0.065,99,17],[304.544,0.065,99,17],[304.822,0.444,58,35],[305.933,0.065,99,17],[306.21,0.444,77,35],[306.21,0.065,99,17],[307.599,0.444,76,35],[307.599,0.065,99,17],[307.877,0.065,99,17],[308.155,6.333,69,15],[308.988,0.444,65,35],[309.266,0.065,99,17],[309.544,0.065,99,17],[310.377,0.444,57,35],[310.933,0.065,99,16],[311.21,0.065,99,16],[311.766,0.444,62,35],[312.599,0.065,99,16],[312.877,0.444,77,11],[312.877,0.065,99,16],[313.155,0.444,60,47],[314.266,0.444,76,15],[314.266,0.065,99,16],[314.544,0.444,79,45],[314.544,0.065,99,16],[314.822,6.333,65,11],[315.655,0.444,65,19],[315.933,0.444,69,44],[315.933,0.065,99,15],[316.21,0.065,99,15],[317.044,0.444,60,24],[317.322,0.444,65,41],[317.599,0.065,99,14],[317.877,0.065,99,14],[318.433,0.444,62,30],[318.71,0.444,65,37],[319.266,0.065,99,12],[319.544,0.065,99,12],[319.822,0.444,60,35],[320.099,0.444,64,32],[320.933,0.065,99,10],[321.21,0.444,79,40],[321.21,0.065,99,9],[321.488,0.444,53,25],[321.488,6.333,65,13],[322.599,0.444,69,27],[322.877,0.444,72,11],[323.988,0.444,62,29],[325.377,0.444,65,29],[326.488,0.055,50,9],[326.548,0.16,39,9],[326.766,0.444,64,29],[327.322,0.055,50,16],[327.382,0.16,39,15],[327.382,0.14,51,9],[327.877,0.444,79,11],[328.155,0.444,53,27],[328.155,0.03,99,9],[328.155,0.055,50,23],[328.155,6.333,72,10],[328.215,0.16,39,22],[328.215,0.14,51,13],[328.433,0.065,99,8],[328.71,0.065,99,9],[328.988,0.03,99,11],[328.988,0.055,50,30],[329.048,0.16,39,28],[329.048,0.14,51,17],[329.266,0.444,69,18],[329.544,0.444,72,23],[329.822,0.75,81,16],[329.822,0.03,99,13],[329.822,0.055,50,36],[329.882,0.16,39,34],[329.882,0.14,51,20],[330.099,0.065,99,12],[330.377,0.065,99,12],[330.655,0.444,65,23],[330.655,0.03,99,15],[330.655,0.055,50,41],[330.715,0.16,39,39],[330.715,0.14,51,23],[330.933,0.444,69,17],[331.488,0.75,76,12],[331.488,0.03,99,17],[331.488,0.055,50,46],[331.548,0.16,39,43],[331.548,0.14,51,26],[331.766,0.065,99,15],[332.044,0.444,65,27],[332.044,0.065,99,15],[332.322,0.444,70,10],[332.322,0.03,99,19],[332.322,0.055,50,49],[332.382,0.16,39,47],[332.382,0.14,51,28],[333.155,0.5,79,21],[333.155,0.03,99,19],[333.155,0.055,50,52],[333.215,0.16,39,49],[333.215,0.14,51,29],[333.433,0.444,64,26],[333.433,0.065,99,16],[333.71,0.065,99,17],[333.988,0.03,99,20],[333.988,0.055,50,53],[334.048,0.16,39,50],[334.048,0.14,51,30],[334.822,0.444,53,26],[334.822,0.03,99,20],[334.822,0.055,50,53],[334.822,6.333,69,11],[334.882,0.16,39,49],[334.882,0.14,51,30],[335.099,0.065,99,16],[335.377,0.065,99,16],[335.655,0.03,99,19],[335.655,0.055,50,51],[335.715,0.16,39,47],[335.715,0.14,51,28],[335.933,0.444,69,9],[336.21,0.444,72,24],[336.488,0.03,99,18],[336.488,0.055,50,48],[336.548,0.16,39,44],[336.548,0.14,51,27],[336.766,0.065,99,15],[337.044,0.065,99,14],[337.322,0.444,62,15],[337.322,0.5,77,18],[337.322,0.03,99,16],[337.322,0.055,50,43],[337.382,0.16,39,40],[337.382,0.14,51,24],[337.599,0.444,65,21],[338.155,0.75,74,15],[338.155,0.03,99,14],[338.155,0.055,50,37],[338.215,0.16,39,35],[338.215,0.14,51,21],[338.433,0.065,99,11],[338.71,0.444,65,21],[338.71,0.065,99,10],[338.988,0.444,70,15],[338.988,0.03,99,11],[338.988,0.055,50,31],[339.048,0.16,39,28],[339.048,0.14,51,17],[339.822,0.03,99,9],[339.822,0.055,50,23],[339.882,0.16,39,21],[339.882,0.14,51,13],[340.099,0.444,64,24],[340.377,0.444,67,9],[340.377,0.5,79,7],[340.655,0.055,50,15],[340.715,0.16,39,13],[340.715,0.14,51,8],[341.488,0.444,53,26],[341.488,1.5,77,22],[342.877,0.444,72,26],[344.266,0.444,69,17],[345.377,0.444,65,11],[345.655,0.444,70,14],[345.655,0.75,65,10],[346.766,0.444,64,14],[347.044,0.444,67,11],[347.044,0.5,69,11],[348.155,0.444,53,17],[348.155,6.333,65,20],[349.544,0.444,72,18],[350.933,0.444,65,19],[351.21,0.25,64,13],[352.322,0.444,70,18],[353.71,0.444,67,17],[354.266,0.5,64,10],[354.266,0.065,99,8],[354.544,0.065,99,8],[354.822,0.444,53,8],[354.822,6.333,72,15],[355.099,0.444,57,13],[355.933,0.065,99,11],[356.21,0.444,72,10],[356.21,0.065,99,11],[356.488,0.444,53,11],[357.599,0.444,69,12],[357.599,0.065,99,13],[357.877,0.444,72,10],[357.877,0.065,99,13],[358.988,0.444,70,13],[359.266,0.444,74,8],[359.266,0.065,99,14],[359.544,0.065,99,15],[360.377,0.444,67,14],[360.933,0.065,99,15],[361.21,0.065,99,15],[361.766,0.444,57,15],[362.599,0.065,99,16],[362.877,0.065,99,16],[363.155,0.444,50,13],[364.266,0.065,99,16],[364.544,0.444,69,27],[364.544,0.065,99,16],[365.933,0.444,74,23],[365.933,0.065,99,17],[366.21,0.065,99,17],[367.322,0.444,72,19],[367.599,0.065,99,17],[367.877,0.065,99,17],[368.71,0.444,60,16],[369.266,0.065,99,17],[369.544,0.065,99,17],[370.099,0.444,57,12],[370.933,0.065,99,17],[371.21,0.065,99,17],[371.488,0.444,58,8],[372.599,0.065,99,17],[372.877,0.444,77,8],[372.877,0.065,99,17],[374.266,0.065,99,17],[374.544,0.065,99,17],[376.357,0.27,64,25],[376.357,0.03,83,9],[376.377,0.31,57,13],[376.464,0.27,64,27],[376.464,0.03,83,10],[376.484,0.31,57,14],[376.893,0.321,60,25],[377.429,0.27,64,25],[377.429,0.03,83,9],[377.449,0.31,57,13],[378.5,0.27,64,25],[378.5,0.03,83,9],[378.52,0.31,57,13],[378.607,0.27,64,29],[378.607,0.03,83,10],[378.627,0.31,57,14],[378.75,0.321,67,27],[379.036,0.204,64,15],[379.572,0.27,64,25],[379.572,0.03,83,9],[379.591,0.31,57,13],[380.107,4.071,57,9],[380.509,0.7,64,13],[380.536,0.321,60,28],[380.643,0.27,64,25],[380.643,0.03,83,9],[380.663,0.31,57,13],[380.75,0.27,64,30],[380.75,0.03,83,11],[380.77,0.31,57,15],[381.714,0.27,64,25],[381.714,0.03,83,9],[381.734,0.31,57,13],[382.25,0.321,57,30],[382.786,0.27,64,25],[382.786,0.03,83,9],[382.806,0.31,57,13],[382.893,0.27,64,32],[382.893,0.03,83,11],[382.913,0.31,57,16],[383.857,0.27,64,25],[383.857,0.03,83,9],[383.877,0.31,57,13],[384.107,0.321,64,30],[384.125,0.204,64,17],[384.393,4.071,53,21],[384.929,0.27,64,25],[384.929,0.03,83,9],[384.949,0.31,57,13],[385.036,0.27,64,34],[385.036,0.03,83,12],[385.056,0.31,57,17],[385.893,0.321,57,48],[386,0.27,64,25],[386,0.03,83,9],[386.02,0.31,57,13],[386.268,0.7,67,15],[386.938,0.7,65,28],[387.072,0.27,64,25],[387.072,0.03,83,9],[387.091,0.31,57,13],[387.179,0.27,64,35],[387.179,0.03,83,12],[387.199,0.31,57,18],[387.607,0.321,53,51],[388.143,0.27,64,25],[388.143,0.03,83,9],[388.163,0.31,57,13],[388.679,4.071,55,19],[389.214,0.27,64,25],[389.214,0.03,83,9],[389.234,0.31,57,13],[389.322,0.27,64,37],[389.322,0.03,83,13],[389.341,0.31,57,19],[389.464,0.321,62,53],[390.286,0.27,64,25],[390.286,0.03,83,9],[390.306,0.31,57,13],[391.25,0.321,64,49],[391.357,0.27,64,25],[391.357,0.03,83,9],[391.377,0.31,57,13],[392.322,0.161,64,34],[392.429,0.27,64,25],[392.429,0.03,83,9],[392.449,0.31,57,13],[392.964,3.931,60,20],[393.482,0.07,98,21],[393.585,0.27,64,29],[393.585,0.03,83,10],[393.605,0.31,57,14],[393.74,0.7,72,35],[393.999,0.31,72,41],[394.387,0.7,76,67],[394.516,0.07,98,21],[395.551,0.07,98,22],[395.654,0.27,64,30],[395.654,0.03,83,11],[395.674,0.31,57,15],[395.792,0.31,79,55],[396.068,0.197,76,31],[396.585,0.07,98,22],[396.844,0.035,117,10],[397.102,3.931,64,35],[397.361,0.035,117,12],[397.516,0.31,72,58],[397.62,0.07,98,23],[397.723,0.27,64,32],[397.723,0.03,83,11],[397.743,0.31,57,16],[398.654,0.07,98,23],[399.171,0.31,69,61],[399.688,0.07,98,24],[399.792,0.27,64,34],[399.792,0.03,83,12],[399.812,0.31,57,17],[399.947,0.7,74,17],[400.723,0.07,98,24],[400.964,0.31,76,61],[400.982,0.197,76,34],[401.24,3.931,60,26],[401.499,0.197,72,36],[401.628,0.7,72,36],[401.757,0.07,98,25],[401.861,0.27,64,36],[401.861,0.03,83,13],[401.881,0.31,57,18],[402.016,0.035,117,14],[402.533,0.035,117,12],[402.688,0.31,69,64],[402.792,0.07,98,25],[403.827,0.07,98,27],[403.93,0.27,64,37],[403.93,0.03,83,13],[403.95,0.31,57,19],[404.344,0.31,65,68],[404.861,0.07,98,27],[405.378,3.931,62,30],[405.895,0.07,98,28],[405.999,0.27,64,39],[405.999,0.03,83,14],[406.019,0.31,57,19],[406.137,0.31,74,72],[406.413,0.197,71,40],[406.671,0.035,117,11],[406.93,0.07,98,28],[407.188,0.7,83,17],[407.188,0.035,117,15],[407.835,0.7,76,32],[407.861,0.31,76,66],[407.964,0.27,64,25],[407.964,0.03,83,9],[407.984,0.31,57,13],[408.895,0.155,64,46],[408.999,0.27,64,25],[408.999,0.03,83,9],[409.019,0.31,57,13],[409.516,3.8,67,14],[410.016,0.07,98,22],[410.116,0.27,64,30],[410.116,0.03,83,11],[410.136,0.31,57,15],[410.516,0.3,84,48],[411.016,0.07,98,22],[411.696,0.4,100,8],[411.766,0.035,117,10],[412.016,0.07,98,23],[412.116,0.27,64,32],[412.116,0.03,83,11],[412.136,0.31,57,16],[412.249,0.3,91,61],[412.266,0.035,117,12],[412.516,0.19,88,34],[412.766,0.035,117,7],[413.016,0.07,98,23],[413.516,3.8,60,12],[413.516,3.8,64,19],[413.916,0.3,84,64],[414.016,0.07,98,24],[414.116,0.27,64,34],[414.116,0.03,83,12],[414.136,0.31,57,17],[414.266,0.7,88,36],[414.891,0.7,91,68],[415.016,0.07,98,24],[415.516,0.3,81,67],[415.696,0.4,96,8],[416.016,0.07,98,25],[416.116,0.27,64,36],[416.116,0.03,83,13],[416.136,0.31,57,18],[416.766,0.035,117,11],[416.891,0.27,64,31],[416.891,0.03,83,11],[416.911,0.31,57,15],[417.016,0.07,98,25],[417.249,0.3,88,67],[417.266,0.19,88,38],[417.266,0.035,117,14],[417.516,3.8,57,44],[417.766,0.19,84,40],[417.766,0.035,117,8],[418.016,0.07,98,27],[418.116,0.27,64,38],[418.116,0.03,83,13],[418.136,0.31,57,19],[418.916,0.3,81,71],[419.016,0.07,98,27],[420.016,0.07,98,28],[420.116,0.27,64,39],[420.116,0.03,83,14],[420.136,0.31,57,20],[420.266,0.7,89,36],[420.516,0.3,77,84],[421.016,0.07,98,28],[421.516,3.8,59,63],[421.766,0.035,117,13],[421.891,0.7,86,75],[422.016,0.07,98,29],[422.116,0.27,64,41],[422.116,0.03,83,14],[422.136,0.31,57,21],[422.249,0.3,86,88],[422.266,0.035,117,16],[422.516,0.19,83,49],[422.766,0.035,117,9],[423.016,0.07,98,29],[423.916,0.3,88,81],[424.016,0.27,64,25],[424.016,0.03,83,9],[424.036,0.31,57,13],[424.916,0.15,76,57],[425.016,0.27,64,25],[425.016,0.03,83,9],[425.036,0.31,57,13],[425.516,3.677,64,48],[426,0.07,98,22],[426.097,0.27,64,30],[426.097,0.03,83,11],[426.117,0.31,57,15],[426.242,0.045,117,9],[426.484,0.29,96,52],[426.484,0.027,117,20],[426.726,0.045,117,51],[426.968,0.07,98,22],[426.968,0.027,117,39],[427.21,0.045,117,65],[427.452,0.027,117,39],[427.693,0.045,117,46],[427.815,0.7,100,47],[427.935,0.07,98,23],[427.935,0.027,117,15],[428.032,0.27,64,32],[428.032,0.03,83,11],[428.052,0.31,57,16],[428.161,0.29,103,55],[428.419,0.184,96,31],[428.903,0.07,98,23],[429.387,3.677,60,34],[429.774,0.29,96,58],[429.871,0.07,98,24],[429.968,0.27,64,34],[429.968,0.03,83,12],[429.988,0.31,57,17],[430.839,0.07,98,24],[431.323,0.29,93,61],[431.323,0.027,117,12],[431.565,0.045,117,46],[431.806,0.07,98,25],[431.806,0.027,117,41],[431.903,0.27,64,36],[431.903,0.03,83,13],[431.923,0.31,57,18],[432.048,0.045,117,75],[432.29,0.027,117,47],[432.532,0.045,117,64],[432.653,0.27,64,31],[432.653,0.03,83,11],[432.673,0.31,57,15],[432.774,0.07,98,25],[432.774,0.027,117,27],[433,0.29,100,61],[433.016,0.184,96,34],[433.016,0.045,117,17],[433.258,3.677,53,8],[433.258,3.677,57,17],[433.5,0.184,96,36],[433.742,0.07,98,27],[433.839,0.27,64,38],[433.839,0.03,83,13],[433.859,0.31,57,19],[434.589,0.7,103,48],[434.613,0.29,93,55],[434.71,0.07,98,27],[435.368,0.4,105,7],[435.677,0.07,98,28],[435.774,0.27,64,39],[435.774,0.03,83,14],[435.794,0.31,57,20],[436.161,0.29,89,58],[436.403,0.045,117,32],[436.645,0.07,98,28],[436.645,0.027,117,37],[436.887,0.045,117,77],[437.129,3.677,55,34],[437.129,0.027,117,56],[437.371,0.045,117,83],[437.613,0.07,98,29],[437.613,0.027,117,42],[437.71,0.27,64,41],[437.71,0.03,83,14],[437.73,0.31,57,21],[437.839,0.29,98,60],[437.855,0.045,117,40],[438.097,0.184,95,34],[438.581,0.07,98,29],[439.239,0.4,106,7],[439.452,0.29,100,56],[439.548,0.218,66,79],[439.548,0.27,64,25],[439.548,0.03,83,9],[439.568,0.31,57,13],[440.516,0.27,64,25],[440.516,0.03,83,9],[440.536,0.31,57,13],[441,3.8,62,9],[441.375,0.7,62,14],[441.4,0.3,66,28],[441.5,0.11,98,79],[441.5,0.095,54,89],[442,0.3,62,29],[442.375,0.7,66,15],[442.5,0.11,98,82],[442.5,0.095,54,92],[443.5,0.11,98,87],[443.5,0.095,54,98],[444.5,0.11,98,87],[444.5,0.095,54,98],[445,3.8,59,20],[445,0.46,66,75],[445.5,0.11,98,92],[445.5,0.095,54,103],[445.5,0.23,69,75],[445.75,0.23,71,75],[446,0.46,69,75],[446.5,0.11,98,92],[446.5,0.095,54,103],[446.5,0.46,66,75],[447,0.69,64,75],[447.5,0.11,98,97],[447.5,0.095,54,109],[448.5,0.11,98,97],[448.5,0.095,54,109],[449,3.8,55,18],[449.5,0.11,98,102],[449.5,0.095,54,114],[450.4,0.3,59,36],[450.5,0.11,98,102],[450.5,0.095,54,114],[450.75,0.7,69,10],[451,0.3,55,38],[451.5,0.11,98,107],[451.5,0.095,54,120],[451.733,0.3,62,38],[451.75,0.7,67,10],[452.5,0.11,98,107],[452.5,0.095,54,120],[452.733,0.3,62,38],[453,3.8,57,10],[453.375,0.7,64,20],[453.4,0.3,61,40],[453.5,0.11,98,112],[453.5,0.095,54,125],[454,0.3,57,40],[454.375,0.7,73,20],[454.5,0.11,98,112],[454.5,0.095,54,125],[454.733,0.3,64,40],[455.5,0.11,98,103],[455.5,0.095,54,116],[456.5,0.11,98,103],[456.5,0.095,54,116],[457,3.8,69,12],[457.5,0.11,98,86],[457.5,0.095,54,97],[457.5,0.23,66,70],[457.75,0.23,69,70],[458,0.69,66,70],[458.5,0.11,98,86],[458.5,0.095,54,97],[458.75,0.23,64,70],[459,0.46,66,70],[459.5,0.11,98,92],[459.5,0.095,54,103],[459.5,0.46,64,70],[460.5,0.11,98,92],[460.5,0.095,54,103],[461,3.8,66,20],[461.5,0.11,98,97],[461.5,0.095,54,109],[462.4,0.3,62,34],[462.5,0.11,98,97],[462.5,0.095,54,109],[463,0.3,59,36],[463.5,0.11,98,102],[463.5,0.095,54,115],[463.733,0.3,66,36],[463.75,0.7,64,9],[464,0.138,50,26],[464.25,0.552,47,26],[464.4,0.3,62,36],[464.5,0.11,98,102],[464.5,0.095,54,115],[465,3.8,62,24],[465.375,0.7,62,19],[465.4,0.3,59,38],[465.5,0.11,98,107],[465.5,0.095,54,121],[466,0.3,55,38],[466.375,0.7,69,19],[466.5,0.11,98,107],[466.5,0.095,54,121],[466.733,0.3,62,38],[467.375,0.7,67,19],[467.5,0.11,98,112],[467.5,0.095,54,126],[468.5,0.11,98,112],[468.5,0.095,54,126],[469,3.8,64,21],[469.5,0.11,98,118],[469.5,0.095,54,132],[469.75,0.23,69,146],[470,0.69,73,146],[470.5,0.11,98,118],[470.5,0.095,54,132],[470.75,0.23,69,146],[471,0.46,66,146],[471.5,0.11,98,109],[471.5,0.095,54,122],[471.5,0.46,64,146],[472,0.92,62,146],[472.5,0.11,98,109],[472.5,0.095,54,122],[473,3.738,69,7],[473,0.027,117,10],[473.492,0.11,98,86],[473.492,0.095,54,97],[474.475,0.11,98,86],[474.475,0.095,54,97],[474.967,0.295,62,46],[475.459,0.11,98,92],[475.459,0.095,54,103],[475.688,0.295,69,46],[475.705,0.7,66,11],[476.344,0.295,66,46],[476.443,0.11,98,92],[476.443,0.095,54,103],[476.443,0.027,117,19],[476.688,0.045,117,51],[476.934,0.295,59,48],[476.934,3.738,62,13],[476.934,0.027,117,43],[477.18,0.045,117,73],[477.328,0.295,62,48],[477.426,0.11,98,97],[477.426,0.095,54,109],[477.426,0.027,117,42],[477.672,0.7,66,13],[477.672,0.045,117,50],[477.918,0.295,59,48],[477.918,0.027,117,17],[478.287,0.7,69,24],[478.41,0.11,98,97],[478.41,0.095,54,109],[478.639,0.295,66,48],[479.147,0.407,52,37],[479.271,0.7,64,24],[479.295,0.295,62,51],[479.393,0.11,98,102],[479.393,0.095,54,115],[479.885,0.136,50,37],[480.131,0.543,47,37],[480.377,0.11,98,102],[480.377,0.095,54,115],[480.869,3.738,59,22],[481.361,0.11,98,107],[481.361,0.095,54,121],[481.361,0.027,117,16],[481.606,0.045,117,52],[481.852,0.027,117,45],[482.098,0.045,117,80],[482.344,0.11,98,107],[482.344,0.095,54,121],[482.344,0.453,69,133],[482.344,0.027,117,49],[482.59,0.045,117,62],[482.836,0.453,67,133],[482.836,0.027,117,26],[483.082,0.045,117,10],[483.328,0.11,98,112],[483.328,0.095,54,126],[483.328,0.226,66,133],[483.574,0.226,64,133],[483.82,0.905,62,133],[484.312,0.11,98,112],[484.312,0.095,54,126],[484.803,3.738,61,26],[485.295,0.11,98,118],[485.295,0.095,54,132],[486.279,0.11,98,118],[486.279,0.095,54,132],[486.279,0.027,117,11],[486.525,0.045,117,48],[486.771,0.027,117,42],[487.016,0.045,117,80],[487.262,0.11,98,109],[487.262,0.095,54,122],[487.262,0.027,117,51],[487.492,0.295,69,54],[487.508,0.045,117,69],[487.754,0.027,117,30],[488,0.045,117,20],[488.147,0.295,66,54],[488.246,0.11,98,109],[488.246,0.095,54,122],[488.738,0.29,62,45],[488.738,3.677,66,17],[489.222,0.11,98,91],[489.222,0.095,54,102],[489.447,0.29,69,45],[489.464,0.7,62,12],[490.189,0.11,98,91],[490.189,0.095,54,102],[490.415,0.29,69,45],[490.431,0.7,66,12],[491.036,0.7,78,22],[491.06,0.29,66,47],[491.157,0.11,98,93],[491.157,0.095,54,104],[491.157,0.027,117,12],[491.399,0.045,117,48],[491.641,0.29,62,43],[491.641,0.027,117,43],[491.883,0.045,117,71],[492.125,0.11,98,73],[492.125,0.095,54,83],[492.125,0.027,117,36],[492.367,0.045,117,27],[492.609,3.677,59,20],[492.609,0.445,66,108],[493.092,0.11,98,16],[493.092,0.095,54,18],[493.092,0.223,69,125],[493.334,0.223,71,126],[493.576,0.03,99,24],[493.576,0.055,50,64],[493.576,0.445,69,120],[493.636,0.16,39,71],[493.636,0.14,51,43],[494.06,0.445,66,81],[494.544,0.03,99,80],[494.544,0.055,50,214],[494.544,0.027,117,27],[494.604,0.16,39,201],[494.604,0.14,51,120],[494.786,0.045,117,77],[494.931,0.29,62,27],[495.028,0.027,117,45],[495.254,0.29,66,27],[495.27,0.7,76,9],[495.27,0.045,117,25],[495.512,0.29,59,40],[495.512,0.055,50,16],[496.222,0.29,66,11],[496.238,0.203,47,69],[496.48,0.203,43,51],[496.48,3.677,59,69],[496.48,0.445,62,36],[496.722,0.045,117,9],[496.964,0.11,98,110],[496.964,0.095,54,123],[496.964,0.445,67,154],[496.964,0.027,117,46],[497.205,0.045,117,77],[497.447,0.027,117,9],[497.834,0.29,59,40],[498.157,0.29,62,40],[498.415,0.03,99,83],[498.415,0.055,50,220],[498.475,0.16,39,190],[498.475,0.14,51,114],[498.657,0.045,117,24],[498.899,0.223,78,30],[498.899,0.027,117,55],[499.141,0.203,43,44],[499.141,0.223,76,126],[499.141,0.045,117,55],[499.383,0.203,43,56],[499.383,0.89,74,157],[499.77,0.29,59,43],[499.867,0.11,98,118],[499.867,0.095,54,132],[500.092,0.29,62,31],[500.351,0.055,50,18],[500.351,3.677,57,32],[500.351,3.677,64,10],[500.351,0.027,117,22],[500.411,0.16,39,63],[500.411,0.14,51,38],[500.592,0.045,117,92],[500.738,0.29,61,9],[500.834,0.223,66,26],[500.834,0.027,117,20],[501.076,0.223,69,145],[501.318,0.203,45,16],[501.318,0.668,73,167],[501.802,0.11,98,52],[501.802,0.095,54,59],[502.044,0.7,73,12],[502.044,0.203,45,15],[502.044,0.045,117,84],[502.286,0.027,117,36],[502.77,0.445,76,131],[503.254,0.03,99,38],[503.254,0.055,50,102],[503.254,0.89,74,77],[503.314,0.16,39,50],[503.314,0.14,51,30],[503.496,0.534,62,32],[503.496,0.045,117,72],[503.641,0.29,66,36],[503.738,0.027,117,41],[503.964,0.29,69,26],[503.98,0.203,50,41],[504.222,3.677,62,59],[504.705,0.223,66,42],[504.947,0.223,69,40],[504.947,0.045,117,54],[505.189,0.03,99,56],[505.189,0.055,50,150],[505.189,0.027,117,34],[505.249,0.16,39,115],[505.249,0.14,51,69],[505.576,0.29,66,30],[505.899,0.29,69,34],[505.915,0.203,50,42],[506.157,0.203,50,22],[506.399,0.045,117,50],[506.641,0.11,98,29],[506.641,0.095,54,32],[506.641,0.445,76,122],[506.641,0.027,117,41],[507.125,0.03,99,71],[507.125,0.055,50,190],[507.125,0.89,74,18],[507.185,0.16,39,180],[507.185,0.14,51,108],[507.512,0.29,66,13],[507.834,0.29,69,26],[507.851,0.203,50,33],[507.851,0.045,117,23],[508.092,0.203,47,48],[508.092,3.677,59,36],[508.092,0.027,117,48],[508.334,0.045,117,33],[508.576,0.11,98,101],[508.576,0.095,54,114],[508.576,0.223,69,143],[508.818,0.223,71,96],[509.12,0.16,39,39],[509.12,0.14,51,24],[509.447,0.29,62,36],[509.544,0.027,117,24],[509.77,0.29,66,32],[509.786,0.7,69,8],[509.786,0.045,117,76],[510.028,0.03,99,21],[510.028,0.055,50,56],[510.028,0.027,117,23],[510.088,0.16,39,19],[510.088,0.14,51,11],[510.754,0.203,47,50],[510.754,0.223,74,142],[510.996,0.203,47,38],[510.996,0.89,71,107],[510.996,0.134,62,19],[511.238,0.534,59,28],[511.48,0.11,98,102],[511.48,0.095,54,115],[511.48,0.027,117,37],[511.722,0.045,117,79],[511.964,0.29,55,42],[511.964,3.677,62,72],[511.964,0.027,117,25],[512.326,0.7,62,11],[512.351,0.29,59,35],[512.931,0.03,99,84],[512.931,0.055,50,223],[512.931,0.223,69,22],[512.991,0.16,39,205],[512.991,0.14,51,123],[513.173,0.223,71,83],[513.415,0.445,69,129],[513.657,0.045,117,43],[513.899,0.445,79,157],[513.899,0.027,117,53],[514.141,0.045,117,81],[514.383,0.223,78,117],[514.383,0.027,117,26],[514.625,0.203,43,48],[514.625,0.223,76,82],[514.867,0.203,43,54],[515.254,0.29,59,44],[515.351,0.11,98,22],[515.351,0.095,54,25],[515.576,0.29,62,16],[515.592,0.203,43,52],[515.835,0.29,57,39],[515.835,0.203,45,49],[515.835,3.677,57,68],[516.197,0.7,64,17],[516.222,0.29,61,34],[516.318,0.11,98,96],[516.318,0.095,54,108],[516.544,0.29,64,25],[516.56,0.203,45,31],[516.56,0.045,117,8],[516.802,0.29,57,42],[516.802,0.203,45,25],[516.802,0.027,117,32],[517.044,0.045,117,80],[517.165,0.7,73,22],[517.189,0.29,61,13],[517.286,0.11,98,119],[517.286,0.095,54,134],[517.286,0.027,117,58],[517.512,0.29,64,9],[517.528,0.203,45,11],[517.528,0.045,117,85],[517.77,0.203,50,7],[517.77,0.027,117,37],[518.012,0.045,117,27],[518.254,0.11,98,114],[518.254,0.095,54,128],[519.222,0.11,98,114],[519.222,0.095,54,129],[519.705,3.738,69,48],[520.197,0.11,98,86],[520.197,0.095,54,97],[520.197,0.226,66,121],[520.443,0.226,69,121],[520.689,0.679,66,121],[521.181,0.11,98,86],[521.181,0.095,54,97],[521.427,0.226,64,121],[521.427,0.045,117,27],[521.673,0.453,66,121],[521.673,0.027,117,31],[521.918,0.045,117,64],[522.164,0.11,98,92],[522.164,0.095,54,103],[522.164,0.453,64,121],[522.164,0.027,117,43],[522.41,0.045,117,63],[522.656,0.027,117,31],[522.902,0.045,117,27],[523.148,0.11,98,92],[523.148,0.095,54,103],[523.64,3.738,66,63],[524.132,0.11,98,97],[524.132,0.095,54,109],[525.017,0.295,62,42],[525.115,0.11,98,97],[525.115,0.095,54,109],[525.607,0.295,59,44],[525.853,0.407,52,32],[526.099,0.11,98,102],[526.099,0.095,54,115],[526.328,0.295,66,44],[526.345,0.7,64,11],[526.345,0.045,117,22],[526.591,0.027,117,31],[526.837,0.045,117,67],[526.984,0.295,62,44],[527.082,0.11,98,102],[527.082,0.095,54,115],[527.082,0.027,117,48],[527.312,0.295,66,44],[527.328,0.045,117,74],[527.574,3.738,62,62],[527.574,0.027,117,40],[527.82,0.045,117,40],[527.943,0.7,62,23],[527.968,0.295,59,46],[528.066,0.11,98,107],[528.066,0.095,54,121],[528.558,0.295,55,46],[528.927,0.7,69,23],[529.05,0.11,98,107],[529.05,0.095,54,121],[529.279,0.295,62,46],[529.91,0.7,67,23],[530.033,0.11,98,112],[530.033,0.095,54,126],[531.017,0.11,98,112],[531.017,0.095,54,126],[531.263,0.045,117,14],[531.509,3.738,64,42],[531.509,0.027,117,29],[531.755,0.045,117,71],[532,0.11,98,118],[532,0.095,54,132],[532,0.027,117,54],[532.246,0.045,117,87],[532.492,0.679,73,132],[532.492,0.027,117,48],[532.738,0.045,117,54],[532.984,0.11,98,118],[532.984,0.095,54,132],[532.984,0.027,117,15],[533.23,0.226,69,132],[533.476,0.453,66,132],[533.968,0.11,98,109],[533.968,0.095,54,122],[533.968,0.453,64,132],[534.46,0.905,62,132],[534.951,0.11,98,109],[534.951,0.095,54,122],[535.443,3.864,66,24],[535.952,0.11,98,86],[535.952,0.095,54,97],[536.969,0.11,98,86],[536.969,0.095,54,97],[537.477,0.305,62,40],[537.986,0.11,98,92],[537.986,0.095,54,103],[538.223,0.305,69,40],[538.901,0.305,66,40],[539.003,0.11,98,92],[539.003,0.095,54,103],[539.511,0.305,59,42],[539.511,3.864,62,52],[539.918,0.305,62,42],[540.019,0.11,98,97],[540.019,0.095,54,109],[540.528,0.305,59,42],[540.909,0.7,69,21],[541.036,0.11,98,97],[541.036,0.095,54,109],[541.274,0.305,66,42],[541.926,0.7,64,21],[541.952,0.305,62,44],[542.053,0.11,98,102],[542.053,0.095,54,115],[543.07,0.11,98,102],[543.07,0.095,54,115],[543.579,3.864,59,69],[544.087,0.11,98,107],[544.087,0.095,54,121],[544.85,0.234,71,120],[545.104,0.11,98,107],[545.104,0.095,54,121],[545.104,0.468,69,120],[545.613,0.468,67,120],[546.121,0.11,98,112],[546.121,0.095,54,126],[546.121,0.234,66,120],[546.375,0.234,64,120],[546.63,0.936,62,120],[547.138,0.11,98,112],[547.138,0.095,54,126],[547.646,4.068,69,55],[547.646,3.864,61,68],[548.155,0.11,98,118],[548.155,0.095,54,132],[549.172,0.11,98,118],[549.172,0.095,54,132],[550.189,0.27,64,25],[550.189,0.03,83,9],[550.209,0.31,57,13],[550.426,0.305,69,47],[551.104,0.305,66,47],[551.206,0.27,64,25],[551.206,0.03,83,9],[551.226,0.31,57,13],[552.223,0.27,64,25],[552.223,0.03,83,9],[552.243,0.31,57,13],[553.24,0.27,64,25],[553.24,0.03,83,9],[553.26,0.31,57,13],[554.257,0.27,64,25],[554.257,0.03,83,9],[554.277,0.31,57,13],[554.769,0.27,64,31],[554.769,0.03,83,11],[554.789,0.31,57,16],[555.678,0.27,64,31],[555.678,0.03,83,11],[555.698,0.31,57,16],[556.587,0.27,64,31],[556.587,0.03,83,11],[556.607,0.31,57,16],[557.496,0.27,64,31],[557.496,0.03,83,11],[557.516,0.31,57,16],[557.951,0.58,71,29],[558.405,0.27,64,31],[558.405,0.03,83,11],[558.425,0.31,57,16],[558.86,0.773,74,29],[559.314,0.27,64,31],[559.314,0.03,83,11],[559.334,0.31,57,16],[560.223,0.27,64,31],[560.223,0.03,83,11],[560.243,0.31,57,16],[560.451,0.193,78,30],[561.133,0.27,64,31],[561.133,0.03,83,11],[561.153,0.31,57,16],[562.042,0.27,64,31],[562.042,0.03,83,11],[562.062,0.31,57,16],[562.951,0.27,64,31],[562.951,0.03,83,11],[562.971,0.31,57,16],[563.86,0.27,64,31],[563.86,0.03,83,11],[563.88,0.31,57,16],[564.769,0.27,64,31],[564.769,0.03,83,11],[564.789,0.31,57,16],[565.223,0.58,71,22],[565.678,0.27,64,31],[565.678,0.03,83,11],[565.698,0.31,57,16],[566.133,0.773,74,22],[566.587,0.27,64,31],[566.587,0.03,83,11],[566.607,0.31,57,16],[567.496,0.27,64,31],[567.496,0.03,83,11],[567.516,0.31,57,16],[567.723,0.193,78,22],[568.405,0.27,64,31],[568.405,0.03,83,11],[568.425,0.31,57,16],[568.86,0.58,62,16],[569.314,0.27,64,31],[569.314,0.03,83,11],[569.334,0.31,57,16],[569.542,0.193,62,22],[569.769,0.773,62,22],[570.223,0.27,64,31],[570.223,0.03,83,11],[570.243,0.31,57,16],[570.678,0.58,62,22],[571.133,0.27,64,31],[571.133,0.03,83,11],[571.153,0.31,57,16],[571.36,0.193,62,22],[571.587,0.773,62,22],[572.042,0.27,64,31],[572.042,0.03,83,11],[572.062,0.31,57,16],[572.496,0.58,62,22],[572.951,0.27,64,31],[572.951,0.03,83,11],[572.971,0.31,57,16],[573.178,0.193,62,16],[573.405,0.773,62,16],[573.86,0.27,64,31],[573.86,0.03,83,11],[573.88,0.31,57,16],[574.314,0.58,62,16],[574.769,0.27,64,31],[574.769,0.03,83,11],[574.789,0.31,57,16],[574.996,0.193,62,16],[575.223,0.773,62,16],[575.678,0.27,64,31],[575.678,0.03,83,11],[575.698,0.31,57,16],[576.133,0.58,62,16],[576.587,0.27,64,31],[576.587,0.03,83,11],[576.607,0.31,57,16],[576.814,0.193,62,16],[577.042,0.773,62,24],[577.496,0.27,64,31],[577.496,0.03,83,11],[577.516,0.31,57,16],[577.951,0.58,62,24],[578.405,0.27,64,31],[578.405,0.03,83,11],[578.425,0.31,57,16],[578.633,0.193,62,24],[578.86,0.773,62,24],[579.314,0.27,64,31],[579.314,0.03,83,11],[579.334,0.31,57,16],[579.769,0.58,62,24],[580.223,0.27,64,31],[580.223,0.03,83,11],[580.243,0.31,57,16],[580.451,0.193,62,24],[580.678,0.773,62,24],[581.133,0.27,64,31],[581.133,0.03,83,11],[581.153,0.31,57,16],[581.587,0.58,62,29],[582.042,0.27,64,31],[582.042,0.03,83,11],[582.062,0.31,57,16],[582.269,0.193,62,29],[582.496,0.773,62,29],[582.951,0.27,64,31],[582.951,0.03,83,11],[582.971,0.31,57,16],[583.86,0.27,64,31],[583.86,0.03,83,11],[583.88,0.31,57,16],[584.769,0.27,64,31],[584.769,0.03,83,11],[584.789,0.31,57,16],[585.678,0.27,64,31],[585.678,0.03,83,11],[585.698,0.31,57,16],[586.587,0.27,64,31],[586.587,0.03,83,11],[586.607,0.31,57,16],[587.042,0.58,83,41],[587.496,0.27,64,31],[587.496,0.03,83,11],[587.516,0.31,57,16],[587.951,0.773,86,41],[588.405,0.27,64,31],[588.405,0.03,83,11],[588.425,0.31,57,16],[589.314,0.27,64,31],[589.314,0.03,83,11],[589.334,0.31,57,16],[589.542,0.193,90,41],[590.223,0.27,64,31],[590.223,0.03,83,11],[590.243,0.31,57,16],[590.678,0.159,74,54],[591.133,0.27,64,31],[591.133,0.03,83,11],[591.153,0.31,57,16],[592.042,0.27,64,31],[592.042,0.03,83,11],[592.062,0.31,57,16],[592.437,4.385,67,11],[593.014,0.07,98,19],[593.129,0.27,64,27],[593.129,0.03,83,10],[593.149,0.31,57,14],[593.283,0.346,79,23],[594.024,0.7,76,11],[594.168,0.07,98,19],[595.206,0.346,76,24],[595.322,0.07,98,20],[595.437,0.27,64,28],[595.437,0.03,83,10],[595.457,0.31,57,14],[595.899,0.219,76,13],[596.476,0.07,98,18],[596.745,0.346,79,13],[596.764,0.035,117,11],[597.052,0.346,69,20],[597.052,4.385,60,26],[597.341,0.219,69,10],[597.629,0.07,98,13],[597.745,0.27,64,18],[597.765,0.31,57,9],[598.668,0.346,72,25],[599.36,0.27,48,11],[599.36,0.055,50,12],[599.42,0.16,39,13],[599.42,0.14,51,8],[599.793,0.7,74,11],[600.206,0.346,76,19],[600.226,0.035,117,10],[600.514,0.346,69,15],[600.514,0.27,48,38],[600.514,0.03,83,13],[600.514,0.03,99,16],[600.514,0.055,50,42],[600.534,0.31,42,19],[600.574,0.16,39,40],[600.574,0.14,51,24],[600.802,0.035,117,10],[601.668,0.27,48,47],[601.668,0.03,83,16],[601.668,0.03,99,18],[601.668,0.055,50,48],[601.668,4.385,53,27],[601.688,0.31,42,23],[601.728,0.16,39,45],[601.728,0.14,51,27],[602.129,0.346,69,23],[602.822,0.27,48,23],[602.822,0.03,83,8],[602.822,0.03,99,9],[602.822,0.055,50,23],[602.842,0.31,42,11],[602.882,0.16,39,20],[602.882,0.14,51,12],[603.668,0.346,72,28],[603.687,0.7,79,7],[603.687,0.035,117,11],[603.976,0.277,41,13],[604.264,0.035,117,10],[604.408,0.7,77,11],[604.408,0.277,48,22],[605.129,0.346,65,26],[605.129,0.277,41,33],[605.822,0.27,64,35],[605.822,0.03,83,12],[605.842,0.31,57,18],[605.995,0.219,65,16],[605.995,0.277,42,37],[606.283,0.277,43,38],[606.283,4.385,59,16],[606.572,0.219,67,16],[606.716,0.277,50,35],[606.745,0.346,71,13],[606.86,0.07,98,13],[606.976,0.27,64,20],[606.995,0.31,57,10],[607.129,0.346,74,25],[607.149,0.035,117,9],[607.437,0.219,71,12],[607.437,0.277,43,28],[607.726,0.035,117,14],[608.014,0.07,98,22],[608.129,0.27,64,19],[608.149,0.31,57,10],[608.302,0.277,47,18],[608.591,0.346,72,26],[608.591,2.077,48,16],[609.024,0.7,76,15],[609.052,0.346,76,8],[609.168,0.27,64,24],[609.168,0.03,83,8],[609.188,0.31,57,12],[610.206,0.173,64,20],[610.322,0.27,64,25],[610.322,0.03,83,9],[610.342,0.31,57,12],[610.899,4.56,64,15],[611.349,0.7,72,13],[611.499,0.27,64,25],[611.499,0.03,83,9],[611.519,0.31,57,13],[611.619,0.27,64,26],[611.619,0.03,83,9],[611.639,0.31,57,13],[612.699,0.27,64,25],[612.699,0.03,83,9],[612.719,0.31,57,13],[613.599,0.228,79,16],[613.899,0.27,64,25],[613.899,0.03,83,9],[613.919,0.31,57,13],[614.019,0.27,64,27],[614.019,0.03,83,10],[614.039,0.31,57,14],[615.099,0.27,64,25],[615.099,0.03,83,9],[615.119,0.31,57,13],[615.699,4.56,57,12],[616.299,0.27,64,25],[616.299,0.03,83,9],[616.319,0.31,57,13],[616.419,0.27,64,29],[616.419,0.03,83,10],[616.439,0.31,57,14],[617.499,0.27,64,25],[617.499,0.03,83,9],[617.519,0.31,57,13],[617.799,0.7,79,8],[618.549,0.7,74,15],[618.699,0.27,64,25],[618.699,0.03,83,9],[618.719,0.31,57,13],[618.819,0.27,64,30],[618.819,0.03,83,11],[618.839,0.31,57,15],[619.299,0.228,72,18],[619.899,0.27,64,25],[619.899,0.03,83,9],[619.919,0.31,57,13],[620.499,4.56,53,19],[620.979,0.36,69,33],[621.099,0.27,64,25],[621.099,0.03,83,9],[621.119,0.31,57,13],[621.219,0.27,64,32],[621.219,0.03,83,11],[621.239,0.31,57,16],[621.699,0.36,65,33],[622.299,0.27,64,25],[622.299,0.03,83,9],[622.319,0.31,57,13],[622.579,0.36,72,33],[623.379,0.36,69,35],[623.499,0.27,64,25],[623.499,0.03,83,9],[623.519,0.31,57,13],[623.619,0.27,64,33],[623.619,0.03,83,12],[623.639,0.31,57,17],[624.099,0.36,65,35],[624.699,0.27,64,25],[624.699,0.03,83,9],[624.719,0.31,57,13],[624.979,0.36,72,35],[624.999,0.228,65,20],[625.299,4.56,55,23],[625.779,0.36,71,37],[625.899,0.27,64,25],[625.899,0.03,83,9],[625.919,0.31,57,13],[626.019,0.27,64,35],[626.019,0.03,83,12],[626.039,0.31,57,17],[626.199,0.7,74,10],[626.499,0.36,67,37],[626.949,0.7,83,18],[627.099,0.27,64,25],[627.099,0.03,83,9],[627.119,0.31,57,13],[627.379,0.36,74,37],[628.179,0.36,76,34],[628.299,0.27,64,25],[628.299,0.03,83,9],[628.319,0.31,57,13],[629.499,0.27,64,25],[629.499,0.03,83,9],[629.519,0.31,57,13],[629.619,0.18,65,24],[630.099,4.75,60,11],[630.724,0.27,64,25],[630.724,0.03,83,9],[630.744,0.31,57,13],[630.849,0.27,64,23],[630.849,0.03,83,8],[630.869,0.31,57,11],[631.974,0.27,64,25],[631.974,0.03,83,9],[631.994,0.31,57,13],[633.067,0.7,76,12],[633.224,0.27,64,25],[633.224,0.03,83,9],[633.244,0.31,57,13],[633.349,0.27,64,24],[633.349,0.03,83,8],[633.369,0.31,57,12],[634.474,0.27,64,25],[634.474,0.03,83,9],[634.494,0.31,57,13],[635.724,0.27,64,25],[635.724,0.03,83,9],[635.744,0.31,57,13],[635.849,0.27,64,25],[635.849,0.03,83,9],[635.869,0.31,57,13],[636.974,0.27,64,25],[636.974,0.03,83,9],[636.994,0.31,57,13],[638.224,0.27,64,25],[638.224,0.03,83,9],[638.244,0.31,57,13],[638.349,0.27,64,27],[638.349,0.03,83,9],[638.369,0.31,57,13],[639.474,0.27,64,25],[639.474,0.03,83,9],[639.494,0.31,57,13],[640.099,4.75,60,16],[640.724,0.27,64,25],[640.724,0.03,83,9],[640.744,0.31,57,13],[640.849,0.27,64,28],[640.849,0.03,83,10],[640.869,0.31,57,14],[641.817,0.7,79,15],[641.974,0.27,64,25],[641.974,0.03,83,9],[641.994,0.31,57,13],[643.224,0.27,64,25],[643.224,0.03,83,9],[643.244,0.31,57,13],[643.349,0.27,64,30],[643.349,0.03,83,10],[643.369,0.31,57,15],[644.474,0.27,64,25],[644.474,0.03,83,9],[644.494,0.31,57,13],[645.099,4.75,62,20],[645.724,0.27,64,25],[645.724,0.03,83,9],[645.744,0.31,57,13],[645.849,0.27,64,31],[645.849,0.03,83,11],[645.869,0.31,57,15],[646.974,0.27,64,25],[646.974,0.03,83,9],[646.994,0.31,57,13],[648.224,0.27,64,25],[648.224,0.03,83,9],[648.244,0.31,57,13],[649.349,0.188,64,21],[649.474,0.27,64,25],[649.474,0.03,83,9],[649.494,0.31,57,13],[650.737,0.27,64,25],[650.737,0.03,83,9],[650.757,0.31,57,13],[651.854,0.7,76,11],[652.014,0.27,64,25],[652.014,0.03,83,9],[652.034,0.31,57,13],[653.29,0.27,64,25],[653.29,0.03,83,9],[653.31,0.31,57,13],[654.567,0.27,64,25],[654.567,0.03,83,9],[654.587,0.31,57,13],[655.843,0.27,64,25],[655.843,0.03,83,9],[655.863,0.31,57,13],[657.12,0.27,64,25],[657.12,0.03,83,9],[657.14,0.31,57,13],[658.396,0.27,64,25],[658.396,0.03,83,9],[658.417,0.31,57,13],[659.673,0.27,64,25],[659.673,0.03,83,9],[659.693,0.31,57,13],[660.79,0.7,72,12],[660.95,0.27,64,25],[660.95,0.03,83,9],[660.97,0.31,57,13],[662.226,0.27,64,25],[662.226,0.03,83,9],[662.246,0.31,57,13],[663.503,0.27,64,25],[663.503,0.03,83,9],[663.523,0.31,57,13],[664.779,0.27,64,25],[664.779,0.03,83,9],[664.799,0.31,57,13],[666.056,0.27,64,25],[666.056,0.03,83,9],[666.076,0.31,57,13],[667.333,0.27,64,25],[667.333,0.03,83,9],[667.353,0.31,57,13],[668.45,0.7,76,13],[668.609,0.27,64,25],[668.609,0.03,83,9],[668.629,0.31,57,13],[669.886,0.27,64,25],[669.886,0.03,83,9],[669.906,0.31,57,13],[670.014,0.192,65,17],[671.176,0.27,64,25],[671.176,0.03,83,9],[671.196,0.31,57,13],[672.481,0.27,64,25],[672.481,0.03,83,9],[672.501,0.31,57,13],[673.785,0.27,64,25],[673.785,0.03,83,9],[673.805,0.31,57,13],[675.089,0.27,64,25],[675.089,0.03,83,9],[675.109,0.31,57,13],[676.394,0.27,64,25],[676.394,0.03,83,9],[676.414,0.31,57,13],[677.698,0.27,64,25],[677.698,0.03,83,9],[677.718,0.31,57,13],[679.002,0.27,64,25],[679.002,0.03,83,9],[679.022,0.31,57,13],[680.307,0.27,64,25],[680.307,0.03,83,9],[680.327,0.31,57,13],[681.611,0.27,64,25],[681.611,0.03,83,9],[681.631,0.31,57,13],[682.915,0.27,64,25],[682.915,0.03,83,9],[682.935,0.31,57,13],[684.22,0.27,64,25],[684.22,0.03,83,9],[684.24,0.31,57,13],[685.524,0.27,64,25],[685.524,0.03,83,9],[685.544,0.31,57,13],[686.828,0.27,64,25],[686.828,0.03,83,9],[686.848,0.31,57,13],[688.133,0.27,64,25],[688.133,0.03,83,9],[688.153,0.31,57,13],[689.437,0.27,64,25],[689.437,0.03,83,9],[689.457,0.31,57,13],[690.611,0.196,64,16],[690.741,0.27,64,25],[690.741,0.03,83,9],[690.761,0.31,57,13],[692.076,0.27,64,25],[692.076,0.03,83,9],[692.096,0.31,57,13],[693.439,0.27,64,25],[693.439,0.03,83,9],[693.459,0.31,57,13],[694.803,0.27,64,25],[694.803,0.03,83,9],[694.823,0.31,57,13],[696.166,0.27,64,25],[696.166,0.03,83,9],[696.186,0.31,57,13],[697.53,0.27,64,25],[697.53,0.03,83,9],[697.55,0.31,57,13],[698.894,0.27,64,25],[698.894,0.03,83,9],[698.914,0.31,57,13],[700.257,0.27,64,25],[700.257,0.03,83,9],[700.277,0.31,57,13],[701.621,0.27,64,25],[701.621,0.03,83,9],[701.641,0.31,57,13],[702.985,0.27,64,25],[702.985,0.03,83,9],[703.005,0.31,57,13],[704.348,0.27,64,25],[704.348,0.03,83,9],[704.368,0.31,57,13],[705.712,0.27,64,25],[705.712,0.03,83,9],[705.732,0.31,57,13],[707.076,0.27,64,25],[707.076,0.03,83,9],[707.096,0.31,57,13],[708.439,0.27,64,25],[708.439,0.03,83,9],[708.459,0.31,57,13],[709.803,0.27,64,25],[709.803,0.03,83,9],[709.823,0.31,57,13],[711.166,0.27,64,25],[711.166,0.03,83,9],[711.186,0.31,57,13],[712.53,0.27,64,25],[712.53,0.03,83,9],[712.55,0.31,57,13],[714.212,0.27,64,22],[714.212,0.03,83,8],[714.232,0.31,57,11],[716.212,0.27,64,22],[716.212,0.03,83,8],[716.232,0.31,57,11],[718.212,0.27,64,22],[718.212,0.03,83,8],[718.232,0.31,57,11],[720.212,0.27,64,22],[720.212,0.03,83,8],[720.232,0.31,57,11],[722.212,0.27,64,22],[722.212,0.03,83,8],[722.232,0.31,57,11],[724.212,0.27,64,22],[724.212,0.03,83,8],[724.232,0.31,57,11],[725.212,2.4,74,43],[726.212,0.27,64,22],[726.212,0.03,83,8],[726.232,0.31,57,11],[728.212,0.27,64,22],[728.212,0.03,83,8],[728.232,0.31,57,11],[730.212,0.27,64,22],[730.212,0.03,83,8],[730.232,0.31,57,11],[732.212,0.27,64,22],[732.212,0.03,83,8],[732.232,0.31,57,11],[734.212,0.27,64,22],[734.212,0.03,83,8],[734.232,0.31,57,11],[736.212,0.27,64,22],[736.212,0.03,83,8],[736.232,0.31,57,11],[738.212,0.27,64,22],[738.212,0.03,83,8],[738.232,0.31,57,11],[740.212,0.27,64,22],[740.212,0.03,83,8],[740.232,0.31,57,11],[742.212,0.27,64,22],[742.212,0.03,83,8],[742.232,0.31,57,11],[744.212,0.27,64,22],[744.212,0.03,83,8],[744.232,0.31,57,11],[746.212,0.27,64,22],[746.212,0.03,83,8],[746.232,0.31,57,11],[748.212,0.27,64,22],[748.212,0.03,83,8],[748.232,0.31,57,11],[750.212,0.27,64,22],[750.212,0.03,83,8],[750.232,0.31,57,11],[752.212,0.27,64,22],[752.212,0.03,83,8],[752.232,0.31,57,11],[754.212,0.27,64,22],[754.212,0.03,83,8],[754.232,0.31,57,11],[756.212,0.27,64,22],[756.212,0.03,83,8],[756.232,0.31,57,11],[758.212,0.27,64,22],[758.212,0.03,83,8],[758.232,0.31,57,11],[760.212,0.27,64,22],[760.212,0.03,83,8],[760.232,0.31,57,11],[762.212,0.27,64,22],[762.212,0.03,83,8],[762.232,0.31,57,11],[764.212,0.27,64,22],[764.212,0.03,83,8],[764.232,0.31,57,11],[766.212,0.27,64,22],[766.212,0.03,83,8],[766.232,0.31,57,11],[768.212,0.27,64,22],[768.212,0.03,83,8],[768.232,0.31,57,11],[770.212,0.27,64,22],[770.212,0.03,83,8],[770.232,0.31,57,11]],[[34.9,1.282,76,169],[42.5,0.666,72,199],[45.46,0.666,76,199],[50.74,0.252,79,199],[53.26,1.008,72,199],[57.04,0.25,74,177],[60.1,0.15,65,173],[60.42,0.96,48,26],[61.62,0.96,48,26],[62.34,0.27,64,21],[62.34,0.03,83,7],[62.36,0.31,57,11],[62.82,0.96,48,28],[64.02,0.96,48,28],[64.74,0.27,64,22],[64.74,0.03,83,8],[64.76,0.31,57,11],[65.22,0.96,45,29],[66.42,0.96,45,29],[67.14,0.27,64,24],[67.14,0.03,83,8],[67.16,0.31,57,12],[67.62,0.96,45,31],[68.82,0.96,45,31],[69.54,0.27,64,25],[69.54,0.03,83,9],[69.56,0.31,57,13],[70.02,0.96,41,24],[71.22,0.96,41,24],[71.94,0.27,64,26],[71.94,0.03,83,9],[71.96,0.31,57,13],[72.42,0.96,41,25],[73.62,0.96,41,25],[74.34,0.27,64,27],[74.34,0.03,83,10],[74.36,0.31,57,14],[74.82,0.96,43,26],[76.02,0.96,43,26],[76.74,0.27,64,29],[76.74,0.03,83,10],[76.76,0.31,57,14],[77.22,2.16,48,23],[79.14,0.18,65,22],[79.62,0.941,48,17],[80.796,0.941,48,17],[81.502,0.27,64,24],[81.502,0.03,83,8],[81.522,0.31,57,12],[81.973,0.941,48,18],[82.267,0.224,79,17],[83.149,0.941,48,18],[83.855,0.27,64,26],[83.855,0.03,83,9],[83.875,0.31,57,13],[84.326,0.941,45,19],[85.502,0.941,45,19],[86.208,0.27,64,27],[86.208,0.03,83,10],[86.228,0.31,57,14],[86.679,0.941,45,20],[87.855,0.224,72,13],[87.855,0.941,45,20],[88.561,0.27,64,29],[88.561,0.03,83,10],[88.581,0.31,57,14],[89.032,0.353,65,25],[89.032,0.941,41,29],[89.894,0.353,72,25],[90.208,0.941,41,29],[90.679,0.353,69,25],[90.914,0.27,64,30],[90.914,0.03,83,11],[90.934,0.31,57,15],[91.385,0.353,65,26],[91.385,0.941,41,30],[92.248,0.353,72,26],[92.561,0.941,41,30],[93.032,0.353,69,26],[93.267,0.27,64,32],[93.267,0.03,83,11],[93.287,0.31,57,16],[93.444,0.224,65,25],[93.738,0.353,67,47],[93.738,0.941,43,31],[94.6,0.353,74,47],[94.914,0.941,43,31],[95.385,0.353,71,47],[95.62,0.27,64,33],[95.62,0.03,83,11],[95.64,0.31,57,16],[96.091,0.353,72,44],[96.091,2.118,48,28],[96.953,0.353,79,44],[97.973,0.176,65,31],[98.444,0.277,48,18],[98.876,0.277,55,18],[99.597,0.277,48,18],[100.03,0.7,76,19],[100.29,0.27,64,27],[100.29,0.03,83,10],[100.31,0.31,57,14],[100.463,0.219,72,11],[100.463,0.277,47,18],[100.751,0.277,48,19],[101.04,0.219,79,11],[101.184,0.277,55,19],[101.905,0.277,48,19],[102.597,0.27,64,29],[102.597,0.03,83,10],[102.617,0.31,57,14],[102.77,0.277,44,17],[102.77,0.035,117,9],[103.059,0.277,45,18],[103.347,0.035,117,11],[103.492,0.277,52,18],[104.213,0.277,45,18],[104.905,0.27,64,30],[104.905,0.03,83,11],[104.925,0.31,57,15],[105.078,0.277,44,18],[105.367,0.277,45,19],[105.799,0.277,52,19],[106.52,0.219,72,19],[106.52,0.277,45,19],[107.213,0.27,64,32],[107.213,0.03,83,11],[107.233,0.31,57,16],[107.386,0.277,40,44],[107.674,0.277,41,46],[107.963,0.035,117,13],[108.107,0.7,72,18],[108.107,0.277,48,46],[108.136,0.346,69,36],[108.54,0.035,117,11],[108.828,0.346,65,36],[108.828,0.277,41,46],[109.52,0.27,64,34],[109.52,0.03,83,12],[109.54,0.31,57,17],[109.674,0.346,72,36],[109.694,0.277,40,46],[109.982,0.277,41,49],[110.415,0.277,48,49],[110.444,0.346,69,38],[111.136,0.346,65,38],[111.136,0.277,41,34],[111.828,0.27,64,35],[111.828,0.03,83,12],[111.848,0.31,57,18],[111.982,0.346,72,27],[112.001,0.219,65,15],[112.001,0.277,42,34],[112.29,0.277,43,36],[112.578,0.219,67,16],[112.578,0.035,117,9],[112.722,0.277,50,36],[112.751,0.346,71,29],[113.155,0.035,117,14],[113.444,0.346,67,29],[113.444,0.277,43,36],[113.732,0.035,117,9],[114.136,0.27,64,37],[114.136,0.03,83,13],[114.156,0.31,57,19],[114.29,0.346,74,29],[114.309,0.277,47,36],[114.597,2.077,48,37],[115.03,0.7,76,14],[115.059,0.346,76,27],[116.444,0.173,65,19],[116.905,0.25,45,46],[117.814,0.27,64,30],[117.814,0.03,83,10],[117.834,0.31,57,15],[118.269,0.25,45,46],[118.723,0.27,64,30],[118.723,0.03,83,10],[118.743,0.31,57,15],[119.632,0.25,50,46],[120.541,0.27,64,30],[120.541,0.03,83,10],[120.561,0.31,57,15],[120.996,0.25,52,46],[121.451,0.27,64,30],[121.451,0.03,83,10],[121.471,0.31,57,15],[122.36,0.25,45,46],[123.269,0.27,64,30],[123.269,0.03,83,10],[123.289,0.31,57,15],[123.723,0.25,53,46],[124.178,0.27,64,30],[124.178,0.03,83,10],[124.198,0.31,57,15],[125.087,0.25,50,46],[125.996,0.27,64,30],[125.996,0.03,83,10],[126.016,0.31,57,15],[126.451,0.25,52,46],[126.905,0.27,64,30],[126.905,0.03,83,10],[126.925,0.31,57,15],[127.814,0.25,45,46],[128.723,0.27,64,30],[128.723,0.03,83,10],[128.743,0.31,57,15],[129.178,0.25,45,46],[129.632,0.27,64,30],[129.632,0.03,83,10],[129.652,0.31,57,15],[130.541,0.25,50,46],[131.451,0.27,64,30],[131.451,0.03,83,10],[131.471,0.31,57,15],[131.905,0.25,52,46],[132.36,0.27,64,30],[132.36,0.03,83,10],[132.38,0.31,57,15],[133.269,0.25,45,46],[134.178,0.27,64,30],[134.178,0.03,83,10],[134.198,0.31,57,15],[134.632,0.25,53,46],[135.087,0.27,64,30],[135.087,0.03,83,10],[135.107,0.31,57,15],[135.996,0.25,52,46],[136.905,0.27,64,30],[136.905,0.03,83,10],[136.925,0.31,57,15],[137.36,0.25,45,46],[137.814,0.27,64,30],[137.814,0.03,83,10],[137.834,0.31,57,15],[138.723,0.25,45,49],[138.723,0.045,111,14],[139.632,0.27,64,30],[139.632,0.03,83,10],[139.652,0.31,57,15],[140.087,0.25,45,49],[140.314,0.191,76,10],[140.542,0.27,64,30],[140.542,0.03,83,10],[140.561,0.31,57,15],[141.451,0.818,81,26],[141.451,0.25,50,49],[142.36,0.27,64,30],[142.36,0.03,83,10],[142.38,0.31,57,15],[142.814,0.25,52,49],[142.814,0.045,111,19],[143.269,0.27,64,30],[143.269,0.03,83,10],[143.289,0.31,57,15],[143.496,0.045,111,13],[144.178,0.25,45,49],[145.087,0.191,69,12],[145.087,0.27,64,30],[145.087,0.03,83,10],[145.107,0.31,57,15],[145.541,0.818,77,31],[145.541,0.25,53,49],[145.996,0.27,64,30],[145.996,0.03,83,10],[146.016,0.31,57,15],[146.905,0.25,50,49],[147.132,0.191,77,12],[147.587,0.045,111,9],[147.814,0.27,64,30],[147.814,0.03,83,10],[147.834,0.31,57,15],[148.269,0.25,52,49],[148.269,0.045,111,21],[148.723,0.27,64,30],[148.723,0.03,83,10],[148.743,0.31,57,15],[149.632,0.818,76,33],[149.632,0.25,45,49],[150.542,0.27,64,30],[150.542,0.03,83,10],[150.561,0.31,57,15],[150.996,0.25,45,49],[151.451,0.27,64,30],[151.451,0.03,83,10],[151.471,0.31,57,15],[151.905,0.191,76,12],[152.36,0.25,50,49],[153.041,0.045,111,15],[153.269,0.27,64,30],[153.269,0.03,83,10],[153.289,0.31,57,15],[153.723,1.227,76,38],[153.723,0.25,52,49],[153.723,0.045,111,14],[153.951,0.191,76,14],[154.178,0.27,64,30],[154.178,0.03,83,10],[154.198,0.31,57,15],[155.087,0.25,45,49],[155.996,0.27,64,30],[155.996,0.03,83,10],[156.016,0.31,57,15],[156.451,0.25,53,49],[156.905,0.27,64,30],[156.905,0.03,83,10],[156.925,0.31,57,15],[157.814,0.409,74,38],[157.814,0.25,52,49],[157.814,0.045,111,19],[158.496,0.045,111,13],[158.723,0.191,80,14],[158.723,0.27,64,30],[158.723,0.03,83,10],[158.743,0.31,57,15],[159.178,0.25,45,49],[159.632,0.27,64,30],[159.632,0.03,83,10],[159.652,0.31,57,15],[160.541,0.25,45,55],[160.769,0.191,64,17],[161.451,0.409,73,14],[161.451,0.27,64,30],[161.451,0.03,83,10],[161.471,0.31,57,15],[161.678,0.127,44,23],[161.905,0.25,45,55],[162.36,0.27,64,30],[162.36,0.03,83,10],[162.38,0.31,57,15],[162.587,0.045,111,9],[163.041,0.127,49,23],[163.269,0.25,50,55],[163.269,0.045,111,21],[164.178,0.27,64,30],[164.178,0.03,83,10],[164.198,0.31,57,15],[164.405,0.127,51,23],[164.632,0.25,52,55],[165.087,0.27,64,30],[165.087,0.03,83,10],[165.107,0.31,57,15],[165.541,0.191,64,20],[165.996,0.818,70,17],[165.996,0.25,45,55],[166.905,0.27,64,30],[166.905,0.03,83,10],[166.925,0.31,57,15],[167.132,0.127,52,23],[167.36,0.25,53,55],[167.587,0.191,69,20],[167.814,0.27,64,30],[167.814,0.03,83,10],[167.834,0.31,57,15],[168.041,0.045,111,15],[168.496,0.127,49,23],[168.723,0.25,50,55],[168.723,0.045,111,14],[169.632,0.409,68,17],[169.632,0.27,64,30],[169.632,0.03,83,10],[169.652,0.31,57,15],[169.86,0.127,51,23],[170.087,0.25,52,55],[170.542,0.27,64,30],[170.542,0.03,83,10],[170.561,0.31,57,15],[171.451,0.25,45,55],[172.36,0.191,64,18],[172.36,0.27,64,30],[172.36,0.03,83,10],[172.38,0.31,57,15],[172.587,0.127,44,23],[172.814,0.25,45,55],[172.814,0.045,111,19],[173.269,0.27,64,30],[173.269,0.03,83,10],[173.289,0.31,57,15],[173.496,0.045,111,13],[173.951,0.127,49,23],[174.178,0.818,77,16],[174.178,0.25,50,55],[174.405,0.191,62,18],[175.087,0.27,64,30],[175.087,0.03,83,10],[175.107,0.31,57,15],[175.314,0.127,51,23],[175.541,0.25,52,55],[175.996,0.27,64,30],[175.996,0.03,83,10],[176.016,0.31,57,15],[176.905,0.25,45,55],[177.587,0.045,111,9],[177.814,0.27,64,30],[177.814,0.03,83,10],[177.834,0.31,57,15],[178.041,0.127,52,23],[178.269,0.818,73,16],[178.269,0.25,53,55],[178.269,0.045,111,21],[178.723,0.27,64,30],[178.723,0.03,83,10],[178.743,0.31,57,15],[179.178,0.191,69,18],[179.405,0.127,51,23],[179.632,0.25,52,55],[180.542,0.27,64,30],[180.542,0.03,83,10],[180.561,0.31,57,15],[180.769,0.127,44,23],[180.996,1.227,65,14],[180.996,0.25,45,55],[181.223,0.191,64,15],[181.451,0.27,64,30],[181.451,0.03,83,10],[181.471,0.31,57,15],[182.36,0.266,45,52],[183.327,0.27,64,30],[183.327,0.03,83,10],[183.347,0.31,57,15],[183.811,0.266,53,52],[184.295,0.27,64,30],[184.295,0.03,83,10],[184.315,0.31,57,15],[185.263,0.266,52,52],[186.231,0.27,64,30],[186.231,0.03,83,10],[186.251,0.31,57,15],[186.714,0.266,45,52],[187.198,0.27,64,30],[187.198,0.03,83,10],[187.218,0.31,57,15],[188.166,0.295,45,52],[189.238,0.27,64,30],[189.238,0.03,83,10],[189.257,0.31,57,15],[189.773,0.295,53,52],[190.309,0.27,64,30],[190.309,0.03,83,10],[190.329,0.31,57,15],[191.38,0.295,52,52],[192.452,0.27,64,30],[192.452,0.03,83,10],[192.472,0.31,57,15],[192.988,1.607,64,28],[192.988,0.295,45,52],[193.523,0.27,64,30],[193.523,0.03,83,10],[193.543,0.31,57,15],[196.379,0.158,63,11],[196.576,0.158,62,11],[196.774,0.158,76,15],[196.971,0.158,74,15],[198.352,0.158,63,11],[198.352,0.158,65,15],[198.55,0.158,65,11],[198.55,0.158,67,15],[199.931,0.158,60,11],[200.129,0.158,58,11],[200.326,0.158,72,15],[200.524,0.158,70,15],[201.905,0.158,69,27],[202.102,0.158,70,27],[203.484,0.158,56,20],[203.681,0.158,55,20],[203.879,0.158,69,27],[204.076,0.158,67,27],[205.383,0.143,72,27],[205.561,0.143,74,27],[206.811,0.143,56,20],[206.99,0.143,58,20],[208.24,0.143,67,17],[208.418,0.143,65,17],[208.597,0.143,76,23],[208.775,0.143,77,23],[210.025,0.143,60,17],[210.204,0.143,62,17],[211.454,0.143,63,17],[211.633,0.143,62,17],[211.811,0.143,76,23],[211.99,0.143,74,23],[213.24,0.143,63,25],[213.24,0.13,65,34],[213.403,0.13,67,34],[213.418,0.143,65,25],[214.544,0.13,60,25],[214.707,0.13,58,25],[214.87,0.13,72,34],[215.033,0.13,70,34],[216.174,0.13,69,34],[216.338,0.13,70,34],[217.479,0.13,56,25],[217.642,0.13,55,25],[217.805,0.13,69,34],[217.968,0.13,67,34],[218.902,0.114,68,53],[219.448,0.114,73,53],[220.022,0.391,83,59],[220.45,0.5,102,108],[223.328,0.143,72,47],[223.506,0.143,74,47],[224.756,0.143,56,35],[224.935,0.143,58,35],[226.185,0.143,67,43],[226.364,0.143,65,43],[226.542,0.143,76,57],[226.721,0.143,77,57],[227.971,0.143,60,43],[228.149,0.143,62,43],[229.306,0.13,63,43],[229.469,0.13,62,43],[229.632,0.13,76,57],[229.795,0.13,74,57],[230.937,0.13,63,50],[230.937,0.13,65,67],[231.1,0.13,65,50],[231.1,0.13,67,67],[232.241,0.13,60,50],[232.404,0.13,58,50],[232.567,0.13,72,67],[232.73,0.13,70,67],[233.845,0.12,69,67],[233.995,0.12,70,67],[235.045,0.12,56,50],[235.195,0.12,55,50],[235.345,0.12,69,67],[235.495,0.12,67,67],[236.545,0.12,72,42],[236.695,0.12,74,42],[237.745,0.12,56,31],[237.895,0.12,58,31],[238.755,0.105,68,47],[239.257,0.105,73,47],[239.785,0.36,83,52],[240.181,0.5,102,108],[251.717,0.04,99,43],[252.431,0.16,43,49],[252.431,0.03,99,22],[253.86,0.16,43,49],[253.86,0.03,99,22],[266.002,0.04,99,43],[266.717,0.16,48,49],[266.717,0.03,99,22],[267.074,0.25,65,31],[268.145,0.16,48,49],[268.145,0.03,99,22],[268.86,0.25,75,38],[277.431,1.429,72,42],[280.288,0.04,99,43],[280.645,0.16,43,49],[280.645,0.03,99,22],[281.36,0.16,43,49],[281.36,0.03,99,22],[282.074,0.16,43,49],[282.074,0.03,99,22],[282.788,0.16,43,49],[282.788,0.03,99,22],[294.574,0.04,99,43],[294.931,0.16,48,49],[294.931,0.03,99,22],[295.645,0.16,48,49],[295.645,0.03,99,22],[296.36,0.16,48,49],[296.36,0.03,99,22],[297.074,0.16,48,49],[297.074,0.03,99,22],[301.488,6.333,72,13],[302.322,0.444,65,35],[303.71,0.444,60,35],[305.099,0.444,62,35],[306.488,0.444,60,35],[307.877,0.444,79,35],[308.155,6.333,69,10],[309.266,0.444,69,35],[310.655,0.444,62,35],[312.044,0.444,65,47],[313.155,0.444,60,12],[313.433,0.444,64,46],[314.544,0.444,79,16],[314.822,0.444,53,45],[314.822,6.333,69,17],[315.933,0.444,69,20],[316.21,0.444,72,43],[316.21,0.065,99,7],[317.322,0.444,65,25],[317.599,0.444,69,40],[317.599,0.065,99,9],[317.877,0.065,99,10],[318.71,0.444,65,31],[318.988,0.444,70,36],[319.266,0.065,99,11],[319.544,0.065,99,12],[320.099,0.444,64,36],[320.377,0.444,67,31],[320.933,0.065,99,13],[321.21,0.065,99,14],[321.488,0.444,53,41],[321.488,6.333,65,10],[321.766,0.444,57,24],[322.599,0.065,99,15],[322.877,0.444,72,27],[322.877,0.065,99,15],[323.155,0.444,50,10],[324.266,0.444,65,29],[324.266,0.065,99,16],[324.544,0.065,99,16],[325.655,0.444,70,29],[325.933,0.065,99,17],[326.21,0.065,99,17],[327.044,0.444,67,28],[327.599,0.065,99,16],[327.877,0.065,99,15],[328.155,0.444,53,13],[328.433,0.444,57,26],[329.266,0.065,99,13],[329.544,0.444,72,19],[329.544,0.065,99,13],[329.822,0.444,53,22],[330.655,0.5,79,15],[330.933,0.444,69,24],[330.933,0.065,99,10],[331.21,0.444,72,16],[331.21,0.065,99,9],[331.488,0.75,76,21],[332.322,0.444,70,28],[332.599,0.444,74,9],[333.71,0.444,67,26],[334.822,1.5,81,22],[334.822,6.333,72,12],[335.099,0.444,57,26],[335.655,0.055,50,15],[335.715,0.16,39,15],[335.715,0.14,51,9],[336.21,0.444,72,10],[336.488,0.444,50,24],[336.488,0.03,99,9],[336.488,0.055,50,23],[336.548,0.16,39,22],[336.548,0.14,51,13],[336.766,0.065,99,8],[337.044,0.065,99,9],[337.322,0.5,77,13],[337.322,0.03,99,12],[337.322,0.055,50,31],[337.382,0.16,39,29],[337.382,0.14,51,18],[337.599,0.444,65,17],[337.877,0.444,69,20],[338.155,0.03,99,14],[338.155,0.055,50,38],[338.215,0.16,39,36],[338.215,0.14,51,21],[338.433,0.065,99,12],[338.71,0.065,99,13],[338.988,0.444,70,22],[338.988,0.75,76,13],[338.988,0.03,99,16],[338.988,0.055,50,43],[339.048,0.16,39,41],[339.048,0.14,51,25],[339.266,0.444,74,14],[339.822,0.03,99,18],[339.822,0.055,50,48],[339.882,0.16,39,45],[339.882,0.14,51,27],[340.099,0.065,99,15],[340.377,0.444,67,25],[340.377,0.5,79,21],[340.377,0.065,99,16],[340.655,0.444,72,7],[340.655,0.03,99,19],[340.655,0.055,50,51],[340.715,0.16,39,48],[340.715,0.14,51,29],[341.488,0.03,99,20],[341.488,0.055,50,53],[341.488,6.333,69,9],[341.548,0.16,39,49],[341.548,0.14,51,30],[341.766,0.444,57,26],[341.766,0.065,99,17],[342.044,0.065,99,17],[342.322,0.03,99,20],[342.322,0.055,50,53],[342.382,0.16,39,50],[342.382,0.14,51,30],[343.155,0.444,53,26],[343.155,0.03,99,19],[343.155,0.055,50,52],[343.215,0.16,39,48],[343.215,0.14,51,29],[343.433,0.065,99,16],[343.71,0.065,99,16],[343.988,0.03,99,19],[343.988,0.055,50,49],[344.048,0.16,39,46],[344.048,0.14,51,28],[344.266,0.444,69,8],[344.544,0.444,72,17],[344.544,0.25,65,12],[344.822,0.03,99,17],[344.822,0.055,50,46],[344.882,0.16,39,43],[344.882,0.14,51,26],[345.099,0.065,99,14],[345.377,0.065,99,13],[345.655,0.444,70,12],[345.655,0.75,65,8],[345.655,0.03,99,15],[345.655,0.055,50,41],[345.715,0.16,39,38],[345.715,0.14,51,23],[345.933,0.444,74,14],[346.488,0.03,99,13],[346.488,0.055,50,36],[346.548,0.16,39,33],[346.548,0.14,51,20],[346.766,0.065,99,11],[347.044,0.444,67,15],[347.044,0.065,99,10],[347.322,0.444,72,10],[347.322,0.03,99,11],[347.322,0.055,50,29],[347.382,0.16,39,27],[347.382,0.14,51,16],[348.155,0.03,99,9],[348.155,0.055,50,23],[348.155,6.333,65,43],[348.215,0.16,39,21],[348.215,0.14,51,13],[348.433,0.444,57,17],[348.988,0.055,50,16],[349.048,0.16,39,14],[349.048,0.14,51,9],[349.822,0.444,50,18],[349.822,0.75,67,13],[349.822,0.055,50,9],[349.882,0.16,39,8],[351.21,0.444,69,19],[352.599,0.444,74,18],[353.155,0.5,65,12],[353.71,0.444,67,7],[353.988,0.444,72,14],[355.099,0.444,57,9],[355.377,0.444,60,13],[356.488,0.444,53,11],[356.766,0.444,57,11],[357.877,0.444,72,12],[358.155,0.444,58,9],[359.266,0.444,74,13],[359.544,0.444,77,8],[360.655,0.444,72,14],[362.044,0.444,60,15],[363.433,0.444,53,13],[364.822,0.444,58,23],[366.21,0.444,77,23],[367.599,0.444,76,19],[368.988,0.444,65,16],[370.377,0.444,60,12],[371.766,0.444,62,8],[375.822,0.857,48,44],[375.822,4.071,64,9],[376.893,0.857,48,44],[377.322,0.321,64,25],[377.536,0.27,64,27],[377.536,0.03,83,10],[377.556,0.31,57,14],[377.964,0.857,48,46],[378.232,0.204,67,15],[379.036,0.321,60,27],[379.036,0.857,48,46],[379.679,0.27,64,29],[379.679,0.03,83,10],[379.699,0.31,57,14],[380.107,0.857,45,49],[380.107,4.071,60,9],[380.893,0.321,64,28],[381.179,0.857,45,49],[381.58,0.7,67,13],[381.822,0.27,64,30],[381.822,0.03,83,11],[381.841,0.31,57,15],[382.25,0.857,45,52],[382.679,0.321,60,30],[383.322,0.204,60,17],[383.322,0.857,45,52],[383.964,0.27,64,32],[383.964,0.03,83,11],[383.984,0.31,57,16],[384.393,0.321,53,31],[384.393,0.857,41,54],[384.393,4.071,57,10],[385.464,0.857,41,54],[386.107,0.27,64,34],[386.107,0.03,83,12],[386.127,0.31,57,17],[386.25,0.321,60,48],[386.536,0.857,41,57],[387.339,0.7,65,15],[387.607,0.857,41,57],[388.036,0.321,57,51],[388.25,0.27,64,35],[388.25,0.03,83,12],[388.27,0.31,57,18],[388.411,0.204,53,28],[388.679,0.857,43,59],[388.679,4.071,55,13],[389.08,0.7,62,31],[389.75,0.321,55,53],[389.75,0.857,43,59],[390.393,0.27,64,37],[390.393,0.03,83,13],[390.413,0.31,57,19],[390.822,1.929,48,52],[391.607,0.321,67,49],[392.536,0.161,65,34],[392.964,0.248,48,40],[392.964,3.931,60,47],[393.223,0.035,117,11],[393.352,0.248,55,40],[393.999,0.248,48,40],[394.413,0.31,76,41],[394.62,0.27,64,29],[394.62,0.03,83,10],[394.64,0.31,57,14],[394.775,0.7,76,35],[394.775,0.197,72,29],[394.775,0.248,47,40],[395.033,0.248,48,42],[395.292,0.197,79,31],[395.421,0.7,76,67],[395.421,0.248,55,42],[396.068,0.31,72,55],[396.068,0.248,48,42],[396.688,0.27,64,30],[396.688,0.03,83,11],[396.709,0.31,57,15],[396.844,0.248,44,42],[397.102,0.248,45,44],[397.102,3.931,57,56],[397.49,0.248,52,44],[397.861,0.31,76,58],[397.878,0.035,117,12],[398.137,0.248,45,44],[398.395,0.035,117,12],[398.757,0.27,64,32],[398.757,0.03,83,11],[398.777,0.31,57,16],[398.913,0.248,44,44],[399.171,0.248,45,47],[399.559,0.248,52,47],[399.585,0.31,72,61],[400.206,0.197,72,34],[400.206,0.248,45,47],[400.827,0.27,64,34],[400.827,0.03,83,12],[400.846,0.31,57,17],[400.982,0.248,40,47],[401.24,0.31,65,64],[401.24,0.248,41,49],[401.24,3.931,53,22],[401.628,0.248,48,49],[402.016,0.7,72,19],[402.275,0.248,41,49],[402.533,0.035,117,8],[402.663,0.7,79,36],[402.895,0.27,64,36],[402.895,0.03,83,13],[402.915,0.31,57,18],[403.033,0.31,72,64],[403.051,0.248,40,49],[403.051,0.035,117,14],[403.309,0.248,41,51],[403.568,0.035,117,12],[403.697,0.248,48,51],[404.344,0.248,41,51],[404.757,0.31,69,68],[404.964,0.27,64,37],[404.964,0.03,83,13],[404.984,0.31,57,19],[405.12,0.197,65,38],[405.12,0.248,42,51],[405.378,0.248,43,54],[405.378,3.931,55,10],[405.637,0.197,67,40],[405.766,0.248,50,54],[406.413,0.31,67,72],[406.413,0.248,43,54],[407.033,0.27,64,39],[407.033,0.03,83,14],[407.053,0.31,57,19],[407.188,0.248,47,54],[407.447,1.862,48,55],[408.206,0.31,79,66],[408.223,0.7,76,17],[409.102,0.155,65,46],[409.516,0.24,48,42],[409.516,3.8,67,12],[409.891,0.7,84,21],[409.891,0.24,55,42],[410.516,0.24,48,42],[410.916,0.3,88,48],[411.116,0.27,64,30],[411.116,0.03,83,11],[411.136,0.31,57,15],[411.266,0.19,84,27],[411.266,0.24,47,42],[411.516,0.24,48,44],[411.766,0.19,91,34],[411.891,0.24,55,44],[412.516,0.3,84,61],[412.516,0.24,48,44],[412.766,0.035,117,10],[413.116,0.27,64,32],[413.116,0.03,83,11],[413.136,0.31,57,16],[413.266,0.24,44,44],[413.266,0.035,117,12],[413.516,0.24,45,47],[413.516,3.8,64,57],[413.766,0.035,117,8],[413.891,0.24,52,47],[414.249,0.3,88,64],[414.516,0.24,45,47],[415.116,0.27,64,34],[415.116,0.03,83,12],[415.136,0.31,57,17],[415.266,0.7,91,36],[415.266,0.24,44,47],[415.516,0.24,45,49],[415.891,0.7,86,68],[415.891,0.24,52,49],[415.916,0.3,84,67],[416.516,0.19,84,38],[416.516,0.24,45,49],[417.116,0.27,64,36],[417.116,0.03,83,13],[417.136,0.31,57,18],[417.141,0.27,48,36],[417.141,0.03,83,13],[417.161,0.31,42,18],[417.266,0.24,40,49],[417.516,0.3,77,71],[417.516,0.24,41,52],[417.516,3.8,60,66],[417.766,0.035,117,12],[417.891,0.24,48,52],[418.266,0.035,117,14],[418.516,0.24,41,52],[418.766,0.035,117,8],[419.116,0.27,64,38],[419.116,0.03,83,13],[419.136,0.31,57,19],[419.249,0.3,84,80],[419.266,0.24,40,52],[419.516,0.24,41,54],[419.891,0.24,48,54],[420.516,0.24,41,54],[420.916,0.3,81,84],[421.116,0.27,64,39],[421.116,0.03,83,14],[421.136,0.31,57,20],[421.266,0.19,77,47],[421.266,0.24,42,54],[421.516,0.24,43,57],[421.516,3.8,62,50],[421.766,0.19,79,49],[421.891,0.24,50,57],[422.266,0.7,86,39],[422.516,0.3,79,88],[422.516,0.24,43,57],[422.766,0.035,117,13],[422.891,0.7,95,75],[423.116,0.27,64,41],[423.116,0.03,83,14],[423.136,0.31,57,21],[423.266,0.24,47,57],[423.266,0.035,117,16],[423.516,1.8,48,58],[424.249,0.3,91,81],[425.116,0.15,77,57],[425.516,0.232,48,42],[425.516,3.677,64,10],[425.516,3.677,67,16],[425.879,0.232,55,42],[426.484,0.232,48,42],[426.871,0.29,100,52],[427.065,0.27,64,30],[427.065,0.03,83,11],[427.084,0.31,57,15],[427.21,0.184,96,29],[427.21,0.232,47,42],[427.452,0.232,48,44],[427.452,0.027,117,19],[427.693,0.184,96,31],[427.693,0.045,117,51],[427.815,0.232,55,44],[427.935,0.027,117,41],[428.177,0.045,117,69],[428.419,0.29,96,55],[428.419,0.232,48,44],[428.419,0.027,117,40],[428.661,0.045,117,48],[428.903,0.027,117,17],[429,0.27,64,32],[429,0.03,83,11],[429.02,0.31,57,16],[429.145,0.232,44,44],[429.387,0.232,45,47],[429.387,3.677,60,29],[429.75,0.7,100,43],[429.75,0.232,52,47],[430.097,0.29,100,58],[430.355,0.232,45,47],[430.935,0.27,64,34],[430.935,0.03,83,12],[430.955,0.31,57,17],[431.081,0.232,44,47],[431.323,0.232,45,49],[431.497,0.4,106,9],[431.685,0.232,52,49],[431.71,0.29,96,61],[432.29,0.184,96,34],[432.29,0.232,45,49],[432.29,0.027,117,10],[432.532,0.045,117,43],[432.774,0.027,117,40],[432.871,0.27,64,36],[432.871,0.03,83,13],[432.891,0.31,57,18],[432.895,0.27,48,36],[432.895,0.03,83,13],[432.915,0.31,42,18],[433.016,0.232,40,49],[433.016,0.045,117,75],[433.258,0.29,89,65],[433.258,0.232,41,52],[433.258,3.677,57,46],[433.258,0.027,117,50],[433.5,0.045,117,69],[433.621,0.232,48,52],[433.742,0.027,117,31],[433.984,0.045,117,21],[434.226,0.232,41,52],[434.806,0.27,64,38],[434.806,0.03,83,13],[434.826,0.31,57,19],[434.935,0.29,96,55],[434.952,0.232,40,52],[435.193,0.232,41,54],[435.556,0.7,101,48],[435.556,0.232,48,54],[436.161,0.232,41,54],[436.548,0.29,93,58],[436.742,0.27,64,39],[436.742,0.03,83,14],[436.762,0.31,57,20],[436.887,0.184,89,32],[436.887,0.232,42,54],[437.129,0.232,43,57],[437.129,3.677,59,53],[437.371,0.184,91,34],[437.371,0.045,117,29],[437.492,0.232,50,57],[437.613,0.027,117,37],[437.855,0.045,117,78],[438.097,0.29,91,60],[438.097,0.232,43,57],[438.097,0.027,117,55],[438.339,0.045,117,85],[438.581,0.027,117,44],[438.677,0.27,64,41],[438.677,0.03,83,14],[438.697,0.31,57,21],[438.823,0.232,47,57],[438.823,0.045,117,44],[439.065,1.742,48,58],[439.774,0.29,103,56],[439.79,0.218,67,79],[441,3.8,62,16],[441.733,0.3,69,29],[441.75,0.7,62,8],[441.75,0.21,50,55],[442,0.21,50,55],[442.733,0.3,69,29],[442.75,0.7,66,8],[442.75,0.21,50,55],[443,0.21,50,58],[443.375,0.7,66,15],[443.4,0.3,66,31],[443.75,0.21,50,58],[444,0.3,62,31],[444,0.21,50,58],[444.733,0.3,69,31],[444.75,0.21,50,58],[445,0.21,47,61],[445,3.8,62,8],[445.75,0.21,47,61],[446,0.21,47,61],[446.75,0.21,47,61],[447,0.21,47,65],[447.75,0.21,47,65],[447.75,0.23,62,75],[448,0.21,47,65],[448,0.92,59,75],[448.75,0.21,47,65],[449,0.21,43,68],[449,3.8,55,14],[449,0.46,62,83],[449.5,0.46,67,83],[449.75,0.21,43,68],[450,0.21,43,68],[450.75,0.21,43,68],[451,0.21,43,71],[451.75,0.21,43,71],[452,0.21,43,71],[452.4,0.3,59,38],[452.75,0.21,43,71],[453,0.3,57,40],[453,0.21,45,75],[453,3.8,57,23],[453.733,0.3,64,40],[453.75,0.7,64,11],[453.75,0.21,45,75],[454,0.21,45,75],[454.4,0.3,61,40],[454.75,0.7,73,11],[454.75,0.21,45,75],[455,0.21,50,69],[455.375,0.7,66,20],[455.4,0.3,66,37],[455.75,0.21,50,69],[456,0.3,62,37],[456,0.21,50,69],[456.733,0.3,69,37],[456.75,0.21,50,69],[457,0.21,50,58],[457,3.8,62,19],[457.375,0.7,62,15],[457.75,0.21,50,58],[458,0.21,50,58],[458.75,0.21,50,58],[459,0.21,50,61],[459.75,0.21,50,61],[460,0.21,50,61],[460,0.92,62,70],[460.75,0.21,50,61],[461,0.21,47,65],[461,3.8,59,17],[461,0.46,66,79],[461.5,0.23,69,79],[461.75,0.21,47,65],[461.75,0.23,71,79],[462,0.21,47,65],[462,0.46,69,79],[462.75,0.21,47,65],[463,0.21,47,68],[463.25,0.414,52,26],[463.75,0.21,47,68],[464,0.21,47,68],[464.75,0.21,47,68],[465,0.3,55,38],[465,0.21,43,72],[465,3.8,55,9],[465.733,0.3,62,38],[465.75,0.7,62,10],[465.75,0.21,43,72],[466,0.21,43,72],[466.4,0.3,59,38],[466.75,0.7,69,10],[466.75,0.21,43,72],[467,0.3,55,40],[467,0.21,43,75],[467.4,0.3,59,40],[467.75,0.7,67,10],[467.75,0.21,43,75],[468,0.3,55,40],[468,0.21,43,75],[468.733,0.3,62,40],[468.75,0.21,43,75],[469,0.21,45,79],[469,3.8,64,16],[469.375,0.7,64,29],[469.4,0.3,61,59],[469.75,0.21,45,79],[470,0.21,45,79],[470.75,0.21,45,79],[471,0.21,50,73],[471.75,0.21,50,73],[472,0.21,50,73],[472.75,0.21,50,73],[473,0.207,50,58],[473,3.738,69,18],[473,0.453,62,107],[473,0.027,117,40],[473.246,0.045,117,64],[473.492,0.226,66,107],[473.492,0.027,117,35],[473.738,0.207,50,58],[473.738,0.226,69,107],[473.738,0.045,117,40],[473.984,0.207,50,58],[473.984,0.679,66,107],[473.984,0.027,117,11],[474.721,0.207,50,58],[474.721,0.226,64,107],[474.967,0.207,50,61],[475.705,0.207,50,61],[475.951,0.207,50,61],[476.688,0.207,50,61],[476.934,0.207,47,65],[476.934,3.738,66,21],[477.426,0.027,117,19],[477.656,0.295,66,48],[477.672,0.207,47,65],[477.672,0.045,117,53],[477.918,0.207,47,65],[477.918,0.027,117,43],[478.164,0.045,117,73],[478.312,0.295,62,48],[478.41,0.027,117,42],[478.656,0.7,69,13],[478.656,0.207,47,65],[478.656,0.045,117,51],[478.902,0.295,59,51],[478.902,0.207,47,68],[478.902,0.027,117,19],[479.623,0.295,66,51],[479.639,0.7,64,13],[479.639,0.207,47,68],[479.885,0.295,59,51],[479.885,0.207,47,68],[480.606,0.295,66,51],[480.623,0.207,47,68],[480.869,0.207,43,72],[480.869,3.738,62,19],[481.238,0.7,62,27],[481.262,0.295,59,54],[481.606,0.207,43,72],[481.852,0.295,55,54],[481.852,0.207,43,72],[482.221,0.7,69,27],[482.344,0.027,117,15],[482.59,0.207,43,72],[482.59,0.045,117,51],[482.836,0.207,43,75],[482.836,0.027,117,47],[483.082,0.045,117,84],[483.328,0.027,117,51],[483.574,0.207,43,75],[483.574,0.045,117,67],[483.82,0.207,43,75],[483.82,0.027,117,27],[484.066,0.045,117,12],[484.557,0.207,43,75],[484.803,0.207,45,79],[484.803,3.738,64,11],[484.803,0.453,64,146],[485.295,0.226,66,146],[485.541,0.207,45,79],[485.541,0.226,69,146],[485.787,0.207,45,79],[485.787,0.679,73,146],[486.525,0.207,45,79],[486.525,0.226,69,146],[486.771,0.207,50,73],[486.771,0.453,66,146],[487.262,0.027,117,9],[487.508,0.207,50,73],[487.508,0.045,117,43],[487.754,0.207,50,73],[487.754,0.027,117,42],[488,0.045,117,79],[488.246,0.027,117,51],[488.492,0.207,50,73],[488.492,0.045,117,71],[488.738,0.203,50,61],[488.738,3.677,66,12],[488.738,0.027,117,26],[488.98,0.045,117,19],[489.464,0.203,50,61],[489.705,0.203,50,61],[490.092,0.29,66,45],[490.431,0.203,50,60],[490.673,0.29,62,48],[490.673,0.203,50,64],[491.06,0.29,66,11],[491.157,0.11,98,26],[491.157,0.095,54,29],[491.383,0.29,69,45],[491.399,0.7,78,11],[491.399,0.203,50,60],[491.641,0.29,62,21],[491.641,0.203,50,58],[491.883,0.045,117,10],[492.028,0.29,66,38],[492.125,0.11,98,62],[492.125,0.095,54,70],[492.125,0.027,117,28],[492.351,0.29,69,32],[492.367,0.203,50,42],[492.367,0.045,117,67],[492.609,0.203,47,35],[492.609,3.677,62,19],[492.609,0.027,117,48],[492.851,0.045,117,57],[492.996,0.29,62,12],[493.092,0.11,98,100],[493.092,0.095,54,113],[493.092,0.027,117,12],[493.334,0.223,71,9],[493.576,0.445,69,40],[494.06,0.11,98,65],[494.06,0.095,54,73],[494.06,0.445,66,97],[494.544,0.668,76,126],[495.028,0.027,117,23],[495.254,0.29,66,46],[495.27,0.045,117,76],[495.512,0.03,99,80],[495.512,0.055,50,213],[495.512,0.027,117,45],[495.572,0.16,39,201],[495.572,0.14,51,120],[495.754,0.045,117,21],[495.899,0.29,62,32],[496.222,0.29,66,39],[496.238,0.03,99,20],[496.238,0.055,50,53],[496.298,0.16,39,25],[496.298,0.14,51,15],[496.48,0.203,43,14],[496.48,3.677,59,23],[496.48,3.677,62,15],[496.842,0.7,62,10],[496.867,0.29,59,19],[497.205,0.203,43,50],[497.205,0.045,117,34],[497.447,0.203,43,32],[497.447,0.223,69,94],[497.447,0.027,117,53],[497.689,0.045,117,58],[497.834,0.29,59,15],[497.931,0.11,98,92],[497.931,0.095,54,104],[498.173,0.7,69,11],[498.415,0.29,55,41],[498.415,0.03,99,32],[498.415,0.055,50,84],[498.475,0.16,39,113],[498.475,0.14,51,68],[498.657,0.267,67,16],[498.778,0.7,79,21],[498.802,0.29,59,44],[499.141,0.045,117,69],[499.383,0.89,74,14],[499.383,0.027,117,50],[500.109,0.203,43,37],[500.351,0.29,57,46],[500.351,3.677,57,74],[500.714,0.7,64,22],[500.738,0.29,61,46],[500.834,0.027,117,55],[501.076,0.045,117,60],[501.318,0.03,99,89],[501.318,0.055,50,238],[501.318,0.668,73,46],[501.378,0.16,39,205],[501.378,0.14,51,123],[502.044,0.203,45,56],[502.044,0.223,69,44],[502.286,0.29,62,35],[502.286,0.203,50,43],[502.286,0.027,117,40],[502.528,0.045,117,73],[502.649,0.7,78,21],[502.673,0.29,66,38],[502.77,0.11,98,74],[502.77,0.095,54,84],[503.254,0.03,99,77],[503.254,0.055,50,205],[503.254,0.89,74,155],[503.314,0.16,39,208],[503.314,0.14,51,125],[503.496,0.534,62,16],[503.738,0.027,117,36],[503.98,0.203,50,36],[503.98,0.045,117,77],[504.222,0.29,62,34],[504.222,0.203,50,43],[504.222,3.677,66,24],[504.584,0.7,62,17],[504.609,0.29,66,34],[504.705,0.11,98,86],[504.705,0.095,54,96],[504.947,0.223,69,121],[505.189,0.03,99,38],[505.189,0.055,50,102],[505.189,0.668,66,105],[505.189,0.027,117,26],[505.249,0.16,39,125],[505.249,0.14,51,75],[505.431,0.045,117,63],[505.576,0.29,66,16],[505.915,0.7,66,9],[505.915,0.203,50,8],[506.157,0.29,62,17],[506.157,0.203,50,40],[506.52,0.7,78,12],[506.544,0.29,66,22],[506.641,0.11,98,92],[506.641,0.095,54,103],[506.641,0.027,117,20],[506.883,0.045,117,71],[507.125,0.89,74,126],[507.125,0.027,117,9],[507.185,0.16,39,13],[507.185,0.14,51,8],[507.512,0.29,66,34],[507.834,0.29,69,25],[508.092,3.677,62,66],[508.334,0.045,117,69],[508.48,0.29,62,9],[508.576,0.095,54,7],[508.576,0.223,69,9],[508.576,0.027,117,36],[508.818,0.203,47,32],[508.818,0.223,71,106],[509.06,0.445,69,143],[509.544,0.11,98,9],[509.544,0.095,54,10],[509.544,0.445,66,12],[509.77,0.29,66,21],[510.028,0.29,59,10],[510.028,0.03,99,78],[510.028,0.055,50,207],[510.028,0.027,117,45],[510.088,0.16,39,200],[510.088,0.14,51,120],[510.27,0.045,117,67],[510.391,0.7,76,14],[510.415,0.29,62,28],[510.754,0.223,74,16],[510.996,0.203,47,34],[510.996,0.89,71,95],[511.48,0.11,98,33],[511.48,0.095,54,37],[511.722,0.203,47,33],[511.722,0.045,117,14],[511.964,0.203,43,10],[511.964,3.677,55,48],[511.964,0.445,62,28],[511.964,0.027,117,47],[512.205,0.045,117,78],[512.351,0.29,59,24],[512.447,0.11,98,78],[512.447,0.095,54,88],[512.447,0.027,117,16],[512.673,0.29,62,14],[512.689,0.7,62,11],[512.931,0.29,55,42],[512.931,0.03,99,12],[512.931,0.055,50,31],[512.991,0.16,39,51],[512.991,0.14,51,30],[513.294,0.7,69,15],[513.641,0.29,62,11],[513.899,0.03,99,88],[513.899,0.055,50,235],[513.899,0.445,79,16],[513.959,0.16,39,217],[513.959,0.14,51,130],[514.141,0.045,117,35],[514.383,0.223,78,107],[514.383,0.027,117,50],[514.625,0.223,76,135],[514.625,0.134,66,17],[514.625,0.045,117,87],[514.867,0.03,99,24],[514.867,0.055,50,65],[514.867,0.89,74,44],[514.867,0.134,64,9],[514.867,0.027,117,38],[514.927,0.16,39,48],[514.927,0.14,51,29],[515.109,0.045,117,10],[515.592,0.203,43,21],[515.835,0.29,57,25],[515.835,0.203,45,32],[515.835,3.677,57,42],[516.544,0.29,64,39],[516.56,0.7,64,10],[516.56,0.203,45,50],[516.802,0.203,45,53],[517.189,0.29,61,44],[517.512,0.29,64,46],[517.528,0.7,73,12],[517.528,0.203,45,57],[517.528,0.045,117,35],[517.77,0.203,50,53],[517.77,0.027,117,40],[518.012,0.045,117,81],[518.133,0.7,78,23],[518.157,0.29,66,43],[518.254,0.027,117,54],[518.496,0.203,50,54],[518.496,0.045,117,75],[518.738,0.29,62,43],[518.738,0.203,50,54],[518.738,0.027,117,34],[518.98,0.045,117,24],[519.447,0.29,69,43],[519.463,0.203,50,54],[519.705,0.207,50,41],[519.705,3.738,62,50],[520.074,0.7,62,16],[520.443,0.207,50,41],[520.689,0.207,50,41],[521.427,0.207,50,41],[521.673,0.207,50,43],[522.41,0.207,50,43],[522.41,0.045,117,27],[522.656,0.207,50,43],[522.656,0.905,62,121],[522.656,0.027,117,31],[522.902,0.045,117,63],[523.148,0.027,117,43],[523.394,0.207,50,43],[523.394,0.045,117,64],[523.64,0.207,47,46],[523.64,3.738,59,34],[523.64,0.453,66,136],[523.64,0.027,117,33],[523.886,0.045,117,30],[524.132,0.226,69,109],[524.378,0.207,47,46],[524.378,0.226,71,109],[524.624,0.207,47,46],[524.624,0.453,69,109],[525.361,0.207,47,46],[525.607,0.207,47,48],[526.345,0.207,47,48],[526.591,0.207,47,48],[527.328,0.207,47,48],[527.328,0.045,117,20],[527.574,0.295,55,46],[527.574,0.207,43,51],[527.574,3.738,62,31],[527.574,0.027,117,31],[527.82,0.045,117,69],[528.066,0.027,117,50],[528.296,0.295,62,46],[528.312,0.7,62,12],[528.312,0.207,43,51],[528.312,0.045,117,78],[528.558,0.207,43,51],[528.558,0.027,117,41],[528.804,0.045,117,42],[528.951,0.295,59,46],[529.05,0.027,117,8],[529.296,0.7,69,12],[529.296,0.207,43,51],[529.542,0.295,55,49],[529.542,0.207,43,53],[529.935,0.295,59,49],[530.279,0.7,67,12],[530.279,0.207,43,53],[530.525,0.295,55,49],[530.525,0.207,43,53],[531.246,0.295,62,49],[531.263,0.207,43,53],[531.509,0.207,45,56],[531.509,3.738,64,64],[531.878,0.7,64,25],[531.902,0.295,61,51],[532.246,0.207,45,56],[532.246,0.045,117,12],[532.492,0.207,45,56],[532.492,0.027,117,28],[532.738,0.045,117,70],[532.984,0.027,117,54],[533.23,0.207,45,56],[533.23,0.045,117,88],[533.476,0.207,50,51],[533.476,0.027,117,45],[533.722,0.045,117,51],[533.968,0.027,117,15],[534.214,0.207,50,51],[534.46,0.207,50,51],[535.197,0.207,50,51],[535.443,0.214,50,41],[535.443,3.864,69,56],[535.443,0.468,62,97],[535.952,0.234,66,97],[536.206,0.214,50,41],[536.206,0.234,69,97],[536.46,0.214,50,41],[536.46,0.702,66,97],[537.223,0.214,50,41],[537.223,0.234,64,97],[537.477,0.214,50,43],[538.24,0.214,50,43],[538.494,0.214,50,43],[539.257,0.214,50,43],[539.511,0.214,47,46],[539.511,3.864,66,57],[540.257,0.305,66,42],[540.274,0.214,47,46],[540.528,0.214,47,46],[540.935,0.305,62,42],[541.291,0.214,47,46],[541.545,0.305,59,44],[541.545,0.214,47,48],[542.308,0.214,47,48],[542.562,0.305,59,44],[542.562,0.214,47,48],[543.308,0.305,66,44],[543.324,0.214,47,48],[543.579,0.214,43,51],[543.579,3.864,62,38],[543.96,0.7,62,23],[543.986,0.305,59,46],[544.341,0.214,43,51],[544.596,0.305,55,46],[544.596,0.214,43,51],[544.977,0.7,69,23],[545.358,0.214,43,51],[545.613,0.214,43,53],[546.375,0.214,43,53],[546.63,0.214,43,53],[547.392,0.214,43,53],[547.646,4.068,74,55],[547.646,0.214,45,56],[547.646,4.068,50,41],[547.646,3.864,61,35],[547.646,0.468,64,132],[548.155,0.234,66,132],[548.409,0.214,45,56],[548.409,0.234,69,132],[548.663,0.214,45,56],[548.663,0.702,73,132],[549.426,0.214,45,56],[549.426,0.234,69,132],[549.68,0.214,50,51],[549.68,0.468,66,132],[550.443,0.214,50,51],[550.697,0.214,50,51],[551.46,0.214,50,51],[558.633,0.193,71,29],[559.769,0.58,79,30],[560.678,0.773,74,30],[565.905,0.193,71,22],[567.042,0.58,79,22],[567.951,0.773,74,22],[568.86,0.58,67,16],[568.86,0.227,43,58],[569.542,0.193,67,22],[569.769,0.773,67,22],[569.769,0.227,50,52],[570.678,0.58,67,22],[570.678,0.227,43,58],[571.36,0.193,67,22],[571.587,0.773,67,22],[571.587,0.227,50,52],[572.496,0.58,67,22],[572.496,0.227,43,58],[573.178,0.193,67,16],[573.405,0.773,67,16],[573.405,0.227,50,52],[574.314,0.58,67,16],[574.314,0.227,43,58],[574.996,0.193,67,16],[575.223,0.773,67,16],[575.223,0.227,50,52],[576.133,0.58,67,16],[576.133,0.227,43,58],[576.814,0.193,67,16],[577.042,0.773,67,24],[577.042,0.227,50,52],[577.951,0.58,67,24],[577.951,0.227,43,58],[578.633,0.193,67,24],[578.86,0.773,67,24],[578.86,0.227,50,52],[579.769,0.58,67,24],[579.769,0.227,43,58],[580.451,0.193,67,24],[580.678,0.773,67,24],[580.678,0.227,50,52],[581.587,0.58,67,29],[581.587,0.227,43,58],[582.269,0.193,67,29],[582.496,0.773,67,29],[582.496,0.227,50,52],[587.723,0.193,83,41],[588.86,0.58,91,41],[589.769,0.773,86,41],[590.678,0.159,79,54],[590.678,0.159,43,69],[592.437,0.277,48,21],[592.437,4.385,67,22],[592.726,0.035,117,8],[592.87,0.277,55,21],[593.302,0.035,117,11],[593.591,0.346,72,23],[593.591,0.277,48,21],[594.283,0.27,64,27],[594.283,0.03,83,9],[594.303,0.31,57,14],[594.456,0.219,72,13],[594.456,0.277,47,21],[594.745,0.277,48,22],[595.033,0.219,79,13],[595.177,0.7,76,11],[595.177,0.277,55,22],[595.591,0.346,79,23],[595.899,0.277,48,21],[596.476,0.07,98,9],[596.591,0.27,64,25],[596.591,0.03,83,9],[596.611,0.31,57,13],[596.764,0.277,44,19],[597.052,0.346,69,16],[597.052,0.277,45,19],[597.052,4.385,64,19],[597.341,0.035,117,10],[597.485,0.277,52,16],[597.514,0.346,72,17],[597.629,0.07,98,17],[597.745,0.27,64,25],[597.745,0.03,83,9],[597.765,0.31,57,13],[597.918,0.035,117,9],[598.206,0.277,45,10],[598.783,0.07,98,22],[599.052,0.346,76,25],[599.937,0.07,98,19],[600.052,0.27,64,25],[600.052,0.03,83,9],[600.072,0.31,57,12],[600.514,0.346,69,22],[600.802,0.035,117,7],[601.379,0.035,117,12],[601.668,0.27,48,11],[601.668,0.055,50,12],[601.668,4.385,53,13],[601.728,0.16,39,13],[601.728,0.14,51,8],[602.129,0.346,69,15],[602.514,0.346,72,18],[602.822,0.219,69,7],[602.822,0.27,48,43],[602.822,0.03,83,15],[602.822,0.03,99,16],[602.822,0.055,50,44],[602.842,0.31,42,22],[602.882,0.16,39,42],[602.882,0.14,51,25],[603.687,0.219,65,15],[603.976,0.346,65,28],[603.976,0.27,48,48],[603.976,0.03,83,17],[603.976,0.03,99,17],[603.976,0.055,50,47],[603.995,0.31,42,24],[604.035,0.16,39,43],[604.035,0.14,51,26],[604.264,0.219,72,14],[604.264,0.035,117,9],[604.408,0.7,77,8],[604.841,0.035,117,13],[605.129,0.219,69,15],[605.129,0.27,48,22],[605.129,0.03,83,8],[605.129,0.03,99,8],[605.129,0.055,50,22],[605.149,0.31,42,11],[605.189,0.16,39,19],[605.189,0.14,51,11],[605.591,0.346,69,29],[606.283,0.277,43,9],[606.283,4.385,62,33],[606.716,0.277,50,17],[607.129,0.346,74,18],[607.437,0.346,67,22],[607.437,0.277,43,27],[608.129,0.27,64,32],[608.129,0.03,83,11],[608.149,0.31,57,16],[608.302,0.277,47,34],[608.302,0.035,117,14],[608.591,2.077,48,37],[609.052,0.346,76,27],[609.456,0.7,76,8],[610.437,0.173,65,20],[610.899,4.56,64,18],[612.819,0.27,64,26],[612.819,0.03,83,9],[612.839,0.31,57,13],[614.499,0.228,76,16],[615.219,0.27,64,27],[615.219,0.03,83,10],[615.239,0.31,57,14],[615.699,4.56,60,26],[616.599,0.7,76,8],[617.349,0.7,79,15],[617.619,0.27,64,29],[617.619,0.03,83,10],[617.639,0.31,57,14],[620.019,0.27,64,30],[620.019,0.03,83,11],[620.039,0.31,57,15],[620.199,0.228,76,18],[620.499,0.36,65,33],[620.499,4.56,57,18],[621.379,0.36,72,33],[622.179,0.36,69,33],[622.419,0.27,64,32],[622.419,0.03,83,11],[622.439,0.31,57,16],[622.899,0.36,65,35],[623.779,0.36,72,35],[623.799,0.7,77,9],[624.579,0.36,69,35],[624.819,0.27,64,33],[624.819,0.03,83,12],[624.839,0.31,57,17],[625.299,0.36,67,37],[625.299,4.56,59,8],[625.749,0.7,74,18],[626.179,0.36,74,37],[626.979,0.36,71,37],[627.219,0.27,64,35],[627.219,0.03,83,12],[627.239,0.31,57,17],[627.699,0.36,72,34],[628.579,0.36,79,34],[629.379,0.18,64,24],[630.099,4.75,60,11],[632.099,0.27,64,23],[632.099,0.03,83,8],[632.119,0.31,57,11],[634.599,0.27,64,24],[634.599,0.03,83,8],[634.619,0.31,57,12],[635.099,4.75,57,17],[635.567,0.7,76,13],[637.099,0.27,64,25],[637.099,0.03,83,9],[637.119,0.31,57,13],[639.599,0.27,64,27],[639.599,0.03,83,9],[639.619,0.31,57,13],[640.099,4.75,53,16],[642.099,0.27,64,28],[642.099,0.03,83,10],[642.119,0.31,57,14],[643.067,0.7,77,15],[644.599,0.27,64,30],[644.599,0.03,83,10],[644.619,0.31,57,15],[645.099,4.75,55,8],[647.099,0.27,64,31],[647.099,0.03,83,11],[647.119,0.31,57,15],[649.599,0.188,65,21],[650.577,0.7,72,11],[658.237,0.7,74,12],[667.173,0.7,83,13],[669.758,0.192,64,17],[690.872,0.196,65,16],[721.212,2.4,76,39],[771.412,0.27,48,65],[771.412,0.03,83,23],[771.432,0.31,42,32]],[[36.325,0.427,74,169],[43.24,0.333,76,199],[46.2,0.666,74,199],[51.02,0.756,76,199],[55.5,0.396,72,199],[57.26,0.396,76,177],[60.26,0.15,67,173],[60.42,0.36,72,22],[61.62,0.36,72,22],[62.82,0.36,72,23],[64.02,0.36,72,23],[65.22,0.36,69,24],[66.42,0.36,69,24],[67.62,0.36,69,25],[68.82,0.36,69,25],[70.02,0.36,65,22],[71.22,0.36,65,22],[72.42,0.36,65,23],[73.62,0.36,65,23],[74.82,0.36,67,24],[76.02,0.36,67,24],[77.22,0.36,72,22],[79.38,0.18,67,22],[79.62,0.353,72,29],[80.796,0.353,72,29],[81.973,0.353,72,31],[83.149,0.353,72,31],[84.326,0.353,69,32],[85.502,0.353,69,32],[86.679,0.353,69,23],[86.973,0.224,69,13],[87.855,0.353,69,23],[92.561,0.224,69,14],[98.208,0.176,67,31],[98.444,0.346,72,39],[98.732,0.035,117,8],[99.309,0.035,117,10],[99.597,0.346,72,39],[99.597,0.219,76,22],[100.751,0.346,72,20],[101.184,0.7,76,9],[101.905,0.346,72,20],[103.059,0.346,69,21],[103.924,0.035,117,11],[104.213,0.346,69,21],[104.501,0.035,117,10],[105.078,0.219,76,12],[105.367,0.346,69,22],[105.655,0.219,69,13],[106.52,0.346,69,35],[108.54,0.035,117,7],[109.117,0.035,117,13],[109.261,0.7,79,18],[109.694,0.035,117,9],[111.136,0.219,69,21],[113.732,0.035,117,11],[114.309,0.035,117,14],[116.674,0.173,67,19],[117.814,0.227,57,10],[117.814,0.227,60,10],[117.814,0.227,64,10],[119.178,0.227,57,10],[119.178,0.227,60,10],[119.178,0.227,64,10],[120.541,0.227,62,10],[120.541,0.227,65,10],[120.541,0.227,69,10],[121.905,0.227,64,10],[121.905,0.227,68,10],[121.905,0.227,71,10],[123.269,0.227,57,10],[123.269,0.227,60,10],[123.269,0.227,64,10],[124.632,0.227,65,10],[124.632,0.227,69,10],[124.632,0.227,72,10],[125.996,0.227,62,10],[125.996,0.227,65,10],[125.996,0.227,69,10],[127.36,0.227,64,10],[127.36,0.227,68,10],[127.36,0.227,71,10],[128.723,0.227,57,10],[128.723,0.227,60,10],[128.723,0.227,64,10],[130.087,0.227,57,10],[130.087,0.227,60,10],[130.087,0.227,64,10],[131.451,0.227,62,10],[131.451,0.227,65,10],[131.451,0.227,69,10],[132.814,0.227,64,10],[132.814,0.227,68,10],[132.814,0.227,71,10],[134.178,0.227,57,10],[134.178,0.227,60,10],[134.178,0.227,64,10],[135.541,0.227,65,9],[135.541,0.227,69,9],[135.541,0.227,72,9],[136.905,0.227,64,9],[136.905,0.227,68,9],[136.905,0.227,71,9],[138.269,0.227,57,9],[138.269,0.227,60,9],[138.269,0.227,64,9],[138.723,0.045,111,17],[138.951,0.191,72,10],[139.405,0.045,111,14],[139.632,0.227,57,9],[139.632,0.227,60,9],[139.632,0.227,64,9],[140.996,0.227,57,9],[140.996,0.227,60,9],[140.996,0.227,64,9],[142.36,0.227,62,9],[142.36,0.227,65,9],[142.36,0.227,69,9],[142.36,0.409,79,26],[143.496,0.045,111,8],[143.723,0.227,64,9],[143.723,0.227,68,9],[143.723,0.227,71,9],[143.723,0.191,83,10],[144.178,0.045,111,22],[145.087,0.227,57,11],[145.087,0.227,60,11],[145.087,0.227,64,11],[145.769,0.191,77,12],[146.451,0.227,65,11],[146.451,0.227,69,11],[146.451,0.227,72,11],[146.451,0.409,76,31],[147.814,0.227,62,11],[147.814,0.227,65,11],[147.814,0.227,69,11],[148.951,0.045,111,14],[149.178,0.227,64,11],[149.178,0.227,68,11],[149.178,0.227,71,11],[149.632,0.045,111,16],[150.541,0.227,57,11],[150.541,0.227,60,11],[150.541,0.227,64,11],[150.541,0.409,77,33],[150.541,0.191,72,12],[151.905,0.227,57,11],[151.905,0.227,60,11],[151.905,0.227,64,11],[152.587,0.191,81,12],[153.269,0.227,62,11],[153.269,0.227,65,11],[153.269,0.227,69,11],[153.723,0.045,111,17],[154.405,0.045,111,14],[154.632,0.227,64,13],[154.632,0.227,68,13],[154.632,0.227,71,13],[155.087,0.818,74,38],[155.996,0.227,57,13],[155.996,0.227,60,13],[155.996,0.227,64,13],[157.36,0.227,65,13],[157.36,0.227,69,13],[157.36,0.227,72,13],[157.36,0.191,77,14],[158.269,0.409,72,38],[158.496,0.045,111,8],[158.723,0.227,64,13],[158.723,0.227,68,13],[158.723,0.227,71,13],[159.178,0.045,111,22],[159.405,0.191,72,14],[160.087,0.227,57,13],[160.087,0.227,60,13],[160.087,0.227,64,13],[161.451,0.227,57,15],[161.451,0.227,60,15],[161.451,0.227,64,15],[161.905,1.227,73,14],[162.814,0.227,57,17],[162.814,0.227,60,17],[162.814,0.227,64,17],[163.951,0.045,111,14],[164.178,0.227,62,17],[164.178,0.227,65,17],[164.178,0.227,69,17],[164.178,0.191,69,20],[164.632,0.045,111,16],[165.541,0.227,64,17],[165.541,0.227,68,17],[165.541,0.227,71,17],[166.223,0.191,57,20],[166.905,0.227,57,17],[166.905,0.227,60,17],[166.905,0.227,64,17],[166.905,0.409,73,17],[168.269,0.227,65,17],[168.269,0.227,69,17],[168.269,0.227,72,17],[168.723,0.045,111,17],[169.405,0.045,111,14],[169.632,0.227,62,17],[169.632,0.227,65,17],[169.632,0.227,69,17],[170.087,1.227,68,17],[170.996,0.227,64,15],[170.996,0.227,68,15],[170.996,0.227,71,15],[170.996,0.191,68,18],[172.36,0.227,57,15],[172.36,0.227,60,15],[172.36,0.227,64,15],[173.041,0.191,64,18],[173.496,0.045,111,8],[173.723,0.227,57,15],[173.723,0.227,60,15],[173.723,0.227,64,15],[174.178,0.045,111,22],[175.087,0.227,62,15],[175.087,0.227,65,15],[175.087,0.227,69,15],[175.087,0.409,75,16],[176.451,0.227,64,15],[176.451,0.227,68,15],[176.451,0.227,71,15],[177.814,0.227,57,15],[177.814,0.227,60,15],[177.814,0.227,64,15],[177.814,0.191,57,18],[178.951,0.045,111,14],[179.178,0.227,65,15],[179.178,0.227,69,15],[179.178,0.227,72,15],[179.178,0.409,73,16],[179.632,0.045,111,16],[179.86,0.191,68,15],[180.541,0.227,64,13],[180.541,0.227,68,13],[180.541,0.227,71,13],[181.905,0.227,57,13],[181.905,0.227,60,13],[181.905,0.227,64,13],[183.327,0.242,57,12],[183.327,0.242,60,12],[183.327,0.242,64,12],[184.779,0.242,65,12],[184.779,0.242,69,12],[184.779,0.242,72,12],[186.231,0.242,64,12],[186.231,0.242,68,12],[186.231,0.242,71,12],[187.682,0.242,57,12],[187.682,0.242,60,12],[187.682,0.242,64,12],[189.238,0.268,57,12],[189.238,0.268,60,12],[189.238,0.268,64,12],[190.845,0.268,65,12],[190.845,0.268,69,12],[190.845,0.268,72,12],[192.452,0.268,64,12],[192.452,0.268,68,12],[192.452,0.268,71,12],[192.988,1.607,69,28],[194.059,0.268,57,12],[194.059,0.268,60,12],[194.059,0.268,64,12],[195.195,0.158,65,15],[195.392,0.158,67,15],[196.774,0.158,60,11],[196.971,0.158,58,11],[197.168,0.158,72,15],[197.366,0.158,70,15],[198.747,0.158,69,15],[198.945,0.158,70,15],[200.326,0.158,56,11],[200.524,0.158,55,11],[200.721,0.158,69,15],[200.918,0.158,67,15],[202.3,0.158,72,27],[202.497,0.158,74,27],[203.879,0.158,56,20],[204.076,0.158,58,20],[205.383,0.143,67,20],[205.561,0.143,65,20],[205.74,0.143,76,27],[205.918,0.143,77,27],[207.168,0.143,60,20],[207.347,0.143,62,17],[208.597,0.143,63,17],[208.775,0.143,62,17],[208.954,0.143,76,23],[209.133,0.143,74,23],[210.383,0.143,63,17],[210.383,0.143,65,23],[210.561,0.143,65,17],[210.561,0.143,67,23],[211.811,0.143,60,17],[211.99,0.143,58,17],[212.168,0.143,72,23],[212.347,0.143,70,23],[213.566,0.13,69,34],[213.729,0.13,70,34],[214.87,0.13,56,25],[215.033,0.13,55,25],[215.196,0.13,69,34],[215.359,0.13,67,34],[216.501,0.13,72,34],[216.664,0.13,74,34],[217.805,0.13,56,25],[217.968,0.13,58,25],[219.031,0.114,69,53],[219.528,0.114,74,53],[220.462,0.5,102,108],[223.328,0.143,67,35],[223.506,0.143,65,35],[223.685,0.143,76,47],[223.864,0.143,77,47],[225.114,0.143,60,35],[225.292,0.143,62,35],[226.542,0.143,63,43],[226.721,0.143,62,43],[226.899,0.143,76,57],[227.078,0.143,74,57],[228.328,0.143,63,43],[228.328,0.13,65,57],[228.491,0.13,67,57],[228.506,0.143,65,43],[229.632,0.13,60,43],[229.795,0.13,58,43],[229.958,0.13,72,57],[230.121,0.13,70,57],[231.263,0.13,69,67],[231.426,0.13,70,67],[232.567,0.13,56,50],[232.73,0.13,55,50],[232.893,0.13,69,67],[233.056,0.13,67,67],[234.145,0.12,72,67],[234.295,0.12,74,67],[235.345,0.12,56,50],[235.495,0.12,58,50],[236.545,0.12,67,31],[236.695,0.12,65,31],[236.845,0.12,76,42],[236.995,0.12,77,42],[238.045,0.12,60,31],[238.195,0.12,62,31],[238.873,0.105,69,47],[239.331,0.105,74,47],[240.193,0.5,102,108],[254.574,0.04,99,43],[255.288,0.16,48,49],[255.288,0.03,99,22],[256.717,0.16,48,49],[256.717,0.03,99,22],[267.431,0.25,67,55],[268.86,0.04,99,43],[269.217,0.25,77,46],[269.574,0.16,43,49],[269.574,0.03,99,22],[271.002,0.16,43,49],[271.002,0.03,99,22],[277.431,1.429,75,42],[283.145,0.04,99,43],[283.502,0.16,48,49],[283.502,0.03,99,22],[284.217,0.16,48,49],[284.217,0.03,99,22],[284.931,0.16,48,49],[284.931,0.03,99,22],[285.645,0.16,48,49],[285.645,0.03,99,22],[297.431,1.071,36,58],[301.488,6.333,72,12],[302.599,0.444,69,35],[303.988,0.444,65,35],[305.377,0.444,65,35],[306.766,0.444,64,35],[308.155,0.444,53,35],[308.155,6.333,72,18],[309.544,0.444,72,35],[310.933,0.444,65,35],[312.044,0.444,65,9],[312.322,0.444,70,47],[313.433,0.444,64,12],[313.71,0.444,67,46],[314.822,0.444,53,17],[315.099,0.444,57,45],[316.21,0.444,72,21],[316.488,0.444,53,43],[317.599,0.444,69,26],[317.877,0.444,72,39],[318.988,0.444,70,32],[319.266,0.444,74,35],[320.377,0.444,67,37],[320.655,0.444,72,29],[321.488,6.333,69,16],[321.766,0.444,57,42],[322.044,0.444,60,22],[323.155,0.444,50,28],[323.433,0.444,53,9],[324.544,0.444,69,29],[325.933,0.444,74,29],[327.044,0.444,67,8],[327.322,0.444,72,28],[328.155,6.333,65,8],[328.433,0.444,57,14],[328.71,0.444,60,25],[329.266,0.065,99,10],[329.544,0.065,99,11],[329.822,0.444,53,20],[330.099,0.444,57,21],[330.655,0.5,79,19],[330.933,0.065,99,13],[331.21,0.444,72,25],[331.21,0.065,99,14],[331.488,0.444,58,15],[332.322,0.75,77,9],[332.599,0.444,74,28],[332.599,0.065,99,16],[332.877,0.444,77,7],[332.877,0.065,99,16],[333.71,0.5,81,22],[333.988,0.444,72,26],[334.266,0.065,99,17],[334.544,0.065,99,17],[335.377,0.444,60,26],[335.933,0.065,99,16],[336.21,0.065,99,15],[336.488,0.444,50,12],[336.766,0.444,53,23],[337.599,0.065,99,13],[337.877,0.444,69,18],[337.877,0.25,76,16],[337.877,0.065,99,12],[338.155,0.444,58,19],[338.988,0.75,76,18],[339.266,0.444,74,22],[339.266,0.065,99,9],[339.544,0.444,77,13],[339.544,0.065,99,8],[340.655,0.444,72,25],[342.044,0.444,60,26],[343.155,0.75,69,18],[343.155,0.055,50,11],[343.215,0.16,39,11],[343.433,0.444,57,18],[343.988,0.055,50,19],[344.048,0.16,39,18],[344.048,0.14,51,11],[344.544,0.444,72,8],[344.822,0.444,58,16],[344.822,0.03,99,10],[344.822,0.055,50,27],[344.882,0.16,39,25],[344.882,0.14,51,15],[345.099,0.065,99,9],[345.377,0.065,99,10],[345.655,0.03,99,13],[345.655,0.055,50,33],[345.715,0.16,39,32],[345.715,0.14,51,19],[345.933,0.444,74,12],[346.21,0.444,77,13],[346.488,0.5,67,9],[346.488,0.03,99,15],[346.488,0.055,50,39],[346.548,0.16,39,37],[346.548,0.14,51,22],[346.766,0.065,99,13],[347.044,0.065,99,13],[347.322,0.444,72,15],[347.322,0.03,99,17],[347.322,0.055,50,44],[347.382,0.16,39,42],[347.382,0.14,51,25],[347.599,0.444,76,10],[347.599,0.5,70,11],[348.155,0.03,99,18],[348.155,0.055,50,48],[348.155,6.333,69,39],[348.215,0.16,39,45],[348.215,0.14,51,27],[348.433,0.065,99,15],[348.71,0.444,60,17],[348.71,0.065,99,16],[348.988,0.03,99,19],[348.988,0.055,50,51],[349.048,0.16,39,48],[349.048,0.14,51,29],[349.822,0.03,99,20],[349.822,0.055,50,52],[349.882,0.16,39,49],[349.882,0.14,51,29],[350.099,0.444,53,18],[350.099,0.065,99,17],[350.377,0.065,99,17],[350.655,0.03,99,20],[350.655,0.055,50,53],[350.715,0.16,39,50],[350.715,0.14,51,30],[351.488,0.444,58,18],[351.488,0.75,62,13],[351.488,0.03,99,20],[351.488,0.055,50,53],[351.548,0.16,39,49],[351.548,0.14,51,30],[351.766,0.065,99,16],[352.044,0.065,99,16],[352.322,0.03,99,19],[352.322,0.055,50,52],[352.382,0.16,39,48],[352.382,0.14,51,29],[352.877,0.444,77,18],[353.155,0.03,99,19],[353.155,0.055,50,50],[353.215,0.16,39,47],[353.215,0.14,51,28],[353.433,0.065,99,15],[353.71,0.065,99,15],[353.988,0.03,99,18],[353.988,0.055,50,48],[354.048,0.16,39,45],[354.048,0.14,51,27],[354.266,0.444,76,14],[354.822,1.5,65,9],[354.822,0.03,99,17],[354.822,0.055,50,45],[354.822,6.333,65,16],[354.882,0.16,39,42],[354.882,0.14,51,25],[355.099,0.065,99,14],[355.377,0.444,60,9],[355.377,0.065,99,13],[355.655,0.444,65,12],[355.655,0.03,99,16],[355.655,0.055,50,42],[355.715,0.16,39,39],[355.715,0.14,51,23],[356.488,0.03,99,14],[356.488,0.055,50,38],[356.548,0.16,39,36],[356.548,0.14,51,21],[356.766,0.444,57,11],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,11],[357.322,0.03,99,13],[357.322,0.055,50,35],[357.382,0.16,39,33],[357.382,0.14,51,20],[358.155,0.444,58,12],[358.155,0.03,99,12],[358.155,0.055,50,31],[358.215,0.16,39,29],[358.215,0.14,51,18],[358.433,0.444,62,9],[358.433,0.065,99,9],[358.71,0.065,99,9],[358.988,0.03,99,10],[358.988,0.055,50,28],[359.048,0.16,39,26],[359.048,0.14,51,16],[359.544,0.444,77,14],[359.822,0.03,99,9],[359.822,0.055,50,25],[359.882,0.16,39,23],[359.882,0.14,51,14],[360.099,0.065,99,7],[360.655,0.03,99,8],[360.655,0.055,50,21],[360.715,0.16,39,20],[360.715,0.14,51,12],[360.933,0.444,76,14],[361.488,0.055,50,18],[361.548,0.16,39,17],[361.548,0.14,51,10],[362.322,0.444,65,15],[362.322,0.055,50,15],[362.382,0.16,39,14],[362.382,0.14,51,9],[363.155,0.055,50,13],[363.215,0.16,39,12],[363.71,0.444,57,13],[363.988,0.055,50,11],[364.048,0.16,39,10],[364.822,0.055,50,8],[364.882,0.16,39,8],[365.099,0.444,62,23],[366.488,0.444,60,19],[367.877,0.444,79,19],[369.266,0.444,69,16],[370.655,0.444,65,12],[372.044,0.444,65,8],[375.822,0.321,60,25],[376.223,0.7,60,12],[377.679,0.321,67,25],[379.464,0.321,64,27],[381.179,0.321,57,28],[382.518,0.204,57,17],[382.652,0.7,62,13],[383.036,0.321,64,30],[384.393,4.071,57,19],[384.822,0.321,57,31],[386.536,0.321,53,51],[387.607,0.204,57,28],[388.393,0.321,60,51],[388.679,4.071,59,23],[389.482,0.7,62,16],[390.152,0.7,71,31],[390.179,0.321,59,53],[392.75,0.161,67,34],[392.964,0.31,72,41],[392.964,3.931,64,40],[393.74,0.035,117,9],[393.999,0.197,76,23],[394.257,0.035,117,11],[394.757,0.31,79,52],[395.809,0.7,76,35],[396.482,0.31,76,55],[397.102,3.931,57,8],[397.102,3.931,60,21],[397.49,0.7,76,75],[398.137,0.31,69,58],[398.913,0.197,76,32],[398.913,0.035,117,12],[399.43,0.197,69,34],[399.43,0.035,117,12],[399.93,0.31,76,61],[401.24,3.931,53,18],[401.654,0.31,69,64],[403.051,0.7,79,19],[403.309,0.31,65,68],[403.568,0.035,117,9],[403.697,0.7,77,36],[404.085,0.035,117,15],[404.344,0.197,69,38],[404.602,0.035,117,11],[405.102,0.31,72,68],[405.378,3.931,55,29],[406.827,0.31,71,72],[409.309,0.155,67,46],[409.516,0.3,84,48],[409.516,3.8,60,18],[410.266,0.7,84,11],[410.516,0.19,88,27],[410.891,0.7,88,21],[411.249,0.3,91,48],[412.916,0.3,88,61],[413.516,3.8,57,46],[413.766,0.035,117,11],[414.266,0.035,117,13],[414.516,0.3,81,64],[414.766,0.035,117,8],[415.266,0.19,88,36],[415.766,0.19,81,38],[416.249,0.3,88,67],[416.266,0.7,86,36],[417.516,3.8,53,21],[417.516,3.8,60,13],[417.891,0.7,84,75],[417.916,0.3,81,71],[418.766,0.035,117,12],[419.266,0.035,117,14],[419.516,0.3,77,84],[419.766,0.035,117,9],[420.516,0.19,81,47],[421.249,0.3,84,84],[421.516,3.8,62,44],[422.916,0.3,83,88],[423.266,0.7,95,39],[423.891,0.7,88,75],[425.316,0.15,79,57],[425.516,0.29,96,55],[425.516,3.677,67,46],[426.484,0.184,96,29],[427.193,0.29,103,52],[427.626,0.4,106,9],[428.419,0.027,117,17],[428.661,0.045,117,49],[428.806,0.29,100,55],[428.903,0.027,117,40],[429.145,0.045,117,69],[429.387,3.677,64,44],[429.387,0.027,117,43],[429.629,0.045,117,53],[429.871,0.027,117,20],[430.355,0.29,93,58],[430.718,0.7,103,43],[431.081,0.184,96,32],[431.565,0.184,93,34],[432.032,0.29,100,61],[433.258,3.677,60,38],[433.258,0.027,117,8],[433.5,0.045,117,41],[433.645,0.29,93,55],[433.742,0.027,117,41],[433.984,0.045,117,77],[434.226,0.027,117,51],[434.468,0.045,117,71],[434.71,0.027,117,33],[434.952,0.045,117,25],[435.193,0.29,89,58],[436.161,0.184,93,32],[436.871,0.29,96,58],[437.129,3.677,59,8],[437.129,3.677,62,20],[437.492,0.7,98,52],[438.339,0.045,117,25],[438.484,0.29,95,60],[438.581,0.027,117,34],[438.823,0.045,117,76],[440.032,0.218,69,79],[441,0.3,62,29],[441,0.21,50,55],[441,3.8,66,15],[441.5,0.23,66,18],[442.4,0.3,66,29],[443,0.3,62,31],[443.733,0.3,69,31],[443.75,0.7,66,8],[444.4,0.3,66,31],[445,3.8,62,19],[445.375,0.7,66,16],[445.4,0.3,62,33],[446,0.3,59,33],[446.375,0.7,69,16],[446.733,0.3,66,33],[447.375,0.7,64,16],[449,3.8,59,22],[450,0.23,69,83],[450.25,0.23,71,83],[450.5,0.46,69,83],[451,0.46,67,83],[451.5,0.23,66,83],[451.75,0.23,64,83],[452,0.92,62,83],[453,3.8,61,20],[455,0.3,62,37],[455.733,0.3,69,37],[455.75,0.7,66,11],[456.4,0.3,66,37],[457,0.3,62,31],[457,3.8,66,7],[457.4,0.3,66,31],[457.75,0.7,62,8],[458,0.3,62,31],[458.375,0.7,66,15],[458.733,0.3,69,31],[459.375,0.7,66,15],[459.4,0.3,66,33],[461,3.8,59,13],[462.5,0.46,66,79],[463,0.69,64,79],[463.75,0.23,62,79],[464,0.92,59,79],[465,3.8,55,22],[467.733,0.3,62,40],[468.4,0.3,59,40],[469,0.3,57,42],[469,3.8,57,26],[469.733,0.3,64,59],[469.75,0.7,64,16],[470,0.3,57,59],[470.375,0.7,73,29],[470.733,0.3,64,59],[471.375,0.7,66,29],[471.4,0.3,66,54],[472,0.3,62,54],[473,3.738,62,15],[473.246,0.045,117,9],[473.492,0.027,117,21],[473.738,0.045,117,51],[473.984,0.027,117,40],[474.229,0.045,117,64],[474.475,0.027,117,36],[474.721,0.045,117,41],[474.967,0.453,66,107],[474.967,0.027,117,13],[475.459,0.453,64,107],[475.951,0.905,62,107],[476.934,3.738,59,8],[476.934,0.453,66,120],[478.41,0.027,117,18],[478.656,0.045,117,51],[478.902,0.027,117,45],[479.147,0.045,117,76],[479.393,0.027,117,45],[479.639,0.045,117,55],[479.885,0.027,117,20],[480.279,0.295,62,51],[480.869,0.295,55,54],[480.869,3.738,62,14],[481.59,0.295,62,54],[481.606,0.7,62,14],[482.246,0.295,59,54],[482.574,0.295,62,54],[482.59,0.7,69,14],[483.205,0.7,67,27],[483.229,0.295,59,56],[483.328,0.027,117,14],[483.574,0.045,117,51],[483.82,0.295,55,56],[483.82,0.027,117,46],[484.066,0.045,117,83],[484.312,0.027,117,52],[484.541,0.295,62,56],[484.557,0.045,117,68],[484.803,3.738,64,24],[484.803,0.027,117,29],[485.049,0.045,117,15],[487.262,0.453,64,146],[487.508,0.272,52,45],[487.754,0.905,62,146],[488,0.543,50,45],[488.246,0.027,117,7],[488.492,0.045,117,41],[488.738,3.677,69,20],[488.738,0.445,62,113],[488.738,0.027,117,34],[488.98,0.045,117,65],[489.222,0.223,66,113],[489.222,0.027,117,43],[489.464,0.223,69,113],[489.464,0.045,117,60],[489.705,0.668,66,113],[489.705,0.027,117,27],[489.947,0.045,117,20],[490.673,0.203,50,9],[491.383,0.29,69,16],[491.399,0.203,50,22],[491.641,0.203,50,28],[492.028,0.29,66,29],[492.351,0.29,69,36],[492.367,0.203,50,48],[492.609,0.29,59,27],[492.609,0.203,47,58],[492.609,3.677,62,12],[492.609,0.027,117,8],[492.851,0.045,117,51],[492.972,0.7,66,25],[492.996,0.29,62,49],[493.092,0.027,117,47],[493.334,0.203,47,68],[493.334,0.045,117,72],[493.576,0.29,59,48],[493.576,0.203,47,65],[493.576,0.027,117,27],[493.939,0.7,69,19],[494.06,0.11,98,78],[494.06,0.095,54,88],[494.286,0.29,66,20],[494.302,0.203,47,25],[494.786,0.401,64,37],[495.028,0.11,98,83],[495.028,0.095,54,94],[495.27,0.223,74,60],[495.512,0.89,71,9],[495.512,0.027,117,24],[495.754,0.045,117,78],[495.899,0.29,62,24],[495.996,0.027,117,42],[496.238,0.03,99,78],[496.238,0.055,50,207],[496.238,0.045,117,10],[496.298,0.16,39,199],[496.298,0.14,51,120],[496.48,0.29,55,41],[496.48,0.03,99,82],[496.48,0.055,50,218],[496.48,3.677,62,72],[496.54,0.16,39,195],[496.54,0.14,51,117],[496.842,0.7,62,18],[496.867,0.29,59,38],[497.205,0.203,43,18],[497.447,0.203,43,43],[497.447,0.223,69,127],[497.689,0.223,71,158],[497.689,0.045,117,61],[497.931,0.11,98,65],[497.931,0.095,54,73],[497.931,0.445,69,129],[497.931,0.027,117,52],[498.173,0.203,43,16],[498.173,0.045,117,23],[498.415,0.29,55,16],[498.657,0.267,67,28],[499.125,0.29,62,29],[499.141,0.134,66,20],[499.383,0.29,55,44],[499.383,0.03,99,88],[499.383,0.055,50,235],[499.383,0.027,117,24],[499.443,0.16,39,213],[499.443,0.14,51,128],[499.625,0.534,62,21],[499.625,0.045,117,89],[499.867,0.027,117,22],[500.109,0.203,43,42],[500.351,0.203,45,58],[500.351,3.677,61,64],[500.834,0.11,98,122],[500.834,0.095,54,137],[501.06,0.29,64,28],[501.076,0.045,117,70],[501.318,0.29,57,45],[501.318,0.03,99,25],[501.318,0.055,50,66],[501.318,0.027,117,51],[501.378,0.16,39,108],[501.378,0.14,51,65],[502.044,0.223,69,168],[502.286,0.29,62,25],[502.286,0.203,50,32],[502.528,0.045,117,44],[502.649,0.7,78,9],[502.673,0.29,66,21],[502.77,0.11,98,87],[502.77,0.095,54,97],[502.77,0.027,117,52],[503.254,0.29,62,19],[503.98,0.03,99,64],[503.98,0.055,50,172],[503.98,0.045,117,37],[504.04,0.16,39,125],[504.04,0.14,51,75],[504.222,3.677,66,54],[504.222,0.027,117,43],[504.705,0.11,98,30],[504.705,0.095,54,34],[504.947,0.203,50,13],[505.189,0.668,66,72],[505.431,0.045,117,25],[505.673,0.027,117,43],[505.915,0.045,117,14],[506.157,0.29,62,32],[506.157,0.03,99,35],[506.157,0.055,50,92],[506.217,0.16,39,50],[506.217,0.14,51,30],[506.52,0.7,78,13],[506.544,0.29,66,29],[506.883,0.203,50,38],[506.883,0.045,117,10],[507.125,0.027,117,45],[507.367,0.045,117,37],[508.092,0.29,59,38],[508.092,0.03,99,76],[508.092,0.055,50,203],[508.092,3.677,66,30],[508.152,0.16,39,185],[508.152,0.14,51,111],[508.455,0.7,66,18],[508.48,0.29,62,37],[508.576,0.027,117,32],[508.818,0.203,47,36],[508.818,0.045,117,73],[509.06,0.203,47,48],[509.544,0.11,98,101],[509.544,0.095,54,114],[509.544,0.445,66,142],[510.028,0.29,59,39],[510.27,0.045,117,44],[510.391,0.7,76,13],[510.415,0.29,62,29],[510.512,0.027,117,51],[510.754,0.045,117,40],[510.996,0.29,59,30],[510.996,0.03,99,60],[510.996,0.055,50,160],[511.056,0.16,39,129],[511.056,0.14,51,77],[511.722,0.203,47,38],[511.964,0.203,43,52],[511.964,3.677,55,55],[511.964,0.445,62,155],[512.205,0.045,117,33],[512.447,0.11,98,81],[512.447,0.095,54,91],[512.447,0.027,117,51],[512.673,0.29,62,40],[512.689,0.203,43,16],[512.689,0.045,117,73],[512.931,0.027,117,11],[513.294,0.7,69,14],[513.318,0.29,59,30],[513.415,0.11,98,65],[513.415,0.095,54,74],[513.641,0.29,62,41],[513.899,0.03,99,9],[513.899,0.055,50,24],[513.959,0.16,39,41],[513.959,0.14,51,25],[514.141,0.267,67,29],[514.262,0.7,79,18],[514.286,0.29,59,36],[514.625,0.134,66,28],[514.625,0.045,117,17],[514.867,0.03,99,85],[514.867,0.055,50,227],[514.867,0.89,74,152],[514.867,0.134,64,31],[514.867,0.027,117,42],[514.927,0.16,39,216],[514.927,0.14,51,130],[515.109,0.534,62,32],[515.109,0.045,117,88],[515.351,0.027,117,49],[515.592,0.045,117,42],[515.835,0.03,99,78],[515.835,0.055,50,207],[515.835,3.677,61,80],[515.835,0.445,64,145],[515.894,0.16,39,188],[515.894,0.14,51,113],[516.318,0.223,66,109],[516.56,0.223,69,91],[516.802,0.03,99,39],[516.802,0.055,50,105],[516.802,0.668,73,74],[516.862,0.16,39,93],[516.862,0.14,51,56],[517.77,0.29,62,43],[517.77,0.03,99,12],[517.77,0.055,50,31],[517.83,0.16,39,26],[517.83,0.14,51,16],[518.012,0.267,66,35],[518.48,0.29,69,43],[518.496,0.7,78,12],[518.496,0.267,64,35],[518.496,0.045,117,41],[518.738,0.027,117,42],[518.98,0.534,62,35],[518.98,0.045,117,82],[519.125,0.29,66,43],[519.222,0.027,117,54],[519.463,0.045,117,76],[519.705,0.295,62,32],[519.705,3.738,62,26],[519.705,0.027,117,27],[519.951,0.045,117,21],[520.099,0.295,66,32],[520.443,0.7,62,9],[520.689,0.295,62,32],[521.058,0.7,66,16],[521.41,0.295,69,37],[522.042,0.7,66,19],[522.066,0.295,66,40],[523.394,0.045,117,25],[523.64,3.738,59,53],[523.64,0.027,117,32],[523.886,0.045,117,66],[524.132,0.027,117,46],[524.378,0.045,117,68],[524.624,0.027,117,34],[524.869,0.045,117,32],[525.115,0.453,66,109],[525.607,0.679,64,109],[526.345,0.226,62,109],[526.591,0.905,59,109],[527.574,3.738,55,69],[528.312,0.045,117,19],[528.558,0.027,117,30],[528.804,0.045,117,68],[529.05,0.027,117,50],[529.296,0.045,117,78],[529.542,0.027,117,44],[529.787,0.045,117,46],[530.033,0.027,117,10],[530.263,0.295,62,49],[530.918,0.295,59,49],[531.509,0.295,57,51],[531.509,3.738,57,69],[532.23,0.295,64,51],[532.246,0.7,64,13],[532.492,0.295,57,51],[532.861,0.7,73,25],[533.214,0.295,64,51],[533.23,0.045,117,10],[533.476,0.027,117,25],[533.722,0.272,54,39],[533.722,0.045,117,63],[533.845,0.7,66,25],[533.869,0.295,66,47],[533.968,0.027,117,49],[534.214,0.272,52,39],[534.214,0.045,117,81],[534.46,0.295,62,47],[534.46,0.027,117,46],[534.705,0.543,50,39],[534.705,0.045,117,53],[534.951,0.027,117,16],[535.443,3.864,62,32],[537.477,0.468,66,97],[537.986,0.468,64,97],[538.494,0.936,62,97],[539.511,3.864,66,28],[539.511,0.468,66,109],[542.291,0.305,66,44],[542.969,0.305,62,44],[543.579,0.305,55,46],[543.579,3.864,62,58],[544.324,0.305,62,46],[545.341,0.305,62,46],[545.994,0.7,67,23],[546.019,0.305,59,49],[546.63,0.305,55,49],[547.646,4.068,78,55],[547.646,3.864,64,76],[550.189,0.468,64,132],[550.697,0.936,62,132],[568.86,0.58,71,16],[569.542,0.193,71,22],[569.769,0.773,71,22],[570.678,0.58,71,22],[571.36,0.193,71,22],[571.587,0.773,71,22],[572.496,0.58,71,22],[573.178,0.193,71,16],[573.405,0.773,71,16],[574.314,0.58,71,16],[574.996,0.193,71,16],[575.223,0.773,71,16],[576.133,0.58,71,16],[576.814,0.193,71,16],[577.042,0.773,71,24],[577.951,0.58,71,24],[578.633,0.193,71,24],[578.86,0.773,71,24],[579.769,0.58,71,24],[580.451,0.193,71,24],[580.678,0.773,71,24],[581.587,0.58,71,29],[582.269,0.193,71,29],[582.496,0.773,71,29],[590.678,0.159,83,54],[592.437,4.385,60,20],[593.591,0.219,76,13],[593.879,0.035,117,10],[594.052,0.346,76,23],[594.456,0.035,117,9],[595.899,0.346,72,23],[596.591,0.27,64,14],[596.764,0.277,44,12],[597.052,0.277,45,15],[597.052,4.385,64,20],[597.485,0.7,76,8],[597.485,0.277,52,18],[597.514,0.346,72,19],[597.899,0.346,76,13],[597.918,0.035,117,7],[598.206,0.277,45,23],[598.495,0.035,117,11],[598.899,0.27,64,30],[598.899,0.03,83,11],[598.919,0.31,57,15],[599.072,0.277,44,25],[599.36,0.346,69,26],[599.36,0.277,45,25],[599.793,0.277,52,23],[599.937,0.07,98,13],[600.052,0.27,64,20],[600.072,0.31,57,10],[600.514,0.219,72,8],[600.514,0.277,45,14],[600.976,0.346,72,26],[601.091,0.07,98,23],[601.379,0.219,76,15],[601.668,4.385,57,30],[601.956,0.219,72,14],[601.956,0.035,117,13],[602.101,0.7,72,12],[602.245,0.07,98,19],[602.36,0.27,64,25],[602.36,0.03,83,9],[602.38,0.31,57,12],[602.514,0.346,72,21],[602.822,0.346,65,13],[602.822,0.219,69,14],[603.976,0.346,65,10],[603.976,0.27,48,17],[603.976,0.055,50,17],[603.995,0.31,42,9],[604.035,0.16,39,18],[604.035,0.14,51,11],[604.264,0.219,72,8],[604.437,0.346,69,23],[605.129,0.27,48,45],[605.129,0.03,83,16],[605.129,0.03,99,17],[605.129,0.055,50,45],[605.149,0.31,42,23],[605.189,0.16,39,43],[605.189,0.14,51,26],[605.418,0.035,117,14],[605.976,0.346,72,29],[606.283,0.27,48,52],[606.283,0.03,83,18],[606.283,0.03,99,18],[606.283,0.055,50,48],[606.283,4.385,55,17],[606.303,0.31,42,26],[606.343,0.16,39,45],[606.343,0.14,51,27],[606.716,0.7,74,14],[607.437,0.346,67,21],[607.437,0.27,48,38],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,36],[607.457,0.31,42,19],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.899,0.346,71,18],[608.591,0.27,48,19],[608.591,0.03,99,7],[608.591,0.055,50,20],[608.611,0.31,42,9],[608.651,0.16,39,18],[608.651,0.14,51,11],[609.437,0.346,79,28],[609.745,0.055,50,7],[610.668,0.173,67,20],[610.899,4.56,67,22],[611.379,0.36,76,27],[612.579,0.36,76,27],[613.779,0.36,76,28],[614.979,0.36,76,28],[615.399,0.228,72,16],[615.699,4.56,64,14],[616.149,0.7,76,15],[616.179,0.36,72,30],[617.379,0.36,72,30],[618.579,0.36,72,32],[619.779,0.36,72,32],[620.499,4.56,57,12],[622.599,0.7,79,9],[623.349,0.7,77,17],[625.299,4.56,59,22],[629.139,0.18,62,24],[630.099,4.75,64,15],[631.015,0.375,79,24],[632.265,0.375,79,24],[633.515,0.375,79,25],[634.765,0.375,79,25],[635.099,4.75,60,10],[636.015,0.375,76,27],[636.817,0.7,79,13],[637.265,0.375,76,27],[638.515,0.375,76,28],[639.765,0.375,76,28],[640.099,4.75,53,10],[641.015,0.375,72,30],[642.265,0.375,72,30],[643.515,0.375,72,31],[644.765,0.375,72,31],[645.099,4.75,55,19],[645.567,0.7,74,16],[646.015,0.375,74,32],[647.265,0.375,74,32],[648.515,0.375,79,30],[649.849,0.188,67,21],[650.609,0.383,76,22],[651.886,0.383,76,22],[653.162,0.383,76,24],[654.439,0.383,76,24],[655.716,0.383,72,25],[656.96,0.7,79,12],[656.992,0.383,72,25],[658.269,0.383,72,26],[659.545,0.383,72,23],[660.822,0.383,69,24],[662.099,0.383,69,24],[663.375,0.383,69,25],[664.652,0.383,69,25],[665.896,0.7,74,13],[665.928,0.383,71,26],[667.205,0.383,71,26],[668.482,0.383,76,24],[669.503,0.192,62,17],[691.133,0.196,67,16],[717.612,2.4,79,39]],[[0,3.2,60,77],[5.8,3.4,67,77],[11.2,3,64,80],[16,3.6,60,80],[22,0.99,72,85],[23.1,0.495,76,85],[23.65,0.495,79,115],[24.2,1.485,76,115],[25.85,0.495,74,36],[26.4,0.99,76,36],[27.5,0.99,74,40],[28.6,1.98,72,40],[38.7,1.9,72,30],[46.94,1.48,72,30],[53.26,1.12,72,53],[98.444,0.531,72,46],[99.02,0.265,76,46],[99.309,0.265,79,46],[99.597,0.796,76,46],[100.463,0.265,74,46],[100.751,0.531,76,57],[101.328,0.531,74,57],[101.905,1.062,72,57],[103.059,0.531,76,64],[103.636,0.265,79,47],[103.924,0.265,81,47],[104.213,0.531,79,47],[104.79,0.531,76,47],[105.367,0.796,74,55],[106.232,0.265,72,55],[106.52,1.062,69,55],[107.674,0.531,72,61],[108.251,0.531,77,52],[108.828,0.265,79,52],[109.117,0.265,81,52],[109.405,0.531,79,52],[109.982,0.531,77,65],[110.559,0.265,76,65],[110.847,0.265,74,65],[111.136,1.062,72,65],[112.29,0.531,74,81],[112.867,0.265,76,81],[113.155,0.265,79,81],[113.444,0.796,83,81],[114.309,0.265,79,45],[114.597,0.531,76,45],[115.174,0.531,74,45],[115.751,1.062,72,45],[116.905,0.818,76,22],[117.814,0.409,77,22],[118.269,1.227,76,22],[119.632,0.818,81,22],[120.541,0.409,79,22],[120.996,1.227,76,22],[122.36,0.818,74,22],[123.269,0.409,76,22],[123.723,0.818,77,22],[124.632,0.409,76,22],[125.087,0.818,74,22],[125.996,0.409,72,22],[126.451,1.227,71,22],[127.814,0.818,76,22],[128.723,0.409,77,22],[129.178,1.227,76,22],[130.541,0.818,81,22],[131.451,0.409,79,22],[131.905,1.227,76,22],[133.269,0.818,74,22],[134.178,0.409,76,22],[134.632,0.818,77,21],[135.541,0.409,76,21],[135.996,0.409,74,21],[136.451,0.409,72,21],[136.905,0.409,71,21],[137.36,1.227,69,21],[138.723,2.618,72,15],[141.451,1.309,77,15],[142.814,1.309,76,15],[144.178,2.618,68,15],[146.905,2.618,72,14],[149.632,1.309,77,14],[150.996,1.309,76,14],[152.36,2.618,71,14],[155.087,2.618,69,14],[157.814,1.309,72,14],[159.178,1.309,74,14],[160.541,0.818,76,21],[161.451,0.409,77,21],[161.905,1.227,76,21],[163.269,0.818,81,24],[164.178,0.409,79,24],[164.632,1.227,76,24],[165.996,0.818,74,24],[166.905,0.409,76,24],[167.36,0.818,77,24],[168.269,0.409,76,24],[168.723,0.818,74,24],[169.632,0.409,72,24],[170.087,1.227,71,24],[171.451,0.818,76,24],[172.36,0.409,77,24],[172.814,1.227,76,24],[174.178,0.818,81,24],[175.087,0.409,79,24],[175.541,1.227,76,24],[176.905,0.818,74,24],[177.814,0.409,76,24],[178.269,0.818,77,24],[179.178,0.409,76,24],[179.632,0.409,74,23],[180.087,0.409,72,23],[180.541,0.409,71,23],[180.996,1.227,69,23],[182.36,0.871,74,20],[183.327,0.435,76,20],[183.811,0.871,77,20],[184.779,0.435,76,20],[185.263,0.435,74,20],[185.747,0.435,72,20],[186.231,0.435,71,22],[186.714,1.306,69,22],[188.166,0.964,74,22],[189.238,0.482,76,22],[189.773,0.964,77,22],[190.845,0.482,76,22],[191.38,0.482,74,22],[191.916,0.482,72,22],[192.452,0.482,71,22],[192.988,1.446,69,22],[197.958,0.355,84,42],[201.116,0.355,77,42],[204.274,0.355,84,42],[207.168,0.321,84,47],[210.025,0.321,77,47],[212.883,0.321,84,46],[215.522,0.293,84,46],[218.131,0.293,77,79],[220.022,0.391,86,113],[220.414,0.4,102,65],[221.414,1,72,37],[225.114,0.321,84,44],[227.971,0.321,77,39],[230.611,0.293,84,39],[233.219,0.293,77,29],[235.645,0.27,84,29],[238.045,0.27,77,151],[239.785,0.36,86,216],[240.145,0.4,102,65],[243.145,0.393,75,91],[243.86,0.393,73,91],[244.574,0.393,71,91],[246.002,0.393,69,91],[246.717,0.393,67,91],[247.431,0.393,65,91],[248.86,0.393,63,91],[249.574,0.393,61,91],[250.288,0.393,59,91],[254.574,0.393,63,86],[255.288,0.393,61,86],[256.002,0.393,59,86],[257.431,0.393,57,86],[258.145,0.393,55,86],[258.86,0.393,53,86],[260.288,0.393,51,86],[261.002,0.393,49,86],[261.717,0.393,47,86],[274.574,1.429,79,23],[277.431,1.429,84,42],[280.288,0.214,75,82],[281.002,0.214,73,82],[281.717,0.214,71,82],[283.145,0.214,69,82],[283.86,0.214,67,82],[284.574,0.214,65,82],[286.002,0.214,63,82],[286.717,0.214,61,82],[287.431,0.214,59,82],[297.431,1.429,60,32],[301.488,0.767,81,95],[302.322,0.511,79,95],[302.877,0.256,77,95],[303.155,0.767,76,95],[303.988,0.767,77,95],[304.228,0.4,77,17],[304.822,0.511,79,95],[305.062,0.383,79,17],[305.377,0.511,81,95],[305.617,0.383,81,17],[305.933,0.511,82,95],[306.173,0.383,82,17],[306.488,1.533,81,95],[306.728,0.4,81,17],[308.155,0.767,79,95],[308.395,0.4,79,17],[308.988,0.511,77,95],[309.228,0.383,77,17],[309.544,0.256,76,95],[309.784,0.192,76,17],[309.822,0.767,74,95],[310.062,0.4,74,17],[310.655,0.767,76,95],[310.895,0.4,76,17],[311.488,0.511,77,95],[311.728,0.383,77,17],[312.044,0.511,79,130],[312.284,0.383,79,23],[312.524,0.383,79,9],[312.599,0.511,76,130],[312.839,0.383,76,23],[313.079,0.383,76,9],[313.155,1.533,77,130],[313.395,0.4,77,23],[313.635,0.4,77,9],[314.822,0.767,81,136],[315.062,0.4,81,24],[315.301,0.4,81,10],[315.655,0.511,79,136],[315.895,0.383,79,24],[316.135,0.383,79,10],[316.21,0.256,77,136],[316.45,0.192,77,24],[316.488,0.767,76,136],[316.69,0.192,77,10],[316.728,0.4,76,24],[316.968,0.4,76,10],[317.322,0.767,77,136],[317.562,0.4,77,24],[317.801,0.4,77,10],[318.155,0.511,79,136],[318.395,0.383,79,24],[318.635,0.383,79,10],[318.71,0.511,81,136],[318.95,0.383,81,24],[319.19,0.383,81,10],[319.266,0.511,82,136],[319.506,0.383,82,24],[319.746,0.383,82,10],[319.822,1.533,81,136],[320.062,0.4,81,24],[320.301,0.4,81,10],[321.488,0.767,79,136],[321.728,0.4,79,24],[321.968,0.4,79,10],[322.322,0.511,77,136],[322.562,0.383,77,24],[322.801,0.383,77,10],[322.877,0.256,76,83],[323.117,0.192,76,15],[323.155,0.767,74,83],[323.395,0.4,74,15],[323.988,0.767,76,83],[324.228,0.4,76,15],[324.822,0.511,77,83],[325.062,0.383,77,15],[325.377,0.511,79,83],[325.617,0.383,79,15],[325.933,0.511,76,83],[326.173,0.383,76,15],[326.488,1.533,77,83],[326.728,0.4,77,15],[328.155,0.767,69,73],[328.395,0.4,69,13],[328.988,0.511,67,73],[329.228,0.383,67,13],[329.544,0.256,65,73],[329.784,0.192,65,13],[329.822,0.767,64,73],[330.062,0.4,64,13],[330.655,0.767,65,73],[330.895,0.4,65,13],[331.488,0.511,67,73],[331.728,0.383,67,13],[332.044,0.511,69,73],[332.284,0.383,69,13],[332.599,0.511,70,73],[332.839,0.383,70,13],[333.155,1.533,69,65],[333.395,0.4,69,12],[334.822,0.767,67,65],[335.062,0.4,67,12],[335.655,0.511,65,65],[335.895,0.383,65,12],[336.21,0.256,64,65],[336.45,0.192,64,12],[336.488,0.767,62,65],[336.728,0.4,62,12],[337.322,0.767,64,65],[337.562,0.4,64,12],[338.155,0.511,65,65],[338.395,0.383,65,12],[338.71,0.511,67,65],[338.95,0.383,67,12],[339.266,0.511,64,65],[339.506,0.383,64,12],[339.822,1.533,65,65],[340.062,0.4,65,12],[341.488,0.767,69,62],[341.728,0.4,69,11],[342.322,0.511,67,62],[342.562,0.383,67,11],[342.877,0.256,65,62],[343.117,0.192,65,11],[343.155,0.767,64,62],[343.395,0.4,64,11],[343.988,0.767,65,44],[344.228,0.4,65,8],[344.822,0.511,67,44],[345.062,0.383,67,8],[345.377,0.511,69,44],[345.617,0.383,69,8],[345.933,0.511,70,44],[346.173,0.383,70,8],[346.488,1.533,69,44],[346.728,0.4,69,8],[348.155,0.767,67,44],[348.395,0.4,67,8],[348.988,0.511,65,44],[349.228,0.383,65,8],[349.544,0.256,64,44],[349.784,0.192,64,8],[349.822,0.767,62,44],[350.062,0.4,62,8],[350.655,0.767,64,44],[350.895,0.4,64,8],[351.488,0.511,65,44],[351.728,0.383,65,8],[352.044,0.511,67,44],[352.284,0.383,67,8],[352.599,0.511,64,44],[352.839,0.383,64,8],[353.155,1.533,65,44],[353.395,0.4,65,8],[368.155,6.667,65,64],[368.395,0.4,65,12],[375.822,0.493,60,37],[376.357,0.246,64,37],[376.625,0.246,67,37],[376.893,0.739,64,37],[377.697,0.246,62,37],[377.964,0.493,64,37],[378.5,0.493,62,37],[379.036,0.986,60,37],[380.107,0.493,64,41],[380.643,0.246,67,41],[380.911,0.246,69,41],[381.179,0.493,67,41],[381.714,0.493,64,41],[382.25,0.739,62,41],[383.054,0.246,60,41],[383.322,0.986,57,41],[384.393,0.493,60,46],[384.929,0.493,65,46],[385.464,0.246,67,46],[385.732,0.246,69,71],[386,0.493,67,71],[386.536,0.493,65,71],[387.072,0.246,64,71],[387.339,0.246,62,71],[387.607,0.986,60,71],[388.679,0.493,62,78],[389.214,0.246,64,78],[389.482,0.246,67,78],[389.75,0.739,71,78],[390.554,0.246,67,78],[390.822,0.493,64,78],[391.357,0.493,62,78],[391.893,0.986,60,78],[392.964,0.476,72,61],[393.482,0.238,76,61],[393.74,0.238,79,61],[393.999,0.714,76,61],[394.775,0.238,74,76],[395.033,0.476,76,76],[395.551,0.476,74,76],[396.068,0.952,72,76],[397.102,0.476,76,85],[397.62,0.238,79,85],[397.878,0.238,81,85],[398.137,0.476,79,85],[398.654,0.476,76,85],[399.171,0.714,74,85],[399.947,0.238,72,85],[400.206,0.952,69,85],[401.24,0.476,72,94],[401.757,0.476,77,94],[402.275,0.238,79,94],[402.533,0.238,81,94],[402.792,0.476,79,94],[403.309,0.476,77,96],[403.827,0.238,76,96],[404.085,0.238,74,96],[404.344,0.952,72,96],[405.378,0.476,74,105],[405.895,0.238,76,105],[406.154,0.238,79,105],[406.413,0.714,83,105],[407.188,0.238,79,105],[407.447,0.476,76,105],[407.964,0.476,74,105],[408.482,0.952,72,105],[409.516,0.46,84,70],[410.016,0.23,88,70],[410.266,0.23,91,70],[410.516,0.69,88,70],[411.266,0.23,86,70],[411.516,0.46,88,84],[412.016,0.46,86,84],[412.516,0.92,84,84],[413.516,0.46,88,94],[414.016,0.23,91,94],[414.266,0.23,93,94],[414.516,0.46,91,94],[415.016,0.46,88,94],[415.516,0.69,86,94],[416.266,0.23,84,94],[416.516,0.92,81,94],[417.516,0.46,84,104],[418.016,0.46,89,104],[418.516,0.23,91,104],[418.766,0.23,93,104],[419.016,0.46,91,118],[419.516,0.46,89,118],[420.016,0.23,88,118],[420.266,0.23,86,118],[420.516,0.92,84,118],[421.516,0.46,86,129],[422.016,0.23,88,129],[422.266,0.23,91,129],[422.516,0.69,95,129],[423.266,0.23,91,129],[423.516,0.46,88,129],[424.016,0.46,86,129],[424.516,0.92,84,129],[425.516,0.445,96,82],[426,0.223,100,82],[426.242,0.223,103,76],[426.484,0.668,100,76],[427.21,0.223,98,76],[427.452,0.445,100,76],[427.935,0.445,98,76],[428.419,0.89,96,76],[429.387,0.445,100,86],[429.871,0.223,103,86],[430.113,0.223,105,86],[430.355,0.445,103,86],[430.839,0.445,100,86],[431.323,0.668,98,86],[432.048,0.223,96,86],[432.29,0.89,93,86],[433.258,0.445,96,95],[433.742,0.445,101,81],[434.226,0.223,103,81],[434.468,0.223,105,81],[434.71,0.445,103,81],[435.193,0.445,101,81],[435.677,0.223,100,81],[435.919,0.223,98,81],[436.161,0.89,96,81],[437.129,0.445,98,89],[437.613,0.223,100,89],[437.855,0.223,103,89],[438.097,0.668,107,89],[438.823,0.223,103,89],[439.065,0.445,100,89],[439.548,0.445,98,89],[440.032,0.89,96,89],[547.646,4.068,86,97],[568.86,0.409,79,30],[569.314,0.204,83,30],[569.542,0.204,86,40],[569.769,0.614,83,40],[570.451,0.204,81,40],[570.678,0.409,83,40],[571.133,0.409,81,40],[571.587,0.818,79,40],[576.133,0.409,81,29],[576.587,0.204,83,29],[576.814,0.204,86,29],[577.042,0.614,90,44],[577.723,0.204,86,44],[577.951,0.409,83,44],[578.405,0.409,81,44],[578.86,0.818,79,44],[590.678,0.159,91,54],[592.437,0.531,72,69],[593.014,0.265,76,69],[593.302,0.265,79,69],[593.591,0.796,76,69],[594.456,0.265,74,69],[594.696,0.199,74,12],[594.745,0.531,76,69],[594.985,0.398,76,12],[595.322,0.531,74,69],[595.562,0.398,74,12],[595.899,1.062,72,69],[596.139,0.4,72,12],[597.052,0.531,76,77],[597.292,0.398,76,14],[597.629,0.265,79,77],[597.869,0.199,79,14],[597.918,0.265,81,77],[598.158,0.199,81,14],[598.206,0.531,79,77],[598.446,0.398,79,14],[598.783,0.531,76,77],[599.023,0.398,76,14],[599.36,0.796,74,77],[599.6,0.4,74,14],[600.226,0.265,72,77],[600.466,0.199,72,14],[600.514,1.062,69,77],[600.754,0.4,69,14],[601.668,0.531,72,85],[601.908,0.398,72,15],[602.245,0.531,77,85],[602.485,0.398,77,15],[602.822,0.265,79,85],[603.062,0.199,79,15],[603.11,0.265,81,85],[603.35,0.199,81,15],[603.399,0.531,79,85],[603.639,0.398,79,15],[603.976,0.531,77,85],[604.216,0.398,77,15],[604.552,0.265,76,85],[604.792,0.199,76,15],[604.841,0.265,74,85],[605.081,0.199,74,15],[605.129,1.062,72,85],[605.369,0.4,72,15],[606.283,0.531,74,94],[606.523,0.398,74,17],[606.86,0.265,76,94],[607.1,0.199,76,17],[607.149,0.265,79,94],[607.389,0.199,79,17],[607.437,0.796,83,94],[607.677,0.4,83,17],[608.302,0.265,79,94],[608.542,0.199,79,17],[608.591,0.531,76,94],[608.831,0.398,76,17],[609.168,0.531,74,94],[609.408,0.398,74,17],[609.745,1.062,72,94],[609.985,0.4,72,17],[610.899,0.552,72,65],[611.139,0.4,72,12],[611.499,0.276,76,65],[611.739,0.207,76,12],[611.799,0.276,79,65],[612.039,0.207,79,12],[612.099,0.828,76,65],[612.339,0.4,76,12],[612.999,0.276,74,65],[613.239,0.207,74,12],[613.299,0.552,76,65],[613.539,0.4,76,12],[613.899,0.552,74,65],[614.139,0.4,74,12],[614.499,1.104,72,65],[614.739,0.4,72,12],[615.699,0.552,76,73],[615.939,0.4,76,13],[616.299,0.276,79,73],[616.539,0.207,79,13],[616.599,0.276,81,73],[616.839,0.207,81,13],[616.899,0.552,79,73],[617.139,0.4,79,13],[617.499,0.552,76,73],[617.739,0.4,76,13],[618.099,0.828,74,73],[618.339,0.4,74,13],[618.999,0.276,72,73],[619.239,0.207,72,13],[619.299,1.104,69,73],[619.539,0.4,69,13],[620.499,0.552,72,81],[620.739,0.4,72,15],[621.099,0.552,77,38],[621.699,0.276,79,38],[621.999,0.276,81,38],[622.299,0.552,79,38],[622.899,0.552,77,38],[623.499,0.276,76,38],[623.799,0.276,74,38],[624.099,1.104,72,38],[625.299,0.552,74,42],[625.539,0.4,74,8],[625.899,0.276,76,42],[626.139,0.207,76,8],[626.199,0.276,79,42],[626.439,0.207,79,8],[626.499,0.828,83,42],[626.739,0.4,83,8],[627.399,0.276,79,42],[627.639,0.207,79,8],[627.699,0.552,76,42],[627.939,0.4,76,8],[628.299,0.552,74,42],[628.539,0.4,74,8],[628.899,1.104,72,42],[629.139,0.4,72,8],[630.099,0.575,72,27],[630.724,0.287,76,27],[631.036,0.287,79,27],[631.349,0.863,76,27],[632.286,0.287,74,27],[632.599,0.575,76,27],[633.224,0.575,74,27],[633.849,1.15,72,27],[635.099,0.575,76,30],[635.724,0.287,79,30],[636.036,0.287,81,30],[636.349,0.575,79,30],[636.974,0.575,76,30],[637.599,0.863,74,30],[638.536,0.287,72,30],[638.849,1.15,69,30],[640.099,0.575,72,34],[640.724,0.575,77,34],[641.349,0.287,79,34],[641.661,0.287,81,34],[641.974,0.575,79,34],[642.599,0.575,77,34],[643.224,0.287,76,34],[643.536,0.287,74,34],[643.849,1.15,72,34],[645.099,0.575,74,37],[645.724,0.287,76,37],[646.036,0.287,79,37],[646.349,0.863,83,37],[647.286,0.287,79,37],[647.599,0.575,76,37],[648.224,0.575,74,37],[648.849,1.15,72,37],[650.099,0.587,72,38],[650.737,0.294,76,38],[651.056,0.294,79,38],[651.375,0.881,76,38],[652.333,0.294,74,38],[652.652,0.587,76,38],[653.29,0.587,74,38],[653.928,1.175,72,38],[655.205,0.587,76,43],[655.445,0.4,76,8],[655.843,0.294,79,43],[656.083,0.22,79,8],[656.162,0.294,81,43],[656.402,0.22,81,8],[656.482,0.587,79,43],[656.722,0.4,79,8],[657.12,0.587,76,43],[657.36,0.4,76,8],[657.758,0.881,74,43],[657.998,0.4,74,8],[658.716,0.294,72,43],[658.956,0.22,72,8],[659.035,1.175,69,43],[659.275,0.4,69,8],[660.311,0.587,72,48],[660.551,0.4,72,9],[660.95,0.587,77,48],[661.19,0.4,77,9],[661.588,0.294,79,48],[661.828,0.22,79,9],[661.907,0.294,81,48],[662.147,0.22,81,9],[662.226,0.587,79,48],[662.466,0.4,79,9],[662.865,0.587,77,48],[663.105,0.4,77,9],[663.503,0.294,76,48],[663.743,0.22,76,9],[663.822,0.294,74,48],[664.062,0.22,74,9],[664.141,1.175,72,48],[664.381,0.4,72,9],[665.418,0.587,74,52],[665.658,0.4,74,9],[666.056,0.294,76,52],[666.296,0.22,76,9],[666.375,0.294,79,52],[666.615,0.22,79,9],[666.694,0.881,83,52],[666.934,0.4,83,9],[667.652,0.294,79,52],[667.892,0.22,79,9],[667.971,0.587,76,52],[668.211,0.4,76,9],[668.609,0.587,74,52],[668.849,0.4,74,9],[669.247,1.175,72,52],[669.487,0.4,72,9],[670.524,0.6,72,36],[671.176,0.3,76,36],[671.502,0.3,79,36],[671.828,0.9,76,36],[672.807,0.3,74,36],[673.133,0.6,76,36],[673.785,0.6,74,36],[674.437,1.2,72,36],[675.741,0.6,76,40],[675.981,0.4,76,7],[676.394,0.3,79,40],[676.634,0.225,79,7],[676.72,0.3,81,40],[676.96,0.225,81,7],[677.046,0.6,79,40],[677.286,0.4,79,7],[677.698,0.6,76,40],[677.938,0.4,76,7],[678.35,0.9,74,40],[678.59,0.4,74,7],[679.328,0.3,72,40],[679.568,0.225,72,7],[679.655,1.2,69,40],[679.895,0.4,69,7],[680.959,0.6,72,44],[681.199,0.4,72,8],[681.611,0.6,77,174],[681.851,0.4,77,31],[682.091,0.4,77,12],[682.263,0.3,79,174],[682.503,0.225,79,31],[682.589,0.3,81,174],[682.743,0.225,79,12],[682.829,0.225,81,31],[682.915,0.6,79,174],[683.069,0.225,81,12],[683.155,0.4,79,31],[683.395,0.4,79,12],[683.568,0.6,77,174],[683.808,0.4,77,31],[684.048,0.4,77,12],[684.22,0.3,76,174],[684.46,0.225,76,31],[684.546,0.3,74,174],[684.7,0.225,76,12],[684.786,0.225,74,31],[684.872,1.2,72,174],[685.026,0.225,74,12],[685.112,0.4,72,31],[685.352,0.4,72,12],[686.176,0.6,74,191],[686.416,0.4,74,34],[686.656,0.4,74,13],[686.828,0.3,76,191],[687.068,0.225,76,34],[687.155,0.3,79,191],[687.308,0.225,76,13],[687.395,0.225,79,34],[687.481,0.9,83,191],[687.635,0.225,79,13],[687.721,0.4,83,34],[687.961,0.4,83,13],[688.459,0.3,79,191],[688.699,0.225,79,34],[688.785,0.6,76,191],[688.939,0.225,79,13],[689.025,0.4,76,34],[689.265,0.4,76,13],[689.437,0.6,74,191],[689.677,0.4,74,34],[689.917,0.4,74,13],[690.089,1.2,72,191],[690.329,0.4,72,34],[690.569,0.4,72,13],[691.394,0.627,72,108],[691.634,0.4,72,19],[691.874,0.4,72,8],[692.076,0.314,76,108],[692.316,0.235,76,19],[692.416,0.314,79,108],[692.556,0.235,76,8],[692.656,0.235,79,19],[692.757,0.941,76,108],[692.896,0.235,79,8],[692.997,0.4,76,19],[693.237,0.4,76,8],[693.78,0.314,74,108],[694.02,0.235,74,19],[694.121,0.627,76,108],[694.26,0.235,74,8],[694.361,0.4,76,19],[694.601,0.4,76,8],[694.803,0.627,74,108],[695.043,0.4,74,19],[695.283,0.4,74,8],[695.485,1.254,72,108],[695.725,0.4,72,19],[695.965,0.4,72,8],[696.848,0.627,76,121],[697.088,0.4,76,22],[697.328,0.4,76,8],[697.53,0.314,79,121],[697.77,0.235,79,22],[697.871,0.314,81,121],[698.01,0.235,79,8],[698.111,0.235,81,22],[698.212,0.627,79,121],[698.351,0.235,81,8],[698.452,0.4,79,22],[698.692,0.4,79,8],[698.894,0.627,76,121],[699.134,0.4,76,22],[699.374,0.4,76,8],[699.576,0.941,74,121],[699.816,0.4,74,22],[700.056,0.4,74,8],[700.598,0.314,72,121],[700.838,0.235,72,22],[700.939,1.254,69,121],[701.078,0.235,72,8],[701.179,0.4,69,22],[701.419,0.4,69,8],[702.303,0.627,72,134],[702.543,0.4,72,24],[702.783,0.4,72,9],[702.985,0.627,77,134],[703.225,0.4,77,24],[703.465,0.4,77,9],[703.666,0.314,79,134],[703.906,0.235,79,24],[704.007,0.314,81,134],[704.146,0.235,79,9],[704.247,0.235,81,24],[704.348,0.627,79,134],[704.487,0.235,81,9],[704.588,0.4,79,24],[704.828,0.4,79,9],[705.03,0.627,77,134],[705.27,0.4,77,24],[705.51,0.4,77,9],[705.712,0.314,76,134],[705.952,0.235,76,24],[706.053,0.314,74,134],[706.192,0.235,76,9],[706.293,0.235,74,24],[706.394,1.254,72,134],[706.533,0.235,74,9],[706.634,0.4,72,24],[706.874,0.4,72,9],[707.757,0.627,74,147],[707.997,0.4,74,26],[708.237,0.4,74,10],[708.439,0.314,76,147],[708.679,0.235,76,26],[708.78,0.314,79,147],[708.919,0.235,76,10],[709.02,0.235,79,26],[709.121,0.941,83,147],[709.26,0.235,79,10],[709.361,0.4,83,26],[709.601,0.4,83,10],[710.144,0.314,79,147],[710.384,0.235,79,26],[710.485,0.627,76,147],[710.624,0.235,79,10],[710.725,0.4,76,26],[710.965,0.4,76,10],[711.166,0.627,74,147],[711.406,0.4,74,26],[711.646,0.4,74,10],[711.848,1.254,72,147],[734.412,3.4,67,46],[740.812,3.8,64,69],[748.812,4.4,60,69],[758.812,10,60,97]],[[0,0.055,38,103],[0.06,0.16,27,96],[0.06,0.14,39,58],[2.2,0.055,38,103],[2.26,0.16,27,96],[2.26,0.14,39,58],[4.4,0.055,38,103],[4.46,0.16,27,96],[4.46,0.14,39,58],[6.6,0.055,38,103],[6.66,0.16,27,96],[6.66,0.14,39,58],[8.8,0.055,38,103],[8.86,0.16,27,96],[8.86,0.14,39,58],[11,0.055,38,103],[11.06,0.16,27,96],[11.06,0.14,39,58],[13.2,0.055,38,103],[13.26,0.16,27,96],[13.26,0.14,39,58],[15.4,0.055,38,103],[15.46,0.16,27,96],[15.46,0.14,39,58],[17.6,0.055,38,103],[17.66,0.16,27,96],[17.66,0.14,39,58],[19.8,0.055,38,103],[19.86,0.16,27,96],[19.86,0.14,39,58],[22,0.055,38,103],[22.06,0.16,27,96],[22.06,0.14,39,58],[24.2,0.055,38,103],[24.26,0.16,27,96],[24.26,0.14,39,58],[26.4,0.055,38,103],[26.46,0.16,27,96],[26.46,0.14,39,58],[28.6,0.055,38,103],[28.66,0.16,27,96],[28.66,0.14,39,58],[30.8,0.055,38,103],[30.86,0.16,27,96],[30.86,0.14,39,58],[33,0.055,38,103],[33.06,0.16,27,96],[33.06,0.14,39,58],[34.9,0.055,38,103],[34.96,0.16,27,96],[34.96,0.14,39,58],[36.8,0.055,38,103],[36.86,0.16,27,96],[36.86,0.14,39,58],[38.7,0.055,38,103],[38.76,0.16,27,96],[38.76,0.14,39,58],[40.6,0.055,38,103],[40.66,0.16,27,96],[40.66,0.14,39,58],[42.5,0.055,38,103],[42.56,0.16,27,96],[42.56,0.14,39,58],[43.98,0.055,38,103],[44.04,0.16,27,96],[44.04,0.14,39,58],[45.46,0.055,38,103],[45.52,0.16,27,96],[45.52,0.14,39,58],[46.94,0.055,38,103],[47,0.16,27,96],[47,0.14,39,58],[48.42,0.055,38,103],[48.48,0.16,27,96],[48.48,0.14,39,58],[49.9,0.055,38,103],[49.96,0.16,27,96],[49.96,0.14,39,58],[51.02,0.055,38,103],[51.08,0.16,27,96],[51.08,0.14,39,58],[52.14,0.055,38,103],[52.2,0.16,27,96],[52.2,0.14,39,58],[53.26,0.055,38,103],[53.32,0.16,27,96],[53.32,0.14,39,58],[54.38,0.055,38,103],[54.44,0.16,27,96],[54.44,0.14,39,58],[55.5,0.055,38,103],[55.56,0.16,27,96],[55.56,0.14,39,58],[56.38,0.055,38,103],[56.44,0.16,27,96],[56.44,0.14,39,58],[57.26,0.055,38,103],[57.32,0.16,27,96],[57.32,0.14,39,58],[58.14,0.055,38,103],[58.2,0.16,27,96],[58.2,0.14,39,58],[59.02,0.055,38,103],[59.08,0.16,27,96],[59.08,0.14,39,58],[59.9,0.055,38,103],[59.96,0.16,27,96],[59.96,0.14,39,58],[60.42,0.96,36,95],[60.42,0.055,38,75],[60.48,0.16,27,70],[60.48,0.14,39,42],[61.62,0.96,36,95],[61.62,0.055,38,75],[61.68,0.16,27,70],[61.68,0.14,39,42],[62.82,0.96,36,101],[62.82,0.055,38,75],[62.88,0.16,27,70],[62.88,0.14,39,42],[64.02,0.96,36,101],[64.02,0.055,38,75],[64.08,0.16,27,70],[64.08,0.14,39,42],[65.22,0.96,33,107],[65.22,0.055,38,75],[65.28,0.16,27,70],[65.28,0.14,39,42],[66.42,0.96,33,107],[66.42,0.055,38,75],[66.48,0.16,27,70],[66.48,0.14,39,42],[67.62,0.96,33,112],[67.62,0.055,38,75],[67.68,0.16,27,70],[67.68,0.14,39,42],[68.82,0.96,33,112],[68.82,0.055,38,75],[68.88,0.16,27,70],[68.88,0.14,39,42],[70.02,0.96,29,118],[70.02,0.055,38,75],[70.08,0.16,27,70],[70.08,0.14,39,42],[71.22,0.96,29,118],[71.22,0.055,38,75],[71.28,0.16,27,70],[71.28,0.14,39,42],[72.42,0.96,29,124],[72.42,0.055,38,75],[72.48,0.16,27,70],[72.48,0.14,39,42],[73.62,0.96,29,124],[73.62,0.055,38,75],[73.68,0.16,27,70],[73.68,0.14,39,42],[74.82,0.96,31,130],[74.82,0.055,38,75],[74.88,0.16,27,70],[74.88,0.14,39,42],[76.02,0.96,31,130],[76.02,0.055,38,75],[76.08,0.16,27,70],[76.08,0.14,39,42],[77.22,2.16,36,114],[77.22,0.055,38,75],[77.28,0.16,27,70],[77.28,0.14,39,42],[78.42,0.055,38,75],[78.48,0.16,27,70],[78.48,0.14,39,42],[79.62,0.941,36,109],[79.62,0.055,38,75],[79.68,0.16,27,70],[79.68,0.14,39,42],[80.796,0.941,36,109],[80.796,0.055,38,75],[80.856,0.16,27,70],[80.856,0.14,39,42],[81.973,0.941,36,115],[81.973,0.055,38,75],[82.033,0.16,27,70],[82.033,0.14,39,42],[83.149,0.941,36,115],[83.149,0.055,38,75],[83.209,0.16,27,70],[83.209,0.14,39,42],[84.326,0.941,33,122],[84.326,0.055,38,75],[84.386,0.16,27,70],[84.386,0.14,39,42],[85.502,0.941,33,122],[85.502,0.055,38,75],[85.562,0.16,27,70],[85.562,0.14,39,42],[86.679,0.941,33,128],[86.679,0.055,38,75],[86.739,0.16,27,70],[86.739,0.14,39,42],[87.855,0.941,33,128],[87.855,0.055,38,75],[87.915,0.16,27,70],[87.915,0.14,39,42],[89.032,0.941,29,135],[89.032,0.055,38,75],[89.092,0.16,27,70],[89.092,0.14,39,42],[90.208,0.941,29,135],[90.208,0.055,38,75],[90.268,0.16,27,70],[90.268,0.14,39,42],[91.385,0.941,29,142],[91.385,0.055,38,75],[91.445,0.16,27,70],[91.445,0.14,39,42],[92.561,0.941,29,142],[92.561,0.055,38,75],[92.621,0.16,27,70],[92.621,0.14,39,42],[93.738,0.941,31,148],[93.738,0.055,38,75],[93.798,0.16,27,70],[93.798,0.14,39,42],[94.914,0.941,31,148],[94.914,0.055,38,75],[94.974,0.16,27,70],[94.974,0.14,39,42],[96.091,2.118,36,131],[96.091,0.055,38,75],[96.151,0.16,27,70],[96.151,0.14,39,42],[97.267,0.055,38,75],[97.327,0.16,27,70],[97.327,0.14,39,42],[98.444,0.277,36,105],[98.444,0.055,38,75],[98.504,0.16,27,70],[98.504,0.14,39,42],[98.876,0.277,43,105],[99.597,0.055,38,75],[99.597,0.277,36,105],[99.657,0.16,27,70],[99.657,0.14,39,42],[100.463,0.277,35,105],[100.751,0.277,36,111],[100.751,0.055,38,75],[100.811,0.16,27,70],[100.811,0.14,39,42],[101.184,0.277,43,111],[101.905,0.055,38,75],[101.905,0.277,36,111],[101.965,0.16,27,70],[101.965,0.14,39,42],[102.77,0.277,32,111],[103.059,0.277,33,118],[103.059,0.055,38,75],[103.119,0.16,27,70],[103.119,0.14,39,42],[103.492,0.277,40,118],[104.213,0.055,38,75],[104.213,0.277,33,118],[104.273,0.16,27,70],[104.273,0.14,39,42],[105.078,0.277,32,118],[105.367,0.277,33,124],[105.367,0.055,38,75],[105.427,0.16,27,70],[105.427,0.14,39,42],[105.799,0.277,40,124],[106.52,0.055,38,75],[106.52,0.277,33,124],[106.58,0.16,27,70],[106.58,0.14,39,42],[107.386,0.277,28,124],[107.674,0.277,29,130],[107.674,0.055,38,75],[107.734,0.16,27,70],[107.734,0.14,39,42],[108.107,0.277,36,130],[108.828,0.277,29,130],[108.828,0.055,38,75],[108.888,0.16,27,70],[108.888,0.14,39,42],[109.694,0.277,28,130],[109.982,0.277,29,136],[109.982,0.055,38,75],[110.042,0.16,27,70],[110.042,0.14,39,42],[110.415,0.277,36,136],[111.136,0.277,29,136],[111.136,0.055,38,75],[111.196,0.16,27,70],[111.196,0.14,39,42],[112.001,0.277,30,136],[112.29,0.277,31,143],[112.29,0.055,38,75],[112.35,0.16,27,70],[112.35,0.14,39,42],[112.722,0.277,38,143],[113.444,0.277,31,143],[113.444,0.055,38,75],[113.504,0.16,27,70],[113.504,0.14,39,42],[114.309,0.277,35,143],[114.597,0.055,38,75],[114.597,2.077,36,147],[114.657,0.16,27,70],[114.657,0.14,39,42],[115.751,0.055,38,75],[115.811,0.16,27,70],[115.811,0.14,39,42],[116.905,0.25,33,130],[116.905,0.055,38,89],[116.965,0.16,27,83],[116.965,0.14,39,50],[118.269,0.25,33,130],[118.269,0.055,38,89],[118.329,0.16,27,83],[118.329,0.14,39,50],[119.632,0.25,38,130],[119.632,0.055,38,89],[119.692,0.16,27,83],[119.692,0.14,39,50],[120.996,0.25,40,130],[120.996,0.055,38,89],[121.056,0.16,27,83],[121.056,0.14,39,50],[122.36,0.25,33,130],[122.36,0.055,38,89],[122.42,0.16,27,83],[122.42,0.14,39,50],[123.723,0.25,41,130],[123.723,0.055,38,89],[123.783,0.16,27,83],[123.783,0.14,39,50],[125.087,0.25,38,130],[125.087,0.055,38,89],[125.147,0.16,27,83],[125.147,0.14,39,50],[126.451,0.25,40,130],[126.451,0.055,38,89],[126.511,0.16,27,83],[126.511,0.14,39,50],[127.814,0.25,33,130],[127.814,0.055,38,89],[127.874,0.16,27,83],[127.874,0.14,39,50],[129.178,0.25,33,130],[129.178,0.055,38,89],[129.238,0.16,27,83],[129.238,0.14,39,50],[130.541,0.25,38,130],[130.542,0.055,38,89],[130.601,0.16,27,83],[130.601,0.14,39,50],[131.905,0.25,40,130],[131.905,0.055,38,89],[131.965,0.16,27,83],[131.965,0.14,39,50],[133.269,0.25,33,130],[133.269,0.055,38,89],[133.329,0.16,27,83],[133.329,0.14,39,50],[134.632,0.25,41,130],[134.632,0.055,38,89],[134.692,0.16,27,83],[134.692,0.14,39,50],[135.996,0.25,40,130],[135.996,0.055,38,89],[136.056,0.16,27,83],[136.056,0.14,39,50],[137.36,0.25,33,130],[137.36,0.055,38,89],[137.42,0.16,27,83],[137.42,0.14,39,50],[138.723,0.25,33,138],[138.723,0.055,38,89],[138.783,0.16,27,83],[138.783,0.14,39,50],[140.087,0.25,33,138],[140.087,0.055,38,89],[140.147,0.16,27,83],[140.147,0.14,39,50],[141.451,0.25,38,138],[141.451,0.055,38,89],[141.511,0.16,27,83],[141.511,0.14,39,50],[142.814,0.25,40,138],[142.814,0.055,38,89],[142.874,0.16,27,83],[142.874,0.14,39,50],[144.178,0.25,33,138],[144.178,0.055,38,89],[144.238,0.16,27,83],[144.238,0.14,39,50],[145.541,0.25,41,138],[145.542,0.055,38,89],[145.601,0.16,27,83],[145.601,0.14,39,50],[146.905,0.25,38,138],[146.905,0.055,38,89],[146.965,0.16,27,83],[146.965,0.14,39,50],[148.269,0.25,40,138],[148.269,0.055,38,89],[148.329,0.16,27,83],[148.329,0.14,39,50],[149.632,0.25,33,138],[149.632,0.055,38,89],[149.692,0.16,27,83],[149.692,0.14,39,50],[150.996,0.25,33,138],[150.996,0.055,38,89],[151.056,0.16,27,83],[151.056,0.14,39,50],[152.36,0.25,38,138],[152.36,0.055,38,89],[152.42,0.16,27,83],[152.42,0.14,39,50],[153.723,0.25,40,138],[153.723,0.055,38,89],[153.783,0.16,27,83],[153.783,0.14,39,50],[155.087,0.25,33,138],[155.087,0.055,38,89],[155.147,0.16,27,83],[155.147,0.14,39,50],[156.451,0.25,41,138],[156.451,0.055,38,89],[156.511,0.16,27,83],[156.511,0.14,39,50],[157.814,0.25,40,138],[157.814,0.055,38,89],[157.874,0.16,27,83],[157.874,0.14,39,50],[159.178,0.25,33,138],[159.178,0.055,38,89],[159.238,0.16,27,83],[159.238,0.14,39,50],[160.541,0.25,33,154],[160.542,0.055,38,89],[160.601,0.16,27,83],[160.601,0.14,39,50],[161.678,0.127,32,65],[161.905,0.25,33,154],[161.905,0.055,38,89],[161.965,0.16,27,83],[161.965,0.14,39,50],[163.041,0.127,37,65],[163.269,0.25,38,154],[163.269,0.055,38,89],[163.329,0.16,27,83],[163.329,0.14,39,50],[164.405,0.127,39,65],[164.632,0.25,40,154],[164.632,0.055,38,89],[164.692,0.16,27,83],[164.692,0.14,39,50],[165.996,0.25,33,154],[165.996,0.055,38,89],[166.056,0.16,27,83],[166.056,0.14,39,50],[167.132,0.127,40,65],[167.36,0.25,41,154],[167.36,0.055,38,89],[167.42,0.16,27,83],[167.42,0.14,39,50],[168.496,0.127,37,65],[168.723,0.25,38,154],[168.723,0.055,38,89],[168.783,0.16,27,83],[168.783,0.14,39,50],[169.86,0.127,39,65],[170.087,0.25,40,154],[170.087,0.055,38,89],[170.147,0.16,27,83],[170.147,0.14,39,50],[171.451,0.25,33,154],[171.451,0.055,38,89],[171.511,0.16,27,83],[171.511,0.14,39,50],[172.587,0.127,32,65],[172.814,0.25,33,154],[172.814,0.055,38,89],[172.874,0.16,27,83],[172.874,0.14,39,50],[173.951,0.127,37,65],[174.178,0.25,38,154],[174.178,0.055,38,89],[174.238,0.16,27,83],[174.238,0.14,39,50],[175.314,0.127,39,65],[175.541,0.25,40,154],[175.542,0.055,38,89],[175.601,0.16,27,83],[175.601,0.14,39,50],[176.905,0.25,33,154],[176.905,0.055,38,89],[176.965,0.16,27,83],[176.965,0.14,39,50],[178.041,0.127,40,65],[178.269,0.25,41,154],[178.269,0.055,38,89],[178.329,0.16,27,83],[178.329,0.14,39,50],[179.405,0.127,39,65],[179.632,0.25,40,154],[179.632,0.055,38,89],[179.692,0.16,27,83],[179.692,0.14,39,50],[180.769,0.127,32,65],[180.996,0.25,33,154],[180.996,0.055,38,89],[181.056,0.16,27,83],[181.056,0.14,39,50],[182.36,0.266,33,146],[182.36,0.055,38,89],[182.42,0.16,27,83],[182.42,0.14,39,50],[183.811,0.266,41,146],[183.811,0.055,38,89],[183.871,0.16,27,83],[183.871,0.14,39,50],[185.263,0.266,40,146],[185.263,0.055,38,89],[185.323,0.16,27,83],[185.323,0.14,39,50],[186.714,0.055,38,89],[186.714,0.266,33,146],[186.774,0.16,27,83],[186.774,0.14,39,50],[188.166,0.295,33,146],[188.166,0.055,38,89],[188.226,0.16,27,83],[188.226,0.14,39,50],[189.773,0.295,41,146],[189.773,0.055,38,89],[189.833,0.16,27,83],[189.833,0.14,39,50],[191.38,0.295,40,146],[191.38,0.055,38,89],[191.44,0.16,27,83],[191.44,0.14,39,50],[192.988,0.295,33,146],[192.988,0.055,38,89],[193.048,0.16,27,83],[193.048,0.14,39,50],[194.595,0.055,38,89],[194.655,0.16,27,83],[194.655,0.14,39,50],[195.195,0.055,38,84],[195.255,0.16,27,79],[195.255,0.14,39,47],[195.984,0.055,38,84],[196.044,0.16,27,79],[196.044,0.14,39,47],[196.774,0.055,38,84],[196.833,0.16,27,79],[196.833,0.14,39,47],[197.563,0.055,38,84],[197.623,0.16,27,79],[197.623,0.14,39,47],[198.352,0.055,38,84],[198.412,0.16,27,79],[198.412,0.14,39,47],[199.142,0.055,38,84],[199.202,0.16,27,79],[199.202,0.14,39,47],[199.931,0.055,38,84],[199.991,0.16,27,79],[199.991,0.14,39,47],[200.721,0.055,38,84],[200.781,0.16,27,79],[200.781,0.14,39,47],[201.51,0.055,38,84],[201.57,0.16,27,79],[201.57,0.14,39,47],[202.3,0.055,38,84],[202.36,0.16,27,79],[202.36,0.14,39,47],[203.089,0.055,38,84],[203.149,0.16,27,79],[203.149,0.14,39,47],[203.879,0.055,38,84],[203.939,0.16,27,79],[203.939,0.14,39,47],[204.668,0.055,38,84],[204.728,0.16,27,79],[204.728,0.14,39,47],[205.383,0.055,38,84],[205.443,0.16,27,79],[205.443,0.14,39,47],[206.097,0.055,38,84],[206.157,0.16,27,79],[206.157,0.14,39,47],[206.811,0.055,38,84],[206.871,0.16,27,79],[206.871,0.14,39,47],[207.525,0.055,38,84],[207.585,0.16,27,79],[207.585,0.14,39,47],[208.24,0.055,38,84],[208.3,0.16,27,79],[208.3,0.14,39,47],[208.954,0.055,38,84],[209.014,0.16,27,79],[209.014,0.14,39,47],[209.668,0.055,38,84],[209.728,0.16,27,79],[209.728,0.14,39,47],[210.383,0.055,38,84],[210.443,0.16,27,79],[210.443,0.14,39,47],[211.097,0.055,38,84],[211.157,0.16,27,79],[211.157,0.14,39,47],[211.811,0.055,38,84],[211.871,0.16,27,79],[211.871,0.14,39,47],[212.525,0.055,38,84],[212.585,0.16,27,79],[212.585,0.14,39,47],[213.24,0.055,38,84],[213.3,0.16,27,79],[213.3,0.14,39,47],[213.892,0.055,38,84],[213.952,0.16,27,79],[213.952,0.14,39,47],[214.544,0.055,38,84],[214.604,0.16,27,79],[214.604,0.14,39,47],[215.196,0.055,38,84],[215.256,0.16,27,79],[215.256,0.14,39,47],[215.848,0.055,38,84],[215.908,0.16,27,79],[215.908,0.14,39,47],[216.501,0.055,38,84],[216.561,0.16,27,79],[216.561,0.14,39,47],[217.153,0.055,38,84],[217.213,0.16,27,79],[217.213,0.14,39,47],[217.805,0.055,38,84],[217.865,0.16,27,79],[217.865,0.14,39,47],[218.457,0.055,38,84],[218.517,0.16,27,79],[218.517,0.14,39,47],[219.109,0.055,38,84],[219.169,0.16,27,79],[219.169,0.14,39,47],[219.761,0.055,38,84],[219.821,0.16,27,79],[219.821,0.14,39,47],[220.414,0.055,38,84],[220.474,0.16,27,79],[220.474,0.14,39,47],[221.066,0.055,38,84],[221.126,0.16,27,79],[221.126,0.14,39,47],[221.718,0.055,38,84],[221.778,0.16,27,79],[221.778,0.14,39,47],[222.37,0.055,38,84],[222.43,0.16,27,79],[222.43,0.14,39,47],[222.614,0.055,38,84],[222.674,0.16,27,79],[222.674,0.14,39,47],[223.328,0.055,38,84],[223.388,0.16,27,79],[223.388,0.14,39,47],[224.042,0.055,38,84],[224.102,0.16,27,79],[224.102,0.14,39,47],[224.757,0.055,38,84],[224.817,0.16,27,79],[224.817,0.14,39,47],[225.471,0.055,38,84],[225.531,0.16,27,79],[225.531,0.14,39,47],[226.185,0.055,38,84],[226.245,0.16,27,79],[226.245,0.14,39,47],[226.899,0.055,38,84],[226.959,0.16,27,79],[226.959,0.14,39,47],[227.614,0.055,38,84],[227.674,0.16,27,79],[227.674,0.14,39,47],[228.328,0.055,38,84],[228.388,0.16,27,79],[228.388,0.14,39,47],[228.98,0.055,38,84],[229.04,0.16,27,79],[229.04,0.14,39,47],[229.632,0.055,38,84],[229.692,0.16,27,79],[229.692,0.14,39,47],[230.284,0.055,38,84],[230.344,0.16,27,79],[230.344,0.14,39,47],[230.937,0.055,38,84],[230.997,0.16,27,79],[230.997,0.14,39,47],[231.589,0.055,38,84],[231.649,0.16,27,79],[231.649,0.14,39,47],[232.241,0.055,38,84],[232.301,0.16,27,79],[232.301,0.14,39,47],[232.893,0.055,38,84],[232.953,0.16,27,79],[232.953,0.14,39,47],[233.545,0.055,38,84],[233.605,0.16,27,79],[233.605,0.14,39,47],[234.145,0.055,38,84],[234.205,0.16,27,79],[234.205,0.14,39,47],[234.745,0.055,38,84],[234.805,0.16,27,79],[234.805,0.14,39,47],[235.345,0.055,38,84],[235.405,0.16,27,79],[235.405,0.14,39,47],[235.945,0.055,38,84],[236.005,0.16,27,79],[236.005,0.14,39,47],[236.545,0.055,38,84],[236.605,0.16,27,79],[236.605,0.14,39,47],[237.145,0.055,38,84],[237.205,0.16,27,79],[237.205,0.14,39,47],[237.745,0.055,38,84],[237.805,0.16,27,79],[237.805,0.14,39,47],[238.345,0.055,38,84],[238.405,0.16,27,79],[238.405,0.14,39,47],[238.945,0.055,38,84],[239.005,0.16,27,79],[239.005,0.14,39,47],[239.545,0.055,38,84],[239.605,0.16,27,79],[239.605,0.14,39,47],[240.145,0.055,38,84],[240.205,0.16,27,79],[240.205,0.14,39,47],[240.745,0.055,38,84],[240.805,0.16,27,79],[240.805,0.14,39,47],[241.345,0.055,38,84],[241.405,0.16,27,79],[241.405,0.14,39,47],[241.945,0.055,38,84],[242.005,0.16,27,79],[242.005,0.14,39,47],[242.545,0.055,38,84],[242.605,0.16,27,79],[242.605,0.14,39,47],[243.145,0.055,38,65],[243.205,0.16,27,61],[243.205,0.14,39,37],[244.574,0.055,38,65],[244.634,0.16,27,61],[244.634,0.14,39,37],[246.002,0.055,38,65],[246.062,0.16,27,61],[246.062,0.14,39,37],[247.431,0.055,38,65],[247.491,0.16,27,61],[247.491,0.14,39,37],[248.86,0.055,38,65],[248.92,0.16,27,61],[248.92,0.14,39,37],[250.288,0.055,38,65],[250.348,0.16,27,61],[250.348,0.14,39,37],[251.717,0.055,38,65],[251.777,0.16,27,61],[251.777,0.14,39,37],[253.145,0.055,38,65],[253.205,0.16,27,61],[253.205,0.14,39,37],[254.574,0.055,38,65],[254.634,0.16,27,61],[254.634,0.14,39,37],[256.002,0.055,38,65],[256.062,0.16,27,61],[256.062,0.14,39,37],[257.431,0.055,38,65],[257.491,0.16,27,61],[257.491,0.14,39,37],[258.86,0.055,38,65],[258.92,0.16,27,61],[258.92,0.14,39,37],[260.288,0.055,38,65],[260.348,0.16,27,61],[260.348,0.14,39,37],[261.717,0.055,38,65],[261.777,0.16,27,61],[261.777,0.14,39,37],[263.145,0.055,38,65],[263.205,0.16,27,61],[263.205,0.14,39,37],[264.574,0.055,38,65],[264.634,0.16,27,61],[264.634,0.14,39,37],[266.002,0.055,38,65],[266.062,0.16,27,61],[266.062,0.14,39,37],[267.431,0.055,38,65],[267.491,0.16,27,61],[267.491,0.14,39,37],[268.86,0.055,38,65],[268.92,0.16,27,61],[268.92,0.14,39,37],[270.288,0.055,38,65],[270.348,0.16,27,61],[270.348,0.14,39,37],[271.717,0.055,38,65],[271.777,0.16,27,61],[271.777,0.14,39,37],[273.145,0.055,38,65],[273.205,0.16,27,61],[273.205,0.14,39,37],[274.574,0.055,38,65],[274.634,0.16,27,61],[274.634,0.14,39,37],[276.002,0.055,38,65],[276.062,0.16,27,61],[276.062,0.14,39,37],[277.431,0.055,38,65],[277.491,0.16,27,61],[277.491,0.14,39,37],[278.86,0.055,38,65],[278.92,0.16,27,61],[278.92,0.14,39,37],[280.288,0.055,38,65],[280.348,0.16,27,61],[280.348,0.14,39,37],[281.717,0.055,38,65],[281.777,0.16,27,61],[281.777,0.14,39,37],[283.145,0.055,38,65],[283.205,0.16,27,61],[283.205,0.14,39,37],[284.574,0.055,38,65],[284.634,0.16,27,61],[284.634,0.14,39,37],[286.002,0.055,38,65],[286.062,0.16,27,61],[286.062,0.14,39,37],[287.431,0.055,38,65],[287.491,0.16,27,61],[287.491,0.14,39,37],[288.86,0.055,38,65],[288.92,0.16,27,61],[288.92,0.14,39,37],[290.288,0.055,38,65],[290.348,0.16,27,61],[290.348,0.14,39,37],[291.717,0.055,38,65],[291.777,0.16,27,61],[291.777,0.14,39,37],[293.145,0.055,38,65],[293.205,0.16,27,61],[293.205,0.14,39,37],[294.574,0.055,38,65],[294.634,0.16,27,61],[294.634,0.14,39,37],[296.002,0.055,38,65],[296.062,0.16,27,61],[296.062,0.14,39,37],[297.431,0.055,38,65],[297.491,0.16,27,61],[297.491,0.14,39,37],[298.86,0.055,38,65],[298.92,0.16,27,61],[298.92,0.14,39,37],[300.288,0.055,38,65],[300.348,0.16,27,61],[300.348,0.14,39,37],[301.488,0.055,38,79],[301.548,0.16,27,75],[301.548,0.14,39,45],[302.322,0.055,38,79],[302.382,0.16,27,75],[302.382,0.14,39,45],[303.155,0.055,38,79],[303.215,0.16,27,75],[303.215,0.14,39,45],[303.988,0.055,38,79],[304.048,0.16,27,75],[304.048,0.14,39,45],[304.822,0.055,38,79],[304.882,0.16,27,75],[304.882,0.14,39,45],[305.655,0.055,38,79],[305.715,0.16,27,75],[305.715,0.14,39,45],[306.488,0.055,38,79],[306.548,0.16,27,75],[306.548,0.14,39,45],[307.322,0.055,38,79],[307.382,0.16,27,75],[307.382,0.14,39,45],[308.155,0.055,38,79],[308.215,0.16,27,75],[308.215,0.14,39,45],[308.988,0.055,38,79],[309.048,0.16,27,75],[309.048,0.14,39,45],[309.822,0.055,38,79],[309.882,0.16,27,75],[309.882,0.14,39,45],[310.655,0.055,38,79],[310.715,0.16,27,75],[310.715,0.14,39,45],[311.488,0.055,38,79],[311.548,0.16,27,75],[311.548,0.14,39,45],[312.322,0.055,38,79],[312.382,0.16,27,75],[312.382,0.14,39,45],[313.155,0.055,38,79],[313.215,0.16,27,75],[313.215,0.14,39,45],[313.988,0.055,38,79],[314.048,0.16,27,75],[314.048,0.14,39,45],[314.822,0.055,38,79],[314.882,0.16,27,75],[314.882,0.14,39,45],[315.655,0.055,38,79],[315.715,0.16,27,75],[315.715,0.14,39,45],[316.488,0.055,38,79],[316.548,0.16,27,75],[316.548,0.14,39,45],[317.322,0.055,38,79],[317.382,0.16,27,75],[317.382,0.14,39,45],[318.155,0.055,38,79],[318.215,0.16,27,75],[318.215,0.14,39,45],[318.988,0.055,38,79],[319.048,0.16,27,75],[319.048,0.14,39,45],[319.822,0.055,38,79],[319.882,0.16,27,75],[319.882,0.14,39,45],[320.655,0.055,38,79],[320.715,0.16,27,75],[320.715,0.14,39,45],[321.488,0.055,38,79],[321.548,0.16,27,75],[321.548,0.14,39,45],[322.322,0.055,38,79],[322.382,0.16,27,75],[322.382,0.14,39,45],[323.155,0.055,38,79],[323.215,0.16,27,75],[323.215,0.14,39,45],[323.988,0.055,38,79],[324.048,0.16,27,75],[324.048,0.14,39,45],[324.822,0.055,38,79],[324.882,0.16,27,75],[324.882,0.14,39,45],[325.655,0.055,38,79],[325.715,0.16,27,75],[325.715,0.14,39,45],[326.488,0.055,38,79],[326.548,0.16,27,75],[326.548,0.14,39,45],[327.322,0.055,38,79],[327.382,0.16,27,75],[327.382,0.14,39,45],[328.155,0.055,38,79],[328.215,0.16,27,75],[328.215,0.14,39,45],[328.988,0.055,38,79],[329.048,0.16,27,75],[329.048,0.14,39,45],[329.822,0.055,38,79],[329.882,0.16,27,75],[329.882,0.14,39,45],[330.655,0.055,38,79],[330.715,0.16,27,75],[330.715,0.14,39,45],[331.488,0.055,38,79],[331.548,0.16,27,75],[331.548,0.14,39,45],[332.322,0.055,38,79],[332.382,0.16,27,75],[332.382,0.14,39,45],[333.155,0.055,38,79],[333.215,0.16,27,75],[333.215,0.14,39,45],[333.988,0.055,38,79],[334.048,0.16,27,75],[334.048,0.14,39,45],[334.822,0.055,38,79],[334.882,0.16,27,75],[334.882,0.14,39,45],[335.655,0.055,38,79],[335.715,0.16,27,75],[335.715,0.14,39,45],[336.488,0.055,38,79],[336.548,0.16,27,75],[336.548,0.14,39,45],[337.322,0.055,38,79],[337.382,0.16,27,75],[337.382,0.14,39,45],[338.155,0.055,38,79],[338.215,0.16,27,75],[338.215,0.14,39,45],[338.988,0.055,38,79],[339.048,0.16,27,75],[339.048,0.14,39,45],[339.822,0.055,38,79],[339.882,0.16,27,75],[339.882,0.14,39,45],[340.655,0.055,38,79],[340.715,0.16,27,75],[340.715,0.14,39,45],[341.488,0.055,38,79],[341.548,0.16,27,75],[341.548,0.14,39,45],[342.322,0.055,38,79],[342.382,0.16,27,75],[342.382,0.14,39,45],[343.155,0.055,38,79],[343.215,0.16,27,75],[343.215,0.14,39,45],[343.988,0.055,38,79],[344.048,0.16,27,75],[344.048,0.14,39,45],[344.822,0.055,38,79],[344.882,0.16,27,75],[344.882,0.14,39,45],[345.655,0.055,38,79],[345.715,0.16,27,75],[345.715,0.14,39,45],[346.488,0.055,38,79],[346.548,0.16,27,75],[346.548,0.14,39,45],[347.322,0.055,38,79],[347.382,0.16,27,75],[347.382,0.14,39,45],[348.155,0.055,38,79],[348.215,0.16,27,75],[348.215,0.14,39,45],[348.988,0.055,38,79],[349.048,0.16,27,75],[349.048,0.14,39,45],[349.822,0.055,38,79],[349.882,0.16,27,75],[349.882,0.14,39,45],[350.655,0.055,38,79],[350.715,0.16,27,75],[350.715,0.14,39,45],[351.488,0.055,38,79],[351.548,0.16,27,75],[351.548,0.14,39,45],[352.322,0.055,38,79],[352.382,0.16,27,75],[352.382,0.14,39,45],[353.155,0.055,38,79],[353.215,0.16,27,75],[353.215,0.14,39,45],[353.988,0.055,38,79],[354.048,0.16,27,75],[354.048,0.14,39,45],[354.822,0.055,38,79],[354.882,0.16,27,75],[354.882,0.14,39,45],[355.655,0.055,38,79],[355.715,0.16,27,75],[355.715,0.14,39,45],[356.488,0.055,38,79],[356.548,0.16,27,75],[356.548,0.14,39,45],[357.322,0.055,38,79],[357.382,0.16,27,75],[357.382,0.14,39,45],[358.155,0.055,38,79],[358.215,0.16,27,75],[358.215,0.14,39,45],[358.988,0.055,38,79],[359.048,0.16,27,75],[359.048,0.14,39,45],[359.822,0.055,38,79],[359.882,0.16,27,75],[359.882,0.14,39,45],[360.655,0.055,38,79],[360.715,0.16,27,75],[360.715,0.14,39,45],[361.488,0.055,38,79],[361.548,0.16,27,75],[361.548,0.14,39,45],[362.322,0.055,38,79],[362.382,0.16,27,75],[362.382,0.14,39,45],[363.155,0.055,38,79],[363.215,0.16,27,75],[363.215,0.14,39,45],[363.988,0.055,38,79],[364.048,0.16,27,75],[364.048,0.14,39,45],[364.822,0.055,38,79],[364.882,0.16,27,75],[364.882,0.14,39,45],[365.655,0.055,38,79],[365.715,0.16,27,75],[365.715,0.14,39,45],[366.488,0.055,38,79],[366.548,0.16,27,75],[366.548,0.14,39,45],[367.322,0.055,38,79],[367.382,0.16,27,75],[367.382,0.14,39,45],[368.155,0.055,38,79],[368.215,0.16,27,75],[368.215,0.14,39,45],[368.988,0.055,38,79],[369.048,0.16,27,75],[369.048,0.14,39,45],[369.822,0.055,38,79],[369.882,0.16,27,75],[369.882,0.14,39,45],[370.655,0.055,38,79],[370.715,0.16,27,75],[370.715,0.14,39,45],[371.488,0.055,38,79],[371.548,0.16,27,75],[371.548,0.14,39,45],[372.322,0.055,38,79],[372.382,0.16,27,75],[372.382,0.14,39,45],[373.155,0.055,38,79],[373.215,0.16,27,75],[373.215,0.14,39,45],[373.988,0.055,38,79],[374.048,0.16,27,75],[374.048,0.14,39,45],[374.822,0.055,38,79],[374.882,0.16,27,75],[374.882,0.14,39,45],[375.655,0.055,38,79],[375.715,0.16,27,75],[375.715,0.14,39,45],[375.822,0.857,36,122],[375.822,0.055,38,75],[375.882,0.16,27,70],[375.882,0.14,39,42],[376.893,0.055,38,75],[376.893,0.857,36,122],[376.953,0.16,27,70],[376.953,0.14,39,42],[377.964,0.857,36,130],[377.964,0.055,38,75],[378.024,0.16,27,70],[378.024,0.14,39,42],[379.036,0.857,36,130],[379.036,0.055,38,75],[379.096,0.16,27,70],[379.096,0.14,39,42],[380.107,0.857,33,137],[380.107,0.055,38,75],[380.167,0.16,27,70],[380.167,0.14,39,42],[381.179,0.055,38,75],[381.179,0.857,33,137],[381.239,0.16,27,70],[381.239,0.14,39,42],[382.25,0.857,33,145],[382.25,0.055,38,75],[382.31,0.16,27,70],[382.31,0.14,39,42],[383.322,0.857,33,145],[383.322,0.055,38,75],[383.382,0.16,27,70],[383.382,0.14,39,42],[384.393,0.055,38,75],[384.393,0.857,29,152],[384.453,0.16,27,70],[384.453,0.14,39,42],[385.464,0.857,29,152],[385.464,0.055,38,75],[385.524,0.16,27,70],[385.524,0.14,39,42],[386.536,0.857,29,159],[386.536,0.055,38,75],[386.596,0.16,27,70],[386.596,0.14,39,42],[387.607,0.857,29,159],[387.607,0.055,38,75],[387.667,0.16,27,70],[387.667,0.14,39,42],[388.679,0.055,38,75],[388.679,0.857,31,167],[388.739,0.16,27,70],[388.739,0.14,39,42],[389.75,0.857,31,167],[389.75,0.055,38,75],[389.81,0.16,27,70],[389.81,0.14,39,42],[390.822,1.929,36,147],[390.822,0.055,38,75],[390.882,0.16,27,70],[390.882,0.14,39,42],[391.893,0.055,38,75],[391.953,0.16,27,70],[391.953,0.14,39,42],[392.964,0.248,36,111],[392.964,0.055,38,75],[393.024,0.16,27,70],[393.024,0.14,39,42],[393.352,0.248,43,111],[393.999,0.248,36,111],[393.999,0.055,38,75],[394.059,0.16,27,70],[394.059,0.14,39,42],[394.775,0.248,35,111],[395.033,0.248,36,118],[395.033,0.055,38,75],[395.093,0.16,27,70],[395.093,0.14,39,42],[395.421,0.248,43,118],[396.068,0.248,36,118],[396.068,0.055,38,75],[396.128,0.16,27,70],[396.128,0.14,39,42],[396.844,0.248,32,118],[397.102,0.248,33,124],[397.102,0.055,38,75],[397.162,0.16,27,70],[397.162,0.14,39,42],[397.49,0.248,40,124],[398.137,0.248,33,124],[398.137,0.055,38,75],[398.197,0.16,27,70],[398.197,0.14,39,42],[398.913,0.248,32,124],[399.171,0.248,33,131],[399.171,0.055,38,75],[399.231,0.16,27,70],[399.231,0.14,39,42],[399.559,0.248,40,131],[400.206,0.248,33,131],[400.206,0.055,38,75],[400.266,0.16,27,70],[400.266,0.14,39,42],[400.982,0.248,28,131],[401.24,0.248,29,137],[401.24,0.055,38,75],[401.3,0.16,27,70],[401.3,0.14,39,42],[401.628,0.248,36,137],[402.275,0.248,29,137],[402.275,0.055,38,75],[402.335,0.16,27,70],[402.335,0.14,39,42],[403.051,0.248,28,137],[403.309,0.248,29,144],[403.309,0.055,38,75],[403.369,0.16,27,70],[403.369,0.14,39,42],[403.697,0.248,36,144],[404.344,0.248,29,144],[404.344,0.055,38,75],[404.404,0.16,27,70],[404.404,0.14,39,42],[405.12,0.248,30,144],[405.378,0.248,31,151],[405.378,0.055,38,75],[405.438,0.16,27,70],[405.438,0.14,39,42],[405.766,0.248,38,151],[406.413,0.248,31,151],[406.413,0.055,38,75],[406.473,0.16,27,70],[406.473,0.14,39,42],[407.188,0.248,35,151],[407.447,1.862,36,155],[407.447,0.055,38,75],[407.507,0.16,27,70],[407.507,0.14,39,42],[408.482,0.055,38,75],[408.542,0.16,27,70],[408.542,0.14,39,42],[409.516,0.24,36,117],[409.516,0.055,38,75],[409.576,0.16,27,70],[409.576,0.14,39,42],[409.891,0.24,43,117],[410.516,0.24,36,117],[410.516,0.055,38,75],[410.576,0.16,27,70],[410.576,0.14,39,42],[411.266,0.24,35,117],[411.516,0.24,36,124],[411.516,0.055,38,75],[411.576,0.16,27,70],[411.576,0.14,39,42],[411.891,0.24,43,124],[412.516,0.24,36,124],[412.516,0.055,38,75],[412.576,0.16,27,70],[412.576,0.14,39,42],[413.266,0.24,32,124],[413.516,0.24,33,131],[413.516,0.055,38,75],[413.576,0.16,27,70],[413.576,0.14,39,42],[413.891,0.24,40,131],[414.516,0.24,33,131],[414.516,0.055,38,75],[414.576,0.16,27,70],[414.576,0.14,39,42],[415.266,0.24,32,131],[415.516,0.24,33,138],[415.516,0.055,38,75],[415.576,0.16,27,70],[415.576,0.14,39,42],[415.891,0.24,40,138],[416.516,0.24,33,138],[416.516,0.055,38,75],[416.576,0.16,27,70],[416.576,0.14,39,42],[417.266,0.24,28,138],[417.516,0.24,29,145],[417.516,0.055,38,75],[417.576,0.16,27,70],[417.576,0.14,39,42],[417.891,0.24,36,145],[418.516,0.24,29,145],[418.516,0.055,38,75],[418.576,0.16,27,70],[418.576,0.14,39,42],[419.266,0.24,28,145],[419.516,0.24,29,152],[419.516,0.055,38,75],[419.576,0.16,27,70],[419.576,0.14,39,42],[419.891,0.24,36,152],[420.516,0.24,29,152],[420.516,0.055,38,75],[420.576,0.16,27,70],[420.576,0.14,39,42],[421.266,0.24,30,152],[421.516,0.24,31,159],[421.516,0.055,38,75],[421.576,0.16,27,70],[421.576,0.14,39,42],[421.891,0.24,38,159],[422.516,0.24,31,159],[422.516,0.055,38,75],[422.576,0.16,27,70],[422.576,0.14,39,42],[423.266,0.24,35,159],[423.516,1.8,36,163],[423.516,0.055,38,75],[423.576,0.16,27,70],[423.576,0.14,39,42],[424.516,0.055,38,75],[424.576,0.16,27,70],[424.576,0.14,39,42],[425.516,0.232,36,117],[425.516,0.055,38,75],[425.576,0.16,27,70],[425.576,0.14,39,42],[425.879,0.232,43,117],[426.484,0.055,38,75],[426.484,0.232,36,117],[426.544,0.16,27,70],[426.544,0.14,39,42],[427.21,0.232,35,117],[427.452,0.232,36,124],[427.452,0.055,38,75],[427.512,0.16,27,70],[427.512,0.14,39,42],[427.815,0.232,43,124],[428.419,0.232,36,124],[428.419,0.055,38,75],[428.479,0.16,27,70],[428.479,0.14,39,42],[429.145,0.232,32,124],[429.387,0.232,33,131],[429.387,0.055,38,75],[429.447,0.16,27,70],[429.447,0.14,39,42],[429.75,0.232,40,131],[430.355,0.232,33,131],[430.355,0.055,38,75],[430.415,0.16,27,70],[430.415,0.14,39,42],[431.081,0.232,32,131],[431.323,0.232,33,138],[431.323,0.055,38,75],[431.383,0.16,27,70],[431.383,0.14,39,42],[431.685,0.232,40,138],[432.29,0.232,33,138],[432.29,0.055,38,75],[432.35,0.16,27,70],[432.35,0.14,39,42],[433.016,0.232,28,138],[433.258,0.232,29,145],[433.258,0.055,38,75],[433.318,0.16,27,70],[433.318,0.14,39,42],[433.621,0.232,36,145],[434.226,0.232,29,145],[434.226,0.055,38,75],[434.286,0.16,27,70],[434.286,0.14,39,42],[434.952,0.232,28,145],[435.193,0.232,29,152],[435.193,0.055,38,75],[435.253,0.16,27,70],[435.253,0.14,39,42],[435.556,0.232,36,152],[436.161,0.232,29,152],[436.161,0.055,38,75],[436.221,0.16,27,70],[436.221,0.14,39,42],[436.887,0.232,30,152],[437.129,0.232,31,159],[437.129,0.055,38,75],[437.189,0.16,27,70],[437.189,0.14,39,42],[437.492,0.232,38,159],[438.097,0.055,38,75],[438.097,0.232,31,159],[438.157,0.16,27,70],[438.157,0.14,39,42],[438.823,0.232,35,159],[439.065,1.742,36,163],[439.065,0.055,38,75],[439.125,0.16,27,70],[439.125,0.14,39,42],[440.032,0.055,38,75],[440.092,0.16,27,70],[440.092,0.14,39,42],[441,0.21,38,154],[441,0.055,38,246],[441.06,0.16,27,231],[441.06,0.14,39,138],[441.75,0.21,38,154],[442,0.21,38,154],[442,0.055,38,246],[442.06,0.16,27,231],[442.06,0.14,39,138],[442.75,0.21,38,154],[443,0.21,38,163],[443,0.055,38,255],[443.06,0.16,27,245],[443.06,0.14,39,147],[443.75,0.21,38,163],[444,0.21,38,163],[444,0.055,38,255],[444.06,0.16,27,245],[444.06,0.14,39,147],[444.75,0.21,38,163],[445,0.21,35,172],[445,0.055,38,255],[445.06,0.16,27,255],[445.06,0.14,39,155],[445.75,0.21,35,172],[446,0.21,35,172],[446,0.055,38,255],[446.06,0.16,27,255],[446.06,0.14,39,155],[446.75,0.21,35,172],[447,0.21,35,181],[447,0.055,38,255],[447.06,0.16,27,255],[447.06,0.14,39,163],[447.75,0.21,35,181],[448,0.21,35,181],[448,0.055,38,255],[448.06,0.16,27,255],[448.06,0.14,39,163],[448.75,0.21,35,181],[448.75,0.055,38,255],[448.81,0.16,27,255],[448.81,0.14,39,163],[449,0.21,31,191],[449,0.055,38,255],[449.06,0.16,27,255],[449.06,0.14,39,172],[449.75,0.21,31,191],[450,0.21,31,191],[450,0.055,38,255],[450.06,0.16,27,255],[450.06,0.14,39,172],[450.75,0.21,31,191],[451,0.21,31,200],[451,0.055,38,255],[451.06,0.16,27,255],[451.06,0.14,39,180],[451.75,0.21,31,200],[452,0.21,31,200],[452,0.055,38,255],[452.06,0.16,27,255],[452.06,0.14,39,180],[452.75,0.21,31,200],[453,0.21,33,209],[453,0.055,38,255],[453.06,0.16,27,255],[453.06,0.14,39,188],[453.75,0.21,33,209],[454,0.21,33,209],[454,0.055,38,255],[454.06,0.16,27,255],[454.06,0.14,39,188],[454.75,0.21,33,209],[455,0.21,38,194],[455,0.055,38,255],[455.06,0.16,27,255],[455.06,0.14,39,175],[455.75,0.21,38,194],[456,0.21,38,194],[456,0.055,38,255],[456.06,0.16,27,255],[456.06,0.14,39,175],[456.75,0.21,38,194],[456.75,0.055,38,255],[456.81,0.16,27,255],[456.81,0.14,39,175],[457,0.21,38,162],[457,0.055,38,255],[457.06,0.16,27,243],[457.06,0.14,39,146],[457.75,0.21,38,162],[458,0.21,38,162],[458,0.055,38,255],[458.06,0.16,27,243],[458.06,0.14,39,146],[458.75,0.21,38,162],[459,0.21,38,172],[459,0.055,38,255],[459.06,0.16,27,255],[459.06,0.14,39,155],[459.75,0.21,38,172],[460,0.21,38,172],[460,0.055,38,255],[460.06,0.16,27,255],[460.06,0.14,39,155],[460.75,0.21,38,172],[461,0.21,35,181],[461,0.055,38,255],[461.06,0.16,27,255],[461.06,0.14,39,163],[461.75,0.21,35,181],[462,0.21,35,181],[462,0.055,38,255],[462.06,0.16,27,255],[462.06,0.14,39,163],[462.75,0.21,35,181],[463,0.21,35,191],[463,0.055,38,255],[463.06,0.16,27,255],[463.06,0.14,39,172],[463.75,0.21,35,191],[464,0.21,35,191],[464,0.055,38,255],[464.06,0.16,27,255],[464.06,0.14,39,172],[464.75,0.21,35,191],[464.75,0.055,38,255],[464.81,0.16,27,255],[464.81,0.14,39,172],[465,0.21,31,201],[465,0.055,38,255],[465.06,0.16,27,255],[465.06,0.14,39,181],[465.75,0.21,31,201],[466,0.21,31,201],[466,0.055,38,255],[466.06,0.16,27,255],[466.06,0.14,39,181],[466.75,0.21,31,201],[467,0.21,31,211],[467,0.055,38,255],[467.06,0.16,27,255],[467.06,0.14,39,190],[467.75,0.21,31,211],[468,0.21,31,211],[468,0.055,38,255],[468.06,0.16,27,255],[468.06,0.14,39,190],[468.75,0.21,31,211],[469,0.21,33,220],[469,0.055,38,255],[469.06,0.16,27,255],[469.06,0.14,39,198],[469.75,0.21,33,220],[470,0.21,33,220],[470,0.055,38,255],[470.06,0.16,27,255],[470.06,0.14,39,198],[470.75,0.21,33,220],[471,0.21,38,204],[471,0.055,38,255],[471.06,0.16,27,255],[471.06,0.14,39,184],[471.75,0.21,38,204],[472,0.21,38,204],[472,0.055,38,255],[472.06,0.16,27,255],[472.06,0.14,39,184],[472.75,0.21,38,204],[472.75,0.055,38,255],[472.81,0.16,27,255],[472.81,0.14,39,184],[473,0.207,38,162],[473,0.055,38,255],[473.06,0.16,27,243],[473.06,0.14,39,146],[473.738,0.207,38,162],[473.984,0.207,38,162],[473.984,0.055,38,255],[474.044,0.16,27,243],[474.044,0.14,39,146],[474.721,0.207,38,162],[474.967,0.207,38,172],[474.967,0.055,38,255],[475.027,0.16,27,255],[475.027,0.14,39,155],[475.705,0.207,38,172],[475.951,0.207,38,172],[475.951,0.055,38,255],[476.011,0.16,27,255],[476.011,0.14,39,155],[476.688,0.207,38,172],[476.934,0.207,35,181],[476.934,0.055,38,255],[476.994,0.16,27,255],[476.994,0.14,39,163],[477.672,0.207,35,181],[477.918,0.207,35,181],[477.918,0.055,38,255],[477.978,0.16,27,255],[477.978,0.14,39,163],[478.656,0.207,35,181],[478.902,0.207,35,191],[478.902,0.055,38,255],[478.962,0.16,27,255],[478.962,0.14,39,172],[479.639,0.207,35,191],[479.885,0.207,35,191],[479.885,0.055,38,255],[479.945,0.16,27,255],[479.945,0.14,39,172],[480.623,0.207,35,191],[480.623,0.055,38,255],[480.683,0.16,27,255],[480.683,0.14,39,172],[480.869,0.207,31,201],[480.869,0.055,38,255],[480.929,0.16,27,255],[480.929,0.14,39,181],[481.606,0.207,31,201],[481.852,0.207,31,201],[481.852,0.055,38,255],[481.912,0.16,27,255],[481.912,0.14,39,181],[482.59,0.207,31,201],[482.836,0.207,31,211],[482.836,0.055,38,255],[482.896,0.16,27,255],[482.896,0.14,39,190],[483.574,0.207,31,211],[483.82,0.207,31,211],[483.82,0.055,38,255],[483.88,0.16,27,255],[483.88,0.14,39,190],[484.557,0.207,31,211],[484.803,0.207,33,220],[484.803,0.055,38,255],[484.863,0.16,27,255],[484.863,0.14,39,198],[485.541,0.207,33,220],[485.787,0.207,33,220],[485.787,0.055,38,255],[485.847,0.16,27,255],[485.847,0.14,39,198],[486.525,0.207,33,220],[486.771,0.207,38,204],[486.771,0.055,38,255],[486.83,0.16,27,255],[486.83,0.14,39,184],[487.508,0.207,38,204],[487.754,0.207,38,204],[487.754,0.055,38,255],[487.814,0.16,27,255],[487.814,0.14,39,184],[488.492,0.207,38,204],[488.492,0.055,38,255],[488.552,0.16,27,255],[488.552,0.14,39,184],[488.738,0.203,38,170],[488.738,0.055,38,255],[488.798,0.16,27,255],[488.798,0.14,39,153],[489.464,0.203,38,170],[489.705,0.203,38,170],[489.705,0.055,38,255],[489.765,0.16,27,255],[489.765,0.14,39,153],[490.431,0.203,38,170],[490.673,0.203,38,180],[490.673,0.055,38,255],[490.733,0.16,27,255],[490.733,0.14,39,162],[491.399,0.203,38,180],[491.641,0.203,38,180],[491.641,0.055,38,255],[491.701,0.16,27,255],[491.701,0.14,39,162],[492.367,0.203,38,180],[492.609,0.203,35,191],[492.609,0.055,38,255],[492.669,0.16,27,255],[492.669,0.14,39,171],[493.334,0.203,35,191],[493.576,0.203,35,191],[493.576,0.055,38,255],[493.636,0.16,27,255],[493.636,0.14,39,171],[494.302,0.203,35,191],[494.544,0.203,35,201],[494.544,0.055,38,255],[494.604,0.16,27,255],[494.604,0.14,39,181],[495.27,0.203,35,201],[495.512,0.203,35,201],[495.512,0.055,38,255],[495.572,0.16,27,255],[495.572,0.14,39,181],[496.238,0.203,35,201],[496.238,0.055,38,255],[496.298,0.16,27,255],[496.298,0.14,39,181],[496.48,0.203,31,211],[496.48,0.055,38,255],[496.54,0.16,27,255],[496.54,0.14,39,190],[497.205,0.203,31,211],[497.447,0.203,31,211],[497.447,0.055,38,255],[497.507,0.16,27,255],[497.507,0.14,39,190],[498.173,0.203,31,211],[498.415,0.203,31,221],[498.415,0.055,38,255],[498.475,0.16,27,255],[498.475,0.14,39,199],[499.141,0.203,31,221],[499.383,0.203,31,221],[499.383,0.055,38,255],[499.443,0.16,27,255],[499.443,0.14,39,199],[500.109,0.203,31,221],[500.351,0.203,33,231],[500.351,0.055,38,255],[500.411,0.16,27,255],[500.411,0.14,39,208],[501.076,0.203,33,231],[501.318,0.203,33,231],[501.318,0.055,38,255],[501.378,0.16,27,255],[501.378,0.14,39,208],[502.044,0.203,33,231],[502.286,0.203,38,214],[502.286,0.055,38,255],[502.346,0.16,27,255],[502.346,0.14,39,193],[503.012,0.203,38,214],[503.254,0.203,38,214],[503.254,0.055,38,255],[503.314,0.16,27,255],[503.314,0.14,39,193],[503.98,0.203,38,214],[503.98,0.055,38,255],[504.04,0.16,27,255],[504.04,0.14,39,193],[504.222,0.203,38,170],[504.222,0.055,38,255],[504.282,0.16,27,255],[504.282,0.14,39,153],[504.947,0.203,38,170],[505.189,0.203,38,170],[505.189,0.055,38,255],[505.249,0.16,27,255],[505.249,0.14,39,153],[505.915,0.203,38,170],[506.157,0.203,38,180],[506.157,0.055,38,255],[506.217,0.16,27,255],[506.217,0.14,39,162],[506.883,0.203,38,180],[507.125,0.203,38,180],[507.125,0.055,38,255],[507.185,0.16,27,255],[507.185,0.14,39,162],[507.851,0.203,38,180],[508.092,0.203,35,191],[508.092,0.055,38,255],[508.152,0.16,27,255],[508.152,0.14,39,171],[508.818,0.203,35,191],[509.06,0.203,35,191],[509.06,0.055,38,255],[509.12,0.16,27,255],[509.12,0.14,39,171],[509.786,0.203,35,191],[510.028,0.203,35,201],[510.028,0.055,38,255],[510.088,0.16,27,255],[510.088,0.14,39,181],[510.754,0.203,35,201],[510.996,0.203,35,201],[510.996,0.055,38,255],[511.056,0.16,27,255],[511.056,0.14,39,181],[511.722,0.203,35,201],[511.722,0.055,38,255],[511.782,0.16,27,255],[511.782,0.14,39,181],[511.964,0.203,31,211],[511.964,0.055,38,255],[512.024,0.16,27,255],[512.024,0.14,39,190],[512.689,0.203,31,211],[512.931,0.203,31,211],[512.931,0.055,38,255],[512.991,0.16,27,255],[512.991,0.14,39,190],[513.657,0.203,31,211],[513.899,0.203,31,221],[513.899,0.055,38,255],[513.959,0.16,27,255],[513.959,0.14,39,199],[514.625,0.203,31,221],[514.867,0.203,31,221],[514.867,0.055,38,255],[514.927,0.16,27,255],[514.927,0.14,39,199],[515.592,0.203,31,221],[515.835,0.203,33,231],[515.835,0.055,38,255],[515.894,0.16,27,255],[515.894,0.14,39,208],[516.56,0.203,33,231],[516.802,0.203,33,231],[516.802,0.055,38,255],[516.862,0.16,27,255],[516.862,0.14,39,208],[517.528,0.203,33,231],[517.77,0.203,38,214],[517.77,0.055,38,255],[517.83,0.16,27,255],[517.83,0.14,39,193],[518.496,0.203,38,214],[518.738,0.203,38,214],[518.738,0.055,38,255],[518.798,0.16,27,255],[518.798,0.14,39,193],[519.463,0.203,38,214],[519.463,0.055,38,255],[519.524,0.16,27,255],[519.524,0.14,39,193],[519.705,0.207,38,162],[519.705,0.055,38,255],[519.765,0.16,27,243],[519.765,0.14,39,146],[520.443,0.207,38,162],[520.689,0.207,38,162],[520.689,0.055,38,255],[520.749,0.16,27,243],[520.749,0.14,39,146],[521.427,0.207,38,162],[521.673,0.207,38,172],[521.673,0.055,38,255],[521.733,0.16,27,255],[521.733,0.14,39,155],[522.41,0.207,38,172],[522.656,0.207,38,172],[522.656,0.055,38,255],[522.716,0.16,27,255],[522.716,0.14,39,155],[523.394,0.207,38,172],[523.64,0.207,35,181],[523.64,0.055,38,255],[523.7,0.16,27,255],[523.7,0.14,39,163],[524.378,0.207,35,181],[524.624,0.207,35,181],[524.624,0.055,38,255],[524.683,0.16,27,255],[524.683,0.14,39,163],[525.361,0.207,35,181],[525.607,0.207,35,191],[525.607,0.055,38,255],[525.667,0.16,27,255],[525.667,0.14,39,172],[526.345,0.207,35,191],[526.591,0.207,35,191],[526.591,0.055,38,255],[526.651,0.16,27,255],[526.651,0.14,39,172],[527.328,0.207,35,191],[527.328,0.055,38,255],[527.388,0.16,27,255],[527.388,0.14,39,172],[527.574,0.207,31,201],[527.574,0.055,38,255],[527.634,0.16,27,255],[527.634,0.14,39,181],[528.312,0.207,31,201],[528.558,0.207,31,201],[528.558,0.055,38,255],[528.618,0.16,27,255],[528.618,0.14,39,181],[529.296,0.207,31,201],[529.542,0.207,31,211],[529.542,0.055,38,255],[529.601,0.16,27,255],[529.601,0.14,39,190],[530.279,0.207,31,211],[530.525,0.207,31,211],[530.525,0.055,38,255],[530.585,0.16,27,255],[530.585,0.14,39,190],[531.263,0.207,31,211],[531.509,0.207,33,220],[531.509,0.055,38,255],[531.569,0.16,27,255],[531.569,0.14,39,198],[532.246,0.207,33,220],[532.492,0.207,33,220],[532.492,0.055,38,255],[532.552,0.16,27,255],[532.552,0.14,39,198],[533.23,0.207,33,220],[533.476,0.207,38,204],[533.476,0.055,38,255],[533.536,0.16,27,255],[533.536,0.14,39,184],[534.214,0.207,38,204],[534.46,0.207,38,204],[534.46,0.055,38,255],[534.519,0.16,27,255],[534.519,0.14,39,184],[535.197,0.207,38,204],[535.197,0.055,38,255],[535.257,0.16,27,255],[535.257,0.14,39,184],[535.443,0.214,38,162],[535.443,0.055,38,255],[535.503,0.16,27,243],[535.503,0.14,39,146],[536.206,0.214,38,162],[536.46,0.214,38,162],[536.46,0.055,38,255],[536.52,0.16,27,243],[536.52,0.14,39,146],[537.223,0.214,38,162],[537.477,0.214,38,172],[537.477,0.055,38,255],[537.537,0.16,27,255],[537.537,0.14,39,155],[538.24,0.214,38,172],[538.494,0.214,38,172],[538.494,0.055,38,255],[538.554,0.16,27,255],[538.554,0.14,39,155],[539.257,0.214,38,172],[539.511,0.214,35,181],[539.511,0.055,38,255],[539.571,0.16,27,255],[539.571,0.14,39,163],[540.274,0.214,35,181],[540.528,0.214,35,181],[540.528,0.055,38,255],[540.588,0.16,27,255],[540.588,0.14,39,163],[541.291,0.214,35,181],[541.545,0.214,35,191],[541.545,0.055,38,255],[541.605,0.16,27,255],[541.605,0.14,39,172],[542.308,0.214,35,191],[542.562,0.214,35,191],[542.562,0.055,38,255],[542.622,0.16,27,255],[542.622,0.14,39,172],[543.324,0.214,35,191],[543.324,0.055,38,255],[543.385,0.16,27,255],[543.385,0.14,39,172],[543.579,0.214,31,201],[543.579,0.055,38,255],[543.639,0.16,27,255],[543.639,0.14,39,181],[544.341,0.214,31,201],[544.596,0.214,31,201],[544.596,0.055,38,255],[544.656,0.16,27,255],[544.656,0.14,39,181],[545.358,0.214,31,201],[545.613,0.214,31,211],[545.613,0.055,38,255],[545.673,0.16,27,255],[545.673,0.14,39,190],[546.375,0.214,31,211],[546.63,0.214,31,211],[546.63,0.055,38,255],[546.69,0.16,27,255],[546.69,0.14,39,190],[547.392,0.214,31,211],[547.646,0.214,33,220],[547.646,4.068,38,162],[547.646,0.055,38,255],[547.707,0.16,27,255],[547.707,0.14,39,198],[548.409,0.214,33,220],[548.663,0.214,33,220],[548.663,0.055,38,255],[548.723,0.16,27,255],[548.723,0.14,39,198],[549.426,0.214,33,220],[549.68,0.214,38,204],[549.68,0.055,38,255],[549.74,0.16,27,255],[549.74,0.14,39,184],[550.443,0.214,38,204],[550.697,0.214,38,204],[550.697,0.055,38,255],[550.757,0.16,27,255],[550.757,0.14,39,184],[551.46,0.214,38,204],[551.46,0.055,38,255],[551.52,0.16,27,255],[551.52,0.14,39,184],[551.714,0.055,38,75],[551.774,0.16,27,70],[551.774,0.14,39,42],[552.731,0.055,38,75],[552.791,0.16,27,70],[552.791,0.14,39,42],[553.748,0.055,38,75],[553.808,0.16,27,70],[553.808,0.14,39,42],[554.314,0.055,38,93],[554.374,0.16,27,87],[554.374,0.14,39,52],[555.223,0.055,38,93],[555.283,0.16,27,87],[555.283,0.14,39,52],[556.133,0.055,38,93],[556.192,0.16,27,87],[556.192,0.14,39,52],[557.042,0.055,38,93],[557.102,0.16,27,87],[557.102,0.14,39,52],[557.951,0.055,38,93],[558.011,0.16,27,87],[558.011,0.14,39,52],[558.86,0.055,38,93],[558.92,0.16,27,87],[558.92,0.14,39,52],[559.769,0.055,38,93],[559.829,0.16,27,87],[559.829,0.14,39,52],[560.678,0.055,38,93],[560.738,0.16,27,87],[560.738,0.14,39,52],[561.587,0.055,38,93],[561.647,0.16,27,87],[561.647,0.14,39,52],[562.496,0.055,38,93],[562.556,0.16,27,87],[562.556,0.14,39,52],[563.405,0.055,38,93],[563.465,0.16,27,87],[563.465,0.14,39,52],[564.314,0.055,38,93],[564.374,0.16,27,87],[564.374,0.14,39,52],[565.223,0.055,38,93],[565.283,0.16,27,87],[565.283,0.14,39,52],[566.133,0.055,38,93],[566.192,0.16,27,87],[566.192,0.14,39,52],[567.042,0.055,38,93],[567.102,0.16,27,87],[567.102,0.14,39,52],[567.951,0.055,38,93],[568.011,0.16,27,87],[568.011,0.14,39,52],[568.86,0.227,31,162],[568.86,0.055,38,93],[568.92,0.16,27,87],[568.92,0.14,39,52],[569.769,0.055,38,93],[569.769,0.227,38,146],[569.829,0.16,27,87],[569.829,0.14,39,52],[570.678,0.055,38,93],[570.678,0.227,31,162],[570.738,0.16,27,87],[570.738,0.14,39,52],[571.587,0.227,38,146],[571.587,0.055,38,93],[571.647,0.16,27,87],[571.647,0.14,39,52],[572.496,0.227,31,162],[572.496,0.055,38,93],[572.556,0.16,27,87],[572.556,0.14,39,52],[573.405,0.227,38,146],[573.405,0.055,38,93],[573.465,0.16,27,87],[573.465,0.14,39,52],[574.314,0.227,31,162],[574.314,0.055,38,93],[574.374,0.16,27,87],[574.374,0.14,39,52],[575.223,0.227,38,146],[575.223,0.055,38,93],[575.283,0.16,27,87],[575.283,0.14,39,52],[576.133,0.227,31,162],[576.133,0.055,38,93],[576.192,0.16,27,87],[576.192,0.14,39,52],[577.042,0.227,38,146],[577.042,0.055,38,93],[577.102,0.16,27,87],[577.102,0.14,39,52],[577.951,0.227,31,162],[577.951,0.055,38,93],[578.011,0.16,27,87],[578.011,0.14,39,52],[578.86,0.227,38,146],[578.86,0.055,38,93],[578.92,0.16,27,87],[578.92,0.14,39,52],[579.769,0.055,38,93],[579.769,0.227,31,162],[579.829,0.16,27,87],[579.829,0.14,39,52],[580.678,0.055,38,93],[580.678,0.227,38,146],[580.738,0.16,27,87],[580.738,0.14,39,52],[581.587,0.227,31,162],[581.587,0.055,38,93],[581.647,0.16,27,87],[581.647,0.14,39,52],[582.496,0.227,38,146],[582.496,0.055,38,93],[582.556,0.16,27,87],[582.556,0.14,39,52],[583.405,0.055,38,93],[583.465,0.16,27,87],[583.465,0.14,39,52],[584.314,0.055,38,93],[584.374,0.16,27,87],[584.374,0.14,39,52],[585.223,0.055,38,93],[585.283,0.16,27,87],[585.283,0.14,39,52],[586.133,0.055,38,93],[586.192,0.16,27,87],[586.192,0.14,39,52],[587.042,0.055,38,93],[587.102,0.16,27,87],[587.102,0.14,39,52],[587.951,0.055,38,93],[588.011,0.16,27,87],[588.011,0.14,39,52],[588.86,0.055,38,93],[588.92,0.16,27,87],[588.92,0.14,39,52],[589.769,0.055,38,93],[589.829,0.16,27,87],[589.829,0.14,39,52],[590.678,0.055,38,93],[590.678,0.159,31,194],[590.738,0.16,27,87],[590.738,0.14,39,52],[591.587,0.055,38,93],[591.647,0.16,27,87],[591.647,0.14,39,52],[592.437,0.277,36,105],[592.437,0.055,38,75],[592.497,0.16,27,70],[592.497,0.14,39,42],[592.87,0.277,43,105],[593.591,0.055,38,75],[593.591,0.277,36,105],[593.651,0.16,27,70],[593.651,0.14,39,42],[594.456,0.277,35,105],[594.745,0.277,36,111],[594.745,0.055,38,75],[594.805,0.16,27,70],[594.805,0.14,39,42],[595.177,0.277,43,111],[595.899,0.055,38,75],[595.899,0.277,36,111],[595.958,0.16,27,70],[595.958,0.14,39,42],[596.764,0.277,32,111],[597.052,0.277,33,118],[597.052,0.055,38,75],[597.112,0.16,27,70],[597.112,0.14,39,42],[597.485,0.277,40,118],[598.206,0.055,38,75],[598.206,0.277,33,118],[598.266,0.16,27,70],[598.266,0.14,39,42],[599.072,0.277,32,118],[599.36,0.277,33,124],[599.36,0.055,38,75],[599.42,0.16,27,70],[599.42,0.14,39,42],[599.793,0.277,40,124],[600.514,0.055,38,75],[600.514,0.277,33,124],[600.574,0.16,27,70],[600.574,0.14,39,42],[601.379,0.277,28,124],[601.668,0.277,29,130],[601.668,0.055,38,75],[601.728,0.16,27,70],[601.728,0.14,39,42],[602.101,0.277,36,130],[602.822,0.055,38,75],[602.822,0.277,29,130],[602.882,0.16,27,70],[602.882,0.14,39,42],[603.687,0.277,28,130],[603.976,0.277,29,136],[603.976,0.055,38,75],[604.035,0.16,27,70],[604.035,0.14,39,42],[604.408,0.277,36,136],[605.129,0.055,38,75],[605.129,0.277,29,136],[605.189,0.16,27,70],[605.189,0.14,39,42],[605.995,0.277,30,136],[606.283,0.277,31,143],[606.283,0.055,38,75],[606.343,0.16,27,70],[606.343,0.14,39,42],[606.716,0.277,38,143],[607.437,0.277,31,143],[607.437,0.055,38,75],[607.497,0.16,27,70],[607.497,0.14,39,42],[608.302,0.277,35,143],[608.591,0.055,38,75],[608.591,2.077,36,147],[608.651,0.16,27,70],[608.651,0.14,39,42],[609.745,0.055,38,75],[609.805,0.16,27,70],[609.805,0.14,39,42],[610.899,0.055,38,75],[610.959,0.16,27,70],[610.959,0.14,39,42],[612.099,0.055,38,75],[612.159,0.16,27,70],[612.159,0.14,39,42],[613.299,0.055,38,75],[613.359,0.16,27,70],[613.359,0.14,39,42],[614.499,0.055,38,75],[614.559,0.16,27,70],[614.559,0.14,39,42],[615.699,0.055,38,75],[615.759,0.16,27,70],[615.759,0.14,39,42],[616.899,0.055,38,75],[616.959,0.16,27,70],[616.959,0.14,39,42],[618.099,0.055,38,75],[618.159,0.16,27,70],[618.159,0.14,39,42],[619.299,0.055,38,75],[619.359,0.16,27,70],[619.359,0.14,39,42],[620.499,0.055,38,75],[620.559,0.16,27,70],[620.559,0.14,39,42],[621.699,0.055,38,75],[621.759,0.16,27,70],[621.759,0.14,39,42],[622.899,0.055,38,75],[622.959,0.16,27,70],[622.959,0.14,39,42],[624.099,0.055,38,75],[624.159,0.16,27,70],[624.159,0.14,39,42],[625.299,0.055,38,75],[625.359,0.16,27,70],[625.359,0.14,39,42],[626.499,0.055,38,75],[626.559,0.16,27,70],[626.559,0.14,39,42],[627.699,0.055,38,75],[627.759,0.16,27,70],[627.759,0.14,39,42],[628.899,0.055,38,75],[628.959,0.16,27,70],[628.959,0.14,39,42],[630.099,0.055,38,75],[630.159,0.16,27,70],[630.159,0.14,39,42],[631.349,0.055,38,75],[631.409,0.16,27,70],[631.409,0.14,39,42],[632.599,0.055,38,75],[632.659,0.16,27,70],[632.659,0.14,39,42],[633.849,0.055,38,75],[633.909,0.16,27,70],[633.909,0.14,39,42],[635.099,0.055,38,75],[635.159,0.16,27,70],[635.159,0.14,39,42],[636.349,0.055,38,75],[636.409,0.16,27,70],[636.409,0.14,39,42],[637.599,0.055,38,75],[637.659,0.16,27,70],[637.659,0.14,39,42],[638.849,0.055,38,75],[638.909,0.16,27,70],[638.909,0.14,39,42],[640.099,0.055,38,75],[640.159,0.16,27,70],[640.159,0.14,39,42],[641.349,0.055,38,75],[641.409,0.16,27,70],[641.409,0.14,39,42],[642.599,0.055,38,75],[642.659,0.16,27,70],[642.659,0.14,39,42],[643.849,0.055,38,75],[643.909,0.16,27,70],[643.909,0.14,39,42],[645.099,0.055,38,75],[645.159,0.16,27,70],[645.159,0.14,39,42],[646.349,0.055,38,75],[646.409,0.16,27,70],[646.409,0.14,39,42],[647.599,0.055,38,75],[647.659,0.16,27,70],[647.659,0.14,39,42],[648.849,0.055,38,75],[648.909,0.16,27,70],[648.909,0.14,39,42],[650.099,0.055,38,75],[650.159,0.16,27,70],[650.159,0.14,39,42],[651.375,0.055,38,75],[651.435,0.16,27,70],[651.435,0.14,39,42],[652.652,0.055,38,75],[652.712,0.16,27,70],[652.712,0.14,39,42],[653.928,0.055,38,75],[653.988,0.16,27,70],[653.988,0.14,39,42],[655.205,0.055,38,75],[655.265,0.16,27,70],[655.265,0.14,39,42],[656.482,0.055,38,75],[656.542,0.16,27,70],[656.542,0.14,39,42],[657.758,0.055,38,75],[657.818,0.16,27,70],[657.818,0.14,39,42],[659.035,0.055,38,75],[659.095,0.16,27,70],[659.095,0.14,39,42],[660.311,0.055,38,75],[660.371,0.16,27,70],[660.371,0.14,39,42],[661.588,0.055,38,75],[661.648,0.16,27,70],[661.648,0.14,39,42],[662.865,0.055,38,75],[662.925,0.16,27,70],[662.925,0.14,39,42],[664.141,0.055,38,75],[664.201,0.16,27,70],[664.201,0.14,39,42],[665.418,0.055,38,75],[665.478,0.16,27,70],[665.478,0.14,39,42],[666.694,0.055,38,75],[666.754,0.16,27,70],[666.754,0.14,39,42],[667.971,0.055,38,75],[668.031,0.16,27,70],[668.031,0.14,39,42],[669.247,0.055,38,75],[669.308,0.16,27,70],[669.308,0.14,39,42],[670.524,0.055,38,75],[670.584,0.16,27,70],[670.584,0.14,39,42],[671.828,0.055,38,75],[671.888,0.16,27,70],[671.888,0.14,39,42],[673.133,0.055,38,75],[673.193,0.16,27,70],[673.193,0.14,39,42],[674.437,0.055,38,75],[674.497,0.16,27,70],[674.497,0.14,39,42],[675.741,0.055,38,75],[675.802,0.16,27,70],[675.802,0.14,39,42],[677.046,0.055,38,75],[677.106,0.16,27,70],[677.106,0.14,39,42],[678.35,0.055,38,75],[678.41,0.16,27,70],[678.41,0.14,39,42],[679.654,0.055,38,75],[679.715,0.16,27,70],[679.715,0.14,39,42],[680.959,0.055,38,75],[681.019,0.16,27,70],[681.019,0.14,39,42],[682.263,0.055,38,75],[682.323,0.16,27,70],[682.323,0.14,39,42],[683.568,0.055,38,75],[683.628,0.16,27,70],[683.628,0.14,39,42],[684.872,0.055,38,75],[684.932,0.16,27,70],[684.932,0.14,39,42],[686.176,0.055,38,75],[686.236,0.16,27,70],[686.236,0.14,39,42],[687.481,0.055,38,75],[687.541,0.16,27,70],[687.541,0.14,39,42],[688.785,0.055,38,75],[688.845,0.16,27,70],[688.845,0.14,39,42],[690.089,0.055,38,75],[690.149,0.16,27,70],[690.149,0.14,39,42],[691.394,0.055,38,75],[691.454,0.16,27,70],[691.454,0.14,39,42],[692.757,0.055,38,75],[692.817,0.16,27,70],[692.817,0.14,39,42],[694.121,0.055,38,75],[694.181,0.16,27,70],[694.181,0.14,39,42],[695.485,0.055,38,75],[695.545,0.16,27,70],[695.545,0.14,39,42],[696.848,0.055,38,75],[696.908,0.16,27,70],[696.908,0.14,39,42],[698.212,0.055,38,75],[698.272,0.16,27,70],[698.272,0.14,39,42],[699.576,0.055,38,75],[699.635,0.16,27,70],[699.635,0.14,39,42],[700.939,0.055,38,75],[700.999,0.16,27,70],[700.999,0.14,39,42],[702.303,0.055,38,75],[702.363,0.16,27,70],[702.363,0.14,39,42],[703.666,0.055,38,75],[703.726,0.16,27,70],[703.726,0.14,39,42],[705.03,0.055,38,75],[705.09,0.16,27,70],[705.09,0.14,39,42],[706.394,0.055,38,75],[706.454,0.16,27,70],[706.454,0.14,39,42],[707.757,0.055,38,75],[707.817,0.16,27,70],[707.817,0.14,39,42],[709.121,0.055,38,75],[709.181,0.16,27,70],[709.181,0.14,39,42],[710.485,0.055,38,75],[710.545,0.16,27,70],[710.545,0.14,39,42],[711.848,0.055,38,75],[711.908,0.16,27,70],[711.908,0.14,39,42],[713.212,0.055,38,65],[713.272,0.16,27,61],[713.272,0.14,39,37],[715.212,0.055,38,65],[715.272,0.16,27,61],[715.272,0.14,39,37],[717.212,0.055,38,65],[717.272,0.16,27,61],[717.272,0.14,39,37],[719.212,0.055,38,65],[719.272,0.16,27,61],[719.272,0.14,39,37],[721.212,0.055,38,65],[721.272,0.16,27,61],[721.272,0.14,39,37],[723.212,0.055,38,65],[723.272,0.16,27,61],[723.272,0.14,39,37],[725.212,0.055,38,65],[725.272,0.16,27,61],[725.272,0.14,39,37],[727.212,0.055,38,65],[727.272,0.16,27,61],[727.272,0.14,39,37],[729.212,0.055,38,65],[729.272,0.16,27,61],[729.272,0.14,39,37],[731.212,0.055,38,65],[731.272,0.16,27,61],[731.272,0.14,39,37],[733.212,0.055,38,65],[733.272,0.16,27,61],[733.272,0.14,39,37],[735.212,0.055,38,65],[735.272,0.16,27,61],[735.272,0.14,39,37],[737.212,0.055,38,65],[737.272,0.16,27,61],[737.272,0.14,39,37],[739.212,0.055,38,65],[739.272,0.16,27,61],[739.272,0.14,39,37],[741.212,0.055,38,65],[741.272,0.16,27,61],[741.272,0.14,39,37],[743.212,0.055,38,65],[743.272,0.16,27,61],[743.272,0.14,39,37],[745.212,0.055,38,65],[745.272,0.16,27,61],[745.272,0.14,39,37],[747.212,0.055,38,65],[747.272,0.16,27,61],[747.272,0.14,39,37],[749.212,0.055,38,65],[749.272,0.16,27,61],[749.272,0.14,39,37],[751.212,0.055,38,65],[751.272,0.16,27,61],[751.272,0.14,39,37],[753.212,0.055,38,65],[753.272,0.16,27,61],[753.272,0.14,39,37],[755.212,0.055,38,65],[755.272,0.16,27,61],[755.272,0.14,39,37],[757.212,0.055,38,65],[757.272,0.16,27,61],[757.272,0.14,39,37],[759.212,0.055,38,65],[759.272,0.16,27,61],[759.272,0.14,39,37],[761.212,0.055,38,65],[761.272,0.16,27,61],[761.272,0.14,39,37],[763.212,0.055,38,65],[763.272,0.16,27,61],[763.272,0.14,39,37],[765.212,0.055,38,65],[765.272,0.16,27,61],[765.272,0.14,39,37],[767.212,0.055,38,65],[767.272,0.16,27,61],[767.272,0.14,39,37],[769.212,0.055,38,65],[769.272,0.16,27,61],[769.272,0.14,39,37],[771.212,0.055,38,65],[771.272,0.16,27,61],[771.272,0.14,39,37]]],"overview":[[2,2,2,2,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,4,4,4,4,4,4,3,3,3,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,2,2,2,3,3,2,4,4,4,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0],[1,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,3,3,3,4,3,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,3,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,2],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,2,3,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,0,0,0,0,0,0],[2,2,2,2,1,1,1,0,0,0,0,0,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,2,2,2,0,2,2,1,2,3,3,3,2,2,1,0,1,1,2,2,2,2,2,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,2,2,2,2,1,1,1,1,1,1,1,3,3,2,3,3,0,0,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,3,3,3,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],"maxDur":[6.333,6.333,6.333,6.333,6.333,10,4.068]}; +// Whole-piece density above, routed note onsets in a moving 20-second window below. +let notepatTvClock=null; +function smoothNotepatTvTime(music,target){ + const now=Date.now()/1000,run=music.runId||'notepat'; + if(!notepatTvClock||notepatTvClock.run!==run||Math.abs(target-notepatTvClock.time)>5){ + notepatTvClock={run,time:target,wall:now};return target; + } + const dt=Math.max(0,Math.min(.1,now-notepatTvClock.wall));notepatTvClock.wall=now; + const error=target-notepatTvClock.time; + // Rate corrections absorb packet jitter without moving the playhead backwards. + notepatTvClock.time+=dt*(1+clamp(error*.7,-.12,.12)); + return Math.min(music.duration||774.4119,notepatTvClock.time); +} +function fitNotepatSectionLabel(label, size, maxWidth) { + const text=String(label).replace(/^the /i,''); + if(handleWidth(text,size)<=maxWidth)return text; + let short=text; + while(short.length && handleWidth(short+'..',size)>maxWidth)short=short.slice(0,-1); + return short.length>=2 ? short+'..' : ''; +} +function notepatScoreLayout(w,h) { + const left=w*.16,right=w*.97,width=right-left; + const sectionY=Math.max(48,h*.075-30),sectionHeight=26; + const top=sectionY+sectionHeight+6; + const overviewRow=Math.max(22,h*.026),overviewHeight=overviewRow*7; + const detailTop=Math.max(h*.35,top+overviewHeight+58); + // Keep the last instrument row and its note glow above the shared title footer. + const detailBottom=h-150; + return {left,right,width,sectionY,sectionHeight,top,overviewRow,overviewHeight, + detailTop,rowHeight:Math.max(24,(detailBottom-detailTop)/7)}; +} +function drawNotepatScore(music, elapsed) { + elapsed=smoothNotepatTvTime(music,elapsed); + const score=NOTEPAT_TV_SCORE; + if(music.scoreHash && music.scoreHash!==score.hash)return; + const w=viewWidth(),h=viewHeight; + const {left,right,width,sectionY,sectionHeight,top,overviewRow,overviewHeight, + detailTop,rowHeight}=notepatScoreLayout(w,h); + const names=['Left front','Right front','Right rear','Left rear','Center rear','Held center','Sub']; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[248,151,91],[232,227,166]]; + triangleDepth=-.8; + const palette=music.look?.color||[100,150,220]; + wipe(Math.round(palette[0]*.035),Math.round(palette[1]*.035),Math.round(palette[2]*.055)); + const labelSize=Math.max(17,Math.min(26,w*.015)); + // All section boundaries stay visible for the entire piece. + for(let i=0;i=a&&elapsedMath.round(v*gain))); + } + } + const overviewX=left+clamp(elapsed/score.duration,0,1)*width; + screenRect(overviewX-6,top-5,12,overviewHeight+7,[67,71,72]); + screenRect(overviewX-1,top-5,3,overviewHeight+7,[255,255,242]); + // A fixed NOW line; score notes approach it from the right. + const from=elapsed-4,span=20,nowX=left+width*.2; + for(let dt=0;dt<=16;dt+=4){const x=nowX+dt/span*width; + screenRect(x,detailTop-10,1,rowHeight*7+10,[34,45,61]); + const label=dt?'+'+dt+'s':'NOW',labelWidth=handleWidth(label,22); + typeWrite(label,clamp(x+5,left,right-labelWidth-4),detailTop-35,22,210,221,235); + } + for(let row=0;row<7;row++){ + const y=detailTop+row*rowHeight,events=score.rows[row]; + typeWrite(names[row],w*.016,y+rowHeight*.28,labelSize,...colors[row]); + screenRect(left,y+rowHeight-3,width,1,[37,49,65]); + screenRect(nowX-22,y+2,44,rowHeight-5,colors[row].map(v=>Math.round(v*.065))); + let lo=0,hi=events.length; + while(lo>1;if(events[m][0]elapsed; + const gain=endMath.round(v*.15))); + screenRect(x-1,py-2,noteWidth+2,14,colors[row].map(v=>Math.round(v*.32))); + } + screenRect(x,py,noteWidth,sounding?10:6,colors[row].map(v=>Math.round(v*gain))); + if(sounding)screenRect(nowX-2,py-2,4,14+attack*6,[255,248,224]); + } + } + screenRect(nowX-2,detailTop-8,4,rowHeight*7+6,[255,255,242]); +} + +// NOTEPAT_SCORE_VISUAL_V1_END diff --git a/xbox/live/oskiewar.js.before-notepat-20260924150645 b/xbox/live/oskiewar.js.before-notepat-20260924150645 new file mode 100644 index 0000000000..eedd5e70b0 --- /dev/null +++ b/xbox/live/oskiewar.js.before-notepat-20260924150645 @@ -0,0 +1,16978 @@ +// @bundle-qr +// The console's monotonic clock can hand back a negative number: App.cpp +// converts QPC ticks with `counter * 1000000`, which overflows int64 past +// about ten days of uptime. Every deadline in this piece starts at 0 and is +// compared with `now >=` or `now <`, so a negative clock made `hitStunUntil` +// permanently in the future -- no attack could fire and no round could be +// won -- stranded the title, silenced the input log, and indexed off the +// front of a palette. Rebase once, here, so time starts at zero whatever the +// host reports. The host builds a fresh object per call, so this rewrites +// that copy rather than allocating another. +const hostRuntime = runtime; +let clockEpoch = null; +// Rollback netplay's hooks into the clock and the side effects. The session +// itself lives further down (search "Rollback netplay"); these four sit here +// because the wrapper below and the signal emitters read them. +let netSession = null; +// Windows and Linux libm differ by a few ULPs. Network simulation uses the +// same elementary operations on both hosts, including geometry sampled for +// collision. Keep native math for ordinary local play. +const platformMath = globalThis.Math; +let Math = Object.create(platformMath); +function netSin(x) { + x %= 6.283185307179586; + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +function netAtan(x) { + const sign = x < 0 ? -1 : 1; + x = platformMath.abs(x); + const inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + platformMath.sqrt(1 + x * x)); + const square = x * x; + let term = x, sum = x; + for (let n = 1; n <= 20; n++) { + term *= -square; + sum += term / (2 * n + 1); + } + const angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +function netAtan2(y, x) { + if (x > 0) return netAtan(y / x); + if (x < 0) return netAtan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +function netExp(x) { + if (x > 709.782712893384) return Infinity; + if (x < -745.1332191019411) return 0; + const exponent = platformMath.round(x / .6931471805599453); + const remainder = x - exponent * .6931471805599453; + let sum = 1, term = 1; + for (let n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * 2 ** exponent; +} +function netHypot(...values) { + let scale = 0; + for (const value of values) scale = platformMath.max(scale, platformMath.abs(value)); + if (!scale || !Number.isFinite(scale)) return scale; + let sum = 0; + for (const value of values) { const ratio = value / scale; sum += ratio * ratio; } + return platformMath.sqrt(sum) * scale; +} +// The interpreter's deterministic transcendental series are expensive on +// Xbox. Poses repeatedly ask for the same angles; retain exact results in a +// bounded cache, including a distinct key for negative zero. Native AC math +// bypasses these fallbacks entirely. No rounding or approximation is added. +const netMathMemoStats = { hits: 0, misses: 0 }; +function memoizeNetUnary(calculate) { + const cache = new Map(); + return value => { + if (typeof value !== "number") return calculate(value); + const key = Object.is(value, -0) ? "negative-zero" : value; + const cached = cache.get(key); + if (cached !== undefined) { netMathMemoStats.hits++; return cached; } + netMathMemoStats.misses++; + const result = calculate(value); + if (cache.size >= 1024) cache.clear(); + cache.set(key, result); + return result; + }; +} +netSin = memoizeNetUnary(netSin); +netAtan = memoizeNetUnary(netAtan); +netExp = memoizeNetUnary(netExp); +const netMath = {sin: netSin, cos: x => netSin(x + 1.5707963267948966), + tan: x => netSin(x) / netSin(x + 1.5707963267948966), atan: netAtan, + atan2: netAtan2, asin: x => netAtan2(x, platformMath.sqrt(1 - x * x)), + exp: netExp, hypot: netHypot}; +for (const [name, fallback] of Object.entries(netMath)) { + const native = globalThis.__oskiewarNativeMath; + const calculate = native?.version === "oskiewar-libm-v1" && typeof native[name] === "function" + ? native[name] : fallback; + Math[name] = (...args) => netSession ? calculate(...args) : platformMath[name](...args); +} + +// While non-null, runtime() reports this clock: the sim is stepping frame f +// and must read f's time whatever the wall says. +let netClockUs = null; +// While true the sim is replaying frames it already showed once — no drums, +// no signals, no telemetry, no publishing. The state changes; nothing else. +let netSilent = false; +let netFrameInputs = null; +// Game speed is the clock, not a patch on top of it. Every deadline, spring, +// bot die-roll and animation in this piece reads one monotonic stream, so +// scaling the stream's increments scales the whole game coherently — physics, +// input windows, round timers, all in step. Set from the title screen with +// +/- on a keyboard, in quarter steps between a quarter and double speed; +// the offline reel harness drives simMonotonicUs itself and never touches +// this, so recordings always run at one. +let gameSpeed = 1; +let roundModifier = ""; +let netRoundClockDebtUs = 0; +function airRoundActive() { return roundModifier === "air"; } +function roundSpeed() { return roundModifier === "slow" ? .5 : 1; } +let gameSpeedChangedAt = 0; +let scaledClockUs = 0; +let lastRawClockUs = null; +runtime = function acRuntime() { + const info = hostRuntime(); + const raw = Number(info.monotonicUs) || 0; + if (clockEpoch === null) clockEpoch = raw; + if (lastRawClockUs === null) lastRawClockUs = raw; + scaledClockUs += (raw - lastRawClockUs) * gameSpeed * roundSpeed(); + lastRawClockUs = raw; + info.monotonicUs = Math.round(scaledClockUs); + if (typeof info.simMonotonicUs === "number") + info.simMonotonicUs -= clockEpoch; + // A rollback fight keeps its own clock: frame f reads f's time while it is + // simulated, and the paint between frames reads the current frame's time + // plus how far the display is into it, so animation and HUD stay on the + // fight's timeline rather than the wall's. + if (netClockUs !== null) { + info.monotonicUs = netClockUs - netRoundClockDebtUs; + info.simMonotonicUs = info.monotonicUs; + } else if (netSession) { + const alpha = Math.max(0, Math.min(1, Number(info.renderAlpha) || 0)); + const at = netSession.originUs + netSession.frame * NET_TICK_US + + Math.round(alpha * NET_TICK_US * roundSpeed()) - netRoundClockDebtUs; + info.monotonicUs = at; + info.simMonotonicUs = at; + } + return info; +}; +// Replayed frames are silent: the wall already saw them once. +// +// These two hooks belong to the host, and the hosts disagree about which of +// them exist: the native shell installs `telemetry` and no `analytics` at all. +// Reading an undeclared binding throws, and this runs at the top level of one +// program, so that throw took every `let` below it with it — the shell then +// reported the first of those (`gameMode`) as uninitialized, a good half a +// file away from the actual cause. `typeof` is the one way to ask whether a +// binding exists without touching it, so ask, and only wrap what is there. +const hostTelemetry = typeof telemetry === "function" ? telemetry : null; +if (hostTelemetry) + telemetry = function netTelemetry(...args) { + if (netSilent) return; + return hostTelemetry(...args); + }; +const hostAnalytics = typeof analytics === "function" ? analytics : null; +if (hostAnalytics) + analytics = function netAnalytics(...args) { + if (netSilent) return; + return hostAnalytics(...args); + }; + +// Monotonic count of committed revisions to this piece (next revision included). +const buildVersion = 166; +const floorY = 1800; +// Oskiewar now opens as a versus game. An ordinary web visit hosts a room — +// the URL becomes the invitation — and until a friend opens it, all you can +// do is move: a training floor with your own moves named back at you and one +// standing instruction, find a friend. Survival (the solo ascent) and the +// bot/dummy doors remain modes behind `?opponent=`, and the regression +// harness still enters combat directly. Keeping player two as explicit mode +// state, rather than deleting the chair, preserves replays and the fight +// laboratory while ensuring no route quietly seats an adversary. +let gameMode = "fight"; +const survivalActive = () => gameMode === "survival"; +// The versus lane's two rooms-of-play: alone in the cube waiting on a rival, +// or fighting the rival the relay seated. Both publish to the same room so +// the shared URL is the lobby, the fight and the grandstand at once. +const lobbyActive = () => gameMode === "fight" && fightOpponent === "versus-lobby"; +const versusActive = () => gameMode === "fight" && fightOpponent === "versus"; +const versusLane = () => lobbyActive() || versusActive(); +// The station. The tower became a cube, and the cube has now been opened to +// vacuum: @jeffrey asked for "a large space map", and the cube's own comment +// had already named the condition for growing one — "a tile-authored map is +// exactly the shape a future rung would be written in." So the lattice is +// what grew. Twenty tiles wide by fourteen tall at the same 90 units a side, +// which is four times the cube's floor area and still frames whole on one +// screen at the widest shot, because a fighter you cannot see is a fighter +// you cannot read. +// +// What changed besides the number: the plaster shell is gone. There is no +// back wall, no ceiling slab and no side wall, because the map is outside +// now — stars behind, a planet below the deck, and a hull you stand on +// rather than a room you are sealed into. Gravity is station gravity, a +// little over half a G (`spaceGravityScale`), so a jump hangs and the +// floating decks overhead are reachable on legs alone. Simulation stays +// continuous — nothing about motion quantizes — but the STRUCTURE is +// addressable: spawns, pickups, decks and lanes are authored in tile +// coordinates, the lattice draws as a faint nav hologram, and `gridField` +// below holds one number per tile so per-tile computation (heat, ownership, +// weather) has a surface to run on. +const tileSize = 90; +let gridCols = 40; +const gridRows = 16; +// Tile (0, 0) starts flush at the floor-left corner of the PLAYABLE box, so +// every tile edge lands on a clean multiple of 90. The walls stand outside +// the lattice: the structural shell is one wallThickness beyond each face, +// and `resolveRunnerBounds` pushes off the faces themselves. +const wallThickness = 40; +const gridLeft = 0; +let gridWidth = gridCols * tileSize; +const gridHeight = gridRows * tileSize; +const worldLeft = gridLeft - wallThickness; +let worldRight = gridLeft + gridWidth + wallThickness; +const ceilingY = floorY - gridHeight - wallThickness; +// Depth is the eye's dimension, not the fight's — fighters live near z = 0 — +// so it is authored rather than derived. It was the cube's own width back +// when those were the same number; widening the map to twenty tiles must not +// also push the far plane twice as far out, because every camera stand-off, +// every killcam orbit and the whole ±30000 native coordinate budget were +// tuned against this depth and not against the floor's span. +const roomDepth = 900; +const worldNear = -roomDepth / 2; +const worldFar = roomDepth / 2; +// Address helpers: world position to tile and back. Rows count UP from the +// floor, because in a fight the floor is where everything starts. All three +// clamp, so a body pressed into a wall still names a real tile. +const tileCol = (x) => + Math.min(gridCols - 1, Math.max(0, Math.floor((x - gridLeft) / tileSize))); +const tileRow = (y) => + Math.min(gridRows - 1, Math.max(0, Math.floor((floorY - y) / tileSize))); +const tileCenterX = (col) => gridLeft + (col + .5) * tileSize; +// One number per tile, row-major from the floor-left corner. Today impacts +// write heat into it and the overlay draws that heat fading; tomorrow it is +// wherever tiled computation over the map wants to live. +let gridField = new Float32Array(gridCols * gridRows); +const gridFieldIndex = (x, y) => tileRow(y) * gridCols + tileCol(x); +// Whether a point is on the lattice at all. `tileCol` and `tileRow` CLAMP, +// which is right for a body pressed into a wall — it still stands somewhere — +// and wrong for anything that happens off the map, because every one of those +// lands on the same corner cell. On plaster that was invisible. Against black +// space it was a lit bar across the top corners of the frame: the title +// screen's own bouncing letters, stamping heat outside the box, all of it +// clamped into row thirteen at columns zero and nineteen. +const onGridField = (x, y) => + x >= gridLeft && x <= gridLeft + gridWidth && + y <= floorY && y >= floorY - gridHeight; +// The park. The floor stopped being flat. +// +// Every piece of this was already here and switched off: `terrainFloorAt` has +// carried a heightfield since the tower, `terrainTangentAt` differentiates it, +// and the skate physics have been feeding that slope into `skateVx` all along +// — `player.skateVx += terrainSlope * 1900 * dt` is a line that has done +// nothing for months because the amplitude was zero. What was missing was a +// shape worth riding. +// +// So the profile is authored rather than noised. A run of segments in tile +// coordinates, each one a real skatepark feature, walked left to right: +// +// flat the ground, and the halfpipe's own flat bottom +// transition a quarter-circle, horizontal where it meets the flat and +// vertical at the coping — which is what a transition IS, and +// why it is an arc and not a straight ramp +// bank a straight incline, for launching off rather than carving in +// +// A transition's run equals its height because a quarter circle's does. That +// is not a simplification, it is the geometry: radius R gives you R of run +// and R of rise, tangent flat at the bottom and vertical at the lip. +// `lift` raises the segment's base off the ground, or — negative — digs it in. +// That sign is what makes a halfpipe possible in a game seen from the side: a +// pipe built UP from the floor is two humps with their ridable faces pointing +// away from you, and you would have to climb the back of one to use it. Dug +// IN, the same two arcs face each other, the flat bottom is genuinely a floor, +// and a skater can ride straight through at speed from either end. So the +// halfpipe here is a bowl, which is what a halfpipe is from the side anyway. +// Read it left to right and it is a run: drop off the left quarterpipe, carry +// the speed into the halfpipe, out across the middle, up the kicker and over +// the funbox, and finish on the right quarterpipe. The middle ten tiles are +// deliberately flat and deliberately in the middle — that is where the bell +// rings, and a fight that opens with both fighters sliding down a transition +// is a fight nobody chose the start of. +const parkFeatures = [ + { from: 0, to: 4, kind: "transition", rise: 360, dir: -1 }, + { from: 4, to: 6, kind: "flat" }, + { from: 6, to: 9, kind: "transition", rise: 270, dir: -1, lift: -270 }, + { from: 9, to: 12, kind: "flat", lift: -270 }, + { from: 12, to: 15, kind: "transition", rise: 270, dir: 1, lift: -270 }, + { from: 15, to: 25, kind: "flat" }, + { from: 25, to: 28, kind: "bank", rise: 180, dir: 1 }, + { from: 28, to: 30, kind: "flat", lift: 180 }, + { from: 30, to: 33, kind: "bank", rise: 180, dir: -1 }, + { from: 33, to: 36, kind: "flat" }, + { from: 36, to: 40, kind: "transition", rise: 360, dir: 1 }, +]; +// Resolved once into world units so the per-frame walk compares numbers +// rather than rebuilding them. `terrainFloorAt` runs for every foot, every +// grass blade and every render sample, so it is worth the twenty bytes. +let parkSegments = parkFeatures.map((feature) => ({ + ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, + lift: feature.lift || 0, +})); +const parkLeft = parkSegments[0].left; +let parkRight = parkSegments[parkSegments.length - 1].right; +// The lowest ground in the park. `floorY` used to be it — it +// was the whole world's bottom, and a dozen places lean on that: the camera +// clamps its aim to it, the ground's near skirt hangs from it, the terrain +// span stops at it. A bowl dug three tiles into the floor makes every one of +// those assumptions wrong by exactly the depth of the bowl, and the symptom +// is a fighter riding out of frame at the bottom of the pipe. +let parkDeepest = floorY + Math.max(0, + ...parkSegments.map((segment) => -segment.lift)); +// Enough samples that an arc reads as an arc. One per tile drew the halfpipe +// as a staircase — 90 units is most of a fighter wide, and a transition turns +// through ninety degrees in three of them. +let terrainSamples = gridCols * 6; +let terrainPhase = 0; +// The long park is selected by ?map=skatepark; the host's deal owns the map. +let skateparkMap = globalThis.__oskiewarMap === "skatepark"; +const skateLoops = [ + { x: 6300, radius: 320 }, { x: 15300, radius: 420 }, + { x: 24300, radius: 500 }, +]; +const skateBoosts = [2400, 5400, 10800, 14400, 19800, 23400, 27000] + .map((x) => ({ left: x, right: x + 240, speed: 3900 })); +const skateRopes = []; +const chainLinks = 16; +const chainLength = 44; + +function configureWorldMap(name) { + // A normal round keeps its current workshop/local variant. Only entering + // or leaving the long course needs to replace the world dimensions. + if (name !== "skatepark" && !skateparkMap) return; + skateparkMap = name === "skatepark"; + gridCols = skateparkMap ? 320 : 40; + gridWidth = gridCols * tileSize; + if (gridField.length !== gridCols * gridRows) gridField = new Float32Array(gridCols * gridRows); + worldRight = gridLeft + gridWidth + wallThickness; + const features = skateparkMap ? [ + ...parkFeatures.slice(0, -1), + { from: 36, to: 40, kind: "flat" }, + ...[40, 140, 240].flatMap((from) => [ + { from, to: from + 40, kind: "flat" }, + { from: from + 40, to: from + 46, kind: "bank", rise: 270, dir: 1 }, + { from: from + 46, to: from + 50, kind: "flat", lift: 270 }, + { from: from + 50, to: from + 56, kind: "bank", rise: 270, dir: -1 }, + { from: from + 56, to: Math.min(320, from + 100), kind: "flat" }, + ]), + ] : parkFeatures; + parkSegments = features.map((feature) => ({ ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, lift: feature.lift || 0 })); + parkRight = gridLeft + gridWidth; + terrainSamples = gridCols * 6; +} + +function resetSkateRopes() { + skateRopes.length = 0; + if (!skateparkMap) return; + for (const x of [3600, 9900, 18900]) { + const anchorY = floorY - 850; + skateRopes.push({ x, y: anchorY, z: 0, + nodes: Array.from({ length: chainLinks + 1 }, (_, index) => ({ + x, y: anchorY + index * chainLength, + px: x, py: anchorY + index * chainLength, + })) }); + } +} + +function releaseSkateRope(player) { + const rope = skateRopes[player.ropeIndex]; + const node = rope?.nodes[Math.round(player.ropeLink)]; + if (node) { + player.vx = clamp((node.x - node.px) / (rope.dt || 1 / 60), -4200, 4200); + player.vy = clamp((node.y - node.py) / (rope.dt || 1 / 60), -4200, 4200); + player.skateVx = player.vx; + player.knockVx = player.skateboard ? 0 : player.vx; + } + player.ropeIndex = -1; + player.grounded = false; +} + +// Hold grab through a crossing to latch. A fresh grab edge detaches. +function skateRopeInput(player, input, grabHeld, dt, grabPressed = grabHeld) { + if (!grabHeld) player.ropeGrabLocked = false; + if (player.ropeIndex >= 0 && (!player.alive || isHeadOnly(player) || + isPogo(player) || player.hitStunUntil > runtime().monotonicUs)) { + releaseSkateRope(player); + return false; + } + if (player.ropeIndex >= 0 && grabPressed) { + releaseSkateRope(player); + player.ropeGrabLocked = true; + return false; + } + if (player.ropeIndex < 0 && grabHeld && !player.ropeGrabLocked && player.heldBall < 0 && + player.heldPart < 0 && player.heldPlayer < 0) { + let nearest = null; + // Test the swept hand volume against each link, so a fast crossing counts. + const hand = { x1: player.x, y1: player.y - 125, z1: player.z, + x2: player.x + player.vx * dt, y2: player.y - 125 + player.vy * dt, + z2: player.z, width: 64 }; + skateRopes.forEach((rope, ropeIndex) => { + rope.nodes.slice(1).forEach((node, index) => { + const before = rope.nodes[index]; + const box = { left: Math.min(node.x, before.x) - 6, + right: Math.max(node.x, before.x) + 6, + top: Math.min(node.y, before.y) - 6, bottom: Math.max(node.y, before.y) + 6, + near: rope.z - 8, far: rope.z + 8 }; + const hit = segmentBoxEntry(hand, box, hand.width / 2); + const distance = Math.hypot(node.x - hand.x1, node.y - hand.y1); + if (hit !== null && (!nearest || distance < nearest.distance)) + nearest = { ropeIndex, link: index + 1, distance }; + }); + }); + if (nearest) { + player.ropeIndex = nearest.ropeIndex; + player.ropeLink = nearest.link; + const node = skateRopes[player.ropeIndex].nodes[nearest.link]; + node.px = node.x - clamp(player.vx, -3000, 3000) / 60; + node.py = node.y - clamp(player.vy, -3000, 3000) / 60; + player.skateLoop = -1; + player.lastButton = "ROPE"; + emitSignal("rope-grab", player.pad, nearest.ropeIndex, nearest.link); + } + } + if (!(player.ropeIndex >= 0)) return false; + player.ropeLink = clamp(player.ropeLink - input.vertical * dt * 3, + 2, chainLinks); + const rope = skateRopes[player.ropeIndex]; + const node = rope.nodes[Math.round(player.ropeLink)]; + node.px -= input.horizontal * 2100 * dt * dt; + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grounded = false; + player.attackKind = ""; + player.attackUntil = 0; + player.blocking = false; + player.stance = "ROPE"; + return true; +} + +// Verlet chain with a fixed anchor and distance constraints, stepped once per +// simulation tick. Nodes, previous positions and attachments all roll back. +function updateSkateRopes(dt) { + if (!skateparkMap || survivalActive()) return; + for (const rope of skateRopes) { + const timeScale = dt / (rope.dt || dt); + rope.dt = dt; + for (let i = 1; i < rope.nodes.length; i++) { + const node = rope.nodes[i]; + const vx = (node.x - node.px) * .997 * timeScale; + const vy = (node.y - node.py) * .997 * timeScale; + node.px = node.x; node.py = node.y; + node.x += vx; node.y += vy + fallGravity() * dt * dt; + } + const riders = players.filter((player) => player.alive && + skateRopes[player.ropeIndex] === rope); + const inverseMass = (index) => index === 0 ? 0 : + riders.some((rider) => Math.abs(rider.ropeLink - index) < 1) ? .125 : 1; + for (let pass = 0; pass < 32; pass++) { + rope.nodes[0].x = rope.x; rope.nodes[0].y = rope.y; + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + const dx = b.x - a.x, dy = b.y - a.y; + const length = Math.hypot(dx, dy) || 1; + const error = (length - chainLength) / length; + const wa = inverseMass(i - 1), wb = inverseMass(i); + const sum = wa + wb; + b.x -= dx * error * wb / sum; b.y -= dy * error * wb / sum; + a.x += dx * error * wa / sum; a.y += dy * error * wa / sum; + } + } + } + for (const player of players) { + if (!(player.ropeIndex >= 0)) continue; + if (!player.alive) { releaseSkateRope(player); continue; } + const rope = skateRopes[player.ropeIndex]; + const link = Math.floor(player.ropeLink), blend = player.ropeLink - link; + const a = rope.nodes[link], b = rope.nodes[Math.min(link + 1, chainLinks)]; + const x = lerp(a.x, b.x, blend), y = lerp(a.y, b.y, blend) + 125; + player.vx = (x - player.x) / Math.max(dt, .001); + player.vy = (y - player.y) / Math.max(dt, .001); + player.x = x; player.y = y; player.z = rope.z; + player.grounded = false; + } +} + +function skateLoopStep(player, input, dt, now) { + if (!(player.skateLoop >= 0)) { + if (!player.skateboard || !player.grounded || Math.abs(player.skateVx) < 1300) + return false; + const nextX = player.x + player.skateVx * dt; + const index = skateLoops.findIndex((loop) => + Math.min(player.x, nextX) <= loop.x && Math.max(player.x, nextX) >= loop.x && + Math.abs(player.y - floorY) < 30 && Math.abs(player.z) < 90 && + now >= (player.loopCooldownUntil || 0)); + if (index < 0) return false; + player.skateLoop = index; + player.loopAngle = 0; + player.loopSpeed = player.skateVx; + } + const loop = skateLoops[player.skateLoop]; + const angle = player.loopAngle; + player.loopSpeed += (-fallGravity() * Math.sin(angle) + input.horizontal * 500) * dt; + player.loopAngle += player.loopSpeed / loop.radius * dt; + const theta = player.loopAngle; + player.x = loop.x + Math.sin(theta) * loop.radius; + player.y = floorY - loop.radius + Math.cos(theta) * loop.radius; + player.vx = Math.cos(theta) * player.loopSpeed; + player.vy = -Math.sin(theta) * player.loopSpeed; + player.grounded = false; + player.skateRotation = -theta; + const completed = Math.abs(theta) >= Math.PI * 2; + const lostGrip = Math.cos(theta) < 0 && player.loopSpeed ** 2 / loop.radius < + -fallGravity() * Math.cos(theta); + if (completed || lostGrip || !player.skateboard) { + if (completed) { player.x = loop.x + Math.sign(player.loopSpeed) * 12; + player.y = floorY; player.vy = 0; player.grounded = true; } + player.skateVx = player.vx; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = now + 600000; + } + return true; +} + +function skateBoostStep(player, previousX, now) { + if (!skateparkMap || !player.skateboard || !player.grounded || + Math.abs(player.y - terrainFloorAt(player.x)) > 12 || + Math.abs(player.z) > 100 || now < (player.boostUntil || 0)) return; + const pad = skateBoosts.find((pad) => Math.max(previousX, player.x) >= pad.left && + Math.min(previousX, player.x) <= pad.right); + if (!pad) return; + player.skateVx = (Math.sign(player.skateVx) || player.facing) * pad.speed; + player.vx = player.skateVx; + player.boostUntil = now + 350000; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + emitSignal("skate-boost", player.pad, player.facing, pad.speed); + playDrum("whoosh", 1, panPlayer(player)); +} + +function drawSkateParkFeatures() { + if (!skateparkMap || survivalActive()) return; + const visible = (x, radius = 0) => Math.abs(x - cameraCenter) < cameraWidth + radius; + for (const loop of skateLoops) { + if (!visible(loop.x, loop.radius)) continue; + for (let i = 0; i < 96; i++) { + const a = i / 96 * Math.PI * 2, b = (i + 1) / 96 * Math.PI * 2; + for (const z of [-90, 90]) worldCapsule( + loop.x + Math.sin(a) * loop.radius, floorY - loop.radius + Math.cos(a) * loop.radius, z, + loop.x + Math.sin(b) * loop.radius, floorY - loop.radius + Math.cos(b) * loop.radius, z, + 10, [92, 212, 240]); + } + } + for (const pad of skateBoosts) { + if (!visible(pad.left, 240)) continue; + for (let x = pad.left; x < pad.right; x += 40) { + const y = terrainFloorAt(x) - 8; + worldCapsule(x, y, -70, x + 22, y, 0, 9, [255, 212, 66]); + worldCapsule(x + 22, y, 0, x, y, 70, 9, [255, 212, 66]); + } + } + for (const rope of skateRopes) { + if (!visible(rope.x, chainLinks * chainLength)) continue; + worldCapsule(rope.x - 70, rope.y, rope.z, rope.x + 70, rope.y, rope.z, + 18, [108, 130, 150]); + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + worldCapsule(a.x, a.y, rope.z, b.x, b.y, rope.z, 8, + i % 2 ? [220, 225, 236] : [120, 150, 178]); + } + } +} + +function terrainSeed(value) { + let hash = 2166136261; + for (const character of String(value || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967296 * Math.PI * 2; +} +function terrainFloorAt(x) { + if (airRoundActive()) return floorY + 1e9; + // Outside the park the ground is flat, so the walls have something square + // to stand out of and a body pushed past the lip still has a floor. + if (x <= parkLeft) return floorY - parkSegments[0].lift - (parkSegments[0].rise || 0); + if (x >= parkRight) return floorY - + (parkSegments[parkSegments.length - 1].rise || 0) - + parkSegments[parkSegments.length - 1].lift; + for (const segment of parkSegments) { + if (x < segment.left || x > segment.right) continue; + if (segment.kind === "flat") return floorY - segment.lift; + const run = segment.right - segment.left; + // How far up the feature we are, measured from ITS bottom: `dir` says + // which end that is. A transition rising to the right has its flat end on + // the left, and the same arc mirrored has it on the right. + const along = segment.dir > 0 + ? (x - segment.left) / run : (segment.right - x) / run; + if (segment.kind === "bank") + return floorY - segment.lift - segment.rise * along; + // The quarter circle. Centre sits one radius below the flat end, so the + // surface leaves the ground horizontally and arrives at the coping + // vertical — which is the difference between a transition you can pump + // and a ramp you merely climb. + const radius = segment.rise; + const dx = along * radius; + return floorY - segment.lift - + (radius - Math.sqrt(Math.max(0, radius * radius - dx * dx))); + } + return floorY; +} +function terrainTangentAt(x, span = 12) { + const left = terrainFloorAt(clamp(x - span, worldLeft, worldRight)); + const right = terrainFloorAt(clamp(x + span, worldLeft, worldRight)); + return (right - left) / Math.max(1, Math.min(worldRight, x + span) - + Math.max(worldLeft, x - span)); +} +const stageLeft = 0; +let stageRight = 1920; +let stageTop = 112; +// Leave a narrow projection gutter beneath the floor for the screen-edge HUD. +let stageBottom = 930; +let viewHeight = 1080; +let cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); +// `PLATFORM` is the TOWER's single centre platform, and it stays off. It is +// not a general "are there ledges" switch, however much it reads like one: +// the tower hung one slab over a floor, `platformY` still names that slab, +// and a dormant family of tower-era regressions is gated on this constant +// being true. The station's decks are a different object with a different +// shape, so they get their own table below rather than borrowing this flag +// and waking tests that ask whether a tapped hop clears a platform that no +// longer exists. The wind flag rides its own switch and is still off. +const PLATFORM = false; +const WIND_FLAG = false; +const survivalLevelCount = 32; +const survivalStepY = 235; +const survivalCeilingY = floorY - (survivalLevelCount + 2) * survivalStepY; +// A deterministic, hand-tuned zig-zag. Adjacent decks always overlap a +// normal jump's horizontal budget and sit below its 322-unit apex; variation +// comes from where the safe landing moves, not from impossible dice rolls. +// +// These numbers were authored against the cube's 900-unit floor and the +// climb still wants exactly that column of air — so when the station doubled +// the floor's width the ladder was RECENTRED, not respaced. The rung spacing +// is the tuned part; where the column stands is not. `survivalFrameWidth` is +// the cube's old framing kept by the same argument: a lens wide enough for a +// twenty-tile station would shrink the climb to a thread up the middle. +const survivalCenterShift = gridWidth / 2 - 450; +const survivalFrameWidth = 1020; +const survivalCenters = [450, 280, 620, 390, 680, 250, 520, 710]; +const survivalWidths = [470, 390, 420, 360, 440, 380, 410, 370]; +const platforms = Array.from({ length: survivalLevelCount }, (_, index) => { + const center = survivalCenters[index % survivalCenters.length] + + survivalCenterShift; + const width = survivalWidths[index % survivalWidths.length]; + return { level: index + 1, left: center - width / 2, + right: center + width / 2, y: floorY - (index + 1) * survivalStepY }; +}); +// The station's decks. This is the sentence the cube's own comment promised — +// "a tile-authored map is exactly the shape a future rung would be written +// in" — being cashed. The cube had no room for a deck a fighter could stand +// under; twenty by fourteen tiles under station gravity has room for five. +// +// Said in tiles because the map is a lattice: which column a deck starts at, +// which row its surface sits on, how many tiles wide it runs. Two low decks +// out at the flanks, two mid decks pinched toward the middle, one high deck +// straddling the centre line — so the shape of the map is a funnel upward, +// and the fighter who takes the top deck has taken the one place both mid +// decks feed into. +// +// The rows are chosen against one number: 586, the apex station gravity buys +// a held jump. Every step between ADJACENT decks is under it — floor to a low +// deck is 270, low to mid is 360, mid to top is 270 — and every step that +// skips a tier is over it. Floor to a mid deck is 630, and that 630 is the +// whole design: it is what stops the stack from being a straight hop up the +// middle and makes the climb a route instead. Out to a flank, up, back in +// along the mid deck, up again. +// +// This is what the first layout got wrong. Mid decks at row 6 put them 540 +// off the floor — under the apex, so a player could take one straight up and +// `jumpReach` would offer it to a bot, and the flanks stopped meaning +// anything. A deck you can only reach with a perfect double-tap is a deck the +// bots stand under and stare at; a deck you reach by going somewhere first is +// a route; and a deck you can reach from anywhere is not a deck, it is a step. +// Decks over the park, not instead of it. The rows are still priced against +// the 586-unit apex — the flat reaches row 3, row 3 reaches row 7, and the +// floor does NOT reach row 7 at 630 — so the climb keeps its route. What +// changed is that the park is now the interesting way to travel and the decks +// are the high ground above it. The bridge over the halfpipe is reachable +// from the flat beside the bowl and not from the bottom of it, which is the +// point of a bowl. +const parkDeckPlan = [ + { col: 8, row: 5, cols: 5 }, + { col: 15, row: 3, cols: 4 }, + { col: 21, row: 3, cols: 4 }, + { col: 18, row: 7, cols: 4 }, + { col: 31, row: 5, cols: 4 }, +]; +const parkDecks = parkDeckPlan.map((deck, index) => ({ + level: index + 1, + left: gridLeft + deck.col * tileSize, + right: gridLeft + (deck.col + deck.cols) * tileSize, + y: floorY - deck.row * tileSize, +})); +// Two ladders, one machinery. The climb's thirty-two rungs and the station's +// five decks are the same shape and are read by the same four routines, but +// they must never be visible at the same time — a survival runner standing +// on a station deck would be standing on furniture from another map. So the +// mode picks the table, once, and everything downstream asks here. +const activeLedges = () => survivalActive() ? platforms : parkDecks; +// The station's landmarks, by column. On a ten-wide cube a bare `3` was +// readable as "left of centre"; on twenty it is just a digit, and there were +// a dozen of them scattered through spawn, pickup and re-serve code all +// meaning something. Name them once. +// +// The spawns stayed close. It is tempting to open a map four times the size +// by standing the fighters four times as far apart, and it is wrong twice +// over: the opening exchange is the tuned part of this game, and the intro +// camera and the reel's opening lens are both built to travel between two +// faces 270 units apart — spreading the spawns whipped the intro at 207px a +// frame and opened the reel's close lens before the first blow. So the bell +// is unchanged from the cube: two fighters three tiles apart, astride the +// centre line. The map's size is where you GO, not where you start, and the +// corners, the decks and the climb are what spend it. +const spawnColLeft = 18; +const spawnColRight = 21; +// Not corners any more: the ends of this map are quarterpipe transitions, and +// a pistol resting on a vertical wall is a pistol nobody can pick up. These +// are the two flat aprons either side of the park instead — still a run away +// from the bell, still costing you your back to reach. +const cornerColLeft = 5; +const cornerColRight = 34; +const centerX = gridLeft + gridWidth / 2; +const platformsEnabled = () => survivalActive() || parkDecks.length > 0; +// Version-one furniture — the wind flag's pole, the store's demos, the tests — +// still asks for "the platform" by name. In a one-room cube the floor is the +// only platform, so the name now means the whole playable span of it. +const platformLeft = gridLeft; +const platformRight = gridLeft + gridWidth; +const platformY = floorY; +// The surface a thing at (x, y) is standing over: the nearest rung at or below +// it, and the floor when there is no rung. Shadows, pickups and the bot all +// ask this, so a rung that moves takes its furniture with it. +function surfaceYAt(x, y) { + let surface = terrainFloorAt(x); + if (platformsEnabled()) for (const ledge of activeLedges()) + if (ledge.y < surface && ledge.y >= y - 1 && + x >= ledge.left && x <= ledge.right) surface = ledge.y; + return surface; +} +// Which rung a falling thing just crossed, or null. `rise` lifts the contact +// line off the rung by an object's radius and `inset` keeps its edges on the +// span, so one answer serves fighters, grenades and the ball alike — and a +// lattice change lands in all three at once. The highest crossed rung wins, +// because that is the one a fall meets first. +function ledgeCrossed(x, previousY, y, rise = 0, inset = 0) { + if (!platformsEnabled()) return null; + let hit = null; + for (const ledge of activeLedges()) { + const top = ledge.y - rise; + if (previousY > top || y < top) continue; + if (x < ledge.left + inset || x > ledge.right - inset) continue; + if (!hit || ledge.y < hit.y) hit = ledge; + } + return hit; +} +// Resting on a rung rather than falling through one: the ball asks this to +// know whether it is supported and whether it may be booted. +function ledgeSupports(x, y, radius = 0) { + if (!platformsEnabled()) return false; + for (const ledge of activeLedges()) + if (x >= ledge.left + radius && x <= ledge.right - radius && + Math.abs(y - (ledge.y - radius)) <= 2) return true; + return false; +} +const doubleTapUs = 280000; +const doubleTapReleaseUs = 40000; +const roundDurationUs = 30000000; +const roundResultUs = 3000000; +const matchResultUs = 5000000; +const introDurationUs = 3000000; +// A reel gets one branded beat, then motion. Three portrait seconds cost the +// swipe decision before either fighter could move; the live game keeps that +// introduction, while the unattended 9:16 lane reaches the fight inside the +// first second without changing a combat rule. +const reelIntroDurationUs = 650000; +const survivalIntroDurationUs = 900000; +// Keep the close face-off lens through the first exchange. The seeded bots +// meet at about .81s; releasing at the bell made that hit happen as two tiny +// figures at the foot of an empty portrait wall. +const reelOpeningHoldUs = 1350000; +function roundIntroDurationUs() { + if (survivalActive()) return survivalIntroDurationUs; + return reelGroundCamera() ? reelIntroDurationUs : introDurationUs; +} +const dummyGuideDurationUs = 150000000; +const matchWins = 5; +const errorRestartUs = 16000000; +const errorDumpBase = "https://oskiewar.com/api/oskiewar-dump?d="; +const powerupIntervalUs = 10000000; +const shieldRadius = 160; +const shieldForward = 30; +const grenadeBlastDuration = .68; +const grenadeBlastRadius = 620; +// Ground pound. Double-tapping DOWN in the air used to be a plain fast drop +// that did nothing on arrival; now it commits you. Holding DOWN through the +// fall buys speed, the crater scales with how far you actually fell, and the +// landing balls you — so the move is a trade, never a free hit. +const poundLaunchVelocity = 1500; +const poundHoldAcceleration = 5600; +const poundMaxVelocity = 4600; +// Roughly a jump-and-a-half of floor-to-ceiling travel. Falling further than +// this cannot buy a bigger crater, so the ceiling is not a weapon. +const poundFullFall = 900; +// A first-stage landing is deliberately body-sized: the visible ring is the +// attack, not a warning decal for a much larger invisible hit. Repeated DOWN +// taps still grow it, but never into a room-clearing shortcut. +const poundMinRadius = 165; +const poundMaxRadius = 420; +const boosterXs = []; +const boosterRadius = 115; +const boosterVelocity = 6500; +const replayTickUs = 16667; +// The store's demos hold one checkpoint a second — cheap enough to keep +// hundreds of matches. A marketing render replays its demo AS the footage, +// and a fight smoothed through one-second keyframes stops feeling like a +// fight, so the reel factory asks for a checkpoint every simulation tick. +// The dense interval sits just under one true sim step (16666.67us) — at +// exactly one tick the < gate loses the rounding race and records every +// OTHER step, which halves a re-simulation's drift meter. +const replayCheckpointUs = () => + globalThis.__oskiewarDenseReplay ? 16000 : 1000000; +const liveSnapshotIntervalUs = 50000; +const fighterAnimationSpecs = { + // WALK ran a whole stride in 12 ticks — five cycles a second, which the eye + // reads as a vibrating fighter rather than as legs taking steps. Three ticks + // a frame puts the cycle at 600ms, close to a real walk, so the steps count. + IDLE: [72, 3, "BREATHE", true], WALK: [12, 3, "STRIDE", true], + RUN: [10, 1, "RUN", true], MEDITATE: [24, 2, "STILL", true], + DASH: [8, 1, "BURST", true], CROUCH: [8, 1, "TUCK", true], + "AIR CROUCH": [8, 1, "TUCK", true], JUMP: [12, 1, "ASCEND", true], + FALL: [12, 1, "DESCEND", true], PUNCH: [14, 1, "ATTACK", false], + KICK: [14, 1, "ATTACK", false], SHIELD: [12, 2, "GUARD", true], + REACH: [10, 1, "REACH", false], HOLD: [16, 2, "CLUTCH", true], + FIRE: [11, 1, "FIRE", false], THROW: [16, 1, "THROW", false], + WHIP: [11, 1, "ATTACK", false], BASH: [17, 1, "ATTACK", false], + HIT: [10, 1, "STUN", false], POGO: [12, 1, "BOUNCE", true], + "CROUCH HOP": [8, 1, "HOP", true], SINK: [10, 1, "SINK", true], + KO: [16, 2, "BREAK", false], +}; +// Every melee kind in one table: how far the limb reaches at rest and at full +// extension, how long each of its two bones is (the real reach ceiling), how +// high it lands, how wide it reads against the ball, how long the hitbox +// lives, and what it does on contact. A loaded hand cannot make a clean fist, +// so an item swing is its own kind rather than a punch modifier — a pistol +// lengthens the arm into a fast light lash, a grenade shortens it into a club. +// A blade in the item hand stretches every hand strike. Kicks are legs. +const meleeSpecFor = (player, kind) => { + const spec = meleeSpecs[kind] || meleeSpecs.PUNCH; + if (!player?.swordHeld || kind === "KICK") return spec; + return { ...spec, reach: spec.reach * 1.5, span: spec.span * 1.45, + swell: spec.swell * 1.3, force: spec.force * 1.15 }; +}; +const meleeSpecs = { + PUNCH: { reach: 58, swell: 50, span: 58, height: 115, radius: 28, + windowUs: 220000, force: 1200, lift: 140, + cue: ["snare", 1.05], thud: ["block", 1] }, + KICK: { reach: 75, swell: 62, span: 74, height: 55, radius: 35, + windowUs: 220000, force: 1550, lift: 220, + cue: ["kick", 1.05], thud: ["block", 1] }, + WHIP: { reach: 92, swell: 74, span: 76, height: 122, radius: 24, + windowUs: 190000, force: 1000, lift: 110, + cue: ["whoosh", 1.15], thud: ["hat", 1.35] }, + BASH: { reach: 62, swell: 40, span: 58, height: 108, radius: 40, + windowUs: 280000, force: 1750, lift: 210, + cue: ["kick", 1.3], thud: ["kick", 1.4] }, +}; +// One lookup serves both Y and the loaded punch, so the thing you can see in +// the fighter's hand is always the thing that fires and the thing that swings. +const itemMelee = { GUN: "WHIP", GRENADE: "BASH" }; +const instantReplayStepUs = 33333; +// Replay speed ramping: how far a full-force hit drags the playhead down, how +// many frames of warning the ramp gets, and how fast the speed itself may +// change — the last one is what keeps a slowdown from reading as a stutter. +const replaySlowest = .18; +const replayActionLead = 8; +const replayRampPerSecond = 3.2; +const instantReplayMaxFrames = 240; +// Legs, slowed about a sixth on @jeffrey's ear. The station is twice the +// cube's width, and the first thing a bigger floor does is make a fighter +// read as skating across it -- the same stride that felt urgent crossing 900 +// units looks weightless crossing 1,800. Every number here moved by the same +// fraction, including the acceleration, so time-to-top-speed is unchanged and +// only the ground covered is: a run still winds up over the same beat. +// +// This is load-bearing beyond feel. `jumpReach` prices a bot's jump in +// walkSpeed, so the arcs it will commit to narrow with the stride, and the +// deck spacing above stays exactly as reachable as it was. +// What a pump is worth, and how much upward speed a lip has to be giving you +// before it counts as an air rather than a bump. The launch floor exists so +// rolling over a gentle crest does not pop a rider off the ground every time. +const skatePumpAcceleration = 2600; +const skateLaunchFloor = 380; +const walkSpeed = 880; +const runStartSpeed = 1100; +const runTopSpeed = 1950; +const runAcceleration = 690; +// Vertical feel. The apex is the design constant — how high a fighter can +// reach never changed — so every impulse here is paired with a gravity that +// spends less time getting there. Rise is lighter than fall so the arc reads +// as intent going up and commitment coming down. +const riseGravityFull = 4800; +const fallGravityFull = 7200; +// Station gravity. The space map spins up a little over half a G, and that +// one number is what makes the floating decks a place you can go: at full +// weight a jump tops out at 322 units — three and a half tiles — and the +// lowest deck sits three tiles up with nothing above it worth reaching. At +// .55 the apex is 586, so the deck stack overhead is climbable on legs, a +// knocked fighter sails instead of dropping, and the hover board's airtime +// becomes the traversal it is for. The climb keeps full weight: survival's +// thirty-two rungs are spaced against the 322 apex, and floating that run +// would let a runner skip rungs the ladder exists to make them earn. +const spaceGravityScale = .55; +const gravityScale = () => survivalActive() ? 1 : spaceGravityScale; +const riseGravity = () => riseGravityFull * gravityScale(); +const fallGravity = () => fallGravityFull * gravityScale(); +const jumpVelocity = 1760; +const crouchJumpVelocity = 1960; +const ultraJumpVelocity = 3960; +const crouchHopVelocity = 980; +const pogoBounceVelocity = 2100; +const headBounceVelocity = 1100; +const jumpAnticipationUs = 50000; +// Letting go of up mid-rise snips the arc: a tap is a hop, a hold is a jump. +const jumpCutScale = .55; +const jumpPoseUs = 75000; +const crouchJumpPoseUs = 145000; +const crouchHopPoseUs = 190000; +const sinkDurationUs = 250000; +const hudTypeSize = 42; +// The command stream is a record of what you just did, so it is long enough to +// hold a whole exchange and it does not start dissolving while you are still +// playing. Only once the pad goes quiet does it age out, oldest glyph first, +// so the last thing you pressed is the last thing to leave. +const commandStreamDepth = 20; +const commandStreamRows = 5; +const commandStreamColumns = 8; +const commandStreamColumnsNow = () => compactLayout() ? 4 : commandStreamColumns; +const commandStreamTypeSize = (handleSize) => Math.max(18, + Math.round(handleSize * (compactLayout() ? .8 : .88))); +const commandHoldUs = 1100000; +const commandFadeUs = 1900000; +const replayButtons = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", + "A", "B", "X", "Y"]; +let cameraCenter = (worldLeft + worldRight) / 2; +let cameraWidth = worldRight - worldLeft; +let cameraCenterY = floorY - cameraWidth / cameraAspect / 2; +let cameraContainFloor = 0; +// What the containment floor was last frame, so its rate of growth can be +// measured. See `updateCameraDoll` — the doll eases toward the floor, and an +// ease that is not led always sits behind a target that keeps moving. +let previousContainmentWidth = 0; +// Two different distances, because they answer two different questions. +// +// `cameraPin` is where a single projected point stops being allowed to get any +// nearer. Nothing can clip a point — a shadow ellipse or a capsule end is one +// coordinate, not a face — so the best available answer is to hold it at a +// sane depth and accept that a thing behind the lens is drawn wrong. This is +// the distance the projection has always used. +const cameraPin = 80; +// `cameraNear` is the real near plane, and faces are cut at it. It is much +// closer than the pin on purpose. The cut is a straight line at constant +// depth, and where that line lands on screen is decided by how much the lens +// magnifies at the plane -- and this lens is only a tenth perspective in +// normal play, which dilutes that magnification tenfold. Clipping the floor at +// the pin distance put its cut line just inside the bottom of the frame and +// opened a band of sky under the fighters' feet. Ten times nearer drives the +// cut off screen for any camera that is meaningfully above the floor, and the +// coordinates it asks for in exchange are what the guard band is for. +const cameraNear = 8; +// Projected faces are cut to a band one viewport wide on every side before +// they are handed over. The scene is allowed to run off screen; it is not +// allowed to run off into coordinates the rasterizer cannot hold, which is +// what a vertex sitting on the near plane will otherwise ask for. +const guardBand = 1; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); +const mixColor = (dark, light, amount) => dark.map((value, index) => + Math.round(value + (light[index] - value) * amount)); +const lerp = (from, to, amount) => from + (to - from) * amount; +const normalize3 = (point) => { + const length = Math.hypot(point.x, point.y, point.z) || 1; + return { x: point.x / length, y: point.y / length, z: point.z / length }; +}; +const globalLight = normalize3({ x: -.42, y: 1, z: -.28 }); +const cross3 = (a, b) => ({ x: a.y * b.z - a.z * b.y, + y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }); +const dot3 = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z; +const viewWidth = () => stageRight; +const viewCenterX = () => (stageLeft + stageRight) / 2; +const viewOffsetX = () => (stageRight - 1920) / 2; +const compactLayout = () => stageRight < 1500; +// Keep the HUD inside a traditional five-percent title-safe frame. On a +// 16:9 television this is deliberately deeper than the action-safe camera so +// a bezel, soundbar, or object in front of the screen does not hide status. +const hudSafeInset = () => clamp( + Math.round(Math.min(stageRight, viewHeight) * .05), + compactLayout() ? 24 : 48, 72); +const hudSafeRect = () => { + // The title-safe hedge and a hardware occlusion answer different threats, + // and only the deeper one matters at each edge: a bezel might hide the + // frame's rim, a notch definitely does. + const inset = hudSafeInset(); + return { left: stageLeft + Math.max(inset, viewInset.left + 14), + top: Math.max(inset, viewInset.top + 10), + right: stageRight - Math.max(inset, viewInset.right + 14), + bottom: viewHeight - Math.max(inset, viewInset.bottom + 10) }; +}; +const actionSafeRect = () => { + // A television is watched across a room behind a bezel; a reel is held at + // arm's length with nothing over its edges, so the action-safe frame there is + // a courtesy rather than a hedge against overscan. + const portrait = stageBottom - stageTop > stageRight - stageLeft; + // A landscape notch bites into the stage's own sides; fighters framed + // behind it are as lost as fighters past the edge. + const marginX = (portrait ? 18 : (compactLayout() ? 34 : 64)) + + Math.max(viewInset.left, viewInset.right); + const marginY = portrait ? 14 : 26; + return { left: stageLeft + marginX, top: stageTop + marginY, + right: stageRight - marginX, bottom: stageBottom - marginY }; +}; + +// The device's own occlusions, in game units: a phone's home indicator, a +// notch, rounded corners. The host measures them (env() on the web, native +// injection in the iOS shell, where a pinned scroll view zeroes env() out) +// and hands them through gameView; everything drawn against a screen edge — +// the stage bounds, the HUD safe frame, the touch clusters — stands off by +// them, because a control under the home indicator is a control the system +// swallows. +let viewInset = { top: 0, right: 0, bottom: 0, left: 0 }; + +function syncGameView() { + const next = typeof gameView === "function" ? gameView() : null; + const width = clamp(Math.round(Number(next?.width) || 1920), 480, 2880); + const height = clamp(Math.round(Number(next?.height) || 1080), 480, 2160); + const nextInset = {}; + for (const edge of ["top", "right", "bottom", "left"]) + nextInset[edge] = clamp(Math.round(Number(next?.inset?.[edge]) || 0), + 0, 220); + const inputFamily = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + const touch = inputFamily === "touch"; + const compact = width < 1500; + const inset = compact ? 22 : 30; + const nextTop = Math.max(82, inset + hudTypeSize + 16) + nextInset.top; + const bottomReserve = (touch + ? clamp(height * .36, 300, 390) + : clamp(height * .13, 112, 150)) + nextInset.bottom; + const nextBottom = Math.max(nextTop + 280, height - bottomReserve); + if (width === stageRight && height === viewHeight && + nextTop === stageTop && nextBottom === stageBottom && + ["top", "right", "bottom", "left"].every((edge) => + nextInset[edge] === viewInset[edge])) return; + stageRight = width; + viewHeight = height; + stageTop = nextTop; + stageBottom = nextBottom; + viewInset = nextInset; + cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); + if (typeof cameraDoll !== "undefined") cameraDoll.dirty = true; +} + +class FightCamDoll { + constructor() { + this.position = { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.4 }; + this.target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + this.width = cameraWidth; + this.perspective = 0; + this.fov = 55; + this.roll = 0; + this.dirty = true; + this.view = null; + } + + track(spec, dt, speed = 5) { + // Exponential easing is continuous across frame rates. Move the dolly and + // its look target together so follow motion cannot shear into a sudden + // swivel when fighters cross a framing threshold. + const amount = 1 - Math.exp(-Math.max(0, dt) * speed); + const previousTarget = { ...this.target }; + for (const axis of ["x", "y", "z"]) + this.target[axis] = lerp(this.target[axis], spec.target[axis], amount); + for (const axis of ["x", "y", "z"]) + this.position[axis] += this.target[axis] - previousTarget[axis]; + for (const axis of ["x", "y", "z"]) { + this.position[axis] = lerp(this.position[axis], spec.position[axis], amount); + } + // Pull back promptly but never in a single frame; return close more + // slowly so small changes at the action-safe edge do not pump the lens. + const zoomSpeed = spec.width > this.width ? speed * 1.9 : speed * .58; + const zoomAmount = 1 - Math.exp(-Math.max(0, dt) * zoomSpeed); + this.width = lerp(this.width, spec.width, zoomAmount); + this.perspective = lerp(this.perspective, spec.perspective, amount); + this.fov = lerp(this.fov, spec.fov || 55, amount); + this.roll = lerp(this.roll, spec.roll || 0, amount); + this.dirty = true; + } + + snap(spec) { + this.target = { ...spec.target }; + this.position = { ...spec.position }; + this.width = spec.width; + this.perspective = spec.perspective; + this.fov = spec.fov || 55; + this.roll = spec.roll || 0; + this.dirty = true; + collapseRenderCameraInterpolation(); + } + + prepare() { + const forward = normalize3({ x: this.target.x - this.position.x, + y: this.target.y - this.position.y, z: this.target.z - this.position.z }); + const baseRight = normalize3(cross3(forward, { x: 0, y: -1, z: 0 })); + const baseUp = normalize3(cross3(baseRight, forward)); + const rollCos = Math.cos(this.roll); + const rollSin = Math.sin(this.roll); + const right = { x: baseRight.x * rollCos + baseUp.x * rollSin, + y: baseRight.y * rollCos + baseUp.y * rollSin, + z: baseRight.z * rollCos + baseUp.z * rollSin }; + const up = { x: baseUp.x * rollCos - baseRight.x * rollSin, + y: baseUp.y * rollCos - baseRight.y * rollSin, + z: baseUp.z * rollCos - baseRight.z * rollSin }; + this.view = { forward, right, up, + centerX: (stageLeft + stageRight) / 2, + centerY: (stageTop + stageBottom) / 2, + orthoScale: (stageRight - stageLeft) / this.width, + focal: (stageRight - stageLeft) / + (2 * Math.tan(this.fov * Math.PI / 360)) }; + this.dirty = false; + } + + // World space to camera space, with the near distance left alone. Anything + // that wants to survive contact with the near plane has to see the honest + // depth first — `project` is where it gets clamped, and a clamp is a lie for + // anything behind the lens. + toView(point, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { forward, right, up } = this.view; + const x = point.x - this.position.x, y = point.y - this.position.y; + const z = point.z - this.position.z; + out.x = x * right.x + y * right.y + z * right.z; + out.y = x * up.x + y * up.y + z * up.z; + out.z = x * forward.x + y * forward.y + z * forward.z; + return out; + } + + projectView(view, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { centerX, centerY, orthoScale, focal } = this.view; + const depth = Math.max(cameraNear, view.z); + const orthoX = centerX + view.x * orthoScale; + const orthoY = centerY - view.y * orthoScale; + const perspectiveX = centerX + view.x * focal / depth; + const perspectiveY = centerY - view.y * focal / depth; + out.x = lerp(orthoX, perspectiveX, this.perspective); + out.y = lerp(orthoY, perspectiveY, this.perspective); + out.z = clamp(depth / 16000 * 2.8 - 1.4, -1.4, 1.4); + return out; + } + + // A lone point cannot be clipped, so it is held at the pin rather than + // allowed to divide by a depth it does not have. Faces go through + // `worldTriangle`, which cuts them at the near plane and then comes back + // here with vertices that are already in front of it. + project(point) { + const view = this.toView(point); + view.z = Math.max(cameraPin, view.z); + return this.projectView(view); + } +} + +const cameraDoll = new FightCamDoll(); +const cameraScale = () => (stageRight - stageLeft) / cameraDoll.width; +let playerCameraYaw = 0; +let playerCameraPitch = 0; +// A multiplier on the framed width, so zoom rides on top of automatic framing +// rather than fighting it: the camera still guarantees both fighters are in +// shot, and this scales the result. Above 1 is wider. The ceiling is low on +// purpose -- a wide shot draws a wider span of terrain, and span IS the frame +// budget on a console whose JS never gets a JIT. +let playerCameraZoom = 1; +let triangleDepth = -1.4; +// A match frame submits ~2100 faces. Buffering them into a Float32Array first +// cost 5.7ms a frame where handing each one straight over costs 1.8ms — +// twelve typed-array element writes in QuickJS are dearer than twelve +// arguments to one C call. The batched host call itself measured 0.05ms, so +// the boundary crossing was never the expense. +const emitTriangle = typeof triangle3d === "function" ? triangle3d + : (x1, y1, z1, x2, y2, z2, x3, y3, z3, r, g, b) => + triangle(x1, y1, x2, y2, x3, y3, r, g, b); +// r/g/b stay positional so the hottest path in the piece doesn't build a rest +// array per face; the host defaults every missing channel to 255 the same way. +// +// The native buffer speaks int16: a coordinate past ±32768 — or the NaN a +// projection returns after crossing the camera plane — is a RangeError and a +// dead frame on console. Geometry that broken was never going to be visible, +// so the seam culls it instead of crashing. NaN fails a comparison on its +// own, which keeps the guard to plain compares on the hottest path. +const triangleSafe = (value) => value > -32200 && value < 32200; +function screenTriangle(x1, y1, x2, y2, x3, y3, r = 255, g = 255, b = 255) { + if (!(triangleSafe(x1) && triangleSafe(y1) && triangleSafe(x2) && + triangleSafe(y2) && triangleSafe(x3) && triangleSafe(y3))) return; + emitTriangle(x1, y1, triangleDepth, x2, y2, triangleDepth, + x3, y3, triangleDepth, r, g, b); +} +function screenRect(x, y, width, height, color) { + const [r, g, b] = color; + screenTriangle(x, y, x + width, y, x + width, y + height, r, g, b); + screenTriangle(x, y, x + width, y + height, x, y + height, r, g, b); +} +// On the native shell `box` and `line` are CPU-composited UNDER every GPU +// triangle — App.cpp paints rects, lines and block text into the CPU frame, +// uploads that as the scene texture, then draws the depth pass over it — so +// the frame meter, keycaps, clock and bot scaffolding sank behind the +// fighters and terrain. @jeffrey on the console, 2026-09-20: "the frame +// counter and stuff in the debug ui ... feels like its behind stuff". HUD +// boxes and lines ride the triangle pass there, at a depth in front of any +// body (bodies bottom out near -1.42; the shell maps (z + 1.5) / 3 into the +// depth buffer, LESS_EQUAL). The web shell keeps box/line as they were. +const nativeTrianglePass = typeof triangle3d === "function"; +// Native AC can composite diagnostic lines and rectangles after the scene. +let nativeHudOverlay = false; +const hudDepth = -1.48; +function hudBox(x, y, width, height, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { box(x, y, width, height, ...color); return; } + const previous = triangleDepth; + triangleDepth = hudDepth; + screenRect(x, y, width, height, color); + triangleDepth = previous; +} +function hudLine(x1, y1, x2, y2, width, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy) || 1; + const nx = -dy / length * Math.max(1, width) / 2; + const ny = dx / length * Math.max(1, width) / 2; + const previous = triangleDepth; + triangleDepth = hudDepth; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x2 + nx, y2 + ny, x2 - nx, y2 - ny, r, g, b); + screenTriangle(x1 + nx, y1 + ny, x2 - nx, y2 - ny, x1 - nx, y1 - ny, r, g, b); + triangleDepth = previous; +} +function hudWorldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + hudLine(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} +function hudCircle(x, y, radius, width, color) { + let lastX = x + radius, lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + hudLine(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; lastY = nextY; + } +} +function screenStrokeRect(x, y, width, height, thickness, color) { + screenRect(x, y, width, thickness, color); + screenRect(x, y + height - thickness, width, thickness, color); + screenRect(x, y + thickness, thickness, height - thickness * 2, color); + screenRect(x + width - thickness, y + thickness, + thickness, height - thickness * 2, color); +} +function projectedTriangle(a, b, c, color) { + if (!(triangleSafe(a.x) && triangleSafe(a.y) && triangleSafe(a.z) && + triangleSafe(b.x) && triangleSafe(b.y) && triangleSafe(b.z) && + triangleSafe(c.x) && triangleSafe(c.y) && triangleSafe(c.z))) return; + // Positional, not spread: see the note on emitTriangle above. Every face a + // frame submits comes through here, and `...color` built one throwaway + // iterator apiece for ~2100 of them. + emitTriangle(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z, + color[0], color[1], color[2]); +} +// Sutherland-Hodgman, one plane at a time. Both clips below are the same walk: +// step the polygon's edges, keep the vertices that are inside, and whenever an +// edge crosses out or in, keep the crossing point too. +function clipPolygon(polygon, distance, mix) { + const kept = []; + for (let index = 0; index < polygon.length; index++) { + const current = polygon[index]; + const next = polygon[(index + 1) % polygon.length]; + const here = distance(current); + const there = distance(next); + if (here >= 0) kept.push(current); + if ((here >= 0) !== (there >= 0)) + kept.push(mix(current, next, here / (here - there))); + } + return kept; +} +const mixVertex = (a, b, amount) => ({ x: lerp(a.x, b.x, amount), + y: lerp(a.y, b.y, amount), z: lerp(a.z, b.z, amount) }); +// The near plane, in camera space, before the divide. This is the whole point: +// a vertex behind the lens has a negative depth, and pinning it to the near +// distance keeps its sideways offset while dividing by a distance it never +// had — so a face that crosses the plane used to shear halfway across the +// screen, or blow past the coordinate guard and vanish outright. Cutting it at +// the plane leaves only geometry that is honestly in front of the camera. +const clipViewNear = (polygon) => + clipPolygon(polygon, (vertex) => vertex.z - cameraNear, mixVertex); +// And the guard band, in screen space, after it. A vertex sitting exactly on +// the near plane projects to focal/near times its offset — twenty-three times, +// at this lens — so a legitimately visible floor can still ask for coordinates +// far outside anything the rasterizer will take. Cut it to a band a viewport +// wide instead of dropping the face and leaving a hole in the ground. +// The four band edges live at module scope over mutable bounds instead of +// being rebuilt as an array of closures per face — the walls cross the band +// every frame, and that little array was steady interpreter garbage. +let bandMinX = 0, bandMaxX = 0, bandMinY = 0, bandMaxY = 0; +const bandEdges = [ + (vertex) => vertex.x - bandMinX, + (vertex) => bandMaxX - vertex.x, + (vertex) => vertex.y - bandMinY, + (vertex) => bandMaxY - vertex.y, +]; +function clipScreenBand(polygon) { + const width = viewWidth(); + bandMinX = -width * guardBand; + bandMaxX = width * (1 + guardBand); + bandMinY = -viewHeight * guardBand; + bandMaxY = viewHeight * (1 + guardBand); + let clipped = polygon; + for (const distance of bandEdges) { + if (clipped.length < 3) return []; + clipped = clipPolygon(clipped, distance, mixVertex); + } + return clipped; +} +// One world-space face, all the way through: to camera space, cut at the near +// plane, projected, cut to the guard band, then fanned into whatever triangles +// are left. Zero of them is a face entirely behind the camera, which is a +// perfectly good answer. +// Whether a projected vertex already sits inside the guard band. A NaN fails +// every compare, so a broken projection falls through to the clipper. +function bandContains(vertex) { + const width = viewWidth(); + return vertex.x >= -width * guardBand && vertex.x <= width * (1 + guardBand) && + vertex.y >= -viewHeight * guardBand && + vertex.y <= viewHeight * (1 + guardBand); +} +// Scratch vertices never escape synchronous face submission or clipping. +const triangleView = [{}, {}, {}]; +const triangleScreen = [{}, {}, {}]; +function worldTriangle(a, b, c, color) { + const viewA = cameraDoll.toView(a, triangleView[0]); + const viewB = cameraDoll.toView(b, triangleView[1]); + const viewC = cameraDoll.toView(c, triangleView[2]); + // Nearly every face a frame submits sits whole in front of the lens and + // whole inside the guard band, and the console's interpreter was paying + // for six array allocations per face on the way to discovering that. + // Plain compares decide the common case; only a face that actually + // crosses a plane pays for the Sutherland-Hodgman walk. + if (viewA.z >= cameraNear && viewB.z >= cameraNear && viewC.z >= cameraNear) { + const pa = cameraDoll.projectView(viewA, triangleScreen[0]); + const pb = cameraDoll.projectView(viewB, triangleScreen[1]); + const pc = cameraDoll.projectView(viewC, triangleScreen[2]); + if (bandContains(pa) && bandContains(pb) && bandContains(pc)) { + projectedTriangle(pa, pb, pc, color); + return; + } + const banded = clipScreenBand([pa, pb, pc]); + for (let corner = 2; corner < banded.length; corner++) + projectedTriangle(banded[0], banded[corner - 1], banded[corner], color); + return; + } + const near = clipViewNear([viewA, viewB, viewC]); + if (near.length < 3) return; + const projected = near.map((vertex) => cameraDoll.projectView(vertex)); + if (projected.some((point) => !Number.isFinite(point.x) || + !Number.isFinite(point.y))) return; + // A near-plane fan can be a quad; fanning it before the band clip would + // clip the same interior edge twice, so the band takes the whole polygon. + const face = clipScreenBand(projected); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], color); +} +function projectPoint(x, y, z = 0) { + return cameraDoll.project({ x, y, z }); +} +const panAt = (x, z = 0) => clamp( + (projectPoint(x, cameraCenterY, z).x - viewCenterX()) / + Math.max(1, (stageRight - stageLeft) / 2 - 55), -1, 1); +const panPlayer = (player) => panAt(player.x, player.z); +let visualTheme = { light: 0, sunset: 0 }; + +const fighterRoster = [ + { handle: "@JEFFREY", color: [190, 42, 58], colors: [ + [255,105,190],[111,232,210],[255,105,190],[255,232,92], + [130,150,255],[255,105,190],[111,232,210],[255,232,92]], + mood: "New Media Instruments", + lastChat: "hmm this chat could use some ui love" }, + { handle: "@FIFI", color: [209, 100, 216], colors: [ + [209,100,216],[204,253,71],[35,100,255],[82,67,17],[5,249,137]], + mood: "nap", lastChat: "" }, + { handle: "@OSKIE", color: [38, 82, 176], colors: [ + [255,232,92],[255,105,190],[111,232,210],[255,232,92],[130,150,255],[255,105,190]], + mood: "", lastChat: "" }, + { handle: "@SAT", color: [130, 204, 213], colors: [ + [130,204,213],[161,232,0],[253,122,2],[222,90,205]], + mood: "i hope its not ai generated", lastChat: "meow" }, +]; +// Per-glyph color is how a community @handle carries its owner's identity. +// The house opponents are not people, so they hold one flat color each and +// let the glyph walk fall back to it. +const npcFighter = { handle: "DUMMY", color: [105, 125, 150], colors: [], + mood: "TRAINING DUMMY · NO BOT AI", lastChat: "" }; +const anonymousFighter = { handle: "", color: [72, 176, 156], colors: [ + [72,176,156],[118,214,188],[54,128,168],[230,205,92]], + mood: "ANONYMOUS", lastChat: "" }; +const spiderDummyFighter = { handle: "SPIDERDUMMY", color: [76, 88, 108], + colors: [], mood: "GIANT SEGMENTED TRAINING FOE · NO BOT AI", lastChat: "" }; +const botFighter = { handle: "BOT", color: [205, 48, 72], colors: [], + mood: "ANGRY TRAINING BOT", lastChat: "" }; +const peopleFighter = { handle: "PPL", color: [116, 122, 136], colors: [], + mood: "", lastChat: "" }; +// Self-play needs two nameplates nobody can mix up, or the result card reads +// "BOT WINS" with no way to tell which bot won. The colors here are only the +// fallback — each round deals fresh ones from the CSS color book below. +const selfPlayFighters = [ + { handle: "BOT 1", color: [205, 48, 72], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, + { handle: "BOT 2", color: [48, 118, 205], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, +]; + +// Self-play dresses its bots from the CSS color book instead of the house +// red and blue. The picks hash out of the round name, so the offline replay +// that repaints a reel deals the same pairing the live pass wore, and every +// round is a fresh matchup. The book carries only names that can hold a +// nameplate on either theme — the washed-out and near-black entries stay +// home — and the second pick stands off a sixth of the color wheel from the +// first so the result card never reads as a mirror match. +const cssColorBook = ("crimson dc143c,firebrick b22222,red ff0000," + + "orangered ff4500,tomato ff6347,coral ff7f50,darkorange ff8c00," + + "orange ffa500,gold ffd700,goldenrod daa520,darkgoldenrod b8860b," + + "yellowgreen 9acd32,chartreuse 7fff00,lawngreen 7cfc00,limegreen 32cd32," + + "forestgreen 228b22,green 008000,seagreen 2e8b57,mediumseagreen 3cb371," + + "springgreen 00ff7f,mediumspringgreen 00fa9a,lightseagreen 20b2aa," + + "teal 008080,darkcyan 008b8b,darkturquoise 00ced1,turquoise 40e0d0," + + "mediumturquoise 48d1cc,cadetblue 5f9ea0,deepskyblue 00bfff," + + "dodgerblue 1e90ff,cornflowerblue 6495ed,steelblue 4682b4," + + "royalblue 4169e1,blue 0000ff,mediumblue 0000cd,darkslateblue 483d8b," + + "slateblue 6a5acd,mediumslateblue 7b68ee,mediumpurple 9370db," + + "blueviolet 8a2be2,darkviolet 9400d3,darkorchid 9932cc," + + "mediumorchid ba55d3,orchid da70d6,violet ee82ee,magenta ff00ff," + + "mediumvioletred c71585,deeppink ff1493,hotpink ff69b4," + + "palevioletred db7093,indianred cd5c5c,salmon fa8072,darksalmon e9967a," + + "lightcoral f08080,rosybrown bc8f8f,sienna a0522d,chocolate d2691e," + + "peru cd853f,sandybrown f4a460,olivedrab 6b8e23,olive 808000," + + "darkkhaki bdb76b,rebeccapurple 663399,aquamarine 7fffd4," + + "mediumaquamarine 66cdaa,lightgreen 90ee90,skyblue 87ceeb," + + "lightskyblue 87cefa,plum dda0dd,khaki f0e68c,greenyellow adff2f," + + "yellow ffff00,cyan 00ffff,lime 00ff00").split(",").map((entry) => { + const [name, hex] = entry.split(" "); + const value = parseInt(hex, 16); + return { name, rgb: [value >> 16 & 255, value >> 8 & 255, value & 255] }; + }).filter(({ rgb }) => { + const high = Math.max(...rgb); + const low = Math.min(...rgb); + return high - low >= 60 && high + low >= 140 && high + low <= 400; + }); + +const hueOf = ([red, green, blue]) => { + const high = Math.max(red, green, blue); + const low = Math.min(red, green, blue); + const span = high - low || 1; + const sixth = high === red ? (green - blue) / span + : high === green ? 2 + (blue - red) / span : 4 + (red - green) / span; + return (sixth * 60 + 360) % 360; +}; + +function selfPlayWardrobe(pad) { + if (typeof globalThis.__oskiewarJevPad === 'function') + return { name: pad === 0 ? 'JEV PINK' : 'JEV BLUE', rgb: pad === 0 ? [255, 90, 170] : [65, 195, 255] }; + const round = matchName || seriesName; + const first = cssColorBook[Math.floor( + hashUnit(round + " one") * cssColorBook.length) % cssColorBook.length]; + if (pad === 0) return first; + const start = Math.floor(hashUnit(round + " two") * cssColorBook.length); + for (let step = 0; step < cssColorBook.length; step++) { + const pick = cssColorBook[(start + step) % cssColorBook.length]; + const apart = Math.abs(hueOf(pick.rgb) - hueOf(first.rgb)); + if (Math.min(apart, 360 - apart) >= 60) return pick; + } + return cssColorBook[(start + 1) % cssColorBook.length]; +} + +function losAngelesSun() { + const radians = Math.PI / 180; + const days = Date.now() / 86400000 + 2440587.5 - 2451545; + const meanLongitude = (280.46 + .9856474 * days) % 360; + const meanAnomaly = (357.528 + .9856003 * days) % 360; + const eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly * radians) + + .02 * Math.sin(2 * meanAnomaly * radians); + const obliquity = 23.439 - .0000004 * days; + const rightAscension = Math.atan2(Math.cos(obliquity * radians) * + Math.sin(eclipticLongitude * radians), Math.cos(eclipticLongitude * radians)) / + radians; + const declination = Math.asin(Math.sin(obliquity * radians) * + Math.sin(eclipticLongitude * radians)); + const siderealHours = 18.697374558 + 24.06570982441908 * days; + let hourAngle = ((siderealHours * 15 - 118.2437 - rightAscension + 540) % 360) - 180; + const latitude = 34.0522 * radians; + const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) + + Math.cos(latitude) * Math.cos(declination) * + Math.cos(hourAngle * radians)) / radians; + const light = clamp((altitude + 6) / 14, 0, 1); + const sunset = clamp(1 - Math.abs(altitude - 1) / 11, 0, 1) * + (hourAngle > 0 ? 1 : .42); + return { light: light * light * (3 - 2 * light), sunset }; +} + +function displayTheme() { + if (globalThis.__oskiewarTheme === "dark") return {light:0, sunset:0}; + const sun = losAngelesSun(); + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.platform === "web" || caps.platform === "macos") { + return { ...sun, light: caps.colorScheme === "light" ? 1 : 0 }; + } + return sun; +} +// Nameless until somebody says who they are. These two used to boot as +// @JEFFREY and @OSKIE — the first and third entries of the local roster — and +// every path that failed to learn a real identity quietly fell through to +// them. That is how an anonymous visitor alone in a dead room was shown +// "@JEFFREY vs @OSKIE" and told "YOU ARE @OSKIE — RIGHT SIDE". An empty name +// is the honest state and the wire already speaks it: spectatorState sends "" +// as NOBODY, and the HUD reads it as "THE SECOND FIGHTER". +const players = [ + { name: "", rosterIndex: -1, handleColors: anonymousFighter.colors, + // Spawn marks stand on the centers of tiles 3 and 6 — mirrored across + // the cube's middle, three tiles from the pistol's corner. Three + // matters: a pickup takes any limb within 90, a standing fighter's arms + // reach most of a tile past the mark, and two tiles of gap was close + // enough that the bell handed the weapon out before anyone moved. + pad: 0, spawnX: tileCenterX(spawnColLeft), x: tileCenterX(spawnColLeft), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: 1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: anonymousFighter.color.slice(), hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: 1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, + { name: "", rosterIndex: -1, handleColors: [], + npc: false, bot: false, remote: false, + pad: 1, spawnX: tileCenterX(spawnColRight), x: tileCenterX(spawnColRight), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: -1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: [38, 82, 176], hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: -1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, +]; +const thirdPlayerTemplate = JSON.stringify(players[1]); +const freeForAll = () => localVersusActive() && players.length === 3; +const rivalsOf = (player) => players.filter((other) => + other !== player && other.alive).sort((a, b) => + Math.hypot(a.x - player.x, a.y - player.y, a.z - player.z) - + Math.hypot(b.x - player.x, b.y - player.y, b.z - player.z)); +const nearestRival = (player) => rivalsOf(player)[0] || + players.find((other) => other !== player); +function roundWinner() { + const contenders = freeForAll() ? players.filter((player) => player.alive) : players; + if (freeForAll() && contenders.length <= 1) return contenders[0] || null; + const best = Math.max(...contenders.map((player) => player.score)); + const leaders = contenders.filter((player) => player.score === best); + return leaders.length === 1 ? leaders[0] : null; +} +function setLocalPlayerCount(count) { + if (count === 3 && players.length === 2) { + const third = JSON.parse(thirdPlayerTemplate); + third.pad = 2; + players.push(third); + frameMeters.push([]); + } else if (count === 2) { + players.length = 2; + frameMeters.length = 2; + } +} +// Who the camera, the scorekeeping and the reactions believe is on stage. +// Survival and the versus lobby are both one-body rooms — the second chair +// is parked off the map until somebody takes it. +const activePlayers = () => + survivalActive() || lobbyActive() ? [players[0]] : players; +const impacts = []; + +// Every impact gets a number, in order, for the life of the run. A watcher +// cannot be told "here is a new spark" by a stateless frame that repeats the +// same list ten times — it has to be able to tell which ones it has already +// seen, and a position is not an identity. The counter is simulation state: +// a rollback that re-spawns an impact must re-issue the same number. +let impactSequence = 0; + +function spawnImpact(impact) { + impact.id = ++impactSequence; + impacts.push(impact); + return impact; +} + +const detachedParts = []; +const bullets = []; +const grenades = []; +// The station's arsenal, said out loud: a pistol on the floor, a space laser +// at the top of the climb, a light saber over each fighter's own head. The +// cube could carry exactly one weapon, and the comment here used to say why +// — "a one-room box has no shelf to price them on". A station HAS shelves. +// Height is the price again, the way it was in the tower, and each of the +// three is priced differently on purpose: +// +// pistol — floor, far corner, behind the right spawn. The oldest bargain +// in this game and unchanged: turn your back on the other fighter to arm +// up, or rush the middle bare-handed. Six rounds that ricochet forever. +// space laser — the high centre deck, three jumps up, contested from both +// sides. Four bolts, no ricochet, and fast enough that it is a line you +// draw rather than a shot you lead. Missing it costs the bolt outright. +// light saber — one on each low deck, mirrored, one jump off your own +// spawn. It is the only free weapon and the only fair one, and it buys +// reach on every hand strike rather than a projectile. +// +// The blade came and went inside one build back in the cube — @jeffrey tried +// a sword-and-pistol standoff and asked for fists and one gun instead. The +// objection was to a duel in a phone booth, and the whole drawing machinery +// (`swordHeld`, the hilt pinned to the item forearm) survived it intact. A +// map with distance in it is the condition that was missing. +// +// `cycle` marks the slot the ten-second powerup rotation owns. Only the +// pistol carries it, so an untouched laser can never stall the reload that +// keeps the floor fight fed. +const gunPickups = [ + { kind: "HANDGUN", amount: 6, x: tileCenterX(cornerColRight), + startsActive: true, cycle: true, y: floorY, z: 0 }, + { kind: "SPACE LASER", amount: 4, x: centerX, startsActive: true, + cycle: false, y: parkDecks[3].y, z: 0 }, + { kind: "ROCKET LAUNCHER", amount: 3, x: tileCenterX(cornerColLeft), + startsActive: true, cycle: false, y: floorY, z: 0 }, +]; +// A saber is not ammunition, so it is not a gun pickup: taking one sets a +// state a fighter keeps until the arm holding it comes off. Mirrored across +// the two low decks, centred on each deck rather than on a tile, because the +// deck is the landmark a player actually reads. +const saberPickups = [ + { kind: "LIGHT SABER", x: (parkDecks[1].left + parkDecks[1].right) / 2, + y: parkDecks[1].y, z: 0, startsActive: true }, + { kind: "LIGHT SABER", x: (parkDecks[2].left + parkDecks[2].right) / 2, + y: parkDecks[2].y, z: 0, startsActive: true }, +]; +const grenadePickups = [ + { amount: 3, x: centerX - 450, y: floorY, z: 0, startsActive: true }, + { amount: 3, x: centerX + 450, y: floorY, z: 0, startsActive: true }, +]; +// No trees. Two grew out of the tower's side walls and were the only thing +// in a round that gave a body back; in the cube their ripe fruit read as a +// coconut hanging over the fight, and @jeffrey asked for it gone. The +// consequence is the point now: a fighter taken apart limb by limb stays +// that way until the bell. The grower/harvest machinery below sleeps on +// this empty list. +const bodyTrees = []; +const treeRipenUs = 18000000; +const treeTimeBonusUs = 15000000; +const airParticles = []; +for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + // A pickup names its tile and floats seventy above that tile's surface — + // the same float the old ledges used, and it keeps a real-sized weapon + // from reading as a decal painted on the floor. + pickup.y = surfaceYAt(pickup.x, pickup.y) - 70; +} +// Every kind carries a gravity factor so redressing the match ball in place +// can never leave a previous kind's float behind. +// +// The skateboard is map furniture; it never replaces the match ball. +const ballKinds = [ + { type: "soccer", spawnOwner: 0, radius: 38, mass: .72, hitScale: 1.12, + bounce: .58, drag: .994, windFactor: .58, gravityFactor: 1 }, + { type: "basketball", spawnOwner: 1, radius: 42, mass: 1.08, hitScale: .86, + bounce: .76, drag: .989, windFactor: .34, gravityFactor: 1 }, + { type: "beach", spawnOwner: -1, radius: 46, mass: .34, hitScale: 1.25, + bounce: .82, drag: .998, windFactor: 1.35, gravityFactor: .62 }, + { type: "skateboard", spawnOwner: -1, radius: 52, mass: .9, hitScale: .7, + bounce: .34, drag: .992, windFactor: .5, gravityFactor: .5, + series: false }, +]; +let matchBallType = ballKinds[0].type; +const skateBoardKind = ballKinds.find((kind) => kind.type === "skateboard"); +// A match inflates exactly one ball and keeps it for every round, and the +// station parks exactly one board on the floor at centre. Two entries in one +// array because they are the same kind of object to every routine that +// touches them — swept contact, ledge support, shadows, the wire format — +// and because the board's whole mount path is written against a ball rolling +// into a shin. +const balls = [{ ...ballKinds[0], z: 0, vx: 0, vy: 0, rotation: 0, + x: players[0].spawnX, y: floorY - ballKinds[0].radius, + active: true, serveAt: 0, lastHitBy: 0, safeUntil: 0, safePlayers: 0, + heldBy: -1 }, +...[cornerColLeft, 20, 32].map((spawnCol) => ({ ...skateBoardKind, spawnCol, riderPad: -1, z: 0, vx: 0, vy: 0, rotation: 0, + x: tileCenterX(spawnCol), y: floorY - skateBoardKind.radius, + active: true, serveAt: 0, lastHitBy: -1, safeUntil: 0, safePlayers: 0, + heldBy: -1 }))]; +// Version-one replay/spectator consumers still read the first ball by name. +const ball = balls[0]; +// The board is not gated by `ballEnabled`. That switch is the ball's — it +// takes the serve, the cross-wack and the BALLED death off the map together — +// and the board shares none of them. +let skateBoardEnabled = true; +// The ball is out of the round — @jeffrey asked for the cube bare. All of +// the ball's machinery (serve, boot, carry, cross-wack, the BALLED death) +// sleeps behind this switch exactly as it always did for the test harness; +// flipping it back on is the whole re-installation. +let ballEnabled = false; + +function mapHash(text) { + let hash = 2166136261; + for (const character of String(text || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} +let currentMapName = "HALFPIPE"; +let currentMapId = "halfpipe"; +let workshopBase = null; +// Workshop edits are local practice state. They never enter rollback matches +// or the competitive replay ledger; documents are saved separately. +let workshopMap = null; +let workshopRevision = 0; +let workshopHistory = []; +let workshopHighlight = false; +let workshopTainted = false; + +let localMapIndex = -1; +let localMapMode = ""; +let localMapInstalled = false; +let netRoundMapIndex = -1; +const localMapVariants = [null, { + name: "BOWL", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "transition", rise: 360, dir: -1, lift: -360 }, + { from: 16, to: 24, kind: "flat", lift: -360 }, + { from: 24, to: 28, kind: "transition", rise: 360, dir: 1, lift: -360 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 9, cols: 4, row: 3 }, { col: 27, cols: 4, row: 3 }], +}, { + name: "HIGH GROUND", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "bank", rise: 270, dir: 1 }, + { from: 16, to: 24, kind: "flat", lift: 270 }, + { from: 24, to: 28, kind: "bank", rise: 270, dir: -1 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 7, cols: 4, row: 3 }, { col: 18, cols: 4, row: 7 }, + { col: 29, cols: 4, row: 3 }], +}, { + name: "PUMP TRACK", + features: [ + { from: 0, to: 6, kind: "flat" }, + ...[6, 14, 22, 30].flatMap(from => [ + { from, to: from + 3, kind: "bank", rise: 180, dir: 1 }, + { from: from + 3, to: from + 5, kind: "flat", lift: 180 }, + { from: from + 5, to: from + 8, kind: "bank", rise: 180, dir: -1 }, + ]), + { from: 38, to: 40, kind: "flat" }, + ], + decks: [{col: 17, cols: 6, row: 6}], +}, { + name: "TWIN BOWLS", + features: [ + {from: 0, to: 4, kind: "flat"}, + ...[4, 22].flatMap(from => [ + {from, to: from + 3, kind: "transition", rise: 270, dir: -1, lift: -270}, + {from: from + 3, to: from + 9, kind: "flat", lift: -270}, + {from: from + 9, to: from + 12, kind: "transition", rise: 270, dir: 1, lift: -270}, + {from: from + 12, to: from + 18, kind: "flat"}, + ]), + ], + decks: [{col: 8, cols: 4, row: 3}, {col: 26, cols: 4, row: 3}], +}, { + name: "LAUNCH PAD", + features: [ + {from: 0, to: 6, kind: "flat", lift: 360}, + {from: 6, to: 10, kind: "bank", rise: 360, dir: -1}, + {from: 10, to: 16, kind: "flat"}, + {from: 16, to: 20, kind: "bank", rise: 270, dir: 1}, + {from: 20, to: 24, kind: "bank", rise: 270, dir: -1}, + {from: 24, to: 30, kind: "flat"}, + {from: 30, to: 34, kind: "bank", rise: 360, dir: 1}, + {from: 34, to: 40, kind: "flat", lift: 360}, + ], + decks: [{col: 8, cols: 4, row: 6}, {col: 18, cols: 4, row: 9}, + {col: 28, cols: 4, row: 6}], +}]; +localMapVariants.push({ + name: "CORAL STEPS", + features: [ + {from:0, to:8, kind:"flat"}, + {from:8, to:12, kind:"bank", rise:180, dir:1}, + {from:12, to:16, kind:"flat", lift:180}, + {from:16, to:20, kind:"bank", lift:180, rise:180, dir:1}, + {from:20, to:24, kind:"bank", lift:180, rise:180, dir:-1}, + {from:24, to:28, kind:"flat", lift:180}, + {from:28, to:32, kind:"bank", rise:180, dir:-1}, + {from:32, to:40, kind:"flat"}, + ], + decks:[{col:4,cols:4,row:4},{col:18,cols:4,row:8},{col:32,cols:4,row:4}], +}, { + ...localMapVariants[1], name:"SLOW MOTION", modifier:"slow", +}, { + name:"AIR DROP", modifier:"air", skateboard:false, + features:[{from:0,to:40,kind:"flat"}], decks:[], +}); +const roundMapIds = ["halfpipe", "bowl", "high-ground", "pump-track", "twin-bowls", "launch-pad", + "coral-steps", "slow-motion", "air-drop"]; +const roundMapColors = [ + {sky:[218,239,255], night:[8,23,34], floor:[45,191,185], deck:[255,154,72]}, + {sky:[246,225,255], night:[27,13,39], floor:[181,107,237], deck:[76,220,188]}, + {sky:[255,231,203], night:[34,19,18], floor:[246,150,58], deck:[74,177,232]}, + {sky:[225,247,214], night:[9,29,27], floor:[119,192,66], deck:[234,103,169]}, + {sky:[255,224,231], night:[34,12,29], floor:[231,101,146], deck:[93,193,222]}, + {sky:[224,234,255], night:[13,19,43], floor:[90,139,234], deck:[250,202,67]}, + {sky:[255,235,205], night:[34,15,30], floor:[248,108,92], deck:[66,214,201]}, + {sky:[239,222,255], night:[25,15,43], floor:[122,94,201], deck:[245,176,238]}, + {sky:[125,208,255], night:[8,18,39], floor:[93,158,243], deck:[255,244,168]}, +]; +function roundMapDocument(index) { + const variant = localMapVariants[index]; + return variant ? {...workshopBase, ...variant, + features: variant.features.map(f => ({lift:0, rise:0, dir:1, ...f}))} : workshopBase; +} +function installRoundMap(index) { + installWorkshopMap(roundMapDocument(index), true); + currentMapId = roundMapIds[index]; +} + +function rotateLocalMap(keepMap, resetMatch) { + const local = localVersusActive(); + const training = !selfPlay && ["dummy", "spiderdummy", "trainingbot", "bot"] + .includes(fightOpponent); + if (skateparkMap || (!local && !training) || workshopTainted || + globalThis.__oskiewarPublishedMap) return; + const mode = local ? "local" : "training"; + if (localMapMode !== mode) { localMapIndex = -1; localMapMode = mode; } + // Returning to the title mid-round keeps its map. A completed solo round + // advances before the next START, just like the local versus rollover. + if (localMapIndex < 0 || (!keepMap && (local || !resetMatch || roundResult))) + localMapIndex = (localMapIndex + 1) % localMapVariants.length; + const variant = localMapVariants[localMapIndex]; + const map = variant ? { ...workshopBase, ...variant, + features: variant.features.map(f => ({ lift: 0, rise: 0, dir: 1, ...f })) } + : workshopBase; + if (local || variant) installWorkshopMap(map, true); + else currentMapName = "HALFPIPE"; + currentMapId = roundMapIds[localMapIndex]; + localMapInstalled = local || Boolean(variant); +} + +function workshopSnapshot() { + return { format: "ac.oskiewar.map", version: 1, + name: workshopMap?.name || currentMapName, + features: parkSegments.map(({ from, to, kind, lift, rise, dir }) => + ({ from, to, kind, lift: lift || 0, rise: rise || 0, dir: dir || 1 })), + decks: parkDecks.map(d => ({ col: (d.left - gridLeft) / tileSize, + cols: (d.right - d.left) / tileSize, row: (floorY - d.y) / tileSize })), + spawns: players.slice(0, 2).map(p => (p.spawnX - gridLeft) / tileSize - .5), + pickups: workshopMap?.pickups.map(p => ({ ...p })) || + [...gunPickups, ...saberPickups, ...grenadePickups].filter(p => p.startsActive) + .map(p => ({ kind: p.kind || "GRENADE", col: tileCol(p.x), amount: p.amount || 0 })), + skateboard: skateBoardEnabled }; +} + +function installWorkshopMap(map, cycleHandgun = false) { + if (skateparkMap) { configureWorldMap("station"); resetSkateRopes(); } + localMapInstalled = false; + workshopMap = map; + roundModifier = map.modifier || ""; + parkSegments.splice(0, parkSegments.length, ...map.features.map(f => ({ ...f, + left: gridLeft + f.from * tileSize, right: gridLeft + f.to * tileSize }))); + parkDeepest = floorY + Math.max(0, ...parkSegments.map(s => -s.lift)); + rebuildTerrainProfile(); + parkDecks.splice(0, parkDecks.length, ...map.decks.map((d, i) => ({ level: i + 1, + left: gridLeft + d.col * tileSize, right: gridLeft + (d.col + d.cols) * tileSize, + y: floorY - d.row * tileSize }))); + players.forEach((p, i) => { p.spawnX = tileCenterX(map.spawns[i] ?? + (map.spawns[0] + map.spawns[1]) / 2); }); + installMapPickups(gunPickups, map.pickups.filter(p => + !["GRENADE", "LIGHT SABER"].includes(p.kind)), "gun"); + // Portable maps contain authored pickups, not the built-in refill policy. + const pistol = gunPickups.find(p => p.kind === "HANDGUN"); + if (cycleHandgun && pistol) pistol.cycle = true; + installMapPickups(saberPickups, map.pickups.filter(p => p.kind === "LIGHT SABER"), "saber"); + installMapPickups(grenadePickups, map.pickups.filter(p => p.kind === "GRENADE"), "grenade"); + skateBoardEnabled = map.skateboard; + currentMapName = map.name; + currentMapId = "workshop-" + mapHash(JSON.stringify(map)).toString(36); + // Reconcile newly raised floors without restarting the players' exchange. + for (const p of players) { + const ground = terrainFloorAt(p.x); + if (p.y > ground || p.grounded) { p.y = ground; p.vy = 0; p.grounded = true; } + } + renderPreviousState = null; +} + +function workshopCommand(command) { + if (!globalThis.__oskiewarWorkshopEnabled) throw new Error("Coach editing is off"); + if ((netSession && netSession.seat !== 0) || roundViewer || survivalActive() || resimActive) + throw new Error("Edit through the room host; survival and replay editing are unavailable"); + if (!command || typeof command !== "object") throw new Error("Expected a workshop command"); + const { op } = command; + if (op === "inspect") return { room: "ow-" + (versusRoomName || sessionName), + revision: workshopRevision, map: workshopSnapshot(), + highlights: workshopHighlight, undo: workshopHistory.length, + units: { columns: gridCols, tileSize, floorY }, + players: players.map(p => ({ x: p.x, y: p.y, spawnX: p.spawnX })) }; + if (op === "highlight") { + if (typeof command.enabled !== "boolean") throw new Error("Supply enabled: true or false"); + workshopHighlight = command.enabled; + return workshopCommand({ op: "inspect" }); + } + if (command.revision !== workshopRevision) throw new Error("Map changed; inspect and use its revision"); + if (!["apply", "drop", "undo", "reset-round", "restart-level"].includes(op)) + throw new Error("Unknown workshop operation"); + let map; + if (op === "undo") { + if (!workshopHistory.length) throw new Error("Nothing to undo"); + map = workshopHistory[workshopHistory.length - 1]; + } else { + map = op === "apply" ? command.map : workshopSnapshot(); + if (op === "drop") map.pickups.push(command.item); + } + map = globalThis.__oskiewarValidateMap(map); + if (netSession) { + const session = netSession; + if (session.send({ t: "workshop", o: session.originUs }) === false) + throw new Error("The peer connection is not ready for editing"); + workshopTainted = true; + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + } + if (op === "undo") workshopHistory.pop(); + else if (!["reset-round", "restart-level"].includes(op)) { + workshopHistory.push(workshopSnapshot()); + if (workshopHistory.length > 20) workshopHistory.shift(); + } + workshopTainted = true; + workshopRevision++; + installWorkshopMap(map); + if (op === "reset-round" || op === "restart-level") + resetRound(runtime().monotonicUs, op === "restart-level"); + return workshopCommand({ op: "inspect" }); +} + +function installMapPickups(target, authored, type) { + target.length = 0; + for (const entry of authored) { + const x = tileCenterX(entry.col); + target.push({ + ...(type === "gun" ? { kind: entry.kind, amount: entry.amount, + cycle: Boolean(entry.cycle) } : {}), + ...(type === "saber" ? { kind: "LIGHT SABER" } : {}), + ...(type === "grenade" ? { amount: entry.amount } : {}), + x, y: terrainFloorAt(x) - 70, z: 0, + active: true, startsActive: true, respawnAt: 0, + }); + } +} + +function resetWorkshopMap() { + if (!workshopMap) return; + if (!localMapInstalled && + (globalThis.__oskiewarWorkshopEnabled || globalThis.__oskiewarPublishedMap) && + !survivalActive() && !roundViewer && !resimActive) { + installWorkshopMap(workshopMap); + return; + } + const spawns = players.map(p => p.spawnX); + installWorkshopMap(workshopBase, true); + workshopMap = null; + workshopHistory = []; + workshopRevision++; + currentMapName = "HALFPIPE"; + currentMapId = "halfpipe"; + if (versusLane() || survivalActive()) players.forEach((p, i) => { p.spawnX = spawns[i]; }); +} + + +// Physics remains an exact 60 Hz story. Rendering may happen between those +// authored instants—especially during slow motion—so retain the state that +// entered each tick and blend only presentation coordinates toward the state +// that left it. The authoritative objects are restored immediately after +// paint; collision, replay capture and networking never see interpolated data. +let renderPreviousState = null; +const renderInterpolationFields = { + player: ["x", "y", "z", "headRoll", "crouchBlend"], + bullet: ["x", "y", "z", "previousX", "previousY"], + grenade: ["x", "y", "z", "previousX", "previousY", "blastRadius"], + ball: ["x", "y", "z", "rotation"], + detached: ["x1", "y1", "z1", "x2", "y2", "z2"], + debris: ["x", "y", "z"], + camera: ["width", "roll", "perspective", "fov"], + cameraPoint: ["x", "y", "z"], +}; + +function renderInterpolationObjects() { + return [ + ...players.map((object) => [object, renderInterpolationFields.player]), + ...bullets.map((object) => [object, renderInterpolationFields.bullet]), + ...grenades.map((object) => [object, renderInterpolationFields.grenade]), + ...balls.map((object) => [object, renderInterpolationFields.ball]), + ...detachedParts.map((object) => [object, renderInterpolationFields.detached]), + ...impacts.flatMap((impact) => (impact.debris || []) + .map((object) => [object, renderInterpolationFields.debris])), + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]; +} + +function captureRenderInterpolationState() { + renderPreviousState = new Map(); + for (const [object, fields] of renderInterpolationObjects()) + renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +// A camera snap is an edit, not motion. If it happens inside a simulation +// tick, replace the retained camera sample too; otherwise fractional-speed +// paint blends the new close-up with the old wide shot and frame one lands +// halfway between them. +function collapseRenderCameraInterpolation() { + if (!renderPreviousState) return; + for (const [object, fields] of [ + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]) renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +function beginRenderInterpolation(alpha) { + const amount = clamp(Number(alpha), 0, 1); + if (!renderPreviousState || amount >= .999) return () => {}; + const restore = []; + for (const [object, fields] of renderInterpolationObjects()) { + const previous = renderPreviousState.get(object); + if (!previous) continue; + for (const field of fields) { + if (!Number.isFinite(previous[field]) || !Number.isFinite(object[field])) + continue; + restore.push([object, field, object[field]]); + object[field] = lerp(previous[field], object[field], amount); + } + } + cameraDoll.dirty = true; + return () => { + for (const [object, field, value] of restore) object[field] = value; + cameraDoll.dirty = true; + }; +} +let padSnapshots = [null, null]; +// The pad each fighter actually feels. A bot writes its synthesized presses +// here, so the HUD, the debug read-out, the replay and the physics all read +// bot input off the same wire as a hand on a controller. +let inputPads = [null, null]; +let startedAt = 0; +let roundStartedAt = 0; +let lastSimAt = 0; +let roundElapsedUs = 0; +const fightHitMarks = []; +globalThis.__oskiewarFightHitMarks = fightHitMarks; +let lastCountdownSecond = -1; +// The intro's own clock: which "3, 2, 1" second last rang, and whether the +// round-open accent has fired. -1 means the accent is still owed. +let lastIntroSecond = 0; +// The scored tail's clocks: the next heartbeat of the killcam dwell, and +// whether the result card has had its sting. +let resultPulseAt = 0; +let resultLaughAt = 0; +let resultLaughStep = 0; +let resultCardStung = false; +const resultReactionPrevious = [[], [], []]; +let roundOverAt = 0; +let roundResult = ""; +// How long a reel holds the opening matchup card. Long enough to read two +// names on a phone, short enough that the fight plays under a clean frame. +const REEL_MATCHUP_SECONDS = 2.6; +let matchOver = false; +let roundCause = ""; +let deathCinematic = null; +let impactHitboxesUntil = 0; +let nextPowerupAtUs = powerupIntervalUs; +let powerupSequence = 0; +let acFeed = {}; +// Pal select is retired: you are your own handle, so there is nobody to pick, +// and the dummy is already the default opponent. The whole two-step screen +// stays behind this one flag rather than being deleted, because the entry UI +// is still moving and this is the shape we may want to compare against. Flip +// it true and the wheel comes back exactly as it was. +const PAL_SELECT = false; +// The frame recorder remains intact for future review tooling, but replay is +// not part of the match flow. One flag restores the viewer, its controls and +// its offer together; production currently moves directly through results. +const INSTANT_REPLAY = false; +let selecting = false; +// Self-play is a harness mode: both fighters run the bot, no pad can enter or +// leave it, and rounds roll over on their own. +let selfPlay = false; +// Which kind the round on screen was opened against. Training and the bot door +// seat the same fighter with the same brain now, so `players[1].bot` can no +// longer say which door a round came through — and only one of those doors is +// allowed on the wire. +let fightOpponent = ""; +// Survival uses the round clock only as an elapsed-time source. Height is the +// score, the lava line is the opponent, and a run ends only when the runner +// touches it or reaches the final authored deck. +const survivalLavaStart = floorY + 360; +const survivalLavaBaseSpeed = 52; +let survivalStartedAt = 0; +let survivalLavaY = survivalLavaStart; +let survivalHeight = 0; +let survivalBestHeight = 0; +let survivalPeakLevel = 0; +let hudLeftPad = 0; +// The title is also the attract screen. Half of sessions get the quiet, +// cross-legged tableau; half get a standing face-off. Both remain still so +// the wordmark stays readable until the player asks the fight to begin. +// Hashing the already-created round name keeps the split stable for a visit +// without spending a second Math.random call (reel seeding relies on one). +let titleAttractMode = "still"; +// What a fresh session is dealt. @jeffrey, playtesting: "can we switch dummy +// to bot now?" — the free front door was a post that never hit back, so a solo +// visit was target practice rather than a fight. `trainingbot` is that same +// fighter with the bot's brain switched on, carrying its own kind name so the +// wire gate in `roundIsTimed` can still tell the free door from the one a +// handle buys. The inert dummy and the spider stay reachable by name, because +// damage, geometry and sync work all want a target that stands still. +let trainingOpponent = ""; +function trainingOpponentKind() { + const requested = String(globalThis.__oskiewarOpponent || "").toLowerCase(); + if (requested === "dummy" || requested === "spiderdummy" || + requested === "trainingbot") return requested; + // One kind for the whole visit: a title returned to after a knockout must + // not re-deal the opponent out from under the player. The web's empty + // door spars with the bot; the console's stands a dummy up instead — + // @jeffrey on the Xbox, 2026-09-20: "make it so we can play against dummy + // as opposed to bot ... the dummy goes away and gets replaced by players" + // (a second local controller promotes that chair through + // `updateLocalVersus`). An inert dummy is also one bot brain fewer in the + // console's interpreted sim. + if (!trainingOpponent) trainingOpponent = + globalThis.__oskiewarVersusCapable === true ? "trainingbot" : "dummy"; + return trainingOpponent; +} +// The versus lane's room. One name for the whole visit — the shell writes it +// into the address bar, the QR encodes it, and a friend opening that address +// takes the second chair. A visit that arrived THROUGH such an address and +// found nobody hosting claims the name instead, so a shared link survives +// its sender refreshing. +let versusRoomName = ""; +let versusNextAt = 0; +let versusRivalName = ""; +// The raw handle the seat last offered, kept beside the name it produced. The +// comparison that decides whether to re-dress has to be against this and not +// against the result: an anonymous arrival offers "", which is falsy, so the +// old guard skipped the re-dress entirely and left the PREVIOUS player's name +// and colors on the chair. Leaving and rejoining inside the 2.5 s grace is +// exactly how somebody ends up wearing a stranger. +let versusRivalOffered = ""; + +// The handle riding the freshest pad frame, cleaned to the shape a nameplate +// and the state schema both accept. One reader, so the re-dress test and the +// dressing itself can never disagree about what was offered. +function versusOfferedName() { + return String(globalThis.__oskiewarRemotePad?.name || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); +} +// How long an empty wire keeps the rival seated. Long enough to ride out a +// dropped packet or a phone switching antennas, short enough that a closed +// tab reads as "they left" while the fighter is still warm. +const versusChallengerGraceMs = 2500; +// The fight streams faster than a grandstand needs, because for the +// challenger this feed IS the game — their own presses come back to them +// as pictures through it. +const versusSnapshotIntervalMs = 33; +// How long a visitor who arrived through a shared address waits for a host +// before deciding the room is theirs to claim. +const versusClaimAfterUs = 2500000; +let versusClaimArmedAt = 0; +let versusInputSeq = 0; +let versusInputLastSent = ""; +let versusInputNextAt = 0; +let versusInputMinNextAt = 0; +// The bridge a claiming visitor stepped off of, kept so a lost publisher +// race can walk them right back on as a challenger. +let versusFallbackBridge = null; + +let versusSeatGraceUntil = 0; + +function versusChallengerFresh() { + // In a rollback fight the rival's presence is the session itself; the + // sim must not read the wall clock to decide whether the fight goes on. + if (netSession) return true; + // And for a moment after one ends badly, while the rival is changing lanes. + if (Date.now() < versusSeatGraceUntil) return true; + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return false; + return Date.now() - remote.at < versusChallengerGraceMs; +} + +// The remote rival's pad, read off the same wire shape a hand or a bot +// writes. A stale global answers neutral rather than holding the last +// press — a vanished friend must drop their guard, not run into a corner +// forever. +// The seat whoever is at this screen is holding. Seat one everywhere except a +// rollback fight's challenger, who plays the second fighter — their keycap +// legend, touch discs and move names must follow their own hands rather than +// lighting up when the other player presses something. +const localSeat = () => netSession ? netSession.seat : 0; +const localPad = () => inputPads[localSeat()] || + { connected: true, down: [], leftX: 0, leftY: 0 }; + +function remotePadSnapshot() { + const remote = globalThis.__oskiewarRemotePad; + const fresh = remote && Number.isFinite(remote.at) && + Date.now() - remote.at < versusChallengerGraceMs; + if (!fresh) return { connected: true, down: [], leftX: 0, leftY: 0, + rightX: 0, rightY: 0 }; + return { connected: true, + down: Array.isArray(remote.down) ? remote.down.slice() : [], + leftX: Number(remote.leftX) || 0, leftY: Number(remote.leftY) || 0, + rightX: 0, rightY: 0 }; +} +const selectionReady = [false, false]; +const selectionPrevious = [[], []]; +let selectionStep = 0; +let selectionCursor = 0; +let windMph = 0; +let windDirection = 1; +let windAcceleration = 0; +let windTargetMph = 0; +let windTargetDirection = 1; +let nextWindChangeAt = 0; +let replay = null; +// Round names in the order they were minted, each with the demo tick it was +// minted on. A rollback can rewind past a round rollover, so this ledger has +// to rewind with it — `replay.roundIds` is derived from it rather than being +// appended to directly, which is what keeps a re-simulated rollover from +// filing the same round twice. +let replayRoundMarks = []; +// The frame a finished round is waiting to be confirmed past before it is +// filed. -1 when nothing is waiting. See saveRoundReplay. +let replayPendingSaveFrame = -1; +let replayLastCommand = [-1, -1]; +let replayNextCheckpointAt = 0; +let matchName = ""; +let seriesName = ""; +// The app run's own name, distinct from any round or series: rounds are born +// and buried every thirty seconds, but the console sitting on the title screen +// is still a running program somebody may want to attach to. One name from +// boot to quit, drawn beside the debug bug, carried as sessionId in every live +// frame, and used as the relay room while no timed round is publishing. +let sessionName = ""; +let previousRoundName = ""; +let roundReplayFrames = []; +let roundReplayLastAt = 0; +let instantReplay = null; +let replayOfferPrevious = []; +let shellMode = "MENU"; +let gameplayStarted = false; +let shellPrevious = []; +let startInputPending = false; +let shellRawPrevious = []; +// Whether the stick was already leaned last frame, so a held lean reads as +// one gesture at the title rather than a machine-gun of entries. +let shellStickLive = false; +// Training teaches for two and a half minutes once the title lifts. This is +// session time, not round time: a knockout or a visit back to the title must +// not restart onboarding that the player has already outgrown. +let dummyGuideStartedAt = null; +// Unset is null, never -1: the console's monotonic clock can read negative +// (App.cpp overflows int64 converting QPC ticks past ~10 days of uptime), +// and a >= 0 sentinel then swallows every legitimate timestamp. +let titleTransitionAt = null; +// The wordmark is a toy: every letter of "oskiewar" and of "start" keeps its +// own swell and shudder, and the prompt keeps one shared bounce the letters +// take in turn. Paint owns these because they are pointer feel, not state. +const titleToys = []; +const promptToys = []; +let promptBounce = 0; +let titleToyAt = -1; +// Which letter the pointer currently owns. The letters never hold still — each +// one bobs and drifts a good fraction of its own width — so a bare hit test +// against a moving cell hands a resting cursor a letter that slides out from +// under it and back several times a second. That reads as a flickering glyph, +// a cursor blinking between two shapes, and a hover tick that will not stop. +// Holding the grab until the pointer leaves a cell grown by the letter's own +// travel is the same hysteresis the camera uses at the safe-zone edge. +let titleGlyphHot = -1; +let navigationPrevious = [[], []]; +// Remote render experiment flags. An attached agent can flip these through +// the relay — the shell merges oskiewar:flags into the global and the paint +// below reads it once per frame — so what each layer costs can be measured +// on the machine that is actually struggling, not a workstation imitating +// it. Every flag missing means the full picture; xbox/tools/oskiewar-ablate +// walks them and reads the price back out of the live fps telemetry. +let renderFlags = {}; +// Temporary live combat inspector. Keep this explicit so the production view +// can return to a clean presentation without changing combat geometry. +let debugHitboxes = false; +// The frame meter, the way a training mode has one: one pip per simulation +// frame, colored by what the fighter was DOING on that frame, so a player can +// read an exchange back instead of guessing at it. +// +// Street Fighter 6's legend, kept because it is the one people already know: +// green is startup, red is active, blue is recovery, yellow is stun. What +// those mean HERE is a question about this game rather than that one, and the +// honest answers are not all flattering: +// +// Startup, active and recovery come from the same integer-frame table as +// the collision sampler. A landed strike remains in recovery until its +// original action deadline. Stun still takes precedence over the action. +// +// Shielding gets a color of its own because holding a shield is a stance in +// this game rather than a reaction, and folding it into stun would say +// something false about who is in control. +const frameMeterLength = 120; +const frameMeterStates = { + neutral: { ink: [92, 100, 124], label: "" }, + startup: { ink: [86, 226, 120], label: "STARTUP" }, + active: { ink: [255, 66, 72], label: "ACTIVE" }, + recovery: { ink: [72, 150, 255], label: "RECOVERY" }, + stun: { ink: [255, 208, 64], label: "STUN" }, + shield: { ink: [186, 118, 255], label: "SHIELD" }, + airborne: { ink: [54, 62, 86], label: "" }, +}; +const frameMeters = [[], []]; +// What a fighter is on this exact frame, in one word. Ordered by what beats +// what: being stunned outranks anything you were trying to do, and a swing +// outranks the shield you are no longer really holding. +function frameMeterState(player, now) { + if (!player.alive) return "neutral"; + if (now < player.hitStunUntil) return "stun"; + if (player.attackKind && now < player.attackUntil) { + if (player.attackHit) return "recovery"; + return meleeFrame(player, now).phase; + } + if (player.blocking) return "shield"; + if (!player.grounded) return "airborne"; + return "neutral"; +} +function recordFrameMeter(now) { + if (!debugHitboxes) return; + for (const player of players) { + const meter = frameMeters[player.pad]; + meter.push(frameMeterState(player, now)); + if (meter.length > frameMeterLength) meter.shift(); + } +} +// One FIGHT_DEBUG_PERF telemetry line per debug toggle, so the console's log +// can prove the fps row drew without narrating every frame. +let debugPerfReported = false; +let nextInputDebugAt = 0; +let frameTelemetry = []; +let frameTelemetryFlushAt = 0; +let lastPaintAt = 0; +let displayFps = 0; +let liveSequence = 0; +let liveNextAt = 0; +// The session room ticks slower than a round room: nobody spectates a title +// screen at 20Hz, and an agent reading fps is happy at four. +const sessionSnapshotIntervalUs = 250000; +let sessionNextAt = 0; +// Which round the session room was last told about, so the hand-off frame +// goes out exactly once per round instead of flapping the native shell's +// single publisher socket every tick. +let sessionAnnouncedRound = ""; +let spectatorQr = null; +// Encoding a code costs about 59ms and is the whole 50-100ms tail in the +// frame histogram: it ran at every round reset, for a URL that changes once +// per round. Same URL, same code -- so keep the last one. +let spectatorQrUrl = ""; +let spectatorQrCache = null; +function spectatorCode(url) { + if (typeof qrcode !== "function") return null; + if (url === spectatorQrUrl && spectatorQrCache) return spectatorQrCache; + spectatorQrUrl = url; + spectatorQrCache = qrcode(url, { errorCorrectLevel: 1 }); + return spectatorQrCache; +} + +let roundViewer = null; +let roundViewerStop = null; +let roundViewerMode = ""; +// The chair-holder's own View presses, remembered across viewer ticks — the +// debug toggle needs an edge, and the host's echo never carries system keys. +let viewerSystemPrevious = []; +let roundViewerStatus = "CONNECTING"; +let roundViewerDemo = null; +let roundViewerDemoStartedAt = 0; +// When the last authoritative LIVE frame landed, on the WALL clock in +// milliseconds. Wall, not sim: the frame arrives in a socket callback, where +// the sim clock is not running, and comparing an arrival stamped by one clock +// against a deadline read from the other drifted by every dropped tick until +// the coast fuse below stopped tripping at all. +let roundViewerLiveAt = 0; +// The grandstand's playout buffer. Wire frames are no longer painted the +// instant they land — they queue here with their arrival time and the render +// reads a clock held a little behind the newest of them, so every frame is +// drawn by interpolating the two that bracket it. Extrapolation is what is +// left when the buffer runs dry, not the normal case: a body that coasts on +// stale velocity walks through the floor and then snaps back, which is the +// whole of what "glitchy" meant on a guest screen. +let roundViewerFrames = []; +// The playout clock, in the same wall milliseconds the queue is stamped in. +// It advances on the simulation's own dt so the picture moves at the sim's +// rate, and leans gently toward (now − delay) so it neither runs dry nor +// falls further and further behind. +let roundViewerPlayoutMs = 0; +// How far behind the newest arrival the playout clock sits. One wire frame +// plus the jitter we have actually measured — enough that the next frame is +// usually already in hand when the clock reaches the last one. +let roundViewerDelayMs = 70; +// Wire health, measured from arrivals alone: mean gap, jitter (mean absolute +// deviation of the gap), and the share of sequence numbers that never came. +// These are what the connection meter reads, and what sizes the delay above. +let roundViewerGapMs = 33; +let roundViewerJitterMs = 0; +let roundViewerLossPct = 0; +let roundViewerSeq = -1; +let roundViewerSeqHeard = 0; +let roundViewerSeqExpected = 0; +let roundViewerImpactTick = -1; +// The newest impact number this watcher has spawned. The host repeats a mark +// on every frame it is still burning, so this is what tells a repeat from a +// new spark. +let roundViewerImpactId = 0; +// Whether the round being watched has a clock. The wire says so; the watcher +// must not answer from its own `roundIsTimed()`, which reads a local fight +// that is not happening. +let roundViewerTimed = true; +let livePublishFailed = false; + +// Match names are public URLs and must not collide, so they take real +// entropy — but a recorded round has to reproduce, and the ball kind is +// hashed from the series name and carries radius and mass. So the entropy is +// drawn once per match, carried in the demo, and every name after it falls +// out deterministically. +let nameSeed = 1; +function seedNames(seed) { + nameSeed = (seed >>> 0) || 1; +} +function nameRandom() { + nameSeed = (nameSeed + 0x6d2b79f5) >>> 0; + let value = nameSeed; + value = Math.imul(value ^ (value >>> 15), value | 1); + value ^= value + Math.imul(value ^ (value >>> 7), value | 61); + return ((value ^ (value >>> 14)) >>> 0) / 4294967296; +} + +function pronounceableMatchName() { + const onsets = ["b", "d", "f", "g", "k", "l", "m", "n", "p", "r", + "s", "t", "v", "z", "ch", "sh", "th"]; + const consonants = "bdfgklmnprstvz"; + const vowels = "aeiou"; + const onset = onsets[Math.floor(nameRandom() * onsets.length)]; + const vowel = vowels[Math.floor(nameRandom() * vowels.length)]; + const middle = consonants[Math.floor(nameRandom() * consonants.length)]; + const ending = (vowels + "y")[Math.floor(nameRandom() * (vowels.length + 1))]; + return onset + vowel + middle + middle + ending + + Math.floor(nameRandom() * 1000); +} + +function demoTick(now) { + return replay ? Math.max(0, Math.round((now - replay.startedMonotonicUs) / + replayTickUs)) : 0; +} + +function trackMatchStarted() { + if (!roundIsTimed() || typeof analytics !== "function") return; + const device = typeof capabilities === "function" ? capabilities() : {}; + const platform = String(device.platform || "").toLowerCase(); + const surface = platform === "xbox-uwp" || platform === "xbox" + ? "xbox" + : platform === "macos" ? "macos" : "web"; + const family = String(device.inputFamily || "").toLowerCase(); + analytics("match_started", { + source_system: "browser", + surface, + input_family: ["gamepad", "keyboard", "xbox"].includes(family) + ? family + : "unknown", + opponent_type: selfPlay ? "self-play" + : players[1].bot ? "bot" + : players[1].npc ? "dummy" : "local-player", + }); +} + +function startReplay(now) { + const run = runtime(); + if (!roundIsRecorded()) { + seriesName = ""; + matchName = ""; + previousRoundName = ""; + // Spiderdummy training carries one plain ball; there is no board to + // carry anymore. + matchBallType = "soccer"; + replay = null; + spectatorQr = null; + return; + } + seedNames(Math.floor(Math.random() * 4294967296)); + const nameSeedUsed = nameSeed; + seriesName = pronounceableMatchName(); + // The deal owns the ball in a versus fight — both seats set it from the same + // word — so rolling a series ball here would put the two of them in + // different fights. + if (!versusActive()) matchBallType = seriesBallType(seriesName); + matchName = ""; + previousRoundName = ""; + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = { + format: "ac.oskiedemo", version: 1, game: "oskiewar", + simulation: "oskiewar-physics-1", tickRate: 60, + matchId: "ow-" + seriesName, matchName: seriesName, + seriesId: "ow-" + seriesName, seriesName, roundIds: [], + recordedDisplay: { + width: Number(run.width) || viewWidth(), + height: Number(run.height) || viewHeight, + aspectRatio: (Number(run.width) || viewWidth()) / + Math.max(1, Number(run.height) || viewHeight), + surfaceWidth: Number(run.surfaceWidth) || Number(run.width) || viewWidth(), + surfaceHeight: Number(run.surfaceHeight) || Number(run.height) || viewHeight, + refreshHz: Number(run.refreshHz) || Number(run.measuredHz) || 0, + }, + startedAt: run.unixMs || 0, startedMonotonicUs: now, + // Which room this was played in, so a room can be asked for its own + // history. Only a versus fight has one: in the broadcast lane each round + // IS its own room and the round id already says so. + ...(versusActive() && versusRoomName + ? { roomId: "ow-" + versusRoomName, roomName: versusRoomName } : {}), + // A versus round runs until somebody falls, so a re-run must not be handed + // a clock the original never had. Older demos carry no flag and were all + // timed, which is what the reader below assumes. + timed: roundIsTimed(), + nameSeed: nameSeedUsed, ballType: matchBallType, + map: skateparkMap ? "skatepark" : "station", + fighters: players.map((player) => player.name), + nations: players.map((player) => player.nation || ""), + commands: [], events: [], checkpoints: [], rounds: [], impacts: [], + }; + replayLastCommand = [-1, -1]; + replayNextCheckpointAt = now; + // The sequence counter survives the match: every round room is born empty, + // so a fresh room takes any first number — but the session room lives from + // boot to quit, and the relay silently drops a frame whose sequence ever + // runs backwards. One counter, never rewound, serves them both. + liveNextAt = now; + livePublishFailed = false; + spectatorQr = null; + trackMatchStarted(); +} + +// Whether the round on screen is on the wire: clocked, named, recorded, +// published, counted. The free training round never is, whatever its opponent +// does. An opponent with no bot AI used to be a safe stand-in for "nobody is +// watching this" — the day training started sparring back, that stand-in would +// have put every anonymous session on a series, a demo and a live feed, so the +// gate reads the door the round came through instead. The versus lane is off +// this wire too, by choice rather than freedom: it runs one room, one stream, +// no series and no demo, because the shared URL must keep meaning this fight. +function roundIsTimed() { + // A watcher is answering about somebody else's round. Everything below reads + // this machine's own fight, which for a watcher is not running — and a + // watcher that has not been served a frame yet has no round to report at + // all, so it must not paint a countdown for one. A stored demo still falls + // through: it IS a local re-run, and it was a timed round when recorded. + if (roundViewer && roundViewerMode !== "DEMO") + return roundViewerMode === "LIVE" && roundViewerTimed; + if (survivalActive()) return false; + // Training runs without a clock — except under the reel harness, where a + // scripted dummy bout wants the full round apparatus (clock, demo, result + // card) so it can be recorded and repainted like any match. + if (globalThis.__oskiewarTimedTraining === true) return true; + // Every round that reaches a re-simulation was a timed, recorded round. + if (resimActive) return resimTimed; + if (fightOpponent === "trainingbot" || versusLane()) return false; + return !(players[1].npc && !players[1].bot); +} + +// This machine is the one that writes a versus fight down. Both seats +// simulate it, but the record needs exactly one author or the two would race +// for the same round id — the same reason only the host narrates the stream. +const versusRecorder = () => + versusActive() && (!netSession || netSession.seat === 0); + +// Which rounds leave a record. Timed rounds always did, and a versus fight +// does now: a room's history is the point of the room. The clock was never +// what made a round worth keeping, it was just the only lane that had one. +// The public demo/relay contract has two seats. Local three-player battles +// retain their in-memory round replay without publishing incompatible demos. +const roundIsRecorded = () => !freeForAll() && (roundIsTimed() || versusRecorder()); + +// The frame numbers the debug HUD already prints, packed for the wire. Only +// stages the host actually measured go in — a console reports a real frame and +// present time, a browser reports its rAF span and its own paint cost and +// nothing else — because a zeroed field on a public feed reads as a stall +// rather than as silence. Two decimals is the resolution AC_NATIVE_PROFILE +// prints at, and it holds the whole block under sixty bytes. +function spectatorPerf(run) { + const perf = { fps: Math.round(displayFps || 0) }; + const frameMs = Number(run.frameMs) || 0; + const renderMs = Number(run.renderCpuMs) || 0; + const hz = Number(run.refreshHz) || 0; + if (frameMs) perf.frameMs = Math.round(frameMs * 100) / 100; + if (renderMs) perf.renderMs = Math.round(renderMs * 100) / 100; + if (hz) perf.hz = Math.round(hz); + return perf; +} + +function spectatorState(now, nextRoundId = "") { + const run = runtime(); + const introAge = now - roundStartedAt; + const phase = instantReplay ? "replay" : matchOver ? "match" + : roundResult ? "round" : selecting ? "select" + : introAge < roundIntroDurationUs() ? "intro" : "fight"; + const timed = roundIsTimed(); + // An untimed frame reports zero rather than null: the relay reads every + // remainingMs as an integer, and the title screen's attract fight has no + // clock to misreport. + const remainingMs = roundResult || !timed ? 0 : Math.max(0, + Math.round((roundDurationUs - roundElapsedUs) / 1000)); + const state = { + format: "ac.oskiewar.live", version: 1, seq: liveSequence++, + map: { id: currentMapId, name: currentMapName, highlights: workshopHighlight, + ...(workshopMap ? { workshop: workshopMap } : {}) }, + at: run.unixMs || 0, phase, + course: skateparkMap ? "skatepark" : "station", + ropes: skateRopes.map((rope) => rope.nodes.map((node) => + [node.x, node.y, node.px, node.py].map((value) => Math.round(value * 100) / 100))), + previousRoundId: previousRoundName ? "ow-" + previousRoundName : "", + fighters: players.map((player) => ({ + // The title's still variant seats a fighter with no name yet, and the + // relay turns away a nameless one — so the empty seat gets called what + // it is rather than costing the whole frame. + name: player.name || "NOBODY", nation: player.nation || "", color: player.color, + x: player.x, y: player.y, + z: player.z, vx: player.vx, vy: player.vy, vz: player.vz, + skateboard: player.skateboard, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, + facing: player.facing, alive: player.alive, + grounded: player.grounded, ducking: player.ducking, + sinking: now < player.sinkUntil, + blocking: player.blocking, score: player.score, + roundWins: player.roundWins, attack: player.attackKind || "", + removedParts: player.removedParts.slice(), + // Three numbers the grandstand already knew how to read and had never + // been sent. `applyRoundViewerState` reconstructs the strike spark, the + // limb burst and the swing's real arc from them; without them a live + // watcher saw a body come apart in silence and every swing froze at one + // canned mid-pose. Two decimals is all a fade needs. + hit: Math.round((player.hit || 0) * 100) / 100, + blockFlash: Math.round((player.blockFlash || 0) * 100) / 100, + attackTicks: player.attackKind + ? Math.max(0, Math.round((now - player.attackStartedAt) / replayTickUs)) + : 0, + })), + // Shots and lobs, the fight's projectiles. These used to stay home: a + // watcher — and a challenger on an older build — watched fighters flinch + // and die with nothing visible in the air between them. Flat number rows + // rather than objects, because the relay caps a frame at 8 KiB and 24 + // rounds plus 12 grenades named longhand is most of that cap on its own. + // Velocity rides along so the playout buffer can carry a round smoothly + // between arrivals instead of stepping it 140 units at a time. + shots: bullets.filter((shot) => shot.life > 0).map((shot) => [ + Math.round(shot.x), Math.round(shot.y), Math.round(shot.z), + Math.round(shot.previousX ?? shot.x), + Math.round(shot.previousY ?? shot.y), + Math.round(shot.vx || 0), Math.round(shot.vy || 0), shot.owner | 0, + (shot.spit ? 1 : 0) | (shot.heavy ? 2 : 0) | (shot.rubber ? 4 : 0)]), + // The host's own impact track. A watcher was reconstructing sparks from + // the flag edges it could see, which covers a punch landing and nothing + // else: a ricochet, a spit splat, a ground pound's crater and a grenade's + // own blast raise no flag on any fighter, so they happened in silence on + // every screen but the host's. Newest twelve, each with the number that + // says whether a watcher has already seen it, and its remaining life so + // it is spawned at the age it really is. + impacts: impacts.filter((mark) => mark.life > 0).slice(-12) + .map((mark) => [mark.id | 0, Math.round(mark.x), Math.round(mark.y), + Math.round(mark.z), Math.round((mark.duration || .3) * 1000), + Math.round(Math.max(0, mark.life) * 1000), + (mark.death ? 1 : 0) | (mark.explosion ? 2 : 0)]), + lobs: grenades.filter((lob) => lob.alive).map((lob) => [ + Math.round(lob.x), Math.round(lob.y), Math.round(lob.z), + Math.round(lob.vx || 0), Math.round(lob.vy || 0), lob.owner | 0, + (lob.rocket ? 1 : 0) | (lob.exploding ? 2 : 0), + Math.round(lob.blastRadius || 0), + Math.round(Math.max(0, lob.fuse || 0) * 1000)]), + ball: { active: ball.active, x: ball.x, y: ball.y, + z: ball.z, radius: ball.radius, type: ball.type, mass: ball.mass }, + balls: balls.map((item) => ({ active: item.active, x: item.x, + y: item.y, z: item.z, radius: item.radius, type: item.type, + mass: item.mass, heldBy: item.heldBy, + spawnOwner: item.spawnOwner })), + camera: { x: cameraCenter, y: cameraCenterY, width: cameraWidth, + position: { ...cameraDoll.position }, target: { ...cameraDoll.target }, + perspective: cameraDoll.perspective, fov: cameraDoll.fov, + roll: cameraDoll.roll }, + wind: { direction: windDirection, mph: windMph }, + round: { remainingMs, timed, result: roundResult || "", + cause: roundCause || "", + // How long this round has been running, intro included. A timed round + // could be reconstructed from `remainingMs` alone, but the versus lane + // reports zero there — and a watcher deriving its clock from that zero + // pinned itself thirty seconds in the past, which is why it never + // counted a round off and never played an intro card. + elapsedMs: clamp(Math.round((now - roundStartedAt) / 1000), 0, 3600000) }, + // @jeffrey plays oskiewar.com in Edge on an Xbox, where there are no + // devtools and the console's own AC_NATIVE_PROFILE line only reaches a + // Device Portal on the same LAN. The live socket is the one channel that + // already leaves the box, so the frame rate rides out with the round and + // can be read from anywhere the round can. + perf: spectatorPerf(run), + }; + // A title-screen frame has no series, no round and no demo to link — the + // relay rejects an id it cannot parse, so an empty name stays off the wire + // entirely rather than riding out as "ow-". + if (seriesName) state.seriesId = "ow-" + seriesName; + if (matchName) { + state.roundId = "ow-" + matchName; + state.replayUrl = "/api/oskiewar-replays?id=ow-" + matchName; + } + if (sessionName) state.sessionId = "ow-" + sessionName; + if (nextRoundId) state.nextRoundId = nextRoundId; + return state; +} + +function publishSpectator(now, { target = matchName, nextRoundId = "", + force = false } = {}) { + if (!roundIsTimed() || !target || livePublishFailed || + typeof publishLive !== "function" || + (!force && now < liveNextAt)) return; + liveNextAt = now + liveSnapshotIntervalUs; + try { + publishLive("ow-" + target, + JSON.stringify(spectatorState(now, nextRoundId))); + } catch (error) { + // A native host with an older room-ID contract must never take down play. + // Disable only spectator publishing until the next match/host upgrade. + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// The session channel. Rounds publish their own rooms, but the app run itself +// keeps one room under its own name so an agent has somewhere to attach while +// nothing is being scored — the title screen included. It runs only while the +// debug bug is lit: every anonymous visitor idling on oskiewar.com would +// otherwise claim one of the relay's 128 rooms, and this channel exists for a +// maintainer who asked for it, not for an audience. While a timed round is on +// the wire the session room instead gets exactly one frame naming that round, +// which both points any watcher at the fight and retires this room's publisher +// so the native shell's single socket is free to follow. +function publishSession(now) { + if (freeForAll() || (!debugHitboxes && !globalThis.__oskiewarWorkshopEnabled) || + !sessionName || livePublishFailed || + typeof publishLive !== "function") return; + const liveRound = roundIsTimed() && matchName ? matchName : ""; + if (liveRound) { + if (sessionAnnouncedRound === liveRound) return; + sessionAnnouncedRound = liveRound; + try { + publishLive("ow-" + sessionName, + JSON.stringify(spectatorState(now, "ow-" + liveRound))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } + return; + } + sessionAnnouncedRound = ""; + if (now < sessionNextAt) return; + sessionNextAt = now + sessionSnapshotIntervalUs; + try { + publishLive("ow-" + sessionName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +function inputCommand(pad) { + const input = quantizedInput(pad); + let mask = 0; + if (input.horizontal < 0) mask |= 1; + if (input.horizontal > 0) mask |= 2; + if (input.vertical > 0) mask |= 4; + if (input.vertical < 0) mask |= 8; + for (let index = 4; index < replayButtons.length; index++) + if (pad.down.includes(replayButtons[index])) mask |= 1 << index; + return mask; +} + +function recordReplayCommands(now, inputs = padSnapshots) { + if (!replay) return; + for (let pad = 0; pad < players.length; pad++) { + const command = players[pad].npc && !players[pad].bot + ? 0 : inputCommand(inputs[pad]); + if (command !== replayLastCommand[pad]) { + replay.commands.push([demoTick(now), pad, command]); + replayLastCommand[pad] = command; + } + } +} + +function replayFlags(player) { + // Bit 12 carries which way the fighter faces. Older demos lack it, so a + // replay treats "no facing bits" as "guess from velocity" — bit 13 marks + // that the pair below is real rather than an old demo's zero. + return (player.alive ? 1 : 0) | (player.grounded ? 2 : 0) | + (player.ducking ? 4 : 0) | (player.blocking ? 8 : 0) | + [...limbParts, "torso"].reduce((flags, part, index) => + flags | (hasPart(player, part) ? 0 : 1 << (index + 4)), 0) | + (player.facing > 0 ? 4096 : 0) | 8192 | + (player.hit > .05 ? 16384 : 0) | (player.blockFlash > .05 ? 32768 : 0); +} + +function recordReplayCheckpoint(now, force = false) { + if (!replay || (!force && now < replayNextCheckpointAt)) return; + replayNextCheckpointAt = now + replayCheckpointUs(); + const values = [demoTick(now)]; + for (const player of players) values.push( + Math.round(player.x), Math.round(player.y), Math.round(player.z), + Math.round(player.vx), Math.round(player.vy), replayFlags(player), + player.score, player.roundWins); + values.push(Math.round(ball.x), Math.round(ball.y), Math.round(ball.z), + Math.round(ball.vx), Math.round(ball.vy), ball.active ? 1 : 0, + Math.round(cameraCenter), Math.round(cameraCenterY), Math.round(cameraWidth)); + // The full camera pose rides along so a replay can stand the lens exactly + // where the live pass stood it — re-deriving position from width parks the + // camera inside close shots and near-clips the bodies it came to frame. + values.push(Math.round(cameraDoll.position.x), + Math.round(cameraDoll.position.y), Math.round(cameraDoll.position.z), + cameraDoll.perspective || 0, cameraDoll.fov || 55, cameraDoll.roll || 0); + replay.checkpoints.push(values); + // Dense demos also carry every impact the fight spawned, so the repaint + // can put the sparks and debris back instead of only moving bodies. + if (replayCheckpointUs() < 100000) for (const impact of impacts) + if (!impact.recordedTick) { + impact.recordedTick = demoTick(now) + 1; + replay.impacts?.push([demoTick(now), Math.round(impact.x), + Math.round(impact.y), Math.round(impact.z || 0), + impact.death ? 1 : impact.explosion ? 2 : 0, + Math.round((impact.duration || .3) * 1000)]); + } +} + +function makeRoundReplayFrame(now) { + const poseTime = (now - startedAt) / 1000000; + return { + ropes: structuredClone(skateRopes), + players: players.map((player) => ({ + x: player.x, y: player.y, z: player.z, + vx: player.vx, vy: player.vy, vz: player.vz, + facing: player.facing, grounded: player.grounded, + ducking: player.ducking, alive: player.alive, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, skateboard: player.skateboard, + blocking: player.blocking, blockFlash: player.blockFlash, hit: player.hit, + attackKind: player.attackKind, + attackStartedOffset: player.attackStartedAt - now, + attackUntilOffset: player.attackUntil - now, + geometry: runnerWorldGeometry(player, poseTime), + })), + ball: { x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, + active: ball.active }, + balls: balls.map((item) => ({ x: item.x, y: item.y, z: item.z, + vx: item.vx, vy: item.vy, active: item.active })), + camera: { center: cameraCenter, centerY: cameraCenterY, width: cameraWidth }, + }; +} + +function captureRoundReplay(now, force = false) { + if (!INSTANT_REPLAY) return; + if (!force && now - roundReplayLastAt < instantReplayStepUs) return; + roundReplayLastAt = now; + roundReplayFrames.push(makeRoundReplayFrame(now)); + while (roundReplayFrames.length > instantReplayMaxFrames) + roundReplayFrames.shift(); +} + +const frameTelemetrySchema = ["us", "cameraX", "cameraY", "cameraWidth", + "dollX", "dollY", "dollZ", "targetX", "targetY", "targetZ", + "dollWidth", "roll", "p1x", "p1y", "p1z", "p1vx", "p1vy", + "p2x", "p2y", "p2z", "p2vx", "p2vy"]; + +function captureFrameTelemetry(now, force = false) { + if (netSilent || selecting || shellMode === "MENU") return; + const round = (value) => Math.round(Number(value || 0) * 100) / 100; + frameTelemetry.push([ + Math.round(now - roundStartedAt), round(cameraCenter), round(cameraCenterY), + round(cameraWidth), round(cameraDoll.position.x), round(cameraDoll.position.y), + round(cameraDoll.position.z), round(cameraDoll.target.x), + round(cameraDoll.target.y), round(cameraDoll.target.z), + round(cameraDoll.width), round(cameraDoll.roll), + ...players.flatMap((player) => [round(player.x), round(player.y), + round(player.z), round(player.vx), round(player.vy)]), + ]); + if (!force && now < frameTelemetryFlushAt) return; + telemetry("FIGHT_TRACE", JSON.stringify({ + format: "ac.oskiewar.frames", version: 1, round: "ow-" + matchName, + schema: freeForAll() ? [...frameTelemetrySchema, "p3x", "p3y", "p3z", "p3vx", "p3vy"] + : frameTelemetrySchema, frames: frameTelemetry, + })); + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; +} + +function applyRoundReplayFrame(frame, now) { + if (frame.ropes) skateRopes.splice(0, skateRopes.length, ...structuredClone(frame.ropes)); + for (let index = 0; index < players.length; index++) { + const player = players[index]; + const state = frame.players[index]; + for (const key of ["x", "y", "z", "vx", "vy", "vz", "facing", + "grounded", "ducking", "alive", "blocking", "blockFlash", "hit", + "attackKind", "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) player[key] = state[key]; + player.attackStartedAt = now + state.attackStartedOffset; + player.attackUntil = now + state.attackUntilOffset; + player.replayGeometry = state.geometry; + } + const frameBalls = frame.balls || [frame.ball]; + for (let index = 0; index < balls.length; index++) { + const state = frameBalls[index]; + if (!state) continue; + for (const key of ["x", "y", "z", "vx", "vy", "active"]) + balls[index][key] = state[key]; + } + cameraCenter = frame.camera.center; + cameraCenterY = frame.camera.centerY; + cameraWidth = frame.camera.width; +} + +function finishInstantReplay(now) { + if (!instantReplay) return; + applyRoundReplayFrame(instantReplay.endFrame, now); + for (const player of players) delete player.replayGeometry; + instantReplay = null; + roundOverAt = now; + replayOfferPrevious = padSnapshots[0]?.down?.slice() || []; +} + +// A replay is worth watching at the speed the eye needs, not the speed the +// clock kept. Frames already record what a hit looks like, so the playhead can +// read its own footage and slow itself into the action rather than being told +// where the action is — which means every replay already in the store gets +// this without being re-recorded. +function frameAction(frame) { + let action = 0; + for (const player of frame.players) { + if (!player.alive) action = Math.max(action, 1); + if (player.hit) action = Math.max(action, 1); + if (player.blockFlash > 0) action = Math.max(action, .7 * player.blockFlash); + // A swing that has started but not yet landed is the part worth stretching. + if (player.attackKind && player.attackUntilOffset > 0) + action = Math.max(action, .35); + } + return action; +} + +// Look ahead, so the ramp is already down by the time the punch arrives. A +// slowdown that begins on the frame of impact has missed the impact. +function replayActionCurve(frames) { + const raw = frames.map(frameAction); + return raw.map((_, index) => { + let peak = 0; + for (let at = index; at < Math.min(raw.length, index + replayActionLead); at++) + peak = Math.max(peak, raw[at] * (1 - (at - index) / replayActionLead * .35)); + return peak; + }); +} + +// One step of the speed ramp, kept pure so it can be tested and so the demo +// viewer can share it when its playhead learns to accumulate. Easing rather +// than snapping — and capping how far the speed may travel per second of real +// time — is what keeps a dense run of hits reading as one long stretch rather +// than a stutter. +function replayRampStep(speed, action, elapsedSeconds) { + const target = lerp(1, replaySlowest, clamp(action, 0, 1)); + return speed + (target - speed) * + Math.min(1, Math.max(0, elapsedSeconds) * replayRampPerSecond); +} + +function startInstantReplay(now) { + if (!INSTANT_REPLAY) return false; + if (roundReplayFrames.length < 2) return false; + const frames = roundReplayFrames.slice(); + instantReplay = { frames, cursor: 0, lastAt: now, paused: false, + previous: padSnapshots[0]?.down?.slice() || [], + action: replayActionCurve(frames), speed: 1, + endFrame: frames[frames.length - 1] }; + impacts.length = 0; + detachedParts.length = 0; + applyRoundReplayFrame(frames[0], now); + telemetry("ROUND_REPLAY", "start frames=" + frames.length); + return true; +} + +function updateInstantReplay(now, dt) { + if (!instantReplay) return; + const down = padSnapshots[0]?.down || []; + const pressed = (button) => down.includes(button) && + !instantReplay.previous.includes(button); + if (pressed("B")) { + finishInstantReplay(now); + return; + } + if (pressed("A")) instantReplay.paused = !instantReplay.paused; + if (pressed("ArrowLeft") || pressed("ArrowRight")) { + instantReplay.paused = true; + instantReplay.cursor += pressed("ArrowLeft") ? -15 : 15; + } + const elapsed = Math.max(0, now - instantReplay.lastAt) / 1000000; + instantReplay.speed = replayRampStep(instantReplay.speed, + instantReplay.action?.[Math.floor(instantReplay.cursor)] || 0, elapsed); + if (!instantReplay.paused) + instantReplay.cursor += (now - instantReplay.lastAt) / + instantReplayStepUs * instantReplay.speed; + instantReplay.lastAt = now; + instantReplay.cursor = clamp(instantReplay.cursor, 0, + instantReplay.frames.length); + if (instantReplay.cursor >= instantReplay.frames.length) { + finishInstantReplay(now); + return; + } + applyRoundReplayFrame(instantReplay.frames[Math.floor(instantReplay.cursor)], now); + instantReplay.previous = down.slice(); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter - cameraWidth * .06, + y: cameraCenterY - cameraWidth * .04, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: 0, fov: 55 }, dt, 18); +} + +// A finished round in a rollback fight is not finished yet: the frames that +// ended it are still inside the rollback window, and a rival pad arriving late +// can take the knockout back. So the round is marked and filed later, from +// netTick, once both seats have confirmed past its end. A re-simulation +// reaches this line again and simply re-marks the frame. +function saveRoundReplay(now) { + if (!replay) return; + if (netSession) { replayPendingSaveFrame = netSession.frame; return; } + uploadRoundReplay(now); +} + +// Everything that is waiting, filed now whatever the wire is doing. A rival +// who has gone will never confirm anything, and the round they lost still +// happened. +function flushPendingRoundReplay(now) { + if (replayPendingSaveFrame < 0 || !replay) return; + replayPendingSaveFrame = -1; + uploadRoundReplay(now); + if (matchOver) finishReplay(); +} + +function uploadRoundReplay(now) { + if (!replay || workshopTainted) return; + recordReplayCheckpoint(now, true); + const demo = JSON.parse(JSON.stringify(replay)); + demo.matchId = "ow-" + matchName; + demo.matchName = matchName; + demo.roundId = demo.matchId; + demo.roundName = matchName; + demo.roundIndex = Math.max(0, replay.roundIds.length - 1); + // Read off the ledger rather than off `previousRoundName`, so a rollback + // that took a rollover back cannot leave the linkage pointing at a round + // that no longer exists. + demo.previousRoundId = demo.roundIndex > 0 + ? replay.roundIds[demo.roundIndex - 1] : ""; + demo.durationTicks = demoTick(now); + // The names as they were when the round was PLAYED. `replay.fighters` was + // taken when the series opened, which in a versus fight is before the deal + // has dressed either seat — so the winner below could be somebody the demo + // never listed, and the store refused the round with "Invalid winner". + demo.fighters = players.map((player) => player.name); + demo.nations = players.map((player) => player.nation || ""); + demo.winner = players[0].score === players[1].score ? null + : players[0].score > players[1].score ? players[0].name : players[1].name; + demo.finalRoundWins = players.map((player) => player.roundWins); + delete demo.startedMonotonicUs; + const payload = JSON.stringify(demo); + // A dense reel demo is fat by design and never leaves the local shell; the + // half-megabyte gate is for demos headed to the production store. + const payloadLimit = globalThis.__oskiewarDenseReplay ? 8388608 : 524288; + if (payload.length <= payloadLimit && typeof saveReplay === "function") { + const upload = saveReplay(payload); + // Only promise-returning hosts can prove the upload completed. The web + // host does; older native hosts keep saving silently until they adopt the + // same acknowledgement contract. + if (upload && typeof upload.then === "function") + upload.then((saved) => { + if (saved !== true) return; + playDrum("modem", .72, 0); + telemetry("REPLAY", "uploaded " + demo.roundId); + }).catch((error) => telemetry("REPLAY", "upload-error " + error.message)); + telemetry("REPLAY", "queued " + demo.roundId + " bytes=" + payload.length); + } else telemetry("REPLAY", "not-saved bytes=" + payload.length); +} + +function finishReplay() { + if (replayPendingSaveFrame >= 0 && replay) { + replayPendingSaveFrame = -1; + uploadRoundReplay(runtime().monotonicUs); + } + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = null; +} + +function emitSignal(event, player = -1, value = 0, value2 = 0) { + // Filed first, and filed even while re-simulating: a rollback truncated + // these rows and the silent pass is what puts the corrected ones back. What + // the silence is for is the PERFORMANCE below — nobody hears a frame twice. + if (replay) replay.events.push([demoTick(runtime().monotonicUs), event, + player, Math.round(value * 1000) / 1000, Math.round(value2 * 1000) / 1000]); + if (netSilent) return; + if (typeof gameSignal === "function") gameSignal(event, player, value, value2); +} + +// Revision 37 exposes native bell/woosh voices in the mixer but its QuickJS +// allowlist predates those names. Fall back without stopping the match; newer +// hosts and the browser still receive the authored voice unchanged. +function playDrum(name, velocity = 1, pan = 0) { + if (performanceStageActive()) return; + if (netSilent || typeof drum !== "function") return; + try { + drum(name, velocity, pan); + } catch (error) { + if (name !== "bell" && name !== "whoosh") throw error; + if (name === "bell" && typeof synth === "function") { + try { synth(880, .12); } catch (_) {} + } + try { + drum(name === "bell" ? "hat" : "block", velocity * .65, pan); + } catch (_) {} + } +} + +function playSine(frequency, duration = .12) { + if (performanceStageActive()) return; + if (netSilent || typeof synth !== "function") return; + try { synth(frequency, duration); } catch (_) {} +} + +let clientError = ""; +let clientErrorDetail = null; +let clientErrorAt = -1; +let clientErrorQr = null; +let clientErrorDumpUrl = ""; + +function clientStateDump() { + try { + const run = runtime(); + return { + build: "v" + buildVersion, + shell: shellMode, + round: { + id: matchName || "local", + result: roundResult || "active", + elapsedMs: Math.round(roundElapsedUs / 1000), + }, + runtime: { + sim: Number(run?.simCount || 0), + paint: Number(run?.paintCount || 0), + unixMs: Number(run?.unixMs || 0), + }, + camera: { + x: Math.round(cameraCenter), y: Math.round(cameraCenterY), + width: Math.round(cameraWidth), aspect: Math.round(cameraAspect * 1000) / 1000, + }, + players: players.map((player) => ({ + handle: player.name, stance: player.stance, alive: player.alive, + x: Math.round(player.x), y: Math.round(player.y), z: Math.round(player.z), + vx: Math.round(player.vx), vy: Math.round(player.vy), + input: [player.inputX, player.inputY], + removed: player.removedParts?.slice() || [], + })), + balls: balls.filter((item) => item.active).map((item) => ({ + type: item.type, x: Math.round(item.x), y: Math.round(item.y), + vx: Math.round(item.vx), vy: Math.round(item.vy), heldBy: item.heldBy, + })), + }; + } catch (error) { + return { dumpError: String(error?.message || error || "state unavailable") }; + } +} + +function errorNowUs() { + try { + const value = Number(runtime()?.monotonicUs); + if (Number.isFinite(value)) return value; + } catch (_) {} + return 0; +} + +// btoa only speaks latin-1, so the dump flattens to ASCII before encoding. +function base64Url(text) { + if (typeof btoa !== "function") return ""; + return btoa(String(text).replace(/[^\x20-\x7e]/g, "?")) + .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +// The QR carries the entire dump in its own URL, so a crash stays shareable +// even when the console never managed to post its report. Fat fields drop +// away until the payload fits a code that is still scannable off a TV. +function buildClientErrorDump(detail) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + const stack = String(detail.stack || "").split(/\r?\n/).slice(0, 4) + .map((line) => line.trim()).filter(Boolean).join(" | ").slice(0, 240); + for (const trace of [stack, ""]) { + const url = errorDumpBase + base64Url(JSON.stringify({ + v: 1, p: detail.phase, n: detail.name, m: detail.message, + src: detail.source, k: trace || undefined, s: detail.state, + })); + if (url.length <= 2048 && typeof qrcode === "function") { + try { + clientErrorQr = qrcode(url, { errorCorrectLevel: 1 }); + clientErrorDumpUrl = url; + return; + } catch (_) {} + } + } +} + +function errorRestartSeconds() { + if (clientErrorAt < 0) return 0; + return Math.max(0, + Math.ceil((errorRestartUs - (errorNowUs() - clientErrorAt)) / 1000000)); +} + +// A crashed console should not sit on a dead screen forever. The error holds +// long enough to read and scan, then the piece boots itself again. +function restartAfterClientError() { + if (clientErrorAt < 0 || errorNowUs() - clientErrorAt < errorRestartUs) return; + clientError = ""; + clientErrorDetail = null; + clientErrorAt = -1; + clientErrorQr = null; + clientErrorDumpUrl = ""; + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + try { telemetry("SHELL", "error->restart"); } catch (_) {} + boot(); +} + +function errorSource(stack) { + const match = String(stack || "").match( + /(?:\(|\s|^)((?:[a-z]+:\/\/)?[^\s()]+):(\d+):(\d+)\)?/i); + return match ? { file: match[1], line: Number(match[2]), column: Number(match[3]) } + : null; +} + +function captureClientError(phase, error) { + if (clientErrorDetail) return; + const stack = error?.stack ? String(error.stack) : ""; + const message = error?.message ? String(error.message) + : String(error || "unknown error"); + const name = String(error?.name || "Error"); + const state = clientStateDump(); + clientErrorDetail = { + phase: String(phase || "runtime"), name, message, stack, + source: errorSource(stack), state, + reportStatus: "queued for server", + }; + const detail = stack || (name + ": " + message); + clientError = (clientErrorDetail.phase + ": " + detail) + .replace(/[^\x20-\x7e]+/g, " ").replace(/\s+/g, " ").trim(); + clientErrorAt = errorNowUs(); + try { buildClientErrorDump(clientErrorDetail); } catch (_) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + } + try { + telemetry("CLIENT_ERROR", JSON.stringify({ + phase: clientErrorDetail.phase, name, message, stack, + source: clientErrorDetail.source, state, + })); + } catch (_) { + clientErrorDetail.reportStatus = "local report only"; + } +} + +function clientErrorLines(text, limit = 58) { + const words = String(text).split(" "); + const lines = []; + let line = ""; + for (let word of words) { + if (word.length > limit) { + if (line) { lines.push(line); line = ""; } + while (word.length > limit) { + lines.push(word.slice(0, limit)); + word = word.slice(limit); + } + if (!word) continue; + } + if (!line) line = word; + else if (line.length + word.length + 1 <= limit) line += " " + word; + else { lines.push(line); line = word; } + } + if (line) lines.push(line); + return lines.slice(0, 9); +} + +function errorTypeWrite(text, x, y, size, ...color) { + try { + typeWrite(text, x, y, size, ...color); + } catch (_) { + // Error reporting must survive a font renderer failure of its own. + try { systemWrite(String(text).toLowerCase(), x, y, size, ...color); } + catch (_) {} + } +} + +// Diagnostic lines are dense, so every token gets its own ink: handles read as +// people, numbers as measurements, units as scale, and the rest as labels. +const dumpUnits = new Set(["px", "ms", "us", "fps", "vx", "vy", "vz", "in", + "stk", "pos", "vel", "t", "pts"]); + +function dumpTokens(text) { + return String(text).match(/@[a-z0-9_]+|[-+]?\d*\.?\d+|[a-z]+|\s+|./gi) || []; +} + +function dumpTokenInk(token) { + if (token[0] === "@") return [255, 126, 205]; + if (/^[-+]?[\d.]+$/.test(token)) return [116, 255, 184]; + if (/^[a-z]+$/i.test(token)) return dumpUnits.has(token.toLowerCase()) + ? [255, 205, 74] : [188, 204, 230]; + return [112, 234, 255]; +} + +function writeTokens(write, text, x, y, size) { + let cursor = x; + for (const token of dumpTokens(text)) { + if (token.trim()) write(token, cursor, y, size, ...dumpTokenInk(token)); + cursor += handleWidth(token, size); + } +} + +const writeDumpLine = (text, x, y, size) => + writeTokens(errorTypeWrite, text, x, y, size); + +// The HUD sits over sky and ground, so each token carries its own contrast +// shadow the way a handle glyph does. +function writeHudLine(text, x, y, size) { + writeTokens((token, tx, ty, ts, ...color) => + typeWrite(token, tx + 3, ty + 4, ts, ...runShadow(color)), + text, x, y, size); + writeTokens(typeWrite, text, x, y, size); +} + +function errorReportStatus() { + try { + const status = String(runtime()?.clientErrorReportStatus || "").trim(); + if (status) return status; + } catch (_) {} + return clientErrorDetail?.reportStatus || "queued for server"; +} + +function stateDumpRows(state) { + if (!state) return [{ icon: "mode", text: "state unavailable" }]; + if (state.dumpError) + return [{ icon: "mode", text: "state unavailable: " + state.dumpError }]; + const playerRow = (player, index) => ({ icon: "player", + text: "p" + (index + 1) + " " + player.handle + " " + + player.stance.toLowerCase() + " pos " + player.x + "," + player.y + + "," + player.z + " vel " + player.vx + "," + player.vy + + (player.removed?.length ? " lost " + player.removed.join(",") : "") }); + return [ + { icon: "build", text: "build " + state.build }, + { icon: "mode", text: "mode " + state.shell.toLowerCase() + + " round " + state.round.id + " " + state.round.result.toLowerCase() + + " " + state.round.elapsedMs + "ms" }, + { icon: "camera", text: "camera " + state.camera.x + "," + state.camera.y + + " width " + state.camera.width + " aspect " + state.camera.aspect }, + ...(state.players || []).map(playerRow), + { icon: "ball", text: "balls " + (state.balls || []).map((ball) => + ball.type + "@" + ball.x + "," + ball.y + " v" + ball.vx + "," + ball.vy) + .join(" ") }, + ]; +} + +const dumpIconInk = { build: [116, 128, 156], mode: [255, 205, 74], + camera: [112, 214, 255], player: [206, 166, 255], ball: [116, 255, 184] }; + +function drawDumpIcon(kind, x, y, size) { + const ink = dumpIconInk[kind] || [112, 234, 255]; + const unit = Math.max(2, Math.round(size / 9)); + try { + if (kind === "build") + for (let row = 0; row < 3; row++) + hudBox(x, y + row * unit * 3, size - row * unit * 2, unit * 2, ...ink); + else if (kind === "camera") { + strokeBox(x, y + unit, size, size - unit * 2, unit, ink); + hudBox(x + unit * 3, y + unit * 3, size - unit * 6, size - unit * 6, ...ink); + } else if (kind === "player") { + hudBox(x + unit * 2, y, size - unit * 4, unit * 3, ...ink); + hudBox(x, y + unit * 4, size, size - unit * 4, ...ink); + } else if (kind === "ball") { + hudBox(x + unit * 2, y, size - unit * 4, size, ...ink); + hudBox(x, y + unit * 2, size, size - unit * 4, ...ink); + } else strokeBox(x, y, size, size, unit, ink); + } catch (_) {} +} + +// Sized for a phone pointed at a television, so modules stay chunky and the +// state dump wraps narrower to keep clear of the code. +function errorQrGeometry(width, height) { + if (!clientErrorQr || typeof clientErrorQr.getModuleCount !== "function") + return null; + const count = clientErrorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor(Math.min(width * .3, height * .52) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + return { count, quiet, cell, size, + left: width - 92 - size, top: height - 96 - size }; +} + +// Drawn with raw boxes rather than the projected screenRect the HUD uses — +// the triangle pipeline is exactly what may have just died. Dark modules +// coalesce into horizontal runs so a full code stays a few hundred draws. +function drawErrorQr(qr) { + if (!qr) return; + hudBox(qr.left, qr.top, qr.size, qr.size, 250, 250, 247); + for (let row = 0; row < qr.count; row++) { + let run = 0; + for (let column = 0; column <= qr.count; column++) { + if (column < qr.count && clientErrorQr.isDark(row, column)) { run++; continue; } + if (run) hudBox(qr.left + (column - run + qr.quiet) * qr.cell, + qr.top + (row + qr.quiet) * qr.cell, run * qr.cell, qr.cell, 7, 8, 14); + run = 0; + } + } +} + +// Same two-digit face as the round timer, reddening as the restart lands. +function drawErrorCountdown(width) { + const remaining = errorRestartSeconds(); + const text = String(Math.min(99, remaining)).padStart(2, "0"); + const danger = remaining <= 10; + const shake = danger + ? Math.sin(errorNowUs() / 1000000 * 35) * (11 - remaining) * .45 : 0; + let textWidth = 64; + try { textWidth = handleWidth(text, 52); } catch (_) {} + errorTypeWrite(text, width - 92 - textWidth + shake, 82, 52, + ...(danger ? [255, 92, 116] : [255, 205, 74])); +} + +function drawClientError() { + let width = 1920; + let height = 1080; + try { + const view = typeof gameView === "function" ? gameView() : null; + if (view && Number.isFinite(view.width)) width = view.width; + if (view && Number.isFinite(view.height)) height = view.height; + } catch (_) {} + const detail = clientErrorDetail || { + phase: "runtime", name: "Error", message: clientError, + stack: "", source: null, state: null, + }; + const qr = errorQrGeometry(width, height); + wipe(7, 9, 18); + box(48, 48, width - 96, height - 96, 30, 14, 27); + errorTypeWrite("the game needs a moment", 92, 82, 52, 255, 92, 116); + drawErrorCountdown(width); + errorTypeWrite("restarting safely", 94, 158, 31, 255, 205, 74); + const messageLines = clientErrorLines(detail.message, 66).slice(0, 2); + for (let index = 0; index < messageLines.length; index++) + errorTypeWrite(messageLines[index], 94, 226 + index * 42, + 31, 248, 244, 255); + let cursorY = 226 + messageLines.length * 42 + 28; + if (detail.source) { + errorTypeWrite("source", 94, cursorY, 29, 112, 234, 255); + errorTypeWrite(detail.source.file, 214, cursorY, 29, 190, 216, 255); + errorTypeWrite("line " + detail.source.line + " column " + detail.source.column, + Math.min(width - 430, 214 + detail.source.file.length * 17), cursorY, + 29, 116, 255, 184); + cursorY += 48; + } + errorTypeWrite("state dump", 94, cursorY, 29, 116, 255, 184); + cursorY += 42; + for (const row of stateDumpRows(detail.state).slice(0, 6)) { + let leading = true; + for (const wrapped of clientErrorLines(row.text, qr ? 68 : 78).slice(0, 2)) { + if (cursorY > height - 196) break; + if (leading) drawDumpIcon(row.icon, 94, cursorY + 4, 22); + writeDumpLine(wrapped, 132, cursorY, 27); + cursorY += 36; + leading = false; + } + } + drawErrorQr(qr); + if (qr) errorTypeWrite("scan to share this dump", + qr.left, qr.top - 42, 27, 116, 255, 184); + const report = errorReportStatus(); + const posted = report.startsWith("posted"); + errorTypeWrite(report, 94, height - 150, 30, + ...(posted ? [116, 255, 184] : [255, 205, 74])); + errorTypeWrite("relaunch or deploy an update", 94, height - 104, + 30, 190, 202, 230); +} + +function drawClientErrorFallback() { + try { wipe(7, 9, 18); } catch (_) {} + try { systemWrite("aesthetic.computer error", 72, 72, 48, 255, 92, 116); } catch (_) {} + try { systemWrite(errorReportStatus(), 72, 146, 30, 255, 205, 74); } catch (_) {} + try { + systemWrite("restart in " + errorRestartSeconds() + "s", 72, 200, 30, + 255, 205, 74); + } catch (_) {} +} + +function fighterProfile(handle) { + const live = Array.isArray(acFeed.fighters) + ? acFeed.fighters.find((profile) => profile.handle.toUpperCase() === handle.toUpperCase()) + : null; + const fallback = handle === "DUMMY" ? npcFighter + : handle === "SPIDERDUMMY" ? spiderDummyFighter + : handle === "BOT" ? botFighter + : selfPlayFighters.find((profile) => profile.handle === handle) || + fighterRoster.find((profile) => profile.handle === handle); + return { + mood: live?.mood || (handle === "@JEFFREY" && acFeed.moodHandle === "@jeffrey" + ? acFeed.mood : "") || fallback?.mood || "", + lastChat: live?.lastChat || fallback?.lastChat || "", + colors: live?.colors?.length + ? live.colors.map((color) => [color.r, color.g, color.b]) + : fallback?.colors || [], + }; +} + +function syncSignedInFighter() { + if (localVersusActive()) return; + const identity = acFeed?.player; + if (!identity?.handle || players[0].npc) return; + const handle = String(identity.handle).toUpperCase(); + if (players[0].name !== handle) players[0].name = handle; + const colors = Array.isArray(identity.colors) + ? identity.colors.map((color) => Array.isArray(color) + ? color.slice(0, 3) : [color.r, color.g, color.b]) + .filter((color) => color.every(Number.isFinite)) : []; + if (colors.length) { + players[0].handleColors = colors; + players[0].color = colors.reduce((sum, color) => sum.map((value, index) => + value + color[index] / colors.length), [0, 0, 0]).map(Math.round); + } +} + +function applyRoster(player, index) { + if (localVersusActive()) { + player.rosterIndex = [0, 2, 1][player.pad]; + player.name = "PLAYER " + (player.pad + 1); + player.color = fighterRoster[player.rosterIndex].color.slice(); + player.handleColors = []; + return; + } + if (player.npc) { + const fighter = selfPlay && player.bot ? selfPlayFighters[player.pad] + : player.bot ? botFighter + : player.spiderDummy ? spiderDummyFighter : npcFighter; + player.rosterIndex = -1; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = fighter.colors; + if (selfPlay && player.bot) { + // The color IS the nameplate: a self-play bot is called what it wears, + // so the card reads "CORAL WINS ROUND" and the demo carries the color + // name out to any replay that wants to dress the fighter again. The + // harness may force the first seat's color by name for a proof bout. + const forcedName = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const forcedWorn = player.pad === 0 && forcedName && + cssColorBook.find((entry) => entry.name === forcedName); + const dressed = forcedWorn || selfPlayWardrobe(player.pad); + player.color = dressed.rgb.slice(); + player.colorName = dressed.name; + player.name = dressed.name.toUpperCase(); + } + return; + } + if (player.pad === 0 && !acFeed?.player?.handle) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + // A test harness may dress the anonymous seat by CSS color name — + // "YELLOW vs DUMMY" is a scripted sonic and orientation proof, so the + // fighter's look has to be as reproducible as the fight. + const forced = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const worn = forced && cssColorBook.find((entry) => entry.name === forced); + if (worn) { + player.name = worn.name.toUpperCase(); + player.color = worn.rgb.slice(); + player.handleColors = []; + } + return; + } + // A negative index means there is no roster fighter here — an anonymous + // seat, or a remote one whose handle has not arrived. It used to wrap: -1 + // came out as the LAST roster entry, so an unnamed chair was dressed as a + // real person, and `Math.max(0, rosterIndex)` at the two versus callers + // floored it to the FIRST one instead. Between them an anonymous fight read + // as @JEFFREY against @SAT. Nobody is nobody. + if (index < 0) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + return; + } + const rosterIndex = index % fighterRoster.length; + const fighter = fighterRoster[rosterIndex]; + const profile = fighterProfile(fighter.handle); + player.rosterIndex = rosterIndex; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = profile.colors; +} + +// The one door into a fight. Training is free and anonymous — it is the front +// door and must never ask for anything, and `trainingbot` is that door's +// sparring partner: the bot's brain in a round that stays off the wire. Bot +// and ppl are what a handle buys, because they persist: a series, a published +// match, a replay, a ranking. Nothing opens those two doors yet, so only +// training reaches here and this call asks for nothing. +// +// The seam the sign-in actually landed on is `versusAllowed()`, because versus +// is the door that opened first: see `startVersusFight`. When bot and ppl open, +// they gate here on the same reader. +function startFightAgainst(kind, now) { + if (kind !== "local") setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + players[0].spawnX = tileCenterX(spawnColLeft); + players[1].spawnX = tileCenterX(spawnColRight); + if (players[2]) players[2].spawnX = tileCenterX((spawnColLeft + spawnColRight) / 2); + const opponent = players[1]; + fightOpponent = kind; + opponent.npc = kind === "dummy" || kind === "spiderdummy" || + kind === "bot" || kind === "trainingbot"; + opponent.bot = kind === "bot" || kind === "trainingbot"; + opponent.spiderDummy = kind === "spiderdummy"; + opponent.remote = false; + // Pad two is @OSKIE until ppl arrives carrying a handle of its own. + applyRoster(opponent, opponent.npc ? -1 : 2); + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + startReplay(now); + resetRound(now, true); + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +function survivalRequested() { + // The climb is a door asked for by name, and only by name. It used to be + // the empty door on any shell that could not raise the versus flag — the + // native consoles, whose publisher reads the relay and discards — which + // left the Xbox opening on the climb every boot. @jeffrey, on the console: + // "i dont like the climbing mode / map ... i want it in vs / dummy mode". + // So where versus cannot happen the empty door is the training fight + // (`beginTraining`, a sparring partner on the floor), the same landing the + // web gets when the relay is out of reach. + return String(globalThis.__oskiewarOpponent || "") + .trim().toLowerCase() === "survival"; +} + +const localVersusActive = () => fightOpponent === "local"; +// The web shell marks a pad `localController` when a physical gamepad is +// behind it; the console's pad object (QuickJsEngine PadObject) never +// carried the field, so `localControllerPair()` was false on the Xbox with +// three controllers plugged in and the dummy's chair never went to player +// two — @jeffrey, 2026-09-20: "it only sees one controller hmm". The native +// pad object carries no name or id either (PadObject: index, connected, +// sticks, triggers, down). What the console does have is `controllers()`, +// its enumeration of real hardware — a pad whose index sits inside that +// list is a local controller. The test harness stubs `gamepad` with two +// always-connected pads and defines no `controllers`, so its fights stay +// what they were; "connected" alone turned every harness fight into local +// versus (131 tests). +let nativeControllerCount = 0; +let nativeControllerPolls = 0; +function samplePad(index) { + let pad; + try { pad = gamepad(index); } catch (error) { + if (index < 2) throw error; + } + if (!pad) pad = { connected: false, down: [], leftX: 0, leftY: 0 }; + if (pad && pad.localController === undefined && pad.connected === true && + typeof controllers === "function") { + // Re-enumerate about twice a second; a pad joining mid-title waits at + // most that long for its chair. + if (index === 0 && nativeControllerPolls++ % 30 === 0) + nativeControllerCount = controllers().length; + if (index < nativeControllerCount) pad.localController = true; + } + return pad; +} +const localControllerPair = () => + padSnapshots.slice(0, 2).every((pad) => pad?.localController === true); +let localControllerPairSeen = false; +let localControllerMissing = -1; + +function startLocalVersus(now) { + finishReplay(); + fightOpponent = "local"; + setLocalPlayerCount(padSnapshots[2]?.localController === true ? 3 : 2); + telemetry("FIGHT_LOCAL_PLAYERS", String(players.length)); + for (const player of players) { + player.npc = false; + player.bot = false; + player.spiderDummy = false; + player.remote = false; + } + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + localControllerMissing = -1; + globalThis.__oskiewarVersusRoom = ""; + gameSpeed = 1; + startFightAgainst("local", now); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); +} + +function updateLocalVersus(now) { + const paired = localControllerPair(); + const arrived = paired && !localControllerPairSeen; + localControllerPairSeen = paired; + // A second local pad must never take over a remote fight or a recording. + if (roundViewer || netSession || selfPlay || resimActive || versusActive()) + return false; + if ((arrived && !localVersusActive()) || + (localVersusActive() && paired && players.length === 2 && + padSnapshots[2]?.localController === true)) startLocalVersus(now); + if (!localVersusActive()) { localControllerMissing = -1; return false; } + if (!paired || players.some((player) => + padSnapshots[player.pad]?.localController !== true)) { + localControllerMissing = padSnapshots.slice(0, players.length).findIndex( + (pad) => pad?.localController !== true); + return true; + } + if (localControllerMissing !== -1) { + localControllerMissing = -1; + // Restart the interrupted round with the match tally intact. Absolute + // attack/death timers cannot safely resume after an arbitrary unplug. + if (matchOver) startLocalVersus(now); + else resetRound(now, false, true); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); + } + return false; +} + +function versusRequested() { + return !String(globalThis.__oskiewarOpponent || "").trim() && + globalThis.__oskiewarVersusCapable === true; +} + +// --------------------------------------------------------------------------- +// The door. @jeffrey: "i think we should require users to axtually login in +// order to play... and also to make a handle in order to play". +// +// Training stays free and anonymous — it is the front door and must never ask +// for anything — and so does watching: the link a friend sends has to work for +// whoever opens it, account or no account. What a handle buys is the half of +// the game with another person on the other end of it, because that half is +// the half that persists. A fight against a stranger called RIVAL is not worth +// having; those placeholder names were the symptom, not the problem. +// +// The shell owns the account and the panel; this file owns the question of +// when the door is in the way. Two globals carry it: +// +// __oskiewarAccount { ready, signedIn, handle, colors } shell → game +// __oskiewarAccountDoor "" | "login" | "handle" game → shell +// The door is built, tested and wired on both sides, and it is held open until +// the tenant can actually let somebody through it. Native sign-in needs +// "Passwordless OTP" ticked on the Auth0 application, and as of 26.09.11 the +// tenant answers `unauthorized_client` — so the only way in is the redirect, +// which lands on the Universal Login page's Turnstile, which is the loop this +// whole flow exists to avoid. Requiring an account before there is a working +// way to make one does not gate the game, it closes it. +// +// Flip this to true the moment that grant is on. Everything behind it is +// already written and covered by tests, which drive it through +// `setVersusRequiresAccount`. +let versusRequiresAccount = false; + +const accountState = () => globalThis.__oskiewarAccount || null; +// Nobody is turned away before the shell has finished asking. A silent session +// check takes a moment, and a door that flashed up inside it would send a +// signed-in player off to sign in again. +const accountReady = () => accountState()?.ready === true; +const accountHandle = () => String(accountState()?.handle || ""); +// A shell with no account system at all is not a locked-out visitor, it is an +// older build, and it must not be left standing in a waiting room that can +// never start. The two halves of this door — the panel over there, the refusal +// here — ship together, and until the shell offers one there is nothing for +// this to hold shut. +// +// Which is the honest shape of it: this is a door, not a lock. The name on the +// wire has always been whatever the client says it is, and a console can set +// any global it likes. Enforcement would mean the relay verifying a token on +// the seat, and that is a different piece of work. +const versusAllowed = () => !versusRequiresAccount || !accountState() || + (accountReady() && accountState().signedIn === true && + Boolean(accountHandle())); + +// Which door, if any, stands between this visitor and a fight. Empty while the +// shell is still asking, and empty for anyone already through. +function versusDoor() { + if (!versusRequiresAccount) return ""; + if (!accountState() || !accountReady()) return ""; + if (accountState().signedIn !== true) return "login"; + if (!accountHandle()) return "handle"; + return ""; +} + +// Raised only while somebody is actually trying to play a person: standing in +// the waiting room, or holding a chair. A spectator is never asked for +// anything, and neither is the title screen. +// What this file last asked the shell for, so a panel that closes on its own +// can be told from one that was never open. +let accountDoorAsked = ""; + +function updateAccountDoor() { + const wanted = shellMode === "GAME" && versusLane() && !roundViewer + ? versusDoor() : ""; + const showing = globalThis.__oskiewarAccountDoor || ""; + // "never mind" drops every request the panel is holding, this one included. + // Left alone, the next frame would simply ask again and the panel would + // spring back up — which is not a dismissal, it is a trap. Somebody who + // backs out goes to the title screen instead, where the account button + // lives, where training is one press away, and where nothing is asking them + // for anything. + if (accountDoorAsked && wanted && !showing) { + accountDoorAsked = ""; + returnToTitle(runtime().monotonicUs, "account"); + return; + } + if (showing !== wanted) globalThis.__oskiewarAccountDoor = wanted; + accountDoorAsked = wanted; +} + +function startSurvivalRun(now, botControlled = false) { + gameMode = "survival"; + selfPlay = botControlled; + fightOpponent = "survival"; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + finishReplay(); + + const runner = players[0]; + runner.spawnX = centerX; + runner.npc = botControlled; + runner.bot = botControlled; + runner.spiderDummy = false; + applyRoster(runner, botControlled ? -1 : Math.max(0, runner.rosterIndex)); + + const absent = players[1]; + absent.spawnX = tileCenterX(cornerColRight); + absent.npc = true; + absent.bot = false; + absent.spiderDummy = false; + absent.remote = false; + applyRoster(absent, -1); + + resetRound(now, true); + absent.alive = false; + absent.respawnAt = Infinity; + absent.x = worldRight + gridWidth; + absent.y = floorY; + survivalStartedAt = now + survivalIntroDurationUs; + survivalLavaY = survivalLavaStart; + survivalHeight = 0; + survivalPeakLevel = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; + cameraWidth = survivalFrameWidth; + cameraContainFloor = 0; + cameraDoll.snap({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, + z: -survivalFrameWidth * 1.35 }, + width: survivalFrameWidth, perspective: 0, fov: 55, roll: 0 }); + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + pickup.active = false; + for (const item of balls) item.active = false; + emitSignal("survival", 0, 1, 0); +} + +// The title is a frozen first foothold, not an attract fight. START resets the +// runner and the lava together, so nobody loses a run beneath the wordmark. +function beginSurvival(now) { + setLocalPlayerCount(2); + startSurvivalRun(now, false); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - survivalIntroDurationUs; + survivalStartedAt = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; +} + +// Whatever you land on is already a live training fight; the wordmark simply +// floats over it. The intro countdown is spent before the first frame so +// somebody arriving from a QR code is moving, not watching a number. +function beginTraining(now) { + setLocalPlayerCount(2); + startFightAgainst(trainingOpponentKind(), now); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - roundIntroDurationUs(); + const forcedAttract = globalThis.__oskiewarAttractVariant; + titleAttractMode = forcedAttract === "still" || forcedAttract === "action" + ? forcedAttract : hashUnit(matchName) < .5 ? "still" : "action"; + if (titleAttractMode === "action") { + // The title demonstration is a bot working a training dummy, not two + // anonymous red bots. Preserve the dummy's cool neutral material so the + // matchup is legible before START is pressed. + players[0].npc = true; + players[0].bot = true; + players[0].spiderDummy = false; + applyRoster(players[0], -1); + players[1].npc = true; + players[1].bot = false; + players[1].spiderDummy = false; + applyRoster(players[1], -1); + } +} + +// The versus lobby: one fighter, an empty chair, and the address as the +// invitation. Everything a visitor can do here is practice — their own moves +// are named back at them — until the relay seats a rival, at which point +// updateVersusSeat opens the real fight. The empty chair is parked out past +// the wall the way survival parks it, so the camera, the scorekeeping and +// the reactions all read a one-body room. +function beginVersusLobby(now, { title = false } = {}) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus-lobby"; + finishReplay(); + seriesName = ""; + matchName = ""; + previousRoundName = ""; + if (!versusRoomName) versusRoomName = sessionName; + globalThis.__oskiewarVersusRoom = versusRoomName; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const chair = players[1]; + chair.spawnX = tileCenterX(spawnColRight); + chair.npc = true; + chair.bot = false; + chair.spiderDummy = false; + chair.remote = false; + applyRoster(chair, -1); + selecting = false; + shellMode = title ? "MENU" : "GAME"; + gameplayStarted = !title; + titleTransitionAt = null; + resetRound(now, true); + chair.alive = false; + chair.respawnAt = Infinity; + chair.x = worldRight + gridWidth; + chair.y = floorY; + // An empty chair wears no dummy's name — the wire calls it NOBODY. And the + // room forgets who was last in it, so the next person to sit down is dressed + // from their own offer rather than inheriting the last one's. + chair.name = ""; + versusRivalName = ""; + versusRivalOffered = ""; + // Spend the countdown before the first frame: arriving is moving, and + // there is nobody here to count in against anyway. + roundStartedAt = now - roundIntroDurationUs(); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + versusRoomName) : null; + emitSignal("versus-lobby", 0, 1, 0); +} + +// A rival took the chair. Seat them as a real second fighter — no bot brain, +// no npc stillness, their presses riding in off the relay — and open the +// round with the full countdown so both screens see the same three seconds. +function startVersusFight(now, resetMatch = true) { + // The one gate that matters: this is the call that puts two people in a + // round. Everything below it — publishing, the seat, the score — assumes + // both ends have a name worth writing down. + if (!versusAllowed()) return; + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus"; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const rival = players[1]; + rival.spawnX = tileCenterX(spawnColRight); + rival.npc = false; + rival.bot = false; + rival.spiderDummy = false; + rival.remote = true; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + // A fresh match is a fresh series, and a versus series is now recorded like + // any other. A round rollover inside a match keeps the one it has. + if (resetMatch) startReplay(now); + resetRound(now, resetMatch); + dressVersusRival(); + if (resetMatch && typeof analytics === "function") { + analytics("match_started", { + source_system: "browser", + surface: "web", + opponent_type: "remote-player", + }); + } + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +// What the rival is called and what they wear, read off the freshest input +// frame — the challenger mails their handle and colors with every press, so +// a name arriving late still lands. The relay already shape-checked both; +// the sanitize here is for the state schema's sake, because one bent name +// would cost every published frame. +function dressVersusRival() { + if (netSession) { netApplyIdentities(netSession.deal); return; } + const rival = players[1]; + if (!rival.remote) return; + const remote = globalThis.__oskiewarRemotePad; + const offered = versusOfferedName(); + versusRivalOffered = offered; + versusRivalName = /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : ""; + rival.name = versusRivalName; + const colors = (Array.isArray(remote?.colors) ? remote.colors : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)); + if (colors.length) { + rival.handleColors = colors; + rival.color = colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); + } else { + rival.handleColors = []; + rival.color = [38, 82, 176]; + } +} + +// The versus lane's own wire: one room, streamed faster than a grandstand +// needs because for the challenger this feed IS the game. It runs from the +// title screen on — a friend can arrive while the host is still reading the +// wordmark — and rides the same publisher socket the round rooms use. +function publishVersus(now) { + // Both seats simulate, but only the host narrates: the grandstand keeps + // the stream it always had, and the challenger never races the host for + // the room's one publisher socket. + if (netSession && netSession.seat !== 0) return; + if (netSilent || !versusLane() || !versusRoomName || livePublishFailed || + typeof publishLive !== "function") return; + // A waiting room nobody can be invited into is not a room. Publishing it + // would put it in front of the matchmaker as a chair to take. + if (!versusAllowed()) return; + // Paced on the WALL clock, not the simulation's. The driver runs up to four + // owed ticks in one instant to catch up, and a sim-clocked gate let every + // one of those emit its own frame — two or three full state builds in the + // same millisecond, arriving at the relay as a burst it can only coalesce. + // Catch-up is exactly when the fight is busiest, so the cost landed where + // there was least room for it. Wall time makes a burst one frame. + const wall = runtime().unixMs || 0; + if (wall && wall < versusNextAt) return; + versusNextAt = wall + versusSnapshotIntervalMs; + try { + publishLive("ow-" + versusRoomName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// Two visitors can arrive through the same dead address and both decide to +// host it. The relay lets exactly one publish; the other's shell hears "this +// match already has a publisher" and raises a flag, and this walks that +// loser back into the room as a challenger through the bridge it kept. +function updateVersusConflict(now) { + if (!versusLane() || !versusFallbackBridge) return false; + if (globalThis.__oskiewarPublishConflict !== "ow-" + versusRoomName) + return false; + globalThis.__oskiewarPublishConflict = ""; + const bridge = versusFallbackBridge; + versusFallbackBridge = null; + bridge.role = "challenger"; + roundViewer = bridge; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + roundResult = ""; + matchOver = false; + matchName = bridge.name || ""; + roundStartedAt = now - roundIntroDurationUs(); + roundViewerStop = bridge.start(handleRoundViewer); + telemetry("VERSUS_CONFLICT", versusRoomName); + return true; +} + +// The seat, watched every tick. Fresh presses in the lobby open the fight; +// a wire gone quiet mid-fight sends the room back to waiting. The rival's +// wardrobe follows their freshest frame because the handle can arrive after +// the chair was taken. +function updateVersusSeat(now) { + if (netSession) return; + if (updateVersusConflict(now)) return; + if (!versusLane()) return; + // A rival who can roll back says so on the net channel. Their first pad + // usually lands first, so the offer is taken here rather than only from + // the lobby — a streamed fight one second old is upgraded in place. + if (netPeerHello && netHostBegin(now)) return; + const fresh = versusChallengerFresh(); + if (lobbyActive() && fresh && versusAllowed()) { + startVersusFight(now, true); + return; + } + if (versusActive() && !fresh) { + beginVersusLobby(now); + return; + } + if (versusActive() && fresh && versusOfferedName() !== versusRivalOffered) + dressVersusRival(); +} + +// A dead body falling. No input, no collision with anybody, no ledges: a +// corpse is not a fighter and must not catch a rung it would have caught +// alive. It drops, it lands on the ground under it, and it stops. +function settleCorpse(player, dt) { + if (player.grounded) return; + player.vy += fallGravity() * dt; + player.x += player.vx * dt; + player.y += player.vy * dt; + player.vx *= .96; + const terrainY = terrainFloorAt(player.x); + if (player.y < terrainY) return; + player.y = terrainY; + player.vy = 0; + player.vx = 0; + player.grounded = true; +} + +// Lobby deaths have a respawn beat, but no round or killcam to reset state. +function updateLobbyMortality(now) { + if (!lobbyActive()) return; + const player = players[0]; + if (player.alive && hasPart(player, "torso")) return; + if (player.lobbyDeathDressed) return; + if (player.alive) { + player.alive = false; + player.lastButton = "DESTROYED"; + player.lastButtonAt = now; + spawnImpact({ x: player.x, y: player.y - 60, z: player.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(player)); + } + player.lobbyDeathDressed = true; + player.respawnAt = Math.max(player.respawnAt || 0, now + 2500000); + releaseCarriedBall(player, now); + releaseCarriedPart(player, now); + releaseCarriedFighter(player, now); + dismountSkateboard(player, now); + player.attackKind = player.itemAction = ""; + player.attackUntil = player.itemActionUntil = player.dashUntil = 0; + player.attackHit = player.blocking = player.grabHeld = false; + player.pounding = player.pogoDive = player.pogoHit = false; + player.jumpHeld = false; + player.runSince = player.walkSince = 0; + player.jumpPoseUntil = player.landPoseUntil = player.hopUntil = 0; + player.inputX = player.inputY = player.vx = 0; + player.stance = "HIT"; + delete player.frozenGeometry; + delete player.frozenAt; + deathCinematic = null; +} + +// Deprecated with PAL_SELECT — see the flag. +function beginSelect(now) { + selecting = true; + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + selectionReady[1] = false; + selectionPrevious[0] = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + roundResult = ""; + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + fightHitMarks.length = 0; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) + for (const mark of globalThis.__oskiewarFightHitForecast) + fightHitMarks.push({ at: clamp(Number(mark.at) || 0, 0, 1), + color: Array.isArray(mark.color) ? mark.color.slice(0, 3) : [226, 42, 66], + decisive: mark.decisive === true }); + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + roundStartedAt = now; + for (const player of activePlayers()) { + player.roundWins = 0; + player.score = 0; + player.alive = true; + } +} + +function returnToTitle(now, reason = "back") { + finishReplay(); + if (survivalActive()) beginSurvival(now); + else if (versusLane()) beginVersusLobby(now, { title: true }); + else beginTraining(now); + // Menu is a hard navigation boundary: discard the prior fight's zoom and + // right-stick diorama angle before the very first title frame is painted. + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + // The lobby frames its one fighter — the empty chair is parked past the + // wall, and averaging it in would sling the lens a map-width off stage. + cameraCenter = survivalActive() ? (worldLeft + worldRight) / 2 + : lobbyActive() ? players[0].x + : (players[0].x + players[1].x) / 2; + cameraCenterY = survivalActive() ? floorY - 240 + : lobbyActive() ? players[0].y - 90 + : (players[0].y + players[1].y) / 2 - 90; + cameraWidth = survivalActive() ? survivalFrameWidth + : lobbyActive() ? 980 + : Math.max(980, Math.abs(players[1].x - players[0].x) + 760); + cameraContainFloor = 0; + const cameraTarget = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.snap({ target: cameraTarget, + position: { x: cameraCenter, y: cameraCenterY, + z: -cameraWidth * 1.2 }, + width: cameraWidth, perspective: 0, fov: 55, roll: 0 }); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[0] = shellPrevious.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + playDrum("block", .8, 0); + telemetry("SHELL", "game->title " + reason + " " + now); +} + +// A mechanical test drives both fighters with the same bot and says so on the +// nameplates, instead of flying a handle nobody is holding. Entered through +// `__oskiewarSelfPlay` before boot or by calling this — never from a button, +// so normal play cannot fall into it. +function startSelfPlay(now) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = true; + // The harness is not the free door. A self-play run armed from a live title + // inherits whatever training was seated, and leaving that behind would keep + // the whole mechanical test off the wire — no demo, no rollover. + fightOpponent = ""; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of activePlayers()) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.remote = false; + player.rosterIndex = -1; + } + // The reel harness may seat the training dummy in the second chair — a + // scripted "COLOR vs DUMMY" proof bout. The dummy has no bot AI, so the + // timed-training flag keeps the round on the clock it would otherwise + // drop. + if (globalThis.__oskiewarSelfPlayOpponent === "dummy") + players[1].bot = false; + startReplay(now); + resetRound(now, true); + // No dealt equipment. The cube's blade and pistol wait on their floor + // tiles in self-play exactly as they do in a live match, and the bots arm + // themselves by walking over them — or don't. + // The bots' dice are seeded off the round clock, which a re-simulation + // cannot reproduce — so a dense demo carries the seeds themselves, and a + // replayed sim rolls exactly what the live pass rolled. Spawns ride along + // for the same reason: the fight can only rerun from where it stood. + if (replay && replayCheckpointUs() < 100000) { + replay.botSeeds = players.map((player) => player.botRngState >>> 0); + replay.spawns = players.map((player) => Math.round(player.spawnX)); + // Animation runs off the page-boot clock, and limb pose decides where a + // strike lands — a rerun needs the same phase or contacts wander. + replay.posePhaseUs = Math.round(now - startedAt); + } +} + +// Re-simulation: the offline renderer's honest path. Instead of puppeting +// recorded state, the page reruns the ACTUAL fight — same name stream, same +// ball, same bot dice — through the real simulation at the fixed step. Every +// limb tint, item drop, and debris mote is the engine's own, in the current +// build, with nothing lost to the demo schema. State checkpoints remain as a +// drift meter, not as the picture. +let resimActive = false; +// Whether the demo being re-run was a round on a clock. Versus rounds are not, +// and handing one a countdown it never had would end the re-run early on a +// fight the original played past. Demos recorded before this field carry no +// answer and were all timed. +let resimTimed = true; +let resimPending = null; +let resimTick = -1; +let resimCheckpoints = null; +let resimCommands = null; +let resimFirstRowTick = 0; +let resimCommandCursor = 0; +let resimMask = [0, 0]; + +// The inverse of `inputCommand`: a recorded mask back into the pad shape the +// sim reads. Replaying the live pass's actual inputs — instead of letting +// bot AI re-decide — pins every action to its recorded tick, which is what +// keeps the rerun's hits on the audio's timestamps. +function resimPad(pad) { + const mask = resimMask[pad] || 0; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + return { connected: true, down, leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; +} + +function advanceResimCommands() { + if (!resimCommands) return; + while (resimCommandCursor < resimCommands.length && + resimCommands[resimCommandCursor][0] <= resimTick) { + const [, pad, mask] = resimCommands[resimCommandCursor]; + resimMask[pad] = mask; + resimCommandCursor++; + } +} +function startResim(demo, now) { + configureWorldMap(demo.map); + gameMode = "fight"; + resimActive = true; + resimTimed = demo.timed !== false; + // The reset step is demo tick zero; every later sim step counts one. + resimTick = 0; + resimCheckpoints = new Map( + (demo.checkpoints || []).map((row) => [row[0], row])); + resimFirstRowTick = demo.checkpoints?.[0]?.[0] ?? 0; + resimCommands = demo.commands || null; + resimCommandCursor = 0; + resimMask = [0, 0]; + globalThis.__oskiewarResimDrift = { ticks: 0, maxDrift: 0, atTick: 0 }; + selfPlay = true; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of players) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.rosterIndex = -1; + } + if (demo.fighters?.[1] === "DUMMY") players[1].bot = false; + // A forced first-seat color survives in the demo as the fighter's own + // name, so the rerun dresses itself without being told. + const worn = String(demo.fighters?.[0] || "").toLowerCase(); + if (cssColorBook.some((entry) => entry.name === worn)) + globalThis.__oskiewarWardrobe = worn; + seedNames(demo.nameSeed >>> 0); + seriesName = demo.seriesName || demo.matchName || ""; + matchBallType = demo.ballType || seriesBallType(seriesName); + matchName = String(demo.roundName || "").replace(/^ow-/, ""); + if (Array.isArray(demo.spawns)) + players.forEach((player, index) => { + if (demo.spawns[index] != null) player.spawnX = demo.spawns[index]; + }); + replay = null; + resetRound(now, true); + // Self-play deals nothing at the bell, so the rerun starts from the same + // bare table: both weapons still on their tiles. + if (Array.isArray(demo.botSeeds)) + players.forEach((player, index) => { + if (demo.botSeeds[index] != null) + player.botRngState = demo.botSeeds[index] >>> 0; + }); + // The recording says which tick its fight opened on; anchoring the intro + // clock to that tick removes the ±1-step phase that clock rounding deals + // each pass, so replayed inputs land exactly where they were pressed. + const fightOpen = demo.checkpoints?.[0]?.[0]; + if (fightOpen) roundStartedAt = now + fightOpen * 16667 - + roundIntroDurationUs() - 8000; + if (demo.posePhaseUs != null) startedAt = now - demo.posePhaseUs; +} + +function trackResimDrift(now) { + if (!resimActive || !resimCheckpoints) return; + const report = globalThis.__oskiewarResimDrift; + // The intro's length lands ±1 tick depending on each pass's clock + // rounding, so tick spaces are aligned on the fight's own first physics + // step — this call site is only reached once the fight is live, and the + // recording likewise begins there. + if (report.tickOffset === undefined) + report.tickOffset = resimFirstRowTick - resimTick; + const alignedTick = resimTick + report.tickOffset; + if (roundResult && !report.endedAt) { + report.endedAt = resimTick; + report.endedWith = roundResult; + report.endedCause = roundCause; + } + const row = resimCheckpoints.get(alignedTick); + if (!row) return; + report.ticks++; + for (let pad = 0; pad < players.length; pad++) { + const offset = 1 + pad * 8; + const drift = Math.hypot(players[pad].x - row[offset], + players[pad].y - row[offset + 1]); + if (drift > 4 && report.firstDriftTick === undefined) { + report.firstDriftTick = alignedTick; + report.firstDriftPad = pad; + report.firstDrift = Math.round(drift * 10) / 10; + report.liveAt = [row[offset], row[offset + 1]]; + report.resimAt = [Math.round(players[pad].x), Math.round(players[pad].y)]; + } + if (drift > report.maxDrift) { + report.maxDrift = Math.round(drift * 10) / 10; + report.atTick = alignedTick; + } + } +} + +function consumeSystemButtons(now) { + let pressed = false; + for (let index = 0; index < padSnapshots.length; index++) { + const down = padSnapshots[index]?.down || []; + const previous = navigationPrevious[index] || []; + if (down.includes("RightStick") && !previous.includes("RightStick")) { + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + } + if (down.includes("View") && !previous.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + if (down.includes("Menu") && !previous.includes("Menu")) pressed = true; + navigationPrevious[index] = down.slice(); + } + // Self-play has no title to return to — a stray Menu press would strand the + // loop on a screen nobody is there to start. + if (!pressed || selfPlay || shellMode !== "GAME" || selecting) return false; + returnToTitle(now, "menu"); + return true; +} + +// Start lifts the wordmark off a fight that is already running underneath. +function enterGame(now) { + startInputPending = true; + if (localControllerPair() && !roundViewer && !netSession && !versusActive()) { + startLocalVersus(now); + return; + } + if (survivalActive()) { + startSurvivalRun(now, false); + globalThis.__oskiewarStartLine = "climb!"; + playDrum("bell", 1.05, 0); + playSine(660, .12); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + return; + } + if (titleAttractMode === "action") { + selfPlay = false; + players[0].npc = false; + players[0].bot = false; + players[0].spiderDummy = false; + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + // Attract keeps a cool neutral body in the second chair so the tableau + // reads as a matchup rather than two identical red bots. Start hands the + // first seat back and re-seats whichever sparring partner this session was + // actually dealt: hardcoding the inert dummy here left every session the + // clock dealt the action tableau — half of them — still punching a post + // after training switched to the bot. + const training = trainingOpponentKind(); + players[1].npc = true; + players[1].bot = training === "trainingbot"; + players[1].spiderDummy = training === "spiderdummy"; + applyRoster(players[1], -1); + } + shellMode = "GAME"; + gameplayStarted = true; + if (dummyGuideStartedAt === null && players[1].npc && !players[1].bot) + dummyGuideStartedAt = now; + shellPrevious = padSnapshots[0]?.down?.slice() || []; + if (PAL_SELECT) beginSelect(now); +} + +// Comma and period step the pace mid-fight the way +/- do on the title — a +// quarter at a time, but never past full speed: slow motion is for reading a +// bot's tells. A wired fight keeps the clock both seats agreed on, so the +// keys go dead the moment a rival is real, and a watcher's playout is the +// host's clock too. Edge-detected against the same unfiltered pad memory the +// title uses, so a key held across the start steps exactly once. +const paceLocked = () => netSession !== null || versusActive() || + roundViewer !== null; +function updateMatchPace(now) { + const rawDown = padSnapshots[0]?.down || []; + const tap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + const faster = tap("SpeedUp"); + const slower = tap("SpeedDown"); + shellRawPrevious = rawDown.slice(); + if (!faster && !slower) return; + const next = paceLocked() ? gameSpeed + : clamp(gameSpeed + (faster ? .25 : -.25), .25, 1); + if (next === gameSpeed) { playDrum("block", .3, 0); return; } + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, faster ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); +} + +function updateShell(now, tapped = false) { + const pad = padSnapshots[0] || {}; + // The title screen is where the game's pace is set: +/- on a keyboard + // step the clock a quarter at a time, from a quarter speed to double. + // Handled before anything else so a speed tap can never read as "start", + // and edge-detected against the unfiltered pad so holding the key steps + // exactly once. + const rawDown = pad.down || []; + const speedTap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + if (speedTap("SpeedUp") || speedTap("SpeedDown")) { + const stepped = gameSpeed + (speedTap("SpeedUp") ? .25 : -.25); + const next = clamp(stepped, .25, 2); + if (next !== gameSpeed) { + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, speedTap("SpeedUp") ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); + } else playDrum("block", .3, 0); + } + shellRawPrevious = rawDown.slice(); + // View and Menu are the system's buttons — View toggles the debug HUD and + // must not double as "start the game". Everything else, and a real lean on + // the analog stick, says the player wants in. + const down = rawDown + .filter((button) => button !== "View" && button !== "Menu" && + button !== "SpeedUp" && button !== "SpeedDown"); + const stickLive = Math.abs(pad.leftX || 0) > .5 || Math.abs(pad.leftY || 0) > .5; + if (titleTransitionAt !== null) { + if (now - titleTransitionAt >= 700000) { + titleTransitionAt = null; + enterGame(now); + } + shellPrevious = down.slice(); + shellStickLive = stickLive; + return; + } + if (tapped || down.some((button) => !shellPrevious.includes(button)) || + (stickLive && !shellStickLive)) { + playDrum("hat", .55, 0); + if (typeof titleBeep === "function") titleBeep(); + if (typeof titleVoice === "function") titleVoice(); + emitSignal("select", -1, 1, 0); + titleTransitionAt = now; + startInputPending = true; + } + shellPrevious = down.slice(); + shellStickLive = stickLive; +} + +// Everything from here through `updateSelect` is the deprecated pal select, +// held behind PAL_SELECT — see the flag. +function selectionOptions() { + if (selectionStep === 0) return fighterRoster.map((fighter, rosterIndex) => ({ + kind: "pal", fighter, rosterIndex, + })); + return [ + { kind: "bot", fighter: botFighter, rosterIndex: -1 }, + { kind: "dummy", fighter: npcFighter, rosterIndex: -1 }, + { kind: "spiderdummy", fighter: spiderDummyFighter, rosterIndex: -1 }, + { kind: "people", fighter: peopleFighter, rosterIndex: -1, disabled: true }, + ]; +} + +function startSelectedRound(now) { + selectionReady[0] = true; + selectionReady[1] = true; + startFightAgainst( + players[1].bot ? "bot" : players[1].spiderDummy ? "spiderdummy" + : players[1].npc ? "dummy" : "ppl", now); +} + +function chooseSelection(index, now) { + const option = selectionOptions()[index]; + if (!option) return; + if (option.disabled) { + playDrum("block", .45, 0); + return; + } + if (selectionStep === 0) { + applyRoster(players[0], option.rosterIndex); + selectionReady[0] = true; + selectionStep = 1; + // The dummy is where a fight should start: it stands still and lets you + // learn the buttons. Picking the bot is a decision, not a default. + selectionCursor = Math.max(0, + selectionOptions().findIndex((option) => option.kind === "dummy")); + playDrum("hat", .9, -.55); + emitSignal("select", 0, option.rosterIndex, 0); + return; + } + const opponent = players[1]; + opponent.npc = option.kind === "dummy" || option.kind === "spiderdummy" || + option.kind === "bot"; + opponent.bot = option.kind === "bot"; + opponent.spiderDummy = option.kind === "spiderdummy"; + applyRoster(opponent, option.rosterIndex); + playDrum("clap", 1, .55); + emitSignal("select", 1, option.rosterIndex, opponent.bot ? 2 : opponent.npc ? 1 : 0); + startSelectedRound(now); +} + +function selectionBack(now) { + if (selectionStep === 1) { + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + playDrum("block", .7, 0); + return; + } + returnToTitle(now, "back"); +} + +// One pal at a time: the cursor holds the middle of the screen and its two +// neighbours recede to either side, so the roster reads as a wheel you turn +// rather than a board you scan. +function selectionTouchLayout() { + const count = selectionOptions().length; + const compact = compactLayout(); + const centerX = viewCenterX(); + const cardWidth = compact ? Math.min(280, viewWidth() * .44) : 680; + const cardHeight = compact ? 360 : 720; + const top = compact ? 176 : 190; + const sideScale = compact ? .5 : .66; + const reach = cardWidth * (1 + sideScale) / 2 + (compact ? 6 : 26); + const slots = count > 2 ? [-1, 0, 1] : count > 1 ? [0, 1] : [0]; + return { + back: compact + ? { x: 24, y: 126, width: 112, height: 50 } + : { x: viewOffsetX() + 90, y: 112, width: 170, height: 70 }, + options: slots.map((slot) => { + const scale = slot === 0 ? 1 : sideScale; + const width = cardWidth * scale; + const height = cardHeight * scale; + return { index: (selectionCursor + slot + count) % count, slot, + x: centerX + slot * reach - width / 2, + y: top + (cardHeight - height) / 2, width, height }; + }), + }; +} + +const pointInRect = (point, rect) => rect && point.x >= rect.x && + point.x <= rect.x + rect.width && point.y >= rect.y && + point.y <= rect.y + rect.height; + +function selectionHover(layout = selectionTouchLayout()) { + const pointer = globalThis.__oskiewarTouch?.pointer; + if (!pointer?.active || !Number.isFinite(pointer.x) || + !Number.isFinite(pointer.y)) return null; + if (pointInRect(pointer, layout.back)) return { back: true }; + const option = layout.options.find((rect) => pointInRect(pointer, rect)); + return option && !selectionOptions()[option.index]?.disabled + ? { option: option.index } : null; +} + +function consumeSelectTouches(now) { + const queue = globalThis.__oskiewarTouch?.taps; + if (!Array.isArray(queue) || !queue.length) return; + const touches = queue.splice(0); + const layout = selectionTouchLayout(); + const options = selectionOptions(); + for (const point of touches) { + if (pointInRect(point, layout.back)) selectionBack(now); + else { + const rect = layout.options.find((option) => pointInRect(point, option)); + // A receding neighbour turns the wheel; the focused card commits. A + // disabled card duds either way. + if (rect && (rect.slot === 0 || options[rect.index]?.disabled)) + chooseSelection(rect.index, now); + else if (rect) { + selectionCursor = rect.index; + playDrum("hat", .55, 0); + } + } + if (!selecting || shellMode === "MENU") break; + } +} + +function updateSelect(now) { + consumeSelectTouches(now); + if (!selecting || shellMode === "MENU") return; + const down = padSnapshots[0]?.down || []; + const previous = selectionPrevious[0]; + const pressed = (button) => down.includes(button) && !previous.includes(button); + const optionCount = selectionOptions().length; + let movement = 0; + if (pressed("ArrowLeft") || pressed("ArrowUp")) movement = -1; + else if (pressed("ArrowRight") || pressed("ArrowDown")) movement = 1; + if (movement) { + let next = selectionCursor; + for (let index = 0; index < optionCount; index++) { + next = (next + movement + optionCount) % optionCount; + if (!selectionOptions()[next]?.disabled) break; + } + if (next !== selectionCursor) { + selectionCursor = next; + playDrum("hat", .55, 0); + } + } + if (pressed("B") || pressed("Menu")) selectionBack(now); + else if (pressed("A")) chooseSelection(selectionCursor, now); + selectionPrevious[0] = down.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; +} + +function randomWindMph() { + return 0; +} + +function rollWind(now = runtime().monotonicUs, immediate = true) { + windTargetMph = 0; + windTargetDirection = 1; + nextWindChangeAt = Infinity; + windMph = 0; + windDirection = 1; + windAcceleration = 0; + emitSignal("wind", -1, windTargetDirection, windTargetMph); +} + +function updateWind(dt, now) { + windMph = 0; + windDirection = 1; + windAcceleration = 0; +} + +// The match ball is drawn from the series identity. That identity is itself +// seeded once per match and recorded, so re-running a demo's inputs inflates +// the same ball -- the name this hashes used to come straight from +// Math.random, which silently made ball radius and mass unreproducible. +function seriesBallType(name) { + // Only the kinds marked for the series. The hover board lives in `ballKinds` + // because it IS one of these objects to the physics, but a match that + // inflated a board as its ball would put two boards on a station that is + // supposed to hold exactly one. + const deck = ballKinds.filter((kind) => kind.series !== false); + const roll = hashUnit("ball:" + (name || "oskiewar")); + return deck[Math.min(deck.length - 1, Math.floor(roll * deck.length))].type; +} + +function resetBalls(now) { + Object.assign(balls[0], + ballKinds.find((kind) => kind.type === matchBallType && kind.series !== false) || + ballKinds[0]); + for (const item of balls) { + // The board is placed, not served. It lies in the far floor corner from + // the pistol, so the bell offers three ways to spend the same seconds: + // rush the middle bare-handed, break left for the board, or break right + // for the gun. Putting it on the centre line instead would have made it + // the only opening move worth making. + if (item.type === "skateboard") { + item.x = tileCenterX(Math.floor((item.spawnCol ?? cornerColLeft) * gridCols / 40)); + item.riderPad = -1; + item.y = skateContact(item.x, terrainFloorAt(item.x)).y - skateAxleDrop - skateWheelRadius; + item.z = 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.skateSpin = 0; + item.heldBy = -1; + const rider = skateparkMap ? players[balls.indexOf(item) - 1] : null; + item.riderPad = rider?.skateboard ? rider.pad : -1; + item.active = skateBoardEnabled && item.riderPad < 0; + item.serveAt = 0; + item.lastHitBy = -1; + item.safeUntil = 0; + item.safePlayers = 0; + continue; + } + const owner = item.spawnOwner >= 0 ? players[item.spawnOwner] : null; + item.x = owner ? owner.spawnX + owner.facing * 180 + : centerX; + item.y = owner ? terrainFloorAt(item.x) - item.radius + : terrainFloorAt(item.x) - gridHeight + item.radius + 40; + // An unowned ball begins airborne over the cube's center tile seam and + // drops onto the middle of the fight. + item.z = owner ? owner.z : 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.heldBy = -1; + item.active = ballEnabled; + item.serveAt = now + roundIntroDurationUs() + 150000; + item.lastHitBy = owner ? owner.pad : -1; + item.safeUntil = item.serveAt; + item.safePlayers = owner ? 1 << owner.pad : 0; + // A serve call for a ball that will never inflate is a sound cue lying. + if (ballEnabled) emitSignal("ballserve", owner ? owner.pad : -1, + owner ? owner.facing : 0, windMph); + } +} + +const buttonLabel = (button) => ({ + ArrowUp: "UP", ArrowDown: "DOWN", ArrowLeft: "LEFT", ArrowRight: "RIGHT", + LeftShoulder: "LB", RightShoulder: "RB", LeftStick: "LEFT STICK", + RightStick: "RIGHT STICK", View: "VIEW", Menu: "MENU", + LeftTrigger: "LT", RightTrigger: "RT", +}[button] || String(button).toUpperCase()); + +function roundDemoState(demo, now) { + const checkpoints = demo?.checkpoints || []; + if (!checkpoints.length) return null; + const roundIndex = Number.isInteger(demo.roundIndex) ? demo.roundIndex + : Math.max(0, (demo.rounds?.length || 1) - 1); + const startTick = demo.rounds?.[roundIndex]?.[0] || 0; + const finalCheckpoint = checkpoints[checkpoints.length - 1]; + const endTick = Math.max(startTick + 1, demo.durationTicks || finalCheckpoint[0]); + const elapsed = Math.floor((now - roundViewerDemoStartedAt) / replayTickUs); + const tick = startTick + elapsed % (endTick - startTick + 1); + let before = checkpoints[0], after = finalCheckpoint; + for (const row of checkpoints) { + if (row[0] <= tick) before = row; + if (row[0] >= tick) { after = row; break; } + } + const amount = clamp((tick - before[0]) / Math.max(1, after[0] - before[0]), 0, 1); + const value = (index) => lerp(before[index], after[index], amount); + const recentAttack = (pad) => { + let kind = ""; + let age = 0; + for (const event of demo.events || []) { + if (event[0] > tick || event[0] < tick - 18 || event[2] !== pad) continue; + if (meleeSpecs[event[1].toUpperCase()]) { + kind = event[1].toUpperCase(); + age = tick - event[0]; + } + } + return { kind, age }; + }; + const fighters = [0, 1].map((pad) => { + const offset = 1 + pad * 8; + const flags = before[offset + 5]; + const name = demo.fighters?.[pad] || `P${pad + 1}`; + const profile = name === "DUMMY" ? npcFighter : name === "BOT" ? botFighter + : fighterRoster.find((fighter) => fighter.handle === name); + // A self-play fighter is called what it wears, so a demo's fighter name + // is first tried against the color book itself — the repaint dresses + // straight from the nameplate. Older demos still say "BOT 1"/"BOT 2"; + // those deal from the wardrobe hash so they don't fall back to the + // house red and blue. + const wornColor = cssColorBook.find( + (entry) => entry.name === name.toLowerCase()); + const selfPlayPad = selfPlayFighters.findIndex( + (fighter) => fighter.handle === name); + const swing = recentAttack(pad); + const vx = value(offset + 3); + return { name, nation: demo.nations?.[pad] || "", + color: wornColor ? wornColor.rgb.slice() + : selfPlayPad >= 0 ? selfPlayWardrobe(selfPlayPad).rgb.slice() + : profile?.color || players[pad].color, + x: value(offset), y: value(offset + 1), z: value(offset + 2), + vx, vy: value(offset + 4), vz: 0, + facing: flags & 8192 ? (flags & 4096 ? 1 : -1) + : vx ? Math.sign(vx) : pad ? -1 : 1, + alive: Boolean(flags & 1), grounded: Boolean(flags & 2), + ducking: Boolean(flags & 4), blocking: Boolean(flags & 8), + removedParts: [...limbParts, "torso"].filter((part, index) => + Boolean(flags & (1 << (index + 4)))), + hit: flags & 16384 ? .9 : 0, blockFlash: flags & 32768 ? 1 : 0, + score: Math.round(value(offset + 6)), + roundWins: Math.round(value(offset + 7)), attack: swing.kind, + attackTicks: swing.age }; + }); + const round = demo.rounds?.[roundIndex] || [startTick, 1, 0, 1]; + const nearEnd = tick >= endTick - 20; + const replayBall = { x: value(17), y: value(18), z: value(19), + radius: 42, active: Boolean(before[22]), spawnOwner: 0 }; + const camera = { x: value(23), y: value(24), + width: Math.max(100, value(25)) }; + // Newer demos carry the live pass's whole camera pose; without it the + // lens position is re-derived from width and close shots near-clip. + if (before.length > 26) { + camera.position = { x: value(26), y: value(27), z: value(28) }; + camera.perspective = value(29); + camera.fov = value(30); + camera.roll = value(31); + } + return { phase: "replay", map: demo.map || "station", tick, fighters, ball: replayBall, + balls: [replayBall], camera, + wind: { direction: round[1], mph: round[2] }, + round: { remainingMs: Math.max(0, Math.round((endTick - tick) * 1000 / + (demo.tickRate || 60))), result: nearEnd + ? demo.winner ? `${demo.winner} WINS ROUND` : "TIE" : "" } }; +} + +function applyRoundViewerState(state, now, dt = 1 / 60) { + if (!state?.fighters?.length || !state.camera || !state.round) return; + workshopHighlight = state.map?.highlights === true; + if (state.map?.id && state.map.id !== currentMapId) { + if (state.map.workshop && globalThis.__oskiewarValidateMap) { + try { installWorkshopMap(globalThis.__oskiewarValidateMap(state.map.workshop)); } + catch { return; } + } else if (workshopMap) { + installWorkshopMap(workshopBase, true); + workshopMap = null; + currentMapId = "halfpipe"; + currentMapName = "HALFPIPE"; + } + } + if (((state.course || state.map) === "skatepark") !== skateparkMap) { + configureWorldMap(state.course || state.map); resetSkateRopes(); + } + if (skateparkMap && Array.isArray(state.ropes) && state.ropes.length === skateRopes.length) + state.ropes.forEach((nodes, index) => { + if (!Array.isArray(nodes) || nodes.length !== chainLinks + 1 || + nodes.some((row) => !Array.isArray(row) || row.length !== 4 || + row.some((n) => !Number.isFinite(n) || Math.abs(n) > 100000))) return; + skateRopes[index].nodes = nodes.map(([x, y, px, py]) => ({ x, y, px, py })); + }); + for (let index = 0; index < players.length; index++) { + const source = state.fighters[index]; + const player = players[index]; + const previousX = player.x; + const previousY = player.y; + // Held to spot the edges the live wire reports as flags but never as the + // sparks and debris the host spawned locally. A demo carries its own + // impact track (replayViewerImpacts), so this reconstruction is LIVE-only. + const wasAlive = player.alive; + const wasHit = player.hit || 0; + const priorParts = player.removedParts?.slice() || []; + for (const key of ["name", "nation", "color", "x", "y", "z", "facing", "alive", + "grounded", "ducking", "blocking", "score", "roundWins", "removedParts", + "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) + if (source[key] !== undefined) player[key] = source[key]; + player.vx = source.vx ?? (player.x - previousX) / Math.max(.001, dt); + player.vy = source.vy ?? (player.y - previousY) / Math.max(.001, dt); + player.vz = source.vz || 0; + // Grandstand coasting rides ONLY a velocity the host actually reported. + // The vx/vy above fall back to a frame-to-frame difference for the walk + // cycle's sake, but that difference is a teleport artifact on the first + // snap and after a wire gap — dead-reckoning it would fling the body. + player.wireVx = Number.isFinite(source.vx) ? source.vx : 0; + player.wireVy = Number.isFinite(source.vy) ? source.vy : 0; + player.attackKind = source.attack || ""; + // A demo knows which tick a swing began on, so the replayed pose can run + // its real arc instead of freezing at one canned mid-swing phase. + player.attackStartedAt = player.attackKind + ? now - (source.attackTicks != null + ? source.attackTicks * replayTickUs : 80000) : 0; + player.attackUntil = player.attackKind ? now + 120000 : 0; + player.hit = source.hit || 0; + player.blockFlash = source.blockFlash || 0; + // The host spawns sparks on a strike, a burst on a lost limb and a + // whoosh-lit puff on a kill; none of that rides the state wire, so the + // grandstand used to watch a body silently pop apart. Reconstruct the + // burst from the flag edges the wire DOES carry — a fresh hit, a new + // missing part, a death — so live watchers see the blow land. + if (roundViewerMode === "LIVE") { + // Reconstructing the strike spark is the fallback for a host too old to + // send its impact track. When the real track is on the frame it wins: + // it is the same spark, in the right place, and doubling them reads as + // a heavier hit than the one that landed. + if (!state.impacts && player.hit > .4 && wasHit <= .4) + impacts.push({ x: player.x, y: player.y - 90, z: player.z, + life: .32, duration: .32, death: false, explosion: true }); + const nowParts = player.removedParts || []; + // A fighter who came back whole is a new round, not a healed limb. + const lost = nowParts.length < priorParts.length ? [] + : nowParts.filter((part) => !priorParts.includes(part)); + if (nowParts.length < priorParts.length) clearRoundViewerEffects(); + if (!state.impacts && (lost.length || (wasAlive && !player.alive))) + impacts.push({ x: player.x, y: player.y - 60, z: player.z, + life: .55, duration: .55, death: true, explosion: false }); + // And the limb itself goes flying. The wire says which part is gone; it + // does not say where the pieces went, and the pieces are the part of a + // dismemberment anybody actually watches. They are spawned from the + // fighter's own pose here and then fall under local physics, so they + // land where the body stands rather than where a packet said it did. + if (lost.length && detachedParts.length < 48) { + // Posed from BEFORE the loss, on a copy: the wire's removedParts are + // already applied to the live fighter, and a body's geometry no + // longer carries the limbs it has lost — so asking the fighter as it + // stands now returns no segments to throw. + const pose = runnerWorldGeometry({ ...player, removedParts: priorParts }, + (now - startedAt) / 1000000); + const rival = players[player.pad === 0 ? 1 : 0]; + for (const part of lost) + spawnDetachedPart(player, part, pose, rival?.x ?? player.x, now); + } + } + } + const sources = state.balls || [state.ball]; + for (let index = 0; index < balls.length; index++) { + const source = sources[index]; + if (!source) { balls[index].active = false; continue; } + for (const key of ["x", "y", "z", "radius", "active", "spawnOwner", + "type", "mass", "heldBy"]) + if (source[key] !== undefined) balls[index][key] = source[key]; + } + // A frame that carries no projectile rows is an older host or a stored + // demo, and its shots are simply unknown — leaving the arrays alone is the + // honest answer. A frame that carries an empty row set is a host saying the + // air is clear, and that clears it. + if (state.shots) applyWireShots(state.shots); + if (state.lobs) applyWireLobs(state.lobs); + if (state.impacts) applyWireImpacts(state.impacts); + cameraCenter = state.camera.x; + cameraCenterY = state.camera.y; + cameraWidth = state.camera.width; + if (state.wind) { + windDirection = state.wind.direction; + windMph = state.wind.mph; + windAcceleration = windDirection * windMph * 16; + } + const hadResult = Boolean(roundResult); + roundResult = state.round.result || ""; + roundCause = state.round.cause || + (roundResult.includes("BALLED") ? "BALLED" : roundResult ? "ROUND" : ""); + // Whether the round on the wire has a clock is the HOST's fact, not a thing + // to re-derive locally: `roundIsTimed()` answers from the machine it runs + // on, and a watcher's machine is not in the fight. A demo carries no flag + // and was always a timed, recorded round. + roundViewerTimed = state.round.timed !== false; + // The round's own age, intro included, straight off the wire. Deriving it + // from `remainingMs` instead is what broke the versus lane: that field is + // zero on an untimed round, so the clock landed a full round duration in + // the past, `counting` was never true, and the intro card never drew. + const elapsedUs = Number.isFinite(state.round.elapsedMs) + ? state.round.elapsedMs * 1000 : null; + roundElapsedUs = roundViewerTimed + ? Math.max(0, roundDurationUs - state.round.remainingMs * 1000) + : elapsedUs === null ? 0 + : Math.max(0, elapsedUs - roundIntroDurationUs()); + matchOver = state.phase === "match"; + roundStartedAt = elapsedUs === null + ? now - roundIntroDurationUs() - roundElapsedUs : now - elapsedUs; + if (roundResult && !hadResult) roundOverAt = now; + const target = state.camera.target || { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: state.camera.position || + { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: state.camera.perspective || 0, + fov: state.camera.fov || 55, roll: state.camera.roll || 0 }, dt, 1000); +} + +// Shots and lobs arrive as the flat number rows spectatorState packs (owner +// and kind folded into one flag word). They are rebuilt rather than merged: +// a round has no identity on the wire, so matching this frame's third bullet +// to last frame's third bullet would be a guess, and a wrong guess teleports +// a streak across the arena. The arrays themselves keep their identity — the +// camera's swept-path packer and the render interpolator both hold references +// to them. +function applyWireShots(rows) { + bullets.length = 0; + for (const row of rows) { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + bullets.push({ x, y, z, previousX, previousY, vx, vy, + owner: owner === 1 ? 1 : 0, life: 1, safeUntil: 0, + spit: Boolean(flags & 1), heavy: Boolean(flags & 2), + rubber: Boolean(flags & 4), + // No bounce history came up the wire, so a watched round draws its + // streak and no ricochet tail. drawBulletTrail reads the count first + // and an empty one costs it nothing. + trail: [], trailCount: 0 }); + } +} + +// The host's impact track, which repeats each mark for as long as it burns. +// The id is what makes a repeat readable as a repeat: a watcher spawns only +// the numbers it has not seen, at the age the frame reports, and then runs +// them out on its own physics. +function applyWireImpacts(rows) { + if (!rows.length) return; + const newest = rows[rows.length - 1][0]; + // Numbers only climb within one host's run. A lower one is a different + // host, or the same one restarted, and nothing before it has been seen. + if (newest < roundViewerImpactId) roundViewerImpactId = 0; + for (const row of rows) { + const [id, x, y, z, durationMs, lifeMs, flags] = row; + if (id <= roundViewerImpactId) continue; + impacts.push({ x, y, z, duration: durationMs / 1000, + life: Math.max(.001, lifeMs / 1000), + death: Boolean(flags & 1), explosion: Boolean(flags & 2) }); + } + roundViewerImpactId = Math.max(roundViewerImpactId, newest); +} + +function applyWireLobs(rows) { + grenades.length = 0; + for (const row of rows) { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + // Only live grenades ride out, so anything here is alive by definition — + // which is also what puts it in the render list. + grenades.push({ x, y, z, vx, vy, owner: owner === 1 ? 1 : 0, alive: true, + rocket: Boolean(flags & 1), exploding: Boolean(flags & 2), + blastRadius, blastAge: 0, fuse: fuseMs / 1000, hitPlayers: 0 }); + } +} + +function handleRoundViewer(message) { + const now = runtime().monotonicUs; + matchName = message.roundName || matchName; + if (message.type === "round") { + roundViewerDemo = null; + roundViewerMode = ""; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + return; + } + if (message.type === "status") { + roundViewerStatus = String(message.content?.label || "waiting").toUpperCase(); + // A room that goes dark keeps no queue: whatever arrives next belongs to + // a new timeline, and a stale frame blended into it is a teleport. + if (message.content?.live === false) resetRoundViewerPlayout(); + return; + } + if (message.type === "demo") { + // A demo with bot seeds can be re-simulated — the honest path. The + // bridge hands over the recording and steps aside so the real sim runs; + // seedless demos (older, or human-driven) still puppet through the + // viewer below. + if (globalThis.__oskiewarResim && Array.isArray(message.content?.botSeeds)) { + roundViewerStop?.(); + roundViewer = null; + // The reset waits for the first stepped tick so it lands inside the + // sim clock the way a live round roll does — resetting here, on the + // bridge's wall clock, would skew the intro against the recording. + resimPending = message.content; + globalThis.__oskiewarReplayReady = true; + return; + } + roundViewerDemo = message.content; + roundViewerDemoStartedAt = now; + roundViewerMode = "DEMO"; + resetRoundViewerPlayout(); + globalThis.__oskiewarReplayReady = true; + return; + } + if (message.type === "net") { + if (netSession) netInbox.push(message.content); + else netHandlePreSession(message.content); + return; + } + if (netSession && message.type === "state") return; + if (message.type === "state") { + // The room says whether anybody is publishing, and it says so before it + // hands over any frame. A frame that arrives while nobody is is the last + // thing a host said before it left — kept by the relay and given to + // whoever opens the door next. Going LIVE on it paints that frozen round + // as a fight in progress, and since one frame can never bracket the + // playout clock, nothing in it is ever applied: the fighters keep + // whatever names this engine was already holding and the HUD tells the + // new arrival which of those two strangers they are. + if (!message.live) return; + if (roundViewerDemo && message.content?.phase === "match") return; + roundViewerMode = "LIVE"; + queueRoundViewerState(message.content); + } +} + +// A fresh timeline: a room change, a takeover, a host that went away. The +// queue, the playout clock and the measured health all start over, because +// every one of them is a statement about a wire that no longer exists. +// Sparks, debris and fallen limbs belong to one round on one wire. A new +// round, a new room or a host that went away takes them with it. +function clearRoundViewerEffects() { + impacts.length = 0; + detachedParts.length = 0; + roundViewerImpactId = 0; +} + +function resetRoundViewerPlayout() { + clearRoundViewerEffects(); + roundViewerFrames = []; + roundViewerPlayoutMs = 0; + roundViewerLiveAt = 0; + roundViewerGapMs = 33; + roundViewerJitterMs = 0; + roundViewerLossPct = 0; + roundViewerSeq = -1; + roundViewerSeqHeard = 0; + roundViewerSeqExpected = 0; +} + +// A frame lands here, in a socket callback, between one simulation tick and +// the next paint. Painting it from inside that callback is what smeared every +// correction across two frames: the render interpolator had already captured +// the pre-frame pose, so the next paint landed partway into the new state and +// the one after finished the jump. So the frame is only filed — stamped with +// its arrival and measured — and the tick decides when it is due. +function queueRoundViewerState(state) { + const at = Date.now(); + const gap = roundViewerLiveAt ? at - roundViewerLiveAt : 0; + roundViewerLiveAt = at; + if (gap > 0 && gap < 2000) { + roundViewerGapMs += (gap - roundViewerGapMs) * .12; + roundViewerJitterMs += + (Math.abs(gap - roundViewerGapMs) - roundViewerJitterMs) * .12; + } + // Loss read off the host's own sequence numbers, over a rolling window. + // This is where the relay's coalescing shows: a frame it dropped inside its + // 25 ms gate leaves a hole in the count that nothing else on this side can + // see. A takeover or a fresh room rewinds the sequence, which restarts the + // window rather than reading as a hundred lost frames. + const seq = Number(state?.seq); + if (Number.isFinite(seq)) { + if (roundViewerSeq >= 0 && seq > roundViewerSeq) { + roundViewerSeqExpected += seq - roundViewerSeq; + roundViewerSeqHeard += 1; + if (roundViewerSeqExpected >= 180) { + roundViewerLossPct = clamp(Math.round( + (1 - roundViewerSeqHeard / roundViewerSeqExpected) * 100), 0, 100); + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + } else { + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + roundViewerSeq = seq; + } + // One wire frame plus twice the jitter actually measured, held inside a + // window where a buffer is still worth more than it costs. The delay itself + // moves slowly: resizing it quickly would time-warp the picture. + const want = clamp(roundViewerGapMs + roundViewerJitterMs * 2 + 8, 45, 220); + roundViewerDelayMs += (want - roundViewerDelayMs) * .05; + roundViewerFrames.push({ state, at }); + // A ceiling, not a working depth: the playout holds about three frames. + // This only catches a tab whose simulation parked while the wire kept + // arriving, and the clock's own thousand-millisecond reset sorts out the + // rest when the tab comes back. + if (roundViewerFrames.length > 32) roundViewerFrames.shift(); +} + +// How far past the newest frame in hand the grandstand keeps coasting on wire +// velocity before it holds still. Inside the buffer nothing coasts at all — +// the pose is blended between two frames the host really sent. Past the +// buffer the velocity goes stale fast enough that coasting walks a fighter +// through a wall or floats them past a jump's apex, so a long gap freezes the +// pose instead of inventing motion. +const liveDeadReckonMaxMs = 150; + +function updateRoundViewer(now, dt) { + if (roundViewerDemo && roundViewerMode === "DEMO") { + const state = roundDemoState(roundViewerDemo, now); + if (state) { + applyRoundViewerState(state, now, dt); + replayViewerImpacts(state.tick, dt); + } + return; + } + if (roundViewerMode !== "LIVE" || !roundViewerFrames.length) return; + const wall = Date.now(); + const target = wall - roundViewerDelayMs; + // A first frame, or a wire that stopped and came back, sets the clock + // outright. Every other tick advances it by the simulation's own dt and + // leans a twentieth of the way toward where it belongs. Leaning rather than + // snapping is what keeps the picture's rate the sim's rate: a clock pinned + // to the wall every tick replays the network's jitter as motion. + if (!roundViewerPlayoutMs || Math.abs(target - roundViewerPlayoutMs) > 1000) + roundViewerPlayoutMs = target; + else roundViewerPlayoutMs += dt * 1000 + + (target - roundViewerPlayoutMs) * .05; + const play = roundViewerPlayoutMs; + // Hold exactly one frame behind the clock: it is the left end of the pair + // being blended, and the one to coast from if the buffer runs dry. + while (roundViewerFrames.length > 1 && roundViewerFrames[1].at <= play) + roundViewerFrames.shift(); + const before = roundViewerFrames[0].at <= play ? roundViewerFrames[0] : null; + const after = before ? roundViewerFrames[1] : roundViewerFrames[0]; + if (before && after) { + const span = Math.max(1, after.at - before.at); + const alpha = clamp((play - before.at) / span, 0, 1); + applyRoundViewerState(blendRoundViewerStates(before.state, after.state, + alpha, (play - before.at) / 1000), now, dt); + updateRoundViewerEffects(dt); + return; + } + // Starved, or not yet arrived at the first frame. The newest thing in hand + // is the truth; past it the bodies coast on the velocity that frame + // reported — measured from that frame's own position, so the reckoning is + // never compounded and the next arrival needs no correcting snap. + const edge = before || after; + applyRoundViewerState(edge.state, now, dt); + if (before) + coastRoundViewer(Math.min(play - before.at, liveDeadReckonMaxMs) / 1000); + updateRoundViewerEffects(dt); +} + +// The half of the fight a watcher is allowed to run for itself. Sparks, their +// debris and the limbs that came off are cosmetic: nothing here decides a hit +// or a score, so none of it has to agree with the host bit for bit — it only +// has to happen. Before this, `impacts` grew for the life of the connection +// and never drew a mote, because the function that grows an impact's debris +// ran only in a demo or a hosted sim. +function updateRoundViewerEffects(dt) { + updateResultImpactDebris(dt); + if (detachedParts.length) updateDetachedParts(dt, false); +} + +// Dead reckoning, and only past the end of the buffer. +function coastRoundViewer(seconds) { + if (seconds <= 0) return; + for (const player of players) { + if (!player.alive) continue; + // Coast the delta only — the host's reported position is truth and may + // sit anywhere it says (legacy rooms even ran off the cube). + player.x += (player.wireVx || 0) * seconds; + player.y += (player.wireVy || 0) * seconds; + } + for (const item of balls) { + if (!item.active) continue; + item.x += (item.vx || 0) * seconds; + item.y += (item.vy || 0) * seconds; + } + // Both ends of a shot move together: the streak's length is the round's + // speed, not the size of the gap we are papering over. + for (const shot of bullets) { + shot.x += (shot.vx || 0) * seconds; + shot.y += (shot.vy || 0) * seconds; + shot.previousX += (shot.vx || 0) * seconds; + shot.previousY += (shot.vy || 0) * seconds; + } + for (const lob of grenades) { + if (lob.exploding) continue; + lob.x += (lob.vx || 0) * seconds; + lob.y += (lob.vy || 0) * seconds; + } +} + +// The pose the grandstand actually paints: two frames the host really sent, +// blended. Continuous quantities interpolate; everything discrete — who is +// alive, which limbs are gone, what phase the round is in — comes from the +// frame already reached, because a fighter must not die before the pose that +// killed them has finished arriving. +const blendFighterKeys = ["x", "y", "z", "vx", "vy", "vz", "hit", + "blockFlash", "attackTicks"]; +const blendCameraKeys = ["x", "y", "width", "perspective", "fov", "roll"]; +const blendPointKeys = ["x", "y", "z"]; + +function blendNumbers(from, to, keys, t) { + const out = { ...from }; + if (!to) return out; + for (const key of keys) { + const a = Number(from?.[key]); + const b = Number(to[key]); + if (Number.isFinite(a) && Number.isFinite(b)) out[key] = a + (b - a) * t; + } + return out; +} + +function blendRoundViewerStates(from, to, t, seconds) { + const state = { ...from }; + state.fighters = (from.fighters || []).map((fighter, index) => + blendNumbers(fighter, to.fighters?.[index], blendFighterKeys, t)); + const blendBall = (ball, other) => + ball ? blendNumbers(ball, other, blendPointKeys, t) : ball; + if (from.balls) + state.balls = from.balls.map((ball, index) => + blendBall(ball, to.balls?.[index])); + if (from.ball) state.ball = blendBall(from.ball, to.ball); + if (from.camera) { + state.camera = blendNumbers(from.camera, to.camera, blendCameraKeys, t); + for (const part of ["position", "target"]) + if (from.camera[part]) state.camera[part] = + blendNumbers(from.camera[part], to.camera?.[part], blendPointKeys, t); + } + // Projectiles have no identity on the wire, so they are carried forward on + // their own reported velocity rather than matched against the next frame's + // rows — a wrong match teleports a streak across the arena. A shot flies + // straight, so this is not an approximation of the host's path, it IS it. + if (from.shots) state.shots = from.shots.map((row) => { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + return [x + vx * seconds, y + vy * seconds, z, + previousX + vx * seconds, previousY + vy * seconds, vx, vy, owner, flags]; + }); + if (from.lobs) state.lobs = from.lobs.map((row, index) => { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + const next = to.lobs?.[index]; + // A blast's ring grows over a fifth of a second, which is six wire + // frames — steppy enough to see. It blends when the next frame plainly + // holds the same blast; otherwise the radius stands. + const radius = next && next[6] === flags && next[5] === owner + ? blastRadius + (next[7] - blastRadius) * t : blastRadius; + const moving = flags & 2 ? 0 : seconds; + return [x + vx * moving, y + vy * moving, z, vx, vy, owner, flags, + radius, fuseMs]; + }); + return state; +} + +// The buttons a challenger's pad may carry up the wire — the fight's own +// vocabulary, no system keys. View and Menu stay local: a rival must never +// toggle the host's debug overlay or send their game back to the title. +const versusInputButtons = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"]; +// The buttons of the last frame the wire actually took, held apart from the +// whole frame so a press can be told from a stick twitch. +let versusInputLastDown = "[]"; + +// The challenger's half of the versus wire: sample the local pad, ship it on +// change, and heartbeat while idle so silence can mean absence. Sends pace +// themselves a hair above the relay's own floor — a press that lands inside +// the pause simply leaves on the next tick rather than being dropped. +function sendChallengerInput(now) { + if (roundViewer?.seat !== "challenger" || + typeof roundViewer.sendInput !== "function") return; + // Holding the chair is not the same as sitting in it. A visitor who has not + // come through the door sends nothing, so the host reads the seat as empty + // and the room stays open for somebody who has — and this visitor keeps + // watching the fight, which was never gated. + if (!versusAllowed()) return; + const pad = typeof gamepad === "function" ? gamepad(0) : null; + if (!pad) return; + const down = (pad.down || []) + .filter((button) => versusInputButtons.includes(button)).slice(0, 10); + const round2 = (value) => Math.round((Number(value) || 0) * 100) / 100; + const frame = { down, leftX: round2(pad.leftX), leftY: round2(pad.leftY) }; + const worn = JSON.stringify(frame); + // A button edge leaves at once. The 33 ms floor was written to pace a + // stick, which drifts continuously and would otherwise send every tick — + // but a press is a discrete event, and holding one back for up to two + // frames put a third of a display's lag into the one thing a player feels + // most. Only the analog half still waits. + const pressed = JSON.stringify(down); + const edge = pressed !== versusInputLastDown; + if (!edge) { + if (worn !== versusInputLastSent) { + if (now < versusInputMinNextAt) return; + } else if (now < versusInputNextAt) return; + } + versusInputMinNextAt = now + 33000; + // An unchanged frame is repeated once soon after a change, then settles + // into the idle heartbeat. The relay drops what arrives too fast and says + // nothing about it, so a lost edge used to be invisible for a quarter of a + // second; one cheap echo closes that window without adding a protocol. + versusInputNextAt = now + (edge ? 50000 : 250000); + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + if (roundViewer.sendInput({ seq: versusInputSeq++, ...frame, + name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors })) { + versusInputLastSent = worn; + versusInputLastDown = pressed; + } +} + +// --------------------------------------------------------------------------- +// Rollback netplay. Both seats run the whole fight; nobody streams it to the +// other. Each tick a seat schedules its own pad a couple of frames ahead, +// mails it, and simulates the current frame with the rival's last known pad +// standing in for the one that has not arrived. When the real pad lands and +// differs, the sim steps back to the snapshot before that frame and replays +// forward in silence. That is what Street Fighter 6 does; the price is a +// simulation that is a pure function of (frame, both pads), and a snapshot of +// every variable that simulation touches. The list lives in netSimScalars / +// netSimArrays below and the netplay test pins it: two seats fed the same +// pads must hash identical states, round after round. +const NET_TICK_US = replayTickUs; +// Frames a press waits before it is simulated. Two at 60 Hz is 33 ms — the +// same order as a display's own lag, and it means a rival packet arriving +// within ~33 ms costs no rollback at all. +const NET_INPUT_DELAY = 2; +// How far past the rival's newest pad we will guess before we stop and wait. +// Eight frames is 133 ms of one-way silence, well past the relay's p99. +const NET_MAX_ROLLBACK = 8; +// Pads per packet. Every packet re-sends this many recent frames so a lost +// packet costs nothing unless several vanish in a row. +const NET_REDUNDANCY = 10; +const NET_HASH_EVERY = 30; +// The floor of frame zero's clock. The host offers its own clock rounded up +// to a tick so its timeline runs straight into the fight; this floor keeps +// every "0 means unset" deadline in the sim unset whatever the host reports. +const NET_ORIGIN_US = 1000000; +// Wall-clock silence after which the rival is gone and the fight ends. +const NET_PEER_LOST_MS = 4000; +const NET_HELLO_INTERVAL_MS = 1000; +let netInbox = []; +let netPeerHello = null; +let netHelloSentAt = 0; +const netPadCache = new Map(); + +// A recorded mask back into the pad shape the sim reads (see resimPad). One +// object per mask value, frozen, so a frame costs no allocation. +function netPadFromMask(mask) { + mask = mask | 0; + let pad = netPadCache.get(mask); + if (pad) return pad; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + pad = Object.freeze({ connected: true, down: Object.freeze(down), + leftX: 0, leftY: 0, rightX: 0, rightY: 0 }); + netPadCache.set(mask, pad); + return pad; +} + +// Everything the simulation reads or writes that is not a constant, a render +// cache, or the wire. Scalars are captured and restored by name; the arrays +// are deep-copied. The netplay test pins that this list covers the round clock. +function netSimScalars() { + return { + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + }; +} +function netRestoreScalars(saved) { + ({ + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + } = saved); +} +const netSimArrays = () => ({ + players, balls, bullets, grenades, impacts, detachedParts, skateRopes, + // `saberPickups` belongs here for the same reason every other array does, + // and leaving it out was a real desync: a rollback that does not restore it + // re-simulates frames in which a blade was already taken, or takes one that + // the rewound timeline had not yet dropped. `swordHeld` itself rides on the + // player and was always restored -- which is what made this so quiet. The + // two seats agreed about every number they hashed while disagreeing about + // whether somebody was holding a sword, and a sword is a 1.5x reach + // multiplier in `meleeSpecFor`, so they went on agreeing right up until a + // strike landed one frame apart on one screen and not the other. + gunPickups, saberPickups, grenadePickups, bodyTrees, gridField, + resultReactionPrevious, fightHitMarks, +}); + +function netSnapshot() { + const arrays = {}; + for (const [name, live] of Object.entries(netSimArrays())) + arrays[name] = structuredClone(live); + return { scalars: netSimScalars(), arrays }; +} + +// Restore in place: the live arrays are `const` and referenced everywhere, so +// their identity stays and their contents are replaced. Keys the live object +// grew since the snapshot are removed too — a key the sim added later must not +// survive a rewind. +function netRestore(snapshot) { + if (!snapshot.scalars.skateparkMap && snapshot.scalars.netRoundMapIndex >= 0 && + netRoundMapIndex !== snapshot.scalars.netRoundMapIndex) + installRoundMap(snapshot.scalars.netRoundMapIndex); + configureWorldMap(snapshot.scalars.skateparkMap ? "skatepark" : "station"); + netRestoreScalars(structuredClone(snapshot.scalars)); + const live = netSimArrays(); + for (const [name, saved] of Object.entries(snapshot.arrays)) { + const target = live[name]; + const copy = structuredClone(saved); + if (ArrayBuffer.isView(target)) { target.set(copy); continue; } + if (target.length === copy.length && copy.every((entry) => + entry && typeof entry === "object" && !Array.isArray(entry))) { + for (let index = 0; index < target.length; index++) { + const item = target[index]; + if (!item || typeof item !== "object") { target[index] = copy[index]; continue; } + for (const key of Object.keys(item)) + if (!(key in copy[index])) delete item[key]; + Object.assign(item, copy[index]); + } + } else { + target.length = 0; + target.push(...copy); + } + } +} + +// FNV-1a over the state that decides a fight. Exact doubles, not rounded: a +// last-bit difference is a real desync and must read as one. +// Debug only: the exact JSON the last hash was taken over, and a ring of it +// per frame while `__oskiewarHashTrace` is set. A desync report names a +// frame and two numbers; this is what turns those numbers back into fields. +let netLastHashText = ""; +const netHashTexts = new Map(); +function netStateHash() { + const view = players.map((player) => [player.x, player.y, player.z, + player.vx, player.vy, player.vz, player.facing, player.alive, + player.grounded, player.ducking, player.blocking, player.score, + player.roundWins, player.attackKind, player.attackUntil, + player.hitStunUntil, player.stance, player.gunAmmo, player.grenadeAmmo, + player.heldBall, player.removedParts, player.dashUntil, + // Holding a blade decides how far a hand reaches, so it decides the + // fight and belongs in the hash. It is here because it was NOT here: two + // seats disagreeing about a sword hashed identically for hundreds of + // frames and were found apart only once the reach changed an outcome, + // which is the most expensive way to learn about a desync. + player.skateboard, player.skateVx, player.skateWallSide, + player.skatePitch || 0, player.skateContacts || 0, player.swordHeld, player.ropeIndex, player.ropeLink, player.ropeGrabLocked, player.skateLoop, + player.loopAngle, player.loopSpeed, player.loopCooldownUntil, player.skateRotation, player.boostUntil, + player.headBounceCharge || 0, player.headPumpDirection || 0, player.headPumpAt || 0, + player.headRoll || 0, player.headRollRate || 0, + player.knockVx, player.windVx, player.dashVx, player.inputX, player.inputY, + player.previous, player.suppressedDirections, player.lastTap, player.lastRelease]); + view.push(skateparkMap, netRoundMapIndex, roundModifier, netRoundClockDebtUs, skateRopes); + view.push(balls.map((item) => [item.active, item.x, item.y, item.z, + item.vx, item.vy, item.heldBy])); + // Projectiles by position, not just by count. A round whose flight differs + // between the two machines kills different fighters, and hashing only the + // length let that drift silently: the count matched right up to the frame + // one seat's bullet connected and the other's missed. + view.push(bullets.map((shot) => [shot.x, shot.y, shot.z, shot.vx, shot.vy, + shot.owner, shot.life])); + view.push(grenades.map((lob) => [lob.x, lob.y, lob.z, lob.vx, lob.vy, + lob.owner, lob.fuse, lob.alive, lob.exploding, lob.blastRadius, + lob.hitPlayers])); + view.push([...gunPickups, ...saberPickups, ...grenadePickups].map(p => + [p.kind || "GRENADE", p.active, p.x, p.y, p.dropVy || 0, + p.dropping || false, p.dropLandingY ?? null, p.respawnAt || 0])); + view.push(roundResult, roundElapsedUs, + matchOver, roundStartedAt, roundOverAt); + const text = JSON.stringify(view); + if (globalThis.__oskiewarHashTrace) netLastHashText = text; + let hash = 0x811c9dc5; + for (let index = 0; index < text.length; index++) { + hash ^= text.charCodeAt(index); + hash = Math.imul(hash, 0x01000193) >>> 0; + } + return hash; +} + +// The local seat's handle and wardrobe, in the shape the pad frames already +// carry, so the host can dress both fighters the same way on both screens. +function netLocalIdentity() { + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + return { name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors }; +} + +function netCleanName(value, fallback) { + const offered = String(value || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); + return /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : fallback; +} + +function netCleanColors(value) { + return (Array.isArray(value) ? value : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)).slice(0, 4); +} + +function netAverageColor(colors, fallback) { + if (!colors.length) return fallback.slice(); + return colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); +} + +// The deal the host writes and both seats apply: who sits where, wearing +// what, and the clock and ball they share. Everything the first frame's +// state derives from that is not already a constant of the build. +function netMakeDeal() { + const local = players[0]; + const rival = netPeerHello || {}; + const rivalColors = netCleanColors(rival.colors); + const hostNow = Math.max(NET_ORIGIN_US, runtime().monotonicUs); + const origin = Math.ceil((hostNow + NET_TICK_US) / NET_TICK_US) * NET_TICK_US; + return { t: "start", v: 2, origin, delay: NET_INPUT_DELAY, + ballType: matchBallType, map: skateparkMap ? "skatepark" : "station", + fighters: [ + { name: netCleanName(local.name, ""), rosterIndex: local.rosterIndex, + color: local.color.slice(0, 3), + handleColors: netCleanColors(local.handleColors) }, + { name: netCleanName(rival.name, ""), rosterIndex: -1, + color: netAverageColor(rivalColors, [38, 82, 176]), + handleColors: rivalColors }, + ] }; +} + +function netApplyIdentities(deal) { + deal.fighters.forEach((entry, index) => { + const player = players[index]; + player.name = entry.name; + player.rosterIndex = entry.rosterIndex; + player.color = entry.color.slice(); + player.handleColors = entry.handleColors.map((c) => c.slice()); + }); + versusRivalName = deal.fighters[1].name; +} + +// Frame zero. Both seats run this with the same deal under the same clock, +// and the state that comes out is the state the fight starts from — the +// hash exchange on the first frame says whether it really is. +function netBegin(deal, seat, send) { + netEnd("restart"); + const session = { seat, deal, frame: 0, originUs: deal.origin, + delay: deal.delay, send, + local: new Map(), remote: new Map(), used: new Map(), snapshots: new Map(), + remoteFrame: -1, remoteSimFrame: 0, remoteLead: null, lastRemoteMask: 0, ackFrame: -1, + confirmed: -1, hashes: new Map(), peerHashes: new Map(), + lastPacketAt: Date.now(), startedAt: Date.now(), ticks: 0, + // peerStamp is the newest wall-clock mark heard from the rival, echoed + // back on our next packet so they can read their own round trip; pingMs is + // ours, read from the echoes coming the other way. + peerStamp: 0, + stats: { rollbacks: 0, rolledFrames: 0, maxRollback: 0, stalls: 0, + waits: 0, sent: 0, received: 0, desyncs: 0, snapshotMs: 0, resimMs: 0, + // `pings` counts measurements, not milliseconds: a round trip under half + // a millisecond rounds to zero, and a meter that reads "no measurement + // yet" on a LAN would be wrong at exactly the moment it is best. + pings: 0, pingMs: 0 } }; + for (let frame = 0; frame < deal.delay; frame++) session.local.set(frame, 0); + netSession = session; + // The relay's clock is the fight's clock: a host who was reading tells at + // quarter speed is back at full the moment the rival is real. + if (gameSpeed !== 1) { + gameSpeed = 1; + gameSpeedChangedAt = 0; + emitSignal("game-speed", -1, 1, 0); + } + netRoundClockDebtUs = 0; + netClockUs = deal.origin; + netFrameInputs = [0, 0]; // Never inherit either machine's local Menu/held pad. + try { + configureWorldMap(deal.map); + netRoundMapIndex = -1; + matchBallType = deal.ballType; + // The limb poses that collide are phased off this epoch, so both seats + // must share it; and a rollback fight is never a recorded one. + startedAt = deal.origin; + lastSimAt = deal.origin; + replay = null; + startVersusFight(deal.origin, true); + netApplyIdentities(deal); + } finally { + netFrameInputs = null; + netClockUs = null; + } + telemetry("NET_BEGIN", "seat " + seat + " delay " + deal.delay); +} + +// Leaving on purpose tells the rival at once instead of costing them the +// silence timeout; whatever the leaving seat's game did next stands. +function netLeave(reason) { + if (!netSession) return; + try { netSession.send({ t: "bye", o: netSession.originUs, r: reason }); } + catch (_) {} + netEnd(reason); +} + +function netEnd(reason) { + if (!netSession) return; + // A rival who has gone will never confirm anything, and the round they lost + // still happened — the frames past the frontier cannot change with nobody + // left to press anything. + flushPendingRoundReplay(runtime().monotonicUs); + const stats = netSession.stats; + // A seat in a rollback fight sends net packets, not pads, so the moment + // this lane closes the host has heard nothing on the pad wire for as long + // as the fight lasted. Read literally that is an empty chair, and an empty + // chair resets the match — which would turn a repaired desync into a lost + // score. The grace covers the changeover; a rival who has genuinely gone + // still times out, just three seconds later. + if (reason === "desync" || reason === "desync-peer" || reason === "workshop") + versusSeatGraceUntil = Date.now() + 3000; + // The stream this seat is about to start watching again is a new timeline. + if (roundViewer) resetRoundViewerPlayout(); + // Time never runs backwards: the local clock picks up where the fight's + // clock stood, so every deadline the fight left behind is still meaningful. + scaledClockUs = Math.max(scaledClockUs, + netSession.originUs + netSession.frame * NET_TICK_US - netRoundClockDebtUs); + telemetry("NET_END", reason + " frames " + netSession.frame + + " rollbacks " + stats.rollbacks + " rolled " + stats.rolledFrames + + " max " + stats.maxRollback + " stalls " + stats.stalls + + " waits " + stats.waits + " desyncs " + stats.desyncs); + netSession = null; + netInbox.length = 0; + netPeerHello = null; + globalThis.__oskiewarNetStats = null; +} + +// The rival's pad for a frame: the real one if it came, otherwise the newest +// one we have — a hand mostly keeps doing what it was doing. +function netRemoteInputFor(session, frame) { + const known = session.remote.get(frame); + if (known !== undefined) return known; + for (let back = frame - 1; back >= 0 && back >= frame - NET_MAX_ROLLBACK * 2; back--) { + const older = session.remote.get(back); + if (older !== undefined) return older; + } + return session.lastRemoteMask; +} + +function netInputsFor(session, frame) { + const local = session.local.get(frame) ?? 0; + const remote = netRemoteInputFor(session, frame); + return session.seat === 0 ? [local, remote] : [remote, local]; +} + +function netSimulateFrame(session, frame, silent) { + const started = performance.now(); + session.snapshots.set(frame, netSnapshot()); + session.stats.snapshotMs += performance.now() - started; + const inputs = netInputsFor(session, frame); + session.used.set(frame, inputs); + netFrameInputs = inputs; + netRoundClockDebtUs += NET_TICK_US * (1 - roundSpeed()); + netClockUs = session.originUs + (frame + 1) * NET_TICK_US; + netSilent = silent; + try { + gameSim(); + } finally { + netClockUs = null; + netSilent = false; + netFrameInputs = null; + } +} + +// A rollback un-happens frames, and the frames it un-happens were written +// down. Every row in a demo's logs is stamped with the tick it belongs to, so +// taking the record back to a frame is a truncation — and the silent +// re-simulation that follows re-files the corrected rows itself, which is why +// the recorders are NOT muted while it runs. The two cursors that decide when +// the next row is due are rebuilt from what survives, so they rewind too +// without having to ride in the snapshot. +// +// Without this a versus demo was written from mispredicted frames: it recorded +// the rival pad this seat had GUESSED, so the stored fight replayed into a +// different one. That is what "a rollback fight is never a recorded one" meant. +function replayRewind(session, toFrame) { + if (!replay) return; + const tick = demoTick(session.originUs + (toFrame + 1) * NET_TICK_US); + const keep = (rows) => { + if (!Array.isArray(rows)) return rows; + let length = rows.length; + while (length > 0 && rows[length - 1][0] >= tick) length--; + rows.length = length; + return rows; + }; + keep(replay.commands); + keep(replay.checkpoints); + keep(replay.events); + keep(replay.impacts); + keep(replay.rounds); + keep(replayRoundMarks); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + // The dedupe cursor is whatever each pad was last recorded as saying; a + // command that was truncated must be writable again. + replayLastCommand = [-1, -1]; + for (const row of replay.commands) replayLastCommand[row[1]] = row[2]; + replayNextCheckpointAt = replay.checkpoints.length + ? session.originUs + (toFrame + 1) * NET_TICK_US : 0; + // A round whose end was taken back is not a round to file. + if (replayPendingSaveFrame >= toFrame) replayPendingSaveFrame = -1; +} + +// The earliest frame we simulated with a guessed rival pad that has since +// been contradicted. Frames past `confirmed` are the only candidates. +function netEarliestMisprediction(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + for (let frame = session.confirmed + 1; frame < session.frame; frame++) { + const real = session.remote.get(frame); + if (real === undefined) return null; + const used = session.used.get(frame); + if (used && used[remoteSeat] !== real) return frame; + session.confirmed = frame; + } + return null; +} + +function netRollback(session, toFrame) { + const started = performance.now(); + const depth = session.frame - toFrame; + netRestore(session.snapshots.get(toFrame)); + replayRewind(session, toFrame); + for (let frame = toFrame; frame < session.frame; frame++) + netSimulateFrame(session, frame, true); + session.stats.rollbacks++; + session.stats.rolledFrames += depth; + session.stats.maxRollback = Math.max(session.stats.maxRollback, depth); + session.stats.resimMs += performance.now() - started; +} + +function netPrune(session) { + const floor = Math.min(session.confirmed, session.frame - NET_MAX_ROLLBACK - 2); + for (const frame of session.snapshots.keys()) + if (frame < floor) session.snapshots.delete(frame); + for (const frame of session.used.keys()) + if (frame < floor) session.used.delete(frame); + const inputFloor = floor - NET_REDUNDANCY * 2; + for (const frame of session.local.keys()) + if (frame < inputFloor) session.local.delete(frame); + for (const frame of session.remote.keys()) + if (frame < inputFloor) session.remote.delete(frame); + for (const frame of session.hashes.keys()) + if (frame < inputFloor) session.hashes.delete(frame); + for (const frame of session.peerHashes.keys()) + if (frame < inputFloor) session.peerHashes.delete(frame); +} + +function netDrainInbox(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + // Taken as a batch: a hash mismatch inside this loop ends the session and + // empties the inbox underneath it. + const batch = netInbox.splice(0, netInbox.length); + for (const packet of batch) { + if (!packet || typeof packet !== "object") continue; + // A hello inside a session is never the rival still talking: the + // challenger stops saying hello the moment it has one. It is somebody with + // no session — the same person having reloaded, or a new arrival in the + // chair — and it has to be read that way BEFORE the clock below is + // touched. Stamping it as a live packet was the deadlock: a tab that is + // killed sends no `bye`, so this seat waited on four seconds of silence + // that the rejoiner's own 1 Hz hello refreshed forever. This seat went on + // simulating against a rival who only ever said hello, and the rejoiner + // never got a deal back. Neither could leave. Treating it as a departure + // frees both: the lobby is one tick away, and the next hello a second + // later deals a fresh session with the fresh identity. + if (packet.t === "hello") { + // Except a straggler still in flight from before the deal was made, + // which would kill a session one frame old. + if (Date.now() - session.startedAt > NET_HELLO_INTERVAL_MS * 2) + session.peerLeft = true; + continue; + } + // A straggler from the fight before. The shell's inbox is not emptied when + // a session ends and packets stay in flight across the changeover, so + // without this the old rival's last presses were written into the new + // fight at frames it had not reached — on the seat that received them and + // nowhere else. Measured: two seats agreed through frame 330 of a rejoined + // fight and were found apart at the next checkpoint. An older build sends + // no tag and is taken at its word, as it always was. + if (packet.o !== undefined && packet.o !== session.originUs) continue; + session.lastPacketAt = Date.now(); + session.stats.received++; + if (packet.t === "workshop" && session.seat === 1) { session.peerWorkshop = true; continue; } + if (packet.t === "bye") { session.peerLeft = true; continue; } + // The rival noticed the divergence first. Same repair from this side, and + // no answering packet: a desync that echoed would ping-pong. + if (packet.t === "desync") { session.peerDesync = true; continue; } + if (packet.t === "i" && Array.isArray(packet.m) && + Number.isInteger(packet.f)) { + // m[k] is the pad for frame f + k; the newest is the last. + for (let index = 0; index < packet.m.length && index < NET_REDUNDANCY * 2; index++) { + const frame = packet.f + index; + const mask = packet.m[index] | 0; + if (frame < 0 || session.remote.has(frame)) continue; + session.remote.set(frame, mask); + if (frame > session.remoteFrame) { + session.remoteFrame = frame; + session.lastRemoteMask = mask; + } + } + if (Number.isInteger(packet.a)) session.ackFrame = Math.max(session.ackFrame, packet.a); + if (Number.isInteger(packet.s) && packet.s >= session.remoteSimFrame) { + session.remoteSimFrame = packet.s; + if (Number.isInteger(packet.l)) session.remoteLead = packet.l; + } + // Ping, by echo. `w` is the rival's own mark, which we hold and send + // back; `e` is one of ours coming home, so the round trip is a + // subtraction in OUR clock and the two machines need no shared time. + // It reads up to one frame long, because the rival holds our mark until + // their next tick — an honest part of what a press actually costs. + if (Number.isInteger(packet.w)) session.peerStamp = packet.w; + if (Number.isInteger(packet.e) && packet.e > 0) { + const trip = Date.now() - packet.e; + if (trip >= 0 && trip < 4000) { + session.stats.pingMs = session.stats.pings + ? session.stats.pingMs + (trip - session.stats.pingMs) * .15 : trip; + session.stats.pings++; + } + } + if (Array.isArray(packet.h) && packet.h.length === 2) + netNotePeerHash(session, packet.h[0], packet.h[1], remoteSeat); + if (netSession !== session) return; + } + } +} + +function netNotePeerHash(session, frame, hash) { + if (!Number.isInteger(frame)) return; + const mine = session.hashes.get(frame); + if (mine === undefined) { session.peerHashes.set(frame, hash); return; } + if (mine !== hash) { + session.stats.desyncs++; + telemetry("NET_DESYNC", "frame " + frame + " mine " + mine + " theirs " + hash); + netDesyncRepair(session, frame); + } +} + +// A desync used to be counted and then lived with: two machines that are no +// longer playing the same fight went on playing their different ones, and the +// two people found out when one of them died on a screen where they had not +// been hit. +// +// The repair is to stop pretending there are two authorities. The host has +// one, so both seats fall back to the lane where the host IS the authority: +// the challenger goes back to watching the host's stream with its pads going +// up the wire, and the host resumes the streamed versus fight it was already +// publishing for the grandstand. The fight does not stop, it does not rewind, +// and nobody has to re-adopt a state that will not fit through a 2 KiB +// channel. What it costs is the rollback lane's latency, which is the honest +// price of one machine having been wrong. +// +// Both seats have to agree, or the host sits waiting for packets that are not +// coming — so the seat that notices says so, and both then refuse to open a +// rollback session again for a while. Without that cooldown the challenger's +// next hello would deal a fresh session into the same divergence, one second +// later, forever. +const NET_DESYNC_COOLDOWN_MS = 60000; +let netLaneBlockedUntil = 0; + +function netDesyncRepair(session, frame) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + try { session.send({ t: "desync", o: session.originUs, f: frame }); } + catch (_) {} + netEnd("desync"); +} + +// Our state hash at the newest frame both pads are known for — a frame that +// will never be rolled back again, so both seats hash the same thing if +// they are the same game. +function netExchangeHash(session) { + const frame = session.confirmed; + if (frame < 0 || frame % NET_HASH_EVERY !== 0 || session.hashes.has(frame)) return; + const snapshotAfter = session.snapshots.get(frame + 1); + if (!snapshotAfter) return; + // Hash the snapshot taken before frame+1, i.e. the state after `frame`, + // without disturbing the live state: restore is destructive, so hash the + // live state only when it IS that frame. + let hash; + if (session.frame === frame + 1) hash = netStateHash(); + else { + const live = netSnapshot(); + netRestore(snapshotAfter); + hash = netStateHash(); + netRestore(live); + } + session.hashes.set(frame, hash); + if (globalThis.__oskiewarHashTrace) { + netHashTexts.set(frame, netLastHashText); + if (netHashTexts.size > 600) + netHashTexts.delete(netHashTexts.keys().next().value); + } + const theirs = session.peerHashes.get(frame); + if (theirs !== undefined) netNotePeerHash(session, frame, theirs); + session.pendingHash = [frame, hash]; +} + +function netSendInputs(session) { + // Every local pad we have decided on, including the one just scheduled for + // frame + delay. Sending one short of it starves the rival: they stall for + // the frame we are holding, we stall for the frame they are holding, and + // both fights crawl (measured in the browser harness: two thirds of ticks + // spent waiting) even on a wire with no latency at all. + const newest = session.frame + session.delay; + const first = Math.max(0, newest - NET_REDUNDANCY + 1); + const masks = []; + for (let frame = first; frame <= newest; frame++) + masks.push(session.local.get(frame) ?? 0); + // `o` is the deal's own origin, which is to say: which fight this is. Frame + // numbers restart at zero every session, so an input packet from the fight + // before is indistinguishable from a current one by its contents alone — and + // it lands on frames the new fight has not reached yet, on one seat only. + const packet = { t: "i", o: session.originUs, f: first, m: masks, + a: session.remoteFrame, s: session.frame, + l: session.frame - session.remoteSimFrame, w: Date.now() }; + if (session.peerStamp) packet.e = session.peerStamp; + if (session.pendingHash) { packet.h = session.pendingHash; session.pendingHash = null; } + if (session.send(packet)) session.stats.sent++; +} + +// One driver tick of a rollback fight. Ingest the rival, repair the past if +// it was guessed wrong, schedule and mail our own pad, then either step one +// frame or hold — hold when we have guessed as far as we dare past the +// rival's last real pad, or when we are simply running ahead of them. +function netTick() { + const session = netSession; + netDrainInbox(session); + if (!netSession) return; + // The rival told us the two fights came apart. Drop to the streamed lane, + // where there is only one authority, and stay out of the rollback lane long + // enough that the next hello is not just the same divergence again. + if (session.peerWorkshop) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + return; + } + if (session.peerDesync) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("desync-peer"); + return; + } + if (session.peerLeft || Date.now() - session.lastPacketAt > NET_PEER_LOST_MS) { + const seat = session.seat; + netEnd(session.peerLeft ? "rival-left" : "peer-lost"); + globalThis.__oskiewarRemotePad = null; + // The host is left alone in its room; the challenger's bridge is still + // up and goes back to watching whatever the room shows next. + if (seat === 0 && versusActive()) beginVersusLobby(runtime().monotonicUs); + return; + } + const earliest = netEarliestMisprediction(session); + if (earliest !== null) netRollback(session, earliest); + // A round whose end is now behind the confirmed frontier is a round that + // happened. Past this line no rival pad can reach back and unmake it. + if (replayPendingSaveFrame >= 0 && session.confirmed >= replayPendingSaveFrame) + flushPendingRoundReplay(runtime().monotonicUs); + const scheduled = session.frame + session.delay; + if (!session.local.has(scheduled)) { + const pad = typeof gamepad === "function" ? gamepad(0) : null; + session.local.set(scheduled, pad ? inputCommand(pad) : 0); + } + netSendInputs(session); + session.ticks++; + if (session.frame > session.remoteFrame + NET_MAX_ROLLBACK) { + session.stats.waits++; + return; + } + // Frame advantage: if we are more than a delay's worth ahead of where the + // rival says they are, give back one tick in four until we are level. Paced + // by ticks, not frames — a frame that stalls does not advance, and a stall + // keyed on the frame number would hold that frame forever. + // Each observation includes travel time. Equal-speed peers across a WAN + // both appear ahead of the other's old frame; throttling that raw lead + // slowed BOTH games by 25%. Exchange the peer's observation and cancel + // their shared transit lag. The remaining half-difference measures the + // actual clock advantage. Older peers retain the conservative old rule. + const observedLead = session.frame - session.remoteSimFrame; + const ahead = session.remoteLead === null ? observedLead + : (observedLead - session.remoteLead) / 2; + if (ahead > session.delay + 1 && session.ticks % 4 === 0) { + session.stats.stalls++; + return; + } + netSimulateFrame(session, session.frame, false); + session.frame++; + netPrune(session); + netExchangeHash(session); + // The hash exchange can find the mismatch that ends this session. + if (netSession !== session) return; + // A window into the lane for the debug overlay, the agent tools and the + // browser harness: what the fight is costing and whether it is one game. + globalThis.__oskiewarNetStats = { seat: session.seat, frame: session.frame, + // Who this fight believes is in it. A desync hash cannot see an identity + // fault — two machines can agree perfectly about a fight between two + // people who are not there — so the deal's names ride the same window the + // harness and the debug overlay already read. + names: session.deal.fighters.map((entry) => entry.name), + confirmed: session.confirmed, remoteFrame: session.remoteFrame, + hash: session.hashes.get(session.confirmed) ?? 0, + hashFrame: session.confirmed, ...session.stats, + behind: Math.max(0, session.frame - 1 - session.remoteFrame) }; +} + +// The challenger announces itself on the net channel until the host answers +// with a deal; a host that never answers is an older build, and the fight +// falls back to the streamed lane it always had. +function netChallengerHello(now) { + if (workshopMap) return; + if (netSession || roundViewer?.seat !== "challenger" || + typeof roundViewer.sendNet !== "function" || !versusAllowed()) return; + // Not before the shell has finished asking who is here. Identity rides this + // packet once and is then frozen into the deal for the whole fight, and a + // rejoin IS a fresh page load — so the 1 Hz hello below routinely beat the + // session check and dealt a signed-in player in under no name at all. Worse, + // resetRound re-applies the deal every round, so the wrong name was restamped + // even after the real one arrived. A shell with no account system is an older + // build, not a visitor still being asked, and is never held here. + if (accountState() && !accountReady()) return; + const at = Date.now(); + if (at < netLaneBlockedUntil) return; + if (at - netHelloSentAt < NET_HELLO_INTERVAL_MS) return; + netHelloSentAt = at; + roundViewer.sendNet({ t: "hello", v: 2, ...netLocalIdentity() }); +} + +// Packets that arrive before a session exists: the challenger's hello lands +// on the host, the host's deal lands on the challenger. Anything else waits +// in the inbox for the session to drain. +function netHandlePreSession(packet) { + if (!packet || typeof packet !== "object") return; + // A packet from the lane we have just fallen out of. Both ends are watching + // the same cooldown, so this is a straggler in flight, not an offer. + if (Date.now() < netLaneBlockedUntil) return; + if (packet.t === "hello" && packet.v !== 2) return; + if (packet.t === "hello" && !roundViewer) { + netPeerHello = { name: packet.name, colors: packet.colors, at: Date.now() }; + return; + } + if (packet.t === "start" && roundViewer?.seat === "challenger" && + packet.v === 2 && Number.isInteger(packet.origin) && + Number.isInteger(packet.delay) && Array.isArray(packet.fighters) && + packet.fighters.length === 2) { + const bridge = roundViewer; + netBegin(packet, 1, (content) => bridge.sendNet(content)); + return; + } + netInbox.push(packet); +} + +// The host's side of the opening: a fresh challenger who said hello gets a +// deal instead of the streamed fight. +function netHostBegin(now) { + if (workshopMap) return false; + // Same door, other side: a deal struck before this seat knows its own handle + // names the host for the rest of the fight, on both screens. + if (accountState() && !accountReady()) return false; + const deal = netMakeDeal(); + const room = "ow-" + versusRoomName; + const send = (content) => typeof globalThis.__oskiewarNetSend === "function" + ? globalThis.__oskiewarNetSend(room, content) : false; + if (!send(deal)) return false; + netBegin(deal, 0, send); + return true; +} + +function netDrainHostInbox() { + const inbox = globalThis.__oskiewarNetInbox; + if (!Array.isArray(inbox) || !inbox.length) return; + for (const packet of inbox) { + if (netSession) netInbox.push(packet); + else netHandlePreSession(packet); + } + inbox.length = 0; +} + +// A visitor who arrived through a shared address and found nobody hosting +// takes the room over — the link a friend sent must keep working after the +// sender's tab closed. The chair-holder claims first; a seat-denied watcher +// waits three times as long, so two arrivals at a dead address stagger +// instead of racing, and updateVersusConflict catches the tie anyway. +function updateVersusClaim(now) { + if (globalThis.__oskiewarVersusCapable !== true || !roundViewer) return false; + // Claiming a dead address means hosting, and hosting is playing. Whoever + // arrives next deserves a room with a named fighter standing in it. + if (!versusAllowed()) return false; + // A room with a live host is a fight to join; a room with a stored demo is + // a replay page and keeps being one — versus rooms never record, so only a + // truly empty address falls through to the claim. + if (roundViewer.live || roundViewerDemo || roundViewerMode === "DEMO") { + versusClaimArmedAt = 0; + return false; + } + if (!versusClaimArmedAt) { + versusClaimArmedAt = now; + return false; + } + const wait = roundViewer.seat === "challenger" + ? versusClaimAfterUs : versusClaimAfterUs * 3; + if (now - versusClaimArmedAt < wait) return false; + const name = roundViewer.name; + versusFallbackBridge = roundViewer; + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + versusClaimArmedAt = 0; + versusRoomName = name; + globalThis.__oskiewarRemotePad = null; + beginVersusLobby(now); + telemetry("VERSUS_CLAIM", name); + return true; +} + +// A demo carries the impacts the live pass spawned. Replaying them puts the +// sparks and debris back into a repaint that otherwise only moves bodies. +// The demo loops, so a tick that runs backwards restarts the sweep clean. +function replayViewerImpacts(tick, dt) { + const rows = roundViewerDemo?.impacts || []; + if (tick < roundViewerImpactTick) { + roundViewerImpactTick = -1; + impacts.length = 0; + } + for (const row of rows) + if (row[0] > roundViewerImpactTick && row[0] <= tick) { + const seconds = (row[5] || 300) / 1000; + impacts.push({ x: row[1], y: row[2], z: row[3], + life: seconds, duration: seconds, + death: row[4] === 1, explosion: row[4] === 2 }); + } + roundViewerImpactTick = tick; + updateResultImpactDebris(dt); +} + +function gameBoot() { + nativeHudOverlay = typeof capabilities === "function" && capabilities().hudOverlay === true; + globalThis.__oskiewarWorkshopCommand = workshopCommand; + workshopBase ||= workshopSnapshot(); + if (globalThis.__oskiewarPublishedMap && globalThis.__oskiewarValidateMap) { + workshopMap = globalThis.__oskiewarValidateMap(globalThis.__oskiewarPublishedMap); + workshopTainted = true; + } + syncGameView(); + // The reel harness may boot with the debug overlay lit — safe-zone crops, + // stat chassis, input read-outs — to diagnose framing on a rendered reel. + if (globalThis.__oskiewarDebugOverlay === true) debugHitboxes = true; + // Name the session once. A client-error restart re-runs boot inside the + // same app run, and whoever attached to the session should not lose it to + // a crash the restart exists to paper over. + if (!sessionName) { + seedNames(Math.floor(Math.random() * 4294967296)); + sessionName = pronounceableMatchName(); + } + startedAt = runtime().monotonicUs; + roundStartedAt = startedAt; + lastSimAt = startedAt; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + emitSignal("hello", -1, 1, 0); + shellMode = "MENU"; + titleTransitionAt = null; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + shellPrevious = []; + startInputPending = false; + localControllerPairSeen = false; + localControllerMissing = -1; + navigationPrevious = [[], []]; + roundViewer = globalThis.__oskiewarRoundBridge || null; + if (roundViewer?.start) { + shellMode = "GAME"; + selecting = false; + roundResult = ""; + matchOver = false; + // Watching a fight IS gameplay for the person doing it. This was false on + // every watcher, and the whole match HUD hangs off it: no round clock, no + // VS or WAITING FOR HOST label, no "you are ..." seat line, no status + // tray. That is the "no state updates on screen" @jeffrey reported. + gameplayStarted = true; + matchName = roundViewer.name || ""; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + matchName) : spectatorQr; + roundStartedAt = startedAt - roundIntroDurationUs(); + roundViewerStop = roundViewer.start(handleRoundViewer); + return; + } + if (globalThis.__oskiewarSelfPlay) { + // A harness cast keeps the pre-versus reading of the empty door: nobody + // is holding a controller, so "no opponent" means the climb, never a + // lobby waiting on a friend who cannot exist. + if (!String(globalThis.__oskiewarOpponent || "").trim() || + survivalRequested()) + startSurvivalRun(startedAt, true); + else startSelfPlay(startedAt); + return; + } + if (survivalRequested()) beginSurvival(startedAt); + else if (versusRequested()) { + versusRoomName = sessionName; + beginVersusLobby(startedAt, { title: true }); + } else beginTraining(startedAt); +} + +function resetRound(now, resetMatch = false, keepMap = false) { + resetWorkshopMap(); + rotateLocalMap(keepMap, resetMatch); + if (netSession && !skateparkMap) { + if (netRoundMapIndex < 0) netRoundMapIndex = 0; + else if (!keepMap && roundResult) + netRoundMapIndex = (netRoundMapIndex + 1) % localMapVariants.length; + installRoundMap(netRoundMapIndex); + } + if (replay) { + const nextRoundName = pronounceableMatchName(); + // A versus room is one address for a whole match — the link a friend was + // sent, the socket the fight is riding, the code on the wall. Handing over + // to a new room between rounds would move every watcher and close the + // publisher out from under the fight. Only the broadcast lane hands over, + // where each round IS its own room. + if (!versusLane()) { + if (matchName) publishSpectator(now, { + target: matchName, nextRoundId: "ow-" + nextRoundName, force: true, + }); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + nextRoundName) : null; + } + previousRoundName = matchName; + matchName = nextRoundName; + // Stamped, so a rollback across this rollover takes the entry back with it. + replayRoundMarks.push([demoTick(now), matchName]); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + } + // Terrain belongs to the simulation contract, not the spectator URL. A + // network series keeps one landscape; local rounds rotate authored maps + // independently of their public room names. + configureWorldMap(skateparkMap ? "skatepark" : "station"); + resetSkateRopes(); + terrainPhase = terrainSeed("oskiewar-physics-1-hills"); + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + roundReplayFrames = []; + roundReplayLastAt = 0; + instantReplay = null; + replayOfferPrevious = []; + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; + for (const player of players) { + applyRoster(player, player.rosterIndex); + player.x = player.spawnX; + player.y = airRoundActive() ? floorY - 400 : terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.facing = player.pad === 0 ? 1 : -1; + player.grounded = !airRoundActive(); + player.ducking = false; + player.alive = true; + player.respawnAt = 0; + player.score = 0; + if (resetMatch) player.roundWins = 0; + player.inputX = 0; + player.inputY = 0; + player.lastTap = {}; + player.lastRelease = {}; + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + player.walkSince = 0; + player.attackKind = ""; + player.attackUntil = 0; + player.attackHit = false; + player.blocking = false; + player.blockFlash = 0; + player.shieldLocked = false; + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + player.shieldBrokenAt = 0; + player.windVx = 0; + player.knockVx = 0; + player.shieldVx = 0; + player.gunAmmo = 0; + player.grenadeAmmo = 0; + player.gunAimX = player.facing; + player.gunAimY = 0; + player.gunAimLive = false; + player.gunMode = "HANDGUN"; + player.itemArm = ""; + player.nextGunShotAt = 0; + player.nextSpitAt = 0; + player.spitAt = -Infinity; + player.spitHeavy = false; + player.resultReaction = ""; + player.resultReactionAt = 0; + resultReactionPrevious[player.pad] = []; + player.stance = "NEUTRAL"; + player.itemAction = ""; + player.itemActionStartedAt = 0; + player.itemActionUntil = 0; + player.heldBall = -1; + player.heldPart = -1; + player.heldPlayer = -1; + player.carryArm = ""; + player.grabbedBy = -1; + resetSkate(player); + player.skateboard = skateparkMap && !survivalActive(); + player.ropeIndex = -1; + player.ropeGrabLocked = false; + player.ropeLink = chainLinks; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = 0; + player.boostUntil = 0; + player.skateVx = 0; + player.skateWallSide = 0; + player.swordHeld = false; + player.grabHeld = false; + player.commandStream = []; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + player.partDamage = {}; + player.removedParts = []; + player.fallenBodyGeometry = null; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.poundFrom = 0; + player.poundLevel = 0; + player.standingOn = -1; + player.previousY = player.y; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.botPresses = {}; + player.botAttackAt = now + 420000; + player.botItemAt = now + 600000; + player.botSinkAt = now + 900000; + player.botSinkTaps = 0; + player.botSinkNextAt = 0; + player.botAttackSequence = 0; + player.botJumpAt = now + 900000; + player.survivalTargetLevel = 1; + player.botThreatSeen = 0; + player.botShieldAt = Infinity; + player.botPunishedAt = 0; + player.botScene = null; + player.botGoal = ""; + player.botSubgoal = null; + player.botRngState = (Math.round(now / 1000) ^ + Math.imul(player.pad + 1, 0x9e3779b9)) >>> 0; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.headRoll = 0; + player.headRollRate = 0; + player.headBounceCharge = 0; + player.headPumpDirection = 0; + player.headPumpAt = 0; + // Only a LOCAL hand can still be leaning on a button across the reset; a + // bot's presses were just cleared, and a remote rival's ride their own + // wire — inheriting pad two's local snapshot would suppress them. + player.previous = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]).down.slice() + : player.npc || player.bot || player.remote ? [] + : padSnapshots[player.pad]?.down?.slice() || []; + player.suppressedDirections = player.previous.filter((button) => + button.startsWith("Arrow")); + player.lastButton = "NONE"; + player.lastButtonAt = 0; + } + // A blade dropped by a severed arm is round furniture, not map furniture: + // it exists because a hand stopped existing, and the bell undoes that. Drop + // the dropped ones rather than parking them inactive forever, so a long + // match cannot walk this array up one entry per lost arm. + saberPickups.length = saberPickups.filter((pickup) => pickup.startsActive) + .length; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + if (pickup.active) beginPickupDrop(pickup); + } + for (const tree of bodyTrees) { + tree.growth = 0; + tree.spent = false; + tree.y = terrainFloorAt(tree.x) - 60; + } + gridField.fill(0); + // A new round is a new exchange. Carrying the last one's frames across the + // bell would draw a history that never happened. + for (const meter of frameMeters) meter.length = 0; + nextPowerupAtUs = powerupIntervalUs; + powerupSequence = 0; + roundResult = ""; + roundOverAt = 0; // A fresh round cannot inherit a previous match's deadline. + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + lastSimAt = now; + roundStartedAt = now; + rollWind(now); + resetBalls(now); + if (replay) replay.rounds.push([demoTick(now), windDirection, windMph, + balls.length]); + // Live frame one belongs to fighter one: snap to the head, then let the + // authored sequence cross to the other fighter and pull out. A reel has a + // shorter contract and takes the whole face-off on frame zero below. + cameraCenter = (players[0].x + players[1].x) / 2; + cameraWidth = 960; + cameraCenterY = (players[0].y + players[1].y) / 2 - 90; + cameraContainFloor = 0; + const poseTime = (now - startedAt) / 1000000; + if (reelGroundCamera()) { + // Frame zero is the face-off, not one isolated portrait. The short reel + // intro cannot afford to spend half of itself finding the other fighter. + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.snap({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }); + } else { + const firstHead = runnerWorldGeometry(players[0], poseTime).head; + const portraitWidth = Math.max(96, firstHead.radius * 6.5); + const portraitTarget = { x: firstHead.x, y: firstHead.y, z: firstHead.z }; + cameraDoll.snap({ target: portraitTarget, + position: { x: portraitTarget.x, y: portraitTarget.y, + z: portraitTarget.z - Math.max(portraitWidth * 1.35, + Math.abs(worldNear) + 400) }, + width: portraitWidth, perspective: 0, fov: 55, roll: 0 }); + } + // A rollback fight's fighters are named by the deal, not by whichever + // machine ran the reset: applyRoster above dresses seat one from the local + // account, which on the challenger's screen is the challenger. + if (netSession) netApplyIdentities(netSession.deal); +} + +// The box the camera packs. It is a fighting-game pushbox rather than the +// animated silhouette on purpose: breathing and stride would otherwise pump +// the lens once per idle cycle. Reach spans a fully extended punch or kick so +// throwing one never shoves the frame; live limbs still set the containment +// floor for anything this box misses. +function fighterFrameRect() { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + for (const player of activePlayers()) { + // Trimmed 2026-08-09 — @jeffrey wanted the lens closer to the fight. + // The rect still tracks live position, so jumps and knockbacks widen + // the frame as they happen; this is standing headroom, not arc room. + // Rise trimmed 2026-08-11 — @jeffrey read the old headroom as fighters + // sitting too low in a vertical frame; less sky, more fighter. + // Reach is an anticipation margin, not containment — the live-silhouette + // floor catches an actual extended limb. On a narrow stage every world + // unit of width costs its height times the aspect, so the margin is + // priced by the same factor the fixed shot widths already pay; a phone + // spends its width on fighters, a television on room to swing. + const reach = (isHeadOnly(player) ? 34 : isPogo(player) ? 56 : 104) * + portraitPull(); + const rise = isHeadOnly(player) ? 48 : isPogo(player) ? 128 : 150; + left = Math.min(left, player.x - reach); + right = Math.max(right, player.x + reach); + top = Math.min(top, player.y - rise); + // Feet swing below the terrain contact point on slopes. Pack their full + // projected arc so camera yaw cannot shave them off at a safe-zone edge. + bottom = Math.max(bottom, player.y + (isHeadOnly(player) ? 18 : 38)); + } + // A shot remains physical until it hits something, so it remains a camera + // subject too. Include both ends of its swept path to prevent a fast round + // flickering outside the action-safe frame between simulation ticks — + // but only while it stays near the fight. In the padded room the leash + // spans the whole map, so every shot is framed like it always was; it + // exists because on the old street a ricocheting stray dragged the lens + // twenty thousand units from two idle fighters and the draw span took + // the Xbox to eleven frames a second. + const bulletLeash = 5200; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + if (!players.some((player) => + Math.abs(bullet.x - player.x) < bulletLeash && + Math.abs(bullet.y - player.y) < bulletLeash)) continue; + const previousX = bullet.previousX ?? bullet.x; + const previousY = bullet.previousY ?? bullet.y; + left = Math.min(left, previousX - 32, bullet.x - 32); + right = Math.max(right, previousX + 32, bullet.x + 32); + top = Math.min(top, previousY - 32, bullet.y - 32); + bottom = Math.max(bottom, previousY + 32, bullet.y + 32); + } + return { left, right, top, bottom }; +} + +// How far this stage is from a 16:9 television, as a lens factor. The fixed +// shot widths in this file — the framing floor, the killcam stand-off, the +// intro and result close-ups — are all width constants tuned on a widescreen, +// and the same width on a narrow stage reads twice as distant because the +// screen has no width to spare. Multiplying a CONSTANT by this converts it to +// the stage at hand. Multiplying a packed rect by it is how portrait play used +// to lose fighters off the screen edges: the pack already knows the aspect, +// and shrinking its answer shrinks the one axis that was load-bearing. +const portraitPull = () => clamp(cameraAspect / (16 / 9), .52, 1); +// A reel ends on the win. Nobody is holding a controller, so there is no wide +// shot to hand back to — the last thing in frame should be the winner's face. +const reelCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true && + capabilities().reelFullUi !== true; +// Ground coverage belongs to every 9:16 oven burn, including the full-UI +// lane. `reelCamera` is narrower: it also opts into minimal-HUD winner framing. +// Reusing that narrower predicate for terrain left full-UI reels with the TV +// slab edge behind the lens, exposing a hard cut beneath the floor. +const reelGroundCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true; + +// Rect-pack: the camera width that makes a world rect exactly fill the +// action-safe frame. Whichever axis runs out first decides the lens, so a +// stacked pair frames as tightly as a spread one — and because each term +// carries the live stage aspect, the answer is exact for a phone held +// upright, a television, and an ultrawide alike. +// +// A reel is the one place the pack is allowed to lie. A 9:16 render with +// nobody steering trades its side margins for bigger fighters on purpose — +// that is how the reels were tuned to read. Live play never gets that trade: +// a fighter cropped off a screen edge is a fighter you cannot play. +function rectPackWidth(rect) { + const safe = actionSafeRect(); + return Math.max( + (rect.right - rect.left) * (stageRight - stageLeft) / + Math.max(1, safe.right - safe.left), + (rect.bottom - rect.top) * cameraAspect * (stageBottom - stageTop) / + Math.max(1, safe.bottom - safe.top)) * + (reelCamera() ? portraitPull() : 1); +} +// A fighter reduced to a bouncing head is a few dozen units tall. Without a +// floor the pack would keep closing until one limb filled the screen. +// Lowered with the reach/rise trim above: the closest the lens may sit. +// The tightest the automatic camera may go. It scales with the same pull, or a +// portrait shot closes to the pull and then hits a floor sized for a television. +// The versus lobby holds a mid shot instead: one body under a close-up lens +// filled the screen and sat on top of the very instruction the room exists to +// show, and a visitor deciding whether to share the address wants to see the +// room they are inviting somebody into. Under the wordmark the same lobby +// sits for a portrait — the title is a face, and starting is the pullback +// that reveals the room. +const frameFloorWidth = () => + (lobbyActive() ? shellMode === "MENU" ? 430 : 860 + : compactLayout() ? 215 : 315) * portraitPull(); + +// Terrain is flat color, so it only has to reach as far as the lens can see. +// Submitting the whole arena pushed its far corners past the native ±30000 +// coordinate guard whenever the camera closed in or sat against a wall, which +// culled the ground quad and left the clear color where the stage should be. +function terrainSpan() { + // A lens sees more floor than its nominal width says — perspective, yaw, + // and the orbiting killcam all sweep past it, and a close shot's bottom + // corners un-project far along the ground plane. A fixed apron past the + // width keeps the sheet under every corner of the frame without doubling + // the whole street's quad count when the camera is wide; the near clipper + // has owned the old ±30000 native guard since it learned to cut faces + // instead of culling them. + const reach = cameraDoll.width + 2600; + const worldTop = survivalActive() ? survivalCeilingY : ceilingY; + return { left: Math.max(worldLeft, cameraCenter - reach), + right: Math.min(worldRight, cameraCenter + reach), + top: Math.max(worldTop, cameraCenterY - reach), + bottom: Math.min(parkDeepest, cameraCenterY + reach) }; +} + +function updateCamera(dt) { + if (survivalActive() || skateparkMap) return; + const rect = fighterFrameRect(); + // Look slightly ahead of fast movement so zoom starts before a fighter + // reaches the safe edge instead of reacting after the crossing. + const lookAhead = .2; + let leftDrift = 0; + let rightDrift = 0; + let upDrift = 0; + let downDrift = 0; + for (const player of activePlayers()) { + const dx = (player.vx + (player.windVx || 0) + (player.knockVx || 0) + + (player.shieldVx || 0)) * lookAhead; + const dy = player.vy * lookAhead; + leftDrift = Math.min(leftDrift, dx); + rightDrift = Math.max(rightDrift, dx); + upDrift = Math.min(upDrift, dy); + downDrift = Math.max(downDrift, dy); + } + rect.left += leftDrift; + rect.right += rightDrift; + rect.top += upDrift; + rect.bottom += downDrift; + const maxWidth = Math.max(worldRight - worldLeft, + (floorY - ceilingY) * cameraAspect); + // Perspective orbit and uneven ground skew the projected silhouette beyond + // its orthographic pushbox. A small fixed overscan keeps complete bodies in + // the action-safe rectangle without making the compact room feel distant. + const packWidth = rectPackWidth(rect); + const desiredWidth = clamp(packWidth * 1.08, frameFloorWidth(), maxWidth); + const widthSpeed = desiredWidth > cameraWidth ? 17 : 5.5; + const widthBlend = 1 - Math.exp(-Math.max(0, dt) * widthSpeed); + cameraWidth += (desiredWidth - cameraWidth) * widthBlend; + // An exponential ease always runs a fixed distance behind a target that is + // moving steadily, and the distance is the target's rate over the blend — + // about 160 units of width when the pair is separating at a walk. In the + // cube that debt was invisible: the two walls were 980 apart, so separation + // stopped growing before the debt could show. On a station twice that wide + // it is ten pixels of fighter hanging outside the action-safe rect, every + // frame, for as long as the two of them keep running apart. + // + // So containment gets a floor, and the ease keeps the rest. `rectPackWidth` + // is exactly the width that fits the pack inside the safe rect with nothing + // to spare; the 8% overscan above it is comfort and may arrive late. The + // camera may therefore be behind on looking good, and never behind on + // holding the fight. + cameraWidth = Math.max(cameraWidth, Math.min(packWidth, maxWidth)); + const halfWidth = cameraWidth / 2; + const halfHeight = cameraWidth / cameraAspect / 2; + // Center comes from the same rect the width did, so the frame pans down as + // the action drops and rides up onto the platform with it. + let desiredCenter = cameraWidth >= worldRight - worldLeft + ? (worldLeft + worldRight) / 2 + : clamp((rect.left + rect.right) / 2, + worldLeft + halfWidth, worldRight - halfWidth); + // Feet plant a capsule radius under the floor line, and the ground plane + // keeps covering that far past it, so the frame may sit that low rather + // than widening just to recentre a standing pair. + const footRoom = 40; + // Aim below the fighters' middle, not at it. A vertical frame centered on + // the bodies spends its whole upper half on sky; leaning the aim down + // rides them into the upper third with ground filling in beneath. The + // lean is priced against how much of the frame the pack already fills: + // in the cube's close-ups two fighters stand most of the view tall, and + // the full tower-era lean pushed their heads over the action-safe line — + // so it fades out as the pack closes on the frame's height. + const packFill = clamp((rect.bottom - rect.top) / Math.max(1, halfHeight), + 0, 2); + const aimLean = halfHeight * .22 * clamp((1.8 - packFill) / .8, 0, 1); + let desiredCenterY = airRoundActive() ? (rect.top + rect.bottom) / 2 + aimLean + : halfHeight * 2 >= floorY - ceilingY + ? (ceilingY + floorY) / 2 + : clamp((rect.top + rect.bottom) / 2 + aimLean, + ceilingY + halfHeight, parkDeepest + footRoom - halfHeight); + // Fold containment into the target before easing. Clamping the live camera + // after easing caused a one-frame reset whenever a fighter crossed the safe + // edge; the pack width now absorbs that motion while the center remains + // continuous. + const containLeft = rect.right - halfWidth * .92; + const containRight = rect.left + halfWidth * .92; + if (containLeft <= containRight) + desiredCenter = clamp(desiredCenter, containLeft, containRight); + const containTop = rect.bottom - halfHeight * .92; + const containBottom = rect.top + halfHeight * .92; + if (containTop <= containBottom) + desiredCenterY = clamp(desiredCenterY, containTop, containBottom); + const centerBlend = 1 - Math.exp(-Math.max(0, dt) * 9); + cameraCenter += (desiredCenter - cameraCenter) * centerBlend; + cameraCenterY += (desiredCenterY - cameraCenterY) * centerBlend; +} + +function updateCameraDoll(dt, now) { + if (freeForAll() || airRoundActive()) { + updateCamera(dt); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + const width = cameraWidth * playerCameraZoom; + cameraDoll.track({ target, position: { + x: target.x + Math.sin(playerCameraYaw) * width * 1.35, + y: target.y - width * (.026 + playerCameraPitch), + z: -Math.cos(playerCameraYaw) * width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (skateparkMap && !survivalActive() && shellMode === "GAME") { + const rider = players[netSession?.seat || 0]; + const width = Math.max(1100, 900 * cameraAspect) * playerCameraZoom; + const half = width / 2; + const desiredX = clamp(rider.x + clamp(rider.vx * .18, -300, 300), + worldLeft + half, worldRight - half); + const desiredY = rider.y - 180; + const blend = 1 - Math.exp(-dt * 9); + cameraCenter += (desiredX - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth = width; + cameraDoll.track({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, z: -width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + const introAge = now - roundStartedAt; + if (survivalActive()) { + const runner = players[0]; + const framedWidth = survivalFrameWidth * playerCameraZoom; + const halfHeight = framedWidth / cameraAspect / 2; + const desiredY = clamp(runner.y + halfHeight * .18, + survivalCeilingY + halfHeight, floorY + 40 - halfHeight); + const blend = 1 - Math.exp(-Math.max(0, dt) * 7); + cameraCenter += ((worldLeft + worldRight) / 2 - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth += (framedWidth - cameraWidth) * blend; + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter, y: cameraCenterY, + z: -framedWidth * 1.35 }, + width: framedWidth, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (roundResult) { + updateResultReactions(now); + const age = Math.max(0, (now - roundOverAt) / 1000000); + // The cinematic hands back to the wide shot at 1.45s so play can resume. + // A reel has no play to resume into, and handing back mid-celebration + // pulled the camera off the winner's face just as the hearts arrived, so + // there the shot is allowed to hold until the recording stops. + if (deathCinematic && (age < 1.45 || (reelCamera() && age < 6))) { + if (age < .11) return; + const loser = players[deathCinematic.loserPad]; + const winner = players[deathCinematic.winnerPad]; + const loserHead = loser.frozenGeometry?.head || + runnerWorldGeometry(loser, (now - startedAt) / 1000000).head; + const winnerHead = winner?.frozenGeometry?.head || (winner + ? runnerWorldGeometry(winner, (now - startedAt) / 1000000).head + : { x: cameraCenter, y: cameraCenterY, z: 0 }); + // The killcam used to sit inside the winner's own head, so the winner + // had to be culled or their body would have filled the lens — which is + // why the fighter who had just won blinked out for three quarters of a + // second. It stands off their shoulder now: back along the line between + // the two of them, raised, and aimed at a point most of the way to the + // fighter going down. Both are in the frustum, so nothing is hidden to + // make the shot and nobody vanishes. + // + // Every distance is drawn from the gap between the heads, because the + // pair can be a step apart or the width of the stage apart, and a fixed + // stand-off frames only one of those. + const headGap = Math.max(320, Math.abs(loserHead.x - winnerHead.x)); + // Center the complete pair. Favoring the loser pushed the winner across + // the viewport edge during the eased handoff. + const focus = { x: lerp(winnerHead.x, loserHead.x, .5), + y: lerp(winnerHead.y, loserHead.y, .5), + z: lerp(winnerHead.z, loserHead.z, .5) }; + const shoulder = { x: focus.x, y: focus.y, + // Stay outside the whole arena depth. The old close killcam entered + // the world volume and near-clipped limbs, floor, and wall polygons. + z: focus.z - Math.max(headGap * 1.3, Math.abs(worldNear) + headGap) }; + // Wider than the old close-up had to be, because it now has to hold two + // fighters rather than one — the 64° lens buys most of that back. Past + // about a 1300 gap this would open onto empty stage, so beyond there it + // settles toward the span the returning wide shot uses. + const shotWidth = Math.min(headGap * 1.7, headGap + 900) * portraitPull(); + if (age < .86) { + cameraDoll.track({ target: focus, position: shoulder, + width: shotWidth, perspective: 0, fov: 55, roll: 0 }, dt, 11); + return; + } + // Reels celebrate instead of returning. The lens narrows onto the + // winner's head rather than the camera dollying toward it: the standoff + // above is deliberately outside the arena depth, and flying in would put + // the floor and the winner's own limbs back through the near plane. + if (reelCamera() && winner) { + const push = clamp((age - .86) / .5, 0, 1); + const headFocus = { x: winnerHead.x, y: winnerHead.y, z: winnerHead.z }; + cameraDoll.track({ target: headFocus, position: { + x: headFocus.x, y: headFocus.y, z: shoulder.z }, + width: lerp(shotWidth, 430 * portraitPull(), push), + perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const returnAmount = clamp((age - .86) / .59, 0, 1); + const midpoint = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const span = Math.max(900, Math.abs(players[1].x - players[0].x) + 540) * + portraitPull(); + cameraDoll.track({ target: midpoint, + position: { x: midpoint.x, y: midpoint.y, + z: lerp(shoulder.z, midpoint.z - span * 1.2, returnAmount) }, + width: lerp(shotWidth, span, returnAmount), + perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const horizontalSpan = Math.abs(players[1].x - players[0].x); + const verticalSpan = Math.abs(players[1].y - players[0].y) * cameraAspect; + const closeWidth = Math.max( + Math.max(820, horizontalSpan + 540, verticalSpan + 520) * portraitPull(), + rectPackWidth(fighterFrameRect()) * 1.22); + cameraDoll.track({ target, + position: { x: target.x, + y: target.y, + z: target.z - closeWidth * 1.2 }, + width: closeWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 7); + return; + } + if (reelGroundCamera() && introAge < reelOpeningHoldUs) { + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + if (introAge < roundIntroDurationUs()) { + // One elapsed-time story: first fighter, second fighter, title pullback, + // then the fight. + // Nothing is counted in rendered frames, so live variable speed and an + // offline slow-motion burn tell the identical introduction. + const age = introAge / 1000000; + const firstEnd = 1; + const secondEnd = 2; + const poseTime = (now - startedAt) / 1000000; + const headOf = (player) => + (player.frozenGeometry || runnerWorldGeometry(player, poseTime)).head; + // Enough room around a head to read as a portrait rather than an eyeball. + const faceWidth = (head) => Math.max(96, head.radius * 6.5); + + const opening = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const openingWidth = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + + let target; + let width; + if (age < secondEnd) { + // Frame one is already on player one. Track easing carries the camera + // across to player two without a cut. + const head = headOf(players[age < firstEnd ? 0 : 1]); + target = { x: head.x, y: head.y, z: head.z }; + width = faceWidth(head); + } else { + const out = clamp((age - secondEnd) / + (roundIntroDurationUs() / 1000000 - secondEnd), 0, 1); + const eased = out * out * (3 - out * 2); + const head = headOf(players[1]); + target = { x: lerp(head.x, opening.x, eased), + y: lerp(head.y, opening.y, eased), + z: lerp(head.z, opening.z, eased) }; + width = lerp(faceWidth(head), openingWidth, eased); + } + // Stand off outside the arena depth. The framing is orthographic, so the + // distance costs nothing and `width` alone decides how close the shot + // reads — but a lens parked a face's width from a head sits inside the + // world volume and near-clips the head it came to look at, which is the + // same trap the killcam fell into and had to be pulled back out of. + const standOff = Math.max(width * 1.35, Math.abs(worldNear) + 400); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, z: target.z - standOff }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + // Measure complete animated silhouettes before rendering. This used to run + // as a final paint-time correction, which made the viewport skip a frame at + // the safe-zone edge. + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + // Lead the floor by exactly the debt the doll's own ease is about to run up. + // `track` pulls back at speed * 1.9 — 19 here — so a floor growing at R units + // a second settles 19 times slower than that, and the doll sits R/19 units of + // width behind it for as long as the growth lasts. In the cube that debt was + // unreachable: the walls were 980 apart and separation stopped growing long + // before it could accumulate. On a station twice that wide, two fighters + // running in opposite directions hold the growth up indefinitely, and the + // debt reads as a hand hanging outside the action-safe rect every frame. + // + // Adding the debt to the target is not a fudge — it is what makes the ease + // arrive where the fighters actually are rather than where they were. It + // costs nothing when nothing is moving apart, because the growth is zero and + // the lead is zero, so a settled fight frames exactly as it always did. + const containmentGrowth = dt > 0 + ? Math.max(0, containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, + containmentWidth + containmentGrowth / 19); + // A small overscan absorbs animated hands and feet before + // they reach the action-safe edge without loosening the close fight shot. + const naturalWidth = cameraWidth * 1.015; + // Hysteresis prevents a fighter hovering at the safe edge from repeatedly + // switching between close and wide framing. The band and the pushbox above + // are tuned together so the floor never has to release during an idle cycle; + // if it does, the lens breathes in time with the fighter's own animation. + if (cameraContainFloor > naturalWidth && + naturalWidth < cameraContainFloor * .92) { + const release = 1 - Math.exp(-Math.max(0, dt) * 1.6); + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, release); + } + const framedWidth = Math.max(naturalWidth, cameraContainFloor) * + (reelCamera() ? 1 : playerCameraZoom); + // Automatic framing stays orthographic, preventing camera movement from + // bending the arena. The right stick may still rotate the diorama explicitly. + const tilt = .026 + playerCameraPitch; + const dolly = 1.35; + cameraDoll.track({ target, + position: { + x: cameraCenter + Math.sin(playerCameraYaw) * framedWidth * dolly, + y: cameraCenterY - framedWidth * tilt, + z: -Math.cos(playerCameraYaw) * framedWidth * dolly }, + width: framedWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 10); +} + +function freezeFinalFrame(now, livePad = -1) { + const poseTime = (now - startedAt) / 1000000; + for (const player of activePlayers()) { + if (player.pad === livePad) { + delete player.frozenGeometry; + delete player.frozenAt; + continue; + } + player.frozenGeometry = runnerWorldGeometry(player, poseTime); + player.frozenAt = now; + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); +} + +function finishRound(now) { + if (roundResult) return; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + captureRoundReplay(now, true); + let roundPan = 0; + const winner = roundWinner(); + if (!winner) { + roundResult = "TIE"; + emitSignal("tie", -1, players[0].score, players[1].score); + } + else { + roundPan = panPlayer(winner); + winner.roundWins += 1; + matchOver = winner.roundWins >= matchWins; + roundResult = winner.name + (matchOver ? " WINS MATCH" : " WINS ROUND"); + emitSignal(matchOver ? "matchwin" : "roundwin", winner.pad, + winner.roundWins, winner.score); + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); + roundOverAt = now; + for (const player of players) player.vx = 0; + playDrum("clap", 1.2, roundPan); + captureFrameTelemetry(now, true); + saveRoundReplay(now); + // A deferred round still needs its replay to be filed from; the flush that + // files it closes the match out afterwards. + if (matchOver && !netSession) finishReplay(); +} + +function resultCardText() { + if (roundResult === "TIE") return { winner: "tie", action: "" }; + const encoded = roundResult.match(/^(@\S+)\s+WINS\b/i); + const winner = encoded?.[1] || + (roundWinner()?.name || "TIE"); + return { winner: winner.toLowerCase(), action: "" }; +} + +function updateResultReactions(now) { + const winningPad = roundWinner()?.pad ?? -1; + for (const player of players) { + const down = inputPads[player.pad]?.down || []; + const previous = resultReactionPrevious[player.pad]; + const laughChord = down.includes("A") && down.includes("B") && + (!previous.includes("A") || !previous.includes("B")); + const pressed = laughChord ? "LAUGH" : down.find((button) => + !previous.includes(button)); + if (pressed) { + const winner = player.pad === winningPad; + if (pressed === "ArrowLeft") player.facing = -1; + if (pressed === "ArrowRight") player.facing = 1; + player.resultReaction = winner + ? ({ LAUGH: "LAUGH", A: "KICK", B: "PUNCH", X: "POSE", Y: "DANCE", + ArrowLeft: "DASH", ArrowRight: "DASH", ArrowUp: "AIR", + ArrowDown: "CROUCH" }[pressed] || "DANCE") + : ({ A: "CRY", B: "WOE", X: "SULK", Y: "WIGGLE" }[pressed] || + "WOE"); + player.resultReactionAt = now; + if (player.resultReaction === "LAUGH") + emitSignal("laugh", player.pad, 1, 0); + else { + playSine(winner ? 520 : 145, .1); + emitSignal("reaction", player.pad, winner ? 1 : -1, 0); + } + } + resultReactionPrevious[player.pad] = down.slice(); + } +} + +function quantizedInput(pad, suppressed = []) { + const held = pad.down; + const active = (button) => held.includes(button) && !suppressed.includes(button); + let horizontal = (active("ArrowRight") ? 1 : 0) - + (active("ArrowLeft") ? 1 : 0); + let vertical = (active("ArrowUp") ? 1 : 0) - + (active("ArrowDown") ? 1 : 0); + if (!horizontal && Math.abs(pad.leftX) >= 0.48) horizontal = pad.leftX > 0 ? 1 : -1; + if (!vertical && Math.abs(pad.leftY) >= 0.48) vertical = pad.leftY > 0 ? 1 : -1; + return { horizontal, vertical }; +} + +function remember(player, button) { + player.lastButton = buttonLabel(button); + player.lastButtonAt = runtime().monotonicUs; + const command = { A: "/", B: "*", X: ")", Y: "+", + LeftShoulder: "+", RightShoulder: "+" }[button] || player.lastButton; + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"].includes(button)) + recordCommand(player, command, player.lastButtonAt); + telemetry("FIGHT_BUTTON", player.name + " " + player.lastButton); +} + +function recordCommand(player, label, now) { + const previous = player.commandStream.at(-1); + if (previous?.label === label && now - previous.at < 40000) return; + player.commandStream.push({ label, at: now }); + while (player.commandStream.length > commandStreamDepth) + player.commandStream.shift(); +} + +function fireGun(player, input) { + const now = runtime().monotonicUs; + const pose = gunPose(player, now, input); + player.gunAimX = pose.dx; + player.gunAimY = pose.dy; + const smg = player.gunMode === "RUBBER SMG"; + const rocket = player.gunMode === "ROCKET LAUNCHER"; + const laser = player.gunMode === "SPACE LASER"; + if (rocket) { + grenades.push({ x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * 2850, vy: pose.dy * 2850, owner: player.pad, + fuse: 3.2, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0, rocket: true }); + while (grenades.length > 12) grenades.shift(); + player.gunAmmo -= 1; + player.nextGunShotAt = now + 650000; + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 240000; + player.pendingMoveLabel = "ROCKET " + player.gunAmmo; + playDrum("kick", 1.15, panPlayer(player)); + playSine(92, .22); + emitSignal("rocket", player.pad, pose.dx, pose.dy); + return; + } + // Automatic means a fast succession of discrete rounds, never a shotgun + // fan. Holding fire schedules the next SMG round below. + const shots = 1; + for (let shot = 0; shot < shots; shot++) { + bullets.push({ + x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * (laser ? 9600 : smg ? 5000 : 4200), + vy: pose.dy * (laser ? 9600 : smg ? 5000 : 4200), + owner: player.pad, life: 1, rubber: smg, laser, + safeUntil: now + 100000, + }); + } + while (bullets.length > 24) bullets.shift(); + player.gunAmmo -= shots; + player.nextGunShotAt = now + (laser ? 340000 : smg ? 85000 : 220000); + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + (laser ? 210000 : 170000); + player.pendingMoveLabel = + (laser ? "LASER " : smg ? "RUBBER SMG " : "FIRE ") + player.gunAmmo; + for (let shot = 0; shot < shots; shot++) { + playDrum(laser ? "whoosh" : smg ? "block" : "hat", + laser ? 1.35 : smg ? .62 + shot * .08 : 1.05, panPlayer(player)); + playSine(laser ? 1180 : (smg ? 310 : 760) + shot * 55, + laser ? .13 : smg ? .055 : .08); + } + emitSignal(laser ? "laser" : "bullet", player.pad, pose.dx, pose.dy); +} + +// The mouth used by both face paint and projectile spawn. Its coordinates are +// authored in face-space, then rotated with a bodyless head. Keeping this one +// transform prevents the visible lips and the physical glob from separating +// while the head rolls. +function spitMouthPose(player) { + const radius = 22; + const direction = player.facing || 1; + const head = { x: player.x, y: player.y - radius }; + const roll = isHeadOnly(player) ? player.headRoll || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const localX = direction * radius * .2; + const localY = radius * .3; + const offsetX = localX * cosRoll - localY * sinRoll; + const offsetY = localX * sinRoll + localY * cosRoll; + // Position and aim are related but not identical: the mouth sits low on the + // face, while spit travels mostly forward with only a small downward pitch. + // Using center->mouth as velocity made that low placement dominate the shot + // and swing it sideways as the head rolled. + // The runner's `facing` sign names its mirrored drawing side; the visible + // face normal points away from that sign. Treating it as the normal sent the + // release upper-left while the mouth presented lower-right. + const aimLocalX = -direction; + const aimLocalY = -.22; + const aimX = aimLocalX * cosRoll - aimLocalY * sinRoll; + const aimY = aimLocalX * sinRoll + aimLocalY * cosRoll; + // Screen/world Y grows downward. Head roll owns the sideways swing, but a + // spit release always pitches below the mouth instead of becoming an + // upward shot during the top half of a roll. + const downwardAimY = Math.abs(aimY); + const aimLength = Math.hypot(aimX, downwardAimY) || 1; + return { + x: head.x + offsetX, + y: head.y + offsetY, + outX: aimX / aimLength, + outY: downwardAimY / aimLength, + roll, direction, + }; +} + +function spit(player, heavy = false) { + const now = runtime().monotonicUs; + if (now < (player.nextSpitAt || 0)) return; + const mouth = spitMouthPose(player); + const direction = mouth.direction; + // A rolling head spits WHERE ITS MOUTH POINTS. The lob leaves along the + // head's current angle, so aim on a bodyless head is a timing skill — wait + // for the roll to face your rival, or spit skyward and let it rain. Bodied + // fighters have no roll and lob flat-forward as before. headRoll is sim + // state (integrated in updatePlayers), so the re-sim agrees. + // Release at the visible lips, mostly face-forward with a slight downward + // pitch. Both the spawn and aim use the same rolling face transform. + const speed = heavy ? 520 : 680; + const toss = { x: mouth.outX * speed, y: mouth.outY * speed }; + bullets.push({ + x: mouth.x, y: mouth.y, z: player.z, + previousX: mouth.x, previousY: mouth.y, + vx: toss.x, vy: toss.y, + owner: player.pad, life: 1, spit: true, heavy, + // Let the glob visibly clear the lips and the spitter's own fallen limbs. + // Without this, a bodyless fighter often spat directly into its debris + // halo and produced only a yellow impact puff on the release frame. + safeUntil: now + 220000, + }); + while (bullets.length > 24) bullets.shift(); + player.nextSpitAt = now + (heavy ? 520000 : 260000); + player.spitAt = now; + player.spitHeavy = heavy; + player.lastButton = heavy ? "HEAVY SPIT" : "SPIT"; + player.lastButtonAt = now; + player.pendingMoveLabel = player.lastButton; + playSine(heavy ? 118 : 190, heavy ? .16 : .1); + playDrum(heavy ? "kick" : "hat", heavy ? .82 : .55, panPlayer(player)); + emitSignal("spit", player.pad, heavy ? 2 : 1, direction); +} + +function throwGrenade(player, input = null) { + const now = runtime().monotonicUs; + const aimX = input?.horizontal || player.facing; + const aimY = input ? -input.vertical : -.25; + const length = Math.hypot(aimX, aimY) || 1; + grenades.push({ x: player.x + player.facing * 150, + y: player.y - (player.ducking ? 80 : 145), z: player.z, + vx: aimX / length * 1950, vy: aimY / length * 1950, + owner: player.pad, + fuse: 1.15, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0 }); + while (grenades.length > 12) grenades.shift(); + player.grenadeAmmo -= 1; + player.itemAction = "THROW"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 260000; + player.pendingMoveLabel = "GRENADE " + player.grenadeAmmo; + playDrum("kick", .95, panPlayer(player)); + emitSignal("grenade", player.pad, player.facing, player.ducking ? 1 : 0); +} + +function beginPickupDrop(pickup) { + const live = activePlayers().filter(p => p.alive); + const all = [...gunPickups, ...saberPickups, ...grenadePickups]; + const slot = Math.max(0, all.indexOf(pickup)); + if (airRoundActive()) { + const middle = live.reduce((sum, p) => sum + p.x, 0) / Math.max(1, live.length); + pickup.x = clamp(middle + ((slot % 5) - 2) * 190, + worldLeft + 150, worldRight - 150); + pickup.y = Math.min(...live.map(p => p.y), floorY + 1e9) - 800 - slot * 110; + pickup.dropLandingY = null; + pickup.dropVy = 960; + } else { + pickup.dropLandingY = surfaceYAt(pickup.x, floorY) - 70; + pickup.y = Math.min(pickup.dropLandingY - 520, floorY - 900); + pickup.dropVy = 0; + } + pickup.dropping = true; + pickup.respawnAt = 0; +} + +function updateFallingPickups(dt, now) { + const live = activePlayers().filter(p => p.alive); + const lower = live.length ? Math.max(...live.map(p => p.y)) + 1000 : floorY + 1000; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + if (!pickup.active) { + if (airRoundActive() && pickup.startsActive) { + if (!pickup.respawnAt) pickup.respawnAt = now + 4000000; + if (now >= pickup.respawnAt) { pickup.active = true; beginPickupDrop(pickup); } + } + continue; + } + if (!pickup.dropping) continue; + pickup.dropVy = Math.min(airRoundActive() ? 1100 : 1400, + (pickup.dropVy || 0) + 1900 * dt); + pickup.y += pickup.dropVy * dt; + if (airRoundActive()) { + if (pickup.y > lower) beginPickupDrop(pickup); + } else if (pickup.y >= pickup.dropLandingY) { + pickup.y = pickup.dropLandingY; + pickup.dropVy = 0; + pickup.dropping = false; + } + } +} + +function updateGunPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of gunPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.gunAmmo = Math.min(30, player.gunAmmo + pickup.amount); + player.gunMode = pickup.kind || "HANDGUN"; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, player.gunMode + " +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 1, pickup.amount); + break; + } + } +} + +// A saber is picked up the way a gun is and kept the way a limb is. It needs +// a free arm to take, it lives on `swordHeld` rather than in an ammo count, +// and `meleeSpecFor` is what spends it — every hand strike gets half again +// its reach while the blade is in the hand. Nothing here fires. +function updateSaberPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of saberPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || player.swordHeld || + !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, + pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.swordHeld = true; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "LIGHT SABER"); + playDrum("clap", 1.25, panPlayer(player)); + playSine(520, .14); + emitSignal("saber", player.pad, 1, 0); + break; + } + } +} + +function updateGrenadePickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of grenadePickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.grenadeAmmo = Math.min(4, player.grenadeAmmo + pickup.amount); + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "GRENADE +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 2, pickup.amount); + break; + } + } +} + +// Ripe fruit is a new body and fifteen seconds. The clock is `roundElapsedUs` +// counting up toward `roundDurationUs`, so winding it back is what "adds +// time" means here — and it is clamped at zero, because a tree cannot make +// the round longer than a round. +// The tree leans in off its wall, so both the picture and the pickup test have +// to agree about where the fruit ended up. One function owns that. +// The tree climbs its wall more than it leans off it, because a fighter pinned +// against that wall still has to be able to reach the fruit from a jump. One +// function owns the geometry so the picture and the pickup test agree. +function treeFruit(tree) { + const toward = tree.x < (worldLeft + worldRight) / 2 ? 1 : -1; + // Cube-scale tree. The tower's tree leaned three tiles into a room that + // had thirty; the same lean in a ten-tile cube put ripe fruit inside a + // spawn-idle fighter's reach, and two fighters who never moved wound the + // clock back fifteen seconds every eighteen — no round could end. This + // tree climbs about two tiles of wall, leans under one tile in, and hangs + // its fruit high enough that picking it is a jump at the wall, never a + // side effect of standing near one. + const reach = 45 + 150 * tree.growth; + return { x: tree.x + toward * (reach * .35 + 30), y: tree.y - reach * 1.3, + z: tree.z, toward, reach, + tipX: tree.x + toward * reach * .5, tipY: tree.y - reach * .9 }; +} + +function updateBodyTrees(dt, now) { + const poseTime = (now - startedAt) / 1000000; + for (const tree of bodyTrees) { + // One harvest a round, said out loud. Eighteen seconds of ripening against + // a thirty second round used to say it on its own, and the padded room's + // quarter-pipe said it again by holding the fruit a wall's height above a + // standing fighter. The tower's floor is flat, which put the fruit back + // inside arm's reach — and two fighters then stood at the wall winding + // fifteen seconds off the clock every eighteen, so the round could not + // end. A round that cannot end is worse than a body that stays broken. + if (tree.spent) continue; + if (tree.growth < 1) { + tree.growth = Math.min(1, tree.growth + dt * 1000000 / treeRipenUs); + continue; + } + const fruit = treeFruit(tree); + for (const player of players) { + if (!player.alive) continue; + // A tile and a third — a hand up at the fruit, not the whole corner of + // the room. Sized with treeFruit above so a spawn-mark idler stays out + // of range; the two limits only hold together. + if (runnerDistanceToPoint(player, poseTime, fruit.x, fruit.y, fruit.z) > 120) + continue; + tree.growth = 0; + tree.spent = true; + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + roundElapsedUs = Math.max(0, roundElapsedUs - treeTimeBonusUs); + remember(player, "NEW BODY"); + playDrum("bell", 1.15, panPlayer(player)); + emitSignal("powerup", player.pad, 3, treeTimeBonusUs / 1000000); + break; + } + } +} + +function drawBodyTree(tree, t) { + const scale = cameraScale(); + const ripe = tree.growth >= 1; + // Unripe reads as a sapling rather than a dimmed icon: the trunk and canopy + // are literally shorter, so the stage tells you how long the walk can wait. + const { x: fruitX, y: fruitY, toward, tipX, tipY: crownY } = treeFruit(tree); + const sway = Math.sin(t * 1.4 + tree.x * .0007) * (3 + 9 * tree.growth); + const bark = mixColor([120, 92, 64], [58, 46, 38], visualTheme.light); + const leaf = ripe + ? mixColor([120, 226, 138], [46, 150, 84], visualTheme.light) + : mixColor([96, 140, 104], [44, 84, 60], visualTheme.light); + const tipY = crownY + sway; + worldCapsule(tree.x, tree.y, tree.z, tipX, tipY, tree.z, + Math.max(2, (11 + 9 * tree.growth) * scale), bark); + // Canopy sized with treeFruit's cube-scale lean: fronds stay under a tile + // long so the tree dresses its wall without reaching into the fight. + for (const spread of [-1, -.35, .35, 1]) { + worldCapsule(tipX, tipY, tree.z, + tipX + toward * (30 + 45 * tree.growth), + tipY + spread * (30 + 35 * tree.growth), tree.z, + Math.max(2, (8 + 8 * tree.growth) * scale), leaf); + } + if (!ripe) return; + // The fruit is the part you aim at, so it only exists once it can be taken. + const point = projectPoint(fruitX, fruitY + sway, tree.z); + filledDisc(point.x, point.y, Math.max(3, 46 * scale), + mixColor([236, 108, 132], [188, 62, 92], visualTheme.light)); +} + +function updatePowerups(now) { + while (roundElapsedUs >= nextPowerupAtUs) { + // Only the slot marked `cycle` is the rotation's business. Asking whether + // ANY gun pickup is on the map would let an untouched space laser sitting + // on the top deck stall the pistol reload for the whole round. + const pickup = gunPickups.find((slot) => slot.cycle); + // Authored maps may intentionally have no replenishing weapon. + if (pickup && !pickup.active) { + // The cycle's whole job is to keep six more rounds of ammo appearing + // somewhere worth crossing the station for — the corner tiles, + // alternating, so the reload never lives on one fighter's side. + pickup.active = true; + pickup.x = tileCenterX(powerupSequence % 2 === 0 + ? cornerColLeft : cornerColRight); + pickup.z = 0; + beginPickupDrop(pickup); + powerupSequence += 1; + emitSignal("powerup", -1, powerupSequence, nextPowerupAtUs / 1000000); + playDrum("clap", .9, 0); + } + nextPowerupAtUs += powerupIntervalUs; + } + updateGunPickups(now); + updateSaberPickups(now); + updateGrenadePickups(now); +} + +// Ghost trails map a ricochet's whole path. The fixed length is the entire +// point: shots here have no clock-based expiry, they bounce until they hit +// somebody, so a trail that grew with flight time would be the eleven-frames-a +// -second stray all over again — measured in line segments instead of terrain +// span. A ring buffer costs the same on the thousandth bounce as on the first. +// +// Sampling every third tick buys three times the arc for the same sixteen +// points, and a bounce records out of turn so the corner lands on the wall +// rather than being chorded through it. +const bulletTrailPoints = 12; +const bulletTrailStride = 4; + +function recordBulletTrail(bullet) { + if (!bullet.trail) { + // One allocation at birth, never per frame. + bullet.trail = new Array(bulletTrailPoints * 2).fill(0); + bullet.trailCount = 0; + } + const slot = (bullet.trailCount % bulletTrailPoints) * 2; + bullet.trail[slot] = bullet.x; + bullet.trail[slot + 1] = bullet.y; + bullet.trailCount++; +} + +function updateBullets(dt, now, combat = true) { + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + bullet.vx += windAcceleration * .12 * dt; + // A glob is a ball, not a round: gravity pulls the toss back down, and it + // dries out in flight rather than flying forever. The gravity is soft on + // purpose — the lob should hang for over a second, analog and watchable. + if (bullet.spit) { + bullet.vy += 700 * dt; + bullet.life -= dt * .22; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + continue; + } + } + bullet.previousX = bullet.x; + bullet.previousY = bullet.y; + bullet.x += bullet.vx * dt; + bullet.y += bullet.vy * dt; + // Held so the ricochets below can be spotted by the sign they flip. + const enteredVx = bullet.vx; + const enteredVy = bullet.vy; + // A laser bolt does not ricochet. Everything else in this game's ballistics + // is built on the opposite rule — "shots have no clock-based expiry, arena + // surfaces ricochet them so a long-travelling round remains part of the + // fight" — and that rule is what makes the pistol frightening in a closed + // room. The bolt is the other half of the pair: four of them, travelling + // more than twice as fast, each spent outright the moment it touches + // anything. Fast and honest against slow and haunting, and a laser miss is + // a miss for good. + if (bullet.laser && (bullet.x - 24 <= worldLeft + wallThickness || + bullet.x + 24 >= worldRight - wallThickness || + (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) || + bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness)) { + bullet.life = 0; + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .14, duration: .14, death: false, explosion: false }); + playDrum("hat", 1.4, panAt(bullet.x, bullet.z)); + continue; + } + // Shots have no clock-based expiry. Arena surfaces ricochet them so a + // long-travelling round remains part of the fight until contact. + if (bullet.x - 24 <= worldLeft + wallThickness) { + bullet.x = worldLeft + wallThickness + 24; + bullet.vx = Math.abs(bullet.vx); + } else if (bullet.x + 24 >= worldRight - wallThickness) { + bullet.x = worldRight - wallThickness - 24; + bullet.vx = -Math.abs(bullet.vx); + } + if (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) { + bullet.y = ceilingY + wallThickness + 24; + bullet.vy = Math.abs(bullet.vy); + } else if (bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness) { + bullet.y = terrainFloorAt(bullet.x) - wallThickness - 24; + if (bullet.spit) { + // A bouncing ball, not a ricochet: each bounce keeps half the height + // and costs a bite of the glob, and once the bounce is too small to + // read it dissipates where it lies instead of buzzing along the floor. + bullet.vy = -Math.abs(bullet.vy) * .56; + bullet.vx *= .84; + bullet.life -= .18; + if (Math.abs(bullet.vy) < 90) bullet.life = 0; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + } else playDrum("hat", .3, panAt(bullet.x, bullet.z)); + // A splash bounces any bodyless head standing in it — including the + // spitter's own, so spitting straight down is a little hop. Popcorn + // physics for the intimate spit fight. + for (const target of players) { + if (!target?.alive || !isHeadOnly(target)) continue; + if (Math.abs(target.x - bullet.x) > 70 || + Math.abs(target.y - bullet.y) > 90) continue; + target.vy = Math.min(target.vy, 0) - 240; + target.grounded = false; + } + } else bullet.vy = -Math.abs(bullet.vy); + } + // A bounce is worth a point of its own: on the stride alone the segment + // spanning a ricochet would cut the corner straight through the wall. + if (bullet.vx !== enteredVx || bullet.vy !== enteredVy || + bullet.trailTick === undefined) { + bullet.trailTick = 0; + recordBulletTrail(bullet); + } else if (++bullet.trailTick % bulletTrailStride === 0) + recordBulletTrail(bullet); + } + for (let left = 0; left < bullets.length; left++) { + const a = bullets[left]; + if (a.life <= 0) continue; + for (let right = left + 1; right < bullets.length; right++) { + const b = bullets[right]; + if (b.life <= 0 || a.owner === b.owner) continue; + if (Math.abs(a.x - b.x) <= 96 && Math.abs(a.y - b.y) <= 52 && + Math.abs(a.z - b.z) <= 48) { + a.life = 0; + b.life = 0; + spawnImpact({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, + z: (a.z + b.z) / 2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", 1, 0); + emitSignal("cancel", -1, a.owner, b.owner); + break; + } + } + } + if (!combat) return; + const poseTime = (now - startedAt) / 1000000; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + const shot = { x1: bullet.previousX ?? bullet.x, + y1: bullet.previousY ?? bullet.y, z1: bullet.z, + x2: bullet.x, y2: bullet.y, z2: bullet.z, width: 48 }; + for (const fragment of detachedParts) { + if (fragment.owner === bullet.owner && now < bullet.safeUntil) continue; + const contact = segmentSegmentClosest(shot, fragment); + if (contact.distance > (shot.width + fragment.width) / 2) continue; + const impulse = bullet.heavy ? 1500 : bullet.spit ? 900 : 1200; + fragment.vx += Math.sign(bullet.vx || 1) * impulse; + fragment.vy -= bullet.heavy ? 520 : 300; + fragment.owner = bullet.owner; + fragment.hitAfter = now + 120000; + bullet.life = 0; + spawnImpact({ x: contact.secondPoint.x, y: contact.secondPoint.y, + z: contact.secondPoint.z, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", .72, panAt(fragment.x1, fragment.z1)); + break; + } + if (bullet.life <= 0) continue; + const targets = [...players.filter((player) => player.pad !== bullet.owner), players[bullet.owner]]; + for (const target of targets) { + if (!target?.alive || (target.pad === bullet.owner && now < bullet.safeUntil)) + continue; + // Reflect across the circular shield's local surface normal. A square hit + // returns home; a glancing hit leaves at the corresponding ricochet angle. + // Flipping `owner` lets the returned shot hurt whoever fired it. + if (target.blocking) { + const shield = shieldGeometry(target); + const guard = sampleCombatBoxes(target,now).guard[0]; + if (guard && segmentBoxEntry({x1:bullet.previousX??bullet.x,y1:bullet.previousY??bullet.y, + z1:bullet.z,x2:bullet.x,y2:bullet.y,z2:bullet.z},guard,24)!==null) { + let nx = bullet.x - shield.x; + let ny = bullet.y - shield.y; + const normalLength = Math.hypot(nx, ny); + if (normalLength > .001) { + nx /= normalLength; + ny /= normalLength; + } else { + const speed = Math.hypot(bullet.vx, bullet.vy) || 1; + nx = -bullet.vx / speed; + ny = -bullet.vy / speed; + } + const normalVelocity = bullet.vx * nx + bullet.vy * ny; + bullet.vx -= 2 * normalVelocity * nx; + bullet.vy -= 2 * normalVelocity * ny; + bullet.x = shield.x + nx * (shield.radius + 25); + bullet.y = shield.y + ny * (shield.radius + 25); + bullet.owner = target.pad; + bullet.life = Math.max(bullet.life, .55); + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .18, duration: .18, death: false, explosion: false }); + breakShield(target, now); + emitSignal("ballblock", target.pad, 1, 0); + continue; + } + } + const contact = sweptProjectileContact([{ + x1: bullet.previousX ?? bullet.x, y1: bullet.previousY ?? bullet.y, + z1: bullet.z, x2: bullet.x, y2: bullet.y, z2: bullet.z, + width: 48, role: "bullet", part: "bullet", + }], target, poseTime); + if (contact && contact.separation <= 3) { + const pointContact = runnerContactToPoint(target, poseTime, + bullet.x, bullet.y, bullet.z); + const endpointHit = Math.min(pointContact.headDistance, + pointContact.bodyDistance) <= 24; + const headshot = endpointHit + ? pointContact.headDistance <= pointContact.bodyDistance + : contact.headshot; + const segmentIndex = endpointHit && !headshot + ? pointContact.segmentIndex : contact.segmentIndex; + bullet.life = 0; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: headshot, + explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + if (headshot) + killPlayer(target, bullet.owner, now, "SHOT"); + else { + applyBodyHit(target, segmentIndex, + bullet.x - bullet.vx, bullet.owner, now, + bullet.heavy ? 1680 : bullet.spit ? 920 : 1180, + bullet.heavy ? 260 : bullet.spit ? 90 : 125); + playDrum("block", .9, panPlayer(target)); + } + break; + } + } + } + for (let index = bullets.length - 1; index >= 0; index--) + if (bullets[index].life <= 0) bullets.splice(index, 1); +} + +function updateGrenades(dt, now, combat = true) { + for (const grenade of grenades) { + if (!grenade.alive) continue; + if (grenade.exploding) { + grenade.blastAge += dt; + grenade.blastRadius = grenadeBlastRadius * + Math.min(1, grenade.blastAge / grenadeBlastDuration); + const poseTime = (now - startedAt) / 1000000; + for (const player of combat ? players : []) { + if (!player.alive || (grenade.hitPlayers & (1 << player.pad))) continue; + const contact = runnerContactToPoint(player, poseTime, + grenade.x, grenade.y, grenade.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > + grenade.blastRadius) continue; + grenade.hitPlayers |= 1 << player.pad; + if (contact.headDistance <= grenade.blastRadius) + killPlayer(player, grenade.owner, now, "BLASTED"); + else { + const blastForce = 1250 + 850 * + (1 - clamp(contact.bodyDistance / grenadeBlastRadius, 0, 1)); + applyBodyHit(player, contact.segmentIndex, grenade.x, + grenade.owner, now, blastForce, 300); + } + } + if (grenade.blastAge >= grenadeBlastDuration) grenade.alive = false; + continue; + } + const previousY = grenade.y; + if (!grenade.rocket) { + grenade.vx += windAcceleration * .45 * dt; + grenade.vy += 1800 * dt; + } + grenade.x += grenade.vx * dt; + grenade.y += grenade.vy * dt; + grenade.fuse -= dt; + if (grenade.rocket) { + const poseTime = (now - startedAt) / 1000000; + for (const target of combat ? players : []) { + if (!target.alive || target.pad === grenade.owner) continue; + if (runnerDistanceToPoint(target, poseTime, + grenade.x, grenade.y, grenade.z) > 34) continue; + grenade.fuse = 0; + break; + } + } + const inset = wallThickness + 35; + if (grenade.x < worldLeft + inset) { + grenade.x = worldLeft + inset; + grenade.vx = Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } else if (grenade.x > worldRight - inset) { + grenade.x = worldRight - inset; + grenade.vx = -Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + if (!airRoundActive() && grenade.y < ceilingY + inset) { + grenade.y = ceilingY + inset; + grenade.vy = Math.abs(grenade.vy) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + const ledge = grenade.vy >= 0 && + ledgeCrossed(grenade.x, previousY, grenade.y, 30); + if (ledge) { + grenade.y = ledge.y - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + } else if (grenade.y >= terrainFloorAt(grenade.x) - 30) { + grenade.y = terrainFloorAt(grenade.x) - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + if (grenade.rocket) grenade.fuse = 0; + } + if (grenade.fuse <= 0) { + grenade.exploding = true; + grenade.blastAge = 0; + grenade.blastRadius = 0; + grenade.vx = 0; + grenade.vy = 0; + playDrum("kick", 1.25, panPlayer(players[grenade.owner])); + emitSignal("blast", grenade.owner, + grenade.x / worldRight, grenade.y / floorY); + } + } + for (let index = grenades.length - 1; index >= 0; index--) + if (!grenades[index].alive) grenades.splice(index, 1); +} + +function startMelee(player, kind, now) { + if (isHeadOnly(player) || isPogo(player)) return; + // Every fresh press starts a strike, including during the previous swing. + // updatePlayer detects the edge; holding a button does not auto-repeat. + const spec = meleeSpecs[kind]; + if (!spec) return; + const attackingPart = kind === "KICK" + ? player.facing > 0 ? "right-leg" : "left-leg" + : itemHand(player); + if (!hasPart(player, attackingPart)) return; + player.attackKind = kind; + player.lowKick = kind === "KICK" && + (player.ducking || (player.crouchBlend || 0) > .35); + player.attackStartedAt = now; + player.attackUntil = now + spec.windowUs; + player.attackHit = false; + player.attackMomentum = now < player.dashUntil + ? clamp(Math.abs(player.vx) / walkSpeed, 1.35, 2.25) : 1; + player.stance = "ATTACK"; + player.pendingMoveLabel = kind; + playDrum(spec.cue[0], spec.cue[1], panPlayer(player)); + emitSignal(kind.toLowerCase(), player.pad, player.facing, 0); +} + +const limbParts = ["left-arm", "right-arm", "left-leg", "right-leg"]; +const spiderLegParts = Array.from({ length: 8 }, (_, index) => + `spider-leg-${index + 1}`); +const hasPart = (player, part) => !player.removedParts?.includes(part); +const isPogo = (player) => hasPart(player, "torso") && + limbParts.every((part) => !hasPart(player, part)); +const isHeadOnly = (player) => !hasPart(player, "torso"); +const availableArm = (player) => { + const lead = player.facing > 0 ? "right-arm" : "left-arm"; + if (hasPart(player, lead)) return lead; + const other = lead === "right-arm" ? "left-arm" : "right-arm"; + return hasPart(player, other) ? other : ""; +}; +// Ownership stays attached to the arm that picked the object up; turning or +// boarding cannot teleport a gun between hands. +const itemHand = (player) => player.itemArm || availableArm(player); +// Gun before grenade, always: the pistol is the sustained item and the one +// drawn in the hand, so "use what you are holding" needs no mode toggle. +const heldItem = (player) => + isHeadOnly(player) ? player.gunAmmo > 0 ? "GUN" : "" + : isPogo(player) || !itemHand(player) || !hasPart(player, itemHand(player)) + ? "" : player.gunAmmo > 0 ? "GUN" + : player.grenadeAmmo > 0 ? "GRENADE" : ""; +const itemSwinging = (player, now) => + (player.attackKind === "WHIP" || player.attackKind === "BASH") && + meleePulse(player, now) > 0; + +function meleePulse(player, now) { + if (now >= player.attackUntil || player.attackUntil <= player.attackStartedAt) return 0; + const phase = (now - player.attackStartedAt) / + (player.attackUntil - player.attackStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +// Collision starts on the input frame and lasts through the original short +// swing. A landed strike still hits only once; another tap starts a new one. +const meleeFrames = { + PUNCH: { startup: 0, active: 14, recovery: 0 }, + KICK: { startup: 0, active: 14, recovery: 0 }, + WHIP: { startup: 0, active: 12, recovery: 0 }, + BASH: { startup: 0, active: 17, recovery: 0 }, +}; +function meleeFrame(player, now) { + const timing = meleeFrames[player.attackKind]; + if (!timing || now < player.attackStartedAt || now >= player.attackUntil) + return { frame: 0, phase: 'neutral', startup: 0, active: 0, recovery: 0 }; + const frame = Math.floor((now - player.attackStartedAt) / replayTickUs + 1e-7) + 1; + return { ...timing, frame, phase: frame <= timing.startup ? 'startup' + : frame <= timing.startup + timing.active ? 'active' : 'recovery' }; +} + +function meleeTarget(player, now) { + const pulse = meleePulse(player, now); + const spec = meleeSpecFor(player, player.attackKind); + const lowKick = player.attackKind === "KICK" && player.lowKick; + const reachX = player.x + player.facing * (spec.reach + spec.swell * pulse); + // A low kick sweeps the ground in front of the kicker — the ground he is + // standing on. The bare terrain probe read the arena floor, so a low kick + // thrown on a rung aimed a storey down through the rung it stood on. + const sweepY = lowKick + ? Math.min(surfaceYAt(reachX, player.y), player.y + 20) - 5 : 0; + return { + x: player.x + player.facing * (spec.reach + spec.swell * pulse + + (lowKick ? 34 * pulse : 0)), + y: lowKick ? sweepY : player.y - (player.attackKind !== 'KICK' && + (player.ducking || player.crouchBlend > .35) ? 68 : spec.height), + z: player.z, + }; +} + +function itemActionPulse(player, now) { + if (!player.itemAction || now >= player.itemActionUntil) return 0; + const phase = (now - player.itemActionStartedAt) / + Math.max(1, player.itemActionUntil - player.itemActionStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +function itemHandTarget(player, now) { + // A surviving head grips the pistol at the mouth. It can still aim and fire, + // but grenades and melee weapons remain limb-dependent. + if (isHeadOnly(player)) return { + x: player.x + player.facing * 18, + y: player.y - 20, z: player.z, + }; + // A swung weapon rides the striking hand, so the drawn pistol or grenade + // sits on the live attack capsule instead of floating out in front. + if (itemSwinging(player, now)) return meleeTarget(player, now); + const pulse = itemActionPulse(player, now); + if (player.itemAction === "THROW") return { + x: player.x + player.facing * (42 + 52 * pulse), + y: player.y - 118 - 52 * pulse, z: player.z, + }; + if (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil)) { + const aimX = player.gunAimX || player.facing; + const aimY = player.gunAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { x: player.x + aimX / length * 108, + y: player.y - 102 + aimY / length * 92, z: player.z }; + } + return { x: player.x + player.facing * 108, + y: player.y - 115, z: player.z }; +} + +function itemForearm(player, geometry) { + const arm = itemHand(player); + return geometry.segments.find(segment => segment.part === arm && + (segment.role === "item-forearm" || segment.role === "attack-forearm")) || + geometry.segments.find(segment => segment.part === arm && + segment.role?.endsWith("forearm")); +} + +function gunPose(player, now, input = null) { + let aimX = input?.horizontal || player.facing; + let aimY = input ? -input.vertical : 0; + if (!input && (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil))) { + aimX = player.gunAimX || player.facing; + aimY = player.gunAimY || 0; + } + const length = Math.hypot(aimX, aimY) || 1; + const dx = aimX / length; + const dy = aimY / length; + // The arm solver can clamp its reach, and skating rotates/translates the + // whole skeleton. Use its solved wrist rather than the untransformed aim + // target for both the held weapon and the projectile's muzzle. + const forearm = !isHeadOnly(player) && itemForearm(player, + player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, (now - startedAt) / 1000000)); + const hand = forearm ? {x:forearm.x2, y:forearm.y2, z:forearm.z2} + : itemHandTarget(player, now); + return { + hand, dx, dy, + muzzle: { x: hand.x + dx * 54, y: hand.y + dy * 54, z: hand.z }, + }; +} + +function meleeStrike(player, now) { + const target = meleeTarget(player, now); + return { + x: target.x, y: target.y, z: target.z, + radius: meleeSpecFor(player, player.attackKind).radius, + }; +} + +function shieldGeometry(player) { + const aimX = player.shieldAimX || player.facing; + const aimY = player.shieldAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { + x: player.x + aimX / length * shieldForward, + y: player.y - (player.shieldCrouched ? 58 : 90) - + aimY / length * shieldForward, + z: player.z, + radius: shieldRadius, + }; +} + +// A shield is spent the moment it does its job. It eats exactly one hit, then +// drops — and `shieldLocked` keeps a still-held B from raising it again on the +// very next frame, which is what turns the break into a real opening instead +// of a flicker nobody can see. The shielder is deliberately left free to act: +// breaking the shield is what buys them the swing. +function breakShield(player, now) { + player.blocking = false; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blockFlash = 1; + player.stance = "SHIELD BREAK"; + player.pendingMoveLabel = "SHIELD BREAK"; + playDrum("bell", 1, panPlayer(player)); + emitSignal("shieldbreak", player.pad, 1, 0); +} + +// Stun scales with what the shield ate, so a BASH buys a longer punish than a +// WHIP. The floor is still long enough to answer at 60fps (~8 frames) and the +// ceiling short enough (~18) that a blocked attacker is opened, not deleted. +function shieldStunUs(force) { + return Math.round(140000 + clamp((force - 1000) / 750, 0, 1) * 160000); +} + +function returnBall(ball, player, now, shielded, intensity = 1) { + const incomingVx = ball.vx; + const incomingVy = ball.vy; + const direction = ball.x >= player.x ? 1 : -1; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const response = ball.hitScale || 1; + const momentum = shielded ? 1 : player.attackMomentum || 1; + const normalSpeed = (currentSpeed * 1.34 + 720) * intensity * + momentum * response; + const shieldMinimum = (1800 + clamp(intensity, 0, 1) * 1000) * response; + const speed = shielded + ? Math.min(4200 * response, Math.max(shieldMinimum, normalSpeed * 1.65)) + : Math.min(4800, normalSpeed); + ball.vx = direction * speed; + const lift = shielded ? .72 : player.inputY > 0 ? .58 + : player.attackKind === "KICK" ? .34 : .2; + ball.vy = -speed * lift; + ball.x = player.x + direction * (ball.radius + 85); + ball.y = Math.min(ball.y, player.y - 55); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 140000; + ball.safePlayers = 1 << player.pad; + if (!shielded) { + player.attackHit = true; + player.lastButton = "WACK"; + player.lastButtonAt = now; + } + else { + player.blockFlash = 1; + player.knockVx += incomingVx * .55; + player.vy = Math.min(player.vy + incomingVy * .16, -Math.max(520, speed * .28)); + player.grounded = false; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .22, duration: .22, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum(shielded ? "block" : "clap", shielded ? 1.1 : 1.25, + panAt(ball.x, ball.z)); + emitSignal(shielded ? "ballblock" : "wack", player.pad, + direction, Math.round(speed)); +} + +function crossWackBall(ball, hitters, now) { + const first = hitters[0]; + const second = hitters[1]; + const fighterDistance = Math.abs(first.player.x - second.player.x); + const convergence = clamp(1 - fighterDistance / 520, 0, 1); + const contact = (first.contact + second.contact) * .5; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.min(7600, (4100 + currentSpeed * .72 + + convergence * 2300 + contact * 900) * (ball.hitScale || 1)); + const stronger = first.contact >= second.contact ? first.player : second.player; + const direction = Math.sign(ball.vx) || stronger.facing || 1; + ball.vx = direction * speed; + ball.vy = -speed * (.3 + convergence * .18); + ball.x += direction * 35; + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 8); + ball.lastHitBy = -1; + ball.safeUntil = now + 180000; + ball.safePlayers = 3; + for (const hit of hitters) { + hit.player.attackHit = true; + hit.player.lastButton = "CROSS WACK"; + hit.player.lastButtonAt = now; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .32, duration: .32, death: false, explosion: true }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("clap", 1.55, panAt(ball.x, ball.z)); + emitSignal("crosswack", -1, direction, Math.round(speed)); +} + +function bootBall(ball, player, now) { + // Walking contact carries the grounded ball in the player's travel + // direction. A melee strike remains the intentionally stronger launch. + const direction = Math.sign(player.vx) || Math.sign(ball.x - player.x) || + player.facing || 1; + const dashing = now < player.dashUntil && Math.abs(player.dashVx) > walkSpeed; + const speed = Math.min(dashing ? 2600 : 1450, + (420 + Math.abs(player.vx) * (dashing ? .58 : .32)) * + (ball.hitScale || 1)); + ball.vx = direction * speed; + ball.vy = -Math.max(dashing ? 420 : 80, speed * (dashing ? .24 : .06)); + ball.x = player.x + direction * (ball.radius + 58); + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 2); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 180000; + ball.safePlayers = 1 << player.pad; + player.lastButton = dashing ? "DASH BOOT" : "BOOT"; + player.lastButtonAt = now; + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("kick", 1.12, panAt(ball.x, ball.z)); + emitSignal("boot", player.pad, direction, Math.round(speed)); +} + +function bounceBallOffBody(ball, player, now, segmentIndex = -1) { + const direction = Math.sign(ball.x - player.x) || -Math.sign(ball.vx) || + player.facing || 1; + const incomingSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.max(760, Math.min(3600, incomingSpeed * .86 / + Math.sqrt(ball.mass || 1))); + ball.vx = direction * speed; + ball.vy = -Math.max(260, Math.abs(ball.vy) * .42 + speed * .12); + ball.x += direction * (ball.radius + 18); + ball.lastHitBy = player.pad === 0 ? 1 : 0; + ball.safeUntil = now + 160000; + ball.safePlayers = 1 << player.pad; + applyBodyHit(player, segmentIndex, ball.x - ball.vx, + ball.lastHitBy, now, 760, 110, false); + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("block", .82, panAt(ball.x, ball.z)); + emitSignal("bodybounce", player.pad, direction, Math.round(speed)); +} + +function updateBall(ball, dt, now) { + // A popped ball is gone, not retired — a crater should cost the round its + // ball for a moment, not for good. It re-inflates over the middle once its + // serve time comes round. + if (!ball.active && ballEnabled && ball.serveAt && now >= ball.serveAt) { + ball.active = true; + // Re-inflate on the far side from wherever it popped, so the fighter who + // owned the ball's exit does not also own its return. + ball.x = ball.x > centerX + ? tileCenterX(cornerColLeft + 1) : tileCenterX(cornerColRight - 1); + ball.y = ceilingY + ball.radius + 120; + ball.z = 0; + ball.vx = 0; + ball.vy = 0; + ball.rotation = 0; + ball.lastHitBy = -1; + ball.safeUntil = now + 250000; + ball.safePlayers = 0; + emitSignal("ballserve", -1, 0, 0); + } + if (!ball.active || now < ball.serveAt) return; + if (ball.heldBy >= 0) { + const carrier = players[ball.heldBy]; + if (!carrier?.alive || carrier.heldBall !== balls.indexOf(ball)) { + ball.heldBy = -1; + } else { + ball.x = carrier.x + carrier.facing * (ball.radius + 54); + ball.y = carrier.y - (carrier.ducking ? 58 : 94); + ball.z = carrier.z - 6; + ball.vx = carrier.vx; + ball.vy = carrier.vy; + return; + } + } + const isBoard = ball.type === "skateboard"; + const contactRadius = isBoard ? skateAxleDrop + skateWheelRadius : ball.radius; + const platformSupported = ledgeSupports(ball.x, ball.y, contactRadius); + const floorSupported = ball.y >= terrainFloorAt(ball.x) - contactRadius - 2; + const grounded = (platformSupported || floorSupported) && Math.abs(ball.vy) < 180; + if (!grounded) ball.vx += windAcceleration * (ball.windFactor || .45) * dt; + ball.vy += 1900 * (ball.gravityFactor || 1) * dt; + const previous = { x: ball.x, y: ball.y, z: ball.z }; + ball.x += ball.vx * dt; + ball.y += ball.vy * dt; + if (Math.abs(ball.vx) > 20) { + if (isBoard) ball.skateSpin = (ball.skateSpin || 0) + ball.vx * dt / skateWheelRadius; + else ball.rotation += ball.vx * dt / Math.max(1, contactRadius); + } + const inset = wallThickness + contactRadius; + if (ball.x < worldLeft + inset) { + ball.x = worldLeft + inset; + ball.vx = Math.abs(ball.vx); + } else if (ball.x > worldRight - inset) { + ball.x = worldRight - inset; + ball.vx = -Math.abs(ball.vx); + } + if (!airRoundActive() && ball.y < ceilingY + inset) { + ball.y = ceilingY + inset; + ball.vy = Math.abs(ball.vy); + } + const ledge = ball.vy >= 0 && + ledgeCrossed(ball.x, previous.y, ball.y, contactRadius, contactRadius); + if (ledge) { + ball.y = ledge.y - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .58) : 0; + ball.vx *= ball.drag || .992; + } else if (ball.y > terrainFloorAt(ball.x) - contactRadius) { + ball.y = terrainFloorAt(ball.x) - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .62) : 0; + ball.vx *= ball.drag || .992; + } + const onSurface = (ledgeSupports(ball.x, ball.y, contactRadius) || + ball.y >= terrainFloorAt(ball.x) - contactRadius - 2) && Math.abs(ball.vy) < 180; + if (isBoard && onSurface) { + const contact = skateContact(ball.x, previous.y + contactRadius); + ball.y = contact.y - contactRadius; + ball.rotation = contact.pitch; + const slope = Math.tan(contact.pitch); + ball.vx += fallGravity() * slope / (1 + slope * slope) * dt; + ball.vx *= Math.exp(-dt * .65); + } + const poseTime = (now - startedAt) / 1000000; + const hitters = []; + // The head test below sweeps from `previous`, so the reach margin carries + // this tick's travel as well as the ball's radius. + const travel = Math.hypot(ball.x - previous.x, ball.y - previous.y); + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + const boxes = sampleCombatBoxes(player, now); + for (const strike of boxes.hit) { + const distance = pointBoxDistance(strike, ball.x, ball.y, ball.z); + if (distance <= ball.radius) { + hitters.push({ player, contact: clamp(1-distance/ball.radius,0,1) }); break; + } + } + } + if (hitters.length >= 2) { + crossWackBall(ball, hitters, now); + return; + } + if (hitters.length === 1) { + returnBall(ball, hitters[0].player, now, false, + .92 + hitters[0].contact * .38); + return; + } + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + if (player.blocking) { + const guard = sampleCombatBoxes(player, now).guard[0]; + const distance = guard ? pointBoxDistance(guard, ball.x, ball.y, ball.z) : Infinity; + if (distance <= ball.radius) { + const shield = shieldGeometry(player); + const proximity = clamp(1-Math.max(0,Math.hypot(ball.x-shield.x, + ball.y-shield.y,ball.z-shield.z)-ball.radius)/shield.radius,0,1); + returnBall(ball, player, now, true, proximity); + return; + } + } + const headBox = sampleCombatBoxes(player,now).hurt.find(b=>b.part==='head'); + const currentHeadDistance = pointBoxDistance(headBox,ball.x,ball.y,ball.z); + const sweptHeadDistance = segmentBoxEntry( + { x1: previous.x, y1: previous.y, z1: previous.z, + x2: ball.x, y2: ball.y, z2: ball.z },headBox,ball.radius)!==null ? 0 : Infinity; + const headDistance = Math.min(currentHeadDistance, sweptHeadDistance); + const bodyContact = runnerContactToPoint(player, poseTime, + ball.x, ball.y, ball.z); + const bodyDistance = bodyContact.bodyDistance; + if (Math.min(headDistance, bodyDistance) > ball.radius) continue; + if (ball.type === "skateboard" && headDistance > ball.radius && + bodyDistance <= ball.radius && !player.skateboard && + // A thrown deck is a weapon until it slows down — nobody catches a + // board shot out of the air with their shins. + Math.hypot(ball.vx, ball.vy) < 900) { + resetSkate(player); + player.skateboard = true; + ball.riderPad = player.pad; + player.skateVx = player.vx; + player.skatePitch = skateContact(player.x, player.y).pitch; + ball.active = false; + ball.heldBy = -1; + player.lastButton = "SKATEBOARD"; + player.lastButtonAt = now; + playDrum("clap", .9, panPlayer(player)); + emitSignal("skate-mount", player.pad, 1, 0); + return; + } + const runningContact = player.grounded && Math.abs(player.vx) > 40 && + (onSurface || ball.y >= player.y - ball.radius - 55); + if (runningContact) { + bootBall(ball, player, now); + return; + } + if (headDistance <= ball.radius) { + const sourcePad = ball.lastHitBy >= 0 && ball.lastHitBy !== player.pad + ? ball.lastHitBy : player.pad === 0 ? 1 : 0; + dismountSkateboard(player, now); + damageAllLimbs(player, ball.x - ball.vx, sourcePad, now); + bounceBallOffBody(ball, player, now, -1); + player.lastButton = "HEAD HIT"; + player.lastButtonAt = now; + return; + } + bounceBallOffBody(ball, player, now, bodyContact.segmentIndex); + return; + } +} + +// Returns whether the tap was spent on a double-tap move, so a single tap can +// still mean something else to the caller. +function directionTap(player, direction, now) { + const previousTap = player.lastTap[direction] || -10000000; + const releasedAt = player.lastRelease[direction] || -10000000; + player.lastTap[direction] = now; + if (now - previousTap > doubleTapUs || releasedAt <= previousTap || + now - releasedAt < doubleTapReleaseUs) return false; + player.lastTap[direction] = -10000000; + player.pendingMoveLabel = direction === "UP" ? "ULTRA AIR" : "DASH " + direction; + playDrum("clap", 1.05, panPlayer(player)); + if (direction === "UP") { + player.vy = -ultraJumpVelocity; + player.grounded = false; + player.jumpHeld = false; + emitSignal("ultrajump", player.pad, 1, 0); + } else if (direction === "DOWN") { + if (player.skateboard && !player.grounded) { + // Airborne on the board, the second tap is a throw, not a dive: the + // deck shoots straight down like a spiked item, and whoever it lands + // on takes it like one. The rider pops up off the release. + // The one-ball economy: like a dismount, the round's ball is + // redressed as the board so exactly one object ever exists. + // The station carries its own board, so there is nothing to redress: + // the old one-object economy borrowed the round's ball and handed it + // back at the bell, which is exactly the trick that stopped being + // necessary when the board became furniture with an entry of its own. + const board = boardForRider(player); + resetSkate(player); + if (board) { + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.spawnOwner = player.pad; + board.lastHitBy = player.pad; + board.x = player.x; + board.y = player.y + 40; + board.z = player.z; + board.vx = player.vx * .35; + board.vy = Math.max(2600, player.vy + 2600); + } + player.vy = Math.min(player.vy, -420); + player.pendingMoveLabel = "BOARD SHOT"; + playDrum("whoosh", 1, panPlayer(player)); + playDrum("kick", .8, panPlayer(player)); + emitSignal("board-shot", player.pad, 1, 0); + return true; + } + if (player.pounding) { + player.poundLevel = Math.min(3, Math.max(1, player.poundLevel) + 1); + const cap = poundMaxVelocity * (1 + .5 * (player.poundLevel - 1)); + player.vy = Math.min(cap, Math.max(poundLaunchVelocity, player.vy * 1.55)); + player.pendingMoveLabel = "GROUND POUND " + player.poundLevel; + playSine(620 + player.poundLevel * 190, .12 + player.poundLevel * .04); + emitSignal("fastdrop", player.pad, player.poundLevel, player.vy); + return true; + } + // Grounded anywhere above the real floor and not riding a head means the + // platform, wherever it has been placed. Double-crouch sinks through it. + if (player.grounded && player.standingOn < 0 && + player.y < terrainFloorAt(player.x) - 2) + sink(player, now); + // Standing on the floor there is nothing under you to drop through and no + // height to convert, so the double-tap is spent rather than sold cheap. + else if (player.grounded) return true; + else { + // In the air this is a ground pound, and the height it starts from is + // the whole economy of the move — remember it now, because the crater + // is measured against where the fall actually began. + player.pounding = true; + player.poundFrom = player.y; + player.poundLevel = 1; + player.vy = Math.max(player.vy, poundLaunchVelocity); + player.grounded = false; + player.ducking = false; + player.pendingMoveLabel = "GROUND POUND"; + playSine(520, .16); + emitSignal("fastdrop", player.pad, 1, 0); + } + } else { + player.facing = direction === "RIGHT" ? 1 : -1; + player.dashVx = player.facing * 2400; + player.dashUntil = now + 110000; + emitSignal("dash", player.pad, player.facing, 0); + } + return true; +} + +function sink(player, now) { + player.sinkUntil = now + sinkDurationUs; + // The rung being dropped through, so the sink cannot also eat the next one. + player.sinkFrom = player.y; + player.grounded = false; + player.jumpHeld = false; + player.vy = Math.max(player.vy, 260); + player.pendingMoveLabel = "SINK"; + playDrum("whoosh", .55, panPlayer(player)); + emitSignal("sink", player.pad, -1, 0); +} + +// A short low hop out of crouch. Crouching pins horizontal movement, so a +// direction flick from a tuck has nothing else to mean. +function crouchHop(player, direction, now) { + player.facing = direction; + player.vy = -crouchHopVelocity; + player.grounded = false; + player.jumpHeld = false; + player.hopUntil = now + crouchHopPoseUs; + player.pendingMoveLabel = "CROUCH HOP"; + playDrum("block", .58, panPlayer(player)); + emitSignal("crouchhop", player.pad, direction, 0); +} + +function killPlayer(target, killerPad, now, cause = "KO") { + if (!target.alive) return; + recordFightHit(killerPad, true); + releaseCarriedBall(target, now); + if (!lobbyActive() && (!freeForAll() || + players.filter((player) => player.alive).length <= 2)) { + if (!deathCinematic && killerPad !== target.pad) + deathCinematic = { startedAt: now, loserPad: target.pad, + winnerPad: killerPad, cause }; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + } + target.alive = false; + target.headBustedAt = now; + target.respawnAt = now + 1200000; + target.vx = 0; + if (!lobbyActive()) target.vy = 0; + target.stance = "HIT"; + target.lastButton = cause; + target.lastButtonAt = now; + if (killerPad !== target.pad) players[killerPad].score += 1; + emitSignal(cause === "BALLED" ? "balled" : "ko", + killerPad, target.pad, players[killerPad]?.score || 0); + roundCause = cause; + spawnImpact({ x: target.x, y: target.y - 120, z: target.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(target)); + if (!lobbyActive()) emitSignal("killcam", killerPad, target.pad, 1); + playDrum("snare", 1.15, panPlayer(target)); + updateLobbyMortality(now); + // The training opponent is the one everybody gets for free, and its fight is + // already running under the title screen — so its head is the one number + // the whole site can share without anybody signing in. The count follows the + // free door rather than the missing AI: once training started sparring back, + // an `!target.bot` gate would have silenced the site's only shared number. + // Balling yourself does not count; somebody has to have popped it. + if (target.npc && killerPad !== target.pad && + (!target.bot || fightOpponent === "trainingbot")) + emitSignal("dummy-popped", killerPad, target.pad, 1); +} + +// The crater. Everything about it is decided by the fall: a pound from a hop +// is a shove, a pound from the ceiling clears the stage. Whoever is standing +// inside the ring when it lands wears it; whoever is in the air over it has +// jumped it, which is the only defence and is meant to be readable from the +// silhouette alone. The ball in the ring is popped and re-served. +// +// The landing consumes the pounder's body but not their life. They continue as +// the existing controllable bouncing-head form, making the move a permanent +// mobility trade without prematurely ending the round. +function groundPound(player, now) { + player.pounding = false; + const poundLevel = Math.max(1, player.poundLevel || 1); + player.poundLevel = 0; + const fall = clamp(player.y - player.poundFrom, 0, poundFullFall); + const power = clamp(fall / poundFullFall + (poundLevel - 1) * .22, 0, 1); + const radius = Math.min(poundMaxRadius, + poundMinRadius + power * 70 + (poundLevel - 1) * 88); + const poseTime = (now - startedAt) / 1000000; + player.stance = "HIT"; + player.lastButton = "GROUND POUND"; + player.lastButtonAt = now; + const terrainY = terrainFloorAt(player.x); + spawnImpact({ x: player.x, y: terrainY, z: player.z, + life: .58, duration: .58, death: false, explosion: true, + blastRadius: radius, power }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("kick", 1.3, panPlayer(player)); + playSine(76 + power * 34 + poundLevel * 18, .32 + poundLevel * .09); + emitSignal("blast", player.pad, player.x / worldRight, power); + + for (const target of players) { + if (target.pad === player.pad || !target.alive) continue; + const contact = runnerContactToPoint(target, poseTime, + player.x, terrainY, player.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > radius) continue; + if (!target.grounded) { + // Airborne over the ring is the dodge. It still throws you. + applyBodyHit(target, contact.segmentIndex, player.x, player.pad, now, + 900 + 700 * power, 620); + continue; + } + killPlayer(target, player.pad, now, "BLASTED"); + } + + for (const item of balls) { + if (!item.active) continue; + if (Math.hypot(item.x - player.x, item.y - terrainY) > radius + item.radius) + continue; + item.active = false; + item.heldBy = -1; + item.vx = 0; + item.vy = 0; + item.serveAt = now + 1200000; + spawnImpact({ x: item.x, y: item.y, z: item.z, + life: .22, duration: .22, death: false, explosion: false }); + emitSignal("ballblock", player.pad, 1, power); + } + + const geometry = runnerWorldGeometry(player, poseTime); + for (const limb of limbParts) + detachPart(player, limb, geometry, player.x, now); + detachPart(player, "torso", geometry, player.x, now); + player.alive = true; + player.stance = "BOUNCE"; + player.lastButton = "HEAD ONLY"; + player.lastButtonAt = now; +} + +// Keep the head at its visible position when its body is released. Impact +// momentum lives in knockVx, so releasing the stick cannot erase the kick. +function launchHead(target, sourceX, sourcePad, now, force, lift, incomingVy = 0) { + if (!isHeadOnly(target)) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + target.fallenBodyGeometry = geometry; + releaseCarriedBall(target, now); + releaseCarriedPart(target, now); + releaseCarriedFighter(target, now); + dismountSkateboard(target, now); + target.removedParts = [...limbParts, "torso"]; + target.partDamage = {}; + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + } + const direction = Math.sign(target.x - sourceX) || + players[sourcePad]?.facing || -target.facing || 1; + const velocity = clamp(target.vx * .3 + direction * force, -4200, 4200); + target.knockVx = velocity - (target.windVx || 0); + target.vx = velocity; + target.vy = clamp(target.vy * .25 + incomingVy * .25 - lift, -2600, 2600); + target.headRollRate = clamp(velocity / 260, -8, 8); + target.grounded = false; + target.jumpHeld = false; + target.jumpLaunchAt = 0; + target.attackKind = ""; + target.attackUntil = target.dashUntil = 0; + target.dashVx = 0; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 180000); + target.stance = "HEAD ONLY"; + target.lastButton = "HEAD VOLLEY"; + target.lastButtonAt = now; +} + +function bounceHeadOnSurface(player, incomingVy, horizontal) { + // Restitution keeps hard landings lively and eventually lets a slow head + // settle, so the existing up/down pumping controls remain useful. + if (incomingVy > 360) { + player.vy = -incomingVy * .62; + player.knockVx *= .86; + player.headRollRate = clamp(player.vx / 260, -8, 8); + player.grounded = false; + player.stance = "BOUNCE"; + } else { + player.vy = 0; + player.grounded = true; + player.stance = horizontal ? "ROLL" : "HEAD ONLY"; + } +} + +function resolveMelee(now) { + const poseTime = (now - startedAt) / 1000000; + const contacts = []; + const samples = players.map(player => sampleCombatBoxes(player, now)); + for (const attacker of players) { + const attacking = samples[attacker.pad]; + if (!attacker.alive || !attacking.hit.length) continue; + for (const fragment of detachedParts) { + const r = fragment.width/2; + const bounds = combatRect('fragment',Math.min(fragment.x1,fragment.x2)-r, + Math.min(fragment.y1,fragment.y2)-r,Math.max(fragment.x1,fragment.x2)+r, + Math.max(fragment.y1,fragment.y2)+r,(fragment.z1+fragment.z2)/2, + Math.abs(fragment.z2-fragment.z1)/2+r); + if (!attacking.hit.some(hit=>boxesOverlap(hit,bounds))) continue; + const spec = meleeSpecFor(attacker, attacker.attackKind); + fragment.vx += attacker.facing * spec.force * .8; + fragment.vy -= Math.max(220, spec.lift); + fragment.owner = attacker.pad; + fragment.hitAfter = now + 120000; + attacker.attackHit = true; + spawnImpact({ x: (bounds.left+bounds.right)/2, y: (bounds.top+bounds.bottom)/2, + z: (bounds.near+bounds.far)/2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("clap", .82, panPlayer(attacker)); + emitSignal("part-hit", attacker.pad, -1, spec.force); + break; + } + if (attacker.attackHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(attacking, samples[target.pad]); + if (contact?.separation <= 3) { + attacker.attackHit = true; + contacts.push({ attacker, target, + strike: { x: contact.x, y: contact.y, z: contact.z }, + headshot: contact.headshot, segmentIndex: contact.segmentIndex }); + break; + } + } + } + for (const { attacker, target, strike, headshot, segmentIndex } of contacts) { + if (!target.alive && contacts.length < 2) continue; + spawnImpact({ x: strike.x, y: strike.y, z: strike.z, + life: .2, duration: .2, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + const away = Math.sign(target.x - attacker.x) || -attacker.facing; + const backBlocking = !isHeadOnly(target) && target.inputX === away; + if (target.blocking || backBlocking) { + target.stance = "DEFEND"; + target.blockFlash = 1; + target.lastButton = target.blocking ? "BLOCK" : "BACK BLOCK"; + target.lastButtonAt = now; + // An explicit shield returns the attacker's commitment as durable + // knockback. Keep it separate from controlled velocity so holding toward + // the defender cannot erase the recoil on the next simulation frame. + const recoil = target.blocking ? 2400 : 900; + attacker.dashUntil = 0; + attacker.dashVx = 0; + attacker.knockVx = -attacker.facing * recoil; + attacker.vx = attacker.knockVx + attacker.windVx; + if (target.blocking) attacker.vy = Math.min(attacker.vy, -415); + else target.vx = 0; + playDrum("block", 1.2, panPlayer(target)); + emitSignal("block", target.pad, attacker.pad, target.blocking ? 1 : 2); + // Only a real shield trades. A back-block still just shoves, because it + // costs nothing to hold a direction. + if (target.blocking) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const stun = shieldStunUs(spec.force * (attacker.attackMomentum || 1)); + attacker.hitStunUntil = Math.max(attacker.hitStunUntil, now + stun); + attacker.attackHit = true; + attacker.attackKind = ""; + attacker.attackUntil = 0; + attacker.stance = "STUN"; + breakShield(target, now); + } + } else if (headshot) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + const wasHead = isHeadOnly(target); + launchHead(target, attacker.x, attacker.pad, now, + spec.force * momentum * 1.2, + Math.max(620, spec.lift * 3) * momentum, attacker.vy); + playDrum("snare", 1.2, panPlayer(target)); + emitSignal(wasHead ? "head-volley" : "decapitate", + attacker.pad, target.pad, momentum); + } + else { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + applyBodyHit(target, segmentIndex, attacker.x, attacker.pad, now, + spec.force * momentum, spec.lift * momentum); + playDrum(spec.thud[0], spec.thud[1], panPlayer(target)); + } + } +} + +function resolvePogoAttacks(now) { + const poseTime = (now - startedAt) / 1000000; + for (const attacker of players) { + if (!attacker.alive || !isPogo(attacker) || attacker.grounded || + attacker.pogoHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(sampleCombatBoxes(attacker,now),sampleCombatBoxes(target,now)); + if (!contact || contact.separation > 3) continue; + attacker.pogoHit = true; + attacker.vy = Math.min(attacker.vy, -985); + attacker.lastButton = "POGO"; + attacker.lastButtonAt = now; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: contact.headshot, explosion: false }); + if (contact.headshot) killPlayer(target, attacker.pad, now, "POGO"); + else applyBodyHit(target, contact.segmentIndex, attacker.x, + attacker.pad, now, 1350, 260); + playDrum("kick", 1.1, panPlayer(attacker)); + emitSignal("pogo", attacker.pad, contact.headshot ? 1 : 0, 0); + break; + } + } +} + +function resolvePlayerPushboxes() { + for (let a = 0; a < players.length; a++) + for (let b = a + 1; b < players.length; b++) + resolvePlayerPushboxPair(players[a], players[b]); +} + +function resolvePlayerPushboxPair(first, second) { + if ([first, second].some((p) => p.ropeIndex >= 0 || p.skateLoop >= 0)) return; + if (!first.alive || !second.alive) return; + const poseTime = (runtime().monotonicUs - startedAt) / 1000000; + const firstBounds = combatPushbox(first); + const secondBounds = combatPushbox(second); + const verticalOverlap = Math.min(firstBounds.bottom, secondBounds.bottom) - + Math.max(firstBounds.top, secondBounds.top); + // Grounded fighters nudge one another. Once a jumper is clearly above the + // other fighter, the pushboxes separate so cross-over jumps are possible. + if (verticalOverlap <= 18 || + ((!first.grounded || !second.grounded) && + Math.abs(first.y - second.y) > 58)) return; + const left = first.x <= second.x ? first : second; + const right = left === first ? second : first; + const pushRadius = (player) => (combatPushbox(player).right-combatPushbox(player).left)/2; + const minimumGap = pushRadius(left) + pushRadius(right); + const overlap = minimumGap - (right.x - left.x); + if (overlap <= 0) return; + const leftAdvancing = left.vx > 30; + const rightAdvancing = right.vx < -30; + const leftShare = leftAdvancing && !rightAdvancing ? .25 + : rightAdvancing && !leftAdvancing ? .75 : .5; + left.x -= overlap * leftShare; + right.x += overlap * (1 - leftShare); + if (leftAdvancing && !rightAdvancing) { + right.knockVx += Math.min(180, left.vx * .12); + left.vx *= .35; + } else if (rightAdvancing && !leftAdvancing) { + left.knockVx += Math.max(-180, right.vx * .12); + right.vx *= .35; + } else { + if (left.vx > 0) left.vx *= .35; + if (right.vx < 0) right.vx *= .35; + } + resolveRunnerBounds(left, 0); + resolveRunnerBounds(right, 0); +} + +function resolvePlayerStanding(now) { + const poseTime = (now - startedAt) / 1000000; + const previousStanding = players.map((player) => player.standingOn); + for (const player of players) player.standingOn = -1; + for (const rider of players) { + for (const base of rivalsOf(rider)) { + // A committed dive passes through a head contact and completes against + // the terrain. Treating it as ordinary standing used to zero its velocity + // and leave the fighter strangely paused on the opponent's scalp. + if (!rider.alive || !base.alive || rider.vy < 0 || rider.pounding) continue; + const head = runnerWorldGeometry(base, poseTime).head; + const top = head.y - head.radius; + const horizontal = Math.abs(rider.x - head.x) <= head.radius + 42; + const depth = Math.abs(rider.z - head.z) <= head.radius + 32; + const crossed = (rider.previousY ?? rider.y) <= top + 8 && + rider.y >= top - 3; + const stayed = previousStanding[rider.pad] === base.pad && + rider.y <= top + 34; + if (!horizontal || !depth || (!crossed && !stayed)) continue; + const wasGrounded = rider.grounded; + rider.y = top; + rider.vy = Math.min(0, base.vy); + rider.grounded = true; + rider.standingOn = base.pad; + rider.sinkUntil = 0; + rider.hopUntil = 0; + if (!wasGrounded) rider.landPoseUntil = now + 110000; + break; + } + } +} + +function updateStance(player, input, now) { + const opponent = nearestRival(player); + const toward = Math.sign(opponent.x - player.x) || player.facing || 1; + player.stance = !player.alive ? "HIT" + : now < player.hitStunUntil ? "STUN" + : player.blocking ? "DEFEND" + : player.heldBall >= 0 ? "HOLDING" + : player.grabHeld ? "REACHING" + : player.attackKind ? "ATTACK" + : now < player.sinkUntil ? "SINK" + : !player.grounded && now < player.hopUntil ? "CROUCH HOP" + : player.ducking ? player.grounded ? "CROUCH" : "AIR CROUCH" + : player.pogoDive ? "POGO DOWN" + : player.skateboard && player.grounded ? "SKATE" + : !player.grounded ? "AIR" + : now < player.dashUntil ? "DASH" + : input.horizontal === toward ? "ADVANCE" + : input.horizontal === -toward ? "RETREAT" + : "NEUTRAL"; +} + +function grabNearestBall(player, now) { + let nearest = null; + let nearestDistance = 240; + for (let index = 0; index < balls.length; index++) { + const item = balls[index]; + if (!item.active || item.heldBy >= 0) continue; + const distance = Math.hypot(item.x - player.x, + item.y - (player.y - 82), item.z - player.z); + if (distance >= nearestDistance) continue; + nearest = { item, index }; + nearestDistance = distance; + } + if (!nearest) return false; + player.heldBall = nearest.index; + player.carryArm = availableArm(player); + nearest.item.heldBy = player.pad; + nearest.item.safeUntil = now + 180000; + nearest.item.safePlayers = 1 << player.pad; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + emitSignal("grab", player.pad, nearest.index, nearest.item.mass); + playDrum("clap", .72, panPlayer(player)); + return true; +} + +function grabNearestFighter(player, now) { + const target = players.find((candidate) => candidate.pad !== player.pad && + candidate.alive && candidate.grabbedBy < 0 && + Math.hypot(candidate.x - player.x, + candidate.y - (player.y - 72), candidate.z - player.z) < 210); + if (!target) return false; + player.heldPlayer = target.pad; + player.carryArm = availableArm(player); + target.grabbedBy = player.pad; + target.vx = target.vy = target.vz = 0; + target.lastButton = "GRABBED"; + target.lastButtonAt = now; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + playDrum("clap", .82, panPlayer(player)); + emitSignal("grab-player", player.pad, target.pad, isHeadOnly(target) ? 1 : 0); + return true; +} + +function grabNearestPart(player, now) { + let bestIndex = -1; + let bestDistance = 190; + for (let index = 0; index < detachedParts.length; index++) { + const part = detachedParts[index]; + if (part.heldBy >= 0) continue; + const x = (part.x1 + part.x2) / 2; + const y = (part.y1 + part.y2) / 2; + const z = (part.z1 + part.z2) / 2; + const distance = Math.hypot(x - player.x, y - (player.y - 78), z - player.z); + if (distance >= bestDistance) continue; + bestIndex = index; + bestDistance = distance; + } + if (bestIndex < 0) return false; + const part = detachedParts[bestIndex]; + player.heldPart = bestIndex; + player.carryArm = availableArm(player); + part.heldBy = player.pad; + part.owner = player.pad; + part.vx = part.vy = 0; + player.lastButton = "HOLDING " + part.part.toUpperCase(); + player.lastButtonAt = now; + emitSignal("grab-part", player.pad, bestIndex, 1); + return true; +} + +function stealHeldObject(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.hypot(target.x - player.x, + target.y - player.y, target.z - player.z) > 220) return false; + let label = ""; + if (target.heldBall >= 0) { + const index = target.heldBall; + const item = balls[index]; + target.heldBall = -1; + player.heldBall = index; + if (item) item.heldBy = player.pad; + label = "BALL"; + } else if (target.heldPart >= 0) { + const index = target.heldPart; + const part = detachedParts[index]; + target.heldPart = -1; + player.heldPart = index; + if (part) { part.heldBy = player.pad; part.owner = player.pad; } + label = part?.part?.toUpperCase() || "LIMB"; + } else if (target.gunAmmo > 0) { + player.gunAmmo = target.gunAmmo; + player.gunMode = target.gunMode; + target.gunAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + target.gunMode = "HANDGUN"; + label = player.gunMode; + } else if (target.grenadeAmmo > 0) { + player.grenadeAmmo = target.grenadeAmmo; + target.grenadeAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + label = "GRENADES"; + } + if (!label) return false; + target.lastButton = label + " TAKEN"; + target.lastButtonAt = now; + player.lastButton = "STOLE " + label; + player.lastButtonAt = now; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 160000); + playDrum("clap", 1, panPlayer(player)); + emitSignal("steal", player.pad, target.pad, 1); + return true; +} + +function releaseCarriedPart(player, now) { + if (player.heldPart < 0) return; + const part = detachedParts[player.heldPart]; + if (part) { + part.heldBy = -1; + part.owner = player.pad; + part.vx = player.vx + player.facing * 1900; + part.vy = Math.min(player.vy, -460); + part.hitAfter = now + 90000; + part.life = Math.max(part.life, 3.4); + emitSignal("throw-part", player.pad, player.heldPart, player.facing); + } + player.heldPart = -1; + player.carryArm = ""; +} + +function releaseCarriedFighter(player, now) { + if (player.heldPlayer < 0) return; + const target = players[player.heldPlayer]; + if (target) { + target.grabbedBy = -1; + target.x = player.x + player.facing * 118; + target.y = player.y - 74; + target.z = player.z; + target.vx = player.vx + player.facing * 1500; + target.vy = Math.min(player.vy, -620); + target.grounded = false; + target.hitStunUntil = now + 260000; + emitSignal("throw-player", player.pad, target.pad, player.facing); + } + player.heldPlayer = -1; + player.carryArm = ""; +} + +function releaseCarriedBall(player, now) { + if (player.heldBall < 0) return; + const item = balls[player.heldBall]; + if (item) { + item.heldBy = -1; + item.x = player.x + player.facing * (item.radius + 70); + item.y = player.y - 88; + item.z = player.z; + item.vx = player.vx; + item.vy = player.vy; + item.safeUntil = now + 120000; + item.safePlayers = 1 << player.pad; + emitSignal("release", player.pad, player.heldBall, item.mass); + } + player.heldBall = -1; + player.carryArm = ""; +} + +function bouncePogoOnSurface(player, surfaceY, now) { + player.y = surfaceY; + player.vy = -pogoBounceVelocity; + player.grounded = false; + player.pogoDive = false; + player.pogoHit = false; + player.stance = "POGO BOUNCE"; + player.lastButton = "POGO BOUNCE"; + player.lastButtonAt = now; + playDrum("kick", .9, panPlayer(player)); + emitSignal("pogo", player.pad, -2, pogoBounceVelocity); +} + +function shieldBash(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.abs(target.x - player.x) > shieldRadius * 1.35 || + Math.abs(target.y - player.y) > 170) return; + const direction = Math.sign(target.x - player.x) || player.facing; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blocking = false; + player.knockVx -= direction * 620; + player.hitStunUntil = Math.max(player.hitStunUntil, now + 180000); + target.knockVx += direction * 1250; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 240000); + target.grounded = false; + target.vy = Math.min(target.vy, -180); + if (target.blocking) { + target.shieldLocked = true; + target.shieldBrokenAt = now; + target.blocking = false; + target.knockVx += direction * 420; + } + spawnImpact({ x: (player.x + target.x) / 2, y: player.y - 90, + z: (player.z + target.z) / 2, life: .26, duration: .26, + death: false, explosion: true, blastRadius: 180, power: .35 }); + playDrum("block", 1.25, panPlayer(player)); + emitSignal("shield-bash", player.pad, target.pad, target.shieldLocked ? 1 : 0); +} + +function updatePlayer(player, pad, dt, now) { + const parkPreviousX = player.x; + player.previousY = player.y; + if (player.grabbedBy >= 0) { + const carrier = players[player.grabbedBy]; + if (!carrier?.alive || carrier.heldPlayer !== player.pad) { + player.grabbedBy = -1; + } else { + player.x = carrier.x + carrier.facing * 108; + player.y = carrier.y - 76; + player.z = carrier.z; + player.vx = player.vy = player.vz = 0; + player.grounded = false; + player.blocking = false; + player.attackKind = ""; + player.previous = pad.down.slice(); + return; + } + } + if (!player.alive) { + player.previous = pad.down.slice(); + // A body that dies off the ground still has to come down. Everything + // below this branch is skipped while dead, gravity included, which is + // right in a round — the round ends and rebuilds the body, and the + // killcam wants the pose held. The waiting room has no round, so a + // fighter blasted out of a jump hung in mid-air in its jump pose for the + // whole respawn beat. @jeffrey: "it seems possible to die in the waiting + // room but keep jumping stilll" — that is what a frozen hop looks like. + if (lobbyActive() && now < player.respawnAt) settleCorpse(player, dt); + if (now >= player.respawnAt && !freeForAll()) { + player.x = player.spawnX; + player.y = terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.windVx = 0; + player.knockVx = 0; + player.grounded = true; + player.ducking = false; + player.inputX = 0; + player.inputY = 0; + player.dashUntil = 0; + player.stance = "NEUTRAL"; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + // The waiting room hands back a whole body and a swept floor: parts, + // corpses and scattered limbs are round furniture, and the lobby has + // no round to rebuild the one or clear the others. + if (lobbyActive()) { + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + player.lobbyDeathDressed = false; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.lastTap = {}; + player.lastRelease = {}; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + deathCinematic = null; + detachedParts.length = 0; + } + player.alive = true; + } + return; + } + player.suppressedDirections = player.suppressedDirections.filter((button) => + pad.down.includes(button)); + const headOnly = isHeadOnly(player); + const pogo = isPogo(player); + const legCount = ["left-leg", "right-leg"] + .filter((part) => hasPart(player, part)).length; + const armCount = ["left-arm", "right-arm"] + .filter((part) => hasPart(player, part)).length; + const rawInput = quantizedInput(pad, player.suppressedDirections); + const hitStunned = now < player.hitStunUntil; + const wasBlocking = player.blocking; + const carrying = player.heldBall >= 0 || player.heldPart >= 0 || + player.heldPlayer >= 0 || Boolean(heldItem(player)); + const aimLocked = carrying && pad.down.includes("X"); + player.itemAimLocked = aimLocked; + if (aimLocked && (rawInput.horizontal || rawInput.vertical)) { + player.gunAimX = rawInput.horizontal; + player.gunAimY = -rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } + // A held gun used to point dead ahead unless you also held X, so the one + // thing a player is plainly doing with it — pointing it somewhere — never + // reached the fighter. A vertical direction now tilts the hand on its own. + // The X lock still earns its keep: it pins an aim while you stand still and + // it turns you. This does neither, deliberately — steering the drawn arm + // must not steer the walk, or every upward shot would rewrite your footing. + player.gunAimLive = false; + if (!aimLocked && player.gunAmmo > 0 && rawInput.vertical) { + player.gunAimX = rawInput.horizontal || player.facing; + player.gunAimY = -rawInput.vertical; + player.gunAimLive = true; + } + // A broken shield stays down until X is let go, so the opening it bought is + // spent on attacking rather than on re-guarding by reflex. + if (player.shieldLocked && !pad.down.includes("X")) player.shieldLocked = false; + player.blocking = !carrying && !headOnly && pad.down.includes("X") && + !player.shieldLocked; + if (player.blocking && !wasBlocking) { + player.attackKind = ""; + player.attackUntil = 0; + player.shieldCrouched = rawInput.vertical < 0 || player.ducking || + player.crouchBlend >= .35; + player.shieldVx = 0; + player.vx = player.windVx + player.knockVx; + player.dashUntil = 0; + player.dashVx = 0; + player.lastTap = {}; + player.lastRelease = {}; + shieldBash(player, now); + } + if (player.blocking && rawInput.vertical < 0) player.shieldCrouched = true; + if (player.blocking) { + player.shieldAimX = rawInput.horizontal; + player.shieldAimY = rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } else { + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + } + // Guard plants the fighter immediately, but DOWN remains meaningful: a + // standing guard can settle into a crouching guard. Once crouched, the pose + // latches until the shield itself drops even if DOWN is released first. + const input = player.blocking + ? { horizontal: 0, vertical: player.shieldCrouched ? -1 : 0 } : rawInput; + const grabHeld = armCount > 0 && !pogo && !hitStunned && !player.blocking && + pad.down.includes("A") && pad.down.includes("B"); + if (skateparkMap && !survivalActive()) { + const ropeHeld = skateRopeInput(player, input, grabHeld, dt, grabHeld && !player.grabHeld); + if (ropeHeld || skateLoopStep(player, input, dt, now)) { + player.previous = pad.down.slice(); + player.grabHeld = grabHeld; + return; + } + } + if (grabHeld && !player.grabHeld && player.heldBall < 0 && + player.heldPart < 0 && + player.heldPlayer < 0) { + if (!stealHeldObject(player, now) && !grabNearestBall(player, now) && + !grabNearestPart(player, now) && + !grabNearestFighter(player, now)) { + player.lastButton = "REACHING"; + player.lastButtonAt = now; + emitSignal("reach", player.pad, player.facing, 0); + } + } + else if (!grabHeld && player.heldBall >= 0) + releaseCarriedBall(player, now); + else if (!grabHeld && player.heldPart >= 0) + releaseCarriedPart(player, now); + else if (!grabHeld && player.heldPlayer >= 0) + releaseCarriedFighter(player, now); + const inputChanged = input.horizontal !== player.inputX || + input.vertical !== player.inputY; + if (inputChanged && + (input.horizontal || input.vertical)) + emitSignal("move", player.pad, input.horizontal, input.vertical); + player.pendingMoveLabel = ""; + // An ultra jump IS a second press of UP, so the air-jump gate below used to + // see the same press the double-tap had just spent: the ultra fired, a + // double jump launched on top of it a tick later, the move read-out said + // DOUBLE JUMP, and the air jump the fighter never asked for was gone. The + // horizontal branch has always honored the "tap was spent" answer; this is + // the vertical one doing the same. It matters more in a tower, where the + // crow's nest is the one rung an ultra jump is the only way onto. + let verticalTapSpent = false; + const upPressed = input.vertical > 0 && !player.previous.includes("MOVE_UP"); + const downPressed = input.vertical < 0 && player.inputY >= 0; + const wasCrouched = player.ducking || player.crouchBlend >= .35; + const crouchTarget = input.vertical < 0 || + (!player.grounded && player.crouchJump && now < player.jumpPoseUntil) || + (!player.grounded && now < player.hopUntil) ? 1 : 0; + const crouchStep = dt * (crouchTarget ? 9 : 11); + player.crouchBlend += clamp(crouchTarget - player.crouchBlend, + -crouchStep, crouchStep); + player.ducking = player.crouchBlend >= .52; + if (player.attackKind && now >= player.attackUntil) { + player.attackKind = ""; + player.attackHit = false; + player.attackMomentum = 1; + } + if (player.itemAction && now >= player.itemActionUntil) + player.itemAction = ""; + if (player.inputX && input.horizontal !== player.inputX) + player.lastRelease[player.inputX > 0 ? "RIGHT" : "LEFT"] = now; + if (player.inputY && input.vertical !== player.inputY) + player.lastRelease[player.inputY > 0 ? "UP" : "DOWN"] = now; + if (input.horizontal && input.horizontal !== player.inputX) { + const direction = input.horizontal > 0 ? "RIGHT" : "LEFT"; + recordCommand(player, direction, now); + if (!directionTap(player, direction, now) && player.grounded && + player.ducking && !headOnly && !pogo && !hitStunned) + crouchHop(player, input.horizontal, now); + } + if (input.vertical && input.vertical !== player.inputY) { + const direction = input.vertical > 0 ? "UP" : "DOWN"; + recordCommand(player, direction, now); + verticalTapSpent = directionTap(player, direction, now); + if (headOnly) { + const alternating = player.headPumpDirection && + player.headPumpDirection !== input.vertical && + now - (player.headPumpAt || 0) <= 520000; + player.headBounceCharge = clamp((player.headBounceCharge || 0) + + (alternating ? .2 : .035), 0, 1); + player.headPumpDirection = input.vertical; + player.headPumpAt = now; + if (alternating && player.grounded) { + player.vy = -lerp(420, headBounceVelocity * 1.7, + player.headBounceCharge); + player.grounded = false; + player.stance = "BOUNCE " + Math.round(player.headBounceCharge * 5); + playDrum("block", .45 + player.headBounceCharge * .45, + panPlayer(player)); + emitSignal("head-bounce", player.pad, input.vertical, + player.headBounceCharge); + } + } + } + + if (headOnly) { + const sincePump = now - (player.headPumpAt || 0); + if (sincePump > 650000) + player.headBounceCharge = Math.max(0, + (player.headBounceCharge || 0) - dt * .22); + } + + if (input.horizontal) player.facing = input.horizontal; + // Fighting-game directions are digital: full movement begins and ends on + // the sampled edge. The analog stick is only an eight-way gate. + if (player.grounded) player.windVx *= Math.max(0, 1 - dt * 10); + else player.windVx = clamp(player.windVx + windAcceleration * dt, -900, 900); + player.knockVx *= Math.max(0, 1 - dt * (headOnly + ? player.grounded ? 1.6 : .22 : player.grounded ? 7 : 1.8)); + if (now < player.dashUntil && input.horizontal && + Math.sign(player.dashVx) !== input.horizontal) { + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + } + const dashRunningOut = player.grounded && input.horizontal && + player.dashUntil > 0 && now >= player.dashUntil; + if (dashRunningOut && !player.runSince) { + player.runSince = now; + } + if (!player.grounded || !input.horizontal || player.blocking || + player.ducking || hitStunned) player.runSince = 0; + const walkingCleanly = player.grounded && input.horizontal && !player.blocking && + !player.ducking && !hitStunned && now >= player.dashUntil; + if (!walkingCleanly) player.walkSince = 0; + else if (!player.walkSince) player.walkSince = now; + else if (!player.runSince && now - player.walkSince >= 650000) + player.runSince = now; + const headAirControl = player.grounded ? .55 + : lerp(.55, .9, player.headBounceCharge || 0); + const mobility = headOnly ? headAirControl + : pogo ? .68 : legCount === 1 ? .72 : 1; + const runSpeed = player.runSince + ? Math.min(runTopSpeed, runStartSpeed + + (now - player.runSince) / 1000000 * runAcceleration) : 0; + let controlledVx = aimLocked ? 0 + : player.blocking ? player.shieldVx || 0 + : now < player.dashUntil && Math.abs(player.dashVx) > 0 + ? player.dashVx + : player.runSince ? input.horizontal * runSpeed * mobility + : player.ducking && player.grounded ? 0 + : input.horizontal * walkSpeed * mobility; + if (player.skateboard && player.skateWallSide) { + // Once the board reaches a coping, horizontal momentum has become upward + // wall momentum. Keep the root on that wall until gravity spends it; the + // player can also steer away to peel off early. + const peelAway = input.horizontal === -player.skateWallSide; + if (player.vy >= 0 || peelAway) { + const side = player.skateWallSide; + player.skateWallSide = 0; + player.skateVx = -side * Math.max(720, Math.abs(player.skateVx) * .42); + controlledVx = player.skateVx; + } else controlledVx = 0; + } else if (player.skateboard && player.grounded && !player.blocking) { + // Steering, and ONLY while steering. This used to run every frame against + // a target of `input.horizontal * 2700`, which on an idle stick is zero — + // so a coasting skater was being dragged to a standstill at 3.2 a second + // by the same line that turns them. On a flat cube nobody could tell; + // dropped into a three-tile bowl it is the difference between a 1,400-unit + // drop and a 268-unit one, because the servo ate gravity as fast as + // gravity arrived. Let go of the stick now and you coast, which is what + // rolling IS. + const skateTarget = input.horizontal * 2700; + // Carving is steering against the roll, and it has to stay in scope: the + // scrape it makes is played further down, and hoisting the steer into a + // block took both of these with it. + const carving = Boolean(input.horizontal) && + Math.sign(skateTarget) !== Math.sign(player.skateVx); + if (input.horizontal) { + const turnRate = carving ? 1.8 : 3.2; + player.skateVx += (skateTarget - player.skateVx) * + (1 - Math.exp(-dt * turnRate)); + } + // Gravity along the surface, resolved honestly rather than by a tuned + // constant. The old line was `slope * 1900`, and `slope` is tan(angle) — + // which runs away to infinity as a transition goes vertical and had to be + // clamped at 2.5 to stop it. The horizontal share of gravity on a slope is + // g·sin·cos, which in terms of tan is g·t/(1+t²): it peaks at 45° exactly + // as it should, falls off toward vertical exactly as it should, and needs + // no clamp because it cannot exceed half of g. + const contact = skateContact(player.x, player.y); + const terrainSlope = Math.tan(contact.pitch); + player.skateVx += fallGravity() * terrainSlope / + (1 + terrainSlope * terrainSlope) * dt; + // Pumping. The one thing a skater does that a rolling object does not: + // crouch through the bottom of a transition and stand up through the + // face, and come out with more speed than you went in with. Holding DOWN + // on a slope is that, and it is the only way to gain speed in the bowl + // without pushing — which is what makes a bowl worth being in rather than + // a hole to cross. + // + // Priced against the slope, so it pays on a transition and pays nothing + // on the flat: a crouch in the middle of the park is a crouch, not a + // cheat code. Direction comes from the roll rather than the stick, + // because pumping adds to the speed you have, it does not steer. + const pumping = input.vertical < 0 && Math.abs(terrainSlope) > .18; + if (pumping && player.skateVx) + player.skateVx += Math.sign(player.skateVx) * + Math.abs(terrainSlope) * skatePumpAcceleration * dt; + player.skateVx = clamp(player.skateVx, -4200, 4200); + // Leaving the lip. A rider climbing a transition is carrying real upward + // speed -- `skateVx * slope` -- and the moment the ground stops climbing + // under them, that speed has nowhere to go but into the air. Reading the + // ground a frame ahead is what catches the crest: the coping at the top + // of a quarterpipe, the edge of the funbox, the lip of the bowl. + // + // Without this a skater simply walks over the top of every ramp with the + // speed quietly deleted, which is the difference between a skatepark and + // a set of hills. + const surfaceVy = player.skateVx * terrainSlope; + const aheadSlope = clamp(terrainTangentAt( + player.x + player.skateVx * .05), -2.5, 2.5); + if (surfaceVy < -skateLaunchFloor && + (aheadSlope - terrainSlope) * Math.sign(player.skateVx) > .2) { + player.vy = surfaceVy; + player.grounded = false; + player.skateAirAt = now; + playDrum("whoosh", .5 + Math.min(.45, -surfaceVy / 4000), + panPlayer(player)); + emitSignal("skate-air", player.pad, + Math.round(-surfaceVy), Math.round(player.skateVx)); + } + if (!input.horizontal) player.skateVx *= Math.exp(-dt * .65); + controlledVx = player.skateVx; + const skateSpeed = Math.abs(player.skateVx); + const carveDir = carving ? Math.sign(skateTarget) : 0; + if (carveDir && skateSpeed > 900 && player.skateCarveDir !== carveDir) { + playDrum("whoosh", .45 + Math.min(.4, skateSpeed / 4200 * .5), + panPlayer(player)); + emitSignal("skate-carve", player.pad, carveDir, + Math.round(skateSpeed / 42) / 100); + } + player.skateCarveDir = carveDir; + } else if (player.skateboard && !player.grounded) { + // Keep the board's launch momentum instead of borrowing walking speed + // in the air and reviving a different skateVx on landing. + controlledVx = player.skateVx; + } else if (!player.skateboard) player.skateVx = 0; + player.vx = controlledVx + player.windVx + player.knockVx; + if (inputChanged) telemetry("FIGHT_MOVE", player.name + + " pad=" + (player.pad + 1) + + " held=" + (pad.down.filter((button) => button.startsWith("Arrow")).join("+") || "NONE") + + " stick=" + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + + " quant=" + input.horizontal + "," + input.vertical + + " controlled=" + Math.round(controlledVx) + + " shield=" + (player.blocking ? 1 : 0) + + " wind=" + Math.round(player.windVx) + + " knock=" + Math.round(player.knockVx) + + " vx=" + Math.round(player.vx) + + " x=" + Math.round(player.x)); + + // Checked before liftoff so the launch frame itself can never be cut. + if (player.jumpHeld && player.vy < 0 && !player.blocking && + input.vertical <= 0) { + player.vy *= jumpCutScale; + player.jumpHeld = false; + } + if (airRoundActive()) player.airJumpsUsed = 0; + if (!aimLocked && !headOnly && upPressed && !verticalTapSpent && + !player.jumpLaunchAt && + (player.grounded || player.airJumpsUsed < 1)) { + const airJump = !player.grounded; + player.jumpLaunchAt = now + (airJump ? 1 : jumpAnticipationUs); + player.crouchJump = !airJump && wasCrouched; + if (airJump) { + player.airJumpsUsed++; + player.doubleJumpLinesUntil = now + 280000; + } + player.pendingMoveLabel = player.skateboard ? "OLLIE" + : airJump ? "DOUBLE AIR" + : wasCrouched ? "CROUCH AIR" : "AIR"; + } + if (player.jumpLaunchAt && now >= player.jumpLaunchAt) { + player.jumpLaunchAt = 0; + player.jumpPoseUntil = now + + (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs); + const jumpScale = player.skateboard ? 1.12 + : pogo ? .88 : legCount === 1 ? .78 : 1; + player.vy = Math.min(player.vy, + -(player.crouchJump ? crouchJumpVelocity : jumpVelocity) * jumpScale); + player.jumpHeld = true; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.grounded = false; + player.skateWallSide = 0; + player.ducking = player.crouchJump; + playDrum("block", 0.72, panPlayer(player)); + emitSignal("jump", player.pad, 1, 0); + } + if (pogo && !player.grounded && !hitStunned && downPressed) { + player.vy = Math.max(player.vy, 2250); + player.pogoDive = true; + player.pogoHit = false; + player.pendingMoveLabel = "POGO DOWN"; + player.stance = "POGO DOWN"; + playDrum("kick", .78, panPlayer(player)); + playSine(620, .13); + emitSignal("pogo", player.pad, -1, player.vy); + } + if (!player.grounded && !pogo && input.vertical < 0) { + player.ducking = true; + player.pendingMoveLabel ||= "AIR CROUCH"; + } + + // Y and either shoulder spend an item, so reaching for a kick can no + // longer empty a magazine. A loaded hand still colors the punch — into a + // swing, never a shot. + const acting = !headOnly && !pogo && !hitStunned && !player.blocking; + if (acting && player.gunMode === "RUBBER SMG" && player.gunAmmo > 0 && + pad.down.includes("Y") && player.previous.includes("Y") && + now >= player.nextGunShotAt) + fireGun(player, input); + for (const button of pad.down) { + if (!player.previous.includes(button)) { + remember(player, button); + if (button === "X" && !headOnly) { + player.pendingMoveLabel = "SHIELD"; + playDrum("block", .7, panPlayer(player)); + emitSignal("shield", player.pad, 1, 0); + } + else if (acting && !grabHeld && button === "A") + startMelee(player, "KICK", now); + else if (acting && !grabHeld && button === "B") + startMelee(player, itemMelee[heldItem(player)] || "PUNCH", now); + else if (headOnly && !hitStunned && button === "A") + spit(player, false); + else if (headOnly && !hitStunned && button === "B") + spit(player, true); + else if ((acting || (headOnly && !hitStunned)) && + ["Y", "LeftShoulder", "RightShoulder"].includes(button)) { + const item = heldItem(player); + if (item === "GUN") fireGun(player, input); + else if (item === "GRENADE") throwGrenade(player, input); + } + } + } + if (grabHeld) { + player.lastButton = player.heldBall >= 0 ? "HOLDING" : "REACHING"; + player.lastButtonAt = now; + } + if (player.pendingMoveLabel) remember(player, player.pendingMoveLabel); + + const previousX = player.x; + const previousY = player.y; + const wasGrounded = player.grounded; + player.vy += (player.vy < 0 ? riseGravity() : fallGravity()) * dt; + // Keeping DOWN held through a pound drives it down harder. The button is + // the only thing that makes a pound faster, so the height you fell from and + // the pressure you kept on it are the two dials on the crater. + if (player.pounding && input.vertical < 0) + player.vy = Math.min(poundMaxVelocity * + (1 + .5 * Math.max(0, player.poundLevel - 1)), + player.vy + poundHoldAcceleration * dt); + if (airRoundActive()) { + // A shared terminal fall keeps the duel within reach; UP can flap again, + // DOWN dives. The world has no floor and falling never eliminates anyone. + player.vy = Math.min(player.vy, input.vertical < 0 ? 1050 : 760); + player.skateboard = false; + } + player.x += player.vx * dt; + player.y += player.vy * dt; + // A bodyless head is a ball, and a ball that slides without turning reads + // as a sticker on the floor. Ground contact sets the spin to the true + // rolling rate for the 22-unit radius; the spin then integrates every + // frame, because a head that leaves the floor mid-bounce keeps turning — + // spinning only while grounded left the bouncing head (which is how a head + // mostly travels) with a face nailed bolt upright between landings. + // `grounded` still holds last frame's answer here — it resets just below. + if (isHeadOnly(player)) { + // Clamped well below the true rolling rate: honest physics for a 22-unit + // ball at fight speed is eleven revolutions a second, which on screen is + // not a rolling face but a whirl of spinning lines. A lazy tumble — about + // a turn per second, capped — keeps the eyes and mouth readable while + // still saying which way the head is traveling. + if (player.grounded) player.headRollRate = clamp(player.vx / 22, -6, 6); + player.headRoll = (player.headRoll || 0) + (player.headRollRate || 0) * dt; + } + // Walking down a slope is not a new landing on every other tick. + const nextFloor = terrainFloorAt(player.x); + const followingFloor = wasGrounded && player.vy >= 0 && + Math.abs(previousY - terrainFloorAt(previousX)) < 3 && + nextFloor - previousY <= Math.max(20, Math.abs(player.vx * dt) * 2.5); + if (followingFloor) player.y = Math.max(player.y, nextFloor); + const landingSpeed = player.vy; + player.grounded = false; + // A sinking fighter is transparent to the rung it left and to nothing else. + // A window long enough to clear one lip — .25s, 290 units of fall — is + // already long enough to fall past the next rung 260 below, and a + // double-tap that dropped two storeys read as a fall rather than a step + // down. Remembering where the sink started is what keeps it one storey. + // The floor is never transparent, which is why it stays in the else. + const ledge = player.vy >= 0 && ledgeCrossed(player.x, previousY, player.y); + const sinking = now < player.sinkUntil && + ledge && ledge.y <= player.sinkFrom + 4; + if (ledge && !sinking) { + player.y = ledge.y; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, ledge.y, now); + } else { + player.vy = 0; + player.grounded = true; + } + } else if (player.y >= terrainFloorAt(player.x) && + (!player.skateboard || player.vy >= 0)) { + const terrainY = terrainFloorAt(player.x); + player.y = terrainY; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, terrainY, now); + } else { + player.vy = 0; + player.grounded = true; + } + } + if (player.skateboard) { + const contact = skateContact(player.x, previousY); + const supported = player.grounded || (wasGrounded && player.vy >= 0 && + Math.abs(player.y - contact.y) < Math.max(24, Math.abs(player.vx * dt) * 2.5)); + if (supported && !player.skateWallSide) { + player.y = contact.y; + const tangentX = Math.cos(contact.pitch); + const tangentY = Math.sin(contact.pitch); + if (!wasGrounded) { + // Inelastic contact removes normal velocity. A downward impact at a + // lip must count against uphill momentum, not become an upward boost. + player.skateVx = (player.vx * tangentX + landingSpeed * tangentY) * tangentX; + } else { + // Carry tangent speed around the curve; fixed horizontal speed would + // invent vertical energy whenever the slope steepens. + player.skateVx *= tangentX / Math.max(.001, + Math.cos(player.skatePitch || 0)); + } + player.vx = player.skateVx; + player.skatePitch = contact.pitch; + player.skateContacts = Number(contact.left) + Number(contact.right); + player.grounded = true; + player.vy = 0; + const distance = (player.x - previousX) / Math.max(.15, Math.cos(contact.pitch)); + player.skateSpin = (player.skateSpin || 0) + distance / skateWheelRadius; + player.skateRollDistance = (player.skateRollDistance || 0) + Math.abs(distance); + if (player.skateContacts && player.skateRollDistance >= 100) { + player.skateRollDistance %= 100; + playDrum("hat", .12 + Math.min(.35, Math.abs(player.vx) / 8400), panPlayer(player)); + emitSignal("skate-roll", player.pad, Math.round(Math.abs(player.vx)), player.skateContacts); + } + if (!wasGrounded) { + playDrum("clap", clamp(landingSpeed / 2000, .2, 1), panPlayer(player)); + playDrum("block", clamp(landingSpeed / 2800, .15, .7), panPlayer(player)); + emitSignal("skate-land", player.pad, Math.round(landingSpeed), player.skateContacts); + } + } else player.skateContacts = 0; + } + if (!wasGrounded && player.grounded) { + const onBooster = boosterXs.some((x) => Math.abs(player.x - x) <= boosterRadius); + player.landPoseUntil = now + 110000; + player.crouchJump = false; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + if (player.pounding) groundPound(player, now); + else if (!headOnly && onBooster) { + player.vy = -boosterVelocity; + player.grounded = false; + player.jumpHeld = true; + player.airJumpsUsed = 0; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + playSine(880, .22); + playDrum("clap", 1.2, panPlayer(player)); + emitSignal("boost", player.pad, 1, 0); + } else player.airJumpsUsed = 0; + } + resolveRunnerBounds(player, (now - startedAt) / 1000000); + skateBoostStep(player, parkPreviousX, now); + player.hit = Math.max(0, player.hit - dt * 4); + player.blockFlash = Math.max(0, player.blockFlash - dt * 6); + player.previous = pad.down.slice(); + if (input.vertical > 0) player.previous.push("MOVE_UP"); + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grabHeld = grabHeld; + updateStance(player, input, now); +} + +// How long a bot leans on a button, per action rather than one house number. +// A jump has to outlast the whole rise (1760 / 4800 ≈ .37s) or jumpCutScale +// clips the arc to a third of its height and the platform goes out of reach; +// a strike is a stab; a sink tap is half of a double-tap. +const botHoldUs = { + walk: 90000, jump: 440000, sinkTap: 60000, + strike: 70000, shield: 120000, item: 110000, +}; +// A press cannot reopen until it has been up this long, so `lastRelease` +// always sees a real gap — that gap is what keeps dash, ultra jump and sink +// readable from synthetic input. Four frames clears doubleTapReleaseUs even +// when the release lands a frame late. +const botRestUs = 66668; +// A thumb cannot hold both ends of an axis, so opening one closes the other. +const botAxis = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft", + ArrowUp: "ArrowDown", ArrowDown: "ArrowUp" }; + +// The bot's dice. Not Math.random, deliberately: two fresh sims must roll +// identically (the determinism test holds that line), and the reel factory +// reserves the global stream for the match name. Seeded per fighter at round +// start from the round clock, so rounds differ live while a replayed sim +// replays exactly. +function botRoll(player) { + let s = player.botRngState = (player.botRngState + 0x6d2b79f5) >>> 0; + s = Math.imul(s ^ (s >>> 15), s | 1); + s ^= s + Math.imul(s ^ (s >>> 7), s | 61); + return ((s ^ (s >>> 14)) >>> 0) / 4294967296; +} + +// The one door every synthetic press goes through. Pressing a button that is +// already down extends it, so a pursuit reads as one lean instead of a +// stutter; pressing one that is still resting is refused. +function botPress(player, button, holdUs, now) { + const press = player.botPresses[button]; + if (press && now < press.until) { + press.until = Math.max(press.until, now + holdUs); + return true; + } + if (press && now < press.until + botRestUs) return false; + const other = player.botPresses[botAxis[button]]; + if (other && now < other.until) other.until = now; + player.botPresses[button] = { until: now + holdUs }; + return true; +} + +const botHeld = (player, button, now) => + now < (player.botPresses[button]?.until || 0); + +function botDown(player, now) { + return Object.keys(player.botPresses) + .filter((button) => now < player.botPresses[button].until); +} + +// ── What a bot sees ───────────────────────────────────────────────────────── +// The bots used to steer off the whole table. The climb bot read the ladder +// by index — `platforms[level]` — and the fight bot read the opponent's +// coordinates wherever they were, on screen or not. Neither is what a hand on +// a pad has. A player sees a screen: the rungs the lens has in frame, the lava +// once it has climbed into view, the other fighter while the camera holds +// them — and picks the next move from what that frame offers. +// +// `botScene` is that frame. It is rebuilt every simulation tick from the same +// projection the stage paints with, so a rung is in the scene exactly when +// its lip lands on the screen a person would be watching. `botOptions` is the +// list of moves the scene affords from where the bot is standing: which of +// those rungs one jump reaches, from where; the span it can walk; the deck it +// could sink through. The brains below hold a goal (the summit, the +// opponent), pick the option that advances it as this tick's subgoal, and +// press for that — nothing in them reaches past the frame. +// +// One jump's ceiling, from the same numbers the fighter's legs use: with up +// held, the rise is v²/2g, and everything above it is out of reach. +const jumpApex = () => jumpVelocity * jumpVelocity / (2 * riseGravity()); +// A jump's horizontal budget onto a deck `dy` above the takeoff: the whole +// rise, then the fall from the apex down to the deck's height, walked at +// walking speed. Scaled down hard — the bot is committing to a lip, and a +// landing at the very end of the arc is a landing it can miss by one frame. +const botAirCommit = .6; +function jumpReach(dy) { + const riseSeconds = jumpVelocity / riseGravity(); + const fallSeconds = Math.sqrt(2 * Math.max(0, jumpApex() - dy) / fallGravity()); + return walkSpeed * (riseSeconds + fallSeconds) * botAirCommit; +} +// Where the feet are. Level 0 is the arena floor; a rung answers by its level. +function botFooting(player) { + if (!player.grounded) return null; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (Math.abs(player.y - ledge.y) <= 3 && + player.x >= ledge.left && player.x <= ledge.right) return { ...ledge }; + return { level: 0, left: platformLeft, right: platformRight, y: floorY }; +} +// The screen. The whole screen, not the action-safe rect: a person watching +// a television reads the rung above out of the sky the HUD floats over. +const botViewport = () => + ({ left: stageLeft, right: stageRight, top: 0, bottom: viewHeight }); +function pointInView(view, x, y, z = 0) { + const point = projectPoint(x, y, z); + return Number.isFinite(point.x) && Number.isFinite(point.y) && + point.x >= view.left && point.x <= view.right && + point.y >= view.top && point.y <= view.bottom; +} +// A rung is in view when any of its lip is: both ends projected, the span +// clipped against the screen's sides, its height inside the screen's top and +// bottom. A deck half off the right edge still offers its visible half. +function rungInView(view, ledge) { + const a = projectPoint(ledge.left, ledge.y, 0); + const b = projectPoint(ledge.right, ledge.y, 0); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite)) return false; + const y = (a.y + b.y) / 2; + return y >= view.top && y <= view.bottom && + Math.max(a.x, b.x) >= view.left && Math.min(a.x, b.x) <= view.right; +} + +function botScene(player, opponent, now) { + const view = botViewport(); + const footing = botFooting(player); + const rungs = []; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (rungInView(view, ledge)) + rungs.push({ level: ledge.level, left: ledge.left, right: ledge.right, + y: ledge.y, dy: player.y - ledge.y }); + const scene = { + at: now, + view, + lens: { width: cameraDoll.width, x: cameraDoll.target.x, + y: cameraDoll.target.y }, + self: { x: player.x, y: player.y, vx: player.vx, vy: player.vy, + grounded: player.grounded, facing: player.facing, footing }, + floor: pointInView(view, clamp(player.x, platformLeft, platformRight), + floorY) ? { y: floorY, left: platformLeft, right: platformRight } : null, + rungs, + lava: survivalActive() && + pointInView(view, clamp(player.x, worldLeft, worldRight), survivalLavaY) + ? { y: survivalLavaY, below: survivalLavaY - player.y } : null, + opponent: null, + pickups: [], + }; + if (opponent && opponent.alive && opponent !== player && + pointInView(view, opponent.x, opponent.y - 90, opponent.z || 0)) { + const dx = opponent.x - player.x; + scene.opponent = { x: opponent.x, y: opponent.y, dx, dy: player.y - opponent.y, + distance: Math.abs(dx), facing: opponent.facing, + attacking: Boolean(opponent.attackKind) && now < opponent.attackUntil, + attackStartedAt: opponent.attackStartedAt }; + } + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + if (pickup.active && pointInView(view, pickup.x, pickup.y)) + scene.pickups.push({ kind: pickup.kind || "item", + x: pickup.x, y: pickup.y, dx: pickup.x - player.x }); + scene.options = botOptions(player, scene); + return scene; +} + +// The moves the scene affords from this footing. Every option names the deck +// it ends on, so a brain can pick by destination and then read off how to +// get there. In the air there is nothing to enumerate; the brain keeps the +// subgoal it left the ground with. +function botOptions(player, scene) { + const options = []; + const footing = scene.self.footing; + if (!footing) return options; + options.push({ kind: "walk", level: footing.level, y: footing.y, + left: footing.left, right: footing.right }); + const inset = survivalTune().landingInset; + const visible = new Set(scene.rungs.map(r=>r.level)); + const maxReach = jumpReach(0); + const nearby = queryBoxTree(platformBoxTree(), combatRect('jump-window', + footing.left-maxReach, footing.y-jumpApex(), footing.right+maxReach, footing.y)); + for (const box of nearby) { + const rung = box.ledge; + if (!visible.has(rung.level)) continue; + const dy = footing.y - rung.y; + if (dy <= 0 || dy > jumpApex()) continue; + const landLeft = rung.left + inset; + const landRight = rung.right - inset; + if (landRight < landLeft) continue; + const reach = jumpReach(dy); + // Where on this footing a jump can start and still come down on the + // landing band. An empty window is a deck the lens shows but the legs + // cannot have from here. + const takeoffLeft = Math.max(footing.left, landLeft - reach); + const takeoffRight = Math.min(footing.right, landRight + reach); + if (takeoffLeft > takeoffRight) continue; + const aim = clamp(player.x, landLeft, landRight); + options.push({ kind: "jump", level: rung.level, y: rung.y, dy, reach, + landLeft, landRight, takeoffLeft, takeoffRight, aim, + cost: Math.abs(aim - player.x) }); + } + if (footing.level > 0) { + // Sinking drops to whatever is under the feet — and only what is in + // frame counts, the same as a person deciding to fall. + let below = scene.floor ? { level: 0, y: floorY } : null; + for (const rung of scene.rungs) + if (rung.y > footing.y && player.x >= rung.left && + player.x <= rung.right && (!below || rung.y < below.y)) + below = { level: rung.level, y: rung.y }; + if (below) options.push({ kind: "sink", level: below.level, y: below.y, + dy: footing.y - below.y }); + } + return options; +} + +let platformTreeSource = null, platformTreeRevision = -1, platformTree = null; +function platformBoxTree() { + const ledges = activeLedges(); + if (platformTreeSource !== ledges || platformTreeRevision !== workshopRevision) { + platformTreeSource = ledges; platformTreeRevision = workshopRevision; + platformTree = buildBoxTree(ledges.map(ledge => combatRect('platform-'+ledge.level, + ledge.left,ledge.y,ledge.right,ledge.y+12,0,18,{ledge}))); + } + return platformTree; +} + +// The climb's subgoal: the highest deck one jump reaches from this footing, +// the nearest of them when two tie. On the ladder that is the deck above — +// two decks is 470 and the apex is 322 — but the choice is made from the +// scene, so a deck the lens has not shown yet is a deck the bot waits for. +function highestJump(options) { + let best = null; + for (const option of options) { + if (option.kind !== "jump") continue; + if (!best || option.y < best.y || + (option.y === best.y && option.cost < best.cost)) best = option; + } + return best; +} + +function botPad(player, opponent, now) { + if (selfPlay && typeof globalThis.__oskiewarJevPad === 'function') { + const scene = botScene(player, opponent, now); + scene.self.ducking = player.ducking; + scene.self.attackFrame = meleeFrame(player, now).frame; + scene.self.recoveryMs = Math.max(0, (player.attackUntil-now)/1000); + scene.self.combat = { + punch: Boolean(availableArm(player)), + kickLeft: hasPart(player, 'left-leg'), kickRight: hasPart(player, 'right-leg'), + item: Boolean(heldItem(player)), stunned: now < player.hitStunUntil, + headOnly: isHeadOnly(player), pogo: isPogo(player), + }; + if (scene.opponent) { + scene.opponent.grounded = opponent.grounded; + scene.opponent.vx = opponent.vx; scene.opponent.vy = opponent.vy; + scene.opponent.ducking = opponent.ducking; + scene.opponent.headOnly = isHeadOnly(opponent); + scene.opponent.pogo = isPogo(opponent); + scene.opponent.blocking = opponent.blocking; + scene.opponent.attackFrame = meleeFrame(opponent, now).frame; + scene.opponent.recoveryMs = Math.max(0, (opponent.attackUntil-now)/1000); + // The parent calls this only when preparing a model request, not every + // simulation tick. Probes read clones and never advance the live fight. + scene.strikeOptions = () => jevStrikeOptions(player, opponent, + runtime().simMonotonicUs || runtime().monotonicUs); + } + const down = globalThis.__oskiewarJevPad(player.pad, { ...scene, + round: matchName, alive: player.alive && opponent.alive }); + return { connected: true, down: Array.isArray(down) ? down.filter(button => + ['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','A','B','X','Y'].includes(button)) : [], leftX: 0, leftY: 0 }; + } + if (!player.bot) { + player.botPresses = {}; + return { connected: true, down: [], leftX: 0, leftY: 0 }; + } + // Downed, or standing over a downed opponent, the bot opens nothing new — + // but presses already out still run their length instead of vanishing + // mid-hold, which would read as a poke. + if (!player.alive || !opponent.alive) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + + // A scored bot plays its sheet instead of thinking: rows of {at, button, + // hold} in µs from round start, through the same botPress door so holds + // and releases stay human-shaped. An empty score is a dummy that stands + // there and takes it — which is exactly what a sync lab needs on the + // receiving end. Scores arrive via globalThis.__oskiewarBotScores at round + // start; no score, and the brain below plays as always. + if (player.botScore) { + const at = now - roundStartedAt; + while (player.botScoreAt < player.botScore.length && + player.botScore[player.botScoreAt].at <= at) { + const row = player.botScore[player.botScoreAt]; + if (botPress(player, row.button, row.hold ?? botHoldUs.strike, now)) + player.botScoreAt += 1; + else break; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + + // The frame, and the opponent only as the frame shows them. The fight + // camera holds both fighters, so an opponent out of view is the rare case — + // but when it happens the bot has nothing to chase and opens nothing new. + const scene = botScene(player, opponent, now); + player.botScene = scene; + player.botGoal = "opponent"; + const seen = scene.opponent; + if (!seen) { + player.botSubgoal = null; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + const dx = seen.dx; + const distance = seen.distance; + const toward = Math.sign(dx) || player.facing || -1; + const opponentThreatening = seen.attacking && distance < 245 && + seen.facing === -toward; + const striking = botHeld(player, "A", now) || botHeld(player, "X", now); + + // A guard that answers every swing the frame it starts turns the round into + // punch-into-shield until the clock dies — the signal census reads punch×6, + // shield×6 per five seconds and nothing else. So the guard is human now: + // each incoming swing is noticed once, answered late, and sometimes not at + // all. The lapse is what lets damage through, and damage is what ends + // rounds. + if (opponentThreatening) { + if (player.botThreatSeen !== seen.attackStartedAt) { + player.botThreatSeen = seen.attackStartedAt; + const roll = botRoll(player); + player.botShieldAt = roll < 0.55 + ? now + 70000 + Math.round(roll * 250000) : Infinity; + } + } else player.botShieldAt = Infinity; + + // A shield that just ate a swing bought a stun. Swing into it now — the + // neutral-game cooldown would let the opening close unanswered. + if (player.shieldBrokenAt && + player.shieldBrokenAt !== player.botPunishedAt && + now - player.shieldBrokenAt < 80000) { + player.botPunishedAt = player.shieldBrokenAt; + player.botAttackAt = now; + } + + if (opponentThreatening && !striking && now >= player.botShieldAt) + botPress(player, "X", botHoldUs.shield, now); + else { + // The old spacing was tuned for a bigger fighter: stop walking at 155, + // swing at 225. A punch capsule tops out near 130 of separation and a + // kick near 170, so that band was whiff purgatory — the census read + // punch after punch with no body hit until the clock died. Close to + // where a swing actually lands, and swing only from there — and only on + // the ground: steering mid-air wedged the bot against a platform lip it + // used to clear. + if (player.grounded && distance > 95) + botPress(player, toward > 0 ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + // Items are ranged, so the bot spends them while closing rather than + // trading one for a swing it could land anyway. The grenade needs its arc. + const item = heldItem(player); + if (item && now >= player.botItemAt && + distance >= (item === "GUN" ? 320 : 1200) && + botPress(player, "Y", botHoldUs.item, now)) + player.botItemAt = now + 600000; + if (distance < 165 && now >= player.botAttackAt && + botPress(player, player.botAttackSequence % 2 ? "A" : "B", + botHoldUs.strike, now)) { + player.botAttackSequence += 1; + player.botAttackAt = now + 330000 + (player.botAttackSequence % 3) * 70000; + } + } + + // Up and down are read off the scene's options. An opponent a storey up + // is reached by the jump that lands on their deck when the frame offers + // one, and by a plain jump at them when it does not — the cube has no + // rungs, and there the old leap is the only vertical move there is. + const climb = seen.dy > 180 + ? scene.options.find((option) => option.kind === "jump" && + Math.abs(option.y - seen.y) <= 3) || null + : null; + player.botSubgoal = climb; + if (climb && Math.abs(climb.aim - player.x) > 24) + botPress(player, climb.aim > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + const canLeap = climb + ? player.x >= climb.takeoffLeft && player.x <= climb.takeoffRight + : seen.dy > 180; + if (player.grounded && canLeap && now >= player.botJumpAt && + botPress(player, "ArrowUp", botHoldUs.jump, now)) + player.botJumpAt = now + 1250000; + // Knocked up onto a deck the bot would camp out of reach, so it plays the + // same double-tap-down a player would: two real presses with a real + // release between them — and only through a deck the frame shows a floor + // under. + const sink = scene.options.find((option) => option.kind === "sink"); + if (sink && player.grounded && player.standingOn < 0 && + seen.dy < -200 && now >= player.botSinkAt) { + player.botSinkAt = now + 900000; + player.botSinkTaps = 2; + player.botSinkNextAt = now; + } + if (player.botSinkTaps > 0 && now >= player.botSinkNextAt && + botPress(player, "ArrowDown", botHoldUs.sinkTap, now)) { + player.botSinkTaps -= 1; + player.botSinkNextAt = now + botHoldUs.sinkTap + botRestUs; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The climb bot's four numbers, gathered so they can be priced instead of +// guessed. `survival-lab.mjs` runs the ladder headlessly and sweeps one of +// these at a time; the defaults are exactly what the bot shipped with, and +// ordinary play never sets the override, so a human's attract-mode climb is +// unchanged by the seam existing. +const survivalTuneDefaults = { + landingInset: 72, // how far inside a deck's edge still counts as footing + walkThreshold: 24, // closer than this and walking is only jitter + // How far off the aim point the runner may still commit to a jump. This was + // 34, and 34 is why no reel ever summited: decks 5 and 6 do not overlap + // horizontally, so `dx` there never falls below 92 and the bot stood on the + // lip jumping straight up until the lava took it. Committing while the walk + // is still carrying it is what crosses a gap. Measured by `survival-lab.mjs`: + // ≤100 dies on deck 5, ≥110 summits all 32, and it still summits at 420 — + // 160 sits well inside that shelf rather than on its edge. + jumpThreshold: 160, + jumpCooldownUs: 580000, // the floor under one jump per deck + jumpHoldUs: botHoldUs.jump, // held past apex, or `jumpCutScale` clips the rise + // Per-reel variation. The ladder is fixed, the bot is fixed, and under the + // oven's fixed-step clock the round clock the bot's dice seed from is fixed + // too — so every slot rendered a frame-identical climb, and three reels + // shipped the same run. The oven passes a seed; it is folded into the + // fighter's dice once, which moves the aim from deck to deck while leaving + // any single seed exactly reproducible. Zero means no variation, which is + // what ordinary play uses, so a human's attract-mode climb is untouched. + seed: 0, + // Share of the landing band the aim may wander. Bought with `survival-lab`: + // .15 and .3 both summit 4/4, .45 and .6 drop to 3/4 because a hard bias + // toward a deck's edge can leave the next jump unmakeable. .3 is the most + // visible variation that still costs nothing. + aimJitter: .3, +}; +function survivalTune() { + const override = globalThis.__oskiewarSurvivalTune; + if (!override) return survivalTuneDefaults; + return { ...survivalTuneDefaults, ...override }; +} + +function survivalBotPad(player, now) { + if (!player.bot || !player.alive) + return { connected: true, down: [], leftX: 0, leftY: 0 }; + const tune = survivalTune(); + // Folded in once per run, before the first aim is taken. + if (tune.seed && player.survivalSeed !== tune.seed) { + player.survivalSeed = tune.seed; + player.botRngState = + (player.botRngState ^ Math.imul(tune.seed, 0x9e3779b9)) >>> 0; + } + // The frame, every tick. The goal is the summit; the subgoal is the deck + // this frame offers a jump onto. On the ground that is re-chosen from the + // scene each tick — in the air the runner holds the deck it left for. + const scene = botScene(player, null, now); + player.botScene = scene; + player.botGoal = "summit"; + const footing = scene.self.footing; + if (footing) { + const next = highestJump(scene.options); + if (next && next.level !== player.survivalTargetLevel) { + player.survivalTargetLevel = next.level; + // One roll per deck, not per tick: the runner should commit to a line + // and hold it, and rolling every frame would average the wander back + // to zero. + player.survivalAimBias = tune.seed ? botRoll(player) - .5 : 0; + } + player.botSubgoal = next; + if (!next) { + // Nothing above in frame. Stand where a deck cannot end under you — + // the lens is catching up, and the next rung arrives in it. + const middle = (footing.left + footing.right) / 2; + if (Math.abs(middle - player.x) > tune.walkThreshold) + botPress(player, middle > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + } + const target = player.botSubgoal; + if (!target) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + // Aim for the nearest safe point on the landing band, not the deck's + // center: a centered aim walked the bot to the lip of an overlapping pair + // and waited forever when the remaining seven units were smaller than its + // jump threshold. The seeded wander moves the aim along the band. + const aim = clamp(clamp(player.x, target.landLeft, target.landRight) + + (player.survivalAimBias || 0) * (target.landRight - target.landLeft) * + tune.aimJitter, target.landLeft, target.landRight); + const dx = aim - player.x; + if (Math.abs(dx) > tune.walkThreshold) + botPress(player, dx > 0 ? "ArrowRight" : "ArrowLeft", botHoldUs.walk, now); + // Commit inside the option's own budget or the tuned threshold, whichever + // is tighter — the threshold was priced by `survival-lab.mjs`, and the + // budget keeps a lab sweep from asking for a jump the legs cannot land. + if (player.grounded && Math.abs(dx) <= Math.min(tune.jumpThreshold, target.reach) && + player.x >= target.takeoffLeft && player.x <= target.takeoffRight && + now >= player.botJumpAt && + botPress(player, "ArrowUp", tune.jumpHoldUs, now)) + player.botJumpAt = now + tune.jumpCooldownUs; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The replay oven needs a bounded completion record, not a production replay. +// Its injected fetch keeps this envelope inside the local shell; ordinary +// survival never records, publishes, or analyzes a run. Keeping the seam +// explicit prevents a `?replay-oven` URL typed in a normal browser from +// turning an anonymous climb into stored match data. +function captureSurvivalRun(now, result) { + if (globalThis.__oskiewarCaptureSurvival !== true || + typeof saveReplay !== "function") return; + const tickUs = 1000000 / 60; + const durationTicks = Math.max(1, + Math.round((now - survivalStartedAt) / tickUs)); + // The clock this is built from is fixed under an offline fixed-step pass, so + // without the seed every reel in a day filed the same name — and that name + // becomes the reel's Instagram `audio_name` (`audioNameFor`), which is only + // honoured on the post that mints it. Live climbs pass no seed and keep the + // original name. + const runSeed = survivalTune().seed >>> 0; + const roundName = "survival-v" + buildVersion + "-" + + Math.max(0, Math.round(survivalStartedAt / tickUs)) + + (runSeed ? "-" + runSeed.toString(36) : ""); + const runner = players[0]; + const height = Math.round(survivalHeight); + const demo = { + format: "ac.oskiewar.survival", version: 1, game: "oskiewar", + simulation: "oskiewar-survival-1", tickRate: 60, + matchId: "ow-" + roundName, matchName: roundName, + roundId: "ow-" + roundName, roundName, roundIndex: 0, + startedAt: runtime().unixMs - Math.round(durationTicks / 60 * 1000), + durationTicks, fighters: [runner.name], nations: [runner.nation || ""], + winner: result === "SUMMIT" ? runner.name : null, + finalRoundWins: [result === "SUMMIT" ? 1 : 0], + cause: result, height, + commands: [], checkpoints: [], impacts: [], + events: [[0, "climb", 0, 1, 0], + [durationTicks, "survival-end", 0, height, + result === "SUMMIT" ? 1 : 0]], + }; + const upload = saveReplay(JSON.stringify(demo)); + if (upload && typeof upload.catch === "function") + upload.catch((error) => telemetry("SURVIVAL_CAPTURE", + "local-error " + error.message)); +} + +function finishSurvival(now, result) { + if (roundResult) return; + const runner = players[0]; + survivalBestHeight = Math.max(survivalBestHeight, survivalHeight); + roundResult = result; + roundCause = result; + roundOverAt = now; + runner.vx = 0; + runner.vy = 0; + if (result === "LAVA") { + runner.alive = false; + runner.stance = "HIT"; + spawnImpact({ x: runner.x, y: survivalLavaY, z: runner.z, + life: 1.2, duration: 1.2, death: true, explosion: true, + blastRadius: 240, power: .8 }); + playDrum("kick", 1.25, panPlayer(runner)); + playSine(92, .45); + } else { + playDrum("clap", 1.2, 0); + playSine(880, .3); + } + globalThis.__oskiewarResultLine = result === "SUMMIT" + ? "summit!" : Math.round(survivalHeight) + " high"; + emitSignal("survival-end", 0, Math.round(survivalHeight), + result === "SUMMIT" ? 1 : 0); + captureSurvivalRun(now, result); +} + +function updateSurvival(dt, now) { + const runner = players[0]; + const height = Math.max(0, floorY - runner.y); + survivalHeight = Math.max(survivalHeight, height); + runner.score = Math.round(survivalHeight); + while (survivalPeakLevel < platforms.length && + runner.y <= platforms[survivalPeakLevel].y + 2) + survivalPeakLevel++; + const lavaSpeed = survivalLavaBaseSpeed + + Math.min(76, survivalHeight * .008); + survivalLavaY -= lavaSpeed * dt; + const body = runnerBounds(runner, (now - startedAt) / 1000000); + if (body.bottom >= survivalLavaY) finishSurvival(now, "LAVA"); + else if (survivalPeakLevel >= platforms.length && runner.grounded) + finishSurvival(now, "SUMMIT"); +} + +function drawAirDropSky(t) { + const shift = ((cameraCenterY * .14) % viewHeight + viewHeight) % viewHeight; + const ink = mixColor([65,115,155], [230,248,255], visualTheme.light); + for (let i = 0; i < 14; i++) { + const x = ((i * 197 + 53) % 997) / 997 * viewWidth(); + const y = ((i * 113) % viewHeight - shift + viewHeight) % viewHeight; + screenRect(x, y, 2 + i % 2, 16 + i % 4 * 9, ink); + } +} + +function gameSim() { + captureRenderInterpolationState(); + syncGameView(); + const now = runtime().monotonicUs; + const dt = Math.min(0.04, Math.max(0.001, (now - lastSimAt) / 1000000)); + lastSimAt = now; + // Whether a door is in the way is state, not decoration: the same answer + // gates the fight, the claim and the wire, so it is settled once on the tick + // rather than re-asked by each of them mid-paint. + updateAccountDoor(); + if (resimPending) { + startResim(resimPending, now); + resimPending = null; + } else if (resimActive) { + // Demo ticks count every sim step from the reset, intro included — the + // drift meter has to count in the same currency. + resimTick++; + advanceResimCommands(); + } + if (roundViewer && !netSession) { + // The chair-holder's hands are local even when the fight is not. The + // control legend, the M30 manual page and the touch discs all light off + // inputPads[0], and the debug toggle wants a View edge — none of that + // may wait on the host's echo, so the local pad is sampled here exactly + // as it would be in a hosted fight. + padSnapshots[0] = samplePad(0); + inputPads[0] = padSnapshots[0]; + const down = padSnapshots[0]?.down || []; + if (down.includes("View") && !viewerSystemPrevious.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + viewerSystemPrevious = down.slice(); + updateRoundViewer(now, dt); + // A visitor who holds the second chair plays through this screen: their + // pad goes up the wire every tick it changes, and a room found hostless + // becomes theirs to host. + sendChallengerInput(now); + netChallengerHello(now); + updateVersusClaim(now); + return; + } + padSnapshots[0] = samplePad(0); + padSnapshots[1] = samplePad(1); + padSnapshots[2] = samplePad(2); + inputPads[0] = padSnapshots[0]; + inputPads[1] = padSnapshots[1]; + if (updateLocalVersus(now)) { + consumeSystemButtons(now); + return; + } + const cameraPads = localVersusActive() ? padSnapshots : [padSnapshots[0]]; + const cameraX = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightX) || 0), 0), -1, 1); + const cameraY = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightY) || 0), 0), -1, 1); + if (Math.abs(cameraX) > .08) + playerCameraYaw = clamp(playerCameraYaw + cameraX * dt * 1.15, -.62, .62); + if (Math.abs(cameraY) > .08) + playerCameraPitch = clamp(playerCameraPitch + cameraY * dt * .72, -.24, .28); + // Triggers zoom, but only on a pad whose triggers are analog -- on anything + // else the shell is still aliasing them to A and X, and stealing those two + // buttons would cost a small pad its item and shield. + // Either couch seat can steer the shared camera. Digital M30 shoulders + // remain combat buttons, even beside a controller with analog triggers. + const push = clamp(cameraPads.reduce((sum, pad) => sum + (pad?.analogTriggers + ? (Number(pad.leftTrigger) || 0) - (Number(pad.rightTrigger) || 0) : 0), 0), -1, 1); + if (Math.abs(push) > .08) + playerCameraZoom = clamp(playerCameraZoom + push * dt * .9, .55, 1.9); + // A mouse or a finger on the shell's canvas orbits the same lens the + // right stick does: a drag turns yaw and pitch, the wheel or a pinch + // dollies. The shell banks the gesture between ticks and this drains it, + // so a fast flick is not lost to a slow frame. + const orbit = globalThis.__oskiewarTouch?.orbit; + if (orbit) { + if (orbit.yaw) + playerCameraYaw = clamp(playerCameraYaw + orbit.yaw, -.62, .62); + if (orbit.pitch) + playerCameraPitch = clamp(playerCameraPitch + orbit.pitch, -.24, .28); + if (orbit.zoom) + playerCameraZoom = clamp(playerCameraZoom * Math.exp(orbit.zoom), .55, 1.9); + orbit.yaw = orbit.pitch = orbit.zoom = 0; + } + // A tap anywhere on the wordmark screen is a start press — read before + // the tap queue is wiped for the tick. The shell already turns first-visit + // taps into a button; this catches every visit after that. + const titleTapped = shellMode === "MENU" && !selecting && + (globalThis.__oskiewarTouch?.taps?.length || 0) > 0; + if (!selecting && Array.isArray(globalThis.__oskiewarTouch?.taps)) + globalThis.__oskiewarTouch.taps.length = 0; + if (consumeSystemButtons(now)) { + if (netSession) netLeave("system-button"); + return; + } + // The wordmark screen is a live training round, so the shell reads start + // and then falls straight through into the fight it is sitting on top of. + if (shellMode === "MENU") updateShell(now, titleTapped); + else updateMatchPace(now); + // The versus seat watches from the title on — a friend can take the chair + // while the host is still reading the wordmark, and the fight lifts it. + updateVersusSeat(now); + updateLobbyMortality(now); + if (survivalActive() && shellMode === "MENU") { + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + for (const player of players) + inputPads[player.pad] = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]) + : resimActive && resimCommands + ? resimPad(player.pad) + : player.remote ? remotePadSnapshot() + : player.bot && shellMode === "GAME" + ? survivalActive() && player.pad === 0 + ? survivalBotPad(player, now) + : botPad(player, players[player.pad ? 0 : 1], now) + : player.npc ? { connected: true, down: [], leftX: 0, leftY: 0 } + : padSnapshots[player.pad]; + // Start belongs to the shell, including its hold and transition frames. + // The first neutral sample releases gameplay for the next fresh press. + if (!players[0].bot && !players[0].remote && !netFrameInputs && !resimActive) { + const pad = inputPads[0]; + if (shellMode === "MENU" || startInputPending) { + startInputPending = shellMode === "MENU" || pad.down.length > 0 || + Math.abs(pad.leftX || 0) > .08 || Math.abs(pad.leftY || 0) > .08; + inputPads[0] = { ...pad, down: [], leftX: 0, leftY: 0 }; + } + } + if (debugHitboxes && now >= nextInputDebugAt) { + nextInputDebugAt = now + 500000; + const values = players.map((player) => { + const pad = inputPads[player.pad]; + const input = quantizedInput(pad, player.suppressedDirections); + return "P" + (player.pad + 1) + " down=" + + (pad.down.join("+") || "NONE") + " stick=" + + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + " q=" + + input.horizontal + "," + input.vertical + " vx=" + + Math.round(player.vx); + }); + telemetry("FIGHT_INPUT", values.join(" | ")); + } + recordReplayCommands(now, inputPads); + // Session first: the hand-off frame must leave before the round's first + // frame walks the native shell's one socket over to the round room. + publishSession(now); + publishSpectator(now); + publishVersus(now); + if (survivalActive() && roundResult) { + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + if (now - roundOverAt >= roundResultUs) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSurvivalRun(now, true); + else returnToTitle(now, "survival-end"); + } + return; + } + if (roundResult) { + // The scored tail. The killcam dwell used to be the reel's quietest + // seconds under its most dramatic frames, so the dwell keeps a slow + // heartbeat and the result card lands with a sting of its own. Voice on + // the drum channel, record on unrouted signal names, as everywhere. + if (!resultPulseAt) resultPulseAt = roundOverAt + 900000; + if (now >= resultPulseAt) { + resultPulseAt = now + 1050000; + playDrum("kick", .3, 0); + emitSignal("result-pulse", -1, 0, 0); + } + if (!resultCardStung && now - roundOverAt >= 1100000) { + resultCardStung = true; + playDrum("bell", .95, 0); + // The card's own line rides a global for whichever shell can speak: + // the web shell reads it back through speech synthesis on this same + // signal. Signals carry numbers, and the sentence is presentation. + // The anonymous seat wears a blank nameplate, and a blank name read + // aloud is a stumble — but only the local first seat can be nameless, + // so a nameless winner is always "you". + const card = resultCardText(); + const spokenWinner = card.winner.replace(/^@/, ""); + globalThis.__oskiewarResultLine = roundResult === "TIE" ? "tie!" + : (spokenWinner ? spokenWinner + " wins the " : "you win the ") + + (matchOver ? "match" : "round"); + emitSignal("result-card", -1, roundResult === "TIE" ? 0 : 1, 0); + // The winner gets the last word: a staccato synthesized laugh rides + // out of the bell. A tie amuses nobody. + if (roundResult !== "TIE") { + resultLaughAt = now + 420000; + resultLaughStep = 0; + // The mouth opens on the sting and the laugh lands in it — the same + // open-ring LAUGH face the A+B chord earns, dealt automatically to + // the winner unless they have already chosen their own gloat. + const winner = roundWinner(); + if (winner?.alive && !winner.resultReaction) { + winner.resultReaction = "LAUGH"; + winner.resultReactionAt = now; + } + } + } + if (resultLaughAt && resultLaughStep < 5 && now >= resultLaughAt) { + playSine([760, 640, 700, 580, 500][resultLaughStep], .09); + playDrum("hat", .16, 0); + if (resultLaughStep === 0) emitSignal("victory-laugh", -1, 1, 0); + resultLaughAt = now + 112000 + resultLaughStep * 24000; + resultLaughStep++; + } + if (INSTANT_REPLAY && instantReplay) { + updateInstantReplay(now, dt); + return; + } + if (INSTANT_REPLAY) { + const replayDown = padSnapshots[0]?.down || []; + if (replayDown.includes("Y") && !replayOfferPrevious.includes("Y") && + startInstantReplay(now)) return; + replayOfferPrevious = replayDown.slice(); + } + const cinematicWinner = deathCinematic + ? players[deathCinematic.winnerPad] : null; + if (cinematicWinner?.alive) updatePlayer(cinematicWinner, + { connected: true, down: [], leftX: 0, leftY: 0 }, dt, now); + // Severed pieces belong to the action too; the result clock must not pin + // them in mid-air while the surviving body completes its landing. + updateBullets(dt, now, false); + updateGrenades(dt, now, false); + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + const resultDuration = matchOver ? matchResultUs : roundResultUs; + if (now - roundOverAt >= resultDuration) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSelfPlay(now); + // A versus result rolls straight into the next round while the rival's + // wire stays warm — the room, not the title, is home base. A finished + // match deals fresh, a finished round keeps the tally. + else if (versusActive() && versusChallengerFresh()) + startVersusFight(now, matchOver); + else if (versusActive()) beginVersusLobby(now); + else if (localVersusActive()) { + if (matchOver) startLocalVersus(now); + else resetRound(now, false); + } + else returnToTitle(now, "round-end"); + } + return; + } + if (PAL_SELECT && selecting) { + updateSelect(now); + return; + } + if (now - roundStartedAt < roundIntroDurationUs()) { + // The intro used to pass in silence — a reel that opens on the countdown + // opened on three mute seconds, and a player heard the round begin with + // nothing. Ring the "3, 2, 1" on the same two channels the round clock + // uses: the drum for the ear, the signal for the record. + const introSecond = Math.ceil( + (roundIntroDurationUs() - (now - roundStartedAt)) / 1000000); + if (introSecond !== lastIntroSecond) { + lastIntroSecond = introSecond; + // playDrum is the voice, the signal is the record — the "countdown" + // name is deliberately not in the sfx routes, or the web would voice + // every bell twice. value2 marks these as the intro's. + playDrum("bell", .72 + (3 - introSecond) * .12, 0); + emitSignal("countdown", -1, introSecond, 1); + } + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + if (lastIntroSecond > 0) { + // The first live tick after the intro is the mode opening — one accent, + // so the callout is a sound and not just a vanished word. + lastIntroSecond = -1; + playDrum("block", 1.1, 0); + if (survivalActive()) { + globalThis.__oskiewarStartLine = "climb!"; + emitSignal("climb", 0, 1, 0); + } else emitSignal("fighters-lock", -1, 0, 0); + } + roundElapsedUs += dt * 1000000; + const timedRound = roundIsTimed(); + if (timedRound) { + const countdownSecond = Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + if (countdownSecond > 0 && countdownSecond <= 10 && + countdownSecond !== lastCountdownSecond) { + lastCountdownSecond = countdownSecond; + playDrum("bell", 1 + (10 - countdownSecond) * .025, 0); + emitSignal("countdown", -1, countdownSecond, 0); + } + } + if (survivalActive()) { + updatePlayer(players[0], inputPads[0], dt, now); + updateSurvival(dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + } else { + updateWind(dt, now); + for (const player of players) updatePlayer(player, inputPads[player.pad], dt, now); + updateSkateRopes(dt); + resolvePlayerStanding(now); + resolvePlayerPushboxes(); + updateFallingPickups(dt, now); + updatePowerups(now); + updateBodyTrees(dt, now); + updateBullets(dt, now); + updateGrenades(dt, now); + resolveMelee(now); + resolvePogoAttacks(now); + updateLobbyMortality(now); + // After the exchange resolves, so a frame that landed a hit reads as the + // recovery it has become rather than as the active frame it was. + recordFrameMeter(now); + for (const item of balls) updateBall(item, dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + captureRoundReplay(now); + recordReplayCheckpoint(now); + trackResimDrift(now); + } + for (const impact of impacts) { + if (!impact.debris) { + // A fresh impact heats the tile it landed in. The debris check is the + // once-per-impact gate — the first sim tick is the only tick an impact + // exists without motes — so a hit stamps its cell exactly once, and + // the overlay on the back wall shows the fight's last half-second as + // cooling squares. + if (onGridField(impact.x, impact.y)) { + const cell = gridFieldIndex(impact.x, impact.y); + gridField[cell] = Math.min(1, gridField[cell] + + (impact.explosion ? 1 : impact.death ? .9 : .55)); + } + const count = impact.explosion ? 24 : impact.death ? 10 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.explosion + ? 1180 + (impact.power || 0) * 720 + : impact.death ? 660 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 260, + vz: Math.sin(angle * 1.7) * force * .22, + radius: impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; + mote.y += mote.vy * dt; + mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; + mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); + // The tile field cools between stamps — a fixed exponential against the + // fixed 60 Hz step, so a replayed round heats and fades identically. Cells + // snap to zero below a hundredth so a quiet map is exactly zeros. + for (let cell = 0; cell < gridField.length; cell++) + gridField[cell] = gridField[cell] < .01 ? 0 + : gridField[cell] * Math.exp(-dt * 1.6); + if (!survivalActive() && !lobbyActive() && + ((freeForAll() ? players.filter((player) => player.alive).length <= 1 + : players.some((player) => !player.alive)) || + (timedRound && roundElapsedUs >= roundDurationUs))) { + if (timedRound && roundElapsedUs >= roundDurationUs && + players.every((player) => player.alive)) + roundCause = "TIME"; + finishRound(now); + } +} + +function updateResultImpactDebris(dt) { + for (const impact of impacts) { + if (!impact.debris) { + const count = impact.death ? 20 : impact.explosion ? 24 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.death ? 920 : impact.explosion ? 1180 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 360, + vz: Math.sin(angle * 1.7) * force * .28, + radius: impact.death ? 7 : impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; mote.y += mote.vy * dt; mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); +} + +function circle(x, y, radius, width, color) { + let lastX = x + radius; + let lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + line(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; + lastY = nextY; + } +} + +// Discs are the piece's bulk geometry — every capsule end, every joint. The +// unit ring is constant, so the trig runs once at load, and fanning from a rim +// vertex covers the identical decagon in 8 faces instead of 10 from the center +// (cull is off, depth is flat, colors are flat — the rasterized pixels match). +// A silhouette only has to be as fine as its size on screen. A limb cap a few +// pixels across reads round at six sides; a head at ninety does not, and used +// to show its corners. Rings are precomputed per step so no trig runs inside a +// frame, and the small end is cheaper than the one fixed ring it replaces. +const discRings = [6, 8, 12, 16, 24, 32].map((sides) => { + const ring = []; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + ring.push(Math.cos(a), Math.sin(a)); + } + return ring; +}); +const discRingFor = (radius) => discRings[ + radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 + : radius < 52 ? 3 : radius < 110 ? 4 : 5]; + +function filledDisc(x, y, radius, color) { + const [r, g, b] = color; + if (typeof disc3d === "function" && disc3d(x, y, triangleDepth, radius, r, g, b)) return; + const ring = discRingFor(radius); + const originX = x + ring[0] * radius, originY = y + ring[1] * radius; + let lastX = x + ring[2] * radius, lastY = y + ring[3] * radius; + for (let side = 4; side < ring.length; side += 2) { + const nextX = x + ring[side] * radius; + const nextY = y + ring[side + 1] * radius; + screenTriangle(originX, originY, lastX, lastY, nextX, nextY, r, g, b); + lastX = nextX; + lastY = nextY; + } +} + +function filledRing(x, y, outerRadius, innerRadius, color) { + const [r, g, b] = color; + const sides = 14; + const inner = Math.max(0, Math.min(outerRadius, innerRadius)); + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + const outerA = { x: x + Math.cos(a) * outerRadius, + y: y + Math.sin(a) * outerRadius }; + const outerB = { x: x + Math.cos(b) * outerRadius, + y: y + Math.sin(b) * outerRadius }; + const innerA = { x: x + Math.cos(a) * inner, + y: y + Math.sin(a) * inner }; + const innerB = { x: x + Math.cos(b) * inner, + y: y + Math.sin(b) * inner }; + screenTriangle(outerA.x, outerA.y, innerA.x, innerA.y, + outerB.x, outerB.y, r, g, b); + screenTriangle(innerA.x, innerA.y, innerB.x, innerB.y, + outerB.x, outerB.y, r, g, b); + } +} + +function filledCapsule(x1, y1, x2, y2, width, color) { + const [r, g, b] = color; + const dx = x2 - x1; + const dy = y2 - y1; + const length = Math.hypot(dx, dy); + const radius = width / 2; + if (length < .001) { + filledDisc(x1, y1, radius, color); + return; + } + const nx = -dy / length * radius; + const ny = dx / length * radius; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + filledDisc(x1, y1, radius, color); + filledDisc(x2, y2, radius, color); +} + +// Xbox batches GPU triangles above its D2D line layer, so every bone and joint +// must share this triangle path. The wider silhouette pass and color pass form +// conventional rounded capsules without the native renderer reordering them. +function damagedPartColor(color, player, part) { + const damage = Number(player?.partDamage?.[part] || 0); + if (!damage) return color; + const durability = part === "torso" ? 3 : 2; + const amount = clamp(damage / durability * .92, 0, .92); + return mixColor(color, [244, 34, 50], amount); +} + +function generatedAppearance(player) { + const selected = globalThis.__oskiewarFighterAppearance; + if (!selected || Date.now() >= selected.validUntil || player?.pad !== 0 || player.npc || + netSession || roundViewer || versusLane() || survivalActive() || shellMode !== "GAME") return null; + return selected.appearance; +} +function generatedPartColor(appearance, segment) { + const role = segment.role || ""; + if (/foot/.test(role)) return appearance.shoes; + if (/thigh|shin|leg/.test(role)) return appearance.pants; + if (/forearm|hand/.test(role) && appearance.sleeves === "short") return appearance.skin; + return appearance.shirt; +} + +function drawSkeletonSegments(segments, color, outline, player = null) { + const edge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + if (player?.skateboard) segments = segments.slice().sort((a, b) => b.depth - a.depth); + for (const segment of segments) { + if (segment.hitboxOnly) continue; + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + edge * 2, outline); + } + for (const [index, segment] of segments.entries()) { + if (segment.hitboxOnly) continue; + const appearance = generatedAppearance(player); + drawPaletteCapsule(segment, appearance ? null : player && !player.npc + ? player.handleColors : null, index, appearance ? generatedPartColor(appearance, segment) : color, player); + } +} + +function paletteColorAt(colors, coordinate, fallback) { + if (!colors?.length) return fallback; + const wrapped = ((coordinate % colors.length) + colors.length) % colors.length; + const first = Math.floor(wrapped); + const second = (first + 1) % colors.length; + return mixColor(colors[first], colors[second], wrapped - first); +} + +function drawPaletteCapsule(segment, colors, coordinate, fallback, player = null) { + // The gradient's resolution is an experiment dial: six bands is the look, + // one band is a flat capsule at a third of the faces. + const bands = colors?.length > 1 + ? clamp(Math.round(renderFlags.bands ?? 6), 1, 6) : 1; + if (bands === 1) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width, damagedPartColor(fallback, player, segment.part)); + return; + } + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy) || 1; + const radius = segment.width / 2; + const nx = -dy / length * radius; + const ny = dx / length * radius; + let firstColor = fallback; + let lastColor = fallback; + for (let band = 0; band < bands; band++) { + const from = band / bands; + const to = (band + 1) / bands; + // A small overlap keeps the gradient continuous after integer projection. + const overlap = bands > 1 ? .012 : 0; + const x1 = lerp(segment.x1, segment.x2, Math.max(0, from - overlap)); + const y1 = lerp(segment.y1, segment.y2, Math.max(0, from - overlap)); + const x2 = lerp(segment.x1, segment.x2, Math.min(1, to + overlap)); + const y2 = lerp(segment.y1, segment.y2, Math.min(1, to + overlap)); + const mapped = paletteColorAt(colors, + coordinate + (from + to) * .5, fallback); + const color = damagedPartColor(mapped, player, segment.part); + if (band === 0) firstColor = color; + if (band === bands - 1) lastColor = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, ...color); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, ...color); + } + filledDisc(segment.x1, segment.y1, radius, firstColor); + filledDisc(segment.x2, segment.y2, radius, lastColor); +} + +function drawFighterSilhouette(geometry, color, outline, player = null) { + drawSkeletonSegments(geometry.segments, color, outline, player); + const headEdge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + // The neck connector and solid head are emitted into the same triangle + // silhouette pass, so the head cannot detach as a separate line-layer ring. + filledDisc(geometry.head.x, geometry.head.y, + geometry.head.radius + headEdge, outline); + // AC stores the @ glyph first; the face is the identity anchor for the same + // palette that distorts continuously across the body below it. + const appearance = generatedAppearance(player); + const headColor = appearance ? appearance.skin : player && !player.npc && player.handleColors?.length + ? player.handleColors[0] : color; + filledDisc(geometry.head.x, geometry.head.y, geometry.head.radius, headColor); + if (appearance) { + const { x, y, radius: r } = geometry.head; + if (appearance.hairStyle !== "none") { + filledCapsule(x - r * .7, y - r * .65, x + r * .7, y - r * .65, + r * (appearance.hairStyle === "curly" ? .75 : .48), appearance.hair); + if (appearance.hairStyle === "long") for (const side of [-1, 1]) + filledCapsule(x + side * r * .86, y - r * .3, x + side * r * .86, y + r * .85, r * .3, appearance.hair); + } + if (appearance.beard) filledCapsule(x - r * .4, y + r * .68, x + r * .4, y + r * .68, r * .4, appearance.hair); + if (appearance.glasses) { + for (const side of [-1, 1]) hudCircle(x + side * r * .34, y - r * .08, r * .23, Math.max(1, r * .08), [18, 20, 28]); + filledCapsule(x - r * .1, y - r * .08, x + r * .1, y - r * .08, Math.max(1, r * .06), [18, 20, 28]); + } + } + if (player && isHeadOnly(player)) { + // The shell rolls from distance travelled while the face is drawn later in + // stable screen space. A visible chord makes circular geometry's rotation + // readable without tumbling the eyes or changing their gaze. + const angle = player.x / Math.max(12, geometry.head.radius) + + player.facing * Math.PI * .18; + const reach = geometry.head.radius * .7; + const dx = Math.cos(angle) * reach; + const dy = Math.sin(angle) * reach; + filledCapsule(geometry.head.x - dx, geometry.head.y - dy, + geometry.head.x + dx, geometry.head.y + dy, + Math.max(2, geometry.head.radius * .1), mixColor(headColor, outline, .55)); + } +} + +function fighterAnimationPhase(player, now = null) { + const run = runtime(); + now ??= run.simMonotonicUs || run.monotonicUs; + let state = "IDLE"; + let stateStartedAt = startedAt; + if (!player.alive) { + state = "KO"; + stateStartedAt = player.headBustedAt || player.lastButtonAt || now; + } else if (now < player.hitStunUntil) { + state = "HIT"; + stateStartedAt = player.lastButtonAt || now; + } else if (roundResult && ["KICK", "PUNCH", "POSE", "DANCE", "DASH", + "JUMP", "CROUCH"].includes(player.resultReaction)) { + state = player.resultReaction === "POSE" || player.resultReaction === "DANCE" + ? "MEDITATE" : player.resultReaction; + stateStartedAt = player.resultReactionAt || now; + } else if (player.blocking) { + state = "SHIELD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.heldBall >= 0) { + state = "HOLD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.grabHeld) { + state = "REACH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.itemAction && now < player.itemActionUntil) { + state = player.itemAction; + stateStartedAt = player.itemActionStartedAt || now; + } else if (player.attackKind && now < player.attackUntil) { + state = player.attackKind; + stateStartedAt = player.attackStartedAt || now; + } else if (isPogo(player)) { + state = "POGO"; + } else if (now < player.sinkUntil) { + state = "SINK"; + stateStartedAt = player.sinkUntil - sinkDurationUs; + } else if (!player.grounded && now < player.hopUntil) { + state = "CROUCH HOP"; + stateStartedAt = player.hopUntil - crouchHopPoseUs; + } else if (player.ducking) { + state = player.grounded ? "CROUCH" : "AIR CROUCH"; + } else if (!player.grounded) { + state = player.vy < 0 ? "JUMP" : "FALL"; + stateStartedAt = player.jumpPoseUntil + ? player.jumpPoseUntil - (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs) + : player.lastButtonAt || now; + } else if (shellMode === "MENU" && titleAttractMode === "still") { + state = "MEDITATE"; + } else if (now < player.dashUntil) { + state = "DASH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.runSince) { + state = "RUN"; + stateStartedAt = player.runSince; + } else if (Math.abs(player.vx) > 40) { + state = "WALK"; + } + const [authoredSteps, authoredTicksPerStep, basePhase, loop] = + fighterAnimationSpecs[state] || fighterAnimationSpecs.IDLE; + const timing = meleeFrames[state]; + const steps = timing ? timing.startup+timing.active+timing.recovery : authoredSteps; + // Descending terrain advances planted-foot exchanges faster. The result is + // still integer-tick animation, but the legs keep pace with downhill speed + // instead of the body skating through a leisurely flat-ground cycle. + const travel = Math.sign(player.vx); + const downhill = player.grounded && travel + ? Math.max(0, terrainFloorAt(player.x + travel * 150) - + terrainFloorAt(player.x)) / 150 : 0; + const ticksPerStep = ["WALK", "RUN", "DASH"].includes(state) + ? Math.max(1, Math.round(authoredTicksPerStep / + (1 + downhill * 1.9 + Math.min(1, Math.abs(player.vx) / 1800) * .28))) + : authoredTicksPerStep; + const rawTick = Math.max(0, + Math.floor((now - stateStartedAt) / replayTickUs)); + const rawStep = Math.floor(rawTick / ticksPerStep); + const step = loop ? rawStep % steps : Math.min(steps - 1, rawStep); + let phase = basePhase; + if (timing) phase = meleeFrame(player,now).phase.toUpperCase(); + else if (["FIRE", "THROW", "REACH"].includes(state)) { + const section = step / Math.max(1, steps - 1); + phase = section < .3 ? "STARTUP" : section < .68 ? "ACTIVE" : "RECOVERY"; + } else if (state === "JUMP" || state === "FALL") { + phase = Math.abs(player.vy) < 150 ? "APEX" : state === "JUMP" + ? "ASCEND" : "DESCEND"; + } + // `frameNow` is the clock, not the cycle. It has to keep climbing with real + // time — the looping states anchor `stateStartedAt` at match start, so a + // cycle-position clock wraps back to the first second forever and every + // "is this timestamp still in the future" test answers yes for the rest of + // the round. That is what pinned a landed fighter in the crouch pose and + // froze the legs. Quantizing to the tick grid keeps the pose on the sim's + // 60 Hz phase without inventing in-between frames. + return { state, phase, step: step + 1, steps, tick: rawTick, + ticksPerStep, progress: step / Math.max(1, steps - 1), + frameNow: stateStartedAt + rawTick * replayTickUs }; +} + +// Only share poses during one interpolated paint. Simulation and rollback +// always rebuild, because a hit may change limbs between queries in one tick. +const renderPoses = new Map(); +let sharingRenderPoses = false; +function runnerWorldGeometry(player, t) { + const cached = sharingRenderPoses && renderPoses.get(player); + if (cached && (!player.spiderDummy || cached.t === t)) return cached.pose; + const pose = buildRunnerWorldGeometry(player, t); + if (player.skateRotation) { + const c = Math.cos(player.skateRotation), s = Math.sin(player.skateRotation); + const rotate = (x, y) => ({ x: player.x + (x - player.x) * c - (y - player.y) * s, + y: player.y + (x - player.x) * s + (y - player.y) * c }); + Object.assign(pose.head, rotate(pose.head.x, pose.head.y)); + for (const segment of pose.segments) { + const a = rotate(segment.x1, segment.y1), b = rotate(segment.x2, segment.y2); + segment.x1 = a.x; segment.y1 = a.y; segment.x2 = b.x; segment.y2 = b.y; + } + } + if (sharingRenderPoses) renderPoses.set(player, { t, pose }); + return pose; +} + +function buildRunnerWorldGeometry(player, t, at = null) { + if (player.spiderDummy) return spiderDummyWorldGeometry(player, t); + // Rendering consumes the same fixed 60 Hz phase clock as simulation. The + // display can remain uncapped without inventing in-between combat poses. + const animation = fighterAnimationPhase(player, at); + const poseNow = animation.frameNow; + const poseCycle = animation.progress * Math.PI * 2; + const speed = Math.min(1, Math.abs(player.vx) / 1500); + const meditating = shellMode === "MENU" && titleTransitionAt === null && + titleAttractMode === "still"; + const idle = player.grounded && !player.ducking && speed < .03; + const breath = idle ? Math.sin(poseCycle + player.pad * .7) * 5 : 0; + const idleSway = idle ? Math.sin(poseCycle + player.pad) * 7 : 0; + const stride = Math.sin(poseCycle + player.pad * Math.PI) * + 32 * speed; + const pogo = isPogo(player); + const headOnly = isHeadOnly(player); + const noLegs = !hasPart(player, "left-leg") && + !hasPart(player, "right-leg") && !headOnly; + const jumpAnticipation = player.jumpLaunchAt > poseNow + ? clamp(1 - (player.jumpLaunchAt - poseNow) / jumpAnticipationUs, 0, 1) : 0; + const landingRecovery = player.landPoseUntil > poseNow + ? clamp((player.landPoseUntil - poseNow) / 110000, 0, 1) : 0; + const crouchPose = clamp(Math.max(player.crouchBlend || 0, + Math.sin(jumpAnticipation * Math.PI) * .72, + landingRecovery * .45, noLegs ? .45 : 0), 0, 1); + const height = lerp(180, 108, crouchPose); + const formDrop = pogo ? 54 : noLegs ? 31 : 0; + const aimPose = player.itemAimLocked || player.gunAimLive + ? player.gunAimX || player.facing : 0; + const lean = player.facing * (idle ? 5 : 3 + speed * 10) + aimPose * 7; + const x = player.x; + const feet = player.y; + const z = player.z; + // With neither leg present the pelvis itself becomes the ground contact. + // Keeping its capsule tangent to the floor prevents a floating torso pose. + const hipY = noLegs ? feet - 5 + : feet - lerp(58, 40, crouchPose) + formDrop; + const neckX = x + lean; + const neckY = feet - height + 54 - breath + formDrop + + (player.itemAimLocked || player.gunAimLive + ? (player.gunAimY || 0) * 8 : 0); + const attackPulse = meleePulse(player, poseNow); + const head = headOnly + ? { x, y: feet - 22, z, radius: 22 } + : { x: neckX + lean * .2, + y: feet - height + 22 - breath * 1.6 + formDrop, z, radius: 22 }; + const segments = []; + // `startMelee` and `heldItem` both gate on `itemHand`, so the drawn striking + // arm has to name that same part. Naming it by facing alone tagged the + // reaching capsules with the opposite arm the moment a fighter turned around + // while armed — shooting off one arm then erased the other one's limb. + const actionArm = itemHand(player) || + (player.facing > 0 ? "right-arm" : "left-arm"); + const rearArm = actionArm === "right-arm" ? "left-arm" : "right-arm"; + const actionLeg = player.facing > 0 ? "right-leg" : "left-leg"; + const rearLeg = actionLeg === "right-leg" ? "left-leg" : "right-leg"; + const partForRole = (role, startX) => { + if (["neck", "torso", "shoulders"].includes(role)) return "torso"; + if (role.startsWith("attack-") || role.startsWith("item-")) + return role.includes("arm") || role.includes("forearm") + ? actionArm : actionLeg; + if (role.startsWith("rest-")) return rearArm; + if (role.startsWith("lead-")) return actionLeg; + if (role.startsWith("rear-")) + return role.includes("arm") || role.includes("forearm") + ? rearArm : rearLeg; + if (role.startsWith("grab-")) + return startX <= neckX ? "left-arm" : "right-arm"; + if (role.startsWith("left-")) + return role.includes("arm") || role.includes("forearm") + ? "left-arm" : "left-leg"; + if (role.startsWith("right-")) + return role.includes("arm") || role.includes("forearm") + ? "right-arm" : "right-leg"; + return "torso"; + }; + const segment = (x1, y1, x2, y2, width, role = "body") => { + const part = partForRole(role, x1); + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1: z, x2, y2, z2: z, width, role, part }); + }; + const twoBone = (startX, startY, targetX, targetY, length, bend) => { + let dx = targetX - startX; + let dy = targetY - startY; + let distance = Math.hypot(dx, dy) || 1; + const maximum = length * 1.94; + if (distance > maximum) { + targetX = startX + dx / distance * maximum; + targetY = startY + dy / distance * maximum; + dx = targetX - startX; + dy = targetY - startY; + distance = maximum; + } + const middleX = (startX + targetX) / 2; + const middleY = (startY + targetY) / 2; + const height = Math.sqrt(Math.max(0, length * length - + distance * distance / 4)); + return { jointX: middleX - dy / distance * height * bend, + jointY: middleY + dx / distance * height * bend, + targetX, targetY }; + }; + // Where a grounded foot may actually plant. The bare terrain probe reads + // the arena floor, so a fighter standing on a rung planted his feet a + // storey down and the shins stretched to reach — the long legs @jeffrey + // called out. The probe now asks for the surface the fighter is actually + // standing on, and a foot hanging past a rung's lip stops at the leg's own + // reach — a short dangle — instead of the floor below. + const footPlant = (footX) => Math.min(surfaceYAt(footX, feet), feet + 20); + segment(head.x, head.y + head.radius * .78, neckX, neckY, 10, "neck"); + segment(neckX, neckY, x, hipY, 10, "torso"); + // An elbow sags downward whichever way the hand actually reaches. Bending + // by facing alone flipped the joint whenever a hand crossed behind the + // body — the crossed, double-elbowed arms @jeffrey called out. + const armBend = (shoulderX, targetX) => targetX >= shoulderX ? 1 : -1; + const shoulderY = neckY + 11; + const shoulderSpread = 12; + const leftShoulderX = neckX - shoulderSpread; + const rightShoulderX = neckX + shoulderSpread; + // The working hand always reaches out front and the idle one always trails + // behind, so both shoulders follow facing. Anchoring them on the arm that + // owns the item instead meant a fighter who armed himself facing right and + // then turned around hung his reaching arm off the rear shoulder and his + // trailing arm off the front one: the pair crossed once at the neck and + // again past the elbows, boxing the double diamond @jeffrey called out. + const actionShoulderX = neckX + player.facing * shoulderSpread; + const restShoulderX = neckX - player.facing * shoulderSpread; + segment(leftShoulderX, shoulderY, rightShoulderX, shoulderY, 10, + "shoulders"); + if (player.attackKind === "KICK" && attackPulse > 0) { + const target = meleeTarget(player, poseNow); + const lowKick = player.lowKick; + const leg = twoBone(x, hipY, target.x, target.y, + meleeSpecs.KICK.span, lowKick ? player.facing * .35 : -player.facing); + segment(x, hipY, leg.jointX, leg.jointY, 12, "attack-thigh"); + segment(leg.jointX, leg.jointY, leg.targetX, leg.targetY, 12, + "attack-shin"); + segment(x, hipY, x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), 10, "rear-thigh"); + segment(x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), x - player.facing * 8, feet, + 10, "rear-shin"); + } else if (meditating) { + segment(x, hipY, x - 48, feet - 12, 11, "left-thigh"); + segment(x - 48, feet - 12, x + 8, feet, 11, "left-shin"); + segment(x, hipY, x + 48, feet - 12, 11, "right-thigh"); + segment(x + 48, feet - 12, x - 8, feet, 11, "right-shin"); + } else if (player.skateboard) { + // The deck is drawn tilted along the terrain, so each foot plants on + // the deck's own top at its x — flat foot heights ran the board + // through the shins on every slope. + const deckAt = (footX) => footPlant(footX) - 6; + const plantedX = x + player.facing * 28; + const push = Math.sin(poseCycle) * 34; + const leadFootX = plantedX + player.facing * 18; + segment(x, hipY, plantedX, deckAt(plantedX) - 21, 11, "lead-thigh"); + segment(plantedX, deckAt(plantedX) - 21, leadFootX, + deckAt(leadFootX), 11, "lead-shin"); + const pushKnee = x - player.facing * (22 + push * .3); + const pushFootX = x - player.facing * (46 + Math.max(0, push)); + segment(x, hipY, pushKnee, deckAt(pushKnee) - 25, 10, "rear-thigh"); + segment(pushKnee, deckAt(pushKnee) - 25, pushFootX, + deckAt(pushFootX), 10, "rear-shin"); + } else if (crouchPose > .08) { + segment(x, hipY, x - 36, feet - 22, 10, "left-thigh"); + segment(x - 36, feet - 22, x - 4, feet, 10, "left-shin"); + segment(x, hipY, x + 36, feet - 22, 10, "right-thigh"); + segment(x + 36, feet - 22, x + 58, feet, 10, "right-shin"); + } else if (player.grounded) { + // The facing-side foot is visibly planted forward even at rest. + const leadKnee = x + player.facing * 18 + stride * .38; + const leadFoot = x + player.facing * 42 + stride; + const rearKnee = x - player.facing * 16 - stride * .38; + const rearFoot = x - player.facing * 28 - stride; + // The animation phase still chooses the discrete stride; ground probes + // constrain that frame onto the surface underfoot without new sim steps. + const leadGround = footPlant(leadFoot); + const rearGround = footPlant(rearFoot); + segment(x, hipY, leadKnee, leadGround - 30, 10, "lead-thigh"); + segment(leadKnee, leadGround - 30, leadFoot, leadGround, 10, "lead-shin"); + segment(x, hipY, rearKnee, rearGround - 30, 10, "rear-thigh"); + segment(rearKnee, rearGround - 30, rearFoot, rearGround, 10, "rear-shin"); + } else { + segment(x, hipY, x - 32, feet - 32, 10, "left-thigh"); + segment(x - 32, feet - 32, x - 7, feet - 11, 10, "left-shin"); + segment(x, hipY, x + 32, feet - 43, 10, "right-thigh"); + segment(x + 32, feet - 43, x + 50, feet - 22, 10, "right-shin"); + } + const arm = idle ? idleSway : player.grounded ? -stride * .7 : 12; + const elbowY = feet - lerp(94, 76, crouchPose) - breath; + const handY = feet - lerp(65, 50, crouchPose) - breath * .5; + const actionNow = poseNow; + const armAttack = attackPulse > 0 && player.attackKind && + player.attackKind !== "KICK"; + if (player.skateboard && player.grounded && !armAttack && !heldItem(player)) { + const balance = Math.sin(poseCycle) * 18; + segment(leftShoulderX, shoulderY, x - 42, elbowY - 10 - balance, + 10, "left-upper-arm"); + segment(x - 42, elbowY - 10 - balance, x - 66, handY - balance, + 10, "left-forearm"); + segment(rightShoulderX, shoulderY, x + 42, elbowY - 10 + balance, + 10, "right-upper-arm"); + segment(x + 42, elbowY - 10 + balance, x + 66, handY + balance, + 10, "right-forearm"); + } else if (player.grabHeld || player.ropeIndex >= 0) { + const held = player.heldBall >= 0 ? balls[player.heldBall] : null; + const clutchX = player.ropeIndex >= 0 ? x : held?.x ?? x + player.facing * 126; + const clutchY = player.ropeIndex >= 0 ? feet - 125 : held?.y ?? feet - 92; + const spread = held ? Math.max(12, held.radius * .34) : 20; + const hands = [ + { shoulderX: leftShoulderX, x: clutchX - player.facing * 5, + y: clutchY - spread }, + { shoulderX: rightShoulderX, x: clutchX - player.facing * 5, + y: clutchY + spread }, + ]; + for (const hand of hands) { + const pose = twoBone(hand.shoulderX, shoulderY, + hand.x, hand.y, 58, armBend(hand.shoulderX, hand.x)); + segment(hand.shoulderX, shoulderY, pose.jointX, pose.jointY, 12, + "grab-upper-arm"); + segment(pose.jointX, pose.jointY, pose.targetX, pose.targetY, 12, + "grab-forearm"); + } + } else if (armAttack) { + // The striking arm outranks the carry pose: a whip or bash has to publish + // attack capsules or an armed fighter could never land a hand strike. + const target = meleeTarget(player, poseNow); + const armPose = twoBone(actionShoulderX, shoulderY, target.x, target.y, + meleeSpecFor(player, player.attackKind).span, + armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "attack-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "attack-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else if ((player.itemAction && actionNow < player.itemActionUntil) || + (player.gunAmmo > 0 && player.itemAction !== "THROW")) { + const target = itemHandTarget(player, actionNow); + const armPose = twoBone(actionShoulderX, shoulderY, + target.x, target.y, 58, armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "item-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "item-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else { + segment(leftShoulderX, shoulderY, x - 30 + arm * .45, elbowY, 10, + "left-upper-arm"); + segment(x - 30 + arm * .45, elbowY, x - 36 + arm * .6, handY, 10, + "left-forearm"); + segment(rightShoulderX, shoulderY, x + 30 - arm * .45, elbowY, 10, + "right-upper-arm"); + segment(x + 30 - arm * .45, elbowY, x + 36 - arm * .6, handY, 10, + "right-forearm"); + } + if (player.skateboard && !headOnly) { + const deck = skateFrame(player); + const pitch = (player.skatePitch || 0) * .35; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const transform = (px, py, depth) => ({ + x: x + (px - x) * c - (py - feet) * sn, + y: feet - skateAxleDrop - skateWheelRadius + (px - x) * sn + (py - feet) * c, + z: z + depth, + }); + Object.assign(head, transform(head.x, head.y, 0)); + for (const bone of segments) { + const side = bone.part.startsWith("left-") ? -1 : bone.part.startsWith("right-") ? 1 : 0; + const depth = side * (bone.part.includes("arm") ? 15 : 9); + const a = transform(bone.x1, bone.y1, depth); + const b = transform(bone.x2, bone.y2, depth); + if (bone.role === "shoulders") { + a.z = z - 15; + b.z = z + 15; + } + Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, x2: b.x, y2: b.y, z2: b.z }); + } + if (player.attackKind !== "KICK" || !attackPulse) { + for (const [role, direction, part] of [["lead", player.facing, actionLeg], + ["rear", -player.facing, rearLeg]]) { + if (!hasPart(player, part)) continue; + const side = part === "left-leg" ? -1 : 1; + const hip = transform(x, hipY, side * 7); + const foot = deck(direction * skateTruck, -4, side * 9); + const dx = foot.x - hip.x, dy = foot.y - hip.y, dz = foot.z - hip.z; + const distance = Math.hypot(dx, dy, dz) || 1; + const length = Math.max(48, distance / 1.98); + const bend = Math.sqrt(Math.max(0, length * length - distance * distance / 4)); + const norm = Math.hypot(dx, dy) || 1; + const knee = { x: (hip.x + foot.x) / 2 + dy / norm * bend * player.facing, + y: (hip.y + foot.y) / 2 - dx / norm * bend * player.facing, + z: (hip.z + foot.z) / 2 }; + const thigh = segments.find((bone) => bone.role === role + "-thigh"); + const shin = segments.find((bone) => bone.role === role + "-shin"); + for (const [bone, a, b] of [[thigh, hip, knee], [shin, knee, foot]]) + if (bone) Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, + x2: b.x, y2: b.y, z2: b.z }); + } + } + } + return { head, segments }; +} + +// The first spider dummy deliberately shares the inert dummy controller. Its +// threat is physical scale: four independently destructible leg-pairs spread +// across a daddy-long-legs silhouette around one large central body. +function spiderDummyWorldGeometry(player, t) { + const x = player.x; + const feet = player.y; + const z = player.z; + const bodyY = feet - 176; + const sway = Math.sin(t * 1.7 + player.pad) * 5; + const head = { x, y: bodyY + sway, z, radius: 22 }; + const segments = []; + const add = (x1, y1, x2, y2, width, role, part, + z1 = z, z2 = z, hitboxOnly = false) => { + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1, x2, y2, z2, width, role, part, hitboxOnly }); + }; + add(x - 42, bodyY, x + 42, bodyY, 38, "torso", "torso"); + add(x, bodyY - 30, x, bodyY + 31, 34, "spider-body", "torso"); + const legs = [ + [-1, -1], [-1, -.55], [-1, .25], [-1, .72], + [1, -1], [1, -.55], [1, .25], [1, .72], + ]; + for (let index = 0; index < legs.length; index++) { + const [side, lane] = legs[index]; + const part = spiderLegParts[index]; + const rootX = x + side * 31; + const rootY = bodyY + lane * 31 + sway; + const lift = 34 + Math.abs(lane) * 28; + const depthLane = (index - 3.5) * 72; + const points = [ + [rootX, rootY, z + depthLane * .2], + [x + side * 76, bodyY - lift, z + depthLane * .48], + [x + side * 126, bodyY - lift * .42, z + depthLane * .72], + [x + side * 171, bodyY + 24 + Math.abs(lane) * 19, z + depthLane], + [x + side * 211, feet - 51 - (index % 2) * 12, z + depthLane * 1.08], + [x + side * 246, feet, z + depthLane], + ]; + for (let joint = 0; joint < points.length - 1; joint++) { + const [x1, y1, z1] = points[joint]; + const [x2, y2, z2] = points[joint + 1]; + add(x1, y1, x2, y2, 13 - joint, + `spider-leg-${index + 1}-segment-${joint + 1}`, part, z1, z2); + } + // One broad top-level combat proxy per complete leg keeps the boss + // readable to melee even though the visible joints fan through Z. + add(rootX, rootY, points.at(-1)[0], points.at(-1)[1], 32, + `spider-hitbox-${index + 1}`, part, z, z, true); + } + return { head, segments }; +} + +function runnerGeometry(player, t) { + return projectRunnerWorldGeometry(runnerWorldGeometry(player, t)); +} + +function projectRunnerWorldGeometry(world) { + const headPoint = projectPoint(world.head.x, world.head.y, world.head.z); + return { + head: { x: headPoint.x, y: headPoint.y, + radius: Math.max(1.5, world.head.radius * cameraScale()) }, + segments: world.segments.map((segment) => { + const a = projectPoint(segment.x1, segment.y1, segment.z1); + const b = projectPoint(segment.x2, segment.y2, segment.z2); + return { x1: a.x, y1: a.y, x2: b.x, y2: b.y, depth: (a.z + b.z) / 2, + width: Math.max(1.5, segment.width * cameraScale()), + role: segment.role, part: segment.part, + hitboxOnly: segment.hitboxOnly }; + }), + }; +} + +function runnerBounds(player, t) { + const geometry = runnerWorldGeometry(player, t); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function runnerScreenBounds(player, t) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + const geometry = projectRunnerWorldGeometry(world); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function fighterContainmentRequiredWidth(t) { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + const include = (x, y, radius) => { + left = Math.min(left, x - radius); + right = Math.max(right, x + radius); + top = Math.min(top, y - radius); + bottom = Math.max(bottom, y + radius); + }; + for (const player of activePlayers()) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + include(world.head.x, world.head.y, world.head.radius); + for (const segment of world.segments) { + const radius = segment.width / 2; + include(segment.x1, segment.y1, radius); + include(segment.x2, segment.y2, radius); + } + } + return Math.max(rectPackWidth({ left, right, top, bottom }), + frameFloorWidth()); +} + +// Final render invariant: both complete animated fighter geometries must fit +// inside the action-safe viewport. Camera modes may orbit or focus, but this +// aspect-aware correction recenters their shared frame and moves the dolly +// back far enough for landscape, portrait, live, and replay projection alike. +function containFighters(t) { + if (skateparkMap && !survivalActive()) return; + const gameplayContainment = !roundResult && + runtime().monotonicUs - roundStartedAt >= roundIntroDurationUs(); + if (gameplayContainment) { + cameraContainFloor = Math.max(cameraContainFloor, + fighterContainmentRequiredWidth(t) * 1.11); + return; + } + const worlds = activePlayers().map((player) => player.replayGeometry || + player.frozenGeometry || runnerWorldGeometry(player, t)); + if (!worlds.length) return; + const points = []; + for (const world of worlds) { + const { head } = world; + points.push( + { x: head.x - head.radius, y: head.y, z: head.z }, + { x: head.x + head.radius, y: head.y, z: head.z }, + { x: head.x, y: head.y - head.radius, z: head.z }, + { x: head.x, y: head.y + head.radius, z: head.z }, + ); + for (const segment of world.segments) { + const radius = segment.width / 2; + for (const endpoint of [ + { x: segment.x1, y: segment.y1, z: segment.z1 }, + { x: segment.x2, y: segment.y2, z: segment.z2 }, + ]) { + points.push( + { x: endpoint.x - radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x + radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y - radius, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y + radius, z: endpoint.z }, + ); + } + } + } + const minX = Math.min(...points.map((point) => point.x)); + const maxX = Math.max(...points.map((point) => point.x)); + const minY = Math.min(...points.map((point) => point.y)); + const maxY = Math.max(...points.map((point) => point.y)); + // Keep the smoothly tracked root target. Animated limb extrema are allowed + // to affect containment scale, but never camera aim. + const target = cameraDoll.target; + + const safe = actionSafeRect(); + const safeWidth = Math.max(1, safe.right - safe.left); + const safeHeight = Math.max(1, safe.bottom - safe.top); + const requiredWidth = Math.max( + rectPackWidth({ left: minX, right: maxX, top: minY, bottom: maxY }), + frameFloorWidth()); + if (requiredWidth > cameraDoll.width) { + const amount = requiredWidth / Math.max(1, cameraDoll.width) * 1.04; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + + // Perspective and z-depth can make the world-space estimate asymmetric. + // Iteratively measure the actual projection and expand along the existing + // camera ray until every point satisfies the screen-space safe rectangle. + const centerX = (safe.left + safe.right) / 2; + const centerY = (safe.top + safe.bottom) / 2; + for (let pass = 0; pass < 4; pass++) { + cameraDoll.dirty = true; + cameraDoll.prepare(); + const projected = points.map((point) => cameraDoll.project(point)); + const left = Math.min(...projected.map((point) => point.x)); + const right = Math.max(...projected.map((point) => point.x)); + const top = Math.min(...projected.map((point) => point.y)); + const bottom = Math.max(...projected.map((point) => point.y)); + const factor = Math.max(1, + (centerX - left) / (safeWidth / 2), + (right - centerX) / (safeWidth / 2), + (centerY - top) / (safeHeight / 2), + (bottom - centerY) / (safeHeight / 2)); + if (factor <= 1.001) break; + const amount = factor * 1.025; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + cameraDoll.dirty = true; +} + +function resolveRunnerBounds(player, t) { + // Walls use a stable pushbox independent of the character renderer. + const halfWidth = isHeadOnly(player) ? 24 : isPogo(player) ? 38 + : player.ducking ? 76 : 62; + const leftWall = worldLeft + wallThickness; + const rightWall = worldRight - wallThickness; + if (player.x - halfWidth < leftWall) { + player.x = leftWall + halfWidth; + if (player.skateboard && player.grounded && player.skateVx < -900) { + player.skateWallSide = -1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, -1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx < 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.max(0, player.vx); + player.knockVx = Math.max(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + if (player.x + halfWidth > rightWall) { + player.x = rightWall - halfWidth; + if (player.skateboard && player.grounded && player.skateVx > 900) { + player.skateWallSide = 1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, 1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx > 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.min(0, player.vx); + player.knockVx = Math.min(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + const ceiling = (survivalActive() ? survivalCeilingY : ceilingY) + + wallThickness; + const standingTop = runnerBounds(player, t).top; + if (!airRoundActive() && standingTop < ceiling) { + player.y += ceiling - standingTop; + if (player.vy < 0) player.vy = isHeadOnly(player) ? -player.vy * .62 : 0; + } +} + +function pointSegmentDistance(px, py, pz, segment) { + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const dz = segment.z2 - segment.z1; + const lengthSquared = dx * dx + dy * dy + dz * dz; + const amount = lengthSquared > 0 + ? Math.max(0, Math.min(1, + ((px - segment.x1) * dx + (py - segment.y1) * dy + + (pz - segment.z1) * dz) / lengthSquared)) + : 0; + return Math.hypot(px - (segment.x1 + dx * amount), + py - (segment.y1 + dy * amount), pz - (segment.z1 + dz * amount)); +} + +// Closest points for loose debris, independent of the character renderer. +function segmentSegmentClosest(first, second) { + const d1x = first.x2 - first.x1; + const d1y = first.y2 - first.y1; + const d1z = first.z2 - first.z1; + const d2x = second.x2 - second.x1; + const d2y = second.y2 - second.y1; + const d2z = second.z2 - second.z1; + const rx = first.x1 - second.x1; + const ry = first.y1 - second.y1; + const rz = first.z1 - second.z1; + const a = d1x * d1x + d1y * d1y + d1z * d1z; + const e = d2x * d2x + d2y * d2y + d2z * d2z; + const b = d1x * d2x + d1y * d2y + d1z * d2z; + const c = d1x * rx + d1y * ry + d1z * rz; + const f = d2x * rx + d2y * ry + d2z * rz; + const epsilon = .000000001; + let firstAmount = 0; + let secondAmount = 0; + if (a <= epsilon && e <= epsilon) { + firstAmount = 0; + secondAmount = 0; + } else if (a <= epsilon) { + secondAmount = clamp(f / e, 0, 1); + } else if (e <= epsilon) { + firstAmount = clamp(-c / a, 0, 1); + } else { + const denominator = a * e - b * b; + firstAmount = Math.abs(denominator) > epsilon + ? clamp((b * f - c * e) / denominator, 0, 1) : 0; + const secondNumerator = b * firstAmount + f; + if (secondNumerator < 0) { + secondAmount = 0; + firstAmount = clamp(-c / a, 0, 1); + } else if (secondNumerator > e) { + secondAmount = 1; + firstAmount = clamp((b - c) / a, 0, 1); + } else secondAmount = secondNumerator / e; + } + const firstPoint = { + x: first.x1 + d1x * firstAmount, + y: first.y1 + d1y * firstAmount, + z: first.z1 + d1z * firstAmount, + }; + const secondPoint = { + x: second.x1 + d2x * secondAmount, + y: second.y1 + d2y * secondAmount, + z: second.z1 + d2z * secondAmount, + }; + return { firstPoint, secondPoint, + distance: Math.hypot(firstPoint.x - secondPoint.x, + firstPoint.y - secondPoint.y, firstPoint.z - secondPoint.z) }; +} + + +function meleeLimbContact(attacker, target, t) { + const now = runtime().simMonotonicUs || runtime().monotonicUs; + return combatBoxContact(sampleCombatBoxes(attacker, now), sampleCombatBoxes(target, now)); +} + +// World-space rectangles with a shallow Z interval. Visual line width never +// changes these authored radii. The same records feed collision, Tab and Jev. +function combatRect(id, left, top, right, bottom, z = 0, depth = 18, extra = {}) { + return { id, left, top, right, bottom, near: z - depth, far: z + depth, ...extra }; +} +function boxesOverlap(a, b) { + return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && + a.bottom >= b.top && a.near <= b.far && a.far >= b.near; +} +function boxBounds(items) { + return { left: Math.min(...items.map(b => b.left)), right: Math.max(...items.map(b => b.right)), + top: Math.min(...items.map(b => b.top)), bottom: Math.max(...items.map(b => b.bottom)), + near: Math.min(...items.map(b => b.near)), far: Math.max(...items.map(b => b.far)) }; +} +function buildBoxTree(items) { + if (!items.length) return null; + const bounds = boxBounds(items); + if (items.length <= 3) return { bounds, items }; + const horizontal = bounds.right - bounds.left >= bounds.bottom - bounds.top; + const sorted = items.slice().sort((a,b) => horizontal + ? (a.left+a.right)-(b.left+b.right) : (a.top+a.bottom)-(b.top+b.bottom)); + const middle = Math.floor(sorted.length / 2); + return { bounds, children: [buildBoxTree(sorted.slice(0,middle)), buildBoxTree(sorted.slice(middle))] }; +} +function queryBoxTree(tree, area, found = []) { + if (!tree || !boxesOverlap(tree.bounds, area)) return found; + if (tree.items) for (const item of tree.items) { if (boxesOverlap(item, area)) found.push(item); } + else for (const child of tree.children) queryBoxTree(child, area, found); + return found; +} +function pointBoxDistance(box, x, y, z = 0) { + return Math.hypot(Math.max(box.left-x,0,x-box.right), + Math.max(box.top-y,0,y-box.bottom), Math.max(box.near-z,0,z-box.far)); +} +// Slab test on an expanded AABB: a fast projectile cannot skip a thin hurtbox. +function segmentBoxEntry(segment, box, radius = 0) { + let enter = 0, leave = 1; + for (const [axis,low,high] of [['x','left','right'],['y','top','bottom'],['z','near','far']]) { + const origin = segment[axis+'1'], delta = segment[axis+'2']-origin; + if (Math.abs(delta)<1e-9) { + if (originbox[high]+radius) return null; + } else { + const a=(box[low]-radius-origin)/delta,b=(box[high]+radius-origin)/delta; + enter=Math.max(enter,Math.min(a,b));leave=Math.min(leave,Math.max(a,b)); + if(enter>leave)return null; + } + } + return enter; +} +function sweptProjectileContact(segments,target,t) { + const now=runtime().simMonotonicUs || runtime().monotonicUs; + const boxes=sampleCombatBoxes(target,now); + let result=null; + for(const s of segments) { + const r=s.width/2; + const area=combatRect('sweep',Math.min(s.x1,s.x2)-r,Math.min(s.y1,s.y2)-r, + Math.max(s.x1,s.x2)+r,Math.max(s.y1,s.y2)+r,(s.z1+s.z2)/2,Math.abs(s.z2-s.z1)/2+r); + for(const hurt of queryBoxTree(boxes.tree,area)) { + const amount=segmentBoxEntry(s,hurt,r); + if(amount===null || (result && amount>=result.amount))continue; + result={amount,x:s.x1+(s.x2-s.x1)*amount,y:s.y1+(s.y2-s.y1)*amount, + z:s.z1+(s.z2-s.z1)*amount,separation:0,headshot:hurt.part==='head',segmentIndex:hurt.segmentIndex}; + } + } + return result; +} +function combatPushbox(player) { + const half = isHeadOnly(player) ? 24 : isPogo(player) ? 38 : 69; + const height = isHeadOnly(player) ? 44 : isPogo(player) ? 116 : player.ducking ? 118 : 180; + return combatRect('push', player.x-half, player.y-height, player.x+half, player.y, player.z); +} +function sampleCombatBoxes(player, now, world = null, buildTree = true) { + world ||= runnerWorldGeometry(player, (now-startedAt)/1e6); + const hurt = []; + const head = world.head; + hurt.push(combatRect('head', head.x-22, head.y-22, head.x+22, head.y+22, head.z, 22, + { part: 'head', segmentIndex: -1 })); + for (let i=0; is.role==='torso'); + if(torso)hit.push(combatRect('pogo',torso.x2-10,torso.y2-10, + torso.x2+10,torso.y2+10,torso.z2,10,{part:'torso'})); + } + if (player.alive && !player.attackHit && !player.blocking && now >= player.hitStunUntil && + frame.phase === 'active' && !isHeadOnly(player) && !isPogo(player)) { + const kick = player.attackKind === 'KICK'; + const part = kick ? player.facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (part && hasPart(player, part)) { + const tip = meleeTarget(player, now); + const halfX = kick ? 26 : 22; + const halfY = kick && player.lowKick ? 17 : 20; + const inner = player.x+player.facing*(kick ? 42 : 30); + const outer = tip.x+player.facing*halfX; + hit.push(combatRect(player.attackKind.toLowerCase(), Math.min(inner,outer), + tip.y-halfY, Math.max(inner,outer), tip.y+halfY, tip.z, 18, { part })); + } + } + const guard = []; + if (player.blocking) { + const shield = shieldGeometry(player); + guard.push(combatRect('guard', shield.x-shield.radius, shield.y-shield.radius, + shield.x+shield.radius, shield.y+shield.radius, shield.z, shield.radius)); + } + return { hurt, hit, guard, push: combatPushbox(player), frame, + tree: buildTree ? buildBoxTree(hurt) : null }; +} +function combatBoxContact(attacker, target) { + let result = null; + for (const hit of attacker.hit) { + const overlaps = queryBoxTree(target.tree, hit).sort((a,b) => + (a.part === 'head' ? -1 : b.part === 'head' ? 1 : a.segmentIndex-b.segmentIndex)); + const hurt = overlaps[0]; + if (!hurt) continue; + result = { x:(Math.max(hit.left,hurt.left)+Math.min(hit.right,hurt.right))/2, + y:(Math.max(hit.top,hurt.top)+Math.min(hit.bottom,hurt.bottom))/2, + z:(Math.max(hit.near,hurt.near)+Math.min(hit.far,hurt.far))/2, + separation: 0, headshot:hurt.part === 'head', segmentIndex:hurt.segmentIndex, + hitbox:hit.id, hurtbox:hurt.id }; + if (result.headshot) break; + } + return result; +} + +// Sample the game's real strike capsules against the opponent's current +// hurtboxes. This is reach evidence at fixed positions, not a predicted hit: +// travel, input latency, shields and the opponent's next move can change it. +function jevStrikeOptions(player, opponent, now) { + if (!player.alive || !opponent.alive || isHeadOnly(player) || isPogo(player)) return {}; + const t = (now - startedAt) / 1000000; + const target = sampleCombatBoxes(opponent, now); + const facing = Math.sign(opponent.x - player.x) || player.facing; + const result = {}; + for (const [action, kind, crouched] of [ + ['punch', itemMelee[heldItem(player)] || 'PUNCH', false], + ['kick', 'KICK', false], ['low_kick', 'KICK', true], + ['crouch_punch', itemMelee[heldItem(player)] || 'PUNCH', true], + ]) { + const part = kind === 'KICK' ? facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (!part || !hasPart(player, part) || (crouched && !player.grounded)) continue; + const probe = { ...player, facing, vx: 0, blocking: false, + ducking: crouched, crouchBlend: crouched ? 1 : 0, + grabHeld: false, itemAction: '', hitStunUntil: 0, attackHit: false, + attackKind: kind, lowKick: crouched && kind === 'KICK', + attackStartedAt: now, attackUntil: now + meleeSpecs[kind].windowUs }; + let closest = null, clearance = Infinity; + const timing = meleeFrames[kind]; + for (let frame=timing.startup; frame + item.part === part && !item.hitboxOnly)) { + const paletteCoordinate = geometry.segments.indexOf(segment); + detachedParts.push({ ...segment, color: player.color.slice(), + colors: player.npc ? [] : player.handleColors?.map((value) => value.slice()) || [], + paletteCoordinate, + vx: direction * (420 + detachedParts.length % 3 * 90), + vy: -520 - detachedParts.length % 2 * 120, + spin: direction * (3.5 + detachedParts.length % 4), + life: 2.6, part, owner: player.pad, heldBy: -1, hitAfter: now + 180000 }); + } +} + +function detachPart(player, part, geometry, sourceX, now) { + if (!hasPart(player, part)) return; + spawnDetachedPart(player, part, geometry, sourceX, now); + player.removedParts.push(part); + player.partDamage[part] = Math.max(player.partDamage[part] || 0, + part === "torso" ? 3 : 2); + emitSignal("partremoved", player.pad, + [...limbParts, "torso"].indexOf(part), 1); +} + +function damagePart(target, segmentIndex, sourceX, sourcePad, now) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const segment = geometry.segments[segmentIndex]; + const part = segment?.part; + if (!part || !hasPart(target, part)) return; + const durability = target.spiderDummy + ? part === "torso" ? 5 : 3 + : part === "torso" ? 3 : 2; + target.partDamage[part] = (target.partDamage[part] || 0) + 1; + emitSignal("partdamage", target.pad, + [...limbParts, "torso"].indexOf(part), target.partDamage[part] / durability); + if (target.partDamage[part] < durability) return; + if (part === "torso") { + // Removing the body's attachment point releases every surviving limb; + // the circular head remains as the final playable form. + for (const limb of target.spiderDummy ? spiderLegParts : limbParts) + detachPart(target, limb, geometry, sourceX, now); + } + detachPart(target, part, geometry, sourceX, now); + if (part === "torso") { + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + launchHead(target, sourceX, sourcePad, now, 650, 620); + } + if (target.itemArm === part) { + if (target.gunAmmo > 0) gunPickups.push({ kind: target.gunMode, + amount: target.gunAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + if (target.grenadeAmmo > 0) grenadePickups.push({ + amount: target.grenadeAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + // The blade goes where the hand went. A saber is held, not carried, so + // losing the item arm has to put it back on the map — otherwise the one + // weapon a fighter can keep all round would quietly cease to exist and + // the reach it was buying would vanish with no object to explain it. + if (target.swordHeld) { + saberPickups.push({ kind: "LIGHT SABER", x: target.x, + y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + target.swordHeld = false; + } + target.gunAmmo = 0; + target.grenadeAmmo = 0; + target.itemArm = ""; + emitSignal("item-drop", target.pad, sourcePad, 1); + } + if (target.carryArm === part) { + if (target.heldBall >= 0) releaseCarriedBall(target, now); + if (target.heldPart >= 0) releaseCarriedPart(target, now); + if (target.heldPlayer >= 0) releaseCarriedFighter(target, now); + target.carryArm = ""; + } + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.lastButton = part.toUpperCase() + " LOST"; + target.lastButtonAt = now; + playDrum("clap", 1.2, panPlayer(target)); +} + +function damageAllLimbs(target, sourceX, sourcePad, now) { + for (const part of limbParts) { + if (!hasPart(target, part)) continue; + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const index = geometry.segments.findIndex((segment) => segment.part === part); + if (index >= 0) damagePart(target, index, sourceX, sourcePad, now); + } +} + +const skateTruck = 32; +const skateWheelRadius = 8; +const skateAxleDrop = 10; + +function skateContact(x, y) { + // Solve the truck chord against the supporting ledge or heightfield. + let pitch = 0, left = 0, right = 0; + for (let i = 0; i < 6; i++) { + const span = skateTruck * Math.cos(pitch); + left = surfaceYAt(x - span, y - 2); + right = surfaceYAt(x + span, y - 2); + pitch = Math.atan2(right - left, span * 2); + } + const c = Math.cos(pitch), sn = Math.sin(pitch); + const wheelX = -sn * skateAxleDrop; + left = surfaceYAt(x - skateTruck * c + wheelX, y - 2); + right = surfaceYAt(x + skateTruck * c + wheelX, y - 2); + const deckY = Math.min(left + skateTruck * sn, right - skateTruck * sn) - + skateAxleDrop * c - skateWheelRadius; + return { pitch, y: deckY + skateAxleDrop + skateWheelRadius, + left: Math.abs(deckY - skateTruck * sn + skateAxleDrop * c + skateWheelRadius - left) < 3, + right: Math.abs(deckY + skateTruck * sn + skateAxleDrop * c + skateWheelRadius - right) < 3 }; +} + +function skateFrame(player) { + const pitch = player.skateWallSide ? Math.PI / 2 : player.skatePitch || 0; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const down = player.skateWallSide > 0 ? -1 : 1; + return (along, height = 0, across = 0) => ({ + x: player.x + c * along - sn * height * down, + y: player.y - skateAxleDrop - skateWheelRadius + sn * along + c * height * down, + z: player.z + across, + }); +} + +function resetSkate(player) { + player.skateboard = false; + player.skateVx = player.skateWallSide = player.skatePitch = 0; + player.skateSpin = player.skateRollDistance = player.skateCarveDir = 0; + player.skateContacts = 0; + player.walkSince = player.runSince = 0; +} + +function boardForRider(player) { + return balls.find(item => item.type === "skateboard" && item.riderPad === player.pad) || + balls.find(item => item.type === "skateboard" && !item.active && item.heldBy < 0 && + (item.riderPad ?? -1) < 0); +} + +function dismountSkateboard(target, now) { + if (!target.skateboard) return false; + resetSkate(target); + const board = boardForRider(target); + if (!board) return true; + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.x = target.x - target.facing * 58; + board.y = target.y - skateAxleDrop - skateWheelRadius; + board.z = target.z; + board.vx = -target.facing * 720; + board.vy = -260; + board.safeUntil = now + 260000; + board.safePlayers = 1 << target.pad; + emitSignal("skate-dismount", target.pad, 1, 0); + return true; +} + +function applyBodyHit(target, segmentIndex, sourceX, sourcePad, now, + force = 1100, lift = 150, damageParts = true) { + recordFightHit(sourcePad, false); + const direction = Math.sign(target.x - sourceX) || + (sourcePad === target.pad ? -target.facing : target.facing) || 1; + releaseCarriedBall(target, now); + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.dashUntil = 0; + target.dashVx = 0; + target.hit = Math.max(target.hit, .52); + target.hitSegment = segmentIndex; + target.hitSegmentUntil = Math.max(target.hitSegmentUntil, now + 190000); + if (dismountSkateboard(target, now)) damageParts = false; + // Balls transfer recoil but are sporting hazards, not damaging attacks. + if (damageParts) + damagePart(target, segmentIndex, sourceX, sourcePad, now); + target.hitStunUntil = Math.max(target.hitStunUntil, now + 145000); + if (isHeadOnly(target)) { + launchHead(target, sourceX, sourcePad, now, force * 1.15, + Math.max(420, lift * 2)); + } else { + target.knockVx += direction * force; + target.vx = target.knockVx + target.windVx; + target.vy = Math.min(target.vy, -lift); + } + target.grounded = false; + target.stance = "STUN"; + target.lastButton = "BODY HIT"; + target.lastButtonAt = now; + emitSignal("bodyhit", sourcePad, target.pad, segmentIndex); +} + +// `combat` is false on a watcher: the limbs still tumble, settle and draw, +// but they do not damage anybody. The fight they belong to is being decided +// on another machine, and a watcher that scored its own hits would fight the +// wire for the rest of the round. Same switch `updateBullets` already has. +function updateDetachedParts(dt, combat = true) { + const now = runtime().monotonicUs; + for (const fragment of detachedParts) { + if (fragment.heldBy >= 0) { + const carrier = players[fragment.heldBy]; + if (!carrier?.alive || carrier.heldPart !== detachedParts.indexOf(fragment)) { + fragment.heldBy = -1; + } else { + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const dx = carrier.x + carrier.facing * 112 - centerX; + const dy = carrier.y - 78 - centerY; + fragment.x1 += dx; fragment.x2 += dx; + fragment.y1 += dy; fragment.y2 += dy; + fragment.vx = fragment.vy = 0; + fragment.life = Math.max(fragment.life, 1); + continue; + } + } + fragment.vy += 1900 * dt; + const dx = fragment.vx * dt; + const dy = fragment.vy * dt; + fragment.x1 += dx; + fragment.y1 += dy; + fragment.x2 += dx; + fragment.y2 += dy; + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const angle = fragment.spin * dt; + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + for (const endpoint of [1, 2]) { + const xKey = "x" + endpoint; + const yKey = "y" + endpoint; + const localX = fragment[xKey] - centerX; + const localY = fragment[yKey] - centerY; + fragment[xKey] = centerX + localX * cosine - localY * sine; + fragment[yKey] = centerY + localX * sine + localY * cosine; + } + const bottom = Math.max(fragment.y1, fragment.y2) + fragment.width / 2; + const terrainY = terrainFloorAt(centerX); + if (bottom > terrainY) { + const correction = terrainY - bottom; + fragment.y1 += correction; + fragment.y2 += correction; + fragment.vy = -Math.abs(fragment.vy) * .42; + fragment.vx *= .82; + fragment.spin *= .78; + } + const speed = Math.hypot(fragment.vx, fragment.vy); + if (combat && speed > 650 && now >= (fragment.hitAfter || 0)) { + for (const target of players) { + if (!target.alive || target.pad === fragment.owner) continue; + const contact = runnerContactToPoint(target, + (now - startedAt) / 1000000, centerX, centerY, + (fragment.z1 + fragment.z2) / 2); + if (Math.min(contact.headDistance, contact.bodyDistance) > + fragment.width / 2 + 18) continue; + applyBodyHit(target, contact.segmentIndex, centerX, fragment.owner, + now, Math.min(1800, speed * .72), 240); + fragment.vx *= -.38; + fragment.vy = -Math.abs(fragment.vy) * .45; + fragment.hitAfter = now + 260000; + playDrum("clap", 1, panPlayer(target)); + emitSignal("part-hit", fragment.owner, target.pad, speed); + break; + } + } + // Dismembered anatomy remains a physical arena object. It can settle, + // be picked up again, thrown, and strike either fighter for the rest of + // the round rather than evaporating on a cosmetic timer. On a watcher it + // is only scenery, and scenery that never expires is a leak: the wire + // says which limbs are gone, not which pieces are still worth drawing. + if (combat) fragment.life = Math.max(fragment.life, 1); + else fragment.life -= dt; + } + for (let index = detachedParts.length - 1; index >= 0; index--) { + if (detachedParts[index].life > 0 || detachedParts[index].heldBy >= 0) continue; + detachedParts.splice(index, 1); + for (const player of players) { + if (player.heldPart === index) player.heldPart = -1; + else if (player.heldPart > index) player.heldPart--; + } + } +} + +// Comic Relief's packaged horizontal metrics, normalized from its 2048-unit +// em. Colored text is drawn glyph-by-glyph on every host, so using the font's +// real advances here keeps the web canvas and Xbox DirectWrite runs identical. +const comicAdvanceEm = { + a:.512, b:.593, c:.514, d:.587, e:.548, f:.508, g:.531, h:.578, + i:.28, j:.403, k:.54, l:.274, m:.777, n:.523, o:.526, p:.535, + q:.52, r:.48, s:.487, t:.471, u:.52, v:.486, w:.684, x:.59, + y:.521, z:.538, "0":.61, "1":.45, "2":.61, "3":.61, "4":.61, + "5":.61, "6":.61, "7":.61, "8":.61, "9":.61, "@":.931, + "!":.238, "?":.524, ".":.249, ",":.277, ":":.299, ";":.299, + "<":.381, ">":.381, "^":.581, " ":.299, "/":.512, "-":.417, + "+":.48, "∞":.837, +}; + +function comicGlyphAdvance(character, size) { + if (typeof systemWrite.measureGlyph === "function") + return systemWrite.measureGlyph(String(character).toLowerCase(), size); + return size * (comicAdvanceEm[String(character).toLowerCase()] ?? .58); +} + +function handleWidth(handle, size) { + return [...handle].reduce((width, character) => + width + comicGlyphAdvance(character, size), 0); +} + +function typeWrite(text, x, y, size, ...color) { + const visibleText = String(text).toLowerCase(); + if (typeof comicWrite === "function") comicWrite(visibleText, x, y, size, ...color); + else if (typeof ywftWrite === "function") + ywftWrite(visibleText, x, y, size, ...color); + else systemWrite(visibleText, x, y, size, ...color); +} + +function contrastShadow(color) { + const luminance = color[0] * .2126 + color[1] * .7152 + color[2] * .0722; + return luminance > 142 ? [8, 12, 24] : [232, 238, 248]; +} + +// Per-glyph contrast flips a single mid-tone letter to the opposite shadow +// while its neighbors keep theirs, which reads as a mistake rather than as +// depth. A run of type picks its direction once, from the sky behind it, and +// each shadow keeps a trace of its own glyph's hue. +function runShadow(color) { + // Match disk.mjs corner labels: the shadow is always dark, with a trace of + // the foreground hue. Dark mode must never turn a dark glyph's shadow white. + return mixColor(color, visualTheme.light > .5 ? [30, 20, 50] : [6, 4, 16], + .78); +} + +// Handle colors are authored per name and can be shorter than the name they +// dress. Cycling keeps every glyph on the same palette instead of dropping +// the tail onto a different color source. +function glyphColor(colors, index, fallback) { + return colors?.length ? colors[index % colors.length] : fallback; +} + +function controlLocale() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + const keyboard = caps.inputFamily === "keyboard"; + const touch = caps.inputFamily === "touch"; + if (touch) return { + title: "start", select: "", replayPaused: "paused", + replayPlaying: "", replay: "", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM", + }; + return keyboard ? { + title: "start", + select: "P1 A/D + SPACE P2 LEFT/RIGHT + K H P2/DUMMY/BOT G BACK", + replayPaused: "PAUSED F PLAY A D SCRUB G EXIT", + replayPlaying: "F PAUSE A D SCRUB G EXIT", + replay: "Q REPLAY", + combat: "SPACE KICK ENTER PUNCH SHIFT SHIELD ALT USE ITEM W AIR", + } : { + title: "start", + select: "LEFT RIGHT SELECT A READY X P2 / DUMMY / BOT B BACK", + replayPaused: "PAUSED A PLAY LEFT RIGHT SCRUB B EXIT", + replayPlaying: "A PAUSE LEFT RIGHT SCRUB B EXIT", + replay: "Y REPLAY", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM UP AIR", + }; +} + +// Each entry is the cap to draw, what it does, and the button that lights it, +// so the legend can show a key rather than spell one. +function combatKeys() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.inputFamily === "keyboard") return [ + [["A", "D"], "MOVE", "ArrowLeft"], [["D", "D"], ">> DASH", "ArrowRight"], + ["SPACE", "KICK", "A"], ["ENTER", "PUNCH", "B"], + ["SHIFT", "SHIELD", "X"], ["ALT", "USE ITEM", "Y"], + ["W", "AIR", "ArrowUp"]]; + if (caps.inputFamily === "touch") return [ + ["A", "KICK", "A"], ["B", "PUNCH", "B"], + ["X", "SHIELD", "X"], ["Y", "USE ITEM", "Y"]]; + return [ + [["LEFT", "RIGHT"], "MOVE", "ArrowLeft"], + [["RIGHT", "RIGHT"], ">> DASH", "ArrowRight"], + ["A", "KICK", "A"], ["B", "PUNCH", "B"], ["X", "SHIELD", "X"], + ["Y", "USE ITEM", "Y"], ["STICK_UP", "AIR", "ArrowUp"]]; +} + +// What the buttons do, named on the way into a round. B changes meaning with +// what the hand is carrying, so the legend reads the fighter rather than +// reciting a fixed map. +function combatLegendKeys(player) { + const swing = itemMelee[heldItem(player)]; + return combatKeys().map(([cap, action, button]) => + [cap, swing && action === "PUNCH" ? swing : action, button]); +} + +function combatLegend(player) { + return combatLegendKeys(player) + .map(([cap, action]) => (cap === "STICK_UP" ? "STICK" : cap) + + " " + action).join(" "); +} + +function selectionControlKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + [["A", "D"], "SELECT", "ArrowLeft"], ["SPACE", "READY", "A"], + ["SHIFT", "OPPONENT", "X"], ["ENTER", "BACK", "B"]]; + return [[["LEFT", "RIGHT"], "SELECT", "ArrowLeft"], ["A", "READY", "A"], + ["X", "OPPONENT", "X"], ["B", "BACK", "B"]]; +} + +function replayControlKeys(paused) { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + ["F", paused ? "PLAY" : "PAUSE", "A"], + [["A", "D"], "SCRUB", "ArrowLeft"], ["G", "EXIT", "B"]]; + return [["A", paused ? "PLAY" : "PAUSE", "A"], + [["LEFT", "RIGHT"], "SCRUB", "ArrowLeft"], ["B", "EXIT", "B"]]; +} + +function replayOfferKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + return family === "keyboard" ? [["Q", "REPLAY", "Y"]] + : [["Y", "REPLAY", "Y"]]; +} + +// A key drawn as a key: a gray cap with a line around it, sunk and brightened +// while it is actually held. +// `fade` is how present the cap is: 1 draws it, 0 dissolves it into the stage +// behind. The legend always passes 1; only the command stream ages its caps +// out, and it needs the whole cap to go — face, edge and letter together. +// A controller button drawn as a controller button: the letter in its Xbox +// color on a dark disc with a colored rim; pressed inverts to a filled disc. +// Directions are the same disc with an arrow glyph in neutral ink. Keyboard +// input keeps its keycaps; every other family gets these. +const padButtonInk = { + A: [96, 200, 80], B: [235, 78, 78], X: [86, 148, 235], Y: [240, 198, 60], + // The M30's face wears its own colorway — green A, yellow B, blue C, all + // three top-row buttons gray — which is NOT the Xbox palette above, so the + // cluster keys its own inks rather than borrowing the Xbox letters'. + M30A: [96, 200, 80], M30B: [240, 198, 60], M30C: [86, 148, 235], + M30X: [168, 176, 190], M30Y: [168, 176, 190], M30Z: [168, 176, 190], + M30S: [235, 78, 78], +}; +const padGlyph = { UP: "↑", DOWN: "↓", LEFT: "←", RIGHT: "→" }; +const padButtonDiameter = (size) => Math.round(size * .78) * 2; +function drawPadButton(label, x, y, size, pressed, fade = 1, display = null) { + const radius = Math.round(size * .78); + if (fade <= .01) return radius * 2; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const ink = padButtonInk[label] || mixColor([148, 158, 178], [96, 104, 124], + visualTheme.light); + // Filled like the real thing: the color IS the button. Held brightens it + // and rims it white; the glyph stays dark and dead-center either way. + const face = pressed ? mixColor(ink, [255, 255, 255], .3) : ink; + const cx = x + radius; + const cy = y + Math.round(size * .75); + filledDisc(cx, cy, radius, veil(face)); + if (pressed) filledRing(cx, cy, radius, radius - 3, veil([245, 248, 255])); + const text = display ?? (padGlyph[label] || label).toUpperCase(); + const glyphSize = Math.round(size * .82); + if (label === "STICK_UP" || label === "DOWN" || + label === "LEFT" || label === "RIGHT") { + const arrowInk = veil([12, 14, 26]); + const thickness = Math.max(2, Math.round(radius * .11)); + const dx = label === "LEFT" ? -1 : label === "RIGHT" ? 1 : 0; + const dy = label === "STICK_UP" ? -1 : label === "DOWN" ? 1 : 0; + const tipX = cx + dx * radius * .42; + const tipY = cy + dy * radius * .42; + const tailX = cx - dx * radius * .4; + const tailY = cy - dy * radius * .4; + const perpendicularX = -dy * radius * .32; + const perpendicularY = dx * radius * .32; + const wingX = tipX - dx * radius * .34; + const wingY = tipY - dy * radius * .34; + filledCapsule(tailX, tailY, tipX, tipY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX + perpendicularX, + wingY + perpendicularY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX - perpendicularX, + wingY - perpendicularY, thickness, arrowInk); + return radius * 2; + } + const glyphX = Math.round(cx - handleWidth(text, glyphSize) / 2); + // DirectWrite's cap shapes carry more visual weight below their nominal + // midpoint. Lift the Xbox face letters together so A/B/X/Y read centered in + // the colored hardware circles rather than sitting on their lower halves. + const glyphY = Math.round(cy - glyphSize * (padButtonInk[label] ? .56 : .5)); + if (padButtonInk[label] || Object.hasOwn(padGlyph, label) || + /^[KPSI<>^v]$/.test(text)) + systemWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + else typeWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + return radius * 2; +} + +function drawKeycap(label, x, y, size, pressed, fade = 1) { + const padX = Math.round(size * .42); + const height = Math.round(size * 1.5); + const width = handleWidth(label, size) + padX * 2; + if (fade <= .01) return width; + const drop = pressed ? 2 : 0; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const face = veil(pressed + ? mixColor([96, 104, 126], [206, 214, 232], visualTheme.light) + : mixColor([44, 50, 66], [176, 184, 202], visualTheme.light)); + const edge = veil(pressed + ? mixColor([210, 220, 240], [40, 46, 62], visualTheme.light) + : mixColor([112, 122, 146], [96, 104, 124], visualTheme.light)); + if (!pressed) + hudBox(x + 2, y + 4, width, height, ...veil(mixColor([6, 8, 18], [92, 99, 112], + visualTheme.light * .7))); + hudBox(x, y + drop, width, height, ...face); + strokeBox(x, y + drop, width, height, 2, edge); + typeWrite(label, x + padX, y + drop + Math.round((height - size) / 2), size, + ...veil(pressed ? [12, 14, 26] : [238, 242, 252])); + return width; +} + +// `controllers()` walks the whole pad list and the legend asks every painted +// frame, so the name check breathes once a second instead. +let m30CheckAt = 0; +let m30Present = false; +function m30Seated() { + const now = runtime().monotonicUs; + if (now >= m30CheckAt) { + m30CheckAt = now + 1000000; + m30Present = typeof controllers === "function" && + (controllers() || []).some((pad) => /8bitdo\s+m30/i.test(pad?.name || "")); + } + return m30Present; +} + +// The M30 folds two extra moves into its Sega face: C and the top-edge R +// reach the game as the trigger pair, Z and the top-edge L as the shoulders — +// the pad's factory Xbox map wearing Sega names. Which trigger C sends was +// read off the live hardware, not the leaflet; flip this table if 8BitDo's +// firmware ever swaps the pair. +const m30FaceSends = { C: "RightTrigger", Z: "RightShoulder" }; +const m30SendLabel = { RightTrigger: "SHIELD", RightShoulder: "USE ITEM", + LeftTrigger: "KICK", LeftShoulder: "USE ITEM" }; + +// The M30's own manual page, drawn from the device itself: the white +// dogbone body with red L/R nubs over its shoulders, the dark cross on its +// round base, the red start pill, and the two button arcs climbing to the +// right — gray X/Y/Z small on top, green A / yellow B / blue C big below, +// the bottom row shifted toward the thumb. Proportions transcribed from +// 8BitDo's top-down of the M30 2.4G (white), the unit in @jeffrey's hand. +// Every drawn control lights with the live press, so the mapping is not a +// diagram of faith: plug in, press, and the page answers. +function drawM30Cluster(x, y, size, held, directionActive, ink) { + const small = Math.round(size * .58); + const d = padButtonDiameter(size); + const light = visualTheme.light; + const lobeR = Math.round(d * 1.62); + const bodyMidY = y + Math.round(d * .3) + lobeR; + const leftLobeX = x + lobeR; + const rightLobeX = x + Math.round(d * 7.5) - lobeR; + const plastic = mixColor([176, 182, 194], [246, 248, 251], light); + const print = mixColor([92, 98, 112], [118, 124, 138], light); + // Shoulder nubs first, so the body covers their roots. + const nub = mixColor([196, 44, 58], [206, 48, 62], light); + filledCapsule(leftLobeX - d, bodyMidY - lobeR, leftLobeX + Math.round(d * .2), + bodyMidY - lobeR, Math.round(d * .4), nub); + filledCapsule(rightLobeX - Math.round(d * .2), bodyMidY - lobeR, + rightLobeX + d, bodyMidY - lobeR, Math.round(d * .4), nub); + filledDisc(leftLobeX, bodyMidY, lobeR, plastic); + filledDisc(rightLobeX, bodyMidY, lobeR, plastic); + filledCapsule(leftLobeX, bodyMidY, rightLobeX, bodyMidY, + Math.round(lobeR * 1.7), plastic); + // The silkscreen wordmark rides the body's top center. + const markSize = Math.round(small * .9); + typeWrite("8BITDO M30", Math.round((leftLobeX + rightLobeX) / 2 - + handleWidth("8BITDO M30", markSize) / 2), + bodyMidY - lobeR + Math.round(d * .1), markSize, ...print); + // D-pad: the dark cross on its round base, each arm lighting alone. + const dpadBase = mixColor([44, 48, 60], [58, 62, 74], light); + filledDisc(leftLobeX, bodyMidY, Math.round(d * 1.02), dpadBase); + const crossInk = mixColor([24, 27, 36], [32, 35, 44], light); + const armLen = Math.round(d * .8); + const armWidth = Math.round(d * .5); + const arms = [["ArrowUp", 0, -1], ["ArrowDown", 0, 1], + ["ArrowLeft", -1, 0], ["ArrowRight", 1, 0]]; + for (const [button, dx, dy] of arms) + filledCapsule(leftLobeX, bodyMidY, leftLobeX + dx * armLen, + bodyMidY + dy * armLen, armWidth, directionActive(button) + ? mixColor(crossInk, [245, 248, 255], .5) : crossInk); + filledDisc(leftLobeX, bodyMidY, Math.max(2, Math.round(d * .14)), + mixColor([16, 18, 26], [22, 24, 32], light)); + // START — the red pill mid-body, its name silkscreened beneath, with the + // 2.4G's three tiny extras below. Pressed wears the discs' white rim. + const startPressed = held.includes("Menu"); + const midX = Math.round((leftLobeX + rightLobeX) / 2); + const pillHalf = Math.round(size * .5); + const pillY = bodyMidY - Math.round(d * .28); + if (startPressed) filledCapsule(midX - pillHalf, pillY, midX + pillHalf, + pillY, Math.round(size * .44) + 4, [245, 248, 255]); + filledCapsule(midX - pillHalf, pillY, midX + pillHalf, pillY, + Math.round(size * .44), startPressed + ? mixColor(padButtonInk.M30S, [255, 255, 255], .3) : padButtonInk.M30S); + const startLabelSize = Math.round(small * .8); + typeWrite("START", Math.round(midX - handleWidth("START", startLabelSize) / 2), + pillY + Math.round(size * .32), startLabelSize, ...print); + for (let dot = 0; dot < 3; dot++) + filledDisc(midX + (dot - 1) * Math.round(d * .42), + pillY + Math.round(d * .85), Math.max(2, Math.round(d * .09)), print); + // The face arcs climb to the right like the hardware; the top row runs + // smaller and the bottom row leans into the thumb. + const pitch = Math.round(d * 1.05); + const drop = Math.round(d * .3); + const smallFace = Math.round(size * .82); + const disc = (key, cap, cx, cy, buttonSize, pressed) => + drawPadButton(key, cx - Math.round(buttonSize * .78), + cy - Math.round(buttonSize * .75), buttonSize, pressed, 1, cap); + const face = [ + ["M30X", "X", 0, 0, smallFace, held.includes("X")], + ["M30Y", "Y", 1, 0, smallFace, held.includes("Y")], + ["M30Z", "Z", 2, 0, smallFace, held.includes(m30FaceSends.Z)], + ["M30A", "A", 0, 1, size, held.includes("A")], + ["M30B", "B", 1, 1, size, held.includes("B")], + ["M30C", "C", 2, 1, size, held.includes(m30FaceSends.C)], + ]; + for (const [key, cap, column, row, buttonSize, pressed] of face) + disc(key, cap, + rightLobeX + Math.round((column - 1) * pitch - d * .35) + + (row ? Math.round(d * .34) : 0), + bodyMidY - Math.round(d * .8) + (2 - column) * drop + + (row ? Math.round(d * .92) : 0), + buttonSize, pressed); + let rowY = bodyMidY + lobeR + Math.round(small * 1.2); + const captions = [ + `A KICK B PUNCH C ${m30SendLabel[m30FaceSends.C]}`, + `X SHIELD Y USE ITEM Z ${m30SendLabel[m30FaceSends.Z]}`, + `L ${m30SendLabel.LeftShoulder} R ${m30SendLabel.LeftTrigger}`, + "A+B GRAB START PAUSE", + ]; + for (const caption of captions) { + typeWrite(caption, x, rowY, small, ...ink); + rowY += Math.round(small * 1.55); + } + return rowY + Math.round(small * .6); +} + +// Lifted clear of the bottom edge, because the signed-in handle and its +// logout button now sit in that corner and the legend used to run straight +// through them on a narrow view. +function drawControlLegend(ink) { + const device = typeof capabilities === "function" ? capabilities() : {}; + if (device.showControlLegend === false || device.inputFamily === "touch") return; + const safe = hudSafeRect(); + const pad = localPad(); + const held = pad.down || []; + const directionActive = (button) => held.includes(button) || + (button === "ArrowLeft" && pad.leftX < -.12) || + (button === "ArrowRight" && pad.leftX > .12) || + (button === "ArrowUp" && pad.leftY > .12) || + (button === "ArrowDown" && pad.leftY < -.12); + const size = compactLayout() ? 18 : 24; + const x = safe.left + 8; + const both = held.includes("A") && held.includes("B"); + const legendFighter = players[localSeat()]; + const dash = legendFighter.lastButton === "DASH" && + runtime().monotonicUs - legendFighter.lastButtonAt < 700000; + const controls = [ + ["LEFT", "ArrowLeft", "MOVE"], + ["RIGHT", "ArrowRight", dash ? "DASH >>" : "MOVE"], + ["STICK_UP", "ArrowUp", "AIR"], + ["DOWN", "ArrowDown", "CROUCH"], + ["A", "A", both ? "GRAB" : "KICK"], + ["B", "B", both ? "GRAB" : itemMelee[heldItem(legendFighter)] || "PUNCH"], + ["X", "X", "SHIELD"], + ["Y", "Y", "USE ITEM"], + ]; + if (survivalActive()) controls.length = 4; + const keyboard = keycapFamily(); + // A seated M30 trades the whole legend column for the pad's own manual + // page — the drawn controller carries its d-pad, so no rows remain. + const m30 = device.showControllerDiagram !== false && + !keyboard && !survivalActive() && m30Seated(); + if (m30) controls.length = 0; + const keyboardCap = { LEFT: "A", RIGHT: "D", STICK_UP: "W", DOWN: "S", + A: "SPACE", B: "ENTER", X: "SHIFT", Y: "ALT" }; + const step = Math.round(size * 1.82); + for (const [row, [cap, button, action]] of controls.entries()) { + const y = safe.top + row * step; + const width = keyboard + ? drawKeycap(keyboardCap[cap] || cap, + x, y, size, + directionActive(button)) + : drawPadButton(cap, x, y, size, + button.startsWith("Arrow") ? directionActive(button) : held.includes(button)); + if (action) typeWrite(action, x + width + 10, + y + Math.round(size * .25), size, ...ink); + } + let legendBottom = safe.top + controls.length * step; + if (m30) legendBottom = drawM30Cluster(x, legendBottom, size, held, + directionActive, ink); + drawStickGate(x, legendBottom, size, pad, ink); +} + +// The legend named the stick's directions but never its ANGLE, so a fighter +// walking on a half-tilted stick looked identical to one at full lean, and +// the camera stick had no read-out at all. Only drawn while a stick is off +// center: an always-present gate would be one more permanently-lit widget in +// a corner that is already busy. +function drawStickGate(x, y, size, pad, ink) { + const gate = (label, dx, dy, column) => { + const radius = Math.round(size * .82); + const cx = x + radius + column * Math.round(radius * 2.6); + const cy = y + radius; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + // The gate ring is drawn as a disc under a smaller ground-colored disc: + // filledDisc is the only circle primitive the piece owns, and two of them + // cost less than an arc walked out of line segments. + filledDisc(cx, cy, radius, idle); + filledDisc(cx, cy, radius - 3, + mixColor([7, 8, 28], [230, 239, 247], visualTheme.light)); + // Screen y grows downward while the pad reports up as positive. + const knobX = cx + dx * (radius - 5); + const knobY = cy - dy * (radius - 5); + filledDisc(knobX, knobY, Math.max(3, Math.round(size * .26)), ink); + typeWrite(label, cx - radius, cy + radius + 2, + Math.round(size * .62), ...ink); + }; + const live = (dx, dy) => Math.abs(dx) > .12 || Math.abs(dy) > .12; + const leftX = Number(pad.leftX) || 0; + const leftY = Number(pad.leftY) || 0; + const rightX = Number(pad.rightX) || 0; + const rightY = Number(pad.rightY) || 0; + let column = 0; + if (live(leftX, leftY)) gate("move", leftX, leftY, column++); + if (live(rightX, rightY)) gate("cam", rightX, rightY, column++); +} + +const controlRailWidth = () => compactLayout() ? 138 : 188; + +// Touch is part of the game surface, not a DOM overlay. One drawn d-pad and +// four action discs share the exact centers used by mac-test's canvas hit zones. +function drawTouchControls() { + if (typeof capabilities !== "function" || + capabilities().inputFamily !== "touch" || capabilities().socialPreview) + return; + const held = localPad().down || []; + const spread = 64; + // The clusters stand clear of the home indicator and any notch ear; the + // shell's touchKeyAt mirrors this arithmetic, so a shift here must land + // there too or the drawing and the hit test come apart. + const cy = viewHeight - 140 - viewInset.bottom; + const dpadX = 130 + viewInset.left; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + const live = mixColor([110, 220, 150], [38, 128, 88], visualTheme.light); + const arm = 38; + const thick = 18; + const directions = [[0, -1, "ArrowUp"], [0, 1, "ArrowDown"], + [-1, 0, "ArrowLeft"], [1, 0, "ArrowRight"]]; + for (const [dx, dy, key] of directions) + filledCapsule(dpadX + dx * 8, cy + dy * 8, + dpadX + dx * arm, cy + dy * arm, thick, + held.includes(key) ? live : idle); + filledDisc(dpadX, cy, thick, held.some((key) => key.startsWith("Arrow")) + ? live : idle); + const actionX = viewWidth() - 130 - viewInset.right; + const commandGlyph = { A: "/", B: "*", X: ")", Y: "+" }; + for (const [dx, dy, key] of [[0, -1, "Y"], [0, 1, "A"], + [-1, 0, "X"], [1, 0, "B"]]) + drawPadButton(key, actionX + dx * spread - 27, + cy + dy * spread - 25, 35, held.includes(key), 1, commandGlyph[key]); +} + +function keycapRunWidth(entries, size) { + const keyboard = keycapFamily(); + const padX = Math.round(size * .42); + const capWidth = (label) => keyboard + ? handleWidth(label, size) + padX * 2 : padButtonDiameter(size); + return entries.reduce((total, [cap, action]) => + total + (Array.isArray(cap) ? cap : [cap]).reduce((width, label, index) => + width + capWidth(label) + (index ? 5 : 0), 0) + 8 + + handleWidth(action, size) + 26, 0) - 26; +} + +// Keyboard reads as keycaps; every other family reads as controller discs. +const keycapFamily = () => (typeof capabilities === "function" + ? String(capabilities().inputFamily || "") : "") === "keyboard"; + +function drawKeycapRun(entries, x, y, size, held, ink, revealAction = null) { + const keyboard = keycapFamily(); + let cursor = x; + for (const [cap, action, button] of entries) { + for (const [index, label] of (Array.isArray(cap) ? cap : [cap]).entries()) { + if (index) cursor += 5; + cursor += keyboard + ? drawKeycap(label, cursor, y, size, held.includes(button)) + : drawPadButton(label, cursor, y, size, held.includes(button)); + } + cursor += 8; + if (!revealAction || revealAction([cap, action, button])) + typeWrite(action, cursor, y + Math.round(size * .25), size, ...ink); + cursor += handleWidth(action, size) + 26; + } + return cursor; +} + +function drawCenteredKeycapRun(entries, y, size, held, ink) { + if (!entries.length) return; + drawKeycapRun(entries, viewCenterX() - keycapRunWidth(entries, size) / 2, + y, size, held, ink); +} + +function drawHandle(handle, x, y, size, colors, fallback) { + let cursor = x; + const characters = [...String(handle)]; + for (let index = 0; index < characters.length; index++) { + typeWrite(characters[index], cursor, y, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(characters[index], size); + } +} + +function drawFace(player, head, color, t, now = runtime().monotonicUs) { + if (head.radius < 5) return; + const bodyDepth = triangleDepth; + triangleDepth = bodyDepth - .012; + const r = head.radius; + const direction = player.facing || 1; + // The whole face turns with a rolling head. Every feature below is placed + // in flat face-space and spun around the head's center on the way to the + // canvas — eyes, mouth, hair, tears, hearts, all of it — instead of the old + // look where the head traveled and the face stayed nailed upright. + const roll = isHeadOnly(player) ? player.headRoll || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const spin = (x, y) => roll === 0 ? { x, y } : { + x: head.x + (x - head.x) * cosRoll - (y - head.y) * sinRoll, + y: head.y + (x - head.x) * sinRoll + (y - head.y) * cosRoll }; + const stroke = (x1, y1, x2, y2, width, ink = color) => { + const a = spin(x1, y1), b = spin(x2, y2); + filledCapsule(a.x, a.y, b.x, b.y, width, ink); + }; + const ring = (x, y, ringRadius, thickness, ink) => { + const point = spin(x, y); + filledRing(point.x, point.y, ringRadius, thickness, ink); + }; + const disc = (x, y, discRadius, ink) => { + const point = spin(x, y); + filledDisc(point.x, point.y, discRadius, ink); + }; + const glyph = (text, x, y, size, ...ink) => { + const point = spin(x, y); + systemWrite(text, point.x, point.y, size, ...ink); + }; + const celebrating = ["DANCE", "LAUGH", "POSE", "WIGGLE"] + .includes(player.resultReaction); + const grieving = ["CRY", "WOE", "SULK"].includes(player.resultReaction); + if (player.name === "@FIFI") { + const hair = visualTheme.light > .55 ? [105, 38, 116] : [245, 118, 230]; + const sway = Math.sin(t * 2.2 + player.pad) * r * .08; + const width = Math.max(2, r * .13); + stroke(head.x - r * .72, head.y - r * .48, + head.x - r * .32, head.y - r * .9, width, hair); + stroke(head.x - r * .32, head.y - r * .9, + head.x + r * .35, head.y - r * .88, width, hair); + stroke(head.x + r * .35, head.y - r * .88, + head.x + r * .76, head.y - r * .38, width, hair); + stroke(head.x - r * .76, head.y - r * .38, + head.x - r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x + r * .76, head.y - r * .38, + head.x + r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x - r * .48, head.y - r * .46, + head.x - r * .08, head.y - r * .18, width * .72, hair); + stroke(head.x - r * .08, head.y - r * .18, + head.x + r * .42, head.y - r * .5, width * .72, hair); + } + const eyeY = head.y - r * .18; + const eyeGap = r * .34; + const faceX = head.x + direction * r * .08; + const eyeWidth = Math.max(1.4, r * .1); + const lineWidth = Math.max(1.2, r * .1); + const blink = player.alive && !player.blocking && !player.attackKind && + Math.sin(t * .73 + player.pad * 2.1) > .985; + const spitAge = now - (player.spitAt || -Infinity); + const spitting = isHeadOnly(player) && spitAge >= 0 && spitAge < 190000; + const inertDummy = player.npc && !player.bot; + const victoryAmount = deathCinematic?.winnerPad === player.pad + ? clamp(deathCinematicAge(now) / 1.15, 0, 1) : 0; + if (!player.alive || player.hit > .6 || inertDummy) { + for (const offset of [-eyeGap, eyeGap]) { + stroke(faceX + offset - eyeWidth, eyeY - eyeWidth, + faceX + offset + eyeWidth, eyeY + eyeWidth, lineWidth); + stroke(faceX + offset + eyeWidth, eyeY - eyeWidth, + faceX + offset - eyeWidth, eyeY + eyeWidth, lineWidth); + } + } else if (spitting) { + // The release reads on the face before the glob clears it: both eyes + // squeeze inward for the same short beat as the pursed lips below. + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset - eyeWidth * 1.35, + eyeY + (offset < 0 ? -1 : 1) * r * .035, + faceX + offset + eyeWidth * 1.35, + eyeY + (offset < 0 ? 1 : -1) * r * .035, + lineWidth * 1.15); + } else if (blink) { + stroke(faceX - eyeGap - eyeWidth, eyeY, faceX - eyeGap + eyeWidth, + eyeY, lineWidth); + stroke(faceX + eyeGap - eyeWidth, eyeY, faceX + eyeGap + eyeWidth, + eyeY, lineWidth); + } else { + const pad = inputPads[player.pad] || {}; + const rawX = Number(pad.leftX) || 0; + const rawY = Number(pad.leftY) || 0; + const movementDeadzone = .48; + const gazeNoiseFloor = .015; + const digitalX = (pad.down || []).includes("ArrowRight") ? 1 + : (pad.down || []).includes("ArrowLeft") ? -1 : 0; + const digitalY = (pad.down || []).includes("ArrowUp") ? 1 + : (pad.down || []).includes("ArrowDown") ? -1 : 0; + const rawMagnitude = Math.hypot(rawX, rawY); + const gazeAmount = rawMagnitude <= gazeNoiseFloor ? 0 + : clamp((rawMagnitude - gazeNoiseFloor) / + (movementDeadzone - gazeNoiseFloor), 0, 1); + const defeated = victoryAmount > 0 + ? players[deathCinematic.loserPad] : null; + const lookX = defeated + ? Math.sign(defeated.x - player.x) || direction + : digitalX || lerp(direction * .2, rawX, gazeAmount); + const lookY = defeated + ? clamp((player.y - defeated.y) / 180, -1, 1) + : digitalY || lerp(0, rawY, gazeAmount); + const pupilX = clamp(lookX, -1, 1) * eyeWidth * 1.05; + const pupilY = clamp(-lookY, -1, 1) * eyeWidth * 1.05; + const socketRadius = eyeWidth * 2.35; + const pupilRadius = eyeWidth * .9; + const socketInk = [246, 248, 244]; + const pupilInk = [8, 12, 24]; + for (const offset of [-eyeGap, eyeGap]) { + disc(faceX + offset, eyeY, socketRadius, socketInk); + triangleDepth = bodyDepth - .02; + disc(faceX + offset + pupilX, eyeY + pupilY, + pupilRadius, pupilInk); + triangleDepth = bodyDepth - .012; + } + } + if (player.bot && player.alive && !player.blocking) { + const browY = eyeY - r * .32; + stroke(faceX - eyeGap - eyeWidth * 1.25, browY - r * .08, + faceX - eyeGap + eyeWidth * 1.25, browY + r * .1, + lineWidth * 1.15); + stroke(faceX + eyeGap - eyeWidth * 1.25, browY + r * .1, + faceX + eyeGap + eyeWidth * 1.25, browY - r * .08, + lineWidth * 1.15); + } + if (grieving) { + const tear = [112, 208, 255]; + const fall = (t * 34) % Math.max(3, r * .55); + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset, eyeY + eyeWidth * 1.5, + faceX + offset, eyeY + eyeWidth * 1.5 + r * .34 + fall, + Math.max(1.5, lineWidth * .72), tear); + } + const mouthY = head.y + r * .3; + if (spitting) { + const release = 1 - clamp(spitAge / 190000, 0, 1); + const lip = player.spitHeavy ? [226, 58, 126] : [232, 92, 132]; + // faceX already carries .08r of facing offset; another .12r makes this + // exactly the .20r face-space mouth used by spitMouthPose(). + ring(faceX + direction * r * .12, mouthY, + r * (.105 + release * .055), Math.max(.7, r * .055), lip); + } else if (player.resultReaction === "LAUGH") { + const age = Math.max(0, (now - player.resultReactionAt) / 1000000); + const open = .35 + Math.abs(Math.sin(age * 18)) * .65; + ring(faceX + direction * r * .08, mouthY, + r * (.12 + open * .1), r * .045, color); + for (let index = 0; index < 3; index++) { + const noteAge = (age * .72 + index * .27) % 1; + const note = index % 2 ? "♫" : "♪"; + glyph(note, + faceX + direction * r * (.34 + noteAge * 1.25) + index * direction * 3, + mouthY - r * (.25 + noteAge * 1.75), + Math.max(8, r * (.55 - noteAge * .16)), ...color); + } + } else if (celebrating || victoryAmount > 0) { + const grin = r * (.09 + victoryAmount * .2); + const width = r * (.23 + victoryAmount * .12); + stroke(faceX - width, mouthY - grin * .18, faceX, + mouthY + grin, lineWidth); + stroke(faceX, mouthY + grin, faceX + width, + mouthY - grin * .18, lineWidth); + // Hearts off a winner, on the laugh notes' trick: a few glyphs on + // staggered loops. A reel carries no HUD to announce the win, so the + // celebration has to be legible on the face itself. + if (victoryAmount > 0) { + const age = deathCinematicAge(now); + for (let index = 0; index < 3; index++) { + const rise = (age * .6 + index * .34) % 1; + const drift = Math.sin(age * 2.2 + index * 2.4) * r * .22; + glyph("♥", + faceX + drift + (index - 1) * r * .42, + mouthY - r * (.95 + rise * 2.1), + Math.max(7, r * (.46 - rise * .17) * victoryAmount), + 255, 96 + index * 22, 148); + } + } + } else if (player.attackKind && meleePulse(player, now) > 0) { + ring(faceX + direction * r * .12, mouthY, + Math.max(1.8, r * .13), Math.max(.4, r * .05), color); + } else if (player.blocking) { + stroke(faceX - r * .26, mouthY, faceX + r * .26, mouthY, lineWidth); + } else if (grieving || !player.alive || player.hit > .6) { + stroke(faceX - r * .24, mouthY + r * .08, faceX, + mouthY - r * .06, lineWidth); + stroke(faceX, mouthY - r * .06, faceX + r * .24, + mouthY + r * .08, lineWidth); + } else { + const smile = Math.sin(t * 2.4 + player.pad) * r * .035; + stroke(faceX - r * .23, mouthY - smile, faceX, + mouthY + r * .09, lineWidth); + stroke(faceX, mouthY + r * .09, faceX + r * .23, + mouthY - smile, lineWidth); + } + triangleDepth = bodyDepth; +} + +function drawInventory(player, now, geometry) { + // A bodyless head carries nothing visible. The sword rode a phantom + // forearm and read as a dark clock hand sweeping through the rolled face — + // steel that never turned with the head it was stuck to. The head keeps its + // items and can still fire; it just doesn't brandish them. + if (isHeadOnly(player)) return; + const scale = cameraScale(); + const gunColor = player.gunMode === "ROCKET LAUNCHER" ? [48, 61, 52] + : player.gunMode === "RUBBER SMG" ? [38, 53, 72] + : player.gunMode === "SPACE LASER" ? [58, 92, 122] : [63, 43, 76]; + const grenadeColor = [255, 105, 105]; + const firing = player.itemAction === "FIRE" && now < player.itemActionUntil; + const throwing = player.itemAction === "THROW" && now < player.itemActionUntil; + // A bash keeps the grenade visible in the fist; itemHandTarget already + // parks both weapons on the swinging hand. + const bashing = player.attackKind === "BASH" && itemSwinging(player, now); + if (player.swordHeld && player.gunAmmo <= 0 && !throwing && + hasPart(player, itemHand(player))) { + // The hilt pins to the hand the silhouette actually draws — the far end + // of the item arm's forearm capsule — and the blade lies along that + // forearm, so grip and angle ride the limb through idle sway, stride, + // whips, freezes, and replays. The gun's aim pose floated here: with no + // ammo the arm never presents, leaving steel mid-air at a fixed angle. + const limbs = geometry.segments; + const forearm = limbs.find((segment) => segment.role === "item-forearm" || + segment.role === "attack-forearm") || + limbs.find((segment) => segment.role?.endsWith("forearm") && + segment.part === itemHand(player)) || + limbs.find((segment) => segment.role?.endsWith("forearm")); + if (forearm) { + const hand = { x: forearm.x2, y: forearm.y2 }; + const alongX = hand.x - forearm.x1; + // A hanging arm would drive the tip into the dirt, so the fist rolls + // the blade skyward at rest; swings still lay steel along the striking + // forearm because melee targets sit at shoulder height. + const alongY = -Math.abs(hand.y - forearm.y1); + const length = Math.hypot(alongX, alongY) || 1; + const tipX = hand.x + alongX / length * 118 * scale; + const tipY = hand.y + alongY / length * 118 * scale; + const acrossX = -alongY / length; + const acrossY = alongX / length; + // Steel became light. Three passes down the same line — a wide halo in + // the fighter's OWN color, then a narrower saturated sheath, then a + // white core — because a blade drawn in one flat tone reads as a stick, + // and because in a versus round the two blades then say which fighter + // is which from across the map, the way the handle colors already do. + // The hum lives in the halo's width: it breathes on the same clock the + // pickups bob on, so a held saber is never a still object. + const hum = 1 + .12 * Math.sin(now / 82000); + const halo = mixColor(player.color, [14, 20, 36], .35); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(4, 13 * scale * hum), halo); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(3, 8 * scale), player.color); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(1.5, 3.5 * scale), [244, 252, 255]); + // The hilt stays machined and dark: it is the one part of a saber that + // is an object, and it is what keeps the blade from reading as a beam + // fired out of a bare fist. + filledCapsule(hand.x + acrossX * 11 * scale, hand.y + acrossY * 11 * scale, + hand.x - acrossX * 11 * scale, hand.y - acrossY * 11 * scale, + Math.max(2, 5 * scale), [148, 156, 172]); + filledCapsule(hand.x, hand.y, + hand.x - alongX / length * 18 * scale, + hand.y - alongY / length * 18 * scale, + Math.max(2, 6 * scale), [34, 30, 40]); + } + } + if ((player.gunAmmo > 0 || firing) && !throwing) { + const forearm = itemForearm(player, geometry); + if (!forearm) return; + const pose = gunPose(player, now); + const projectedHand = projectPoint(pose.hand.x, pose.hand.y, pose.hand.z); + // Render reactions and replay poses may move the drawn skeleton after + // projection. Its actual wrist remains the final attachment point. + const hand = {x:forearm.x2, y:forearm.y2}; + const offsetX = hand.x - projectedHand.x, offsetY = hand.y - projectedHand.y; + const projectWeapon = (x, y, z) => { + const point = projectPoint(x, y, z); + return {x:point.x + offsetX, y:point.y + offsetY}; + }; + const barrel = projectWeapon(pose.muzzle.x, pose.muzzle.y, pose.muzzle.z); + const barrelWidth = Math.max(3, 9 * scale); + const gripWidth = Math.max(2, 6 * scale); + // Xbox batches its native line layer underneath GPU fighter triangles. + // Held items therefore use the same depth-aware capsule path as the hand. + filledCapsule(hand.x, hand.y, barrel.x, barrel.y, + barrelWidth, gunColor); + const gripX = hand.x - player.facing * 8 * scale; + const gripY = hand.y + 20 * scale; + filledCapsule(hand.x, hand.y, gripX, gripY, gripWidth, gunColor); + if (player.gunMode === "RUBBER SMG") { + // One uninterrupted dark silhouette: longer receiver, rear stock, and a + // forward magazine distinguish it from the short pistol in-hand. + const stockX = hand.x - pose.dx * 32 * scale; + const stockY = hand.y - pose.dy * 32 * scale; + filledCapsule(hand.x, hand.y, stockX, stockY, + barrelWidth * 1.12, gunColor); + const magazineX = hand.x + pose.dx * 18 * scale - pose.dy * 17 * scale; + const magazineY = hand.y + pose.dy * 18 * scale + pose.dx * 17 * scale; + filledCapsule(hand.x + pose.dx * 18 * scale, + hand.y + pose.dy * 18 * scale, magazineX, magazineY, + gripWidth, gunColor); + } + if (player.gunMode === "ROCKET LAUNCHER") { + const rearX = hand.x - pose.dx * 38 * scale; + const rearY = hand.y - pose.dy * 38 * scale; + filledCapsule(rearX, rearY, barrel.x, barrel.y, + barrelWidth * 1.8, gunColor); + filledDisc(barrel.x, barrel.y, barrelWidth * 1.45, [104, 62, 48]); + } + if (firing) { + const normalX = -pose.dy; + const normalY = pose.dx; + const flashA = projectWeapon( + pose.muzzle.x + pose.dx * 28 + normalX * 18, + pose.muzzle.y + pose.dy * 28 + normalY * 18, pose.muzzle.z); + const flashB = projectWeapon( + pose.muzzle.x + pose.dx * 28 - normalX * 18, + pose.muzzle.y + pose.dy * 28 - normalY * 18, pose.muzzle.z); + filledCapsule(barrel.x, barrel.y, flashA.x, flashA.y, + Math.max(2, 5 * scale), [255, 248, 190]); + filledCapsule(barrel.x, barrel.y, flashB.x, flashB.y, + Math.max(2, 5 * scale), [255, 248, 190]); + } + } + if (throwing || bashing) { + const target = itemHandTarget(player, now); + const hand = projectPoint(target.x, target.y, target.z); + hudCircle(hand.x, hand.y, Math.max(5, 15 * scale), + Math.max(2, 5 * scale), grenadeColor); + } +} + +function drawDigitalHeadBurst(player, headWorld, age) { + const burstAge = Math.max(0, age - .11); + const origin = projectPoint(headWorld.x, headWorld.y, headWorld.z); + if (![origin.x, origin.y, origin.z].every(Number.isFinite) || + Math.abs(origin.x) > 30000 || Math.abs(origin.y) > 30000) return; + const palette = [ + [255, 48, 96], [176, 18, 54], [255, 92, 126], + player.color, [116, 8, 38], + ]; + const directions = [-2.92, -2.61, -2.3, -2.01, -1.72, -1.43, + -1.14, -.83, -.52, -.21, .1, .41, .72, 1.03]; + for (let index = 0; index < directions.length; index++) { + const angle = directions[index] + (player.pad ? .14 : -.14); + const speed = 48 + index * 4; + const fall = 10 * burstAge + 72 * burstAge * burstAge; + for (let speck = 0; speck < 3; speck++) { + const spread = .38 + speck * .29; + const distance = (5 + speed * burstAge) * spread; + const depth = (index % 3 - 1) * (3 + burstAge * 9) * spread; + const point = projectPoint( + headWorld.x + Math.cos(angle) * distance, + headWorld.y + Math.sin(angle) * distance + fall * spread, + headWorld.z + depth); + if (![point.x, point.y, point.z].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + triangleDepth = point.z; + const pixel = clamp((2.6 - speck * .48) * cameraScale(), 1.5, 4); + screenRect(point.x - pixel / 2, point.y - pixel / 2, + pixel, pixel, palette[(index + speck) % palette.length]); + } + } + // The face becomes a small broken core rather than remaining an intact disc. + const core = Math.max(2, headWorld.radius * cameraScale() * + Math.max(.08, 1 - burstAge * 6.2)); + triangleDepth = origin.z; + for (let index = 0; index < 4; index++) { + const side = index % 2 ? 1 : -1; + const row = index < 2 ? -1 : 1; + const size = core * (.62 + index * .05); + screenRect(origin.x + side * core * .32 - size / 2, + origin.y + row * core * .3 - size / 2, size, size, + palette[index % palette.length]); + } +} + +function drawBrokenRunner(player, age) { + const world = player.frozenGeometry || + runnerWorldGeometry(player, (runtime().monotonicUs - startedAt) / 1000000); + const slow = Math.max(0, age - .11) * .32; + const gravity = 420 * slow * slow; + const outline = [8, 12, 24]; + for (let index = 0; index < world.segments.length; index++) { + const segment = world.segments[index]; + const midX = (segment.x1 + segment.x2) / 2; + const midY = (segment.y1 + segment.y2) / 2; + const side = index % 2 ? 1 : -1; + const dx = (side * (72 + index * 9) - player.facing * 34) * slow; + const dy = -(150 + index * 13) * slow + gravity; + const dz = side * (24 + index * 4) * slow; + const angle = side * slow * (1.15 + index * .08); + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + const move = (x, y, z) => { + const localX = x - midX; + const localY = y - midY; + return { x: midX + localX * cosine - localY * sine + dx, + y: midY + localX * sine + localY * cosine + dy, + z: z + dz }; + }; + const first = move(segment.x1, segment.y1, segment.z1); + const second = move(segment.x2, segment.y2, segment.z2); + const a = projectPoint(first.x, first.y, first.z); + const b = projectPoint(second.x, second.y, second.z); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite) || + [a.x, a.y, b.x, b.y].some((value) => Math.abs(value) > 30000)) + continue; + triangleDepth = projectPoint(midX + dx, midY + dy, + (segment.z1 + segment.z2) / 2 + dz).z; + const width = Math.max(2, segment.width * cameraScale()); + filledCapsule(a.x, a.y, b.x, b.y, width + 3, outline); + filledCapsule(a.x, a.y, b.x, b.y, width, player.color); + } + drawDigitalHeadBurst(player, world.head, age); +} + +function deathCinematicAge(now = runtime().monotonicUs) { + return deathCinematic ? Math.max(0, (now - deathCinematic.startedAt) / 1000000) : -1; +} + +function drawDeathFlash() { + const age = deathCinematicAge(); + if (age < 0 || age >= .11) return; + const previousDepth = triangleDepth; + triangleDepth = -1.425; + const flash = age < .055 ? [255, 255, 255] : [255, 226, 116]; + screenRect(0, 0, viewWidth(), viewHeight, flash); + triangleDepth = previousDepth; +} + +function drawRunner(player, t, showLabel = true) { + // A fighter who is down is still on the stage: they read as the broken body + // rather than as nothing. There is no state in which a fighter is skipped. + const headBurstAge = player.headBustedAt + ? Math.max(0, (runtime().monotonicUs - player.headBustedAt) / 1000000) : -1; + if (!player.alive && headBurstAge >= .11) { + drawBrokenRunner(player, headBurstAge); + if (["CRY", "WOE", "SULK"].includes(player.resultReaction)) { + const head = player.frozenGeometry?.head; + if (head) { + // In screen proportion to the head, not in pixels: the celebration + // camera can fill the frame with this face, and fixed-size tears on a + // huge head read as dust. Ratios match the old look at the old + // distance (a ~22px head wore 7/34/3px tears). + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const r = Math.max(4, Math.hypot(edge.x - point.x, edge.y - point.y)); + const sway = Math.sin(t * 11) * r * .22; + for (const side of [-1, 1]) + filledCapsule(point.x + side * r * .32 + sway, point.y, + point.x + side * r * .32 - sway, + point.y + r * 1.5 + (t * 31) % (r * .8), + Math.max(1.5, r * .14), [112, 208, 255]); + } + } + return; + } + if (player.fallenBodyGeometry) { + const fallen = projectRunnerWorldGeometry(player.fallenBodyGeometry); + drawSkeletonSegments(fallen.segments, player.color, [8, 12, 24], null); + } + const geometry = player.replayGeometry + ? projectRunnerWorldGeometry(player.replayGeometry) + : player.frozenGeometry + ? projectRunnerWorldGeometry(player.frozenGeometry) + : runnerGeometry(player, t); + if (roundResult && player.resultReaction) { + const age = (runtime().monotonicUs - player.resultReactionAt) / 1000000; + const amount = player.resultReaction === "POSE" || + player.resultReaction === "SULK" ? 3 : 8; + const dx = Math.sin(age * (player.resultReaction === "DANCE" ? 15 : 9)) * amount; + const dy = player.resultReaction === "DANCE" + ? -Math.abs(Math.sin(age * 9)) * 15 + : Math.sin(age * 12) * amount * .35; + geometry.head.x += dx; + geometry.head.y += dy; + for (const segment of geometry.segments) { + segment.x1 += dx; segment.x2 += dx; + segment.y1 += dy; segment.y2 += dy; + } + } + // Preserve the fighter's identity color during hit flash. A pure white body + // disappeared against the daylight arena, so impact now changes only its rim. + const color = player.color; + const outline = player.hit > 0 + ? mixColor([255, 232, 92], [28, 34, 52], visualTheme.light) + : [8, 12, 24]; + const displayNow = player.frozenAt || runtime().monotonicUs; + if (player.skateboard) drawSkateboard(player); + drawFighterSilhouette(geometry, color, outline, player); + const hitNow = runtime().monotonicUs; + if (player.hitSegment >= 0 && hitNow < player.hitSegmentUntil && + Math.floor(hitNow / 45000) % 2 === 0) { + const segment = geometry.segments[player.hitSegment]; + if (segment) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + Math.max(3, 5 * cameraScale()), [255, 238, 102]); + } + } + // Every fighter wears its face everywhere now, the title included. The + // still tableau used to sit faceless — a sparring-partner special case + // grown from the old dummy door — but the wordmark screen is the + // storefront, and whoever sits under it should look back. + drawFace(player, geometry.head, contrastShadow(color), t, displayNow); + drawInventory(player, displayNow, geometry); + if (player.blocking) { + const worldShield = shieldGeometry(player); + const shield = projectPoint(worldShield.x, worldShield.y, worldShield.z); + const radius = Math.max(18, worldShield.radius * cameraScale()); + const shieldColor = player.blockFlash > 0 ? [255, 255, 255] : player.color; + const outerWidth = Math.max(4, 11 * cameraScale()); + filledRing(shield.x, shield.y, radius, + Math.max(0, radius - outerWidth), shieldColor); + } + +} + +function drawDiveMotion(player, t) { + if (player.grounded || (!player.pounding && !player.pogoDive)) return; + const level = player.pounding ? Math.max(1, player.poundLevel || 1) : 1; + const speed = clamp(Math.abs(player.vy) / poundMaxVelocity, .25, 1.8); + const color = mixColor(player.color, + level === 3 ? [255, 80, 92] : level === 2 ? [255, 190, 62] : [255, 245, 196], + .46 + level * .12); + const count = 3 + level * 3; + for (let index = 0; index < count; index++) { + const spread = (index - (count - 1) / 2) * 24; + const wobble = Math.sin(t * 13 + index * 2.1) * 9; + const x = player.x + spread + wobble; + const startY = player.y - 125 - index % 2 * 36; + const endY = startY - (95 + index * 17) * speed; + worldCapsule(x, startY, player.z + 18, x, endY, player.z + 18, + 3 + speed * 3 + level, color, .028); + } +} + +function drawDoubleJumpMotion(player, t) { + const now = runtime().monotonicUs; + if (now >= (player.doubleJumpLinesUntil || 0)) return; + const life = clamp((player.doubleJumpLinesUntil - now) / 280000, 0, 1); + const color = mixColor(player.color, [244, 250, 255], .55); + for (let index = 0; index < 7; index++) { + const spread = (index - 3) * 24 + Math.sin(t * 18 + index) * 5; + const startY = player.y + 28 + (index % 2) * 18; + const endY = startY + (70 + index * 11) * life; + worldCapsule(player.x + spread, startY, player.z + 16, + player.x + spread, endY, player.z + 16, + 3 + life * 3, color, .029); + } +} + +// Hitboxes are an inspector, not a garnish. They used to flash on every +// impact for anyone watching, which put green boxes over ordinary play and +// over every recording of it. VIEW (tab) is now the only thing that shows +// them — `impactHitboxesUntil` still times the flash, but only for someone +// who has already asked to see the geometry. +// A capsule needs two half-caps, not two overlapping full discs. +const debugArcs = [3, 4, 6, 8, 10].map((steps) => + Array.from({ length: steps + 1 }, (_, i) => [ + Math.cos(Math.PI / 2 + i * Math.PI / steps), + Math.sin(Math.PI / 2 + i * Math.PI / steps), + ])); +function debugCapsule(x1, y1, x2, y2, width, color) { + if (nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy); + const c = length ? dx / length : 1, sn = length ? dy / length : 0; + const radius = width / 2; + const nx = -sn * radius, ny = c * radius; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + const arc = debugArcs[radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 : radius < 52 ? 3 : 4]; + for (let end = 0; end < 2; end++) { + const x = end ? x2 : x1, y = end ? y2 : y1; + const scale = end ? -radius : radius; + for (let i = 1; i < arc.length; i++) { + const a = arc[i - 1], next = arc[i]; + screenTriangle(x, y, x + (a[0] * c - a[1] * sn) * scale, + y + (a[0] * sn + a[1] * c) * scale, + x + (next[0] * c - next[1] * sn) * scale, + y + (next[0] * sn + next[1] * c) * scale, r, g, b); + } + } +} + +function drawDebugHitboxes(player, t) { + if (renderFlags.hud === false || !debugHitboxes || !player.alive) return; + const now = player.frozenAt || runtime().simMonotonicUs || runtime().monotonicUs; + const boxes = sampleCombatBoxes(player, now, null, false); + const hurtColor = [82, 226, 116]; + const pushColor = [255, 158, 54]; + const attackColor = [255, 58, 64]; + const guardColor = [186, 118, 255]; + const draw = (b, color, width = 2) => { + const z = (b.near+b.far)/2; + const points = [[b.left,b.top],[b.right,b.top],[b.right,b.bottom],[b.left,b.bottom]] + .map(([x,y])=>projectPoint(x,y,z)); + for (let i=0;i<4;i++) { + const a=points[i], next=points[(i+1)%4]; + debugCapsule(a.x,a.y,next.x,next.y,width,color); + } + }; + for (const b of boxes.hurt) draw(b,hurtColor); + draw(boxes.push,pushColor); + for (const b of boxes.guard) draw(b,guardColor,3); + for (const b of boxes.hit) draw(b,attackColor,4); +} + +// The frame meter. One pip per simulation frame, oldest on the left, the +// frame happening now at the right edge -- so an exchange reads left to +// right the way it happened, and the thing you just did is under your eye +// rather than across the screen. +// +// Two rows, one per fighter, stacked so the frames line up vertically: that +// column alignment IS the instrument. Reading "my recovery sits under their +// active" off two rows is the whole reason a frame meter exists, and it is +// why this is a stacked pair rather than one row per player somewhere +// convenient. +function drawFrameMeter() { + if (!debugHitboxes || renderFlags.hud === false) return; + if (!frameMeters.some((meter) => meter.length)) return; + const safe = hudSafeRect(); + const pip = Math.max(2, Math.min(7, Math.floor( + (safe.right - safe.left) * .55 / frameMeterLength) - 1)); + // Subpixel gaps on the AC framebuffer add calls without readable detail. + const gap = pip > 3 && !nativeHudOverlay ? 1 : 0; + // Tall enough to read a color at a glance. The pips are the resolution; + // the row height is only whether you can see them, and a meter you have to + // lean toward is a meter nobody reads mid-fight. + const rowHeight = Math.max(11, pip * 2); + const width = frameMeterLength * (pip + gap); + // Centred, and lifted clear of the bottom furniture -- the session name, + // the bug and the opponent label all live along that edge, and the first + // placement laid the meter straight across them. + const left = Math.round((safe.left + safe.right - width) / 2); + const top = safe.bottom - rowHeight * 2 - 58; + for (const player of players) { + const meter = frameMeters[player.pad]; + const y = top + player.pad * (rowHeight + 3); + // The empty track, so a meter that has not filled yet reads as a meter + // rather than as nothing having happened. + hudBox(left, y, width, rowHeight, 16, 19, 30); + // Adjacent equal pips without a gap are one rectangle. Keep gaps + // on larger displays and preserve the exact frame/color boundaries. + for (let index = 0; index < meter.length;) { + const key = meter[index]; + let end = index + 1; + if (!gap) while (end < meter.length && meter[end] === key) end++; + const state = frameMeterStates[key] || frameMeterStates.neutral; + const x = left + width - (meter.length - index) * (pip + gap); + hudBox(x, y, pip * (end - index), rowHeight, ...state.ink); + index = end; + } + // Whose row this is, in their own color, at the left end where it cannot + // sit on top of the frames anybody is actually reading. + typeWrite("P" + (player.pad + 1), left - 30, y, 15, ...player.color); + } + // The legend, once, above the pair -- and only the states the last two + // seconds actually contained, because a legend listing colors that are not + // on screen is a thing to decode rather than a thing to read. + const seen = new Set(); + for (const meter of frameMeters) for (const state of meter) + if (frameMeterStates[state]?.label) seen.add(state); + let x = left; + for (const state of seen) { + const entry = frameMeterStates[state]; + hudBox(x, top - 17, 9, 9, ...entry.ink); + typeWrite(entry.label, x + 13, top - 19, 13, 168, 178, 200); + x += 20 + entry.label.length * 8; + } +} + +function drawPlayerHud(player, x, pad) { + const color = visualTheme.light > .55 + ? player.pad === 0 ? [155, 34, 108] : [105, 78, 0] + : player.color; + let label = "P" + (player.pad + 1) + " " + player.roundWins + "/" + + matchWins + " PTS " + player.score; + typeWrite(label, x, 14, 22, ...color); +} + +function visibleHandle(player) { + return player.name.toLowerCase(); +} + +function nationFlag(country) { + const code = String(country || "").toUpperCase(); + if (!/^[A-Z]{2}$/.test(code)) return ""; + return [...code].map((letter) => String.fromCodePoint( + 0x1f1e6 + letter.charCodeAt(0) - 65)).join(""); +} + +const reelProgressInset = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelFullUi === true + ? compactLayout() ? 42 : 50 : 0; + +function playerHandleLayout(player, side) { + const safe = hudSafeRect(); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 24 : hudTypeSize; + const width = handleWidth(visibleHandle(player), size); + // One name per corner: the left fighter reads from the left edge, the + // right fighter from the right. The command phrase mirrors to the inside, + // so neither name has to give up its corner to make room for it. + const x = freeForAll() ? (side === 0 ? safe.left + 8 + : side === 1 ? (safe.left + safe.right - width) / 2 : safe.right - 8 - width) + : side === 0 ? safe.left + 8 : safe.right - 8 - width; + const y = safe.bottom - size - (touch ? 250 : 18) - reelProgressInset(); + return { x, y, size, width }; +} + +function drawFloatingHandle(player, x, y, size) { + const handle = visibleHandle(player); + const shadows = player.handleColors?.map(runShadow); + drawHandle(handle, x + 3, y + 4, size, shadows, runShadow(player.color)); + drawHandle(handle, x, y, size, player.handleColors, player.color); +} + +function drawPlayerHandle(player, t, side) { + const { x, y, size } = playerHandleLayout(player, side); + const handle = visibleHandle(player); + const drawGlyphs = (dx, dy, colors, fallback) => { + let cursor = x + dx; + for (let index = 0; index < handle.length; index++) { + const character = handle[index]; + typeWrite(character, cursor, y + dy, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + drawGlyphs(3, 4, player.handleColors?.map(runShadow), runShadow(player.color)); + drawGlyphs(0, 0, player.handleColors, player.color); + const flag = nationFlag(player.nation); + if (flag) { + const flagSize = Math.round(size * .92); + const flagX = side === 0 ? x : x + Math.max(0, handleWidth(handle, size)); + systemWrite(flag, flagX, y - flagSize * 1.05, flagSize, 255, 255, 255); + } +} + +// One name at reel scale: the fighter's own per-glyph palette, every letter on +// its own phase, shadow pass under color pass. Shared by the opening matchup +// and the winner's card, so the only two frames of a reel that carry type +// carry it identically. Advance is keyed to the flat size, so the swell never +// walks the letters apart. +function drawReelName(text, y, size, player, t) { + const total = handleWidth(text, size); + const pass = (dx, dy, colors, fallback) => { + let cursor = viewCenterX() - total / 2 + dx; + for (let index = 0; index < text.length; index++) { + const character = text[index]; + const swell = size * (1 + .07 * Math.sin(t * 6 + index * .9)); + const bob = Math.sin(t * 5.2 + index * .8) * size * .09; + typeWrite(character, cursor - (swell - size) * .5, + y + dy + bob - (swell - size) * .5, swell, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + const plain = player?.color || [245, 248, 255]; + pass(4, 5, player?.handleColors?.map(runShadow), runShadow(plain)); + pass(0, 0, player?.handleColors, plain); +} + +function playerStatLines(player) { + const pad = inputPads[player.pad] || + { connected: false, down: [], leftX: 0, leftY: 0 }; + const input = quantizedInput(pad, player.suppressedDirections); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const phase = "anim " + animation.state + " " + animation.step + "/" + animation.steps + + " tick " + animation.tick; + if (player.npc && !player.bot) { + const parts = player.spiderDummy + ? [...spiderLegParts, "torso"] : [...limbParts, "torso"]; + const remaining = parts.filter((part) => hasPart(player, part)).length; + const damage = parts.reduce((total, part) => + total + Number(player.partDamage?.[part] || 0), 0); + return [ + "p" + (player.pad + 1) + " " + (player.spiderDummy ? "spider dummy" : "training dummy"), + "parts " + remaining + "/" + parts.length + " damage " + damage, + phase, + ]; + } + return [ + "p" + (player.pad + 1) + " " + player.stance + + (player.attackKind ? " + " + player.attackKind : ""), + "input " + input.horizontal + "," + input.vertical + + " stick " + pad.leftX.toFixed(2) + " vx " + Math.round(player.vx), + phase, + ]; +} + +const playerStatSize = () => compactLayout() ? 16 : 22; +const playerStatPanelHeight = () => { + const size = playerStatSize(); + return 16 + 3 * (size + 7) + 10; +}; + +const debugReadoutMetaSize = () => compactLayout() ? 19 : 24; +const debugReadoutTimingSize = () => + Math.max(17, Math.round(debugReadoutMetaSize() * .76)); +// The band the measured-performance read-out owns, just above the nameplate. +// Everything that stacks over a handle reserves it rather than sharing it: the +// console has always printed a second timing row there and it landed exactly on +// the state card's `anim::` line, and the browser started printing one the day +// it began timing its own frames. Both rows are reserved whether or not the +// host fills the second — the card above must not breathe when a measurement +// finally arrives, the same fixed-chassis rule the card itself follows. +const debugReadoutHeight = () => debugHitboxes + ? debugReadoutMetaSize() + 6 + debugReadoutTimingSize() + 5 + : bareFrameRateShown() ? debugReadoutMetaSize() + 11 : 0; + +// The state trace owns a fixed stack over each handle without a container. +const statStackHeight = () => debugHitboxes + ? debugReadoutHeight() + playerStatPanelHeight() + 8 : debugReadoutHeight(); + +function drawPlayerStats(player, side, t) { + if (!debugHitboxes) return; + const lines = playerStatLines(player); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const size = playerStatSize(); + const padding = 8; + const lineHeight = size + 7; + const safe = hudSafeRect(); + // A diagnostic instrument has fixed columns: changing signs and tick counts + // must not make its chassis breathe every frame. + // The tick and velocity columns are the longest legal row, so the chassis + // reserves their full Xbox-width footprint instead of clipping their tail. + const width = compactLayout() ? 360 : 520; + const height = playerStatPanelHeight(); + const handle = playerHandleLayout(player, side); + const x = side === 0 ? safe.left : safe.right - width; + const y = handle.y - debugReadoutHeight() - height - 12; + const previousDepth = triangleDepth; + triangleDepth = -1.445; + for (let row = 0; row < lines.length; row++) { + const rowY = y + padding + row * lineHeight; + writeHudLine(lines[row], x + padding, rowY, size); + } + triangleDepth = previousDepth; +} + +function drawHudInventory(player, side) { + const items = []; + if (player.gunAmmo > 0) items.push("gun " + player.gunAmmo); + if (player.grenadeAmmo > 0) items.push("grenade " + player.grenadeAmmo); + if (!items.length) return; + const text = items.join(" "); + const handle = playerHandleLayout(player, side); + const size = Math.round(hudTypeSize * .62); + const width = handleWidth(text, size); + const x = side === 0 ? handle.x : handle.x + handle.width - width; + // Commands own the rows immediately above the fighter's name. Inventory + // starts above whichever of those rows are still visible, so neither can + // drift over the other as the command history dissolves. + const y = handle.y - statStackHeight() - commandStreamStackHeight(player) - + size - 7; + const shadow = contrastShadow(player.color); + typeWrite(text, x + 2, y + 3, size, ...shadow); + typeWrite(text, x, y, size, ...player.color); +} + +function spatialHudPlayers() { + if (freeForAll()) return players.slice().sort((a, b) => a.x - b.x); + const left = players[hudLeftPad] || players[0]; + const other = players[left.pad === 0 ? 1 : 0]; + // Preserve the lane through the instant of overlap, then swap once the + // crossing is visually unambiguous. This prevents one-frame HUD chatter. + if (other.x < left.x - 36) hudLeftPad = other.pad; + return [players[hudLeftPad], players[hudLeftPad === 0 ? 1 : 0]]; +} + +// How present one glyph of the buffer is. `settle` is how far into the idle +// the dissolve has travelled: 0 for as long as the pad is still saying +// something, 1 once the whole stream has left. Doubling it and offsetting by +// each glyph's place in the stream spends the first half on the oldest glyph +// and the last half on the newest, so the buffer leaves in reading order +// rather than dimming as one sheet. +function commandFade(index, count, idle) { + const settle = clamp((idle - commandHoldUs) / commandFadeUs, 0, 1); + return clamp(index / Math.max(1, count - 1) + 1 - settle * 2, 0, 1); +} + +function commandStreamStackHeight(player, now = runtime().monotonicUs) { + const count = player.commandStream.length; + if (!count) return 0; + const idle = now - (player.commandStream.at(-1)?.at || now); + const visible = player.commandStream.reduce((total, entry, index) => + total + (commandFade(index, count, idle) > .01 ? 1 : 0), 0); + const handle = playerHandleLayout(player, player.pad); + const size = commandStreamTypeSize(handle.size); + const rows = Math.min(commandStreamRows, + Math.ceil(Math.min(commandStreamDepth, visible) / + commandStreamColumnsNow())); + return rows ? rows * (size + 7) + Math.ceil(size * .8) + 4 : 0; +} + +function drawCommandStream(player, side) { + const glyph = { LEFT: "<", RIGHT: ">", UP: "^", DOWN: "v" }; + const buttonFor = { LEFT: "ArrowLeft", RIGHT: "ArrowRight", + UP: "ArrowUp", DOWN: "ArrowDown", "/": "A", "*": "B", ")": "X", + "+": ["Y", "LeftShoulder", "RightShoulder"] }; + const now = runtime().monotonicUs; + const idle = now - (player.commandStream.at(-1)?.at || now); + const count = player.commandStream.length; + const held = inputPads[player.pad]?.down || []; + const entries = player.commandStream.map((entry, index) => ({ ...entry, + text: glyph[entry.label] || entry.label, + fade: commandFade(index, count, idle), + held: Array.isArray(buttonFor[entry.label]) + ? buttonFor[entry.label].some((button) => held.includes(button)) + : held.includes(buttonFor[entry.label]), + })).filter((entry) => entry.fade > .01); + // A held button lights only its newest appearance — not every earlier + // press of the same button still sitting in the buffer's history. + const claimed = new Set(); + for (let index = entries.length - 1; index >= 0; index--) { + const entry = entries[index]; + if (!entry.held) continue; + if (claimed.has(entry.label)) entry.held = false; + else claimed.add(entry.label); + } + if (!entries.length) return; + // The name owns its row. Commands stack in distinct rows above it, aligned + // to the same outside edge, so a long handle can never sit underneath its + // own input history. + entries.reverse(); + const handle = playerHandleLayout(player, side); + const size = commandStreamTypeSize(handle.size); + const columns = commandStreamColumnsNow(); + const lineEntries = entries.slice(0, commandStreamDepth); + const gap = Math.round(size * .34); + const rows = []; + for (let index = 0; index < lineEntries.length; index += columns) + rows.push(lineEntries.slice(index, index + columns)); + const safe = hudSafeRect(); + for (let row = 0; row < rows.length; row++) { + const rowEntries = rows[row]; + const width = rowEntries.reduce((sum, entry, index) => sum + + handleWidth(entry.text, size) + (index ? gap : 0), 0); + let cursor = side === 0 ? handle.x : handle.x + handle.width - width; + cursor = clamp(cursor, safe.left, safe.right - width); + const newestAt = Math.max(...rowEntries.map((entry) => entry.at)); + const rise = clamp((now - newestAt) / 900000, 0, 1) * size * .8; + const y = handle.y - statStackHeight() - (row + 1) * (size + 7) - rise; + for (const entry of rowEntries) { + const quiet = mixColor([104, 114, 136], [82, 90, 108], visualTheme.light); + const live = entry.held ? player.color : quiet; + const glyphInk = entry.fade >= 1 ? live + : mixColor(visualTheme.light > .5 ? [230, 239, 247] : [7, 8, 28], + live, entry.fade); + typeWrite(entry.text, cursor + 2, y + 3, size, + ...contrastShadow(glyphInk)); + typeWrite(entry.text, cursor, y, size, ...glyphInk); + cursor += handleWidth(entry.text, size) + gap; + } + } +} + +function drawFightIntro(introSeconds, titleInk, statusShadow) { + const centerX = viewCenterX(); + const centerY = (stageTop + stageBottom) / 2; + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const nameSize = touch ? 28 : compactLayout() ? 38 : 54; + const drawHeadName = (player) => { + const head = runnerWorldGeometry(player, + (runtime().monotonicUs - startedAt) / 1000000).head; + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const flash = .5 + .5 * Math.sin(introSeconds * Math.PI * 8); + const flashingSize = nameSize * (1 + flash * .1); + const width = handleWidth(visibleHandle(player), flashingSize); + drawFloatingHandle(player, point.x - width / 2, + point.y - radius - flashingSize * 1.28, flashingSize); + }; + if (freeForAll()) { + for (const player of players) drawHeadName(player); + return; + } + if (!reelGroundCamera() && introSeconds < 1) { + drawHeadName(players[0]); + return; + } + if (!reelGroundCamera() && introSeconds < 2) { + drawHeadName(players[1]); + return; + } + { + const title = "oskiewar"; + const titleSize = touch ? 54 : compactLayout() ? 72 : 98; + const width = handleWidth(title, titleSize); + let cursor = centerX - width / 2; + const titleTime = (runtime().monotonicUs - startedAt) / 1000000; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const advance = comicGlyphAdvance(character, titleSize); + typeWrite(character, cursor + 5, centerY - titleSize / 2 + 6, + titleSize, ...statusShadow); + typeWrite(character, cursor, centerY - titleSize / 2, + titleSize, ...animatedTitleColor(index, titleTime)); + cursor += advance; + } + return; + } +} + +function drawSurvivalIntro(titleInk, statusShadow) { + const callout = "climb!"; + const size = compactLayout() ? 74 : 112; + const width = handleWidth(callout, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(callout, x + 5, y + 7, size, ...statusShadow); + typeWrite(callout, x, y, size, ...titleInk); +} + +function drawSurvivalHud(titleInk) { + const safe = hudSafeRect(); + const score = Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 34 : 46; + const width = handleWidth(score, size); + const x = viewCenterX() - width / 2; + const y = safe.top + 2; + typeWrite(score, x + 3, y + 4, size, ...contrastShadow(titleInk)); + typeWrite(score, x, y, size, ...titleInk); +} + +function drawSurvivalResult(titleInk, statusShadow) { + const result = roundResult === "SUMMIT" ? "summit!" + : Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 58 : 82; + const width = handleWidth(result, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(result, x + 5, y + 7, size, ...statusShadow); + typeWrite(result, x, y, size, ...titleInk); +} + +function drawReelSectionProgress(now, titleInk) { + const safe = hudSafeRect(); + const gap = compactLayout() ? 5 : 8; + const widths = [.16, .68, .16]; + const labels = ["INTRO", "FIGHT", "OUTRO"]; + const available = safe.right - safe.left - gap * 2; + const resultDuration = matchOver ? matchResultUs : roundResultUs; + const introAge = Math.max(0, now - roundStartedAt); + const introLimit = roundIntroDurationUs(); + const section = roundResult ? 2 : introAge < introLimit ? 0 : 1; + const progress = section === 0 + ? clamp(introAge / introLimit, 0, 1) + : section === 1 + ? clamp(roundElapsedUs / roundDurationUs, 0, 1) + : clamp((now - roundOverAt) / resultDuration, 0, 1); + const labelSize = compactLayout() ? 18 : 22; + const barHeight = compactLayout() ? 6 : 8; + const barY = safe.bottom - barHeight; + const labelY = barY - labelSize - 7; + const track = mixColor([52, 58, 76], [170, 157, 137], visualTheme.light); + const done = mixColor([96, 222, 154], [31, 92, 76], visualTheme.light); + const hitMarks = Array.isArray(globalThis.__oskiewarFightHitForecast) + ? globalThis.__oskiewarFightHitForecast : fightHitMarks; + let x = safe.left; + for (let index = 0; index < widths.length; index++) { + const width = index === widths.length - 1 + ? safe.right - x : Math.round(available * widths[index]); + const amount = index < section ? 1 : index === section ? progress : 0; + hudBox(x, barY, width, barHeight, ...track); + if (amount > 0) hudBox(x, barY, width * amount, barHeight, + ...(index === section ? titleInk : done)); + if (index === 1) { + const markWidth = compactLayout() ? 5 : 6; + for (const mark of hitMarks) { + const markX = x + clamp(mark.at, 0, 1) * width; + const reached = roundElapsedUs / roundDurationUs >= mark.at; + const impactInk = mark.decisive ? [226, 42, 66] : mark.color; + hudBox(markX - markWidth / 2, barY - 3, + markWidth, barHeight + 6, + ...(reached ? impactInk : mixColor(track, impactInk, .72))); + } + } + const labelWidth = handleWidth(labels[index], labelSize); + typeWrite(labels[index], x + (width - labelWidth) / 2, + labelY, labelSize, ...(index === section ? titleInk : track)); + x += width + gap; + } +} + +function recordFightHit(sourcePad, decisive) { + if (roundResult || roundElapsedUs <= 0) return; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) return; + const fighter = players[sourcePad]; + fightHitMarks.push({ + at: clamp(roundElapsedUs / roundDurationUs, 0, 1), + color: fighter?.color ? [...fighter.color] : [226, 42, 66], + decisive: decisive === true, + }); +} + +// A pole or a branch crossing the near plane has the same problem a face does, +// and the same cure — trim the segment at the plane rather than letting the +// far end pin itself to the near distance and rake across the screen. Null is +// a segment wholly behind the camera. +// The band a face gets, for a line. A segment is two points with no polygon +// to cut, which is why this used to trim at the pin instead: cutting at the +// near plane and handing the result over whole let a line crossing the plane +// rake the length of the guard band. Trimming the PROJECTED segment gives the +// same protection without throwing the line away, so the cut can move back to +// the plane where it belongs. Liang–Barsky, carrying depth along t so a capsule +// still knows how far away its ends are. +function clipSegmentBand(from, to) { + const width = viewWidth(); + const minX = -width * guardBand, maxX = width * (1 + guardBand); + const minY = -viewHeight * guardBand, maxY = viewHeight * (1 + guardBand); + // Most segments sit whole inside the band — every grass blade, most limbs. + // Plain compares answer those; only a segment that actually crosses an + // edge pays for the parametric walk and its rebuilt endpoints. + if (from.x >= minX && from.x <= maxX && from.y >= minY && from.y <= maxY && + to.x >= minX && to.x <= maxX && to.y >= minY && to.y <= maxY) + return { from, to }; + const dx = to.x - from.x, dy = to.y - from.y; + let enter = 0, exit = 1; + for (const [edge, room] of [[-dx, from.x - minX], [dx, maxX - from.x], + [-dy, from.y - minY], [dy, maxY - from.y]]) { + if (edge === 0) { if (room < 0) return null; continue; } + const at = room / edge; + if (edge < 0) { if (at > exit) return null; if (at > enter) enter = at; } + else { if (at < enter) return null; if (at < exit) exit = at; } + } + const along = (t) => ({ x: from.x + dx * t, y: from.y + dy * t, + z: lerp(from.z, to.z, t) }); + return { from: along(enter), to: along(exit) }; +} +// Cut at the real near plane, the same one faces get. The pin is ten times +// further out, and while nothing in normal play passes within eighty units of +// the lens, the death cinematic drives the camera right down to the ground — +// so every limb and blade of grass in front of it was being dropped whole, +// which is what hollowed out the front of the frame on the zoom. +function worldSegment(x1, y1, z1, x2, y2, z2) { + let a = cameraDoll.toView({ x: x1, y: y1, z: z1 }); + let b = cameraDoll.toView({ x: x2, y: y2, z: z2 }); + if (a.z < cameraNear && b.z < cameraNear) return null; + if (a.z < cameraNear) + a = mixVertex(a, b, (cameraNear - a.z) / (b.z - a.z)); + else if (b.z < cameraNear) + b = mixVertex(b, a, (cameraNear - b.z) / (a.z - b.z)); + const from = cameraDoll.projectView(a); + const to = cameraDoll.projectView(b); + // Six plain checks instead of an array built per segment per frame. + return Number.isFinite(from.x) && Number.isFinite(from.y) && + Number.isFinite(from.z) && Number.isFinite(to.x) && + Number.isFinite(to.y) && Number.isFinite(to.z) + ? clipSegmentBand(from, to) : null; +} + +function worldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + line(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} + +function worldCapsule(x1, y1, z1, x2, y2, z2, width, color, + depthBias = -.004) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + const { from, to } = segment; + const previousDepth = triangleDepth; + triangleDepth = Math.min(from.z, to.z) + depthBias; + filledCapsule(from.x, from.y, to.x, to.y, width, color); + triangleDepth = previousDepth; +} + +function litQuadColor(a, b, c, color) { + // Lighting is decided in world space, off the surface the quad names, so it + // is the same shade however the clipper ends up cutting the face up. The + // cross, normalize and dot run in scalars: this is every wall panel every + // frame, and the vector objects were pure interpreter garbage. + const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z; + const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z; + const nx = aby * acz - abz * acy; + const ny = abz * acx - abx * acz; + const nz = abx * acy - aby * acx; + const magnitude = Math.hypot(nx, ny, nz) || 1; + const toward = (nx * -globalLight.x + ny * -globalLight.y + + nz * -globalLight.z) / magnitude; + const illumination = .72 + Math.max(0, toward) * .28; + return [Math.round(color[0] * illumination), + Math.round(color[1] * illumination), + Math.round(color[2] * illumination)]; +} +function worldQuad(a, b, c, d, color) { + const lit = litQuadColor(a, b, c, color); + worldTriangle(a, b, c, lit); + worldTriangle(a, c, d, lit); +} + +// Preserve the sampled silhouette, merging only collinear edges. +const terrainProfile = []; +function rebuildTerrainProfile() { + const points = []; + const step = (worldRight - worldLeft) / terrainSamples; + for (let i = 0; i <= terrainSamples; i++) { + const x = worldLeft + i * step; + const point = { x, y: terrainFloorAt(x) }; + while (points.length > 1) { + const a = points[points.length - 2], b = points[points.length - 1]; + if (Math.abs((b.y - a.y) * (point.x - b.x) - + (point.y - b.y) * (b.x - a.x)) > .00001) break; + points.pop(); + } + points.push(point); + } + terrainProfile.splice(0, terrainProfile.length, ...points); + rebuildTerrainDrawProfile(); +} +// The drawn silhouette. `terrainProfile` keeps every sampled height exactly +// (physics and the fidelity test read it); the console draws each profile +// point as six projections and two faces per pass, so the passes read this +// thinned copy instead — a point is dropped while every point it stood for +// stays within `terrainDrawTolerance` world units of the chord that +// replaces it (about a pixel at fight zoom). Flats were already one edge; +// this is for the ramps, where six samples a tile all survived. +const terrainDrawProfile = []; +const terrainDrawTolerance = 1; +function rebuildTerrainDrawProfile() { + const kept = []; + let anchor = 0; + kept.push(terrainProfile[0]); + for (let index = 2; index <= terrainProfile.length; index++) { + const a = terrainProfile[anchor]; + const candidate = terrainProfile[index] || null; + // Try to stretch the chord from the anchor over `index - 1` to `index`; + // when a point in between falls off it, `index - 1` becomes the anchor. + let fits = candidate !== null; + if (fits) { + const dx = candidate.x - a.x, dy = candidate.y - a.y; + const length = Math.hypot(dx, dy) || 1; + for (let between = anchor + 1; between < index; between++) { + const point = terrainProfile[between]; + const distance = Math.abs((point.x - a.x) * dy - (point.y - a.y) * dx) / length; + if (distance > terrainDrawTolerance) { fits = false; break; } + } + } + if (!fits) { + anchor = index - 1; + kept.push(terrainProfile[anchor]); + } + } + terrainDrawProfile.splice(0, terrainDrawProfile.length, ...kept); +} +rebuildTerrainProfile(); + +// The three terrain passes (surface, front wall, back wall) used to hand +// `worldQuad` four fresh corner objects per segment, and each quad ran its +// six vertices through the camera — so every profile point was projected +// twelve times per pass, and the terrain alone cost 8.4 ms of the console's +// interpreted frame (measured on the Xbox 2026-09-20; sim 5.6 + paint 14 ms +// at 1080p). Each pass now projects each point ONCE for its top vertex and +// once for its bottom, keeps the results in two flat scratch arrays, and +// reads a segment's four corners back from them. Segments that sit wholly +// in front of the camera and inside the guard band — nearly all of them — +// go straight to `projectedTriangle`; the rest fall back to `worldQuad`, so +// the near-plane and band clipping is exactly what it was. +const terrainScratch = { top: [], bottom: [] }; +function terrainVertex(slot, index, x, y, z) { + let vertex = slot[index]; + if (!vertex) vertex = slot[index] = { view: { x: 0, y: 0, z: 0 }, + screen: { x: 0, y: 0, z: 0 }, front: false, inBand: false, x: 0, y: 0, z: 0 }; + vertex.x = x; vertex.y = y; vertex.z = z; + const view = cameraDoll.toView(vertex, vertex.view); + vertex.front = view.z >= cameraNear; + vertex.inBand = vertex.front && + bandContains(cameraDoll.projectView(view, vertex.screen)); + return vertex; +} +// `bottomY` null: the bottom vertex shares the profile's y (the surface +// pass, top at z `zTop`, bottom at z `zBottom`). Otherwise a wall: both +// vertices at `zTop`, the bottom one dropped to `bottomY`. +function terrainPass(left, right, zTop, zBottom, bottomY, shadeOf) { + const { top, bottom } = terrainScratch; + const wall = bottomY !== null; + const terrainProfile = terrainDrawProfile; + const count = terrainProfile.length; + let previous = -1; + for (let index = 0; index < count; index++) { + const point = terrainProfile[index]; + const next = terrainProfile[index + 1]; + // A point is projected only when a drawn segment touches it. + const inSpan = (next && !(next.x < left || point.x > right)) || + (index > 0 && !(point.x < left || terrainProfile[index - 1].x > right)); + if (!inSpan) { previous = -1; continue; } + const a = terrainVertex(top, index, point.x, point.y, zTop); + const b = terrainVertex(bottom, index, point.x, wall ? bottomY : point.y, + wall ? zTop : zBottom); + if (previous >= 0 && previous === index - 1 && + !(point.x < left || terrainProfile[previous].x > right)) { + const a1 = top[previous], b1 = bottom[previous]; + const shade = shadeOf(previous); + if (a1.front && a.front && b.front && b1.front) { + // Reject fully offscreen quads before lighting and guard-band + // clipping. The generous world apron includes many invisible ramps. + const p=a1.screen, q=a.screen, r=b.screen, s=b1.screen; + const width=viewWidth(); + if ((p.x<0 && q.x<0 && r.x<0 && s.x<0) || + (p.x>width && q.x>width && r.x>width && s.x>width) || + (p.y<0 && q.y<0 && r.y<0 && s.y<0) || + (p.y>viewHeight && q.y>viewHeight && r.y>viewHeight && s.y>viewHeight)) { + previous=index; + continue; + } + const lit = litQuadColor(a1, a, b, shade); + if (a1.inBand && a.inBand && b.inBand && b1.inBand) { + projectedTriangle(a1.screen, a.screen, b.screen, lit); + projectedTriangle(a1.screen, b.screen, b1.screen, lit); + } else { + // Off the guard band on one side: clip the projected quad once + // rather than re-projecting it as two triangles. + const face = clipScreenBand([a1.screen, a.screen, b.screen, b1.screen]); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], lit); + } + } else worldQuad(a1, a, b, b1, shade); + } + previous = index; + } +} +// Per-segment surface shade, cached against the ground color it was mixed +// from: the slope never changes between rebuilds, and mixing 240 colours a +// frame was measurable on the console. +let terrainShadeKey = ""; +const terrainShades = []; +function terrainSurfaceShades(color) { + const terrainProfile = terrainDrawProfile; + const key = currentMapId + "/" + color.join(",") + "/" + terrainProfile.length; + if (key === terrainShadeKey) return terrainShades; + terrainShadeKey = key; + terrainShades.length = 0; + for (let index = 1; index < terrainProfile.length; index++) { + const { x: x1, y: y1 } = terrainProfile[index - 1]; + const { x: x2, y: y2 } = terrainProfile[index]; + const slope = Math.abs(y2 - y1) / Math.max(1, x2 - x1); + terrainShades[index - 1] = + mixColor(color, [110, 120, 90], .16 + Math.min(1, slope) * .22); + } + return terrainShades; +} +function drawTerrainSurface(left, right, near, far, color) { + const shades = terrainSurfaceShades(color); + terrainPass(left, right, near, far, null, (segment) => shades[segment]); +} + +function drawTerrainFrontWall(left, right, near, color) { + // Close the near edge with a terrain-following skirt so camera pitch never + // exposes what lies beneath the floor. + // + // WHERE the skirt hangs is the whole fix for the reel's under-floor gap. + // The reel lens is orthographic, so the floor plane projects to a line and + // can never cover the bottom of a 9:16 frame — only a vertical surface can. + // The TV skirt at the slab's near edge sits BEHIND the reel camera and gets + // near-clipped (tinting it magenta proved it never reached the frame), which + // left the buried room wall showing through as purple under the grass. For + // reels the skirt hangs just behind the fighters' plane instead, deep enough + // that no frame sees under it, and wears the ground color — so everything + // below the floor line reads as earth. + const reel = reelGroundCamera(); + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = reel ? 55 : near - 2; + const wallBottom = parkDeepest + (reel ? 9000 : 720); + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawTerrainBackWall(left, right, far, color) { + // The far edge was simply open. Yaw clamps at +/-.62rad, which is more than + // enough to swing the diorama around and look straight through the back of + // the slab into the buried room wall. The near edge has hung a skirt since + // the reel work; this is its mirror, and it exists for the ordinary TV lens + // where the right stick can actually reach around. + // + // Reels return early. That lens already hangs its single skirt just behind + // the fighters at z=55, and a second wall out at worldFar would sit behind + // that one where no reel frame ever looks -- pure cost, and a change to + // footage whose framing is test-enshrined. + if (reelGroundCamera()) return; + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = far + 2; + const wallBottom = floorY + 720; + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawRoomSurfaces(left, right, top, bottom, color) { + // The station has no room to surface. Every plane this function used to + // raise — the plaster sheet behind the fighters, the segmented left wall, + // the ceiling cap — existed because the map was an interior, and the space + // map is not one: what is behind a fighter here is the starfield the + // backdrop already painted, and putting a wall in front of it would be + // painting over the map's whole idea to save nothing. + // + // Two things survive, and both survive because they carry information. + // + // The heat lattice stays: it is the tile field made visible, and on a + // station it reads as a nav hologram hanging in the dark, which is a + // better home than the plaster it used to be ruled onto. + // + // The bounds stay, as a containment field rather than as masonry. This is + // not decoration — `resolveRunnerBounds` stops a body at exactly these two + // planes and `updateBullets` ricochets a pistol round off them, so a fight + // in open space still has two hard edges in it and a player who cannot see + // them is a player being lied to. Drawn as a pair of lit lines at the far + // plane, pulsing, because a wall you can see through is the only honest + // drawing of a rule you cannot walk through. + if (survivalActive()) { + const wallBottom = floorY + 3000; + const roomTop = top - 500; + const shade = mixColor(color, [226, 172, 168], .12); + worldQuad({ x: worldLeft, y: roomTop, z: worldFar }, + { x: worldRight, y: roomTop, z: worldFar }, + { x: worldRight, y: wallBottom, z: worldFar }, + { x: worldLeft, y: wallBottom, z: worldFar }, shade); + const sideFloor = terrainFloorAt(worldLeft) + 120; + const sideShade = mixColor(color, [232, 170, 153], .13); + for (let row = 0; row < 2; row++) { + for (let depth = 0; depth < 2; depth++) { + const y1 = lerp(roomTop, sideFloor, row / 2); + const y2 = lerp(roomTop, sideFloor, (row + 1) / 2); + const z1 = lerp(0, worldFar, depth / 2); + const z2 = lerp(0, worldFar, (depth + 1) / 2); + worldQuad({ x: worldLeft, y: y1, z: z1 }, + { x: worldLeft, y: y1, z: z2 }, + { x: worldLeft, y: y2, z: z2 }, + { x: worldLeft, y: y2, z: z1 }, sideShade); + } + } + const climbEdge = mixColor(color, [64, 78, 72], .24); + worldLine(worldLeft, top, worldFar - 4, worldLeft, bottom, worldFar - 4, + 9, climbEdge); + worldLine(worldRight, top, worldFar - 4, worldRight, bottom, worldFar - 4, + 9, climbEdge); + return; + } + // The heat's base is the vacuum it hangs in, so a cooling tile fades to + // nothing rather than settling into a visible panel with edges. Only the + // bloom is meant to be seen. + drawGridOverlay(mixColor(color, [6, 8, 20], .97), false); + const pulse = .5 + .5 * Math.sin(runtime().monotonicUs / 520000); + const field = mixColor([54, 120, 186], [136, 214, 255], .3 + pulse * .35); + for (const edgeX of [worldLeft, worldRight]) { + worldLine(edgeX, ceilingY, worldFar - 4, edgeX, floorY, worldFar - 4, + 9, field); + worldLine(edgeX, ceilingY, worldNear + 4, edgeX, floorY, worldNear + 4, + 5, mixColor(field, [8, 12, 28], .5)); + } +} + +function drawSurvivalLava(t) { + if (!survivalActive()) return; + const pulse = .5 + .5 * Math.sin(t * 3.1); + const surface = mixColor([255, 58, 24], [255, 212, 42], pulse * .42); + const body = mixColor([116, 10, 26], [238, 50, 18], .58 + pulse * .18); + const far = worldFar - 8; + const bottom = Math.max(floorY + 3000, survivalLavaY + 3200); + worldQuad({ x: worldLeft, y: survivalLavaY, z: far }, + { x: worldRight, y: survivalLavaY, z: far }, + { x: worldRight, y: bottom, z: far }, + { x: worldLeft, y: bottom, z: far }, body); + worldQuad({ x: worldLeft, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldFar }, + { x: worldLeft, y: survivalLavaY, z: worldFar }, surface); + for (let step = 0; step < 9; step++) { + const x1 = lerp(worldLeft, worldRight, step / 9); + const x2 = lerp(worldLeft, worldRight, (step + 1) / 9); + const y1 = survivalLavaY + Math.sin(t * 4.2 + step * 1.7) * 9; + const y2 = survivalLavaY + Math.sin(t * 4.2 + (step + 1) * 1.7) * 9; + worldLine(x1, y1, worldNear - 2, x2, y2, worldNear - 2, 7, surface); + } +} + +// The map's addressing, made visible: the same lattice the spawn marks and +// pickups are authored on, with the heat of `gridField` showing where the +// last half-second of the fight landed. Seams are thin quads rather than +// worldLines because the native renderer buries the whole line stratum +// beneath the world's triangles — the grid would vanish behind its own wall +// on console, the same way the gun once drew under the floor. +// +// A heated cell used to paint its entire ninety-unit face — a square as tall +// as a standing fighter, and a busy exchange flipped a dozen of them on and +// off at once. That is the stripes and the starfield again: a pattern the eye +// keeps reading behind the two things it is supposed to be watching. On the +// light theme it was worse than busy, because the slab's base is the vacuum, +// so what bloomed over the arena was a dark panel rather than heat. +// +// So the cell keeps its job and loses its size. Each hot tile draws a small +// jittered grain patch at its own centre, under half a tile across so two lit +// neighbours can never fuse back into a checker square. Heat sets how many +// specks are lit as well as how bright, so cooling reads as a patch thinning +// out — texture, at a scale that stays decoration. +function drawGridOverlay(shade, seamInk = null) { + const gridZ = worldFar - 2; + const gridTop = floorY - gridHeight; + const hot = mixColor([255, 138, 92], [204, 58, 46], visualTheme.light); + // Sixteen specks over a patch half a tile across, each of them a few units + // on a side against the tile's ninety, so the grain is a texture with air in + // it rather than a smaller solid square. + const grainSteps = 4; + const grainSpan = tileSize * .5; + for (let cell = 0; cell < gridField.length; cell++) { + const heat = gridField[cell]; + if (heat < .05) continue; + const centerX = gridLeft + (cell % gridCols + .5) * tileSize; + const centerY = floorY - (Math.floor(cell / gridCols) + .5) * tileSize; + const ink = mixColor(shade, hot, .4 + heat * .55); + for (let speck = 0; speck < grainSteps * grainSteps; speck++) { + // Hashed off the cell and the speck rather than noised, so a replayed + // round grains exactly the way the live one did. + const seed = .5 + .5 * Math.sin(cell * 12.9898 + speck * 78.233); + // Cooling puts specks out one at a time instead of dimming the lot. + if (seed > heat) continue; + const size = 2 + seed * 2 + heat * 2.5; + const x = centerX + (speck % grainSteps / (grainSteps - 1) - .5) * + grainSpan + (seed - .5) * 11; + const y = centerY + (Math.floor(speck / grainSteps) / (grainSteps - 1) - + .5) * grainSpan + (.5 - seed) * 11; + worldQuad({ x: x - size, y: y - size, z: gridZ }, + { x: x + size, y: y - size, z: gridZ }, + { x: x + size, y: y + size, z: gridZ }, + { x: x - size, y: y + size, z: gridZ }, ink); + } + } + // The climb's lattice is ruled onto plaster and takes its seam from that + // plaster. The station has no plaster, and ruling the same seams across + // vacuum drew a cage over the whole frame — brighter than the starfield it + // was supposed to hang behind, and carrying a hard bright bar wherever the + // ceiling row crossed the top of the shot. + // + // So the space map passes `false` and gets no seams at all. What it keeps + // is the half of this that was always the point: the heat. Cold tiles draw + // nothing, so the lattice is invisible until a blow lands and then blooms + // where it landed — the tile field showing its own contents rather than + // its own graph paper. The ruled version stays for the climb, where there + // is a wall to rule it onto. + if (seamInk === false) return; + const seam = seamInk || mixColor(shade, [30, 34, 48], .22); + const seamZ = gridZ - 1; + for (let col = 0; col <= gridCols; col++) { + const x = gridLeft + col * tileSize; + worldQuad({ x: x - 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: floorY, z: seamZ }, + { x: x - 1.5, y: floorY, z: seamZ }, seam); + } + for (let row = 0; row <= gridRows; row++) { + const y = floorY - row * tileSize; + worldQuad({ x: gridLeft, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y + 1.5, z: seamZ }, + { x: gridLeft, y: y + 1.5, z: seamZ }, seam); + } +} + +function drawTerrainGrass(left, right, color) { + // Twenty deterministic tufts cost forty native lines total. Keeping them on + // the line layer avoids turning background dressing into hundreds of faces. + const count = 100; + for (let index = 0; index < count; index++) { + const seed = .5 + .5 * Math.sin(index * 91.73 + terrainPhase * 2.31); + const x = lerp(worldLeft, worldRight, (index + .5) / count); + if (x < left || x > right) continue; + // Keep dressing in the near half of the floor. At the far plane the same + // blades collapse into horizon ticks instead of reading as foreground grass. + const z = lerp(worldNear * .88, worldNear * .22, + .5 + .5 * Math.sin(index * 37.11 + terrainPhase)); + const y = terrainFloorAt(x) - 2; + const height = 22 + seed * 22; + const tuft = mixColor(color, [48, 92, 54], .42 + seed * .22); + worldLine(x, y, z, x - 8 - seed * 5, y - height, z, 3, tuft); + worldLine(x, y, z, x + 7 + seed * 6, y - height * .82, z, 3, tuft); + } +} + +function drawBoosterPad(t) { + const pulse = .5 + .5 * Math.sin(t * 4); + const color = mixColor([55, 174, 244], [255, 224, 74], pulse * .55); + for (const boosterX of boosterXs) { + const y = terrainFloorAt(boosterX) - 7; + worldQuad( + { x: boosterX - boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: 86 }, + { x: boosterX - boosterRadius, y, z: 86 }, color); + } +} + +function drawSkyAtmosphere(sky, arena) { + // The station's background is one plain color, and the `wipe` at the top of + // the frame has already painted it -- so the space map draws no backdrop at + // all, and this function is the climb's weather again. + // + // It was a starfield: a hundred and twenty parallaxing stars, six gradient + // bands and a planet limb with a lit rim. @jeffrey asked for the same thing + // here he asked for of the cube's plaster -- "can the level background be + // plain colored? not stripey?" -- and the answer is the same both times. A + // decorative background is a pattern the eye keeps reading during a fight + // that has two small figures in it, and every one of those stars was + // competing with the thing you are supposed to be watching. The pattern went + // and about two hundred screen-space draws a frame went with it. + if (!survivalActive()) return; + // Broad D2D bands are effectively free compared with projected meshes and + // make the sky feel spatial without rebuilding a textured skybox each frame. + const bands = 6; + const bottom = Math.round(viewHeight * .78); + for (let band = 0; band < bands; band++) { + const y1 = Math.round(bottom * band / bands); + const y2 = Math.round(bottom * (band + 1) / bands); + const amount = (band + .5) / bands; + const color = mixColor(sky, arena, amount * .22); + box(0, y1, viewWidth(), y2 - y1 + 1, ...color); + } + const haze = mixColor(sky, arena, .34); + for (let streak = 0; streak < 11; streak++) { + const seed = .5 + .5 * Math.sin(streak * 41.37 + terrainPhase * 1.9); + const x = (streak + .18 + seed * .6) / 11 * viewWidth(); + const y = 88 + (.5 + .5 * Math.sin(streak * 19.17 - terrainPhase)) * + viewHeight * .43; + const reach = 32 + seed * 86; + line(x - reach, y, x + reach, y + (seed - .5) * 7, + 2 + seed * 2, ...haze); + } +} + +function shadowSurfaceY(x, y) { + return surfaceYAt(x, y); +} + +function drawSpotShadow(x, y, z, radius, color) { + const surfaceY = shadowSurfaceY(x, y); + const height = Math.max(0, surfaceY - y); + const reach = Math.min(520, height * .22); + const focus = clamp(1 - height / 5200, .42, 1); + const shadowX = x + globalLight.x * reach; + const shadowZ = z + globalLight.z * reach; + const center = projectPoint(shadowX, surfaceY - 2, shadowZ); + const edge = projectPoint(shadowX + radius, surfaceY - 2, shadowZ); + if (![center.x, center.y, edge.x, edge.y].every(Number.isFinite) || + [center.x, center.y, edge.x, edge.y].some((value) => Math.abs(value) > 30000)) + return; + const radiusX = Math.max(4, Math.abs(edge.x - center.x) * + (.5 + .18 * focus)); + const radiusY = Math.max(2, radiusX * (.2 + .08 * focus)); + // Bind the shadow to the owning object's depth, then bias it away from the + // camera. It remains above the terrain pass but can never win against the + // object that casts it. Restore the depth after — this used to leak, and + // everything drawn until the next assignment inherited the last shadow + // caster's depth: nondeterministic layering, frame to frame, on console. + const previousDepth = triangleDepth; + triangleDepth = projectPoint(x, y, z).z + .018; + const sides = 14; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + screenTriangle(center.x, center.y, + center.x + Math.cos(a) * radiusX, + center.y + Math.sin(a) * radiusY, + center.x + Math.cos(b) * radiusX, + center.y + Math.sin(b) * radiusY, ...color); + } + triangleDepth = previousDepth; +} + +function projectedBallRadius(ball) { + const center = projectPoint(ball.x, ball.y, ball.z); + const edge = projectPoint(ball.x + ball.radius, ball.y, ball.z); + // Do not impose a screen-space minimum: on the long street the camera can + // pull far back, and a fixed eight-pixel prop looked as if it grew relative + // to fighters and terrain. + return Math.max(.5, Math.abs(edge.x - center.x)); +} + +function drawSkateboard(player) { + const at = skateFrame(player); + const deck = [236, 76, 118], grip = [34, 25, 39], truck = [174, 184, 202]; + const quad = (a, b, c, d, color) => worldQuad(at(...a), at(...b), at(...c), at(...d), color); + const axle = (a, b, width, color) => { + const p = at(...a), q = at(...b); + worldCapsule(p.x, p.y, p.z, q.x, q.y, q.z, Math.max(.4, width * cameraScale()), color); + }; + // Far wheels, deck, near wheels: preserve occlusion in the Canvas2D host. + const wheel = (along, side) => { + const spin = player.skateSpin || 0; + const center = at(along, skateAxleDrop, side * 15); + for (let i = 0; i < 10; i++) { + const a = spin + i * Math.PI / 5, b = spin + (i + 1) * Math.PI / 5; + worldTriangle(center, + at(along + Math.cos(a) * skateWheelRadius, + skateAxleDrop + Math.sin(a) * skateWheelRadius, side * 15), + at(along + Math.cos(b) * skateWheelRadius, + skateAxleDrop + Math.sin(b) * skateWheelRadius, side * 15), + i % 5 === 0 ? truck : [243, 210, 103]); + } + }; + const near = cameraDoll.position.z < player.z ? -1 : 1; + for (const along of [-skateTruck, skateTruck]) wheel(along, -near); + quad([-48, -4, -12], [48, -4, -12], [48, -4, 12], [-48, -4, 12], grip); + quad([-48, -4, near * 12], [48, -4, near * 12], [48, 0, near * 12], [-48, 0, near * 12], deck); + for (const end of [-1, 1]) + quad([end * 48, -4, -12], [end * 64, -12, -10], + [end * 64, -12, 10], [end * 48, -4, 12], deck); + for (const along of [-skateTruck, skateTruck]) { + axle([along, 0, 0], [along, skateAxleDrop, 0], 4, truck); + axle([along, skateAxleDrop, -15], [along, skateAxleDrop, 15], 3, truck); + wheel(along, near); + } +} + +function drawBall(ball) { + if (!ball.active) return; + const point = projectPoint(ball.x, ball.y, ball.z); + // A ball is a sphere in the orthographic world. Measuring its projected + // world radius keeps the screen hit shape circular while still respecting + // the perspective intro and loss cameras. + const radius = projectedBallRadius(ball); + if (!Number.isFinite(point.x) || !Number.isFinite(point.y) || + !Number.isFinite(radius) || radius > 12000 || point.x + radius < 0 || + point.x - radius > viewWidth() || point.y + radius < 0 || + point.y - radius > viewHeight) return; + const soccer = ball.type === "soccer"; + const beach = ball.type === "beach"; + const skateboard = ball.type === "skateboard"; + const polygon = (x, y, polygonRadius, sides, rotation, color) => { + for (let side = 0; side < sides; side++) { + const a = rotation + side * Math.PI * 2 / sides; + const b = rotation + (side + 1) * Math.PI * 2 / sides; + screenTriangle(x, y, + x + Math.cos(a) * polygonRadius, + y + Math.sin(a) * polygonRadius, + x + Math.cos(b) * polygonRadius, + y + Math.sin(b) * polygonRadius, ...color); + } + }; + if (skateboard) { + drawSkateboard({ x: ball.x, y: ball.y + skateAxleDrop + skateWheelRadius, + z: ball.z, skatePitch: ball.rotation, skateSpin: ball.skateSpin || 0 }); + return; + } + if (beach) { + const panels = [ + [244, 66, 96], [255, 146, 52], [255, 226, 66], [72, 210, 126], + [54, 196, 224], [70, 112, 238], [184, 82, 224], + ]; + const palettePhase = runtime().monotonicUs / 850000; + const paletteStep = Math.floor(palettePhase); + const paletteMix = palettePhase - paletteStep; + const sides = 16; + for (let side = 0; side < sides; side++) { + const a = ball.rotation + side * Math.PI * 2 / sides; + const b = ball.rotation + (side + 1) * Math.PI * 2 / sides; + // Native monotonic time can read negative, and a negative remainder + // would index off the front of the palette. + const panel = ((Math.floor(side / 2) + paletteStep) % panels.length + + panels.length) % panels.length; + const panelColor = mixColor(panels[panel], + panels[(panel + 1) % panels.length], paletteMix); + screenTriangle(point.x, point.y, + point.x + Math.cos(a) * radius * .92, + point.y + Math.sin(a) * radius * .92, + point.x + Math.cos(b) * radius * .92, + point.y + Math.sin(b) * radius * .92, + ...panelColor); + } + filledDisc(point.x, point.y, radius * .13, [246, 241, 220]); + return; + } + filledDisc(point.x, point.y, radius * .92, + soccer ? [226, 232, 224] : [232, 104, 28]); + const seam = [42, 31, 29]; + if (soccer) { + polygon(point.x, point.y, radius * .22, 5, + ball.rotation - Math.PI / 2, seam); + for (let patch = 0; patch < 5; patch++) { + const angle = ball.rotation + patch * Math.PI * 2 / 5; + const patchX = point.x + Math.cos(angle) * radius * .58; + const patchY = point.y + Math.sin(angle) * radius * .58; + filledCapsule(point.x + Math.cos(angle) * radius * .2, + point.y + Math.sin(angle) * radius * .2, + patchX, patchY, Math.max(1.5, radius * .035), seam); + polygon(patchX, patchY, radius * .13, 5, + angle - Math.PI / 2, seam); + } + } else { + const width = Math.max(2, radius * .075); + for (const angle of [ball.rotation, ball.rotation + Math.PI / 2]) { + const dx = Math.cos(angle) * radius * .84; + const dy = Math.sin(angle) * radius * .84; + filledCapsule(point.x - dx, point.y - dy, + point.x + dx, point.y + dy, width, seam); + } + for (const direction of [-1, 1]) { + let previous = null; + for (let step = -6; step <= 6; step++) { + const y = step / 6 * radius * .82; + const x = direction * Math.cos(step / 6 * Math.PI / 2) * radius * .42; + const next = { x: point.x + x, y: point.y + y }; + if (previous) filledCapsule(previous.x, previous.y, + next.x, next.y, width, seam); + previous = next; + } + } + filledDisc(point.x, point.y, Math.max(1.5, width * .55), seam); + } +} + +// What the bot saw this tick, drawn where it saw it: every rung in its frame +// gets a lip line, the deck it is jumping for gets its landing band, and the +// footing gets the window a jump may start from. A person watching a bot +// stand still can now read whether it is waiting for a deck to enter frame. +function drawBotScene(player) { + if (renderFlags.hud === false) return; + if (!debugHitboxes || !player.bot || !player.botScene) return; + const scene = player.botScene; + const seen = [58, 222, 255]; + for (const rung of scene.rungs) + hudWorldLine(rung.left, rung.y, 0, rung.right, rung.y, 0, 3, seen); + const goal = player.botSubgoal; + if (goal && goal.kind === "jump") { + const band = [120, 255, 120]; + hudWorldLine(goal.landLeft, goal.y, 0, goal.landRight, goal.y, 0, 6, band); + hudWorldLine(goal.aim, goal.y, 0, goal.aim, goal.y - 40, 0, 3, band); + const footing = scene.self.footing; + if (footing) + hudWorldLine(goal.takeoffLeft, footing.y, 0, goal.takeoffRight, + footing.y, 0, 6, [255, 214, 90]); + } + if (scene.lava) + hudWorldLine(worldLeft, scene.lava.y, 0, worldRight, scene.lava.y, 0, 3, + [255, 110, 70]); +} + +function drawBallHitboxes() { + if (renderFlags.hud === false) return; + if (!debugHitboxes) return; + for (const item of balls) { + if (!item.active) continue; + const point = projectPoint(item.x, item.y, item.z); + const radius = projectedBallRadius(item); + if (![point.x, point.y, radius].every(Number.isFinite) || radius > 5000 || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledRing(point.x, point.y, radius + 5, radius + 2, [58, 222, 255]); + } +} + +function drawGunPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const scale = cameraScale(); + const metal = mixColor([202, 212, 228], [52, 59, 72], visualTheme.light); + const grip = mixColor([126, 106, 88], [40, 43, 52], visualTheme.light); + const barrelWidth = Math.max(2, 5 * scale); + const gripWidth = Math.max(2, 4 * scale); + const smg = pickup.kind === "RUBBER SMG"; + const rocket = pickup.kind === "ROCKET LAUNCHER"; + if (pickup.kind === "SPACE LASER") { + // Short body, long emitter, and a lit coil at the breech so the thing on + // the top deck is identifiable as light-bearing from the floor three + // decks below. The pulse is on the same 3 Hz bob as every other pickup. + const glow = mixColor([96, 226, 255], [236, 255, 255], + .4 + .35 * Math.sin(t * 5.2)); + const shell = mixColor([206, 224, 240], [44, 54, 78], visualTheme.light); + worldCapsule(pickup.x - 22, bobY, pickup.z, + pickup.x + 14, bobY, pickup.z, barrelWidth * 1.5, shell, -.02); + worldCapsule(pickup.x + 14, bobY, pickup.z, + pickup.x + 40, bobY, pickup.z, barrelWidth * .7, glow, -.02); + worldCapsule(pickup.x - 14, bobY - 9, pickup.z, + pickup.x - 2, bobY - 9, pickup.z, barrelWidth * .6, glow, -.02); + worldCapsule(pickup.x - 6, bobY + 2, pickup.z, + pickup.x - 1, bobY + 22, pickup.z, gripWidth * 1.2, grip, -.02); + return; + } + // A handgun-sized world object in gunmetal and grip material, not a glowing + // pickup glyph with a second silhouette around it. + // Capsules, not line() — the native renderer buries the whole line + // stratum beneath the world's triangles, which is how the gun spent a day + // drawn under the floor on console while the web shell showed it fine. + worldCapsule(pickup.x - (rocket ? 58 : smg ? 42 : 16), bobY, pickup.z, + pickup.x + (rocket ? 62 : smg ? 48 : 20), bobY, pickup.z, + rocket ? barrelWidth * 2.2 : smg ? barrelWidth * 1.45 : barrelWidth, + rocket ? [48, 61, 52] : metal, -.02); + worldCapsule(pickup.x + (smg ? 8 : 2), bobY + 1, pickup.z, + pickup.x + (smg ? 13 : 8), bobY + (smg ? 27 : 18), pickup.z, + smg ? gripWidth * 1.5 : gripWidth, grip, -.02); + if (smg) { + worldCapsule(pickup.x - 42, bobY, pickup.z, + pickup.x - 65, bobY + 18, pickup.z, barrelWidth, grip, -.02); + worldCapsule(pickup.x - 6, bobY + 4, pickup.z, + pickup.x - 1, bobY + 30, pickup.z, gripWidth * 1.4, metal, -.02); + } + if (rocket) { + worldCapsule(pickup.x + 50, bobY, pickup.z, + pickup.x + 68, bobY, pickup.z, barrelWidth * 2.8, [104, 62, 48], -.02); + worldCapsule(pickup.x - 8, bobY + 3, pickup.z, + pickup.x - 3, bobY + 30, pickup.z, gripWidth * 1.5, [38, 45, 42], -.02); + } +} + +// A saber waiting on a deck: the hilt standing upright with a stub of blade +// lit above it, bobbing on the same clock as every other pickup so the map's +// loose objects share one heartbeat. Drawn short on purpose — a full-length +// blade planted in a deck would read as scenery, and this is something you +// pick up. Capsules rather than lines, for the same reason the pistol is +// capsules: the native renderer buries the whole line stratum under the +// world's triangles, and the blade would vanish into the deck it sits on. +function drawSaberPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const pulse = .5 + .5 * Math.sin(t * 5.6 + pickup.x * .002); + const glow = mixColor([120, 226, 255], [244, 252, 255], .35 + pulse * .4); + const hilt = mixColor([172, 182, 198], [46, 52, 68], visualTheme.light); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 34, pickup.z, 13, glow, -.02); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 30, pickup.z, 6, [244, 252, 255], -.02); + worldCapsule(pickup.x, bobY + 6, pickup.z, + pickup.x, bobY + 34, pickup.z, 9, hilt, -.02); + worldCapsule(pickup.x - 13, bobY + 8, pickup.z, + pickup.x + 13, bobY + 8, pickup.z, 5, hilt, -.02); +} + +function drawBullet(bullet) { + const previous = projectPoint(bullet.previousX ?? bullet.x, + bullet.previousY ?? bullet.y, bullet.z); + const point = projectPoint(bullet.x, bullet.y, bullet.z); + const blink = Math.floor(runtime().monotonicUs / 65000 + bullet.owner) % 2; + // A bolt does not blink. The pistol round's alternating white is what makes + // a slow ricochet findable against a busy floor; the laser is gone in four + // frames and wants to read as one continuous line of light instead. + const core = bullet.spit + ? bullet.heavy ? [255, 92, 174] : [118, 255, 196] + : bullet.laser ? [236, 255, 255] + : blink ? [255, 255, 248] + : bullet.rubber ? [255, 226, 58] : [255, 178, 76]; + const trail = bullet.spit + ? bullet.heavy ? [182, 48, 116] : [58, 190, 132] + : bullet.laser ? [96, 226, 255] + : blink ? [255, 244, 178] + : bullet.rubber ? [214, 178, 42] : [224, 116, 62]; + const scale = cameraScale(); + // Project the complete projectile. The old 2px/4px floors made both the + // trail and blinking core behave like HUD icons once the street zoomed out. + // + // Spit is dots, not tracers: the streak between frames is the thing that + // says "bullet", so a glob doesn't draw one — just a little ball with a + // couple of droplets falling off the arc behind it. + if (bullet.spit) { + // A glob must survive the wide portrait camera as a ball, not sub-pixel + // dust. The darker halo keeps its circular edge legible over sky or earth. + const radius = Math.max(2, (bullet.heavy ? 10 : 7) * scale); + filledDisc(point.x, point.y, radius * 1.35, trail); + filledDisc(point.x, point.y, radius, core); + filledDisc(lerp(point.x, previous.x, .5), lerp(point.y, previous.y, .5), + radius * .45, trail); + filledDisc(previous.x, previous.y, radius * .25, trail); + return; + } + drawBulletTrail(bullet, trail, scale); + if (bullet.laser) { + // Drawn as the stride itself: at 9,600 units a second the gap between two + // frames IS the beam, so a wide cyan sheath over a white core along that + // gap is the whole shot. No round cap at the tip — a bolt has a leading + // edge, not a head. + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(1.2, 9 * scale), trail); + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, 3.5 * scale), core); + return; + } + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, (bullet.rubber ? 4 : 3) * scale), trail); + filledDisc(point.x, point.y, Math.max(.9, 7 * scale), core); +} + +// The ghost of where a round has been. Walked oldest to newest so the fade +// runs the right way down the path, and drawn thin: the live tracer is the +// bullet, this is only the shape its bounces have written. +// +// Bare quads, NOT filledCapsule. A capsule is two triangles plus two discs and +// a small disc is a six-sided fan, so it costs ten faces — at the 24-bullet cap +// that is 3,600 faces of ghost against a ~2,100-face frame, which is the eleven +// -frames-a-second stray wearing a different hat. Two faces a segment caps the +// worst case at 528, and a trail wants no round caps anyway. +function drawBulletTrail(bullet, ink, scale) { + const stored = Math.min(bullet.trailCount || 0, bulletTrailPoints); + if (stored < 2) return; + // The same leash the camera uses. A round that has sailed out of the fight + // is off screen, and its ghost should not be paid for either. + if (!players.some((player) => + Math.abs(bullet.x - player.x) < 5200 && + Math.abs(bullet.y - player.y) < 5200)) return; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const oldest = (bullet.trailCount || 0) - stored; + let previous = null; + for (let step = 0; step < stored; step++) { + const slot = ((oldest + step) % bulletTrailPoints) * 2; + const here = projectPoint(bullet.trail[slot], bullet.trail[slot + 1], + bullet.z); + if (previous) { + // Newer segments carry more of the tracer's weight and colour, so the + // tail thins toward nothing rather than stopping on a hard edge. + const age = step / stored; + const radius = Math.max(.4, (bullet.rubber ? 3 : 2.2) * scale * age) / 2; + const dx = here.x - previous.x; + const dy = here.y - previous.y; + const length = Math.hypot(dx, dy); + if (length > .001) { + const nx = -dy / length * radius; + const ny = dx / length * radius; + const [r, g, b] = mixColor(ground, ink, .18 + age * .55); + screenTriangle(previous.x + nx, previous.y + ny, + previous.x - nx, previous.y - ny, here.x + nx, here.y + ny, r, g, b); + screenTriangle(previous.x - nx, previous.y - ny, + here.x - nx, here.y - ny, here.x + nx, here.y + ny, r, g, b); + } + } + previous = here; + } +} + +function drawGrenadePickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3.2 + pickup.x * .001) * 8; + const point = projectPoint(pickup.x, bobY, pickup.z); + const scale = cameraScale(); + const shell = mixColor([166, 194, 112], [72, 96, 58], visualTheme.light); + const fuse = mixColor([210, 218, 232], [45, 50, 60], visualTheme.light); + const radius = Math.max(3, 9 * scale); + const previousDepth = triangleDepth; + triangleDepth = point.z - .02; + filledDisc(point.x, point.y, radius, shell); + triangleDepth = previousDepth; + worldCapsule(pickup.x + 1, bobY - 10, pickup.z, + pickup.x + 11, bobY - 20, pickup.z, Math.max(2, 3 * scale), fuse, -.02); +} + +function drawGrenade(grenade) { + const point = projectPoint(grenade.x, grenade.y, grenade.z); + if (grenade.exploding) { + const radius = grenade.blastRadius * cameraScale(); + const width = Math.max(3, 10 * cameraScale()); + filledRing(point.x, point.y, radius, + Math.max(0, radius - width), [255, 105, 105]); + return; + } + if (grenade.rocket) { + const length = Math.hypot(grenade.vx, grenade.vy) || 1; + const tail = projectPoint(grenade.x - grenade.vx / length * 54, + grenade.y - grenade.vy / length * 54, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(5, 13 * cameraScale()), [52, 65, 56]); + filledDisc(point.x, point.y, Math.max(5, 12 * cameraScale()), [190, 74, 54]); + const flame = projectPoint(grenade.x - grenade.vx / length * 88, + grenade.y - grenade.vy / length * 88, grenade.z); + filledCapsule(flame.x, flame.y, tail.x, tail.y, + Math.max(3, 7 * cameraScale()), [255, 214, 72]); + return; + } + const blink = grenade.fuse < .45 && Math.floor(grenade.fuse * 20) % 2 === 0; + const color = blink ? [255, 255, 255] : players[grenade.owner].color; + filledDisc(point.x, point.y, Math.max(4, 22 * cameraScale()), color); + const tail = projectPoint(grenade.x - Math.sign(grenade.vx) * 90, + grenade.y - 14, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(2, 6 * cameraScale()), color); +} + +function drawWindFlag(t, color) { + const poleX = (platformLeft + platformRight) / 2; + const poleZ = 480; + const poleBottom = platformY; + const poleTop = platformY - 150; + const calm = windMph < .35; + const flagHeight = 68; + const length = calm ? 58 : 78 + windMph * 7; + const gust = calm ? 0 + : Math.sin(t * (4 + windMph * .16)) * (10 + windMph * .8); + const tipX = poleX + windDirection * length; + const tipY = poleTop + flagHeight * .5 + gust; + const width = Math.max(3, 13 * cameraScale()); + const poleInk = mixColor([214, 222, 236], [50, 57, 70], visualTheme.light); + const edgeInk = mixColor([242, 246, 252], [26, 31, 44], visualTheme.light); + const fabric = calm + ? mixColor([92, 205, 255], [35, 112, 190], visualTheme.light) : color; + const flagPoints = [ + projectPoint(poleX, poleTop, poleZ), + projectPoint(tipX, tipY, poleZ), + projectPoint(poleX, poleTop + flagHeight, poleZ), + ]; + if (flagPoints.every((point) => [point.x, point.y, point.z].every(Number.isFinite))) + projectedTriangle(flagPoints[0], flagPoints[1], flagPoints[2], fabric); + worldCapsule(poleX, poleBottom, poleZ, + poleX, poleTop, poleZ, width, poleInk); + const edgeWidth = Math.max(2, width * .34); + worldCapsule(poleX, poleTop, poleZ, + tipX, tipY, poleZ, edgeWidth, edgeInk); + worldCapsule(tipX, tipY, poleZ, + poleX, poleTop + flagHeight, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX, poleTop + flagHeight, poleZ, + poleX, poleTop, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX - 35, poleBottom, poleZ, + poleX + 35, poleBottom, poleZ, width, poleInk); +} + +function hashUnit(text) { + let hash = 2166136261; + for (let cursor = 0; cursor < text.length; cursor++) { + hash ^= text.charCodeAt(cursor); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967295; +} + +function airSeedValue(index, channel = 0) { + return hashUnit("oskiewar-air:" + index + ":" + channel); +} + +function resetAirParticles() { + const count = 18; + const spanX = worldRight - worldLeft; + const spanY = floorY - ceilingY; + const spanZ = worldFar - worldNear; + airParticles.length = 0; + for (let index = 0; index < count; index++) + airParticles.push({ + id: "air:" + index, + kind: "air", + position: { + x: worldLeft + airSeedValue(index, 1) * spanX, + y: ceilingY + 180 + airSeedValue(index, 2) * (spanY - 360), + z: worldNear + 100 + airSeedValue(index, 3) * (spanZ - 200), + }, + velocity: { x: 0, y: 0, z: 0 }, + radius: 8 + airSeedValue(index, 4) * 14, + phase: airSeedValue(index, 5) * Math.PI * 2, + }); +} + +// A stream-function curl gives the air a divergence-free-looking circulation +// instead of independent sine wiggles. Entities relax toward this velocity, +// advect in fixed simulation time, and wrap at arena boundaries. +function airFlowAt(position, seconds, phase) { + const nx = (position.x - worldLeft) / (worldRight - worldLeft) * Math.PI * 2; + const ny = (position.y - ceilingY) / (floorY - ceilingY) * Math.PI * 2; + const age = seconds * .32 + phase; + const circulation = 96; + return { + x: windDirection * (42 + windMph * 12) + + circulation * Math.sin(nx + age) * Math.cos(ny - age * .7), + y: -circulation * Math.cos(nx + age) * Math.sin(ny - age * .7), + z: 44 * Math.sin(nx + ny + age * .55), + }; +} + +const wrapWorld = (value, low, high) => { + const span = high - low; + return low + ((value - low) % span + span) % span; +}; + +function simulateAirParticles(dt, now) { + if (!airParticles.length) resetAirParticles(); + const seconds = now / 1000000; + const response = 1 - Math.exp(-dt * 2.8); + for (const entity of airParticles) { + const flow = airFlowAt(entity.position, seconds, entity.phase); + entity.velocity.x = lerp(entity.velocity.x, flow.x, response); + entity.velocity.y = lerp(entity.velocity.y, flow.y, response); + entity.velocity.z = lerp(entity.velocity.z, flow.z, response); + entity.position.x = wrapWorld(entity.position.x + entity.velocity.x * dt, + worldLeft, worldRight); + entity.position.y = wrapWorld(entity.position.y + entity.velocity.y * dt, + ceilingY + 120, floorY - 120); + entity.position.z = wrapWorld(entity.position.z + entity.velocity.z * dt, + worldNear + 80, worldFar - 80); + } +} + +function drawAmbientMotes(color) { + const previousDepth = triangleDepth; + for (const entity of airParticles) { + const { x, y, z } = entity.position; + const point = projectPoint(x, y, z); + const edge = projectPoint(x + entity.radius, y, z); + const radius = Math.max(.8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const depthAmount = (z - worldNear) / (worldFar - worldNear); + const ink = mixColor([18, 24, 48], color, .24 + (1 - depthAmount) * .34); + if (![point.x, point.y, point.z, radius].every(Number.isFinite) || + point.x < stageLeft - radius || point.x > stageRight + radius || + point.y < -radius || point.y > viewHeight + radius) continue; + triangleDepth = point.z; + filledDisc(point.x, point.y, radius, ink); + } + triangleDepth = previousDepth; +} + +function drawSelectPortrait(player, x, y, scale, t) { + const color = player.color; + const head = { x, y: y - 130 * scale, radius: 34 * scale }; + filledDisc(head.x, head.y, head.radius + Math.max(2, 3 * scale), [8, 12, 24]); + filledDisc(head.x, head.y, head.radius, color); + hudLine(x, y - 94 * scale, x, y + 20 * scale, 12 * scale, ...color); + hudLine(x, y - 65 * scale, x - 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y - 65 * scale, x + 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y + 20 * scale, x - 48 * scale, y + 112 * scale, 11 * scale, ...color); + hudLine(x, y + 20 * scale, x + 48 * scale, y + 112 * scale, 11 * scale, ...color); + drawFace(player, head, contrastShadow(color), t); +} + +function selectionPreview(option) { + return { ...players[1], name: option.fighter.handle, + color: option.fighter.color, + npc: option.kind === "dummy" || option.kind === "bot", + bot: option.kind === "bot" }; +} + +function drawSelectionScreen(t, ink, panel) { + const layout = selectionTouchLayout(); + const hover = selectionHover(layout); + if (globalThis.__oskiewarTouch) globalThis.__oskiewarTouch.hover = hover; + const compact = compactLayout(); + const title = selectionStep === 0 ? "pick your pal" : "who are you fighting?"; + const titleSize = compact ? 36 : 58; + const titleY = compact ? 58 : 86; + const titleWidth = handleWidth(title, titleSize); + typeWrite(title, viewCenterX() - titleWidth / 2, titleY, titleSize, ...ink); + const stepText = (selectionStep + 1) + "/2"; + const stepSize = compact ? 24 : 32; + typeWrite(stepText, layout.back.x + layout.back.width + (compact ? 18 : 28), + layout.back.y + (compact ? 11 : 18), stepSize, + ...mixColor([140, 150, 185], ink, .35)); + const backHovered = hover?.back; + const options = selectionOptions(); + // Neighbours first so the focused card always lands on top of them. + const wheel = [...layout.options].sort((a, b) => + Math.abs(b.slot) - Math.abs(a.slot)); + for (const rect of wheel) { + const option = options[rect.index]; + const player = selectionPreview(option); + const disabled = Boolean(option.disabled); + const hovered = !disabled && hover?.option === rect.index; + const focused = !disabled && rect.slot === 0; + const disabledInk = mixColor([74, 80, 96], [164, 168, 178], + visualTheme.light); + const optionColor = disabled ? disabledInk : option.fighter.color; + if (hovered || focused) + box(rect.x, rect.y + rect.height - (hovered ? 8 : 5), rect.width, + hovered ? 8 : 5, ...optionColor); + const scale = rect.height / 520 * 1.05; + const portraitY = rect.y + rect.height * (compact ? .55 : .53); + drawSelectPortrait(player, rect.x + rect.width / 2, portraitY, scale, t); + const label = option.fighter.handle.toLowerCase(); + const labelSize = Math.max(16, Math.round(rect.width * .085)); + const labelWidth = handleWidth(label, labelSize); + drawHandle(label, rect.x + (rect.width - labelWidth) / 2, + rect.y + rect.height - labelSize - (compact ? 10 : 18), labelSize, + disabled ? [disabledInk] : option.fighter.colors, optionColor); + } + // Chevrons inside the focused card name the gesture that turns the wheel, + // without crowding the neighbours they point at. + if (layout.options.length > 1) { + const focus = layout.options.find((rect) => rect.slot === 0); + const arrowSize = compact ? 30 : 52; + const arrowY = focus.y + focus.height / 2 - arrowSize / 2; + const inset = (compact ? 8 : 14) + Math.sin(t * 3.4) * (compact ? 3 : 6); + typeWrite("<", focus.x + inset, arrowY, arrowSize, ...ink); + typeWrite(">", focus.x + focus.width - inset - + comicGlyphAdvance(">", arrowSize), arrowY, arrowSize, ...ink); + } + // Keep navigation above every option on narrow/tall browser layouts. + box(layout.back.x, layout.back.y, layout.back.width, layout.back.height, + ...mixColor(panel, ink, backHovered ? .25 : .08)); + typeWrite("< back", layout.back.x + (compact ? 12 : 20), + layout.back.y + (compact ? 10 : 17), compact ? 25 : 34, ...ink); + const controls = selectionControlKeys(); + drawCenteredKeycapRun(controls, viewHeight - (compact ? 52 : 66), + compact ? 15 : 20, inputPads[0]?.down || [], ink); +} + +const titlePaletteNight = [ + [255, 105, 190], [111, 232, 210], [255, 232, 92], [130, 150, 255], + [255, 126, 92], [188, 128, 255], [92, 205, 255], [246, 248, 255], +]; +const titlePaletteDay = [ + [190, 32, 118], [0, 126, 124], [176, 112, 0], [73, 82, 190], + [204, 59, 43], [114, 68, 185], [24, 107, 181], [47, 56, 82], +]; + +function animatedTitleColor(index, t, daylight = visualTheme.light) { + const count = titlePaletteNight.length; + // Native monotonic time can begin a fraction before startedAt settles. + // Normalize the remainder so that first frame still lands in the palette. + const phase = ((index + t * .42) % count + count) % count; + const from = Math.floor(phase); + const amount = phase - from; + const eased = amount * amount * (3 - amount * 2); + const night = mixColor(titlePaletteNight[from], + titlePaletteNight[(from + 1) % count], eased); + const day = mixColor(titlePaletteDay[from], + titlePaletteDay[(from + 1) % count], eased); + return mixColor(night, day, daylight); +} + +// The dummy count, as a sentence. The host hands over a window and a total; +// the window is already the shortest one that had anything in it, so all that +// is left here is to say it in English. Zero returns nothing at all — an +// arcade does not advertise that nobody played today. +function dummyPopLine(stat) { + const pops = Math.floor(Number(stat?.pops) || 0); + const hours = Math.floor(Number(stat?.hours) || 0); + if (pops <= 0 || hours <= 0 || hours > 48) return ""; + return pops + " dummy head" + (pops === 1 ? "" : "s") + " popped in the last " + + (hours === 1 ? "hour" : hours + " hours"); +} + +function drawDummyPopLine(titleY, titleSize, transitionInk) { + // Not on the poster: the social preview is burned to a file whose hash is + // checked at deploy, and a number that moves would make it stale hourly. + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const line = dummyPopLine(capabilities().pops); + if (!line) return; + const size = Math.round(hudTypeSize * (compactLayout() ? .46 : .56)); + const width = handleWidth(line, size); + const x = viewCenterX() - width / 2; + const y = titleY + titleSize + (compactLayout() ? 12 : 18); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || + mixColor([198, 206, 232], [58, 70, 104], visualTheme.light); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); +} + +// "Add your coach." @jeffrey: "itd be cool so any user can claude into an +// oskiewar game ... 'coach' would be the feature ... which could then analyze +// your matches / do things / get ur data". The relay has always counted a +// read-only `agent` seat apart from the grandstand; this offers that seat on +// the title as a thing a player can do — hand oskiewar.com/coach.mjs to their +// own Claude and it sits in on this room, reading every frame a phone reads. +// The room name is the whole invitation, since it is what a coach attaches +// to, so it is printed here under START where a newcomer is already looking. +// Once a coach is seated the line says so, with the antenna the debug +// read-out lights, and keeps the name up so the player can tell the coach is +// watching this room and not an earlier one. Never on the poster: the social +// preview is hash-bound, and a room name changes with every burn. +function drawCoachLine(button, transitionInk) { + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const room = versusRoomName || sessionName; + if (!room) return; + const compact = compactLayout(); + const linked = linkedAgents(); + const line = linked ? "coach linked " + room + : "add your coach oskiewar.com/coach " + room; + const size = Math.round(hudTypeSize * (compact ? .46 : .56)); + const width = handleWidth(line, size); + const glyph = linked ? Math.round(size * 1.2) : 0; + const x = viewCenterX() - (width + glyph) / 2 + glyph; + const y = button.y + button.height + (compact ? 6 : 10); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || (linked ? [120, 226, 255] + : mixColor([198, 206, 232], [58, 70, 104], visualTheme.light)); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); + if (linked) drawAgentLink(x - glyph * .6, y + size * .55, size / 26, linked); +} + +function titleButtonRect() { + const compact = compactLayout(); + const textSize = hudTypeSize; + const textWidth = handleWidth("start", textSize); + const width = textWidth + (compact ? 54 : 76); + const height = textSize + (compact ? 24 : 34); + return { x: viewCenterX() - width / 2, + y: viewHeight * (compact ? .61 : .64) - (compact ? 10 : 15), + width, height, textSize, textWidth }; +} + +// A letter you can push around. `grow` eases toward 1 while the pointer is on +// it and `kick` is a decaying shudder fired the frame it is first touched, so +// the word answers one letter at a time instead of inflating as a block. +function toyGlyph(toys, index, hot, dt) { + const toy = toys[index] || (toys[index] = { grow: 0, kick: 0, hot: false }); + toy.grow += ((hot ? 1 : 0) - toy.grow) * (1 - Math.exp(-dt * (hot ? 16 : 7))); + if (hot && !toy.hot) toy.kick = 1; + toy.hot = hot; + toy.kick *= Math.exp(-dt * 5.5); + return toy; +} + +const pointInCell = (point, x, y, width, height) => point && x <= point.x && + point.x <= x + width && y <= point.y && point.y <= y + height; + +// Screen-space outline, four boxes, no projection — safe anywhere. +function strokeBox(x, y, width, height, thickness, color) { + hudBox(x, y, width, thickness, ...color); + hudBox(x, y + height - thickness, width, thickness, ...color); + hudBox(x, y, thickness, height, ...color); + hudBox(x + width - thickness, y, thickness, height, ...color); +} + +function drawTitleScreen(t, ink, transitionAge = -1) { + const compact = compactLayout(); + const socialPreview = typeof capabilities === "function" && + capabilities().socialPreview === true; + // Keep the game identity visible on the opening frame. The live fighters + // and START remain interactive beneath the wordmark. + const title = "oskiewar"; + const version = "v" + buildVersion; + const breath = 1 + Math.sin(t * .9) * .018; + const socialLockupGap = compact ? 10 : 18; + const socialTitleSize = Math.min(220, + (viewWidth() - 56 - socialLockupGap) / + (handleWidth(title, 1) + handleWidth(version, .3))); + const titleSize = (socialPreview ? socialTitleSize : compact ? 88 : 154) * breath; + const titleWidth = handleWidth(title, titleSize); + const versionSize = Math.round(titleSize * .3); + const versionWidth = handleWidth(version, versionSize); + const lockupGap = socialPreview ? socialLockupGap : compact ? 10 : 18; + const lockupWidth = titleWidth + lockupGap + versionWidth; + const titleX = viewCenterX() - lockupWidth / 2; + const titleY = viewHeight * (compact ? .38 : .35); + + // Air fuzzies: sparse motes drifting the whole frame, no panels or stripes + // behind the wordmark. + if (transitionAge < 0 && renderFlags.dust !== false) + for (let index = 0; index < (compact ? 10 : 16); index++) { + const phase = index * 2.39996; + const x = stageLeft + (stageRight - stageLeft) * + (.5 + .47 * Math.sin(t * (.055 + index % 5 * .01) + phase)); + const y = viewHeight * + (.5 + .45 * Math.cos(t * (.043 + index % 4 * .012) + phase * 1.7)); + const radius = (compact ? 2 : 3) + (index % 3); + hudCircle(x, y, radius, Math.max(1.5, radius * .48), + animatedTitleColor(index, t * .7)); + } + + let cursor = titleX; + // Kerning scaffold: one cell per glyph, taken from the same advance the + // layout walks, so drift and bob read against their own metrics. + const glyphCells = debugHitboxes && transitionAge < 0 && !socialPreview && + renderFlags.hud !== false ? [] : null; + const flashPalette = [[255, 226, 48], [70, 224, 92], [181, 255, 48]]; + const flash = transitionAge >= 0 + ? flashPalette[Math.floor(transitionAge / .065) % flashPalette.length] : null; + const fade = transitionAge >= 0 ? clamp((transitionAge - .46) / .24, 0, 1) : 0; + const transitionInk = flash ? mixColor(flash, [7, 10, 26], fade) : null; + // Toys ease in real time, and the burn renders headless with no pointer, so + // the poster stays the same picture it always was. + const dt = titleToyAt < 0 ? 0 : clamp(t - titleToyAt, 0, .1); + titleToyAt = t; + const raw = globalThis.__oskiewarTouch?.pointer; + const pointer = transitionAge < 0 && !socialPreview && raw?.active && + Number.isFinite(raw.x) && Number.isFinite(raw.y) ? raw : null; + let held = -1; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const bob = Math.sin(t * 2.05 + index * .72) * (compact ? 5 : 8); + const drift = Math.cos(t * 1.12 + index * .91) * (compact ? 3 : 5) + + Math.sin(t * .63 + index * 1.71) * (compact ? 7 : 12); + const advance = comicGlyphAdvance(character, titleSize); + // The cell is what the pointer touches, so a letter that has swollen out + // of it cannot chase the cursor or shove its neighbours along the line. + // + // The letter the pointer already holds is tested against a cell grown by + // exactly how far this letter can travel — the sum of its drift terms + // across, its bob down — so the whole of its wander happens without the + // grab ever being dropped. Every other letter is tested honestly, or a + // held letter would keep stealing the pointer from its neighbours. + const slackX = titleGlyphHot === index ? (compact ? 10 : 17) : 0; + const slackY = titleGlyphHot === index ? (compact ? 5 : 8) : 0; + const hot = pointInCell(pointer, cursor + drift - slackX, + titleY + bob - slackY, advance + slackX * 2, titleSize + slackY * 2); + if (hot) held = index; + const toy = toyGlyph(titleToys, index, hot, dt); + const size = titleSize * + (1 + toy.grow * .38 + toy.kick * Math.sin(t * 31 + index) * .17); + const shudder = toy.kick * Math.sin(t * 27 + index * 1.3) * + (compact ? 6 : 11); + const glyphX = cursor + drift + + (advance - comicGlyphAdvance(character, size)) / 2 + shudder; + const glyphY = titleY + bob - (size - titleSize) * .5 - + toy.grow * (compact ? 6 : 11); + const shadowOffset = Math.max(4, Math.min(5, Math.round(size * .025))); + typeWrite(character, glyphX + shadowOffset, glyphY + shadowOffset, + size, ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(character, glyphX, glyphY, + size, ...(transitionInk || animatedTitleColor(index, t))); + if (glyphCells) glyphCells.push([cursor + drift, titleY + bob, advance]); + cursor += advance; + } + const versionX = titleX + titleWidth + lockupGap; + const versionY = titleY + titleSize - versionSize * 1.15; + const versionEdge = contrastShadow(transitionInk || ink); + for (const [dx, dy] of [[-2, 0], [2, 0], [0, -2], [0, 2]]) + typeWrite(version, versionX + dx, versionY + dy, versionSize, ...versionEdge); + typeWrite(version, versionX, versionY, versionSize, + ...(transitionInk || ink)); + if (survivalActive()) { + const mode = "survival"; + const modeSize = Math.round(titleSize * .28); + const modeWidth = handleWidth(mode, modeSize); + const modeX = viewCenterX() - modeWidth / 2; + const modeY = titleY + titleSize + (compact ? 8 : 12); + typeWrite(mode, modeX + 2, modeY + 3, modeSize, + ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(mode, modeX, modeY, modeSize, ...(transitionInk || ink)); + } else drawDummyPopLine(titleY, titleSize, transitionInk); + if (glyphCells) { + strokeBox(titleX, titleY, titleWidth, titleSize, 2, [92, 132, 255]); + for (const [x, y, advance] of glyphCells) { + strokeBox(x, y, advance, titleSize, 2, [255, 92, 116]); + hudBox(x, y, 2, titleSize, 116, 255, 184); + } + } + + const prompt = "start"; + const button = titleButtonRect(); + const hovered = Boolean(pointer) && pointInRect(pointer, button); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.titleButton = button; + globalThis.__oskiewarTouch.titleHover = hovered; + globalThis.__oskiewarTouch.titleGlyph = held; + } + titleGlyphHot = held; + promptBounce += ((hovered ? 1 : 0) - promptBounce) * + (1 - Math.exp(-dt * (hovered ? 14 : 6))); + const promptPulse = .68 + (Math.sin(t * 3.2) + 1) * .16; + const promptInk = transitionInk || + mixColor([196, 142, 18], [255, 238, 82], promptPulse); + // The word floats on its own; the rect survives only as the touch target. + // Yellow type on a bright sky needs an edge, so a sharp offset shadow + // deepens as the background lightens and lifts as it goes to night. + if (!socialPreview) { + let promptCursor = button.x + (button.width - button.textWidth) / 2; + const promptY = button.y + (button.height - button.textSize) / 2 - 2; + const offset = Math.max(3, Math.round(button.textSize * .1)); + const shadowInk = mixColor([10, 12, 30], [86, 26, 116], visualTheme.light); + const litInk = hovered + ? mixColor(promptInk, [255, 255, 255], .35) : promptInk; + for (let index = 0; index < prompt.length; index++) { + const character = prompt[index]; + const advance = comicGlyphAdvance(character, button.textSize); + const toy = toyGlyph(promptToys, index, + pointInCell(pointer, promptCursor, promptY, advance, button.textSize), + dt); + // The whole word takes the bounce, but each letter takes it a beat after + // the one before, so start reads as a hop travelling along the word. + const hop = promptBounce * button.textSize * .3 * + Math.abs(Math.sin(t * 5.4 - index * .62)); + const size = button.textSize * (1 + toy.grow * .2 + toy.kick * .12); + const x = promptCursor + (advance - comicGlyphAdvance(character, size)) / 2; + const y = promptY - hop - (size - button.textSize) * .5; + if (!transitionInk) + typeWrite(character, x + offset, y + offset, size, ...shadowInk); + typeWrite(character, x, y, size, ...litInk); + promptCursor += advance; + } + // The pace dial. Quiet unless the clock is off its default — or was just + // touched, so stepping back to one still answers the keypress — and it + // lives large in the bottom-right corner, a dashboard readout rather + // than a footnote under the start word. + const paceNow = runtime().monotonicUs; + if (gameSpeed !== 1 || (gameSpeedChangedAt && + paceNow - gameSpeedChangedAt < 2400000)) { + const pace = "×" + gameSpeed; + const paceSize = Math.max(30, Math.round(button.textSize * .8)); + const hud = hudSafeRect(); + const paceX = hud.right - handleWidth(pace, paceSize); + const paceY = hud.bottom - paceSize; + typeWrite(pace, paceX + 3, paceY + 4, paceSize, ...shadowInk); + typeWrite(pace, paceX, paceY, paceSize, ...promptInk); + } + drawCoachLine(button, transitionInk); + } + // Touch play keeps its thumbs in the bottom corners, and the fight is live + // under this screen now, so the stamp yields the pad rather than sit on it. + if (transitionAge >= 0 || socialPreview || (typeof capabilities === + "function" && capabilities().inputFamily === "touch")) return; + const titleUnixMs = runtime().unixMs || Date.now(); + const safe = hudSafeRect(); + // No frame rate under the wordmark. The read-out has one home — the + // bottom-left lane above the nameplate, where a fight already shows it — + // and a second copy parked in the middle of the poster only crowded the + // kerning cells it was sitting next to. + const clock = hudClockBox(titleUnixMs); + drawHudClock(clock, safe.top + 2, ink, titleUnixMs); + drawHudStatusTray(clock, ink, titleUnixMs); +} + +function pacificTimeLabel(unixMs) { + // The arena clock follows Pacific time without displaying a zone suffix. + const date = new Date(unixMs); + const year = date.getUTCFullYear(); + const nthSunday = (month, occurrence, hour) => { + const first = new Date(Date.UTC(year, month, 1)); + const day = 1 + ((7 - first.getUTCDay()) % 7) + (occurrence - 1) * 7; + return Date.UTC(year, month, day, hour); + }; + const daylight = unixMs >= nthSunday(2, 2, 10) && + unixMs < nthSunday(10, 1, 9); + const local = new Date(unixMs - (daylight ? 7 : 8) * 3600000); + const hour = local.getUTCHours(); + const minute = String(local.getUTCMinutes()).padStart(2, "0"); + const second = String(local.getUTCSeconds()).padStart(2, "0"); + return String(hour % 12 || 12) + ":" + minute + ":" + second; +} + +// Status indicators share one lane rather than each finding its own corner, so +// they read as a set: same cell, same row, in the title-safe frame just left of +// the wall clock. The lane is right-aligned because the clock and the round QR +// grow leftward from the same edge. +const statusGap = 6; +const statusCellSize = () => shellMode === "GAME" && debugHitboxes ? 56 : 26; + +function hudStatusIcons() { + const icons = []; + if (typeof capabilities === "function" && capabilities().midi) icons.push("midi"); + return icons; +} + +// The clock's footprint is computed once and shared, so the lane cannot drift +// out of step with where the clock actually lands. +function hudClockBox(unixMs) { + const safe = hudSafeRect(); + const label = pacificTimeLabel(unixMs); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 16 : hudTypeSize; + const qrBox = spectatorQrBox(); + const anchor = qrBox ? qrBox.left - 14 : safe.right; + // National identity begins at this corner: the local country's flag flies + // just left of the QR and the clock lane slides over to make room. US + // first — more flags join as they are drawn. + const flagCode = typeof capabilities === "function" && + capabilities().country === "US" ? "US" : ""; + const flagWidth = flagCode ? Math.round(size * 2.1) : 0; + const right = anchor - (flagCode ? flagWidth + 12 : 0); + const dialRadius = Math.max(6, Math.round(size * .38)); + const dialGap = Math.max(5, Math.round(size * .2)); + const textRight = right - dialRadius * 2 - dialGap; + return { label, size, right, textRight, dialRadius, anchor, flagCode, + flagWidth, dialX: right - dialRadius, + left: textRight - handleWidth(label, size) }; +} + +// Old Glory at corner scale: seven stripes and a starred canton read as the +// flag long before thirteen would, and the stars stay dots — real stars need +// more pixels than the corner owns. Shadowed like the type beside it so it +// flies on any sky. +function drawUsFlag(x, y, width, height, ink) { + hudBox(x + 2, y + 2, width, height, ...contrastShadow(ink)); + const stripes = 7; + for (let stripe = 0; stripe < stripes; stripe++) { + const top = y + Math.round(stripe * height / stripes); + const bottom = y + Math.round((stripe + 1) * height / stripes); + hudBox(x, top, width, bottom - top, + ...(stripe % 2 ? [238, 242, 247] : [188, 32, 46])); + } + const cantonWidth = Math.round(width * .44); + const cantonHeight = Math.round(height * 4 / stripes); + hudBox(x, y, cantonWidth, cantonHeight, 38, 52, 122); + for (let star = 0; star < 6; star++) + filledDisc(x + Math.round(cantonWidth * (.22 + (star % 3) * .28)), + y + Math.round(cantonHeight * (star < 3 ? .3 : .7)), + Math.max(1, Math.round(height * .05)), [238, 242, 247]); +} + +function drawHudClock(clock, y, ink, unixMs) { + typeWrite(clock.label, clock.left + 3, y + 3, + clock.size, ...contrastShadow(ink)); + const match = clock.label.match(/^(\d+)(:)(\d{2})(:)(\d{2})$/); + const parts = match ? match.slice(1) : [clock.label]; + const syntax = visualTheme.light ? titlePaletteDay : titlePaletteNight; + const colors = [syntax[0], ink, syntax[1], ink, syntax[2]]; + let x = clock.left; + parts.forEach((part, index) => { + typeWrite(part, x, y, clock.size, ...(colors[index] || ink)); + x += handleWidth(part, clock.size); + }); + const centerY = y + clock.size * .48; + const seconds = ((unixMs / 1000) % 60 + 60) % 60; + const segments = 24; + const filled = seconds / 60 * segments; + filledDisc(clock.dialX + 2, centerY + 2, clock.dialRadius, + contrastShadow(ink)); + filledDisc(clock.dialX, centerY, clock.dialRadius, + mixColor([20, 24, 38], [238, 241, 247], visualTheme.light)); + for (let segment = 0; segment < Math.ceil(filled); segment++) { + const start = -Math.PI / 2 + segment / segments * Math.PI * 2; + const end = -Math.PI / 2 + Math.min(segment + 1, filled) / + segments * Math.PI * 2; + screenTriangle(clock.dialX, centerY, + clock.dialX + Math.cos(start) * clock.dialRadius, + centerY + Math.sin(start) * clock.dialRadius, + clock.dialX + Math.cos(end) * clock.dialRadius, + centerY + Math.sin(end) * clock.dialRadius, ...syntax[2]); + } + hudCircle(clock.dialX, centerY, clock.dialRadius, 2, ink); +} + +function hudStatusTray(clock = null) { + const icons = hudStatusIcons(); + if (!icons.length) return null; + const statusCell = statusCellSize(); + const safe = hudSafeRect(); + const qrBox = spectatorQrBox(); + const right = clock ? clock.left - 14 + : qrBox ? qrBox.left - 14 : safe.right; + const width = icons.length * statusCell + (icons.length - 1) * statusGap; + return { icons, right, left: right - width, top: safe.top, + height: statusCell }; +} + +// A one-octave keyboard: seven equal white keys with the black keys only on the +// boundaries that have them, so it reads as a piano at this size instead of an +// approximate smear. It brightens for a beat whenever a note leaves. +function drawStatusPiano(x, y, lit) { + const width = 21, height = 14, key = width / 7; + const left = Math.round(x - width / 2), top = Math.round(y - height / 2); + hudBox(left, top, width, height, ...(lit ? [108, 240, 168] : [176, 184, 202])); + for (const step of [1, 2, 4, 5, 6]) + hudBox(Math.round(left + step * key) - 1, top, 2, Math.round(height * .58), + 23, 27, 40); +} + +function drawHudStatusTray(clock, ink, unixMs) { + const tray = hudStatusTray(clock); + const statusCell = statusCellSize(); + // Debug is global state, so its large indicator owns bottom-center rather than + // masquerading as another peripheral in the clock-side status tray. + if (debugHitboxes && !performanceFooterVisible()) { + const safe = hudSafeRect(); + const top = safe.bottom - statusCell; + drawDebugBug(viewCenterX(), top + statusCell / 2 + 2, + statusCell / 26); + // The session's name rides beside the bug: it is what a telemetry agent + // attaches to, and debug mode is exactly the moment somebody wants to + // read that name off the screen and type it into a terminal. + if (sessionName) { + const size = Math.max(17, Math.round(statusCell * .4)); + typeWrite(sessionName, viewCenterX() + statusCell * .62, + top + statusCell / 2 + 2 - size / 2, size, ...ink); + } + // And the linked-agent mark keeps the bug company on its other side — + // @jeffrey: "can the little agent icon be near the debug ladybug, not by + // the fps". The name says where to attach; the antenna says who has. + const agents = linkedAgents(); + if (agents) { + const scale = statusCell / 34; + drawAgentLink(viewCenterX() - statusCell * .62 - 14 * scale, + top + statusCell / 2 + 2, scale, agents); + } + } + if (!tray) return; + const lit = typeof capabilities === "function" && + unixMs - (capabilities().midiPulse || 0) < 140; + tray.icons.forEach((name, index) => { + const x = tray.left + index * (statusCell + statusGap) + statusCell / 2; + const y = tray.top + tray.height / 2; + if (name === "midi") drawStatusPiano(x, y, lit); + }); +} + +function drawDebugBug(x, y, scale = 1) { + const shell = [255, 86, 126]; + const detail = [22, 12, 34]; + const limb = (x1, y1, x2, y2, width, color) => + filledCapsule(x1, y1, x2, y2, width, color); + filledDisc(x, y + 2 * scale, 8 * scale, shell); + filledDisc(x, y - 6 * scale, 5 * scale, shell); + limb(x, y - 7 * scale, x - 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x, y - 7 * scale, x + 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x - 5 * scale, y, x - 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x + 5 * scale, y, x + 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x - 5 * scale, y + 5 * scale, x - 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x + 5 * scale, y + 5 * scale, x + 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x, y - scale, x, y + 9 * scale, 2 * scale, detail); + filledDisc(x - 2 * scale, y - 7 * scale, 1.2 * scale, detail); + filledDisc(x + 2 * scale, y - 7 * scale, 1.2 * scale, detail); +} + +// The title owns the share code; active maps keep the corner clear. +function spectatorQrBox() { + if (shellMode === "GAME") return null; + if (typeof capabilities === "function" && capabilities().socialPreview) + return null; + if (!spectatorQr || typeof spectatorQr.getModuleCount !== "function") + return null; + const safe = hudSafeRect(); + const count = spectatorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor((compactLayout() ? 108 : 158) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + // The QR anchors on the safe rect's top-right corner — the exact spot the + // debug overlay draws its yellow corner crop. With the bug lit the + // instrument wins: the code steps below the crop instead of covering it, + // and every lane that asks this box (the clock included) follows it down. + const top = safe.top + (debugHitboxes ? 52 : 0); + return { left: safe.right - size, top, size, cell, count, quiet }; +} + +// Where the bare frame rate shows with the overlay off: the console, in a +// fight. The debug read-out itself never asks which screen it is on. +const bareFrameRateShown = () => nativeTrianglePass && shellMode === "GAME"; +function drawDebugPerformance(ink) { + // The wordmark screen used to hide this row, but the title is a running + // fight with a frame budget of its own — debug mode reads the machine, not + // the match, so the numbers stay up wherever the bug is lit. Only a round's + // result card still clears the lane, because the card owns it. + if (roundResult) return; + // The console keeps a bare frame rate on the HUD through a fight even + // with the debug overlay off — @jeffrey, 2026-09-20: "when game is + // playing lets still show fps in hud". One short word, so the read-out + // costs the frame it measures almost nothing. + const bare = !debugHitboxes; + if (bare && !bareFrameRateShown()) return; + const metaSize = debugReadoutMetaSize(); + const run = runtime(); + // Every line waits for a real measurement. The read-out used to answer with + // the logical stage size, the measured frame rate wearing a Hz label, and a + // row of zeroed milliseconds — three numbers that looked like instruments and + // were not. The browser now times its own frame span and its own paint, so it + // fills the rate and two of the three stages honestly; the render surface is + // still the console's alone, and a browser can never time the compositor's + // present, so that stage stays out of the row rather than reading 0.00ms. + // Native frameMs measures the whole host frame. Its legacy refreshHz + // field is also measured FPS, not the display mode's refresh rate. + const measuredFrameMs = Number(run.frameMs) || 0; + const measuredFps = measuredFrameMs > 0 ? 1000 / measuredFrameMs : displayFps; + const rate = Math.round(measuredFps || 0) + " fps"; + if (bare) { + const lane = playerHandleLayout(players[0], 0); + typeWrite(rate, lane.x, lane.y - metaSize - 6, metaSize, ...ink); + return; + } + const renderWidth = Math.round(Number(run.renderWidth) || Number(run.width) || 0); + const renderHeight = Math.round(Number(run.renderHeight) || Number(run.height) || 0); + const aa = Math.max(1, Math.round(Number(run.antialiasingSamples) || 1)); + const surface = renderWidth && renderHeight + ? " · " + renderWidth + "x" + renderHeight + " · " + + String(run.antialiasingMode || (aa + "x")) : ""; + const frameMs = Number(run.frameMs) || 0; + const presentMs = Number(run.presentMs) || 0; + const timing = frameMs + ? "frame " + frameMs.toFixed(2) + "ms render " + + (Number(run.renderCpuMs) || 0).toFixed(2) + "ms" + + (presentMs ? " present " + presentMs.toFixed(2) + "ms" : "") : ""; + // The bottom-left corner belongs to a fighter's nameplate, so the read-out + // stacks upward from just above it instead of printing across a handle. The + // ammo row keeps its own lane a stat card further up, well clear of this. + const lane = playerHandleLayout(players[0], 0); + let y = lane.y - metaSize - 6; + // One line of proof per debug toggle: the console renders this read-out + // where no devtools can confirm it, so the Device Portal log gets told the + // row was actually drawn, with what, and where. + if (!debugPerfReported) { + debugPerfReported = true; + telemetry("FIGHT_DEBUG_PERF", rate + (timing ? " | " + timing : "") + + " | lane=" + Math.round(lane.x) + "," + Math.round(y) + + " session=" + sessionName); + } + for (const [index, label] of [rate + surface, timing].entries()) { + if (!label) continue; + const size = index ? debugReadoutTimingSize() : metaSize; + typeWrite(label, lane.x, y, size, ...ink); + y -= size + 5; + } +} + +// How many telemetry watchers are reading this round. The relay counts +// `role=agent` sockets apart from phone spectators and tells the publishing +// game; a host that has not wired that up answers nothing and the mark stays +// off. Note this can only ever see the live socket: the console's +// AC_NATIVE_PROFILE line goes out one way through OutputDebugStringA, so a +// Device Portal reading it is invisible from in here. +function linkedAgents() { + if (typeof capabilities !== "function") return 0; + return Math.max(0, Math.round(Number(capabilities().liveAgents) || 0)); +} + +// @jeffrey: "if we are in debug mode and reading telemetry on a device can we +// show a little agent icon to show our linked in connection on the telemetry of +// that round". An antenna'd head, so it cannot be read as the debug bug beside +// it or as one more human in the grandstand — a phone that scanned the round QR +// is a viewer and lights nothing here. The mark means a machine is reading +// these numbers right now. +function drawAgentLink(x, y, scale = 1, count = 1) { + const shell = [120, 226, 255]; + const detail = [10, 16, 30]; + // Antenna first so the head caps its stalk: the bulb on the air is the + // "linked" half of the mark and the head is the "agent" half. + filledCapsule(x, y - 5 * scale, x, y - 10 * scale, 1.6 * scale, shell); + filledDisc(x, y - 11 * scale, 2.2 * scale, shell); + filledCapsule(x - 4 * scale, y, x + 4 * scale, y, 12 * scale, shell); + filledDisc(x - 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledDisc(x + 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledCapsule(x - 3 * scale, y + 3 * scale, x + 3 * scale, y + 3 * scale, + 1.6 * scale, detail); + // A second watcher is rare enough to say plainly rather than by stacking + // heads sideways across a read-out that has no room for them. + if (count > 1) typeWrite(String(count), x + 13 * scale, y - 6 * scale, + Math.max(12, Math.round(13 * scale)), ...shell); +} + +// Connection health, as four bars and one number — the thing every online +// game owes a player and oskiewar had no way to say. @jeffrey: "can we show a +// connection health like wifi meter, on the top right of the game". +// +// The number is whatever this seat can honestly measure, which is not the same +// on both lanes: +// +// A rollback fight knows its round trip exactly (see netSendInputs: our own +// wall mark comes home on the rival's next packet), so it reports ping. +// A grandstand or an older-build guest never gets a packet back, so it can +// only measure the wire it is being served: how irregular the frames are and +// how many of them the relay ate. It reports jitter, and loss when there is +// any. +// A host in the streamed lane hears the rival only through pads, so its one +// honest reading is how long ago the last one arrived. +// +// Nothing is invented. A lane with no rival on it draws nothing at all. +const netHealthPalette = [[245, 90, 96], [250, 200, 80], [180, 235, 120], + [108, 240, 168]]; + +function netHealth() { + if (netSession) { + const stats = netSession.stats; + const ping = Math.round(stats.pingMs || 0); + // Nothing has come home yet; a meter that reads four bars before it has + // measured anything is a lie told at exactly the moment somebody is + // deciding whether the connection is good. + let bars = !stats.pings ? 0 + : ping < 50 ? 4 : ping < 100 ? 3 : ping < 170 ? 2 : 1; + // A desync means the two machines are no longer playing the same fight. + // The wire may be fast and the connection is still not healthy. + if (bars && stats.desyncs) bars = Math.min(bars, 1); + return { bars, label: stats.pings ? ping + "MS" : "···", + note: stats.desyncs ? "DESYNC" : "" }; + } + if (roundViewerMode === "LIVE" && roundViewerFrames.length) { + const jitter = Math.round(roundViewerJitterMs); + const loss = roundViewerLossPct; + const bars = jitter < 12 && loss < 3 ? 4 + : jitter < 30 && loss < 10 ? 3 + : jitter < 60 && loss < 25 ? 2 : 1; + return { bars, label: "±" + jitter + "MS", + note: loss ? loss + "% LOST" : "" }; + } + // The host's side of a streamed fight. Only while somebody is actually + // sitting in the second chair — an empty room has no connection to rate. + if (versusLane() && !roundViewer) { + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return null; + const age = Date.now() - remote.at; + if (age > versusChallengerGraceMs) return null; + return { bars: age < 150 ? 4 : age < 400 ? 3 : age < 1000 ? 2 : 1, + label: age + "MS", note: "" }; + } + return null; +} + +// Where the meter stands, and whether it stands at all. Split out so the rest +// of the top-right corner can measure around it: with no QR up the meter owns +// that corner, and a label that assumed the corner was free landed on it. +function netHealthBox() { + if (typeof capabilities === "function" && + (capabilities().socialPreview || capabilities().replayOven === true)) + return null; + if (shellMode !== "GAME") return null; + const health = netHealth(); + if (!health) return null; + const safe = hudSafeRect(); + const qr = spectatorQrBox(); + const compact = compactLayout(); + const bar = compact ? 5 : 7; + const gap = compact ? 3 : 4; + const tall = compact ? 19 : 26; + const count = 4; + const width = count * bar + (count - 1) * gap; + // Under the code, never over it: the QR is the address a friend types and + // the meter is a readout about the friend who already did. + const top = (qr ? qr.top + qr.size + 8 : safe.top) + 2; + // Sized off the bars rather than the HUD's own type scale: the reading is a + // caption to the meter, and at hudTypeSize it swamped the thing it labels. + const size = Math.max(14, Math.round(tall * .8)); + const label = health.note ? health.label + " " + health.note : health.label; + return { health, bar, gap, tall, count, width, top, base: top + tall, + right: safe.right, left: safe.right - Math.max(width, + handleWidth(label, size)), size, label }; +} + +// The left edge of whatever owns the top-right corner — the round's QR, or +// the connection meter when no code is up. Anything else that wants to sit up +// there measures from here instead of from the safe rect, or it draws on top +// of the corner's furniture. +function hudTopRightLeft() { + const qr = spectatorQrBox(); + if (qr) return qr.left; + return netHealthBox()?.left ?? hudSafeRect().right; +} + +function drawNetHealth(ink) { + const box = netHealthBox(); + if (!box) return; + const { health, bar, gap, tall, count, width, base, right, size, label } = box; + const lit = netHealthPalette[Math.max(0, health.bars - 1)]; + const dim = mixColor([58, 64, 78], [196, 201, 212], visualTheme.light); + const previousDepth = triangleDepth; + triangleDepth = -1.43; + for (let index = 0; index < count; index++) { + const height = Math.round(tall * (index + 1) / count); + const x = right - width + index * (bar + gap); + screenRect(x + 2, base - height + 2, bar, height, [24, 26, 34]); + screenRect(x, base - height, bar, height, + index < health.bars ? lit : dim); + } + const labelWidth = handleWidth(label, size); + const labelY = base + 7; + typeWrite(label, right - labelWidth + 2, labelY + 2, size, + ...contrastShadow(ink)); + typeWrite(label, right - labelWidth, labelY, size, + ...(health.note ? netHealthPalette[0] : ink)); + triangleDepth = previousDepth; +} + +function drawMapName(ink) { + const safe = hudSafeRect(), health = netHealthBox(), qr = spectatorQrBox(); + const label = currentMapName.toLowerCase(); + let size = compactLayout() ? 22 : 26; + while (size > 14 && handleWidth(label, size) > (safe.right - safe.left) * .35) size--; + const x = safe.right - handleWidth(label, size); + // Stack below connection/QR furniture; keep the center clear all round. + const y = Math.max(safe.top + 8, + health ? health.base + health.size + 21 : 0, + qr ? qr.top + qr.size + 14 : 0); + typeWrite(label, x + 2, y + 2, size, ...contrastShadow(ink)); + typeWrite(label, x, y, size, ...ink); +} + +function drawSpectatorQr(ink, placement = null) { + if (typeof globalThis.__oskiewarJevPad === 'function') return; + if (typeof capabilities === "function" && capabilities().socialPreview) return; + const qr = placement || spectatorQrBox(); + if (!qr) return; + const { count, quiet, cell, size, left, top } = qr; + // National identity flies beside the code, wherever the code goes. US + // first — more flags join as they are drawn. Reel placements opt out with + // the rest of the HUD furniture. + if (!placement && typeof capabilities === "function" && + capabilities().country === "US") + drawUsFlag(left - Math.round(hudTypeSize * 2.1) - 12, top + 2, + Math.round(hudTypeSize * 2.1), Math.round(hudTypeSize * 1.2), ink); + const shadow = [24, 26, 34]; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + screenRect(left + 3, top + 3, size, size, shadow); + screenRect(left, top, size, size, [250, 250, 247]); + // Dark modules coalesce into horizontal runs so a full code stays a few + // dozen faces instead of a few hundred — drawErrorQr already draws this way. + const dark = [7, 8, 14]; + for (let row = 0; row < count; row++) { + let run = 0; + for (let column = 0; column <= count; column++) { + if (column < count && spectatorQr.isDark(row, column)) { run++; continue; } + if (run) screenRect(left + (column - run + quiet) * cell, + top + (row + quiet) * cell, run * cell, cell, dark); + run = 0; + } + } + triangleDepth = previousDepth; +} + +// Framing marks rather than a full box: the corners state the bounds without +// drawing four lines through the fight. +function drawCornerCrops(rect, reach, width, color) { + const arm = Math.min(reach, (rect.right - rect.left) / 3, + (rect.bottom - rect.top) / 3); + for (const [x, towardX] of [[rect.left, 1], [rect.right, -1]]) + for (const [y, towardY] of [[rect.top, 1], [rect.bottom, -1]]) { + filledCapsule(x, y, x + towardX * arm, y, width, color); + filledCapsule(x, y, x, y + towardY * arm, width, color); + } +} + +function drawImpacts() { + for (const impact of impacts) { + if (impact.explosion && impact.blastRadius) { + const age = clamp(1 - impact.life / impact.duration, 0, 1); + const center = projectPoint(impact.x, impact.y - 3, impact.z || 0); + const edge = projectPoint(impact.x + impact.blastRadius, + impact.y - 3, impact.z || 0); + const radius = Math.abs(edge.x - center.x); + if ([center.x, center.y, radius].every(Number.isFinite) && radius < 4000) { + filledRing(center.x, center.y, radius, + Math.max(0, radius - Math.max(7, 22 * (1 - age))), + mixColor([255, 218, 86], [111, 74, 48], age)); + const shockRadius = radius * (.18 + age * .72); + filledRing(center.x, center.y, shockRadius, + Math.max(0, shockRadius - Math.max(4, 13 * (1 - age))), + mixColor([255, 246, 184], [164, 92, 52], age)); + } + } + for (const mote of impact.debris || []) { + const point = projectPoint(mote.x, mote.y, mote.z); + const radius = Math.max(2, mote.radius * cameraScale()); + if (![point.x, point.y, radius].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledDisc(point.x, point.y, radius, + impact.death ? [255, 105, 190] : [255, 232, 92]); + } + } +} + +function drawDetachedPart(fragment) { + const first = projectPoint(fragment.x1, fragment.y1, fragment.z1); + const second = projectPoint(fragment.x2, fragment.y2, fragment.z2); + const width = Math.max(2, fragment.width * cameraScale()); + const values = [first.x, first.y, second.x, second.y, width]; + if (!values.every(Number.isFinite) || width > 2000) return; + const margin = width + 4; + if (Math.abs(first.x) + margin > 30000 || + Math.abs(first.y) + margin > 30000 || + Math.abs(second.x) + margin > 30000 || + Math.abs(second.y) + margin > 30000 || + Math.hypot(second.x - first.x, second.y - first.y) > 30000) return; + filledCapsule(first.x, first.y, second.x, second.y, width + 3, [9, 12, 22]); + drawPaletteCapsule({ x1: first.x, y1: first.y, x2: second.x, y2: second.y, + width, part: fragment.part }, fragment.colors, + fragment.paletteCoordinate || 0, fragment.color); +} + +function drawSafeZones() { + if (!debugHitboxes || renderFlags.hud === false) return; + drawCornerCrops(hudSafeRect(), 46, 3, [255, 214, 84]); + drawCornerCrops(actionSafeRect(), 34, 2, [105, 255, 118]); +} + +// The head is the second door on the title screen. START is still anywhere — +// `tapTitle` in the shell makes the whole frame the button — so the one place +// that must NOT start a fight is the face, because that is where a player who +// wants to BE the fighter is already looking. The game publishes the head's +// screen circle and the shell hit-tests it ahead of the anywhere-button; the +// ring is drawn here rather than in the shell because only the game knows +// where the head went this frame. +// +// Nothing is drawn unless a wizard is actually mounted (`__oskiewarWizard`), +// so the Xbox and the reel renderer — which have no DOM to open — never show +// an affordance that would dud. +function drawTitleHeadDoor(t, ink, suppressed) { + const touch = globalThis.__oskiewarTouch; + if (!touch) return; + const onTitle = shellMode === "MENU" && titleTransitionAt === null; + if (!onTitle || suppressed || !globalThis.__oskiewarWizard) { + if (touch.titleHead) touch.titleHead = null; + return; + } + // Only over a seat that is actually yours. The attract loop's "action" + // variant dresses BOTH fighters as bots (`beginTraining`), and a ring that + // says "add yourself" on a bot's head invites a player to replace somebody + // who was never there. No local body on screen, no door. + const seat = players[0]; + if (!seat || !seat.alive || seat.npc || seat.bot) { touch.titleHead = null; return; } + const head = runnerWorldGeometry(seat, t).head; + if (!head) { touch.titleHead = null; return; } + // Radius in screen units is measured, not guessed: the title camera pushes + // in and out across the attract loop, and a fixed pixel radius would drift + // off the face. Same idiom the killcam tears use. + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(9, Math.hypot(edge.x - point.x, edge.y - point.y)); + const reach = radius * 1.22; + touch.titleHead = { x: point.x, y: point.y, radius: reach }; + // On the screen-UI lane, so a fighter standing in front of their own face + // cannot draw through the invitation. + triangleDepth = -1.42; + const pulse = (Math.sin(t * 2.4) + 1) / 2; + // Gold on its own rather than mixed toward the title ink: ink is near-white + // on the night sky and near-black at noon, so mixing gave a different — and + // on the light theme, muddy — colour every hour. The dark under-ring is what + // carries it across both, the same trick the type beside it uses. + const glow = mixColor([230, 205, 92], [255, 250, 226], pulse * .55); + const stroke = Math.max(1.5, radius * .085); + hudCircle(point.x, point.y, reach, stroke * 2.1, [16, 20, 34]); + hudCircle(point.x, point.y, reach, stroke, glow); + // The words ride a plate. A meditating fighter fills the whole column under + // their own chin, so unplated type landed on shoulders and arms and read as + // part of the body; the plate is dark on both themes because the gold is. + const label = "add yourself"; + const size = Math.max(11, Math.round(radius * .44)); + const width = handleWidth(label, size); + const padX = Math.round(size * .55), padY = Math.round(size * .34); + const left = point.x - width / 2; + const top = point.y + reach + size * .45; + hudBox(left - padX, top - padY, width + padX * 2, size + padY * 2, 16, 20, 34); + typeWrite(label, left, top, size, ...glow); +} + +function gamePaint() { + syncGameView(); + globalThis.__oskiewarLocalVersus = localVersusActive(); + const run = runtime(); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.screen = shellMode === "MENU" + ? titleTransitionAt !== null ? "title-transition" : "title" + : selecting ? "select" : "game"; + } + // Each fighter's cues sit where the fighter stands — @jeffrey: "can audio + // be mixed according to the player's position, stereo, for each player, if + // its not local multiplayer". Two humans on one couch share one speaker + // image, so their mix stays centered; against the machine — or a rival on + // the far end of a wire — the stage pans. + const couchVersus = !players[1].npc && !players[1].bot && + !players[1].remote && !selfPlay; + globalThis.__oskiewarPlayerPans = players.map((player) => couchVersus ? 0 : panPlayer(player)); + // The shell's resolution governor steers by this — the game's own measured + // rate, because the host's profile numbers never made it off the Xbox. + globalThis.__oskiewarDisplayFps = displayFps; + const paintAt = run.paintMonotonicUs ?? run.monotonicUs; + if (lastPaintAt > 0 && paintAt > lastPaintAt) { + const sample = clamp(1000000 / (paintAt - lastPaintAt), 1, 240); + displayFps = displayFps ? lerp(displayFps, sample, .12) : sample; + } + lastPaintAt = paintAt; + const t = (run.monotonicUs - startedAt) / 1000000; + if (typeof ac === "function") acFeed = ac(); + syncSignedInFighter(); + const localNation = typeof capabilities === "function" + ? String(capabilities().country || "").toUpperCase() : ""; + if (/^[A-Z]{2}$/.test(localNation)) { + players[0].nation = localNation; + if (!players[1].npc) players[1].nation = localNation; + } + // The remote rival's wardrobe came up the wire, not out of the roster — + // a profile lookup here would answer empty and strip them every frame. + for (const player of players) + if (!player.remote) player.handleColors = fighterProfile(player.name).colors; + visualTheme = displayTheme(); + const replayOven = typeof capabilities === "function" && + capabilities().replayOven === true; + const reelHud = typeof capabilities === "function" && + capabilities().reelHud === true; + const matchHud = !replayOven || reelHud; + // A reel is watched at arm's length with no controller in hand, and the + // corner furniture a player needs — nameplates, stats, inventory, the + // command stream — crowds a 9:16 crop and competes with the fight for the + // eye. So a reel carries no HUD at all while the round is live, and states + // the outcome afterward in the middle of the frame, one line at a time. + const reelMinimal = replayOven && reelHud && + capabilities().reelFullUi !== true; + triangleDepth = -1.4; + // The station uses a plain light or dark backdrop matching the HUD theme. + const space = !survivalActive(); + const mapColors = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const skyDay = mixColor([176, 215, 245], [255, 160, 112], + visualTheme.sunset * .7); + const sky = space ? mixColor(mapColors.night, mapColors.sky, visualTheme.light) + : mixColor([7, 8, 28], skyDay, visualTheme.light); + // Match the clear color to the arena sky. Camera framing can reveal the + // clear layer during a jump; a different clear color looked like a flash. + const outside = sky; + // Keep the room's planes materially distinct: blue atmosphere, warm plaster + // behind the fighters, and green earth under them. Day/night can tint the + // palette without washing every surface into the same gray. + const arenaDay = mixColor([244, 211, 178], [235, 154, 150], + visualTheme.sunset * .48); + const arena = mixColor([24, 18, 42], arenaDay, visualTheme.light); + // Pale steel in light mode stays distinct from the brighter backdrop. + const groundDay = mixColor([142, 184, 116], [190, 151, 103], + visualTheme.sunset * .38); + const ground = space + ? mixColor(mapColors.floor.map(c => Math.round(c * .32)), mapColors.floor, visualTheme.light) + : mixColor([13, 25, 29], groundDay, visualTheme.light); + // The floating decks are steel with a lit edge. The plate itself stays + // near the hull's own value — a near-white slab against vacuum reads as a + // UI bar laid over the game rather than as a thing in it — and the LIP + // carries the brightness instead, which is the part a player actually has + // to judge. On plaster the relationship is the other way round: the deck is + // the pale thing and the lip is the dark line under it, because there the + // background is what is bright. + const platformColor = space + ? mixColor(mapColors.deck.map(c => Math.round(c * .42)), mapColors.deck, visualTheme.light) + : mixColor([24, 29, 46], [211, 198, 171], visualTheme.light); + const titleInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + const statusShadow = contrastShadow(titleInk); + const menuArena = mixColor([7, 10, 26], [235, 241, 248], visualTheme.light); + const menuPanel = mixColor([20, 28, 56], [215, 225, 239], visualTheme.light); + const menuInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + renderFlags = globalThis.__oskiewarRenderFlags || renderFlags; + wipe(...outside); + if (renderFlags.sky !== false) drawSkyAtmosphere(sky, arena); + if (PAL_SELECT && selecting) { + box(0, 0, viewWidth(), viewHeight, ...menuArena); + drawSelectionScreen(t, menuInk, menuPanel); + return; + } + const cinematicAge = deathCinematicAge(run.monotonicUs); + const introAge = run.monotonicUs - roundStartedAt; + const inRoundIntro = !roundResult && introAge >= 0 && + introAge < roundIntroDurationUs(); + // The intro deliberately owns its lens: wide title, two face portraits, + // then a pullback. Final-frame containment would widen every portrait until + // both fighters fitted, erasing the zoom story it was meant to protect. + if (!inRoundIntro && (cinematicAge < 0 || cinematicAge >= 1.45)) + containFighters(t); + cameraDoll.prepare(); + const { left: spanLeft, right: spanRight, + top: spanTop, bottom: spanBottom } = terrainSpan(); + if (!airRoundActive()) drawRoomSurfaces(spanLeft, spanRight, spanTop, spanBottom, arena); + // The reel camera puts the floor's own front edge (worldNear) in front of + // the lens, where it crosses the frame as a hard horizontal step with the + // skirt showing under it. Extending the slab past the camera hands the cut + // to the near plane, which faces already handle correctly, so the ground + // reads as ground all the way down the frame. Past the camera means PAST + // THE CAMERA — a fixed extension was still shy of the wide fight shot, + // which stands several thousand units back, and the step came back on + // every wide frame. Reels only: on the TV lens the visible front edge IS + // the padded-room look. + const groundNear = reelGroundCamera() + ? Math.min(worldNear, cameraDoll.position.z - 400) : worldNear; + if (airRoundActive()) drawAirDropSky(t); + else { + drawTerrainBackWall(spanLeft, spanRight, worldFar, ground); + drawTerrainSurface(spanLeft, spanRight, groundNear, worldFar, ground); + drawTerrainFrontWall(spanLeft, spanRight, groundNear, ground); + drawSkateParkFeatures(); + } + // No grass in vacuum. The blades were the tower's lawn and the cube kept + // them out of habit; on a hull they read as moss on a spaceship. + if (renderFlags.grass !== false && !space) + drawTerrainGrass(spanLeft, spanRight, ground); + if (!airRoundActive()) drawBoosterPad(t); + const platformNear = -520; + const platformFar = 520; + // A rung wants to be a slab, but the stage paints in order with no depth + // buffer — the volume's faces landed over the fighters on console. So each + // one is a plane plus a front-edge line: the plane is the deck a fighter + // stands on, and the line is the lip, which is what keeps a rung readable + // when the camera happens to sit at its height and the deck goes edge-on. + // The line rides the line layer, so twelve rungs cost twenty-four faces and + // the lips cost none. The span clamp is the same one the terrain uses, and + // in a room this size its 2600-unit apron usually covers everything — it is + // here to bound the worst case, not because it culls much today. + const ledgeInk = space + ? mixColor(platformColor, [196, 224, 255], .62) + : mixColor(platformColor, [26, 24, 34], .42); + if (platformsEnabled()) for (const ledge of activeLedges()) { + if (ledge.right < spanLeft || ledge.left > spanRight) continue; + if (ledge.y < spanTop || ledge.y > spanBottom) continue; + const ledgeLeft = Math.max(ledge.left, spanLeft); + const ledgeRight = Math.min(ledge.right, spanRight); + if (ledgeLeft >= ledgeRight) continue; + worldQuad( + { x: ledgeLeft, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformFar }, + { x: ledgeLeft, y: ledge.y, z: platformFar }, platformColor); + worldLine(ledgeLeft, ledge.y, platformNear, + ledgeRight, ledge.y, platformNear, 5, ledgeInk); + } + if (workshopHighlight && globalThis.__oskiewarWorkshopEnabled) { + for (const player of players) { + const x = player.spawnX, y = terrainFloorAt(x); + const ink = player.pad === 0 ? [80, 240, 255] : [255, 100, 210]; + worldLine(x - 55, y - 4, -50, x + 55, y - 4, -50, 6, ink); + worldLine(x, y, 0, x, y - 240, 0, 6, ink); + worldLine(x, y - 240, 0, x + 65, y - 210, 0, 6, ink); + } + } + drawSurvivalLava(t); + const shadowInk = mixColor([3, 5, 14], [92, 99, 101], + visualTheme.light * .72); + if (renderFlags.shadows !== false && !airRoundActive()) { + for (const player of activePlayers()) + if (player.alive || roundResult) + drawSpotShadow(player.x, player.y, player.z, player.ducking ? 52 : 64, + shadowInk); + for (const item of balls) + if (item.active) + drawSpotShadow(item.x, item.y, item.z, item.radius * 1.18, shadowInk); + } + const windInk = windDirection < 0 + ? mixColor([72, 174, 255], [28, 88, 188], visualTheme.light) + : mixColor([255, 92, 132], [184, 35, 62], visualTheme.light); + if (WIND_FLAG && shellMode === "GAME") drawWindFlag(t, windInk); + // The round keeps match time and spectator state only. Time of day belongs + // to the title screen; carrying it into gameplay confused two unrelated + // clocks and spent the top-right lane on non-match information. + if (matchHud && !reelMinimal && shellMode === "GAME" && gameplayStarted) { + const timedRound = roundIsTimed(); + const remainingSeconds = roundResult || !timedRound ? 0 : Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + const timerText = !roundResult && timedRound + ? String(remainingSeconds).padStart(2, "0") : ""; + const hud = hudSafeRect(); + const timerSize = hudTypeSize; + if (timerText) { + const timerWidth = handleWidth(timerText, timerSize); + const timerDanger = timedRound && remainingSeconds > 0 && + remainingSeconds <= 10; + const timerShake = timerDanger + ? Math.sin(t * 35) * (11 - remainingSeconds) * .45 : 0; + const timerInk = timerDanger + ? mixColor(titleInk, [235, 38, 58], (11 - remainingSeconds) / 10) + : titleInk; + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake, + hud.top + 2, timerSize, ...timerInk); + } + if (roundViewer) { + const viewerLabel = roundViewer.seat === "challenger" + ? roundViewerMode === "LIVE" ? "VS" : "WAITING FOR HOST" + : roundViewerMode || roundViewerStatus; + // Left of the corner's furniture, never on it: that corner is the + // round's QR, or the connection meter when there is no code up. + const labelSize = 24; + const labelRight = hudTopRightLeft() - 14; + typeWrite(viewerLabel, + labelRight - handleWidth(viewerLabel, labelSize), hud.top + 7, + labelSize, ...(roundViewerMode === "LIVE" ? [210, 42, 62] : titleInk)); + // The chair-holder plays through this feed: say which body is theirs + // while the matchup is still fresh, then get out of the fight's way. + if (roundViewer.seat === "challenger" && roundViewerMode === "LIVE" && + t < 8) { + const seatLine = "YOU ARE " + + (players[1].name || "THE SECOND FIGHTER") + " — RIGHT SIDE"; + const seatSize = compactLayout() ? 13 : 17; + const seatWidth = handleWidth(seatLine, seatSize); + typeWrite(seatLine, viewCenterX() - seatWidth / 2, + hud.top + hudTypeSize + 16, seatSize, ...titleInk); + } + } + const nowMs = run.unixMs || Date.now(); + drawHudStatusTray(null, titleInk, nowMs); + const updateReady = typeof capabilities === "function" && + capabilities().updateReady === true; + if (updateReady) { + const label = "update ready"; + const size = Math.round(hudTypeSize * .58); + const width = handleWidth(label, size); + const x = hudTopRightLeft() - 14 - width; + const y = hud.top + hudTypeSize + 12; + typeWrite(label, x + 2, y + 3, size, ...contrastShadow(titleInk)); + typeWrite(label, x, y, size, ...titleInk); + if (globalThis.__oskiewarTouch) + globalThis.__oskiewarTouch.updateButton = + { x: x - 8, y: y - 6, width: width + 16, height: size + 12 }; + } else if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.updateButton = null; + } + } + if (!survivalActive()) { + for (const tree of bodyTrees) drawBodyTree(tree, t); + for (const pickup of gunPickups) drawGunPickup(pickup, t); + for (const pickup of saberPickups) drawSaberPickup(pickup, t); + for (const pickup of grenadePickups) drawGrenadePickup(pickup, t); + } + const showRunnerLabels = matchHud && !reelMinimal && + (Boolean(roundResult) || introAge >= roundIntroDurationUs()); + const viewDirection = normalize3({ + x: cameraDoll.target.x - cameraDoll.position.x, + y: cameraDoll.target.y - cameraDoll.position.y, + z: cameraDoll.target.z - cameraDoll.position.z, + }); + const renderables = [ + ...bullets.map((item) => ({ + kind: "bullet", item, x: item.x, y: item.y, z: item.z })), + ...grenades.filter((item) => item.alive).map((item) => ({ + kind: "grenade", item, x: item.x, y: item.y, z: item.z })), + ...balls.filter((item) => item.active).map((item) => ({ + kind: "ball", item, x: item.x, y: item.y, z: item.z })), + ...detachedParts.map((item) => ({ kind: "detached", item, + x: (item.x1 + item.x2) / 2, y: (item.y1 + item.y2) / 2, + z: (item.z1 + item.z2) / 2 })), + // Both fighters are always in this list. A fighter is never removed from + // the frame to make a camera move work — the shot is what moves. + ...activePlayers().map((item) => ({ + kind: "player", item, x: item.x, y: item.y, z: item.z })), + ]; + const depth = (item) => dot3({ + x: item.x - cameraDoll.position.x, + y: item.y - cameraDoll.position.y, + z: item.z - cameraDoll.position.z, + }, viewDirection); + renderables.sort((a, b) => depth(b) - depth(a)); + for (const renderable of renderables) { + triangleDepth = projectPoint(renderable.x, renderable.y, renderable.z).z; + if (renderable.kind === "bullet") drawBullet(renderable.item); + else if (renderable.kind === "grenade") drawGrenade(renderable.item); + else if (renderable.kind === "ball") drawBall(renderable.item); + else if (renderable.kind === "detached") drawDetachedPart(renderable.item); + else { + drawDiveMotion(renderable.item, t); + drawDoubleJumpMotion(renderable.item, t); + drawRunner(renderable.item, t, showRunnerLabels); + } + } + // Debug geometry sits above the world but below the -1.42 screen-UI lane. + // It must remain visible through fighter bodies without cutting across the + // title, controls, command notation, names, clock, or other HUD furniture. + triangleDepth = -1.4; + drawDebugHitboxes(players[0], t); + if (!survivalActive()) for (const player of players.slice(1)) drawDebugHitboxes(player, t); + for (const player of players) drawBotScene(player); + drawBallHitboxes(); + drawSafeZones(); + triangleDepth = -1.42; + // On the SCREEN UI layer, not the debug-geometry one above it. The meter is + // an instrument being read rather than scenery in the room, and the layering + // test is what caught it sitting at the debug depth where a tall enough + // piece of world could have drawn straight through it. + drawFrameMeter(); + drawImpacts(); + drawTitleHeadDoor(t, titleInk, reelMinimal); + const counting = !roundResult && introAge < roundIntroDurationUs(); + // The matchup card announces two names in the middle of the screen, which + // is exactly where the wordmark sits. On the entry fight the word wins. + if (matchHud && !reelMinimal && counting && shellMode === "GAME") + survivalActive() + ? drawSurvivalIntro(titleInk, statusShadow) + : drawFightIntro(introAge / 1000000, titleInk, statusShadow); + // The keys belong wherever a newcomer is looking: under the wordmark on the + // way in, and again while a round counts itself off. Self-play has no + // newcomer — two bots need no tutorial, and neither does a reel of them. + // The legend is the stable key for the score written beneath it. Keep it + // present throughout every player-controlled screen; only unattended bot + // self-play and marketing reels have no learner to serve. + if (!replayOven && !selfPlay && renderFlags.keys !== false) + drawControlLegend(titleInk); + const resultUiReady = cinematicAge < 0 || cinematicAge >= 1.1; + // A reel opens on the matchup. Both names, both palettes, stacked up top + // where the fighters are not — a stranger scrolling past should know who is + // who before the first hit lands. It clears out early so the round itself + // still plays under nothing at all. + if (reelMinimal && shellMode === "GAME" && !roundResult && + introAge / 1000000 < REEL_MATCHUP_SECONDS) { + const nameSize = compactLayout() ? 40 : 54; + const top = Math.round(viewHeight * .14); + const names = activePlayers(); + for (let side = 0; side < names.length; side++) { + drawReelName(String(names[side].name).toLowerCase(), + top + side * Math.round(nameSize * 1.5), nameSize, names[side], t); + } + } + if (matchHud && survivalActive() && shellMode === "GAME" && + gameplayStarted && !roundResult && !counting) + drawSurvivalHud(titleInk); + if (survivalActive() && roundResult && resultUiReady) { + drawSurvivalResult(titleInk, statusShadow); + } else if (reelMinimal && roundResult && resultUiReady) { + // One fact, in the middle of the frame: who won. The recording stops on + // the result card, so anything queued behind the name would never survive + // the trim — and a name alone is the whole story a reel owes a stranger. + const result = resultCardText(); + const winnerSize = compactLayout() ? 46 : 64; + // Up top, where the fight is not. The celebration push puts the winner's + // head in the middle of the frame, so a name anywhere near center lands on + // their face. + const champion = players.find((player) => + String(player.name).toLowerCase() === result.winner) || null; + drawReelName(result.winner, Math.round(viewHeight * .17), + winnerSize, champion, t); + } else if (matchHud && roundResult && resultUiReady) { + if (INSTANT_REPLAY && instantReplay) { + const frame = Math.min(instantReplay.frames.length, + Math.floor(instantReplay.cursor) + 1); + const replayLabel = "REPLAY " + frame + "/" + instantReplay.frames.length; + typeWrite(replayLabel, viewCenterX() - replayLabel.length * 10, + 820, 30, ...titleInk); + drawCenteredKeycapRun(replayControlKeys(instantReplay.paused), + 940, 19, inputPads[0]?.down || [], titleInk); + } else { + const result = resultCardText(); + // The result is a small ownership mark, not a second title screen. + // Character reactions carry the emotional result in the arena. + const winnerSize = compactLayout() ? 30 : 42; + const winnerWidth = handleWidth(result.winner, winnerSize); + const resultY = hudSafeRect().top + 62; + typeWrite(result.winner, viewCenterX() - winnerWidth / 2 + 3, resultY + 4, + winnerSize, ...statusShadow); + typeWrite(result.winner, viewCenterX() - winnerWidth / 2, resultY, + winnerSize, ...titleInk); + if (result.action) { + const actionSize = Math.min(44, winnerSize * .54); + const actionWidth = handleWidth(result.action, actionSize); + typeWrite(result.action, viewCenterX() - actionWidth / 2 + 3, 900, + actionSize, ...statusShadow); + typeWrite(result.action, viewCenterX() - actionWidth / 2, 896, + actionSize, ...titleInk); + } + if (!roundViewer && INSTANT_REPLAY) { + drawCenteredKeycapRun(replayOfferKeys(), 940, 19, + inputPads[0]?.down || [], titleInk); + } + } + } + // Nameplates and stats wait for the wordmark to lift; the entry frame is + // the word, the keys, and the two fighters, and nothing else. + if (!survivalActive() && matchHud && !reelMinimal && shellMode === "GAME" && + ((roundResult && resultUiReady) || + (!roundResult && introAge >= roundIntroDurationUs()))) { + const hudPlayers = spatialHudPlayers(); + for (let side = 0; side < hudPlayers.length; side++) { + const player = hudPlayers[side]; + drawPlayerHandle(player, t, side); + drawPlayerStats(player, side, t); + drawHudInventory(player, side); + drawCommandStream(player, side); + } + } + if (!survivalActive() && replayOven && capabilities().reelFullUi === true && + shellMode === "GAME") + drawReelSectionProgress(run.monotonicUs, titleInk); + if (!replayOven) drawDebugPerformance(titleInk); + drawDeathFlash(); + if (shellMode === "MENU") { + const transitionAge = titleTransitionAt !== null + ? (run.monotonicUs - titleTransitionAt) / 1000000 : -1; + drawTitleScreen(t, menuInk, transitionAge); + if (transitionAge >= 0) return; + } + if (!replayOven) { + // Over the fighters, deliberately: the lobby's lone body stands center + // frame, and an instruction painted under it was an instruction hidden. + if (!reelMinimal) drawVersusHud(t, titleInk, run); + drawSpectatorQr(titleInk); + if (!reelMinimal) drawNetHealth(titleInk); + if (matchHud && !reelMinimal && renderFlags.hud !== false && + shellMode === "GAME" && !survivalActive()) drawMapName(titleInk); + drawTouchControls(); + if (localVersusActive() && localControllerMissing !== -1) { + const label = "reconnect player " + (localControllerMissing + 1); + const size = compactLayout() ? 30 : 48; + const width = handleWidth(label, size); + const left = viewCenterX() - width / 2; + const top = viewHeight * .43; + box(left - 20, top - 16, width + 40, size + 32, 9, 12, 22); + typeWrite(label, left, top, size, 255, 235, 130); + } + } +} + +// The raw pad words remember() files between real moves. The training floor +// captions moves, not fingers — "KICK" teaches, "B" nags. +const versusLabelNoise = new Set(["NONE", "UP", "DOWN", "LEFT", "RIGHT", + "A", "B", "X", "Y", "LB", "RB", "VIEW", "MENU"]); + +// The lobby's interface is a challenge and a code: fight a friend, share +// the address, and until they arrive every move the lone fighter makes is +// named back at them — the empty room as training mode. +function drawVersusHud(t, ink, run) { + if (!versusLane() || shellMode !== "GAME") return; + if (!lobbyActive()) return; + const hud = hudSafeRect(); + const compact = compactLayout(); + const door = versusDoor(); + // Behind the door the address is a lie: nothing is published, so nobody + // could arrive at it. Say what is actually in the way instead. The panel + // that takes the email or the handle is the shell's, over the top of this; + // this is the part that stays legible on a television across a room. + const headline = door === "login" ? "SIGN IN TO PLAY" + : door === "handle" ? "CHOOSE A HANDLE" : "WAITING ROOM"; + const headSize = compact ? 30 : 44; + const pulse = .5 + Math.sin(t * 2.4) * .5; + const headInk = mixColor(ink, [235, 205, 74], .35 + pulse * .45); + const headWidth = handleWidth(headline, headSize); + const headX = viewCenterX() - headWidth / 2; + const headY = hud.top + (compact ? 30 : 42); + typeWrite(headline, headX + 3, headY + 3, headSize, ...contrastShadow(ink)); + typeWrite(headline, headX, headY, headSize, ...headInk); + const address = door === "login" + ? "A FIGHT NEEDS A NAME ON BOTH ENDS" + : door === "handle" ? "YOUR HANDLE IS WHAT THE FIGHT WRITES DOWN" + : "FIGHT A FRIEND OSKIEWAR.COM/" + versusRoomName.toUpperCase(); + const addressSize = compact ? 16 : 23; + const addressWidth = handleWidth(address, addressSize); + const addressY = headY + headSize + 10; + typeWrite(address, viewCenterX() - addressWidth / 2 + 2, addressY + 2, + addressSize, ...contrastShadow(ink)); + typeWrite(address, viewCenterX() - addressWidth / 2, addressY, + addressSize, ...ink); + const player = players[0]; + // The death card owns the middle of the screen for the whole down beat — + // the loop is die, read it, stand back up whole. + if (!player.alive) { + const deadLabel = "YOU DIED"; + const deadSize = compact ? 44 : 66; + const deadWidth = handleWidth(deadLabel, deadSize); + const deadX = viewCenterX() - deadWidth / 2; + const deadY = Math.round(viewHeight * .44 + Math.sin(t * 3.2) * 3); + typeWrite(deadLabel, deadX + 4, deadY + 4, deadSize, + ...contrastShadow(ink)); + typeWrite(deadLabel, deadX, deadY, deadSize, + ...mixColor(ink, [235, 38, 58], .8)); + return; + } + if (!player.lastButtonAt || versusLabelNoise.has(player.lastButton)) return; + const age = (run.monotonicUs - player.lastButtonAt) / 1000000; + if (age < 0 || age > .9) return; + // The caption swells on landing and lets go through the tail — spoken, + // not filed. + const fade = 1 - age / .9; + const moveSize = Math.round((compact ? 26 : 38) * (1.06 - fade * .06)); + const moveWidth = handleWidth(player.lastButton, moveSize); + const moveX = viewCenterX() - moveWidth / 2; + const moveY = Math.round(viewHeight * .62) - Math.round((1 - fade) * 26); + const moveInk = fade > .4 ? ink : mixColor(contrastShadow(ink), ink, fade / .4); + typeWrite(player.lastButton, moveX + 3, moveY + 3, moveSize, + ...contrastShadow(ink)); + typeWrite(player.lastButton, moveX, moveY, moveSize, ...moveInk); +} + +function boot() { + try { + gameBoot(); + } catch (error) { + captureClientError("boot", error); + } +} + +function sim() { + if (!netSession && performanceStageActive()) return; + if (clientError) { restartAfterClientError(); return; } + try { + netDrainHostInbox(); + if (netSession) netTick(); + else gameSim(); + } catch (error) { + captureClientError("sim", error); + } +} + +function paint() { + if (drawPerformanceStage()) return; + if (clientError) { + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + return; + } + const previousMath = Math; + Math = platformMath; // Display-only geometry can use the host's fast intrinsics. + const restore = beginRenderInterpolation(runtime().renderAlpha ?? 1); + sharingRenderPoses = true; + try { + gamePaint(); + drawPerformanceFooter(); + } catch (error) { + captureClientError("paint", error); + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + } finally { + sharingRenderPoses = false; + renderPoses.clear(); + restore(); + Math = previousMath; + } +} +function act() {} +function leave() { + try { + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + } catch (error) { + captureClientError("leave", error); + } +} + + +// Included in Neo's existing Oskiewar renderer; primitive-only and silent. +function drawFemragDance(music, elapsed) { + const width=viewWidth(), height=viewHeight, beat=elapsed*(Number(music.bpm)||144)/60; + const reverse=/ragga/.test(music.section||'')?-1:1; + const gather=/build/.test(music.section||'')?.7:1; + const fade=/outro/.test(music.section||'')?clamp((music.duration-elapsed)/8,0,1):1; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[249,154,103]]; + const hits=(music.hits||[]).map(e=>({t:music.elapsed+e[0]/100,seat:e[1]===6?'sub':e[1],midi:e[2]<0?null:e[2]})); + const sub=hits.reduce((v,e)=>e.seat==='sub'&&elapsed>=e.t?Math.max(v,Math.exp(-(elapsed-e.t)*9)):v,0); + triangleDepth=-.8; + const scale=Math.min(width,height)*.047; + for(let seat=0;seat<6;seat++) { + let hit=null, level=0; + for(const e of hits)if(e.seat===seat&&elapsed>=e.t&&elapsed-e.t<.6){ + const amp=Math.exp(-(elapsed-e.t)*7);if(amp>level){level=amp;hit=e;} + } + const a=seat*2*Math.PI/5+reverse*beat*Math.PI/32; + const x=seat===5?viewCenterX():viewCenterX()+platformMath.sin(a)*width*.30*gather; + const y=seat===5?height*.40:height*.40+platformMath.cos(a)*height*.23*gather; + const step=platformMath.sin(beat*Math.PI+seat)*(.15+level*.55); + const bob=level*scale*.55; + const color=colors[seat].map(v=>Math.round(v*(.55+.45*fade))); + const limb=scale*.17, bodyY=y-bob; + filledCapsule(x,bodyY-scale*.25,x,bodyY+scale*.65,limb,color); + filledDisc(x,bodyY-scale*.8,scale*.42,color); + for(const side of [-1,1]) { + filledCapsule(x,bodyY,x+side*scale*.8,bodyY-scale*(.15+level*.9)+side*step*scale,limb,color); + filledCapsule(x,bodyY+scale*.6,x+side*scale*(.45+step*.25),y+scale*1.35,limb,color); + } + if(hit&&Number.isFinite(hit.midi)) { + const note=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'][Math.round(hit.midi)%12]; + const size=Math.max(20,scale*.65); + typeWrite(note,x-handleWidth(note,size)/2,bodyY-scale*1.9,size,...color); + } + } + // Sub notes swell a steady floor; no full-screen flash or second soundtrack. + screenRect(width*.12,height*.76,width*.76,3+sub*8,[94,110,143]); +} + +function performanceStageActive() { + const stage = globalThis.__oskiewarStageState; + return Boolean(stage?.curtain || stage?.performance?.active); +} + +// A room-performance display: the transport supplies title, time and notes; +// it never touches fighter physics or creates a second musical soundtrack. +function drawPerformanceStage() { + const stage = globalThis.__oskiewarStageState; + if (!performanceStageActive()) return false; + syncGameView(); + wipe(3, 5, 10); + if (stage.curtain) { drawCurtainDirections(stage); return true; } + const music = stage.performance; + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp(Number(music.elapsed) + (music.playing ? age : 0), 0, Number(music.duration) || 0); + const duration = Math.max(0, Number(music.duration) || 0); + const width = viewWidth(), center = viewCenterX(); + const pulse = clamp(Number(music.intensity) || 0, 0, 1); + const t = elapsed; + triangleDepth = -.8; + if (music.dance === 'femrag-round-v1') drawFemragDance(music, elapsed); + else + for (let index = 0; index < 2; index++) { + const note = music.notes?.[index % Math.max(1, music.notes?.length || 1)]; + const singing = music.playing && Number.isFinite(note); + const level = singing ? .25 + pulse * .75 : pulse * .35; + const radius = Math.min(width * .12, 116); + const x = center + (index ? 1 : -1) * Math.min(width * .19, 225); + const y = viewHeight * .43 + platformMath.sin(t * 1.7 + index * 1.8) * (5 + level * 6); + const color = index ? [77, 188, 222] : [239, 133, 152]; + filledDisc(x, y, radius, color); + triangleDepth = -.85; + const ink = [12, 19, 35]; + const blink = platformMath.sin(t * .73 + index * 2.1) > .988; + for (const side of [-1, 1]) { + const ex = x + side * radius * .32, ey = y - radius * .18; + if (blink) filledCapsule(ex - radius * .09, ey, ex + radius * .09, ey, radius * .055, ink); + else { + filledDisc(ex, ey, radius * .085, ink); + filledDisc(ex + radius * .019, ey - radius * .026, radius * .025, [245, 248, 255]); + } + } + const mouthY = y + radius * .3; + filledCapsule(x - radius * .12, mouthY, x + radius * .12, mouthY, + radius * (.055 + level * .26), ink); + triangleDepth = -.8; + } + const title = String(music.title || "Untitled composition").slice(0, 110); + let size = 38; + while (size > 18 && handleWidth(title, size) > width - 72) size -= 2; + typeWrite(title, center - handleWidth(title, size) / 2, viewHeight - 126, size, 240, 243, 251); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 20) / 2, viewHeight - 76, 20, 150, 168, 193); + const trackWidth = Math.min(width - 100, 620), left = center - trackWidth / 2; + hudBox(left, viewHeight - 37, trackWidth, 4, 31, 42, 61); + if (duration) hudBox(left, viewHeight - 37, trackWidth * elapsed / duration, 4, 105, 205, 213); + return true; +} + +// The composition remains visible during a fight, independently of the +// full-screen performance mode. Its lane replaces the debug session label. +function performanceFooterVisible() { + const stage = globalThis.__oskiewarStageState; + const music = stage?.performance; + return Boolean(!stage?.curtain && music?.title && + (music.playing || music.phase === "countdown" || music.phase === "stale")); +} +function drawPerformanceFooter() { + if (!performanceFooterVisible()) return; + const stage = globalThis.__oskiewarStageState, music = stage.performance; + const duration = Math.max(0, Number(music.duration) || 0); + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp((Number(music.elapsed) || 0) + (music.playing ? age : 0), 0, duration); + const width = Math.min(viewWidth() * .66, 1000), center = viewCenterX(); + const left = center - width / 2, top = viewHeight - 88; + const previousDepth = triangleDepth; + triangleDepth = -1.49; + // Use screen rectangles so the Xbox's GPU pass does not cover the strip. + screenRect(left, top, width, 74, [8, 14, 25]); + const title = String(music.title).slice(0, 110); + let size = 25; + while (size > 16 && handleWidth(title, size) > width - 24) size--; + typeWrite(title, center - handleWidth(title, size) / 2, top + 7, size, 243, 247, 255); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 17) / 2, top + 42, 17, 166, 189, 213); + screenRect(left + 12, top + 68, width - 24, 3, [36, 51, 68]); + if (duration) screenRect(left + 12, top + 68, (width - 24) * elapsed / duration, 3, [105, 222, 213]); + triangleDepth = previousDepth; +} + +function drawCurtainDirections(stage = globalThis.__oskiewarStageState) { + const width = viewWidth(), center = viewCenterX(), left = center - width / 2; + const music = stage?.performance; + const age = Math.max(0, (Date.now() - (stage?.receivedAt || Date.now())) / 1000); + const elapsed = (Number(music?.elapsed) || 0) + Math.min(age, 1); + const lyrics = music?.curtainStyle !== "directions" && music?.playing && age < 2.5 + ? (music.lyrics || []).filter(line => elapsed >= line.start - 1.5 && elapsed < line.end + .35).slice(0, 3) : []; + // Wall-clock motion continues while both match simulations are frozen. + const time = Date.now() / 1000; + const palette = [[244, 128, 179], [91, 215, 227], [163, 223, 91], [255, 191, 90], [169, 142, 248]]; + triangleDepth = -1; + for (let lane = 0; lane < 2; lane++) { + const spacing = width / 5, length = spacing * .47, height = length * .55; + const y = viewHeight * (lane ? .85 : .16); + for (let index = -1; index < 6; index++) { + const x = left + index * spacing + ((time * width * .12 + lane * spacing * .5) % spacing); + const base = palette[((index + lane * 2) % 5 + 5) % 5]; + const glow = .52 + .3 * platformMath.sin(time * 2.4 - index * .8); + const color = base.map(v => Math.round(v * glow)); + screenRect(x, y - height * .13, length * .58, height * .26, color); + screenTriangle(x + length * .5, y - height / 2, + x + length, y, x + length * .5, y + height / 2, ...color); + } + } + drawCurtainFighter(left + width * (lyrics.length ? .08 : .24), + viewHeight * (lyrics.length ? .68 : .52), Math.min(width, viewHeight) * (lyrics.length ? .052 : .095), time); + if (lyrics.length) { + for (let row = 0; row < lyrics.length; row++) { + const line = lyrics[row], words = line.words || []; + const text = words.map(word => word.text).join(" "); + let size = Math.min(50, width * .043); + while (size > 16 && handleWidth(text, size) > width * .82) size--; + const y = viewHeight * (.4 + (row - (lyrics.length - 1) / 2) * .16); + let x = center - handleWidth(text, size) / 2; + const color = /^#[a-f0-9]{6}$/i.test(line.color || "") + ? [1, 3, 5].map(i => parseInt(line.color.slice(i, i + 2), 16)) : [163, 223, 91]; + for (const word of words) { + const active = elapsed >= word.start && elapsed < word.end; + const ink = elapsed < word.start ? [129, 141, 158] : color; + typeWrite(word.text, x, y, size, ...ink); + const w = handleWidth(word.text, size); + if (active) screenRect(x, y + size * 1.18, w, Math.max(2, size * .06), color); + x += handleWidth(word.text + " ", size); + } + } + return; + } + const label = "look that way ->", size = Math.min(46, width * .045); + typeWrite(label, center - handleWidth(label, size) / 2, + viewHeight * .68, size, 229, 240, 248); + // A large arrow completes the character's pointing gesture. + const x = center + width * .04, y = viewHeight * .46, length = width * .27; + const color = palette[Math.floor(time / 2) % palette.length]; + screenRect(x, y - length * .07, length * .6, length * .14, color); + screenTriangle(x + length * .55, y - length * .26, + x + length, y, x + length * .55, y + length * .26, ...color); +} + +function drawCurtainFighter(x, y, r, time) { + const bob = platformMath.sin(time * 3) * r * .05; + y += bob; + const ink = [20, 29, 42], skin = [166, 225, 103], boot = [239, 125, 166]; + triangleDepth = -.9; + filledCapsule(x, y + r * .8, x - r * .38, y + r * 1.7, r * .16, skin); + filledCapsule(x, y + r * .8, x + r * .45, y + r * 1.7, r * .16, skin); + filledCapsule(x - r * .52, y + r * 1.72, x - r * .2, y + r * 1.72, r * .17, boot); + filledCapsule(x + r * .4, y + r * 1.72, x + r * .78, y + r * 1.72, r * .17, boot); + filledCapsule(x, y + r * .26, x, y + r * .86, r * .26, boot); + filledCapsule(x + r * .1, y + r * .38, x + r * 1.35, y + r * .13, r * .13, skin); + filledDisc(x + r * 1.35, y + r * .13, r * .19, skin); + filledCapsule(x + r * 1.3, y + r * .05, x + r * 1.68, y + r * .05, r * .08, skin); + filledDisc(x, y - r * .62, r, skin); + // Eyes and nose sit on the right side: gaze agrees with the gesture. + triangleDepth = -1.05; + for (const ex of [x + r * .12, x + r * .62]) { + filledDisc(ex, y - r * .82, r * .22, [243, 248, 232]); + filledDisc(ex + r * .09, y - r * .8, r * .095, ink); + } + filledDisc(x + r * .98, y - r * .44, r * .18, skin); + filledCapsule(x + r * .33, y - r * .13, x + r * .7, y - r * .18, r * .055, ink); + triangleDepth = -1; +} diff --git a/xbox/live/oskiewar.js.pre-femrag b/xbox/live/oskiewar.js.pre-femrag new file mode 100644 index 0000000000..8f67b3da1a --- /dev/null +++ b/xbox/live/oskiewar.js.pre-femrag @@ -0,0 +1,16906 @@ +// @bundle-qr +// The console's monotonic clock can hand back a negative number: App.cpp +// converts QPC ticks with `counter * 1000000`, which overflows int64 past +// about ten days of uptime. Every deadline in this piece starts at 0 and is +// compared with `now >=` or `now <`, so a negative clock made `hitStunUntil` +// permanently in the future -- no attack could fire and no round could be +// won -- stranded the title, silenced the input log, and indexed off the +// front of a palette. Rebase once, here, so time starts at zero whatever the +// host reports. The host builds a fresh object per call, so this rewrites +// that copy rather than allocating another. +const hostRuntime = runtime; +let clockEpoch = null; +// Rollback netplay's hooks into the clock and the side effects. The session +// itself lives further down (search "Rollback netplay"); these four sit here +// because the wrapper below and the signal emitters read them. +let netSession = null; +// Windows and Linux libm differ by a few ULPs. Network simulation uses the +// same elementary operations on both hosts, including geometry sampled for +// collision. Keep native math for ordinary local play. +const platformMath = globalThis.Math; +let Math = Object.create(platformMath); +function netSin(x) { + x %= 6.283185307179586; + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +function netAtan(x) { + const sign = x < 0 ? -1 : 1; + x = platformMath.abs(x); + const inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + platformMath.sqrt(1 + x * x)); + const square = x * x; + let term = x, sum = x; + for (let n = 1; n <= 20; n++) { + term *= -square; + sum += term / (2 * n + 1); + } + const angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +function netAtan2(y, x) { + if (x > 0) return netAtan(y / x); + if (x < 0) return netAtan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +function netExp(x) { + if (x > 709.782712893384) return Infinity; + if (x < -745.1332191019411) return 0; + const exponent = platformMath.round(x / .6931471805599453); + const remainder = x - exponent * .6931471805599453; + let sum = 1, term = 1; + for (let n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * 2 ** exponent; +} +function netHypot(...values) { + let scale = 0; + for (const value of values) scale = platformMath.max(scale, platformMath.abs(value)); + if (!scale || !Number.isFinite(scale)) return scale; + let sum = 0; + for (const value of values) { const ratio = value / scale; sum += ratio * ratio; } + return platformMath.sqrt(sum) * scale; +} +const netMath = {sin: netSin, cos: x => netSin(x + 1.5707963267948966), + tan: x => netSin(x) / netSin(x + 1.5707963267948966), atan: netAtan, + atan2: netAtan2, asin: x => netAtan2(x, platformMath.sqrt(1 - x * x)), + exp: netExp, hypot: netHypot}; +for (const [name, fallback] of Object.entries(netMath)) { + const native = globalThis.__oskiewarNativeMath; + const calculate = native?.version === "oskiewar-libm-v1" && typeof native[name] === "function" + ? native[name] : fallback; + Math[name] = (...args) => netSession ? calculate(...args) : platformMath[name](...args); +} + +// While non-null, runtime() reports this clock: the sim is stepping frame f +// and must read f's time whatever the wall says. +let netClockUs = null; +// While true the sim is replaying frames it already showed once — no drums, +// no signals, no telemetry, no publishing. The state changes; nothing else. +let netSilent = false; +let netFrameInputs = null; +// Game speed is the clock, not a patch on top of it. Every deadline, spring, +// bot die-roll and animation in this piece reads one monotonic stream, so +// scaling the stream's increments scales the whole game coherently — physics, +// input windows, round timers, all in step. Set from the title screen with +// +/- on a keyboard, in quarter steps between a quarter and double speed; +// the offline reel harness drives simMonotonicUs itself and never touches +// this, so recordings always run at one. +let gameSpeed = 1; +let roundModifier = ""; +let netRoundClockDebtUs = 0; +function airRoundActive() { return roundModifier === "air"; } +function roundSpeed() { return roundModifier === "slow" ? .5 : 1; } +let gameSpeedChangedAt = 0; +let scaledClockUs = 0; +let lastRawClockUs = null; +runtime = function acRuntime() { + const info = hostRuntime(); + const raw = Number(info.monotonicUs) || 0; + if (clockEpoch === null) clockEpoch = raw; + if (lastRawClockUs === null) lastRawClockUs = raw; + scaledClockUs += (raw - lastRawClockUs) * gameSpeed * roundSpeed(); + lastRawClockUs = raw; + info.monotonicUs = Math.round(scaledClockUs); + if (typeof info.simMonotonicUs === "number") + info.simMonotonicUs -= clockEpoch; + // A rollback fight keeps its own clock: frame f reads f's time while it is + // simulated, and the paint between frames reads the current frame's time + // plus how far the display is into it, so animation and HUD stay on the + // fight's timeline rather than the wall's. + if (netClockUs !== null) { + info.monotonicUs = netClockUs - netRoundClockDebtUs; + info.simMonotonicUs = info.monotonicUs; + } else if (netSession) { + const alpha = Math.max(0, Math.min(1, Number(info.renderAlpha) || 0)); + const at = netSession.originUs + netSession.frame * NET_TICK_US + + Math.round(alpha * NET_TICK_US * roundSpeed()) - netRoundClockDebtUs; + info.monotonicUs = at; + info.simMonotonicUs = at; + } + return info; +}; +// Replayed frames are silent: the wall already saw them once. +// +// These two hooks belong to the host, and the hosts disagree about which of +// them exist: the native shell installs `telemetry` and no `analytics` at all. +// Reading an undeclared binding throws, and this runs at the top level of one +// program, so that throw took every `let` below it with it — the shell then +// reported the first of those (`gameMode`) as uninitialized, a good half a +// file away from the actual cause. `typeof` is the one way to ask whether a +// binding exists without touching it, so ask, and only wrap what is there. +const hostTelemetry = typeof telemetry === "function" ? telemetry : null; +if (hostTelemetry) + telemetry = function netTelemetry(...args) { + if (netSilent) return; + return hostTelemetry(...args); + }; +const hostAnalytics = typeof analytics === "function" ? analytics : null; +if (hostAnalytics) + analytics = function netAnalytics(...args) { + if (netSilent) return; + return hostAnalytics(...args); + }; + +// Monotonic count of committed revisions to this piece (next revision included). +const buildVersion = 162; +const floorY = 1800; +// Oskiewar now opens as a versus game. An ordinary web visit hosts a room — +// the URL becomes the invitation — and until a friend opens it, all you can +// do is move: a training floor with your own moves named back at you and one +// standing instruction, find a friend. Survival (the solo ascent) and the +// bot/dummy doors remain modes behind `?opponent=`, and the regression +// harness still enters combat directly. Keeping player two as explicit mode +// state, rather than deleting the chair, preserves replays and the fight +// laboratory while ensuring no route quietly seats an adversary. +let gameMode = "fight"; +const survivalActive = () => gameMode === "survival"; +// The versus lane's two rooms-of-play: alone in the cube waiting on a rival, +// or fighting the rival the relay seated. Both publish to the same room so +// the shared URL is the lobby, the fight and the grandstand at once. +const lobbyActive = () => gameMode === "fight" && fightOpponent === "versus-lobby"; +const versusActive = () => gameMode === "fight" && fightOpponent === "versus"; +const versusLane = () => lobbyActive() || versusActive(); +// The station. The tower became a cube, and the cube has now been opened to +// vacuum: @jeffrey asked for "a large space map", and the cube's own comment +// had already named the condition for growing one — "a tile-authored map is +// exactly the shape a future rung would be written in." So the lattice is +// what grew. Twenty tiles wide by fourteen tall at the same 90 units a side, +// which is four times the cube's floor area and still frames whole on one +// screen at the widest shot, because a fighter you cannot see is a fighter +// you cannot read. +// +// What changed besides the number: the plaster shell is gone. There is no +// back wall, no ceiling slab and no side wall, because the map is outside +// now — stars behind, a planet below the deck, and a hull you stand on +// rather than a room you are sealed into. Gravity is station gravity, a +// little over half a G (`spaceGravityScale`), so a jump hangs and the +// floating decks overhead are reachable on legs alone. Simulation stays +// continuous — nothing about motion quantizes — but the STRUCTURE is +// addressable: spawns, pickups, decks and lanes are authored in tile +// coordinates, the lattice draws as a faint nav hologram, and `gridField` +// below holds one number per tile so per-tile computation (heat, ownership, +// weather) has a surface to run on. +const tileSize = 90; +let gridCols = 40; +const gridRows = 16; +// Tile (0, 0) starts flush at the floor-left corner of the PLAYABLE box, so +// every tile edge lands on a clean multiple of 90. The walls stand outside +// the lattice: the structural shell is one wallThickness beyond each face, +// and `resolveRunnerBounds` pushes off the faces themselves. +const wallThickness = 40; +const gridLeft = 0; +let gridWidth = gridCols * tileSize; +const gridHeight = gridRows * tileSize; +const worldLeft = gridLeft - wallThickness; +let worldRight = gridLeft + gridWidth + wallThickness; +const ceilingY = floorY - gridHeight - wallThickness; +// Depth is the eye's dimension, not the fight's — fighters live near z = 0 — +// so it is authored rather than derived. It was the cube's own width back +// when those were the same number; widening the map to twenty tiles must not +// also push the far plane twice as far out, because every camera stand-off, +// every killcam orbit and the whole ±30000 native coordinate budget were +// tuned against this depth and not against the floor's span. +const roomDepth = 900; +const worldNear = -roomDepth / 2; +const worldFar = roomDepth / 2; +// Address helpers: world position to tile and back. Rows count UP from the +// floor, because in a fight the floor is where everything starts. All three +// clamp, so a body pressed into a wall still names a real tile. +const tileCol = (x) => + Math.min(gridCols - 1, Math.max(0, Math.floor((x - gridLeft) / tileSize))); +const tileRow = (y) => + Math.min(gridRows - 1, Math.max(0, Math.floor((floorY - y) / tileSize))); +const tileCenterX = (col) => gridLeft + (col + .5) * tileSize; +// One number per tile, row-major from the floor-left corner. Today impacts +// write heat into it and the overlay draws that heat fading; tomorrow it is +// wherever tiled computation over the map wants to live. +let gridField = new Float32Array(gridCols * gridRows); +const gridFieldIndex = (x, y) => tileRow(y) * gridCols + tileCol(x); +// Whether a point is on the lattice at all. `tileCol` and `tileRow` CLAMP, +// which is right for a body pressed into a wall — it still stands somewhere — +// and wrong for anything that happens off the map, because every one of those +// lands on the same corner cell. On plaster that was invisible. Against black +// space it was a lit bar across the top corners of the frame: the title +// screen's own bouncing letters, stamping heat outside the box, all of it +// clamped into row thirteen at columns zero and nineteen. +const onGridField = (x, y) => + x >= gridLeft && x <= gridLeft + gridWidth && + y <= floorY && y >= floorY - gridHeight; +// The park. The floor stopped being flat. +// +// Every piece of this was already here and switched off: `terrainFloorAt` has +// carried a heightfield since the tower, `terrainTangentAt` differentiates it, +// and the skate physics have been feeding that slope into `skateVx` all along +// — `player.skateVx += terrainSlope * 1900 * dt` is a line that has done +// nothing for months because the amplitude was zero. What was missing was a +// shape worth riding. +// +// So the profile is authored rather than noised. A run of segments in tile +// coordinates, each one a real skatepark feature, walked left to right: +// +// flat the ground, and the halfpipe's own flat bottom +// transition a quarter-circle, horizontal where it meets the flat and +// vertical at the coping — which is what a transition IS, and +// why it is an arc and not a straight ramp +// bank a straight incline, for launching off rather than carving in +// +// A transition's run equals its height because a quarter circle's does. That +// is not a simplification, it is the geometry: radius R gives you R of run +// and R of rise, tangent flat at the bottom and vertical at the lip. +// `lift` raises the segment's base off the ground, or — negative — digs it in. +// That sign is what makes a halfpipe possible in a game seen from the side: a +// pipe built UP from the floor is two humps with their ridable faces pointing +// away from you, and you would have to climb the back of one to use it. Dug +// IN, the same two arcs face each other, the flat bottom is genuinely a floor, +// and a skater can ride straight through at speed from either end. So the +// halfpipe here is a bowl, which is what a halfpipe is from the side anyway. +// Read it left to right and it is a run: drop off the left quarterpipe, carry +// the speed into the halfpipe, out across the middle, up the kicker and over +// the funbox, and finish on the right quarterpipe. The middle ten tiles are +// deliberately flat and deliberately in the middle — that is where the bell +// rings, and a fight that opens with both fighters sliding down a transition +// is a fight nobody chose the start of. +const parkFeatures = [ + { from: 0, to: 4, kind: "transition", rise: 360, dir: -1 }, + { from: 4, to: 6, kind: "flat" }, + { from: 6, to: 9, kind: "transition", rise: 270, dir: -1, lift: -270 }, + { from: 9, to: 12, kind: "flat", lift: -270 }, + { from: 12, to: 15, kind: "transition", rise: 270, dir: 1, lift: -270 }, + { from: 15, to: 25, kind: "flat" }, + { from: 25, to: 28, kind: "bank", rise: 180, dir: 1 }, + { from: 28, to: 30, kind: "flat", lift: 180 }, + { from: 30, to: 33, kind: "bank", rise: 180, dir: -1 }, + { from: 33, to: 36, kind: "flat" }, + { from: 36, to: 40, kind: "transition", rise: 360, dir: 1 }, +]; +// Resolved once into world units so the per-frame walk compares numbers +// rather than rebuilding them. `terrainFloorAt` runs for every foot, every +// grass blade and every render sample, so it is worth the twenty bytes. +let parkSegments = parkFeatures.map((feature) => ({ + ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, + lift: feature.lift || 0, +})); +const parkLeft = parkSegments[0].left; +let parkRight = parkSegments[parkSegments.length - 1].right; +// The lowest ground in the park. `floorY` used to be it — it +// was the whole world's bottom, and a dozen places lean on that: the camera +// clamps its aim to it, the ground's near skirt hangs from it, the terrain +// span stops at it. A bowl dug three tiles into the floor makes every one of +// those assumptions wrong by exactly the depth of the bowl, and the symptom +// is a fighter riding out of frame at the bottom of the pipe. +let parkDeepest = floorY + Math.max(0, + ...parkSegments.map((segment) => -segment.lift)); +// Enough samples that an arc reads as an arc. One per tile drew the halfpipe +// as a staircase — 90 units is most of a fighter wide, and a transition turns +// through ninety degrees in three of them. +let terrainSamples = gridCols * 6; +let terrainPhase = 0; +// The long park is selected by ?map=skatepark; the host's deal owns the map. +let skateparkMap = globalThis.__oskiewarMap === "skatepark"; +const skateLoops = [ + { x: 6300, radius: 320 }, { x: 15300, radius: 420 }, + { x: 24300, radius: 500 }, +]; +const skateBoosts = [2400, 5400, 10800, 14400, 19800, 23400, 27000] + .map((x) => ({ left: x, right: x + 240, speed: 3900 })); +const skateRopes = []; +const chainLinks = 16; +const chainLength = 44; + +function configureWorldMap(name) { + // A normal round keeps its current workshop/local variant. Only entering + // or leaving the long course needs to replace the world dimensions. + if (name !== "skatepark" && !skateparkMap) return; + skateparkMap = name === "skatepark"; + gridCols = skateparkMap ? 320 : 40; + gridWidth = gridCols * tileSize; + if (gridField.length !== gridCols * gridRows) gridField = new Float32Array(gridCols * gridRows); + worldRight = gridLeft + gridWidth + wallThickness; + const features = skateparkMap ? [ + ...parkFeatures.slice(0, -1), + { from: 36, to: 40, kind: "flat" }, + ...[40, 140, 240].flatMap((from) => [ + { from, to: from + 40, kind: "flat" }, + { from: from + 40, to: from + 46, kind: "bank", rise: 270, dir: 1 }, + { from: from + 46, to: from + 50, kind: "flat", lift: 270 }, + { from: from + 50, to: from + 56, kind: "bank", rise: 270, dir: -1 }, + { from: from + 56, to: Math.min(320, from + 100), kind: "flat" }, + ]), + ] : parkFeatures; + parkSegments = features.map((feature) => ({ ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, lift: feature.lift || 0 })); + parkRight = gridLeft + gridWidth; + terrainSamples = gridCols * 6; +} + +function resetSkateRopes() { + skateRopes.length = 0; + if (!skateparkMap) return; + for (const x of [3600, 9900, 18900]) { + const anchorY = floorY - 850; + skateRopes.push({ x, y: anchorY, z: 0, + nodes: Array.from({ length: chainLinks + 1 }, (_, index) => ({ + x, y: anchorY + index * chainLength, + px: x, py: anchorY + index * chainLength, + })) }); + } +} + +function releaseSkateRope(player) { + const rope = skateRopes[player.ropeIndex]; + const node = rope?.nodes[Math.round(player.ropeLink)]; + if (node) { + player.vx = clamp((node.x - node.px) / (rope.dt || 1 / 60), -4200, 4200); + player.vy = clamp((node.y - node.py) / (rope.dt || 1 / 60), -4200, 4200); + player.skateVx = player.vx; + player.knockVx = player.skateboard ? 0 : player.vx; + } + player.ropeIndex = -1; + player.grounded = false; +} + +// Hold grab through a crossing to latch. A fresh grab edge detaches. +function skateRopeInput(player, input, grabHeld, dt, grabPressed = grabHeld) { + if (!grabHeld) player.ropeGrabLocked = false; + if (player.ropeIndex >= 0 && (!player.alive || isHeadOnly(player) || + isPogo(player) || player.hitStunUntil > runtime().monotonicUs)) { + releaseSkateRope(player); + return false; + } + if (player.ropeIndex >= 0 && grabPressed) { + releaseSkateRope(player); + player.ropeGrabLocked = true; + return false; + } + if (player.ropeIndex < 0 && grabHeld && !player.ropeGrabLocked && player.heldBall < 0 && + player.heldPart < 0 && player.heldPlayer < 0) { + let nearest = null; + // Test the swept hand volume against each link, so a fast crossing counts. + const hand = { x1: player.x, y1: player.y - 125, z1: player.z, + x2: player.x + player.vx * dt, y2: player.y - 125 + player.vy * dt, + z2: player.z, width: 64 }; + skateRopes.forEach((rope, ropeIndex) => { + rope.nodes.slice(1).forEach((node, index) => { + const before = rope.nodes[index]; + const box = { left: Math.min(node.x, before.x) - 6, + right: Math.max(node.x, before.x) + 6, + top: Math.min(node.y, before.y) - 6, bottom: Math.max(node.y, before.y) + 6, + near: rope.z - 8, far: rope.z + 8 }; + const hit = segmentBoxEntry(hand, box, hand.width / 2); + const distance = Math.hypot(node.x - hand.x1, node.y - hand.y1); + if (hit !== null && (!nearest || distance < nearest.distance)) + nearest = { ropeIndex, link: index + 1, distance }; + }); + }); + if (nearest) { + player.ropeIndex = nearest.ropeIndex; + player.ropeLink = nearest.link; + const node = skateRopes[player.ropeIndex].nodes[nearest.link]; + node.px = node.x - clamp(player.vx, -3000, 3000) / 60; + node.py = node.y - clamp(player.vy, -3000, 3000) / 60; + player.skateLoop = -1; + player.lastButton = "ROPE"; + emitSignal("rope-grab", player.pad, nearest.ropeIndex, nearest.link); + } + } + if (!(player.ropeIndex >= 0)) return false; + player.ropeLink = clamp(player.ropeLink - input.vertical * dt * 3, + 2, chainLinks); + const rope = skateRopes[player.ropeIndex]; + const node = rope.nodes[Math.round(player.ropeLink)]; + node.px -= input.horizontal * 2100 * dt * dt; + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grounded = false; + player.attackKind = ""; + player.attackUntil = 0; + player.blocking = false; + player.stance = "ROPE"; + return true; +} + +// Verlet chain with a fixed anchor and distance constraints, stepped once per +// simulation tick. Nodes, previous positions and attachments all roll back. +function updateSkateRopes(dt) { + if (!skateparkMap || survivalActive()) return; + for (const rope of skateRopes) { + const timeScale = dt / (rope.dt || dt); + rope.dt = dt; + for (let i = 1; i < rope.nodes.length; i++) { + const node = rope.nodes[i]; + const vx = (node.x - node.px) * .997 * timeScale; + const vy = (node.y - node.py) * .997 * timeScale; + node.px = node.x; node.py = node.y; + node.x += vx; node.y += vy + fallGravity() * dt * dt; + } + const riders = players.filter((player) => player.alive && + skateRopes[player.ropeIndex] === rope); + const inverseMass = (index) => index === 0 ? 0 : + riders.some((rider) => Math.abs(rider.ropeLink - index) < 1) ? .125 : 1; + for (let pass = 0; pass < 32; pass++) { + rope.nodes[0].x = rope.x; rope.nodes[0].y = rope.y; + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + const dx = b.x - a.x, dy = b.y - a.y; + const length = Math.hypot(dx, dy) || 1; + const error = (length - chainLength) / length; + const wa = inverseMass(i - 1), wb = inverseMass(i); + const sum = wa + wb; + b.x -= dx * error * wb / sum; b.y -= dy * error * wb / sum; + a.x += dx * error * wa / sum; a.y += dy * error * wa / sum; + } + } + } + for (const player of players) { + if (!(player.ropeIndex >= 0)) continue; + if (!player.alive) { releaseSkateRope(player); continue; } + const rope = skateRopes[player.ropeIndex]; + const link = Math.floor(player.ropeLink), blend = player.ropeLink - link; + const a = rope.nodes[link], b = rope.nodes[Math.min(link + 1, chainLinks)]; + const x = lerp(a.x, b.x, blend), y = lerp(a.y, b.y, blend) + 125; + player.vx = (x - player.x) / Math.max(dt, .001); + player.vy = (y - player.y) / Math.max(dt, .001); + player.x = x; player.y = y; player.z = rope.z; + player.grounded = false; + } +} + +function skateLoopStep(player, input, dt, now) { + if (!(player.skateLoop >= 0)) { + if (!player.skateboard || !player.grounded || Math.abs(player.skateVx) < 1300) + return false; + const nextX = player.x + player.skateVx * dt; + const index = skateLoops.findIndex((loop) => + Math.min(player.x, nextX) <= loop.x && Math.max(player.x, nextX) >= loop.x && + Math.abs(player.y - floorY) < 30 && Math.abs(player.z) < 90 && + now >= (player.loopCooldownUntil || 0)); + if (index < 0) return false; + player.skateLoop = index; + player.loopAngle = 0; + player.loopSpeed = player.skateVx; + } + const loop = skateLoops[player.skateLoop]; + const angle = player.loopAngle; + player.loopSpeed += (-fallGravity() * Math.sin(angle) + input.horizontal * 500) * dt; + player.loopAngle += player.loopSpeed / loop.radius * dt; + const theta = player.loopAngle; + player.x = loop.x + Math.sin(theta) * loop.radius; + player.y = floorY - loop.radius + Math.cos(theta) * loop.radius; + player.vx = Math.cos(theta) * player.loopSpeed; + player.vy = -Math.sin(theta) * player.loopSpeed; + player.grounded = false; + player.skateRotation = -theta; + const completed = Math.abs(theta) >= Math.PI * 2; + const lostGrip = Math.cos(theta) < 0 && player.loopSpeed ** 2 / loop.radius < + -fallGravity() * Math.cos(theta); + if (completed || lostGrip || !player.skateboard) { + if (completed) { player.x = loop.x + Math.sign(player.loopSpeed) * 12; + player.y = floorY; player.vy = 0; player.grounded = true; } + player.skateVx = player.vx; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = now + 600000; + } + return true; +} + +function skateBoostStep(player, previousX, now) { + if (!skateparkMap || !player.skateboard || !player.grounded || + Math.abs(player.y - terrainFloorAt(player.x)) > 12 || + Math.abs(player.z) > 100 || now < (player.boostUntil || 0)) return; + const pad = skateBoosts.find((pad) => Math.max(previousX, player.x) >= pad.left && + Math.min(previousX, player.x) <= pad.right); + if (!pad) return; + player.skateVx = (Math.sign(player.skateVx) || player.facing) * pad.speed; + player.vx = player.skateVx; + player.boostUntil = now + 350000; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + emitSignal("skate-boost", player.pad, player.facing, pad.speed); + playDrum("whoosh", 1, panPlayer(player)); +} + +function drawSkateParkFeatures() { + if (!skateparkMap || survivalActive()) return; + const visible = (x, radius = 0) => Math.abs(x - cameraCenter) < cameraWidth + radius; + for (const loop of skateLoops) { + if (!visible(loop.x, loop.radius)) continue; + for (let i = 0; i < 96; i++) { + const a = i / 96 * Math.PI * 2, b = (i + 1) / 96 * Math.PI * 2; + for (const z of [-90, 90]) worldCapsule( + loop.x + Math.sin(a) * loop.radius, floorY - loop.radius + Math.cos(a) * loop.radius, z, + loop.x + Math.sin(b) * loop.radius, floorY - loop.radius + Math.cos(b) * loop.radius, z, + 10, [92, 212, 240]); + } + } + for (const pad of skateBoosts) { + if (!visible(pad.left, 240)) continue; + for (let x = pad.left; x < pad.right; x += 40) { + const y = terrainFloorAt(x) - 8; + worldCapsule(x, y, -70, x + 22, y, 0, 9, [255, 212, 66]); + worldCapsule(x + 22, y, 0, x, y, 70, 9, [255, 212, 66]); + } + } + for (const rope of skateRopes) { + if (!visible(rope.x, chainLinks * chainLength)) continue; + worldCapsule(rope.x - 70, rope.y, rope.z, rope.x + 70, rope.y, rope.z, + 18, [108, 130, 150]); + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + worldCapsule(a.x, a.y, rope.z, b.x, b.y, rope.z, 8, + i % 2 ? [220, 225, 236] : [120, 150, 178]); + } + } +} + +function terrainSeed(value) { + let hash = 2166136261; + for (const character of String(value || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967296 * Math.PI * 2; +} +function terrainFloorAt(x) { + if (airRoundActive()) return floorY + 1e9; + // Outside the park the ground is flat, so the walls have something square + // to stand out of and a body pushed past the lip still has a floor. + if (x <= parkLeft) return floorY - parkSegments[0].lift - (parkSegments[0].rise || 0); + if (x >= parkRight) return floorY - + (parkSegments[parkSegments.length - 1].rise || 0) - + parkSegments[parkSegments.length - 1].lift; + for (const segment of parkSegments) { + if (x < segment.left || x > segment.right) continue; + if (segment.kind === "flat") return floorY - segment.lift; + const run = segment.right - segment.left; + // How far up the feature we are, measured from ITS bottom: `dir` says + // which end that is. A transition rising to the right has its flat end on + // the left, and the same arc mirrored has it on the right. + const along = segment.dir > 0 + ? (x - segment.left) / run : (segment.right - x) / run; + if (segment.kind === "bank") + return floorY - segment.lift - segment.rise * along; + // The quarter circle. Centre sits one radius below the flat end, so the + // surface leaves the ground horizontally and arrives at the coping + // vertical — which is the difference between a transition you can pump + // and a ramp you merely climb. + const radius = segment.rise; + const dx = along * radius; + return floorY - segment.lift - + (radius - Math.sqrt(Math.max(0, radius * radius - dx * dx))); + } + return floorY; +} +function terrainTangentAt(x, span = 12) { + const left = terrainFloorAt(clamp(x - span, worldLeft, worldRight)); + const right = terrainFloorAt(clamp(x + span, worldLeft, worldRight)); + return (right - left) / Math.max(1, Math.min(worldRight, x + span) - + Math.max(worldLeft, x - span)); +} +const stageLeft = 0; +let stageRight = 1920; +let stageTop = 112; +// Leave a narrow projection gutter beneath the floor for the screen-edge HUD. +let stageBottom = 930; +let viewHeight = 1080; +let cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); +// `PLATFORM` is the TOWER's single centre platform, and it stays off. It is +// not a general "are there ledges" switch, however much it reads like one: +// the tower hung one slab over a floor, `platformY` still names that slab, +// and a dormant family of tower-era regressions is gated on this constant +// being true. The station's decks are a different object with a different +// shape, so they get their own table below rather than borrowing this flag +// and waking tests that ask whether a tapped hop clears a platform that no +// longer exists. The wind flag rides its own switch and is still off. +const PLATFORM = false; +const WIND_FLAG = false; +const survivalLevelCount = 32; +const survivalStepY = 235; +const survivalCeilingY = floorY - (survivalLevelCount + 2) * survivalStepY; +// A deterministic, hand-tuned zig-zag. Adjacent decks always overlap a +// normal jump's horizontal budget and sit below its 322-unit apex; variation +// comes from where the safe landing moves, not from impossible dice rolls. +// +// These numbers were authored against the cube's 900-unit floor and the +// climb still wants exactly that column of air — so when the station doubled +// the floor's width the ladder was RECENTRED, not respaced. The rung spacing +// is the tuned part; where the column stands is not. `survivalFrameWidth` is +// the cube's old framing kept by the same argument: a lens wide enough for a +// twenty-tile station would shrink the climb to a thread up the middle. +const survivalCenterShift = gridWidth / 2 - 450; +const survivalFrameWidth = 1020; +const survivalCenters = [450, 280, 620, 390, 680, 250, 520, 710]; +const survivalWidths = [470, 390, 420, 360, 440, 380, 410, 370]; +const platforms = Array.from({ length: survivalLevelCount }, (_, index) => { + const center = survivalCenters[index % survivalCenters.length] + + survivalCenterShift; + const width = survivalWidths[index % survivalWidths.length]; + return { level: index + 1, left: center - width / 2, + right: center + width / 2, y: floorY - (index + 1) * survivalStepY }; +}); +// The station's decks. This is the sentence the cube's own comment promised — +// "a tile-authored map is exactly the shape a future rung would be written +// in" — being cashed. The cube had no room for a deck a fighter could stand +// under; twenty by fourteen tiles under station gravity has room for five. +// +// Said in tiles because the map is a lattice: which column a deck starts at, +// which row its surface sits on, how many tiles wide it runs. Two low decks +// out at the flanks, two mid decks pinched toward the middle, one high deck +// straddling the centre line — so the shape of the map is a funnel upward, +// and the fighter who takes the top deck has taken the one place both mid +// decks feed into. +// +// The rows are chosen against one number: 586, the apex station gravity buys +// a held jump. Every step between ADJACENT decks is under it — floor to a low +// deck is 270, low to mid is 360, mid to top is 270 — and every step that +// skips a tier is over it. Floor to a mid deck is 630, and that 630 is the +// whole design: it is what stops the stack from being a straight hop up the +// middle and makes the climb a route instead. Out to a flank, up, back in +// along the mid deck, up again. +// +// This is what the first layout got wrong. Mid decks at row 6 put them 540 +// off the floor — under the apex, so a player could take one straight up and +// `jumpReach` would offer it to a bot, and the flanks stopped meaning +// anything. A deck you can only reach with a perfect double-tap is a deck the +// bots stand under and stare at; a deck you reach by going somewhere first is +// a route; and a deck you can reach from anywhere is not a deck, it is a step. +// Decks over the park, not instead of it. The rows are still priced against +// the 586-unit apex — the flat reaches row 3, row 3 reaches row 7, and the +// floor does NOT reach row 7 at 630 — so the climb keeps its route. What +// changed is that the park is now the interesting way to travel and the decks +// are the high ground above it. The bridge over the halfpipe is reachable +// from the flat beside the bowl and not from the bottom of it, which is the +// point of a bowl. +const parkDeckPlan = [ + { col: 8, row: 5, cols: 5 }, + { col: 15, row: 3, cols: 4 }, + { col: 21, row: 3, cols: 4 }, + { col: 18, row: 7, cols: 4 }, + { col: 31, row: 5, cols: 4 }, +]; +const parkDecks = parkDeckPlan.map((deck, index) => ({ + level: index + 1, + left: gridLeft + deck.col * tileSize, + right: gridLeft + (deck.col + deck.cols) * tileSize, + y: floorY - deck.row * tileSize, +})); +// Two ladders, one machinery. The climb's thirty-two rungs and the station's +// five decks are the same shape and are read by the same four routines, but +// they must never be visible at the same time — a survival runner standing +// on a station deck would be standing on furniture from another map. So the +// mode picks the table, once, and everything downstream asks here. +const activeLedges = () => survivalActive() ? platforms : parkDecks; +// The station's landmarks, by column. On a ten-wide cube a bare `3` was +// readable as "left of centre"; on twenty it is just a digit, and there were +// a dozen of them scattered through spawn, pickup and re-serve code all +// meaning something. Name them once. +// +// The spawns stayed close. It is tempting to open a map four times the size +// by standing the fighters four times as far apart, and it is wrong twice +// over: the opening exchange is the tuned part of this game, and the intro +// camera and the reel's opening lens are both built to travel between two +// faces 270 units apart — spreading the spawns whipped the intro at 207px a +// frame and opened the reel's close lens before the first blow. So the bell +// is unchanged from the cube: two fighters three tiles apart, astride the +// centre line. The map's size is where you GO, not where you start, and the +// corners, the decks and the climb are what spend it. +const spawnColLeft = 18; +const spawnColRight = 21; +// Not corners any more: the ends of this map are quarterpipe transitions, and +// a pistol resting on a vertical wall is a pistol nobody can pick up. These +// are the two flat aprons either side of the park instead — still a run away +// from the bell, still costing you your back to reach. +const cornerColLeft = 5; +const cornerColRight = 34; +const centerX = gridLeft + gridWidth / 2; +const platformsEnabled = () => survivalActive() || parkDecks.length > 0; +// Version-one furniture — the wind flag's pole, the store's demos, the tests — +// still asks for "the platform" by name. In a one-room cube the floor is the +// only platform, so the name now means the whole playable span of it. +const platformLeft = gridLeft; +const platformRight = gridLeft + gridWidth; +const platformY = floorY; +// The surface a thing at (x, y) is standing over: the nearest rung at or below +// it, and the floor when there is no rung. Shadows, pickups and the bot all +// ask this, so a rung that moves takes its furniture with it. +function surfaceYAt(x, y) { + let surface = terrainFloorAt(x); + if (platformsEnabled()) for (const ledge of activeLedges()) + if (ledge.y < surface && ledge.y >= y - 1 && + x >= ledge.left && x <= ledge.right) surface = ledge.y; + return surface; +} +// Which rung a falling thing just crossed, or null. `rise` lifts the contact +// line off the rung by an object's radius and `inset` keeps its edges on the +// span, so one answer serves fighters, grenades and the ball alike — and a +// lattice change lands in all three at once. The highest crossed rung wins, +// because that is the one a fall meets first. +function ledgeCrossed(x, previousY, y, rise = 0, inset = 0) { + if (!platformsEnabled()) return null; + let hit = null; + for (const ledge of activeLedges()) { + const top = ledge.y - rise; + if (previousY > top || y < top) continue; + if (x < ledge.left + inset || x > ledge.right - inset) continue; + if (!hit || ledge.y < hit.y) hit = ledge; + } + return hit; +} +// Resting on a rung rather than falling through one: the ball asks this to +// know whether it is supported and whether it may be booted. +function ledgeSupports(x, y, radius = 0) { + if (!platformsEnabled()) return false; + for (const ledge of activeLedges()) + if (x >= ledge.left + radius && x <= ledge.right - radius && + Math.abs(y - (ledge.y - radius)) <= 2) return true; + return false; +} +const doubleTapUs = 280000; +const doubleTapReleaseUs = 40000; +const roundDurationUs = 30000000; +const roundResultUs = 3000000; +const matchResultUs = 5000000; +const introDurationUs = 3000000; +// A reel gets one branded beat, then motion. Three portrait seconds cost the +// swipe decision before either fighter could move; the live game keeps that +// introduction, while the unattended 9:16 lane reaches the fight inside the +// first second without changing a combat rule. +const reelIntroDurationUs = 650000; +const survivalIntroDurationUs = 900000; +// Keep the close face-off lens through the first exchange. The seeded bots +// meet at about .81s; releasing at the bell made that hit happen as two tiny +// figures at the foot of an empty portrait wall. +const reelOpeningHoldUs = 1350000; +function roundIntroDurationUs() { + if (survivalActive()) return survivalIntroDurationUs; + return reelGroundCamera() ? reelIntroDurationUs : introDurationUs; +} +const dummyGuideDurationUs = 150000000; +const matchWins = 5; +const errorRestartUs = 16000000; +const errorDumpBase = "https://oskiewar.com/api/oskiewar-dump?d="; +const powerupIntervalUs = 10000000; +const shieldRadius = 160; +const shieldForward = 30; +const grenadeBlastDuration = .68; +const grenadeBlastRadius = 620; +// Ground pound. Double-tapping DOWN in the air used to be a plain fast drop +// that did nothing on arrival; now it commits you. Holding DOWN through the +// fall buys speed, the crater scales with how far you actually fell, and the +// landing balls you — so the move is a trade, never a free hit. +const poundLaunchVelocity = 1500; +const poundHoldAcceleration = 5600; +const poundMaxVelocity = 4600; +// Roughly a jump-and-a-half of floor-to-ceiling travel. Falling further than +// this cannot buy a bigger crater, so the ceiling is not a weapon. +const poundFullFall = 900; +// A first-stage landing is deliberately body-sized: the visible ring is the +// attack, not a warning decal for a much larger invisible hit. Repeated DOWN +// taps still grow it, but never into a room-clearing shortcut. +const poundMinRadius = 165; +const poundMaxRadius = 420; +const boosterXs = []; +const boosterRadius = 115; +const boosterVelocity = 6500; +const replayTickUs = 16667; +// The store's demos hold one checkpoint a second — cheap enough to keep +// hundreds of matches. A marketing render replays its demo AS the footage, +// and a fight smoothed through one-second keyframes stops feeling like a +// fight, so the reel factory asks for a checkpoint every simulation tick. +// The dense interval sits just under one true sim step (16666.67us) — at +// exactly one tick the < gate loses the rounding race and records every +// OTHER step, which halves a re-simulation's drift meter. +const replayCheckpointUs = () => + globalThis.__oskiewarDenseReplay ? 16000 : 1000000; +const liveSnapshotIntervalUs = 50000; +const fighterAnimationSpecs = { + // WALK ran a whole stride in 12 ticks — five cycles a second, which the eye + // reads as a vibrating fighter rather than as legs taking steps. Three ticks + // a frame puts the cycle at 600ms, close to a real walk, so the steps count. + IDLE: [72, 3, "BREATHE", true], WALK: [12, 3, "STRIDE", true], + RUN: [10, 1, "RUN", true], MEDITATE: [24, 2, "STILL", true], + DASH: [8, 1, "BURST", true], CROUCH: [8, 1, "TUCK", true], + "AIR CROUCH": [8, 1, "TUCK", true], JUMP: [12, 1, "ASCEND", true], + FALL: [12, 1, "DESCEND", true], PUNCH: [14, 1, "ATTACK", false], + KICK: [14, 1, "ATTACK", false], SHIELD: [12, 2, "GUARD", true], + REACH: [10, 1, "REACH", false], HOLD: [16, 2, "CLUTCH", true], + FIRE: [11, 1, "FIRE", false], THROW: [16, 1, "THROW", false], + WHIP: [11, 1, "ATTACK", false], BASH: [17, 1, "ATTACK", false], + HIT: [10, 1, "STUN", false], POGO: [12, 1, "BOUNCE", true], + "CROUCH HOP": [8, 1, "HOP", true], SINK: [10, 1, "SINK", true], + KO: [16, 2, "BREAK", false], +}; +// Every melee kind in one table: how far the limb reaches at rest and at full +// extension, how long each of its two bones is (the real reach ceiling), how +// high it lands, how wide it reads against the ball, how long the hitbox +// lives, and what it does on contact. A loaded hand cannot make a clean fist, +// so an item swing is its own kind rather than a punch modifier — a pistol +// lengthens the arm into a fast light lash, a grenade shortens it into a club. +// A blade in the item hand stretches every hand strike. Kicks are legs. +const meleeSpecFor = (player, kind) => { + const spec = meleeSpecs[kind] || meleeSpecs.PUNCH; + if (!player?.swordHeld || kind === "KICK") return spec; + return { ...spec, reach: spec.reach * 1.5, span: spec.span * 1.45, + swell: spec.swell * 1.3, force: spec.force * 1.15 }; +}; +const meleeSpecs = { + PUNCH: { reach: 58, swell: 50, span: 58, height: 115, radius: 28, + windowUs: 220000, force: 1200, lift: 140, + cue: ["snare", 1.05], thud: ["block", 1] }, + KICK: { reach: 75, swell: 62, span: 74, height: 55, radius: 35, + windowUs: 220000, force: 1550, lift: 220, + cue: ["kick", 1.05], thud: ["block", 1] }, + WHIP: { reach: 92, swell: 74, span: 76, height: 122, radius: 24, + windowUs: 190000, force: 1000, lift: 110, + cue: ["whoosh", 1.15], thud: ["hat", 1.35] }, + BASH: { reach: 62, swell: 40, span: 58, height: 108, radius: 40, + windowUs: 280000, force: 1750, lift: 210, + cue: ["kick", 1.3], thud: ["kick", 1.4] }, +}; +// One lookup serves both Y and the loaded punch, so the thing you can see in +// the fighter's hand is always the thing that fires and the thing that swings. +const itemMelee = { GUN: "WHIP", GRENADE: "BASH" }; +const instantReplayStepUs = 33333; +// Replay speed ramping: how far a full-force hit drags the playhead down, how +// many frames of warning the ramp gets, and how fast the speed itself may +// change — the last one is what keeps a slowdown from reading as a stutter. +const replaySlowest = .18; +const replayActionLead = 8; +const replayRampPerSecond = 3.2; +const instantReplayMaxFrames = 240; +// Legs, slowed about a sixth on @jeffrey's ear. The station is twice the +// cube's width, and the first thing a bigger floor does is make a fighter +// read as skating across it -- the same stride that felt urgent crossing 900 +// units looks weightless crossing 1,800. Every number here moved by the same +// fraction, including the acceleration, so time-to-top-speed is unchanged and +// only the ground covered is: a run still winds up over the same beat. +// +// This is load-bearing beyond feel. `jumpReach` prices a bot's jump in +// walkSpeed, so the arcs it will commit to narrow with the stride, and the +// deck spacing above stays exactly as reachable as it was. +// What a pump is worth, and how much upward speed a lip has to be giving you +// before it counts as an air rather than a bump. The launch floor exists so +// rolling over a gentle crest does not pop a rider off the ground every time. +const skatePumpAcceleration = 2600; +const skateLaunchFloor = 380; +const walkSpeed = 880; +const runStartSpeed = 1100; +const runTopSpeed = 1950; +const runAcceleration = 690; +// Vertical feel. The apex is the design constant — how high a fighter can +// reach never changed — so every impulse here is paired with a gravity that +// spends less time getting there. Rise is lighter than fall so the arc reads +// as intent going up and commitment coming down. +const riseGravityFull = 4800; +const fallGravityFull = 7200; +// Station gravity. The space map spins up a little over half a G, and that +// one number is what makes the floating decks a place you can go: at full +// weight a jump tops out at 322 units — three and a half tiles — and the +// lowest deck sits three tiles up with nothing above it worth reaching. At +// .55 the apex is 586, so the deck stack overhead is climbable on legs, a +// knocked fighter sails instead of dropping, and the hover board's airtime +// becomes the traversal it is for. The climb keeps full weight: survival's +// thirty-two rungs are spaced against the 322 apex, and floating that run +// would let a runner skip rungs the ladder exists to make them earn. +const spaceGravityScale = .55; +const gravityScale = () => survivalActive() ? 1 : spaceGravityScale; +const riseGravity = () => riseGravityFull * gravityScale(); +const fallGravity = () => fallGravityFull * gravityScale(); +const jumpVelocity = 1760; +const crouchJumpVelocity = 1960; +const ultraJumpVelocity = 3960; +const crouchHopVelocity = 980; +const pogoBounceVelocity = 2100; +const headBounceVelocity = 1100; +const jumpAnticipationUs = 50000; +// Letting go of up mid-rise snips the arc: a tap is a hop, a hold is a jump. +const jumpCutScale = .55; +const jumpPoseUs = 75000; +const crouchJumpPoseUs = 145000; +const crouchHopPoseUs = 190000; +const sinkDurationUs = 250000; +const hudTypeSize = 42; +// The command stream is a record of what you just did, so it is long enough to +// hold a whole exchange and it does not start dissolving while you are still +// playing. Only once the pad goes quiet does it age out, oldest glyph first, +// so the last thing you pressed is the last thing to leave. +const commandStreamDepth = 20; +const commandStreamRows = 5; +const commandStreamColumns = 8; +const commandStreamColumnsNow = () => compactLayout() ? 4 : commandStreamColumns; +const commandStreamTypeSize = (handleSize) => Math.max(18, + Math.round(handleSize * (compactLayout() ? .8 : .88))); +const commandHoldUs = 1100000; +const commandFadeUs = 1900000; +const replayButtons = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", + "A", "B", "X", "Y"]; +let cameraCenter = (worldLeft + worldRight) / 2; +let cameraWidth = worldRight - worldLeft; +let cameraCenterY = floorY - cameraWidth / cameraAspect / 2; +let cameraContainFloor = 0; +// What the containment floor was last frame, so its rate of growth can be +// measured. See `updateCameraDoll` — the doll eases toward the floor, and an +// ease that is not led always sits behind a target that keeps moving. +let previousContainmentWidth = 0; +// Two different distances, because they answer two different questions. +// +// `cameraPin` is where a single projected point stops being allowed to get any +// nearer. Nothing can clip a point — a shadow ellipse or a capsule end is one +// coordinate, not a face — so the best available answer is to hold it at a +// sane depth and accept that a thing behind the lens is drawn wrong. This is +// the distance the projection has always used. +const cameraPin = 80; +// `cameraNear` is the real near plane, and faces are cut at it. It is much +// closer than the pin on purpose. The cut is a straight line at constant +// depth, and where that line lands on screen is decided by how much the lens +// magnifies at the plane -- and this lens is only a tenth perspective in +// normal play, which dilutes that magnification tenfold. Clipping the floor at +// the pin distance put its cut line just inside the bottom of the frame and +// opened a band of sky under the fighters' feet. Ten times nearer drives the +// cut off screen for any camera that is meaningfully above the floor, and the +// coordinates it asks for in exchange are what the guard band is for. +const cameraNear = 8; +// Projected faces are cut to a band one viewport wide on every side before +// they are handed over. The scene is allowed to run off screen; it is not +// allowed to run off into coordinates the rasterizer cannot hold, which is +// what a vertex sitting on the near plane will otherwise ask for. +const guardBand = 1; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); +const mixColor = (dark, light, amount) => dark.map((value, index) => + Math.round(value + (light[index] - value) * amount)); +const lerp = (from, to, amount) => from + (to - from) * amount; +const normalize3 = (point) => { + const length = Math.hypot(point.x, point.y, point.z) || 1; + return { x: point.x / length, y: point.y / length, z: point.z / length }; +}; +const globalLight = normalize3({ x: -.42, y: 1, z: -.28 }); +const cross3 = (a, b) => ({ x: a.y * b.z - a.z * b.y, + y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }); +const dot3 = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z; +const viewWidth = () => stageRight; +const viewCenterX = () => (stageLeft + stageRight) / 2; +const viewOffsetX = () => (stageRight - 1920) / 2; +const compactLayout = () => stageRight < 1500; +// Keep the HUD inside a traditional five-percent title-safe frame. On a +// 16:9 television this is deliberately deeper than the action-safe camera so +// a bezel, soundbar, or object in front of the screen does not hide status. +const hudSafeInset = () => clamp( + Math.round(Math.min(stageRight, viewHeight) * .05), + compactLayout() ? 24 : 48, 72); +const hudSafeRect = () => { + // The title-safe hedge and a hardware occlusion answer different threats, + // and only the deeper one matters at each edge: a bezel might hide the + // frame's rim, a notch definitely does. + const inset = hudSafeInset(); + return { left: stageLeft + Math.max(inset, viewInset.left + 14), + top: Math.max(inset, viewInset.top + 10), + right: stageRight - Math.max(inset, viewInset.right + 14), + bottom: viewHeight - Math.max(inset, viewInset.bottom + 10) }; +}; +const actionSafeRect = () => { + // A television is watched across a room behind a bezel; a reel is held at + // arm's length with nothing over its edges, so the action-safe frame there is + // a courtesy rather than a hedge against overscan. + const portrait = stageBottom - stageTop > stageRight - stageLeft; + // A landscape notch bites into the stage's own sides; fighters framed + // behind it are as lost as fighters past the edge. + const marginX = (portrait ? 18 : (compactLayout() ? 34 : 64)) + + Math.max(viewInset.left, viewInset.right); + const marginY = portrait ? 14 : 26; + return { left: stageLeft + marginX, top: stageTop + marginY, + right: stageRight - marginX, bottom: stageBottom - marginY }; +}; + +// The device's own occlusions, in game units: a phone's home indicator, a +// notch, rounded corners. The host measures them (env() on the web, native +// injection in the iOS shell, where a pinned scroll view zeroes env() out) +// and hands them through gameView; everything drawn against a screen edge — +// the stage bounds, the HUD safe frame, the touch clusters — stands off by +// them, because a control under the home indicator is a control the system +// swallows. +let viewInset = { top: 0, right: 0, bottom: 0, left: 0 }; + +function syncGameView() { + const next = typeof gameView === "function" ? gameView() : null; + const width = clamp(Math.round(Number(next?.width) || 1920), 480, 2880); + const height = clamp(Math.round(Number(next?.height) || 1080), 480, 2160); + const nextInset = {}; + for (const edge of ["top", "right", "bottom", "left"]) + nextInset[edge] = clamp(Math.round(Number(next?.inset?.[edge]) || 0), + 0, 220); + const inputFamily = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + const touch = inputFamily === "touch"; + const compact = width < 1500; + const inset = compact ? 22 : 30; + const nextTop = Math.max(82, inset + hudTypeSize + 16) + nextInset.top; + const bottomReserve = (touch + ? clamp(height * .36, 300, 390) + : clamp(height * .13, 112, 150)) + nextInset.bottom; + const nextBottom = Math.max(nextTop + 280, height - bottomReserve); + if (width === stageRight && height === viewHeight && + nextTop === stageTop && nextBottom === stageBottom && + ["top", "right", "bottom", "left"].every((edge) => + nextInset[edge] === viewInset[edge])) return; + stageRight = width; + viewHeight = height; + stageTop = nextTop; + stageBottom = nextBottom; + viewInset = nextInset; + cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); + if (typeof cameraDoll !== "undefined") cameraDoll.dirty = true; +} + +class FightCamDoll { + constructor() { + this.position = { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.4 }; + this.target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + this.width = cameraWidth; + this.perspective = 0; + this.fov = 55; + this.roll = 0; + this.dirty = true; + this.view = null; + } + + track(spec, dt, speed = 5) { + // Exponential easing is continuous across frame rates. Move the dolly and + // its look target together so follow motion cannot shear into a sudden + // swivel when fighters cross a framing threshold. + const amount = 1 - Math.exp(-Math.max(0, dt) * speed); + const previousTarget = { ...this.target }; + for (const axis of ["x", "y", "z"]) + this.target[axis] = lerp(this.target[axis], spec.target[axis], amount); + for (const axis of ["x", "y", "z"]) + this.position[axis] += this.target[axis] - previousTarget[axis]; + for (const axis of ["x", "y", "z"]) { + this.position[axis] = lerp(this.position[axis], spec.position[axis], amount); + } + // Pull back promptly but never in a single frame; return close more + // slowly so small changes at the action-safe edge do not pump the lens. + const zoomSpeed = spec.width > this.width ? speed * 1.9 : speed * .58; + const zoomAmount = 1 - Math.exp(-Math.max(0, dt) * zoomSpeed); + this.width = lerp(this.width, spec.width, zoomAmount); + this.perspective = lerp(this.perspective, spec.perspective, amount); + this.fov = lerp(this.fov, spec.fov || 55, amount); + this.roll = lerp(this.roll, spec.roll || 0, amount); + this.dirty = true; + } + + snap(spec) { + this.target = { ...spec.target }; + this.position = { ...spec.position }; + this.width = spec.width; + this.perspective = spec.perspective; + this.fov = spec.fov || 55; + this.roll = spec.roll || 0; + this.dirty = true; + collapseRenderCameraInterpolation(); + } + + prepare() { + const forward = normalize3({ x: this.target.x - this.position.x, + y: this.target.y - this.position.y, z: this.target.z - this.position.z }); + const baseRight = normalize3(cross3(forward, { x: 0, y: -1, z: 0 })); + const baseUp = normalize3(cross3(baseRight, forward)); + const rollCos = Math.cos(this.roll); + const rollSin = Math.sin(this.roll); + const right = { x: baseRight.x * rollCos + baseUp.x * rollSin, + y: baseRight.y * rollCos + baseUp.y * rollSin, + z: baseRight.z * rollCos + baseUp.z * rollSin }; + const up = { x: baseUp.x * rollCos - baseRight.x * rollSin, + y: baseUp.y * rollCos - baseRight.y * rollSin, + z: baseUp.z * rollCos - baseRight.z * rollSin }; + this.view = { forward, right, up, + centerX: (stageLeft + stageRight) / 2, + centerY: (stageTop + stageBottom) / 2, + orthoScale: (stageRight - stageLeft) / this.width, + focal: (stageRight - stageLeft) / + (2 * Math.tan(this.fov * Math.PI / 360)) }; + this.dirty = false; + } + + // World space to camera space, with the near distance left alone. Anything + // that wants to survive contact with the near plane has to see the honest + // depth first — `project` is where it gets clamped, and a clamp is a lie for + // anything behind the lens. + toView(point, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { forward, right, up } = this.view; + const x = point.x - this.position.x, y = point.y - this.position.y; + const z = point.z - this.position.z; + out.x = x * right.x + y * right.y + z * right.z; + out.y = x * up.x + y * up.y + z * up.z; + out.z = x * forward.x + y * forward.y + z * forward.z; + return out; + } + + projectView(view, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { centerX, centerY, orthoScale, focal } = this.view; + const depth = Math.max(cameraNear, view.z); + const orthoX = centerX + view.x * orthoScale; + const orthoY = centerY - view.y * orthoScale; + const perspectiveX = centerX + view.x * focal / depth; + const perspectiveY = centerY - view.y * focal / depth; + out.x = lerp(orthoX, perspectiveX, this.perspective); + out.y = lerp(orthoY, perspectiveY, this.perspective); + out.z = clamp(depth / 16000 * 2.8 - 1.4, -1.4, 1.4); + return out; + } + + // A lone point cannot be clipped, so it is held at the pin rather than + // allowed to divide by a depth it does not have. Faces go through + // `worldTriangle`, which cuts them at the near plane and then comes back + // here with vertices that are already in front of it. + project(point) { + const view = this.toView(point); + view.z = Math.max(cameraPin, view.z); + return this.projectView(view); + } +} + +const cameraDoll = new FightCamDoll(); +const cameraScale = () => (stageRight - stageLeft) / cameraDoll.width; +let playerCameraYaw = 0; +let playerCameraPitch = 0; +// A multiplier on the framed width, so zoom rides on top of automatic framing +// rather than fighting it: the camera still guarantees both fighters are in +// shot, and this scales the result. Above 1 is wider. The ceiling is low on +// purpose -- a wide shot draws a wider span of terrain, and span IS the frame +// budget on a console whose JS never gets a JIT. +let playerCameraZoom = 1; +let triangleDepth = -1.4; +// A match frame submits ~2100 faces. Buffering them into a Float32Array first +// cost 5.7ms a frame where handing each one straight over costs 1.8ms — +// twelve typed-array element writes in QuickJS are dearer than twelve +// arguments to one C call. The batched host call itself measured 0.05ms, so +// the boundary crossing was never the expense. +const emitTriangle = typeof triangle3d === "function" ? triangle3d + : (x1, y1, z1, x2, y2, z2, x3, y3, z3, r, g, b) => + triangle(x1, y1, x2, y2, x3, y3, r, g, b); +// r/g/b stay positional so the hottest path in the piece doesn't build a rest +// array per face; the host defaults every missing channel to 255 the same way. +// +// The native buffer speaks int16: a coordinate past ±32768 — or the NaN a +// projection returns after crossing the camera plane — is a RangeError and a +// dead frame on console. Geometry that broken was never going to be visible, +// so the seam culls it instead of crashing. NaN fails a comparison on its +// own, which keeps the guard to plain compares on the hottest path. +const triangleSafe = (value) => value > -32200 && value < 32200; +function screenTriangle(x1, y1, x2, y2, x3, y3, r = 255, g = 255, b = 255) { + if (!(triangleSafe(x1) && triangleSafe(y1) && triangleSafe(x2) && + triangleSafe(y2) && triangleSafe(x3) && triangleSafe(y3))) return; + emitTriangle(x1, y1, triangleDepth, x2, y2, triangleDepth, + x3, y3, triangleDepth, r, g, b); +} +function screenRect(x, y, width, height, color) { + const [r, g, b] = color; + screenTriangle(x, y, x + width, y, x + width, y + height, r, g, b); + screenTriangle(x, y, x + width, y + height, x, y + height, r, g, b); +} +// On the native shell `box` and `line` are CPU-composited UNDER every GPU +// triangle — App.cpp paints rects, lines and block text into the CPU frame, +// uploads that as the scene texture, then draws the depth pass over it — so +// the frame meter, keycaps, clock and bot scaffolding sank behind the +// fighters and terrain. @jeffrey on the console, 2026-09-20: "the frame +// counter and stuff in the debug ui ... feels like its behind stuff". HUD +// boxes and lines ride the triangle pass there, at a depth in front of any +// body (bodies bottom out near -1.42; the shell maps (z + 1.5) / 3 into the +// depth buffer, LESS_EQUAL). The web shell keeps box/line as they were. +const nativeTrianglePass = typeof triangle3d === "function"; +// Native AC can composite diagnostic lines and rectangles after the scene. +let nativeHudOverlay = false; +const hudDepth = -1.48; +function hudBox(x, y, width, height, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { box(x, y, width, height, ...color); return; } + const previous = triangleDepth; + triangleDepth = hudDepth; + screenRect(x, y, width, height, color); + triangleDepth = previous; +} +function hudLine(x1, y1, x2, y2, width, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy) || 1; + const nx = -dy / length * Math.max(1, width) / 2; + const ny = dx / length * Math.max(1, width) / 2; + const previous = triangleDepth; + triangleDepth = hudDepth; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x2 + nx, y2 + ny, x2 - nx, y2 - ny, r, g, b); + screenTriangle(x1 + nx, y1 + ny, x2 - nx, y2 - ny, x1 - nx, y1 - ny, r, g, b); + triangleDepth = previous; +} +function hudWorldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + hudLine(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} +function hudCircle(x, y, radius, width, color) { + let lastX = x + radius, lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + hudLine(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; lastY = nextY; + } +} +function screenStrokeRect(x, y, width, height, thickness, color) { + screenRect(x, y, width, thickness, color); + screenRect(x, y + height - thickness, width, thickness, color); + screenRect(x, y + thickness, thickness, height - thickness * 2, color); + screenRect(x + width - thickness, y + thickness, + thickness, height - thickness * 2, color); +} +function projectedTriangle(a, b, c, color) { + if (!(triangleSafe(a.x) && triangleSafe(a.y) && triangleSafe(a.z) && + triangleSafe(b.x) && triangleSafe(b.y) && triangleSafe(b.z) && + triangleSafe(c.x) && triangleSafe(c.y) && triangleSafe(c.z))) return; + // Positional, not spread: see the note on emitTriangle above. Every face a + // frame submits comes through here, and `...color` built one throwaway + // iterator apiece for ~2100 of them. + emitTriangle(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z, + color[0], color[1], color[2]); +} +// Sutherland-Hodgman, one plane at a time. Both clips below are the same walk: +// step the polygon's edges, keep the vertices that are inside, and whenever an +// edge crosses out or in, keep the crossing point too. +function clipPolygon(polygon, distance, mix) { + const kept = []; + for (let index = 0; index < polygon.length; index++) { + const current = polygon[index]; + const next = polygon[(index + 1) % polygon.length]; + const here = distance(current); + const there = distance(next); + if (here >= 0) kept.push(current); + if ((here >= 0) !== (there >= 0)) + kept.push(mix(current, next, here / (here - there))); + } + return kept; +} +const mixVertex = (a, b, amount) => ({ x: lerp(a.x, b.x, amount), + y: lerp(a.y, b.y, amount), z: lerp(a.z, b.z, amount) }); +// The near plane, in camera space, before the divide. This is the whole point: +// a vertex behind the lens has a negative depth, and pinning it to the near +// distance keeps its sideways offset while dividing by a distance it never +// had — so a face that crosses the plane used to shear halfway across the +// screen, or blow past the coordinate guard and vanish outright. Cutting it at +// the plane leaves only geometry that is honestly in front of the camera. +const clipViewNear = (polygon) => + clipPolygon(polygon, (vertex) => vertex.z - cameraNear, mixVertex); +// And the guard band, in screen space, after it. A vertex sitting exactly on +// the near plane projects to focal/near times its offset — twenty-three times, +// at this lens — so a legitimately visible floor can still ask for coordinates +// far outside anything the rasterizer will take. Cut it to a band a viewport +// wide instead of dropping the face and leaving a hole in the ground. +// The four band edges live at module scope over mutable bounds instead of +// being rebuilt as an array of closures per face — the walls cross the band +// every frame, and that little array was steady interpreter garbage. +let bandMinX = 0, bandMaxX = 0, bandMinY = 0, bandMaxY = 0; +const bandEdges = [ + (vertex) => vertex.x - bandMinX, + (vertex) => bandMaxX - vertex.x, + (vertex) => vertex.y - bandMinY, + (vertex) => bandMaxY - vertex.y, +]; +function clipScreenBand(polygon) { + const width = viewWidth(); + bandMinX = -width * guardBand; + bandMaxX = width * (1 + guardBand); + bandMinY = -viewHeight * guardBand; + bandMaxY = viewHeight * (1 + guardBand); + let clipped = polygon; + for (const distance of bandEdges) { + if (clipped.length < 3) return []; + clipped = clipPolygon(clipped, distance, mixVertex); + } + return clipped; +} +// One world-space face, all the way through: to camera space, cut at the near +// plane, projected, cut to the guard band, then fanned into whatever triangles +// are left. Zero of them is a face entirely behind the camera, which is a +// perfectly good answer. +// Whether a projected vertex already sits inside the guard band. A NaN fails +// every compare, so a broken projection falls through to the clipper. +function bandContains(vertex) { + const width = viewWidth(); + return vertex.x >= -width * guardBand && vertex.x <= width * (1 + guardBand) && + vertex.y >= -viewHeight * guardBand && + vertex.y <= viewHeight * (1 + guardBand); +} +// Scratch vertices never escape synchronous face submission or clipping. +const triangleView = [{}, {}, {}]; +const triangleScreen = [{}, {}, {}]; +function worldTriangle(a, b, c, color) { + const viewA = cameraDoll.toView(a, triangleView[0]); + const viewB = cameraDoll.toView(b, triangleView[1]); + const viewC = cameraDoll.toView(c, triangleView[2]); + // Nearly every face a frame submits sits whole in front of the lens and + // whole inside the guard band, and the console's interpreter was paying + // for six array allocations per face on the way to discovering that. + // Plain compares decide the common case; only a face that actually + // crosses a plane pays for the Sutherland-Hodgman walk. + if (viewA.z >= cameraNear && viewB.z >= cameraNear && viewC.z >= cameraNear) { + const pa = cameraDoll.projectView(viewA, triangleScreen[0]); + const pb = cameraDoll.projectView(viewB, triangleScreen[1]); + const pc = cameraDoll.projectView(viewC, triangleScreen[2]); + if (bandContains(pa) && bandContains(pb) && bandContains(pc)) { + projectedTriangle(pa, pb, pc, color); + return; + } + const banded = clipScreenBand([pa, pb, pc]); + for (let corner = 2; corner < banded.length; corner++) + projectedTriangle(banded[0], banded[corner - 1], banded[corner], color); + return; + } + const near = clipViewNear([viewA, viewB, viewC]); + if (near.length < 3) return; + const projected = near.map((vertex) => cameraDoll.projectView(vertex)); + if (projected.some((point) => !Number.isFinite(point.x) || + !Number.isFinite(point.y))) return; + // A near-plane fan can be a quad; fanning it before the band clip would + // clip the same interior edge twice, so the band takes the whole polygon. + const face = clipScreenBand(projected); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], color); +} +function projectPoint(x, y, z = 0) { + return cameraDoll.project({ x, y, z }); +} +const panAt = (x, z = 0) => clamp( + (projectPoint(x, cameraCenterY, z).x - viewCenterX()) / + Math.max(1, (stageRight - stageLeft) / 2 - 55), -1, 1); +const panPlayer = (player) => panAt(player.x, player.z); +let visualTheme = { light: 0, sunset: 0 }; + +const fighterRoster = [ + { handle: "@JEFFREY", color: [190, 42, 58], colors: [ + [255,105,190],[111,232,210],[255,105,190],[255,232,92], + [130,150,255],[255,105,190],[111,232,210],[255,232,92]], + mood: "New Media Instruments", + lastChat: "hmm this chat could use some ui love" }, + { handle: "@FIFI", color: [209, 100, 216], colors: [ + [209,100,216],[204,253,71],[35,100,255],[82,67,17],[5,249,137]], + mood: "nap", lastChat: "" }, + { handle: "@OSKIE", color: [38, 82, 176], colors: [ + [255,232,92],[255,105,190],[111,232,210],[255,232,92],[130,150,255],[255,105,190]], + mood: "", lastChat: "" }, + { handle: "@SAT", color: [130, 204, 213], colors: [ + [130,204,213],[161,232,0],[253,122,2],[222,90,205]], + mood: "i hope its not ai generated", lastChat: "meow" }, +]; +// Per-glyph color is how a community @handle carries its owner's identity. +// The house opponents are not people, so they hold one flat color each and +// let the glyph walk fall back to it. +const npcFighter = { handle: "DUMMY", color: [105, 125, 150], colors: [], + mood: "TRAINING DUMMY · NO BOT AI", lastChat: "" }; +const anonymousFighter = { handle: "", color: [72, 176, 156], colors: [ + [72,176,156],[118,214,188],[54,128,168],[230,205,92]], + mood: "ANONYMOUS", lastChat: "" }; +const spiderDummyFighter = { handle: "SPIDERDUMMY", color: [76, 88, 108], + colors: [], mood: "GIANT SEGMENTED TRAINING FOE · NO BOT AI", lastChat: "" }; +const botFighter = { handle: "BOT", color: [205, 48, 72], colors: [], + mood: "ANGRY TRAINING BOT", lastChat: "" }; +const peopleFighter = { handle: "PPL", color: [116, 122, 136], colors: [], + mood: "", lastChat: "" }; +// Self-play needs two nameplates nobody can mix up, or the result card reads +// "BOT WINS" with no way to tell which bot won. The colors here are only the +// fallback — each round deals fresh ones from the CSS color book below. +const selfPlayFighters = [ + { handle: "BOT 1", color: [205, 48, 72], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, + { handle: "BOT 2", color: [48, 118, 205], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, +]; + +// Self-play dresses its bots from the CSS color book instead of the house +// red and blue. The picks hash out of the round name, so the offline replay +// that repaints a reel deals the same pairing the live pass wore, and every +// round is a fresh matchup. The book carries only names that can hold a +// nameplate on either theme — the washed-out and near-black entries stay +// home — and the second pick stands off a sixth of the color wheel from the +// first so the result card never reads as a mirror match. +const cssColorBook = ("crimson dc143c,firebrick b22222,red ff0000," + + "orangered ff4500,tomato ff6347,coral ff7f50,darkorange ff8c00," + + "orange ffa500,gold ffd700,goldenrod daa520,darkgoldenrod b8860b," + + "yellowgreen 9acd32,chartreuse 7fff00,lawngreen 7cfc00,limegreen 32cd32," + + "forestgreen 228b22,green 008000,seagreen 2e8b57,mediumseagreen 3cb371," + + "springgreen 00ff7f,mediumspringgreen 00fa9a,lightseagreen 20b2aa," + + "teal 008080,darkcyan 008b8b,darkturquoise 00ced1,turquoise 40e0d0," + + "mediumturquoise 48d1cc,cadetblue 5f9ea0,deepskyblue 00bfff," + + "dodgerblue 1e90ff,cornflowerblue 6495ed,steelblue 4682b4," + + "royalblue 4169e1,blue 0000ff,mediumblue 0000cd,darkslateblue 483d8b," + + "slateblue 6a5acd,mediumslateblue 7b68ee,mediumpurple 9370db," + + "blueviolet 8a2be2,darkviolet 9400d3,darkorchid 9932cc," + + "mediumorchid ba55d3,orchid da70d6,violet ee82ee,magenta ff00ff," + + "mediumvioletred c71585,deeppink ff1493,hotpink ff69b4," + + "palevioletred db7093,indianred cd5c5c,salmon fa8072,darksalmon e9967a," + + "lightcoral f08080,rosybrown bc8f8f,sienna a0522d,chocolate d2691e," + + "peru cd853f,sandybrown f4a460,olivedrab 6b8e23,olive 808000," + + "darkkhaki bdb76b,rebeccapurple 663399,aquamarine 7fffd4," + + "mediumaquamarine 66cdaa,lightgreen 90ee90,skyblue 87ceeb," + + "lightskyblue 87cefa,plum dda0dd,khaki f0e68c,greenyellow adff2f," + + "yellow ffff00,cyan 00ffff,lime 00ff00").split(",").map((entry) => { + const [name, hex] = entry.split(" "); + const value = parseInt(hex, 16); + return { name, rgb: [value >> 16 & 255, value >> 8 & 255, value & 255] }; + }).filter(({ rgb }) => { + const high = Math.max(...rgb); + const low = Math.min(...rgb); + return high - low >= 60 && high + low >= 140 && high + low <= 400; + }); + +const hueOf = ([red, green, blue]) => { + const high = Math.max(red, green, blue); + const low = Math.min(red, green, blue); + const span = high - low || 1; + const sixth = high === red ? (green - blue) / span + : high === green ? 2 + (blue - red) / span : 4 + (red - green) / span; + return (sixth * 60 + 360) % 360; +}; + +function selfPlayWardrobe(pad) { + if (typeof globalThis.__oskiewarJevPad === 'function') + return { name: pad === 0 ? 'JEV PINK' : 'JEV BLUE', rgb: pad === 0 ? [255, 90, 170] : [65, 195, 255] }; + const round = matchName || seriesName; + const first = cssColorBook[Math.floor( + hashUnit(round + " one") * cssColorBook.length) % cssColorBook.length]; + if (pad === 0) return first; + const start = Math.floor(hashUnit(round + " two") * cssColorBook.length); + for (let step = 0; step < cssColorBook.length; step++) { + const pick = cssColorBook[(start + step) % cssColorBook.length]; + const apart = Math.abs(hueOf(pick.rgb) - hueOf(first.rgb)); + if (Math.min(apart, 360 - apart) >= 60) return pick; + } + return cssColorBook[(start + 1) % cssColorBook.length]; +} + +function losAngelesSun() { + const radians = Math.PI / 180; + const days = Date.now() / 86400000 + 2440587.5 - 2451545; + const meanLongitude = (280.46 + .9856474 * days) % 360; + const meanAnomaly = (357.528 + .9856003 * days) % 360; + const eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly * radians) + + .02 * Math.sin(2 * meanAnomaly * radians); + const obliquity = 23.439 - .0000004 * days; + const rightAscension = Math.atan2(Math.cos(obliquity * radians) * + Math.sin(eclipticLongitude * radians), Math.cos(eclipticLongitude * radians)) / + radians; + const declination = Math.asin(Math.sin(obliquity * radians) * + Math.sin(eclipticLongitude * radians)); + const siderealHours = 18.697374558 + 24.06570982441908 * days; + let hourAngle = ((siderealHours * 15 - 118.2437 - rightAscension + 540) % 360) - 180; + const latitude = 34.0522 * radians; + const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) + + Math.cos(latitude) * Math.cos(declination) * + Math.cos(hourAngle * radians)) / radians; + const light = clamp((altitude + 6) / 14, 0, 1); + const sunset = clamp(1 - Math.abs(altitude - 1) / 11, 0, 1) * + (hourAngle > 0 ? 1 : .42); + return { light: light * light * (3 - 2 * light), sunset }; +} + +function displayTheme() { + const sun = losAngelesSun(); + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.platform === "web" || caps.platform === "macos") { + return { ...sun, light: caps.colorScheme === "light" ? 1 : 0 }; + } + return sun; +} +// Nameless until somebody says who they are. These two used to boot as +// @JEFFREY and @OSKIE — the first and third entries of the local roster — and +// every path that failed to learn a real identity quietly fell through to +// them. That is how an anonymous visitor alone in a dead room was shown +// "@JEFFREY vs @OSKIE" and told "YOU ARE @OSKIE — RIGHT SIDE". An empty name +// is the honest state and the wire already speaks it: spectatorState sends "" +// as NOBODY, and the HUD reads it as "THE SECOND FIGHTER". +const players = [ + { name: "", rosterIndex: -1, handleColors: anonymousFighter.colors, + // Spawn marks stand on the centers of tiles 3 and 6 — mirrored across + // the cube's middle, three tiles from the pistol's corner. Three + // matters: a pickup takes any limb within 90, a standing fighter's arms + // reach most of a tile past the mark, and two tiles of gap was close + // enough that the bell handed the weapon out before anyone moved. + pad: 0, spawnX: tileCenterX(spawnColLeft), x: tileCenterX(spawnColLeft), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: 1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: anonymousFighter.color.slice(), hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: 1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, + { name: "", rosterIndex: -1, handleColors: [], + npc: false, bot: false, remote: false, + pad: 1, spawnX: tileCenterX(spawnColRight), x: tileCenterX(spawnColRight), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: -1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: [38, 82, 176], hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: -1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, +]; +const thirdPlayerTemplate = JSON.stringify(players[1]); +const freeForAll = () => localVersusActive() && players.length === 3; +const rivalsOf = (player) => players.filter((other) => + other !== player && other.alive).sort((a, b) => + Math.hypot(a.x - player.x, a.y - player.y, a.z - player.z) - + Math.hypot(b.x - player.x, b.y - player.y, b.z - player.z)); +const nearestRival = (player) => rivalsOf(player)[0] || + players.find((other) => other !== player); +function roundWinner() { + const contenders = freeForAll() ? players.filter((player) => player.alive) : players; + if (freeForAll() && contenders.length <= 1) return contenders[0] || null; + const best = Math.max(...contenders.map((player) => player.score)); + const leaders = contenders.filter((player) => player.score === best); + return leaders.length === 1 ? leaders[0] : null; +} +function setLocalPlayerCount(count) { + if (count === 3 && players.length === 2) { + const third = JSON.parse(thirdPlayerTemplate); + third.pad = 2; + players.push(third); + frameMeters.push([]); + } else if (count === 2) { + players.length = 2; + frameMeters.length = 2; + } +} +// Who the camera, the scorekeeping and the reactions believe is on stage. +// Survival and the versus lobby are both one-body rooms — the second chair +// is parked off the map until somebody takes it. +const activePlayers = () => + survivalActive() || lobbyActive() ? [players[0]] : players; +const impacts = []; + +// Every impact gets a number, in order, for the life of the run. A watcher +// cannot be told "here is a new spark" by a stateless frame that repeats the +// same list ten times — it has to be able to tell which ones it has already +// seen, and a position is not an identity. The counter is simulation state: +// a rollback that re-spawns an impact must re-issue the same number. +let impactSequence = 0; + +function spawnImpact(impact) { + impact.id = ++impactSequence; + impacts.push(impact); + return impact; +} + +const detachedParts = []; +const bullets = []; +const grenades = []; +// The station's arsenal, said out loud: a pistol on the floor, a space laser +// at the top of the climb, a light saber over each fighter's own head. The +// cube could carry exactly one weapon, and the comment here used to say why +// — "a one-room box has no shelf to price them on". A station HAS shelves. +// Height is the price again, the way it was in the tower, and each of the +// three is priced differently on purpose: +// +// pistol — floor, far corner, behind the right spawn. The oldest bargain +// in this game and unchanged: turn your back on the other fighter to arm +// up, or rush the middle bare-handed. Six rounds that ricochet forever. +// space laser — the high centre deck, three jumps up, contested from both +// sides. Four bolts, no ricochet, and fast enough that it is a line you +// draw rather than a shot you lead. Missing it costs the bolt outright. +// light saber — one on each low deck, mirrored, one jump off your own +// spawn. It is the only free weapon and the only fair one, and it buys +// reach on every hand strike rather than a projectile. +// +// The blade came and went inside one build back in the cube — @jeffrey tried +// a sword-and-pistol standoff and asked for fists and one gun instead. The +// objection was to a duel in a phone booth, and the whole drawing machinery +// (`swordHeld`, the hilt pinned to the item forearm) survived it intact. A +// map with distance in it is the condition that was missing. +// +// `cycle` marks the slot the ten-second powerup rotation owns. Only the +// pistol carries it, so an untouched laser can never stall the reload that +// keeps the floor fight fed. +const gunPickups = [ + { kind: "HANDGUN", amount: 6, x: tileCenterX(cornerColRight), + startsActive: true, cycle: true, y: floorY, z: 0 }, + { kind: "SPACE LASER", amount: 4, x: centerX, startsActive: true, + cycle: false, y: parkDecks[3].y, z: 0 }, + { kind: "ROCKET LAUNCHER", amount: 3, x: tileCenterX(cornerColLeft), + startsActive: true, cycle: false, y: floorY, z: 0 }, +]; +// A saber is not ammunition, so it is not a gun pickup: taking one sets a +// state a fighter keeps until the arm holding it comes off. Mirrored across +// the two low decks, centred on each deck rather than on a tile, because the +// deck is the landmark a player actually reads. +const saberPickups = [ + { kind: "LIGHT SABER", x: (parkDecks[1].left + parkDecks[1].right) / 2, + y: parkDecks[1].y, z: 0, startsActive: true }, + { kind: "LIGHT SABER", x: (parkDecks[2].left + parkDecks[2].right) / 2, + y: parkDecks[2].y, z: 0, startsActive: true }, +]; +const grenadePickups = [ + { amount: 3, x: centerX - 450, y: floorY, z: 0, startsActive: true }, + { amount: 3, x: centerX + 450, y: floorY, z: 0, startsActive: true }, +]; +// No trees. Two grew out of the tower's side walls and were the only thing +// in a round that gave a body back; in the cube their ripe fruit read as a +// coconut hanging over the fight, and @jeffrey asked for it gone. The +// consequence is the point now: a fighter taken apart limb by limb stays +// that way until the bell. The grower/harvest machinery below sleeps on +// this empty list. +const bodyTrees = []; +const treeRipenUs = 18000000; +const treeTimeBonusUs = 15000000; +const airParticles = []; +for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + // A pickup names its tile and floats seventy above that tile's surface — + // the same float the old ledges used, and it keeps a real-sized weapon + // from reading as a decal painted on the floor. + pickup.y = surfaceYAt(pickup.x, pickup.y) - 70; +} +// Every kind carries a gravity factor so redressing the match ball in place +// can never leave a previous kind's float behind. +// +// The skateboard is map furniture; it never replaces the match ball. +const ballKinds = [ + { type: "soccer", spawnOwner: 0, radius: 38, mass: .72, hitScale: 1.12, + bounce: .58, drag: .994, windFactor: .58, gravityFactor: 1 }, + { type: "basketball", spawnOwner: 1, radius: 42, mass: 1.08, hitScale: .86, + bounce: .76, drag: .989, windFactor: .34, gravityFactor: 1 }, + { type: "beach", spawnOwner: -1, radius: 46, mass: .34, hitScale: 1.25, + bounce: .82, drag: .998, windFactor: 1.35, gravityFactor: .62 }, + { type: "skateboard", spawnOwner: -1, radius: 52, mass: .9, hitScale: .7, + bounce: .34, drag: .992, windFactor: .5, gravityFactor: .5, + series: false }, +]; +let matchBallType = ballKinds[0].type; +const skateBoardKind = ballKinds.find((kind) => kind.type === "skateboard"); +// A match inflates exactly one ball and keeps it for every round, and the +// station parks exactly one board on the floor at centre. Two entries in one +// array because they are the same kind of object to every routine that +// touches them — swept contact, ledge support, shadows, the wire format — +// and because the board's whole mount path is written against a ball rolling +// into a shin. +const balls = [{ ...ballKinds[0], z: 0, vx: 0, vy: 0, rotation: 0, + x: players[0].spawnX, y: floorY - ballKinds[0].radius, + active: true, serveAt: 0, lastHitBy: 0, safeUntil: 0, safePlayers: 0, + heldBy: -1 }, +...[cornerColLeft, 20, 32].map((spawnCol) => ({ ...skateBoardKind, spawnCol, riderPad: -1, z: 0, vx: 0, vy: 0, rotation: 0, + x: tileCenterX(spawnCol), y: floorY - skateBoardKind.radius, + active: true, serveAt: 0, lastHitBy: -1, safeUntil: 0, safePlayers: 0, + heldBy: -1 }))]; +// Version-one replay/spectator consumers still read the first ball by name. +const ball = balls[0]; +// The board is not gated by `ballEnabled`. That switch is the ball's — it +// takes the serve, the cross-wack and the BALLED death off the map together — +// and the board shares none of them. +let skateBoardEnabled = true; +// The ball is out of the round — @jeffrey asked for the cube bare. All of +// the ball's machinery (serve, boot, carry, cross-wack, the BALLED death) +// sleeps behind this switch exactly as it always did for the test harness; +// flipping it back on is the whole re-installation. +let ballEnabled = false; + +function mapHash(text) { + let hash = 2166136261; + for (const character of String(text || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} +let currentMapName = "HALFPIPE"; +let currentMapId = "halfpipe"; +let workshopBase = null; +// Workshop edits are local practice state. They never enter rollback matches +// or the competitive replay ledger; documents are saved separately. +let workshopMap = null; +let workshopRevision = 0; +let workshopHistory = []; +let workshopHighlight = false; +let workshopTainted = false; + +let localMapIndex = -1; +let localMapMode = ""; +let localMapInstalled = false; +let netRoundMapIndex = -1; +const localMapVariants = [null, { + name: "BOWL", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "transition", rise: 360, dir: -1, lift: -360 }, + { from: 16, to: 24, kind: "flat", lift: -360 }, + { from: 24, to: 28, kind: "transition", rise: 360, dir: 1, lift: -360 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 9, cols: 4, row: 3 }, { col: 27, cols: 4, row: 3 }], +}, { + name: "HIGH GROUND", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "bank", rise: 270, dir: 1 }, + { from: 16, to: 24, kind: "flat", lift: 270 }, + { from: 24, to: 28, kind: "bank", rise: 270, dir: -1 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 7, cols: 4, row: 3 }, { col: 18, cols: 4, row: 7 }, + { col: 29, cols: 4, row: 3 }], +}, { + name: "PUMP TRACK", + features: [ + { from: 0, to: 6, kind: "flat" }, + ...[6, 14, 22, 30].flatMap(from => [ + { from, to: from + 3, kind: "bank", rise: 180, dir: 1 }, + { from: from + 3, to: from + 5, kind: "flat", lift: 180 }, + { from: from + 5, to: from + 8, kind: "bank", rise: 180, dir: -1 }, + ]), + { from: 38, to: 40, kind: "flat" }, + ], + decks: [{col: 17, cols: 6, row: 6}], +}, { + name: "TWIN BOWLS", + features: [ + {from: 0, to: 4, kind: "flat"}, + ...[4, 22].flatMap(from => [ + {from, to: from + 3, kind: "transition", rise: 270, dir: -1, lift: -270}, + {from: from + 3, to: from + 9, kind: "flat", lift: -270}, + {from: from + 9, to: from + 12, kind: "transition", rise: 270, dir: 1, lift: -270}, + {from: from + 12, to: from + 18, kind: "flat"}, + ]), + ], + decks: [{col: 8, cols: 4, row: 3}, {col: 26, cols: 4, row: 3}], +}, { + name: "LAUNCH PAD", + features: [ + {from: 0, to: 6, kind: "flat", lift: 360}, + {from: 6, to: 10, kind: "bank", rise: 360, dir: -1}, + {from: 10, to: 16, kind: "flat"}, + {from: 16, to: 20, kind: "bank", rise: 270, dir: 1}, + {from: 20, to: 24, kind: "bank", rise: 270, dir: -1}, + {from: 24, to: 30, kind: "flat"}, + {from: 30, to: 34, kind: "bank", rise: 360, dir: 1}, + {from: 34, to: 40, kind: "flat", lift: 360}, + ], + decks: [{col: 8, cols: 4, row: 6}, {col: 18, cols: 4, row: 9}, + {col: 28, cols: 4, row: 6}], +}]; +localMapVariants.push({ + name: "CORAL STEPS", + features: [ + {from:0, to:8, kind:"flat"}, + {from:8, to:12, kind:"bank", rise:180, dir:1}, + {from:12, to:16, kind:"flat", lift:180}, + {from:16, to:20, kind:"bank", lift:180, rise:180, dir:1}, + {from:20, to:24, kind:"bank", lift:180, rise:180, dir:-1}, + {from:24, to:28, kind:"flat", lift:180}, + {from:28, to:32, kind:"bank", rise:180, dir:-1}, + {from:32, to:40, kind:"flat"}, + ], + decks:[{col:4,cols:4,row:4},{col:18,cols:4,row:8},{col:32,cols:4,row:4}], +}, { + ...localMapVariants[1], name:"SLOW MOTION", modifier:"slow", +}, { + name:"AIR DROP", modifier:"air", skateboard:false, + features:[{from:0,to:40,kind:"flat"}], decks:[], +}); +const roundMapIds = ["halfpipe", "bowl", "high-ground", "pump-track", "twin-bowls", "launch-pad", + "coral-steps", "slow-motion", "air-drop"]; +const roundMapColors = [ + {sky:[218,239,255], floor:[45,191,185], deck:[255,154,72]}, + {sky:[246,225,255], floor:[181,107,237], deck:[76,220,188]}, + {sky:[255,231,203], floor:[246,150,58], deck:[74,177,232]}, + {sky:[225,247,214], floor:[119,192,66], deck:[234,103,169]}, + {sky:[255,224,231], floor:[231,101,146], deck:[93,193,222]}, + {sky:[224,234,255], floor:[90,139,234], deck:[250,202,67]}, + {sky:[255,235,205], floor:[248,108,92], deck:[66,214,201]}, + {sky:[239,222,255], floor:[122,94,201], deck:[245,176,238]}, + {sky:[125,208,255], floor:[93,158,243], deck:[255,244,168]}, +]; +function roundMapDocument(index) { + const variant = localMapVariants[index]; + return variant ? {...workshopBase, ...variant, + features: variant.features.map(f => ({lift:0, rise:0, dir:1, ...f}))} : workshopBase; +} +function installRoundMap(index) { + installWorkshopMap(roundMapDocument(index), true); + currentMapId = roundMapIds[index]; +} + +function rotateLocalMap(keepMap, resetMatch) { + const local = localVersusActive(); + const training = !selfPlay && ["dummy", "spiderdummy", "trainingbot", "bot"] + .includes(fightOpponent); + if (skateparkMap || (!local && !training) || workshopTainted || + globalThis.__oskiewarPublishedMap) return; + const mode = local ? "local" : "training"; + if (localMapMode !== mode) { localMapIndex = -1; localMapMode = mode; } + // Returning to the title mid-round keeps its map. A completed solo round + // advances before the next START, just like the local versus rollover. + if (localMapIndex < 0 || (!keepMap && (local || !resetMatch || roundResult))) + localMapIndex = (localMapIndex + 1) % localMapVariants.length; + const variant = localMapVariants[localMapIndex]; + const map = variant ? { ...workshopBase, ...variant, + features: variant.features.map(f => ({ lift: 0, rise: 0, dir: 1, ...f })) } + : workshopBase; + if (local || variant) installWorkshopMap(map, true); + else currentMapName = "HALFPIPE"; + currentMapId = roundMapIds[localMapIndex]; + localMapInstalled = local || Boolean(variant); +} + +function workshopSnapshot() { + return { format: "ac.oskiewar.map", version: 1, + name: workshopMap?.name || currentMapName, + features: parkSegments.map(({ from, to, kind, lift, rise, dir }) => + ({ from, to, kind, lift: lift || 0, rise: rise || 0, dir: dir || 1 })), + decks: parkDecks.map(d => ({ col: (d.left - gridLeft) / tileSize, + cols: (d.right - d.left) / tileSize, row: (floorY - d.y) / tileSize })), + spawns: players.slice(0, 2).map(p => (p.spawnX - gridLeft) / tileSize - .5), + pickups: workshopMap?.pickups.map(p => ({ ...p })) || + [...gunPickups, ...saberPickups, ...grenadePickups].filter(p => p.startsActive) + .map(p => ({ kind: p.kind || "GRENADE", col: tileCol(p.x), amount: p.amount || 0 })), + skateboard: skateBoardEnabled }; +} + +function installWorkshopMap(map, cycleHandgun = false) { + if (skateparkMap) { configureWorldMap("station"); resetSkateRopes(); } + localMapInstalled = false; + workshopMap = map; + roundModifier = map.modifier || ""; + parkSegments.splice(0, parkSegments.length, ...map.features.map(f => ({ ...f, + left: gridLeft + f.from * tileSize, right: gridLeft + f.to * tileSize }))); + parkDeepest = floorY + Math.max(0, ...parkSegments.map(s => -s.lift)); + rebuildTerrainProfile(); + parkDecks.splice(0, parkDecks.length, ...map.decks.map((d, i) => ({ level: i + 1, + left: gridLeft + d.col * tileSize, right: gridLeft + (d.col + d.cols) * tileSize, + y: floorY - d.row * tileSize }))); + players.forEach((p, i) => { p.spawnX = tileCenterX(map.spawns[i] ?? + (map.spawns[0] + map.spawns[1]) / 2); }); + installMapPickups(gunPickups, map.pickups.filter(p => + !["GRENADE", "LIGHT SABER"].includes(p.kind)), "gun"); + // Portable maps contain authored pickups, not the built-in refill policy. + const pistol = gunPickups.find(p => p.kind === "HANDGUN"); + if (cycleHandgun && pistol) pistol.cycle = true; + installMapPickups(saberPickups, map.pickups.filter(p => p.kind === "LIGHT SABER"), "saber"); + installMapPickups(grenadePickups, map.pickups.filter(p => p.kind === "GRENADE"), "grenade"); + skateBoardEnabled = map.skateboard; + currentMapName = map.name; + currentMapId = "workshop-" + mapHash(JSON.stringify(map)).toString(36); + // Reconcile newly raised floors without restarting the players' exchange. + for (const p of players) { + const ground = terrainFloorAt(p.x); + if (p.y > ground || p.grounded) { p.y = ground; p.vy = 0; p.grounded = true; } + } + renderPreviousState = null; +} + +function workshopCommand(command) { + if (!globalThis.__oskiewarWorkshopEnabled) throw new Error("Coach editing is off"); + if ((netSession && netSession.seat !== 0) || roundViewer || survivalActive() || resimActive) + throw new Error("Edit through the room host; survival and replay editing are unavailable"); + if (!command || typeof command !== "object") throw new Error("Expected a workshop command"); + const { op } = command; + if (op === "inspect") return { room: "ow-" + (versusRoomName || sessionName), + revision: workshopRevision, map: workshopSnapshot(), + highlights: workshopHighlight, undo: workshopHistory.length, + units: { columns: gridCols, tileSize, floorY }, + players: players.map(p => ({ x: p.x, y: p.y, spawnX: p.spawnX })) }; + if (op === "highlight") { + if (typeof command.enabled !== "boolean") throw new Error("Supply enabled: true or false"); + workshopHighlight = command.enabled; + return workshopCommand({ op: "inspect" }); + } + if (command.revision !== workshopRevision) throw new Error("Map changed; inspect and use its revision"); + if (!["apply", "drop", "undo", "reset-round", "restart-level"].includes(op)) + throw new Error("Unknown workshop operation"); + let map; + if (op === "undo") { + if (!workshopHistory.length) throw new Error("Nothing to undo"); + map = workshopHistory[workshopHistory.length - 1]; + } else { + map = op === "apply" ? command.map : workshopSnapshot(); + if (op === "drop") map.pickups.push(command.item); + } + map = globalThis.__oskiewarValidateMap(map); + if (netSession) { + const session = netSession; + if (session.send({ t: "workshop", o: session.originUs }) === false) + throw new Error("The peer connection is not ready for editing"); + workshopTainted = true; + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + } + if (op === "undo") workshopHistory.pop(); + else if (!["reset-round", "restart-level"].includes(op)) { + workshopHistory.push(workshopSnapshot()); + if (workshopHistory.length > 20) workshopHistory.shift(); + } + workshopTainted = true; + workshopRevision++; + installWorkshopMap(map); + if (op === "reset-round" || op === "restart-level") + resetRound(runtime().monotonicUs, op === "restart-level"); + return workshopCommand({ op: "inspect" }); +} + +function installMapPickups(target, authored, type) { + target.length = 0; + for (const entry of authored) { + const x = tileCenterX(entry.col); + target.push({ + ...(type === "gun" ? { kind: entry.kind, amount: entry.amount, + cycle: Boolean(entry.cycle) } : {}), + ...(type === "saber" ? { kind: "LIGHT SABER" } : {}), + ...(type === "grenade" ? { amount: entry.amount } : {}), + x, y: terrainFloorAt(x) - 70, z: 0, + active: true, startsActive: true, respawnAt: 0, + }); + } +} + +function resetWorkshopMap() { + if (!workshopMap) return; + if (!localMapInstalled && + (globalThis.__oskiewarWorkshopEnabled || globalThis.__oskiewarPublishedMap) && + !survivalActive() && !roundViewer && !resimActive) { + installWorkshopMap(workshopMap); + return; + } + const spawns = players.map(p => p.spawnX); + installWorkshopMap(workshopBase, true); + workshopMap = null; + workshopHistory = []; + workshopRevision++; + currentMapName = "HALFPIPE"; + currentMapId = "halfpipe"; + if (versusLane() || survivalActive()) players.forEach((p, i) => { p.spawnX = spawns[i]; }); +} + + +// Physics remains an exact 60 Hz story. Rendering may happen between those +// authored instants—especially during slow motion—so retain the state that +// entered each tick and blend only presentation coordinates toward the state +// that left it. The authoritative objects are restored immediately after +// paint; collision, replay capture and networking never see interpolated data. +let renderPreviousState = null; +const renderInterpolationFields = { + player: ["x", "y", "z", "headRoll", "crouchBlend"], + bullet: ["x", "y", "z", "previousX", "previousY"], + grenade: ["x", "y", "z", "previousX", "previousY", "blastRadius"], + ball: ["x", "y", "z", "rotation"], + detached: ["x1", "y1", "z1", "x2", "y2", "z2"], + debris: ["x", "y", "z"], + camera: ["width", "roll", "perspective", "fov"], + cameraPoint: ["x", "y", "z"], +}; + +function renderInterpolationObjects() { + return [ + ...players.map((object) => [object, renderInterpolationFields.player]), + ...bullets.map((object) => [object, renderInterpolationFields.bullet]), + ...grenades.map((object) => [object, renderInterpolationFields.grenade]), + ...balls.map((object) => [object, renderInterpolationFields.ball]), + ...detachedParts.map((object) => [object, renderInterpolationFields.detached]), + ...impacts.flatMap((impact) => (impact.debris || []) + .map((object) => [object, renderInterpolationFields.debris])), + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]; +} + +function captureRenderInterpolationState() { + renderPreviousState = new Map(); + for (const [object, fields] of renderInterpolationObjects()) + renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +// A camera snap is an edit, not motion. If it happens inside a simulation +// tick, replace the retained camera sample too; otherwise fractional-speed +// paint blends the new close-up with the old wide shot and frame one lands +// halfway between them. +function collapseRenderCameraInterpolation() { + if (!renderPreviousState) return; + for (const [object, fields] of [ + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]) renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +function beginRenderInterpolation(alpha) { + const amount = clamp(Number(alpha), 0, 1); + if (!renderPreviousState || amount >= .999) return () => {}; + const restore = []; + for (const [object, fields] of renderInterpolationObjects()) { + const previous = renderPreviousState.get(object); + if (!previous) continue; + for (const field of fields) { + if (!Number.isFinite(previous[field]) || !Number.isFinite(object[field])) + continue; + restore.push([object, field, object[field]]); + object[field] = lerp(previous[field], object[field], amount); + } + } + cameraDoll.dirty = true; + return () => { + for (const [object, field, value] of restore) object[field] = value; + cameraDoll.dirty = true; + }; +} +let padSnapshots = [null, null]; +// The pad each fighter actually feels. A bot writes its synthesized presses +// here, so the HUD, the debug read-out, the replay and the physics all read +// bot input off the same wire as a hand on a controller. +let inputPads = [null, null]; +let startedAt = 0; +let roundStartedAt = 0; +let lastSimAt = 0; +let roundElapsedUs = 0; +const fightHitMarks = []; +globalThis.__oskiewarFightHitMarks = fightHitMarks; +let lastCountdownSecond = -1; +// The intro's own clock: which "3, 2, 1" second last rang, and whether the +// round-open accent has fired. -1 means the accent is still owed. +let lastIntroSecond = 0; +// The scored tail's clocks: the next heartbeat of the killcam dwell, and +// whether the result card has had its sting. +let resultPulseAt = 0; +let resultLaughAt = 0; +let resultLaughStep = 0; +let resultCardStung = false; +const resultReactionPrevious = [[], [], []]; +let roundOverAt = 0; +let roundResult = ""; +// How long a reel holds the opening matchup card. Long enough to read two +// names on a phone, short enough that the fight plays under a clean frame. +const REEL_MATCHUP_SECONDS = 2.6; +let matchOver = false; +let roundCause = ""; +let deathCinematic = null; +let impactHitboxesUntil = 0; +let nextPowerupAtUs = powerupIntervalUs; +let powerupSequence = 0; +let acFeed = {}; +// Pal select is retired: you are your own handle, so there is nobody to pick, +// and the dummy is already the default opponent. The whole two-step screen +// stays behind this one flag rather than being deleted, because the entry UI +// is still moving and this is the shape we may want to compare against. Flip +// it true and the wheel comes back exactly as it was. +const PAL_SELECT = false; +// The frame recorder remains intact for future review tooling, but replay is +// not part of the match flow. One flag restores the viewer, its controls and +// its offer together; production currently moves directly through results. +const INSTANT_REPLAY = false; +let selecting = false; +// Self-play is a harness mode: both fighters run the bot, no pad can enter or +// leave it, and rounds roll over on their own. +let selfPlay = false; +// Which kind the round on screen was opened against. Training and the bot door +// seat the same fighter with the same brain now, so `players[1].bot` can no +// longer say which door a round came through — and only one of those doors is +// allowed on the wire. +let fightOpponent = ""; +// Survival uses the round clock only as an elapsed-time source. Height is the +// score, the lava line is the opponent, and a run ends only when the runner +// touches it or reaches the final authored deck. +const survivalLavaStart = floorY + 360; +const survivalLavaBaseSpeed = 52; +let survivalStartedAt = 0; +let survivalLavaY = survivalLavaStart; +let survivalHeight = 0; +let survivalBestHeight = 0; +let survivalPeakLevel = 0; +let hudLeftPad = 0; +// The title is also the attract screen. Half of sessions get the quiet, +// cross-legged tableau; half get a standing face-off. Both remain still so +// the wordmark stays readable until the player asks the fight to begin. +// Hashing the already-created round name keeps the split stable for a visit +// without spending a second Math.random call (reel seeding relies on one). +let titleAttractMode = "still"; +// What a fresh session is dealt. @jeffrey, playtesting: "can we switch dummy +// to bot now?" — the free front door was a post that never hit back, so a solo +// visit was target practice rather than a fight. `trainingbot` is that same +// fighter with the bot's brain switched on, carrying its own kind name so the +// wire gate in `roundIsTimed` can still tell the free door from the one a +// handle buys. The inert dummy and the spider stay reachable by name, because +// damage, geometry and sync work all want a target that stands still. +let trainingOpponent = ""; +function trainingOpponentKind() { + const requested = String(globalThis.__oskiewarOpponent || "").toLowerCase(); + if (requested === "dummy" || requested === "spiderdummy" || + requested === "trainingbot") return requested; + // One kind for the whole visit: a title returned to after a knockout must + // not re-deal the opponent out from under the player. The web's empty + // door spars with the bot; the console's stands a dummy up instead — + // @jeffrey on the Xbox, 2026-09-20: "make it so we can play against dummy + // as opposed to bot ... the dummy goes away and gets replaced by players" + // (a second local controller promotes that chair through + // `updateLocalVersus`). An inert dummy is also one bot brain fewer in the + // console's interpreted sim. + if (!trainingOpponent) trainingOpponent = + globalThis.__oskiewarVersusCapable === true ? "trainingbot" : "dummy"; + return trainingOpponent; +} +// The versus lane's room. One name for the whole visit — the shell writes it +// into the address bar, the QR encodes it, and a friend opening that address +// takes the second chair. A visit that arrived THROUGH such an address and +// found nobody hosting claims the name instead, so a shared link survives +// its sender refreshing. +let versusRoomName = ""; +let versusNextAt = 0; +let versusRivalName = ""; +// The raw handle the seat last offered, kept beside the name it produced. The +// comparison that decides whether to re-dress has to be against this and not +// against the result: an anonymous arrival offers "", which is falsy, so the +// old guard skipped the re-dress entirely and left the PREVIOUS player's name +// and colors on the chair. Leaving and rejoining inside the 2.5 s grace is +// exactly how somebody ends up wearing a stranger. +let versusRivalOffered = ""; + +// The handle riding the freshest pad frame, cleaned to the shape a nameplate +// and the state schema both accept. One reader, so the re-dress test and the +// dressing itself can never disagree about what was offered. +function versusOfferedName() { + return String(globalThis.__oskiewarRemotePad?.name || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); +} +// How long an empty wire keeps the rival seated. Long enough to ride out a +// dropped packet or a phone switching antennas, short enough that a closed +// tab reads as "they left" while the fighter is still warm. +const versusChallengerGraceMs = 2500; +// The fight streams faster than a grandstand needs, because for the +// challenger this feed IS the game — their own presses come back to them +// as pictures through it. +const versusSnapshotIntervalMs = 33; +// How long a visitor who arrived through a shared address waits for a host +// before deciding the room is theirs to claim. +const versusClaimAfterUs = 2500000; +let versusClaimArmedAt = 0; +let versusInputSeq = 0; +let versusInputLastSent = ""; +let versusInputNextAt = 0; +let versusInputMinNextAt = 0; +// The bridge a claiming visitor stepped off of, kept so a lost publisher +// race can walk them right back on as a challenger. +let versusFallbackBridge = null; + +let versusSeatGraceUntil = 0; + +function versusChallengerFresh() { + // In a rollback fight the rival's presence is the session itself; the + // sim must not read the wall clock to decide whether the fight goes on. + if (netSession) return true; + // And for a moment after one ends badly, while the rival is changing lanes. + if (Date.now() < versusSeatGraceUntil) return true; + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return false; + return Date.now() - remote.at < versusChallengerGraceMs; +} + +// The remote rival's pad, read off the same wire shape a hand or a bot +// writes. A stale global answers neutral rather than holding the last +// press — a vanished friend must drop their guard, not run into a corner +// forever. +// The seat whoever is at this screen is holding. Seat one everywhere except a +// rollback fight's challenger, who plays the second fighter — their keycap +// legend, touch discs and move names must follow their own hands rather than +// lighting up when the other player presses something. +const localSeat = () => netSession ? netSession.seat : 0; +const localPad = () => inputPads[localSeat()] || + { connected: true, down: [], leftX: 0, leftY: 0 }; + +function remotePadSnapshot() { + const remote = globalThis.__oskiewarRemotePad; + const fresh = remote && Number.isFinite(remote.at) && + Date.now() - remote.at < versusChallengerGraceMs; + if (!fresh) return { connected: true, down: [], leftX: 0, leftY: 0, + rightX: 0, rightY: 0 }; + return { connected: true, + down: Array.isArray(remote.down) ? remote.down.slice() : [], + leftX: Number(remote.leftX) || 0, leftY: Number(remote.leftY) || 0, + rightX: 0, rightY: 0 }; +} +const selectionReady = [false, false]; +const selectionPrevious = [[], []]; +let selectionStep = 0; +let selectionCursor = 0; +let windMph = 0; +let windDirection = 1; +let windAcceleration = 0; +let windTargetMph = 0; +let windTargetDirection = 1; +let nextWindChangeAt = 0; +let replay = null; +// Round names in the order they were minted, each with the demo tick it was +// minted on. A rollback can rewind past a round rollover, so this ledger has +// to rewind with it — `replay.roundIds` is derived from it rather than being +// appended to directly, which is what keeps a re-simulated rollover from +// filing the same round twice. +let replayRoundMarks = []; +// The frame a finished round is waiting to be confirmed past before it is +// filed. -1 when nothing is waiting. See saveRoundReplay. +let replayPendingSaveFrame = -1; +let replayLastCommand = [-1, -1]; +let replayNextCheckpointAt = 0; +let matchName = ""; +let seriesName = ""; +// The app run's own name, distinct from any round or series: rounds are born +// and buried every thirty seconds, but the console sitting on the title screen +// is still a running program somebody may want to attach to. One name from +// boot to quit, drawn beside the debug bug, carried as sessionId in every live +// frame, and used as the relay room while no timed round is publishing. +let sessionName = ""; +let previousRoundName = ""; +let roundReplayFrames = []; +let roundReplayLastAt = 0; +let instantReplay = null; +let replayOfferPrevious = []; +let shellMode = "MENU"; +let gameplayStarted = false; +let shellPrevious = []; +let startInputPending = false; +let shellRawPrevious = []; +// Whether the stick was already leaned last frame, so a held lean reads as +// one gesture at the title rather than a machine-gun of entries. +let shellStickLive = false; +// Training teaches for two and a half minutes once the title lifts. This is +// session time, not round time: a knockout or a visit back to the title must +// not restart onboarding that the player has already outgrown. +let dummyGuideStartedAt = null; +// Unset is null, never -1: the console's monotonic clock can read negative +// (App.cpp overflows int64 converting QPC ticks past ~10 days of uptime), +// and a >= 0 sentinel then swallows every legitimate timestamp. +let titleTransitionAt = null; +// The wordmark is a toy: every letter of "oskiewar" and of "start" keeps its +// own swell and shudder, and the prompt keeps one shared bounce the letters +// take in turn. Paint owns these because they are pointer feel, not state. +const titleToys = []; +const promptToys = []; +let promptBounce = 0; +let titleToyAt = -1; +// Which letter the pointer currently owns. The letters never hold still — each +// one bobs and drifts a good fraction of its own width — so a bare hit test +// against a moving cell hands a resting cursor a letter that slides out from +// under it and back several times a second. That reads as a flickering glyph, +// a cursor blinking between two shapes, and a hover tick that will not stop. +// Holding the grab until the pointer leaves a cell grown by the letter's own +// travel is the same hysteresis the camera uses at the safe-zone edge. +let titleGlyphHot = -1; +let navigationPrevious = [[], []]; +// Remote render experiment flags. An attached agent can flip these through +// the relay — the shell merges oskiewar:flags into the global and the paint +// below reads it once per frame — so what each layer costs can be measured +// on the machine that is actually struggling, not a workstation imitating +// it. Every flag missing means the full picture; xbox/tools/oskiewar-ablate +// walks them and reads the price back out of the live fps telemetry. +let renderFlags = {}; +// Temporary live combat inspector. Keep this explicit so the production view +// can return to a clean presentation without changing combat geometry. +let debugHitboxes = false; +// The frame meter, the way a training mode has one: one pip per simulation +// frame, colored by what the fighter was DOING on that frame, so a player can +// read an exchange back instead of guessing at it. +// +// Street Fighter 6's legend, kept because it is the one people already know: +// green is startup, red is active, blue is recovery, yellow is stun. What +// those mean HERE is a question about this game rather than that one, and the +// honest answers are not all flattering: +// +// Startup, active and recovery come from the same integer-frame table as +// the collision sampler. A landed strike remains in recovery until its +// original action deadline. Stun still takes precedence over the action. +// +// Shielding gets a color of its own because holding a shield is a stance in +// this game rather than a reaction, and folding it into stun would say +// something false about who is in control. +const frameMeterLength = 120; +const frameMeterStates = { + neutral: { ink: [92, 100, 124], label: "" }, + startup: { ink: [86, 226, 120], label: "STARTUP" }, + active: { ink: [255, 66, 72], label: "ACTIVE" }, + recovery: { ink: [72, 150, 255], label: "RECOVERY" }, + stun: { ink: [255, 208, 64], label: "STUN" }, + shield: { ink: [186, 118, 255], label: "SHIELD" }, + airborne: { ink: [54, 62, 86], label: "" }, +}; +const frameMeters = [[], []]; +// What a fighter is on this exact frame, in one word. Ordered by what beats +// what: being stunned outranks anything you were trying to do, and a swing +// outranks the shield you are no longer really holding. +function frameMeterState(player, now) { + if (!player.alive) return "neutral"; + if (now < player.hitStunUntil) return "stun"; + if (player.attackKind && now < player.attackUntil) { + if (player.attackHit) return "recovery"; + return meleeFrame(player, now).phase; + } + if (player.blocking) return "shield"; + if (!player.grounded) return "airborne"; + return "neutral"; +} +function recordFrameMeter(now) { + if (!debugHitboxes) return; + for (const player of players) { + const meter = frameMeters[player.pad]; + meter.push(frameMeterState(player, now)); + if (meter.length > frameMeterLength) meter.shift(); + } +} +// One FIGHT_DEBUG_PERF telemetry line per debug toggle, so the console's log +// can prove the fps row drew without narrating every frame. +let debugPerfReported = false; +let nextInputDebugAt = 0; +let frameTelemetry = []; +let frameTelemetryFlushAt = 0; +let lastPaintAt = 0; +let displayFps = 0; +let liveSequence = 0; +let liveNextAt = 0; +// The session room ticks slower than a round room: nobody spectates a title +// screen at 20Hz, and an agent reading fps is happy at four. +const sessionSnapshotIntervalUs = 250000; +let sessionNextAt = 0; +// Which round the session room was last told about, so the hand-off frame +// goes out exactly once per round instead of flapping the native shell's +// single publisher socket every tick. +let sessionAnnouncedRound = ""; +let spectatorQr = null; +// Encoding a code costs about 59ms and is the whole 50-100ms tail in the +// frame histogram: it ran at every round reset, for a URL that changes once +// per round. Same URL, same code -- so keep the last one. +let spectatorQrUrl = ""; +let spectatorQrCache = null; +function spectatorCode(url) { + if (typeof qrcode !== "function") return null; + if (url === spectatorQrUrl && spectatorQrCache) return spectatorQrCache; + spectatorQrUrl = url; + spectatorQrCache = qrcode(url, { errorCorrectLevel: 1 }); + return spectatorQrCache; +} + +let roundViewer = null; +let roundViewerStop = null; +let roundViewerMode = ""; +// The chair-holder's own View presses, remembered across viewer ticks — the +// debug toggle needs an edge, and the host's echo never carries system keys. +let viewerSystemPrevious = []; +let roundViewerStatus = "CONNECTING"; +let roundViewerDemo = null; +let roundViewerDemoStartedAt = 0; +// When the last authoritative LIVE frame landed, on the WALL clock in +// milliseconds. Wall, not sim: the frame arrives in a socket callback, where +// the sim clock is not running, and comparing an arrival stamped by one clock +// against a deadline read from the other drifted by every dropped tick until +// the coast fuse below stopped tripping at all. +let roundViewerLiveAt = 0; +// The grandstand's playout buffer. Wire frames are no longer painted the +// instant they land — they queue here with their arrival time and the render +// reads a clock held a little behind the newest of them, so every frame is +// drawn by interpolating the two that bracket it. Extrapolation is what is +// left when the buffer runs dry, not the normal case: a body that coasts on +// stale velocity walks through the floor and then snaps back, which is the +// whole of what "glitchy" meant on a guest screen. +let roundViewerFrames = []; +// The playout clock, in the same wall milliseconds the queue is stamped in. +// It advances on the simulation's own dt so the picture moves at the sim's +// rate, and leans gently toward (now − delay) so it neither runs dry nor +// falls further and further behind. +let roundViewerPlayoutMs = 0; +// How far behind the newest arrival the playout clock sits. One wire frame +// plus the jitter we have actually measured — enough that the next frame is +// usually already in hand when the clock reaches the last one. +let roundViewerDelayMs = 70; +// Wire health, measured from arrivals alone: mean gap, jitter (mean absolute +// deviation of the gap), and the share of sequence numbers that never came. +// These are what the connection meter reads, and what sizes the delay above. +let roundViewerGapMs = 33; +let roundViewerJitterMs = 0; +let roundViewerLossPct = 0; +let roundViewerSeq = -1; +let roundViewerSeqHeard = 0; +let roundViewerSeqExpected = 0; +let roundViewerImpactTick = -1; +// The newest impact number this watcher has spawned. The host repeats a mark +// on every frame it is still burning, so this is what tells a repeat from a +// new spark. +let roundViewerImpactId = 0; +// Whether the round being watched has a clock. The wire says so; the watcher +// must not answer from its own `roundIsTimed()`, which reads a local fight +// that is not happening. +let roundViewerTimed = true; +let livePublishFailed = false; + +// Match names are public URLs and must not collide, so they take real +// entropy — but a recorded round has to reproduce, and the ball kind is +// hashed from the series name and carries radius and mass. So the entropy is +// drawn once per match, carried in the demo, and every name after it falls +// out deterministically. +let nameSeed = 1; +function seedNames(seed) { + nameSeed = (seed >>> 0) || 1; +} +function nameRandom() { + nameSeed = (nameSeed + 0x6d2b79f5) >>> 0; + let value = nameSeed; + value = Math.imul(value ^ (value >>> 15), value | 1); + value ^= value + Math.imul(value ^ (value >>> 7), value | 61); + return ((value ^ (value >>> 14)) >>> 0) / 4294967296; +} + +function pronounceableMatchName() { + const onsets = ["b", "d", "f", "g", "k", "l", "m", "n", "p", "r", + "s", "t", "v", "z", "ch", "sh", "th"]; + const consonants = "bdfgklmnprstvz"; + const vowels = "aeiou"; + const onset = onsets[Math.floor(nameRandom() * onsets.length)]; + const vowel = vowels[Math.floor(nameRandom() * vowels.length)]; + const middle = consonants[Math.floor(nameRandom() * consonants.length)]; + const ending = (vowels + "y")[Math.floor(nameRandom() * (vowels.length + 1))]; + return onset + vowel + middle + middle + ending + + Math.floor(nameRandom() * 1000); +} + +function demoTick(now) { + return replay ? Math.max(0, Math.round((now - replay.startedMonotonicUs) / + replayTickUs)) : 0; +} + +function trackMatchStarted() { + if (!roundIsTimed() || typeof analytics !== "function") return; + const device = typeof capabilities === "function" ? capabilities() : {}; + const platform = String(device.platform || "").toLowerCase(); + const surface = platform === "xbox-uwp" || platform === "xbox" + ? "xbox" + : platform === "macos" ? "macos" : "web"; + const family = String(device.inputFamily || "").toLowerCase(); + analytics("match_started", { + source_system: "browser", + surface, + input_family: ["gamepad", "keyboard", "xbox"].includes(family) + ? family + : "unknown", + opponent_type: selfPlay ? "self-play" + : players[1].bot ? "bot" + : players[1].npc ? "dummy" : "local-player", + }); +} + +function startReplay(now) { + const run = runtime(); + if (!roundIsRecorded()) { + seriesName = ""; + matchName = ""; + previousRoundName = ""; + // Spiderdummy training carries one plain ball; there is no board to + // carry anymore. + matchBallType = "soccer"; + replay = null; + spectatorQr = null; + return; + } + seedNames(Math.floor(Math.random() * 4294967296)); + const nameSeedUsed = nameSeed; + seriesName = pronounceableMatchName(); + // The deal owns the ball in a versus fight — both seats set it from the same + // word — so rolling a series ball here would put the two of them in + // different fights. + if (!versusActive()) matchBallType = seriesBallType(seriesName); + matchName = ""; + previousRoundName = ""; + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = { + format: "ac.oskiedemo", version: 1, game: "oskiewar", + simulation: "oskiewar-physics-1", tickRate: 60, + matchId: "ow-" + seriesName, matchName: seriesName, + seriesId: "ow-" + seriesName, seriesName, roundIds: [], + recordedDisplay: { + width: Number(run.width) || viewWidth(), + height: Number(run.height) || viewHeight, + aspectRatio: (Number(run.width) || viewWidth()) / + Math.max(1, Number(run.height) || viewHeight), + surfaceWidth: Number(run.surfaceWidth) || Number(run.width) || viewWidth(), + surfaceHeight: Number(run.surfaceHeight) || Number(run.height) || viewHeight, + refreshHz: Number(run.refreshHz) || Number(run.measuredHz) || 0, + }, + startedAt: run.unixMs || 0, startedMonotonicUs: now, + // Which room this was played in, so a room can be asked for its own + // history. Only a versus fight has one: in the broadcast lane each round + // IS its own room and the round id already says so. + ...(versusActive() && versusRoomName + ? { roomId: "ow-" + versusRoomName, roomName: versusRoomName } : {}), + // A versus round runs until somebody falls, so a re-run must not be handed + // a clock the original never had. Older demos carry no flag and were all + // timed, which is what the reader below assumes. + timed: roundIsTimed(), + nameSeed: nameSeedUsed, ballType: matchBallType, + map: skateparkMap ? "skatepark" : "station", + fighters: players.map((player) => player.name), + nations: players.map((player) => player.nation || ""), + commands: [], events: [], checkpoints: [], rounds: [], impacts: [], + }; + replayLastCommand = [-1, -1]; + replayNextCheckpointAt = now; + // The sequence counter survives the match: every round room is born empty, + // so a fresh room takes any first number — but the session room lives from + // boot to quit, and the relay silently drops a frame whose sequence ever + // runs backwards. One counter, never rewound, serves them both. + liveNextAt = now; + livePublishFailed = false; + spectatorQr = null; + trackMatchStarted(); +} + +// Whether the round on screen is on the wire: clocked, named, recorded, +// published, counted. The free training round never is, whatever its opponent +// does. An opponent with no bot AI used to be a safe stand-in for "nobody is +// watching this" — the day training started sparring back, that stand-in would +// have put every anonymous session on a series, a demo and a live feed, so the +// gate reads the door the round came through instead. The versus lane is off +// this wire too, by choice rather than freedom: it runs one room, one stream, +// no series and no demo, because the shared URL must keep meaning this fight. +function roundIsTimed() { + // A watcher is answering about somebody else's round. Everything below reads + // this machine's own fight, which for a watcher is not running — and a + // watcher that has not been served a frame yet has no round to report at + // all, so it must not paint a countdown for one. A stored demo still falls + // through: it IS a local re-run, and it was a timed round when recorded. + if (roundViewer && roundViewerMode !== "DEMO") + return roundViewerMode === "LIVE" && roundViewerTimed; + if (survivalActive()) return false; + // Training runs without a clock — except under the reel harness, where a + // scripted dummy bout wants the full round apparatus (clock, demo, result + // card) so it can be recorded and repainted like any match. + if (globalThis.__oskiewarTimedTraining === true) return true; + // Every round that reaches a re-simulation was a timed, recorded round. + if (resimActive) return resimTimed; + if (fightOpponent === "trainingbot" || versusLane()) return false; + return !(players[1].npc && !players[1].bot); +} + +// This machine is the one that writes a versus fight down. Both seats +// simulate it, but the record needs exactly one author or the two would race +// for the same round id — the same reason only the host narrates the stream. +const versusRecorder = () => + versusActive() && (!netSession || netSession.seat === 0); + +// Which rounds leave a record. Timed rounds always did, and a versus fight +// does now: a room's history is the point of the room. The clock was never +// what made a round worth keeping, it was just the only lane that had one. +// The public demo/relay contract has two seats. Local three-player battles +// retain their in-memory round replay without publishing incompatible demos. +const roundIsRecorded = () => !freeForAll() && (roundIsTimed() || versusRecorder()); + +// The frame numbers the debug HUD already prints, packed for the wire. Only +// stages the host actually measured go in — a console reports a real frame and +// present time, a browser reports its rAF span and its own paint cost and +// nothing else — because a zeroed field on a public feed reads as a stall +// rather than as silence. Two decimals is the resolution AC_NATIVE_PROFILE +// prints at, and it holds the whole block under sixty bytes. +function spectatorPerf(run) { + const perf = { fps: Math.round(displayFps || 0) }; + const frameMs = Number(run.frameMs) || 0; + const renderMs = Number(run.renderCpuMs) || 0; + const hz = Number(run.refreshHz) || 0; + if (frameMs) perf.frameMs = Math.round(frameMs * 100) / 100; + if (renderMs) perf.renderMs = Math.round(renderMs * 100) / 100; + if (hz) perf.hz = Math.round(hz); + return perf; +} + +function spectatorState(now, nextRoundId = "") { + const run = runtime(); + const introAge = now - roundStartedAt; + const phase = instantReplay ? "replay" : matchOver ? "match" + : roundResult ? "round" : selecting ? "select" + : introAge < roundIntroDurationUs() ? "intro" : "fight"; + const timed = roundIsTimed(); + // An untimed frame reports zero rather than null: the relay reads every + // remainingMs as an integer, and the title screen's attract fight has no + // clock to misreport. + const remainingMs = roundResult || !timed ? 0 : Math.max(0, + Math.round((roundDurationUs - roundElapsedUs) / 1000)); + const state = { + format: "ac.oskiewar.live", version: 1, seq: liveSequence++, + map: { id: currentMapId, name: currentMapName, highlights: workshopHighlight, + ...(workshopMap ? { workshop: workshopMap } : {}) }, + at: run.unixMs || 0, phase, + course: skateparkMap ? "skatepark" : "station", + ropes: skateRopes.map((rope) => rope.nodes.map((node) => + [node.x, node.y, node.px, node.py].map((value) => Math.round(value * 100) / 100))), + previousRoundId: previousRoundName ? "ow-" + previousRoundName : "", + fighters: players.map((player) => ({ + // The title's still variant seats a fighter with no name yet, and the + // relay turns away a nameless one — so the empty seat gets called what + // it is rather than costing the whole frame. + name: player.name || "NOBODY", nation: player.nation || "", color: player.color, + x: player.x, y: player.y, + z: player.z, vx: player.vx, vy: player.vy, vz: player.vz, + skateboard: player.skateboard, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, + facing: player.facing, alive: player.alive, + grounded: player.grounded, ducking: player.ducking, + sinking: now < player.sinkUntil, + blocking: player.blocking, score: player.score, + roundWins: player.roundWins, attack: player.attackKind || "", + removedParts: player.removedParts.slice(), + // Three numbers the grandstand already knew how to read and had never + // been sent. `applyRoundViewerState` reconstructs the strike spark, the + // limb burst and the swing's real arc from them; without them a live + // watcher saw a body come apart in silence and every swing froze at one + // canned mid-pose. Two decimals is all a fade needs. + hit: Math.round((player.hit || 0) * 100) / 100, + blockFlash: Math.round((player.blockFlash || 0) * 100) / 100, + attackTicks: player.attackKind + ? Math.max(0, Math.round((now - player.attackStartedAt) / replayTickUs)) + : 0, + })), + // Shots and lobs, the fight's projectiles. These used to stay home: a + // watcher — and a challenger on an older build — watched fighters flinch + // and die with nothing visible in the air between them. Flat number rows + // rather than objects, because the relay caps a frame at 8 KiB and 24 + // rounds plus 12 grenades named longhand is most of that cap on its own. + // Velocity rides along so the playout buffer can carry a round smoothly + // between arrivals instead of stepping it 140 units at a time. + shots: bullets.filter((shot) => shot.life > 0).map((shot) => [ + Math.round(shot.x), Math.round(shot.y), Math.round(shot.z), + Math.round(shot.previousX ?? shot.x), + Math.round(shot.previousY ?? shot.y), + Math.round(shot.vx || 0), Math.round(shot.vy || 0), shot.owner | 0, + (shot.spit ? 1 : 0) | (shot.heavy ? 2 : 0) | (shot.rubber ? 4 : 0)]), + // The host's own impact track. A watcher was reconstructing sparks from + // the flag edges it could see, which covers a punch landing and nothing + // else: a ricochet, a spit splat, a ground pound's crater and a grenade's + // own blast raise no flag on any fighter, so they happened in silence on + // every screen but the host's. Newest twelve, each with the number that + // says whether a watcher has already seen it, and its remaining life so + // it is spawned at the age it really is. + impacts: impacts.filter((mark) => mark.life > 0).slice(-12) + .map((mark) => [mark.id | 0, Math.round(mark.x), Math.round(mark.y), + Math.round(mark.z), Math.round((mark.duration || .3) * 1000), + Math.round(Math.max(0, mark.life) * 1000), + (mark.death ? 1 : 0) | (mark.explosion ? 2 : 0)]), + lobs: grenades.filter((lob) => lob.alive).map((lob) => [ + Math.round(lob.x), Math.round(lob.y), Math.round(lob.z), + Math.round(lob.vx || 0), Math.round(lob.vy || 0), lob.owner | 0, + (lob.rocket ? 1 : 0) | (lob.exploding ? 2 : 0), + Math.round(lob.blastRadius || 0), + Math.round(Math.max(0, lob.fuse || 0) * 1000)]), + ball: { active: ball.active, x: ball.x, y: ball.y, + z: ball.z, radius: ball.radius, type: ball.type, mass: ball.mass }, + balls: balls.map((item) => ({ active: item.active, x: item.x, + y: item.y, z: item.z, radius: item.radius, type: item.type, + mass: item.mass, heldBy: item.heldBy, + spawnOwner: item.spawnOwner })), + camera: { x: cameraCenter, y: cameraCenterY, width: cameraWidth, + position: { ...cameraDoll.position }, target: { ...cameraDoll.target }, + perspective: cameraDoll.perspective, fov: cameraDoll.fov, + roll: cameraDoll.roll }, + wind: { direction: windDirection, mph: windMph }, + round: { remainingMs, timed, result: roundResult || "", + cause: roundCause || "", + // How long this round has been running, intro included. A timed round + // could be reconstructed from `remainingMs` alone, but the versus lane + // reports zero there — and a watcher deriving its clock from that zero + // pinned itself thirty seconds in the past, which is why it never + // counted a round off and never played an intro card. + elapsedMs: clamp(Math.round((now - roundStartedAt) / 1000), 0, 3600000) }, + // @jeffrey plays oskiewar.com in Edge on an Xbox, where there are no + // devtools and the console's own AC_NATIVE_PROFILE line only reaches a + // Device Portal on the same LAN. The live socket is the one channel that + // already leaves the box, so the frame rate rides out with the round and + // can be read from anywhere the round can. + perf: spectatorPerf(run), + }; + // A title-screen frame has no series, no round and no demo to link — the + // relay rejects an id it cannot parse, so an empty name stays off the wire + // entirely rather than riding out as "ow-". + if (seriesName) state.seriesId = "ow-" + seriesName; + if (matchName) { + state.roundId = "ow-" + matchName; + state.replayUrl = "/api/oskiewar-replays?id=ow-" + matchName; + } + if (sessionName) state.sessionId = "ow-" + sessionName; + if (nextRoundId) state.nextRoundId = nextRoundId; + return state; +} + +function publishSpectator(now, { target = matchName, nextRoundId = "", + force = false } = {}) { + if (!roundIsTimed() || !target || livePublishFailed || + typeof publishLive !== "function" || + (!force && now < liveNextAt)) return; + liveNextAt = now + liveSnapshotIntervalUs; + try { + publishLive("ow-" + target, + JSON.stringify(spectatorState(now, nextRoundId))); + } catch (error) { + // A native host with an older room-ID contract must never take down play. + // Disable only spectator publishing until the next match/host upgrade. + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// The session channel. Rounds publish their own rooms, but the app run itself +// keeps one room under its own name so an agent has somewhere to attach while +// nothing is being scored — the title screen included. It runs only while the +// debug bug is lit: every anonymous visitor idling on oskiewar.com would +// otherwise claim one of the relay's 128 rooms, and this channel exists for a +// maintainer who asked for it, not for an audience. While a timed round is on +// the wire the session room instead gets exactly one frame naming that round, +// which both points any watcher at the fight and retires this room's publisher +// so the native shell's single socket is free to follow. +function publishSession(now) { + if (freeForAll() || (!debugHitboxes && !globalThis.__oskiewarWorkshopEnabled) || + !sessionName || livePublishFailed || + typeof publishLive !== "function") return; + const liveRound = roundIsTimed() && matchName ? matchName : ""; + if (liveRound) { + if (sessionAnnouncedRound === liveRound) return; + sessionAnnouncedRound = liveRound; + try { + publishLive("ow-" + sessionName, + JSON.stringify(spectatorState(now, "ow-" + liveRound))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } + return; + } + sessionAnnouncedRound = ""; + if (now < sessionNextAt) return; + sessionNextAt = now + sessionSnapshotIntervalUs; + try { + publishLive("ow-" + sessionName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +function inputCommand(pad) { + const input = quantizedInput(pad); + let mask = 0; + if (input.horizontal < 0) mask |= 1; + if (input.horizontal > 0) mask |= 2; + if (input.vertical > 0) mask |= 4; + if (input.vertical < 0) mask |= 8; + for (let index = 4; index < replayButtons.length; index++) + if (pad.down.includes(replayButtons[index])) mask |= 1 << index; + return mask; +} + +function recordReplayCommands(now, inputs = padSnapshots) { + if (!replay) return; + for (let pad = 0; pad < players.length; pad++) { + const command = players[pad].npc && !players[pad].bot + ? 0 : inputCommand(inputs[pad]); + if (command !== replayLastCommand[pad]) { + replay.commands.push([demoTick(now), pad, command]); + replayLastCommand[pad] = command; + } + } +} + +function replayFlags(player) { + // Bit 12 carries which way the fighter faces. Older demos lack it, so a + // replay treats "no facing bits" as "guess from velocity" — bit 13 marks + // that the pair below is real rather than an old demo's zero. + return (player.alive ? 1 : 0) | (player.grounded ? 2 : 0) | + (player.ducking ? 4 : 0) | (player.blocking ? 8 : 0) | + [...limbParts, "torso"].reduce((flags, part, index) => + flags | (hasPart(player, part) ? 0 : 1 << (index + 4)), 0) | + (player.facing > 0 ? 4096 : 0) | 8192 | + (player.hit > .05 ? 16384 : 0) | (player.blockFlash > .05 ? 32768 : 0); +} + +function recordReplayCheckpoint(now, force = false) { + if (!replay || (!force && now < replayNextCheckpointAt)) return; + replayNextCheckpointAt = now + replayCheckpointUs(); + const values = [demoTick(now)]; + for (const player of players) values.push( + Math.round(player.x), Math.round(player.y), Math.round(player.z), + Math.round(player.vx), Math.round(player.vy), replayFlags(player), + player.score, player.roundWins); + values.push(Math.round(ball.x), Math.round(ball.y), Math.round(ball.z), + Math.round(ball.vx), Math.round(ball.vy), ball.active ? 1 : 0, + Math.round(cameraCenter), Math.round(cameraCenterY), Math.round(cameraWidth)); + // The full camera pose rides along so a replay can stand the lens exactly + // where the live pass stood it — re-deriving position from width parks the + // camera inside close shots and near-clips the bodies it came to frame. + values.push(Math.round(cameraDoll.position.x), + Math.round(cameraDoll.position.y), Math.round(cameraDoll.position.z), + cameraDoll.perspective || 0, cameraDoll.fov || 55, cameraDoll.roll || 0); + replay.checkpoints.push(values); + // Dense demos also carry every impact the fight spawned, so the repaint + // can put the sparks and debris back instead of only moving bodies. + if (replayCheckpointUs() < 100000) for (const impact of impacts) + if (!impact.recordedTick) { + impact.recordedTick = demoTick(now) + 1; + replay.impacts?.push([demoTick(now), Math.round(impact.x), + Math.round(impact.y), Math.round(impact.z || 0), + impact.death ? 1 : impact.explosion ? 2 : 0, + Math.round((impact.duration || .3) * 1000)]); + } +} + +function makeRoundReplayFrame(now) { + const poseTime = (now - startedAt) / 1000000; + return { + ropes: structuredClone(skateRopes), + players: players.map((player) => ({ + x: player.x, y: player.y, z: player.z, + vx: player.vx, vy: player.vy, vz: player.vz, + facing: player.facing, grounded: player.grounded, + ducking: player.ducking, alive: player.alive, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, skateboard: player.skateboard, + blocking: player.blocking, blockFlash: player.blockFlash, hit: player.hit, + attackKind: player.attackKind, + attackStartedOffset: player.attackStartedAt - now, + attackUntilOffset: player.attackUntil - now, + geometry: runnerWorldGeometry(player, poseTime), + })), + ball: { x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, + active: ball.active }, + balls: balls.map((item) => ({ x: item.x, y: item.y, z: item.z, + vx: item.vx, vy: item.vy, active: item.active })), + camera: { center: cameraCenter, centerY: cameraCenterY, width: cameraWidth }, + }; +} + +function captureRoundReplay(now, force = false) { + if (!INSTANT_REPLAY) return; + if (!force && now - roundReplayLastAt < instantReplayStepUs) return; + roundReplayLastAt = now; + roundReplayFrames.push(makeRoundReplayFrame(now)); + while (roundReplayFrames.length > instantReplayMaxFrames) + roundReplayFrames.shift(); +} + +const frameTelemetrySchema = ["us", "cameraX", "cameraY", "cameraWidth", + "dollX", "dollY", "dollZ", "targetX", "targetY", "targetZ", + "dollWidth", "roll", "p1x", "p1y", "p1z", "p1vx", "p1vy", + "p2x", "p2y", "p2z", "p2vx", "p2vy"]; + +function captureFrameTelemetry(now, force = false) { + if (netSilent || selecting || shellMode === "MENU") return; + const round = (value) => Math.round(Number(value || 0) * 100) / 100; + frameTelemetry.push([ + Math.round(now - roundStartedAt), round(cameraCenter), round(cameraCenterY), + round(cameraWidth), round(cameraDoll.position.x), round(cameraDoll.position.y), + round(cameraDoll.position.z), round(cameraDoll.target.x), + round(cameraDoll.target.y), round(cameraDoll.target.z), + round(cameraDoll.width), round(cameraDoll.roll), + ...players.flatMap((player) => [round(player.x), round(player.y), + round(player.z), round(player.vx), round(player.vy)]), + ]); + if (!force && now < frameTelemetryFlushAt) return; + telemetry("FIGHT_TRACE", JSON.stringify({ + format: "ac.oskiewar.frames", version: 1, round: "ow-" + matchName, + schema: freeForAll() ? [...frameTelemetrySchema, "p3x", "p3y", "p3z", "p3vx", "p3vy"] + : frameTelemetrySchema, frames: frameTelemetry, + })); + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; +} + +function applyRoundReplayFrame(frame, now) { + if (frame.ropes) skateRopes.splice(0, skateRopes.length, ...structuredClone(frame.ropes)); + for (let index = 0; index < players.length; index++) { + const player = players[index]; + const state = frame.players[index]; + for (const key of ["x", "y", "z", "vx", "vy", "vz", "facing", + "grounded", "ducking", "alive", "blocking", "blockFlash", "hit", + "attackKind", "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) player[key] = state[key]; + player.attackStartedAt = now + state.attackStartedOffset; + player.attackUntil = now + state.attackUntilOffset; + player.replayGeometry = state.geometry; + } + const frameBalls = frame.balls || [frame.ball]; + for (let index = 0; index < balls.length; index++) { + const state = frameBalls[index]; + if (!state) continue; + for (const key of ["x", "y", "z", "vx", "vy", "active"]) + balls[index][key] = state[key]; + } + cameraCenter = frame.camera.center; + cameraCenterY = frame.camera.centerY; + cameraWidth = frame.camera.width; +} + +function finishInstantReplay(now) { + if (!instantReplay) return; + applyRoundReplayFrame(instantReplay.endFrame, now); + for (const player of players) delete player.replayGeometry; + instantReplay = null; + roundOverAt = now; + replayOfferPrevious = padSnapshots[0]?.down?.slice() || []; +} + +// A replay is worth watching at the speed the eye needs, not the speed the +// clock kept. Frames already record what a hit looks like, so the playhead can +// read its own footage and slow itself into the action rather than being told +// where the action is — which means every replay already in the store gets +// this without being re-recorded. +function frameAction(frame) { + let action = 0; + for (const player of frame.players) { + if (!player.alive) action = Math.max(action, 1); + if (player.hit) action = Math.max(action, 1); + if (player.blockFlash > 0) action = Math.max(action, .7 * player.blockFlash); + // A swing that has started but not yet landed is the part worth stretching. + if (player.attackKind && player.attackUntilOffset > 0) + action = Math.max(action, .35); + } + return action; +} + +// Look ahead, so the ramp is already down by the time the punch arrives. A +// slowdown that begins on the frame of impact has missed the impact. +function replayActionCurve(frames) { + const raw = frames.map(frameAction); + return raw.map((_, index) => { + let peak = 0; + for (let at = index; at < Math.min(raw.length, index + replayActionLead); at++) + peak = Math.max(peak, raw[at] * (1 - (at - index) / replayActionLead * .35)); + return peak; + }); +} + +// One step of the speed ramp, kept pure so it can be tested and so the demo +// viewer can share it when its playhead learns to accumulate. Easing rather +// than snapping — and capping how far the speed may travel per second of real +// time — is what keeps a dense run of hits reading as one long stretch rather +// than a stutter. +function replayRampStep(speed, action, elapsedSeconds) { + const target = lerp(1, replaySlowest, clamp(action, 0, 1)); + return speed + (target - speed) * + Math.min(1, Math.max(0, elapsedSeconds) * replayRampPerSecond); +} + +function startInstantReplay(now) { + if (!INSTANT_REPLAY) return false; + if (roundReplayFrames.length < 2) return false; + const frames = roundReplayFrames.slice(); + instantReplay = { frames, cursor: 0, lastAt: now, paused: false, + previous: padSnapshots[0]?.down?.slice() || [], + action: replayActionCurve(frames), speed: 1, + endFrame: frames[frames.length - 1] }; + impacts.length = 0; + detachedParts.length = 0; + applyRoundReplayFrame(frames[0], now); + telemetry("ROUND_REPLAY", "start frames=" + frames.length); + return true; +} + +function updateInstantReplay(now, dt) { + if (!instantReplay) return; + const down = padSnapshots[0]?.down || []; + const pressed = (button) => down.includes(button) && + !instantReplay.previous.includes(button); + if (pressed("B")) { + finishInstantReplay(now); + return; + } + if (pressed("A")) instantReplay.paused = !instantReplay.paused; + if (pressed("ArrowLeft") || pressed("ArrowRight")) { + instantReplay.paused = true; + instantReplay.cursor += pressed("ArrowLeft") ? -15 : 15; + } + const elapsed = Math.max(0, now - instantReplay.lastAt) / 1000000; + instantReplay.speed = replayRampStep(instantReplay.speed, + instantReplay.action?.[Math.floor(instantReplay.cursor)] || 0, elapsed); + if (!instantReplay.paused) + instantReplay.cursor += (now - instantReplay.lastAt) / + instantReplayStepUs * instantReplay.speed; + instantReplay.lastAt = now; + instantReplay.cursor = clamp(instantReplay.cursor, 0, + instantReplay.frames.length); + if (instantReplay.cursor >= instantReplay.frames.length) { + finishInstantReplay(now); + return; + } + applyRoundReplayFrame(instantReplay.frames[Math.floor(instantReplay.cursor)], now); + instantReplay.previous = down.slice(); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter - cameraWidth * .06, + y: cameraCenterY - cameraWidth * .04, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: 0, fov: 55 }, dt, 18); +} + +// A finished round in a rollback fight is not finished yet: the frames that +// ended it are still inside the rollback window, and a rival pad arriving late +// can take the knockout back. So the round is marked and filed later, from +// netTick, once both seats have confirmed past its end. A re-simulation +// reaches this line again and simply re-marks the frame. +function saveRoundReplay(now) { + if (!replay) return; + if (netSession) { replayPendingSaveFrame = netSession.frame; return; } + uploadRoundReplay(now); +} + +// Everything that is waiting, filed now whatever the wire is doing. A rival +// who has gone will never confirm anything, and the round they lost still +// happened. +function flushPendingRoundReplay(now) { + if (replayPendingSaveFrame < 0 || !replay) return; + replayPendingSaveFrame = -1; + uploadRoundReplay(now); + if (matchOver) finishReplay(); +} + +function uploadRoundReplay(now) { + if (!replay || workshopTainted) return; + recordReplayCheckpoint(now, true); + const demo = JSON.parse(JSON.stringify(replay)); + demo.matchId = "ow-" + matchName; + demo.matchName = matchName; + demo.roundId = demo.matchId; + demo.roundName = matchName; + demo.roundIndex = Math.max(0, replay.roundIds.length - 1); + // Read off the ledger rather than off `previousRoundName`, so a rollback + // that took a rollover back cannot leave the linkage pointing at a round + // that no longer exists. + demo.previousRoundId = demo.roundIndex > 0 + ? replay.roundIds[demo.roundIndex - 1] : ""; + demo.durationTicks = demoTick(now); + // The names as they were when the round was PLAYED. `replay.fighters` was + // taken when the series opened, which in a versus fight is before the deal + // has dressed either seat — so the winner below could be somebody the demo + // never listed, and the store refused the round with "Invalid winner". + demo.fighters = players.map((player) => player.name); + demo.nations = players.map((player) => player.nation || ""); + demo.winner = players[0].score === players[1].score ? null + : players[0].score > players[1].score ? players[0].name : players[1].name; + demo.finalRoundWins = players.map((player) => player.roundWins); + delete demo.startedMonotonicUs; + const payload = JSON.stringify(demo); + // A dense reel demo is fat by design and never leaves the local shell; the + // half-megabyte gate is for demos headed to the production store. + const payloadLimit = globalThis.__oskiewarDenseReplay ? 8388608 : 524288; + if (payload.length <= payloadLimit && typeof saveReplay === "function") { + const upload = saveReplay(payload); + // Only promise-returning hosts can prove the upload completed. The web + // host does; older native hosts keep saving silently until they adopt the + // same acknowledgement contract. + if (upload && typeof upload.then === "function") + upload.then((saved) => { + if (saved !== true) return; + playDrum("modem", .72, 0); + telemetry("REPLAY", "uploaded " + demo.roundId); + }).catch((error) => telemetry("REPLAY", "upload-error " + error.message)); + telemetry("REPLAY", "queued " + demo.roundId + " bytes=" + payload.length); + } else telemetry("REPLAY", "not-saved bytes=" + payload.length); +} + +function finishReplay() { + if (replayPendingSaveFrame >= 0 && replay) { + replayPendingSaveFrame = -1; + uploadRoundReplay(runtime().monotonicUs); + } + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = null; +} + +function emitSignal(event, player = -1, value = 0, value2 = 0) { + // Filed first, and filed even while re-simulating: a rollback truncated + // these rows and the silent pass is what puts the corrected ones back. What + // the silence is for is the PERFORMANCE below — nobody hears a frame twice. + if (replay) replay.events.push([demoTick(runtime().monotonicUs), event, + player, Math.round(value * 1000) / 1000, Math.round(value2 * 1000) / 1000]); + if (netSilent) return; + if (typeof gameSignal === "function") gameSignal(event, player, value, value2); +} + +// Revision 37 exposes native bell/woosh voices in the mixer but its QuickJS +// allowlist predates those names. Fall back without stopping the match; newer +// hosts and the browser still receive the authored voice unchanged. +function playDrum(name, velocity = 1, pan = 0) { + if (performanceStageActive()) return; + if (netSilent || typeof drum !== "function") return; + try { + drum(name, velocity, pan); + } catch (error) { + if (name !== "bell" && name !== "whoosh") throw error; + if (name === "bell" && typeof synth === "function") { + try { synth(880, .12); } catch (_) {} + } + try { + drum(name === "bell" ? "hat" : "block", velocity * .65, pan); + } catch (_) {} + } +} + +function playSine(frequency, duration = .12) { + if (performanceStageActive()) return; + if (netSilent || typeof synth !== "function") return; + try { synth(frequency, duration); } catch (_) {} +} + +let clientError = ""; +let clientErrorDetail = null; +let clientErrorAt = -1; +let clientErrorQr = null; +let clientErrorDumpUrl = ""; + +function clientStateDump() { + try { + const run = runtime(); + return { + build: "v" + buildVersion, + shell: shellMode, + round: { + id: matchName || "local", + result: roundResult || "active", + elapsedMs: Math.round(roundElapsedUs / 1000), + }, + runtime: { + sim: Number(run?.simCount || 0), + paint: Number(run?.paintCount || 0), + unixMs: Number(run?.unixMs || 0), + }, + camera: { + x: Math.round(cameraCenter), y: Math.round(cameraCenterY), + width: Math.round(cameraWidth), aspect: Math.round(cameraAspect * 1000) / 1000, + }, + players: players.map((player) => ({ + handle: player.name, stance: player.stance, alive: player.alive, + x: Math.round(player.x), y: Math.round(player.y), z: Math.round(player.z), + vx: Math.round(player.vx), vy: Math.round(player.vy), + input: [player.inputX, player.inputY], + removed: player.removedParts?.slice() || [], + })), + balls: balls.filter((item) => item.active).map((item) => ({ + type: item.type, x: Math.round(item.x), y: Math.round(item.y), + vx: Math.round(item.vx), vy: Math.round(item.vy), heldBy: item.heldBy, + })), + }; + } catch (error) { + return { dumpError: String(error?.message || error || "state unavailable") }; + } +} + +function errorNowUs() { + try { + const value = Number(runtime()?.monotonicUs); + if (Number.isFinite(value)) return value; + } catch (_) {} + return 0; +} + +// btoa only speaks latin-1, so the dump flattens to ASCII before encoding. +function base64Url(text) { + if (typeof btoa !== "function") return ""; + return btoa(String(text).replace(/[^\x20-\x7e]/g, "?")) + .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +// The QR carries the entire dump in its own URL, so a crash stays shareable +// even when the console never managed to post its report. Fat fields drop +// away until the payload fits a code that is still scannable off a TV. +function buildClientErrorDump(detail) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + const stack = String(detail.stack || "").split(/\r?\n/).slice(0, 4) + .map((line) => line.trim()).filter(Boolean).join(" | ").slice(0, 240); + for (const trace of [stack, ""]) { + const url = errorDumpBase + base64Url(JSON.stringify({ + v: 1, p: detail.phase, n: detail.name, m: detail.message, + src: detail.source, k: trace || undefined, s: detail.state, + })); + if (url.length <= 2048 && typeof qrcode === "function") { + try { + clientErrorQr = qrcode(url, { errorCorrectLevel: 1 }); + clientErrorDumpUrl = url; + return; + } catch (_) {} + } + } +} + +function errorRestartSeconds() { + if (clientErrorAt < 0) return 0; + return Math.max(0, + Math.ceil((errorRestartUs - (errorNowUs() - clientErrorAt)) / 1000000)); +} + +// A crashed console should not sit on a dead screen forever. The error holds +// long enough to read and scan, then the piece boots itself again. +function restartAfterClientError() { + if (clientErrorAt < 0 || errorNowUs() - clientErrorAt < errorRestartUs) return; + clientError = ""; + clientErrorDetail = null; + clientErrorAt = -1; + clientErrorQr = null; + clientErrorDumpUrl = ""; + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + try { telemetry("SHELL", "error->restart"); } catch (_) {} + boot(); +} + +function errorSource(stack) { + const match = String(stack || "").match( + /(?:\(|\s|^)((?:[a-z]+:\/\/)?[^\s()]+):(\d+):(\d+)\)?/i); + return match ? { file: match[1], line: Number(match[2]), column: Number(match[3]) } + : null; +} + +function captureClientError(phase, error) { + if (clientErrorDetail) return; + const stack = error?.stack ? String(error.stack) : ""; + const message = error?.message ? String(error.message) + : String(error || "unknown error"); + const name = String(error?.name || "Error"); + const state = clientStateDump(); + clientErrorDetail = { + phase: String(phase || "runtime"), name, message, stack, + source: errorSource(stack), state, + reportStatus: "queued for server", + }; + const detail = stack || (name + ": " + message); + clientError = (clientErrorDetail.phase + ": " + detail) + .replace(/[^\x20-\x7e]+/g, " ").replace(/\s+/g, " ").trim(); + clientErrorAt = errorNowUs(); + try { buildClientErrorDump(clientErrorDetail); } catch (_) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + } + try { + telemetry("CLIENT_ERROR", JSON.stringify({ + phase: clientErrorDetail.phase, name, message, stack, + source: clientErrorDetail.source, state, + })); + } catch (_) { + clientErrorDetail.reportStatus = "local report only"; + } +} + +function clientErrorLines(text, limit = 58) { + const words = String(text).split(" "); + const lines = []; + let line = ""; + for (let word of words) { + if (word.length > limit) { + if (line) { lines.push(line); line = ""; } + while (word.length > limit) { + lines.push(word.slice(0, limit)); + word = word.slice(limit); + } + if (!word) continue; + } + if (!line) line = word; + else if (line.length + word.length + 1 <= limit) line += " " + word; + else { lines.push(line); line = word; } + } + if (line) lines.push(line); + return lines.slice(0, 9); +} + +function errorTypeWrite(text, x, y, size, ...color) { + try { + typeWrite(text, x, y, size, ...color); + } catch (_) { + // Error reporting must survive a font renderer failure of its own. + try { systemWrite(String(text).toLowerCase(), x, y, size, ...color); } + catch (_) {} + } +} + +// Diagnostic lines are dense, so every token gets its own ink: handles read as +// people, numbers as measurements, units as scale, and the rest as labels. +const dumpUnits = new Set(["px", "ms", "us", "fps", "vx", "vy", "vz", "in", + "stk", "pos", "vel", "t", "pts"]); + +function dumpTokens(text) { + return String(text).match(/@[a-z0-9_]+|[-+]?\d*\.?\d+|[a-z]+|\s+|./gi) || []; +} + +function dumpTokenInk(token) { + if (token[0] === "@") return [255, 126, 205]; + if (/^[-+]?[\d.]+$/.test(token)) return [116, 255, 184]; + if (/^[a-z]+$/i.test(token)) return dumpUnits.has(token.toLowerCase()) + ? [255, 205, 74] : [188, 204, 230]; + return [112, 234, 255]; +} + +function writeTokens(write, text, x, y, size) { + let cursor = x; + for (const token of dumpTokens(text)) { + if (token.trim()) write(token, cursor, y, size, ...dumpTokenInk(token)); + cursor += handleWidth(token, size); + } +} + +const writeDumpLine = (text, x, y, size) => + writeTokens(errorTypeWrite, text, x, y, size); + +// The HUD sits over sky and ground, so each token carries its own contrast +// shadow the way a handle glyph does. +function writeHudLine(text, x, y, size) { + writeTokens((token, tx, ty, ts, ...color) => + typeWrite(token, tx + 3, ty + 4, ts, ...runShadow(color)), + text, x, y, size); + writeTokens(typeWrite, text, x, y, size); +} + +function errorReportStatus() { + try { + const status = String(runtime()?.clientErrorReportStatus || "").trim(); + if (status) return status; + } catch (_) {} + return clientErrorDetail?.reportStatus || "queued for server"; +} + +function stateDumpRows(state) { + if (!state) return [{ icon: "mode", text: "state unavailable" }]; + if (state.dumpError) + return [{ icon: "mode", text: "state unavailable: " + state.dumpError }]; + const playerRow = (player, index) => ({ icon: "player", + text: "p" + (index + 1) + " " + player.handle + " " + + player.stance.toLowerCase() + " pos " + player.x + "," + player.y + + "," + player.z + " vel " + player.vx + "," + player.vy + + (player.removed?.length ? " lost " + player.removed.join(",") : "") }); + return [ + { icon: "build", text: "build " + state.build }, + { icon: "mode", text: "mode " + state.shell.toLowerCase() + + " round " + state.round.id + " " + state.round.result.toLowerCase() + + " " + state.round.elapsedMs + "ms" }, + { icon: "camera", text: "camera " + state.camera.x + "," + state.camera.y + + " width " + state.camera.width + " aspect " + state.camera.aspect }, + ...(state.players || []).map(playerRow), + { icon: "ball", text: "balls " + (state.balls || []).map((ball) => + ball.type + "@" + ball.x + "," + ball.y + " v" + ball.vx + "," + ball.vy) + .join(" ") }, + ]; +} + +const dumpIconInk = { build: [116, 128, 156], mode: [255, 205, 74], + camera: [112, 214, 255], player: [206, 166, 255], ball: [116, 255, 184] }; + +function drawDumpIcon(kind, x, y, size) { + const ink = dumpIconInk[kind] || [112, 234, 255]; + const unit = Math.max(2, Math.round(size / 9)); + try { + if (kind === "build") + for (let row = 0; row < 3; row++) + hudBox(x, y + row * unit * 3, size - row * unit * 2, unit * 2, ...ink); + else if (kind === "camera") { + strokeBox(x, y + unit, size, size - unit * 2, unit, ink); + hudBox(x + unit * 3, y + unit * 3, size - unit * 6, size - unit * 6, ...ink); + } else if (kind === "player") { + hudBox(x + unit * 2, y, size - unit * 4, unit * 3, ...ink); + hudBox(x, y + unit * 4, size, size - unit * 4, ...ink); + } else if (kind === "ball") { + hudBox(x + unit * 2, y, size - unit * 4, size, ...ink); + hudBox(x, y + unit * 2, size, size - unit * 4, ...ink); + } else strokeBox(x, y, size, size, unit, ink); + } catch (_) {} +} + +// Sized for a phone pointed at a television, so modules stay chunky and the +// state dump wraps narrower to keep clear of the code. +function errorQrGeometry(width, height) { + if (!clientErrorQr || typeof clientErrorQr.getModuleCount !== "function") + return null; + const count = clientErrorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor(Math.min(width * .3, height * .52) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + return { count, quiet, cell, size, + left: width - 92 - size, top: height - 96 - size }; +} + +// Drawn with raw boxes rather than the projected screenRect the HUD uses — +// the triangle pipeline is exactly what may have just died. Dark modules +// coalesce into horizontal runs so a full code stays a few hundred draws. +function drawErrorQr(qr) { + if (!qr) return; + hudBox(qr.left, qr.top, qr.size, qr.size, 250, 250, 247); + for (let row = 0; row < qr.count; row++) { + let run = 0; + for (let column = 0; column <= qr.count; column++) { + if (column < qr.count && clientErrorQr.isDark(row, column)) { run++; continue; } + if (run) hudBox(qr.left + (column - run + qr.quiet) * qr.cell, + qr.top + (row + qr.quiet) * qr.cell, run * qr.cell, qr.cell, 7, 8, 14); + run = 0; + } + } +} + +// Same two-digit face as the round timer, reddening as the restart lands. +function drawErrorCountdown(width) { + const remaining = errorRestartSeconds(); + const text = String(Math.min(99, remaining)).padStart(2, "0"); + const danger = remaining <= 10; + const shake = danger + ? Math.sin(errorNowUs() / 1000000 * 35) * (11 - remaining) * .45 : 0; + let textWidth = 64; + try { textWidth = handleWidth(text, 52); } catch (_) {} + errorTypeWrite(text, width - 92 - textWidth + shake, 82, 52, + ...(danger ? [255, 92, 116] : [255, 205, 74])); +} + +function drawClientError() { + let width = 1920; + let height = 1080; + try { + const view = typeof gameView === "function" ? gameView() : null; + if (view && Number.isFinite(view.width)) width = view.width; + if (view && Number.isFinite(view.height)) height = view.height; + } catch (_) {} + const detail = clientErrorDetail || { + phase: "runtime", name: "Error", message: clientError, + stack: "", source: null, state: null, + }; + const qr = errorQrGeometry(width, height); + wipe(7, 9, 18); + box(48, 48, width - 96, height - 96, 30, 14, 27); + errorTypeWrite("the game needs a moment", 92, 82, 52, 255, 92, 116); + drawErrorCountdown(width); + errorTypeWrite("restarting safely", 94, 158, 31, 255, 205, 74); + const messageLines = clientErrorLines(detail.message, 66).slice(0, 2); + for (let index = 0; index < messageLines.length; index++) + errorTypeWrite(messageLines[index], 94, 226 + index * 42, + 31, 248, 244, 255); + let cursorY = 226 + messageLines.length * 42 + 28; + if (detail.source) { + errorTypeWrite("source", 94, cursorY, 29, 112, 234, 255); + errorTypeWrite(detail.source.file, 214, cursorY, 29, 190, 216, 255); + errorTypeWrite("line " + detail.source.line + " column " + detail.source.column, + Math.min(width - 430, 214 + detail.source.file.length * 17), cursorY, + 29, 116, 255, 184); + cursorY += 48; + } + errorTypeWrite("state dump", 94, cursorY, 29, 116, 255, 184); + cursorY += 42; + for (const row of stateDumpRows(detail.state).slice(0, 6)) { + let leading = true; + for (const wrapped of clientErrorLines(row.text, qr ? 68 : 78).slice(0, 2)) { + if (cursorY > height - 196) break; + if (leading) drawDumpIcon(row.icon, 94, cursorY + 4, 22); + writeDumpLine(wrapped, 132, cursorY, 27); + cursorY += 36; + leading = false; + } + } + drawErrorQr(qr); + if (qr) errorTypeWrite("scan to share this dump", + qr.left, qr.top - 42, 27, 116, 255, 184); + const report = errorReportStatus(); + const posted = report.startsWith("posted"); + errorTypeWrite(report, 94, height - 150, 30, + ...(posted ? [116, 255, 184] : [255, 205, 74])); + errorTypeWrite("relaunch or deploy an update", 94, height - 104, + 30, 190, 202, 230); +} + +function drawClientErrorFallback() { + try { wipe(7, 9, 18); } catch (_) {} + try { systemWrite("aesthetic.computer error", 72, 72, 48, 255, 92, 116); } catch (_) {} + try { systemWrite(errorReportStatus(), 72, 146, 30, 255, 205, 74); } catch (_) {} + try { + systemWrite("restart in " + errorRestartSeconds() + "s", 72, 200, 30, + 255, 205, 74); + } catch (_) {} +} + +function fighterProfile(handle) { + const live = Array.isArray(acFeed.fighters) + ? acFeed.fighters.find((profile) => profile.handle.toUpperCase() === handle.toUpperCase()) + : null; + const fallback = handle === "DUMMY" ? npcFighter + : handle === "SPIDERDUMMY" ? spiderDummyFighter + : handle === "BOT" ? botFighter + : selfPlayFighters.find((profile) => profile.handle === handle) || + fighterRoster.find((profile) => profile.handle === handle); + return { + mood: live?.mood || (handle === "@JEFFREY" && acFeed.moodHandle === "@jeffrey" + ? acFeed.mood : "") || fallback?.mood || "", + lastChat: live?.lastChat || fallback?.lastChat || "", + colors: live?.colors?.length + ? live.colors.map((color) => [color.r, color.g, color.b]) + : fallback?.colors || [], + }; +} + +function syncSignedInFighter() { + if (localVersusActive()) return; + const identity = acFeed?.player; + if (!identity?.handle || players[0].npc) return; + const handle = String(identity.handle).toUpperCase(); + if (players[0].name !== handle) players[0].name = handle; + const colors = Array.isArray(identity.colors) + ? identity.colors.map((color) => Array.isArray(color) + ? color.slice(0, 3) : [color.r, color.g, color.b]) + .filter((color) => color.every(Number.isFinite)) : []; + if (colors.length) { + players[0].handleColors = colors; + players[0].color = colors.reduce((sum, color) => sum.map((value, index) => + value + color[index] / colors.length), [0, 0, 0]).map(Math.round); + } +} + +function applyRoster(player, index) { + if (localVersusActive()) { + player.rosterIndex = [0, 2, 1][player.pad]; + player.name = "PLAYER " + (player.pad + 1); + player.color = fighterRoster[player.rosterIndex].color.slice(); + player.handleColors = []; + return; + } + if (player.npc) { + const fighter = selfPlay && player.bot ? selfPlayFighters[player.pad] + : player.bot ? botFighter + : player.spiderDummy ? spiderDummyFighter : npcFighter; + player.rosterIndex = -1; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = fighter.colors; + if (selfPlay && player.bot) { + // The color IS the nameplate: a self-play bot is called what it wears, + // so the card reads "CORAL WINS ROUND" and the demo carries the color + // name out to any replay that wants to dress the fighter again. The + // harness may force the first seat's color by name for a proof bout. + const forcedName = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const forcedWorn = player.pad === 0 && forcedName && + cssColorBook.find((entry) => entry.name === forcedName); + const dressed = forcedWorn || selfPlayWardrobe(player.pad); + player.color = dressed.rgb.slice(); + player.colorName = dressed.name; + player.name = dressed.name.toUpperCase(); + } + return; + } + if (player.pad === 0 && !acFeed?.player?.handle) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + // A test harness may dress the anonymous seat by CSS color name — + // "YELLOW vs DUMMY" is a scripted sonic and orientation proof, so the + // fighter's look has to be as reproducible as the fight. + const forced = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const worn = forced && cssColorBook.find((entry) => entry.name === forced); + if (worn) { + player.name = worn.name.toUpperCase(); + player.color = worn.rgb.slice(); + player.handleColors = []; + } + return; + } + // A negative index means there is no roster fighter here — an anonymous + // seat, or a remote one whose handle has not arrived. It used to wrap: -1 + // came out as the LAST roster entry, so an unnamed chair was dressed as a + // real person, and `Math.max(0, rosterIndex)` at the two versus callers + // floored it to the FIRST one instead. Between them an anonymous fight read + // as @JEFFREY against @SAT. Nobody is nobody. + if (index < 0) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + return; + } + const rosterIndex = index % fighterRoster.length; + const fighter = fighterRoster[rosterIndex]; + const profile = fighterProfile(fighter.handle); + player.rosterIndex = rosterIndex; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = profile.colors; +} + +// The one door into a fight. Training is free and anonymous — it is the front +// door and must never ask for anything, and `trainingbot` is that door's +// sparring partner: the bot's brain in a round that stays off the wire. Bot +// and ppl are what a handle buys, because they persist: a series, a published +// match, a replay, a ranking. Nothing opens those two doors yet, so only +// training reaches here and this call asks for nothing. +// +// The seam the sign-in actually landed on is `versusAllowed()`, because versus +// is the door that opened first: see `startVersusFight`. When bot and ppl open, +// they gate here on the same reader. +function startFightAgainst(kind, now) { + if (kind !== "local") setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + players[0].spawnX = tileCenterX(spawnColLeft); + players[1].spawnX = tileCenterX(spawnColRight); + if (players[2]) players[2].spawnX = tileCenterX((spawnColLeft + spawnColRight) / 2); + const opponent = players[1]; + fightOpponent = kind; + opponent.npc = kind === "dummy" || kind === "spiderdummy" || + kind === "bot" || kind === "trainingbot"; + opponent.bot = kind === "bot" || kind === "trainingbot"; + opponent.spiderDummy = kind === "spiderdummy"; + opponent.remote = false; + // Pad two is @OSKIE until ppl arrives carrying a handle of its own. + applyRoster(opponent, opponent.npc ? -1 : 2); + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + startReplay(now); + resetRound(now, true); + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +function survivalRequested() { + // The climb is a door asked for by name, and only by name. It used to be + // the empty door on any shell that could not raise the versus flag — the + // native consoles, whose publisher reads the relay and discards — which + // left the Xbox opening on the climb every boot. @jeffrey, on the console: + // "i dont like the climbing mode / map ... i want it in vs / dummy mode". + // So where versus cannot happen the empty door is the training fight + // (`beginTraining`, a sparring partner on the floor), the same landing the + // web gets when the relay is out of reach. + return String(globalThis.__oskiewarOpponent || "") + .trim().toLowerCase() === "survival"; +} + +const localVersusActive = () => fightOpponent === "local"; +// The web shell marks a pad `localController` when a physical gamepad is +// behind it; the console's pad object (QuickJsEngine PadObject) never +// carried the field, so `localControllerPair()` was false on the Xbox with +// three controllers plugged in and the dummy's chair never went to player +// two — @jeffrey, 2026-09-20: "it only sees one controller hmm". The native +// pad object carries no name or id either (PadObject: index, connected, +// sticks, triggers, down). What the console does have is `controllers()`, +// its enumeration of real hardware — a pad whose index sits inside that +// list is a local controller. The test harness stubs `gamepad` with two +// always-connected pads and defines no `controllers`, so its fights stay +// what they were; "connected" alone turned every harness fight into local +// versus (131 tests). +let nativeControllerCount = 0; +let nativeControllerPolls = 0; +function samplePad(index) { + let pad; + try { pad = gamepad(index); } catch (error) { + if (index < 2) throw error; + } + if (!pad) pad = { connected: false, down: [], leftX: 0, leftY: 0 }; + if (pad && pad.localController === undefined && pad.connected === true && + typeof controllers === "function") { + // Re-enumerate about twice a second; a pad joining mid-title waits at + // most that long for its chair. + if (index === 0 && nativeControllerPolls++ % 30 === 0) + nativeControllerCount = controllers().length; + if (index < nativeControllerCount) pad.localController = true; + } + return pad; +} +const localControllerPair = () => + padSnapshots.slice(0, 2).every((pad) => pad?.localController === true); +let localControllerPairSeen = false; +let localControllerMissing = -1; + +function startLocalVersus(now) { + finishReplay(); + fightOpponent = "local"; + setLocalPlayerCount(padSnapshots[2]?.localController === true ? 3 : 2); + telemetry("FIGHT_LOCAL_PLAYERS", String(players.length)); + for (const player of players) { + player.npc = false; + player.bot = false; + player.spiderDummy = false; + player.remote = false; + } + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + localControllerMissing = -1; + globalThis.__oskiewarVersusRoom = ""; + gameSpeed = 1; + startFightAgainst("local", now); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); +} + +function updateLocalVersus(now) { + const paired = localControllerPair(); + const arrived = paired && !localControllerPairSeen; + localControllerPairSeen = paired; + // A second local pad must never take over a remote fight or a recording. + if (roundViewer || netSession || selfPlay || resimActive || versusActive()) + return false; + if ((arrived && !localVersusActive()) || + (localVersusActive() && paired && players.length === 2 && + padSnapshots[2]?.localController === true)) startLocalVersus(now); + if (!localVersusActive()) { localControllerMissing = -1; return false; } + if (!paired || players.some((player) => + padSnapshots[player.pad]?.localController !== true)) { + localControllerMissing = padSnapshots.slice(0, players.length).findIndex( + (pad) => pad?.localController !== true); + return true; + } + if (localControllerMissing !== -1) { + localControllerMissing = -1; + // Restart the interrupted round with the match tally intact. Absolute + // attack/death timers cannot safely resume after an arbitrary unplug. + if (matchOver) startLocalVersus(now); + else resetRound(now, false, true); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); + } + return false; +} + +function versusRequested() { + return !String(globalThis.__oskiewarOpponent || "").trim() && + globalThis.__oskiewarVersusCapable === true; +} + +// --------------------------------------------------------------------------- +// The door. @jeffrey: "i think we should require users to axtually login in +// order to play... and also to make a handle in order to play". +// +// Training stays free and anonymous — it is the front door and must never ask +// for anything — and so does watching: the link a friend sends has to work for +// whoever opens it, account or no account. What a handle buys is the half of +// the game with another person on the other end of it, because that half is +// the half that persists. A fight against a stranger called RIVAL is not worth +// having; those placeholder names were the symptom, not the problem. +// +// The shell owns the account and the panel; this file owns the question of +// when the door is in the way. Two globals carry it: +// +// __oskiewarAccount { ready, signedIn, handle, colors } shell → game +// __oskiewarAccountDoor "" | "login" | "handle" game → shell +// The door is built, tested and wired on both sides, and it is held open until +// the tenant can actually let somebody through it. Native sign-in needs +// "Passwordless OTP" ticked on the Auth0 application, and as of 26.09.11 the +// tenant answers `unauthorized_client` — so the only way in is the redirect, +// which lands on the Universal Login page's Turnstile, which is the loop this +// whole flow exists to avoid. Requiring an account before there is a working +// way to make one does not gate the game, it closes it. +// +// Flip this to true the moment that grant is on. Everything behind it is +// already written and covered by tests, which drive it through +// `setVersusRequiresAccount`. +let versusRequiresAccount = false; + +const accountState = () => globalThis.__oskiewarAccount || null; +// Nobody is turned away before the shell has finished asking. A silent session +// check takes a moment, and a door that flashed up inside it would send a +// signed-in player off to sign in again. +const accountReady = () => accountState()?.ready === true; +const accountHandle = () => String(accountState()?.handle || ""); +// A shell with no account system at all is not a locked-out visitor, it is an +// older build, and it must not be left standing in a waiting room that can +// never start. The two halves of this door — the panel over there, the refusal +// here — ship together, and until the shell offers one there is nothing for +// this to hold shut. +// +// Which is the honest shape of it: this is a door, not a lock. The name on the +// wire has always been whatever the client says it is, and a console can set +// any global it likes. Enforcement would mean the relay verifying a token on +// the seat, and that is a different piece of work. +const versusAllowed = () => !versusRequiresAccount || !accountState() || + (accountReady() && accountState().signedIn === true && + Boolean(accountHandle())); + +// Which door, if any, stands between this visitor and a fight. Empty while the +// shell is still asking, and empty for anyone already through. +function versusDoor() { + if (!versusRequiresAccount) return ""; + if (!accountState() || !accountReady()) return ""; + if (accountState().signedIn !== true) return "login"; + if (!accountHandle()) return "handle"; + return ""; +} + +// Raised only while somebody is actually trying to play a person: standing in +// the waiting room, or holding a chair. A spectator is never asked for +// anything, and neither is the title screen. +// What this file last asked the shell for, so a panel that closes on its own +// can be told from one that was never open. +let accountDoorAsked = ""; + +function updateAccountDoor() { + const wanted = shellMode === "GAME" && versusLane() && !roundViewer + ? versusDoor() : ""; + const showing = globalThis.__oskiewarAccountDoor || ""; + // "never mind" drops every request the panel is holding, this one included. + // Left alone, the next frame would simply ask again and the panel would + // spring back up — which is not a dismissal, it is a trap. Somebody who + // backs out goes to the title screen instead, where the account button + // lives, where training is one press away, and where nothing is asking them + // for anything. + if (accountDoorAsked && wanted && !showing) { + accountDoorAsked = ""; + returnToTitle(runtime().monotonicUs, "account"); + return; + } + if (showing !== wanted) globalThis.__oskiewarAccountDoor = wanted; + accountDoorAsked = wanted; +} + +function startSurvivalRun(now, botControlled = false) { + gameMode = "survival"; + selfPlay = botControlled; + fightOpponent = "survival"; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + finishReplay(); + + const runner = players[0]; + runner.spawnX = centerX; + runner.npc = botControlled; + runner.bot = botControlled; + runner.spiderDummy = false; + applyRoster(runner, botControlled ? -1 : Math.max(0, runner.rosterIndex)); + + const absent = players[1]; + absent.spawnX = tileCenterX(cornerColRight); + absent.npc = true; + absent.bot = false; + absent.spiderDummy = false; + absent.remote = false; + applyRoster(absent, -1); + + resetRound(now, true); + absent.alive = false; + absent.respawnAt = Infinity; + absent.x = worldRight + gridWidth; + absent.y = floorY; + survivalStartedAt = now + survivalIntroDurationUs; + survivalLavaY = survivalLavaStart; + survivalHeight = 0; + survivalPeakLevel = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; + cameraWidth = survivalFrameWidth; + cameraContainFloor = 0; + cameraDoll.snap({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, + z: -survivalFrameWidth * 1.35 }, + width: survivalFrameWidth, perspective: 0, fov: 55, roll: 0 }); + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + pickup.active = false; + for (const item of balls) item.active = false; + emitSignal("survival", 0, 1, 0); +} + +// The title is a frozen first foothold, not an attract fight. START resets the +// runner and the lava together, so nobody loses a run beneath the wordmark. +function beginSurvival(now) { + setLocalPlayerCount(2); + startSurvivalRun(now, false); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - survivalIntroDurationUs; + survivalStartedAt = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; +} + +// Whatever you land on is already a live training fight; the wordmark simply +// floats over it. The intro countdown is spent before the first frame so +// somebody arriving from a QR code is moving, not watching a number. +function beginTraining(now) { + setLocalPlayerCount(2); + startFightAgainst(trainingOpponentKind(), now); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - roundIntroDurationUs(); + const forcedAttract = globalThis.__oskiewarAttractVariant; + titleAttractMode = forcedAttract === "still" || forcedAttract === "action" + ? forcedAttract : hashUnit(matchName) < .5 ? "still" : "action"; + if (titleAttractMode === "action") { + // The title demonstration is a bot working a training dummy, not two + // anonymous red bots. Preserve the dummy's cool neutral material so the + // matchup is legible before START is pressed. + players[0].npc = true; + players[0].bot = true; + players[0].spiderDummy = false; + applyRoster(players[0], -1); + players[1].npc = true; + players[1].bot = false; + players[1].spiderDummy = false; + applyRoster(players[1], -1); + } +} + +// The versus lobby: one fighter, an empty chair, and the address as the +// invitation. Everything a visitor can do here is practice — their own moves +// are named back at them — until the relay seats a rival, at which point +// updateVersusSeat opens the real fight. The empty chair is parked out past +// the wall the way survival parks it, so the camera, the scorekeeping and +// the reactions all read a one-body room. +function beginVersusLobby(now, { title = false } = {}) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus-lobby"; + finishReplay(); + seriesName = ""; + matchName = ""; + previousRoundName = ""; + if (!versusRoomName) versusRoomName = sessionName; + globalThis.__oskiewarVersusRoom = versusRoomName; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const chair = players[1]; + chair.spawnX = tileCenterX(spawnColRight); + chair.npc = true; + chair.bot = false; + chair.spiderDummy = false; + chair.remote = false; + applyRoster(chair, -1); + selecting = false; + shellMode = title ? "MENU" : "GAME"; + gameplayStarted = !title; + titleTransitionAt = null; + resetRound(now, true); + chair.alive = false; + chair.respawnAt = Infinity; + chair.x = worldRight + gridWidth; + chair.y = floorY; + // An empty chair wears no dummy's name — the wire calls it NOBODY. And the + // room forgets who was last in it, so the next person to sit down is dressed + // from their own offer rather than inheriting the last one's. + chair.name = ""; + versusRivalName = ""; + versusRivalOffered = ""; + // Spend the countdown before the first frame: arriving is moving, and + // there is nobody here to count in against anyway. + roundStartedAt = now - roundIntroDurationUs(); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + versusRoomName) : null; + emitSignal("versus-lobby", 0, 1, 0); +} + +// A rival took the chair. Seat them as a real second fighter — no bot brain, +// no npc stillness, their presses riding in off the relay — and open the +// round with the full countdown so both screens see the same three seconds. +function startVersusFight(now, resetMatch = true) { + // The one gate that matters: this is the call that puts two people in a + // round. Everything below it — publishing, the seat, the score — assumes + // both ends have a name worth writing down. + if (!versusAllowed()) return; + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus"; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const rival = players[1]; + rival.spawnX = tileCenterX(spawnColRight); + rival.npc = false; + rival.bot = false; + rival.spiderDummy = false; + rival.remote = true; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + // A fresh match is a fresh series, and a versus series is now recorded like + // any other. A round rollover inside a match keeps the one it has. + if (resetMatch) startReplay(now); + resetRound(now, resetMatch); + dressVersusRival(); + if (resetMatch && typeof analytics === "function") { + analytics("match_started", { + source_system: "browser", + surface: "web", + opponent_type: "remote-player", + }); + } + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +// What the rival is called and what they wear, read off the freshest input +// frame — the challenger mails their handle and colors with every press, so +// a name arriving late still lands. The relay already shape-checked both; +// the sanitize here is for the state schema's sake, because one bent name +// would cost every published frame. +function dressVersusRival() { + if (netSession) { netApplyIdentities(netSession.deal); return; } + const rival = players[1]; + if (!rival.remote) return; + const remote = globalThis.__oskiewarRemotePad; + const offered = versusOfferedName(); + versusRivalOffered = offered; + versusRivalName = /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : ""; + rival.name = versusRivalName; + const colors = (Array.isArray(remote?.colors) ? remote.colors : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)); + if (colors.length) { + rival.handleColors = colors; + rival.color = colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); + } else { + rival.handleColors = []; + rival.color = [38, 82, 176]; + } +} + +// The versus lane's own wire: one room, streamed faster than a grandstand +// needs because for the challenger this feed IS the game. It runs from the +// title screen on — a friend can arrive while the host is still reading the +// wordmark — and rides the same publisher socket the round rooms use. +function publishVersus(now) { + // Both seats simulate, but only the host narrates: the grandstand keeps + // the stream it always had, and the challenger never races the host for + // the room's one publisher socket. + if (netSession && netSession.seat !== 0) return; + if (netSilent || !versusLane() || !versusRoomName || livePublishFailed || + typeof publishLive !== "function") return; + // A waiting room nobody can be invited into is not a room. Publishing it + // would put it in front of the matchmaker as a chair to take. + if (!versusAllowed()) return; + // Paced on the WALL clock, not the simulation's. The driver runs up to four + // owed ticks in one instant to catch up, and a sim-clocked gate let every + // one of those emit its own frame — two or three full state builds in the + // same millisecond, arriving at the relay as a burst it can only coalesce. + // Catch-up is exactly when the fight is busiest, so the cost landed where + // there was least room for it. Wall time makes a burst one frame. + const wall = runtime().unixMs || 0; + if (wall && wall < versusNextAt) return; + versusNextAt = wall + versusSnapshotIntervalMs; + try { + publishLive("ow-" + versusRoomName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// Two visitors can arrive through the same dead address and both decide to +// host it. The relay lets exactly one publish; the other's shell hears "this +// match already has a publisher" and raises a flag, and this walks that +// loser back into the room as a challenger through the bridge it kept. +function updateVersusConflict(now) { + if (!versusLane() || !versusFallbackBridge) return false; + if (globalThis.__oskiewarPublishConflict !== "ow-" + versusRoomName) + return false; + globalThis.__oskiewarPublishConflict = ""; + const bridge = versusFallbackBridge; + versusFallbackBridge = null; + bridge.role = "challenger"; + roundViewer = bridge; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + roundResult = ""; + matchOver = false; + matchName = bridge.name || ""; + roundStartedAt = now - roundIntroDurationUs(); + roundViewerStop = bridge.start(handleRoundViewer); + telemetry("VERSUS_CONFLICT", versusRoomName); + return true; +} + +// The seat, watched every tick. Fresh presses in the lobby open the fight; +// a wire gone quiet mid-fight sends the room back to waiting. The rival's +// wardrobe follows their freshest frame because the handle can arrive after +// the chair was taken. +function updateVersusSeat(now) { + if (netSession) return; + if (updateVersusConflict(now)) return; + if (!versusLane()) return; + // A rival who can roll back says so on the net channel. Their first pad + // usually lands first, so the offer is taken here rather than only from + // the lobby — a streamed fight one second old is upgraded in place. + if (netPeerHello && netHostBegin(now)) return; + const fresh = versusChallengerFresh(); + if (lobbyActive() && fresh && versusAllowed()) { + startVersusFight(now, true); + return; + } + if (versusActive() && !fresh) { + beginVersusLobby(now); + return; + } + if (versusActive() && fresh && versusOfferedName() !== versusRivalOffered) + dressVersusRival(); +} + +// A dead body falling. No input, no collision with anybody, no ledges: a +// corpse is not a fighter and must not catch a rung it would have caught +// alive. It drops, it lands on the ground under it, and it stops. +function settleCorpse(player, dt) { + if (player.grounded) return; + player.vy += fallGravity() * dt; + player.x += player.vx * dt; + player.y += player.vy * dt; + player.vx *= .96; + const terrainY = terrainFloorAt(player.x); + if (player.y < terrainY) return; + player.y = terrainY; + player.vy = 0; + player.vx = 0; + player.grounded = true; +} + +// Lobby deaths have a respawn beat, but no round or killcam to reset state. +function updateLobbyMortality(now) { + if (!lobbyActive()) return; + const player = players[0]; + if (player.alive && hasPart(player, "torso")) return; + if (player.lobbyDeathDressed) return; + if (player.alive) { + player.alive = false; + player.lastButton = "DESTROYED"; + player.lastButtonAt = now; + spawnImpact({ x: player.x, y: player.y - 60, z: player.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(player)); + } + player.lobbyDeathDressed = true; + player.respawnAt = Math.max(player.respawnAt || 0, now + 2500000); + releaseCarriedBall(player, now); + releaseCarriedPart(player, now); + releaseCarriedFighter(player, now); + dismountSkateboard(player, now); + player.attackKind = player.itemAction = ""; + player.attackUntil = player.itemActionUntil = player.dashUntil = 0; + player.attackHit = player.blocking = player.grabHeld = false; + player.pounding = player.pogoDive = player.pogoHit = false; + player.jumpHeld = false; + player.runSince = player.walkSince = 0; + player.jumpPoseUntil = player.landPoseUntil = player.hopUntil = 0; + player.inputX = player.inputY = player.vx = 0; + player.stance = "HIT"; + delete player.frozenGeometry; + delete player.frozenAt; + deathCinematic = null; +} + +// Deprecated with PAL_SELECT — see the flag. +function beginSelect(now) { + selecting = true; + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + selectionReady[1] = false; + selectionPrevious[0] = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + roundResult = ""; + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + fightHitMarks.length = 0; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) + for (const mark of globalThis.__oskiewarFightHitForecast) + fightHitMarks.push({ at: clamp(Number(mark.at) || 0, 0, 1), + color: Array.isArray(mark.color) ? mark.color.slice(0, 3) : [226, 42, 66], + decisive: mark.decisive === true }); + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + roundStartedAt = now; + for (const player of activePlayers()) { + player.roundWins = 0; + player.score = 0; + player.alive = true; + } +} + +function returnToTitle(now, reason = "back") { + finishReplay(); + if (survivalActive()) beginSurvival(now); + else if (versusLane()) beginVersusLobby(now, { title: true }); + else beginTraining(now); + // Menu is a hard navigation boundary: discard the prior fight's zoom and + // right-stick diorama angle before the very first title frame is painted. + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + // The lobby frames its one fighter — the empty chair is parked past the + // wall, and averaging it in would sling the lens a map-width off stage. + cameraCenter = survivalActive() ? (worldLeft + worldRight) / 2 + : lobbyActive() ? players[0].x + : (players[0].x + players[1].x) / 2; + cameraCenterY = survivalActive() ? floorY - 240 + : lobbyActive() ? players[0].y - 90 + : (players[0].y + players[1].y) / 2 - 90; + cameraWidth = survivalActive() ? survivalFrameWidth + : lobbyActive() ? 980 + : Math.max(980, Math.abs(players[1].x - players[0].x) + 760); + cameraContainFloor = 0; + const cameraTarget = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.snap({ target: cameraTarget, + position: { x: cameraCenter, y: cameraCenterY, + z: -cameraWidth * 1.2 }, + width: cameraWidth, perspective: 0, fov: 55, roll: 0 }); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[0] = shellPrevious.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + playDrum("block", .8, 0); + telemetry("SHELL", "game->title " + reason + " " + now); +} + +// A mechanical test drives both fighters with the same bot and says so on the +// nameplates, instead of flying a handle nobody is holding. Entered through +// `__oskiewarSelfPlay` before boot or by calling this — never from a button, +// so normal play cannot fall into it. +function startSelfPlay(now) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = true; + // The harness is not the free door. A self-play run armed from a live title + // inherits whatever training was seated, and leaving that behind would keep + // the whole mechanical test off the wire — no demo, no rollover. + fightOpponent = ""; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of activePlayers()) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.remote = false; + player.rosterIndex = -1; + } + // The reel harness may seat the training dummy in the second chair — a + // scripted "COLOR vs DUMMY" proof bout. The dummy has no bot AI, so the + // timed-training flag keeps the round on the clock it would otherwise + // drop. + if (globalThis.__oskiewarSelfPlayOpponent === "dummy") + players[1].bot = false; + startReplay(now); + resetRound(now, true); + // No dealt equipment. The cube's blade and pistol wait on their floor + // tiles in self-play exactly as they do in a live match, and the bots arm + // themselves by walking over them — or don't. + // The bots' dice are seeded off the round clock, which a re-simulation + // cannot reproduce — so a dense demo carries the seeds themselves, and a + // replayed sim rolls exactly what the live pass rolled. Spawns ride along + // for the same reason: the fight can only rerun from where it stood. + if (replay && replayCheckpointUs() < 100000) { + replay.botSeeds = players.map((player) => player.botRngState >>> 0); + replay.spawns = players.map((player) => Math.round(player.spawnX)); + // Animation runs off the page-boot clock, and limb pose decides where a + // strike lands — a rerun needs the same phase or contacts wander. + replay.posePhaseUs = Math.round(now - startedAt); + } +} + +// Re-simulation: the offline renderer's honest path. Instead of puppeting +// recorded state, the page reruns the ACTUAL fight — same name stream, same +// ball, same bot dice — through the real simulation at the fixed step. Every +// limb tint, item drop, and debris mote is the engine's own, in the current +// build, with nothing lost to the demo schema. State checkpoints remain as a +// drift meter, not as the picture. +let resimActive = false; +// Whether the demo being re-run was a round on a clock. Versus rounds are not, +// and handing one a countdown it never had would end the re-run early on a +// fight the original played past. Demos recorded before this field carry no +// answer and were all timed. +let resimTimed = true; +let resimPending = null; +let resimTick = -1; +let resimCheckpoints = null; +let resimCommands = null; +let resimFirstRowTick = 0; +let resimCommandCursor = 0; +let resimMask = [0, 0]; + +// The inverse of `inputCommand`: a recorded mask back into the pad shape the +// sim reads. Replaying the live pass's actual inputs — instead of letting +// bot AI re-decide — pins every action to its recorded tick, which is what +// keeps the rerun's hits on the audio's timestamps. +function resimPad(pad) { + const mask = resimMask[pad] || 0; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + return { connected: true, down, leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; +} + +function advanceResimCommands() { + if (!resimCommands) return; + while (resimCommandCursor < resimCommands.length && + resimCommands[resimCommandCursor][0] <= resimTick) { + const [, pad, mask] = resimCommands[resimCommandCursor]; + resimMask[pad] = mask; + resimCommandCursor++; + } +} +function startResim(demo, now) { + configureWorldMap(demo.map); + gameMode = "fight"; + resimActive = true; + resimTimed = demo.timed !== false; + // The reset step is demo tick zero; every later sim step counts one. + resimTick = 0; + resimCheckpoints = new Map( + (demo.checkpoints || []).map((row) => [row[0], row])); + resimFirstRowTick = demo.checkpoints?.[0]?.[0] ?? 0; + resimCommands = demo.commands || null; + resimCommandCursor = 0; + resimMask = [0, 0]; + globalThis.__oskiewarResimDrift = { ticks: 0, maxDrift: 0, atTick: 0 }; + selfPlay = true; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of players) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.rosterIndex = -1; + } + if (demo.fighters?.[1] === "DUMMY") players[1].bot = false; + // A forced first-seat color survives in the demo as the fighter's own + // name, so the rerun dresses itself without being told. + const worn = String(demo.fighters?.[0] || "").toLowerCase(); + if (cssColorBook.some((entry) => entry.name === worn)) + globalThis.__oskiewarWardrobe = worn; + seedNames(demo.nameSeed >>> 0); + seriesName = demo.seriesName || demo.matchName || ""; + matchBallType = demo.ballType || seriesBallType(seriesName); + matchName = String(demo.roundName || "").replace(/^ow-/, ""); + if (Array.isArray(demo.spawns)) + players.forEach((player, index) => { + if (demo.spawns[index] != null) player.spawnX = demo.spawns[index]; + }); + replay = null; + resetRound(now, true); + // Self-play deals nothing at the bell, so the rerun starts from the same + // bare table: both weapons still on their tiles. + if (Array.isArray(demo.botSeeds)) + players.forEach((player, index) => { + if (demo.botSeeds[index] != null) + player.botRngState = demo.botSeeds[index] >>> 0; + }); + // The recording says which tick its fight opened on; anchoring the intro + // clock to that tick removes the ±1-step phase that clock rounding deals + // each pass, so replayed inputs land exactly where they were pressed. + const fightOpen = demo.checkpoints?.[0]?.[0]; + if (fightOpen) roundStartedAt = now + fightOpen * 16667 - + roundIntroDurationUs() - 8000; + if (demo.posePhaseUs != null) startedAt = now - demo.posePhaseUs; +} + +function trackResimDrift(now) { + if (!resimActive || !resimCheckpoints) return; + const report = globalThis.__oskiewarResimDrift; + // The intro's length lands ±1 tick depending on each pass's clock + // rounding, so tick spaces are aligned on the fight's own first physics + // step — this call site is only reached once the fight is live, and the + // recording likewise begins there. + if (report.tickOffset === undefined) + report.tickOffset = resimFirstRowTick - resimTick; + const alignedTick = resimTick + report.tickOffset; + if (roundResult && !report.endedAt) { + report.endedAt = resimTick; + report.endedWith = roundResult; + report.endedCause = roundCause; + } + const row = resimCheckpoints.get(alignedTick); + if (!row) return; + report.ticks++; + for (let pad = 0; pad < players.length; pad++) { + const offset = 1 + pad * 8; + const drift = Math.hypot(players[pad].x - row[offset], + players[pad].y - row[offset + 1]); + if (drift > 4 && report.firstDriftTick === undefined) { + report.firstDriftTick = alignedTick; + report.firstDriftPad = pad; + report.firstDrift = Math.round(drift * 10) / 10; + report.liveAt = [row[offset], row[offset + 1]]; + report.resimAt = [Math.round(players[pad].x), Math.round(players[pad].y)]; + } + if (drift > report.maxDrift) { + report.maxDrift = Math.round(drift * 10) / 10; + report.atTick = alignedTick; + } + } +} + +function consumeSystemButtons(now) { + let pressed = false; + for (let index = 0; index < padSnapshots.length; index++) { + const down = padSnapshots[index]?.down || []; + const previous = navigationPrevious[index] || []; + if (down.includes("RightStick") && !previous.includes("RightStick")) { + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + } + if (down.includes("View") && !previous.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + if (down.includes("Menu") && !previous.includes("Menu")) pressed = true; + navigationPrevious[index] = down.slice(); + } + // Self-play has no title to return to — a stray Menu press would strand the + // loop on a screen nobody is there to start. + if (!pressed || selfPlay || shellMode !== "GAME" || selecting) return false; + returnToTitle(now, "menu"); + return true; +} + +// Start lifts the wordmark off a fight that is already running underneath. +function enterGame(now) { + startInputPending = true; + if (localControllerPair() && !roundViewer && !netSession && !versusActive()) { + startLocalVersus(now); + return; + } + if (survivalActive()) { + startSurvivalRun(now, false); + globalThis.__oskiewarStartLine = "climb!"; + playDrum("bell", 1.05, 0); + playSine(660, .12); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + return; + } + if (titleAttractMode === "action") { + selfPlay = false; + players[0].npc = false; + players[0].bot = false; + players[0].spiderDummy = false; + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + // Attract keeps a cool neutral body in the second chair so the tableau + // reads as a matchup rather than two identical red bots. Start hands the + // first seat back and re-seats whichever sparring partner this session was + // actually dealt: hardcoding the inert dummy here left every session the + // clock dealt the action tableau — half of them — still punching a post + // after training switched to the bot. + const training = trainingOpponentKind(); + players[1].npc = true; + players[1].bot = training === "trainingbot"; + players[1].spiderDummy = training === "spiderdummy"; + applyRoster(players[1], -1); + } + shellMode = "GAME"; + gameplayStarted = true; + if (dummyGuideStartedAt === null && players[1].npc && !players[1].bot) + dummyGuideStartedAt = now; + shellPrevious = padSnapshots[0]?.down?.slice() || []; + if (PAL_SELECT) beginSelect(now); +} + +// Comma and period step the pace mid-fight the way +/- do on the title — a +// quarter at a time, but never past full speed: slow motion is for reading a +// bot's tells. A wired fight keeps the clock both seats agreed on, so the +// keys go dead the moment a rival is real, and a watcher's playout is the +// host's clock too. Edge-detected against the same unfiltered pad memory the +// title uses, so a key held across the start steps exactly once. +const paceLocked = () => netSession !== null || versusActive() || + roundViewer !== null; +function updateMatchPace(now) { + const rawDown = padSnapshots[0]?.down || []; + const tap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + const faster = tap("SpeedUp"); + const slower = tap("SpeedDown"); + shellRawPrevious = rawDown.slice(); + if (!faster && !slower) return; + const next = paceLocked() ? gameSpeed + : clamp(gameSpeed + (faster ? .25 : -.25), .25, 1); + if (next === gameSpeed) { playDrum("block", .3, 0); return; } + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, faster ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); +} + +function updateShell(now, tapped = false) { + const pad = padSnapshots[0] || {}; + // The title screen is where the game's pace is set: +/- on a keyboard + // step the clock a quarter at a time, from a quarter speed to double. + // Handled before anything else so a speed tap can never read as "start", + // and edge-detected against the unfiltered pad so holding the key steps + // exactly once. + const rawDown = pad.down || []; + const speedTap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + if (speedTap("SpeedUp") || speedTap("SpeedDown")) { + const stepped = gameSpeed + (speedTap("SpeedUp") ? .25 : -.25); + const next = clamp(stepped, .25, 2); + if (next !== gameSpeed) { + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, speedTap("SpeedUp") ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); + } else playDrum("block", .3, 0); + } + shellRawPrevious = rawDown.slice(); + // View and Menu are the system's buttons — View toggles the debug HUD and + // must not double as "start the game". Everything else, and a real lean on + // the analog stick, says the player wants in. + const down = rawDown + .filter((button) => button !== "View" && button !== "Menu" && + button !== "SpeedUp" && button !== "SpeedDown"); + const stickLive = Math.abs(pad.leftX || 0) > .5 || Math.abs(pad.leftY || 0) > .5; + if (titleTransitionAt !== null) { + if (now - titleTransitionAt >= 700000) { + titleTransitionAt = null; + enterGame(now); + } + shellPrevious = down.slice(); + shellStickLive = stickLive; + return; + } + if (tapped || down.some((button) => !shellPrevious.includes(button)) || + (stickLive && !shellStickLive)) { + playDrum("hat", .55, 0); + if (typeof titleBeep === "function") titleBeep(); + if (typeof titleVoice === "function") titleVoice(); + emitSignal("select", -1, 1, 0); + titleTransitionAt = now; + startInputPending = true; + } + shellPrevious = down.slice(); + shellStickLive = stickLive; +} + +// Everything from here through `updateSelect` is the deprecated pal select, +// held behind PAL_SELECT — see the flag. +function selectionOptions() { + if (selectionStep === 0) return fighterRoster.map((fighter, rosterIndex) => ({ + kind: "pal", fighter, rosterIndex, + })); + return [ + { kind: "bot", fighter: botFighter, rosterIndex: -1 }, + { kind: "dummy", fighter: npcFighter, rosterIndex: -1 }, + { kind: "spiderdummy", fighter: spiderDummyFighter, rosterIndex: -1 }, + { kind: "people", fighter: peopleFighter, rosterIndex: -1, disabled: true }, + ]; +} + +function startSelectedRound(now) { + selectionReady[0] = true; + selectionReady[1] = true; + startFightAgainst( + players[1].bot ? "bot" : players[1].spiderDummy ? "spiderdummy" + : players[1].npc ? "dummy" : "ppl", now); +} + +function chooseSelection(index, now) { + const option = selectionOptions()[index]; + if (!option) return; + if (option.disabled) { + playDrum("block", .45, 0); + return; + } + if (selectionStep === 0) { + applyRoster(players[0], option.rosterIndex); + selectionReady[0] = true; + selectionStep = 1; + // The dummy is where a fight should start: it stands still and lets you + // learn the buttons. Picking the bot is a decision, not a default. + selectionCursor = Math.max(0, + selectionOptions().findIndex((option) => option.kind === "dummy")); + playDrum("hat", .9, -.55); + emitSignal("select", 0, option.rosterIndex, 0); + return; + } + const opponent = players[1]; + opponent.npc = option.kind === "dummy" || option.kind === "spiderdummy" || + option.kind === "bot"; + opponent.bot = option.kind === "bot"; + opponent.spiderDummy = option.kind === "spiderdummy"; + applyRoster(opponent, option.rosterIndex); + playDrum("clap", 1, .55); + emitSignal("select", 1, option.rosterIndex, opponent.bot ? 2 : opponent.npc ? 1 : 0); + startSelectedRound(now); +} + +function selectionBack(now) { + if (selectionStep === 1) { + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + playDrum("block", .7, 0); + return; + } + returnToTitle(now, "back"); +} + +// One pal at a time: the cursor holds the middle of the screen and its two +// neighbours recede to either side, so the roster reads as a wheel you turn +// rather than a board you scan. +function selectionTouchLayout() { + const count = selectionOptions().length; + const compact = compactLayout(); + const centerX = viewCenterX(); + const cardWidth = compact ? Math.min(280, viewWidth() * .44) : 680; + const cardHeight = compact ? 360 : 720; + const top = compact ? 176 : 190; + const sideScale = compact ? .5 : .66; + const reach = cardWidth * (1 + sideScale) / 2 + (compact ? 6 : 26); + const slots = count > 2 ? [-1, 0, 1] : count > 1 ? [0, 1] : [0]; + return { + back: compact + ? { x: 24, y: 126, width: 112, height: 50 } + : { x: viewOffsetX() + 90, y: 112, width: 170, height: 70 }, + options: slots.map((slot) => { + const scale = slot === 0 ? 1 : sideScale; + const width = cardWidth * scale; + const height = cardHeight * scale; + return { index: (selectionCursor + slot + count) % count, slot, + x: centerX + slot * reach - width / 2, + y: top + (cardHeight - height) / 2, width, height }; + }), + }; +} + +const pointInRect = (point, rect) => rect && point.x >= rect.x && + point.x <= rect.x + rect.width && point.y >= rect.y && + point.y <= rect.y + rect.height; + +function selectionHover(layout = selectionTouchLayout()) { + const pointer = globalThis.__oskiewarTouch?.pointer; + if (!pointer?.active || !Number.isFinite(pointer.x) || + !Number.isFinite(pointer.y)) return null; + if (pointInRect(pointer, layout.back)) return { back: true }; + const option = layout.options.find((rect) => pointInRect(pointer, rect)); + return option && !selectionOptions()[option.index]?.disabled + ? { option: option.index } : null; +} + +function consumeSelectTouches(now) { + const queue = globalThis.__oskiewarTouch?.taps; + if (!Array.isArray(queue) || !queue.length) return; + const touches = queue.splice(0); + const layout = selectionTouchLayout(); + const options = selectionOptions(); + for (const point of touches) { + if (pointInRect(point, layout.back)) selectionBack(now); + else { + const rect = layout.options.find((option) => pointInRect(point, option)); + // A receding neighbour turns the wheel; the focused card commits. A + // disabled card duds either way. + if (rect && (rect.slot === 0 || options[rect.index]?.disabled)) + chooseSelection(rect.index, now); + else if (rect) { + selectionCursor = rect.index; + playDrum("hat", .55, 0); + } + } + if (!selecting || shellMode === "MENU") break; + } +} + +function updateSelect(now) { + consumeSelectTouches(now); + if (!selecting || shellMode === "MENU") return; + const down = padSnapshots[0]?.down || []; + const previous = selectionPrevious[0]; + const pressed = (button) => down.includes(button) && !previous.includes(button); + const optionCount = selectionOptions().length; + let movement = 0; + if (pressed("ArrowLeft") || pressed("ArrowUp")) movement = -1; + else if (pressed("ArrowRight") || pressed("ArrowDown")) movement = 1; + if (movement) { + let next = selectionCursor; + for (let index = 0; index < optionCount; index++) { + next = (next + movement + optionCount) % optionCount; + if (!selectionOptions()[next]?.disabled) break; + } + if (next !== selectionCursor) { + selectionCursor = next; + playDrum("hat", .55, 0); + } + } + if (pressed("B") || pressed("Menu")) selectionBack(now); + else if (pressed("A")) chooseSelection(selectionCursor, now); + selectionPrevious[0] = down.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; +} + +function randomWindMph() { + return 0; +} + +function rollWind(now = runtime().monotonicUs, immediate = true) { + windTargetMph = 0; + windTargetDirection = 1; + nextWindChangeAt = Infinity; + windMph = 0; + windDirection = 1; + windAcceleration = 0; + emitSignal("wind", -1, windTargetDirection, windTargetMph); +} + +function updateWind(dt, now) { + windMph = 0; + windDirection = 1; + windAcceleration = 0; +} + +// The match ball is drawn from the series identity. That identity is itself +// seeded once per match and recorded, so re-running a demo's inputs inflates +// the same ball -- the name this hashes used to come straight from +// Math.random, which silently made ball radius and mass unreproducible. +function seriesBallType(name) { + // Only the kinds marked for the series. The hover board lives in `ballKinds` + // because it IS one of these objects to the physics, but a match that + // inflated a board as its ball would put two boards on a station that is + // supposed to hold exactly one. + const deck = ballKinds.filter((kind) => kind.series !== false); + const roll = hashUnit("ball:" + (name || "oskiewar")); + return deck[Math.min(deck.length - 1, Math.floor(roll * deck.length))].type; +} + +function resetBalls(now) { + Object.assign(balls[0], + ballKinds.find((kind) => kind.type === matchBallType && kind.series !== false) || + ballKinds[0]); + for (const item of balls) { + // The board is placed, not served. It lies in the far floor corner from + // the pistol, so the bell offers three ways to spend the same seconds: + // rush the middle bare-handed, break left for the board, or break right + // for the gun. Putting it on the centre line instead would have made it + // the only opening move worth making. + if (item.type === "skateboard") { + item.x = tileCenterX(Math.floor((item.spawnCol ?? cornerColLeft) * gridCols / 40)); + item.riderPad = -1; + item.y = skateContact(item.x, terrainFloorAt(item.x)).y - skateAxleDrop - skateWheelRadius; + item.z = 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.skateSpin = 0; + item.heldBy = -1; + const rider = skateparkMap ? players[balls.indexOf(item) - 1] : null; + item.riderPad = rider?.skateboard ? rider.pad : -1; + item.active = skateBoardEnabled && item.riderPad < 0; + item.serveAt = 0; + item.lastHitBy = -1; + item.safeUntil = 0; + item.safePlayers = 0; + continue; + } + const owner = item.spawnOwner >= 0 ? players[item.spawnOwner] : null; + item.x = owner ? owner.spawnX + owner.facing * 180 + : centerX; + item.y = owner ? terrainFloorAt(item.x) - item.radius + : terrainFloorAt(item.x) - gridHeight + item.radius + 40; + // An unowned ball begins airborne over the cube's center tile seam and + // drops onto the middle of the fight. + item.z = owner ? owner.z : 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.heldBy = -1; + item.active = ballEnabled; + item.serveAt = now + roundIntroDurationUs() + 150000; + item.lastHitBy = owner ? owner.pad : -1; + item.safeUntil = item.serveAt; + item.safePlayers = owner ? 1 << owner.pad : 0; + // A serve call for a ball that will never inflate is a sound cue lying. + if (ballEnabled) emitSignal("ballserve", owner ? owner.pad : -1, + owner ? owner.facing : 0, windMph); + } +} + +const buttonLabel = (button) => ({ + ArrowUp: "UP", ArrowDown: "DOWN", ArrowLeft: "LEFT", ArrowRight: "RIGHT", + LeftShoulder: "LB", RightShoulder: "RB", LeftStick: "LEFT STICK", + RightStick: "RIGHT STICK", View: "VIEW", Menu: "MENU", + LeftTrigger: "LT", RightTrigger: "RT", +}[button] || String(button).toUpperCase()); + +function roundDemoState(demo, now) { + const checkpoints = demo?.checkpoints || []; + if (!checkpoints.length) return null; + const roundIndex = Number.isInteger(demo.roundIndex) ? demo.roundIndex + : Math.max(0, (demo.rounds?.length || 1) - 1); + const startTick = demo.rounds?.[roundIndex]?.[0] || 0; + const finalCheckpoint = checkpoints[checkpoints.length - 1]; + const endTick = Math.max(startTick + 1, demo.durationTicks || finalCheckpoint[0]); + const elapsed = Math.floor((now - roundViewerDemoStartedAt) / replayTickUs); + const tick = startTick + elapsed % (endTick - startTick + 1); + let before = checkpoints[0], after = finalCheckpoint; + for (const row of checkpoints) { + if (row[0] <= tick) before = row; + if (row[0] >= tick) { after = row; break; } + } + const amount = clamp((tick - before[0]) / Math.max(1, after[0] - before[0]), 0, 1); + const value = (index) => lerp(before[index], after[index], amount); + const recentAttack = (pad) => { + let kind = ""; + let age = 0; + for (const event of demo.events || []) { + if (event[0] > tick || event[0] < tick - 18 || event[2] !== pad) continue; + if (meleeSpecs[event[1].toUpperCase()]) { + kind = event[1].toUpperCase(); + age = tick - event[0]; + } + } + return { kind, age }; + }; + const fighters = [0, 1].map((pad) => { + const offset = 1 + pad * 8; + const flags = before[offset + 5]; + const name = demo.fighters?.[pad] || `P${pad + 1}`; + const profile = name === "DUMMY" ? npcFighter : name === "BOT" ? botFighter + : fighterRoster.find((fighter) => fighter.handle === name); + // A self-play fighter is called what it wears, so a demo's fighter name + // is first tried against the color book itself — the repaint dresses + // straight from the nameplate. Older demos still say "BOT 1"/"BOT 2"; + // those deal from the wardrobe hash so they don't fall back to the + // house red and blue. + const wornColor = cssColorBook.find( + (entry) => entry.name === name.toLowerCase()); + const selfPlayPad = selfPlayFighters.findIndex( + (fighter) => fighter.handle === name); + const swing = recentAttack(pad); + const vx = value(offset + 3); + return { name, nation: demo.nations?.[pad] || "", + color: wornColor ? wornColor.rgb.slice() + : selfPlayPad >= 0 ? selfPlayWardrobe(selfPlayPad).rgb.slice() + : profile?.color || players[pad].color, + x: value(offset), y: value(offset + 1), z: value(offset + 2), + vx, vy: value(offset + 4), vz: 0, + facing: flags & 8192 ? (flags & 4096 ? 1 : -1) + : vx ? Math.sign(vx) : pad ? -1 : 1, + alive: Boolean(flags & 1), grounded: Boolean(flags & 2), + ducking: Boolean(flags & 4), blocking: Boolean(flags & 8), + removedParts: [...limbParts, "torso"].filter((part, index) => + Boolean(flags & (1 << (index + 4)))), + hit: flags & 16384 ? .9 : 0, blockFlash: flags & 32768 ? 1 : 0, + score: Math.round(value(offset + 6)), + roundWins: Math.round(value(offset + 7)), attack: swing.kind, + attackTicks: swing.age }; + }); + const round = demo.rounds?.[roundIndex] || [startTick, 1, 0, 1]; + const nearEnd = tick >= endTick - 20; + const replayBall = { x: value(17), y: value(18), z: value(19), + radius: 42, active: Boolean(before[22]), spawnOwner: 0 }; + const camera = { x: value(23), y: value(24), + width: Math.max(100, value(25)) }; + // Newer demos carry the live pass's whole camera pose; without it the + // lens position is re-derived from width and close shots near-clip. + if (before.length > 26) { + camera.position = { x: value(26), y: value(27), z: value(28) }; + camera.perspective = value(29); + camera.fov = value(30); + camera.roll = value(31); + } + return { phase: "replay", map: demo.map || "station", tick, fighters, ball: replayBall, + balls: [replayBall], camera, + wind: { direction: round[1], mph: round[2] }, + round: { remainingMs: Math.max(0, Math.round((endTick - tick) * 1000 / + (demo.tickRate || 60))), result: nearEnd + ? demo.winner ? `${demo.winner} WINS ROUND` : "TIE" : "" } }; +} + +function applyRoundViewerState(state, now, dt = 1 / 60) { + if (!state?.fighters?.length || !state.camera || !state.round) return; + workshopHighlight = state.map?.highlights === true; + if (state.map?.id && state.map.id !== currentMapId) { + if (state.map.workshop && globalThis.__oskiewarValidateMap) { + try { installWorkshopMap(globalThis.__oskiewarValidateMap(state.map.workshop)); } + catch { return; } + } else if (workshopMap) { + installWorkshopMap(workshopBase, true); + workshopMap = null; + currentMapId = "halfpipe"; + currentMapName = "HALFPIPE"; + } + } + if (((state.course || state.map) === "skatepark") !== skateparkMap) { + configureWorldMap(state.course || state.map); resetSkateRopes(); + } + if (skateparkMap && Array.isArray(state.ropes) && state.ropes.length === skateRopes.length) + state.ropes.forEach((nodes, index) => { + if (!Array.isArray(nodes) || nodes.length !== chainLinks + 1 || + nodes.some((row) => !Array.isArray(row) || row.length !== 4 || + row.some((n) => !Number.isFinite(n) || Math.abs(n) > 100000))) return; + skateRopes[index].nodes = nodes.map(([x, y, px, py]) => ({ x, y, px, py })); + }); + for (let index = 0; index < players.length; index++) { + const source = state.fighters[index]; + const player = players[index]; + const previousX = player.x; + const previousY = player.y; + // Held to spot the edges the live wire reports as flags but never as the + // sparks and debris the host spawned locally. A demo carries its own + // impact track (replayViewerImpacts), so this reconstruction is LIVE-only. + const wasAlive = player.alive; + const wasHit = player.hit || 0; + const priorParts = player.removedParts?.slice() || []; + for (const key of ["name", "nation", "color", "x", "y", "z", "facing", "alive", + "grounded", "ducking", "blocking", "score", "roundWins", "removedParts", + "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) + if (source[key] !== undefined) player[key] = source[key]; + player.vx = source.vx ?? (player.x - previousX) / Math.max(.001, dt); + player.vy = source.vy ?? (player.y - previousY) / Math.max(.001, dt); + player.vz = source.vz || 0; + // Grandstand coasting rides ONLY a velocity the host actually reported. + // The vx/vy above fall back to a frame-to-frame difference for the walk + // cycle's sake, but that difference is a teleport artifact on the first + // snap and after a wire gap — dead-reckoning it would fling the body. + player.wireVx = Number.isFinite(source.vx) ? source.vx : 0; + player.wireVy = Number.isFinite(source.vy) ? source.vy : 0; + player.attackKind = source.attack || ""; + // A demo knows which tick a swing began on, so the replayed pose can run + // its real arc instead of freezing at one canned mid-swing phase. + player.attackStartedAt = player.attackKind + ? now - (source.attackTicks != null + ? source.attackTicks * replayTickUs : 80000) : 0; + player.attackUntil = player.attackKind ? now + 120000 : 0; + player.hit = source.hit || 0; + player.blockFlash = source.blockFlash || 0; + // The host spawns sparks on a strike, a burst on a lost limb and a + // whoosh-lit puff on a kill; none of that rides the state wire, so the + // grandstand used to watch a body silently pop apart. Reconstruct the + // burst from the flag edges the wire DOES carry — a fresh hit, a new + // missing part, a death — so live watchers see the blow land. + if (roundViewerMode === "LIVE") { + // Reconstructing the strike spark is the fallback for a host too old to + // send its impact track. When the real track is on the frame it wins: + // it is the same spark, in the right place, and doubling them reads as + // a heavier hit than the one that landed. + if (!state.impacts && player.hit > .4 && wasHit <= .4) + impacts.push({ x: player.x, y: player.y - 90, z: player.z, + life: .32, duration: .32, death: false, explosion: true }); + const nowParts = player.removedParts || []; + // A fighter who came back whole is a new round, not a healed limb. + const lost = nowParts.length < priorParts.length ? [] + : nowParts.filter((part) => !priorParts.includes(part)); + if (nowParts.length < priorParts.length) clearRoundViewerEffects(); + if (!state.impacts && (lost.length || (wasAlive && !player.alive))) + impacts.push({ x: player.x, y: player.y - 60, z: player.z, + life: .55, duration: .55, death: true, explosion: false }); + // And the limb itself goes flying. The wire says which part is gone; it + // does not say where the pieces went, and the pieces are the part of a + // dismemberment anybody actually watches. They are spawned from the + // fighter's own pose here and then fall under local physics, so they + // land where the body stands rather than where a packet said it did. + if (lost.length && detachedParts.length < 48) { + // Posed from BEFORE the loss, on a copy: the wire's removedParts are + // already applied to the live fighter, and a body's geometry no + // longer carries the limbs it has lost — so asking the fighter as it + // stands now returns no segments to throw. + const pose = runnerWorldGeometry({ ...player, removedParts: priorParts }, + (now - startedAt) / 1000000); + const rival = players[player.pad === 0 ? 1 : 0]; + for (const part of lost) + spawnDetachedPart(player, part, pose, rival?.x ?? player.x, now); + } + } + } + const sources = state.balls || [state.ball]; + for (let index = 0; index < balls.length; index++) { + const source = sources[index]; + if (!source) { balls[index].active = false; continue; } + for (const key of ["x", "y", "z", "radius", "active", "spawnOwner", + "type", "mass", "heldBy"]) + if (source[key] !== undefined) balls[index][key] = source[key]; + } + // A frame that carries no projectile rows is an older host or a stored + // demo, and its shots are simply unknown — leaving the arrays alone is the + // honest answer. A frame that carries an empty row set is a host saying the + // air is clear, and that clears it. + if (state.shots) applyWireShots(state.shots); + if (state.lobs) applyWireLobs(state.lobs); + if (state.impacts) applyWireImpacts(state.impacts); + cameraCenter = state.camera.x; + cameraCenterY = state.camera.y; + cameraWidth = state.camera.width; + if (state.wind) { + windDirection = state.wind.direction; + windMph = state.wind.mph; + windAcceleration = windDirection * windMph * 16; + } + const hadResult = Boolean(roundResult); + roundResult = state.round.result || ""; + roundCause = state.round.cause || + (roundResult.includes("BALLED") ? "BALLED" : roundResult ? "ROUND" : ""); + // Whether the round on the wire has a clock is the HOST's fact, not a thing + // to re-derive locally: `roundIsTimed()` answers from the machine it runs + // on, and a watcher's machine is not in the fight. A demo carries no flag + // and was always a timed, recorded round. + roundViewerTimed = state.round.timed !== false; + // The round's own age, intro included, straight off the wire. Deriving it + // from `remainingMs` instead is what broke the versus lane: that field is + // zero on an untimed round, so the clock landed a full round duration in + // the past, `counting` was never true, and the intro card never drew. + const elapsedUs = Number.isFinite(state.round.elapsedMs) + ? state.round.elapsedMs * 1000 : null; + roundElapsedUs = roundViewerTimed + ? Math.max(0, roundDurationUs - state.round.remainingMs * 1000) + : elapsedUs === null ? 0 + : Math.max(0, elapsedUs - roundIntroDurationUs()); + matchOver = state.phase === "match"; + roundStartedAt = elapsedUs === null + ? now - roundIntroDurationUs() - roundElapsedUs : now - elapsedUs; + if (roundResult && !hadResult) roundOverAt = now; + const target = state.camera.target || { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: state.camera.position || + { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: state.camera.perspective || 0, + fov: state.camera.fov || 55, roll: state.camera.roll || 0 }, dt, 1000); +} + +// Shots and lobs arrive as the flat number rows spectatorState packs (owner +// and kind folded into one flag word). They are rebuilt rather than merged: +// a round has no identity on the wire, so matching this frame's third bullet +// to last frame's third bullet would be a guess, and a wrong guess teleports +// a streak across the arena. The arrays themselves keep their identity — the +// camera's swept-path packer and the render interpolator both hold references +// to them. +function applyWireShots(rows) { + bullets.length = 0; + for (const row of rows) { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + bullets.push({ x, y, z, previousX, previousY, vx, vy, + owner: owner === 1 ? 1 : 0, life: 1, safeUntil: 0, + spit: Boolean(flags & 1), heavy: Boolean(flags & 2), + rubber: Boolean(flags & 4), + // No bounce history came up the wire, so a watched round draws its + // streak and no ricochet tail. drawBulletTrail reads the count first + // and an empty one costs it nothing. + trail: [], trailCount: 0 }); + } +} + +// The host's impact track, which repeats each mark for as long as it burns. +// The id is what makes a repeat readable as a repeat: a watcher spawns only +// the numbers it has not seen, at the age the frame reports, and then runs +// them out on its own physics. +function applyWireImpacts(rows) { + if (!rows.length) return; + const newest = rows[rows.length - 1][0]; + // Numbers only climb within one host's run. A lower one is a different + // host, or the same one restarted, and nothing before it has been seen. + if (newest < roundViewerImpactId) roundViewerImpactId = 0; + for (const row of rows) { + const [id, x, y, z, durationMs, lifeMs, flags] = row; + if (id <= roundViewerImpactId) continue; + impacts.push({ x, y, z, duration: durationMs / 1000, + life: Math.max(.001, lifeMs / 1000), + death: Boolean(flags & 1), explosion: Boolean(flags & 2) }); + } + roundViewerImpactId = Math.max(roundViewerImpactId, newest); +} + +function applyWireLobs(rows) { + grenades.length = 0; + for (const row of rows) { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + // Only live grenades ride out, so anything here is alive by definition — + // which is also what puts it in the render list. + grenades.push({ x, y, z, vx, vy, owner: owner === 1 ? 1 : 0, alive: true, + rocket: Boolean(flags & 1), exploding: Boolean(flags & 2), + blastRadius, blastAge: 0, fuse: fuseMs / 1000, hitPlayers: 0 }); + } +} + +function handleRoundViewer(message) { + const now = runtime().monotonicUs; + matchName = message.roundName || matchName; + if (message.type === "round") { + roundViewerDemo = null; + roundViewerMode = ""; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + return; + } + if (message.type === "status") { + roundViewerStatus = String(message.content?.label || "waiting").toUpperCase(); + // A room that goes dark keeps no queue: whatever arrives next belongs to + // a new timeline, and a stale frame blended into it is a teleport. + if (message.content?.live === false) resetRoundViewerPlayout(); + return; + } + if (message.type === "demo") { + // A demo with bot seeds can be re-simulated — the honest path. The + // bridge hands over the recording and steps aside so the real sim runs; + // seedless demos (older, or human-driven) still puppet through the + // viewer below. + if (globalThis.__oskiewarResim && Array.isArray(message.content?.botSeeds)) { + roundViewerStop?.(); + roundViewer = null; + // The reset waits for the first stepped tick so it lands inside the + // sim clock the way a live round roll does — resetting here, on the + // bridge's wall clock, would skew the intro against the recording. + resimPending = message.content; + globalThis.__oskiewarReplayReady = true; + return; + } + roundViewerDemo = message.content; + roundViewerDemoStartedAt = now; + roundViewerMode = "DEMO"; + resetRoundViewerPlayout(); + globalThis.__oskiewarReplayReady = true; + return; + } + if (message.type === "net") { + if (netSession) netInbox.push(message.content); + else netHandlePreSession(message.content); + return; + } + if (netSession && message.type === "state") return; + if (message.type === "state") { + // The room says whether anybody is publishing, and it says so before it + // hands over any frame. A frame that arrives while nobody is is the last + // thing a host said before it left — kept by the relay and given to + // whoever opens the door next. Going LIVE on it paints that frozen round + // as a fight in progress, and since one frame can never bracket the + // playout clock, nothing in it is ever applied: the fighters keep + // whatever names this engine was already holding and the HUD tells the + // new arrival which of those two strangers they are. + if (!message.live) return; + if (roundViewerDemo && message.content?.phase === "match") return; + roundViewerMode = "LIVE"; + queueRoundViewerState(message.content); + } +} + +// A fresh timeline: a room change, a takeover, a host that went away. The +// queue, the playout clock and the measured health all start over, because +// every one of them is a statement about a wire that no longer exists. +// Sparks, debris and fallen limbs belong to one round on one wire. A new +// round, a new room or a host that went away takes them with it. +function clearRoundViewerEffects() { + impacts.length = 0; + detachedParts.length = 0; + roundViewerImpactId = 0; +} + +function resetRoundViewerPlayout() { + clearRoundViewerEffects(); + roundViewerFrames = []; + roundViewerPlayoutMs = 0; + roundViewerLiveAt = 0; + roundViewerGapMs = 33; + roundViewerJitterMs = 0; + roundViewerLossPct = 0; + roundViewerSeq = -1; + roundViewerSeqHeard = 0; + roundViewerSeqExpected = 0; +} + +// A frame lands here, in a socket callback, between one simulation tick and +// the next paint. Painting it from inside that callback is what smeared every +// correction across two frames: the render interpolator had already captured +// the pre-frame pose, so the next paint landed partway into the new state and +// the one after finished the jump. So the frame is only filed — stamped with +// its arrival and measured — and the tick decides when it is due. +function queueRoundViewerState(state) { + const at = Date.now(); + const gap = roundViewerLiveAt ? at - roundViewerLiveAt : 0; + roundViewerLiveAt = at; + if (gap > 0 && gap < 2000) { + roundViewerGapMs += (gap - roundViewerGapMs) * .12; + roundViewerJitterMs += + (Math.abs(gap - roundViewerGapMs) - roundViewerJitterMs) * .12; + } + // Loss read off the host's own sequence numbers, over a rolling window. + // This is where the relay's coalescing shows: a frame it dropped inside its + // 25 ms gate leaves a hole in the count that nothing else on this side can + // see. A takeover or a fresh room rewinds the sequence, which restarts the + // window rather than reading as a hundred lost frames. + const seq = Number(state?.seq); + if (Number.isFinite(seq)) { + if (roundViewerSeq >= 0 && seq > roundViewerSeq) { + roundViewerSeqExpected += seq - roundViewerSeq; + roundViewerSeqHeard += 1; + if (roundViewerSeqExpected >= 180) { + roundViewerLossPct = clamp(Math.round( + (1 - roundViewerSeqHeard / roundViewerSeqExpected) * 100), 0, 100); + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + } else { + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + roundViewerSeq = seq; + } + // One wire frame plus twice the jitter actually measured, held inside a + // window where a buffer is still worth more than it costs. The delay itself + // moves slowly: resizing it quickly would time-warp the picture. + const want = clamp(roundViewerGapMs + roundViewerJitterMs * 2 + 8, 45, 220); + roundViewerDelayMs += (want - roundViewerDelayMs) * .05; + roundViewerFrames.push({ state, at }); + // A ceiling, not a working depth: the playout holds about three frames. + // This only catches a tab whose simulation parked while the wire kept + // arriving, and the clock's own thousand-millisecond reset sorts out the + // rest when the tab comes back. + if (roundViewerFrames.length > 32) roundViewerFrames.shift(); +} + +// How far past the newest frame in hand the grandstand keeps coasting on wire +// velocity before it holds still. Inside the buffer nothing coasts at all — +// the pose is blended between two frames the host really sent. Past the +// buffer the velocity goes stale fast enough that coasting walks a fighter +// through a wall or floats them past a jump's apex, so a long gap freezes the +// pose instead of inventing motion. +const liveDeadReckonMaxMs = 150; + +function updateRoundViewer(now, dt) { + if (roundViewerDemo && roundViewerMode === "DEMO") { + const state = roundDemoState(roundViewerDemo, now); + if (state) { + applyRoundViewerState(state, now, dt); + replayViewerImpacts(state.tick, dt); + } + return; + } + if (roundViewerMode !== "LIVE" || !roundViewerFrames.length) return; + const wall = Date.now(); + const target = wall - roundViewerDelayMs; + // A first frame, or a wire that stopped and came back, sets the clock + // outright. Every other tick advances it by the simulation's own dt and + // leans a twentieth of the way toward where it belongs. Leaning rather than + // snapping is what keeps the picture's rate the sim's rate: a clock pinned + // to the wall every tick replays the network's jitter as motion. + if (!roundViewerPlayoutMs || Math.abs(target - roundViewerPlayoutMs) > 1000) + roundViewerPlayoutMs = target; + else roundViewerPlayoutMs += dt * 1000 + + (target - roundViewerPlayoutMs) * .05; + const play = roundViewerPlayoutMs; + // Hold exactly one frame behind the clock: it is the left end of the pair + // being blended, and the one to coast from if the buffer runs dry. + while (roundViewerFrames.length > 1 && roundViewerFrames[1].at <= play) + roundViewerFrames.shift(); + const before = roundViewerFrames[0].at <= play ? roundViewerFrames[0] : null; + const after = before ? roundViewerFrames[1] : roundViewerFrames[0]; + if (before && after) { + const span = Math.max(1, after.at - before.at); + const alpha = clamp((play - before.at) / span, 0, 1); + applyRoundViewerState(blendRoundViewerStates(before.state, after.state, + alpha, (play - before.at) / 1000), now, dt); + updateRoundViewerEffects(dt); + return; + } + // Starved, or not yet arrived at the first frame. The newest thing in hand + // is the truth; past it the bodies coast on the velocity that frame + // reported — measured from that frame's own position, so the reckoning is + // never compounded and the next arrival needs no correcting snap. + const edge = before || after; + applyRoundViewerState(edge.state, now, dt); + if (before) + coastRoundViewer(Math.min(play - before.at, liveDeadReckonMaxMs) / 1000); + updateRoundViewerEffects(dt); +} + +// The half of the fight a watcher is allowed to run for itself. Sparks, their +// debris and the limbs that came off are cosmetic: nothing here decides a hit +// or a score, so none of it has to agree with the host bit for bit — it only +// has to happen. Before this, `impacts` grew for the life of the connection +// and never drew a mote, because the function that grows an impact's debris +// ran only in a demo or a hosted sim. +function updateRoundViewerEffects(dt) { + updateResultImpactDebris(dt); + if (detachedParts.length) updateDetachedParts(dt, false); +} + +// Dead reckoning, and only past the end of the buffer. +function coastRoundViewer(seconds) { + if (seconds <= 0) return; + for (const player of players) { + if (!player.alive) continue; + // Coast the delta only — the host's reported position is truth and may + // sit anywhere it says (legacy rooms even ran off the cube). + player.x += (player.wireVx || 0) * seconds; + player.y += (player.wireVy || 0) * seconds; + } + for (const item of balls) { + if (!item.active) continue; + item.x += (item.vx || 0) * seconds; + item.y += (item.vy || 0) * seconds; + } + // Both ends of a shot move together: the streak's length is the round's + // speed, not the size of the gap we are papering over. + for (const shot of bullets) { + shot.x += (shot.vx || 0) * seconds; + shot.y += (shot.vy || 0) * seconds; + shot.previousX += (shot.vx || 0) * seconds; + shot.previousY += (shot.vy || 0) * seconds; + } + for (const lob of grenades) { + if (lob.exploding) continue; + lob.x += (lob.vx || 0) * seconds; + lob.y += (lob.vy || 0) * seconds; + } +} + +// The pose the grandstand actually paints: two frames the host really sent, +// blended. Continuous quantities interpolate; everything discrete — who is +// alive, which limbs are gone, what phase the round is in — comes from the +// frame already reached, because a fighter must not die before the pose that +// killed them has finished arriving. +const blendFighterKeys = ["x", "y", "z", "vx", "vy", "vz", "hit", + "blockFlash", "attackTicks"]; +const blendCameraKeys = ["x", "y", "width", "perspective", "fov", "roll"]; +const blendPointKeys = ["x", "y", "z"]; + +function blendNumbers(from, to, keys, t) { + const out = { ...from }; + if (!to) return out; + for (const key of keys) { + const a = Number(from?.[key]); + const b = Number(to[key]); + if (Number.isFinite(a) && Number.isFinite(b)) out[key] = a + (b - a) * t; + } + return out; +} + +function blendRoundViewerStates(from, to, t, seconds) { + const state = { ...from }; + state.fighters = (from.fighters || []).map((fighter, index) => + blendNumbers(fighter, to.fighters?.[index], blendFighterKeys, t)); + const blendBall = (ball, other) => + ball ? blendNumbers(ball, other, blendPointKeys, t) : ball; + if (from.balls) + state.balls = from.balls.map((ball, index) => + blendBall(ball, to.balls?.[index])); + if (from.ball) state.ball = blendBall(from.ball, to.ball); + if (from.camera) { + state.camera = blendNumbers(from.camera, to.camera, blendCameraKeys, t); + for (const part of ["position", "target"]) + if (from.camera[part]) state.camera[part] = + blendNumbers(from.camera[part], to.camera?.[part], blendPointKeys, t); + } + // Projectiles have no identity on the wire, so they are carried forward on + // their own reported velocity rather than matched against the next frame's + // rows — a wrong match teleports a streak across the arena. A shot flies + // straight, so this is not an approximation of the host's path, it IS it. + if (from.shots) state.shots = from.shots.map((row) => { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + return [x + vx * seconds, y + vy * seconds, z, + previousX + vx * seconds, previousY + vy * seconds, vx, vy, owner, flags]; + }); + if (from.lobs) state.lobs = from.lobs.map((row, index) => { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + const next = to.lobs?.[index]; + // A blast's ring grows over a fifth of a second, which is six wire + // frames — steppy enough to see. It blends when the next frame plainly + // holds the same blast; otherwise the radius stands. + const radius = next && next[6] === flags && next[5] === owner + ? blastRadius + (next[7] - blastRadius) * t : blastRadius; + const moving = flags & 2 ? 0 : seconds; + return [x + vx * moving, y + vy * moving, z, vx, vy, owner, flags, + radius, fuseMs]; + }); + return state; +} + +// The buttons a challenger's pad may carry up the wire — the fight's own +// vocabulary, no system keys. View and Menu stay local: a rival must never +// toggle the host's debug overlay or send their game back to the title. +const versusInputButtons = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"]; +// The buttons of the last frame the wire actually took, held apart from the +// whole frame so a press can be told from a stick twitch. +let versusInputLastDown = "[]"; + +// The challenger's half of the versus wire: sample the local pad, ship it on +// change, and heartbeat while idle so silence can mean absence. Sends pace +// themselves a hair above the relay's own floor — a press that lands inside +// the pause simply leaves on the next tick rather than being dropped. +function sendChallengerInput(now) { + if (roundViewer?.seat !== "challenger" || + typeof roundViewer.sendInput !== "function") return; + // Holding the chair is not the same as sitting in it. A visitor who has not + // come through the door sends nothing, so the host reads the seat as empty + // and the room stays open for somebody who has — and this visitor keeps + // watching the fight, which was never gated. + if (!versusAllowed()) return; + const pad = typeof gamepad === "function" ? gamepad(0) : null; + if (!pad) return; + const down = (pad.down || []) + .filter((button) => versusInputButtons.includes(button)).slice(0, 10); + const round2 = (value) => Math.round((Number(value) || 0) * 100) / 100; + const frame = { down, leftX: round2(pad.leftX), leftY: round2(pad.leftY) }; + const worn = JSON.stringify(frame); + // A button edge leaves at once. The 33 ms floor was written to pace a + // stick, which drifts continuously and would otherwise send every tick — + // but a press is a discrete event, and holding one back for up to two + // frames put a third of a display's lag into the one thing a player feels + // most. Only the analog half still waits. + const pressed = JSON.stringify(down); + const edge = pressed !== versusInputLastDown; + if (!edge) { + if (worn !== versusInputLastSent) { + if (now < versusInputMinNextAt) return; + } else if (now < versusInputNextAt) return; + } + versusInputMinNextAt = now + 33000; + // An unchanged frame is repeated once soon after a change, then settles + // into the idle heartbeat. The relay drops what arrives too fast and says + // nothing about it, so a lost edge used to be invisible for a quarter of a + // second; one cheap echo closes that window without adding a protocol. + versusInputNextAt = now + (edge ? 50000 : 250000); + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + if (roundViewer.sendInput({ seq: versusInputSeq++, ...frame, + name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors })) { + versusInputLastSent = worn; + versusInputLastDown = pressed; + } +} + +// --------------------------------------------------------------------------- +// Rollback netplay. Both seats run the whole fight; nobody streams it to the +// other. Each tick a seat schedules its own pad a couple of frames ahead, +// mails it, and simulates the current frame with the rival's last known pad +// standing in for the one that has not arrived. When the real pad lands and +// differs, the sim steps back to the snapshot before that frame and replays +// forward in silence. That is what Street Fighter 6 does; the price is a +// simulation that is a pure function of (frame, both pads), and a snapshot of +// every variable that simulation touches. The list lives in netSimScalars / +// netSimArrays below and the netplay test pins it: two seats fed the same +// pads must hash identical states, round after round. +const NET_TICK_US = replayTickUs; +// Frames a press waits before it is simulated. Two at 60 Hz is 33 ms — the +// same order as a display's own lag, and it means a rival packet arriving +// within ~33 ms costs no rollback at all. +const NET_INPUT_DELAY = 2; +// How far past the rival's newest pad we will guess before we stop and wait. +// Eight frames is 133 ms of one-way silence, well past the relay's p99. +const NET_MAX_ROLLBACK = 8; +// Pads per packet. Every packet re-sends this many recent frames so a lost +// packet costs nothing unless several vanish in a row. +const NET_REDUNDANCY = 10; +const NET_HASH_EVERY = 30; +// The floor of frame zero's clock. The host offers its own clock rounded up +// to a tick so its timeline runs straight into the fight; this floor keeps +// every "0 means unset" deadline in the sim unset whatever the host reports. +const NET_ORIGIN_US = 1000000; +// Wall-clock silence after which the rival is gone and the fight ends. +const NET_PEER_LOST_MS = 4000; +const NET_HELLO_INTERVAL_MS = 1000; +let netInbox = []; +let netPeerHello = null; +let netHelloSentAt = 0; +const netPadCache = new Map(); + +// A recorded mask back into the pad shape the sim reads (see resimPad). One +// object per mask value, frozen, so a frame costs no allocation. +function netPadFromMask(mask) { + mask = mask | 0; + let pad = netPadCache.get(mask); + if (pad) return pad; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + pad = Object.freeze({ connected: true, down: Object.freeze(down), + leftX: 0, leftY: 0, rightX: 0, rightY: 0 }); + netPadCache.set(mask, pad); + return pad; +} + +// Everything the simulation reads or writes that is not a constant, a render +// cache, or the wire. Scalars are captured and restored by name; the arrays +// are deep-copied. The netplay test pins that this list covers the round clock. +function netSimScalars() { + return { + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + }; +} +function netRestoreScalars(saved) { + ({ + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + } = saved); +} +const netSimArrays = () => ({ + players, balls, bullets, grenades, impacts, detachedParts, skateRopes, + // `saberPickups` belongs here for the same reason every other array does, + // and leaving it out was a real desync: a rollback that does not restore it + // re-simulates frames in which a blade was already taken, or takes one that + // the rewound timeline had not yet dropped. `swordHeld` itself rides on the + // player and was always restored -- which is what made this so quiet. The + // two seats agreed about every number they hashed while disagreeing about + // whether somebody was holding a sword, and a sword is a 1.5x reach + // multiplier in `meleeSpecFor`, so they went on agreeing right up until a + // strike landed one frame apart on one screen and not the other. + gunPickups, saberPickups, grenadePickups, bodyTrees, gridField, + resultReactionPrevious, fightHitMarks, +}); + +function netSnapshot() { + const arrays = {}; + for (const [name, live] of Object.entries(netSimArrays())) + arrays[name] = structuredClone(live); + return { scalars: netSimScalars(), arrays }; +} + +// Restore in place: the live arrays are `const` and referenced everywhere, so +// their identity stays and their contents are replaced. Keys the live object +// grew since the snapshot are removed too — a key the sim added later must not +// survive a rewind. +function netRestore(snapshot) { + if (!snapshot.scalars.skateparkMap && snapshot.scalars.netRoundMapIndex >= 0 && + netRoundMapIndex !== snapshot.scalars.netRoundMapIndex) + installRoundMap(snapshot.scalars.netRoundMapIndex); + configureWorldMap(snapshot.scalars.skateparkMap ? "skatepark" : "station"); + netRestoreScalars(structuredClone(snapshot.scalars)); + const live = netSimArrays(); + for (const [name, saved] of Object.entries(snapshot.arrays)) { + const target = live[name]; + const copy = structuredClone(saved); + if (ArrayBuffer.isView(target)) { target.set(copy); continue; } + if (target.length === copy.length && copy.every((entry) => + entry && typeof entry === "object" && !Array.isArray(entry))) { + for (let index = 0; index < target.length; index++) { + const item = target[index]; + if (!item || typeof item !== "object") { target[index] = copy[index]; continue; } + for (const key of Object.keys(item)) + if (!(key in copy[index])) delete item[key]; + Object.assign(item, copy[index]); + } + } else { + target.length = 0; + target.push(...copy); + } + } +} + +// FNV-1a over the state that decides a fight. Exact doubles, not rounded: a +// last-bit difference is a real desync and must read as one. +// Debug only: the exact JSON the last hash was taken over, and a ring of it +// per frame while `__oskiewarHashTrace` is set. A desync report names a +// frame and two numbers; this is what turns those numbers back into fields. +let netLastHashText = ""; +const netHashTexts = new Map(); +function netStateHash() { + const view = players.map((player) => [player.x, player.y, player.z, + player.vx, player.vy, player.vz, player.facing, player.alive, + player.grounded, player.ducking, player.blocking, player.score, + player.roundWins, player.attackKind, player.attackUntil, + player.hitStunUntil, player.stance, player.gunAmmo, player.grenadeAmmo, + player.heldBall, player.removedParts, player.dashUntil, + // Holding a blade decides how far a hand reaches, so it decides the + // fight and belongs in the hash. It is here because it was NOT here: two + // seats disagreeing about a sword hashed identically for hundreds of + // frames and were found apart only once the reach changed an outcome, + // which is the most expensive way to learn about a desync. + player.skateboard, player.skateVx, player.skateWallSide, + player.skatePitch || 0, player.skateContacts || 0, player.swordHeld, player.ropeIndex, player.ropeLink, player.ropeGrabLocked, player.skateLoop, + player.loopAngle, player.loopSpeed, player.loopCooldownUntil, player.skateRotation, player.boostUntil, + player.headBounceCharge || 0, player.headPumpDirection || 0, player.headPumpAt || 0, + player.headRoll || 0, player.headRollRate || 0, + player.knockVx, player.windVx, player.dashVx, player.inputX, player.inputY, + player.previous, player.suppressedDirections, player.lastTap, player.lastRelease]); + view.push(skateparkMap, netRoundMapIndex, roundModifier, netRoundClockDebtUs, skateRopes); + view.push(balls.map((item) => [item.active, item.x, item.y, item.z, + item.vx, item.vy, item.heldBy])); + // Projectiles by position, not just by count. A round whose flight differs + // between the two machines kills different fighters, and hashing only the + // length let that drift silently: the count matched right up to the frame + // one seat's bullet connected and the other's missed. + view.push(bullets.map((shot) => [shot.x, shot.y, shot.z, shot.vx, shot.vy, + shot.owner, shot.life])); + view.push(grenades.map((lob) => [lob.x, lob.y, lob.z, lob.vx, lob.vy, + lob.owner, lob.fuse, lob.alive, lob.exploding, lob.blastRadius, + lob.hitPlayers])); + view.push([...gunPickups, ...saberPickups, ...grenadePickups].map(p => + [p.kind || "GRENADE", p.active, p.x, p.y, p.dropVy || 0, + p.dropping || false, p.dropLandingY ?? null, p.respawnAt || 0])); + view.push(roundResult, roundElapsedUs, + matchOver, roundStartedAt, roundOverAt); + const text = JSON.stringify(view); + if (globalThis.__oskiewarHashTrace) netLastHashText = text; + let hash = 0x811c9dc5; + for (let index = 0; index < text.length; index++) { + hash ^= text.charCodeAt(index); + hash = Math.imul(hash, 0x01000193) >>> 0; + } + return hash; +} + +// The local seat's handle and wardrobe, in the shape the pad frames already +// carry, so the host can dress both fighters the same way on both screens. +function netLocalIdentity() { + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + return { name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors }; +} + +function netCleanName(value, fallback) { + const offered = String(value || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); + return /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : fallback; +} + +function netCleanColors(value) { + return (Array.isArray(value) ? value : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)).slice(0, 4); +} + +function netAverageColor(colors, fallback) { + if (!colors.length) return fallback.slice(); + return colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); +} + +// The deal the host writes and both seats apply: who sits where, wearing +// what, and the clock and ball they share. Everything the first frame's +// state derives from that is not already a constant of the build. +function netMakeDeal() { + const local = players[0]; + const rival = netPeerHello || {}; + const rivalColors = netCleanColors(rival.colors); + const hostNow = Math.max(NET_ORIGIN_US, runtime().monotonicUs); + const origin = Math.ceil((hostNow + NET_TICK_US) / NET_TICK_US) * NET_TICK_US; + return { t: "start", v: 2, origin, delay: NET_INPUT_DELAY, + ballType: matchBallType, map: skateparkMap ? "skatepark" : "station", + fighters: [ + { name: netCleanName(local.name, ""), rosterIndex: local.rosterIndex, + color: local.color.slice(0, 3), + handleColors: netCleanColors(local.handleColors) }, + { name: netCleanName(rival.name, ""), rosterIndex: -1, + color: netAverageColor(rivalColors, [38, 82, 176]), + handleColors: rivalColors }, + ] }; +} + +function netApplyIdentities(deal) { + deal.fighters.forEach((entry, index) => { + const player = players[index]; + player.name = entry.name; + player.rosterIndex = entry.rosterIndex; + player.color = entry.color.slice(); + player.handleColors = entry.handleColors.map((c) => c.slice()); + }); + versusRivalName = deal.fighters[1].name; +} + +// Frame zero. Both seats run this with the same deal under the same clock, +// and the state that comes out is the state the fight starts from — the +// hash exchange on the first frame says whether it really is. +function netBegin(deal, seat, send) { + netEnd("restart"); + const session = { seat, deal, frame: 0, originUs: deal.origin, + delay: deal.delay, send, + local: new Map(), remote: new Map(), used: new Map(), snapshots: new Map(), + remoteFrame: -1, remoteSimFrame: 0, lastRemoteMask: 0, ackFrame: -1, + confirmed: -1, hashes: new Map(), peerHashes: new Map(), + lastPacketAt: Date.now(), startedAt: Date.now(), ticks: 0, + // peerStamp is the newest wall-clock mark heard from the rival, echoed + // back on our next packet so they can read their own round trip; pingMs is + // ours, read from the echoes coming the other way. + peerStamp: 0, + stats: { rollbacks: 0, rolledFrames: 0, maxRollback: 0, stalls: 0, + waits: 0, sent: 0, received: 0, desyncs: 0, snapshotMs: 0, resimMs: 0, + // `pings` counts measurements, not milliseconds: a round trip under half + // a millisecond rounds to zero, and a meter that reads "no measurement + // yet" on a LAN would be wrong at exactly the moment it is best. + pings: 0, pingMs: 0 } }; + for (let frame = 0; frame < deal.delay; frame++) session.local.set(frame, 0); + netSession = session; + // The relay's clock is the fight's clock: a host who was reading tells at + // quarter speed is back at full the moment the rival is real. + if (gameSpeed !== 1) { + gameSpeed = 1; + gameSpeedChangedAt = 0; + emitSignal("game-speed", -1, 1, 0); + } + netRoundClockDebtUs = 0; + netClockUs = deal.origin; + netFrameInputs = [0, 0]; // Never inherit either machine's local Menu/held pad. + try { + configureWorldMap(deal.map); + netRoundMapIndex = -1; + matchBallType = deal.ballType; + // The limb poses that collide are phased off this epoch, so both seats + // must share it; and a rollback fight is never a recorded one. + startedAt = deal.origin; + lastSimAt = deal.origin; + replay = null; + startVersusFight(deal.origin, true); + netApplyIdentities(deal); + } finally { + netFrameInputs = null; + netClockUs = null; + } + telemetry("NET_BEGIN", "seat " + seat + " delay " + deal.delay); +} + +// Leaving on purpose tells the rival at once instead of costing them the +// silence timeout; whatever the leaving seat's game did next stands. +function netLeave(reason) { + if (!netSession) return; + try { netSession.send({ t: "bye", o: netSession.originUs, r: reason }); } + catch (_) {} + netEnd(reason); +} + +function netEnd(reason) { + if (!netSession) return; + // A rival who has gone will never confirm anything, and the round they lost + // still happened — the frames past the frontier cannot change with nobody + // left to press anything. + flushPendingRoundReplay(runtime().monotonicUs); + const stats = netSession.stats; + // A seat in a rollback fight sends net packets, not pads, so the moment + // this lane closes the host has heard nothing on the pad wire for as long + // as the fight lasted. Read literally that is an empty chair, and an empty + // chair resets the match — which would turn a repaired desync into a lost + // score. The grace covers the changeover; a rival who has genuinely gone + // still times out, just three seconds later. + if (reason === "desync" || reason === "desync-peer" || reason === "workshop") + versusSeatGraceUntil = Date.now() + 3000; + // The stream this seat is about to start watching again is a new timeline. + if (roundViewer) resetRoundViewerPlayout(); + // Time never runs backwards: the local clock picks up where the fight's + // clock stood, so every deadline the fight left behind is still meaningful. + scaledClockUs = Math.max(scaledClockUs, + netSession.originUs + netSession.frame * NET_TICK_US - netRoundClockDebtUs); + telemetry("NET_END", reason + " frames " + netSession.frame + + " rollbacks " + stats.rollbacks + " rolled " + stats.rolledFrames + + " max " + stats.maxRollback + " stalls " + stats.stalls + + " waits " + stats.waits + " desyncs " + stats.desyncs); + netSession = null; + netInbox.length = 0; + netPeerHello = null; + globalThis.__oskiewarNetStats = null; +} + +// The rival's pad for a frame: the real one if it came, otherwise the newest +// one we have — a hand mostly keeps doing what it was doing. +function netRemoteInputFor(session, frame) { + const known = session.remote.get(frame); + if (known !== undefined) return known; + for (let back = frame - 1; back >= 0 && back >= frame - NET_MAX_ROLLBACK * 2; back--) { + const older = session.remote.get(back); + if (older !== undefined) return older; + } + return session.lastRemoteMask; +} + +function netInputsFor(session, frame) { + const local = session.local.get(frame) ?? 0; + const remote = netRemoteInputFor(session, frame); + return session.seat === 0 ? [local, remote] : [remote, local]; +} + +function netSimulateFrame(session, frame, silent) { + const started = performance.now(); + session.snapshots.set(frame, netSnapshot()); + session.stats.snapshotMs += performance.now() - started; + const inputs = netInputsFor(session, frame); + session.used.set(frame, inputs); + netFrameInputs = inputs; + netRoundClockDebtUs += NET_TICK_US * (1 - roundSpeed()); + netClockUs = session.originUs + (frame + 1) * NET_TICK_US; + netSilent = silent; + try { + gameSim(); + } finally { + netClockUs = null; + netSilent = false; + netFrameInputs = null; + } +} + +// A rollback un-happens frames, and the frames it un-happens were written +// down. Every row in a demo's logs is stamped with the tick it belongs to, so +// taking the record back to a frame is a truncation — and the silent +// re-simulation that follows re-files the corrected rows itself, which is why +// the recorders are NOT muted while it runs. The two cursors that decide when +// the next row is due are rebuilt from what survives, so they rewind too +// without having to ride in the snapshot. +// +// Without this a versus demo was written from mispredicted frames: it recorded +// the rival pad this seat had GUESSED, so the stored fight replayed into a +// different one. That is what "a rollback fight is never a recorded one" meant. +function replayRewind(session, toFrame) { + if (!replay) return; + const tick = demoTick(session.originUs + (toFrame + 1) * NET_TICK_US); + const keep = (rows) => { + if (!Array.isArray(rows)) return rows; + let length = rows.length; + while (length > 0 && rows[length - 1][0] >= tick) length--; + rows.length = length; + return rows; + }; + keep(replay.commands); + keep(replay.checkpoints); + keep(replay.events); + keep(replay.impacts); + keep(replay.rounds); + keep(replayRoundMarks); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + // The dedupe cursor is whatever each pad was last recorded as saying; a + // command that was truncated must be writable again. + replayLastCommand = [-1, -1]; + for (const row of replay.commands) replayLastCommand[row[1]] = row[2]; + replayNextCheckpointAt = replay.checkpoints.length + ? session.originUs + (toFrame + 1) * NET_TICK_US : 0; + // A round whose end was taken back is not a round to file. + if (replayPendingSaveFrame >= toFrame) replayPendingSaveFrame = -1; +} + +// The earliest frame we simulated with a guessed rival pad that has since +// been contradicted. Frames past `confirmed` are the only candidates. +function netEarliestMisprediction(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + for (let frame = session.confirmed + 1; frame < session.frame; frame++) { + const real = session.remote.get(frame); + if (real === undefined) return null; + const used = session.used.get(frame); + if (used && used[remoteSeat] !== real) return frame; + session.confirmed = frame; + } + return null; +} + +function netRollback(session, toFrame) { + const started = performance.now(); + const depth = session.frame - toFrame; + netRestore(session.snapshots.get(toFrame)); + replayRewind(session, toFrame); + for (let frame = toFrame; frame < session.frame; frame++) + netSimulateFrame(session, frame, true); + session.stats.rollbacks++; + session.stats.rolledFrames += depth; + session.stats.maxRollback = Math.max(session.stats.maxRollback, depth); + session.stats.resimMs += performance.now() - started; +} + +function netPrune(session) { + const floor = Math.min(session.confirmed, session.frame - NET_MAX_ROLLBACK - 2); + for (const frame of session.snapshots.keys()) + if (frame < floor) session.snapshots.delete(frame); + for (const frame of session.used.keys()) + if (frame < floor) session.used.delete(frame); + const inputFloor = floor - NET_REDUNDANCY * 2; + for (const frame of session.local.keys()) + if (frame < inputFloor) session.local.delete(frame); + for (const frame of session.remote.keys()) + if (frame < inputFloor) session.remote.delete(frame); + for (const frame of session.hashes.keys()) + if (frame < inputFloor) session.hashes.delete(frame); + for (const frame of session.peerHashes.keys()) + if (frame < inputFloor) session.peerHashes.delete(frame); +} + +function netDrainInbox(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + // Taken as a batch: a hash mismatch inside this loop ends the session and + // empties the inbox underneath it. + const batch = netInbox.splice(0, netInbox.length); + for (const packet of batch) { + if (!packet || typeof packet !== "object") continue; + // A hello inside a session is never the rival still talking: the + // challenger stops saying hello the moment it has one. It is somebody with + // no session — the same person having reloaded, or a new arrival in the + // chair — and it has to be read that way BEFORE the clock below is + // touched. Stamping it as a live packet was the deadlock: a tab that is + // killed sends no `bye`, so this seat waited on four seconds of silence + // that the rejoiner's own 1 Hz hello refreshed forever. This seat went on + // simulating against a rival who only ever said hello, and the rejoiner + // never got a deal back. Neither could leave. Treating it as a departure + // frees both: the lobby is one tick away, and the next hello a second + // later deals a fresh session with the fresh identity. + if (packet.t === "hello") { + // Except a straggler still in flight from before the deal was made, + // which would kill a session one frame old. + if (Date.now() - session.startedAt > NET_HELLO_INTERVAL_MS * 2) + session.peerLeft = true; + continue; + } + // A straggler from the fight before. The shell's inbox is not emptied when + // a session ends and packets stay in flight across the changeover, so + // without this the old rival's last presses were written into the new + // fight at frames it had not reached — on the seat that received them and + // nowhere else. Measured: two seats agreed through frame 330 of a rejoined + // fight and were found apart at the next checkpoint. An older build sends + // no tag and is taken at its word, as it always was. + if (packet.o !== undefined && packet.o !== session.originUs) continue; + session.lastPacketAt = Date.now(); + session.stats.received++; + if (packet.t === "workshop" && session.seat === 1) { session.peerWorkshop = true; continue; } + if (packet.t === "bye") { session.peerLeft = true; continue; } + // The rival noticed the divergence first. Same repair from this side, and + // no answering packet: a desync that echoed would ping-pong. + if (packet.t === "desync") { session.peerDesync = true; continue; } + if (packet.t === "i" && Array.isArray(packet.m) && + Number.isInteger(packet.f)) { + // m[k] is the pad for frame f + k; the newest is the last. + for (let index = 0; index < packet.m.length && index < NET_REDUNDANCY * 2; index++) { + const frame = packet.f + index; + const mask = packet.m[index] | 0; + if (frame < 0 || session.remote.has(frame)) continue; + session.remote.set(frame, mask); + if (frame > session.remoteFrame) { + session.remoteFrame = frame; + session.lastRemoteMask = mask; + } + } + if (Number.isInteger(packet.a)) session.ackFrame = Math.max(session.ackFrame, packet.a); + if (Number.isInteger(packet.s)) session.remoteSimFrame = Math.max(session.remoteSimFrame, packet.s); + // Ping, by echo. `w` is the rival's own mark, which we hold and send + // back; `e` is one of ours coming home, so the round trip is a + // subtraction in OUR clock and the two machines need no shared time. + // It reads up to one frame long, because the rival holds our mark until + // their next tick — an honest part of what a press actually costs. + if (Number.isInteger(packet.w)) session.peerStamp = packet.w; + if (Number.isInteger(packet.e) && packet.e > 0) { + const trip = Date.now() - packet.e; + if (trip >= 0 && trip < 4000) { + session.stats.pingMs = session.stats.pings + ? session.stats.pingMs + (trip - session.stats.pingMs) * .15 : trip; + session.stats.pings++; + } + } + if (Array.isArray(packet.h) && packet.h.length === 2) + netNotePeerHash(session, packet.h[0], packet.h[1], remoteSeat); + if (netSession !== session) return; + } + } +} + +function netNotePeerHash(session, frame, hash) { + if (!Number.isInteger(frame)) return; + const mine = session.hashes.get(frame); + if (mine === undefined) { session.peerHashes.set(frame, hash); return; } + if (mine !== hash) { + session.stats.desyncs++; + telemetry("NET_DESYNC", "frame " + frame + " mine " + mine + " theirs " + hash); + netDesyncRepair(session, frame); + } +} + +// A desync used to be counted and then lived with: two machines that are no +// longer playing the same fight went on playing their different ones, and the +// two people found out when one of them died on a screen where they had not +// been hit. +// +// The repair is to stop pretending there are two authorities. The host has +// one, so both seats fall back to the lane where the host IS the authority: +// the challenger goes back to watching the host's stream with its pads going +// up the wire, and the host resumes the streamed versus fight it was already +// publishing for the grandstand. The fight does not stop, it does not rewind, +// and nobody has to re-adopt a state that will not fit through a 2 KiB +// channel. What it costs is the rollback lane's latency, which is the honest +// price of one machine having been wrong. +// +// Both seats have to agree, or the host sits waiting for packets that are not +// coming — so the seat that notices says so, and both then refuse to open a +// rollback session again for a while. Without that cooldown the challenger's +// next hello would deal a fresh session into the same divergence, one second +// later, forever. +const NET_DESYNC_COOLDOWN_MS = 60000; +let netLaneBlockedUntil = 0; + +function netDesyncRepair(session, frame) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + try { session.send({ t: "desync", o: session.originUs, f: frame }); } + catch (_) {} + netEnd("desync"); +} + +// Our state hash at the newest frame both pads are known for — a frame that +// will never be rolled back again, so both seats hash the same thing if +// they are the same game. +function netExchangeHash(session) { + const frame = session.confirmed; + if (frame < 0 || frame % NET_HASH_EVERY !== 0 || session.hashes.has(frame)) return; + const snapshotAfter = session.snapshots.get(frame + 1); + if (!snapshotAfter) return; + // Hash the snapshot taken before frame+1, i.e. the state after `frame`, + // without disturbing the live state: restore is destructive, so hash the + // live state only when it IS that frame. + let hash; + if (session.frame === frame + 1) hash = netStateHash(); + else { + const live = netSnapshot(); + netRestore(snapshotAfter); + hash = netStateHash(); + netRestore(live); + } + session.hashes.set(frame, hash); + if (globalThis.__oskiewarHashTrace) { + netHashTexts.set(frame, netLastHashText); + if (netHashTexts.size > 600) + netHashTexts.delete(netHashTexts.keys().next().value); + } + const theirs = session.peerHashes.get(frame); + if (theirs !== undefined) netNotePeerHash(session, frame, theirs); + session.pendingHash = [frame, hash]; +} + +function netSendInputs(session) { + // Every local pad we have decided on, including the one just scheduled for + // frame + delay. Sending one short of it starves the rival: they stall for + // the frame we are holding, we stall for the frame they are holding, and + // both fights crawl (measured in the browser harness: two thirds of ticks + // spent waiting) even on a wire with no latency at all. + const newest = session.frame + session.delay; + const first = Math.max(0, newest - NET_REDUNDANCY + 1); + const masks = []; + for (let frame = first; frame <= newest; frame++) + masks.push(session.local.get(frame) ?? 0); + // `o` is the deal's own origin, which is to say: which fight this is. Frame + // numbers restart at zero every session, so an input packet from the fight + // before is indistinguishable from a current one by its contents alone — and + // it lands on frames the new fight has not reached yet, on one seat only. + const packet = { t: "i", o: session.originUs, f: first, m: masks, + a: session.remoteFrame, s: session.frame, w: Date.now() }; + if (session.peerStamp) packet.e = session.peerStamp; + if (session.pendingHash) { packet.h = session.pendingHash; session.pendingHash = null; } + if (session.send(packet)) session.stats.sent++; +} + +// One driver tick of a rollback fight. Ingest the rival, repair the past if +// it was guessed wrong, schedule and mail our own pad, then either step one +// frame or hold — hold when we have guessed as far as we dare past the +// rival's last real pad, or when we are simply running ahead of them. +function netTick() { + const session = netSession; + netDrainInbox(session); + if (!netSession) return; + // The rival told us the two fights came apart. Drop to the streamed lane, + // where there is only one authority, and stay out of the rollback lane long + // enough that the next hello is not just the same divergence again. + if (session.peerWorkshop) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + return; + } + if (session.peerDesync) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("desync-peer"); + return; + } + if (session.peerLeft || Date.now() - session.lastPacketAt > NET_PEER_LOST_MS) { + const seat = session.seat; + netEnd(session.peerLeft ? "rival-left" : "peer-lost"); + globalThis.__oskiewarRemotePad = null; + // The host is left alone in its room; the challenger's bridge is still + // up and goes back to watching whatever the room shows next. + if (seat === 0 && versusActive()) beginVersusLobby(runtime().monotonicUs); + return; + } + const earliest = netEarliestMisprediction(session); + if (earliest !== null) netRollback(session, earliest); + // A round whose end is now behind the confirmed frontier is a round that + // happened. Past this line no rival pad can reach back and unmake it. + if (replayPendingSaveFrame >= 0 && session.confirmed >= replayPendingSaveFrame) + flushPendingRoundReplay(runtime().monotonicUs); + const scheduled = session.frame + session.delay; + if (!session.local.has(scheduled)) { + const pad = typeof gamepad === "function" ? gamepad(0) : null; + session.local.set(scheduled, pad ? inputCommand(pad) : 0); + } + netSendInputs(session); + session.ticks++; + if (session.frame > session.remoteFrame + NET_MAX_ROLLBACK) { + session.stats.waits++; + return; + } + // Frame advantage: if we are more than a delay's worth ahead of where the + // rival says they are, give back one tick in four until we are level. Paced + // by ticks, not frames — a frame that stalls does not advance, and a stall + // keyed on the frame number would hold that frame forever. + const ahead = session.frame - session.remoteSimFrame; + if (ahead > session.delay + 1 && session.ticks % 4 === 0) { + session.stats.stalls++; + return; + } + netSimulateFrame(session, session.frame, false); + session.frame++; + netPrune(session); + netExchangeHash(session); + // The hash exchange can find the mismatch that ends this session. + if (netSession !== session) return; + // A window into the lane for the debug overlay, the agent tools and the + // browser harness: what the fight is costing and whether it is one game. + globalThis.__oskiewarNetStats = { seat: session.seat, frame: session.frame, + // Who this fight believes is in it. A desync hash cannot see an identity + // fault — two machines can agree perfectly about a fight between two + // people who are not there — so the deal's names ride the same window the + // harness and the debug overlay already read. + names: session.deal.fighters.map((entry) => entry.name), + confirmed: session.confirmed, remoteFrame: session.remoteFrame, + hash: session.hashes.get(session.confirmed) ?? 0, + hashFrame: session.confirmed, ...session.stats, + behind: Math.max(0, session.frame - 1 - session.remoteFrame) }; +} + +// The challenger announces itself on the net channel until the host answers +// with a deal; a host that never answers is an older build, and the fight +// falls back to the streamed lane it always had. +function netChallengerHello(now) { + if (workshopMap) return; + if (netSession || roundViewer?.seat !== "challenger" || + typeof roundViewer.sendNet !== "function" || !versusAllowed()) return; + // Not before the shell has finished asking who is here. Identity rides this + // packet once and is then frozen into the deal for the whole fight, and a + // rejoin IS a fresh page load — so the 1 Hz hello below routinely beat the + // session check and dealt a signed-in player in under no name at all. Worse, + // resetRound re-applies the deal every round, so the wrong name was restamped + // even after the real one arrived. A shell with no account system is an older + // build, not a visitor still being asked, and is never held here. + if (accountState() && !accountReady()) return; + const at = Date.now(); + if (at < netLaneBlockedUntil) return; + if (at - netHelloSentAt < NET_HELLO_INTERVAL_MS) return; + netHelloSentAt = at; + roundViewer.sendNet({ t: "hello", v: 2, ...netLocalIdentity() }); +} + +// Packets that arrive before a session exists: the challenger's hello lands +// on the host, the host's deal lands on the challenger. Anything else waits +// in the inbox for the session to drain. +function netHandlePreSession(packet) { + if (!packet || typeof packet !== "object") return; + // A packet from the lane we have just fallen out of. Both ends are watching + // the same cooldown, so this is a straggler in flight, not an offer. + if (Date.now() < netLaneBlockedUntil) return; + if (packet.t === "hello" && packet.v !== 2) return; + if (packet.t === "hello" && !roundViewer) { + netPeerHello = { name: packet.name, colors: packet.colors, at: Date.now() }; + return; + } + if (packet.t === "start" && roundViewer?.seat === "challenger" && + packet.v === 2 && Number.isInteger(packet.origin) && + Number.isInteger(packet.delay) && Array.isArray(packet.fighters) && + packet.fighters.length === 2) { + const bridge = roundViewer; + netBegin(packet, 1, (content) => bridge.sendNet(content)); + return; + } + netInbox.push(packet); +} + +// The host's side of the opening: a fresh challenger who said hello gets a +// deal instead of the streamed fight. +function netHostBegin(now) { + if (workshopMap) return false; + // Same door, other side: a deal struck before this seat knows its own handle + // names the host for the rest of the fight, on both screens. + if (accountState() && !accountReady()) return false; + const deal = netMakeDeal(); + const room = "ow-" + versusRoomName; + const send = (content) => typeof globalThis.__oskiewarNetSend === "function" + ? globalThis.__oskiewarNetSend(room, content) : false; + if (!send(deal)) return false; + netBegin(deal, 0, send); + return true; +} + +function netDrainHostInbox() { + const inbox = globalThis.__oskiewarNetInbox; + if (!Array.isArray(inbox) || !inbox.length) return; + for (const packet of inbox) { + if (netSession) netInbox.push(packet); + else netHandlePreSession(packet); + } + inbox.length = 0; +} + +// A visitor who arrived through a shared address and found nobody hosting +// takes the room over — the link a friend sent must keep working after the +// sender's tab closed. The chair-holder claims first; a seat-denied watcher +// waits three times as long, so two arrivals at a dead address stagger +// instead of racing, and updateVersusConflict catches the tie anyway. +function updateVersusClaim(now) { + if (globalThis.__oskiewarVersusCapable !== true || !roundViewer) return false; + // Claiming a dead address means hosting, and hosting is playing. Whoever + // arrives next deserves a room with a named fighter standing in it. + if (!versusAllowed()) return false; + // A room with a live host is a fight to join; a room with a stored demo is + // a replay page and keeps being one — versus rooms never record, so only a + // truly empty address falls through to the claim. + if (roundViewer.live || roundViewerDemo || roundViewerMode === "DEMO") { + versusClaimArmedAt = 0; + return false; + } + if (!versusClaimArmedAt) { + versusClaimArmedAt = now; + return false; + } + const wait = roundViewer.seat === "challenger" + ? versusClaimAfterUs : versusClaimAfterUs * 3; + if (now - versusClaimArmedAt < wait) return false; + const name = roundViewer.name; + versusFallbackBridge = roundViewer; + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + versusClaimArmedAt = 0; + versusRoomName = name; + globalThis.__oskiewarRemotePad = null; + beginVersusLobby(now); + telemetry("VERSUS_CLAIM", name); + return true; +} + +// A demo carries the impacts the live pass spawned. Replaying them puts the +// sparks and debris back into a repaint that otherwise only moves bodies. +// The demo loops, so a tick that runs backwards restarts the sweep clean. +function replayViewerImpacts(tick, dt) { + const rows = roundViewerDemo?.impacts || []; + if (tick < roundViewerImpactTick) { + roundViewerImpactTick = -1; + impacts.length = 0; + } + for (const row of rows) + if (row[0] > roundViewerImpactTick && row[0] <= tick) { + const seconds = (row[5] || 300) / 1000; + impacts.push({ x: row[1], y: row[2], z: row[3], + life: seconds, duration: seconds, + death: row[4] === 1, explosion: row[4] === 2 }); + } + roundViewerImpactTick = tick; + updateResultImpactDebris(dt); +} + +function gameBoot() { + nativeHudOverlay = typeof capabilities === "function" && capabilities().hudOverlay === true; + globalThis.__oskiewarWorkshopCommand = workshopCommand; + workshopBase ||= workshopSnapshot(); + if (globalThis.__oskiewarPublishedMap && globalThis.__oskiewarValidateMap) { + workshopMap = globalThis.__oskiewarValidateMap(globalThis.__oskiewarPublishedMap); + workshopTainted = true; + } + syncGameView(); + // The reel harness may boot with the debug overlay lit — safe-zone crops, + // stat chassis, input read-outs — to diagnose framing on a rendered reel. + if (globalThis.__oskiewarDebugOverlay === true) debugHitboxes = true; + // Name the session once. A client-error restart re-runs boot inside the + // same app run, and whoever attached to the session should not lose it to + // a crash the restart exists to paper over. + if (!sessionName) { + seedNames(Math.floor(Math.random() * 4294967296)); + sessionName = pronounceableMatchName(); + } + startedAt = runtime().monotonicUs; + roundStartedAt = startedAt; + lastSimAt = startedAt; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + emitSignal("hello", -1, 1, 0); + shellMode = "MENU"; + titleTransitionAt = null; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + shellPrevious = []; + startInputPending = false; + localControllerPairSeen = false; + localControllerMissing = -1; + navigationPrevious = [[], []]; + roundViewer = globalThis.__oskiewarRoundBridge || null; + if (roundViewer?.start) { + shellMode = "GAME"; + selecting = false; + roundResult = ""; + matchOver = false; + // Watching a fight IS gameplay for the person doing it. This was false on + // every watcher, and the whole match HUD hangs off it: no round clock, no + // VS or WAITING FOR HOST label, no "you are ..." seat line, no status + // tray. That is the "no state updates on screen" @jeffrey reported. + gameplayStarted = true; + matchName = roundViewer.name || ""; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + matchName) : spectatorQr; + roundStartedAt = startedAt - roundIntroDurationUs(); + roundViewerStop = roundViewer.start(handleRoundViewer); + return; + } + if (globalThis.__oskiewarSelfPlay) { + // A harness cast keeps the pre-versus reading of the empty door: nobody + // is holding a controller, so "no opponent" means the climb, never a + // lobby waiting on a friend who cannot exist. + if (!String(globalThis.__oskiewarOpponent || "").trim() || + survivalRequested()) + startSurvivalRun(startedAt, true); + else startSelfPlay(startedAt); + return; + } + if (survivalRequested()) beginSurvival(startedAt); + else if (versusRequested()) { + versusRoomName = sessionName; + beginVersusLobby(startedAt, { title: true }); + } else beginTraining(startedAt); +} + +function resetRound(now, resetMatch = false, keepMap = false) { + resetWorkshopMap(); + rotateLocalMap(keepMap, resetMatch); + if (netSession && !skateparkMap) { + if (netRoundMapIndex < 0) netRoundMapIndex = 0; + else if (!keepMap && roundResult) + netRoundMapIndex = (netRoundMapIndex + 1) % localMapVariants.length; + installRoundMap(netRoundMapIndex); + } + if (replay) { + const nextRoundName = pronounceableMatchName(); + // A versus room is one address for a whole match — the link a friend was + // sent, the socket the fight is riding, the code on the wall. Handing over + // to a new room between rounds would move every watcher and close the + // publisher out from under the fight. Only the broadcast lane hands over, + // where each round IS its own room. + if (!versusLane()) { + if (matchName) publishSpectator(now, { + target: matchName, nextRoundId: "ow-" + nextRoundName, force: true, + }); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + nextRoundName) : null; + } + previousRoundName = matchName; + matchName = nextRoundName; + // Stamped, so a rollback across this rollover takes the entry back with it. + replayRoundMarks.push([demoTick(now), matchName]); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + } + // Terrain belongs to the simulation contract, not the spectator URL. A + // network series keeps one landscape; local rounds rotate authored maps + // independently of their public room names. + configureWorldMap(skateparkMap ? "skatepark" : "station"); + resetSkateRopes(); + terrainPhase = terrainSeed("oskiewar-physics-1-hills"); + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + roundReplayFrames = []; + roundReplayLastAt = 0; + instantReplay = null; + replayOfferPrevious = []; + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; + for (const player of players) { + applyRoster(player, player.rosterIndex); + player.x = player.spawnX; + player.y = airRoundActive() ? floorY - 400 : terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.facing = player.pad === 0 ? 1 : -1; + player.grounded = !airRoundActive(); + player.ducking = false; + player.alive = true; + player.respawnAt = 0; + player.score = 0; + if (resetMatch) player.roundWins = 0; + player.inputX = 0; + player.inputY = 0; + player.lastTap = {}; + player.lastRelease = {}; + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + player.walkSince = 0; + player.attackKind = ""; + player.attackUntil = 0; + player.attackHit = false; + player.blocking = false; + player.blockFlash = 0; + player.shieldLocked = false; + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + player.shieldBrokenAt = 0; + player.windVx = 0; + player.knockVx = 0; + player.shieldVx = 0; + player.gunAmmo = 0; + player.grenadeAmmo = 0; + player.gunAimX = player.facing; + player.gunAimY = 0; + player.gunAimLive = false; + player.gunMode = "HANDGUN"; + player.itemArm = ""; + player.nextGunShotAt = 0; + player.nextSpitAt = 0; + player.spitAt = -Infinity; + player.spitHeavy = false; + player.resultReaction = ""; + player.resultReactionAt = 0; + resultReactionPrevious[player.pad] = []; + player.stance = "NEUTRAL"; + player.itemAction = ""; + player.itemActionStartedAt = 0; + player.itemActionUntil = 0; + player.heldBall = -1; + player.heldPart = -1; + player.heldPlayer = -1; + player.carryArm = ""; + player.grabbedBy = -1; + resetSkate(player); + player.skateboard = skateparkMap && !survivalActive(); + player.ropeIndex = -1; + player.ropeGrabLocked = false; + player.ropeLink = chainLinks; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = 0; + player.boostUntil = 0; + player.skateVx = 0; + player.skateWallSide = 0; + player.swordHeld = false; + player.grabHeld = false; + player.commandStream = []; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + player.partDamage = {}; + player.removedParts = []; + player.fallenBodyGeometry = null; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.poundFrom = 0; + player.poundLevel = 0; + player.standingOn = -1; + player.previousY = player.y; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.botPresses = {}; + player.botAttackAt = now + 420000; + player.botItemAt = now + 600000; + player.botSinkAt = now + 900000; + player.botSinkTaps = 0; + player.botSinkNextAt = 0; + player.botAttackSequence = 0; + player.botJumpAt = now + 900000; + player.survivalTargetLevel = 1; + player.botThreatSeen = 0; + player.botShieldAt = Infinity; + player.botPunishedAt = 0; + player.botScene = null; + player.botGoal = ""; + player.botSubgoal = null; + player.botRngState = (Math.round(now / 1000) ^ + Math.imul(player.pad + 1, 0x9e3779b9)) >>> 0; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.headRoll = 0; + player.headRollRate = 0; + player.headBounceCharge = 0; + player.headPumpDirection = 0; + player.headPumpAt = 0; + // Only a LOCAL hand can still be leaning on a button across the reset; a + // bot's presses were just cleared, and a remote rival's ride their own + // wire — inheriting pad two's local snapshot would suppress them. + player.previous = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]).down.slice() + : player.npc || player.bot || player.remote ? [] + : padSnapshots[player.pad]?.down?.slice() || []; + player.suppressedDirections = player.previous.filter((button) => + button.startsWith("Arrow")); + player.lastButton = "NONE"; + player.lastButtonAt = 0; + } + // A blade dropped by a severed arm is round furniture, not map furniture: + // it exists because a hand stopped existing, and the bell undoes that. Drop + // the dropped ones rather than parking them inactive forever, so a long + // match cannot walk this array up one entry per lost arm. + saberPickups.length = saberPickups.filter((pickup) => pickup.startsActive) + .length; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + if (pickup.active) beginPickupDrop(pickup); + } + for (const tree of bodyTrees) { + tree.growth = 0; + tree.spent = false; + tree.y = terrainFloorAt(tree.x) - 60; + } + gridField.fill(0); + // A new round is a new exchange. Carrying the last one's frames across the + // bell would draw a history that never happened. + for (const meter of frameMeters) meter.length = 0; + nextPowerupAtUs = powerupIntervalUs; + powerupSequence = 0; + roundResult = ""; + roundOverAt = 0; // A fresh round cannot inherit a previous match's deadline. + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + lastSimAt = now; + roundStartedAt = now; + rollWind(now); + resetBalls(now); + if (replay) replay.rounds.push([demoTick(now), windDirection, windMph, + balls.length]); + // Live frame one belongs to fighter one: snap to the head, then let the + // authored sequence cross to the other fighter and pull out. A reel has a + // shorter contract and takes the whole face-off on frame zero below. + cameraCenter = (players[0].x + players[1].x) / 2; + cameraWidth = 960; + cameraCenterY = (players[0].y + players[1].y) / 2 - 90; + cameraContainFloor = 0; + const poseTime = (now - startedAt) / 1000000; + if (reelGroundCamera()) { + // Frame zero is the face-off, not one isolated portrait. The short reel + // intro cannot afford to spend half of itself finding the other fighter. + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.snap({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }); + } else { + const firstHead = runnerWorldGeometry(players[0], poseTime).head; + const portraitWidth = Math.max(96, firstHead.radius * 6.5); + const portraitTarget = { x: firstHead.x, y: firstHead.y, z: firstHead.z }; + cameraDoll.snap({ target: portraitTarget, + position: { x: portraitTarget.x, y: portraitTarget.y, + z: portraitTarget.z - Math.max(portraitWidth * 1.35, + Math.abs(worldNear) + 400) }, + width: portraitWidth, perspective: 0, fov: 55, roll: 0 }); + } + // A rollback fight's fighters are named by the deal, not by whichever + // machine ran the reset: applyRoster above dresses seat one from the local + // account, which on the challenger's screen is the challenger. + if (netSession) netApplyIdentities(netSession.deal); +} + +// The box the camera packs. It is a fighting-game pushbox rather than the +// animated silhouette on purpose: breathing and stride would otherwise pump +// the lens once per idle cycle. Reach spans a fully extended punch or kick so +// throwing one never shoves the frame; live limbs still set the containment +// floor for anything this box misses. +function fighterFrameRect() { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + for (const player of activePlayers()) { + // Trimmed 2026-08-09 — @jeffrey wanted the lens closer to the fight. + // The rect still tracks live position, so jumps and knockbacks widen + // the frame as they happen; this is standing headroom, not arc room. + // Rise trimmed 2026-08-11 — @jeffrey read the old headroom as fighters + // sitting too low in a vertical frame; less sky, more fighter. + // Reach is an anticipation margin, not containment — the live-silhouette + // floor catches an actual extended limb. On a narrow stage every world + // unit of width costs its height times the aspect, so the margin is + // priced by the same factor the fixed shot widths already pay; a phone + // spends its width on fighters, a television on room to swing. + const reach = (isHeadOnly(player) ? 34 : isPogo(player) ? 56 : 104) * + portraitPull(); + const rise = isHeadOnly(player) ? 48 : isPogo(player) ? 128 : 150; + left = Math.min(left, player.x - reach); + right = Math.max(right, player.x + reach); + top = Math.min(top, player.y - rise); + // Feet swing below the terrain contact point on slopes. Pack their full + // projected arc so camera yaw cannot shave them off at a safe-zone edge. + bottom = Math.max(bottom, player.y + (isHeadOnly(player) ? 18 : 38)); + } + // A shot remains physical until it hits something, so it remains a camera + // subject too. Include both ends of its swept path to prevent a fast round + // flickering outside the action-safe frame between simulation ticks — + // but only while it stays near the fight. In the padded room the leash + // spans the whole map, so every shot is framed like it always was; it + // exists because on the old street a ricocheting stray dragged the lens + // twenty thousand units from two idle fighters and the draw span took + // the Xbox to eleven frames a second. + const bulletLeash = 5200; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + if (!players.some((player) => + Math.abs(bullet.x - player.x) < bulletLeash && + Math.abs(bullet.y - player.y) < bulletLeash)) continue; + const previousX = bullet.previousX ?? bullet.x; + const previousY = bullet.previousY ?? bullet.y; + left = Math.min(left, previousX - 32, bullet.x - 32); + right = Math.max(right, previousX + 32, bullet.x + 32); + top = Math.min(top, previousY - 32, bullet.y - 32); + bottom = Math.max(bottom, previousY + 32, bullet.y + 32); + } + return { left, right, top, bottom }; +} + +// How far this stage is from a 16:9 television, as a lens factor. The fixed +// shot widths in this file — the framing floor, the killcam stand-off, the +// intro and result close-ups — are all width constants tuned on a widescreen, +// and the same width on a narrow stage reads twice as distant because the +// screen has no width to spare. Multiplying a CONSTANT by this converts it to +// the stage at hand. Multiplying a packed rect by it is how portrait play used +// to lose fighters off the screen edges: the pack already knows the aspect, +// and shrinking its answer shrinks the one axis that was load-bearing. +const portraitPull = () => clamp(cameraAspect / (16 / 9), .52, 1); +// A reel ends on the win. Nobody is holding a controller, so there is no wide +// shot to hand back to — the last thing in frame should be the winner's face. +const reelCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true && + capabilities().reelFullUi !== true; +// Ground coverage belongs to every 9:16 oven burn, including the full-UI +// lane. `reelCamera` is narrower: it also opts into minimal-HUD winner framing. +// Reusing that narrower predicate for terrain left full-UI reels with the TV +// slab edge behind the lens, exposing a hard cut beneath the floor. +const reelGroundCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true; + +// Rect-pack: the camera width that makes a world rect exactly fill the +// action-safe frame. Whichever axis runs out first decides the lens, so a +// stacked pair frames as tightly as a spread one — and because each term +// carries the live stage aspect, the answer is exact for a phone held +// upright, a television, and an ultrawide alike. +// +// A reel is the one place the pack is allowed to lie. A 9:16 render with +// nobody steering trades its side margins for bigger fighters on purpose — +// that is how the reels were tuned to read. Live play never gets that trade: +// a fighter cropped off a screen edge is a fighter you cannot play. +function rectPackWidth(rect) { + const safe = actionSafeRect(); + return Math.max( + (rect.right - rect.left) * (stageRight - stageLeft) / + Math.max(1, safe.right - safe.left), + (rect.bottom - rect.top) * cameraAspect * (stageBottom - stageTop) / + Math.max(1, safe.bottom - safe.top)) * + (reelCamera() ? portraitPull() : 1); +} +// A fighter reduced to a bouncing head is a few dozen units tall. Without a +// floor the pack would keep closing until one limb filled the screen. +// Lowered with the reach/rise trim above: the closest the lens may sit. +// The tightest the automatic camera may go. It scales with the same pull, or a +// portrait shot closes to the pull and then hits a floor sized for a television. +// The versus lobby holds a mid shot instead: one body under a close-up lens +// filled the screen and sat on top of the very instruction the room exists to +// show, and a visitor deciding whether to share the address wants to see the +// room they are inviting somebody into. Under the wordmark the same lobby +// sits for a portrait — the title is a face, and starting is the pullback +// that reveals the room. +const frameFloorWidth = () => + (lobbyActive() ? shellMode === "MENU" ? 430 : 860 + : compactLayout() ? 215 : 315) * portraitPull(); + +// Terrain is flat color, so it only has to reach as far as the lens can see. +// Submitting the whole arena pushed its far corners past the native ±30000 +// coordinate guard whenever the camera closed in or sat against a wall, which +// culled the ground quad and left the clear color where the stage should be. +function terrainSpan() { + // A lens sees more floor than its nominal width says — perspective, yaw, + // and the orbiting killcam all sweep past it, and a close shot's bottom + // corners un-project far along the ground plane. A fixed apron past the + // width keeps the sheet under every corner of the frame without doubling + // the whole street's quad count when the camera is wide; the near clipper + // has owned the old ±30000 native guard since it learned to cut faces + // instead of culling them. + const reach = cameraDoll.width + 2600; + const worldTop = survivalActive() ? survivalCeilingY : ceilingY; + return { left: Math.max(worldLeft, cameraCenter - reach), + right: Math.min(worldRight, cameraCenter + reach), + top: Math.max(worldTop, cameraCenterY - reach), + bottom: Math.min(parkDeepest, cameraCenterY + reach) }; +} + +function updateCamera(dt) { + if (survivalActive() || skateparkMap) return; + const rect = fighterFrameRect(); + // Look slightly ahead of fast movement so zoom starts before a fighter + // reaches the safe edge instead of reacting after the crossing. + const lookAhead = .2; + let leftDrift = 0; + let rightDrift = 0; + let upDrift = 0; + let downDrift = 0; + for (const player of activePlayers()) { + const dx = (player.vx + (player.windVx || 0) + (player.knockVx || 0) + + (player.shieldVx || 0)) * lookAhead; + const dy = player.vy * lookAhead; + leftDrift = Math.min(leftDrift, dx); + rightDrift = Math.max(rightDrift, dx); + upDrift = Math.min(upDrift, dy); + downDrift = Math.max(downDrift, dy); + } + rect.left += leftDrift; + rect.right += rightDrift; + rect.top += upDrift; + rect.bottom += downDrift; + const maxWidth = Math.max(worldRight - worldLeft, + (floorY - ceilingY) * cameraAspect); + // Perspective orbit and uneven ground skew the projected silhouette beyond + // its orthographic pushbox. A small fixed overscan keeps complete bodies in + // the action-safe rectangle without making the compact room feel distant. + const packWidth = rectPackWidth(rect); + const desiredWidth = clamp(packWidth * 1.08, frameFloorWidth(), maxWidth); + const widthSpeed = desiredWidth > cameraWidth ? 17 : 5.5; + const widthBlend = 1 - Math.exp(-Math.max(0, dt) * widthSpeed); + cameraWidth += (desiredWidth - cameraWidth) * widthBlend; + // An exponential ease always runs a fixed distance behind a target that is + // moving steadily, and the distance is the target's rate over the blend — + // about 160 units of width when the pair is separating at a walk. In the + // cube that debt was invisible: the two walls were 980 apart, so separation + // stopped growing before the debt could show. On a station twice that wide + // it is ten pixels of fighter hanging outside the action-safe rect, every + // frame, for as long as the two of them keep running apart. + // + // So containment gets a floor, and the ease keeps the rest. `rectPackWidth` + // is exactly the width that fits the pack inside the safe rect with nothing + // to spare; the 8% overscan above it is comfort and may arrive late. The + // camera may therefore be behind on looking good, and never behind on + // holding the fight. + cameraWidth = Math.max(cameraWidth, Math.min(packWidth, maxWidth)); + const halfWidth = cameraWidth / 2; + const halfHeight = cameraWidth / cameraAspect / 2; + // Center comes from the same rect the width did, so the frame pans down as + // the action drops and rides up onto the platform with it. + let desiredCenter = cameraWidth >= worldRight - worldLeft + ? (worldLeft + worldRight) / 2 + : clamp((rect.left + rect.right) / 2, + worldLeft + halfWidth, worldRight - halfWidth); + // Feet plant a capsule radius under the floor line, and the ground plane + // keeps covering that far past it, so the frame may sit that low rather + // than widening just to recentre a standing pair. + const footRoom = 40; + // Aim below the fighters' middle, not at it. A vertical frame centered on + // the bodies spends its whole upper half on sky; leaning the aim down + // rides them into the upper third with ground filling in beneath. The + // lean is priced against how much of the frame the pack already fills: + // in the cube's close-ups two fighters stand most of the view tall, and + // the full tower-era lean pushed their heads over the action-safe line — + // so it fades out as the pack closes on the frame's height. + const packFill = clamp((rect.bottom - rect.top) / Math.max(1, halfHeight), + 0, 2); + const aimLean = halfHeight * .22 * clamp((1.8 - packFill) / .8, 0, 1); + let desiredCenterY = airRoundActive() ? (rect.top + rect.bottom) / 2 + aimLean + : halfHeight * 2 >= floorY - ceilingY + ? (ceilingY + floorY) / 2 + : clamp((rect.top + rect.bottom) / 2 + aimLean, + ceilingY + halfHeight, parkDeepest + footRoom - halfHeight); + // Fold containment into the target before easing. Clamping the live camera + // after easing caused a one-frame reset whenever a fighter crossed the safe + // edge; the pack width now absorbs that motion while the center remains + // continuous. + const containLeft = rect.right - halfWidth * .92; + const containRight = rect.left + halfWidth * .92; + if (containLeft <= containRight) + desiredCenter = clamp(desiredCenter, containLeft, containRight); + const containTop = rect.bottom - halfHeight * .92; + const containBottom = rect.top + halfHeight * .92; + if (containTop <= containBottom) + desiredCenterY = clamp(desiredCenterY, containTop, containBottom); + const centerBlend = 1 - Math.exp(-Math.max(0, dt) * 9); + cameraCenter += (desiredCenter - cameraCenter) * centerBlend; + cameraCenterY += (desiredCenterY - cameraCenterY) * centerBlend; +} + +function updateCameraDoll(dt, now) { + if (freeForAll() || airRoundActive()) { + updateCamera(dt); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + const width = cameraWidth * playerCameraZoom; + cameraDoll.track({ target, position: { + x: target.x + Math.sin(playerCameraYaw) * width * 1.35, + y: target.y - width * (.026 + playerCameraPitch), + z: -Math.cos(playerCameraYaw) * width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (skateparkMap && !survivalActive() && shellMode === "GAME") { + const rider = players[netSession?.seat || 0]; + const width = Math.max(1100, 900 * cameraAspect) * playerCameraZoom; + const half = width / 2; + const desiredX = clamp(rider.x + clamp(rider.vx * .18, -300, 300), + worldLeft + half, worldRight - half); + const desiredY = rider.y - 180; + const blend = 1 - Math.exp(-dt * 9); + cameraCenter += (desiredX - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth = width; + cameraDoll.track({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, z: -width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + const introAge = now - roundStartedAt; + if (survivalActive()) { + const runner = players[0]; + const framedWidth = survivalFrameWidth * playerCameraZoom; + const halfHeight = framedWidth / cameraAspect / 2; + const desiredY = clamp(runner.y + halfHeight * .18, + survivalCeilingY + halfHeight, floorY + 40 - halfHeight); + const blend = 1 - Math.exp(-Math.max(0, dt) * 7); + cameraCenter += ((worldLeft + worldRight) / 2 - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth += (framedWidth - cameraWidth) * blend; + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter, y: cameraCenterY, + z: -framedWidth * 1.35 }, + width: framedWidth, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (roundResult) { + updateResultReactions(now); + const age = Math.max(0, (now - roundOverAt) / 1000000); + // The cinematic hands back to the wide shot at 1.45s so play can resume. + // A reel has no play to resume into, and handing back mid-celebration + // pulled the camera off the winner's face just as the hearts arrived, so + // there the shot is allowed to hold until the recording stops. + if (deathCinematic && (age < 1.45 || (reelCamera() && age < 6))) { + if (age < .11) return; + const loser = players[deathCinematic.loserPad]; + const winner = players[deathCinematic.winnerPad]; + const loserHead = loser.frozenGeometry?.head || + runnerWorldGeometry(loser, (now - startedAt) / 1000000).head; + const winnerHead = winner?.frozenGeometry?.head || (winner + ? runnerWorldGeometry(winner, (now - startedAt) / 1000000).head + : { x: cameraCenter, y: cameraCenterY, z: 0 }); + // The killcam used to sit inside the winner's own head, so the winner + // had to be culled or their body would have filled the lens — which is + // why the fighter who had just won blinked out for three quarters of a + // second. It stands off their shoulder now: back along the line between + // the two of them, raised, and aimed at a point most of the way to the + // fighter going down. Both are in the frustum, so nothing is hidden to + // make the shot and nobody vanishes. + // + // Every distance is drawn from the gap between the heads, because the + // pair can be a step apart or the width of the stage apart, and a fixed + // stand-off frames only one of those. + const headGap = Math.max(320, Math.abs(loserHead.x - winnerHead.x)); + // Center the complete pair. Favoring the loser pushed the winner across + // the viewport edge during the eased handoff. + const focus = { x: lerp(winnerHead.x, loserHead.x, .5), + y: lerp(winnerHead.y, loserHead.y, .5), + z: lerp(winnerHead.z, loserHead.z, .5) }; + const shoulder = { x: focus.x, y: focus.y, + // Stay outside the whole arena depth. The old close killcam entered + // the world volume and near-clipped limbs, floor, and wall polygons. + z: focus.z - Math.max(headGap * 1.3, Math.abs(worldNear) + headGap) }; + // Wider than the old close-up had to be, because it now has to hold two + // fighters rather than one — the 64° lens buys most of that back. Past + // about a 1300 gap this would open onto empty stage, so beyond there it + // settles toward the span the returning wide shot uses. + const shotWidth = Math.min(headGap * 1.7, headGap + 900) * portraitPull(); + if (age < .86) { + cameraDoll.track({ target: focus, position: shoulder, + width: shotWidth, perspective: 0, fov: 55, roll: 0 }, dt, 11); + return; + } + // Reels celebrate instead of returning. The lens narrows onto the + // winner's head rather than the camera dollying toward it: the standoff + // above is deliberately outside the arena depth, and flying in would put + // the floor and the winner's own limbs back through the near plane. + if (reelCamera() && winner) { + const push = clamp((age - .86) / .5, 0, 1); + const headFocus = { x: winnerHead.x, y: winnerHead.y, z: winnerHead.z }; + cameraDoll.track({ target: headFocus, position: { + x: headFocus.x, y: headFocus.y, z: shoulder.z }, + width: lerp(shotWidth, 430 * portraitPull(), push), + perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const returnAmount = clamp((age - .86) / .59, 0, 1); + const midpoint = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const span = Math.max(900, Math.abs(players[1].x - players[0].x) + 540) * + portraitPull(); + cameraDoll.track({ target: midpoint, + position: { x: midpoint.x, y: midpoint.y, + z: lerp(shoulder.z, midpoint.z - span * 1.2, returnAmount) }, + width: lerp(shotWidth, span, returnAmount), + perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const horizontalSpan = Math.abs(players[1].x - players[0].x); + const verticalSpan = Math.abs(players[1].y - players[0].y) * cameraAspect; + const closeWidth = Math.max( + Math.max(820, horizontalSpan + 540, verticalSpan + 520) * portraitPull(), + rectPackWidth(fighterFrameRect()) * 1.22); + cameraDoll.track({ target, + position: { x: target.x, + y: target.y, + z: target.z - closeWidth * 1.2 }, + width: closeWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 7); + return; + } + if (reelGroundCamera() && introAge < reelOpeningHoldUs) { + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + if (introAge < roundIntroDurationUs()) { + // One elapsed-time story: first fighter, second fighter, title pullback, + // then the fight. + // Nothing is counted in rendered frames, so live variable speed and an + // offline slow-motion burn tell the identical introduction. + const age = introAge / 1000000; + const firstEnd = 1; + const secondEnd = 2; + const poseTime = (now - startedAt) / 1000000; + const headOf = (player) => + (player.frozenGeometry || runnerWorldGeometry(player, poseTime)).head; + // Enough room around a head to read as a portrait rather than an eyeball. + const faceWidth = (head) => Math.max(96, head.radius * 6.5); + + const opening = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const openingWidth = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + + let target; + let width; + if (age < secondEnd) { + // Frame one is already on player one. Track easing carries the camera + // across to player two without a cut. + const head = headOf(players[age < firstEnd ? 0 : 1]); + target = { x: head.x, y: head.y, z: head.z }; + width = faceWidth(head); + } else { + const out = clamp((age - secondEnd) / + (roundIntroDurationUs() / 1000000 - secondEnd), 0, 1); + const eased = out * out * (3 - out * 2); + const head = headOf(players[1]); + target = { x: lerp(head.x, opening.x, eased), + y: lerp(head.y, opening.y, eased), + z: lerp(head.z, opening.z, eased) }; + width = lerp(faceWidth(head), openingWidth, eased); + } + // Stand off outside the arena depth. The framing is orthographic, so the + // distance costs nothing and `width` alone decides how close the shot + // reads — but a lens parked a face's width from a head sits inside the + // world volume and near-clips the head it came to look at, which is the + // same trap the killcam fell into and had to be pulled back out of. + const standOff = Math.max(width * 1.35, Math.abs(worldNear) + 400); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, z: target.z - standOff }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + // Measure complete animated silhouettes before rendering. This used to run + // as a final paint-time correction, which made the viewport skip a frame at + // the safe-zone edge. + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + // Lead the floor by exactly the debt the doll's own ease is about to run up. + // `track` pulls back at speed * 1.9 — 19 here — so a floor growing at R units + // a second settles 19 times slower than that, and the doll sits R/19 units of + // width behind it for as long as the growth lasts. In the cube that debt was + // unreachable: the walls were 980 apart and separation stopped growing long + // before it could accumulate. On a station twice that wide, two fighters + // running in opposite directions hold the growth up indefinitely, and the + // debt reads as a hand hanging outside the action-safe rect every frame. + // + // Adding the debt to the target is not a fudge — it is what makes the ease + // arrive where the fighters actually are rather than where they were. It + // costs nothing when nothing is moving apart, because the growth is zero and + // the lead is zero, so a settled fight frames exactly as it always did. + const containmentGrowth = dt > 0 + ? Math.max(0, containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, + containmentWidth + containmentGrowth / 19); + // A small overscan absorbs animated hands and feet before + // they reach the action-safe edge without loosening the close fight shot. + const naturalWidth = cameraWidth * 1.015; + // Hysteresis prevents a fighter hovering at the safe edge from repeatedly + // switching between close and wide framing. The band and the pushbox above + // are tuned together so the floor never has to release during an idle cycle; + // if it does, the lens breathes in time with the fighter's own animation. + if (cameraContainFloor > naturalWidth && + naturalWidth < cameraContainFloor * .92) { + const release = 1 - Math.exp(-Math.max(0, dt) * 1.6); + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, release); + } + const framedWidth = Math.max(naturalWidth, cameraContainFloor) * + (reelCamera() ? 1 : playerCameraZoom); + // Automatic framing stays orthographic, preventing camera movement from + // bending the arena. The right stick may still rotate the diorama explicitly. + const tilt = .026 + playerCameraPitch; + const dolly = 1.35; + cameraDoll.track({ target, + position: { + x: cameraCenter + Math.sin(playerCameraYaw) * framedWidth * dolly, + y: cameraCenterY - framedWidth * tilt, + z: -Math.cos(playerCameraYaw) * framedWidth * dolly }, + width: framedWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 10); +} + +function freezeFinalFrame(now, livePad = -1) { + const poseTime = (now - startedAt) / 1000000; + for (const player of activePlayers()) { + if (player.pad === livePad) { + delete player.frozenGeometry; + delete player.frozenAt; + continue; + } + player.frozenGeometry = runnerWorldGeometry(player, poseTime); + player.frozenAt = now; + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); +} + +function finishRound(now) { + if (roundResult) return; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + captureRoundReplay(now, true); + let roundPan = 0; + const winner = roundWinner(); + if (!winner) { + roundResult = "TIE"; + emitSignal("tie", -1, players[0].score, players[1].score); + } + else { + roundPan = panPlayer(winner); + winner.roundWins += 1; + matchOver = winner.roundWins >= matchWins; + roundResult = winner.name + (matchOver ? " WINS MATCH" : " WINS ROUND"); + emitSignal(matchOver ? "matchwin" : "roundwin", winner.pad, + winner.roundWins, winner.score); + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); + roundOverAt = now; + for (const player of players) player.vx = 0; + playDrum("clap", 1.2, roundPan); + captureFrameTelemetry(now, true); + saveRoundReplay(now); + // A deferred round still needs its replay to be filed from; the flush that + // files it closes the match out afterwards. + if (matchOver && !netSession) finishReplay(); +} + +function resultCardText() { + if (roundResult === "TIE") return { winner: "tie", action: "" }; + const encoded = roundResult.match(/^(@\S+)\s+WINS\b/i); + const winner = encoded?.[1] || + (roundWinner()?.name || "TIE"); + return { winner: winner.toLowerCase(), action: "" }; +} + +function updateResultReactions(now) { + const winningPad = roundWinner()?.pad ?? -1; + for (const player of players) { + const down = inputPads[player.pad]?.down || []; + const previous = resultReactionPrevious[player.pad]; + const laughChord = down.includes("A") && down.includes("B") && + (!previous.includes("A") || !previous.includes("B")); + const pressed = laughChord ? "LAUGH" : down.find((button) => + !previous.includes(button)); + if (pressed) { + const winner = player.pad === winningPad; + if (pressed === "ArrowLeft") player.facing = -1; + if (pressed === "ArrowRight") player.facing = 1; + player.resultReaction = winner + ? ({ LAUGH: "LAUGH", A: "KICK", B: "PUNCH", X: "POSE", Y: "DANCE", + ArrowLeft: "DASH", ArrowRight: "DASH", ArrowUp: "AIR", + ArrowDown: "CROUCH" }[pressed] || "DANCE") + : ({ A: "CRY", B: "WOE", X: "SULK", Y: "WIGGLE" }[pressed] || + "WOE"); + player.resultReactionAt = now; + if (player.resultReaction === "LAUGH") + emitSignal("laugh", player.pad, 1, 0); + else { + playSine(winner ? 520 : 145, .1); + emitSignal("reaction", player.pad, winner ? 1 : -1, 0); + } + } + resultReactionPrevious[player.pad] = down.slice(); + } +} + +function quantizedInput(pad, suppressed = []) { + const held = pad.down; + const active = (button) => held.includes(button) && !suppressed.includes(button); + let horizontal = (active("ArrowRight") ? 1 : 0) - + (active("ArrowLeft") ? 1 : 0); + let vertical = (active("ArrowUp") ? 1 : 0) - + (active("ArrowDown") ? 1 : 0); + if (!horizontal && Math.abs(pad.leftX) >= 0.48) horizontal = pad.leftX > 0 ? 1 : -1; + if (!vertical && Math.abs(pad.leftY) >= 0.48) vertical = pad.leftY > 0 ? 1 : -1; + return { horizontal, vertical }; +} + +function remember(player, button) { + player.lastButton = buttonLabel(button); + player.lastButtonAt = runtime().monotonicUs; + const command = { A: "/", B: "*", X: ")", Y: "+", + LeftShoulder: "+", RightShoulder: "+" }[button] || player.lastButton; + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"].includes(button)) + recordCommand(player, command, player.lastButtonAt); + telemetry("FIGHT_BUTTON", player.name + " " + player.lastButton); +} + +function recordCommand(player, label, now) { + const previous = player.commandStream.at(-1); + if (previous?.label === label && now - previous.at < 40000) return; + player.commandStream.push({ label, at: now }); + while (player.commandStream.length > commandStreamDepth) + player.commandStream.shift(); +} + +function fireGun(player, input) { + const now = runtime().monotonicUs; + const pose = gunPose(player, now, input); + player.gunAimX = pose.dx; + player.gunAimY = pose.dy; + const smg = player.gunMode === "RUBBER SMG"; + const rocket = player.gunMode === "ROCKET LAUNCHER"; + const laser = player.gunMode === "SPACE LASER"; + if (rocket) { + grenades.push({ x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * 2850, vy: pose.dy * 2850, owner: player.pad, + fuse: 3.2, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0, rocket: true }); + while (grenades.length > 12) grenades.shift(); + player.gunAmmo -= 1; + player.nextGunShotAt = now + 650000; + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 240000; + player.pendingMoveLabel = "ROCKET " + player.gunAmmo; + playDrum("kick", 1.15, panPlayer(player)); + playSine(92, .22); + emitSignal("rocket", player.pad, pose.dx, pose.dy); + return; + } + // Automatic means a fast succession of discrete rounds, never a shotgun + // fan. Holding fire schedules the next SMG round below. + const shots = 1; + for (let shot = 0; shot < shots; shot++) { + bullets.push({ + x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * (laser ? 9600 : smg ? 5000 : 4200), + vy: pose.dy * (laser ? 9600 : smg ? 5000 : 4200), + owner: player.pad, life: 1, rubber: smg, laser, + safeUntil: now + 100000, + }); + } + while (bullets.length > 24) bullets.shift(); + player.gunAmmo -= shots; + player.nextGunShotAt = now + (laser ? 340000 : smg ? 85000 : 220000); + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + (laser ? 210000 : 170000); + player.pendingMoveLabel = + (laser ? "LASER " : smg ? "RUBBER SMG " : "FIRE ") + player.gunAmmo; + for (let shot = 0; shot < shots; shot++) { + playDrum(laser ? "whoosh" : smg ? "block" : "hat", + laser ? 1.35 : smg ? .62 + shot * .08 : 1.05, panPlayer(player)); + playSine(laser ? 1180 : (smg ? 310 : 760) + shot * 55, + laser ? .13 : smg ? .055 : .08); + } + emitSignal(laser ? "laser" : "bullet", player.pad, pose.dx, pose.dy); +} + +// The mouth used by both face paint and projectile spawn. Its coordinates are +// authored in face-space, then rotated with a bodyless head. Keeping this one +// transform prevents the visible lips and the physical glob from separating +// while the head rolls. +function spitMouthPose(player) { + const radius = 22; + const direction = player.facing || 1; + const head = { x: player.x, y: player.y - radius }; + const roll = isHeadOnly(player) ? player.headRoll || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const localX = direction * radius * .2; + const localY = radius * .3; + const offsetX = localX * cosRoll - localY * sinRoll; + const offsetY = localX * sinRoll + localY * cosRoll; + // Position and aim are related but not identical: the mouth sits low on the + // face, while spit travels mostly forward with only a small downward pitch. + // Using center->mouth as velocity made that low placement dominate the shot + // and swing it sideways as the head rolled. + // The runner's `facing` sign names its mirrored drawing side; the visible + // face normal points away from that sign. Treating it as the normal sent the + // release upper-left while the mouth presented lower-right. + const aimLocalX = -direction; + const aimLocalY = -.22; + const aimX = aimLocalX * cosRoll - aimLocalY * sinRoll; + const aimY = aimLocalX * sinRoll + aimLocalY * cosRoll; + // Screen/world Y grows downward. Head roll owns the sideways swing, but a + // spit release always pitches below the mouth instead of becoming an + // upward shot during the top half of a roll. + const downwardAimY = Math.abs(aimY); + const aimLength = Math.hypot(aimX, downwardAimY) || 1; + return { + x: head.x + offsetX, + y: head.y + offsetY, + outX: aimX / aimLength, + outY: downwardAimY / aimLength, + roll, direction, + }; +} + +function spit(player, heavy = false) { + const now = runtime().monotonicUs; + if (now < (player.nextSpitAt || 0)) return; + const mouth = spitMouthPose(player); + const direction = mouth.direction; + // A rolling head spits WHERE ITS MOUTH POINTS. The lob leaves along the + // head's current angle, so aim on a bodyless head is a timing skill — wait + // for the roll to face your rival, or spit skyward and let it rain. Bodied + // fighters have no roll and lob flat-forward as before. headRoll is sim + // state (integrated in updatePlayers), so the re-sim agrees. + // Release at the visible lips, mostly face-forward with a slight downward + // pitch. Both the spawn and aim use the same rolling face transform. + const speed = heavy ? 520 : 680; + const toss = { x: mouth.outX * speed, y: mouth.outY * speed }; + bullets.push({ + x: mouth.x, y: mouth.y, z: player.z, + previousX: mouth.x, previousY: mouth.y, + vx: toss.x, vy: toss.y, + owner: player.pad, life: 1, spit: true, heavy, + // Let the glob visibly clear the lips and the spitter's own fallen limbs. + // Without this, a bodyless fighter often spat directly into its debris + // halo and produced only a yellow impact puff on the release frame. + safeUntil: now + 220000, + }); + while (bullets.length > 24) bullets.shift(); + player.nextSpitAt = now + (heavy ? 520000 : 260000); + player.spitAt = now; + player.spitHeavy = heavy; + player.lastButton = heavy ? "HEAVY SPIT" : "SPIT"; + player.lastButtonAt = now; + player.pendingMoveLabel = player.lastButton; + playSine(heavy ? 118 : 190, heavy ? .16 : .1); + playDrum(heavy ? "kick" : "hat", heavy ? .82 : .55, panPlayer(player)); + emitSignal("spit", player.pad, heavy ? 2 : 1, direction); +} + +function throwGrenade(player, input = null) { + const now = runtime().monotonicUs; + const aimX = input?.horizontal || player.facing; + const aimY = input ? -input.vertical : -.25; + const length = Math.hypot(aimX, aimY) || 1; + grenades.push({ x: player.x + player.facing * 150, + y: player.y - (player.ducking ? 80 : 145), z: player.z, + vx: aimX / length * 1950, vy: aimY / length * 1950, + owner: player.pad, + fuse: 1.15, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0 }); + while (grenades.length > 12) grenades.shift(); + player.grenadeAmmo -= 1; + player.itemAction = "THROW"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 260000; + player.pendingMoveLabel = "GRENADE " + player.grenadeAmmo; + playDrum("kick", .95, panPlayer(player)); + emitSignal("grenade", player.pad, player.facing, player.ducking ? 1 : 0); +} + +function beginPickupDrop(pickup) { + const live = activePlayers().filter(p => p.alive); + const all = [...gunPickups, ...saberPickups, ...grenadePickups]; + const slot = Math.max(0, all.indexOf(pickup)); + if (airRoundActive()) { + const middle = live.reduce((sum, p) => sum + p.x, 0) / Math.max(1, live.length); + pickup.x = clamp(middle + ((slot % 5) - 2) * 190, + worldLeft + 150, worldRight - 150); + pickup.y = Math.min(...live.map(p => p.y), floorY + 1e9) - 800 - slot * 110; + pickup.dropLandingY = null; + pickup.dropVy = 960; + } else { + pickup.dropLandingY = surfaceYAt(pickup.x, floorY) - 70; + pickup.y = Math.min(pickup.dropLandingY - 520, floorY - 900); + pickup.dropVy = 0; + } + pickup.dropping = true; + pickup.respawnAt = 0; +} + +function updateFallingPickups(dt, now) { + const live = activePlayers().filter(p => p.alive); + const lower = live.length ? Math.max(...live.map(p => p.y)) + 1000 : floorY + 1000; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + if (!pickup.active) { + if (airRoundActive() && pickup.startsActive) { + if (!pickup.respawnAt) pickup.respawnAt = now + 4000000; + if (now >= pickup.respawnAt) { pickup.active = true; beginPickupDrop(pickup); } + } + continue; + } + if (!pickup.dropping) continue; + pickup.dropVy = Math.min(airRoundActive() ? 1100 : 1400, + (pickup.dropVy || 0) + 1900 * dt); + pickup.y += pickup.dropVy * dt; + if (airRoundActive()) { + if (pickup.y > lower) beginPickupDrop(pickup); + } else if (pickup.y >= pickup.dropLandingY) { + pickup.y = pickup.dropLandingY; + pickup.dropVy = 0; + pickup.dropping = false; + } + } +} + +function updateGunPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of gunPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.gunAmmo = Math.min(30, player.gunAmmo + pickup.amount); + player.gunMode = pickup.kind || "HANDGUN"; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, player.gunMode + " +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 1, pickup.amount); + break; + } + } +} + +// A saber is picked up the way a gun is and kept the way a limb is. It needs +// a free arm to take, it lives on `swordHeld` rather than in an ammo count, +// and `meleeSpecFor` is what spends it — every hand strike gets half again +// its reach while the blade is in the hand. Nothing here fires. +function updateSaberPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of saberPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || player.swordHeld || + !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, + pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.swordHeld = true; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "LIGHT SABER"); + playDrum("clap", 1.25, panPlayer(player)); + playSine(520, .14); + emitSignal("saber", player.pad, 1, 0); + break; + } + } +} + +function updateGrenadePickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of grenadePickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.grenadeAmmo = Math.min(4, player.grenadeAmmo + pickup.amount); + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "GRENADE +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 2, pickup.amount); + break; + } + } +} + +// Ripe fruit is a new body and fifteen seconds. The clock is `roundElapsedUs` +// counting up toward `roundDurationUs`, so winding it back is what "adds +// time" means here — and it is clamped at zero, because a tree cannot make +// the round longer than a round. +// The tree leans in off its wall, so both the picture and the pickup test have +// to agree about where the fruit ended up. One function owns that. +// The tree climbs its wall more than it leans off it, because a fighter pinned +// against that wall still has to be able to reach the fruit from a jump. One +// function owns the geometry so the picture and the pickup test agree. +function treeFruit(tree) { + const toward = tree.x < (worldLeft + worldRight) / 2 ? 1 : -1; + // Cube-scale tree. The tower's tree leaned three tiles into a room that + // had thirty; the same lean in a ten-tile cube put ripe fruit inside a + // spawn-idle fighter's reach, and two fighters who never moved wound the + // clock back fifteen seconds every eighteen — no round could end. This + // tree climbs about two tiles of wall, leans under one tile in, and hangs + // its fruit high enough that picking it is a jump at the wall, never a + // side effect of standing near one. + const reach = 45 + 150 * tree.growth; + return { x: tree.x + toward * (reach * .35 + 30), y: tree.y - reach * 1.3, + z: tree.z, toward, reach, + tipX: tree.x + toward * reach * .5, tipY: tree.y - reach * .9 }; +} + +function updateBodyTrees(dt, now) { + const poseTime = (now - startedAt) / 1000000; + for (const tree of bodyTrees) { + // One harvest a round, said out loud. Eighteen seconds of ripening against + // a thirty second round used to say it on its own, and the padded room's + // quarter-pipe said it again by holding the fruit a wall's height above a + // standing fighter. The tower's floor is flat, which put the fruit back + // inside arm's reach — and two fighters then stood at the wall winding + // fifteen seconds off the clock every eighteen, so the round could not + // end. A round that cannot end is worse than a body that stays broken. + if (tree.spent) continue; + if (tree.growth < 1) { + tree.growth = Math.min(1, tree.growth + dt * 1000000 / treeRipenUs); + continue; + } + const fruit = treeFruit(tree); + for (const player of players) { + if (!player.alive) continue; + // A tile and a third — a hand up at the fruit, not the whole corner of + // the room. Sized with treeFruit above so a spawn-mark idler stays out + // of range; the two limits only hold together. + if (runnerDistanceToPoint(player, poseTime, fruit.x, fruit.y, fruit.z) > 120) + continue; + tree.growth = 0; + tree.spent = true; + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + roundElapsedUs = Math.max(0, roundElapsedUs - treeTimeBonusUs); + remember(player, "NEW BODY"); + playDrum("bell", 1.15, panPlayer(player)); + emitSignal("powerup", player.pad, 3, treeTimeBonusUs / 1000000); + break; + } + } +} + +function drawBodyTree(tree, t) { + const scale = cameraScale(); + const ripe = tree.growth >= 1; + // Unripe reads as a sapling rather than a dimmed icon: the trunk and canopy + // are literally shorter, so the stage tells you how long the walk can wait. + const { x: fruitX, y: fruitY, toward, tipX, tipY: crownY } = treeFruit(tree); + const sway = Math.sin(t * 1.4 + tree.x * .0007) * (3 + 9 * tree.growth); + const bark = mixColor([120, 92, 64], [58, 46, 38], visualTheme.light); + const leaf = ripe + ? mixColor([120, 226, 138], [46, 150, 84], visualTheme.light) + : mixColor([96, 140, 104], [44, 84, 60], visualTheme.light); + const tipY = crownY + sway; + worldCapsule(tree.x, tree.y, tree.z, tipX, tipY, tree.z, + Math.max(2, (11 + 9 * tree.growth) * scale), bark); + // Canopy sized with treeFruit's cube-scale lean: fronds stay under a tile + // long so the tree dresses its wall without reaching into the fight. + for (const spread of [-1, -.35, .35, 1]) { + worldCapsule(tipX, tipY, tree.z, + tipX + toward * (30 + 45 * tree.growth), + tipY + spread * (30 + 35 * tree.growth), tree.z, + Math.max(2, (8 + 8 * tree.growth) * scale), leaf); + } + if (!ripe) return; + // The fruit is the part you aim at, so it only exists once it can be taken. + const point = projectPoint(fruitX, fruitY + sway, tree.z); + filledDisc(point.x, point.y, Math.max(3, 46 * scale), + mixColor([236, 108, 132], [188, 62, 92], visualTheme.light)); +} + +function updatePowerups(now) { + while (roundElapsedUs >= nextPowerupAtUs) { + // Only the slot marked `cycle` is the rotation's business. Asking whether + // ANY gun pickup is on the map would let an untouched space laser sitting + // on the top deck stall the pistol reload for the whole round. + const pickup = gunPickups.find((slot) => slot.cycle); + // Authored maps may intentionally have no replenishing weapon. + if (pickup && !pickup.active) { + // The cycle's whole job is to keep six more rounds of ammo appearing + // somewhere worth crossing the station for — the corner tiles, + // alternating, so the reload never lives on one fighter's side. + pickup.active = true; + pickup.x = tileCenterX(powerupSequence % 2 === 0 + ? cornerColLeft : cornerColRight); + pickup.z = 0; + beginPickupDrop(pickup); + powerupSequence += 1; + emitSignal("powerup", -1, powerupSequence, nextPowerupAtUs / 1000000); + playDrum("clap", .9, 0); + } + nextPowerupAtUs += powerupIntervalUs; + } + updateGunPickups(now); + updateSaberPickups(now); + updateGrenadePickups(now); +} + +// Ghost trails map a ricochet's whole path. The fixed length is the entire +// point: shots here have no clock-based expiry, they bounce until they hit +// somebody, so a trail that grew with flight time would be the eleven-frames-a +// -second stray all over again — measured in line segments instead of terrain +// span. A ring buffer costs the same on the thousandth bounce as on the first. +// +// Sampling every third tick buys three times the arc for the same sixteen +// points, and a bounce records out of turn so the corner lands on the wall +// rather than being chorded through it. +const bulletTrailPoints = 12; +const bulletTrailStride = 4; + +function recordBulletTrail(bullet) { + if (!bullet.trail) { + // One allocation at birth, never per frame. + bullet.trail = new Array(bulletTrailPoints * 2).fill(0); + bullet.trailCount = 0; + } + const slot = (bullet.trailCount % bulletTrailPoints) * 2; + bullet.trail[slot] = bullet.x; + bullet.trail[slot + 1] = bullet.y; + bullet.trailCount++; +} + +function updateBullets(dt, now, combat = true) { + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + bullet.vx += windAcceleration * .12 * dt; + // A glob is a ball, not a round: gravity pulls the toss back down, and it + // dries out in flight rather than flying forever. The gravity is soft on + // purpose — the lob should hang for over a second, analog and watchable. + if (bullet.spit) { + bullet.vy += 700 * dt; + bullet.life -= dt * .22; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + continue; + } + } + bullet.previousX = bullet.x; + bullet.previousY = bullet.y; + bullet.x += bullet.vx * dt; + bullet.y += bullet.vy * dt; + // Held so the ricochets below can be spotted by the sign they flip. + const enteredVx = bullet.vx; + const enteredVy = bullet.vy; + // A laser bolt does not ricochet. Everything else in this game's ballistics + // is built on the opposite rule — "shots have no clock-based expiry, arena + // surfaces ricochet them so a long-travelling round remains part of the + // fight" — and that rule is what makes the pistol frightening in a closed + // room. The bolt is the other half of the pair: four of them, travelling + // more than twice as fast, each spent outright the moment it touches + // anything. Fast and honest against slow and haunting, and a laser miss is + // a miss for good. + if (bullet.laser && (bullet.x - 24 <= worldLeft + wallThickness || + bullet.x + 24 >= worldRight - wallThickness || + (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) || + bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness)) { + bullet.life = 0; + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .14, duration: .14, death: false, explosion: false }); + playDrum("hat", 1.4, panAt(bullet.x, bullet.z)); + continue; + } + // Shots have no clock-based expiry. Arena surfaces ricochet them so a + // long-travelling round remains part of the fight until contact. + if (bullet.x - 24 <= worldLeft + wallThickness) { + bullet.x = worldLeft + wallThickness + 24; + bullet.vx = Math.abs(bullet.vx); + } else if (bullet.x + 24 >= worldRight - wallThickness) { + bullet.x = worldRight - wallThickness - 24; + bullet.vx = -Math.abs(bullet.vx); + } + if (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) { + bullet.y = ceilingY + wallThickness + 24; + bullet.vy = Math.abs(bullet.vy); + } else if (bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness) { + bullet.y = terrainFloorAt(bullet.x) - wallThickness - 24; + if (bullet.spit) { + // A bouncing ball, not a ricochet: each bounce keeps half the height + // and costs a bite of the glob, and once the bounce is too small to + // read it dissipates where it lies instead of buzzing along the floor. + bullet.vy = -Math.abs(bullet.vy) * .56; + bullet.vx *= .84; + bullet.life -= .18; + if (Math.abs(bullet.vy) < 90) bullet.life = 0; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + } else playDrum("hat", .3, panAt(bullet.x, bullet.z)); + // A splash bounces any bodyless head standing in it — including the + // spitter's own, so spitting straight down is a little hop. Popcorn + // physics for the intimate spit fight. + for (const target of players) { + if (!target?.alive || !isHeadOnly(target)) continue; + if (Math.abs(target.x - bullet.x) > 70 || + Math.abs(target.y - bullet.y) > 90) continue; + target.vy = Math.min(target.vy, 0) - 240; + target.grounded = false; + } + } else bullet.vy = -Math.abs(bullet.vy); + } + // A bounce is worth a point of its own: on the stride alone the segment + // spanning a ricochet would cut the corner straight through the wall. + if (bullet.vx !== enteredVx || bullet.vy !== enteredVy || + bullet.trailTick === undefined) { + bullet.trailTick = 0; + recordBulletTrail(bullet); + } else if (++bullet.trailTick % bulletTrailStride === 0) + recordBulletTrail(bullet); + } + for (let left = 0; left < bullets.length; left++) { + const a = bullets[left]; + if (a.life <= 0) continue; + for (let right = left + 1; right < bullets.length; right++) { + const b = bullets[right]; + if (b.life <= 0 || a.owner === b.owner) continue; + if (Math.abs(a.x - b.x) <= 96 && Math.abs(a.y - b.y) <= 52 && + Math.abs(a.z - b.z) <= 48) { + a.life = 0; + b.life = 0; + spawnImpact({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, + z: (a.z + b.z) / 2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", 1, 0); + emitSignal("cancel", -1, a.owner, b.owner); + break; + } + } + } + if (!combat) return; + const poseTime = (now - startedAt) / 1000000; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + const shot = { x1: bullet.previousX ?? bullet.x, + y1: bullet.previousY ?? bullet.y, z1: bullet.z, + x2: bullet.x, y2: bullet.y, z2: bullet.z, width: 48 }; + for (const fragment of detachedParts) { + if (fragment.owner === bullet.owner && now < bullet.safeUntil) continue; + const contact = segmentSegmentClosest(shot, fragment); + if (contact.distance > (shot.width + fragment.width) / 2) continue; + const impulse = bullet.heavy ? 1500 : bullet.spit ? 900 : 1200; + fragment.vx += Math.sign(bullet.vx || 1) * impulse; + fragment.vy -= bullet.heavy ? 520 : 300; + fragment.owner = bullet.owner; + fragment.hitAfter = now + 120000; + bullet.life = 0; + spawnImpact({ x: contact.secondPoint.x, y: contact.secondPoint.y, + z: contact.secondPoint.z, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", .72, panAt(fragment.x1, fragment.z1)); + break; + } + if (bullet.life <= 0) continue; + const targets = [...players.filter((player) => player.pad !== bullet.owner), players[bullet.owner]]; + for (const target of targets) { + if (!target?.alive || (target.pad === bullet.owner && now < bullet.safeUntil)) + continue; + // Reflect across the circular shield's local surface normal. A square hit + // returns home; a glancing hit leaves at the corresponding ricochet angle. + // Flipping `owner` lets the returned shot hurt whoever fired it. + if (target.blocking) { + const shield = shieldGeometry(target); + const guard = sampleCombatBoxes(target,now).guard[0]; + if (guard && segmentBoxEntry({x1:bullet.previousX??bullet.x,y1:bullet.previousY??bullet.y, + z1:bullet.z,x2:bullet.x,y2:bullet.y,z2:bullet.z},guard,24)!==null) { + let nx = bullet.x - shield.x; + let ny = bullet.y - shield.y; + const normalLength = Math.hypot(nx, ny); + if (normalLength > .001) { + nx /= normalLength; + ny /= normalLength; + } else { + const speed = Math.hypot(bullet.vx, bullet.vy) || 1; + nx = -bullet.vx / speed; + ny = -bullet.vy / speed; + } + const normalVelocity = bullet.vx * nx + bullet.vy * ny; + bullet.vx -= 2 * normalVelocity * nx; + bullet.vy -= 2 * normalVelocity * ny; + bullet.x = shield.x + nx * (shield.radius + 25); + bullet.y = shield.y + ny * (shield.radius + 25); + bullet.owner = target.pad; + bullet.life = Math.max(bullet.life, .55); + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .18, duration: .18, death: false, explosion: false }); + breakShield(target, now); + emitSignal("ballblock", target.pad, 1, 0); + continue; + } + } + const contact = sweptProjectileContact([{ + x1: bullet.previousX ?? bullet.x, y1: bullet.previousY ?? bullet.y, + z1: bullet.z, x2: bullet.x, y2: bullet.y, z2: bullet.z, + width: 48, role: "bullet", part: "bullet", + }], target, poseTime); + if (contact && contact.separation <= 3) { + const pointContact = runnerContactToPoint(target, poseTime, + bullet.x, bullet.y, bullet.z); + const endpointHit = Math.min(pointContact.headDistance, + pointContact.bodyDistance) <= 24; + const headshot = endpointHit + ? pointContact.headDistance <= pointContact.bodyDistance + : contact.headshot; + const segmentIndex = endpointHit && !headshot + ? pointContact.segmentIndex : contact.segmentIndex; + bullet.life = 0; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: headshot, + explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + if (headshot) + killPlayer(target, bullet.owner, now, "SHOT"); + else { + applyBodyHit(target, segmentIndex, + bullet.x - bullet.vx, bullet.owner, now, + bullet.heavy ? 1680 : bullet.spit ? 920 : 1180, + bullet.heavy ? 260 : bullet.spit ? 90 : 125); + playDrum("block", .9, panPlayer(target)); + } + break; + } + } + } + for (let index = bullets.length - 1; index >= 0; index--) + if (bullets[index].life <= 0) bullets.splice(index, 1); +} + +function updateGrenades(dt, now, combat = true) { + for (const grenade of grenades) { + if (!grenade.alive) continue; + if (grenade.exploding) { + grenade.blastAge += dt; + grenade.blastRadius = grenadeBlastRadius * + Math.min(1, grenade.blastAge / grenadeBlastDuration); + const poseTime = (now - startedAt) / 1000000; + for (const player of combat ? players : []) { + if (!player.alive || (grenade.hitPlayers & (1 << player.pad))) continue; + const contact = runnerContactToPoint(player, poseTime, + grenade.x, grenade.y, grenade.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > + grenade.blastRadius) continue; + grenade.hitPlayers |= 1 << player.pad; + if (contact.headDistance <= grenade.blastRadius) + killPlayer(player, grenade.owner, now, "BLASTED"); + else { + const blastForce = 1250 + 850 * + (1 - clamp(contact.bodyDistance / grenadeBlastRadius, 0, 1)); + applyBodyHit(player, contact.segmentIndex, grenade.x, + grenade.owner, now, blastForce, 300); + } + } + if (grenade.blastAge >= grenadeBlastDuration) grenade.alive = false; + continue; + } + const previousY = grenade.y; + if (!grenade.rocket) { + grenade.vx += windAcceleration * .45 * dt; + grenade.vy += 1800 * dt; + } + grenade.x += grenade.vx * dt; + grenade.y += grenade.vy * dt; + grenade.fuse -= dt; + if (grenade.rocket) { + const poseTime = (now - startedAt) / 1000000; + for (const target of combat ? players : []) { + if (!target.alive || target.pad === grenade.owner) continue; + if (runnerDistanceToPoint(target, poseTime, + grenade.x, grenade.y, grenade.z) > 34) continue; + grenade.fuse = 0; + break; + } + } + const inset = wallThickness + 35; + if (grenade.x < worldLeft + inset) { + grenade.x = worldLeft + inset; + grenade.vx = Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } else if (grenade.x > worldRight - inset) { + grenade.x = worldRight - inset; + grenade.vx = -Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + if (!airRoundActive() && grenade.y < ceilingY + inset) { + grenade.y = ceilingY + inset; + grenade.vy = Math.abs(grenade.vy) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + const ledge = grenade.vy >= 0 && + ledgeCrossed(grenade.x, previousY, grenade.y, 30); + if (ledge) { + grenade.y = ledge.y - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + } else if (grenade.y >= terrainFloorAt(grenade.x) - 30) { + grenade.y = terrainFloorAt(grenade.x) - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + if (grenade.rocket) grenade.fuse = 0; + } + if (grenade.fuse <= 0) { + grenade.exploding = true; + grenade.blastAge = 0; + grenade.blastRadius = 0; + grenade.vx = 0; + grenade.vy = 0; + playDrum("kick", 1.25, panPlayer(players[grenade.owner])); + emitSignal("blast", grenade.owner, + grenade.x / worldRight, grenade.y / floorY); + } + } + for (let index = grenades.length - 1; index >= 0; index--) + if (!grenades[index].alive) grenades.splice(index, 1); +} + +function startMelee(player, kind, now) { + if (isHeadOnly(player) || isPogo(player)) return; + // Every fresh press starts a strike, including during the previous swing. + // updatePlayer detects the edge; holding a button does not auto-repeat. + const spec = meleeSpecs[kind]; + if (!spec) return; + const attackingPart = kind === "KICK" + ? player.facing > 0 ? "right-leg" : "left-leg" + : itemHand(player); + if (!hasPart(player, attackingPart)) return; + player.attackKind = kind; + player.lowKick = kind === "KICK" && + (player.ducking || (player.crouchBlend || 0) > .35); + player.attackStartedAt = now; + player.attackUntil = now + spec.windowUs; + player.attackHit = false; + player.attackMomentum = now < player.dashUntil + ? clamp(Math.abs(player.vx) / walkSpeed, 1.35, 2.25) : 1; + player.stance = "ATTACK"; + player.pendingMoveLabel = kind; + playDrum(spec.cue[0], spec.cue[1], panPlayer(player)); + emitSignal(kind.toLowerCase(), player.pad, player.facing, 0); +} + +const limbParts = ["left-arm", "right-arm", "left-leg", "right-leg"]; +const spiderLegParts = Array.from({ length: 8 }, (_, index) => + `spider-leg-${index + 1}`); +const hasPart = (player, part) => !player.removedParts?.includes(part); +const isPogo = (player) => hasPart(player, "torso") && + limbParts.every((part) => !hasPart(player, part)); +const isHeadOnly = (player) => !hasPart(player, "torso"); +const availableArm = (player) => { + const lead = player.facing > 0 ? "right-arm" : "left-arm"; + if (hasPart(player, lead)) return lead; + const other = lead === "right-arm" ? "left-arm" : "right-arm"; + return hasPart(player, other) ? other : ""; +}; +// Ownership stays attached to the arm that picked the object up; turning or +// boarding cannot teleport a gun between hands. +const itemHand = (player) => player.itemArm || availableArm(player); +// Gun before grenade, always: the pistol is the sustained item and the one +// drawn in the hand, so "use what you are holding" needs no mode toggle. +const heldItem = (player) => + isHeadOnly(player) ? player.gunAmmo > 0 ? "GUN" : "" + : isPogo(player) || !itemHand(player) || !hasPart(player, itemHand(player)) + ? "" : player.gunAmmo > 0 ? "GUN" + : player.grenadeAmmo > 0 ? "GRENADE" : ""; +const itemSwinging = (player, now) => + (player.attackKind === "WHIP" || player.attackKind === "BASH") && + meleePulse(player, now) > 0; + +function meleePulse(player, now) { + if (now >= player.attackUntil || player.attackUntil <= player.attackStartedAt) return 0; + const phase = (now - player.attackStartedAt) / + (player.attackUntil - player.attackStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +// Collision starts on the input frame and lasts through the original short +// swing. A landed strike still hits only once; another tap starts a new one. +const meleeFrames = { + PUNCH: { startup: 0, active: 14, recovery: 0 }, + KICK: { startup: 0, active: 14, recovery: 0 }, + WHIP: { startup: 0, active: 12, recovery: 0 }, + BASH: { startup: 0, active: 17, recovery: 0 }, +}; +function meleeFrame(player, now) { + const timing = meleeFrames[player.attackKind]; + if (!timing || now < player.attackStartedAt || now >= player.attackUntil) + return { frame: 0, phase: 'neutral', startup: 0, active: 0, recovery: 0 }; + const frame = Math.floor((now - player.attackStartedAt) / replayTickUs + 1e-7) + 1; + return { ...timing, frame, phase: frame <= timing.startup ? 'startup' + : frame <= timing.startup + timing.active ? 'active' : 'recovery' }; +} + +function meleeTarget(player, now) { + const pulse = meleePulse(player, now); + const spec = meleeSpecFor(player, player.attackKind); + const lowKick = player.attackKind === "KICK" && player.lowKick; + const reachX = player.x + player.facing * (spec.reach + spec.swell * pulse); + // A low kick sweeps the ground in front of the kicker — the ground he is + // standing on. The bare terrain probe read the arena floor, so a low kick + // thrown on a rung aimed a storey down through the rung it stood on. + const sweepY = lowKick + ? Math.min(surfaceYAt(reachX, player.y), player.y + 20) - 5 : 0; + return { + x: player.x + player.facing * (spec.reach + spec.swell * pulse + + (lowKick ? 34 * pulse : 0)), + y: lowKick ? sweepY : player.y - (player.attackKind !== 'KICK' && + (player.ducking || player.crouchBlend > .35) ? 68 : spec.height), + z: player.z, + }; +} + +function itemActionPulse(player, now) { + if (!player.itemAction || now >= player.itemActionUntil) return 0; + const phase = (now - player.itemActionStartedAt) / + Math.max(1, player.itemActionUntil - player.itemActionStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +function itemHandTarget(player, now) { + // A surviving head grips the pistol at the mouth. It can still aim and fire, + // but grenades and melee weapons remain limb-dependent. + if (isHeadOnly(player)) return { + x: player.x + player.facing * 18, + y: player.y - 20, z: player.z, + }; + // A swung weapon rides the striking hand, so the drawn pistol or grenade + // sits on the live attack capsule instead of floating out in front. + if (itemSwinging(player, now)) return meleeTarget(player, now); + const pulse = itemActionPulse(player, now); + if (player.itemAction === "THROW") return { + x: player.x + player.facing * (42 + 52 * pulse), + y: player.y - 118 - 52 * pulse, z: player.z, + }; + if (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil)) { + const aimX = player.gunAimX || player.facing; + const aimY = player.gunAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { x: player.x + aimX / length * 108, + y: player.y - 102 + aimY / length * 92, z: player.z }; + } + return { x: player.x + player.facing * 108, + y: player.y - 115, z: player.z }; +} + +function itemForearm(player, geometry) { + const arm = itemHand(player); + return geometry.segments.find(segment => segment.part === arm && + (segment.role === "item-forearm" || segment.role === "attack-forearm")) || + geometry.segments.find(segment => segment.part === arm && + segment.role?.endsWith("forearm")); +} + +function gunPose(player, now, input = null) { + let aimX = input?.horizontal || player.facing; + let aimY = input ? -input.vertical : 0; + if (!input && (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil))) { + aimX = player.gunAimX || player.facing; + aimY = player.gunAimY || 0; + } + const length = Math.hypot(aimX, aimY) || 1; + const dx = aimX / length; + const dy = aimY / length; + // The arm solver can clamp its reach, and skating rotates/translates the + // whole skeleton. Use its solved wrist rather than the untransformed aim + // target for both the held weapon and the projectile's muzzle. + const forearm = !isHeadOnly(player) && itemForearm(player, + player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, (now - startedAt) / 1000000)); + const hand = forearm ? {x:forearm.x2, y:forearm.y2, z:forearm.z2} + : itemHandTarget(player, now); + return { + hand, dx, dy, + muzzle: { x: hand.x + dx * 54, y: hand.y + dy * 54, z: hand.z }, + }; +} + +function meleeStrike(player, now) { + const target = meleeTarget(player, now); + return { + x: target.x, y: target.y, z: target.z, + radius: meleeSpecFor(player, player.attackKind).radius, + }; +} + +function shieldGeometry(player) { + const aimX = player.shieldAimX || player.facing; + const aimY = player.shieldAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { + x: player.x + aimX / length * shieldForward, + y: player.y - (player.shieldCrouched ? 58 : 90) - + aimY / length * shieldForward, + z: player.z, + radius: shieldRadius, + }; +} + +// A shield is spent the moment it does its job. It eats exactly one hit, then +// drops — and `shieldLocked` keeps a still-held B from raising it again on the +// very next frame, which is what turns the break into a real opening instead +// of a flicker nobody can see. The shielder is deliberately left free to act: +// breaking the shield is what buys them the swing. +function breakShield(player, now) { + player.blocking = false; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blockFlash = 1; + player.stance = "SHIELD BREAK"; + player.pendingMoveLabel = "SHIELD BREAK"; + playDrum("bell", 1, panPlayer(player)); + emitSignal("shieldbreak", player.pad, 1, 0); +} + +// Stun scales with what the shield ate, so a BASH buys a longer punish than a +// WHIP. The floor is still long enough to answer at 60fps (~8 frames) and the +// ceiling short enough (~18) that a blocked attacker is opened, not deleted. +function shieldStunUs(force) { + return Math.round(140000 + clamp((force - 1000) / 750, 0, 1) * 160000); +} + +function returnBall(ball, player, now, shielded, intensity = 1) { + const incomingVx = ball.vx; + const incomingVy = ball.vy; + const direction = ball.x >= player.x ? 1 : -1; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const response = ball.hitScale || 1; + const momentum = shielded ? 1 : player.attackMomentum || 1; + const normalSpeed = (currentSpeed * 1.34 + 720) * intensity * + momentum * response; + const shieldMinimum = (1800 + clamp(intensity, 0, 1) * 1000) * response; + const speed = shielded + ? Math.min(4200 * response, Math.max(shieldMinimum, normalSpeed * 1.65)) + : Math.min(4800, normalSpeed); + ball.vx = direction * speed; + const lift = shielded ? .72 : player.inputY > 0 ? .58 + : player.attackKind === "KICK" ? .34 : .2; + ball.vy = -speed * lift; + ball.x = player.x + direction * (ball.radius + 85); + ball.y = Math.min(ball.y, player.y - 55); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 140000; + ball.safePlayers = 1 << player.pad; + if (!shielded) { + player.attackHit = true; + player.lastButton = "WACK"; + player.lastButtonAt = now; + } + else { + player.blockFlash = 1; + player.knockVx += incomingVx * .55; + player.vy = Math.min(player.vy + incomingVy * .16, -Math.max(520, speed * .28)); + player.grounded = false; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .22, duration: .22, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum(shielded ? "block" : "clap", shielded ? 1.1 : 1.25, + panAt(ball.x, ball.z)); + emitSignal(shielded ? "ballblock" : "wack", player.pad, + direction, Math.round(speed)); +} + +function crossWackBall(ball, hitters, now) { + const first = hitters[0]; + const second = hitters[1]; + const fighterDistance = Math.abs(first.player.x - second.player.x); + const convergence = clamp(1 - fighterDistance / 520, 0, 1); + const contact = (first.contact + second.contact) * .5; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.min(7600, (4100 + currentSpeed * .72 + + convergence * 2300 + contact * 900) * (ball.hitScale || 1)); + const stronger = first.contact >= second.contact ? first.player : second.player; + const direction = Math.sign(ball.vx) || stronger.facing || 1; + ball.vx = direction * speed; + ball.vy = -speed * (.3 + convergence * .18); + ball.x += direction * 35; + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 8); + ball.lastHitBy = -1; + ball.safeUntil = now + 180000; + ball.safePlayers = 3; + for (const hit of hitters) { + hit.player.attackHit = true; + hit.player.lastButton = "CROSS WACK"; + hit.player.lastButtonAt = now; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .32, duration: .32, death: false, explosion: true }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("clap", 1.55, panAt(ball.x, ball.z)); + emitSignal("crosswack", -1, direction, Math.round(speed)); +} + +function bootBall(ball, player, now) { + // Walking contact carries the grounded ball in the player's travel + // direction. A melee strike remains the intentionally stronger launch. + const direction = Math.sign(player.vx) || Math.sign(ball.x - player.x) || + player.facing || 1; + const dashing = now < player.dashUntil && Math.abs(player.dashVx) > walkSpeed; + const speed = Math.min(dashing ? 2600 : 1450, + (420 + Math.abs(player.vx) * (dashing ? .58 : .32)) * + (ball.hitScale || 1)); + ball.vx = direction * speed; + ball.vy = -Math.max(dashing ? 420 : 80, speed * (dashing ? .24 : .06)); + ball.x = player.x + direction * (ball.radius + 58); + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 2); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 180000; + ball.safePlayers = 1 << player.pad; + player.lastButton = dashing ? "DASH BOOT" : "BOOT"; + player.lastButtonAt = now; + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("kick", 1.12, panAt(ball.x, ball.z)); + emitSignal("boot", player.pad, direction, Math.round(speed)); +} + +function bounceBallOffBody(ball, player, now, segmentIndex = -1) { + const direction = Math.sign(ball.x - player.x) || -Math.sign(ball.vx) || + player.facing || 1; + const incomingSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.max(760, Math.min(3600, incomingSpeed * .86 / + Math.sqrt(ball.mass || 1))); + ball.vx = direction * speed; + ball.vy = -Math.max(260, Math.abs(ball.vy) * .42 + speed * .12); + ball.x += direction * (ball.radius + 18); + ball.lastHitBy = player.pad === 0 ? 1 : 0; + ball.safeUntil = now + 160000; + ball.safePlayers = 1 << player.pad; + applyBodyHit(player, segmentIndex, ball.x - ball.vx, + ball.lastHitBy, now, 760, 110, false); + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("block", .82, panAt(ball.x, ball.z)); + emitSignal("bodybounce", player.pad, direction, Math.round(speed)); +} + +function updateBall(ball, dt, now) { + // A popped ball is gone, not retired — a crater should cost the round its + // ball for a moment, not for good. It re-inflates over the middle once its + // serve time comes round. + if (!ball.active && ballEnabled && ball.serveAt && now >= ball.serveAt) { + ball.active = true; + // Re-inflate on the far side from wherever it popped, so the fighter who + // owned the ball's exit does not also own its return. + ball.x = ball.x > centerX + ? tileCenterX(cornerColLeft + 1) : tileCenterX(cornerColRight - 1); + ball.y = ceilingY + ball.radius + 120; + ball.z = 0; + ball.vx = 0; + ball.vy = 0; + ball.rotation = 0; + ball.lastHitBy = -1; + ball.safeUntil = now + 250000; + ball.safePlayers = 0; + emitSignal("ballserve", -1, 0, 0); + } + if (!ball.active || now < ball.serveAt) return; + if (ball.heldBy >= 0) { + const carrier = players[ball.heldBy]; + if (!carrier?.alive || carrier.heldBall !== balls.indexOf(ball)) { + ball.heldBy = -1; + } else { + ball.x = carrier.x + carrier.facing * (ball.radius + 54); + ball.y = carrier.y - (carrier.ducking ? 58 : 94); + ball.z = carrier.z - 6; + ball.vx = carrier.vx; + ball.vy = carrier.vy; + return; + } + } + const isBoard = ball.type === "skateboard"; + const contactRadius = isBoard ? skateAxleDrop + skateWheelRadius : ball.radius; + const platformSupported = ledgeSupports(ball.x, ball.y, contactRadius); + const floorSupported = ball.y >= terrainFloorAt(ball.x) - contactRadius - 2; + const grounded = (platformSupported || floorSupported) && Math.abs(ball.vy) < 180; + if (!grounded) ball.vx += windAcceleration * (ball.windFactor || .45) * dt; + ball.vy += 1900 * (ball.gravityFactor || 1) * dt; + const previous = { x: ball.x, y: ball.y, z: ball.z }; + ball.x += ball.vx * dt; + ball.y += ball.vy * dt; + if (Math.abs(ball.vx) > 20) { + if (isBoard) ball.skateSpin = (ball.skateSpin || 0) + ball.vx * dt / skateWheelRadius; + else ball.rotation += ball.vx * dt / Math.max(1, contactRadius); + } + const inset = wallThickness + contactRadius; + if (ball.x < worldLeft + inset) { + ball.x = worldLeft + inset; + ball.vx = Math.abs(ball.vx); + } else if (ball.x > worldRight - inset) { + ball.x = worldRight - inset; + ball.vx = -Math.abs(ball.vx); + } + if (!airRoundActive() && ball.y < ceilingY + inset) { + ball.y = ceilingY + inset; + ball.vy = Math.abs(ball.vy); + } + const ledge = ball.vy >= 0 && + ledgeCrossed(ball.x, previous.y, ball.y, contactRadius, contactRadius); + if (ledge) { + ball.y = ledge.y - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .58) : 0; + ball.vx *= ball.drag || .992; + } else if (ball.y > terrainFloorAt(ball.x) - contactRadius) { + ball.y = terrainFloorAt(ball.x) - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .62) : 0; + ball.vx *= ball.drag || .992; + } + const onSurface = (ledgeSupports(ball.x, ball.y, contactRadius) || + ball.y >= terrainFloorAt(ball.x) - contactRadius - 2) && Math.abs(ball.vy) < 180; + if (isBoard && onSurface) { + const contact = skateContact(ball.x, previous.y + contactRadius); + ball.y = contact.y - contactRadius; + ball.rotation = contact.pitch; + const slope = Math.tan(contact.pitch); + ball.vx += fallGravity() * slope / (1 + slope * slope) * dt; + ball.vx *= Math.exp(-dt * .65); + } + const poseTime = (now - startedAt) / 1000000; + const hitters = []; + // The head test below sweeps from `previous`, so the reach margin carries + // this tick's travel as well as the ball's radius. + const travel = Math.hypot(ball.x - previous.x, ball.y - previous.y); + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + const boxes = sampleCombatBoxes(player, now); + for (const strike of boxes.hit) { + const distance = pointBoxDistance(strike, ball.x, ball.y, ball.z); + if (distance <= ball.radius) { + hitters.push({ player, contact: clamp(1-distance/ball.radius,0,1) }); break; + } + } + } + if (hitters.length >= 2) { + crossWackBall(ball, hitters, now); + return; + } + if (hitters.length === 1) { + returnBall(ball, hitters[0].player, now, false, + .92 + hitters[0].contact * .38); + return; + } + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + if (player.blocking) { + const guard = sampleCombatBoxes(player, now).guard[0]; + const distance = guard ? pointBoxDistance(guard, ball.x, ball.y, ball.z) : Infinity; + if (distance <= ball.radius) { + const shield = shieldGeometry(player); + const proximity = clamp(1-Math.max(0,Math.hypot(ball.x-shield.x, + ball.y-shield.y,ball.z-shield.z)-ball.radius)/shield.radius,0,1); + returnBall(ball, player, now, true, proximity); + return; + } + } + const headBox = sampleCombatBoxes(player,now).hurt.find(b=>b.part==='head'); + const currentHeadDistance = pointBoxDistance(headBox,ball.x,ball.y,ball.z); + const sweptHeadDistance = segmentBoxEntry( + { x1: previous.x, y1: previous.y, z1: previous.z, + x2: ball.x, y2: ball.y, z2: ball.z },headBox,ball.radius)!==null ? 0 : Infinity; + const headDistance = Math.min(currentHeadDistance, sweptHeadDistance); + const bodyContact = runnerContactToPoint(player, poseTime, + ball.x, ball.y, ball.z); + const bodyDistance = bodyContact.bodyDistance; + if (Math.min(headDistance, bodyDistance) > ball.radius) continue; + if (ball.type === "skateboard" && headDistance > ball.radius && + bodyDistance <= ball.radius && !player.skateboard && + // A thrown deck is a weapon until it slows down — nobody catches a + // board shot out of the air with their shins. + Math.hypot(ball.vx, ball.vy) < 900) { + resetSkate(player); + player.skateboard = true; + ball.riderPad = player.pad; + player.skateVx = player.vx; + player.skatePitch = skateContact(player.x, player.y).pitch; + ball.active = false; + ball.heldBy = -1; + player.lastButton = "SKATEBOARD"; + player.lastButtonAt = now; + playDrum("clap", .9, panPlayer(player)); + emitSignal("skate-mount", player.pad, 1, 0); + return; + } + const runningContact = player.grounded && Math.abs(player.vx) > 40 && + (onSurface || ball.y >= player.y - ball.radius - 55); + if (runningContact) { + bootBall(ball, player, now); + return; + } + if (headDistance <= ball.radius) { + const sourcePad = ball.lastHitBy >= 0 && ball.lastHitBy !== player.pad + ? ball.lastHitBy : player.pad === 0 ? 1 : 0; + dismountSkateboard(player, now); + damageAllLimbs(player, ball.x - ball.vx, sourcePad, now); + bounceBallOffBody(ball, player, now, -1); + player.lastButton = "HEAD HIT"; + player.lastButtonAt = now; + return; + } + bounceBallOffBody(ball, player, now, bodyContact.segmentIndex); + return; + } +} + +// Returns whether the tap was spent on a double-tap move, so a single tap can +// still mean something else to the caller. +function directionTap(player, direction, now) { + const previousTap = player.lastTap[direction] || -10000000; + const releasedAt = player.lastRelease[direction] || -10000000; + player.lastTap[direction] = now; + if (now - previousTap > doubleTapUs || releasedAt <= previousTap || + now - releasedAt < doubleTapReleaseUs) return false; + player.lastTap[direction] = -10000000; + player.pendingMoveLabel = direction === "UP" ? "ULTRA AIR" : "DASH " + direction; + playDrum("clap", 1.05, panPlayer(player)); + if (direction === "UP") { + player.vy = -ultraJumpVelocity; + player.grounded = false; + player.jumpHeld = false; + emitSignal("ultrajump", player.pad, 1, 0); + } else if (direction === "DOWN") { + if (player.skateboard && !player.grounded) { + // Airborne on the board, the second tap is a throw, not a dive: the + // deck shoots straight down like a spiked item, and whoever it lands + // on takes it like one. The rider pops up off the release. + // The one-ball economy: like a dismount, the round's ball is + // redressed as the board so exactly one object ever exists. + // The station carries its own board, so there is nothing to redress: + // the old one-object economy borrowed the round's ball and handed it + // back at the bell, which is exactly the trick that stopped being + // necessary when the board became furniture with an entry of its own. + const board = boardForRider(player); + resetSkate(player); + if (board) { + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.spawnOwner = player.pad; + board.lastHitBy = player.pad; + board.x = player.x; + board.y = player.y + 40; + board.z = player.z; + board.vx = player.vx * .35; + board.vy = Math.max(2600, player.vy + 2600); + } + player.vy = Math.min(player.vy, -420); + player.pendingMoveLabel = "BOARD SHOT"; + playDrum("whoosh", 1, panPlayer(player)); + playDrum("kick", .8, panPlayer(player)); + emitSignal("board-shot", player.pad, 1, 0); + return true; + } + if (player.pounding) { + player.poundLevel = Math.min(3, Math.max(1, player.poundLevel) + 1); + const cap = poundMaxVelocity * (1 + .5 * (player.poundLevel - 1)); + player.vy = Math.min(cap, Math.max(poundLaunchVelocity, player.vy * 1.55)); + player.pendingMoveLabel = "GROUND POUND " + player.poundLevel; + playSine(620 + player.poundLevel * 190, .12 + player.poundLevel * .04); + emitSignal("fastdrop", player.pad, player.poundLevel, player.vy); + return true; + } + // Grounded anywhere above the real floor and not riding a head means the + // platform, wherever it has been placed. Double-crouch sinks through it. + if (player.grounded && player.standingOn < 0 && + player.y < terrainFloorAt(player.x) - 2) + sink(player, now); + // Standing on the floor there is nothing under you to drop through and no + // height to convert, so the double-tap is spent rather than sold cheap. + else if (player.grounded) return true; + else { + // In the air this is a ground pound, and the height it starts from is + // the whole economy of the move — remember it now, because the crater + // is measured against where the fall actually began. + player.pounding = true; + player.poundFrom = player.y; + player.poundLevel = 1; + player.vy = Math.max(player.vy, poundLaunchVelocity); + player.grounded = false; + player.ducking = false; + player.pendingMoveLabel = "GROUND POUND"; + playSine(520, .16); + emitSignal("fastdrop", player.pad, 1, 0); + } + } else { + player.facing = direction === "RIGHT" ? 1 : -1; + player.dashVx = player.facing * 2400; + player.dashUntil = now + 110000; + emitSignal("dash", player.pad, player.facing, 0); + } + return true; +} + +function sink(player, now) { + player.sinkUntil = now + sinkDurationUs; + // The rung being dropped through, so the sink cannot also eat the next one. + player.sinkFrom = player.y; + player.grounded = false; + player.jumpHeld = false; + player.vy = Math.max(player.vy, 260); + player.pendingMoveLabel = "SINK"; + playDrum("whoosh", .55, panPlayer(player)); + emitSignal("sink", player.pad, -1, 0); +} + +// A short low hop out of crouch. Crouching pins horizontal movement, so a +// direction flick from a tuck has nothing else to mean. +function crouchHop(player, direction, now) { + player.facing = direction; + player.vy = -crouchHopVelocity; + player.grounded = false; + player.jumpHeld = false; + player.hopUntil = now + crouchHopPoseUs; + player.pendingMoveLabel = "CROUCH HOP"; + playDrum("block", .58, panPlayer(player)); + emitSignal("crouchhop", player.pad, direction, 0); +} + +function killPlayer(target, killerPad, now, cause = "KO") { + if (!target.alive) return; + recordFightHit(killerPad, true); + releaseCarriedBall(target, now); + if (!lobbyActive() && (!freeForAll() || + players.filter((player) => player.alive).length <= 2)) { + if (!deathCinematic && killerPad !== target.pad) + deathCinematic = { startedAt: now, loserPad: target.pad, + winnerPad: killerPad, cause }; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + } + target.alive = false; + target.headBustedAt = now; + target.respawnAt = now + 1200000; + target.vx = 0; + if (!lobbyActive()) target.vy = 0; + target.stance = "HIT"; + target.lastButton = cause; + target.lastButtonAt = now; + if (killerPad !== target.pad) players[killerPad].score += 1; + emitSignal(cause === "BALLED" ? "balled" : "ko", + killerPad, target.pad, players[killerPad]?.score || 0); + roundCause = cause; + spawnImpact({ x: target.x, y: target.y - 120, z: target.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(target)); + if (!lobbyActive()) emitSignal("killcam", killerPad, target.pad, 1); + playDrum("snare", 1.15, panPlayer(target)); + updateLobbyMortality(now); + // The training opponent is the one everybody gets for free, and its fight is + // already running under the title screen — so its head is the one number + // the whole site can share without anybody signing in. The count follows the + // free door rather than the missing AI: once training started sparring back, + // an `!target.bot` gate would have silenced the site's only shared number. + // Balling yourself does not count; somebody has to have popped it. + if (target.npc && killerPad !== target.pad && + (!target.bot || fightOpponent === "trainingbot")) + emitSignal("dummy-popped", killerPad, target.pad, 1); +} + +// The crater. Everything about it is decided by the fall: a pound from a hop +// is a shove, a pound from the ceiling clears the stage. Whoever is standing +// inside the ring when it lands wears it; whoever is in the air over it has +// jumped it, which is the only defence and is meant to be readable from the +// silhouette alone. The ball in the ring is popped and re-served. +// +// The landing consumes the pounder's body but not their life. They continue as +// the existing controllable bouncing-head form, making the move a permanent +// mobility trade without prematurely ending the round. +function groundPound(player, now) { + player.pounding = false; + const poundLevel = Math.max(1, player.poundLevel || 1); + player.poundLevel = 0; + const fall = clamp(player.y - player.poundFrom, 0, poundFullFall); + const power = clamp(fall / poundFullFall + (poundLevel - 1) * .22, 0, 1); + const radius = Math.min(poundMaxRadius, + poundMinRadius + power * 70 + (poundLevel - 1) * 88); + const poseTime = (now - startedAt) / 1000000; + player.stance = "HIT"; + player.lastButton = "GROUND POUND"; + player.lastButtonAt = now; + const terrainY = terrainFloorAt(player.x); + spawnImpact({ x: player.x, y: terrainY, z: player.z, + life: .58, duration: .58, death: false, explosion: true, + blastRadius: radius, power }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("kick", 1.3, panPlayer(player)); + playSine(76 + power * 34 + poundLevel * 18, .32 + poundLevel * .09); + emitSignal("blast", player.pad, player.x / worldRight, power); + + for (const target of players) { + if (target.pad === player.pad || !target.alive) continue; + const contact = runnerContactToPoint(target, poseTime, + player.x, terrainY, player.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > radius) continue; + if (!target.grounded) { + // Airborne over the ring is the dodge. It still throws you. + applyBodyHit(target, contact.segmentIndex, player.x, player.pad, now, + 900 + 700 * power, 620); + continue; + } + killPlayer(target, player.pad, now, "BLASTED"); + } + + for (const item of balls) { + if (!item.active) continue; + if (Math.hypot(item.x - player.x, item.y - terrainY) > radius + item.radius) + continue; + item.active = false; + item.heldBy = -1; + item.vx = 0; + item.vy = 0; + item.serveAt = now + 1200000; + spawnImpact({ x: item.x, y: item.y, z: item.z, + life: .22, duration: .22, death: false, explosion: false }); + emitSignal("ballblock", player.pad, 1, power); + } + + const geometry = runnerWorldGeometry(player, poseTime); + for (const limb of limbParts) + detachPart(player, limb, geometry, player.x, now); + detachPart(player, "torso", geometry, player.x, now); + player.alive = true; + player.stance = "BOUNCE"; + player.lastButton = "HEAD ONLY"; + player.lastButtonAt = now; +} + +// Keep the head at its visible position when its body is released. Impact +// momentum lives in knockVx, so releasing the stick cannot erase the kick. +function launchHead(target, sourceX, sourcePad, now, force, lift, incomingVy = 0) { + if (!isHeadOnly(target)) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + target.fallenBodyGeometry = geometry; + releaseCarriedBall(target, now); + releaseCarriedPart(target, now); + releaseCarriedFighter(target, now); + dismountSkateboard(target, now); + target.removedParts = [...limbParts, "torso"]; + target.partDamage = {}; + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + } + const direction = Math.sign(target.x - sourceX) || + players[sourcePad]?.facing || -target.facing || 1; + const velocity = clamp(target.vx * .3 + direction * force, -4200, 4200); + target.knockVx = velocity - (target.windVx || 0); + target.vx = velocity; + target.vy = clamp(target.vy * .25 + incomingVy * .25 - lift, -2600, 2600); + target.headRollRate = clamp(velocity / 260, -8, 8); + target.grounded = false; + target.jumpHeld = false; + target.jumpLaunchAt = 0; + target.attackKind = ""; + target.attackUntil = target.dashUntil = 0; + target.dashVx = 0; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 180000); + target.stance = "HEAD ONLY"; + target.lastButton = "HEAD VOLLEY"; + target.lastButtonAt = now; +} + +function bounceHeadOnSurface(player, incomingVy, horizontal) { + // Restitution keeps hard landings lively and eventually lets a slow head + // settle, so the existing up/down pumping controls remain useful. + if (incomingVy > 360) { + player.vy = -incomingVy * .62; + player.knockVx *= .86; + player.headRollRate = clamp(player.vx / 260, -8, 8); + player.grounded = false; + player.stance = "BOUNCE"; + } else { + player.vy = 0; + player.grounded = true; + player.stance = horizontal ? "ROLL" : "HEAD ONLY"; + } +} + +function resolveMelee(now) { + const poseTime = (now - startedAt) / 1000000; + const contacts = []; + const samples = players.map(player => sampleCombatBoxes(player, now)); + for (const attacker of players) { + const attacking = samples[attacker.pad]; + if (!attacker.alive || !attacking.hit.length) continue; + for (const fragment of detachedParts) { + const r = fragment.width/2; + const bounds = combatRect('fragment',Math.min(fragment.x1,fragment.x2)-r, + Math.min(fragment.y1,fragment.y2)-r,Math.max(fragment.x1,fragment.x2)+r, + Math.max(fragment.y1,fragment.y2)+r,(fragment.z1+fragment.z2)/2, + Math.abs(fragment.z2-fragment.z1)/2+r); + if (!attacking.hit.some(hit=>boxesOverlap(hit,bounds))) continue; + const spec = meleeSpecFor(attacker, attacker.attackKind); + fragment.vx += attacker.facing * spec.force * .8; + fragment.vy -= Math.max(220, spec.lift); + fragment.owner = attacker.pad; + fragment.hitAfter = now + 120000; + attacker.attackHit = true; + spawnImpact({ x: (bounds.left+bounds.right)/2, y: (bounds.top+bounds.bottom)/2, + z: (bounds.near+bounds.far)/2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("clap", .82, panPlayer(attacker)); + emitSignal("part-hit", attacker.pad, -1, spec.force); + break; + } + if (attacker.attackHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(attacking, samples[target.pad]); + if (contact?.separation <= 3) { + attacker.attackHit = true; + contacts.push({ attacker, target, + strike: { x: contact.x, y: contact.y, z: contact.z }, + headshot: contact.headshot, segmentIndex: contact.segmentIndex }); + break; + } + } + } + for (const { attacker, target, strike, headshot, segmentIndex } of contacts) { + if (!target.alive && contacts.length < 2) continue; + spawnImpact({ x: strike.x, y: strike.y, z: strike.z, + life: .2, duration: .2, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + const away = Math.sign(target.x - attacker.x) || -attacker.facing; + const backBlocking = !isHeadOnly(target) && target.inputX === away; + if (target.blocking || backBlocking) { + target.stance = "DEFEND"; + target.blockFlash = 1; + target.lastButton = target.blocking ? "BLOCK" : "BACK BLOCK"; + target.lastButtonAt = now; + // An explicit shield returns the attacker's commitment as durable + // knockback. Keep it separate from controlled velocity so holding toward + // the defender cannot erase the recoil on the next simulation frame. + const recoil = target.blocking ? 2400 : 900; + attacker.dashUntil = 0; + attacker.dashVx = 0; + attacker.knockVx = -attacker.facing * recoil; + attacker.vx = attacker.knockVx + attacker.windVx; + if (target.blocking) attacker.vy = Math.min(attacker.vy, -415); + else target.vx = 0; + playDrum("block", 1.2, panPlayer(target)); + emitSignal("block", target.pad, attacker.pad, target.blocking ? 1 : 2); + // Only a real shield trades. A back-block still just shoves, because it + // costs nothing to hold a direction. + if (target.blocking) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const stun = shieldStunUs(spec.force * (attacker.attackMomentum || 1)); + attacker.hitStunUntil = Math.max(attacker.hitStunUntil, now + stun); + attacker.attackHit = true; + attacker.attackKind = ""; + attacker.attackUntil = 0; + attacker.stance = "STUN"; + breakShield(target, now); + } + } else if (headshot) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + const wasHead = isHeadOnly(target); + launchHead(target, attacker.x, attacker.pad, now, + spec.force * momentum * 1.2, + Math.max(620, spec.lift * 3) * momentum, attacker.vy); + playDrum("snare", 1.2, panPlayer(target)); + emitSignal(wasHead ? "head-volley" : "decapitate", + attacker.pad, target.pad, momentum); + } + else { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + applyBodyHit(target, segmentIndex, attacker.x, attacker.pad, now, + spec.force * momentum, spec.lift * momentum); + playDrum(spec.thud[0], spec.thud[1], panPlayer(target)); + } + } +} + +function resolvePogoAttacks(now) { + const poseTime = (now - startedAt) / 1000000; + for (const attacker of players) { + if (!attacker.alive || !isPogo(attacker) || attacker.grounded || + attacker.pogoHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(sampleCombatBoxes(attacker,now),sampleCombatBoxes(target,now)); + if (!contact || contact.separation > 3) continue; + attacker.pogoHit = true; + attacker.vy = Math.min(attacker.vy, -985); + attacker.lastButton = "POGO"; + attacker.lastButtonAt = now; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: contact.headshot, explosion: false }); + if (contact.headshot) killPlayer(target, attacker.pad, now, "POGO"); + else applyBodyHit(target, contact.segmentIndex, attacker.x, + attacker.pad, now, 1350, 260); + playDrum("kick", 1.1, panPlayer(attacker)); + emitSignal("pogo", attacker.pad, contact.headshot ? 1 : 0, 0); + break; + } + } +} + +function resolvePlayerPushboxes() { + for (let a = 0; a < players.length; a++) + for (let b = a + 1; b < players.length; b++) + resolvePlayerPushboxPair(players[a], players[b]); +} + +function resolvePlayerPushboxPair(first, second) { + if ([first, second].some((p) => p.ropeIndex >= 0 || p.skateLoop >= 0)) return; + if (!first.alive || !second.alive) return; + const poseTime = (runtime().monotonicUs - startedAt) / 1000000; + const firstBounds = combatPushbox(first); + const secondBounds = combatPushbox(second); + const verticalOverlap = Math.min(firstBounds.bottom, secondBounds.bottom) - + Math.max(firstBounds.top, secondBounds.top); + // Grounded fighters nudge one another. Once a jumper is clearly above the + // other fighter, the pushboxes separate so cross-over jumps are possible. + if (verticalOverlap <= 18 || + ((!first.grounded || !second.grounded) && + Math.abs(first.y - second.y) > 58)) return; + const left = first.x <= second.x ? first : second; + const right = left === first ? second : first; + const pushRadius = (player) => (combatPushbox(player).right-combatPushbox(player).left)/2; + const minimumGap = pushRadius(left) + pushRadius(right); + const overlap = minimumGap - (right.x - left.x); + if (overlap <= 0) return; + const leftAdvancing = left.vx > 30; + const rightAdvancing = right.vx < -30; + const leftShare = leftAdvancing && !rightAdvancing ? .25 + : rightAdvancing && !leftAdvancing ? .75 : .5; + left.x -= overlap * leftShare; + right.x += overlap * (1 - leftShare); + if (leftAdvancing && !rightAdvancing) { + right.knockVx += Math.min(180, left.vx * .12); + left.vx *= .35; + } else if (rightAdvancing && !leftAdvancing) { + left.knockVx += Math.max(-180, right.vx * .12); + right.vx *= .35; + } else { + if (left.vx > 0) left.vx *= .35; + if (right.vx < 0) right.vx *= .35; + } + resolveRunnerBounds(left, 0); + resolveRunnerBounds(right, 0); +} + +function resolvePlayerStanding(now) { + const poseTime = (now - startedAt) / 1000000; + const previousStanding = players.map((player) => player.standingOn); + for (const player of players) player.standingOn = -1; + for (const rider of players) { + for (const base of rivalsOf(rider)) { + // A committed dive passes through a head contact and completes against + // the terrain. Treating it as ordinary standing used to zero its velocity + // and leave the fighter strangely paused on the opponent's scalp. + if (!rider.alive || !base.alive || rider.vy < 0 || rider.pounding) continue; + const head = runnerWorldGeometry(base, poseTime).head; + const top = head.y - head.radius; + const horizontal = Math.abs(rider.x - head.x) <= head.radius + 42; + const depth = Math.abs(rider.z - head.z) <= head.radius + 32; + const crossed = (rider.previousY ?? rider.y) <= top + 8 && + rider.y >= top - 3; + const stayed = previousStanding[rider.pad] === base.pad && + rider.y <= top + 34; + if (!horizontal || !depth || (!crossed && !stayed)) continue; + const wasGrounded = rider.grounded; + rider.y = top; + rider.vy = Math.min(0, base.vy); + rider.grounded = true; + rider.standingOn = base.pad; + rider.sinkUntil = 0; + rider.hopUntil = 0; + if (!wasGrounded) rider.landPoseUntil = now + 110000; + break; + } + } +} + +function updateStance(player, input, now) { + const opponent = nearestRival(player); + const toward = Math.sign(opponent.x - player.x) || player.facing || 1; + player.stance = !player.alive ? "HIT" + : now < player.hitStunUntil ? "STUN" + : player.blocking ? "DEFEND" + : player.heldBall >= 0 ? "HOLDING" + : player.grabHeld ? "REACHING" + : player.attackKind ? "ATTACK" + : now < player.sinkUntil ? "SINK" + : !player.grounded && now < player.hopUntil ? "CROUCH HOP" + : player.ducking ? player.grounded ? "CROUCH" : "AIR CROUCH" + : player.pogoDive ? "POGO DOWN" + : player.skateboard && player.grounded ? "SKATE" + : !player.grounded ? "AIR" + : now < player.dashUntil ? "DASH" + : input.horizontal === toward ? "ADVANCE" + : input.horizontal === -toward ? "RETREAT" + : "NEUTRAL"; +} + +function grabNearestBall(player, now) { + let nearest = null; + let nearestDistance = 240; + for (let index = 0; index < balls.length; index++) { + const item = balls[index]; + if (!item.active || item.heldBy >= 0) continue; + const distance = Math.hypot(item.x - player.x, + item.y - (player.y - 82), item.z - player.z); + if (distance >= nearestDistance) continue; + nearest = { item, index }; + nearestDistance = distance; + } + if (!nearest) return false; + player.heldBall = nearest.index; + player.carryArm = availableArm(player); + nearest.item.heldBy = player.pad; + nearest.item.safeUntil = now + 180000; + nearest.item.safePlayers = 1 << player.pad; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + emitSignal("grab", player.pad, nearest.index, nearest.item.mass); + playDrum("clap", .72, panPlayer(player)); + return true; +} + +function grabNearestFighter(player, now) { + const target = players.find((candidate) => candidate.pad !== player.pad && + candidate.alive && candidate.grabbedBy < 0 && + Math.hypot(candidate.x - player.x, + candidate.y - (player.y - 72), candidate.z - player.z) < 210); + if (!target) return false; + player.heldPlayer = target.pad; + player.carryArm = availableArm(player); + target.grabbedBy = player.pad; + target.vx = target.vy = target.vz = 0; + target.lastButton = "GRABBED"; + target.lastButtonAt = now; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + playDrum("clap", .82, panPlayer(player)); + emitSignal("grab-player", player.pad, target.pad, isHeadOnly(target) ? 1 : 0); + return true; +} + +function grabNearestPart(player, now) { + let bestIndex = -1; + let bestDistance = 190; + for (let index = 0; index < detachedParts.length; index++) { + const part = detachedParts[index]; + if (part.heldBy >= 0) continue; + const x = (part.x1 + part.x2) / 2; + const y = (part.y1 + part.y2) / 2; + const z = (part.z1 + part.z2) / 2; + const distance = Math.hypot(x - player.x, y - (player.y - 78), z - player.z); + if (distance >= bestDistance) continue; + bestIndex = index; + bestDistance = distance; + } + if (bestIndex < 0) return false; + const part = detachedParts[bestIndex]; + player.heldPart = bestIndex; + player.carryArm = availableArm(player); + part.heldBy = player.pad; + part.owner = player.pad; + part.vx = part.vy = 0; + player.lastButton = "HOLDING " + part.part.toUpperCase(); + player.lastButtonAt = now; + emitSignal("grab-part", player.pad, bestIndex, 1); + return true; +} + +function stealHeldObject(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.hypot(target.x - player.x, + target.y - player.y, target.z - player.z) > 220) return false; + let label = ""; + if (target.heldBall >= 0) { + const index = target.heldBall; + const item = balls[index]; + target.heldBall = -1; + player.heldBall = index; + if (item) item.heldBy = player.pad; + label = "BALL"; + } else if (target.heldPart >= 0) { + const index = target.heldPart; + const part = detachedParts[index]; + target.heldPart = -1; + player.heldPart = index; + if (part) { part.heldBy = player.pad; part.owner = player.pad; } + label = part?.part?.toUpperCase() || "LIMB"; + } else if (target.gunAmmo > 0) { + player.gunAmmo = target.gunAmmo; + player.gunMode = target.gunMode; + target.gunAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + target.gunMode = "HANDGUN"; + label = player.gunMode; + } else if (target.grenadeAmmo > 0) { + player.grenadeAmmo = target.grenadeAmmo; + target.grenadeAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + label = "GRENADES"; + } + if (!label) return false; + target.lastButton = label + " TAKEN"; + target.lastButtonAt = now; + player.lastButton = "STOLE " + label; + player.lastButtonAt = now; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 160000); + playDrum("clap", 1, panPlayer(player)); + emitSignal("steal", player.pad, target.pad, 1); + return true; +} + +function releaseCarriedPart(player, now) { + if (player.heldPart < 0) return; + const part = detachedParts[player.heldPart]; + if (part) { + part.heldBy = -1; + part.owner = player.pad; + part.vx = player.vx + player.facing * 1900; + part.vy = Math.min(player.vy, -460); + part.hitAfter = now + 90000; + part.life = Math.max(part.life, 3.4); + emitSignal("throw-part", player.pad, player.heldPart, player.facing); + } + player.heldPart = -1; + player.carryArm = ""; +} + +function releaseCarriedFighter(player, now) { + if (player.heldPlayer < 0) return; + const target = players[player.heldPlayer]; + if (target) { + target.grabbedBy = -1; + target.x = player.x + player.facing * 118; + target.y = player.y - 74; + target.z = player.z; + target.vx = player.vx + player.facing * 1500; + target.vy = Math.min(player.vy, -620); + target.grounded = false; + target.hitStunUntil = now + 260000; + emitSignal("throw-player", player.pad, target.pad, player.facing); + } + player.heldPlayer = -1; + player.carryArm = ""; +} + +function releaseCarriedBall(player, now) { + if (player.heldBall < 0) return; + const item = balls[player.heldBall]; + if (item) { + item.heldBy = -1; + item.x = player.x + player.facing * (item.radius + 70); + item.y = player.y - 88; + item.z = player.z; + item.vx = player.vx; + item.vy = player.vy; + item.safeUntil = now + 120000; + item.safePlayers = 1 << player.pad; + emitSignal("release", player.pad, player.heldBall, item.mass); + } + player.heldBall = -1; + player.carryArm = ""; +} + +function bouncePogoOnSurface(player, surfaceY, now) { + player.y = surfaceY; + player.vy = -pogoBounceVelocity; + player.grounded = false; + player.pogoDive = false; + player.pogoHit = false; + player.stance = "POGO BOUNCE"; + player.lastButton = "POGO BOUNCE"; + player.lastButtonAt = now; + playDrum("kick", .9, panPlayer(player)); + emitSignal("pogo", player.pad, -2, pogoBounceVelocity); +} + +function shieldBash(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.abs(target.x - player.x) > shieldRadius * 1.35 || + Math.abs(target.y - player.y) > 170) return; + const direction = Math.sign(target.x - player.x) || player.facing; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blocking = false; + player.knockVx -= direction * 620; + player.hitStunUntil = Math.max(player.hitStunUntil, now + 180000); + target.knockVx += direction * 1250; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 240000); + target.grounded = false; + target.vy = Math.min(target.vy, -180); + if (target.blocking) { + target.shieldLocked = true; + target.shieldBrokenAt = now; + target.blocking = false; + target.knockVx += direction * 420; + } + spawnImpact({ x: (player.x + target.x) / 2, y: player.y - 90, + z: (player.z + target.z) / 2, life: .26, duration: .26, + death: false, explosion: true, blastRadius: 180, power: .35 }); + playDrum("block", 1.25, panPlayer(player)); + emitSignal("shield-bash", player.pad, target.pad, target.shieldLocked ? 1 : 0); +} + +function updatePlayer(player, pad, dt, now) { + const parkPreviousX = player.x; + player.previousY = player.y; + if (player.grabbedBy >= 0) { + const carrier = players[player.grabbedBy]; + if (!carrier?.alive || carrier.heldPlayer !== player.pad) { + player.grabbedBy = -1; + } else { + player.x = carrier.x + carrier.facing * 108; + player.y = carrier.y - 76; + player.z = carrier.z; + player.vx = player.vy = player.vz = 0; + player.grounded = false; + player.blocking = false; + player.attackKind = ""; + player.previous = pad.down.slice(); + return; + } + } + if (!player.alive) { + player.previous = pad.down.slice(); + // A body that dies off the ground still has to come down. Everything + // below this branch is skipped while dead, gravity included, which is + // right in a round — the round ends and rebuilds the body, and the + // killcam wants the pose held. The waiting room has no round, so a + // fighter blasted out of a jump hung in mid-air in its jump pose for the + // whole respawn beat. @jeffrey: "it seems possible to die in the waiting + // room but keep jumping stilll" — that is what a frozen hop looks like. + if (lobbyActive() && now < player.respawnAt) settleCorpse(player, dt); + if (now >= player.respawnAt && !freeForAll()) { + player.x = player.spawnX; + player.y = terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.windVx = 0; + player.knockVx = 0; + player.grounded = true; + player.ducking = false; + player.inputX = 0; + player.inputY = 0; + player.dashUntil = 0; + player.stance = "NEUTRAL"; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + // The waiting room hands back a whole body and a swept floor: parts, + // corpses and scattered limbs are round furniture, and the lobby has + // no round to rebuild the one or clear the others. + if (lobbyActive()) { + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + player.lobbyDeathDressed = false; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.lastTap = {}; + player.lastRelease = {}; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + deathCinematic = null; + detachedParts.length = 0; + } + player.alive = true; + } + return; + } + player.suppressedDirections = player.suppressedDirections.filter((button) => + pad.down.includes(button)); + const headOnly = isHeadOnly(player); + const pogo = isPogo(player); + const legCount = ["left-leg", "right-leg"] + .filter((part) => hasPart(player, part)).length; + const armCount = ["left-arm", "right-arm"] + .filter((part) => hasPart(player, part)).length; + const rawInput = quantizedInput(pad, player.suppressedDirections); + const hitStunned = now < player.hitStunUntil; + const wasBlocking = player.blocking; + const carrying = player.heldBall >= 0 || player.heldPart >= 0 || + player.heldPlayer >= 0 || Boolean(heldItem(player)); + const aimLocked = carrying && pad.down.includes("X"); + player.itemAimLocked = aimLocked; + if (aimLocked && (rawInput.horizontal || rawInput.vertical)) { + player.gunAimX = rawInput.horizontal; + player.gunAimY = -rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } + // A held gun used to point dead ahead unless you also held X, so the one + // thing a player is plainly doing with it — pointing it somewhere — never + // reached the fighter. A vertical direction now tilts the hand on its own. + // The X lock still earns its keep: it pins an aim while you stand still and + // it turns you. This does neither, deliberately — steering the drawn arm + // must not steer the walk, or every upward shot would rewrite your footing. + player.gunAimLive = false; + if (!aimLocked && player.gunAmmo > 0 && rawInput.vertical) { + player.gunAimX = rawInput.horizontal || player.facing; + player.gunAimY = -rawInput.vertical; + player.gunAimLive = true; + } + // A broken shield stays down until X is let go, so the opening it bought is + // spent on attacking rather than on re-guarding by reflex. + if (player.shieldLocked && !pad.down.includes("X")) player.shieldLocked = false; + player.blocking = !carrying && !headOnly && pad.down.includes("X") && + !player.shieldLocked; + if (player.blocking && !wasBlocking) { + player.attackKind = ""; + player.attackUntil = 0; + player.shieldCrouched = rawInput.vertical < 0 || player.ducking || + player.crouchBlend >= .35; + player.shieldVx = 0; + player.vx = player.windVx + player.knockVx; + player.dashUntil = 0; + player.dashVx = 0; + player.lastTap = {}; + player.lastRelease = {}; + shieldBash(player, now); + } + if (player.blocking && rawInput.vertical < 0) player.shieldCrouched = true; + if (player.blocking) { + player.shieldAimX = rawInput.horizontal; + player.shieldAimY = rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } else { + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + } + // Guard plants the fighter immediately, but DOWN remains meaningful: a + // standing guard can settle into a crouching guard. Once crouched, the pose + // latches until the shield itself drops even if DOWN is released first. + const input = player.blocking + ? { horizontal: 0, vertical: player.shieldCrouched ? -1 : 0 } : rawInput; + const grabHeld = armCount > 0 && !pogo && !hitStunned && !player.blocking && + pad.down.includes("A") && pad.down.includes("B"); + if (skateparkMap && !survivalActive()) { + const ropeHeld = skateRopeInput(player, input, grabHeld, dt, grabHeld && !player.grabHeld); + if (ropeHeld || skateLoopStep(player, input, dt, now)) { + player.previous = pad.down.slice(); + player.grabHeld = grabHeld; + return; + } + } + if (grabHeld && !player.grabHeld && player.heldBall < 0 && + player.heldPart < 0 && + player.heldPlayer < 0) { + if (!stealHeldObject(player, now) && !grabNearestBall(player, now) && + !grabNearestPart(player, now) && + !grabNearestFighter(player, now)) { + player.lastButton = "REACHING"; + player.lastButtonAt = now; + emitSignal("reach", player.pad, player.facing, 0); + } + } + else if (!grabHeld && player.heldBall >= 0) + releaseCarriedBall(player, now); + else if (!grabHeld && player.heldPart >= 0) + releaseCarriedPart(player, now); + else if (!grabHeld && player.heldPlayer >= 0) + releaseCarriedFighter(player, now); + const inputChanged = input.horizontal !== player.inputX || + input.vertical !== player.inputY; + if (inputChanged && + (input.horizontal || input.vertical)) + emitSignal("move", player.pad, input.horizontal, input.vertical); + player.pendingMoveLabel = ""; + // An ultra jump IS a second press of UP, so the air-jump gate below used to + // see the same press the double-tap had just spent: the ultra fired, a + // double jump launched on top of it a tick later, the move read-out said + // DOUBLE JUMP, and the air jump the fighter never asked for was gone. The + // horizontal branch has always honored the "tap was spent" answer; this is + // the vertical one doing the same. It matters more in a tower, where the + // crow's nest is the one rung an ultra jump is the only way onto. + let verticalTapSpent = false; + const upPressed = input.vertical > 0 && !player.previous.includes("MOVE_UP"); + const downPressed = input.vertical < 0 && player.inputY >= 0; + const wasCrouched = player.ducking || player.crouchBlend >= .35; + const crouchTarget = input.vertical < 0 || + (!player.grounded && player.crouchJump && now < player.jumpPoseUntil) || + (!player.grounded && now < player.hopUntil) ? 1 : 0; + const crouchStep = dt * (crouchTarget ? 9 : 11); + player.crouchBlend += clamp(crouchTarget - player.crouchBlend, + -crouchStep, crouchStep); + player.ducking = player.crouchBlend >= .52; + if (player.attackKind && now >= player.attackUntil) { + player.attackKind = ""; + player.attackHit = false; + player.attackMomentum = 1; + } + if (player.itemAction && now >= player.itemActionUntil) + player.itemAction = ""; + if (player.inputX && input.horizontal !== player.inputX) + player.lastRelease[player.inputX > 0 ? "RIGHT" : "LEFT"] = now; + if (player.inputY && input.vertical !== player.inputY) + player.lastRelease[player.inputY > 0 ? "UP" : "DOWN"] = now; + if (input.horizontal && input.horizontal !== player.inputX) { + const direction = input.horizontal > 0 ? "RIGHT" : "LEFT"; + recordCommand(player, direction, now); + if (!directionTap(player, direction, now) && player.grounded && + player.ducking && !headOnly && !pogo && !hitStunned) + crouchHop(player, input.horizontal, now); + } + if (input.vertical && input.vertical !== player.inputY) { + const direction = input.vertical > 0 ? "UP" : "DOWN"; + recordCommand(player, direction, now); + verticalTapSpent = directionTap(player, direction, now); + if (headOnly) { + const alternating = player.headPumpDirection && + player.headPumpDirection !== input.vertical && + now - (player.headPumpAt || 0) <= 520000; + player.headBounceCharge = clamp((player.headBounceCharge || 0) + + (alternating ? .2 : .035), 0, 1); + player.headPumpDirection = input.vertical; + player.headPumpAt = now; + if (alternating && player.grounded) { + player.vy = -lerp(420, headBounceVelocity * 1.7, + player.headBounceCharge); + player.grounded = false; + player.stance = "BOUNCE " + Math.round(player.headBounceCharge * 5); + playDrum("block", .45 + player.headBounceCharge * .45, + panPlayer(player)); + emitSignal("head-bounce", player.pad, input.vertical, + player.headBounceCharge); + } + } + } + + if (headOnly) { + const sincePump = now - (player.headPumpAt || 0); + if (sincePump > 650000) + player.headBounceCharge = Math.max(0, + (player.headBounceCharge || 0) - dt * .22); + } + + if (input.horizontal) player.facing = input.horizontal; + // Fighting-game directions are digital: full movement begins and ends on + // the sampled edge. The analog stick is only an eight-way gate. + if (player.grounded) player.windVx *= Math.max(0, 1 - dt * 10); + else player.windVx = clamp(player.windVx + windAcceleration * dt, -900, 900); + player.knockVx *= Math.max(0, 1 - dt * (headOnly + ? player.grounded ? 1.6 : .22 : player.grounded ? 7 : 1.8)); + if (now < player.dashUntil && input.horizontal && + Math.sign(player.dashVx) !== input.horizontal) { + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + } + const dashRunningOut = player.grounded && input.horizontal && + player.dashUntil > 0 && now >= player.dashUntil; + if (dashRunningOut && !player.runSince) { + player.runSince = now; + } + if (!player.grounded || !input.horizontal || player.blocking || + player.ducking || hitStunned) player.runSince = 0; + const walkingCleanly = player.grounded && input.horizontal && !player.blocking && + !player.ducking && !hitStunned && now >= player.dashUntil; + if (!walkingCleanly) player.walkSince = 0; + else if (!player.walkSince) player.walkSince = now; + else if (!player.runSince && now - player.walkSince >= 650000) + player.runSince = now; + const headAirControl = player.grounded ? .55 + : lerp(.55, .9, player.headBounceCharge || 0); + const mobility = headOnly ? headAirControl + : pogo ? .68 : legCount === 1 ? .72 : 1; + const runSpeed = player.runSince + ? Math.min(runTopSpeed, runStartSpeed + + (now - player.runSince) / 1000000 * runAcceleration) : 0; + let controlledVx = aimLocked ? 0 + : player.blocking ? player.shieldVx || 0 + : now < player.dashUntil && Math.abs(player.dashVx) > 0 + ? player.dashVx + : player.runSince ? input.horizontal * runSpeed * mobility + : player.ducking && player.grounded ? 0 + : input.horizontal * walkSpeed * mobility; + if (player.skateboard && player.skateWallSide) { + // Once the board reaches a coping, horizontal momentum has become upward + // wall momentum. Keep the root on that wall until gravity spends it; the + // player can also steer away to peel off early. + const peelAway = input.horizontal === -player.skateWallSide; + if (player.vy >= 0 || peelAway) { + const side = player.skateWallSide; + player.skateWallSide = 0; + player.skateVx = -side * Math.max(720, Math.abs(player.skateVx) * .42); + controlledVx = player.skateVx; + } else controlledVx = 0; + } else if (player.skateboard && player.grounded && !player.blocking) { + // Steering, and ONLY while steering. This used to run every frame against + // a target of `input.horizontal * 2700`, which on an idle stick is zero — + // so a coasting skater was being dragged to a standstill at 3.2 a second + // by the same line that turns them. On a flat cube nobody could tell; + // dropped into a three-tile bowl it is the difference between a 1,400-unit + // drop and a 268-unit one, because the servo ate gravity as fast as + // gravity arrived. Let go of the stick now and you coast, which is what + // rolling IS. + const skateTarget = input.horizontal * 2700; + // Carving is steering against the roll, and it has to stay in scope: the + // scrape it makes is played further down, and hoisting the steer into a + // block took both of these with it. + const carving = Boolean(input.horizontal) && + Math.sign(skateTarget) !== Math.sign(player.skateVx); + if (input.horizontal) { + const turnRate = carving ? 1.8 : 3.2; + player.skateVx += (skateTarget - player.skateVx) * + (1 - Math.exp(-dt * turnRate)); + } + // Gravity along the surface, resolved honestly rather than by a tuned + // constant. The old line was `slope * 1900`, and `slope` is tan(angle) — + // which runs away to infinity as a transition goes vertical and had to be + // clamped at 2.5 to stop it. The horizontal share of gravity on a slope is + // g·sin·cos, which in terms of tan is g·t/(1+t²): it peaks at 45° exactly + // as it should, falls off toward vertical exactly as it should, and needs + // no clamp because it cannot exceed half of g. + const contact = skateContact(player.x, player.y); + const terrainSlope = Math.tan(contact.pitch); + player.skateVx += fallGravity() * terrainSlope / + (1 + terrainSlope * terrainSlope) * dt; + // Pumping. The one thing a skater does that a rolling object does not: + // crouch through the bottom of a transition and stand up through the + // face, and come out with more speed than you went in with. Holding DOWN + // on a slope is that, and it is the only way to gain speed in the bowl + // without pushing — which is what makes a bowl worth being in rather than + // a hole to cross. + // + // Priced against the slope, so it pays on a transition and pays nothing + // on the flat: a crouch in the middle of the park is a crouch, not a + // cheat code. Direction comes from the roll rather than the stick, + // because pumping adds to the speed you have, it does not steer. + const pumping = input.vertical < 0 && Math.abs(terrainSlope) > .18; + if (pumping && player.skateVx) + player.skateVx += Math.sign(player.skateVx) * + Math.abs(terrainSlope) * skatePumpAcceleration * dt; + player.skateVx = clamp(player.skateVx, -4200, 4200); + // Leaving the lip. A rider climbing a transition is carrying real upward + // speed -- `skateVx * slope` -- and the moment the ground stops climbing + // under them, that speed has nowhere to go but into the air. Reading the + // ground a frame ahead is what catches the crest: the coping at the top + // of a quarterpipe, the edge of the funbox, the lip of the bowl. + // + // Without this a skater simply walks over the top of every ramp with the + // speed quietly deleted, which is the difference between a skatepark and + // a set of hills. + const surfaceVy = player.skateVx * terrainSlope; + const aheadSlope = clamp(terrainTangentAt( + player.x + player.skateVx * .05), -2.5, 2.5); + if (surfaceVy < -skateLaunchFloor && + (aheadSlope - terrainSlope) * Math.sign(player.skateVx) > .2) { + player.vy = surfaceVy; + player.grounded = false; + player.skateAirAt = now; + playDrum("whoosh", .5 + Math.min(.45, -surfaceVy / 4000), + panPlayer(player)); + emitSignal("skate-air", player.pad, + Math.round(-surfaceVy), Math.round(player.skateVx)); + } + if (!input.horizontal) player.skateVx *= Math.exp(-dt * .65); + controlledVx = player.skateVx; + const skateSpeed = Math.abs(player.skateVx); + const carveDir = carving ? Math.sign(skateTarget) : 0; + if (carveDir && skateSpeed > 900 && player.skateCarveDir !== carveDir) { + playDrum("whoosh", .45 + Math.min(.4, skateSpeed / 4200 * .5), + panPlayer(player)); + emitSignal("skate-carve", player.pad, carveDir, + Math.round(skateSpeed / 42) / 100); + } + player.skateCarveDir = carveDir; + } else if (player.skateboard && !player.grounded) { + // Keep the board's launch momentum instead of borrowing walking speed + // in the air and reviving a different skateVx on landing. + controlledVx = player.skateVx; + } else if (!player.skateboard) player.skateVx = 0; + player.vx = controlledVx + player.windVx + player.knockVx; + if (inputChanged) telemetry("FIGHT_MOVE", player.name + + " pad=" + (player.pad + 1) + + " held=" + (pad.down.filter((button) => button.startsWith("Arrow")).join("+") || "NONE") + + " stick=" + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + + " quant=" + input.horizontal + "," + input.vertical + + " controlled=" + Math.round(controlledVx) + + " shield=" + (player.blocking ? 1 : 0) + + " wind=" + Math.round(player.windVx) + + " knock=" + Math.round(player.knockVx) + + " vx=" + Math.round(player.vx) + + " x=" + Math.round(player.x)); + + // Checked before liftoff so the launch frame itself can never be cut. + if (player.jumpHeld && player.vy < 0 && !player.blocking && + input.vertical <= 0) { + player.vy *= jumpCutScale; + player.jumpHeld = false; + } + if (airRoundActive()) player.airJumpsUsed = 0; + if (!aimLocked && !headOnly && upPressed && !verticalTapSpent && + !player.jumpLaunchAt && + (player.grounded || player.airJumpsUsed < 1)) { + const airJump = !player.grounded; + player.jumpLaunchAt = now + (airJump ? 1 : jumpAnticipationUs); + player.crouchJump = !airJump && wasCrouched; + if (airJump) { + player.airJumpsUsed++; + player.doubleJumpLinesUntil = now + 280000; + } + player.pendingMoveLabel = player.skateboard ? "OLLIE" + : airJump ? "DOUBLE AIR" + : wasCrouched ? "CROUCH AIR" : "AIR"; + } + if (player.jumpLaunchAt && now >= player.jumpLaunchAt) { + player.jumpLaunchAt = 0; + player.jumpPoseUntil = now + + (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs); + const jumpScale = player.skateboard ? 1.12 + : pogo ? .88 : legCount === 1 ? .78 : 1; + player.vy = Math.min(player.vy, + -(player.crouchJump ? crouchJumpVelocity : jumpVelocity) * jumpScale); + player.jumpHeld = true; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.grounded = false; + player.skateWallSide = 0; + player.ducking = player.crouchJump; + playDrum("block", 0.72, panPlayer(player)); + emitSignal("jump", player.pad, 1, 0); + } + if (pogo && !player.grounded && !hitStunned && downPressed) { + player.vy = Math.max(player.vy, 2250); + player.pogoDive = true; + player.pogoHit = false; + player.pendingMoveLabel = "POGO DOWN"; + player.stance = "POGO DOWN"; + playDrum("kick", .78, panPlayer(player)); + playSine(620, .13); + emitSignal("pogo", player.pad, -1, player.vy); + } + if (!player.grounded && !pogo && input.vertical < 0) { + player.ducking = true; + player.pendingMoveLabel ||= "AIR CROUCH"; + } + + // Y and either shoulder spend an item, so reaching for a kick can no + // longer empty a magazine. A loaded hand still colors the punch — into a + // swing, never a shot. + const acting = !headOnly && !pogo && !hitStunned && !player.blocking; + if (acting && player.gunMode === "RUBBER SMG" && player.gunAmmo > 0 && + pad.down.includes("Y") && player.previous.includes("Y") && + now >= player.nextGunShotAt) + fireGun(player, input); + for (const button of pad.down) { + if (!player.previous.includes(button)) { + remember(player, button); + if (button === "X" && !headOnly) { + player.pendingMoveLabel = "SHIELD"; + playDrum("block", .7, panPlayer(player)); + emitSignal("shield", player.pad, 1, 0); + } + else if (acting && !grabHeld && button === "A") + startMelee(player, "KICK", now); + else if (acting && !grabHeld && button === "B") + startMelee(player, itemMelee[heldItem(player)] || "PUNCH", now); + else if (headOnly && !hitStunned && button === "A") + spit(player, false); + else if (headOnly && !hitStunned && button === "B") + spit(player, true); + else if ((acting || (headOnly && !hitStunned)) && + ["Y", "LeftShoulder", "RightShoulder"].includes(button)) { + const item = heldItem(player); + if (item === "GUN") fireGun(player, input); + else if (item === "GRENADE") throwGrenade(player, input); + } + } + } + if (grabHeld) { + player.lastButton = player.heldBall >= 0 ? "HOLDING" : "REACHING"; + player.lastButtonAt = now; + } + if (player.pendingMoveLabel) remember(player, player.pendingMoveLabel); + + const previousX = player.x; + const previousY = player.y; + const wasGrounded = player.grounded; + player.vy += (player.vy < 0 ? riseGravity() : fallGravity()) * dt; + // Keeping DOWN held through a pound drives it down harder. The button is + // the only thing that makes a pound faster, so the height you fell from and + // the pressure you kept on it are the two dials on the crater. + if (player.pounding && input.vertical < 0) + player.vy = Math.min(poundMaxVelocity * + (1 + .5 * Math.max(0, player.poundLevel - 1)), + player.vy + poundHoldAcceleration * dt); + if (airRoundActive()) { + // A shared terminal fall keeps the duel within reach; UP can flap again, + // DOWN dives. The world has no floor and falling never eliminates anyone. + player.vy = Math.min(player.vy, input.vertical < 0 ? 1050 : 760); + player.skateboard = false; + } + player.x += player.vx * dt; + player.y += player.vy * dt; + // A bodyless head is a ball, and a ball that slides without turning reads + // as a sticker on the floor. Ground contact sets the spin to the true + // rolling rate for the 22-unit radius; the spin then integrates every + // frame, because a head that leaves the floor mid-bounce keeps turning — + // spinning only while grounded left the bouncing head (which is how a head + // mostly travels) with a face nailed bolt upright between landings. + // `grounded` still holds last frame's answer here — it resets just below. + if (isHeadOnly(player)) { + // Clamped well below the true rolling rate: honest physics for a 22-unit + // ball at fight speed is eleven revolutions a second, which on screen is + // not a rolling face but a whirl of spinning lines. A lazy tumble — about + // a turn per second, capped — keeps the eyes and mouth readable while + // still saying which way the head is traveling. + if (player.grounded) player.headRollRate = clamp(player.vx / 22, -6, 6); + player.headRoll = (player.headRoll || 0) + (player.headRollRate || 0) * dt; + } + // Walking down a slope is not a new landing on every other tick. + const nextFloor = terrainFloorAt(player.x); + const followingFloor = wasGrounded && player.vy >= 0 && + Math.abs(previousY - terrainFloorAt(previousX)) < 3 && + nextFloor - previousY <= Math.max(20, Math.abs(player.vx * dt) * 2.5); + if (followingFloor) player.y = Math.max(player.y, nextFloor); + const landingSpeed = player.vy; + player.grounded = false; + // A sinking fighter is transparent to the rung it left and to nothing else. + // A window long enough to clear one lip — .25s, 290 units of fall — is + // already long enough to fall past the next rung 260 below, and a + // double-tap that dropped two storeys read as a fall rather than a step + // down. Remembering where the sink started is what keeps it one storey. + // The floor is never transparent, which is why it stays in the else. + const ledge = player.vy >= 0 && ledgeCrossed(player.x, previousY, player.y); + const sinking = now < player.sinkUntil && + ledge && ledge.y <= player.sinkFrom + 4; + if (ledge && !sinking) { + player.y = ledge.y; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, ledge.y, now); + } else { + player.vy = 0; + player.grounded = true; + } + } else if (player.y >= terrainFloorAt(player.x) && + (!player.skateboard || player.vy >= 0)) { + const terrainY = terrainFloorAt(player.x); + player.y = terrainY; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, terrainY, now); + } else { + player.vy = 0; + player.grounded = true; + } + } + if (player.skateboard) { + const contact = skateContact(player.x, previousY); + const supported = player.grounded || (wasGrounded && player.vy >= 0 && + Math.abs(player.y - contact.y) < Math.max(24, Math.abs(player.vx * dt) * 2.5)); + if (supported && !player.skateWallSide) { + player.y = contact.y; + const tangentX = Math.cos(contact.pitch); + const tangentY = Math.sin(contact.pitch); + if (!wasGrounded) { + // Inelastic contact removes normal velocity. A downward impact at a + // lip must count against uphill momentum, not become an upward boost. + player.skateVx = (player.vx * tangentX + landingSpeed * tangentY) * tangentX; + } else { + // Carry tangent speed around the curve; fixed horizontal speed would + // invent vertical energy whenever the slope steepens. + player.skateVx *= tangentX / Math.max(.001, + Math.cos(player.skatePitch || 0)); + } + player.vx = player.skateVx; + player.skatePitch = contact.pitch; + player.skateContacts = Number(contact.left) + Number(contact.right); + player.grounded = true; + player.vy = 0; + const distance = (player.x - previousX) / Math.max(.15, Math.cos(contact.pitch)); + player.skateSpin = (player.skateSpin || 0) + distance / skateWheelRadius; + player.skateRollDistance = (player.skateRollDistance || 0) + Math.abs(distance); + if (player.skateContacts && player.skateRollDistance >= 100) { + player.skateRollDistance %= 100; + playDrum("hat", .12 + Math.min(.35, Math.abs(player.vx) / 8400), panPlayer(player)); + emitSignal("skate-roll", player.pad, Math.round(Math.abs(player.vx)), player.skateContacts); + } + if (!wasGrounded) { + playDrum("clap", clamp(landingSpeed / 2000, .2, 1), panPlayer(player)); + playDrum("block", clamp(landingSpeed / 2800, .15, .7), panPlayer(player)); + emitSignal("skate-land", player.pad, Math.round(landingSpeed), player.skateContacts); + } + } else player.skateContacts = 0; + } + if (!wasGrounded && player.grounded) { + const onBooster = boosterXs.some((x) => Math.abs(player.x - x) <= boosterRadius); + player.landPoseUntil = now + 110000; + player.crouchJump = false; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + if (player.pounding) groundPound(player, now); + else if (!headOnly && onBooster) { + player.vy = -boosterVelocity; + player.grounded = false; + player.jumpHeld = true; + player.airJumpsUsed = 0; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + playSine(880, .22); + playDrum("clap", 1.2, panPlayer(player)); + emitSignal("boost", player.pad, 1, 0); + } else player.airJumpsUsed = 0; + } + resolveRunnerBounds(player, (now - startedAt) / 1000000); + skateBoostStep(player, parkPreviousX, now); + player.hit = Math.max(0, player.hit - dt * 4); + player.blockFlash = Math.max(0, player.blockFlash - dt * 6); + player.previous = pad.down.slice(); + if (input.vertical > 0) player.previous.push("MOVE_UP"); + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grabHeld = grabHeld; + updateStance(player, input, now); +} + +// How long a bot leans on a button, per action rather than one house number. +// A jump has to outlast the whole rise (1760 / 4800 ≈ .37s) or jumpCutScale +// clips the arc to a third of its height and the platform goes out of reach; +// a strike is a stab; a sink tap is half of a double-tap. +const botHoldUs = { + walk: 90000, jump: 440000, sinkTap: 60000, + strike: 70000, shield: 120000, item: 110000, +}; +// A press cannot reopen until it has been up this long, so `lastRelease` +// always sees a real gap — that gap is what keeps dash, ultra jump and sink +// readable from synthetic input. Four frames clears doubleTapReleaseUs even +// when the release lands a frame late. +const botRestUs = 66668; +// A thumb cannot hold both ends of an axis, so opening one closes the other. +const botAxis = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft", + ArrowUp: "ArrowDown", ArrowDown: "ArrowUp" }; + +// The bot's dice. Not Math.random, deliberately: two fresh sims must roll +// identically (the determinism test holds that line), and the reel factory +// reserves the global stream for the match name. Seeded per fighter at round +// start from the round clock, so rounds differ live while a replayed sim +// replays exactly. +function botRoll(player) { + let s = player.botRngState = (player.botRngState + 0x6d2b79f5) >>> 0; + s = Math.imul(s ^ (s >>> 15), s | 1); + s ^= s + Math.imul(s ^ (s >>> 7), s | 61); + return ((s ^ (s >>> 14)) >>> 0) / 4294967296; +} + +// The one door every synthetic press goes through. Pressing a button that is +// already down extends it, so a pursuit reads as one lean instead of a +// stutter; pressing one that is still resting is refused. +function botPress(player, button, holdUs, now) { + const press = player.botPresses[button]; + if (press && now < press.until) { + press.until = Math.max(press.until, now + holdUs); + return true; + } + if (press && now < press.until + botRestUs) return false; + const other = player.botPresses[botAxis[button]]; + if (other && now < other.until) other.until = now; + player.botPresses[button] = { until: now + holdUs }; + return true; +} + +const botHeld = (player, button, now) => + now < (player.botPresses[button]?.until || 0); + +function botDown(player, now) { + return Object.keys(player.botPresses) + .filter((button) => now < player.botPresses[button].until); +} + +// ── What a bot sees ───────────────────────────────────────────────────────── +// The bots used to steer off the whole table. The climb bot read the ladder +// by index — `platforms[level]` — and the fight bot read the opponent's +// coordinates wherever they were, on screen or not. Neither is what a hand on +// a pad has. A player sees a screen: the rungs the lens has in frame, the lava +// once it has climbed into view, the other fighter while the camera holds +// them — and picks the next move from what that frame offers. +// +// `botScene` is that frame. It is rebuilt every simulation tick from the same +// projection the stage paints with, so a rung is in the scene exactly when +// its lip lands on the screen a person would be watching. `botOptions` is the +// list of moves the scene affords from where the bot is standing: which of +// those rungs one jump reaches, from where; the span it can walk; the deck it +// could sink through. The brains below hold a goal (the summit, the +// opponent), pick the option that advances it as this tick's subgoal, and +// press for that — nothing in them reaches past the frame. +// +// One jump's ceiling, from the same numbers the fighter's legs use: with up +// held, the rise is v²/2g, and everything above it is out of reach. +const jumpApex = () => jumpVelocity * jumpVelocity / (2 * riseGravity()); +// A jump's horizontal budget onto a deck `dy` above the takeoff: the whole +// rise, then the fall from the apex down to the deck's height, walked at +// walking speed. Scaled down hard — the bot is committing to a lip, and a +// landing at the very end of the arc is a landing it can miss by one frame. +const botAirCommit = .6; +function jumpReach(dy) { + const riseSeconds = jumpVelocity / riseGravity(); + const fallSeconds = Math.sqrt(2 * Math.max(0, jumpApex() - dy) / fallGravity()); + return walkSpeed * (riseSeconds + fallSeconds) * botAirCommit; +} +// Where the feet are. Level 0 is the arena floor; a rung answers by its level. +function botFooting(player) { + if (!player.grounded) return null; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (Math.abs(player.y - ledge.y) <= 3 && + player.x >= ledge.left && player.x <= ledge.right) return { ...ledge }; + return { level: 0, left: platformLeft, right: platformRight, y: floorY }; +} +// The screen. The whole screen, not the action-safe rect: a person watching +// a television reads the rung above out of the sky the HUD floats over. +const botViewport = () => + ({ left: stageLeft, right: stageRight, top: 0, bottom: viewHeight }); +function pointInView(view, x, y, z = 0) { + const point = projectPoint(x, y, z); + return Number.isFinite(point.x) && Number.isFinite(point.y) && + point.x >= view.left && point.x <= view.right && + point.y >= view.top && point.y <= view.bottom; +} +// A rung is in view when any of its lip is: both ends projected, the span +// clipped against the screen's sides, its height inside the screen's top and +// bottom. A deck half off the right edge still offers its visible half. +function rungInView(view, ledge) { + const a = projectPoint(ledge.left, ledge.y, 0); + const b = projectPoint(ledge.right, ledge.y, 0); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite)) return false; + const y = (a.y + b.y) / 2; + return y >= view.top && y <= view.bottom && + Math.max(a.x, b.x) >= view.left && Math.min(a.x, b.x) <= view.right; +} + +function botScene(player, opponent, now) { + const view = botViewport(); + const footing = botFooting(player); + const rungs = []; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (rungInView(view, ledge)) + rungs.push({ level: ledge.level, left: ledge.left, right: ledge.right, + y: ledge.y, dy: player.y - ledge.y }); + const scene = { + at: now, + view, + lens: { width: cameraDoll.width, x: cameraDoll.target.x, + y: cameraDoll.target.y }, + self: { x: player.x, y: player.y, vx: player.vx, vy: player.vy, + grounded: player.grounded, facing: player.facing, footing }, + floor: pointInView(view, clamp(player.x, platformLeft, platformRight), + floorY) ? { y: floorY, left: platformLeft, right: platformRight } : null, + rungs, + lava: survivalActive() && + pointInView(view, clamp(player.x, worldLeft, worldRight), survivalLavaY) + ? { y: survivalLavaY, below: survivalLavaY - player.y } : null, + opponent: null, + pickups: [], + }; + if (opponent && opponent.alive && opponent !== player && + pointInView(view, opponent.x, opponent.y - 90, opponent.z || 0)) { + const dx = opponent.x - player.x; + scene.opponent = { x: opponent.x, y: opponent.y, dx, dy: player.y - opponent.y, + distance: Math.abs(dx), facing: opponent.facing, + attacking: Boolean(opponent.attackKind) && now < opponent.attackUntil, + attackStartedAt: opponent.attackStartedAt }; + } + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + if (pickup.active && pointInView(view, pickup.x, pickup.y)) + scene.pickups.push({ kind: pickup.kind || "item", + x: pickup.x, y: pickup.y, dx: pickup.x - player.x }); + scene.options = botOptions(player, scene); + return scene; +} + +// The moves the scene affords from this footing. Every option names the deck +// it ends on, so a brain can pick by destination and then read off how to +// get there. In the air there is nothing to enumerate; the brain keeps the +// subgoal it left the ground with. +function botOptions(player, scene) { + const options = []; + const footing = scene.self.footing; + if (!footing) return options; + options.push({ kind: "walk", level: footing.level, y: footing.y, + left: footing.left, right: footing.right }); + const inset = survivalTune().landingInset; + const visible = new Set(scene.rungs.map(r=>r.level)); + const maxReach = jumpReach(0); + const nearby = queryBoxTree(platformBoxTree(), combatRect('jump-window', + footing.left-maxReach, footing.y-jumpApex(), footing.right+maxReach, footing.y)); + for (const box of nearby) { + const rung = box.ledge; + if (!visible.has(rung.level)) continue; + const dy = footing.y - rung.y; + if (dy <= 0 || dy > jumpApex()) continue; + const landLeft = rung.left + inset; + const landRight = rung.right - inset; + if (landRight < landLeft) continue; + const reach = jumpReach(dy); + // Where on this footing a jump can start and still come down on the + // landing band. An empty window is a deck the lens shows but the legs + // cannot have from here. + const takeoffLeft = Math.max(footing.left, landLeft - reach); + const takeoffRight = Math.min(footing.right, landRight + reach); + if (takeoffLeft > takeoffRight) continue; + const aim = clamp(player.x, landLeft, landRight); + options.push({ kind: "jump", level: rung.level, y: rung.y, dy, reach, + landLeft, landRight, takeoffLeft, takeoffRight, aim, + cost: Math.abs(aim - player.x) }); + } + if (footing.level > 0) { + // Sinking drops to whatever is under the feet — and only what is in + // frame counts, the same as a person deciding to fall. + let below = scene.floor ? { level: 0, y: floorY } : null; + for (const rung of scene.rungs) + if (rung.y > footing.y && player.x >= rung.left && + player.x <= rung.right && (!below || rung.y < below.y)) + below = { level: rung.level, y: rung.y }; + if (below) options.push({ kind: "sink", level: below.level, y: below.y, + dy: footing.y - below.y }); + } + return options; +} + +let platformTreeSource = null, platformTreeRevision = -1, platformTree = null; +function platformBoxTree() { + const ledges = activeLedges(); + if (platformTreeSource !== ledges || platformTreeRevision !== workshopRevision) { + platformTreeSource = ledges; platformTreeRevision = workshopRevision; + platformTree = buildBoxTree(ledges.map(ledge => combatRect('platform-'+ledge.level, + ledge.left,ledge.y,ledge.right,ledge.y+12,0,18,{ledge}))); + } + return platformTree; +} + +// The climb's subgoal: the highest deck one jump reaches from this footing, +// the nearest of them when two tie. On the ladder that is the deck above — +// two decks is 470 and the apex is 322 — but the choice is made from the +// scene, so a deck the lens has not shown yet is a deck the bot waits for. +function highestJump(options) { + let best = null; + for (const option of options) { + if (option.kind !== "jump") continue; + if (!best || option.y < best.y || + (option.y === best.y && option.cost < best.cost)) best = option; + } + return best; +} + +function botPad(player, opponent, now) { + if (selfPlay && typeof globalThis.__oskiewarJevPad === 'function') { + const scene = botScene(player, opponent, now); + scene.self.ducking = player.ducking; + scene.self.attackFrame = meleeFrame(player, now).frame; + scene.self.recoveryMs = Math.max(0, (player.attackUntil-now)/1000); + scene.self.combat = { + punch: Boolean(availableArm(player)), + kickLeft: hasPart(player, 'left-leg'), kickRight: hasPart(player, 'right-leg'), + item: Boolean(heldItem(player)), stunned: now < player.hitStunUntil, + headOnly: isHeadOnly(player), pogo: isPogo(player), + }; + if (scene.opponent) { + scene.opponent.grounded = opponent.grounded; + scene.opponent.vx = opponent.vx; scene.opponent.vy = opponent.vy; + scene.opponent.ducking = opponent.ducking; + scene.opponent.headOnly = isHeadOnly(opponent); + scene.opponent.pogo = isPogo(opponent); + scene.opponent.blocking = opponent.blocking; + scene.opponent.attackFrame = meleeFrame(opponent, now).frame; + scene.opponent.recoveryMs = Math.max(0, (opponent.attackUntil-now)/1000); + // The parent calls this only when preparing a model request, not every + // simulation tick. Probes read clones and never advance the live fight. + scene.strikeOptions = () => jevStrikeOptions(player, opponent, + runtime().simMonotonicUs || runtime().monotonicUs); + } + const down = globalThis.__oskiewarJevPad(player.pad, { ...scene, + round: matchName, alive: player.alive && opponent.alive }); + return { connected: true, down: Array.isArray(down) ? down.filter(button => + ['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','A','B','X','Y'].includes(button)) : [], leftX: 0, leftY: 0 }; + } + if (!player.bot) { + player.botPresses = {}; + return { connected: true, down: [], leftX: 0, leftY: 0 }; + } + // Downed, or standing over a downed opponent, the bot opens nothing new — + // but presses already out still run their length instead of vanishing + // mid-hold, which would read as a poke. + if (!player.alive || !opponent.alive) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + + // A scored bot plays its sheet instead of thinking: rows of {at, button, + // hold} in µs from round start, through the same botPress door so holds + // and releases stay human-shaped. An empty score is a dummy that stands + // there and takes it — which is exactly what a sync lab needs on the + // receiving end. Scores arrive via globalThis.__oskiewarBotScores at round + // start; no score, and the brain below plays as always. + if (player.botScore) { + const at = now - roundStartedAt; + while (player.botScoreAt < player.botScore.length && + player.botScore[player.botScoreAt].at <= at) { + const row = player.botScore[player.botScoreAt]; + if (botPress(player, row.button, row.hold ?? botHoldUs.strike, now)) + player.botScoreAt += 1; + else break; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + + // The frame, and the opponent only as the frame shows them. The fight + // camera holds both fighters, so an opponent out of view is the rare case — + // but when it happens the bot has nothing to chase and opens nothing new. + const scene = botScene(player, opponent, now); + player.botScene = scene; + player.botGoal = "opponent"; + const seen = scene.opponent; + if (!seen) { + player.botSubgoal = null; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + const dx = seen.dx; + const distance = seen.distance; + const toward = Math.sign(dx) || player.facing || -1; + const opponentThreatening = seen.attacking && distance < 245 && + seen.facing === -toward; + const striking = botHeld(player, "A", now) || botHeld(player, "X", now); + + // A guard that answers every swing the frame it starts turns the round into + // punch-into-shield until the clock dies — the signal census reads punch×6, + // shield×6 per five seconds and nothing else. So the guard is human now: + // each incoming swing is noticed once, answered late, and sometimes not at + // all. The lapse is what lets damage through, and damage is what ends + // rounds. + if (opponentThreatening) { + if (player.botThreatSeen !== seen.attackStartedAt) { + player.botThreatSeen = seen.attackStartedAt; + const roll = botRoll(player); + player.botShieldAt = roll < 0.55 + ? now + 70000 + Math.round(roll * 250000) : Infinity; + } + } else player.botShieldAt = Infinity; + + // A shield that just ate a swing bought a stun. Swing into it now — the + // neutral-game cooldown would let the opening close unanswered. + if (player.shieldBrokenAt && + player.shieldBrokenAt !== player.botPunishedAt && + now - player.shieldBrokenAt < 80000) { + player.botPunishedAt = player.shieldBrokenAt; + player.botAttackAt = now; + } + + if (opponentThreatening && !striking && now >= player.botShieldAt) + botPress(player, "X", botHoldUs.shield, now); + else { + // The old spacing was tuned for a bigger fighter: stop walking at 155, + // swing at 225. A punch capsule tops out near 130 of separation and a + // kick near 170, so that band was whiff purgatory — the census read + // punch after punch with no body hit until the clock died. Close to + // where a swing actually lands, and swing only from there — and only on + // the ground: steering mid-air wedged the bot against a platform lip it + // used to clear. + if (player.grounded && distance > 95) + botPress(player, toward > 0 ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + // Items are ranged, so the bot spends them while closing rather than + // trading one for a swing it could land anyway. The grenade needs its arc. + const item = heldItem(player); + if (item && now >= player.botItemAt && + distance >= (item === "GUN" ? 320 : 1200) && + botPress(player, "Y", botHoldUs.item, now)) + player.botItemAt = now + 600000; + if (distance < 165 && now >= player.botAttackAt && + botPress(player, player.botAttackSequence % 2 ? "A" : "B", + botHoldUs.strike, now)) { + player.botAttackSequence += 1; + player.botAttackAt = now + 330000 + (player.botAttackSequence % 3) * 70000; + } + } + + // Up and down are read off the scene's options. An opponent a storey up + // is reached by the jump that lands on their deck when the frame offers + // one, and by a plain jump at them when it does not — the cube has no + // rungs, and there the old leap is the only vertical move there is. + const climb = seen.dy > 180 + ? scene.options.find((option) => option.kind === "jump" && + Math.abs(option.y - seen.y) <= 3) || null + : null; + player.botSubgoal = climb; + if (climb && Math.abs(climb.aim - player.x) > 24) + botPress(player, climb.aim > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + const canLeap = climb + ? player.x >= climb.takeoffLeft && player.x <= climb.takeoffRight + : seen.dy > 180; + if (player.grounded && canLeap && now >= player.botJumpAt && + botPress(player, "ArrowUp", botHoldUs.jump, now)) + player.botJumpAt = now + 1250000; + // Knocked up onto a deck the bot would camp out of reach, so it plays the + // same double-tap-down a player would: two real presses with a real + // release between them — and only through a deck the frame shows a floor + // under. + const sink = scene.options.find((option) => option.kind === "sink"); + if (sink && player.grounded && player.standingOn < 0 && + seen.dy < -200 && now >= player.botSinkAt) { + player.botSinkAt = now + 900000; + player.botSinkTaps = 2; + player.botSinkNextAt = now; + } + if (player.botSinkTaps > 0 && now >= player.botSinkNextAt && + botPress(player, "ArrowDown", botHoldUs.sinkTap, now)) { + player.botSinkTaps -= 1; + player.botSinkNextAt = now + botHoldUs.sinkTap + botRestUs; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The climb bot's four numbers, gathered so they can be priced instead of +// guessed. `survival-lab.mjs` runs the ladder headlessly and sweeps one of +// these at a time; the defaults are exactly what the bot shipped with, and +// ordinary play never sets the override, so a human's attract-mode climb is +// unchanged by the seam existing. +const survivalTuneDefaults = { + landingInset: 72, // how far inside a deck's edge still counts as footing + walkThreshold: 24, // closer than this and walking is only jitter + // How far off the aim point the runner may still commit to a jump. This was + // 34, and 34 is why no reel ever summited: decks 5 and 6 do not overlap + // horizontally, so `dx` there never falls below 92 and the bot stood on the + // lip jumping straight up until the lava took it. Committing while the walk + // is still carrying it is what crosses a gap. Measured by `survival-lab.mjs`: + // ≤100 dies on deck 5, ≥110 summits all 32, and it still summits at 420 — + // 160 sits well inside that shelf rather than on its edge. + jumpThreshold: 160, + jumpCooldownUs: 580000, // the floor under one jump per deck + jumpHoldUs: botHoldUs.jump, // held past apex, or `jumpCutScale` clips the rise + // Per-reel variation. The ladder is fixed, the bot is fixed, and under the + // oven's fixed-step clock the round clock the bot's dice seed from is fixed + // too — so every slot rendered a frame-identical climb, and three reels + // shipped the same run. The oven passes a seed; it is folded into the + // fighter's dice once, which moves the aim from deck to deck while leaving + // any single seed exactly reproducible. Zero means no variation, which is + // what ordinary play uses, so a human's attract-mode climb is untouched. + seed: 0, + // Share of the landing band the aim may wander. Bought with `survival-lab`: + // .15 and .3 both summit 4/4, .45 and .6 drop to 3/4 because a hard bias + // toward a deck's edge can leave the next jump unmakeable. .3 is the most + // visible variation that still costs nothing. + aimJitter: .3, +}; +function survivalTune() { + const override = globalThis.__oskiewarSurvivalTune; + if (!override) return survivalTuneDefaults; + return { ...survivalTuneDefaults, ...override }; +} + +function survivalBotPad(player, now) { + if (!player.bot || !player.alive) + return { connected: true, down: [], leftX: 0, leftY: 0 }; + const tune = survivalTune(); + // Folded in once per run, before the first aim is taken. + if (tune.seed && player.survivalSeed !== tune.seed) { + player.survivalSeed = tune.seed; + player.botRngState = + (player.botRngState ^ Math.imul(tune.seed, 0x9e3779b9)) >>> 0; + } + // The frame, every tick. The goal is the summit; the subgoal is the deck + // this frame offers a jump onto. On the ground that is re-chosen from the + // scene each tick — in the air the runner holds the deck it left for. + const scene = botScene(player, null, now); + player.botScene = scene; + player.botGoal = "summit"; + const footing = scene.self.footing; + if (footing) { + const next = highestJump(scene.options); + if (next && next.level !== player.survivalTargetLevel) { + player.survivalTargetLevel = next.level; + // One roll per deck, not per tick: the runner should commit to a line + // and hold it, and rolling every frame would average the wander back + // to zero. + player.survivalAimBias = tune.seed ? botRoll(player) - .5 : 0; + } + player.botSubgoal = next; + if (!next) { + // Nothing above in frame. Stand where a deck cannot end under you — + // the lens is catching up, and the next rung arrives in it. + const middle = (footing.left + footing.right) / 2; + if (Math.abs(middle - player.x) > tune.walkThreshold) + botPress(player, middle > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + } + const target = player.botSubgoal; + if (!target) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + // Aim for the nearest safe point on the landing band, not the deck's + // center: a centered aim walked the bot to the lip of an overlapping pair + // and waited forever when the remaining seven units were smaller than its + // jump threshold. The seeded wander moves the aim along the band. + const aim = clamp(clamp(player.x, target.landLeft, target.landRight) + + (player.survivalAimBias || 0) * (target.landRight - target.landLeft) * + tune.aimJitter, target.landLeft, target.landRight); + const dx = aim - player.x; + if (Math.abs(dx) > tune.walkThreshold) + botPress(player, dx > 0 ? "ArrowRight" : "ArrowLeft", botHoldUs.walk, now); + // Commit inside the option's own budget or the tuned threshold, whichever + // is tighter — the threshold was priced by `survival-lab.mjs`, and the + // budget keeps a lab sweep from asking for a jump the legs cannot land. + if (player.grounded && Math.abs(dx) <= Math.min(tune.jumpThreshold, target.reach) && + player.x >= target.takeoffLeft && player.x <= target.takeoffRight && + now >= player.botJumpAt && + botPress(player, "ArrowUp", tune.jumpHoldUs, now)) + player.botJumpAt = now + tune.jumpCooldownUs; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The replay oven needs a bounded completion record, not a production replay. +// Its injected fetch keeps this envelope inside the local shell; ordinary +// survival never records, publishes, or analyzes a run. Keeping the seam +// explicit prevents a `?replay-oven` URL typed in a normal browser from +// turning an anonymous climb into stored match data. +function captureSurvivalRun(now, result) { + if (globalThis.__oskiewarCaptureSurvival !== true || + typeof saveReplay !== "function") return; + const tickUs = 1000000 / 60; + const durationTicks = Math.max(1, + Math.round((now - survivalStartedAt) / tickUs)); + // The clock this is built from is fixed under an offline fixed-step pass, so + // without the seed every reel in a day filed the same name — and that name + // becomes the reel's Instagram `audio_name` (`audioNameFor`), which is only + // honoured on the post that mints it. Live climbs pass no seed and keep the + // original name. + const runSeed = survivalTune().seed >>> 0; + const roundName = "survival-v" + buildVersion + "-" + + Math.max(0, Math.round(survivalStartedAt / tickUs)) + + (runSeed ? "-" + runSeed.toString(36) : ""); + const runner = players[0]; + const height = Math.round(survivalHeight); + const demo = { + format: "ac.oskiewar.survival", version: 1, game: "oskiewar", + simulation: "oskiewar-survival-1", tickRate: 60, + matchId: "ow-" + roundName, matchName: roundName, + roundId: "ow-" + roundName, roundName, roundIndex: 0, + startedAt: runtime().unixMs - Math.round(durationTicks / 60 * 1000), + durationTicks, fighters: [runner.name], nations: [runner.nation || ""], + winner: result === "SUMMIT" ? runner.name : null, + finalRoundWins: [result === "SUMMIT" ? 1 : 0], + cause: result, height, + commands: [], checkpoints: [], impacts: [], + events: [[0, "climb", 0, 1, 0], + [durationTicks, "survival-end", 0, height, + result === "SUMMIT" ? 1 : 0]], + }; + const upload = saveReplay(JSON.stringify(demo)); + if (upload && typeof upload.catch === "function") + upload.catch((error) => telemetry("SURVIVAL_CAPTURE", + "local-error " + error.message)); +} + +function finishSurvival(now, result) { + if (roundResult) return; + const runner = players[0]; + survivalBestHeight = Math.max(survivalBestHeight, survivalHeight); + roundResult = result; + roundCause = result; + roundOverAt = now; + runner.vx = 0; + runner.vy = 0; + if (result === "LAVA") { + runner.alive = false; + runner.stance = "HIT"; + spawnImpact({ x: runner.x, y: survivalLavaY, z: runner.z, + life: 1.2, duration: 1.2, death: true, explosion: true, + blastRadius: 240, power: .8 }); + playDrum("kick", 1.25, panPlayer(runner)); + playSine(92, .45); + } else { + playDrum("clap", 1.2, 0); + playSine(880, .3); + } + globalThis.__oskiewarResultLine = result === "SUMMIT" + ? "summit!" : Math.round(survivalHeight) + " high"; + emitSignal("survival-end", 0, Math.round(survivalHeight), + result === "SUMMIT" ? 1 : 0); + captureSurvivalRun(now, result); +} + +function updateSurvival(dt, now) { + const runner = players[0]; + const height = Math.max(0, floorY - runner.y); + survivalHeight = Math.max(survivalHeight, height); + runner.score = Math.round(survivalHeight); + while (survivalPeakLevel < platforms.length && + runner.y <= platforms[survivalPeakLevel].y + 2) + survivalPeakLevel++; + const lavaSpeed = survivalLavaBaseSpeed + + Math.min(76, survivalHeight * .008); + survivalLavaY -= lavaSpeed * dt; + const body = runnerBounds(runner, (now - startedAt) / 1000000); + if (body.bottom >= survivalLavaY) finishSurvival(now, "LAVA"); + else if (survivalPeakLevel >= platforms.length && runner.grounded) + finishSurvival(now, "SUMMIT"); +} + +function drawAirDropSky(t) { + const shift = ((cameraCenterY * .14) % viewHeight + viewHeight) % viewHeight; + const ink = mixColor([65,115,155], [230,248,255], visualTheme.light); + for (let i = 0; i < 14; i++) { + const x = ((i * 197 + 53) % 997) / 997 * viewWidth(); + const y = ((i * 113) % viewHeight - shift + viewHeight) % viewHeight; + screenRect(x, y, 2 + i % 2, 16 + i % 4 * 9, ink); + } +} + +function gameSim() { + captureRenderInterpolationState(); + syncGameView(); + const now = runtime().monotonicUs; + const dt = Math.min(0.04, Math.max(0.001, (now - lastSimAt) / 1000000)); + lastSimAt = now; + // Whether a door is in the way is state, not decoration: the same answer + // gates the fight, the claim and the wire, so it is settled once on the tick + // rather than re-asked by each of them mid-paint. + updateAccountDoor(); + if (resimPending) { + startResim(resimPending, now); + resimPending = null; + } else if (resimActive) { + // Demo ticks count every sim step from the reset, intro included — the + // drift meter has to count in the same currency. + resimTick++; + advanceResimCommands(); + } + if (roundViewer && !netSession) { + // The chair-holder's hands are local even when the fight is not. The + // control legend, the M30 manual page and the touch discs all light off + // inputPads[0], and the debug toggle wants a View edge — none of that + // may wait on the host's echo, so the local pad is sampled here exactly + // as it would be in a hosted fight. + padSnapshots[0] = samplePad(0); + inputPads[0] = padSnapshots[0]; + const down = padSnapshots[0]?.down || []; + if (down.includes("View") && !viewerSystemPrevious.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + viewerSystemPrevious = down.slice(); + updateRoundViewer(now, dt); + // A visitor who holds the second chair plays through this screen: their + // pad goes up the wire every tick it changes, and a room found hostless + // becomes theirs to host. + sendChallengerInput(now); + netChallengerHello(now); + updateVersusClaim(now); + return; + } + padSnapshots[0] = samplePad(0); + padSnapshots[1] = samplePad(1); + padSnapshots[2] = samplePad(2); + inputPads[0] = padSnapshots[0]; + inputPads[1] = padSnapshots[1]; + if (updateLocalVersus(now)) { + consumeSystemButtons(now); + return; + } + const cameraPads = localVersusActive() ? padSnapshots : [padSnapshots[0]]; + const cameraX = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightX) || 0), 0), -1, 1); + const cameraY = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightY) || 0), 0), -1, 1); + if (Math.abs(cameraX) > .08) + playerCameraYaw = clamp(playerCameraYaw + cameraX * dt * 1.15, -.62, .62); + if (Math.abs(cameraY) > .08) + playerCameraPitch = clamp(playerCameraPitch + cameraY * dt * .72, -.24, .28); + // Triggers zoom, but only on a pad whose triggers are analog -- on anything + // else the shell is still aliasing them to A and X, and stealing those two + // buttons would cost a small pad its item and shield. + // Either couch seat can steer the shared camera. Digital M30 shoulders + // remain combat buttons, even beside a controller with analog triggers. + const push = clamp(cameraPads.reduce((sum, pad) => sum + (pad?.analogTriggers + ? (Number(pad.leftTrigger) || 0) - (Number(pad.rightTrigger) || 0) : 0), 0), -1, 1); + if (Math.abs(push) > .08) + playerCameraZoom = clamp(playerCameraZoom + push * dt * .9, .55, 1.9); + // A mouse or a finger on the shell's canvas orbits the same lens the + // right stick does: a drag turns yaw and pitch, the wheel or a pinch + // dollies. The shell banks the gesture between ticks and this drains it, + // so a fast flick is not lost to a slow frame. + const orbit = globalThis.__oskiewarTouch?.orbit; + if (orbit) { + if (orbit.yaw) + playerCameraYaw = clamp(playerCameraYaw + orbit.yaw, -.62, .62); + if (orbit.pitch) + playerCameraPitch = clamp(playerCameraPitch + orbit.pitch, -.24, .28); + if (orbit.zoom) + playerCameraZoom = clamp(playerCameraZoom * Math.exp(orbit.zoom), .55, 1.9); + orbit.yaw = orbit.pitch = orbit.zoom = 0; + } + // A tap anywhere on the wordmark screen is a start press — read before + // the tap queue is wiped for the tick. The shell already turns first-visit + // taps into a button; this catches every visit after that. + const titleTapped = shellMode === "MENU" && !selecting && + (globalThis.__oskiewarTouch?.taps?.length || 0) > 0; + if (!selecting && Array.isArray(globalThis.__oskiewarTouch?.taps)) + globalThis.__oskiewarTouch.taps.length = 0; + if (consumeSystemButtons(now)) { + if (netSession) netLeave("system-button"); + return; + } + // The wordmark screen is a live training round, so the shell reads start + // and then falls straight through into the fight it is sitting on top of. + if (shellMode === "MENU") updateShell(now, titleTapped); + else updateMatchPace(now); + // The versus seat watches from the title on — a friend can take the chair + // while the host is still reading the wordmark, and the fight lifts it. + updateVersusSeat(now); + updateLobbyMortality(now); + if (survivalActive() && shellMode === "MENU") { + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + for (const player of players) + inputPads[player.pad] = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]) + : resimActive && resimCommands + ? resimPad(player.pad) + : player.remote ? remotePadSnapshot() + : player.bot && shellMode === "GAME" + ? survivalActive() && player.pad === 0 + ? survivalBotPad(player, now) + : botPad(player, players[player.pad ? 0 : 1], now) + : player.npc ? { connected: true, down: [], leftX: 0, leftY: 0 } + : padSnapshots[player.pad]; + // Start belongs to the shell, including its hold and transition frames. + // The first neutral sample releases gameplay for the next fresh press. + if (!players[0].bot && !players[0].remote && !netFrameInputs && !resimActive) { + const pad = inputPads[0]; + if (shellMode === "MENU" || startInputPending) { + startInputPending = shellMode === "MENU" || pad.down.length > 0 || + Math.abs(pad.leftX || 0) > .08 || Math.abs(pad.leftY || 0) > .08; + inputPads[0] = { ...pad, down: [], leftX: 0, leftY: 0 }; + } + } + if (debugHitboxes && now >= nextInputDebugAt) { + nextInputDebugAt = now + 500000; + const values = players.map((player) => { + const pad = inputPads[player.pad]; + const input = quantizedInput(pad, player.suppressedDirections); + return "P" + (player.pad + 1) + " down=" + + (pad.down.join("+") || "NONE") + " stick=" + + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + " q=" + + input.horizontal + "," + input.vertical + " vx=" + + Math.round(player.vx); + }); + telemetry("FIGHT_INPUT", values.join(" | ")); + } + recordReplayCommands(now, inputPads); + // Session first: the hand-off frame must leave before the round's first + // frame walks the native shell's one socket over to the round room. + publishSession(now); + publishSpectator(now); + publishVersus(now); + if (survivalActive() && roundResult) { + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + if (now - roundOverAt >= roundResultUs) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSurvivalRun(now, true); + else returnToTitle(now, "survival-end"); + } + return; + } + if (roundResult) { + // The scored tail. The killcam dwell used to be the reel's quietest + // seconds under its most dramatic frames, so the dwell keeps a slow + // heartbeat and the result card lands with a sting of its own. Voice on + // the drum channel, record on unrouted signal names, as everywhere. + if (!resultPulseAt) resultPulseAt = roundOverAt + 900000; + if (now >= resultPulseAt) { + resultPulseAt = now + 1050000; + playDrum("kick", .3, 0); + emitSignal("result-pulse", -1, 0, 0); + } + if (!resultCardStung && now - roundOverAt >= 1100000) { + resultCardStung = true; + playDrum("bell", .95, 0); + // The card's own line rides a global for whichever shell can speak: + // the web shell reads it back through speech synthesis on this same + // signal. Signals carry numbers, and the sentence is presentation. + // The anonymous seat wears a blank nameplate, and a blank name read + // aloud is a stumble — but only the local first seat can be nameless, + // so a nameless winner is always "you". + const card = resultCardText(); + const spokenWinner = card.winner.replace(/^@/, ""); + globalThis.__oskiewarResultLine = roundResult === "TIE" ? "tie!" + : (spokenWinner ? spokenWinner + " wins the " : "you win the ") + + (matchOver ? "match" : "round"); + emitSignal("result-card", -1, roundResult === "TIE" ? 0 : 1, 0); + // The winner gets the last word: a staccato synthesized laugh rides + // out of the bell. A tie amuses nobody. + if (roundResult !== "TIE") { + resultLaughAt = now + 420000; + resultLaughStep = 0; + // The mouth opens on the sting and the laugh lands in it — the same + // open-ring LAUGH face the A+B chord earns, dealt automatically to + // the winner unless they have already chosen their own gloat. + const winner = roundWinner(); + if (winner?.alive && !winner.resultReaction) { + winner.resultReaction = "LAUGH"; + winner.resultReactionAt = now; + } + } + } + if (resultLaughAt && resultLaughStep < 5 && now >= resultLaughAt) { + playSine([760, 640, 700, 580, 500][resultLaughStep], .09); + playDrum("hat", .16, 0); + if (resultLaughStep === 0) emitSignal("victory-laugh", -1, 1, 0); + resultLaughAt = now + 112000 + resultLaughStep * 24000; + resultLaughStep++; + } + if (INSTANT_REPLAY && instantReplay) { + updateInstantReplay(now, dt); + return; + } + if (INSTANT_REPLAY) { + const replayDown = padSnapshots[0]?.down || []; + if (replayDown.includes("Y") && !replayOfferPrevious.includes("Y") && + startInstantReplay(now)) return; + replayOfferPrevious = replayDown.slice(); + } + const cinematicWinner = deathCinematic + ? players[deathCinematic.winnerPad] : null; + if (cinematicWinner?.alive) updatePlayer(cinematicWinner, + { connected: true, down: [], leftX: 0, leftY: 0 }, dt, now); + // Severed pieces belong to the action too; the result clock must not pin + // them in mid-air while the surviving body completes its landing. + updateBullets(dt, now, false); + updateGrenades(dt, now, false); + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + const resultDuration = matchOver ? matchResultUs : roundResultUs; + if (now - roundOverAt >= resultDuration) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSelfPlay(now); + // A versus result rolls straight into the next round while the rival's + // wire stays warm — the room, not the title, is home base. A finished + // match deals fresh, a finished round keeps the tally. + else if (versusActive() && versusChallengerFresh()) + startVersusFight(now, matchOver); + else if (versusActive()) beginVersusLobby(now); + else if (localVersusActive()) { + if (matchOver) startLocalVersus(now); + else resetRound(now, false); + } + else returnToTitle(now, "round-end"); + } + return; + } + if (PAL_SELECT && selecting) { + updateSelect(now); + return; + } + if (now - roundStartedAt < roundIntroDurationUs()) { + // The intro used to pass in silence — a reel that opens on the countdown + // opened on three mute seconds, and a player heard the round begin with + // nothing. Ring the "3, 2, 1" on the same two channels the round clock + // uses: the drum for the ear, the signal for the record. + const introSecond = Math.ceil( + (roundIntroDurationUs() - (now - roundStartedAt)) / 1000000); + if (introSecond !== lastIntroSecond) { + lastIntroSecond = introSecond; + // playDrum is the voice, the signal is the record — the "countdown" + // name is deliberately not in the sfx routes, or the web would voice + // every bell twice. value2 marks these as the intro's. + playDrum("bell", .72 + (3 - introSecond) * .12, 0); + emitSignal("countdown", -1, introSecond, 1); + } + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + if (lastIntroSecond > 0) { + // The first live tick after the intro is the mode opening — one accent, + // so the callout is a sound and not just a vanished word. + lastIntroSecond = -1; + playDrum("block", 1.1, 0); + if (survivalActive()) { + globalThis.__oskiewarStartLine = "climb!"; + emitSignal("climb", 0, 1, 0); + } else emitSignal("fighters-lock", -1, 0, 0); + } + roundElapsedUs += dt * 1000000; + const timedRound = roundIsTimed(); + if (timedRound) { + const countdownSecond = Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + if (countdownSecond > 0 && countdownSecond <= 10 && + countdownSecond !== lastCountdownSecond) { + lastCountdownSecond = countdownSecond; + playDrum("bell", 1 + (10 - countdownSecond) * .025, 0); + emitSignal("countdown", -1, countdownSecond, 0); + } + } + if (survivalActive()) { + updatePlayer(players[0], inputPads[0], dt, now); + updateSurvival(dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + } else { + updateWind(dt, now); + for (const player of players) updatePlayer(player, inputPads[player.pad], dt, now); + updateSkateRopes(dt); + resolvePlayerStanding(now); + resolvePlayerPushboxes(); + updateFallingPickups(dt, now); + updatePowerups(now); + updateBodyTrees(dt, now); + updateBullets(dt, now); + updateGrenades(dt, now); + resolveMelee(now); + resolvePogoAttacks(now); + updateLobbyMortality(now); + // After the exchange resolves, so a frame that landed a hit reads as the + // recovery it has become rather than as the active frame it was. + recordFrameMeter(now); + for (const item of balls) updateBall(item, dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + captureRoundReplay(now); + recordReplayCheckpoint(now); + trackResimDrift(now); + } + for (const impact of impacts) { + if (!impact.debris) { + // A fresh impact heats the tile it landed in. The debris check is the + // once-per-impact gate — the first sim tick is the only tick an impact + // exists without motes — so a hit stamps its cell exactly once, and + // the overlay on the back wall shows the fight's last half-second as + // cooling squares. + if (onGridField(impact.x, impact.y)) { + const cell = gridFieldIndex(impact.x, impact.y); + gridField[cell] = Math.min(1, gridField[cell] + + (impact.explosion ? 1 : impact.death ? .9 : .55)); + } + const count = impact.explosion ? 24 : impact.death ? 10 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.explosion + ? 1180 + (impact.power || 0) * 720 + : impact.death ? 660 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 260, + vz: Math.sin(angle * 1.7) * force * .22, + radius: impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; + mote.y += mote.vy * dt; + mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; + mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); + // The tile field cools between stamps — a fixed exponential against the + // fixed 60 Hz step, so a replayed round heats and fades identically. Cells + // snap to zero below a hundredth so a quiet map is exactly zeros. + for (let cell = 0; cell < gridField.length; cell++) + gridField[cell] = gridField[cell] < .01 ? 0 + : gridField[cell] * Math.exp(-dt * 1.6); + if (!survivalActive() && !lobbyActive() && + ((freeForAll() ? players.filter((player) => player.alive).length <= 1 + : players.some((player) => !player.alive)) || + (timedRound && roundElapsedUs >= roundDurationUs))) { + if (timedRound && roundElapsedUs >= roundDurationUs && + players.every((player) => player.alive)) + roundCause = "TIME"; + finishRound(now); + } +} + +function updateResultImpactDebris(dt) { + for (const impact of impacts) { + if (!impact.debris) { + const count = impact.death ? 20 : impact.explosion ? 24 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.death ? 920 : impact.explosion ? 1180 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 360, + vz: Math.sin(angle * 1.7) * force * .28, + radius: impact.death ? 7 : impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; mote.y += mote.vy * dt; mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); +} + +function circle(x, y, radius, width, color) { + let lastX = x + radius; + let lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + line(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; + lastY = nextY; + } +} + +// Discs are the piece's bulk geometry — every capsule end, every joint. The +// unit ring is constant, so the trig runs once at load, and fanning from a rim +// vertex covers the identical decagon in 8 faces instead of 10 from the center +// (cull is off, depth is flat, colors are flat — the rasterized pixels match). +// A silhouette only has to be as fine as its size on screen. A limb cap a few +// pixels across reads round at six sides; a head at ninety does not, and used +// to show its corners. Rings are precomputed per step so no trig runs inside a +// frame, and the small end is cheaper than the one fixed ring it replaces. +const discRings = [6, 8, 12, 16, 24, 32].map((sides) => { + const ring = []; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + ring.push(Math.cos(a), Math.sin(a)); + } + return ring; +}); +const discRingFor = (radius) => discRings[ + radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 + : radius < 52 ? 3 : radius < 110 ? 4 : 5]; + +function filledDisc(x, y, radius, color) { + const [r, g, b] = color; + if (typeof disc3d === "function" && disc3d(x, y, triangleDepth, radius, r, g, b)) return; + const ring = discRingFor(radius); + const originX = x + ring[0] * radius, originY = y + ring[1] * radius; + let lastX = x + ring[2] * radius, lastY = y + ring[3] * radius; + for (let side = 4; side < ring.length; side += 2) { + const nextX = x + ring[side] * radius; + const nextY = y + ring[side + 1] * radius; + screenTriangle(originX, originY, lastX, lastY, nextX, nextY, r, g, b); + lastX = nextX; + lastY = nextY; + } +} + +function filledRing(x, y, outerRadius, innerRadius, color) { + const [r, g, b] = color; + const sides = 14; + const inner = Math.max(0, Math.min(outerRadius, innerRadius)); + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + const outerA = { x: x + Math.cos(a) * outerRadius, + y: y + Math.sin(a) * outerRadius }; + const outerB = { x: x + Math.cos(b) * outerRadius, + y: y + Math.sin(b) * outerRadius }; + const innerA = { x: x + Math.cos(a) * inner, + y: y + Math.sin(a) * inner }; + const innerB = { x: x + Math.cos(b) * inner, + y: y + Math.sin(b) * inner }; + screenTriangle(outerA.x, outerA.y, innerA.x, innerA.y, + outerB.x, outerB.y, r, g, b); + screenTriangle(innerA.x, innerA.y, innerB.x, innerB.y, + outerB.x, outerB.y, r, g, b); + } +} + +function filledCapsule(x1, y1, x2, y2, width, color) { + const [r, g, b] = color; + const dx = x2 - x1; + const dy = y2 - y1; + const length = Math.hypot(dx, dy); + const radius = width / 2; + if (length < .001) { + filledDisc(x1, y1, radius, color); + return; + } + const nx = -dy / length * radius; + const ny = dx / length * radius; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + filledDisc(x1, y1, radius, color); + filledDisc(x2, y2, radius, color); +} + +// Xbox batches GPU triangles above its D2D line layer, so every bone and joint +// must share this triangle path. The wider silhouette pass and color pass form +// conventional rounded capsules without the native renderer reordering them. +function damagedPartColor(color, player, part) { + const damage = Number(player?.partDamage?.[part] || 0); + if (!damage) return color; + const durability = part === "torso" ? 3 : 2; + const amount = clamp(damage / durability * .92, 0, .92); + return mixColor(color, [244, 34, 50], amount); +} + +function generatedAppearance(player) { + const selected = globalThis.__oskiewarFighterAppearance; + if (!selected || Date.now() >= selected.validUntil || player?.pad !== 0 || player.npc || + netSession || roundViewer || versusLane() || survivalActive() || shellMode !== "GAME") return null; + return selected.appearance; +} +function generatedPartColor(appearance, segment) { + const role = segment.role || ""; + if (/foot/.test(role)) return appearance.shoes; + if (/thigh|shin|leg/.test(role)) return appearance.pants; + if (/forearm|hand/.test(role) && appearance.sleeves === "short") return appearance.skin; + return appearance.shirt; +} + +function drawSkeletonSegments(segments, color, outline, player = null) { + const edge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + if (player?.skateboard) segments = segments.slice().sort((a, b) => b.depth - a.depth); + for (const segment of segments) { + if (segment.hitboxOnly) continue; + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + edge * 2, outline); + } + for (const [index, segment] of segments.entries()) { + if (segment.hitboxOnly) continue; + const appearance = generatedAppearance(player); + drawPaletteCapsule(segment, appearance ? null : player && !player.npc + ? player.handleColors : null, index, appearance ? generatedPartColor(appearance, segment) : color, player); + } +} + +function paletteColorAt(colors, coordinate, fallback) { + if (!colors?.length) return fallback; + const wrapped = ((coordinate % colors.length) + colors.length) % colors.length; + const first = Math.floor(wrapped); + const second = (first + 1) % colors.length; + return mixColor(colors[first], colors[second], wrapped - first); +} + +function drawPaletteCapsule(segment, colors, coordinate, fallback, player = null) { + // The gradient's resolution is an experiment dial: six bands is the look, + // one band is a flat capsule at a third of the faces. + const bands = colors?.length > 1 + ? clamp(Math.round(renderFlags.bands ?? 6), 1, 6) : 1; + if (bands === 1) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width, damagedPartColor(fallback, player, segment.part)); + return; + } + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy) || 1; + const radius = segment.width / 2; + const nx = -dy / length * radius; + const ny = dx / length * radius; + let firstColor = fallback; + let lastColor = fallback; + for (let band = 0; band < bands; band++) { + const from = band / bands; + const to = (band + 1) / bands; + // A small overlap keeps the gradient continuous after integer projection. + const overlap = bands > 1 ? .012 : 0; + const x1 = lerp(segment.x1, segment.x2, Math.max(0, from - overlap)); + const y1 = lerp(segment.y1, segment.y2, Math.max(0, from - overlap)); + const x2 = lerp(segment.x1, segment.x2, Math.min(1, to + overlap)); + const y2 = lerp(segment.y1, segment.y2, Math.min(1, to + overlap)); + const mapped = paletteColorAt(colors, + coordinate + (from + to) * .5, fallback); + const color = damagedPartColor(mapped, player, segment.part); + if (band === 0) firstColor = color; + if (band === bands - 1) lastColor = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, ...color); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, ...color); + } + filledDisc(segment.x1, segment.y1, radius, firstColor); + filledDisc(segment.x2, segment.y2, radius, lastColor); +} + +function drawFighterSilhouette(geometry, color, outline, player = null) { + drawSkeletonSegments(geometry.segments, color, outline, player); + const headEdge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + // The neck connector and solid head are emitted into the same triangle + // silhouette pass, so the head cannot detach as a separate line-layer ring. + filledDisc(geometry.head.x, geometry.head.y, + geometry.head.radius + headEdge, outline); + // AC stores the @ glyph first; the face is the identity anchor for the same + // palette that distorts continuously across the body below it. + const appearance = generatedAppearance(player); + const headColor = appearance ? appearance.skin : player && !player.npc && player.handleColors?.length + ? player.handleColors[0] : color; + filledDisc(geometry.head.x, geometry.head.y, geometry.head.radius, headColor); + if (appearance) { + const { x, y, radius: r } = geometry.head; + if (appearance.hairStyle !== "none") { + filledCapsule(x - r * .7, y - r * .65, x + r * .7, y - r * .65, + r * (appearance.hairStyle === "curly" ? .75 : .48), appearance.hair); + if (appearance.hairStyle === "long") for (const side of [-1, 1]) + filledCapsule(x + side * r * .86, y - r * .3, x + side * r * .86, y + r * .85, r * .3, appearance.hair); + } + if (appearance.beard) filledCapsule(x - r * .4, y + r * .68, x + r * .4, y + r * .68, r * .4, appearance.hair); + if (appearance.glasses) { + for (const side of [-1, 1]) hudCircle(x + side * r * .34, y - r * .08, r * .23, Math.max(1, r * .08), [18, 20, 28]); + filledCapsule(x - r * .1, y - r * .08, x + r * .1, y - r * .08, Math.max(1, r * .06), [18, 20, 28]); + } + } + if (player && isHeadOnly(player)) { + // The shell rolls from distance travelled while the face is drawn later in + // stable screen space. A visible chord makes circular geometry's rotation + // readable without tumbling the eyes or changing their gaze. + const angle = player.x / Math.max(12, geometry.head.radius) + + player.facing * Math.PI * .18; + const reach = geometry.head.radius * .7; + const dx = Math.cos(angle) * reach; + const dy = Math.sin(angle) * reach; + filledCapsule(geometry.head.x - dx, geometry.head.y - dy, + geometry.head.x + dx, geometry.head.y + dy, + Math.max(2, geometry.head.radius * .1), mixColor(headColor, outline, .55)); + } +} + +function fighterAnimationPhase(player, now = null) { + const run = runtime(); + now ??= run.simMonotonicUs || run.monotonicUs; + let state = "IDLE"; + let stateStartedAt = startedAt; + if (!player.alive) { + state = "KO"; + stateStartedAt = player.headBustedAt || player.lastButtonAt || now; + } else if (now < player.hitStunUntil) { + state = "HIT"; + stateStartedAt = player.lastButtonAt || now; + } else if (roundResult && ["KICK", "PUNCH", "POSE", "DANCE", "DASH", + "JUMP", "CROUCH"].includes(player.resultReaction)) { + state = player.resultReaction === "POSE" || player.resultReaction === "DANCE" + ? "MEDITATE" : player.resultReaction; + stateStartedAt = player.resultReactionAt || now; + } else if (player.blocking) { + state = "SHIELD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.heldBall >= 0) { + state = "HOLD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.grabHeld) { + state = "REACH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.itemAction && now < player.itemActionUntil) { + state = player.itemAction; + stateStartedAt = player.itemActionStartedAt || now; + } else if (player.attackKind && now < player.attackUntil) { + state = player.attackKind; + stateStartedAt = player.attackStartedAt || now; + } else if (isPogo(player)) { + state = "POGO"; + } else if (now < player.sinkUntil) { + state = "SINK"; + stateStartedAt = player.sinkUntil - sinkDurationUs; + } else if (!player.grounded && now < player.hopUntil) { + state = "CROUCH HOP"; + stateStartedAt = player.hopUntil - crouchHopPoseUs; + } else if (player.ducking) { + state = player.grounded ? "CROUCH" : "AIR CROUCH"; + } else if (!player.grounded) { + state = player.vy < 0 ? "JUMP" : "FALL"; + stateStartedAt = player.jumpPoseUntil + ? player.jumpPoseUntil - (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs) + : player.lastButtonAt || now; + } else if (shellMode === "MENU" && titleAttractMode === "still") { + state = "MEDITATE"; + } else if (now < player.dashUntil) { + state = "DASH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.runSince) { + state = "RUN"; + stateStartedAt = player.runSince; + } else if (Math.abs(player.vx) > 40) { + state = "WALK"; + } + const [authoredSteps, authoredTicksPerStep, basePhase, loop] = + fighterAnimationSpecs[state] || fighterAnimationSpecs.IDLE; + const timing = meleeFrames[state]; + const steps = timing ? timing.startup+timing.active+timing.recovery : authoredSteps; + // Descending terrain advances planted-foot exchanges faster. The result is + // still integer-tick animation, but the legs keep pace with downhill speed + // instead of the body skating through a leisurely flat-ground cycle. + const travel = Math.sign(player.vx); + const downhill = player.grounded && travel + ? Math.max(0, terrainFloorAt(player.x + travel * 150) - + terrainFloorAt(player.x)) / 150 : 0; + const ticksPerStep = ["WALK", "RUN", "DASH"].includes(state) + ? Math.max(1, Math.round(authoredTicksPerStep / + (1 + downhill * 1.9 + Math.min(1, Math.abs(player.vx) / 1800) * .28))) + : authoredTicksPerStep; + const rawTick = Math.max(0, + Math.floor((now - stateStartedAt) / replayTickUs)); + const rawStep = Math.floor(rawTick / ticksPerStep); + const step = loop ? rawStep % steps : Math.min(steps - 1, rawStep); + let phase = basePhase; + if (timing) phase = meleeFrame(player,now).phase.toUpperCase(); + else if (["FIRE", "THROW", "REACH"].includes(state)) { + const section = step / Math.max(1, steps - 1); + phase = section < .3 ? "STARTUP" : section < .68 ? "ACTIVE" : "RECOVERY"; + } else if (state === "JUMP" || state === "FALL") { + phase = Math.abs(player.vy) < 150 ? "APEX" : state === "JUMP" + ? "ASCEND" : "DESCEND"; + } + // `frameNow` is the clock, not the cycle. It has to keep climbing with real + // time — the looping states anchor `stateStartedAt` at match start, so a + // cycle-position clock wraps back to the first second forever and every + // "is this timestamp still in the future" test answers yes for the rest of + // the round. That is what pinned a landed fighter in the crouch pose and + // froze the legs. Quantizing to the tick grid keeps the pose on the sim's + // 60 Hz phase without inventing in-between frames. + return { state, phase, step: step + 1, steps, tick: rawTick, + ticksPerStep, progress: step / Math.max(1, steps - 1), + frameNow: stateStartedAt + rawTick * replayTickUs }; +} + +// Only share poses during one interpolated paint. Simulation and rollback +// always rebuild, because a hit may change limbs between queries in one tick. +const renderPoses = new Map(); +let sharingRenderPoses = false; +function runnerWorldGeometry(player, t) { + const cached = sharingRenderPoses && renderPoses.get(player); + if (cached && (!player.spiderDummy || cached.t === t)) return cached.pose; + const pose = buildRunnerWorldGeometry(player, t); + if (player.skateRotation) { + const c = Math.cos(player.skateRotation), s = Math.sin(player.skateRotation); + const rotate = (x, y) => ({ x: player.x + (x - player.x) * c - (y - player.y) * s, + y: player.y + (x - player.x) * s + (y - player.y) * c }); + Object.assign(pose.head, rotate(pose.head.x, pose.head.y)); + for (const segment of pose.segments) { + const a = rotate(segment.x1, segment.y1), b = rotate(segment.x2, segment.y2); + segment.x1 = a.x; segment.y1 = a.y; segment.x2 = b.x; segment.y2 = b.y; + } + } + if (sharingRenderPoses) renderPoses.set(player, { t, pose }); + return pose; +} + +function buildRunnerWorldGeometry(player, t, at = null) { + if (player.spiderDummy) return spiderDummyWorldGeometry(player, t); + // Rendering consumes the same fixed 60 Hz phase clock as simulation. The + // display can remain uncapped without inventing in-between combat poses. + const animation = fighterAnimationPhase(player, at); + const poseNow = animation.frameNow; + const poseCycle = animation.progress * Math.PI * 2; + const speed = Math.min(1, Math.abs(player.vx) / 1500); + const meditating = shellMode === "MENU" && titleTransitionAt === null && + titleAttractMode === "still"; + const idle = player.grounded && !player.ducking && speed < .03; + const breath = idle ? Math.sin(poseCycle + player.pad * .7) * 5 : 0; + const idleSway = idle ? Math.sin(poseCycle + player.pad) * 7 : 0; + const stride = Math.sin(poseCycle + player.pad * Math.PI) * + 32 * speed; + const pogo = isPogo(player); + const headOnly = isHeadOnly(player); + const noLegs = !hasPart(player, "left-leg") && + !hasPart(player, "right-leg") && !headOnly; + const jumpAnticipation = player.jumpLaunchAt > poseNow + ? clamp(1 - (player.jumpLaunchAt - poseNow) / jumpAnticipationUs, 0, 1) : 0; + const landingRecovery = player.landPoseUntil > poseNow + ? clamp((player.landPoseUntil - poseNow) / 110000, 0, 1) : 0; + const crouchPose = clamp(Math.max(player.crouchBlend || 0, + Math.sin(jumpAnticipation * Math.PI) * .72, + landingRecovery * .45, noLegs ? .45 : 0), 0, 1); + const height = lerp(180, 108, crouchPose); + const formDrop = pogo ? 54 : noLegs ? 31 : 0; + const aimPose = player.itemAimLocked || player.gunAimLive + ? player.gunAimX || player.facing : 0; + const lean = player.facing * (idle ? 5 : 3 + speed * 10) + aimPose * 7; + const x = player.x; + const feet = player.y; + const z = player.z; + // With neither leg present the pelvis itself becomes the ground contact. + // Keeping its capsule tangent to the floor prevents a floating torso pose. + const hipY = noLegs ? feet - 5 + : feet - lerp(58, 40, crouchPose) + formDrop; + const neckX = x + lean; + const neckY = feet - height + 54 - breath + formDrop + + (player.itemAimLocked || player.gunAimLive + ? (player.gunAimY || 0) * 8 : 0); + const attackPulse = meleePulse(player, poseNow); + const head = headOnly + ? { x, y: feet - 22, z, radius: 22 } + : { x: neckX + lean * .2, + y: feet - height + 22 - breath * 1.6 + formDrop, z, radius: 22 }; + const segments = []; + // `startMelee` and `heldItem` both gate on `itemHand`, so the drawn striking + // arm has to name that same part. Naming it by facing alone tagged the + // reaching capsules with the opposite arm the moment a fighter turned around + // while armed — shooting off one arm then erased the other one's limb. + const actionArm = itemHand(player) || + (player.facing > 0 ? "right-arm" : "left-arm"); + const rearArm = actionArm === "right-arm" ? "left-arm" : "right-arm"; + const actionLeg = player.facing > 0 ? "right-leg" : "left-leg"; + const rearLeg = actionLeg === "right-leg" ? "left-leg" : "right-leg"; + const partForRole = (role, startX) => { + if (["neck", "torso", "shoulders"].includes(role)) return "torso"; + if (role.startsWith("attack-") || role.startsWith("item-")) + return role.includes("arm") || role.includes("forearm") + ? actionArm : actionLeg; + if (role.startsWith("rest-")) return rearArm; + if (role.startsWith("lead-")) return actionLeg; + if (role.startsWith("rear-")) + return role.includes("arm") || role.includes("forearm") + ? rearArm : rearLeg; + if (role.startsWith("grab-")) + return startX <= neckX ? "left-arm" : "right-arm"; + if (role.startsWith("left-")) + return role.includes("arm") || role.includes("forearm") + ? "left-arm" : "left-leg"; + if (role.startsWith("right-")) + return role.includes("arm") || role.includes("forearm") + ? "right-arm" : "right-leg"; + return "torso"; + }; + const segment = (x1, y1, x2, y2, width, role = "body") => { + const part = partForRole(role, x1); + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1: z, x2, y2, z2: z, width, role, part }); + }; + const twoBone = (startX, startY, targetX, targetY, length, bend) => { + let dx = targetX - startX; + let dy = targetY - startY; + let distance = Math.hypot(dx, dy) || 1; + const maximum = length * 1.94; + if (distance > maximum) { + targetX = startX + dx / distance * maximum; + targetY = startY + dy / distance * maximum; + dx = targetX - startX; + dy = targetY - startY; + distance = maximum; + } + const middleX = (startX + targetX) / 2; + const middleY = (startY + targetY) / 2; + const height = Math.sqrt(Math.max(0, length * length - + distance * distance / 4)); + return { jointX: middleX - dy / distance * height * bend, + jointY: middleY + dx / distance * height * bend, + targetX, targetY }; + }; + // Where a grounded foot may actually plant. The bare terrain probe reads + // the arena floor, so a fighter standing on a rung planted his feet a + // storey down and the shins stretched to reach — the long legs @jeffrey + // called out. The probe now asks for the surface the fighter is actually + // standing on, and a foot hanging past a rung's lip stops at the leg's own + // reach — a short dangle — instead of the floor below. + const footPlant = (footX) => Math.min(surfaceYAt(footX, feet), feet + 20); + segment(head.x, head.y + head.radius * .78, neckX, neckY, 10, "neck"); + segment(neckX, neckY, x, hipY, 10, "torso"); + // An elbow sags downward whichever way the hand actually reaches. Bending + // by facing alone flipped the joint whenever a hand crossed behind the + // body — the crossed, double-elbowed arms @jeffrey called out. + const armBend = (shoulderX, targetX) => targetX >= shoulderX ? 1 : -1; + const shoulderY = neckY + 11; + const shoulderSpread = 12; + const leftShoulderX = neckX - shoulderSpread; + const rightShoulderX = neckX + shoulderSpread; + // The working hand always reaches out front and the idle one always trails + // behind, so both shoulders follow facing. Anchoring them on the arm that + // owns the item instead meant a fighter who armed himself facing right and + // then turned around hung his reaching arm off the rear shoulder and his + // trailing arm off the front one: the pair crossed once at the neck and + // again past the elbows, boxing the double diamond @jeffrey called out. + const actionShoulderX = neckX + player.facing * shoulderSpread; + const restShoulderX = neckX - player.facing * shoulderSpread; + segment(leftShoulderX, shoulderY, rightShoulderX, shoulderY, 10, + "shoulders"); + if (player.attackKind === "KICK" && attackPulse > 0) { + const target = meleeTarget(player, poseNow); + const lowKick = player.lowKick; + const leg = twoBone(x, hipY, target.x, target.y, + meleeSpecs.KICK.span, lowKick ? player.facing * .35 : -player.facing); + segment(x, hipY, leg.jointX, leg.jointY, 12, "attack-thigh"); + segment(leg.jointX, leg.jointY, leg.targetX, leg.targetY, 12, + "attack-shin"); + segment(x, hipY, x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), 10, "rear-thigh"); + segment(x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), x - player.facing * 8, feet, + 10, "rear-shin"); + } else if (meditating) { + segment(x, hipY, x - 48, feet - 12, 11, "left-thigh"); + segment(x - 48, feet - 12, x + 8, feet, 11, "left-shin"); + segment(x, hipY, x + 48, feet - 12, 11, "right-thigh"); + segment(x + 48, feet - 12, x - 8, feet, 11, "right-shin"); + } else if (player.skateboard) { + // The deck is drawn tilted along the terrain, so each foot plants on + // the deck's own top at its x — flat foot heights ran the board + // through the shins on every slope. + const deckAt = (footX) => footPlant(footX) - 6; + const plantedX = x + player.facing * 28; + const push = Math.sin(poseCycle) * 34; + const leadFootX = plantedX + player.facing * 18; + segment(x, hipY, plantedX, deckAt(plantedX) - 21, 11, "lead-thigh"); + segment(plantedX, deckAt(plantedX) - 21, leadFootX, + deckAt(leadFootX), 11, "lead-shin"); + const pushKnee = x - player.facing * (22 + push * .3); + const pushFootX = x - player.facing * (46 + Math.max(0, push)); + segment(x, hipY, pushKnee, deckAt(pushKnee) - 25, 10, "rear-thigh"); + segment(pushKnee, deckAt(pushKnee) - 25, pushFootX, + deckAt(pushFootX), 10, "rear-shin"); + } else if (crouchPose > .08) { + segment(x, hipY, x - 36, feet - 22, 10, "left-thigh"); + segment(x - 36, feet - 22, x - 4, feet, 10, "left-shin"); + segment(x, hipY, x + 36, feet - 22, 10, "right-thigh"); + segment(x + 36, feet - 22, x + 58, feet, 10, "right-shin"); + } else if (player.grounded) { + // The facing-side foot is visibly planted forward even at rest. + const leadKnee = x + player.facing * 18 + stride * .38; + const leadFoot = x + player.facing * 42 + stride; + const rearKnee = x - player.facing * 16 - stride * .38; + const rearFoot = x - player.facing * 28 - stride; + // The animation phase still chooses the discrete stride; ground probes + // constrain that frame onto the surface underfoot without new sim steps. + const leadGround = footPlant(leadFoot); + const rearGround = footPlant(rearFoot); + segment(x, hipY, leadKnee, leadGround - 30, 10, "lead-thigh"); + segment(leadKnee, leadGround - 30, leadFoot, leadGround, 10, "lead-shin"); + segment(x, hipY, rearKnee, rearGround - 30, 10, "rear-thigh"); + segment(rearKnee, rearGround - 30, rearFoot, rearGround, 10, "rear-shin"); + } else { + segment(x, hipY, x - 32, feet - 32, 10, "left-thigh"); + segment(x - 32, feet - 32, x - 7, feet - 11, 10, "left-shin"); + segment(x, hipY, x + 32, feet - 43, 10, "right-thigh"); + segment(x + 32, feet - 43, x + 50, feet - 22, 10, "right-shin"); + } + const arm = idle ? idleSway : player.grounded ? -stride * .7 : 12; + const elbowY = feet - lerp(94, 76, crouchPose) - breath; + const handY = feet - lerp(65, 50, crouchPose) - breath * .5; + const actionNow = poseNow; + const armAttack = attackPulse > 0 && player.attackKind && + player.attackKind !== "KICK"; + if (player.skateboard && player.grounded && !armAttack && !heldItem(player)) { + const balance = Math.sin(poseCycle) * 18; + segment(leftShoulderX, shoulderY, x - 42, elbowY - 10 - balance, + 10, "left-upper-arm"); + segment(x - 42, elbowY - 10 - balance, x - 66, handY - balance, + 10, "left-forearm"); + segment(rightShoulderX, shoulderY, x + 42, elbowY - 10 + balance, + 10, "right-upper-arm"); + segment(x + 42, elbowY - 10 + balance, x + 66, handY + balance, + 10, "right-forearm"); + } else if (player.grabHeld || player.ropeIndex >= 0) { + const held = player.heldBall >= 0 ? balls[player.heldBall] : null; + const clutchX = player.ropeIndex >= 0 ? x : held?.x ?? x + player.facing * 126; + const clutchY = player.ropeIndex >= 0 ? feet - 125 : held?.y ?? feet - 92; + const spread = held ? Math.max(12, held.radius * .34) : 20; + const hands = [ + { shoulderX: leftShoulderX, x: clutchX - player.facing * 5, + y: clutchY - spread }, + { shoulderX: rightShoulderX, x: clutchX - player.facing * 5, + y: clutchY + spread }, + ]; + for (const hand of hands) { + const pose = twoBone(hand.shoulderX, shoulderY, + hand.x, hand.y, 58, armBend(hand.shoulderX, hand.x)); + segment(hand.shoulderX, shoulderY, pose.jointX, pose.jointY, 12, + "grab-upper-arm"); + segment(pose.jointX, pose.jointY, pose.targetX, pose.targetY, 12, + "grab-forearm"); + } + } else if (armAttack) { + // The striking arm outranks the carry pose: a whip or bash has to publish + // attack capsules or an armed fighter could never land a hand strike. + const target = meleeTarget(player, poseNow); + const armPose = twoBone(actionShoulderX, shoulderY, target.x, target.y, + meleeSpecFor(player, player.attackKind).span, + armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "attack-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "attack-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else if ((player.itemAction && actionNow < player.itemActionUntil) || + (player.gunAmmo > 0 && player.itemAction !== "THROW")) { + const target = itemHandTarget(player, actionNow); + const armPose = twoBone(actionShoulderX, shoulderY, + target.x, target.y, 58, armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "item-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "item-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else { + segment(leftShoulderX, shoulderY, x - 30 + arm * .45, elbowY, 10, + "left-upper-arm"); + segment(x - 30 + arm * .45, elbowY, x - 36 + arm * .6, handY, 10, + "left-forearm"); + segment(rightShoulderX, shoulderY, x + 30 - arm * .45, elbowY, 10, + "right-upper-arm"); + segment(x + 30 - arm * .45, elbowY, x + 36 - arm * .6, handY, 10, + "right-forearm"); + } + if (player.skateboard && !headOnly) { + const deck = skateFrame(player); + const pitch = (player.skatePitch || 0) * .35; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const transform = (px, py, depth) => ({ + x: x + (px - x) * c - (py - feet) * sn, + y: feet - skateAxleDrop - skateWheelRadius + (px - x) * sn + (py - feet) * c, + z: z + depth, + }); + Object.assign(head, transform(head.x, head.y, 0)); + for (const bone of segments) { + const side = bone.part.startsWith("left-") ? -1 : bone.part.startsWith("right-") ? 1 : 0; + const depth = side * (bone.part.includes("arm") ? 15 : 9); + const a = transform(bone.x1, bone.y1, depth); + const b = transform(bone.x2, bone.y2, depth); + if (bone.role === "shoulders") { + a.z = z - 15; + b.z = z + 15; + } + Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, x2: b.x, y2: b.y, z2: b.z }); + } + if (player.attackKind !== "KICK" || !attackPulse) { + for (const [role, direction, part] of [["lead", player.facing, actionLeg], + ["rear", -player.facing, rearLeg]]) { + if (!hasPart(player, part)) continue; + const side = part === "left-leg" ? -1 : 1; + const hip = transform(x, hipY, side * 7); + const foot = deck(direction * skateTruck, -4, side * 9); + const dx = foot.x - hip.x, dy = foot.y - hip.y, dz = foot.z - hip.z; + const distance = Math.hypot(dx, dy, dz) || 1; + const length = Math.max(48, distance / 1.98); + const bend = Math.sqrt(Math.max(0, length * length - distance * distance / 4)); + const norm = Math.hypot(dx, dy) || 1; + const knee = { x: (hip.x + foot.x) / 2 + dy / norm * bend * player.facing, + y: (hip.y + foot.y) / 2 - dx / norm * bend * player.facing, + z: (hip.z + foot.z) / 2 }; + const thigh = segments.find((bone) => bone.role === role + "-thigh"); + const shin = segments.find((bone) => bone.role === role + "-shin"); + for (const [bone, a, b] of [[thigh, hip, knee], [shin, knee, foot]]) + if (bone) Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, + x2: b.x, y2: b.y, z2: b.z }); + } + } + } + return { head, segments }; +} + +// The first spider dummy deliberately shares the inert dummy controller. Its +// threat is physical scale: four independently destructible leg-pairs spread +// across a daddy-long-legs silhouette around one large central body. +function spiderDummyWorldGeometry(player, t) { + const x = player.x; + const feet = player.y; + const z = player.z; + const bodyY = feet - 176; + const sway = Math.sin(t * 1.7 + player.pad) * 5; + const head = { x, y: bodyY + sway, z, radius: 22 }; + const segments = []; + const add = (x1, y1, x2, y2, width, role, part, + z1 = z, z2 = z, hitboxOnly = false) => { + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1, x2, y2, z2, width, role, part, hitboxOnly }); + }; + add(x - 42, bodyY, x + 42, bodyY, 38, "torso", "torso"); + add(x, bodyY - 30, x, bodyY + 31, 34, "spider-body", "torso"); + const legs = [ + [-1, -1], [-1, -.55], [-1, .25], [-1, .72], + [1, -1], [1, -.55], [1, .25], [1, .72], + ]; + for (let index = 0; index < legs.length; index++) { + const [side, lane] = legs[index]; + const part = spiderLegParts[index]; + const rootX = x + side * 31; + const rootY = bodyY + lane * 31 + sway; + const lift = 34 + Math.abs(lane) * 28; + const depthLane = (index - 3.5) * 72; + const points = [ + [rootX, rootY, z + depthLane * .2], + [x + side * 76, bodyY - lift, z + depthLane * .48], + [x + side * 126, bodyY - lift * .42, z + depthLane * .72], + [x + side * 171, bodyY + 24 + Math.abs(lane) * 19, z + depthLane], + [x + side * 211, feet - 51 - (index % 2) * 12, z + depthLane * 1.08], + [x + side * 246, feet, z + depthLane], + ]; + for (let joint = 0; joint < points.length - 1; joint++) { + const [x1, y1, z1] = points[joint]; + const [x2, y2, z2] = points[joint + 1]; + add(x1, y1, x2, y2, 13 - joint, + `spider-leg-${index + 1}-segment-${joint + 1}`, part, z1, z2); + } + // One broad top-level combat proxy per complete leg keeps the boss + // readable to melee even though the visible joints fan through Z. + add(rootX, rootY, points.at(-1)[0], points.at(-1)[1], 32, + `spider-hitbox-${index + 1}`, part, z, z, true); + } + return { head, segments }; +} + +function runnerGeometry(player, t) { + return projectRunnerWorldGeometry(runnerWorldGeometry(player, t)); +} + +function projectRunnerWorldGeometry(world) { + const headPoint = projectPoint(world.head.x, world.head.y, world.head.z); + return { + head: { x: headPoint.x, y: headPoint.y, + radius: Math.max(1.5, world.head.radius * cameraScale()) }, + segments: world.segments.map((segment) => { + const a = projectPoint(segment.x1, segment.y1, segment.z1); + const b = projectPoint(segment.x2, segment.y2, segment.z2); + return { x1: a.x, y1: a.y, x2: b.x, y2: b.y, depth: (a.z + b.z) / 2, + width: Math.max(1.5, segment.width * cameraScale()), + role: segment.role, part: segment.part, + hitboxOnly: segment.hitboxOnly }; + }), + }; +} + +function runnerBounds(player, t) { + const geometry = runnerWorldGeometry(player, t); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function runnerScreenBounds(player, t) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + const geometry = projectRunnerWorldGeometry(world); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function fighterContainmentRequiredWidth(t) { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + const include = (x, y, radius) => { + left = Math.min(left, x - radius); + right = Math.max(right, x + radius); + top = Math.min(top, y - radius); + bottom = Math.max(bottom, y + radius); + }; + for (const player of activePlayers()) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + include(world.head.x, world.head.y, world.head.radius); + for (const segment of world.segments) { + const radius = segment.width / 2; + include(segment.x1, segment.y1, radius); + include(segment.x2, segment.y2, radius); + } + } + return Math.max(rectPackWidth({ left, right, top, bottom }), + frameFloorWidth()); +} + +// Final render invariant: both complete animated fighter geometries must fit +// inside the action-safe viewport. Camera modes may orbit or focus, but this +// aspect-aware correction recenters their shared frame and moves the dolly +// back far enough for landscape, portrait, live, and replay projection alike. +function containFighters(t) { + if (skateparkMap && !survivalActive()) return; + const gameplayContainment = !roundResult && + runtime().monotonicUs - roundStartedAt >= roundIntroDurationUs(); + if (gameplayContainment) { + cameraContainFloor = Math.max(cameraContainFloor, + fighterContainmentRequiredWidth(t) * 1.11); + return; + } + const worlds = activePlayers().map((player) => player.replayGeometry || + player.frozenGeometry || runnerWorldGeometry(player, t)); + if (!worlds.length) return; + const points = []; + for (const world of worlds) { + const { head } = world; + points.push( + { x: head.x - head.radius, y: head.y, z: head.z }, + { x: head.x + head.radius, y: head.y, z: head.z }, + { x: head.x, y: head.y - head.radius, z: head.z }, + { x: head.x, y: head.y + head.radius, z: head.z }, + ); + for (const segment of world.segments) { + const radius = segment.width / 2; + for (const endpoint of [ + { x: segment.x1, y: segment.y1, z: segment.z1 }, + { x: segment.x2, y: segment.y2, z: segment.z2 }, + ]) { + points.push( + { x: endpoint.x - radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x + radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y - radius, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y + radius, z: endpoint.z }, + ); + } + } + } + const minX = Math.min(...points.map((point) => point.x)); + const maxX = Math.max(...points.map((point) => point.x)); + const minY = Math.min(...points.map((point) => point.y)); + const maxY = Math.max(...points.map((point) => point.y)); + // Keep the smoothly tracked root target. Animated limb extrema are allowed + // to affect containment scale, but never camera aim. + const target = cameraDoll.target; + + const safe = actionSafeRect(); + const safeWidth = Math.max(1, safe.right - safe.left); + const safeHeight = Math.max(1, safe.bottom - safe.top); + const requiredWidth = Math.max( + rectPackWidth({ left: minX, right: maxX, top: minY, bottom: maxY }), + frameFloorWidth()); + if (requiredWidth > cameraDoll.width) { + const amount = requiredWidth / Math.max(1, cameraDoll.width) * 1.04; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + + // Perspective and z-depth can make the world-space estimate asymmetric. + // Iteratively measure the actual projection and expand along the existing + // camera ray until every point satisfies the screen-space safe rectangle. + const centerX = (safe.left + safe.right) / 2; + const centerY = (safe.top + safe.bottom) / 2; + for (let pass = 0; pass < 4; pass++) { + cameraDoll.dirty = true; + cameraDoll.prepare(); + const projected = points.map((point) => cameraDoll.project(point)); + const left = Math.min(...projected.map((point) => point.x)); + const right = Math.max(...projected.map((point) => point.x)); + const top = Math.min(...projected.map((point) => point.y)); + const bottom = Math.max(...projected.map((point) => point.y)); + const factor = Math.max(1, + (centerX - left) / (safeWidth / 2), + (right - centerX) / (safeWidth / 2), + (centerY - top) / (safeHeight / 2), + (bottom - centerY) / (safeHeight / 2)); + if (factor <= 1.001) break; + const amount = factor * 1.025; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + cameraDoll.dirty = true; +} + +function resolveRunnerBounds(player, t) { + // Walls use a stable pushbox independent of the character renderer. + const halfWidth = isHeadOnly(player) ? 24 : isPogo(player) ? 38 + : player.ducking ? 76 : 62; + const leftWall = worldLeft + wallThickness; + const rightWall = worldRight - wallThickness; + if (player.x - halfWidth < leftWall) { + player.x = leftWall + halfWidth; + if (player.skateboard && player.grounded && player.skateVx < -900) { + player.skateWallSide = -1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, -1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx < 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.max(0, player.vx); + player.knockVx = Math.max(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + if (player.x + halfWidth > rightWall) { + player.x = rightWall - halfWidth; + if (player.skateboard && player.grounded && player.skateVx > 900) { + player.skateWallSide = 1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, 1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx > 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.min(0, player.vx); + player.knockVx = Math.min(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + const ceiling = (survivalActive() ? survivalCeilingY : ceilingY) + + wallThickness; + const standingTop = runnerBounds(player, t).top; + if (!airRoundActive() && standingTop < ceiling) { + player.y += ceiling - standingTop; + if (player.vy < 0) player.vy = isHeadOnly(player) ? -player.vy * .62 : 0; + } +} + +function pointSegmentDistance(px, py, pz, segment) { + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const dz = segment.z2 - segment.z1; + const lengthSquared = dx * dx + dy * dy + dz * dz; + const amount = lengthSquared > 0 + ? Math.max(0, Math.min(1, + ((px - segment.x1) * dx + (py - segment.y1) * dy + + (pz - segment.z1) * dz) / lengthSquared)) + : 0; + return Math.hypot(px - (segment.x1 + dx * amount), + py - (segment.y1 + dy * amount), pz - (segment.z1 + dz * amount)); +} + +// Closest points for loose debris, independent of the character renderer. +function segmentSegmentClosest(first, second) { + const d1x = first.x2 - first.x1; + const d1y = first.y2 - first.y1; + const d1z = first.z2 - first.z1; + const d2x = second.x2 - second.x1; + const d2y = second.y2 - second.y1; + const d2z = second.z2 - second.z1; + const rx = first.x1 - second.x1; + const ry = first.y1 - second.y1; + const rz = first.z1 - second.z1; + const a = d1x * d1x + d1y * d1y + d1z * d1z; + const e = d2x * d2x + d2y * d2y + d2z * d2z; + const b = d1x * d2x + d1y * d2y + d1z * d2z; + const c = d1x * rx + d1y * ry + d1z * rz; + const f = d2x * rx + d2y * ry + d2z * rz; + const epsilon = .000000001; + let firstAmount = 0; + let secondAmount = 0; + if (a <= epsilon && e <= epsilon) { + firstAmount = 0; + secondAmount = 0; + } else if (a <= epsilon) { + secondAmount = clamp(f / e, 0, 1); + } else if (e <= epsilon) { + firstAmount = clamp(-c / a, 0, 1); + } else { + const denominator = a * e - b * b; + firstAmount = Math.abs(denominator) > epsilon + ? clamp((b * f - c * e) / denominator, 0, 1) : 0; + const secondNumerator = b * firstAmount + f; + if (secondNumerator < 0) { + secondAmount = 0; + firstAmount = clamp(-c / a, 0, 1); + } else if (secondNumerator > e) { + secondAmount = 1; + firstAmount = clamp((b - c) / a, 0, 1); + } else secondAmount = secondNumerator / e; + } + const firstPoint = { + x: first.x1 + d1x * firstAmount, + y: first.y1 + d1y * firstAmount, + z: first.z1 + d1z * firstAmount, + }; + const secondPoint = { + x: second.x1 + d2x * secondAmount, + y: second.y1 + d2y * secondAmount, + z: second.z1 + d2z * secondAmount, + }; + return { firstPoint, secondPoint, + distance: Math.hypot(firstPoint.x - secondPoint.x, + firstPoint.y - secondPoint.y, firstPoint.z - secondPoint.z) }; +} + + +function meleeLimbContact(attacker, target, t) { + const now = runtime().simMonotonicUs || runtime().monotonicUs; + return combatBoxContact(sampleCombatBoxes(attacker, now), sampleCombatBoxes(target, now)); +} + +// World-space rectangles with a shallow Z interval. Visual line width never +// changes these authored radii. The same records feed collision, Tab and Jev. +function combatRect(id, left, top, right, bottom, z = 0, depth = 18, extra = {}) { + return { id, left, top, right, bottom, near: z - depth, far: z + depth, ...extra }; +} +function boxesOverlap(a, b) { + return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && + a.bottom >= b.top && a.near <= b.far && a.far >= b.near; +} +function boxBounds(items) { + return { left: Math.min(...items.map(b => b.left)), right: Math.max(...items.map(b => b.right)), + top: Math.min(...items.map(b => b.top)), bottom: Math.max(...items.map(b => b.bottom)), + near: Math.min(...items.map(b => b.near)), far: Math.max(...items.map(b => b.far)) }; +} +function buildBoxTree(items) { + if (!items.length) return null; + const bounds = boxBounds(items); + if (items.length <= 3) return { bounds, items }; + const horizontal = bounds.right - bounds.left >= bounds.bottom - bounds.top; + const sorted = items.slice().sort((a,b) => horizontal + ? (a.left+a.right)-(b.left+b.right) : (a.top+a.bottom)-(b.top+b.bottom)); + const middle = Math.floor(sorted.length / 2); + return { bounds, children: [buildBoxTree(sorted.slice(0,middle)), buildBoxTree(sorted.slice(middle))] }; +} +function queryBoxTree(tree, area, found = []) { + if (!tree || !boxesOverlap(tree.bounds, area)) return found; + if (tree.items) for (const item of tree.items) { if (boxesOverlap(item, area)) found.push(item); } + else for (const child of tree.children) queryBoxTree(child, area, found); + return found; +} +function pointBoxDistance(box, x, y, z = 0) { + return Math.hypot(Math.max(box.left-x,0,x-box.right), + Math.max(box.top-y,0,y-box.bottom), Math.max(box.near-z,0,z-box.far)); +} +// Slab test on an expanded AABB: a fast projectile cannot skip a thin hurtbox. +function segmentBoxEntry(segment, box, radius = 0) { + let enter = 0, leave = 1; + for (const [axis,low,high] of [['x','left','right'],['y','top','bottom'],['z','near','far']]) { + const origin = segment[axis+'1'], delta = segment[axis+'2']-origin; + if (Math.abs(delta)<1e-9) { + if (originbox[high]+radius) return null; + } else { + const a=(box[low]-radius-origin)/delta,b=(box[high]+radius-origin)/delta; + enter=Math.max(enter,Math.min(a,b));leave=Math.min(leave,Math.max(a,b)); + if(enter>leave)return null; + } + } + return enter; +} +function sweptProjectileContact(segments,target,t) { + const now=runtime().simMonotonicUs || runtime().monotonicUs; + const boxes=sampleCombatBoxes(target,now); + let result=null; + for(const s of segments) { + const r=s.width/2; + const area=combatRect('sweep',Math.min(s.x1,s.x2)-r,Math.min(s.y1,s.y2)-r, + Math.max(s.x1,s.x2)+r,Math.max(s.y1,s.y2)+r,(s.z1+s.z2)/2,Math.abs(s.z2-s.z1)/2+r); + for(const hurt of queryBoxTree(boxes.tree,area)) { + const amount=segmentBoxEntry(s,hurt,r); + if(amount===null || (result && amount>=result.amount))continue; + result={amount,x:s.x1+(s.x2-s.x1)*amount,y:s.y1+(s.y2-s.y1)*amount, + z:s.z1+(s.z2-s.z1)*amount,separation:0,headshot:hurt.part==='head',segmentIndex:hurt.segmentIndex}; + } + } + return result; +} +function combatPushbox(player) { + const half = isHeadOnly(player) ? 24 : isPogo(player) ? 38 : 69; + const height = isHeadOnly(player) ? 44 : isPogo(player) ? 116 : player.ducking ? 118 : 180; + return combatRect('push', player.x-half, player.y-height, player.x+half, player.y, player.z); +} +function sampleCombatBoxes(player, now, world = null, buildTree = true) { + world ||= runnerWorldGeometry(player, (now-startedAt)/1e6); + const hurt = []; + const head = world.head; + hurt.push(combatRect('head', head.x-22, head.y-22, head.x+22, head.y+22, head.z, 22, + { part: 'head', segmentIndex: -1 })); + for (let i=0; is.role==='torso'); + if(torso)hit.push(combatRect('pogo',torso.x2-10,torso.y2-10, + torso.x2+10,torso.y2+10,torso.z2,10,{part:'torso'})); + } + if (player.alive && !player.attackHit && !player.blocking && now >= player.hitStunUntil && + frame.phase === 'active' && !isHeadOnly(player) && !isPogo(player)) { + const kick = player.attackKind === 'KICK'; + const part = kick ? player.facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (part && hasPart(player, part)) { + const tip = meleeTarget(player, now); + const halfX = kick ? 26 : 22; + const halfY = kick && player.lowKick ? 17 : 20; + const inner = player.x+player.facing*(kick ? 42 : 30); + const outer = tip.x+player.facing*halfX; + hit.push(combatRect(player.attackKind.toLowerCase(), Math.min(inner,outer), + tip.y-halfY, Math.max(inner,outer), tip.y+halfY, tip.z, 18, { part })); + } + } + const guard = []; + if (player.blocking) { + const shield = shieldGeometry(player); + guard.push(combatRect('guard', shield.x-shield.radius, shield.y-shield.radius, + shield.x+shield.radius, shield.y+shield.radius, shield.z, shield.radius)); + } + return { hurt, hit, guard, push: combatPushbox(player), frame, + tree: buildTree ? buildBoxTree(hurt) : null }; +} +function combatBoxContact(attacker, target) { + let result = null; + for (const hit of attacker.hit) { + const overlaps = queryBoxTree(target.tree, hit).sort((a,b) => + (a.part === 'head' ? -1 : b.part === 'head' ? 1 : a.segmentIndex-b.segmentIndex)); + const hurt = overlaps[0]; + if (!hurt) continue; + result = { x:(Math.max(hit.left,hurt.left)+Math.min(hit.right,hurt.right))/2, + y:(Math.max(hit.top,hurt.top)+Math.min(hit.bottom,hurt.bottom))/2, + z:(Math.max(hit.near,hurt.near)+Math.min(hit.far,hurt.far))/2, + separation: 0, headshot:hurt.part === 'head', segmentIndex:hurt.segmentIndex, + hitbox:hit.id, hurtbox:hurt.id }; + if (result.headshot) break; + } + return result; +} + +// Sample the game's real strike capsules against the opponent's current +// hurtboxes. This is reach evidence at fixed positions, not a predicted hit: +// travel, input latency, shields and the opponent's next move can change it. +function jevStrikeOptions(player, opponent, now) { + if (!player.alive || !opponent.alive || isHeadOnly(player) || isPogo(player)) return {}; + const t = (now - startedAt) / 1000000; + const target = sampleCombatBoxes(opponent, now); + const facing = Math.sign(opponent.x - player.x) || player.facing; + const result = {}; + for (const [action, kind, crouched] of [ + ['punch', itemMelee[heldItem(player)] || 'PUNCH', false], + ['kick', 'KICK', false], ['low_kick', 'KICK', true], + ['crouch_punch', itemMelee[heldItem(player)] || 'PUNCH', true], + ]) { + const part = kind === 'KICK' ? facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (!part || !hasPart(player, part) || (crouched && !player.grounded)) continue; + const probe = { ...player, facing, vx: 0, blocking: false, + ducking: crouched, crouchBlend: crouched ? 1 : 0, + grabHeld: false, itemAction: '', hitStunUntil: 0, attackHit: false, + attackKind: kind, lowKick: crouched && kind === 'KICK', + attackStartedAt: now, attackUntil: now + meleeSpecs[kind].windowUs }; + let closest = null, clearance = Infinity; + const timing = meleeFrames[kind]; + for (let frame=timing.startup; frame + item.part === part && !item.hitboxOnly)) { + const paletteCoordinate = geometry.segments.indexOf(segment); + detachedParts.push({ ...segment, color: player.color.slice(), + colors: player.npc ? [] : player.handleColors?.map((value) => value.slice()) || [], + paletteCoordinate, + vx: direction * (420 + detachedParts.length % 3 * 90), + vy: -520 - detachedParts.length % 2 * 120, + spin: direction * (3.5 + detachedParts.length % 4), + life: 2.6, part, owner: player.pad, heldBy: -1, hitAfter: now + 180000 }); + } +} + +function detachPart(player, part, geometry, sourceX, now) { + if (!hasPart(player, part)) return; + spawnDetachedPart(player, part, geometry, sourceX, now); + player.removedParts.push(part); + player.partDamage[part] = Math.max(player.partDamage[part] || 0, + part === "torso" ? 3 : 2); + emitSignal("partremoved", player.pad, + [...limbParts, "torso"].indexOf(part), 1); +} + +function damagePart(target, segmentIndex, sourceX, sourcePad, now) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const segment = geometry.segments[segmentIndex]; + const part = segment?.part; + if (!part || !hasPart(target, part)) return; + const durability = target.spiderDummy + ? part === "torso" ? 5 : 3 + : part === "torso" ? 3 : 2; + target.partDamage[part] = (target.partDamage[part] || 0) + 1; + emitSignal("partdamage", target.pad, + [...limbParts, "torso"].indexOf(part), target.partDamage[part] / durability); + if (target.partDamage[part] < durability) return; + if (part === "torso") { + // Removing the body's attachment point releases every surviving limb; + // the circular head remains as the final playable form. + for (const limb of target.spiderDummy ? spiderLegParts : limbParts) + detachPart(target, limb, geometry, sourceX, now); + } + detachPart(target, part, geometry, sourceX, now); + if (part === "torso") { + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + launchHead(target, sourceX, sourcePad, now, 650, 620); + } + if (target.itemArm === part) { + if (target.gunAmmo > 0) gunPickups.push({ kind: target.gunMode, + amount: target.gunAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + if (target.grenadeAmmo > 0) grenadePickups.push({ + amount: target.grenadeAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + // The blade goes where the hand went. A saber is held, not carried, so + // losing the item arm has to put it back on the map — otherwise the one + // weapon a fighter can keep all round would quietly cease to exist and + // the reach it was buying would vanish with no object to explain it. + if (target.swordHeld) { + saberPickups.push({ kind: "LIGHT SABER", x: target.x, + y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + target.swordHeld = false; + } + target.gunAmmo = 0; + target.grenadeAmmo = 0; + target.itemArm = ""; + emitSignal("item-drop", target.pad, sourcePad, 1); + } + if (target.carryArm === part) { + if (target.heldBall >= 0) releaseCarriedBall(target, now); + if (target.heldPart >= 0) releaseCarriedPart(target, now); + if (target.heldPlayer >= 0) releaseCarriedFighter(target, now); + target.carryArm = ""; + } + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.lastButton = part.toUpperCase() + " LOST"; + target.lastButtonAt = now; + playDrum("clap", 1.2, panPlayer(target)); +} + +function damageAllLimbs(target, sourceX, sourcePad, now) { + for (const part of limbParts) { + if (!hasPart(target, part)) continue; + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const index = geometry.segments.findIndex((segment) => segment.part === part); + if (index >= 0) damagePart(target, index, sourceX, sourcePad, now); + } +} + +const skateTruck = 32; +const skateWheelRadius = 8; +const skateAxleDrop = 10; + +function skateContact(x, y) { + // Solve the truck chord against the supporting ledge or heightfield. + let pitch = 0, left = 0, right = 0; + for (let i = 0; i < 6; i++) { + const span = skateTruck * Math.cos(pitch); + left = surfaceYAt(x - span, y - 2); + right = surfaceYAt(x + span, y - 2); + pitch = Math.atan2(right - left, span * 2); + } + const c = Math.cos(pitch), sn = Math.sin(pitch); + const wheelX = -sn * skateAxleDrop; + left = surfaceYAt(x - skateTruck * c + wheelX, y - 2); + right = surfaceYAt(x + skateTruck * c + wheelX, y - 2); + const deckY = Math.min(left + skateTruck * sn, right - skateTruck * sn) - + skateAxleDrop * c - skateWheelRadius; + return { pitch, y: deckY + skateAxleDrop + skateWheelRadius, + left: Math.abs(deckY - skateTruck * sn + skateAxleDrop * c + skateWheelRadius - left) < 3, + right: Math.abs(deckY + skateTruck * sn + skateAxleDrop * c + skateWheelRadius - right) < 3 }; +} + +function skateFrame(player) { + const pitch = player.skateWallSide ? Math.PI / 2 : player.skatePitch || 0; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const down = player.skateWallSide > 0 ? -1 : 1; + return (along, height = 0, across = 0) => ({ + x: player.x + c * along - sn * height * down, + y: player.y - skateAxleDrop - skateWheelRadius + sn * along + c * height * down, + z: player.z + across, + }); +} + +function resetSkate(player) { + player.skateboard = false; + player.skateVx = player.skateWallSide = player.skatePitch = 0; + player.skateSpin = player.skateRollDistance = player.skateCarveDir = 0; + player.skateContacts = 0; + player.walkSince = player.runSince = 0; +} + +function boardForRider(player) { + return balls.find(item => item.type === "skateboard" && item.riderPad === player.pad) || + balls.find(item => item.type === "skateboard" && !item.active && item.heldBy < 0 && + (item.riderPad ?? -1) < 0); +} + +function dismountSkateboard(target, now) { + if (!target.skateboard) return false; + resetSkate(target); + const board = boardForRider(target); + if (!board) return true; + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.x = target.x - target.facing * 58; + board.y = target.y - skateAxleDrop - skateWheelRadius; + board.z = target.z; + board.vx = -target.facing * 720; + board.vy = -260; + board.safeUntil = now + 260000; + board.safePlayers = 1 << target.pad; + emitSignal("skate-dismount", target.pad, 1, 0); + return true; +} + +function applyBodyHit(target, segmentIndex, sourceX, sourcePad, now, + force = 1100, lift = 150, damageParts = true) { + recordFightHit(sourcePad, false); + const direction = Math.sign(target.x - sourceX) || + (sourcePad === target.pad ? -target.facing : target.facing) || 1; + releaseCarriedBall(target, now); + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.dashUntil = 0; + target.dashVx = 0; + target.hit = Math.max(target.hit, .52); + target.hitSegment = segmentIndex; + target.hitSegmentUntil = Math.max(target.hitSegmentUntil, now + 190000); + if (dismountSkateboard(target, now)) damageParts = false; + // Balls transfer recoil but are sporting hazards, not damaging attacks. + if (damageParts) + damagePart(target, segmentIndex, sourceX, sourcePad, now); + target.hitStunUntil = Math.max(target.hitStunUntil, now + 145000); + if (isHeadOnly(target)) { + launchHead(target, sourceX, sourcePad, now, force * 1.15, + Math.max(420, lift * 2)); + } else { + target.knockVx += direction * force; + target.vx = target.knockVx + target.windVx; + target.vy = Math.min(target.vy, -lift); + } + target.grounded = false; + target.stance = "STUN"; + target.lastButton = "BODY HIT"; + target.lastButtonAt = now; + emitSignal("bodyhit", sourcePad, target.pad, segmentIndex); +} + +// `combat` is false on a watcher: the limbs still tumble, settle and draw, +// but they do not damage anybody. The fight they belong to is being decided +// on another machine, and a watcher that scored its own hits would fight the +// wire for the rest of the round. Same switch `updateBullets` already has. +function updateDetachedParts(dt, combat = true) { + const now = runtime().monotonicUs; + for (const fragment of detachedParts) { + if (fragment.heldBy >= 0) { + const carrier = players[fragment.heldBy]; + if (!carrier?.alive || carrier.heldPart !== detachedParts.indexOf(fragment)) { + fragment.heldBy = -1; + } else { + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const dx = carrier.x + carrier.facing * 112 - centerX; + const dy = carrier.y - 78 - centerY; + fragment.x1 += dx; fragment.x2 += dx; + fragment.y1 += dy; fragment.y2 += dy; + fragment.vx = fragment.vy = 0; + fragment.life = Math.max(fragment.life, 1); + continue; + } + } + fragment.vy += 1900 * dt; + const dx = fragment.vx * dt; + const dy = fragment.vy * dt; + fragment.x1 += dx; + fragment.y1 += dy; + fragment.x2 += dx; + fragment.y2 += dy; + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const angle = fragment.spin * dt; + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + for (const endpoint of [1, 2]) { + const xKey = "x" + endpoint; + const yKey = "y" + endpoint; + const localX = fragment[xKey] - centerX; + const localY = fragment[yKey] - centerY; + fragment[xKey] = centerX + localX * cosine - localY * sine; + fragment[yKey] = centerY + localX * sine + localY * cosine; + } + const bottom = Math.max(fragment.y1, fragment.y2) + fragment.width / 2; + const terrainY = terrainFloorAt(centerX); + if (bottom > terrainY) { + const correction = terrainY - bottom; + fragment.y1 += correction; + fragment.y2 += correction; + fragment.vy = -Math.abs(fragment.vy) * .42; + fragment.vx *= .82; + fragment.spin *= .78; + } + const speed = Math.hypot(fragment.vx, fragment.vy); + if (combat && speed > 650 && now >= (fragment.hitAfter || 0)) { + for (const target of players) { + if (!target.alive || target.pad === fragment.owner) continue; + const contact = runnerContactToPoint(target, + (now - startedAt) / 1000000, centerX, centerY, + (fragment.z1 + fragment.z2) / 2); + if (Math.min(contact.headDistance, contact.bodyDistance) > + fragment.width / 2 + 18) continue; + applyBodyHit(target, contact.segmentIndex, centerX, fragment.owner, + now, Math.min(1800, speed * .72), 240); + fragment.vx *= -.38; + fragment.vy = -Math.abs(fragment.vy) * .45; + fragment.hitAfter = now + 260000; + playDrum("clap", 1, panPlayer(target)); + emitSignal("part-hit", fragment.owner, target.pad, speed); + break; + } + } + // Dismembered anatomy remains a physical arena object. It can settle, + // be picked up again, thrown, and strike either fighter for the rest of + // the round rather than evaporating on a cosmetic timer. On a watcher it + // is only scenery, and scenery that never expires is a leak: the wire + // says which limbs are gone, not which pieces are still worth drawing. + if (combat) fragment.life = Math.max(fragment.life, 1); + else fragment.life -= dt; + } + for (let index = detachedParts.length - 1; index >= 0; index--) { + if (detachedParts[index].life > 0 || detachedParts[index].heldBy >= 0) continue; + detachedParts.splice(index, 1); + for (const player of players) { + if (player.heldPart === index) player.heldPart = -1; + else if (player.heldPart > index) player.heldPart--; + } + } +} + +// Comic Relief's packaged horizontal metrics, normalized from its 2048-unit +// em. Colored text is drawn glyph-by-glyph on every host, so using the font's +// real advances here keeps the web canvas and Xbox DirectWrite runs identical. +const comicAdvanceEm = { + a:.512, b:.593, c:.514, d:.587, e:.548, f:.508, g:.531, h:.578, + i:.28, j:.403, k:.54, l:.274, m:.777, n:.523, o:.526, p:.535, + q:.52, r:.48, s:.487, t:.471, u:.52, v:.486, w:.684, x:.59, + y:.521, z:.538, "0":.61, "1":.45, "2":.61, "3":.61, "4":.61, + "5":.61, "6":.61, "7":.61, "8":.61, "9":.61, "@":.931, + "!":.238, "?":.524, ".":.249, ",":.277, ":":.299, ";":.299, + "<":.381, ">":.381, "^":.581, " ":.299, "/":.512, "-":.417, + "+":.48, "∞":.837, +}; + +function comicGlyphAdvance(character, size) { + return size * (comicAdvanceEm[String(character).toLowerCase()] ?? .58); +} + +function handleWidth(handle, size) { + return [...handle].reduce((width, character) => + width + comicGlyphAdvance(character, size), 0); +} + +function typeWrite(text, x, y, size, ...color) { + const visibleText = String(text).toLowerCase(); + if (typeof comicWrite === "function") comicWrite(visibleText, x, y, size, ...color); + else if (typeof ywftWrite === "function") + ywftWrite(visibleText, x, y, size, ...color); + else systemWrite(visibleText, x, y, size, ...color); +} + +function contrastShadow(color) { + const luminance = color[0] * .2126 + color[1] * .7152 + color[2] * .0722; + return luminance > 142 ? [8, 12, 24] : [232, 238, 248]; +} + +// Per-glyph contrast flips a single mid-tone letter to the opposite shadow +// while its neighbors keep theirs, which reads as a mistake rather than as +// depth. A run of type picks its direction once, from the sky behind it, and +// each shadow keeps a trace of its own glyph's hue. +function runShadow(color) { + // Match disk.mjs corner labels: the shadow is always dark, with a trace of + // the foreground hue. Dark mode must never turn a dark glyph's shadow white. + return mixColor(color, visualTheme.light > .5 ? [30, 20, 50] : [6, 4, 16], + .78); +} + +// Handle colors are authored per name and can be shorter than the name they +// dress. Cycling keeps every glyph on the same palette instead of dropping +// the tail onto a different color source. +function glyphColor(colors, index, fallback) { + return colors?.length ? colors[index % colors.length] : fallback; +} + +function controlLocale() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + const keyboard = caps.inputFamily === "keyboard"; + const touch = caps.inputFamily === "touch"; + if (touch) return { + title: "start", select: "", replayPaused: "paused", + replayPlaying: "", replay: "", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM", + }; + return keyboard ? { + title: "start", + select: "P1 A/D + SPACE P2 LEFT/RIGHT + K H P2/DUMMY/BOT G BACK", + replayPaused: "PAUSED F PLAY A D SCRUB G EXIT", + replayPlaying: "F PAUSE A D SCRUB G EXIT", + replay: "Q REPLAY", + combat: "SPACE KICK ENTER PUNCH SHIFT SHIELD ALT USE ITEM W AIR", + } : { + title: "start", + select: "LEFT RIGHT SELECT A READY X P2 / DUMMY / BOT B BACK", + replayPaused: "PAUSED A PLAY LEFT RIGHT SCRUB B EXIT", + replayPlaying: "A PAUSE LEFT RIGHT SCRUB B EXIT", + replay: "Y REPLAY", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM UP AIR", + }; +} + +// Each entry is the cap to draw, what it does, and the button that lights it, +// so the legend can show a key rather than spell one. +function combatKeys() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.inputFamily === "keyboard") return [ + [["A", "D"], "MOVE", "ArrowLeft"], [["D", "D"], ">> DASH", "ArrowRight"], + ["SPACE", "KICK", "A"], ["ENTER", "PUNCH", "B"], + ["SHIFT", "SHIELD", "X"], ["ALT", "USE ITEM", "Y"], + ["W", "AIR", "ArrowUp"]]; + if (caps.inputFamily === "touch") return [ + ["A", "KICK", "A"], ["B", "PUNCH", "B"], + ["X", "SHIELD", "X"], ["Y", "USE ITEM", "Y"]]; + return [ + [["LEFT", "RIGHT"], "MOVE", "ArrowLeft"], + [["RIGHT", "RIGHT"], ">> DASH", "ArrowRight"], + ["A", "KICK", "A"], ["B", "PUNCH", "B"], ["X", "SHIELD", "X"], + ["Y", "USE ITEM", "Y"], ["STICK_UP", "AIR", "ArrowUp"]]; +} + +// What the buttons do, named on the way into a round. B changes meaning with +// what the hand is carrying, so the legend reads the fighter rather than +// reciting a fixed map. +function combatLegendKeys(player) { + const swing = itemMelee[heldItem(player)]; + return combatKeys().map(([cap, action, button]) => + [cap, swing && action === "PUNCH" ? swing : action, button]); +} + +function combatLegend(player) { + return combatLegendKeys(player) + .map(([cap, action]) => (cap === "STICK_UP" ? "STICK" : cap) + + " " + action).join(" "); +} + +function selectionControlKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + [["A", "D"], "SELECT", "ArrowLeft"], ["SPACE", "READY", "A"], + ["SHIFT", "OPPONENT", "X"], ["ENTER", "BACK", "B"]]; + return [[["LEFT", "RIGHT"], "SELECT", "ArrowLeft"], ["A", "READY", "A"], + ["X", "OPPONENT", "X"], ["B", "BACK", "B"]]; +} + +function replayControlKeys(paused) { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + ["F", paused ? "PLAY" : "PAUSE", "A"], + [["A", "D"], "SCRUB", "ArrowLeft"], ["G", "EXIT", "B"]]; + return [["A", paused ? "PLAY" : "PAUSE", "A"], + [["LEFT", "RIGHT"], "SCRUB", "ArrowLeft"], ["B", "EXIT", "B"]]; +} + +function replayOfferKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + return family === "keyboard" ? [["Q", "REPLAY", "Y"]] + : [["Y", "REPLAY", "Y"]]; +} + +// A key drawn as a key: a gray cap with a line around it, sunk and brightened +// while it is actually held. +// `fade` is how present the cap is: 1 draws it, 0 dissolves it into the stage +// behind. The legend always passes 1; only the command stream ages its caps +// out, and it needs the whole cap to go — face, edge and letter together. +// A controller button drawn as a controller button: the letter in its Xbox +// color on a dark disc with a colored rim; pressed inverts to a filled disc. +// Directions are the same disc with an arrow glyph in neutral ink. Keyboard +// input keeps its keycaps; every other family gets these. +const padButtonInk = { + A: [96, 200, 80], B: [235, 78, 78], X: [86, 148, 235], Y: [240, 198, 60], + // The M30's face wears its own colorway — green A, yellow B, blue C, all + // three top-row buttons gray — which is NOT the Xbox palette above, so the + // cluster keys its own inks rather than borrowing the Xbox letters'. + M30A: [96, 200, 80], M30B: [240, 198, 60], M30C: [86, 148, 235], + M30X: [168, 176, 190], M30Y: [168, 176, 190], M30Z: [168, 176, 190], + M30S: [235, 78, 78], +}; +const padGlyph = { UP: "↑", DOWN: "↓", LEFT: "←", RIGHT: "→" }; +const padButtonDiameter = (size) => Math.round(size * .78) * 2; +function drawPadButton(label, x, y, size, pressed, fade = 1, display = null) { + const radius = Math.round(size * .78); + if (fade <= .01) return radius * 2; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const ink = padButtonInk[label] || mixColor([148, 158, 178], [96, 104, 124], + visualTheme.light); + // Filled like the real thing: the color IS the button. Held brightens it + // and rims it white; the glyph stays dark and dead-center either way. + const face = pressed ? mixColor(ink, [255, 255, 255], .3) : ink; + const cx = x + radius; + const cy = y + Math.round(size * .75); + filledDisc(cx, cy, radius, veil(face)); + if (pressed) filledRing(cx, cy, radius, radius - 3, veil([245, 248, 255])); + const text = display ?? (padGlyph[label] || label).toUpperCase(); + const glyphSize = Math.round(size * .82); + if (label === "STICK_UP" || label === "DOWN" || + label === "LEFT" || label === "RIGHT") { + const arrowInk = veil([12, 14, 26]); + const thickness = Math.max(2, Math.round(radius * .11)); + const dx = label === "LEFT" ? -1 : label === "RIGHT" ? 1 : 0; + const dy = label === "STICK_UP" ? -1 : label === "DOWN" ? 1 : 0; + const tipX = cx + dx * radius * .42; + const tipY = cy + dy * radius * .42; + const tailX = cx - dx * radius * .4; + const tailY = cy - dy * radius * .4; + const perpendicularX = -dy * radius * .32; + const perpendicularY = dx * radius * .32; + const wingX = tipX - dx * radius * .34; + const wingY = tipY - dy * radius * .34; + filledCapsule(tailX, tailY, tipX, tipY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX + perpendicularX, + wingY + perpendicularY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX - perpendicularX, + wingY - perpendicularY, thickness, arrowInk); + return radius * 2; + } + const glyphX = Math.round(cx - handleWidth(text, glyphSize) / 2); + // DirectWrite's cap shapes carry more visual weight below their nominal + // midpoint. Lift the Xbox face letters together so A/B/X/Y read centered in + // the colored hardware circles rather than sitting on their lower halves. + const glyphY = Math.round(cy - glyphSize * (padButtonInk[label] ? .56 : .5)); + if (padButtonInk[label] || Object.hasOwn(padGlyph, label) || + /^[KPSI<>^v]$/.test(text)) + systemWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + else typeWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + return radius * 2; +} + +function drawKeycap(label, x, y, size, pressed, fade = 1) { + const padX = Math.round(size * .42); + const height = Math.round(size * 1.5); + const width = handleWidth(label, size) + padX * 2; + if (fade <= .01) return width; + const drop = pressed ? 2 : 0; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const face = veil(pressed + ? mixColor([96, 104, 126], [206, 214, 232], visualTheme.light) + : mixColor([44, 50, 66], [176, 184, 202], visualTheme.light)); + const edge = veil(pressed + ? mixColor([210, 220, 240], [40, 46, 62], visualTheme.light) + : mixColor([112, 122, 146], [96, 104, 124], visualTheme.light)); + if (!pressed) + hudBox(x + 2, y + 4, width, height, ...veil(mixColor([6, 8, 18], [92, 99, 112], + visualTheme.light * .7))); + hudBox(x, y + drop, width, height, ...face); + strokeBox(x, y + drop, width, height, 2, edge); + typeWrite(label, x + padX, y + drop + Math.round((height - size) / 2), size, + ...veil(pressed ? [12, 14, 26] : [238, 242, 252])); + return width; +} + +// `controllers()` walks the whole pad list and the legend asks every painted +// frame, so the name check breathes once a second instead. +let m30CheckAt = 0; +let m30Present = false; +function m30Seated() { + const now = runtime().monotonicUs; + if (now >= m30CheckAt) { + m30CheckAt = now + 1000000; + m30Present = typeof controllers === "function" && + (controllers() || []).some((pad) => /8bitdo\s+m30/i.test(pad?.name || "")); + } + return m30Present; +} + +// The M30 folds two extra moves into its Sega face: C and the top-edge R +// reach the game as the trigger pair, Z and the top-edge L as the shoulders — +// the pad's factory Xbox map wearing Sega names. Which trigger C sends was +// read off the live hardware, not the leaflet; flip this table if 8BitDo's +// firmware ever swaps the pair. +const m30FaceSends = { C: "RightTrigger", Z: "RightShoulder" }; +const m30SendLabel = { RightTrigger: "SHIELD", RightShoulder: "USE ITEM", + LeftTrigger: "KICK", LeftShoulder: "USE ITEM" }; + +// The M30's own manual page, drawn from the device itself: the white +// dogbone body with red L/R nubs over its shoulders, the dark cross on its +// round base, the red start pill, and the two button arcs climbing to the +// right — gray X/Y/Z small on top, green A / yellow B / blue C big below, +// the bottom row shifted toward the thumb. Proportions transcribed from +// 8BitDo's top-down of the M30 2.4G (white), the unit in @jeffrey's hand. +// Every drawn control lights with the live press, so the mapping is not a +// diagram of faith: plug in, press, and the page answers. +function drawM30Cluster(x, y, size, held, directionActive, ink) { + const small = Math.round(size * .58); + const d = padButtonDiameter(size); + const light = visualTheme.light; + const lobeR = Math.round(d * 1.62); + const bodyMidY = y + Math.round(d * .3) + lobeR; + const leftLobeX = x + lobeR; + const rightLobeX = x + Math.round(d * 7.5) - lobeR; + const plastic = mixColor([176, 182, 194], [246, 248, 251], light); + const print = mixColor([92, 98, 112], [118, 124, 138], light); + // Shoulder nubs first, so the body covers their roots. + const nub = mixColor([196, 44, 58], [206, 48, 62], light); + filledCapsule(leftLobeX - d, bodyMidY - lobeR, leftLobeX + Math.round(d * .2), + bodyMidY - lobeR, Math.round(d * .4), nub); + filledCapsule(rightLobeX - Math.round(d * .2), bodyMidY - lobeR, + rightLobeX + d, bodyMidY - lobeR, Math.round(d * .4), nub); + filledDisc(leftLobeX, bodyMidY, lobeR, plastic); + filledDisc(rightLobeX, bodyMidY, lobeR, plastic); + filledCapsule(leftLobeX, bodyMidY, rightLobeX, bodyMidY, + Math.round(lobeR * 1.7), plastic); + // The silkscreen wordmark rides the body's top center. + const markSize = Math.round(small * .9); + typeWrite("8BITDO M30", Math.round((leftLobeX + rightLobeX) / 2 - + handleWidth("8BITDO M30", markSize) / 2), + bodyMidY - lobeR + Math.round(d * .1), markSize, ...print); + // D-pad: the dark cross on its round base, each arm lighting alone. + const dpadBase = mixColor([44, 48, 60], [58, 62, 74], light); + filledDisc(leftLobeX, bodyMidY, Math.round(d * 1.02), dpadBase); + const crossInk = mixColor([24, 27, 36], [32, 35, 44], light); + const armLen = Math.round(d * .8); + const armWidth = Math.round(d * .5); + const arms = [["ArrowUp", 0, -1], ["ArrowDown", 0, 1], + ["ArrowLeft", -1, 0], ["ArrowRight", 1, 0]]; + for (const [button, dx, dy] of arms) + filledCapsule(leftLobeX, bodyMidY, leftLobeX + dx * armLen, + bodyMidY + dy * armLen, armWidth, directionActive(button) + ? mixColor(crossInk, [245, 248, 255], .5) : crossInk); + filledDisc(leftLobeX, bodyMidY, Math.max(2, Math.round(d * .14)), + mixColor([16, 18, 26], [22, 24, 32], light)); + // START — the red pill mid-body, its name silkscreened beneath, with the + // 2.4G's three tiny extras below. Pressed wears the discs' white rim. + const startPressed = held.includes("Menu"); + const midX = Math.round((leftLobeX + rightLobeX) / 2); + const pillHalf = Math.round(size * .5); + const pillY = bodyMidY - Math.round(d * .28); + if (startPressed) filledCapsule(midX - pillHalf, pillY, midX + pillHalf, + pillY, Math.round(size * .44) + 4, [245, 248, 255]); + filledCapsule(midX - pillHalf, pillY, midX + pillHalf, pillY, + Math.round(size * .44), startPressed + ? mixColor(padButtonInk.M30S, [255, 255, 255], .3) : padButtonInk.M30S); + const startLabelSize = Math.round(small * .8); + typeWrite("START", Math.round(midX - handleWidth("START", startLabelSize) / 2), + pillY + Math.round(size * .32), startLabelSize, ...print); + for (let dot = 0; dot < 3; dot++) + filledDisc(midX + (dot - 1) * Math.round(d * .42), + pillY + Math.round(d * .85), Math.max(2, Math.round(d * .09)), print); + // The face arcs climb to the right like the hardware; the top row runs + // smaller and the bottom row leans into the thumb. + const pitch = Math.round(d * 1.05); + const drop = Math.round(d * .3); + const smallFace = Math.round(size * .82); + const disc = (key, cap, cx, cy, buttonSize, pressed) => + drawPadButton(key, cx - Math.round(buttonSize * .78), + cy - Math.round(buttonSize * .75), buttonSize, pressed, 1, cap); + const face = [ + ["M30X", "X", 0, 0, smallFace, held.includes("X")], + ["M30Y", "Y", 1, 0, smallFace, held.includes("Y")], + ["M30Z", "Z", 2, 0, smallFace, held.includes(m30FaceSends.Z)], + ["M30A", "A", 0, 1, size, held.includes("A")], + ["M30B", "B", 1, 1, size, held.includes("B")], + ["M30C", "C", 2, 1, size, held.includes(m30FaceSends.C)], + ]; + for (const [key, cap, column, row, buttonSize, pressed] of face) + disc(key, cap, + rightLobeX + Math.round((column - 1) * pitch - d * .35) + + (row ? Math.round(d * .34) : 0), + bodyMidY - Math.round(d * .8) + (2 - column) * drop + + (row ? Math.round(d * .92) : 0), + buttonSize, pressed); + let rowY = bodyMidY + lobeR + Math.round(small * 1.2); + const captions = [ + `A KICK B PUNCH C ${m30SendLabel[m30FaceSends.C]}`, + `X SHIELD Y USE ITEM Z ${m30SendLabel[m30FaceSends.Z]}`, + `L ${m30SendLabel.LeftShoulder} R ${m30SendLabel.LeftTrigger}`, + "A+B GRAB START PAUSE", + ]; + for (const caption of captions) { + typeWrite(caption, x, rowY, small, ...ink); + rowY += Math.round(small * 1.55); + } + return rowY + Math.round(small * .6); +} + +// Lifted clear of the bottom edge, because the signed-in handle and its +// logout button now sit in that corner and the legend used to run straight +// through them on a narrow view. +function drawControlLegend(ink) { + const device = typeof capabilities === "function" ? capabilities() : {}; + if (device.showControlLegend === false || device.inputFamily === "touch") return; + const safe = hudSafeRect(); + const pad = localPad(); + const held = pad.down || []; + const directionActive = (button) => held.includes(button) || + (button === "ArrowLeft" && pad.leftX < -.12) || + (button === "ArrowRight" && pad.leftX > .12) || + (button === "ArrowUp" && pad.leftY > .12) || + (button === "ArrowDown" && pad.leftY < -.12); + const size = compactLayout() ? 18 : 24; + const x = safe.left + 8; + const both = held.includes("A") && held.includes("B"); + const legendFighter = players[localSeat()]; + const dash = legendFighter.lastButton === "DASH" && + runtime().monotonicUs - legendFighter.lastButtonAt < 700000; + const controls = [ + ["LEFT", "ArrowLeft", "MOVE"], + ["RIGHT", "ArrowRight", dash ? "DASH >>" : "MOVE"], + ["STICK_UP", "ArrowUp", "AIR"], + ["DOWN", "ArrowDown", "CROUCH"], + ["A", "A", both ? "GRAB" : "KICK"], + ["B", "B", both ? "GRAB" : itemMelee[heldItem(legendFighter)] || "PUNCH"], + ["X", "X", "SHIELD"], + ["Y", "Y", "USE ITEM"], + ]; + if (survivalActive()) controls.length = 4; + const keyboard = keycapFamily(); + // A seated M30 trades the whole legend column for the pad's own manual + // page — the drawn controller carries its d-pad, so no rows remain. + const m30 = device.showControllerDiagram !== false && + !keyboard && !survivalActive() && m30Seated(); + if (m30) controls.length = 0; + const keyboardCap = { LEFT: "A", RIGHT: "D", STICK_UP: "W", DOWN: "S", + A: "SPACE", B: "ENTER", X: "SHIFT", Y: "ALT" }; + const step = Math.round(size * 1.82); + for (const [row, [cap, button, action]] of controls.entries()) { + const y = safe.top + row * step; + const width = keyboard + ? drawKeycap(keyboardCap[cap] || cap, + x, y, size, + directionActive(button)) + : drawPadButton(cap, x, y, size, + button.startsWith("Arrow") ? directionActive(button) : held.includes(button)); + if (action) typeWrite(action, x + width + 10, + y + Math.round(size * .25), size, ...ink); + } + let legendBottom = safe.top + controls.length * step; + if (m30) legendBottom = drawM30Cluster(x, legendBottom, size, held, + directionActive, ink); + drawStickGate(x, legendBottom, size, pad, ink); +} + +// The legend named the stick's directions but never its ANGLE, so a fighter +// walking on a half-tilted stick looked identical to one at full lean, and +// the camera stick had no read-out at all. Only drawn while a stick is off +// center: an always-present gate would be one more permanently-lit widget in +// a corner that is already busy. +function drawStickGate(x, y, size, pad, ink) { + const gate = (label, dx, dy, column) => { + const radius = Math.round(size * .82); + const cx = x + radius + column * Math.round(radius * 2.6); + const cy = y + radius; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + // The gate ring is drawn as a disc under a smaller ground-colored disc: + // filledDisc is the only circle primitive the piece owns, and two of them + // cost less than an arc walked out of line segments. + filledDisc(cx, cy, radius, idle); + filledDisc(cx, cy, radius - 3, + mixColor([7, 8, 28], [230, 239, 247], visualTheme.light)); + // Screen y grows downward while the pad reports up as positive. + const knobX = cx + dx * (radius - 5); + const knobY = cy - dy * (radius - 5); + filledDisc(knobX, knobY, Math.max(3, Math.round(size * .26)), ink); + typeWrite(label, cx - radius, cy + radius + 2, + Math.round(size * .62), ...ink); + }; + const live = (dx, dy) => Math.abs(dx) > .12 || Math.abs(dy) > .12; + const leftX = Number(pad.leftX) || 0; + const leftY = Number(pad.leftY) || 0; + const rightX = Number(pad.rightX) || 0; + const rightY = Number(pad.rightY) || 0; + let column = 0; + if (live(leftX, leftY)) gate("move", leftX, leftY, column++); + if (live(rightX, rightY)) gate("cam", rightX, rightY, column++); +} + +const controlRailWidth = () => compactLayout() ? 138 : 188; + +// Touch is part of the game surface, not a DOM overlay. One drawn d-pad and +// four action discs share the exact centers used by mac-test's canvas hit zones. +function drawTouchControls() { + if (typeof capabilities !== "function" || + capabilities().inputFamily !== "touch" || capabilities().socialPreview) + return; + const held = localPad().down || []; + const spread = 64; + // The clusters stand clear of the home indicator and any notch ear; the + // shell's touchKeyAt mirrors this arithmetic, so a shift here must land + // there too or the drawing and the hit test come apart. + const cy = viewHeight - 140 - viewInset.bottom; + const dpadX = 130 + viewInset.left; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + const live = mixColor([110, 220, 150], [38, 128, 88], visualTheme.light); + const arm = 38; + const thick = 18; + const directions = [[0, -1, "ArrowUp"], [0, 1, "ArrowDown"], + [-1, 0, "ArrowLeft"], [1, 0, "ArrowRight"]]; + for (const [dx, dy, key] of directions) + filledCapsule(dpadX + dx * 8, cy + dy * 8, + dpadX + dx * arm, cy + dy * arm, thick, + held.includes(key) ? live : idle); + filledDisc(dpadX, cy, thick, held.some((key) => key.startsWith("Arrow")) + ? live : idle); + const actionX = viewWidth() - 130 - viewInset.right; + const commandGlyph = { A: "/", B: "*", X: ")", Y: "+" }; + for (const [dx, dy, key] of [[0, -1, "Y"], [0, 1, "A"], + [-1, 0, "X"], [1, 0, "B"]]) + drawPadButton(key, actionX + dx * spread - 27, + cy + dy * spread - 25, 35, held.includes(key), 1, commandGlyph[key]); +} + +function keycapRunWidth(entries, size) { + const keyboard = keycapFamily(); + const padX = Math.round(size * .42); + const capWidth = (label) => keyboard + ? handleWidth(label, size) + padX * 2 : padButtonDiameter(size); + return entries.reduce((total, [cap, action]) => + total + (Array.isArray(cap) ? cap : [cap]).reduce((width, label, index) => + width + capWidth(label) + (index ? 5 : 0), 0) + 8 + + handleWidth(action, size) + 26, 0) - 26; +} + +// Keyboard reads as keycaps; every other family reads as controller discs. +const keycapFamily = () => (typeof capabilities === "function" + ? String(capabilities().inputFamily || "") : "") === "keyboard"; + +function drawKeycapRun(entries, x, y, size, held, ink, revealAction = null) { + const keyboard = keycapFamily(); + let cursor = x; + for (const [cap, action, button] of entries) { + for (const [index, label] of (Array.isArray(cap) ? cap : [cap]).entries()) { + if (index) cursor += 5; + cursor += keyboard + ? drawKeycap(label, cursor, y, size, held.includes(button)) + : drawPadButton(label, cursor, y, size, held.includes(button)); + } + cursor += 8; + if (!revealAction || revealAction([cap, action, button])) + typeWrite(action, cursor, y + Math.round(size * .25), size, ...ink); + cursor += handleWidth(action, size) + 26; + } + return cursor; +} + +function drawCenteredKeycapRun(entries, y, size, held, ink) { + if (!entries.length) return; + drawKeycapRun(entries, viewCenterX() - keycapRunWidth(entries, size) / 2, + y, size, held, ink); +} + +function drawHandle(handle, x, y, size, colors, fallback) { + let cursor = x; + const characters = [...String(handle)]; + for (let index = 0; index < characters.length; index++) { + typeWrite(characters[index], cursor, y, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(characters[index], size); + } +} + +function drawFace(player, head, color, t, now = runtime().monotonicUs) { + if (head.radius < 5) return; + const bodyDepth = triangleDepth; + triangleDepth = bodyDepth - .012; + const r = head.radius; + const direction = player.facing || 1; + // The whole face turns with a rolling head. Every feature below is placed + // in flat face-space and spun around the head's center on the way to the + // canvas — eyes, mouth, hair, tears, hearts, all of it — instead of the old + // look where the head traveled and the face stayed nailed upright. + const roll = isHeadOnly(player) ? player.headRoll || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const spin = (x, y) => roll === 0 ? { x, y } : { + x: head.x + (x - head.x) * cosRoll - (y - head.y) * sinRoll, + y: head.y + (x - head.x) * sinRoll + (y - head.y) * cosRoll }; + const stroke = (x1, y1, x2, y2, width, ink = color) => { + const a = spin(x1, y1), b = spin(x2, y2); + filledCapsule(a.x, a.y, b.x, b.y, width, ink); + }; + const ring = (x, y, ringRadius, thickness, ink) => { + const point = spin(x, y); + filledRing(point.x, point.y, ringRadius, thickness, ink); + }; + const disc = (x, y, discRadius, ink) => { + const point = spin(x, y); + filledDisc(point.x, point.y, discRadius, ink); + }; + const glyph = (text, x, y, size, ...ink) => { + const point = spin(x, y); + systemWrite(text, point.x, point.y, size, ...ink); + }; + const celebrating = ["DANCE", "LAUGH", "POSE", "WIGGLE"] + .includes(player.resultReaction); + const grieving = ["CRY", "WOE", "SULK"].includes(player.resultReaction); + if (player.name === "@FIFI") { + const hair = visualTheme.light > .55 ? [105, 38, 116] : [245, 118, 230]; + const sway = Math.sin(t * 2.2 + player.pad) * r * .08; + const width = Math.max(2, r * .13); + stroke(head.x - r * .72, head.y - r * .48, + head.x - r * .32, head.y - r * .9, width, hair); + stroke(head.x - r * .32, head.y - r * .9, + head.x + r * .35, head.y - r * .88, width, hair); + stroke(head.x + r * .35, head.y - r * .88, + head.x + r * .76, head.y - r * .38, width, hair); + stroke(head.x - r * .76, head.y - r * .38, + head.x - r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x + r * .76, head.y - r * .38, + head.x + r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x - r * .48, head.y - r * .46, + head.x - r * .08, head.y - r * .18, width * .72, hair); + stroke(head.x - r * .08, head.y - r * .18, + head.x + r * .42, head.y - r * .5, width * .72, hair); + } + const eyeY = head.y - r * .18; + const eyeGap = r * .34; + const faceX = head.x + direction * r * .08; + const eyeWidth = Math.max(1.4, r * .1); + const lineWidth = Math.max(1.2, r * .1); + const blink = player.alive && !player.blocking && !player.attackKind && + Math.sin(t * .73 + player.pad * 2.1) > .985; + const spitAge = now - (player.spitAt || -Infinity); + const spitting = isHeadOnly(player) && spitAge >= 0 && spitAge < 190000; + const inertDummy = player.npc && !player.bot; + const victoryAmount = deathCinematic?.winnerPad === player.pad + ? clamp(deathCinematicAge(now) / 1.15, 0, 1) : 0; + if (!player.alive || player.hit > .6 || inertDummy) { + for (const offset of [-eyeGap, eyeGap]) { + stroke(faceX + offset - eyeWidth, eyeY - eyeWidth, + faceX + offset + eyeWidth, eyeY + eyeWidth, lineWidth); + stroke(faceX + offset + eyeWidth, eyeY - eyeWidth, + faceX + offset - eyeWidth, eyeY + eyeWidth, lineWidth); + } + } else if (spitting) { + // The release reads on the face before the glob clears it: both eyes + // squeeze inward for the same short beat as the pursed lips below. + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset - eyeWidth * 1.35, + eyeY + (offset < 0 ? -1 : 1) * r * .035, + faceX + offset + eyeWidth * 1.35, + eyeY + (offset < 0 ? 1 : -1) * r * .035, + lineWidth * 1.15); + } else if (blink) { + stroke(faceX - eyeGap - eyeWidth, eyeY, faceX - eyeGap + eyeWidth, + eyeY, lineWidth); + stroke(faceX + eyeGap - eyeWidth, eyeY, faceX + eyeGap + eyeWidth, + eyeY, lineWidth); + } else { + const pad = inputPads[player.pad] || {}; + const rawX = Number(pad.leftX) || 0; + const rawY = Number(pad.leftY) || 0; + const movementDeadzone = .48; + const gazeNoiseFloor = .015; + const digitalX = (pad.down || []).includes("ArrowRight") ? 1 + : (pad.down || []).includes("ArrowLeft") ? -1 : 0; + const digitalY = (pad.down || []).includes("ArrowUp") ? 1 + : (pad.down || []).includes("ArrowDown") ? -1 : 0; + const rawMagnitude = Math.hypot(rawX, rawY); + const gazeAmount = rawMagnitude <= gazeNoiseFloor ? 0 + : clamp((rawMagnitude - gazeNoiseFloor) / + (movementDeadzone - gazeNoiseFloor), 0, 1); + const defeated = victoryAmount > 0 + ? players[deathCinematic.loserPad] : null; + const lookX = defeated + ? Math.sign(defeated.x - player.x) || direction + : digitalX || lerp(direction * .2, rawX, gazeAmount); + const lookY = defeated + ? clamp((player.y - defeated.y) / 180, -1, 1) + : digitalY || lerp(0, rawY, gazeAmount); + const pupilX = clamp(lookX, -1, 1) * eyeWidth * 1.05; + const pupilY = clamp(-lookY, -1, 1) * eyeWidth * 1.05; + const socketRadius = eyeWidth * 2.35; + const pupilRadius = eyeWidth * .9; + const socketInk = [246, 248, 244]; + const pupilInk = [8, 12, 24]; + for (const offset of [-eyeGap, eyeGap]) { + disc(faceX + offset, eyeY, socketRadius, socketInk); + triangleDepth = bodyDepth - .02; + disc(faceX + offset + pupilX, eyeY + pupilY, + pupilRadius, pupilInk); + triangleDepth = bodyDepth - .012; + } + } + if (player.bot && player.alive && !player.blocking) { + const browY = eyeY - r * .32; + stroke(faceX - eyeGap - eyeWidth * 1.25, browY - r * .08, + faceX - eyeGap + eyeWidth * 1.25, browY + r * .1, + lineWidth * 1.15); + stroke(faceX + eyeGap - eyeWidth * 1.25, browY + r * .1, + faceX + eyeGap + eyeWidth * 1.25, browY - r * .08, + lineWidth * 1.15); + } + if (grieving) { + const tear = [112, 208, 255]; + const fall = (t * 34) % Math.max(3, r * .55); + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset, eyeY + eyeWidth * 1.5, + faceX + offset, eyeY + eyeWidth * 1.5 + r * .34 + fall, + Math.max(1.5, lineWidth * .72), tear); + } + const mouthY = head.y + r * .3; + if (spitting) { + const release = 1 - clamp(spitAge / 190000, 0, 1); + const lip = player.spitHeavy ? [226, 58, 126] : [232, 92, 132]; + // faceX already carries .08r of facing offset; another .12r makes this + // exactly the .20r face-space mouth used by spitMouthPose(). + ring(faceX + direction * r * .12, mouthY, + r * (.105 + release * .055), Math.max(.7, r * .055), lip); + } else if (player.resultReaction === "LAUGH") { + const age = Math.max(0, (now - player.resultReactionAt) / 1000000); + const open = .35 + Math.abs(Math.sin(age * 18)) * .65; + ring(faceX + direction * r * .08, mouthY, + r * (.12 + open * .1), r * .045, color); + for (let index = 0; index < 3; index++) { + const noteAge = (age * .72 + index * .27) % 1; + const note = index % 2 ? "♫" : "♪"; + glyph(note, + faceX + direction * r * (.34 + noteAge * 1.25) + index * direction * 3, + mouthY - r * (.25 + noteAge * 1.75), + Math.max(8, r * (.55 - noteAge * .16)), ...color); + } + } else if (celebrating || victoryAmount > 0) { + const grin = r * (.09 + victoryAmount * .2); + const width = r * (.23 + victoryAmount * .12); + stroke(faceX - width, mouthY - grin * .18, faceX, + mouthY + grin, lineWidth); + stroke(faceX, mouthY + grin, faceX + width, + mouthY - grin * .18, lineWidth); + // Hearts off a winner, on the laugh notes' trick: a few glyphs on + // staggered loops. A reel carries no HUD to announce the win, so the + // celebration has to be legible on the face itself. + if (victoryAmount > 0) { + const age = deathCinematicAge(now); + for (let index = 0; index < 3; index++) { + const rise = (age * .6 + index * .34) % 1; + const drift = Math.sin(age * 2.2 + index * 2.4) * r * .22; + glyph("♥", + faceX + drift + (index - 1) * r * .42, + mouthY - r * (.95 + rise * 2.1), + Math.max(7, r * (.46 - rise * .17) * victoryAmount), + 255, 96 + index * 22, 148); + } + } + } else if (player.attackKind && meleePulse(player, now) > 0) { + ring(faceX + direction * r * .12, mouthY, + Math.max(1.8, r * .13), Math.max(.4, r * .05), color); + } else if (player.blocking) { + stroke(faceX - r * .26, mouthY, faceX + r * .26, mouthY, lineWidth); + } else if (grieving || !player.alive || player.hit > .6) { + stroke(faceX - r * .24, mouthY + r * .08, faceX, + mouthY - r * .06, lineWidth); + stroke(faceX, mouthY - r * .06, faceX + r * .24, + mouthY + r * .08, lineWidth); + } else { + const smile = Math.sin(t * 2.4 + player.pad) * r * .035; + stroke(faceX - r * .23, mouthY - smile, faceX, + mouthY + r * .09, lineWidth); + stroke(faceX, mouthY + r * .09, faceX + r * .23, + mouthY - smile, lineWidth); + } + triangleDepth = bodyDepth; +} + +function drawInventory(player, now, geometry) { + // A bodyless head carries nothing visible. The sword rode a phantom + // forearm and read as a dark clock hand sweeping through the rolled face — + // steel that never turned with the head it was stuck to. The head keeps its + // items and can still fire; it just doesn't brandish them. + if (isHeadOnly(player)) return; + const scale = cameraScale(); + const gunColor = player.gunMode === "ROCKET LAUNCHER" ? [48, 61, 52] + : player.gunMode === "RUBBER SMG" ? [38, 53, 72] + : player.gunMode === "SPACE LASER" ? [58, 92, 122] : [63, 43, 76]; + const grenadeColor = [255, 105, 105]; + const firing = player.itemAction === "FIRE" && now < player.itemActionUntil; + const throwing = player.itemAction === "THROW" && now < player.itemActionUntil; + // A bash keeps the grenade visible in the fist; itemHandTarget already + // parks both weapons on the swinging hand. + const bashing = player.attackKind === "BASH" && itemSwinging(player, now); + if (player.swordHeld && player.gunAmmo <= 0 && !throwing && + hasPart(player, itemHand(player))) { + // The hilt pins to the hand the silhouette actually draws — the far end + // of the item arm's forearm capsule — and the blade lies along that + // forearm, so grip and angle ride the limb through idle sway, stride, + // whips, freezes, and replays. The gun's aim pose floated here: with no + // ammo the arm never presents, leaving steel mid-air at a fixed angle. + const limbs = geometry.segments; + const forearm = limbs.find((segment) => segment.role === "item-forearm" || + segment.role === "attack-forearm") || + limbs.find((segment) => segment.role?.endsWith("forearm") && + segment.part === itemHand(player)) || + limbs.find((segment) => segment.role?.endsWith("forearm")); + if (forearm) { + const hand = { x: forearm.x2, y: forearm.y2 }; + const alongX = hand.x - forearm.x1; + // A hanging arm would drive the tip into the dirt, so the fist rolls + // the blade skyward at rest; swings still lay steel along the striking + // forearm because melee targets sit at shoulder height. + const alongY = -Math.abs(hand.y - forearm.y1); + const length = Math.hypot(alongX, alongY) || 1; + const tipX = hand.x + alongX / length * 118 * scale; + const tipY = hand.y + alongY / length * 118 * scale; + const acrossX = -alongY / length; + const acrossY = alongX / length; + // Steel became light. Three passes down the same line — a wide halo in + // the fighter's OWN color, then a narrower saturated sheath, then a + // white core — because a blade drawn in one flat tone reads as a stick, + // and because in a versus round the two blades then say which fighter + // is which from across the map, the way the handle colors already do. + // The hum lives in the halo's width: it breathes on the same clock the + // pickups bob on, so a held saber is never a still object. + const hum = 1 + .12 * Math.sin(now / 82000); + const halo = mixColor(player.color, [14, 20, 36], .35); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(4, 13 * scale * hum), halo); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(3, 8 * scale), player.color); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(1.5, 3.5 * scale), [244, 252, 255]); + // The hilt stays machined and dark: it is the one part of a saber that + // is an object, and it is what keeps the blade from reading as a beam + // fired out of a bare fist. + filledCapsule(hand.x + acrossX * 11 * scale, hand.y + acrossY * 11 * scale, + hand.x - acrossX * 11 * scale, hand.y - acrossY * 11 * scale, + Math.max(2, 5 * scale), [148, 156, 172]); + filledCapsule(hand.x, hand.y, + hand.x - alongX / length * 18 * scale, + hand.y - alongY / length * 18 * scale, + Math.max(2, 6 * scale), [34, 30, 40]); + } + } + if ((player.gunAmmo > 0 || firing) && !throwing) { + const forearm = itemForearm(player, geometry); + if (!forearm) return; + const pose = gunPose(player, now); + const projectedHand = projectPoint(pose.hand.x, pose.hand.y, pose.hand.z); + // Render reactions and replay poses may move the drawn skeleton after + // projection. Its actual wrist remains the final attachment point. + const hand = {x:forearm.x2, y:forearm.y2}; + const offsetX = hand.x - projectedHand.x, offsetY = hand.y - projectedHand.y; + const projectWeapon = (x, y, z) => { + const point = projectPoint(x, y, z); + return {x:point.x + offsetX, y:point.y + offsetY}; + }; + const barrel = projectWeapon(pose.muzzle.x, pose.muzzle.y, pose.muzzle.z); + const barrelWidth = Math.max(3, 9 * scale); + const gripWidth = Math.max(2, 6 * scale); + // Xbox batches its native line layer underneath GPU fighter triangles. + // Held items therefore use the same depth-aware capsule path as the hand. + filledCapsule(hand.x, hand.y, barrel.x, barrel.y, + barrelWidth, gunColor); + const gripX = hand.x - player.facing * 8 * scale; + const gripY = hand.y + 20 * scale; + filledCapsule(hand.x, hand.y, gripX, gripY, gripWidth, gunColor); + if (player.gunMode === "RUBBER SMG") { + // One uninterrupted dark silhouette: longer receiver, rear stock, and a + // forward magazine distinguish it from the short pistol in-hand. + const stockX = hand.x - pose.dx * 32 * scale; + const stockY = hand.y - pose.dy * 32 * scale; + filledCapsule(hand.x, hand.y, stockX, stockY, + barrelWidth * 1.12, gunColor); + const magazineX = hand.x + pose.dx * 18 * scale - pose.dy * 17 * scale; + const magazineY = hand.y + pose.dy * 18 * scale + pose.dx * 17 * scale; + filledCapsule(hand.x + pose.dx * 18 * scale, + hand.y + pose.dy * 18 * scale, magazineX, magazineY, + gripWidth, gunColor); + } + if (player.gunMode === "ROCKET LAUNCHER") { + const rearX = hand.x - pose.dx * 38 * scale; + const rearY = hand.y - pose.dy * 38 * scale; + filledCapsule(rearX, rearY, barrel.x, barrel.y, + barrelWidth * 1.8, gunColor); + filledDisc(barrel.x, barrel.y, barrelWidth * 1.45, [104, 62, 48]); + } + if (firing) { + const normalX = -pose.dy; + const normalY = pose.dx; + const flashA = projectWeapon( + pose.muzzle.x + pose.dx * 28 + normalX * 18, + pose.muzzle.y + pose.dy * 28 + normalY * 18, pose.muzzle.z); + const flashB = projectWeapon( + pose.muzzle.x + pose.dx * 28 - normalX * 18, + pose.muzzle.y + pose.dy * 28 - normalY * 18, pose.muzzle.z); + filledCapsule(barrel.x, barrel.y, flashA.x, flashA.y, + Math.max(2, 5 * scale), [255, 248, 190]); + filledCapsule(barrel.x, barrel.y, flashB.x, flashB.y, + Math.max(2, 5 * scale), [255, 248, 190]); + } + } + if (throwing || bashing) { + const target = itemHandTarget(player, now); + const hand = projectPoint(target.x, target.y, target.z); + hudCircle(hand.x, hand.y, Math.max(5, 15 * scale), + Math.max(2, 5 * scale), grenadeColor); + } +} + +function drawDigitalHeadBurst(player, headWorld, age) { + const burstAge = Math.max(0, age - .11); + const origin = projectPoint(headWorld.x, headWorld.y, headWorld.z); + if (![origin.x, origin.y, origin.z].every(Number.isFinite) || + Math.abs(origin.x) > 30000 || Math.abs(origin.y) > 30000) return; + const palette = [ + [255, 48, 96], [176, 18, 54], [255, 92, 126], + player.color, [116, 8, 38], + ]; + const directions = [-2.92, -2.61, -2.3, -2.01, -1.72, -1.43, + -1.14, -.83, -.52, -.21, .1, .41, .72, 1.03]; + for (let index = 0; index < directions.length; index++) { + const angle = directions[index] + (player.pad ? .14 : -.14); + const speed = 48 + index * 4; + const fall = 10 * burstAge + 72 * burstAge * burstAge; + for (let speck = 0; speck < 3; speck++) { + const spread = .38 + speck * .29; + const distance = (5 + speed * burstAge) * spread; + const depth = (index % 3 - 1) * (3 + burstAge * 9) * spread; + const point = projectPoint( + headWorld.x + Math.cos(angle) * distance, + headWorld.y + Math.sin(angle) * distance + fall * spread, + headWorld.z + depth); + if (![point.x, point.y, point.z].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + triangleDepth = point.z; + const pixel = clamp((2.6 - speck * .48) * cameraScale(), 1.5, 4); + screenRect(point.x - pixel / 2, point.y - pixel / 2, + pixel, pixel, palette[(index + speck) % palette.length]); + } + } + // The face becomes a small broken core rather than remaining an intact disc. + const core = Math.max(2, headWorld.radius * cameraScale() * + Math.max(.08, 1 - burstAge * 6.2)); + triangleDepth = origin.z; + for (let index = 0; index < 4; index++) { + const side = index % 2 ? 1 : -1; + const row = index < 2 ? -1 : 1; + const size = core * (.62 + index * .05); + screenRect(origin.x + side * core * .32 - size / 2, + origin.y + row * core * .3 - size / 2, size, size, + palette[index % palette.length]); + } +} + +function drawBrokenRunner(player, age) { + const world = player.frozenGeometry || + runnerWorldGeometry(player, (runtime().monotonicUs - startedAt) / 1000000); + const slow = Math.max(0, age - .11) * .32; + const gravity = 420 * slow * slow; + const outline = [8, 12, 24]; + for (let index = 0; index < world.segments.length; index++) { + const segment = world.segments[index]; + const midX = (segment.x1 + segment.x2) / 2; + const midY = (segment.y1 + segment.y2) / 2; + const side = index % 2 ? 1 : -1; + const dx = (side * (72 + index * 9) - player.facing * 34) * slow; + const dy = -(150 + index * 13) * slow + gravity; + const dz = side * (24 + index * 4) * slow; + const angle = side * slow * (1.15 + index * .08); + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + const move = (x, y, z) => { + const localX = x - midX; + const localY = y - midY; + return { x: midX + localX * cosine - localY * sine + dx, + y: midY + localX * sine + localY * cosine + dy, + z: z + dz }; + }; + const first = move(segment.x1, segment.y1, segment.z1); + const second = move(segment.x2, segment.y2, segment.z2); + const a = projectPoint(first.x, first.y, first.z); + const b = projectPoint(second.x, second.y, second.z); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite) || + [a.x, a.y, b.x, b.y].some((value) => Math.abs(value) > 30000)) + continue; + triangleDepth = projectPoint(midX + dx, midY + dy, + (segment.z1 + segment.z2) / 2 + dz).z; + const width = Math.max(2, segment.width * cameraScale()); + filledCapsule(a.x, a.y, b.x, b.y, width + 3, outline); + filledCapsule(a.x, a.y, b.x, b.y, width, player.color); + } + drawDigitalHeadBurst(player, world.head, age); +} + +function deathCinematicAge(now = runtime().monotonicUs) { + return deathCinematic ? Math.max(0, (now - deathCinematic.startedAt) / 1000000) : -1; +} + +function drawDeathFlash() { + const age = deathCinematicAge(); + if (age < 0 || age >= .11) return; + const previousDepth = triangleDepth; + triangleDepth = -1.425; + const flash = age < .055 ? [255, 255, 255] : [255, 226, 116]; + screenRect(0, 0, viewWidth(), viewHeight, flash); + triangleDepth = previousDepth; +} + +function drawRunner(player, t, showLabel = true) { + // A fighter who is down is still on the stage: they read as the broken body + // rather than as nothing. There is no state in which a fighter is skipped. + const headBurstAge = player.headBustedAt + ? Math.max(0, (runtime().monotonicUs - player.headBustedAt) / 1000000) : -1; + if (!player.alive && headBurstAge >= .11) { + drawBrokenRunner(player, headBurstAge); + if (["CRY", "WOE", "SULK"].includes(player.resultReaction)) { + const head = player.frozenGeometry?.head; + if (head) { + // In screen proportion to the head, not in pixels: the celebration + // camera can fill the frame with this face, and fixed-size tears on a + // huge head read as dust. Ratios match the old look at the old + // distance (a ~22px head wore 7/34/3px tears). + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const r = Math.max(4, Math.hypot(edge.x - point.x, edge.y - point.y)); + const sway = Math.sin(t * 11) * r * .22; + for (const side of [-1, 1]) + filledCapsule(point.x + side * r * .32 + sway, point.y, + point.x + side * r * .32 - sway, + point.y + r * 1.5 + (t * 31) % (r * .8), + Math.max(1.5, r * .14), [112, 208, 255]); + } + } + return; + } + if (player.fallenBodyGeometry) { + const fallen = projectRunnerWorldGeometry(player.fallenBodyGeometry); + drawSkeletonSegments(fallen.segments, player.color, [8, 12, 24], null); + } + const geometry = player.replayGeometry + ? projectRunnerWorldGeometry(player.replayGeometry) + : player.frozenGeometry + ? projectRunnerWorldGeometry(player.frozenGeometry) + : runnerGeometry(player, t); + if (roundResult && player.resultReaction) { + const age = (runtime().monotonicUs - player.resultReactionAt) / 1000000; + const amount = player.resultReaction === "POSE" || + player.resultReaction === "SULK" ? 3 : 8; + const dx = Math.sin(age * (player.resultReaction === "DANCE" ? 15 : 9)) * amount; + const dy = player.resultReaction === "DANCE" + ? -Math.abs(Math.sin(age * 9)) * 15 + : Math.sin(age * 12) * amount * .35; + geometry.head.x += dx; + geometry.head.y += dy; + for (const segment of geometry.segments) { + segment.x1 += dx; segment.x2 += dx; + segment.y1 += dy; segment.y2 += dy; + } + } + // Preserve the fighter's identity color during hit flash. A pure white body + // disappeared against the daylight arena, so impact now changes only its rim. + const color = player.color; + const outline = player.hit > 0 + ? mixColor([255, 232, 92], [28, 34, 52], visualTheme.light) + : [8, 12, 24]; + const displayNow = player.frozenAt || runtime().monotonicUs; + if (player.skateboard) drawSkateboard(player); + drawFighterSilhouette(geometry, color, outline, player); + const hitNow = runtime().monotonicUs; + if (player.hitSegment >= 0 && hitNow < player.hitSegmentUntil && + Math.floor(hitNow / 45000) % 2 === 0) { + const segment = geometry.segments[player.hitSegment]; + if (segment) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + Math.max(3, 5 * cameraScale()), [255, 238, 102]); + } + } + // Every fighter wears its face everywhere now, the title included. The + // still tableau used to sit faceless — a sparring-partner special case + // grown from the old dummy door — but the wordmark screen is the + // storefront, and whoever sits under it should look back. + drawFace(player, geometry.head, contrastShadow(color), t, displayNow); + drawInventory(player, displayNow, geometry); + if (player.blocking) { + const worldShield = shieldGeometry(player); + const shield = projectPoint(worldShield.x, worldShield.y, worldShield.z); + const radius = Math.max(18, worldShield.radius * cameraScale()); + const shieldColor = player.blockFlash > 0 ? [255, 255, 255] : player.color; + const outerWidth = Math.max(4, 11 * cameraScale()); + filledRing(shield.x, shield.y, radius, + Math.max(0, radius - outerWidth), shieldColor); + } + +} + +function drawDiveMotion(player, t) { + if (player.grounded || (!player.pounding && !player.pogoDive)) return; + const level = player.pounding ? Math.max(1, player.poundLevel || 1) : 1; + const speed = clamp(Math.abs(player.vy) / poundMaxVelocity, .25, 1.8); + const color = mixColor(player.color, + level === 3 ? [255, 80, 92] : level === 2 ? [255, 190, 62] : [255, 245, 196], + .46 + level * .12); + const count = 3 + level * 3; + for (let index = 0; index < count; index++) { + const spread = (index - (count - 1) / 2) * 24; + const wobble = Math.sin(t * 13 + index * 2.1) * 9; + const x = player.x + spread + wobble; + const startY = player.y - 125 - index % 2 * 36; + const endY = startY - (95 + index * 17) * speed; + worldCapsule(x, startY, player.z + 18, x, endY, player.z + 18, + 3 + speed * 3 + level, color, .028); + } +} + +function drawDoubleJumpMotion(player, t) { + const now = runtime().monotonicUs; + if (now >= (player.doubleJumpLinesUntil || 0)) return; + const life = clamp((player.doubleJumpLinesUntil - now) / 280000, 0, 1); + const color = mixColor(player.color, [244, 250, 255], .55); + for (let index = 0; index < 7; index++) { + const spread = (index - 3) * 24 + Math.sin(t * 18 + index) * 5; + const startY = player.y + 28 + (index % 2) * 18; + const endY = startY + (70 + index * 11) * life; + worldCapsule(player.x + spread, startY, player.z + 16, + player.x + spread, endY, player.z + 16, + 3 + life * 3, color, .029); + } +} + +// Hitboxes are an inspector, not a garnish. They used to flash on every +// impact for anyone watching, which put green boxes over ordinary play and +// over every recording of it. VIEW (tab) is now the only thing that shows +// them — `impactHitboxesUntil` still times the flash, but only for someone +// who has already asked to see the geometry. +// A capsule needs two half-caps, not two overlapping full discs. +const debugArcs = [3, 4, 6, 8, 10].map((steps) => + Array.from({ length: steps + 1 }, (_, i) => [ + Math.cos(Math.PI / 2 + i * Math.PI / steps), + Math.sin(Math.PI / 2 + i * Math.PI / steps), + ])); +function debugCapsule(x1, y1, x2, y2, width, color) { + if (nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy); + const c = length ? dx / length : 1, sn = length ? dy / length : 0; + const radius = width / 2; + const nx = -sn * radius, ny = c * radius; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + const arc = debugArcs[radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 : radius < 52 ? 3 : 4]; + for (let end = 0; end < 2; end++) { + const x = end ? x2 : x1, y = end ? y2 : y1; + const scale = end ? -radius : radius; + for (let i = 1; i < arc.length; i++) { + const a = arc[i - 1], next = arc[i]; + screenTriangle(x, y, x + (a[0] * c - a[1] * sn) * scale, + y + (a[0] * sn + a[1] * c) * scale, + x + (next[0] * c - next[1] * sn) * scale, + y + (next[0] * sn + next[1] * c) * scale, r, g, b); + } + } +} + +function drawDebugHitboxes(player, t) { + if (renderFlags.hud === false || !debugHitboxes || !player.alive) return; + const now = player.frozenAt || runtime().simMonotonicUs || runtime().monotonicUs; + const boxes = sampleCombatBoxes(player, now, null, false); + const hurtColor = [82, 226, 116]; + const pushColor = [255, 158, 54]; + const attackColor = [255, 58, 64]; + const guardColor = [186, 118, 255]; + const draw = (b, color, width = 2) => { + const z = (b.near+b.far)/2; + const points = [[b.left,b.top],[b.right,b.top],[b.right,b.bottom],[b.left,b.bottom]] + .map(([x,y])=>projectPoint(x,y,z)); + for (let i=0;i<4;i++) { + const a=points[i], next=points[(i+1)%4]; + debugCapsule(a.x,a.y,next.x,next.y,width,color); + } + }; + for (const b of boxes.hurt) draw(b,hurtColor); + draw(boxes.push,pushColor); + for (const b of boxes.guard) draw(b,guardColor,3); + for (const b of boxes.hit) draw(b,attackColor,4); +} + +// The frame meter. One pip per simulation frame, oldest on the left, the +// frame happening now at the right edge -- so an exchange reads left to +// right the way it happened, and the thing you just did is under your eye +// rather than across the screen. +// +// Two rows, one per fighter, stacked so the frames line up vertically: that +// column alignment IS the instrument. Reading "my recovery sits under their +// active" off two rows is the whole reason a frame meter exists, and it is +// why this is a stacked pair rather than one row per player somewhere +// convenient. +function drawFrameMeter() { + if (!debugHitboxes || renderFlags.hud === false) return; + if (!frameMeters.some((meter) => meter.length)) return; + const safe = hudSafeRect(); + const pip = Math.max(2, Math.min(7, Math.floor( + (safe.right - safe.left) * .55 / frameMeterLength) - 1)); + // Subpixel gaps on the AC framebuffer add calls without readable detail. + const gap = pip > 3 && !nativeHudOverlay ? 1 : 0; + // Tall enough to read a color at a glance. The pips are the resolution; + // the row height is only whether you can see them, and a meter you have to + // lean toward is a meter nobody reads mid-fight. + const rowHeight = Math.max(11, pip * 2); + const width = frameMeterLength * (pip + gap); + // Centred, and lifted clear of the bottom furniture -- the session name, + // the bug and the opponent label all live along that edge, and the first + // placement laid the meter straight across them. + const left = Math.round((safe.left + safe.right - width) / 2); + const top = safe.bottom - rowHeight * 2 - 58; + for (const player of players) { + const meter = frameMeters[player.pad]; + const y = top + player.pad * (rowHeight + 3); + // The empty track, so a meter that has not filled yet reads as a meter + // rather than as nothing having happened. + hudBox(left, y, width, rowHeight, 16, 19, 30); + // Adjacent equal pips without a gap are one rectangle. Keep gaps + // on larger displays and preserve the exact frame/color boundaries. + for (let index = 0; index < meter.length;) { + const key = meter[index]; + let end = index + 1; + if (!gap) while (end < meter.length && meter[end] === key) end++; + const state = frameMeterStates[key] || frameMeterStates.neutral; + const x = left + width - (meter.length - index) * (pip + gap); + hudBox(x, y, pip * (end - index), rowHeight, ...state.ink); + index = end; + } + // Whose row this is, in their own color, at the left end where it cannot + // sit on top of the frames anybody is actually reading. + typeWrite("P" + (player.pad + 1), left - 30, y, 15, ...player.color); + } + // The legend, once, above the pair -- and only the states the last two + // seconds actually contained, because a legend listing colors that are not + // on screen is a thing to decode rather than a thing to read. + const seen = new Set(); + for (const meter of frameMeters) for (const state of meter) + if (frameMeterStates[state]?.label) seen.add(state); + let x = left; + for (const state of seen) { + const entry = frameMeterStates[state]; + hudBox(x, top - 17, 9, 9, ...entry.ink); + typeWrite(entry.label, x + 13, top - 19, 13, 168, 178, 200); + x += 20 + entry.label.length * 8; + } +} + +function drawPlayerHud(player, x, pad) { + const color = visualTheme.light > .55 + ? player.pad === 0 ? [155, 34, 108] : [105, 78, 0] + : player.color; + let label = "P" + (player.pad + 1) + " " + player.roundWins + "/" + + matchWins + " PTS " + player.score; + typeWrite(label, x, 14, 22, ...color); +} + +function visibleHandle(player) { + return player.name.toLowerCase(); +} + +function nationFlag(country) { + const code = String(country || "").toUpperCase(); + if (!/^[A-Z]{2}$/.test(code)) return ""; + return [...code].map((letter) => String.fromCodePoint( + 0x1f1e6 + letter.charCodeAt(0) - 65)).join(""); +} + +const reelProgressInset = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelFullUi === true + ? compactLayout() ? 42 : 50 : 0; + +function playerHandleLayout(player, side) { + const safe = hudSafeRect(); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 24 : hudTypeSize; + const width = handleWidth(visibleHandle(player), size); + // One name per corner: the left fighter reads from the left edge, the + // right fighter from the right. The command phrase mirrors to the inside, + // so neither name has to give up its corner to make room for it. + const x = freeForAll() ? (side === 0 ? safe.left + 8 + : side === 1 ? (safe.left + safe.right - width) / 2 : safe.right - 8 - width) + : side === 0 ? safe.left + 8 : safe.right - 8 - width; + const y = safe.bottom - size - (touch ? 250 : 18) - reelProgressInset(); + return { x, y, size, width }; +} + +function drawFloatingHandle(player, x, y, size) { + const handle = visibleHandle(player); + const shadows = player.handleColors?.map(runShadow); + drawHandle(handle, x + 3, y + 4, size, shadows, runShadow(player.color)); + drawHandle(handle, x, y, size, player.handleColors, player.color); +} + +function drawPlayerHandle(player, t, side) { + const { x, y, size } = playerHandleLayout(player, side); + const handle = visibleHandle(player); + const drawGlyphs = (dx, dy, colors, fallback) => { + let cursor = x + dx; + for (let index = 0; index < handle.length; index++) { + const character = handle[index]; + typeWrite(character, cursor, y + dy, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + drawGlyphs(3, 4, player.handleColors?.map(runShadow), runShadow(player.color)); + drawGlyphs(0, 0, player.handleColors, player.color); + const flag = nationFlag(player.nation); + if (flag) { + const flagSize = Math.round(size * .92); + const flagX = side === 0 ? x : x + Math.max(0, handleWidth(handle, size)); + systemWrite(flag, flagX, y - flagSize * 1.05, flagSize, 255, 255, 255); + } +} + +// One name at reel scale: the fighter's own per-glyph palette, every letter on +// its own phase, shadow pass under color pass. Shared by the opening matchup +// and the winner's card, so the only two frames of a reel that carry type +// carry it identically. Advance is keyed to the flat size, so the swell never +// walks the letters apart. +function drawReelName(text, y, size, player, t) { + const total = handleWidth(text, size); + const pass = (dx, dy, colors, fallback) => { + let cursor = viewCenterX() - total / 2 + dx; + for (let index = 0; index < text.length; index++) { + const character = text[index]; + const swell = size * (1 + .07 * Math.sin(t * 6 + index * .9)); + const bob = Math.sin(t * 5.2 + index * .8) * size * .09; + typeWrite(character, cursor - (swell - size) * .5, + y + dy + bob - (swell - size) * .5, swell, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + const plain = player?.color || [245, 248, 255]; + pass(4, 5, player?.handleColors?.map(runShadow), runShadow(plain)); + pass(0, 0, player?.handleColors, plain); +} + +function playerStatLines(player) { + const pad = inputPads[player.pad] || + { connected: false, down: [], leftX: 0, leftY: 0 }; + const input = quantizedInput(pad, player.suppressedDirections); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const slot = (value, width) => String(value).padStart(width, " "); + if (player.npc && !player.bot) { + const parts = player.spiderDummy + ? [...spiderLegParts, "torso"] : [...limbParts, "torso"]; + const remaining = parts.filter((part) => hasPart(player, part)).length; + const damage = parts.reduce((total, part) => + total + Number(player.partDamage?.[part] || 0), 0); + return [ + "p" + (player.pad + 1) + " :: " + + (player.spiderDummy ? "spider dummy" : "training dummy"), + "target::inert parts[" + slot(remaining, 2) + "/" + + slot(parts.length, 2) + "] dmg[" + slot(damage, 2) + "]", + "anim::" + animation.state.padEnd(7, " ") + " step[" + + slot(animation.step, 2) + "/" + slot(animation.steps, 2) + "] t[" + + slot(animation.tick, 7) + "]", + ]; + } + return [ + "p" + (player.pad + 1) + " :: " + player.stance + + (player.attackKind ? " + " + player.attackKind : ""), + "in[" + slot(input.horizontal, 2) + "," + slot(input.vertical, 2) + + "] -> stk[" + slot(pad.leftX.toFixed(2), 5) + "] vx[" + + slot(Math.round(player.vx), 5) + "]", + "anim::" + animation.state.padEnd(7, " ") + " step[" + + slot(animation.step, 2) + "/" + slot(animation.steps, 2) + "] t[" + + slot(animation.tick, 7) + "]", + ]; +} + +const playerStatSize = () => compactLayout() ? 16 : 22; +const playerStatPanelHeight = () => { + const size = playerStatSize(); + return 16 + 3 * (size + 7) + 10; +}; + +const debugReadoutMetaSize = () => compactLayout() ? 19 : 24; +const debugReadoutTimingSize = () => + Math.max(17, Math.round(debugReadoutMetaSize() * .76)); +// The band the measured-performance read-out owns, just above the nameplate. +// Everything that stacks over a handle reserves it rather than sharing it: the +// console has always printed a second timing row there and it landed exactly on +// the state card's `anim::` line, and the browser started printing one the day +// it began timing its own frames. Both rows are reserved whether or not the +// host fills the second — the card above must not breathe when a measurement +// finally arrives, the same fixed-chassis rule the card itself follows. +const debugReadoutHeight = () => debugHitboxes + ? debugReadoutMetaSize() + 6 + debugReadoutTimingSize() + 5 : 0; + +// The state trace owns a fixed stack over each handle without a container. +const statStackHeight = () => debugHitboxes + ? debugReadoutHeight() + playerStatPanelHeight() + 8 : 0; + +function drawPlayerStats(player, side, t) { + if (!debugHitboxes) return; + const lines = playerStatLines(player); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const size = playerStatSize(); + const padding = 8; + const lineHeight = size + 7; + const safe = hudSafeRect(); + // A diagnostic instrument has fixed columns: changing signs and tick counts + // must not make its chassis breathe every frame. + // The tick and velocity columns are the longest legal row, so the chassis + // reserves their full Xbox-width footprint instead of clipping their tail. + const width = compactLayout() ? 360 : 520; + const height = playerStatPanelHeight(); + const handle = playerHandleLayout(player, side); + const x = side === 0 ? safe.left : safe.right - width; + const y = handle.y - debugReadoutHeight() - height - 12; + const previousDepth = triangleDepth; + triangleDepth = -1.445; + for (let row = 0; row < lines.length; row++) { + const rowY = y + padding + row * lineHeight; + writeHudLine(lines[row], x + padding, rowY, size); + } + triangleDepth = previousDepth; +} + +function drawHudInventory(player, side) { + const items = []; + if (player.gunAmmo > 0) items.push("gun " + player.gunAmmo); + if (player.grenadeAmmo > 0) items.push("grenade " + player.grenadeAmmo); + if (!items.length) return; + const text = items.join(" "); + const handle = playerHandleLayout(player, side); + const size = Math.round(hudTypeSize * .62); + const width = handleWidth(text, size); + const x = side === 0 ? handle.x : handle.x + handle.width - width; + // Commands own the rows immediately above the fighter's name. Inventory + // starts above whichever of those rows are still visible, so neither can + // drift over the other as the command history dissolves. + const y = handle.y - statStackHeight() - commandStreamStackHeight(player) - + size - 7; + const shadow = contrastShadow(player.color); + typeWrite(text, x + 2, y + 3, size, ...shadow); + typeWrite(text, x, y, size, ...player.color); +} + +function spatialHudPlayers() { + if (freeForAll()) return players.slice().sort((a, b) => a.x - b.x); + const left = players[hudLeftPad] || players[0]; + const other = players[left.pad === 0 ? 1 : 0]; + // Preserve the lane through the instant of overlap, then swap once the + // crossing is visually unambiguous. This prevents one-frame HUD chatter. + if (other.x < left.x - 36) hudLeftPad = other.pad; + return [players[hudLeftPad], players[hudLeftPad === 0 ? 1 : 0]]; +} + +// How present one glyph of the buffer is. `settle` is how far into the idle +// the dissolve has travelled: 0 for as long as the pad is still saying +// something, 1 once the whole stream has left. Doubling it and offsetting by +// each glyph's place in the stream spends the first half on the oldest glyph +// and the last half on the newest, so the buffer leaves in reading order +// rather than dimming as one sheet. +function commandFade(index, count, idle) { + const settle = clamp((idle - commandHoldUs) / commandFadeUs, 0, 1); + return clamp(index / Math.max(1, count - 1) + 1 - settle * 2, 0, 1); +} + +function commandStreamStackHeight(player, now = runtime().monotonicUs) { + const count = player.commandStream.length; + if (!count) return 0; + const idle = now - (player.commandStream.at(-1)?.at || now); + const visible = player.commandStream.reduce((total, entry, index) => + total + (commandFade(index, count, idle) > .01 ? 1 : 0), 0); + const handle = playerHandleLayout(player, player.pad); + const size = commandStreamTypeSize(handle.size); + const rows = Math.min(commandStreamRows, + Math.ceil(Math.min(commandStreamDepth, visible) / + commandStreamColumnsNow())); + return rows * (size + 7); +} + +function drawCommandStream(player, side) { + const glyph = { LEFT: "<", RIGHT: ">", UP: "^", DOWN: "v" }; + const buttonFor = { LEFT: "ArrowLeft", RIGHT: "ArrowRight", + UP: "ArrowUp", DOWN: "ArrowDown", "/": "A", "*": "B", ")": "X", + "+": ["Y", "LeftShoulder", "RightShoulder"] }; + const now = runtime().monotonicUs; + const idle = now - (player.commandStream.at(-1)?.at || now); + const count = player.commandStream.length; + const held = inputPads[player.pad]?.down || []; + const entries = player.commandStream.map((entry, index) => ({ ...entry, + text: glyph[entry.label] || entry.label, + fade: commandFade(index, count, idle), + held: Array.isArray(buttonFor[entry.label]) + ? buttonFor[entry.label].some((button) => held.includes(button)) + : held.includes(buttonFor[entry.label]), + })).filter((entry) => entry.fade > .01); + // A held button lights only its newest appearance — not every earlier + // press of the same button still sitting in the buffer's history. + const claimed = new Set(); + for (let index = entries.length - 1; index >= 0; index--) { + const entry = entries[index]; + if (!entry.held) continue; + if (claimed.has(entry.label)) entry.held = false; + else claimed.add(entry.label); + } + if (!entries.length) return; + // The name owns its row. Commands stack in distinct rows above it, aligned + // to the same outside edge, so a long handle can never sit underneath its + // own input history. + entries.reverse(); + const handle = playerHandleLayout(player, side); + const size = commandStreamTypeSize(handle.size); + const columns = commandStreamColumnsNow(); + const lineEntries = entries.slice(0, commandStreamDepth); + const gap = Math.round(size * .34); + const rows = []; + for (let index = 0; index < lineEntries.length; index += columns) + rows.push(lineEntries.slice(index, index + columns)); + const safe = hudSafeRect(); + for (let row = 0; row < rows.length; row++) { + const rowEntries = rows[row]; + const width = rowEntries.reduce((sum, entry, index) => sum + + handleWidth(entry.text, size) + (index ? gap : 0), 0); + let cursor = side === 0 ? handle.x : handle.x + handle.width - width; + cursor = clamp(cursor, safe.left, safe.right - width); + const newestAt = Math.max(...rowEntries.map((entry) => entry.at)); + const rise = clamp((now - newestAt) / 900000, 0, 1) * size * .8; + const y = handle.y - statStackHeight() - (row + 1) * (size + 7) - rise; + for (const entry of rowEntries) { + const quiet = mixColor([104, 114, 136], [82, 90, 108], visualTheme.light); + const live = entry.held ? player.color : quiet; + const glyphInk = entry.fade >= 1 ? live + : mixColor(visualTheme.light > .5 ? [230, 239, 247] : [7, 8, 28], + live, entry.fade); + typeWrite(entry.text, cursor + 2, y + 3, size, + ...contrastShadow(glyphInk)); + typeWrite(entry.text, cursor, y, size, ...glyphInk); + cursor += handleWidth(entry.text, size) + gap; + } + } +} + +function drawFightIntro(introSeconds, titleInk, statusShadow) { + const centerX = viewCenterX(); + const centerY = (stageTop + stageBottom) / 2; + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const nameSize = touch ? 28 : compactLayout() ? 38 : 54; + const drawHeadName = (player) => { + const head = runnerWorldGeometry(player, + (runtime().monotonicUs - startedAt) / 1000000).head; + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const flash = .5 + .5 * Math.sin(introSeconds * Math.PI * 8); + const flashingSize = nameSize * (1 + flash * .1); + const width = handleWidth(visibleHandle(player), flashingSize); + drawFloatingHandle(player, point.x - width / 2, + point.y - radius - flashingSize * 1.28, flashingSize); + }; + if (freeForAll()) { + for (const player of players) drawHeadName(player); + return; + } + if (!reelGroundCamera() && introSeconds < 1) { + drawHeadName(players[0]); + return; + } + if (!reelGroundCamera() && introSeconds < 2) { + drawHeadName(players[1]); + return; + } + { + const title = "oskiewar"; + const titleSize = touch ? 54 : compactLayout() ? 72 : 98; + const width = handleWidth(title, titleSize); + let cursor = centerX - width / 2; + const titleTime = (runtime().monotonicUs - startedAt) / 1000000; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const advance = comicGlyphAdvance(character, titleSize); + typeWrite(character, cursor + 5, centerY - titleSize / 2 + 6, + titleSize, ...statusShadow); + typeWrite(character, cursor, centerY - titleSize / 2, + titleSize, ...animatedTitleColor(index, titleTime)); + cursor += advance; + } + return; + } +} + +function drawSurvivalIntro(titleInk, statusShadow) { + const callout = "climb!"; + const size = compactLayout() ? 74 : 112; + const width = handleWidth(callout, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(callout, x + 5, y + 7, size, ...statusShadow); + typeWrite(callout, x, y, size, ...titleInk); +} + +function drawSurvivalHud(titleInk) { + const safe = hudSafeRect(); + const score = Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 34 : 46; + const width = handleWidth(score, size); + const x = viewCenterX() - width / 2; + const y = safe.top + 2; + typeWrite(score, x + 3, y + 4, size, ...contrastShadow(titleInk)); + typeWrite(score, x, y, size, ...titleInk); +} + +function drawSurvivalResult(titleInk, statusShadow) { + const result = roundResult === "SUMMIT" ? "summit!" + : Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 58 : 82; + const width = handleWidth(result, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(result, x + 5, y + 7, size, ...statusShadow); + typeWrite(result, x, y, size, ...titleInk); +} + +function drawReelSectionProgress(now, titleInk) { + const safe = hudSafeRect(); + const gap = compactLayout() ? 5 : 8; + const widths = [.16, .68, .16]; + const labels = ["INTRO", "FIGHT", "OUTRO"]; + const available = safe.right - safe.left - gap * 2; + const resultDuration = matchOver ? matchResultUs : roundResultUs; + const introAge = Math.max(0, now - roundStartedAt); + const introLimit = roundIntroDurationUs(); + const section = roundResult ? 2 : introAge < introLimit ? 0 : 1; + const progress = section === 0 + ? clamp(introAge / introLimit, 0, 1) + : section === 1 + ? clamp(roundElapsedUs / roundDurationUs, 0, 1) + : clamp((now - roundOverAt) / resultDuration, 0, 1); + const labelSize = compactLayout() ? 18 : 22; + const barHeight = compactLayout() ? 6 : 8; + const barY = safe.bottom - barHeight; + const labelY = barY - labelSize - 7; + const track = mixColor([52, 58, 76], [170, 157, 137], visualTheme.light); + const done = mixColor([96, 222, 154], [31, 92, 76], visualTheme.light); + const hitMarks = Array.isArray(globalThis.__oskiewarFightHitForecast) + ? globalThis.__oskiewarFightHitForecast : fightHitMarks; + let x = safe.left; + for (let index = 0; index < widths.length; index++) { + const width = index === widths.length - 1 + ? safe.right - x : Math.round(available * widths[index]); + const amount = index < section ? 1 : index === section ? progress : 0; + hudBox(x, barY, width, barHeight, ...track); + if (amount > 0) hudBox(x, barY, width * amount, barHeight, + ...(index === section ? titleInk : done)); + if (index === 1) { + const markWidth = compactLayout() ? 5 : 6; + for (const mark of hitMarks) { + const markX = x + clamp(mark.at, 0, 1) * width; + const reached = roundElapsedUs / roundDurationUs >= mark.at; + const impactInk = mark.decisive ? [226, 42, 66] : mark.color; + hudBox(markX - markWidth / 2, barY - 3, + markWidth, barHeight + 6, + ...(reached ? impactInk : mixColor(track, impactInk, .72))); + } + } + const labelWidth = handleWidth(labels[index], labelSize); + typeWrite(labels[index], x + (width - labelWidth) / 2, + labelY, labelSize, ...(index === section ? titleInk : track)); + x += width + gap; + } +} + +function recordFightHit(sourcePad, decisive) { + if (roundResult || roundElapsedUs <= 0) return; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) return; + const fighter = players[sourcePad]; + fightHitMarks.push({ + at: clamp(roundElapsedUs / roundDurationUs, 0, 1), + color: fighter?.color ? [...fighter.color] : [226, 42, 66], + decisive: decisive === true, + }); +} + +// A pole or a branch crossing the near plane has the same problem a face does, +// and the same cure — trim the segment at the plane rather than letting the +// far end pin itself to the near distance and rake across the screen. Null is +// a segment wholly behind the camera. +// The band a face gets, for a line. A segment is two points with no polygon +// to cut, which is why this used to trim at the pin instead: cutting at the +// near plane and handing the result over whole let a line crossing the plane +// rake the length of the guard band. Trimming the PROJECTED segment gives the +// same protection without throwing the line away, so the cut can move back to +// the plane where it belongs. Liang–Barsky, carrying depth along t so a capsule +// still knows how far away its ends are. +function clipSegmentBand(from, to) { + const width = viewWidth(); + const minX = -width * guardBand, maxX = width * (1 + guardBand); + const minY = -viewHeight * guardBand, maxY = viewHeight * (1 + guardBand); + // Most segments sit whole inside the band — every grass blade, most limbs. + // Plain compares answer those; only a segment that actually crosses an + // edge pays for the parametric walk and its rebuilt endpoints. + if (from.x >= minX && from.x <= maxX && from.y >= minY && from.y <= maxY && + to.x >= minX && to.x <= maxX && to.y >= minY && to.y <= maxY) + return { from, to }; + const dx = to.x - from.x, dy = to.y - from.y; + let enter = 0, exit = 1; + for (const [edge, room] of [[-dx, from.x - minX], [dx, maxX - from.x], + [-dy, from.y - minY], [dy, maxY - from.y]]) { + if (edge === 0) { if (room < 0) return null; continue; } + const at = room / edge; + if (edge < 0) { if (at > exit) return null; if (at > enter) enter = at; } + else { if (at < enter) return null; if (at < exit) exit = at; } + } + const along = (t) => ({ x: from.x + dx * t, y: from.y + dy * t, + z: lerp(from.z, to.z, t) }); + return { from: along(enter), to: along(exit) }; +} +// Cut at the real near plane, the same one faces get. The pin is ten times +// further out, and while nothing in normal play passes within eighty units of +// the lens, the death cinematic drives the camera right down to the ground — +// so every limb and blade of grass in front of it was being dropped whole, +// which is what hollowed out the front of the frame on the zoom. +function worldSegment(x1, y1, z1, x2, y2, z2) { + let a = cameraDoll.toView({ x: x1, y: y1, z: z1 }); + let b = cameraDoll.toView({ x: x2, y: y2, z: z2 }); + if (a.z < cameraNear && b.z < cameraNear) return null; + if (a.z < cameraNear) + a = mixVertex(a, b, (cameraNear - a.z) / (b.z - a.z)); + else if (b.z < cameraNear) + b = mixVertex(b, a, (cameraNear - b.z) / (a.z - b.z)); + const from = cameraDoll.projectView(a); + const to = cameraDoll.projectView(b); + // Six plain checks instead of an array built per segment per frame. + return Number.isFinite(from.x) && Number.isFinite(from.y) && + Number.isFinite(from.z) && Number.isFinite(to.x) && + Number.isFinite(to.y) && Number.isFinite(to.z) + ? clipSegmentBand(from, to) : null; +} + +function worldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + line(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} + +function worldCapsule(x1, y1, z1, x2, y2, z2, width, color, + depthBias = -.004) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + const { from, to } = segment; + const previousDepth = triangleDepth; + triangleDepth = Math.min(from.z, to.z) + depthBias; + filledCapsule(from.x, from.y, to.x, to.y, width, color); + triangleDepth = previousDepth; +} + +function litQuadColor(a, b, c, color) { + // Lighting is decided in world space, off the surface the quad names, so it + // is the same shade however the clipper ends up cutting the face up. The + // cross, normalize and dot run in scalars: this is every wall panel every + // frame, and the vector objects were pure interpreter garbage. + const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z; + const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z; + const nx = aby * acz - abz * acy; + const ny = abz * acx - abx * acz; + const nz = abx * acy - aby * acx; + const magnitude = Math.hypot(nx, ny, nz) || 1; + const toward = (nx * -globalLight.x + ny * -globalLight.y + + nz * -globalLight.z) / magnitude; + const illumination = .72 + Math.max(0, toward) * .28; + return [Math.round(color[0] * illumination), + Math.round(color[1] * illumination), + Math.round(color[2] * illumination)]; +} +function worldQuad(a, b, c, d, color) { + const lit = litQuadColor(a, b, c, color); + worldTriangle(a, b, c, lit); + worldTriangle(a, c, d, lit); +} + +// Preserve the sampled silhouette, merging only collinear edges. +const terrainProfile = []; +function rebuildTerrainProfile() { + const points = []; + const step = (worldRight - worldLeft) / terrainSamples; + for (let i = 0; i <= terrainSamples; i++) { + const x = worldLeft + i * step; + const point = { x, y: terrainFloorAt(x) }; + while (points.length > 1) { + const a = points[points.length - 2], b = points[points.length - 1]; + if (Math.abs((b.y - a.y) * (point.x - b.x) - + (point.y - b.y) * (b.x - a.x)) > .00001) break; + points.pop(); + } + points.push(point); + } + terrainProfile.splice(0, terrainProfile.length, ...points); + rebuildTerrainDrawProfile(); +} +// The drawn silhouette. `terrainProfile` keeps every sampled height exactly +// (physics and the fidelity test read it); the console draws each profile +// point as six projections and two faces per pass, so the passes read this +// thinned copy instead — a point is dropped while every point it stood for +// stays within `terrainDrawTolerance` world units of the chord that +// replaces it (about a pixel at fight zoom). Flats were already one edge; +// this is for the ramps, where six samples a tile all survived. +const terrainDrawProfile = []; +const terrainDrawTolerance = 1; +function rebuildTerrainDrawProfile() { + const kept = []; + let anchor = 0; + kept.push(terrainProfile[0]); + for (let index = 2; index <= terrainProfile.length; index++) { + const a = terrainProfile[anchor]; + const candidate = terrainProfile[index] || null; + // Try to stretch the chord from the anchor over `index - 1` to `index`; + // when a point in between falls off it, `index - 1` becomes the anchor. + let fits = candidate !== null; + if (fits) { + const dx = candidate.x - a.x, dy = candidate.y - a.y; + const length = Math.hypot(dx, dy) || 1; + for (let between = anchor + 1; between < index; between++) { + const point = terrainProfile[between]; + const distance = Math.abs((point.x - a.x) * dy - (point.y - a.y) * dx) / length; + if (distance > terrainDrawTolerance) { fits = false; break; } + } + } + if (!fits) { + anchor = index - 1; + kept.push(terrainProfile[anchor]); + } + } + terrainDrawProfile.splice(0, terrainDrawProfile.length, ...kept); +} +rebuildTerrainProfile(); + +// The three terrain passes (surface, front wall, back wall) used to hand +// `worldQuad` four fresh corner objects per segment, and each quad ran its +// six vertices through the camera — so every profile point was projected +// twelve times per pass, and the terrain alone cost 8.4 ms of the console's +// interpreted frame (measured on the Xbox 2026-09-20; sim 5.6 + paint 14 ms +// at 1080p). Each pass now projects each point ONCE for its top vertex and +// once for its bottom, keeps the results in two flat scratch arrays, and +// reads a segment's four corners back from them. Segments that sit wholly +// in front of the camera and inside the guard band — nearly all of them — +// go straight to `projectedTriangle`; the rest fall back to `worldQuad`, so +// the near-plane and band clipping is exactly what it was. +const terrainScratch = { top: [], bottom: [] }; +function terrainVertex(slot, index, x, y, z) { + let vertex = slot[index]; + if (!vertex) vertex = slot[index] = { view: { x: 0, y: 0, z: 0 }, + screen: { x: 0, y: 0, z: 0 }, front: false, inBand: false, x: 0, y: 0, z: 0 }; + vertex.x = x; vertex.y = y; vertex.z = z; + const view = cameraDoll.toView(vertex, vertex.view); + vertex.front = view.z >= cameraNear; + vertex.inBand = vertex.front && + bandContains(cameraDoll.projectView(view, vertex.screen)); + return vertex; +} +// `bottomY` null: the bottom vertex shares the profile's y (the surface +// pass, top at z `zTop`, bottom at z `zBottom`). Otherwise a wall: both +// vertices at `zTop`, the bottom one dropped to `bottomY`. +function terrainPass(left, right, zTop, zBottom, bottomY, shadeOf) { + const { top, bottom } = terrainScratch; + const wall = bottomY !== null; + const terrainProfile = terrainDrawProfile; + const count = terrainProfile.length; + let previous = -1; + for (let index = 0; index < count; index++) { + const point = terrainProfile[index]; + const next = terrainProfile[index + 1]; + // A point is projected only when a drawn segment touches it. + const inSpan = (next && !(next.x < left || point.x > right)) || + (index > 0 && !(point.x < left || terrainProfile[index - 1].x > right)); + if (!inSpan) { previous = -1; continue; } + const a = terrainVertex(top, index, point.x, point.y, zTop); + const b = terrainVertex(bottom, index, point.x, wall ? bottomY : point.y, + wall ? zTop : zBottom); + if (previous >= 0 && previous === index - 1 && + !(point.x < left || terrainProfile[previous].x > right)) { + const a1 = top[previous], b1 = bottom[previous]; + const shade = shadeOf(previous); + if (a1.front && a.front && b.front && b1.front) { + // Reject fully offscreen quads before lighting and guard-band + // clipping. The generous world apron includes many invisible ramps. + const p=a1.screen, q=a.screen, r=b.screen, s=b1.screen; + const width=viewWidth(); + if ((p.x<0 && q.x<0 && r.x<0 && s.x<0) || + (p.x>width && q.x>width && r.x>width && s.x>width) || + (p.y<0 && q.y<0 && r.y<0 && s.y<0) || + (p.y>viewHeight && q.y>viewHeight && r.y>viewHeight && s.y>viewHeight)) { + previous=index; + continue; + } + const lit = litQuadColor(a1, a, b, shade); + if (a1.inBand && a.inBand && b.inBand && b1.inBand) { + projectedTriangle(a1.screen, a.screen, b.screen, lit); + projectedTriangle(a1.screen, b.screen, b1.screen, lit); + } else { + // Off the guard band on one side: clip the projected quad once + // rather than re-projecting it as two triangles. + const face = clipScreenBand([a1.screen, a.screen, b.screen, b1.screen]); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], lit); + } + } else worldQuad(a1, a, b, b1, shade); + } + previous = index; + } +} +// Per-segment surface shade, cached against the ground color it was mixed +// from: the slope never changes between rebuilds, and mixing 240 colours a +// frame was measurable on the console. +let terrainShadeKey = ""; +const terrainShades = []; +function terrainSurfaceShades(color) { + const terrainProfile = terrainDrawProfile; + const key = currentMapId + "/" + color.join(",") + "/" + terrainProfile.length; + if (key === terrainShadeKey) return terrainShades; + terrainShadeKey = key; + terrainShades.length = 0; + for (let index = 1; index < terrainProfile.length; index++) { + const { x: x1, y: y1 } = terrainProfile[index - 1]; + const { x: x2, y: y2 } = terrainProfile[index]; + const slope = Math.abs(y2 - y1) / Math.max(1, x2 - x1); + terrainShades[index - 1] = + mixColor(color, [110, 120, 90], .16 + Math.min(1, slope) * .22); + } + return terrainShades; +} +function drawTerrainSurface(left, right, near, far, color) { + const shades = terrainSurfaceShades(color); + terrainPass(left, right, near, far, null, (segment) => shades[segment]); +} + +function drawTerrainFrontWall(left, right, near, color) { + // Close the near edge with a terrain-following skirt so camera pitch never + // exposes what lies beneath the floor. + // + // WHERE the skirt hangs is the whole fix for the reel's under-floor gap. + // The reel lens is orthographic, so the floor plane projects to a line and + // can never cover the bottom of a 9:16 frame — only a vertical surface can. + // The TV skirt at the slab's near edge sits BEHIND the reel camera and gets + // near-clipped (tinting it magenta proved it never reached the frame), which + // left the buried room wall showing through as purple under the grass. For + // reels the skirt hangs just behind the fighters' plane instead, deep enough + // that no frame sees under it, and wears the ground color — so everything + // below the floor line reads as earth. + const reel = reelGroundCamera(); + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = reel ? 55 : near - 2; + const wallBottom = parkDeepest + (reel ? 9000 : 720); + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawTerrainBackWall(left, right, far, color) { + // The far edge was simply open. Yaw clamps at +/-.62rad, which is more than + // enough to swing the diorama around and look straight through the back of + // the slab into the buried room wall. The near edge has hung a skirt since + // the reel work; this is its mirror, and it exists for the ordinary TV lens + // where the right stick can actually reach around. + // + // Reels return early. That lens already hangs its single skirt just behind + // the fighters at z=55, and a second wall out at worldFar would sit behind + // that one where no reel frame ever looks -- pure cost, and a change to + // footage whose framing is test-enshrined. + if (reelGroundCamera()) return; + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = far + 2; + const wallBottom = floorY + 720; + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawRoomSurfaces(left, right, top, bottom, color) { + // The station has no room to surface. Every plane this function used to + // raise — the plaster sheet behind the fighters, the segmented left wall, + // the ceiling cap — existed because the map was an interior, and the space + // map is not one: what is behind a fighter here is the starfield the + // backdrop already painted, and putting a wall in front of it would be + // painting over the map's whole idea to save nothing. + // + // Two things survive, and both survive because they carry information. + // + // The heat lattice stays: it is the tile field made visible, and on a + // station it reads as a nav hologram hanging in the dark, which is a + // better home than the plaster it used to be ruled onto. + // + // The bounds stay, as a containment field rather than as masonry. This is + // not decoration — `resolveRunnerBounds` stops a body at exactly these two + // planes and `updateBullets` ricochets a pistol round off them, so a fight + // in open space still has two hard edges in it and a player who cannot see + // them is a player being lied to. Drawn as a pair of lit lines at the far + // plane, pulsing, because a wall you can see through is the only honest + // drawing of a rule you cannot walk through. + if (survivalActive()) { + const wallBottom = floorY + 3000; + const roomTop = top - 500; + const shade = mixColor(color, [226, 172, 168], .12); + worldQuad({ x: worldLeft, y: roomTop, z: worldFar }, + { x: worldRight, y: roomTop, z: worldFar }, + { x: worldRight, y: wallBottom, z: worldFar }, + { x: worldLeft, y: wallBottom, z: worldFar }, shade); + const sideFloor = terrainFloorAt(worldLeft) + 120; + const sideShade = mixColor(color, [232, 170, 153], .13); + for (let row = 0; row < 2; row++) { + for (let depth = 0; depth < 2; depth++) { + const y1 = lerp(roomTop, sideFloor, row / 2); + const y2 = lerp(roomTop, sideFloor, (row + 1) / 2); + const z1 = lerp(0, worldFar, depth / 2); + const z2 = lerp(0, worldFar, (depth + 1) / 2); + worldQuad({ x: worldLeft, y: y1, z: z1 }, + { x: worldLeft, y: y1, z: z2 }, + { x: worldLeft, y: y2, z: z2 }, + { x: worldLeft, y: y2, z: z1 }, sideShade); + } + } + const climbEdge = mixColor(color, [64, 78, 72], .24); + worldLine(worldLeft, top, worldFar - 4, worldLeft, bottom, worldFar - 4, + 9, climbEdge); + worldLine(worldRight, top, worldFar - 4, worldRight, bottom, worldFar - 4, + 9, climbEdge); + return; + } + // The heat's base is the vacuum it hangs in, so a cooling tile fades to + // nothing rather than settling into a visible panel with edges. Only the + // bloom is meant to be seen. + drawGridOverlay(mixColor(color, [6, 8, 20], .97), false); + const pulse = .5 + .5 * Math.sin(runtime().monotonicUs / 520000); + const field = mixColor([54, 120, 186], [136, 214, 255], .3 + pulse * .35); + for (const edgeX of [worldLeft, worldRight]) { + worldLine(edgeX, ceilingY, worldFar - 4, edgeX, floorY, worldFar - 4, + 9, field); + worldLine(edgeX, ceilingY, worldNear + 4, edgeX, floorY, worldNear + 4, + 5, mixColor(field, [8, 12, 28], .5)); + } +} + +function drawSurvivalLava(t) { + if (!survivalActive()) return; + const pulse = .5 + .5 * Math.sin(t * 3.1); + const surface = mixColor([255, 58, 24], [255, 212, 42], pulse * .42); + const body = mixColor([116, 10, 26], [238, 50, 18], .58 + pulse * .18); + const far = worldFar - 8; + const bottom = Math.max(floorY + 3000, survivalLavaY + 3200); + worldQuad({ x: worldLeft, y: survivalLavaY, z: far }, + { x: worldRight, y: survivalLavaY, z: far }, + { x: worldRight, y: bottom, z: far }, + { x: worldLeft, y: bottom, z: far }, body); + worldQuad({ x: worldLeft, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldFar }, + { x: worldLeft, y: survivalLavaY, z: worldFar }, surface); + for (let step = 0; step < 9; step++) { + const x1 = lerp(worldLeft, worldRight, step / 9); + const x2 = lerp(worldLeft, worldRight, (step + 1) / 9); + const y1 = survivalLavaY + Math.sin(t * 4.2 + step * 1.7) * 9; + const y2 = survivalLavaY + Math.sin(t * 4.2 + (step + 1) * 1.7) * 9; + worldLine(x1, y1, worldNear - 2, x2, y2, worldNear - 2, 7, surface); + } +} + +// The map's addressing, made visible: the same lattice the spawn marks and +// pickups are authored on, with the heat of `gridField` showing where the +// last half-second of the fight landed. Seams are thin quads rather than +// worldLines because the native renderer buries the whole line stratum +// beneath the world's triangles — the grid would vanish behind its own wall +// on console, the same way the gun once drew under the floor. +// +// A heated cell used to paint its entire ninety-unit face — a square as tall +// as a standing fighter, and a busy exchange flipped a dozen of them on and +// off at once. That is the stripes and the starfield again: a pattern the eye +// keeps reading behind the two things it is supposed to be watching. On the +// light theme it was worse than busy, because the slab's base is the vacuum, +// so what bloomed over the arena was a dark panel rather than heat. +// +// So the cell keeps its job and loses its size. Each hot tile draws a small +// jittered grain patch at its own centre, under half a tile across so two lit +// neighbours can never fuse back into a checker square. Heat sets how many +// specks are lit as well as how bright, so cooling reads as a patch thinning +// out — texture, at a scale that stays decoration. +function drawGridOverlay(shade, seamInk = null) { + const gridZ = worldFar - 2; + const gridTop = floorY - gridHeight; + const hot = mixColor([255, 138, 92], [204, 58, 46], visualTheme.light); + // Sixteen specks over a patch half a tile across, each of them a few units + // on a side against the tile's ninety, so the grain is a texture with air in + // it rather than a smaller solid square. + const grainSteps = 4; + const grainSpan = tileSize * .5; + for (let cell = 0; cell < gridField.length; cell++) { + const heat = gridField[cell]; + if (heat < .05) continue; + const centerX = gridLeft + (cell % gridCols + .5) * tileSize; + const centerY = floorY - (Math.floor(cell / gridCols) + .5) * tileSize; + const ink = mixColor(shade, hot, .4 + heat * .55); + for (let speck = 0; speck < grainSteps * grainSteps; speck++) { + // Hashed off the cell and the speck rather than noised, so a replayed + // round grains exactly the way the live one did. + const seed = .5 + .5 * Math.sin(cell * 12.9898 + speck * 78.233); + // Cooling puts specks out one at a time instead of dimming the lot. + if (seed > heat) continue; + const size = 2 + seed * 2 + heat * 2.5; + const x = centerX + (speck % grainSteps / (grainSteps - 1) - .5) * + grainSpan + (seed - .5) * 11; + const y = centerY + (Math.floor(speck / grainSteps) / (grainSteps - 1) - + .5) * grainSpan + (.5 - seed) * 11; + worldQuad({ x: x - size, y: y - size, z: gridZ }, + { x: x + size, y: y - size, z: gridZ }, + { x: x + size, y: y + size, z: gridZ }, + { x: x - size, y: y + size, z: gridZ }, ink); + } + } + // The climb's lattice is ruled onto plaster and takes its seam from that + // plaster. The station has no plaster, and ruling the same seams across + // vacuum drew a cage over the whole frame — brighter than the starfield it + // was supposed to hang behind, and carrying a hard bright bar wherever the + // ceiling row crossed the top of the shot. + // + // So the space map passes `false` and gets no seams at all. What it keeps + // is the half of this that was always the point: the heat. Cold tiles draw + // nothing, so the lattice is invisible until a blow lands and then blooms + // where it landed — the tile field showing its own contents rather than + // its own graph paper. The ruled version stays for the climb, where there + // is a wall to rule it onto. + if (seamInk === false) return; + const seam = seamInk || mixColor(shade, [30, 34, 48], .22); + const seamZ = gridZ - 1; + for (let col = 0; col <= gridCols; col++) { + const x = gridLeft + col * tileSize; + worldQuad({ x: x - 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: floorY, z: seamZ }, + { x: x - 1.5, y: floorY, z: seamZ }, seam); + } + for (let row = 0; row <= gridRows; row++) { + const y = floorY - row * tileSize; + worldQuad({ x: gridLeft, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y + 1.5, z: seamZ }, + { x: gridLeft, y: y + 1.5, z: seamZ }, seam); + } +} + +function drawTerrainGrass(left, right, color) { + // Twenty deterministic tufts cost forty native lines total. Keeping them on + // the line layer avoids turning background dressing into hundreds of faces. + const count = 100; + for (let index = 0; index < count; index++) { + const seed = .5 + .5 * Math.sin(index * 91.73 + terrainPhase * 2.31); + const x = lerp(worldLeft, worldRight, (index + .5) / count); + if (x < left || x > right) continue; + // Keep dressing in the near half of the floor. At the far plane the same + // blades collapse into horizon ticks instead of reading as foreground grass. + const z = lerp(worldNear * .88, worldNear * .22, + .5 + .5 * Math.sin(index * 37.11 + terrainPhase)); + const y = terrainFloorAt(x) - 2; + const height = 22 + seed * 22; + const tuft = mixColor(color, [48, 92, 54], .42 + seed * .22); + worldLine(x, y, z, x - 8 - seed * 5, y - height, z, 3, tuft); + worldLine(x, y, z, x + 7 + seed * 6, y - height * .82, z, 3, tuft); + } +} + +function drawBoosterPad(t) { + const pulse = .5 + .5 * Math.sin(t * 4); + const color = mixColor([55, 174, 244], [255, 224, 74], pulse * .55); + for (const boosterX of boosterXs) { + const y = terrainFloorAt(boosterX) - 7; + worldQuad( + { x: boosterX - boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: 86 }, + { x: boosterX - boosterRadius, y, z: 86 }, color); + } +} + +function drawSkyAtmosphere(sky, arena) { + // The station's background is one plain color, and the `wipe` at the top of + // the frame has already painted it -- so the space map draws no backdrop at + // all, and this function is the climb's weather again. + // + // It was a starfield: a hundred and twenty parallaxing stars, six gradient + // bands and a planet limb with a lit rim. @jeffrey asked for the same thing + // here he asked for of the cube's plaster -- "can the level background be + // plain colored? not stripey?" -- and the answer is the same both times. A + // decorative background is a pattern the eye keeps reading during a fight + // that has two small figures in it, and every one of those stars was + // competing with the thing you are supposed to be watching. The pattern went + // and about two hundred screen-space draws a frame went with it. + if (!survivalActive()) return; + // Broad D2D bands are effectively free compared with projected meshes and + // make the sky feel spatial without rebuilding a textured skybox each frame. + const bands = 6; + const bottom = Math.round(viewHeight * .78); + for (let band = 0; band < bands; band++) { + const y1 = Math.round(bottom * band / bands); + const y2 = Math.round(bottom * (band + 1) / bands); + const amount = (band + .5) / bands; + const color = mixColor(sky, arena, amount * .22); + box(0, y1, viewWidth(), y2 - y1 + 1, ...color); + } + const haze = mixColor(sky, arena, .34); + for (let streak = 0; streak < 11; streak++) { + const seed = .5 + .5 * Math.sin(streak * 41.37 + terrainPhase * 1.9); + const x = (streak + .18 + seed * .6) / 11 * viewWidth(); + const y = 88 + (.5 + .5 * Math.sin(streak * 19.17 - terrainPhase)) * + viewHeight * .43; + const reach = 32 + seed * 86; + line(x - reach, y, x + reach, y + (seed - .5) * 7, + 2 + seed * 2, ...haze); + } +} + +function shadowSurfaceY(x, y) { + return surfaceYAt(x, y); +} + +function drawSpotShadow(x, y, z, radius, color) { + const surfaceY = shadowSurfaceY(x, y); + const height = Math.max(0, surfaceY - y); + const reach = Math.min(520, height * .22); + const focus = clamp(1 - height / 5200, .42, 1); + const shadowX = x + globalLight.x * reach; + const shadowZ = z + globalLight.z * reach; + const center = projectPoint(shadowX, surfaceY - 2, shadowZ); + const edge = projectPoint(shadowX + radius, surfaceY - 2, shadowZ); + if (![center.x, center.y, edge.x, edge.y].every(Number.isFinite) || + [center.x, center.y, edge.x, edge.y].some((value) => Math.abs(value) > 30000)) + return; + const radiusX = Math.max(4, Math.abs(edge.x - center.x) * + (.5 + .18 * focus)); + const radiusY = Math.max(2, radiusX * (.2 + .08 * focus)); + // Bind the shadow to the owning object's depth, then bias it away from the + // camera. It remains above the terrain pass but can never win against the + // object that casts it. Restore the depth after — this used to leak, and + // everything drawn until the next assignment inherited the last shadow + // caster's depth: nondeterministic layering, frame to frame, on console. + const previousDepth = triangleDepth; + triangleDepth = projectPoint(x, y, z).z + .018; + const sides = 14; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + screenTriangle(center.x, center.y, + center.x + Math.cos(a) * radiusX, + center.y + Math.sin(a) * radiusY, + center.x + Math.cos(b) * radiusX, + center.y + Math.sin(b) * radiusY, ...color); + } + triangleDepth = previousDepth; +} + +function projectedBallRadius(ball) { + const center = projectPoint(ball.x, ball.y, ball.z); + const edge = projectPoint(ball.x + ball.radius, ball.y, ball.z); + // Do not impose a screen-space minimum: on the long street the camera can + // pull far back, and a fixed eight-pixel prop looked as if it grew relative + // to fighters and terrain. + return Math.max(.5, Math.abs(edge.x - center.x)); +} + +function drawSkateboard(player) { + const at = skateFrame(player); + const deck = [236, 76, 118], grip = [34, 25, 39], truck = [174, 184, 202]; + const quad = (a, b, c, d, color) => worldQuad(at(...a), at(...b), at(...c), at(...d), color); + const axle = (a, b, width, color) => { + const p = at(...a), q = at(...b); + worldCapsule(p.x, p.y, p.z, q.x, q.y, q.z, Math.max(.4, width * cameraScale()), color); + }; + // Far wheels, deck, near wheels: preserve occlusion in the Canvas2D host. + const wheel = (along, side) => { + const spin = player.skateSpin || 0; + const center = at(along, skateAxleDrop, side * 15); + for (let i = 0; i < 10; i++) { + const a = spin + i * Math.PI / 5, b = spin + (i + 1) * Math.PI / 5; + worldTriangle(center, + at(along + Math.cos(a) * skateWheelRadius, + skateAxleDrop + Math.sin(a) * skateWheelRadius, side * 15), + at(along + Math.cos(b) * skateWheelRadius, + skateAxleDrop + Math.sin(b) * skateWheelRadius, side * 15), + i % 5 === 0 ? truck : [243, 210, 103]); + } + }; + const near = cameraDoll.position.z < player.z ? -1 : 1; + for (const along of [-skateTruck, skateTruck]) wheel(along, -near); + quad([-48, -4, -12], [48, -4, -12], [48, -4, 12], [-48, -4, 12], grip); + quad([-48, -4, near * 12], [48, -4, near * 12], [48, 0, near * 12], [-48, 0, near * 12], deck); + for (const end of [-1, 1]) + quad([end * 48, -4, -12], [end * 64, -12, -10], + [end * 64, -12, 10], [end * 48, -4, 12], deck); + for (const along of [-skateTruck, skateTruck]) { + axle([along, 0, 0], [along, skateAxleDrop, 0], 4, truck); + axle([along, skateAxleDrop, -15], [along, skateAxleDrop, 15], 3, truck); + wheel(along, near); + } +} + +function drawBall(ball) { + if (!ball.active) return; + const point = projectPoint(ball.x, ball.y, ball.z); + // A ball is a sphere in the orthographic world. Measuring its projected + // world radius keeps the screen hit shape circular while still respecting + // the perspective intro and loss cameras. + const radius = projectedBallRadius(ball); + if (!Number.isFinite(point.x) || !Number.isFinite(point.y) || + !Number.isFinite(radius) || radius > 12000 || point.x + radius < 0 || + point.x - radius > viewWidth() || point.y + radius < 0 || + point.y - radius > viewHeight) return; + const soccer = ball.type === "soccer"; + const beach = ball.type === "beach"; + const skateboard = ball.type === "skateboard"; + const polygon = (x, y, polygonRadius, sides, rotation, color) => { + for (let side = 0; side < sides; side++) { + const a = rotation + side * Math.PI * 2 / sides; + const b = rotation + (side + 1) * Math.PI * 2 / sides; + screenTriangle(x, y, + x + Math.cos(a) * polygonRadius, + y + Math.sin(a) * polygonRadius, + x + Math.cos(b) * polygonRadius, + y + Math.sin(b) * polygonRadius, ...color); + } + }; + if (skateboard) { + drawSkateboard({ x: ball.x, y: ball.y + skateAxleDrop + skateWheelRadius, + z: ball.z, skatePitch: ball.rotation, skateSpin: ball.skateSpin || 0 }); + return; + } + if (beach) { + const panels = [ + [244, 66, 96], [255, 146, 52], [255, 226, 66], [72, 210, 126], + [54, 196, 224], [70, 112, 238], [184, 82, 224], + ]; + const palettePhase = runtime().monotonicUs / 850000; + const paletteStep = Math.floor(palettePhase); + const paletteMix = palettePhase - paletteStep; + const sides = 16; + for (let side = 0; side < sides; side++) { + const a = ball.rotation + side * Math.PI * 2 / sides; + const b = ball.rotation + (side + 1) * Math.PI * 2 / sides; + // Native monotonic time can read negative, and a negative remainder + // would index off the front of the palette. + const panel = ((Math.floor(side / 2) + paletteStep) % panels.length + + panels.length) % panels.length; + const panelColor = mixColor(panels[panel], + panels[(panel + 1) % panels.length], paletteMix); + screenTriangle(point.x, point.y, + point.x + Math.cos(a) * radius * .92, + point.y + Math.sin(a) * radius * .92, + point.x + Math.cos(b) * radius * .92, + point.y + Math.sin(b) * radius * .92, + ...panelColor); + } + filledDisc(point.x, point.y, radius * .13, [246, 241, 220]); + return; + } + filledDisc(point.x, point.y, radius * .92, + soccer ? [226, 232, 224] : [232, 104, 28]); + const seam = [42, 31, 29]; + if (soccer) { + polygon(point.x, point.y, radius * .22, 5, + ball.rotation - Math.PI / 2, seam); + for (let patch = 0; patch < 5; patch++) { + const angle = ball.rotation + patch * Math.PI * 2 / 5; + const patchX = point.x + Math.cos(angle) * radius * .58; + const patchY = point.y + Math.sin(angle) * radius * .58; + filledCapsule(point.x + Math.cos(angle) * radius * .2, + point.y + Math.sin(angle) * radius * .2, + patchX, patchY, Math.max(1.5, radius * .035), seam); + polygon(patchX, patchY, radius * .13, 5, + angle - Math.PI / 2, seam); + } + } else { + const width = Math.max(2, radius * .075); + for (const angle of [ball.rotation, ball.rotation + Math.PI / 2]) { + const dx = Math.cos(angle) * radius * .84; + const dy = Math.sin(angle) * radius * .84; + filledCapsule(point.x - dx, point.y - dy, + point.x + dx, point.y + dy, width, seam); + } + for (const direction of [-1, 1]) { + let previous = null; + for (let step = -6; step <= 6; step++) { + const y = step / 6 * radius * .82; + const x = direction * Math.cos(step / 6 * Math.PI / 2) * radius * .42; + const next = { x: point.x + x, y: point.y + y }; + if (previous) filledCapsule(previous.x, previous.y, + next.x, next.y, width, seam); + previous = next; + } + } + filledDisc(point.x, point.y, Math.max(1.5, width * .55), seam); + } +} + +// What the bot saw this tick, drawn where it saw it: every rung in its frame +// gets a lip line, the deck it is jumping for gets its landing band, and the +// footing gets the window a jump may start from. A person watching a bot +// stand still can now read whether it is waiting for a deck to enter frame. +function drawBotScene(player) { + if (renderFlags.hud === false) return; + if (!debugHitboxes || !player.bot || !player.botScene) return; + const scene = player.botScene; + const seen = [58, 222, 255]; + for (const rung of scene.rungs) + hudWorldLine(rung.left, rung.y, 0, rung.right, rung.y, 0, 3, seen); + const goal = player.botSubgoal; + if (goal && goal.kind === "jump") { + const band = [120, 255, 120]; + hudWorldLine(goal.landLeft, goal.y, 0, goal.landRight, goal.y, 0, 6, band); + hudWorldLine(goal.aim, goal.y, 0, goal.aim, goal.y - 40, 0, 3, band); + const footing = scene.self.footing; + if (footing) + hudWorldLine(goal.takeoffLeft, footing.y, 0, goal.takeoffRight, + footing.y, 0, 6, [255, 214, 90]); + } + if (scene.lava) + hudWorldLine(worldLeft, scene.lava.y, 0, worldRight, scene.lava.y, 0, 3, + [255, 110, 70]); +} + +function drawBallHitboxes() { + if (renderFlags.hud === false) return; + if (!debugHitboxes) return; + for (const item of balls) { + if (!item.active) continue; + const point = projectPoint(item.x, item.y, item.z); + const radius = projectedBallRadius(item); + if (![point.x, point.y, radius].every(Number.isFinite) || radius > 5000 || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledRing(point.x, point.y, radius + 5, radius + 2, [58, 222, 255]); + } +} + +function drawGunPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const scale = cameraScale(); + const metal = mixColor([202, 212, 228], [52, 59, 72], visualTheme.light); + const grip = mixColor([126, 106, 88], [40, 43, 52], visualTheme.light); + const barrelWidth = Math.max(2, 5 * scale); + const gripWidth = Math.max(2, 4 * scale); + const smg = pickup.kind === "RUBBER SMG"; + const rocket = pickup.kind === "ROCKET LAUNCHER"; + if (pickup.kind === "SPACE LASER") { + // Short body, long emitter, and a lit coil at the breech so the thing on + // the top deck is identifiable as light-bearing from the floor three + // decks below. The pulse is on the same 3 Hz bob as every other pickup. + const glow = mixColor([96, 226, 255], [236, 255, 255], + .4 + .35 * Math.sin(t * 5.2)); + const shell = mixColor([206, 224, 240], [44, 54, 78], visualTheme.light); + worldCapsule(pickup.x - 22, bobY, pickup.z, + pickup.x + 14, bobY, pickup.z, barrelWidth * 1.5, shell, -.02); + worldCapsule(pickup.x + 14, bobY, pickup.z, + pickup.x + 40, bobY, pickup.z, barrelWidth * .7, glow, -.02); + worldCapsule(pickup.x - 14, bobY - 9, pickup.z, + pickup.x - 2, bobY - 9, pickup.z, barrelWidth * .6, glow, -.02); + worldCapsule(pickup.x - 6, bobY + 2, pickup.z, + pickup.x - 1, bobY + 22, pickup.z, gripWidth * 1.2, grip, -.02); + return; + } + // A handgun-sized world object in gunmetal and grip material, not a glowing + // pickup glyph with a second silhouette around it. + // Capsules, not line() — the native renderer buries the whole line + // stratum beneath the world's triangles, which is how the gun spent a day + // drawn under the floor on console while the web shell showed it fine. + worldCapsule(pickup.x - (rocket ? 58 : smg ? 42 : 16), bobY, pickup.z, + pickup.x + (rocket ? 62 : smg ? 48 : 20), bobY, pickup.z, + rocket ? barrelWidth * 2.2 : smg ? barrelWidth * 1.45 : barrelWidth, + rocket ? [48, 61, 52] : metal, -.02); + worldCapsule(pickup.x + (smg ? 8 : 2), bobY + 1, pickup.z, + pickup.x + (smg ? 13 : 8), bobY + (smg ? 27 : 18), pickup.z, + smg ? gripWidth * 1.5 : gripWidth, grip, -.02); + if (smg) { + worldCapsule(pickup.x - 42, bobY, pickup.z, + pickup.x - 65, bobY + 18, pickup.z, barrelWidth, grip, -.02); + worldCapsule(pickup.x - 6, bobY + 4, pickup.z, + pickup.x - 1, bobY + 30, pickup.z, gripWidth * 1.4, metal, -.02); + } + if (rocket) { + worldCapsule(pickup.x + 50, bobY, pickup.z, + pickup.x + 68, bobY, pickup.z, barrelWidth * 2.8, [104, 62, 48], -.02); + worldCapsule(pickup.x - 8, bobY + 3, pickup.z, + pickup.x - 3, bobY + 30, pickup.z, gripWidth * 1.5, [38, 45, 42], -.02); + } +} + +// A saber waiting on a deck: the hilt standing upright with a stub of blade +// lit above it, bobbing on the same clock as every other pickup so the map's +// loose objects share one heartbeat. Drawn short on purpose — a full-length +// blade planted in a deck would read as scenery, and this is something you +// pick up. Capsules rather than lines, for the same reason the pistol is +// capsules: the native renderer buries the whole line stratum under the +// world's triangles, and the blade would vanish into the deck it sits on. +function drawSaberPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const pulse = .5 + .5 * Math.sin(t * 5.6 + pickup.x * .002); + const glow = mixColor([120, 226, 255], [244, 252, 255], .35 + pulse * .4); + const hilt = mixColor([172, 182, 198], [46, 52, 68], visualTheme.light); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 34, pickup.z, 13, glow, -.02); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 30, pickup.z, 6, [244, 252, 255], -.02); + worldCapsule(pickup.x, bobY + 6, pickup.z, + pickup.x, bobY + 34, pickup.z, 9, hilt, -.02); + worldCapsule(pickup.x - 13, bobY + 8, pickup.z, + pickup.x + 13, bobY + 8, pickup.z, 5, hilt, -.02); +} + +function drawBullet(bullet) { + const previous = projectPoint(bullet.previousX ?? bullet.x, + bullet.previousY ?? bullet.y, bullet.z); + const point = projectPoint(bullet.x, bullet.y, bullet.z); + const blink = Math.floor(runtime().monotonicUs / 65000 + bullet.owner) % 2; + // A bolt does not blink. The pistol round's alternating white is what makes + // a slow ricochet findable against a busy floor; the laser is gone in four + // frames and wants to read as one continuous line of light instead. + const core = bullet.spit + ? bullet.heavy ? [255, 92, 174] : [118, 255, 196] + : bullet.laser ? [236, 255, 255] + : blink ? [255, 255, 248] + : bullet.rubber ? [255, 226, 58] : [255, 178, 76]; + const trail = bullet.spit + ? bullet.heavy ? [182, 48, 116] : [58, 190, 132] + : bullet.laser ? [96, 226, 255] + : blink ? [255, 244, 178] + : bullet.rubber ? [214, 178, 42] : [224, 116, 62]; + const scale = cameraScale(); + // Project the complete projectile. The old 2px/4px floors made both the + // trail and blinking core behave like HUD icons once the street zoomed out. + // + // Spit is dots, not tracers: the streak between frames is the thing that + // says "bullet", so a glob doesn't draw one — just a little ball with a + // couple of droplets falling off the arc behind it. + if (bullet.spit) { + // A glob must survive the wide portrait camera as a ball, not sub-pixel + // dust. The darker halo keeps its circular edge legible over sky or earth. + const radius = Math.max(2, (bullet.heavy ? 10 : 7) * scale); + filledDisc(point.x, point.y, radius * 1.35, trail); + filledDisc(point.x, point.y, radius, core); + filledDisc(lerp(point.x, previous.x, .5), lerp(point.y, previous.y, .5), + radius * .45, trail); + filledDisc(previous.x, previous.y, radius * .25, trail); + return; + } + drawBulletTrail(bullet, trail, scale); + if (bullet.laser) { + // Drawn as the stride itself: at 9,600 units a second the gap between two + // frames IS the beam, so a wide cyan sheath over a white core along that + // gap is the whole shot. No round cap at the tip — a bolt has a leading + // edge, not a head. + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(1.2, 9 * scale), trail); + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, 3.5 * scale), core); + return; + } + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, (bullet.rubber ? 4 : 3) * scale), trail); + filledDisc(point.x, point.y, Math.max(.9, 7 * scale), core); +} + +// The ghost of where a round has been. Walked oldest to newest so the fade +// runs the right way down the path, and drawn thin: the live tracer is the +// bullet, this is only the shape its bounces have written. +// +// Bare quads, NOT filledCapsule. A capsule is two triangles plus two discs and +// a small disc is a six-sided fan, so it costs ten faces — at the 24-bullet cap +// that is 3,600 faces of ghost against a ~2,100-face frame, which is the eleven +// -frames-a-second stray wearing a different hat. Two faces a segment caps the +// worst case at 528, and a trail wants no round caps anyway. +function drawBulletTrail(bullet, ink, scale) { + const stored = Math.min(bullet.trailCount || 0, bulletTrailPoints); + if (stored < 2) return; + // The same leash the camera uses. A round that has sailed out of the fight + // is off screen, and its ghost should not be paid for either. + if (!players.some((player) => + Math.abs(bullet.x - player.x) < 5200 && + Math.abs(bullet.y - player.y) < 5200)) return; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const oldest = (bullet.trailCount || 0) - stored; + let previous = null; + for (let step = 0; step < stored; step++) { + const slot = ((oldest + step) % bulletTrailPoints) * 2; + const here = projectPoint(bullet.trail[slot], bullet.trail[slot + 1], + bullet.z); + if (previous) { + // Newer segments carry more of the tracer's weight and colour, so the + // tail thins toward nothing rather than stopping on a hard edge. + const age = step / stored; + const radius = Math.max(.4, (bullet.rubber ? 3 : 2.2) * scale * age) / 2; + const dx = here.x - previous.x; + const dy = here.y - previous.y; + const length = Math.hypot(dx, dy); + if (length > .001) { + const nx = -dy / length * radius; + const ny = dx / length * radius; + const [r, g, b] = mixColor(ground, ink, .18 + age * .55); + screenTriangle(previous.x + nx, previous.y + ny, + previous.x - nx, previous.y - ny, here.x + nx, here.y + ny, r, g, b); + screenTriangle(previous.x - nx, previous.y - ny, + here.x - nx, here.y - ny, here.x + nx, here.y + ny, r, g, b); + } + } + previous = here; + } +} + +function drawGrenadePickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3.2 + pickup.x * .001) * 8; + const point = projectPoint(pickup.x, bobY, pickup.z); + const scale = cameraScale(); + const shell = mixColor([166, 194, 112], [72, 96, 58], visualTheme.light); + const fuse = mixColor([210, 218, 232], [45, 50, 60], visualTheme.light); + const radius = Math.max(3, 9 * scale); + const previousDepth = triangleDepth; + triangleDepth = point.z - .02; + filledDisc(point.x, point.y, radius, shell); + triangleDepth = previousDepth; + worldCapsule(pickup.x + 1, bobY - 10, pickup.z, + pickup.x + 11, bobY - 20, pickup.z, Math.max(2, 3 * scale), fuse, -.02); +} + +function drawGrenade(grenade) { + const point = projectPoint(grenade.x, grenade.y, grenade.z); + if (grenade.exploding) { + const radius = grenade.blastRadius * cameraScale(); + const width = Math.max(3, 10 * cameraScale()); + filledRing(point.x, point.y, radius, + Math.max(0, radius - width), [255, 105, 105]); + return; + } + if (grenade.rocket) { + const length = Math.hypot(grenade.vx, grenade.vy) || 1; + const tail = projectPoint(grenade.x - grenade.vx / length * 54, + grenade.y - grenade.vy / length * 54, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(5, 13 * cameraScale()), [52, 65, 56]); + filledDisc(point.x, point.y, Math.max(5, 12 * cameraScale()), [190, 74, 54]); + const flame = projectPoint(grenade.x - grenade.vx / length * 88, + grenade.y - grenade.vy / length * 88, grenade.z); + filledCapsule(flame.x, flame.y, tail.x, tail.y, + Math.max(3, 7 * cameraScale()), [255, 214, 72]); + return; + } + const blink = grenade.fuse < .45 && Math.floor(grenade.fuse * 20) % 2 === 0; + const color = blink ? [255, 255, 255] : players[grenade.owner].color; + filledDisc(point.x, point.y, Math.max(4, 22 * cameraScale()), color); + const tail = projectPoint(grenade.x - Math.sign(grenade.vx) * 90, + grenade.y - 14, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(2, 6 * cameraScale()), color); +} + +function drawWindFlag(t, color) { + const poleX = (platformLeft + platformRight) / 2; + const poleZ = 480; + const poleBottom = platformY; + const poleTop = platformY - 150; + const calm = windMph < .35; + const flagHeight = 68; + const length = calm ? 58 : 78 + windMph * 7; + const gust = calm ? 0 + : Math.sin(t * (4 + windMph * .16)) * (10 + windMph * .8); + const tipX = poleX + windDirection * length; + const tipY = poleTop + flagHeight * .5 + gust; + const width = Math.max(3, 13 * cameraScale()); + const poleInk = mixColor([214, 222, 236], [50, 57, 70], visualTheme.light); + const edgeInk = mixColor([242, 246, 252], [26, 31, 44], visualTheme.light); + const fabric = calm + ? mixColor([92, 205, 255], [35, 112, 190], visualTheme.light) : color; + const flagPoints = [ + projectPoint(poleX, poleTop, poleZ), + projectPoint(tipX, tipY, poleZ), + projectPoint(poleX, poleTop + flagHeight, poleZ), + ]; + if (flagPoints.every((point) => [point.x, point.y, point.z].every(Number.isFinite))) + projectedTriangle(flagPoints[0], flagPoints[1], flagPoints[2], fabric); + worldCapsule(poleX, poleBottom, poleZ, + poleX, poleTop, poleZ, width, poleInk); + const edgeWidth = Math.max(2, width * .34); + worldCapsule(poleX, poleTop, poleZ, + tipX, tipY, poleZ, edgeWidth, edgeInk); + worldCapsule(tipX, tipY, poleZ, + poleX, poleTop + flagHeight, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX, poleTop + flagHeight, poleZ, + poleX, poleTop, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX - 35, poleBottom, poleZ, + poleX + 35, poleBottom, poleZ, width, poleInk); +} + +function hashUnit(text) { + let hash = 2166136261; + for (let cursor = 0; cursor < text.length; cursor++) { + hash ^= text.charCodeAt(cursor); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967295; +} + +function airSeedValue(index, channel = 0) { + return hashUnit("oskiewar-air:" + index + ":" + channel); +} + +function resetAirParticles() { + const count = 18; + const spanX = worldRight - worldLeft; + const spanY = floorY - ceilingY; + const spanZ = worldFar - worldNear; + airParticles.length = 0; + for (let index = 0; index < count; index++) + airParticles.push({ + id: "air:" + index, + kind: "air", + position: { + x: worldLeft + airSeedValue(index, 1) * spanX, + y: ceilingY + 180 + airSeedValue(index, 2) * (spanY - 360), + z: worldNear + 100 + airSeedValue(index, 3) * (spanZ - 200), + }, + velocity: { x: 0, y: 0, z: 0 }, + radius: 8 + airSeedValue(index, 4) * 14, + phase: airSeedValue(index, 5) * Math.PI * 2, + }); +} + +// A stream-function curl gives the air a divergence-free-looking circulation +// instead of independent sine wiggles. Entities relax toward this velocity, +// advect in fixed simulation time, and wrap at arena boundaries. +function airFlowAt(position, seconds, phase) { + const nx = (position.x - worldLeft) / (worldRight - worldLeft) * Math.PI * 2; + const ny = (position.y - ceilingY) / (floorY - ceilingY) * Math.PI * 2; + const age = seconds * .32 + phase; + const circulation = 96; + return { + x: windDirection * (42 + windMph * 12) + + circulation * Math.sin(nx + age) * Math.cos(ny - age * .7), + y: -circulation * Math.cos(nx + age) * Math.sin(ny - age * .7), + z: 44 * Math.sin(nx + ny + age * .55), + }; +} + +const wrapWorld = (value, low, high) => { + const span = high - low; + return low + ((value - low) % span + span) % span; +}; + +function simulateAirParticles(dt, now) { + if (!airParticles.length) resetAirParticles(); + const seconds = now / 1000000; + const response = 1 - Math.exp(-dt * 2.8); + for (const entity of airParticles) { + const flow = airFlowAt(entity.position, seconds, entity.phase); + entity.velocity.x = lerp(entity.velocity.x, flow.x, response); + entity.velocity.y = lerp(entity.velocity.y, flow.y, response); + entity.velocity.z = lerp(entity.velocity.z, flow.z, response); + entity.position.x = wrapWorld(entity.position.x + entity.velocity.x * dt, + worldLeft, worldRight); + entity.position.y = wrapWorld(entity.position.y + entity.velocity.y * dt, + ceilingY + 120, floorY - 120); + entity.position.z = wrapWorld(entity.position.z + entity.velocity.z * dt, + worldNear + 80, worldFar - 80); + } +} + +function drawAmbientMotes(color) { + const previousDepth = triangleDepth; + for (const entity of airParticles) { + const { x, y, z } = entity.position; + const point = projectPoint(x, y, z); + const edge = projectPoint(x + entity.radius, y, z); + const radius = Math.max(.8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const depthAmount = (z - worldNear) / (worldFar - worldNear); + const ink = mixColor([18, 24, 48], color, .24 + (1 - depthAmount) * .34); + if (![point.x, point.y, point.z, radius].every(Number.isFinite) || + point.x < stageLeft - radius || point.x > stageRight + radius || + point.y < -radius || point.y > viewHeight + radius) continue; + triangleDepth = point.z; + filledDisc(point.x, point.y, radius, ink); + } + triangleDepth = previousDepth; +} + +function drawSelectPortrait(player, x, y, scale, t) { + const color = player.color; + const head = { x, y: y - 130 * scale, radius: 34 * scale }; + filledDisc(head.x, head.y, head.radius + Math.max(2, 3 * scale), [8, 12, 24]); + filledDisc(head.x, head.y, head.radius, color); + hudLine(x, y - 94 * scale, x, y + 20 * scale, 12 * scale, ...color); + hudLine(x, y - 65 * scale, x - 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y - 65 * scale, x + 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y + 20 * scale, x - 48 * scale, y + 112 * scale, 11 * scale, ...color); + hudLine(x, y + 20 * scale, x + 48 * scale, y + 112 * scale, 11 * scale, ...color); + drawFace(player, head, contrastShadow(color), t); +} + +function selectionPreview(option) { + return { ...players[1], name: option.fighter.handle, + color: option.fighter.color, + npc: option.kind === "dummy" || option.kind === "bot", + bot: option.kind === "bot" }; +} + +function drawSelectionScreen(t, ink, panel) { + const layout = selectionTouchLayout(); + const hover = selectionHover(layout); + if (globalThis.__oskiewarTouch) globalThis.__oskiewarTouch.hover = hover; + const compact = compactLayout(); + const title = selectionStep === 0 ? "pick your pal" : "who are you fighting?"; + const titleSize = compact ? 36 : 58; + const titleY = compact ? 58 : 86; + const titleWidth = handleWidth(title, titleSize); + typeWrite(title, viewCenterX() - titleWidth / 2, titleY, titleSize, ...ink); + const stepText = (selectionStep + 1) + "/2"; + const stepSize = compact ? 24 : 32; + typeWrite(stepText, layout.back.x + layout.back.width + (compact ? 18 : 28), + layout.back.y + (compact ? 11 : 18), stepSize, + ...mixColor([140, 150, 185], ink, .35)); + const backHovered = hover?.back; + const options = selectionOptions(); + // Neighbours first so the focused card always lands on top of them. + const wheel = [...layout.options].sort((a, b) => + Math.abs(b.slot) - Math.abs(a.slot)); + for (const rect of wheel) { + const option = options[rect.index]; + const player = selectionPreview(option); + const disabled = Boolean(option.disabled); + const hovered = !disabled && hover?.option === rect.index; + const focused = !disabled && rect.slot === 0; + const disabledInk = mixColor([74, 80, 96], [164, 168, 178], + visualTheme.light); + const optionColor = disabled ? disabledInk : option.fighter.color; + if (hovered || focused) + box(rect.x, rect.y + rect.height - (hovered ? 8 : 5), rect.width, + hovered ? 8 : 5, ...optionColor); + const scale = rect.height / 520 * 1.05; + const portraitY = rect.y + rect.height * (compact ? .55 : .53); + drawSelectPortrait(player, rect.x + rect.width / 2, portraitY, scale, t); + const label = option.fighter.handle.toLowerCase(); + const labelSize = Math.max(16, Math.round(rect.width * .085)); + const labelWidth = handleWidth(label, labelSize); + drawHandle(label, rect.x + (rect.width - labelWidth) / 2, + rect.y + rect.height - labelSize - (compact ? 10 : 18), labelSize, + disabled ? [disabledInk] : option.fighter.colors, optionColor); + } + // Chevrons inside the focused card name the gesture that turns the wheel, + // without crowding the neighbours they point at. + if (layout.options.length > 1) { + const focus = layout.options.find((rect) => rect.slot === 0); + const arrowSize = compact ? 30 : 52; + const arrowY = focus.y + focus.height / 2 - arrowSize / 2; + const inset = (compact ? 8 : 14) + Math.sin(t * 3.4) * (compact ? 3 : 6); + typeWrite("<", focus.x + inset, arrowY, arrowSize, ...ink); + typeWrite(">", focus.x + focus.width - inset - + comicGlyphAdvance(">", arrowSize), arrowY, arrowSize, ...ink); + } + // Keep navigation above every option on narrow/tall browser layouts. + box(layout.back.x, layout.back.y, layout.back.width, layout.back.height, + ...mixColor(panel, ink, backHovered ? .25 : .08)); + typeWrite("< back", layout.back.x + (compact ? 12 : 20), + layout.back.y + (compact ? 10 : 17), compact ? 25 : 34, ...ink); + const controls = selectionControlKeys(); + drawCenteredKeycapRun(controls, viewHeight - (compact ? 52 : 66), + compact ? 15 : 20, inputPads[0]?.down || [], ink); +} + +const titlePaletteNight = [ + [255, 105, 190], [111, 232, 210], [255, 232, 92], [130, 150, 255], + [255, 126, 92], [188, 128, 255], [92, 205, 255], [246, 248, 255], +]; +const titlePaletteDay = [ + [190, 32, 118], [0, 126, 124], [176, 112, 0], [73, 82, 190], + [204, 59, 43], [114, 68, 185], [24, 107, 181], [47, 56, 82], +]; + +function animatedTitleColor(index, t, daylight = visualTheme.light) { + const count = titlePaletteNight.length; + // Native monotonic time can begin a fraction before startedAt settles. + // Normalize the remainder so that first frame still lands in the palette. + const phase = ((index + t * .42) % count + count) % count; + const from = Math.floor(phase); + const amount = phase - from; + const eased = amount * amount * (3 - amount * 2); + const night = mixColor(titlePaletteNight[from], + titlePaletteNight[(from + 1) % count], eased); + const day = mixColor(titlePaletteDay[from], + titlePaletteDay[(from + 1) % count], eased); + return mixColor(night, day, daylight); +} + +// The dummy count, as a sentence. The host hands over a window and a total; +// the window is already the shortest one that had anything in it, so all that +// is left here is to say it in English. Zero returns nothing at all — an +// arcade does not advertise that nobody played today. +function dummyPopLine(stat) { + const pops = Math.floor(Number(stat?.pops) || 0); + const hours = Math.floor(Number(stat?.hours) || 0); + if (pops <= 0 || hours <= 0 || hours > 48) return ""; + return pops + " dummy head" + (pops === 1 ? "" : "s") + " popped in the last " + + (hours === 1 ? "hour" : hours + " hours"); +} + +function drawDummyPopLine(titleY, titleSize, transitionInk) { + // Not on the poster: the social preview is burned to a file whose hash is + // checked at deploy, and a number that moves would make it stale hourly. + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const line = dummyPopLine(capabilities().pops); + if (!line) return; + const size = Math.round(hudTypeSize * (compactLayout() ? .46 : .56)); + const width = handleWidth(line, size); + const x = viewCenterX() - width / 2; + const y = titleY + titleSize + (compactLayout() ? 12 : 18); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || + mixColor([198, 206, 232], [58, 70, 104], visualTheme.light); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); +} + +// "Add your coach." @jeffrey: "itd be cool so any user can claude into an +// oskiewar game ... 'coach' would be the feature ... which could then analyze +// your matches / do things / get ur data". The relay has always counted a +// read-only `agent` seat apart from the grandstand; this offers that seat on +// the title as a thing a player can do — hand oskiewar.com/coach.mjs to their +// own Claude and it sits in on this room, reading every frame a phone reads. +// The room name is the whole invitation, since it is what a coach attaches +// to, so it is printed here under START where a newcomer is already looking. +// Once a coach is seated the line says so, with the antenna the debug +// read-out lights, and keeps the name up so the player can tell the coach is +// watching this room and not an earlier one. Never on the poster: the social +// preview is hash-bound, and a room name changes with every burn. +function drawCoachLine(button, transitionInk) { + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const room = versusRoomName || sessionName; + if (!room) return; + const compact = compactLayout(); + const linked = linkedAgents(); + const line = linked ? "coach linked " + room + : "add your coach oskiewar.com/coach " + room; + const size = Math.round(hudTypeSize * (compact ? .46 : .56)); + const width = handleWidth(line, size); + const glyph = linked ? Math.round(size * 1.2) : 0; + const x = viewCenterX() - (width + glyph) / 2 + glyph; + const y = button.y + button.height + (compact ? 6 : 10); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || (linked ? [120, 226, 255] + : mixColor([198, 206, 232], [58, 70, 104], visualTheme.light)); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); + if (linked) drawAgentLink(x - glyph * .6, y + size * .55, size / 26, linked); +} + +function titleButtonRect() { + const compact = compactLayout(); + const textSize = hudTypeSize; + const textWidth = handleWidth("start", textSize); + const width = textWidth + (compact ? 54 : 76); + const height = textSize + (compact ? 24 : 34); + return { x: viewCenterX() - width / 2, + y: viewHeight * (compact ? .61 : .64) - (compact ? 10 : 15), + width, height, textSize, textWidth }; +} + +// A letter you can push around. `grow` eases toward 1 while the pointer is on +// it and `kick` is a decaying shudder fired the frame it is first touched, so +// the word answers one letter at a time instead of inflating as a block. +function toyGlyph(toys, index, hot, dt) { + const toy = toys[index] || (toys[index] = { grow: 0, kick: 0, hot: false }); + toy.grow += ((hot ? 1 : 0) - toy.grow) * (1 - Math.exp(-dt * (hot ? 16 : 7))); + if (hot && !toy.hot) toy.kick = 1; + toy.hot = hot; + toy.kick *= Math.exp(-dt * 5.5); + return toy; +} + +const pointInCell = (point, x, y, width, height) => point && x <= point.x && + point.x <= x + width && y <= point.y && point.y <= y + height; + +// Screen-space outline, four boxes, no projection — safe anywhere. +function strokeBox(x, y, width, height, thickness, color) { + hudBox(x, y, width, thickness, ...color); + hudBox(x, y + height - thickness, width, thickness, ...color); + hudBox(x, y, thickness, height, ...color); + hudBox(x + width - thickness, y, thickness, height, ...color); +} + +function drawTitleScreen(t, ink, transitionAge = -1) { + const compact = compactLayout(); + const socialPreview = typeof capabilities === "function" && + capabilities().socialPreview === true; + // Keep the game identity visible on the opening frame. The live fighters + // and START remain interactive beneath the wordmark. + const title = "oskiewar"; + const version = "v" + buildVersion; + const breath = 1 + Math.sin(t * .9) * .018; + const socialLockupGap = compact ? 10 : 18; + const socialTitleSize = Math.min(220, + (viewWidth() - 56 - socialLockupGap) / + (handleWidth(title, 1) + handleWidth(version, .3))); + const titleSize = (socialPreview ? socialTitleSize : compact ? 88 : 154) * breath; + const titleWidth = handleWidth(title, titleSize); + const versionSize = Math.round(titleSize * .3); + const versionWidth = handleWidth(version, versionSize); + const lockupGap = socialPreview ? socialLockupGap : compact ? 10 : 18; + const lockupWidth = titleWidth + lockupGap + versionWidth; + const titleX = viewCenterX() - lockupWidth / 2; + const titleY = viewHeight * (compact ? .38 : .35); + + // Air fuzzies: sparse motes drifting the whole frame, no panels or stripes + // behind the wordmark. + if (transitionAge < 0 && renderFlags.dust !== false) + for (let index = 0; index < (compact ? 10 : 16); index++) { + const phase = index * 2.39996; + const x = stageLeft + (stageRight - stageLeft) * + (.5 + .47 * Math.sin(t * (.055 + index % 5 * .01) + phase)); + const y = viewHeight * + (.5 + .45 * Math.cos(t * (.043 + index % 4 * .012) + phase * 1.7)); + const radius = (compact ? 2 : 3) + (index % 3); + hudCircle(x, y, radius, Math.max(1.5, radius * .48), + animatedTitleColor(index, t * .7)); + } + + let cursor = titleX; + // Kerning scaffold: one cell per glyph, taken from the same advance the + // layout walks, so drift and bob read against their own metrics. + const glyphCells = debugHitboxes && transitionAge < 0 && !socialPreview && + renderFlags.hud !== false ? [] : null; + const flashPalette = [[255, 226, 48], [70, 224, 92], [181, 255, 48]]; + const flash = transitionAge >= 0 + ? flashPalette[Math.floor(transitionAge / .065) % flashPalette.length] : null; + const fade = transitionAge >= 0 ? clamp((transitionAge - .46) / .24, 0, 1) : 0; + const transitionInk = flash ? mixColor(flash, [7, 10, 26], fade) : null; + // Toys ease in real time, and the burn renders headless with no pointer, so + // the poster stays the same picture it always was. + const dt = titleToyAt < 0 ? 0 : clamp(t - titleToyAt, 0, .1); + titleToyAt = t; + const raw = globalThis.__oskiewarTouch?.pointer; + const pointer = transitionAge < 0 && !socialPreview && raw?.active && + Number.isFinite(raw.x) && Number.isFinite(raw.y) ? raw : null; + let held = -1; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const bob = Math.sin(t * 2.05 + index * .72) * (compact ? 5 : 8); + const drift = Math.cos(t * 1.12 + index * .91) * (compact ? 3 : 5) + + Math.sin(t * .63 + index * 1.71) * (compact ? 7 : 12); + const advance = comicGlyphAdvance(character, titleSize); + // The cell is what the pointer touches, so a letter that has swollen out + // of it cannot chase the cursor or shove its neighbours along the line. + // + // The letter the pointer already holds is tested against a cell grown by + // exactly how far this letter can travel — the sum of its drift terms + // across, its bob down — so the whole of its wander happens without the + // grab ever being dropped. Every other letter is tested honestly, or a + // held letter would keep stealing the pointer from its neighbours. + const slackX = titleGlyphHot === index ? (compact ? 10 : 17) : 0; + const slackY = titleGlyphHot === index ? (compact ? 5 : 8) : 0; + const hot = pointInCell(pointer, cursor + drift - slackX, + titleY + bob - slackY, advance + slackX * 2, titleSize + slackY * 2); + if (hot) held = index; + const toy = toyGlyph(titleToys, index, hot, dt); + const size = titleSize * + (1 + toy.grow * .38 + toy.kick * Math.sin(t * 31 + index) * .17); + const shudder = toy.kick * Math.sin(t * 27 + index * 1.3) * + (compact ? 6 : 11); + const glyphX = cursor + drift + + (advance - comicGlyphAdvance(character, size)) / 2 + shudder; + const glyphY = titleY + bob - (size - titleSize) * .5 - + toy.grow * (compact ? 6 : 11); + const shadowOffset = Math.max(4, Math.min(5, Math.round(size * .025))); + typeWrite(character, glyphX + shadowOffset, glyphY + shadowOffset, + size, ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(character, glyphX, glyphY, + size, ...(transitionInk || animatedTitleColor(index, t))); + if (glyphCells) glyphCells.push([cursor + drift, titleY + bob, advance]); + cursor += advance; + } + const versionX = titleX + titleWidth + lockupGap; + const versionY = titleY + titleSize - versionSize * 1.15; + const versionEdge = contrastShadow(transitionInk || ink); + for (const [dx, dy] of [[-2, 0], [2, 0], [0, -2], [0, 2]]) + typeWrite(version, versionX + dx, versionY + dy, versionSize, ...versionEdge); + typeWrite(version, versionX, versionY, versionSize, + ...(transitionInk || ink)); + if (survivalActive()) { + const mode = "survival"; + const modeSize = Math.round(titleSize * .28); + const modeWidth = handleWidth(mode, modeSize); + const modeX = viewCenterX() - modeWidth / 2; + const modeY = titleY + titleSize + (compact ? 8 : 12); + typeWrite(mode, modeX + 2, modeY + 3, modeSize, + ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(mode, modeX, modeY, modeSize, ...(transitionInk || ink)); + } else drawDummyPopLine(titleY, titleSize, transitionInk); + if (glyphCells) { + strokeBox(titleX, titleY, titleWidth, titleSize, 2, [92, 132, 255]); + for (const [x, y, advance] of glyphCells) { + strokeBox(x, y, advance, titleSize, 2, [255, 92, 116]); + hudBox(x, y, 2, titleSize, 116, 255, 184); + } + } + + const prompt = "start"; + const button = titleButtonRect(); + const hovered = Boolean(pointer) && pointInRect(pointer, button); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.titleButton = button; + globalThis.__oskiewarTouch.titleHover = hovered; + globalThis.__oskiewarTouch.titleGlyph = held; + } + titleGlyphHot = held; + promptBounce += ((hovered ? 1 : 0) - promptBounce) * + (1 - Math.exp(-dt * (hovered ? 14 : 6))); + const promptPulse = .68 + (Math.sin(t * 3.2) + 1) * .16; + const promptInk = transitionInk || + mixColor([196, 142, 18], [255, 238, 82], promptPulse); + // The word floats on its own; the rect survives only as the touch target. + // Yellow type on a bright sky needs an edge, so a sharp offset shadow + // deepens as the background lightens and lifts as it goes to night. + if (!socialPreview) { + let promptCursor = button.x + (button.width - button.textWidth) / 2; + const promptY = button.y + (button.height - button.textSize) / 2 - 2; + const offset = Math.max(3, Math.round(button.textSize * .1)); + const shadowInk = mixColor([10, 12, 30], [86, 26, 116], visualTheme.light); + const litInk = hovered + ? mixColor(promptInk, [255, 255, 255], .35) : promptInk; + for (let index = 0; index < prompt.length; index++) { + const character = prompt[index]; + const advance = comicGlyphAdvance(character, button.textSize); + const toy = toyGlyph(promptToys, index, + pointInCell(pointer, promptCursor, promptY, advance, button.textSize), + dt); + // The whole word takes the bounce, but each letter takes it a beat after + // the one before, so start reads as a hop travelling along the word. + const hop = promptBounce * button.textSize * .3 * + Math.abs(Math.sin(t * 5.4 - index * .62)); + const size = button.textSize * (1 + toy.grow * .2 + toy.kick * .12); + const x = promptCursor + (advance - comicGlyphAdvance(character, size)) / 2; + const y = promptY - hop - (size - button.textSize) * .5; + if (!transitionInk) + typeWrite(character, x + offset, y + offset, size, ...shadowInk); + typeWrite(character, x, y, size, ...litInk); + promptCursor += advance; + } + // The pace dial. Quiet unless the clock is off its default — or was just + // touched, so stepping back to one still answers the keypress — and it + // lives large in the bottom-right corner, a dashboard readout rather + // than a footnote under the start word. + const paceNow = runtime().monotonicUs; + if (gameSpeed !== 1 || (gameSpeedChangedAt && + paceNow - gameSpeedChangedAt < 2400000)) { + const pace = "×" + gameSpeed; + const paceSize = Math.max(30, Math.round(button.textSize * .8)); + const hud = hudSafeRect(); + const paceX = hud.right - handleWidth(pace, paceSize); + const paceY = hud.bottom - paceSize; + typeWrite(pace, paceX + 3, paceY + 4, paceSize, ...shadowInk); + typeWrite(pace, paceX, paceY, paceSize, ...promptInk); + } + drawCoachLine(button, transitionInk); + } + // Touch play keeps its thumbs in the bottom corners, and the fight is live + // under this screen now, so the stamp yields the pad rather than sit on it. + if (transitionAge >= 0 || socialPreview || (typeof capabilities === + "function" && capabilities().inputFamily === "touch")) return; + const titleUnixMs = runtime().unixMs || Date.now(); + const safe = hudSafeRect(); + // No frame rate under the wordmark. The read-out has one home — the + // bottom-left lane above the nameplate, where a fight already shows it — + // and a second copy parked in the middle of the poster only crowded the + // kerning cells it was sitting next to. + const clock = hudClockBox(titleUnixMs); + drawHudClock(clock, safe.top + 2, ink, titleUnixMs); + drawHudStatusTray(clock, ink, titleUnixMs); +} + +function pacificTimeLabel(unixMs) { + // The arena clock follows Pacific time without displaying a zone suffix. + const date = new Date(unixMs); + const year = date.getUTCFullYear(); + const nthSunday = (month, occurrence, hour) => { + const first = new Date(Date.UTC(year, month, 1)); + const day = 1 + ((7 - first.getUTCDay()) % 7) + (occurrence - 1) * 7; + return Date.UTC(year, month, day, hour); + }; + const daylight = unixMs >= nthSunday(2, 2, 10) && + unixMs < nthSunday(10, 1, 9); + const local = new Date(unixMs - (daylight ? 7 : 8) * 3600000); + const hour = local.getUTCHours(); + const minute = String(local.getUTCMinutes()).padStart(2, "0"); + const second = String(local.getUTCSeconds()).padStart(2, "0"); + return String(hour % 12 || 12) + ":" + minute + ":" + second; +} + +// Status indicators share one lane rather than each finding its own corner, so +// they read as a set: same cell, same row, in the title-safe frame just left of +// the wall clock. The lane is right-aligned because the clock and the round QR +// grow leftward from the same edge. +const statusGap = 6; +const statusCellSize = () => shellMode === "GAME" && debugHitboxes ? 56 : 26; + +function hudStatusIcons() { + const icons = []; + if (typeof capabilities === "function" && capabilities().midi) icons.push("midi"); + return icons; +} + +// The clock's footprint is computed once and shared, so the lane cannot drift +// out of step with where the clock actually lands. +function hudClockBox(unixMs) { + const safe = hudSafeRect(); + const label = pacificTimeLabel(unixMs); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 16 : hudTypeSize; + const qrBox = spectatorQrBox(); + const anchor = qrBox ? qrBox.left - 14 : safe.right; + // National identity begins at this corner: the local country's flag flies + // just left of the QR and the clock lane slides over to make room. US + // first — more flags join as they are drawn. + const flagCode = typeof capabilities === "function" && + capabilities().country === "US" ? "US" : ""; + const flagWidth = flagCode ? Math.round(size * 2.1) : 0; + const right = anchor - (flagCode ? flagWidth + 12 : 0); + const dialRadius = Math.max(6, Math.round(size * .38)); + const dialGap = Math.max(5, Math.round(size * .2)); + const textRight = right - dialRadius * 2 - dialGap; + return { label, size, right, textRight, dialRadius, anchor, flagCode, + flagWidth, dialX: right - dialRadius, + left: textRight - handleWidth(label, size) }; +} + +// Old Glory at corner scale: seven stripes and a starred canton read as the +// flag long before thirteen would, and the stars stay dots — real stars need +// more pixels than the corner owns. Shadowed like the type beside it so it +// flies on any sky. +function drawUsFlag(x, y, width, height, ink) { + hudBox(x + 2, y + 2, width, height, ...contrastShadow(ink)); + const stripes = 7; + for (let stripe = 0; stripe < stripes; stripe++) { + const top = y + Math.round(stripe * height / stripes); + const bottom = y + Math.round((stripe + 1) * height / stripes); + hudBox(x, top, width, bottom - top, + ...(stripe % 2 ? [238, 242, 247] : [188, 32, 46])); + } + const cantonWidth = Math.round(width * .44); + const cantonHeight = Math.round(height * 4 / stripes); + hudBox(x, y, cantonWidth, cantonHeight, 38, 52, 122); + for (let star = 0; star < 6; star++) + filledDisc(x + Math.round(cantonWidth * (.22 + (star % 3) * .28)), + y + Math.round(cantonHeight * (star < 3 ? .3 : .7)), + Math.max(1, Math.round(height * .05)), [238, 242, 247]); +} + +function drawHudClock(clock, y, ink, unixMs) { + typeWrite(clock.label, clock.left + 3, y + 3, + clock.size, ...contrastShadow(ink)); + const match = clock.label.match(/^(\d+)(:)(\d{2})(:)(\d{2})$/); + const parts = match ? match.slice(1) : [clock.label]; + const syntax = visualTheme.light ? titlePaletteDay : titlePaletteNight; + const colors = [syntax[0], ink, syntax[1], ink, syntax[2]]; + let x = clock.left; + parts.forEach((part, index) => { + typeWrite(part, x, y, clock.size, ...(colors[index] || ink)); + x += handleWidth(part, clock.size); + }); + const centerY = y + clock.size * .48; + const seconds = ((unixMs / 1000) % 60 + 60) % 60; + const segments = 24; + const filled = seconds / 60 * segments; + filledDisc(clock.dialX + 2, centerY + 2, clock.dialRadius, + contrastShadow(ink)); + filledDisc(clock.dialX, centerY, clock.dialRadius, + mixColor([20, 24, 38], [238, 241, 247], visualTheme.light)); + for (let segment = 0; segment < Math.ceil(filled); segment++) { + const start = -Math.PI / 2 + segment / segments * Math.PI * 2; + const end = -Math.PI / 2 + Math.min(segment + 1, filled) / + segments * Math.PI * 2; + screenTriangle(clock.dialX, centerY, + clock.dialX + Math.cos(start) * clock.dialRadius, + centerY + Math.sin(start) * clock.dialRadius, + clock.dialX + Math.cos(end) * clock.dialRadius, + centerY + Math.sin(end) * clock.dialRadius, ...syntax[2]); + } + hudCircle(clock.dialX, centerY, clock.dialRadius, 2, ink); +} + +function hudStatusTray(clock = null) { + const icons = hudStatusIcons(); + if (!icons.length) return null; + const statusCell = statusCellSize(); + const safe = hudSafeRect(); + const qrBox = spectatorQrBox(); + const right = clock ? clock.left - 14 + : qrBox ? qrBox.left - 14 : safe.right; + const width = icons.length * statusCell + (icons.length - 1) * statusGap; + return { icons, right, left: right - width, top: safe.top, + height: statusCell }; +} + +// A one-octave keyboard: seven equal white keys with the black keys only on the +// boundaries that have them, so it reads as a piano at this size instead of an +// approximate smear. It brightens for a beat whenever a note leaves. +function drawStatusPiano(x, y, lit) { + const width = 21, height = 14, key = width / 7; + const left = Math.round(x - width / 2), top = Math.round(y - height / 2); + hudBox(left, top, width, height, ...(lit ? [108, 240, 168] : [176, 184, 202])); + for (const step of [1, 2, 4, 5, 6]) + hudBox(Math.round(left + step * key) - 1, top, 2, Math.round(height * .58), + 23, 27, 40); +} + +function drawHudStatusTray(clock, ink, unixMs) { + const tray = hudStatusTray(clock); + const statusCell = statusCellSize(); + // Debug is global state, so its large indicator owns bottom-center rather than + // masquerading as another peripheral in the clock-side status tray. + if (debugHitboxes && !performanceFooterVisible()) { + const safe = hudSafeRect(); + const top = safe.bottom - statusCell; + drawDebugBug(viewCenterX(), top + statusCell / 2 + 2, + statusCell / 26); + // The session's name rides beside the bug: it is what a telemetry agent + // attaches to, and debug mode is exactly the moment somebody wants to + // read that name off the screen and type it into a terminal. + if (sessionName) { + const size = Math.max(17, Math.round(statusCell * .4)); + typeWrite(sessionName, viewCenterX() + statusCell * .62, + top + statusCell / 2 + 2 - size / 2, size, ...ink); + } + // And the linked-agent mark keeps the bug company on its other side — + // @jeffrey: "can the little agent icon be near the debug ladybug, not by + // the fps". The name says where to attach; the antenna says who has. + const agents = linkedAgents(); + if (agents) { + const scale = statusCell / 34; + drawAgentLink(viewCenterX() - statusCell * .62 - 14 * scale, + top + statusCell / 2 + 2, scale, agents); + } + } + if (!tray) return; + const lit = typeof capabilities === "function" && + unixMs - (capabilities().midiPulse || 0) < 140; + tray.icons.forEach((name, index) => { + const x = tray.left + index * (statusCell + statusGap) + statusCell / 2; + const y = tray.top + tray.height / 2; + if (name === "midi") drawStatusPiano(x, y, lit); + }); +} + +function drawDebugBug(x, y, scale = 1) { + const shell = [255, 86, 126]; + const detail = [22, 12, 34]; + const limb = (x1, y1, x2, y2, width, color) => + filledCapsule(x1, y1, x2, y2, width, color); + filledDisc(x, y + 2 * scale, 8 * scale, shell); + filledDisc(x, y - 6 * scale, 5 * scale, shell); + limb(x, y - 7 * scale, x - 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x, y - 7 * scale, x + 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x - 5 * scale, y, x - 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x + 5 * scale, y, x + 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x - 5 * scale, y + 5 * scale, x - 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x + 5 * scale, y + 5 * scale, x + 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x, y - scale, x, y + 9 * scale, 2 * scale, detail); + filledDisc(x - 2 * scale, y - 7 * scale, 1.2 * scale, detail); + filledDisc(x + 2 * scale, y - 7 * scale, 1.2 * scale, detail); +} + +// The title owns the share code; active maps keep the corner clear. +function spectatorQrBox() { + if (shellMode === "GAME") return null; + if (typeof capabilities === "function" && capabilities().socialPreview) + return null; + if (!spectatorQr || typeof spectatorQr.getModuleCount !== "function") + return null; + const safe = hudSafeRect(); + const count = spectatorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor((compactLayout() ? 108 : 158) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + // The QR anchors on the safe rect's top-right corner — the exact spot the + // debug overlay draws its yellow corner crop. With the bug lit the + // instrument wins: the code steps below the crop instead of covering it, + // and every lane that asks this box (the clock included) follows it down. + const top = safe.top + (debugHitboxes ? 52 : 0); + return { left: safe.right - size, top, size, cell, count, quiet }; +} + +// Where the bare frame rate shows with the overlay off: the console, in a +// fight. The debug read-out itself never asks which screen it is on. +const bareFrameRateShown = () => nativeTrianglePass && shellMode === "GAME"; +function drawDebugPerformance(ink) { + // The wordmark screen used to hide this row, but the title is a running + // fight with a frame budget of its own — debug mode reads the machine, not + // the match, so the numbers stay up wherever the bug is lit. Only a round's + // result card still clears the lane, because the card owns it. + if (roundResult) return; + // The console keeps a bare frame rate on the HUD through a fight even + // with the debug overlay off — @jeffrey, 2026-09-20: "when game is + // playing lets still show fps in hud". One short word, so the read-out + // costs the frame it measures almost nothing. + const bare = !debugHitboxes; + if (bare && !bareFrameRateShown()) return; + const metaSize = debugReadoutMetaSize(); + const run = runtime(); + // Every line waits for a real measurement. The read-out used to answer with + // the logical stage size, the measured frame rate wearing a Hz label, and a + // row of zeroed milliseconds — three numbers that looked like instruments and + // were not. The browser now times its own frame span and its own paint, so it + // fills the rate and two of the three stages honestly; the render surface is + // still the console's alone, and a browser can never time the compositor's + // present, so that stage stays out of the row rather than reading 0.00ms. + const refreshHz = Number(run.refreshHz) || 0; + // Measured first, always — the display's refresh rate is a constant, not + // an instrument, so it rides behind the number that actually moves. + const rate = Math.round(displayFps || 0) + " fps" + + (refreshHz ? " @ " + refreshHz.toFixed(0) + " Hz" : ""); + if (bare) { + const lane = playerHandleLayout(players[0], 0); + typeWrite(rate, lane.x, lane.y - metaSize - 6, metaSize, ...ink); + return; + } + const renderWidth = Math.round(Number(run.renderWidth) || Number(run.width) || 0); + const renderHeight = Math.round(Number(run.renderHeight) || Number(run.height) || 0); + const aa = Math.max(1, Math.round(Number(run.antialiasingSamples) || 1)); + const surface = renderWidth && renderHeight + ? " · " + renderWidth + "x" + renderHeight + " · " + + String(run.antialiasingMode || (aa + "x")) : ""; + const frameMs = Number(run.frameMs) || 0; + const presentMs = Number(run.presentMs) || 0; + const timing = frameMs + ? "frame " + frameMs.toFixed(2) + "ms render " + + (Number(run.renderCpuMs) || 0).toFixed(2) + "ms" + + (presentMs ? " present " + presentMs.toFixed(2) + "ms" : "") : ""; + // The bottom-left corner belongs to a fighter's nameplate, so the read-out + // stacks upward from just above it instead of printing across a handle. The + // ammo row keeps its own lane a stat card further up, well clear of this. + const lane = playerHandleLayout(players[0], 0); + let y = lane.y - metaSize - 6; + // One line of proof per debug toggle: the console renders this read-out + // where no devtools can confirm it, so the Device Portal log gets told the + // row was actually drawn, with what, and where. + if (!debugPerfReported) { + debugPerfReported = true; + telemetry("FIGHT_DEBUG_PERF", rate + (timing ? " | " + timing : "") + + " | lane=" + Math.round(lane.x) + "," + Math.round(y) + + " session=" + sessionName); + } + for (const [index, label] of [rate + surface, timing].entries()) { + if (!label) continue; + const size = index ? debugReadoutTimingSize() : metaSize; + typeWrite(label, lane.x, y, size, ...ink); + y -= size + 5; + } +} + +// How many telemetry watchers are reading this round. The relay counts +// `role=agent` sockets apart from phone spectators and tells the publishing +// game; a host that has not wired that up answers nothing and the mark stays +// off. Note this can only ever see the live socket: the console's +// AC_NATIVE_PROFILE line goes out one way through OutputDebugStringA, so a +// Device Portal reading it is invisible from in here. +function linkedAgents() { + if (typeof capabilities !== "function") return 0; + return Math.max(0, Math.round(Number(capabilities().liveAgents) || 0)); +} + +// @jeffrey: "if we are in debug mode and reading telemetry on a device can we +// show a little agent icon to show our linked in connection on the telemetry of +// that round". An antenna'd head, so it cannot be read as the debug bug beside +// it or as one more human in the grandstand — a phone that scanned the round QR +// is a viewer and lights nothing here. The mark means a machine is reading +// these numbers right now. +function drawAgentLink(x, y, scale = 1, count = 1) { + const shell = [120, 226, 255]; + const detail = [10, 16, 30]; + // Antenna first so the head caps its stalk: the bulb on the air is the + // "linked" half of the mark and the head is the "agent" half. + filledCapsule(x, y - 5 * scale, x, y - 10 * scale, 1.6 * scale, shell); + filledDisc(x, y - 11 * scale, 2.2 * scale, shell); + filledCapsule(x - 4 * scale, y, x + 4 * scale, y, 12 * scale, shell); + filledDisc(x - 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledDisc(x + 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledCapsule(x - 3 * scale, y + 3 * scale, x + 3 * scale, y + 3 * scale, + 1.6 * scale, detail); + // A second watcher is rare enough to say plainly rather than by stacking + // heads sideways across a read-out that has no room for them. + if (count > 1) typeWrite(String(count), x + 13 * scale, y - 6 * scale, + Math.max(12, Math.round(13 * scale)), ...shell); +} + +// Connection health, as four bars and one number — the thing every online +// game owes a player and oskiewar had no way to say. @jeffrey: "can we show a +// connection health like wifi meter, on the top right of the game". +// +// The number is whatever this seat can honestly measure, which is not the same +// on both lanes: +// +// A rollback fight knows its round trip exactly (see netSendInputs: our own +// wall mark comes home on the rival's next packet), so it reports ping. +// A grandstand or an older-build guest never gets a packet back, so it can +// only measure the wire it is being served: how irregular the frames are and +// how many of them the relay ate. It reports jitter, and loss when there is +// any. +// A host in the streamed lane hears the rival only through pads, so its one +// honest reading is how long ago the last one arrived. +// +// Nothing is invented. A lane with no rival on it draws nothing at all. +const netHealthPalette = [[245, 90, 96], [250, 200, 80], [180, 235, 120], + [108, 240, 168]]; + +function netHealth() { + if (netSession) { + const stats = netSession.stats; + const ping = Math.round(stats.pingMs || 0); + // Nothing has come home yet; a meter that reads four bars before it has + // measured anything is a lie told at exactly the moment somebody is + // deciding whether the connection is good. + let bars = !stats.pings ? 0 + : ping < 50 ? 4 : ping < 100 ? 3 : ping < 170 ? 2 : 1; + // A desync means the two machines are no longer playing the same fight. + // The wire may be fast and the connection is still not healthy. + if (bars && stats.desyncs) bars = Math.min(bars, 1); + return { bars, label: stats.pings ? ping + "MS" : "···", + note: stats.desyncs ? "DESYNC" : "" }; + } + if (roundViewerMode === "LIVE" && roundViewerFrames.length) { + const jitter = Math.round(roundViewerJitterMs); + const loss = roundViewerLossPct; + const bars = jitter < 12 && loss < 3 ? 4 + : jitter < 30 && loss < 10 ? 3 + : jitter < 60 && loss < 25 ? 2 : 1; + return { bars, label: "±" + jitter + "MS", + note: loss ? loss + "% LOST" : "" }; + } + // The host's side of a streamed fight. Only while somebody is actually + // sitting in the second chair — an empty room has no connection to rate. + if (versusLane() && !roundViewer) { + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return null; + const age = Date.now() - remote.at; + if (age > versusChallengerGraceMs) return null; + return { bars: age < 150 ? 4 : age < 400 ? 3 : age < 1000 ? 2 : 1, + label: age + "MS", note: "" }; + } + return null; +} + +// Where the meter stands, and whether it stands at all. Split out so the rest +// of the top-right corner can measure around it: with no QR up the meter owns +// that corner, and a label that assumed the corner was free landed on it. +function netHealthBox() { + if (typeof capabilities === "function" && + (capabilities().socialPreview || capabilities().replayOven === true)) + return null; + if (shellMode !== "GAME") return null; + const health = netHealth(); + if (!health) return null; + const safe = hudSafeRect(); + const qr = spectatorQrBox(); + const compact = compactLayout(); + const bar = compact ? 5 : 7; + const gap = compact ? 3 : 4; + const tall = compact ? 19 : 26; + const count = 4; + const width = count * bar + (count - 1) * gap; + // Under the code, never over it: the QR is the address a friend types and + // the meter is a readout about the friend who already did. + const top = (qr ? qr.top + qr.size + 8 : safe.top) + 2; + // Sized off the bars rather than the HUD's own type scale: the reading is a + // caption to the meter, and at hudTypeSize it swamped the thing it labels. + const size = Math.max(14, Math.round(tall * .8)); + const label = health.note ? health.label + " " + health.note : health.label; + return { health, bar, gap, tall, count, width, top, base: top + tall, + right: safe.right, left: safe.right - Math.max(width, + handleWidth(label, size)), size, label }; +} + +// The left edge of whatever owns the top-right corner — the round's QR, or +// the connection meter when no code is up. Anything else that wants to sit up +// there measures from here instead of from the safe rect, or it draws on top +// of the corner's furniture. +function hudTopRightLeft() { + const qr = spectatorQrBox(); + if (qr) return qr.left; + return netHealthBox()?.left ?? hudSafeRect().right; +} + +function drawNetHealth(ink) { + const box = netHealthBox(); + if (!box) return; + const { health, bar, gap, tall, count, width, base, right, size, label } = box; + const lit = netHealthPalette[Math.max(0, health.bars - 1)]; + const dim = mixColor([58, 64, 78], [196, 201, 212], visualTheme.light); + const previousDepth = triangleDepth; + triangleDepth = -1.43; + for (let index = 0; index < count; index++) { + const height = Math.round(tall * (index + 1) / count); + const x = right - width + index * (bar + gap); + screenRect(x + 2, base - height + 2, bar, height, [24, 26, 34]); + screenRect(x, base - height, bar, height, + index < health.bars ? lit : dim); + } + const labelWidth = handleWidth(label, size); + const labelY = base + 7; + typeWrite(label, right - labelWidth + 2, labelY + 2, size, + ...contrastShadow(ink)); + typeWrite(label, right - labelWidth, labelY, size, + ...(health.note ? netHealthPalette[0] : ink)); + triangleDepth = previousDepth; +} + +function drawMapName(ink) { + const safe = hudSafeRect(), health = netHealthBox(), qr = spectatorQrBox(); + const label = currentMapName.toLowerCase(); + let size = compactLayout() ? 22 : 26; + while (size > 14 && handleWidth(label, size) > (safe.right - safe.left) * .35) size--; + const x = safe.right - handleWidth(label, size); + // Stack below connection/QR furniture; keep the center clear all round. + const y = Math.max(safe.top + 8, + health ? health.base + health.size + 21 : 0, + qr ? qr.top + qr.size + 14 : 0); + typeWrite(label, x + 2, y + 2, size, ...contrastShadow(ink)); + typeWrite(label, x, y, size, ...ink); +} + +function drawSpectatorQr(ink, placement = null) { + if (typeof globalThis.__oskiewarJevPad === 'function') return; + if (typeof capabilities === "function" && capabilities().socialPreview) return; + const qr = placement || spectatorQrBox(); + if (!qr) return; + const { count, quiet, cell, size, left, top } = qr; + // National identity flies beside the code, wherever the code goes. US + // first — more flags join as they are drawn. Reel placements opt out with + // the rest of the HUD furniture. + if (!placement && typeof capabilities === "function" && + capabilities().country === "US") + drawUsFlag(left - Math.round(hudTypeSize * 2.1) - 12, top + 2, + Math.round(hudTypeSize * 2.1), Math.round(hudTypeSize * 1.2), ink); + const shadow = [24, 26, 34]; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + screenRect(left + 3, top + 3, size, size, shadow); + screenRect(left, top, size, size, [250, 250, 247]); + // Dark modules coalesce into horizontal runs so a full code stays a few + // dozen faces instead of a few hundred — drawErrorQr already draws this way. + const dark = [7, 8, 14]; + for (let row = 0; row < count; row++) { + let run = 0; + for (let column = 0; column <= count; column++) { + if (column < count && spectatorQr.isDark(row, column)) { run++; continue; } + if (run) screenRect(left + (column - run + quiet) * cell, + top + (row + quiet) * cell, run * cell, cell, dark); + run = 0; + } + } + triangleDepth = previousDepth; +} + +// Framing marks rather than a full box: the corners state the bounds without +// drawing four lines through the fight. +function drawCornerCrops(rect, reach, width, color) { + const arm = Math.min(reach, (rect.right - rect.left) / 3, + (rect.bottom - rect.top) / 3); + for (const [x, towardX] of [[rect.left, 1], [rect.right, -1]]) + for (const [y, towardY] of [[rect.top, 1], [rect.bottom, -1]]) { + filledCapsule(x, y, x + towardX * arm, y, width, color); + filledCapsule(x, y, x, y + towardY * arm, width, color); + } +} + +function drawImpacts() { + for (const impact of impacts) { + if (impact.explosion && impact.blastRadius) { + const age = clamp(1 - impact.life / impact.duration, 0, 1); + const center = projectPoint(impact.x, impact.y - 3, impact.z || 0); + const edge = projectPoint(impact.x + impact.blastRadius, + impact.y - 3, impact.z || 0); + const radius = Math.abs(edge.x - center.x); + if ([center.x, center.y, radius].every(Number.isFinite) && radius < 4000) { + filledRing(center.x, center.y, radius, + Math.max(0, radius - Math.max(7, 22 * (1 - age))), + mixColor([255, 218, 86], [111, 74, 48], age)); + const shockRadius = radius * (.18 + age * .72); + filledRing(center.x, center.y, shockRadius, + Math.max(0, shockRadius - Math.max(4, 13 * (1 - age))), + mixColor([255, 246, 184], [164, 92, 52], age)); + } + } + for (const mote of impact.debris || []) { + const point = projectPoint(mote.x, mote.y, mote.z); + const radius = Math.max(2, mote.radius * cameraScale()); + if (![point.x, point.y, radius].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledDisc(point.x, point.y, radius, + impact.death ? [255, 105, 190] : [255, 232, 92]); + } + } +} + +function drawDetachedPart(fragment) { + const first = projectPoint(fragment.x1, fragment.y1, fragment.z1); + const second = projectPoint(fragment.x2, fragment.y2, fragment.z2); + const width = Math.max(2, fragment.width * cameraScale()); + const values = [first.x, first.y, second.x, second.y, width]; + if (!values.every(Number.isFinite) || width > 2000) return; + const margin = width + 4; + if (Math.abs(first.x) + margin > 30000 || + Math.abs(first.y) + margin > 30000 || + Math.abs(second.x) + margin > 30000 || + Math.abs(second.y) + margin > 30000 || + Math.hypot(second.x - first.x, second.y - first.y) > 30000) return; + filledCapsule(first.x, first.y, second.x, second.y, width + 3, [9, 12, 22]); + drawPaletteCapsule({ x1: first.x, y1: first.y, x2: second.x, y2: second.y, + width, part: fragment.part }, fragment.colors, + fragment.paletteCoordinate || 0, fragment.color); +} + +function drawSafeZones() { + if (!debugHitboxes || renderFlags.hud === false) return; + drawCornerCrops(hudSafeRect(), 46, 3, [255, 214, 84]); + drawCornerCrops(actionSafeRect(), 34, 2, [105, 255, 118]); +} + +// The head is the second door on the title screen. START is still anywhere — +// `tapTitle` in the shell makes the whole frame the button — so the one place +// that must NOT start a fight is the face, because that is where a player who +// wants to BE the fighter is already looking. The game publishes the head's +// screen circle and the shell hit-tests it ahead of the anywhere-button; the +// ring is drawn here rather than in the shell because only the game knows +// where the head went this frame. +// +// Nothing is drawn unless a wizard is actually mounted (`__oskiewarWizard`), +// so the Xbox and the reel renderer — which have no DOM to open — never show +// an affordance that would dud. +function drawTitleHeadDoor(t, ink, suppressed) { + const touch = globalThis.__oskiewarTouch; + if (!touch) return; + const onTitle = shellMode === "MENU" && titleTransitionAt === null; + if (!onTitle || suppressed || !globalThis.__oskiewarWizard) { + if (touch.titleHead) touch.titleHead = null; + return; + } + // Only over a seat that is actually yours. The attract loop's "action" + // variant dresses BOTH fighters as bots (`beginTraining`), and a ring that + // says "add yourself" on a bot's head invites a player to replace somebody + // who was never there. No local body on screen, no door. + const seat = players[0]; + if (!seat || !seat.alive || seat.npc || seat.bot) { touch.titleHead = null; return; } + const head = runnerWorldGeometry(seat, t).head; + if (!head) { touch.titleHead = null; return; } + // Radius in screen units is measured, not guessed: the title camera pushes + // in and out across the attract loop, and a fixed pixel radius would drift + // off the face. Same idiom the killcam tears use. + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(9, Math.hypot(edge.x - point.x, edge.y - point.y)); + const reach = radius * 1.22; + touch.titleHead = { x: point.x, y: point.y, radius: reach }; + // On the screen-UI lane, so a fighter standing in front of their own face + // cannot draw through the invitation. + triangleDepth = -1.42; + const pulse = (Math.sin(t * 2.4) + 1) / 2; + // Gold on its own rather than mixed toward the title ink: ink is near-white + // on the night sky and near-black at noon, so mixing gave a different — and + // on the light theme, muddy — colour every hour. The dark under-ring is what + // carries it across both, the same trick the type beside it uses. + const glow = mixColor([230, 205, 92], [255, 250, 226], pulse * .55); + const stroke = Math.max(1.5, radius * .085); + hudCircle(point.x, point.y, reach, stroke * 2.1, [16, 20, 34]); + hudCircle(point.x, point.y, reach, stroke, glow); + // The words ride a plate. A meditating fighter fills the whole column under + // their own chin, so unplated type landed on shoulders and arms and read as + // part of the body; the plate is dark on both themes because the gold is. + const label = "add yourself"; + const size = Math.max(11, Math.round(radius * .44)); + const width = handleWidth(label, size); + const padX = Math.round(size * .55), padY = Math.round(size * .34); + const left = point.x - width / 2; + const top = point.y + reach + size * .45; + hudBox(left - padX, top - padY, width + padX * 2, size + padY * 2, 16, 20, 34); + typeWrite(label, left, top, size, ...glow); +} + +function gamePaint() { + syncGameView(); + globalThis.__oskiewarLocalVersus = localVersusActive(); + const run = runtime(); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.screen = shellMode === "MENU" + ? titleTransitionAt !== null ? "title-transition" : "title" + : selecting ? "select" : "game"; + } + // Each fighter's cues sit where the fighter stands — @jeffrey: "can audio + // be mixed according to the player's position, stereo, for each player, if + // its not local multiplayer". Two humans on one couch share one speaker + // image, so their mix stays centered; against the machine — or a rival on + // the far end of a wire — the stage pans. + const couchVersus = !players[1].npc && !players[1].bot && + !players[1].remote && !selfPlay; + globalThis.__oskiewarPlayerPans = players.map((player) => couchVersus ? 0 : panPlayer(player)); + // The shell's resolution governor steers by this — the game's own measured + // rate, because the host's profile numbers never made it off the Xbox. + globalThis.__oskiewarDisplayFps = displayFps; + const paintAt = run.paintMonotonicUs ?? run.monotonicUs; + if (lastPaintAt > 0 && paintAt > lastPaintAt) { + const sample = clamp(1000000 / (paintAt - lastPaintAt), 1, 240); + displayFps = displayFps ? lerp(displayFps, sample, .12) : sample; + } + lastPaintAt = paintAt; + const t = (run.monotonicUs - startedAt) / 1000000; + if (typeof ac === "function") acFeed = ac(); + syncSignedInFighter(); + const localNation = typeof capabilities === "function" + ? String(capabilities().country || "").toUpperCase() : ""; + if (/^[A-Z]{2}$/.test(localNation)) { + players[0].nation = localNation; + if (!players[1].npc) players[1].nation = localNation; + } + // The remote rival's wardrobe came up the wire, not out of the roster — + // a profile lookup here would answer empty and strip them every frame. + for (const player of players) + if (!player.remote) player.handleColors = fighterProfile(player.name).colors; + visualTheme = displayTheme(); + const replayOven = typeof capabilities === "function" && + capabilities().replayOven === true; + const reelHud = typeof capabilities === "function" && + capabilities().reelHud === true; + const matchHud = !replayOven || reelHud; + // A reel is watched at arm's length with no controller in hand, and the + // corner furniture a player needs — nameplates, stats, inventory, the + // command stream — crowds a 9:16 crop and competes with the fight for the + // eye. So a reel carries no HUD at all while the round is live, and states + // the outcome afterward in the middle of the frame, one line at a time. + const reelMinimal = replayOven && reelHud && + capabilities().reelFullUi !== true; + triangleDepth = -1.4; + // The station uses a plain light or dark backdrop matching the HUD theme. + const space = !survivalActive(); + const mapColors = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const skyDay = mixColor([176, 215, 245], [255, 160, 112], + visualTheme.sunset * .7); + const sky = space ? mixColor(mapColors.sky.map(c => Math.round(c * .08)), mapColors.sky, visualTheme.light) + : mixColor([7, 8, 28], skyDay, visualTheme.light); + // Match the clear color to the arena sky. Camera framing can reveal the + // clear layer during a jump; a different clear color looked like a flash. + const outside = sky; + // Keep the room's planes materially distinct: blue atmosphere, warm plaster + // behind the fighters, and green earth under them. Day/night can tint the + // palette without washing every surface into the same gray. + const arenaDay = mixColor([244, 211, 178], [235, 154, 150], + visualTheme.sunset * .48); + const arena = mixColor([24, 18, 42], arenaDay, visualTheme.light); + // Pale steel in light mode stays distinct from the brighter backdrop. + const groundDay = mixColor([142, 184, 116], [190, 151, 103], + visualTheme.sunset * .38); + const ground = space + ? mixColor(mapColors.floor.map(c => Math.round(c * .32)), mapColors.floor, visualTheme.light) + : mixColor([13, 25, 29], groundDay, visualTheme.light); + // The floating decks are steel with a lit edge. The plate itself stays + // near the hull's own value — a near-white slab against vacuum reads as a + // UI bar laid over the game rather than as a thing in it — and the LIP + // carries the brightness instead, which is the part a player actually has + // to judge. On plaster the relationship is the other way round: the deck is + // the pale thing and the lip is the dark line under it, because there the + // background is what is bright. + const platformColor = space + ? mixColor(mapColors.deck.map(c => Math.round(c * .42)), mapColors.deck, visualTheme.light) + : mixColor([24, 29, 46], [211, 198, 171], visualTheme.light); + const titleInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + const statusShadow = contrastShadow(titleInk); + const menuArena = mixColor([7, 10, 26], [235, 241, 248], visualTheme.light); + const menuPanel = mixColor([20, 28, 56], [215, 225, 239], visualTheme.light); + const menuInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + renderFlags = globalThis.__oskiewarRenderFlags || renderFlags; + wipe(...outside); + if (renderFlags.sky !== false) drawSkyAtmosphere(sky, arena); + if (PAL_SELECT && selecting) { + box(0, 0, viewWidth(), viewHeight, ...menuArena); + drawSelectionScreen(t, menuInk, menuPanel); + return; + } + const cinematicAge = deathCinematicAge(run.monotonicUs); + const introAge = run.monotonicUs - roundStartedAt; + const inRoundIntro = !roundResult && introAge >= 0 && + introAge < roundIntroDurationUs(); + // The intro deliberately owns its lens: wide title, two face portraits, + // then a pullback. Final-frame containment would widen every portrait until + // both fighters fitted, erasing the zoom story it was meant to protect. + if (!inRoundIntro && (cinematicAge < 0 || cinematicAge >= 1.45)) + containFighters(t); + cameraDoll.prepare(); + const { left: spanLeft, right: spanRight, + top: spanTop, bottom: spanBottom } = terrainSpan(); + if (!airRoundActive()) drawRoomSurfaces(spanLeft, spanRight, spanTop, spanBottom, arena); + // The reel camera puts the floor's own front edge (worldNear) in front of + // the lens, where it crosses the frame as a hard horizontal step with the + // skirt showing under it. Extending the slab past the camera hands the cut + // to the near plane, which faces already handle correctly, so the ground + // reads as ground all the way down the frame. Past the camera means PAST + // THE CAMERA — a fixed extension was still shy of the wide fight shot, + // which stands several thousand units back, and the step came back on + // every wide frame. Reels only: on the TV lens the visible front edge IS + // the padded-room look. + const groundNear = reelGroundCamera() + ? Math.min(worldNear, cameraDoll.position.z - 400) : worldNear; + if (airRoundActive()) drawAirDropSky(t); + else { + drawTerrainBackWall(spanLeft, spanRight, worldFar, ground); + drawTerrainSurface(spanLeft, spanRight, groundNear, worldFar, ground); + drawTerrainFrontWall(spanLeft, spanRight, groundNear, ground); + drawSkateParkFeatures(); + } + // No grass in vacuum. The blades were the tower's lawn and the cube kept + // them out of habit; on a hull they read as moss on a spaceship. + if (renderFlags.grass !== false && !space) + drawTerrainGrass(spanLeft, spanRight, ground); + if (!airRoundActive()) drawBoosterPad(t); + const platformNear = -520; + const platformFar = 520; + // A rung wants to be a slab, but the stage paints in order with no depth + // buffer — the volume's faces landed over the fighters on console. So each + // one is a plane plus a front-edge line: the plane is the deck a fighter + // stands on, and the line is the lip, which is what keeps a rung readable + // when the camera happens to sit at its height and the deck goes edge-on. + // The line rides the line layer, so twelve rungs cost twenty-four faces and + // the lips cost none. The span clamp is the same one the terrain uses, and + // in a room this size its 2600-unit apron usually covers everything — it is + // here to bound the worst case, not because it culls much today. + const ledgeInk = space + ? mixColor(platformColor, [196, 224, 255], .62) + : mixColor(platformColor, [26, 24, 34], .42); + if (platformsEnabled()) for (const ledge of activeLedges()) { + if (ledge.right < spanLeft || ledge.left > spanRight) continue; + if (ledge.y < spanTop || ledge.y > spanBottom) continue; + const ledgeLeft = Math.max(ledge.left, spanLeft); + const ledgeRight = Math.min(ledge.right, spanRight); + if (ledgeLeft >= ledgeRight) continue; + worldQuad( + { x: ledgeLeft, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformFar }, + { x: ledgeLeft, y: ledge.y, z: platformFar }, platformColor); + worldLine(ledgeLeft, ledge.y, platformNear, + ledgeRight, ledge.y, platformNear, 5, ledgeInk); + } + if (workshopHighlight && globalThis.__oskiewarWorkshopEnabled) { + for (const player of players) { + const x = player.spawnX, y = terrainFloorAt(x); + const ink = player.pad === 0 ? [80, 240, 255] : [255, 100, 210]; + worldLine(x - 55, y - 4, -50, x + 55, y - 4, -50, 6, ink); + worldLine(x, y, 0, x, y - 240, 0, 6, ink); + worldLine(x, y - 240, 0, x + 65, y - 210, 0, 6, ink); + } + } + drawSurvivalLava(t); + const shadowInk = mixColor([3, 5, 14], [92, 99, 101], + visualTheme.light * .72); + if (renderFlags.shadows !== false && !airRoundActive()) { + for (const player of activePlayers()) + if (player.alive || roundResult) + drawSpotShadow(player.x, player.y, player.z, player.ducking ? 52 : 64, + shadowInk); + for (const item of balls) + if (item.active) + drawSpotShadow(item.x, item.y, item.z, item.radius * 1.18, shadowInk); + } + const windInk = windDirection < 0 + ? mixColor([72, 174, 255], [28, 88, 188], visualTheme.light) + : mixColor([255, 92, 132], [184, 35, 62], visualTheme.light); + if (WIND_FLAG && shellMode === "GAME") drawWindFlag(t, windInk); + // The round keeps match time and spectator state only. Time of day belongs + // to the title screen; carrying it into gameplay confused two unrelated + // clocks and spent the top-right lane on non-match information. + if (matchHud && !reelMinimal && shellMode === "GAME" && gameplayStarted) { + const timedRound = roundIsTimed(); + const remainingSeconds = roundResult || !timedRound ? 0 : Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + const timerText = !roundResult && timedRound + ? String(remainingSeconds).padStart(2, "0") : ""; + const hud = hudSafeRect(); + const timerSize = hudTypeSize; + if (timerText) { + const timerWidth = handleWidth(timerText, timerSize); + const timerDanger = timedRound && remainingSeconds > 0 && + remainingSeconds <= 10; + const timerShake = timerDanger + ? Math.sin(t * 35) * (11 - remainingSeconds) * .45 : 0; + const timerInk = timerDanger + ? mixColor(titleInk, [235, 38, 58], (11 - remainingSeconds) / 10) + : titleInk; + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake, + hud.top + 2, timerSize, ...timerInk); + } + if (roundViewer) { + const viewerLabel = roundViewer.seat === "challenger" + ? roundViewerMode === "LIVE" ? "VS" : "WAITING FOR HOST" + : roundViewerMode || roundViewerStatus; + // Left of the corner's furniture, never on it: that corner is the + // round's QR, or the connection meter when there is no code up. + const labelSize = 24; + const labelRight = hudTopRightLeft() - 14; + typeWrite(viewerLabel, + labelRight - handleWidth(viewerLabel, labelSize), hud.top + 7, + labelSize, ...(roundViewerMode === "LIVE" ? [210, 42, 62] : titleInk)); + // The chair-holder plays through this feed: say which body is theirs + // while the matchup is still fresh, then get out of the fight's way. + if (roundViewer.seat === "challenger" && roundViewerMode === "LIVE" && + t < 8) { + const seatLine = "YOU ARE " + + (players[1].name || "THE SECOND FIGHTER") + " — RIGHT SIDE"; + const seatSize = compactLayout() ? 13 : 17; + const seatWidth = handleWidth(seatLine, seatSize); + typeWrite(seatLine, viewCenterX() - seatWidth / 2, + hud.top + hudTypeSize + 16, seatSize, ...titleInk); + } + } + const nowMs = run.unixMs || Date.now(); + drawHudStatusTray(null, titleInk, nowMs); + const updateReady = typeof capabilities === "function" && + capabilities().updateReady === true; + if (updateReady) { + const label = "update ready"; + const size = Math.round(hudTypeSize * .58); + const width = handleWidth(label, size); + const x = hudTopRightLeft() - 14 - width; + const y = hud.top + hudTypeSize + 12; + typeWrite(label, x + 2, y + 3, size, ...contrastShadow(titleInk)); + typeWrite(label, x, y, size, ...titleInk); + if (globalThis.__oskiewarTouch) + globalThis.__oskiewarTouch.updateButton = + { x: x - 8, y: y - 6, width: width + 16, height: size + 12 }; + } else if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.updateButton = null; + } + } + if (!survivalActive()) { + for (const tree of bodyTrees) drawBodyTree(tree, t); + for (const pickup of gunPickups) drawGunPickup(pickup, t); + for (const pickup of saberPickups) drawSaberPickup(pickup, t); + for (const pickup of grenadePickups) drawGrenadePickup(pickup, t); + } + const showRunnerLabels = matchHud && !reelMinimal && + (Boolean(roundResult) || introAge >= roundIntroDurationUs()); + const viewDirection = normalize3({ + x: cameraDoll.target.x - cameraDoll.position.x, + y: cameraDoll.target.y - cameraDoll.position.y, + z: cameraDoll.target.z - cameraDoll.position.z, + }); + const renderables = [ + ...bullets.map((item) => ({ + kind: "bullet", item, x: item.x, y: item.y, z: item.z })), + ...grenades.filter((item) => item.alive).map((item) => ({ + kind: "grenade", item, x: item.x, y: item.y, z: item.z })), + ...balls.filter((item) => item.active).map((item) => ({ + kind: "ball", item, x: item.x, y: item.y, z: item.z })), + ...detachedParts.map((item) => ({ kind: "detached", item, + x: (item.x1 + item.x2) / 2, y: (item.y1 + item.y2) / 2, + z: (item.z1 + item.z2) / 2 })), + // Both fighters are always in this list. A fighter is never removed from + // the frame to make a camera move work — the shot is what moves. + ...activePlayers().map((item) => ({ + kind: "player", item, x: item.x, y: item.y, z: item.z })), + ]; + const depth = (item) => dot3({ + x: item.x - cameraDoll.position.x, + y: item.y - cameraDoll.position.y, + z: item.z - cameraDoll.position.z, + }, viewDirection); + renderables.sort((a, b) => depth(b) - depth(a)); + for (const renderable of renderables) { + triangleDepth = projectPoint(renderable.x, renderable.y, renderable.z).z; + if (renderable.kind === "bullet") drawBullet(renderable.item); + else if (renderable.kind === "grenade") drawGrenade(renderable.item); + else if (renderable.kind === "ball") drawBall(renderable.item); + else if (renderable.kind === "detached") drawDetachedPart(renderable.item); + else { + drawDiveMotion(renderable.item, t); + drawDoubleJumpMotion(renderable.item, t); + drawRunner(renderable.item, t, showRunnerLabels); + } + } + // Debug geometry sits above the world but below the -1.42 screen-UI lane. + // It must remain visible through fighter bodies without cutting across the + // title, controls, command notation, names, clock, or other HUD furniture. + triangleDepth = -1.4; + drawDebugHitboxes(players[0], t); + if (!survivalActive()) for (const player of players.slice(1)) drawDebugHitboxes(player, t); + for (const player of players) drawBotScene(player); + drawBallHitboxes(); + drawSafeZones(); + triangleDepth = -1.42; + // On the SCREEN UI layer, not the debug-geometry one above it. The meter is + // an instrument being read rather than scenery in the room, and the layering + // test is what caught it sitting at the debug depth where a tall enough + // piece of world could have drawn straight through it. + drawFrameMeter(); + drawImpacts(); + drawTitleHeadDoor(t, titleInk, reelMinimal); + const counting = !roundResult && introAge < roundIntroDurationUs(); + // The matchup card announces two names in the middle of the screen, which + // is exactly where the wordmark sits. On the entry fight the word wins. + if (matchHud && !reelMinimal && counting && shellMode === "GAME") + survivalActive() + ? drawSurvivalIntro(titleInk, statusShadow) + : drawFightIntro(introAge / 1000000, titleInk, statusShadow); + // The keys belong wherever a newcomer is looking: under the wordmark on the + // way in, and again while a round counts itself off. Self-play has no + // newcomer — two bots need no tutorial, and neither does a reel of them. + // The legend is the stable key for the score written beneath it. Keep it + // present throughout every player-controlled screen; only unattended bot + // self-play and marketing reels have no learner to serve. + if (!replayOven && !selfPlay && renderFlags.keys !== false) + drawControlLegend(titleInk); + const resultUiReady = cinematicAge < 0 || cinematicAge >= 1.1; + // A reel opens on the matchup. Both names, both palettes, stacked up top + // where the fighters are not — a stranger scrolling past should know who is + // who before the first hit lands. It clears out early so the round itself + // still plays under nothing at all. + if (reelMinimal && shellMode === "GAME" && !roundResult && + introAge / 1000000 < REEL_MATCHUP_SECONDS) { + const nameSize = compactLayout() ? 40 : 54; + const top = Math.round(viewHeight * .14); + const names = activePlayers(); + for (let side = 0; side < names.length; side++) { + drawReelName(String(names[side].name).toLowerCase(), + top + side * Math.round(nameSize * 1.5), nameSize, names[side], t); + } + } + if (matchHud && survivalActive() && shellMode === "GAME" && + gameplayStarted && !roundResult && !counting) + drawSurvivalHud(titleInk); + if (survivalActive() && roundResult && resultUiReady) { + drawSurvivalResult(titleInk, statusShadow); + } else if (reelMinimal && roundResult && resultUiReady) { + // One fact, in the middle of the frame: who won. The recording stops on + // the result card, so anything queued behind the name would never survive + // the trim — and a name alone is the whole story a reel owes a stranger. + const result = resultCardText(); + const winnerSize = compactLayout() ? 46 : 64; + // Up top, where the fight is not. The celebration push puts the winner's + // head in the middle of the frame, so a name anywhere near center lands on + // their face. + const champion = players.find((player) => + String(player.name).toLowerCase() === result.winner) || null; + drawReelName(result.winner, Math.round(viewHeight * .17), + winnerSize, champion, t); + } else if (matchHud && roundResult && resultUiReady) { + if (INSTANT_REPLAY && instantReplay) { + const frame = Math.min(instantReplay.frames.length, + Math.floor(instantReplay.cursor) + 1); + const replayLabel = "REPLAY " + frame + "/" + instantReplay.frames.length; + typeWrite(replayLabel, viewCenterX() - replayLabel.length * 10, + 820, 30, ...titleInk); + drawCenteredKeycapRun(replayControlKeys(instantReplay.paused), + 940, 19, inputPads[0]?.down || [], titleInk); + } else { + const result = resultCardText(); + // The result is a small ownership mark, not a second title screen. + // Character reactions carry the emotional result in the arena. + const winnerSize = compactLayout() ? 30 : 42; + const winnerWidth = handleWidth(result.winner, winnerSize); + const resultY = hudSafeRect().top + 62; + typeWrite(result.winner, viewCenterX() - winnerWidth / 2 + 3, resultY + 4, + winnerSize, ...statusShadow); + typeWrite(result.winner, viewCenterX() - winnerWidth / 2, resultY, + winnerSize, ...titleInk); + if (result.action) { + const actionSize = Math.min(44, winnerSize * .54); + const actionWidth = handleWidth(result.action, actionSize); + typeWrite(result.action, viewCenterX() - actionWidth / 2 + 3, 900, + actionSize, ...statusShadow); + typeWrite(result.action, viewCenterX() - actionWidth / 2, 896, + actionSize, ...titleInk); + } + if (!roundViewer && INSTANT_REPLAY) { + drawCenteredKeycapRun(replayOfferKeys(), 940, 19, + inputPads[0]?.down || [], titleInk); + } + } + } + // Nameplates and stats wait for the wordmark to lift; the entry frame is + // the word, the keys, and the two fighters, and nothing else. + if (!survivalActive() && matchHud && !reelMinimal && shellMode === "GAME" && + ((roundResult && resultUiReady) || + (!roundResult && introAge >= roundIntroDurationUs()))) { + const hudPlayers = spatialHudPlayers(); + for (let side = 0; side < hudPlayers.length; side++) { + const player = hudPlayers[side]; + drawPlayerHandle(player, t, side); + drawPlayerStats(player, side, t); + drawHudInventory(player, side); + drawCommandStream(player, side); + } + } + if (!survivalActive() && replayOven && capabilities().reelFullUi === true && + shellMode === "GAME") + drawReelSectionProgress(run.monotonicUs, titleInk); + if (!replayOven) drawDebugPerformance(titleInk); + drawDeathFlash(); + if (shellMode === "MENU") { + const transitionAge = titleTransitionAt !== null + ? (run.monotonicUs - titleTransitionAt) / 1000000 : -1; + drawTitleScreen(t, menuInk, transitionAge); + if (transitionAge >= 0) return; + } + if (!replayOven) { + // Over the fighters, deliberately: the lobby's lone body stands center + // frame, and an instruction painted under it was an instruction hidden. + if (!reelMinimal) drawVersusHud(t, titleInk, run); + drawSpectatorQr(titleInk); + if (!reelMinimal) drawNetHealth(titleInk); + if (matchHud && !reelMinimal && renderFlags.hud !== false && + shellMode === "GAME" && !survivalActive()) drawMapName(titleInk); + drawTouchControls(); + if (localVersusActive() && localControllerMissing !== -1) { + const label = "reconnect player " + (localControllerMissing + 1); + const size = compactLayout() ? 30 : 48; + const width = handleWidth(label, size); + const left = viewCenterX() - width / 2; + const top = viewHeight * .43; + box(left - 20, top - 16, width + 40, size + 32, 9, 12, 22); + typeWrite(label, left, top, size, 255, 235, 130); + } + } +} + +// The raw pad words remember() files between real moves. The training floor +// captions moves, not fingers — "KICK" teaches, "B" nags. +const versusLabelNoise = new Set(["NONE", "UP", "DOWN", "LEFT", "RIGHT", + "A", "B", "X", "Y", "LB", "RB", "VIEW", "MENU"]); + +// The lobby's interface is a challenge and a code: fight a friend, share +// the address, and until they arrive every move the lone fighter makes is +// named back at them — the empty room as training mode. +function drawVersusHud(t, ink, run) { + if (!versusLane() || shellMode !== "GAME") return; + if (!lobbyActive()) return; + const hud = hudSafeRect(); + const compact = compactLayout(); + const door = versusDoor(); + // Behind the door the address is a lie: nothing is published, so nobody + // could arrive at it. Say what is actually in the way instead. The panel + // that takes the email or the handle is the shell's, over the top of this; + // this is the part that stays legible on a television across a room. + const headline = door === "login" ? "SIGN IN TO PLAY" + : door === "handle" ? "CHOOSE A HANDLE" : "WAITING ROOM"; + const headSize = compact ? 30 : 44; + const pulse = .5 + Math.sin(t * 2.4) * .5; + const headInk = mixColor(ink, [235, 205, 74], .35 + pulse * .45); + const headWidth = handleWidth(headline, headSize); + const headX = viewCenterX() - headWidth / 2; + const headY = hud.top + (compact ? 30 : 42); + typeWrite(headline, headX + 3, headY + 3, headSize, ...contrastShadow(ink)); + typeWrite(headline, headX, headY, headSize, ...headInk); + const address = door === "login" + ? "A FIGHT NEEDS A NAME ON BOTH ENDS" + : door === "handle" ? "YOUR HANDLE IS WHAT THE FIGHT WRITES DOWN" + : "FIGHT A FRIEND OSKIEWAR.COM/" + versusRoomName.toUpperCase(); + const addressSize = compact ? 16 : 23; + const addressWidth = handleWidth(address, addressSize); + const addressY = headY + headSize + 10; + typeWrite(address, viewCenterX() - addressWidth / 2 + 2, addressY + 2, + addressSize, ...contrastShadow(ink)); + typeWrite(address, viewCenterX() - addressWidth / 2, addressY, + addressSize, ...ink); + const player = players[0]; + // The death card owns the middle of the screen for the whole down beat — + // the loop is die, read it, stand back up whole. + if (!player.alive) { + const deadLabel = "YOU DIED"; + const deadSize = compact ? 44 : 66; + const deadWidth = handleWidth(deadLabel, deadSize); + const deadX = viewCenterX() - deadWidth / 2; + const deadY = Math.round(viewHeight * .44 + Math.sin(t * 3.2) * 3); + typeWrite(deadLabel, deadX + 4, deadY + 4, deadSize, + ...contrastShadow(ink)); + typeWrite(deadLabel, deadX, deadY, deadSize, + ...mixColor(ink, [235, 38, 58], .8)); + return; + } + if (!player.lastButtonAt || versusLabelNoise.has(player.lastButton)) return; + const age = (run.monotonicUs - player.lastButtonAt) / 1000000; + if (age < 0 || age > .9) return; + // The caption swells on landing and lets go through the tail — spoken, + // not filed. + const fade = 1 - age / .9; + const moveSize = Math.round((compact ? 26 : 38) * (1.06 - fade * .06)); + const moveWidth = handleWidth(player.lastButton, moveSize); + const moveX = viewCenterX() - moveWidth / 2; + const moveY = Math.round(viewHeight * .62) - Math.round((1 - fade) * 26); + const moveInk = fade > .4 ? ink : mixColor(contrastShadow(ink), ink, fade / .4); + typeWrite(player.lastButton, moveX + 3, moveY + 3, moveSize, + ...contrastShadow(ink)); + typeWrite(player.lastButton, moveX, moveY, moveSize, ...moveInk); +} + +function boot() { + try { + gameBoot(); + } catch (error) { + captureClientError("boot", error); + } +} + +function sim() { + if (!netSession && performanceStageActive()) return; + if (clientError) { restartAfterClientError(); return; } + try { + netDrainHostInbox(); + if (netSession) netTick(); + else gameSim(); + } catch (error) { + captureClientError("sim", error); + } +} + +function paint() { + if (drawPerformanceStage()) return; + if (clientError) { + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + return; + } + const previousMath = Math; + Math = platformMath; // Display-only geometry can use the host's fast intrinsics. + const restore = beginRenderInterpolation(runtime().renderAlpha ?? 1); + sharingRenderPoses = true; + try { + gamePaint(); + drawPerformanceFooter(); + } catch (error) { + captureClientError("paint", error); + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + } finally { + sharingRenderPoses = false; + renderPoses.clear(); + restore(); + Math = previousMath; + } +} +function act() {} +function leave() { + try { + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + } catch (error) { + captureClientError("leave", error); + } +} + + +function performanceStageActive() { + const stage = globalThis.__oskiewarStageState; + return Boolean(stage?.curtain || stage?.performance?.active); +} + +// A room-performance display: the transport supplies title, time and notes; +// it never touches fighter physics or creates a second musical soundtrack. +function drawPerformanceStage() { + const stage = globalThis.__oskiewarStageState; + if (!performanceStageActive()) return false; + syncGameView(); + wipe(3, 5, 10); + if (stage.curtain) { drawCurtainDirections(stage); return true; } + const music = stage.performance; + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp(Number(music.elapsed) + (music.playing ? age : 0), 0, Number(music.duration) || 0); + const duration = Math.max(0, Number(music.duration) || 0); + const width = viewWidth(), center = viewCenterX(); + const pulse = clamp(Number(music.intensity) || 0, 0, 1); + const t = elapsed; + triangleDepth = -.8; + for (let index = 0; index < 2; index++) { + const note = music.notes?.[index % Math.max(1, music.notes?.length || 1)]; + const singing = music.playing && Number.isFinite(note); + const level = singing ? .25 + pulse * .75 : pulse * .35; + const radius = Math.min(width * .12, 116); + const x = center + (index ? 1 : -1) * Math.min(width * .19, 225); + const y = viewHeight * .43 + platformMath.sin(t * 1.7 + index * 1.8) * (5 + level * 6); + const color = index ? [77, 188, 222] : [239, 133, 152]; + filledDisc(x, y, radius, color); + triangleDepth = -.85; + const ink = [12, 19, 35]; + const blink = platformMath.sin(t * .73 + index * 2.1) > .988; + for (const side of [-1, 1]) { + const ex = x + side * radius * .32, ey = y - radius * .18; + if (blink) filledCapsule(ex - radius * .09, ey, ex + radius * .09, ey, radius * .055, ink); + else { + filledDisc(ex, ey, radius * .085, ink); + filledDisc(ex + radius * .019, ey - radius * .026, radius * .025, [245, 248, 255]); + } + } + const mouthY = y + radius * .3; + filledCapsule(x - radius * .12, mouthY, x + radius * .12, mouthY, + radius * (.055 + level * .26), ink); + triangleDepth = -.8; + } + const title = String(music.title || "Untitled composition").slice(0, 110); + let size = 38; + while (size > 18 && handleWidth(title, size) > width - 72) size -= 2; + typeWrite(title, center - handleWidth(title, size) / 2, viewHeight - 126, size, 240, 243, 251); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 20) / 2, viewHeight - 76, 20, 150, 168, 193); + const trackWidth = Math.min(width - 100, 620), left = center - trackWidth / 2; + hudBox(left, viewHeight - 37, trackWidth, 4, 31, 42, 61); + if (duration) hudBox(left, viewHeight - 37, trackWidth * elapsed / duration, 4, 105, 205, 213); + return true; +} + +// The composition remains visible during a fight, independently of the +// full-screen performance mode. Its lane replaces the debug session label. +function performanceFooterVisible() { + const stage = globalThis.__oskiewarStageState; + const music = stage?.performance; + return Boolean(!stage?.curtain && music?.title && + (music.playing || music.phase === "countdown" || music.phase === "stale")); +} +function drawPerformanceFooter() { + if (!performanceFooterVisible()) return; + const stage = globalThis.__oskiewarStageState, music = stage.performance; + const duration = Math.max(0, Number(music.duration) || 0); + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp((Number(music.elapsed) || 0) + (music.playing ? age : 0), 0, duration); + const width = Math.min(viewWidth() * .66, 1000), center = viewCenterX(); + const left = center - width / 2, top = viewHeight - 88; + const previousDepth = triangleDepth; + triangleDepth = -1.49; + // Use screen rectangles so the Xbox's GPU pass does not cover the strip. + screenRect(left, top, width, 74, [8, 14, 25]); + const title = String(music.title).slice(0, 110); + let size = 25; + while (size > 16 && handleWidth(title, size) > width - 24) size--; + typeWrite(title, center - handleWidth(title, size) / 2, top + 7, size, 243, 247, 255); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 17) / 2, top + 42, 17, 166, 189, 213); + screenRect(left + 12, top + 68, width - 24, 3, [36, 51, 68]); + if (duration) screenRect(left + 12, top + 68, (width - 24) * elapsed / duration, 3, [105, 222, 213]); + triangleDepth = previousDepth; +} + +function drawCurtainDirections(stage = globalThis.__oskiewarStageState) { + const width = viewWidth(), center = viewCenterX(), left = center - width / 2; + const music = stage?.performance; + const age = Math.max(0, (Date.now() - (stage?.receivedAt || Date.now())) / 1000); + const elapsed = (Number(music?.elapsed) || 0) + Math.min(age, 1); + const lyrics = music?.curtainStyle !== "directions" && music?.playing && age < 2.5 + ? (music.lyrics || []).filter(line => elapsed >= line.start - 1.5 && elapsed < line.end + .35).slice(0, 3) : []; + // Wall-clock motion continues while both match simulations are frozen. + const time = Date.now() / 1000; + const palette = [[244, 128, 179], [91, 215, 227], [163, 223, 91], [255, 191, 90], [169, 142, 248]]; + triangleDepth = -1; + for (let lane = 0; lane < 2; lane++) { + const spacing = width / 5, length = spacing * .47, height = length * .55; + const y = viewHeight * (lane ? .85 : .16); + for (let index = -1; index < 6; index++) { + const x = left + index * spacing + ((time * width * .12 + lane * spacing * .5) % spacing); + const base = palette[((index + lane * 2) % 5 + 5) % 5]; + const glow = .52 + .3 * platformMath.sin(time * 2.4 - index * .8); + const color = base.map(v => Math.round(v * glow)); + screenRect(x, y - height * .13, length * .58, height * .26, color); + screenTriangle(x + length * .5, y - height / 2, + x + length, y, x + length * .5, y + height / 2, ...color); + } + } + drawCurtainFighter(left + width * (lyrics.length ? .08 : .24), + viewHeight * (lyrics.length ? .68 : .52), Math.min(width, viewHeight) * (lyrics.length ? .052 : .095), time); + if (lyrics.length) { + for (let row = 0; row < lyrics.length; row++) { + const line = lyrics[row], words = line.words || []; + const text = words.map(word => word.text).join(" "); + let size = Math.min(50, width * .043); + while (size > 16 && handleWidth(text, size) > width * .82) size--; + const y = viewHeight * (.4 + (row - (lyrics.length - 1) / 2) * .16); + let x = center - handleWidth(text, size) / 2; + const color = /^#[a-f0-9]{6}$/i.test(line.color || "") + ? [1, 3, 5].map(i => parseInt(line.color.slice(i, i + 2), 16)) : [163, 223, 91]; + for (const word of words) { + const active = elapsed >= word.start && elapsed < word.end; + const ink = elapsed < word.start ? [129, 141, 158] : color; + typeWrite(word.text, x, y, size, ...ink); + const w = handleWidth(word.text, size); + if (active) screenRect(x, y + size * 1.18, w, Math.max(2, size * .06), color); + x += handleWidth(word.text + " ", size); + } + } + return; + } + const label = "look that way ->", size = Math.min(46, width * .045); + typeWrite(label, center - handleWidth(label, size) / 2, + viewHeight * .68, size, 229, 240, 248); + // A large arrow completes the character's pointing gesture. + const x = center + width * .04, y = viewHeight * .46, length = width * .27; + const color = palette[Math.floor(time / 2) % palette.length]; + screenRect(x, y - length * .07, length * .6, length * .14, color); + screenTriangle(x + length * .55, y - length * .26, + x + length, y, x + length * .55, y + length * .26, ...color); +} + +function drawCurtainFighter(x, y, r, time) { + const bob = platformMath.sin(time * 3) * r * .05; + y += bob; + const ink = [20, 29, 42], skin = [166, 225, 103], boot = [239, 125, 166]; + triangleDepth = -.9; + filledCapsule(x, y + r * .8, x - r * .38, y + r * 1.7, r * .16, skin); + filledCapsule(x, y + r * .8, x + r * .45, y + r * 1.7, r * .16, skin); + filledCapsule(x - r * .52, y + r * 1.72, x - r * .2, y + r * 1.72, r * .17, boot); + filledCapsule(x + r * .4, y + r * 1.72, x + r * .78, y + r * 1.72, r * .17, boot); + filledCapsule(x, y + r * .26, x, y + r * .86, r * .26, boot); + filledCapsule(x + r * .1, y + r * .38, x + r * 1.35, y + r * .13, r * .13, skin); + filledDisc(x + r * 1.35, y + r * .13, r * .19, skin); + filledCapsule(x + r * 1.3, y + r * .05, x + r * 1.68, y + r * .05, r * .08, skin); + filledDisc(x, y - r * .62, r, skin); + // Eyes and nose sit on the right side: gaze agrees with the gesture. + triangleDepth = -1.05; + for (const ex of [x + r * .12, x + r * .62]) { + filledDisc(ex, y - r * .82, r * .22, [243, 248, 232]); + filledDisc(ex + r * .09, y - r * .8, r * .095, ink); + } + filledDisc(x + r * .98, y - r * .44, r * .18, skin); + filledCapsule(x + r * .33, y - r * .13, x + r * .7, y - r * .18, r * .055, ink); + triangleDepth = -1; +} diff --git a/xbox/live/oskiewar.js.pre-trio b/xbox/live/oskiewar.js.pre-trio new file mode 100644 index 0000000000..050eeff4c6 --- /dev/null +++ b/xbox/live/oskiewar.js.pre-trio @@ -0,0 +1,17231 @@ +// @bundle-qr +// The console's monotonic clock can hand back a negative number: App.cpp +// converts QPC ticks with `counter * 1000000`, which overflows int64 past +// about ten days of uptime. Every deadline in this piece starts at 0 and is +// compared with `now >=` or `now <`, so a negative clock made `hitStunUntil` +// permanently in the future -- no attack could fire and no round could be +// won -- stranded the title, silenced the input log, and indexed off the +// front of a palette. Rebase once, here, so time starts at zero whatever the +// host reports. The host builds a fresh object per call, so this rewrites +// that copy rather than allocating another. +const hostRuntime = runtime; +let clockEpoch = null; +// Rollback netplay's hooks into the clock and the side effects. The session +// itself lives further down (search "Rollback netplay"); these four sit here +// because the wrapper below and the signal emitters read them. +let netSession = null; +// Windows and Linux libm differ by a few ULPs. Network simulation uses the +// same elementary operations on both hosts, including geometry sampled for +// collision. Keep native math for ordinary local play. +const platformMath = globalThis.Math; +let Math = Object.create(platformMath); +function netSin(x) { + x %= 6.283185307179586; + if (x > 3.141592653589793) x -= 6.283185307179586; + if (x < -3.141592653589793) x += 6.283185307179586; + if (x > 1.5707963267948966) x = 3.141592653589793 - x; + if (x < -1.5707963267948966) x = -3.141592653589793 - x; + const square = x * x; + return x * (1 + square * (-.16666666666666666 + square * + (.008333333333333333 + square * (-.0001984126984126984 + square * + (.0000027557319223985893 + square * (-.00000002505210838544172 + square * + (.00000000016059043836821615 + square * (-.0000000000007647163731819816 + square * + (.0000000000000028114572543455206 + square * (-.00000000000000000822063524662433 + + square * .000000000000000000019572941063391263)))))))))); +} +function netAtan(x) { + const sign = x < 0 ? -1 : 1; + x = platformMath.abs(x); + const inverse = x > 1; + if (inverse) x = 1 / x; + x = x / (1 + platformMath.sqrt(1 + x * x)); + const square = x * x; + let term = x, sum = x; + for (let n = 1; n <= 20; n++) { + term *= -square; + sum += term / (2 * n + 1); + } + const angle = 2 * sum; + return sign * (inverse ? 1.5707963267948966 - angle : angle); +} +function netAtan2(y, x) { + if (x > 0) return netAtan(y / x); + if (x < 0) return netAtan(y / x) + (y < 0 ? -1 : 1) * 3.141592653589793; + return y > 0 ? 1.5707963267948966 : y < 0 ? -1.5707963267948966 : 0; +} +function netExp(x) { + if (x > 709.782712893384) return Infinity; + if (x < -745.1332191019411) return 0; + const exponent = platformMath.round(x / .6931471805599453); + const remainder = x - exponent * .6931471805599453; + let sum = 1, term = 1; + for (let n = 1; n <= 16; n++) { term *= remainder / n; sum += term; } + return sum * 2 ** exponent; +} +function netHypot(...values) { + let scale = 0; + for (const value of values) scale = platformMath.max(scale, platformMath.abs(value)); + if (!scale || !Number.isFinite(scale)) return scale; + let sum = 0; + for (const value of values) { const ratio = value / scale; sum += ratio * ratio; } + return platformMath.sqrt(sum) * scale; +} +// The interpreter's deterministic transcendental series are expensive on +// Xbox. Poses repeatedly ask for the same angles; retain exact results in a +// bounded cache, including a distinct key for negative zero. Native AC math +// bypasses these fallbacks entirely. No rounding or approximation is added. +const netMathMemoStats = { hits: 0, misses: 0 }; +function memoizeNetUnary(calculate) { + const cache = new Map(); + return value => { + if (typeof value !== "number") return calculate(value); + const key = Object.is(value, -0) ? "negative-zero" : value; + const cached = cache.get(key); + if (cached !== undefined) { netMathMemoStats.hits++; return cached; } + netMathMemoStats.misses++; + const result = calculate(value); + if (cache.size >= 1024) cache.clear(); + cache.set(key, result); + return result; + }; +} +netSin = memoizeNetUnary(netSin); +netAtan = memoizeNetUnary(netAtan); +netExp = memoizeNetUnary(netExp); +const netMath = {sin: netSin, cos: x => netSin(x + 1.5707963267948966), + tan: x => netSin(x) / netSin(x + 1.5707963267948966), atan: netAtan, + atan2: netAtan2, asin: x => netAtan2(x, platformMath.sqrt(1 - x * x)), + exp: netExp, hypot: netHypot}; +for (const [name, fallback] of Object.entries(netMath)) { + const native = globalThis.__oskiewarNativeMath; + const calculate = native?.version === "oskiewar-libm-v1" && typeof native[name] === "function" + ? native[name] : fallback; + Math[name] = (...args) => netSession ? calculate(...args) : platformMath[name](...args); +} + +// While non-null, runtime() reports this clock: the sim is stepping frame f +// and must read f's time whatever the wall says. +let netClockUs = null; +// While true the sim is replaying frames it already showed once — no drums, +// no signals, no telemetry, no publishing. The state changes; nothing else. +let netSilent = false; +let netFrameInputs = null; +// Game speed is the clock, not a patch on top of it. Every deadline, spring, +// bot die-roll and animation in this piece reads one monotonic stream, so +// scaling the stream's increments scales the whole game coherently — physics, +// input windows, round timers, all in step. Set from the title screen with +// +/- on a keyboard, in quarter steps between a quarter and double speed; +// the offline reel harness drives simMonotonicUs itself and never touches +// this, so recordings always run at one. +let gameSpeed = 1; +let roundModifier = ""; +let netRoundClockDebtUs = 0; +function airRoundActive() { return roundModifier === "air"; } +function roundSpeed() { return roundModifier === "slow" ? .5 : 1; } +let gameSpeedChangedAt = 0; +let scaledClockUs = 0; +let lastRawClockUs = null; +runtime = function acRuntime() { + const info = hostRuntime(); + const raw = Number(info.monotonicUs) || 0; + if (clockEpoch === null) clockEpoch = raw; + if (lastRawClockUs === null) lastRawClockUs = raw; + scaledClockUs += (raw - lastRawClockUs) * gameSpeed * roundSpeed(); + lastRawClockUs = raw; + info.monotonicUs = Math.round(scaledClockUs); + if (typeof info.simMonotonicUs === "number") + info.simMonotonicUs -= clockEpoch; + // A rollback fight keeps its own clock: frame f reads f's time while it is + // simulated, and the paint between frames reads the current frame's time + // plus how far the display is into it, so animation and HUD stay on the + // fight's timeline rather than the wall's. + if (netClockUs !== null) { + info.monotonicUs = netClockUs - netRoundClockDebtUs; + info.simMonotonicUs = info.monotonicUs; + } else if (netSession) { + const alpha = Math.max(0, Math.min(1, Number(info.renderAlpha) || 0)); + const at = netSession.originUs + netSession.frame * NET_TICK_US + + Math.round(alpha * NET_TICK_US * roundSpeed()) - netRoundClockDebtUs; + info.monotonicUs = at; + info.simMonotonicUs = at; + } + return info; +}; +// Replayed frames are silent: the wall already saw them once. +// +// These two hooks belong to the host, and the hosts disagree about which of +// them exist: the native shell installs `telemetry` and no `analytics` at all. +// Reading an undeclared binding throws, and this runs at the top level of one +// program, so that throw took every `let` below it with it — the shell then +// reported the first of those (`gameMode`) as uninitialized, a good half a +// file away from the actual cause. `typeof` is the one way to ask whether a +// binding exists without touching it, so ask, and only wrap what is there. +const hostTelemetry = typeof telemetry === "function" ? telemetry : null; +if (hostTelemetry) + telemetry = function netTelemetry(...args) { + if (netSilent) return; + return hostTelemetry(...args); + }; +const hostAnalytics = typeof analytics === "function" ? analytics : null; +if (hostAnalytics) + analytics = function netAnalytics(...args) { + if (netSilent) return; + return hostAnalytics(...args); + }; + +// Monotonic count of committed revisions to this piece (next revision included). +const buildVersion = 169; +const floorY = 1800; +// Oskiewar now opens as a versus game. An ordinary web visit hosts a room — +// the URL becomes the invitation — and until a friend opens it, all you can +// do is move: a training floor with your own moves named back at you and one +// standing instruction, find a friend. Survival (the solo ascent) and the +// bot/dummy doors remain modes behind `?opponent=`, and the regression +// harness still enters combat directly. Keeping player two as explicit mode +// state, rather than deleting the chair, preserves replays and the fight +// laboratory while ensuring no route quietly seats an adversary. +let gameMode = "fight"; +const survivalActive = () => gameMode === "survival"; +// The versus lane's two rooms-of-play: alone in the cube waiting on a rival, +// or fighting the rival the relay seated. Both publish to the same room so +// the shared URL is the lobby, the fight and the grandstand at once. +const lobbyActive = () => gameMode === "fight" && fightOpponent === "versus-lobby"; +const versusActive = () => gameMode === "fight" && fightOpponent === "versus"; +const versusLane = () => lobbyActive() || versusActive(); +// The station. The tower became a cube, and the cube has now been opened to +// vacuum: @jeffrey asked for "a large space map", and the cube's own comment +// had already named the condition for growing one — "a tile-authored map is +// exactly the shape a future rung would be written in." So the lattice is +// what grew. Twenty tiles wide by fourteen tall at the same 90 units a side, +// which is four times the cube's floor area and still frames whole on one +// screen at the widest shot, because a fighter you cannot see is a fighter +// you cannot read. +// +// What changed besides the number: the plaster shell is gone. There is no +// back wall, no ceiling slab and no side wall, because the map is outside +// now — stars behind, a planet below the deck, and a hull you stand on +// rather than a room you are sealed into. Gravity is station gravity, a +// little over half a G (`spaceGravityScale`), so a jump hangs and the +// floating decks overhead are reachable on legs alone. Simulation stays +// continuous — nothing about motion quantizes — but the STRUCTURE is +// addressable: spawns, pickups, decks and lanes are authored in tile +// coordinates, the lattice draws as a faint nav hologram, and `gridField` +// below holds one number per tile so per-tile computation (heat, ownership, +// weather) has a surface to run on. +const tileSize = 90; +let gridCols = 40; +const gridRows = 16; +// Tile (0, 0) starts flush at the floor-left corner of the PLAYABLE box, so +// every tile edge lands on a clean multiple of 90. The walls stand outside +// the lattice: the structural shell is one wallThickness beyond each face, +// and `resolveRunnerBounds` pushes off the faces themselves. +const wallThickness = 40; +const gridLeft = 0; +let gridWidth = gridCols * tileSize; +const gridHeight = gridRows * tileSize; +const worldLeft = gridLeft - wallThickness; +let worldRight = gridLeft + gridWidth + wallThickness; +// Keep the authored ground grid while giving launches four times the headroom. +const ceilingY = floorY - gridHeight * 4 - wallThickness; +// Depth is the eye's dimension, not the fight's — fighters live near z = 0 — +// so it is authored rather than derived. It was the cube's own width back +// when those were the same number; widening the map to twenty tiles must not +// also push the far plane twice as far out, because every camera stand-off, +// every killcam orbit and the whole ±30000 native coordinate budget were +// tuned against this depth and not against the floor's span. +const roomDepth = 900; +const worldNear = -roomDepth / 2; +const worldFar = roomDepth / 2; +// Address helpers: world position to tile and back. Rows count UP from the +// floor, because in a fight the floor is where everything starts. All three +// clamp, so a body pressed into a wall still names a real tile. +const tileCol = (x) => + Math.min(gridCols - 1, Math.max(0, Math.floor((x - gridLeft) / tileSize))); +const tileRow = (y) => + Math.min(gridRows - 1, Math.max(0, Math.floor((floorY - y) / tileSize))); +const tileCenterX = (col) => gridLeft + (col + .5) * tileSize; +// One number per tile, row-major from the floor-left corner. Today impacts +// write heat into it and the overlay draws that heat fading; tomorrow it is +// wherever tiled computation over the map wants to live. +let gridField = new Float32Array(gridCols * gridRows); +const gridFieldIndex = (x, y) => tileRow(y) * gridCols + tileCol(x); +// Whether a point is on the lattice at all. `tileCol` and `tileRow` CLAMP, +// which is right for a body pressed into a wall — it still stands somewhere — +// and wrong for anything that happens off the map, because every one of those +// lands on the same corner cell. On plaster that was invisible. Against black +// space it was a lit bar across the top corners of the frame: the title +// screen's own bouncing letters, stamping heat outside the box, all of it +// clamped into row thirteen at columns zero and nineteen. +const onGridField = (x, y) => + x >= gridLeft && x <= gridLeft + gridWidth && + y <= floorY && y >= floorY - gridHeight; +// The park. The floor stopped being flat. +// +// Every piece of this was already here and switched off: `terrainFloorAt` has +// carried a heightfield since the tower, `terrainTangentAt` differentiates it, +// and the skate physics have been feeding that slope into `skateVx` all along +// — `player.skateVx += terrainSlope * 1900 * dt` is a line that has done +// nothing for months because the amplitude was zero. What was missing was a +// shape worth riding. +// +// So the profile is authored rather than noised. A run of segments in tile +// coordinates, each one a real skatepark feature, walked left to right: +// +// flat the ground, and the halfpipe's own flat bottom +// transition a quarter-circle, horizontal where it meets the flat and +// vertical at the coping — which is what a transition IS, and +// why it is an arc and not a straight ramp +// bank a straight incline, for launching off rather than carving in +// +// A transition's run equals its height because a quarter circle's does. That +// is not a simplification, it is the geometry: radius R gives you R of run +// and R of rise, tangent flat at the bottom and vertical at the lip. +// `lift` raises the segment's base off the ground, or — negative — digs it in. +// That sign is what makes a halfpipe possible in a game seen from the side: a +// pipe built UP from the floor is two humps with their ridable faces pointing +// away from you, and you would have to climb the back of one to use it. Dug +// IN, the same two arcs face each other, the flat bottom is genuinely a floor, +// and a skater can ride straight through at speed from either end. So the +// halfpipe here is a bowl, which is what a halfpipe is from the side anyway. +// Read it left to right and it is a run: drop off the left quarterpipe, carry +// the speed into the halfpipe, out across the middle, up the kicker and over +// the funbox, and finish on the right quarterpipe. The middle ten tiles are +// deliberately flat and deliberately in the middle — that is where the bell +// rings, and a fight that opens with both fighters sliding down a transition +// is a fight nobody chose the start of. +const parkFeatures = [ + { from: 0, to: 4, kind: "transition", rise: 360, dir: -1 }, + { from: 4, to: 6, kind: "flat" }, + { from: 6, to: 9, kind: "transition", rise: 270, dir: -1, lift: -270 }, + { from: 9, to: 12, kind: "flat", lift: -270 }, + { from: 12, to: 15, kind: "transition", rise: 270, dir: 1, lift: -270 }, + { from: 15, to: 25, kind: "flat" }, + { from: 25, to: 28, kind: "bank", rise: 180, dir: 1 }, + { from: 28, to: 30, kind: "flat", lift: 180 }, + { from: 30, to: 33, kind: "bank", rise: 180, dir: -1 }, + { from: 33, to: 36, kind: "flat" }, + { from: 36, to: 40, kind: "transition", rise: 360, dir: 1 }, +]; +// Resolved once into world units so the per-frame walk compares numbers +// rather than rebuilding them. `terrainFloorAt` runs for every foot, every +// grass blade and every render sample, so it is worth the twenty bytes. +let parkSegments = parkFeatures.map((feature) => ({ + ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, + lift: feature.lift || 0, +})); +const parkLeft = parkSegments[0].left; +let parkRight = parkSegments[parkSegments.length - 1].right; +// The lowest ground in the park. `floorY` used to be it — it +// was the whole world's bottom, and a dozen places lean on that: the camera +// clamps its aim to it, the ground's near skirt hangs from it, the terrain +// span stops at it. A bowl dug three tiles into the floor makes every one of +// those assumptions wrong by exactly the depth of the bowl, and the symptom +// is a fighter riding out of frame at the bottom of the pipe. +let parkDeepest = floorY + Math.max(0, + ...parkSegments.map((segment) => -segment.lift)); +// Enough samples that an arc reads as an arc. One per tile drew the halfpipe +// as a staircase — 90 units is most of a fighter wide, and a transition turns +// through ninety degrees in three of them. +let terrainSamples = gridCols * 6; +let terrainPhase = 0; +// The long park is selected by ?map=skatepark; the host's deal owns the map. +let skateparkMap = globalThis.__oskiewarMap === "skatepark"; +const skateLoops = [ + { x: 6300, radius: 320 }, { x: 15300, radius: 420 }, + { x: 24300, radius: 500 }, +]; +const skateBoosts = [2400, 5400, 10800, 14400, 19800, 23400, 27000] + .map((x) => ({ left: x, right: x + 240, speed: 3900 })); +const skateRopes = []; +const chainLinks = 16; +const chainLength = 44; + +function configureWorldMap(name) { + // A normal round keeps its current workshop/local variant. Only entering + // or leaving the long course needs to replace the world dimensions. + if (name !== "skatepark" && !skateparkMap) return; + skateparkMap = name === "skatepark"; + gridCols = skateparkMap ? 320 : 40; + gridWidth = gridCols * tileSize; + if (gridField.length !== gridCols * gridRows) gridField = new Float32Array(gridCols * gridRows); + worldRight = gridLeft + gridWidth + wallThickness; + const features = skateparkMap ? [ + ...parkFeatures.slice(0, -1), + { from: 36, to: 40, kind: "flat" }, + ...[40, 140, 240].flatMap((from) => [ + { from, to: from + 40, kind: "flat" }, + { from: from + 40, to: from + 46, kind: "bank", rise: 270, dir: 1 }, + { from: from + 46, to: from + 50, kind: "flat", lift: 270 }, + { from: from + 50, to: from + 56, kind: "bank", rise: 270, dir: -1 }, + { from: from + 56, to: Math.min(320, from + 100), kind: "flat" }, + ]), + ] : parkFeatures; + parkSegments = features.map((feature) => ({ ...feature, + left: gridLeft + feature.from * tileSize, + right: gridLeft + feature.to * tileSize, lift: feature.lift || 0 })); + parkRight = gridLeft + gridWidth; + terrainSamples = gridCols * 6; +} + +function resetSkateRopes() { + skateRopes.length = 0; + if (!skateparkMap) return; + for (const x of [3600, 9900, 18900]) { + const anchorY = floorY - 850; + skateRopes.push({ x, y: anchorY, z: 0, + nodes: Array.from({ length: chainLinks + 1 }, (_, index) => ({ + x, y: anchorY + index * chainLength, + px: x, py: anchorY + index * chainLength, + })) }); + } +} + +function releaseSkateRope(player) { + const rope = skateRopes[player.ropeIndex]; + const node = rope?.nodes[Math.round(player.ropeLink)]; + if (node) { + player.vx = clamp((node.x - node.px) / (rope.dt || 1 / 60), -4200, 4200); + player.vy = clamp((node.y - node.py) / (rope.dt || 1 / 60), -4200, 4200); + player.skateVx = player.vx; + player.knockVx = player.skateboard ? 0 : player.vx; + } + player.ropeIndex = -1; + player.grounded = false; +} + +// Hold grab through a crossing to latch. A fresh grab edge detaches. +function skateRopeInput(player, input, grabHeld, dt, grabPressed = grabHeld) { + if (!grabHeld) player.ropeGrabLocked = false; + if (player.ropeIndex >= 0 && (!player.alive || isHeadOnly(player) || + isPogo(player) || player.hitStunUntil > runtime().monotonicUs)) { + releaseSkateRope(player); + return false; + } + if (player.ropeIndex >= 0 && grabPressed) { + releaseSkateRope(player); + player.ropeGrabLocked = true; + return false; + } + if (player.ropeIndex < 0 && grabHeld && !player.ropeGrabLocked && player.heldBall < 0 && + player.heldPart < 0 && player.heldPlayer < 0) { + let nearest = null; + // Test the swept hand volume against each link, so a fast crossing counts. + const hand = { x1: player.x, y1: player.y - 125, z1: player.z, + x2: player.x + player.vx * dt, y2: player.y - 125 + player.vy * dt, + z2: player.z, width: 64 }; + skateRopes.forEach((rope, ropeIndex) => { + rope.nodes.slice(1).forEach((node, index) => { + const before = rope.nodes[index]; + const box = { left: Math.min(node.x, before.x) - 6, + right: Math.max(node.x, before.x) + 6, + top: Math.min(node.y, before.y) - 6, bottom: Math.max(node.y, before.y) + 6, + near: rope.z - 8, far: rope.z + 8 }; + const hit = segmentBoxEntry(hand, box, hand.width / 2); + const distance = Math.hypot(node.x - hand.x1, node.y - hand.y1); + if (hit !== null && (!nearest || distance < nearest.distance)) + nearest = { ropeIndex, link: index + 1, distance }; + }); + }); + if (nearest) { + player.ropeIndex = nearest.ropeIndex; + player.ropeLink = nearest.link; + const node = skateRopes[player.ropeIndex].nodes[nearest.link]; + node.px = node.x - clamp(player.vx, -3000, 3000) / 60; + node.py = node.y - clamp(player.vy, -3000, 3000) / 60; + player.skateLoop = -1; + player.lastButton = "ROPE"; + emitSignal("rope-grab", player.pad, nearest.ropeIndex, nearest.link); + } + } + if (!(player.ropeIndex >= 0)) return false; + player.ropeLink = clamp(player.ropeLink - input.vertical * dt * 3, + 2, chainLinks); + const rope = skateRopes[player.ropeIndex]; + const node = rope.nodes[Math.round(player.ropeLink)]; + node.px -= input.horizontal * 2100 * dt * dt; + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grounded = false; + player.attackKind = ""; + player.attackUntil = 0; + player.blocking = false; + player.stance = "ROPE"; + return true; +} + +// Verlet chain with a fixed anchor and distance constraints, stepped once per +// simulation tick. Nodes, previous positions and attachments all roll back. +function updateSkateRopes(dt) { + if (!skateparkMap || survivalActive()) return; + for (const rope of skateRopes) { + const timeScale = dt / (rope.dt || dt); + rope.dt = dt; + for (let i = 1; i < rope.nodes.length; i++) { + const node = rope.nodes[i]; + const vx = (node.x - node.px) * .997 * timeScale; + const vy = (node.y - node.py) * .997 * timeScale; + node.px = node.x; node.py = node.y; + node.x += vx; node.y += vy + fallGravity() * dt * dt; + } + const riders = players.filter((player) => player.alive && + skateRopes[player.ropeIndex] === rope); + const inverseMass = (index) => index === 0 ? 0 : + riders.some((rider) => Math.abs(rider.ropeLink - index) < 1) ? .125 : 1; + for (let pass = 0; pass < 32; pass++) { + rope.nodes[0].x = rope.x; rope.nodes[0].y = rope.y; + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + const dx = b.x - a.x, dy = b.y - a.y; + const length = Math.hypot(dx, dy) || 1; + const error = (length - chainLength) / length; + const wa = inverseMass(i - 1), wb = inverseMass(i); + const sum = wa + wb; + b.x -= dx * error * wb / sum; b.y -= dy * error * wb / sum; + a.x += dx * error * wa / sum; a.y += dy * error * wa / sum; + } + } + } + for (const player of players) { + if (!(player.ropeIndex >= 0)) continue; + if (!player.alive) { releaseSkateRope(player); continue; } + const rope = skateRopes[player.ropeIndex]; + const link = Math.floor(player.ropeLink), blend = player.ropeLink - link; + const a = rope.nodes[link], b = rope.nodes[Math.min(link + 1, chainLinks)]; + const x = lerp(a.x, b.x, blend), y = lerp(a.y, b.y, blend) + 125; + player.vx = (x - player.x) / Math.max(dt, .001); + player.vy = (y - player.y) / Math.max(dt, .001); + player.x = x; player.y = y; player.z = rope.z; + player.grounded = false; + } +} + +function skateLoopStep(player, input, dt, now) { + if (!(player.skateLoop >= 0)) { + if (!player.skateboard || !player.grounded || Math.abs(player.skateVx) < 1300) + return false; + const nextX = player.x + player.skateVx * dt; + const index = skateLoops.findIndex((loop) => + Math.min(player.x, nextX) <= loop.x && Math.max(player.x, nextX) >= loop.x && + Math.abs(player.y - floorY) < 30 && Math.abs(player.z) < 90 && + now >= (player.loopCooldownUntil || 0)); + if (index < 0) return false; + player.skateLoop = index; + player.loopAngle = 0; + player.loopSpeed = player.skateVx; + } + const loop = skateLoops[player.skateLoop]; + const angle = player.loopAngle; + player.loopSpeed += (-fallGravity() * Math.sin(angle) + input.horizontal * 500) * dt; + player.loopAngle += player.loopSpeed / loop.radius * dt; + const theta = player.loopAngle; + player.x = loop.x + Math.sin(theta) * loop.radius; + player.y = floorY - loop.radius + Math.cos(theta) * loop.radius; + player.vx = Math.cos(theta) * player.loopSpeed; + player.vy = -Math.sin(theta) * player.loopSpeed; + player.grounded = false; + player.skateRotation = -theta; + const completed = Math.abs(theta) >= Math.PI * 2; + const lostGrip = Math.cos(theta) < 0 && player.loopSpeed ** 2 / loop.radius < + -fallGravity() * Math.cos(theta); + if (completed || lostGrip || !player.skateboard) { + if (completed) { player.x = loop.x + Math.sign(player.loopSpeed) * 12; + player.y = floorY; player.vy = 0; player.grounded = true; } + player.skateVx = player.vx; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = now + 600000; + } + return true; +} + +function skateBoostStep(player, previousX, now) { + if (!skateparkMap || !player.skateboard || !player.grounded || + Math.abs(player.y - terrainFloorAt(player.x)) > 12 || + Math.abs(player.z) > 100 || now < (player.boostUntil || 0)) return; + const pad = skateBoosts.find((pad) => Math.max(previousX, player.x) >= pad.left && + Math.min(previousX, player.x) <= pad.right); + if (!pad) return; + player.skateVx = (Math.sign(player.skateVx) || player.facing) * pad.speed; + player.vx = player.skateVx; + player.boostUntil = now + 350000; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + emitSignal("skate-boost", player.pad, player.facing, pad.speed); + playDrum("whoosh", 1, panPlayer(player)); +} + +function drawSkateParkFeatures() { + if (!skateparkMap || survivalActive()) return; + const visible = (x, radius = 0) => Math.abs(x - cameraCenter) < cameraWidth + radius; + for (const loop of skateLoops) { + if (!visible(loop.x, loop.radius)) continue; + for (let i = 0; i < 96; i++) { + const a = i / 96 * Math.PI * 2, b = (i + 1) / 96 * Math.PI * 2; + for (const z of [-90, 90]) worldCapsule( + loop.x + Math.sin(a) * loop.radius, floorY - loop.radius + Math.cos(a) * loop.radius, z, + loop.x + Math.sin(b) * loop.radius, floorY - loop.radius + Math.cos(b) * loop.radius, z, + 10, [92, 212, 240]); + } + } + for (const pad of skateBoosts) { + if (!visible(pad.left, 240)) continue; + for (let x = pad.left; x < pad.right; x += 40) { + const y = terrainFloorAt(x) - 8; + worldCapsule(x, y, -70, x + 22, y, 0, 9, [255, 212, 66]); + worldCapsule(x + 22, y, 0, x, y, 70, 9, [255, 212, 66]); + } + } + for (const rope of skateRopes) { + if (!visible(rope.x, chainLinks * chainLength)) continue; + worldCapsule(rope.x - 70, rope.y, rope.z, rope.x + 70, rope.y, rope.z, + 18, [108, 130, 150]); + for (let i = 1; i < rope.nodes.length; i++) { + const a = rope.nodes[i - 1], b = rope.nodes[i]; + worldCapsule(a.x, a.y, rope.z, b.x, b.y, rope.z, 8, + i % 2 ? [220, 225, 236] : [120, 150, 178]); + } + } +} + +function terrainSeed(value) { + let hash = 2166136261; + for (const character of String(value || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967296 * Math.PI * 2; +} +function terrainFloorAt(x) { + if (airRoundActive()) return floorY + 1e9; + // Outside the park the ground is flat, so the walls have something square + // to stand out of and a body pushed past the lip still has a floor. + if (x <= parkLeft) return floorY - parkSegments[0].lift - (parkSegments[0].rise || 0); + if (x >= parkRight) return floorY - + (parkSegments[parkSegments.length - 1].rise || 0) - + parkSegments[parkSegments.length - 1].lift; + for (const segment of parkSegments) { + if (x < segment.left || x > segment.right) continue; + if (segment.kind === "flat") return floorY - segment.lift; + const run = segment.right - segment.left; + // How far up the feature we are, measured from ITS bottom: `dir` says + // which end that is. A transition rising to the right has its flat end on + // the left, and the same arc mirrored has it on the right. + const along = segment.dir > 0 + ? (x - segment.left) / run : (segment.right - x) / run; + if (segment.kind === "bank") + return floorY - segment.lift - segment.rise * along; + // The quarter circle. Centre sits one radius below the flat end, so the + // surface leaves the ground horizontally and arrives at the coping + // vertical — which is the difference between a transition you can pump + // and a ramp you merely climb. + const radius = segment.rise; + const dx = along * radius; + return floorY - segment.lift - + (radius - Math.sqrt(Math.max(0, radius * radius - dx * dx))); + } + return floorY; +} +function terrainTangentAt(x, span = 12) { + const left = terrainFloorAt(clamp(x - span, worldLeft, worldRight)); + const right = terrainFloorAt(clamp(x + span, worldLeft, worldRight)); + return (right - left) / Math.max(1, Math.min(worldRight, x + span) - + Math.max(worldLeft, x - span)); +} +const stageLeft = 0; +let stageRight = 1920; +let stageTop = 112; +// Leave a narrow projection gutter beneath the floor for the screen-edge HUD. +let stageBottom = 930; +let viewHeight = 1080; +let cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); +// `PLATFORM` is the TOWER's single centre platform, and it stays off. It is +// not a general "are there ledges" switch, however much it reads like one: +// the tower hung one slab over a floor, `platformY` still names that slab, +// and a dormant family of tower-era regressions is gated on this constant +// being true. The station's decks are a different object with a different +// shape, so they get their own table below rather than borrowing this flag +// and waking tests that ask whether a tapped hop clears a platform that no +// longer exists. The wind flag rides its own switch and is still off. +const PLATFORM = false; +const WIND_FLAG = false; +const survivalLevelCount = 32; +const survivalStepY = 235; +const survivalCeilingY = floorY - (survivalLevelCount + 2) * survivalStepY; +// A deterministic, hand-tuned zig-zag. Adjacent decks always overlap a +// normal jump's horizontal budget and sit below its 322-unit apex; variation +// comes from where the safe landing moves, not from impossible dice rolls. +// +// These numbers were authored against the cube's 900-unit floor and the +// climb still wants exactly that column of air — so when the station doubled +// the floor's width the ladder was RECENTRED, not respaced. The rung spacing +// is the tuned part; where the column stands is not. `survivalFrameWidth` is +// the cube's old framing kept by the same argument: a lens wide enough for a +// twenty-tile station would shrink the climb to a thread up the middle. +const survivalCenterShift = gridWidth / 2 - 450; +const survivalFrameWidth = 1020; +const survivalCenters = [450, 280, 620, 390, 680, 250, 520, 710]; +const survivalWidths = [470, 390, 420, 360, 440, 380, 410, 370]; +const platforms = Array.from({ length: survivalLevelCount }, (_, index) => { + const center = survivalCenters[index % survivalCenters.length] + + survivalCenterShift; + const width = survivalWidths[index % survivalWidths.length]; + return { level: index + 1, left: center - width / 2, + right: center + width / 2, y: floorY - (index + 1) * survivalStepY }; +}); +// The station's decks. This is the sentence the cube's own comment promised — +// "a tile-authored map is exactly the shape a future rung would be written +// in" — being cashed. The cube had no room for a deck a fighter could stand +// under; twenty by fourteen tiles under station gravity has room for five. +// +// Said in tiles because the map is a lattice: which column a deck starts at, +// which row its surface sits on, how many tiles wide it runs. Two low decks +// out at the flanks, two mid decks pinched toward the middle, one high deck +// straddling the centre line — so the shape of the map is a funnel upward, +// and the fighter who takes the top deck has taken the one place both mid +// decks feed into. +// +// The rows are chosen against one number: 586, the apex station gravity buys +// a held jump. Every step between ADJACENT decks is under it — floor to a low +// deck is 270, low to mid is 360, mid to top is 270 — and every step that +// skips a tier is over it. Floor to a mid deck is 630, and that 630 is the +// whole design: it is what stops the stack from being a straight hop up the +// middle and makes the climb a route instead. Out to a flank, up, back in +// along the mid deck, up again. +// +// This is what the first layout got wrong. Mid decks at row 6 put them 540 +// off the floor — under the apex, so a player could take one straight up and +// `jumpReach` would offer it to a bot, and the flanks stopped meaning +// anything. A deck you can only reach with a perfect double-tap is a deck the +// bots stand under and stare at; a deck you reach by going somewhere first is +// a route; and a deck you can reach from anywhere is not a deck, it is a step. +// Decks over the park, not instead of it. The rows are still priced against +// the 586-unit apex — the flat reaches row 3, row 3 reaches row 7, and the +// floor does NOT reach row 7 at 630 — so the climb keeps its route. What +// changed is that the park is now the interesting way to travel and the decks +// are the high ground above it. The bridge over the halfpipe is reachable +// from the flat beside the bowl and not from the bottom of it, which is the +// point of a bowl. +const parkDeckPlan = [ + { col: 8, row: 5, cols: 5 }, + { col: 15, row: 3, cols: 4 }, + { col: 21, row: 3, cols: 4 }, + { col: 18, row: 7, cols: 4 }, + { col: 31, row: 5, cols: 4 }, +]; +const parkDecks = parkDeckPlan.map((deck, index) => ({ + level: index + 1, + left: gridLeft + deck.col * tileSize, + right: gridLeft + (deck.col + deck.cols) * tileSize, + y: floorY - deck.row * tileSize, +})); +// Two ladders, one machinery. The climb's thirty-two rungs and the station's +// five decks are the same shape and are read by the same four routines, but +// they must never be visible at the same time — a survival runner standing +// on a station deck would be standing on furniture from another map. So the +// mode picks the table, once, and everything downstream asks here. +const activeLedges = () => survivalActive() ? platforms : parkDecks; +// The station's landmarks, by column. On a ten-wide cube a bare `3` was +// readable as "left of centre"; on twenty it is just a digit, and there were +// a dozen of them scattered through spawn, pickup and re-serve code all +// meaning something. Name them once. +// +// The spawns stayed close. It is tempting to open a map four times the size +// by standing the fighters four times as far apart, and it is wrong twice +// over: the opening exchange is the tuned part of this game, and the intro +// camera and the reel's opening lens are both built to travel between two +// faces 270 units apart — spreading the spawns whipped the intro at 207px a +// frame and opened the reel's close lens before the first blow. So the bell +// is unchanged from the cube: two fighters three tiles apart, astride the +// centre line. The map's size is where you GO, not where you start, and the +// corners, the decks and the climb are what spend it. +const spawnColLeft = 18; +const spawnColRight = 21; +// Not corners any more: the ends of this map are quarterpipe transitions, and +// a pistol resting on a vertical wall is a pistol nobody can pick up. These +// are the two flat aprons either side of the park instead — still a run away +// from the bell, still costing you your back to reach. +const cornerColLeft = 5; +const cornerColRight = 34; +const centerX = gridLeft + gridWidth / 2; +const platformsEnabled = () => survivalActive() || parkDecks.length > 0; +// Version-one furniture — the wind flag's pole, the store's demos, the tests — +// still asks for "the platform" by name. In a one-room cube the floor is the +// only platform, so the name now means the whole playable span of it. +const platformLeft = gridLeft; +const platformRight = gridLeft + gridWidth; +const platformY = floorY; +// The surface a thing at (x, y) is standing over: the nearest rung at or below +// it, and the floor when there is no rung. Shadows, pickups and the bot all +// ask this, so a rung that moves takes its furniture with it. +function surfaceYAt(x, y) { + let surface = terrainFloorAt(x); + if (platformsEnabled()) for (const ledge of activeLedges()) + if (ledge.y < surface && ledge.y >= y - 1 && + x >= ledge.left && x <= ledge.right) surface = ledge.y; + return surface; +} +// Which rung a falling thing just crossed, or null. `rise` lifts the contact +// line off the rung by an object's radius and `inset` keeps its edges on the +// span, so one answer serves fighters, grenades and the ball alike — and a +// lattice change lands in all three at once. The highest crossed rung wins, +// because that is the one a fall meets first. +function ledgeCrossed(x, previousY, y, rise = 0, inset = 0) { + if (!platformsEnabled()) return null; + let hit = null; + for (const ledge of activeLedges()) { + const top = ledge.y - rise; + if (previousY > top || y < top) continue; + if (x < ledge.left + inset || x > ledge.right - inset) continue; + if (!hit || ledge.y < hit.y) hit = ledge; + } + return hit; +} +// Resting on a rung rather than falling through one: the ball asks this to +// know whether it is supported and whether it may be booted. +function ledgeSupports(x, y, radius = 0) { + if (!platformsEnabled()) return false; + for (const ledge of activeLedges()) + if (x >= ledge.left + radius && x <= ledge.right - radius && + Math.abs(y - (ledge.y - radius)) <= 2) return true; + return false; +} +const doubleTapUs = 280000; +const doubleTapReleaseUs = 40000; +const roundDurationUs = 30000000; +const roundResultUs = 3000000; +const matchResultUs = 5000000; +const introDurationUs = 3000000; +// A reel gets one branded beat, then motion. Three portrait seconds cost the +// swipe decision before either fighter could move; the live game keeps that +// introduction, while the unattended 9:16 lane reaches the fight inside the +// first second without changing a combat rule. +const reelIntroDurationUs = 650000; +const survivalIntroDurationUs = 900000; +// Keep the close face-off lens through the first exchange. The seeded bots +// meet at about .81s; releasing at the bell made that hit happen as two tiny +// figures at the foot of an empty portrait wall. +const reelOpeningHoldUs = 1350000; +function roundIntroDurationUs() { + if (survivalActive()) return survivalIntroDurationUs; + return reelGroundCamera() ? reelIntroDurationUs : introDurationUs; +} +const dummyGuideDurationUs = 150000000; +const matchWins = 5; +const errorRestartUs = 16000000; +const errorDumpBase = "https://oskiewar.com/api/oskiewar-dump?d="; +const powerupIntervalUs = 10000000; +const shieldRadius = 160; +const shieldForward = 30; +const grenadeBlastDuration = .68; +const grenadeBlastRadius = 620; +// Ground pound. Double-tapping DOWN in the air used to be a plain fast drop +// that did nothing on arrival; now it commits you. Holding DOWN through the +// fall buys speed, the crater scales with how far you actually fell, and the +// landing balls you — so the move is a trade, never a free hit. +const poundLaunchVelocity = 1500; +const poundHoldAcceleration = 5600; +const poundMaxVelocity = 4600; +// Roughly a jump-and-a-half of floor-to-ceiling travel. Falling further than +// this cannot buy a bigger crater, so the ceiling is not a weapon. +const poundFullFall = 900; +// A first-stage landing is deliberately body-sized: the visible ring is the +// attack, not a warning decal for a much larger invisible hit. Repeated DOWN +// taps still grow it, but never into a room-clearing shortcut. +const poundMinRadius = 165; +const poundMaxRadius = 420; +const boosterXs = []; +const boosterRadius = 115; +const boosterVelocity = 6500; +const replayTickUs = 16667; +// The store's demos hold one checkpoint a second — cheap enough to keep +// hundreds of matches. A marketing render replays its demo AS the footage, +// and a fight smoothed through one-second keyframes stops feeling like a +// fight, so the reel factory asks for a checkpoint every simulation tick. +// The dense interval sits just under one true sim step (16666.67us) — at +// exactly one tick the < gate loses the rounding race and records every +// OTHER step, which halves a re-simulation's drift meter. +const replayCheckpointUs = () => + globalThis.__oskiewarDenseReplay ? 16000 : 1000000; +const liveSnapshotIntervalUs = 50000; +const fighterAnimationSpecs = { + // WALK ran a whole stride in 12 ticks — five cycles a second, which the eye + // reads as a vibrating fighter rather than as legs taking steps. Three ticks + // a frame puts the cycle at 600ms, close to a real walk, so the steps count. + IDLE: [72, 3, "BREATHE", true], WALK: [12, 3, "STRIDE", true], + RUN: [10, 1, "RUN", true], MEDITATE: [24, 2, "STILL", true], + DASH: [8, 1, "BURST", true], CROUCH: [8, 1, "TUCK", true], + "AIR CROUCH": [8, 1, "TUCK", true], JUMP: [12, 1, "ASCEND", true], + FALL: [12, 1, "DESCEND", true], PUNCH: [14, 1, "ATTACK", false], + KICK: [14, 1, "ATTACK", false], SHIELD: [12, 2, "GUARD", true], + REACH: [10, 1, "REACH", false], HOLD: [16, 2, "CLUTCH", true], + FIRE: [11, 1, "FIRE", false], THROW: [16, 1, "THROW", false], + WHIP: [11, 1, "ATTACK", false], BASH: [17, 1, "ATTACK", false], + HIT: [10, 1, "STUN", false], POGO: [12, 1, "BOUNCE", true], + "CROUCH HOP": [8, 1, "HOP", true], SINK: [10, 1, "SINK", true], + KO: [16, 2, "BREAK", false], +}; +// Every melee kind in one table: how far the limb reaches at rest and at full +// extension, how long each of its two bones is (the real reach ceiling), how +// high it lands, how wide it reads against the ball, how long the hitbox +// lives, and what it does on contact. A loaded hand cannot make a clean fist, +// so an item swing is its own kind rather than a punch modifier — a pistol +// lengthens the arm into a fast light lash, a grenade shortens it into a club. +// A blade in the item hand stretches every hand strike. Kicks are legs. +const meleeSpecFor = (player, kind) => { + const spec = meleeSpecs[kind] || meleeSpecs.PUNCH; + if (!player?.swordHeld || kind === "KICK") return spec; + return { ...spec, reach: spec.reach * 1.5, span: spec.span * 1.45, + swell: spec.swell * 1.3, force: spec.force * 1.15 }; +}; +const meleeSpecs = { + PUNCH: { reach: 58, swell: 50, span: 58, height: 115, radius: 28, + windowUs: 220000, force: 1200, lift: 140, + cue: ["snare", 1.05], thud: ["block", 1] }, + KICK: { reach: 75, swell: 62, span: 74, height: 55, radius: 35, + windowUs: 220000, force: 1550, lift: 220, + cue: ["kick", 1.05], thud: ["block", 1] }, + WHIP: { reach: 92, swell: 74, span: 76, height: 122, radius: 24, + windowUs: 190000, force: 1000, lift: 110, + cue: ["whoosh", 1.15], thud: ["hat", 1.35] }, + BASH: { reach: 62, swell: 40, span: 58, height: 108, radius: 40, + windowUs: 280000, force: 1750, lift: 210, + cue: ["kick", 1.3], thud: ["kick", 1.4] }, +}; +// One lookup serves both Y and the loaded punch, so the thing you can see in +// the fighter's hand is always the thing that fires and the thing that swings. +const itemMelee = { GUN: "WHIP", GRENADE: "BASH" }; +const instantReplayStepUs = 33333; +// Replay speed ramping: how far a full-force hit drags the playhead down, how +// many frames of warning the ramp gets, and how fast the speed itself may +// change — the last one is what keeps a slowdown from reading as a stutter. +const replaySlowest = .18; +const replayActionLead = 8; +const replayRampPerSecond = 3.2; +const instantReplayMaxFrames = 240; +// Legs, slowed about a sixth on @jeffrey's ear. The station is twice the +// cube's width, and the first thing a bigger floor does is make a fighter +// read as skating across it -- the same stride that felt urgent crossing 900 +// units looks weightless crossing 1,800. Every number here moved by the same +// fraction, including the acceleration, so time-to-top-speed is unchanged and +// only the ground covered is: a run still winds up over the same beat. +// +// This is load-bearing beyond feel. `jumpReach` prices a bot's jump in +// walkSpeed, so the arcs it will commit to narrow with the stride, and the +// deck spacing above stays exactly as reachable as it was. +// What a pump is worth, and how much upward speed a lip has to be giving you +// before it counts as an air rather than a bump. The launch floor exists so +// rolling over a gentle crest does not pop a rider off the ground every time. +const skatePumpAcceleration = 2600; +const skateLaunchFloor = 380; +const walkSpeed = 880; +const runStartSpeed = 1100; +const runTopSpeed = 1950; +const runAcceleration = 690; +// Vertical feel. The apex is the design constant — how high a fighter can +// reach never changed — so every impulse here is paired with a gravity that +// spends less time getting there. Rise is lighter than fall so the arc reads +// as intent going up and commitment coming down. +const riseGravityFull = 4800; +const fallGravityFull = 7200; +// Station gravity. The space map spins up a little over half a G, and that +// one number is what makes the floating decks a place you can go: at full +// weight a jump tops out at 322 units — three and a half tiles — and the +// lowest deck sits three tiles up with nothing above it worth reaching. At +// .55 the apex is 586, so the deck stack overhead is climbable on legs, a +// knocked fighter sails instead of dropping, and the hover board's airtime +// becomes the traversal it is for. The climb keeps full weight: survival's +// thirty-two rungs are spaced against the 322 apex, and floating that run +// would let a runner skip rungs the ladder exists to make them earn. +const spaceGravityScale = .55; +const gravityScale = () => survivalActive() ? 1 : spaceGravityScale; +const riseGravity = () => riseGravityFull * gravityScale(); +const fallGravity = () => fallGravityFull * gravityScale(); +const jumpVelocity = 1760; +const crouchJumpVelocity = 1960; +const ultraJumpVelocity = 3960; +const crouchHopVelocity = 980; +const pogoBounceVelocity = 2100; +const headBounceVelocity = 1100; +const jumpAnticipationUs = 50000; +// Letting go of up mid-rise snips the arc: a tap is a hop, a hold is a jump. +const jumpCutScale = .55; +const jumpPoseUs = 75000; +const crouchJumpPoseUs = 145000; +const crouchHopPoseUs = 190000; +const sinkDurationUs = 250000; +const hudTypeSize = 42; +// The command stream is a record of what you just did, so it is long enough to +// hold a whole exchange and it does not start dissolving while you are still +// playing. Only once the pad goes quiet does it age out, oldest glyph first, +// so the last thing you pressed is the last thing to leave. +const commandStreamDepth = 20; +const commandStreamRows = 5; +const commandStreamColumns = 8; +const commandStreamColumnsNow = () => compactLayout() ? 4 : commandStreamColumns; +const commandStreamTypeSize = (handleSize) => Math.max(18, + Math.round(handleSize * (compactLayout() ? .8 : .88))); +const commandHoldUs = 1100000; +const commandFadeUs = 1900000; +const replayButtons = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", + "A", "B", "X", "Y"]; +let cameraCenter = (worldLeft + worldRight) / 2; +let cameraWidth = worldRight - worldLeft; +let cameraCenterY = floorY - cameraWidth / cameraAspect / 2; +let cameraContainFloor = 0; +// What the containment floor was last frame, so its rate of growth can be +// measured. See `updateCameraDoll` — the doll eases toward the floor, and an +// ease that is not led always sits behind a target that keeps moving. +let previousContainmentWidth = 0; +// Two different distances, because they answer two different questions. +// +// `cameraPin` is where a single projected point stops being allowed to get any +// nearer. Nothing can clip a point — a shadow ellipse or a capsule end is one +// coordinate, not a face — so the best available answer is to hold it at a +// sane depth and accept that a thing behind the lens is drawn wrong. This is +// the distance the projection has always used. +const cameraPin = 80; +// `cameraNear` is the real near plane, and faces are cut at it. It is much +// closer than the pin on purpose. The cut is a straight line at constant +// depth, and where that line lands on screen is decided by how much the lens +// magnifies at the plane -- and this lens is only a tenth perspective in +// normal play, which dilutes that magnification tenfold. Clipping the floor at +// the pin distance put its cut line just inside the bottom of the frame and +// opened a band of sky under the fighters' feet. Ten times nearer drives the +// cut off screen for any camera that is meaningfully above the floor, and the +// coordinates it asks for in exchange are what the guard band is for. +const cameraNear = 8; +// World projection occupies [-1.4, 1.4]; the photo must stay behind even +// distant AIR DROP fighters. Native sprite depth accepts [-1.5, 1.5]. +const photoBackdropDepth = 1.49; +// Projected faces are cut to a band one viewport wide on every side before +// they are handed over. The scene is allowed to run off screen; it is not +// allowed to run off into coordinates the rasterizer cannot hold, which is +// what a vertex sitting on the near plane will otherwise ask for. +const guardBand = 1; +const clamp = (value, low, high) => Math.max(low, Math.min(high, value)); +const mixColor = (dark, light, amount) => dark.map((value, index) => + Math.round(value + (light[index] - value) * amount)); +const lerp = (from, to, amount) => from + (to - from) * amount; +const normalize3 = (point) => { + const length = Math.hypot(point.x, point.y, point.z) || 1; + return { x: point.x / length, y: point.y / length, z: point.z / length }; +}; +const globalLight = normalize3({ x: -.42, y: 1, z: -.28 }); +const cross3 = (a, b) => ({ x: a.y * b.z - a.z * b.y, + y: a.z * b.x - a.x * b.z, z: a.x * b.y - a.y * b.x }); +const dot3 = (a, b) => a.x * b.x + a.y * b.y + a.z * b.z; +const viewWidth = () => stageRight; +const viewCenterX = () => (stageLeft + stageRight) / 2; +const viewOffsetX = () => (stageRight - 1920) / 2; +const compactLayout = () => stageRight < 1500; +// Keep the HUD inside a traditional five-percent title-safe frame. On a +// 16:9 television this is deliberately deeper than the action-safe camera so +// a bezel, soundbar, or object in front of the screen does not hide status. +const hudSafeInset = () => clamp( + Math.round(Math.min(stageRight, viewHeight) * .05), + compactLayout() ? 24 : 48, 72); +const hudSafeRect = () => { + // The title-safe hedge and a hardware occlusion answer different threats, + // and only the deeper one matters at each edge: a bezel might hide the + // frame's rim, a notch definitely does. + const inset = hudSafeInset(); + return { left: stageLeft + Math.max(inset, viewInset.left + 14), + top: Math.max(inset, viewInset.top + 10), + right: stageRight - Math.max(inset, viewInset.right + 14), + bottom: viewHeight - Math.max(inset, viewInset.bottom + 10) }; +}; +const actionSafeRect = () => { + // A television is watched across a room behind a bezel; a reel is held at + // arm's length with nothing over its edges, so the action-safe frame there is + // a courtesy rather than a hedge against overscan. + const portrait = stageBottom - stageTop > stageRight - stageLeft; + // A landscape notch bites into the stage's own sides; fighters framed + // behind it are as lost as fighters past the edge. + const marginX = (portrait ? 18 : (compactLayout() ? 34 : 64)) + + Math.max(viewInset.left, viewInset.right); + const marginY = portrait ? 14 : 26; + return { left: stageLeft + marginX, top: stageTop + marginY, + right: stageRight - marginX, bottom: stageBottom - marginY }; +}; + +// The device's own occlusions, in game units: a phone's home indicator, a +// notch, rounded corners. The host measures them (env() on the web, native +// injection in the iOS shell, where a pinned scroll view zeroes env() out) +// and hands them through gameView; everything drawn against a screen edge — +// the stage bounds, the HUD safe frame, the touch clusters — stands off by +// them, because a control under the home indicator is a control the system +// swallows. +let viewInset = { top: 0, right: 0, bottom: 0, left: 0 }; + +function syncGameView() { + const next = typeof gameView === "function" ? gameView() : null; + const width = clamp(Math.round(Number(next?.width) || 1920), 480, 2880); + const height = clamp(Math.round(Number(next?.height) || 1080), 480, 2160); + const nextInset = {}; + for (const edge of ["top", "right", "bottom", "left"]) + nextInset[edge] = clamp(Math.round(Number(next?.inset?.[edge]) || 0), + 0, 220); + const inputFamily = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + const touch = inputFamily === "touch"; + const compact = width < 1500; + const inset = compact ? 22 : 30; + const nextTop = Math.max(82, inset + hudTypeSize + 16) + nextInset.top; + const bottomReserve = (touch + ? clamp(height * .36, 300, 390) + : clamp(height * .13, 112, 150)) + nextInset.bottom; + const nextBottom = Math.max(nextTop + 280, height - bottomReserve); + if (width === stageRight && height === viewHeight && + nextTop === stageTop && nextBottom === stageBottom && + ["top", "right", "bottom", "left"].every((edge) => + nextInset[edge] === viewInset[edge])) return; + stageRight = width; + viewHeight = height; + stageTop = nextTop; + stageBottom = nextBottom; + viewInset = nextInset; + cameraAspect = (stageRight - stageLeft) / (stageBottom - stageTop); + if (typeof cameraDoll !== "undefined") cameraDoll.dirty = true; +} + +class FightCamDoll { + constructor() { + this.position = { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.4 }; + this.target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + this.width = cameraWidth; + this.perspective = 0; + this.fov = 55; + this.roll = 0; + this.dirty = true; + this.view = null; + } + + track(spec, dt, speed = 5) { + // Exponential easing is continuous across frame rates. Move the dolly and + // its look target together so follow motion cannot shear into a sudden + // swivel when fighters cross a framing threshold. + const amount = 1 - Math.exp(-Math.max(0, dt) * speed); + const previousTarget = { ...this.target }; + for (const axis of ["x", "y", "z"]) + this.target[axis] = lerp(this.target[axis], spec.target[axis], amount); + for (const axis of ["x", "y", "z"]) + this.position[axis] += this.target[axis] - previousTarget[axis]; + for (const axis of ["x", "y", "z"]) { + this.position[axis] = lerp(this.position[axis], spec.position[axis], amount); + } + // Pull back promptly but never in a single frame; return close more + // slowly so small changes at the action-safe edge do not pump the lens. + const zoomSpeed = spec.width > this.width ? speed * 1.9 : speed * .58; + const zoomAmount = 1 - Math.exp(-Math.max(0, dt) * zoomSpeed); + this.width = lerp(this.width, spec.width, zoomAmount); + this.perspective = lerp(this.perspective, spec.perspective, amount); + this.fov = lerp(this.fov, spec.fov || 55, amount); + this.roll = lerp(this.roll, spec.roll || 0, amount); + this.dirty = true; + } + + snap(spec) { + this.target = { ...spec.target }; + this.position = { ...spec.position }; + this.width = spec.width; + this.perspective = spec.perspective; + this.fov = spec.fov || 55; + this.roll = spec.roll || 0; + this.dirty = true; + collapseRenderCameraInterpolation(); + } + + prepare() { + const forward = normalize3({ x: this.target.x - this.position.x, + y: this.target.y - this.position.y, z: this.target.z - this.position.z }); + const baseRight = normalize3(cross3(forward, { x: 0, y: -1, z: 0 })); + const baseUp = normalize3(cross3(baseRight, forward)); + const rollCos = Math.cos(this.roll); + const rollSin = Math.sin(this.roll); + const right = { x: baseRight.x * rollCos + baseUp.x * rollSin, + y: baseRight.y * rollCos + baseUp.y * rollSin, + z: baseRight.z * rollCos + baseUp.z * rollSin }; + const up = { x: baseUp.x * rollCos - baseRight.x * rollSin, + y: baseUp.y * rollCos - baseRight.y * rollSin, + z: baseUp.z * rollCos - baseRight.z * rollSin }; + this.view = { forward, right, up, + centerX: (stageLeft + stageRight) / 2, + centerY: (stageTop + stageBottom) / 2, + orthoScale: (stageRight - stageLeft) / this.width, + focal: (stageRight - stageLeft) / + (2 * Math.tan(this.fov * Math.PI / 360)) }; + this.dirty = false; + } + + // World space to camera space, with the near distance left alone. Anything + // that wants to survive contact with the near plane has to see the honest + // depth first — `project` is where it gets clamped, and a clamp is a lie for + // anything behind the lens. + toView(point, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { forward, right, up } = this.view; + const x = point.x - this.position.x, y = point.y - this.position.y; + const z = point.z - this.position.z; + out.x = x * right.x + y * right.y + z * right.z; + out.y = x * up.x + y * up.y + z * up.z; + out.z = x * forward.x + y * forward.y + z * forward.z; + return out; + } + + projectView(view, out = {}) { + if (this.dirty || !this.view) this.prepare(); + const { centerX, centerY, orthoScale, focal } = this.view; + const depth = Math.max(cameraNear, view.z); + const orthoX = centerX + view.x * orthoScale; + const orthoY = centerY - view.y * orthoScale; + const perspectiveX = centerX + view.x * focal / depth; + const perspectiveY = centerY - view.y * focal / depth; + out.x = lerp(orthoX, perspectiveX, this.perspective); + out.y = lerp(orthoY, perspectiveY, this.perspective); + out.z = clamp(depth / 16000 * 2.8 - 1.4, -1.4, 1.4); + return out; + } + + // A lone point cannot be clipped, so it is held at the pin rather than + // allowed to divide by a depth it does not have. Faces go through + // `worldTriangle`, which cuts them at the near plane and then comes back + // here with vertices that are already in front of it. + project(point) { + const view = this.toView(point); + view.z = Math.max(cameraPin, view.z); + return this.projectView(view); + } +} + +const cameraDoll = new FightCamDoll(); +const cameraScale = () => (stageRight - stageLeft) / cameraDoll.width; +let playerCameraYaw = 0; +let playerCameraPitch = 0; +// A multiplier on the framed width, so zoom rides on top of automatic framing +// rather than fighting it: the camera still guarantees both fighters are in +// shot, and this scales the result. Above 1 is wider. The ceiling is low on +// purpose -- a wide shot draws a wider span of terrain, and span IS the frame +// budget on a console whose JS never gets a JIT. +let playerCameraZoom = 1; +let triangleDepth = -1.4; +// A match frame submits ~2100 faces. Buffering them into a Float32Array first +// cost 5.7ms a frame where handing each one straight over costs 1.8ms — +// twelve typed-array element writes in QuickJS are dearer than twelve +// arguments to one C call. The batched host call itself measured 0.05ms, so +// the boundary crossing was never the expense. +const emitTriangle = typeof triangle3d === "function" ? triangle3d + : (x1, y1, z1, x2, y2, z2, x3, y3, z3, r, g, b) => + triangle(x1, y1, x2, y2, x3, y3, r, g, b); +// r/g/b stay positional so the hottest path in the piece doesn't build a rest +// array per face; the host defaults every missing channel to 255 the same way. +// +// The native buffer speaks int16: a coordinate past ±32768 — or the NaN a +// projection returns after crossing the camera plane — is a RangeError and a +// dead frame on console. Geometry that broken was never going to be visible, +// so the seam culls it instead of crashing. NaN fails a comparison on its +// own, which keeps the guard to plain compares on the hottest path. +const triangleSafe = (value) => value > -32200 && value < 32200; +function screenTriangle(x1, y1, x2, y2, x3, y3, r = 255, g = 255, b = 255) { + if (!(triangleSafe(x1) && triangleSafe(y1) && triangleSafe(x2) && + triangleSafe(y2) && triangleSafe(x3) && triangleSafe(y3))) return; + emitTriangle(x1, y1, triangleDepth, x2, y2, triangleDepth, + x3, y3, triangleDepth, r, g, b); +} +function screenRect(x, y, width, height, color) { + const [r, g, b] = color; + screenTriangle(x, y, x + width, y, x + width, y + height, r, g, b); + screenTriangle(x, y, x + width, y + height, x, y + height, r, g, b); +} +// On the native shell `box` and `line` are CPU-composited UNDER every GPU +// triangle — App.cpp paints rects, lines and block text into the CPU frame, +// uploads that as the scene texture, then draws the depth pass over it — so +// the frame meter, keycaps, clock and bot scaffolding sank behind the +// fighters and terrain. @jeffrey on the console, 2026-09-20: "the frame +// counter and stuff in the debug ui ... feels like its behind stuff". HUD +// boxes and lines ride the triangle pass there, at a depth in front of any +// body (bodies bottom out near -1.42; the shell maps (z + 1.5) / 3 into the +// depth buffer, LESS_EQUAL). The web shell keeps box/line as they were. +const nativeTrianglePass = typeof triangle3d === "function"; +// Native AC can composite diagnostic lines and rectangles after the scene. +let nativeHudOverlay = false; +const hudDepth = -1.48; +function hudBox(x, y, width, height, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { box(x, y, width, height, ...color); return; } + const previous = triangleDepth; + triangleDepth = hudDepth; + screenRect(x, y, width, height, color); + triangleDepth = previous; +} +function hudLine(x1, y1, x2, y2, width, ...color) { + if (!nativeTrianglePass || nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy) || 1; + const nx = -dy / length * Math.max(1, width) / 2; + const ny = dx / length * Math.max(1, width) / 2; + const previous = triangleDepth; + triangleDepth = hudDepth; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x2 + nx, y2 + ny, x2 - nx, y2 - ny, r, g, b); + screenTriangle(x1 + nx, y1 + ny, x2 - nx, y2 - ny, x1 - nx, y1 - ny, r, g, b); + triangleDepth = previous; +} +function hudWorldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + hudLine(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} +function hudCircle(x, y, radius, width, color) { + let lastX = x + radius, lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + hudLine(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; lastY = nextY; + } +} +function screenStrokeRect(x, y, width, height, thickness, color) { + screenRect(x, y, width, thickness, color); + screenRect(x, y + height - thickness, width, thickness, color); + screenRect(x, y + thickness, thickness, height - thickness * 2, color); + screenRect(x + width - thickness, y + thickness, + thickness, height - thickness * 2, color); +} +function projectedTriangle(a, b, c, color) { + if (!(triangleSafe(a.x) && triangleSafe(a.y) && triangleSafe(a.z) && + triangleSafe(b.x) && triangleSafe(b.y) && triangleSafe(b.z) && + triangleSafe(c.x) && triangleSafe(c.y) && triangleSafe(c.z))) return; + // Positional, not spread: see the note on emitTriangle above. Every face a + // frame submits comes through here, and `...color` built one throwaway + // iterator apiece for ~2100 of them. + emitTriangle(a.x, a.y, a.z, b.x, b.y, b.z, c.x, c.y, c.z, + color[0], color[1], color[2]); +} +// Sutherland-Hodgman, one plane at a time. Both clips below are the same walk: +// step the polygon's edges, keep the vertices that are inside, and whenever an +// edge crosses out or in, keep the crossing point too. +function clipPolygon(polygon, distance, mix) { + const kept = []; + for (let index = 0; index < polygon.length; index++) { + const current = polygon[index]; + const next = polygon[(index + 1) % polygon.length]; + const here = distance(current); + const there = distance(next); + if (here >= 0) kept.push(current); + if ((here >= 0) !== (there >= 0)) + kept.push(mix(current, next, here / (here - there))); + } + return kept; +} +const mixVertex = (a, b, amount) => ({ x: lerp(a.x, b.x, amount), + y: lerp(a.y, b.y, amount), z: lerp(a.z, b.z, amount) }); +// The near plane, in camera space, before the divide. This is the whole point: +// a vertex behind the lens has a negative depth, and pinning it to the near +// distance keeps its sideways offset while dividing by a distance it never +// had — so a face that crosses the plane used to shear halfway across the +// screen, or blow past the coordinate guard and vanish outright. Cutting it at +// the plane leaves only geometry that is honestly in front of the camera. +const clipViewNear = (polygon) => + clipPolygon(polygon, (vertex) => vertex.z - cameraNear, mixVertex); +// And the guard band, in screen space, after it. A vertex sitting exactly on +// the near plane projects to focal/near times its offset — twenty-three times, +// at this lens — so a legitimately visible floor can still ask for coordinates +// far outside anything the rasterizer will take. Cut it to a band a viewport +// wide instead of dropping the face and leaving a hole in the ground. +// The four band edges live at module scope over mutable bounds instead of +// being rebuilt as an array of closures per face — the walls cross the band +// every frame, and that little array was steady interpreter garbage. +let bandMinX = 0, bandMaxX = 0, bandMinY = 0, bandMaxY = 0; +const bandEdges = [ + (vertex) => vertex.x - bandMinX, + (vertex) => bandMaxX - vertex.x, + (vertex) => vertex.y - bandMinY, + (vertex) => bandMaxY - vertex.y, +]; +function clipScreenBand(polygon) { + const width = viewWidth(); + bandMinX = -width * guardBand; + bandMaxX = width * (1 + guardBand); + bandMinY = -viewHeight * guardBand; + bandMaxY = viewHeight * (1 + guardBand); + let clipped = polygon; + for (const distance of bandEdges) { + if (clipped.length < 3) return []; + clipped = clipPolygon(clipped, distance, mixVertex); + } + return clipped; +} +// One world-space face, all the way through: to camera space, cut at the near +// plane, projected, cut to the guard band, then fanned into whatever triangles +// are left. Zero of them is a face entirely behind the camera, which is a +// perfectly good answer. +// Whether a projected vertex already sits inside the guard band. A NaN fails +// every compare, so a broken projection falls through to the clipper. +function bandContains(vertex) { + const width = viewWidth(); + return vertex.x >= -width * guardBand && vertex.x <= width * (1 + guardBand) && + vertex.y >= -viewHeight * guardBand && + vertex.y <= viewHeight * (1 + guardBand); +} +// Scratch vertices never escape synchronous face submission or clipping. +const triangleView = [{}, {}, {}]; +const triangleScreen = [{}, {}, {}]; +function worldTriangle(a, b, c, color) { + const viewA = cameraDoll.toView(a, triangleView[0]); + const viewB = cameraDoll.toView(b, triangleView[1]); + const viewC = cameraDoll.toView(c, triangleView[2]); + // Nearly every face a frame submits sits whole in front of the lens and + // whole inside the guard band, and the console's interpreter was paying + // for six array allocations per face on the way to discovering that. + // Plain compares decide the common case; only a face that actually + // crosses a plane pays for the Sutherland-Hodgman walk. + if (viewA.z >= cameraNear && viewB.z >= cameraNear && viewC.z >= cameraNear) { + const pa = cameraDoll.projectView(viewA, triangleScreen[0]); + const pb = cameraDoll.projectView(viewB, triangleScreen[1]); + const pc = cameraDoll.projectView(viewC, triangleScreen[2]); + if (bandContains(pa) && bandContains(pb) && bandContains(pc)) { + projectedTriangle(pa, pb, pc, color); + return; + } + const banded = clipScreenBand([pa, pb, pc]); + for (let corner = 2; corner < banded.length; corner++) + projectedTriangle(banded[0], banded[corner - 1], banded[corner], color); + return; + } + const near = clipViewNear([viewA, viewB, viewC]); + if (near.length < 3) return; + const projected = near.map((vertex) => cameraDoll.projectView(vertex)); + if (projected.some((point) => !Number.isFinite(point.x) || + !Number.isFinite(point.y))) return; + // A near-plane fan can be a quad; fanning it before the band clip would + // clip the same interior edge twice, so the band takes the whole polygon. + const face = clipScreenBand(projected); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], color); +} +function projectPoint(x, y, z = 0) { + return cameraDoll.project({ x, y, z }); +} +const panAt = (x, z = 0) => clamp( + (projectPoint(x, cameraCenterY, z).x - viewCenterX()) / + Math.max(1, (stageRight - stageLeft) / 2 - 55), -1, 1); +const panPlayer = (player) => panAt(player.x, player.z); +let visualTheme = { light: 0, sunset: 0 }; + +const fighterRoster = [ + { handle: "@JEFFREY", color: [190, 42, 58], colors: [ + [255,105,190],[111,232,210],[255,105,190],[255,232,92], + [130,150,255],[255,105,190],[111,232,210],[255,232,92]], + mood: "New Media Instruments", + lastChat: "hmm this chat could use some ui love" }, + { handle: "@FIFI", color: [209, 100, 216], colors: [ + [209,100,216],[204,253,71],[35,100,255],[82,67,17],[5,249,137]], + mood: "nap", lastChat: "" }, + { handle: "@OSKIE", color: [38, 82, 176], colors: [ + [255,232,92],[255,105,190],[111,232,210],[255,232,92],[130,150,255],[255,105,190]], + mood: "", lastChat: "" }, + { handle: "@SAT", color: [130, 204, 213], colors: [ + [130,204,213],[161,232,0],[253,122,2],[222,90,205]], + mood: "i hope its not ai generated", lastChat: "meow" }, +]; +// Per-glyph color is how a community @handle carries its owner's identity. +// The house opponents are not people, so they hold one flat color each and +// let the glyph walk fall back to it. +const npcFighter = { handle: "DUMMY", color: [105, 125, 150], colors: [], + mood: "TRAINING DUMMY · NO BOT AI", lastChat: "" }; +const anonymousFighter = { handle: "", color: [72, 176, 156], colors: [ + [72,176,156],[118,214,188],[54,128,168],[230,205,92]], + mood: "ANONYMOUS", lastChat: "" }; +const spiderDummyFighter = { handle: "SPIDERDUMMY", color: [76, 88, 108], + colors: [], mood: "GIANT SEGMENTED TRAINING FOE · NO BOT AI", lastChat: "" }; +const botFighter = { handle: "BOT", color: [205, 48, 72], colors: [], + mood: "ANGRY TRAINING BOT", lastChat: "" }; +const peopleFighter = { handle: "PPL", color: [116, 122, 136], colors: [], + mood: "", lastChat: "" }; +// Self-play needs two nameplates nobody can mix up, or the result card reads +// "BOT WINS" with no way to tell which bot won. The colors here are only the +// fallback — each round deals fresh ones from the CSS color book below. +const selfPlayFighters = [ + { handle: "BOT 1", color: [205, 48, 72], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, + { handle: "BOT 2", color: [48, 118, 205], colors: [], + mood: "MECHANICAL TEST · SELF PLAY", lastChat: "" }, +]; + +// Self-play dresses its bots from the CSS color book instead of the house +// red and blue. The picks hash out of the round name, so the offline replay +// that repaints a reel deals the same pairing the live pass wore, and every +// round is a fresh matchup. The book carries only names that can hold a +// nameplate on either theme — the washed-out and near-black entries stay +// home — and the second pick stands off a sixth of the color wheel from the +// first so the result card never reads as a mirror match. +const cssColorBook = ("crimson dc143c,firebrick b22222,red ff0000," + + "orangered ff4500,tomato ff6347,coral ff7f50,darkorange ff8c00," + + "orange ffa500,gold ffd700,goldenrod daa520,darkgoldenrod b8860b," + + "yellowgreen 9acd32,chartreuse 7fff00,lawngreen 7cfc00,limegreen 32cd32," + + "forestgreen 228b22,green 008000,seagreen 2e8b57,mediumseagreen 3cb371," + + "springgreen 00ff7f,mediumspringgreen 00fa9a,lightseagreen 20b2aa," + + "teal 008080,darkcyan 008b8b,darkturquoise 00ced1,turquoise 40e0d0," + + "mediumturquoise 48d1cc,cadetblue 5f9ea0,deepskyblue 00bfff," + + "dodgerblue 1e90ff,cornflowerblue 6495ed,steelblue 4682b4," + + "royalblue 4169e1,blue 0000ff,mediumblue 0000cd,darkslateblue 483d8b," + + "slateblue 6a5acd,mediumslateblue 7b68ee,mediumpurple 9370db," + + "blueviolet 8a2be2,darkviolet 9400d3,darkorchid 9932cc," + + "mediumorchid ba55d3,orchid da70d6,violet ee82ee,magenta ff00ff," + + "mediumvioletred c71585,deeppink ff1493,hotpink ff69b4," + + "palevioletred db7093,indianred cd5c5c,salmon fa8072,darksalmon e9967a," + + "lightcoral f08080,rosybrown bc8f8f,sienna a0522d,chocolate d2691e," + + "peru cd853f,sandybrown f4a460,olivedrab 6b8e23,olive 808000," + + "darkkhaki bdb76b,rebeccapurple 663399,aquamarine 7fffd4," + + "mediumaquamarine 66cdaa,lightgreen 90ee90,skyblue 87ceeb," + + "lightskyblue 87cefa,plum dda0dd,khaki f0e68c,greenyellow adff2f," + + "yellow ffff00,cyan 00ffff,lime 00ff00").split(",").map((entry) => { + const [name, hex] = entry.split(" "); + const value = parseInt(hex, 16); + return { name, rgb: [value >> 16 & 255, value >> 8 & 255, value & 255] }; + }).filter(({ rgb }) => { + const high = Math.max(...rgb); + const low = Math.min(...rgb); + return high - low >= 60 && high + low >= 140 && high + low <= 400; + }); + +const hueOf = ([red, green, blue]) => { + const high = Math.max(red, green, blue); + const low = Math.min(red, green, blue); + const span = high - low || 1; + const sixth = high === red ? (green - blue) / span + : high === green ? 2 + (blue - red) / span : 4 + (red - green) / span; + return (sixth * 60 + 360) % 360; +}; + +function selfPlayWardrobe(pad) { + if (typeof globalThis.__oskiewarJevPad === 'function') + return { name: pad === 0 ? 'JEV PINK' : 'JEV BLUE', rgb: pad === 0 ? [255, 90, 170] : [65, 195, 255] }; + const round = matchName || seriesName; + const first = cssColorBook[Math.floor( + hashUnit(round + " one") * cssColorBook.length) % cssColorBook.length]; + if (pad === 0) return first; + const start = Math.floor(hashUnit(round + " two") * cssColorBook.length); + for (let step = 0; step < cssColorBook.length; step++) { + const pick = cssColorBook[(start + step) % cssColorBook.length]; + const apart = Math.abs(hueOf(pick.rgb) - hueOf(first.rgb)); + if (Math.min(apart, 360 - apart) >= 60) return pick; + } + return cssColorBook[(start + 1) % cssColorBook.length]; +} + +function losAngelesSun() { + const radians = Math.PI / 180; + const days = Date.now() / 86400000 + 2440587.5 - 2451545; + const meanLongitude = (280.46 + .9856474 * days) % 360; + const meanAnomaly = (357.528 + .9856003 * days) % 360; + const eclipticLongitude = meanLongitude + 1.915 * Math.sin(meanAnomaly * radians) + + .02 * Math.sin(2 * meanAnomaly * radians); + const obliquity = 23.439 - .0000004 * days; + const rightAscension = Math.atan2(Math.cos(obliquity * radians) * + Math.sin(eclipticLongitude * radians), Math.cos(eclipticLongitude * radians)) / + radians; + const declination = Math.asin(Math.sin(obliquity * radians) * + Math.sin(eclipticLongitude * radians)); + const siderealHours = 18.697374558 + 24.06570982441908 * days; + let hourAngle = ((siderealHours * 15 - 118.2437 - rightAscension + 540) % 360) - 180; + const latitude = 34.0522 * radians; + const altitude = Math.asin(Math.sin(latitude) * Math.sin(declination) + + Math.cos(latitude) * Math.cos(declination) * + Math.cos(hourAngle * radians)) / radians; + const light = clamp((altitude + 6) / 14, 0, 1); + const sunset = clamp(1 - Math.abs(altitude - 1) / 11, 0, 1) * + (hourAngle > 0 ? 1 : .42); + return { light: light * light * (3 - 2 * light), sunset }; +} + +function displayTheme() { + if (globalThis.__oskiewarTheme === "dark") return {light:0, sunset:0}; + const sun = losAngelesSun(); + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.platform === "web" || caps.platform === "macos") { + return { ...sun, light: caps.colorScheme === "light" ? 1 : 0 }; + } + return sun; +} +// Nameless until somebody says who they are. These two used to boot as +// @JEFFREY and @OSKIE — the first and third entries of the local roster — and +// every path that failed to learn a real identity quietly fell through to +// them. That is how an anonymous visitor alone in a dead room was shown +// "@JEFFREY vs @OSKIE" and told "YOU ARE @OSKIE — RIGHT SIDE". An empty name +// is the honest state and the wire already speaks it: spectatorState sends "" +// as NOBODY, and the HUD reads it as "THE SECOND FIGHTER". +const players = [ + { name: "", rosterIndex: -1, handleColors: anonymousFighter.colors, + // Spawn marks stand on the centers of tiles 3 and 6 — mirrored across + // the cube's middle, three tiles from the pistol's corner. Three + // matters: a pickup takes any limb within 90, a standing fighter's arms + // reach most of a tile past the mark, and two tiles of gap was close + // enough that the bell handed the weapon out before anyone moved. + pad: 0, spawnX: tileCenterX(spawnColLeft), x: tileCenterX(spawnColLeft), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: 1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: anonymousFighter.color.slice(), hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: 1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, + { name: "", rosterIndex: -1, handleColors: [], + npc: false, bot: false, remote: false, + pad: 1, spawnX: tileCenterX(spawnColRight), x: tileCenterX(spawnColRight), + y: floorY, z: 0, + vx: 0, vy: 0, vz: 0, facing: -1, + grounded: true, ducking: false, previous: [], lastButton: "NONE", + lastButtonAt: 0, color: [38, 82, 176], hit: 0, + hitSegment: -1, hitSegmentUntil: 0, hitStunUntil: 0, + alive: true, respawnAt: 0, score: 0, inputX: 0, inputY: 0, + skateboard: false, skateVx: 0, skateWallSide: 0, + suppressedDirections: [], + lastTap: {}, lastRelease: {}, dashUntil: 0, dashVx: 0, runSince: 0, + walkSince: 0, roundWins: 0, + attackKind: "", attackStartedAt: 0, + attackUntil: 0, attackHit: false, blocking: false, blockFlash: 0, + shieldLocked: false, shieldBrokenAt: 0, + shieldCrouched: false, shieldAimX: 0, shieldAimY: 0, + windVx: 0, knockVx: 0, gunAmmo: 0, grenadeAmmo: 0, + gunAimX: -1, gunAimY: 0, gunAimLive: false, gunMode: "HANDGUN", + nextGunShotAt: 0, + stance: "NEUTRAL", + heldBall: -1, heldPart: -1, heldPlayer: -1, grabbedBy: -1, + grabHeld: false, crouchBlend: 0, standingOn: -1, + partDamage: {}, removedParts: [], pogoHit: false, pogoDive: false, + pounding: false, poundFrom: 0, poundLevel: 0, + commandStream: [], + botPresses: {}, + jumpLaunchAt: 0, jumpPoseUntil: 0, landPoseUntil: 0, + jumpHeld: false, airJumpsUsed: 0, hopUntil: 0, sinkUntil: 0, + sinkFrom: 0, + crouchJump: false, attackMomentum: 1 }, +]; +const thirdPlayerTemplate = JSON.stringify(players[1]); +const freeForAll = () => localVersusActive() && players.length === 3; +const rivalsOf = (player) => players.filter((other) => + other !== player && other.alive).sort((a, b) => + Math.hypot(a.x - player.x, a.y - player.y, a.z - player.z) - + Math.hypot(b.x - player.x, b.y - player.y, b.z - player.z)); +const nearestRival = (player) => rivalsOf(player)[0] || + players.find((other) => other !== player); +function roundWinner() { + const contenders = freeForAll() ? players.filter((player) => player.alive) : players; + if (freeForAll() && contenders.length <= 1) return contenders[0] || null; + const best = Math.max(...contenders.map((player) => player.score)); + const leaders = contenders.filter((player) => player.score === best); + return leaders.length === 1 ? leaders[0] : null; +} +function setLocalPlayerCount(count) { + if (count === 3 && players.length === 2) { + const third = JSON.parse(thirdPlayerTemplate); + third.pad = 2; + players.push(third); + frameMeters.push([]); + } else if (count === 2) { + players.length = 2; + frameMeters.length = 2; + } +} +// Who the camera, the scorekeeping and the reactions believe is on stage. +// Survival and the versus lobby are both one-body rooms — the second chair +// is parked off the map until somebody takes it. +const activePlayers = () => + survivalActive() || lobbyActive() ? [players[0]] : players; +const impacts = []; + +// Every impact gets a number, in order, for the life of the run. A watcher +// cannot be told "here is a new spark" by a stateless frame that repeats the +// same list ten times — it has to be able to tell which ones it has already +// seen, and a position is not an identity. The counter is simulation state: +// a rollback that re-spawns an impact must re-issue the same number. +let impactSequence = 0; + +function spawnImpact(impact) { + impact.id = ++impactSequence; + impacts.push(impact); + return impact; +} + +const detachedParts = []; +const bullets = []; +const grenades = []; +// The station's arsenal, said out loud: a pistol on the floor, a space laser +// at the top of the climb, a light saber over each fighter's own head. The +// cube could carry exactly one weapon, and the comment here used to say why +// — "a one-room box has no shelf to price them on". A station HAS shelves. +// Height is the price again, the way it was in the tower, and each of the +// three is priced differently on purpose: +// +// pistol — floor, far corner, behind the right spawn. The oldest bargain +// in this game and unchanged: turn your back on the other fighter to arm +// up, or rush the middle bare-handed. Six rounds that ricochet forever. +// space laser — the high centre deck, three jumps up, contested from both +// sides. Four bolts, no ricochet, and fast enough that it is a line you +// draw rather than a shot you lead. Missing it costs the bolt outright. +// light saber — one on each low deck, mirrored, one jump off your own +// spawn. It is the only free weapon and the only fair one, and it buys +// reach on every hand strike rather than a projectile. +// +// The blade came and went inside one build back in the cube — @jeffrey tried +// a sword-and-pistol standoff and asked for fists and one gun instead. The +// objection was to a duel in a phone booth, and the whole drawing machinery +// (`swordHeld`, the hilt pinned to the item forearm) survived it intact. A +// map with distance in it is the condition that was missing. +// +// `cycle` marks the slot the ten-second powerup rotation owns. Only the +// pistol carries it, so an untouched laser can never stall the reload that +// keeps the floor fight fed. +const gunPickups = [ + { kind: "HANDGUN", amount: 6, x: tileCenterX(cornerColRight), + startsActive: true, cycle: true, y: floorY, z: 0 }, + { kind: "SPACE LASER", amount: 4, x: centerX, startsActive: true, + cycle: false, y: parkDecks[3].y, z: 0 }, + { kind: "ROCKET LAUNCHER", amount: 3, x: tileCenterX(cornerColLeft), + startsActive: true, cycle: false, y: floorY, z: 0 }, +]; +// A saber is not ammunition, so it is not a gun pickup: taking one sets a +// state a fighter keeps until the arm holding it comes off. Mirrored across +// the two low decks, centred on each deck rather than on a tile, because the +// deck is the landmark a player actually reads. +const saberPickups = [ + { kind: "LIGHT SABER", x: (parkDecks[1].left + parkDecks[1].right) / 2, + y: parkDecks[1].y, z: 0, startsActive: true }, + { kind: "LIGHT SABER", x: (parkDecks[2].left + parkDecks[2].right) / 2, + y: parkDecks[2].y, z: 0, startsActive: true }, +]; +const grenadePickups = [ + { amount: 3, x: centerX - 450, y: floorY, z: 0, startsActive: true }, + { amount: 3, x: centerX + 450, y: floorY, z: 0, startsActive: true }, +]; +// No trees. Two grew out of the tower's side walls and were the only thing +// in a round that gave a body back; in the cube their ripe fruit read as a +// coconut hanging over the fight, and @jeffrey asked for it gone. The +// consequence is the point now: a fighter taken apart limb by limb stays +// that way until the bell. The grower/harvest machinery below sleeps on +// this empty list. +const bodyTrees = []; +const treeRipenUs = 18000000; +const treeTimeBonusUs = 15000000; +const airParticles = []; +for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + // A pickup names its tile and floats seventy above that tile's surface — + // the same float the old ledges used, and it keeps a real-sized weapon + // from reading as a decal painted on the floor. + pickup.y = surfaceYAt(pickup.x, pickup.y) - 70; +} +// Every kind carries a gravity factor so redressing the match ball in place +// can never leave a previous kind's float behind. +// +// The skateboard is map furniture; it never replaces the match ball. +const ballKinds = [ + { type: "soccer", spawnOwner: 0, radius: 38, mass: .72, hitScale: 1.12, + bounce: .58, drag: .994, windFactor: .58, gravityFactor: 1 }, + { type: "basketball", spawnOwner: 1, radius: 42, mass: 1.08, hitScale: .86, + bounce: .76, drag: .989, windFactor: .34, gravityFactor: 1 }, + { type: "beach", spawnOwner: -1, radius: 46, mass: .34, hitScale: 1.25, + bounce: .82, drag: .998, windFactor: 1.35, gravityFactor: .62 }, + { type: "skateboard", spawnOwner: -1, radius: 52, mass: .9, hitScale: .7, + bounce: .34, drag: .992, windFactor: .5, gravityFactor: .5, + series: false }, +]; +let matchBallType = ballKinds[0].type; +const skateBoardKind = ballKinds.find((kind) => kind.type === "skateboard"); +// A match inflates exactly one ball and keeps it for every round, and the +// station parks exactly one board on the floor at centre. Two entries in one +// array because they are the same kind of object to every routine that +// touches them — swept contact, ledge support, shadows, the wire format — +// and because the board's whole mount path is written against a ball rolling +// into a shin. +const balls = [{ ...ballKinds[0], z: 0, vx: 0, vy: 0, rotation: 0, + x: players[0].spawnX, y: floorY - ballKinds[0].radius, + active: true, serveAt: 0, lastHitBy: 0, safeUntil: 0, safePlayers: 0, + heldBy: -1 }, +...[cornerColLeft, 20, 32].map((spawnCol) => ({ ...skateBoardKind, spawnCol, riderPad: -1, z: 0, vx: 0, vy: 0, rotation: 0, + x: tileCenterX(spawnCol), y: floorY - skateBoardKind.radius, + active: true, serveAt: 0, lastHitBy: -1, safeUntil: 0, safePlayers: 0, + heldBy: -1 }))]; +// Version-one replay/spectator consumers still read the first ball by name. +const ball = balls[0]; +// The board is not gated by `ballEnabled`. That switch is the ball's — it +// takes the serve, the cross-wack and the BALLED death off the map together — +// and the board shares none of them. +let skateBoardEnabled = true; +// The ball is out of the round — @jeffrey asked for the cube bare. All of +// the ball's machinery (serve, boot, carry, cross-wack, the BALLED death) +// sleeps behind this switch exactly as it always did for the test harness; +// flipping it back on is the whole re-installation. +let ballEnabled = false; + +function mapHash(text) { + let hash = 2166136261; + for (const character of String(text || "oskiewar")) { + hash ^= character.charCodeAt(0); + hash = Math.imul(hash, 16777619); + } + return hash >>> 0; +} +let currentMapName = "HALFPIPE"; +let currentMapId = "halfpipe"; +let workshopBase = null; +// Workshop edits are local practice state. They never enter rollback matches +// or the competitive replay ledger; documents are saved separately. +let workshopMap = null; +let workshopRevision = 0; +let workshopHistory = []; +let workshopHighlight = false; +let workshopTainted = false; + +let localMapIndex = -1; +let localMapMode = ""; +let localMapInstalled = false; +let netRoundMapIndex = -1; +const localMapVariants = [null, { + name: "BOWL", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "transition", rise: 360, dir: -1, lift: -360 }, + { from: 16, to: 24, kind: "flat", lift: -360 }, + { from: 24, to: 28, kind: "transition", rise: 360, dir: 1, lift: -360 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 9, cols: 4, row: 3 }, { col: 27, cols: 4, row: 3 }], +}, { + name: "HIGH GROUND", + features: [ + { from: 0, to: 12, kind: "flat" }, + { from: 12, to: 16, kind: "bank", rise: 270, dir: 1 }, + { from: 16, to: 24, kind: "flat", lift: 270 }, + { from: 24, to: 28, kind: "bank", rise: 270, dir: -1 }, + { from: 28, to: 40, kind: "flat" }, + ], + decks: [{ col: 7, cols: 4, row: 3 }, { col: 18, cols: 4, row: 7 }, + { col: 29, cols: 4, row: 3 }], +}, { + name: "PUMP TRACK", + features: [ + { from: 0, to: 6, kind: "flat" }, + ...[6, 14, 22, 30].flatMap(from => [ + { from, to: from + 3, kind: "bank", rise: 180, dir: 1 }, + { from: from + 3, to: from + 5, kind: "flat", lift: 180 }, + { from: from + 5, to: from + 8, kind: "bank", rise: 180, dir: -1 }, + ]), + { from: 38, to: 40, kind: "flat" }, + ], + decks: [{col: 17, cols: 6, row: 6}], +}, { + name: "TWIN BOWLS", + features: [ + {from: 0, to: 4, kind: "flat"}, + ...[4, 22].flatMap(from => [ + {from, to: from + 3, kind: "transition", rise: 270, dir: -1, lift: -270}, + {from: from + 3, to: from + 9, kind: "flat", lift: -270}, + {from: from + 9, to: from + 12, kind: "transition", rise: 270, dir: 1, lift: -270}, + {from: from + 12, to: from + 18, kind: "flat"}, + ]), + ], + decks: [{col: 8, cols: 4, row: 3}, {col: 26, cols: 4, row: 3}], +}, { + name: "LAUNCH PAD", + features: [ + {from: 0, to: 6, kind: "flat", lift: 360}, + {from: 6, to: 10, kind: "bank", rise: 360, dir: -1}, + {from: 10, to: 16, kind: "flat"}, + {from: 16, to: 20, kind: "bank", rise: 270, dir: 1}, + {from: 20, to: 24, kind: "bank", rise: 270, dir: -1}, + {from: 24, to: 30, kind: "flat"}, + {from: 30, to: 34, kind: "bank", rise: 360, dir: 1}, + {from: 34, to: 40, kind: "flat", lift: 360}, + ], + decks: [{col: 8, cols: 4, row: 6}, {col: 18, cols: 4, row: 9}, + {col: 28, cols: 4, row: 6}], +}]; +localMapVariants.push({ + name: "CORAL STEPS", + features: [ + {from:0, to:8, kind:"flat"}, + {from:8, to:12, kind:"bank", rise:180, dir:1}, + {from:12, to:16, kind:"flat", lift:180}, + {from:16, to:20, kind:"bank", lift:180, rise:180, dir:1}, + {from:20, to:24, kind:"bank", lift:180, rise:180, dir:-1}, + {from:24, to:28, kind:"flat", lift:180}, + {from:28, to:32, kind:"bank", rise:180, dir:-1}, + {from:32, to:40, kind:"flat"}, + ], + decks:[{col:4,cols:4,row:4},{col:18,cols:4,row:8},{col:32,cols:4,row:4}], +}, { + ...localMapVariants[1], name:"SLOW MOTION", modifier:"slow", +}, { + name:"AIR DROP", modifier:"air", skateboard:false, + features:[{from:0,to:40,kind:"flat"}], decks:[], +}); +const roundMapIds = ["halfpipe", "bowl", "high-ground", "pump-track", "twin-bowls", "launch-pad", + "coral-steps", "slow-motion", "air-drop"]; +const roundMapColors = [ + {sky:[218,239,255], night:[8,23,34], floor:[45,191,185], deck:[255,154,72]}, + {sky:[246,225,255], night:[27,13,39], floor:[181,107,237], deck:[76,220,188]}, + {sky:[255,231,203], night:[34,19,18], floor:[246,150,58], deck:[74,177,232]}, + {sky:[225,247,214], night:[9,29,27], floor:[119,192,66], deck:[234,103,169]}, + {sky:[255,224,231], night:[34,12,29], floor:[231,101,146], deck:[93,193,222]}, + {sky:[224,234,255], night:[13,19,43], floor:[90,139,234], deck:[250,202,67]}, + {sky:[255,235,205], night:[34,15,30], floor:[248,108,92], deck:[66,214,201]}, + {sky:[239,222,255], night:[25,15,43], floor:[122,94,201], deck:[245,176,238]}, + {sky:[125,208,255], night:[8,18,39], floor:[93,158,243], deck:[255,244,168]}, +]; +function roundMapDocument(index) { + const variant = localMapVariants[index]; + return variant ? {...workshopBase, ...variant, + features: variant.features.map(f => ({lift:0, rise:0, dir:1, ...f}))} : workshopBase; +} +function installRoundMap(index) { + installWorkshopMap(roundMapDocument(index), true); + currentMapId = roundMapIds[index]; +} + +function rotateLocalMap(keepMap, resetMatch) { + const local = localVersusActive(); + const training = !selfPlay && ["dummy", "spiderdummy", "trainingbot", "bot"] + .includes(fightOpponent); + if (skateparkMap || (!local && !training) || workshopTainted || + globalThis.__oskiewarPublishedMap) return; + const mode = local ? "local" : "training"; + if (localMapMode !== mode) { localMapIndex = -1; localMapMode = mode; } + // Returning to the title mid-round keeps its map. A completed solo round + // advances before the next START, just like the local versus rollover. + if (localMapIndex < 0 || (!keepMap && (local || !resetMatch || roundResult))) + localMapIndex = (localMapIndex + 1) % localMapVariants.length; + const variant = localMapVariants[localMapIndex]; + const map = variant ? { ...workshopBase, ...variant, + features: variant.features.map(f => ({ lift: 0, rise: 0, dir: 1, ...f })) } + : workshopBase; + if (local || variant) installWorkshopMap(map, true); + else currentMapName = "HALFPIPE"; + currentMapId = roundMapIds[localMapIndex]; + localMapInstalled = local || Boolean(variant); +} + +function workshopSnapshot() { + return { format: "ac.oskiewar.map", version: 1, + name: workshopMap?.name || currentMapName, + features: parkSegments.map(({ from, to, kind, lift, rise, dir }) => + ({ from, to, kind, lift: lift || 0, rise: rise || 0, dir: dir || 1 })), + decks: parkDecks.map(d => ({ col: (d.left - gridLeft) / tileSize, + cols: (d.right - d.left) / tileSize, row: (floorY - d.y) / tileSize })), + spawns: players.slice(0, 2).map(p => (p.spawnX - gridLeft) / tileSize - .5), + pickups: workshopMap?.pickups.map(p => ({ ...p })) || + [...gunPickups, ...saberPickups, ...grenadePickups].filter(p => p.startsActive) + .map(p => ({ kind: p.kind || "GRENADE", col: tileCol(p.x), amount: p.amount || 0 })), + skateboard: skateBoardEnabled }; +} + +function installWorkshopMap(map, cycleHandgun = false) { + if (skateparkMap) { configureWorldMap("station"); resetSkateRopes(); } + localMapInstalled = false; + workshopMap = map; + roundModifier = map.modifier || ""; + parkSegments.splice(0, parkSegments.length, ...map.features.map(f => ({ ...f, + left: gridLeft + f.from * tileSize, right: gridLeft + f.to * tileSize }))); + parkDeepest = floorY + Math.max(0, ...parkSegments.map(s => -s.lift)); + rebuildTerrainProfile(); + parkDecks.splice(0, parkDecks.length, ...map.decks.map((d, i) => ({ level: i + 1, + left: gridLeft + d.col * tileSize, right: gridLeft + (d.col + d.cols) * tileSize, + y: floorY - d.row * tileSize }))); + players.forEach((p, i) => { p.spawnX = tileCenterX(map.spawns[i] ?? + (map.spawns[0] + map.spawns[1]) / 2); }); + installMapPickups(gunPickups, map.pickups.filter(p => + !["GRENADE", "LIGHT SABER"].includes(p.kind)), "gun"); + // Portable maps contain authored pickups, not the built-in refill policy. + const pistol = gunPickups.find(p => p.kind === "HANDGUN"); + if (cycleHandgun && pistol) pistol.cycle = true; + installMapPickups(saberPickups, map.pickups.filter(p => p.kind === "LIGHT SABER"), "saber"); + installMapPickups(grenadePickups, map.pickups.filter(p => p.kind === "GRENADE"), "grenade"); + skateBoardEnabled = map.skateboard; + currentMapName = map.name; + currentMapId = "workshop-" + mapHash(JSON.stringify(map)).toString(36); + // Reconcile newly raised floors without restarting the players' exchange. + for (const p of players) { + const ground = terrainFloorAt(p.x); + if (p.y > ground || p.grounded) { p.y = ground; p.vy = 0; p.grounded = true; } + } + renderPreviousState = null; +} + +function workshopCommand(command) { + if (!globalThis.__oskiewarWorkshopEnabled) throw new Error("Coach editing is off"); + if ((netSession && netSession.seat !== 0) || roundViewer || survivalActive() || resimActive) + throw new Error("Edit through the room host; survival and replay editing are unavailable"); + if (!command || typeof command !== "object") throw new Error("Expected a workshop command"); + const { op } = command; + if (op === "inspect") return { room: "ow-" + (versusRoomName || sessionName), + revision: workshopRevision, map: workshopSnapshot(), + highlights: workshopHighlight, undo: workshopHistory.length, + units: { columns: gridCols, tileSize, floorY }, + players: players.map(p => ({ x: p.x, y: p.y, spawnX: p.spawnX })) }; + if (op === "highlight") { + if (typeof command.enabled !== "boolean") throw new Error("Supply enabled: true or false"); + workshopHighlight = command.enabled; + return workshopCommand({ op: "inspect" }); + } + if (command.revision !== workshopRevision) throw new Error("Map changed; inspect and use its revision"); + if (!["apply", "drop", "undo", "reset-round", "restart-level"].includes(op)) + throw new Error("Unknown workshop operation"); + let map; + if (op === "undo") { + if (!workshopHistory.length) throw new Error("Nothing to undo"); + map = workshopHistory[workshopHistory.length - 1]; + } else { + map = op === "apply" ? command.map : workshopSnapshot(); + if (op === "drop") map.pickups.push(command.item); + } + map = globalThis.__oskiewarValidateMap(map); + if (netSession) { + const session = netSession; + if (session.send({ t: "workshop", o: session.originUs }) === false) + throw new Error("The peer connection is not ready for editing"); + workshopTainted = true; + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + } + if (op === "undo") workshopHistory.pop(); + else if (!["reset-round", "restart-level"].includes(op)) { + workshopHistory.push(workshopSnapshot()); + if (workshopHistory.length > 20) workshopHistory.shift(); + } + workshopTainted = true; + workshopRevision++; + installWorkshopMap(map); + if (op === "reset-round" || op === "restart-level") + resetRound(runtime().monotonicUs, op === "restart-level"); + return workshopCommand({ op: "inspect" }); +} + +function installMapPickups(target, authored, type) { + target.length = 0; + for (const entry of authored) { + const x = tileCenterX(entry.col); + target.push({ + ...(type === "gun" ? { kind: entry.kind, amount: entry.amount, + cycle: Boolean(entry.cycle) } : {}), + ...(type === "saber" ? { kind: "LIGHT SABER" } : {}), + ...(type === "grenade" ? { amount: entry.amount } : {}), + x, y: terrainFloorAt(x) - 70, z: 0, + active: true, startsActive: true, respawnAt: 0, + }); + } +} + +function resetWorkshopMap() { + if (!workshopMap) return; + if (!localMapInstalled && + (globalThis.__oskiewarWorkshopEnabled || globalThis.__oskiewarPublishedMap) && + !survivalActive() && !roundViewer && !resimActive) { + installWorkshopMap(workshopMap); + return; + } + const spawns = players.map(p => p.spawnX); + installWorkshopMap(workshopBase, true); + workshopMap = null; + workshopHistory = []; + workshopRevision++; + currentMapName = "HALFPIPE"; + currentMapId = "halfpipe"; + if (versusLane() || survivalActive()) players.forEach((p, i) => { p.spawnX = spawns[i]; }); +} + + +// Physics remains an exact 60 Hz story. Rendering may happen between those +// authored instants—especially during slow motion—so retain the state that +// entered each tick and blend only presentation coordinates toward the state +// that left it. The authoritative objects are restored immediately after +// paint; collision, replay capture and networking never see interpolated data. +let renderPreviousState = null; +const renderInterpolationFields = { + player: ["x", "y", "z", "headRoll", "crouchBlend"], + bullet: ["x", "y", "z", "previousX", "previousY"], + grenade: ["x", "y", "z", "previousX", "previousY", "blastRadius"], + ball: ["x", "y", "z", "rotation"], + detached: ["x1", "y1", "z1", "x2", "y2", "z2"], + debris: ["x", "y", "z"], + camera: ["width", "roll", "perspective", "fov"], + cameraPoint: ["x", "y", "z"], +}; + +function renderInterpolationObjects() { + return [ + ...players.map((object) => [object, renderInterpolationFields.player]), + ...bullets.map((object) => [object, renderInterpolationFields.bullet]), + ...grenades.map((object) => [object, renderInterpolationFields.grenade]), + ...balls.map((object) => [object, renderInterpolationFields.ball]), + ...detachedParts.map((object) => [object, renderInterpolationFields.detached]), + ...impacts.flatMap((impact) => (impact.debris || []) + .map((object) => [object, renderInterpolationFields.debris])), + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]; +} + +function captureRenderInterpolationState() { + renderPreviousState = new Map(); + for (const [object, fields] of renderInterpolationObjects()) + renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +// A camera snap is an edit, not motion. If it happens inside a simulation +// tick, replace the retained camera sample too; otherwise fractional-speed +// paint blends the new close-up with the old wide shot and frame one lands +// halfway between them. +function collapseRenderCameraInterpolation() { + if (!renderPreviousState) return; + for (const [object, fields] of [ + [cameraDoll, renderInterpolationFields.camera], + [cameraDoll.position, renderInterpolationFields.cameraPoint], + [cameraDoll.target, renderInterpolationFields.cameraPoint], + ]) renderPreviousState.set(object, Object.fromEntries(fields + .filter((field) => Number.isFinite(object[field])) + .map((field) => [field, object[field]]))); +} + +function beginRenderInterpolation(alpha) { + const amount = clamp(Number(alpha), 0, 1); + if (!renderPreviousState || amount >= .999) return () => {}; + const restore = []; + for (const [object, fields] of renderInterpolationObjects()) { + const previous = renderPreviousState.get(object); + if (!previous) continue; + for (const field of fields) { + if (!Number.isFinite(previous[field]) || !Number.isFinite(object[field])) + continue; + restore.push([object, field, object[field]]); + object[field] = lerp(previous[field], object[field], amount); + } + } + cameraDoll.dirty = true; + return () => { + for (const [object, field, value] of restore) object[field] = value; + cameraDoll.dirty = true; + }; +} +let padSnapshots = [null, null]; +// The pad each fighter actually feels. A bot writes its synthesized presses +// here, so the HUD, the debug read-out, the replay and the physics all read +// bot input off the same wire as a hand on a controller. +let inputPads = [null, null]; +let startedAt = 0; +let roundStartedAt = 0; +let lastSimAt = 0; +let roundElapsedUs = 0; +const fightHitMarks = []; +globalThis.__oskiewarFightHitMarks = fightHitMarks; +let lastCountdownSecond = -1; +// The intro's own clock: which "3, 2, 1" second last rang, and whether the +// round-open accent has fired. -1 means the accent is still owed. +let lastIntroSecond = 0; +// The scored tail's clocks: the next heartbeat of the killcam dwell, and +// whether the result card has had its sting. +let resultPulseAt = 0; +let resultLaughAt = 0; +let resultLaughStep = 0; +let resultCardStung = false; +const resultReactionPrevious = [[], [], []]; +let roundOverAt = 0; +let roundResult = ""; +// How long a reel holds the opening matchup card. Long enough to read two +// names on a phone, short enough that the fight plays under a clean frame. +const REEL_MATCHUP_SECONDS = 2.6; +let matchOver = false; +let roundCause = ""; +let deathCinematic = null; +let impactHitboxesUntil = 0; +let nextPowerupAtUs = powerupIntervalUs; +let powerupSequence = 0; +let acFeed = {}; +// Pal select is retired: you are your own handle, so there is nobody to pick, +// and the dummy is already the default opponent. The whole two-step screen +// stays behind this one flag rather than being deleted, because the entry UI +// is still moving and this is the shape we may want to compare against. Flip +// it true and the wheel comes back exactly as it was. +const PAL_SELECT = false; +// The frame recorder remains intact for future review tooling, but replay is +// not part of the match flow. One flag restores the viewer, its controls and +// its offer together; production currently moves directly through results. +const INSTANT_REPLAY = false; +let selecting = false; +// Self-play is a harness mode: both fighters run the bot, no pad can enter or +// leave it, and rounds roll over on their own. +let selfPlay = false; +// Which kind the round on screen was opened against. Training and the bot door +// seat the same fighter with the same brain now, so `players[1].bot` can no +// longer say which door a round came through — and only one of those doors is +// allowed on the wire. +let fightOpponent = ""; +// Survival uses the round clock only as an elapsed-time source. Height is the +// score, the lava line is the opponent, and a run ends only when the runner +// touches it or reaches the final authored deck. +const survivalLavaStart = floorY + 360; +const survivalLavaBaseSpeed = 52; +let survivalStartedAt = 0; +let survivalLavaY = survivalLavaStart; +let survivalHeight = 0; +let survivalBestHeight = 0; +let survivalPeakLevel = 0; +let hudLeftPad = 0; +// The title is also the attract screen. Half of sessions get the quiet, +// cross-legged tableau; half get a standing face-off. Both remain still so +// the wordmark stays readable until the player asks the fight to begin. +// Hashing the already-created round name keeps the split stable for a visit +// without spending a second Math.random call (reel seeding relies on one). +let titleAttractMode = "still"; +// What a fresh session is dealt. @jeffrey, playtesting: "can we switch dummy +// to bot now?" — the free front door was a post that never hit back, so a solo +// visit was target practice rather than a fight. `trainingbot` is that same +// fighter with the bot's brain switched on, carrying its own kind name so the +// wire gate in `roundIsTimed` can still tell the free door from the one a +// handle buys. The inert dummy and the spider stay reachable by name, because +// damage, geometry and sync work all want a target that stands still. +let trainingOpponent = ""; +function trainingOpponentKind() { + const requested = String(globalThis.__oskiewarOpponent || "").toLowerCase(); + if (requested === "dummy" || requested === "spiderdummy" || + requested === "trainingbot") return requested; + // One kind for the whole visit: a title returned to after a knockout must + // not re-deal the opponent out from under the player. The web's empty + // door spars with the bot; the console's stands a dummy up instead — + // @jeffrey on the Xbox, 2026-09-20: "make it so we can play against dummy + // as opposed to bot ... the dummy goes away and gets replaced by players" + // (a second local controller promotes that chair through + // `updateLocalVersus`). An inert dummy is also one bot brain fewer in the + // console's interpreted sim. + if (!trainingOpponent) trainingOpponent = + globalThis.__oskiewarVersusCapable === true ? "trainingbot" : "dummy"; + return trainingOpponent; +} +// The versus lane's room. One name for the whole visit — the shell writes it +// into the address bar, the QR encodes it, and a friend opening that address +// takes the second chair. A visit that arrived THROUGH such an address and +// found nobody hosting claims the name instead, so a shared link survives +// its sender refreshing. +let versusRoomName = ""; +let versusNextAt = 0; +let versusRivalName = ""; +// The raw handle the seat last offered, kept beside the name it produced. The +// comparison that decides whether to re-dress has to be against this and not +// against the result: an anonymous arrival offers "", which is falsy, so the +// old guard skipped the re-dress entirely and left the PREVIOUS player's name +// and colors on the chair. Leaving and rejoining inside the 2.5 s grace is +// exactly how somebody ends up wearing a stranger. +let versusRivalOffered = ""; + +// The handle riding the freshest pad frame, cleaned to the shape a nameplate +// and the state schema both accept. One reader, so the re-dress test and the +// dressing itself can never disagree about what was offered. +function versusOfferedName() { + return String(globalThis.__oskiewarRemotePad?.name || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); +} +// How long an empty wire keeps the rival seated. Long enough to ride out a +// dropped packet or a phone switching antennas, short enough that a closed +// tab reads as "they left" while the fighter is still warm. +const versusChallengerGraceMs = 2500; +// The fight streams faster than a grandstand needs, because for the +// challenger this feed IS the game — their own presses come back to them +// as pictures through it. +const versusSnapshotIntervalMs = 33; +// How long a visitor who arrived through a shared address waits for a host +// before deciding the room is theirs to claim. +const versusClaimAfterUs = 2500000; +let versusClaimArmedAt = 0; +let versusInputSeq = 0; +let versusInputLastSent = ""; +let versusInputNextAt = 0; +let versusInputMinNextAt = 0; +// The bridge a claiming visitor stepped off of, kept so a lost publisher +// race can walk them right back on as a challenger. +let versusFallbackBridge = null; + +let versusSeatGraceUntil = 0; + +function versusChallengerFresh() { + // In a rollback fight the rival's presence is the session itself; the + // sim must not read the wall clock to decide whether the fight goes on. + if (netSession) return true; + // And for a moment after one ends badly, while the rival is changing lanes. + if (Date.now() < versusSeatGraceUntil) return true; + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return false; + return Date.now() - remote.at < versusChallengerGraceMs; +} + +// The remote rival's pad, read off the same wire shape a hand or a bot +// writes. A stale global answers neutral rather than holding the last +// press — a vanished friend must drop their guard, not run into a corner +// forever. +// The seat whoever is at this screen is holding. Seat one everywhere except a +// rollback fight's challenger, who plays the second fighter — their keycap +// legend, touch discs and move names must follow their own hands rather than +// lighting up when the other player presses something. +const localSeat = () => netSession ? netSession.seat : 0; +const localPad = () => inputPads[localSeat()] || + { connected: true, down: [], leftX: 0, leftY: 0 }; + +function remotePadSnapshot() { + const remote = globalThis.__oskiewarRemotePad; + const fresh = remote && Number.isFinite(remote.at) && + Date.now() - remote.at < versusChallengerGraceMs; + if (!fresh) return { connected: true, down: [], leftX: 0, leftY: 0, + rightX: 0, rightY: 0 }; + return { connected: true, + down: Array.isArray(remote.down) ? remote.down.slice() : [], + leftX: Number(remote.leftX) || 0, leftY: Number(remote.leftY) || 0, + rightX: 0, rightY: 0 }; +} +const selectionReady = [false, false]; +const selectionPrevious = [[], []]; +let selectionStep = 0; +let selectionCursor = 0; +let windMph = 0; +let windDirection = 1; +let windAcceleration = 0; +let windTargetMph = 0; +let windTargetDirection = 1; +let nextWindChangeAt = 0; +let replay = null; +// Round names in the order they were minted, each with the demo tick it was +// minted on. A rollback can rewind past a round rollover, so this ledger has +// to rewind with it — `replay.roundIds` is derived from it rather than being +// appended to directly, which is what keeps a re-simulated rollover from +// filing the same round twice. +let replayRoundMarks = []; +// The frame a finished round is waiting to be confirmed past before it is +// filed. -1 when nothing is waiting. See saveRoundReplay. +let replayPendingSaveFrame = -1; +let replayLastCommand = [-1, -1]; +let replayNextCheckpointAt = 0; +let matchName = ""; +let seriesName = ""; +// The app run's own name, distinct from any round or series: rounds are born +// and buried every thirty seconds, but the console sitting on the title screen +// is still a running program somebody may want to attach to. One name from +// boot to quit, drawn beside the debug bug, carried as sessionId in every live +// frame, and used as the relay room while no timed round is publishing. +let sessionName = ""; +let previousRoundName = ""; +let roundReplayFrames = []; +let roundReplayLastAt = 0; +let instantReplay = null; +let replayOfferPrevious = []; +let shellMode = "MENU"; +let gameplayStarted = false; +let shellPrevious = []; +let startInputPending = false; +let shellRawPrevious = []; +// Whether the stick was already leaned last frame, so a held lean reads as +// one gesture at the title rather than a machine-gun of entries. +let shellStickLive = false; +// Training teaches for two and a half minutes once the title lifts. This is +// session time, not round time: a knockout or a visit back to the title must +// not restart onboarding that the player has already outgrown. +let dummyGuideStartedAt = null; +// Unset is null, never -1: the console's monotonic clock can read negative +// (App.cpp overflows int64 converting QPC ticks past ~10 days of uptime), +// and a >= 0 sentinel then swallows every legitimate timestamp. +let titleTransitionAt = null; +// The wordmark is a toy: every letter of "oskiewar" and of "start" keeps its +// own swell and shudder, and the prompt keeps one shared bounce the letters +// take in turn. Paint owns these because they are pointer feel, not state. +const titleToys = []; +const promptToys = []; +let promptBounce = 0; +let titleToyAt = -1; +// Which letter the pointer currently owns. The letters never hold still — each +// one bobs and drifts a good fraction of its own width — so a bare hit test +// against a moving cell hands a resting cursor a letter that slides out from +// under it and back several times a second. That reads as a flickering glyph, +// a cursor blinking between two shapes, and a hover tick that will not stop. +// Holding the grab until the pointer leaves a cell grown by the letter's own +// travel is the same hysteresis the camera uses at the safe-zone edge. +let titleGlyphHot = -1; +let navigationPrevious = [[], []]; +// Remote render experiment flags. An attached agent can flip these through +// the relay — the shell merges oskiewar:flags into the global and the paint +// below reads it once per frame — so what each layer costs can be measured +// on the machine that is actually struggling, not a workstation imitating +// it. Every flag missing means the full picture; xbox/tools/oskiewar-ablate +// walks them and reads the price back out of the live fps telemetry. +let renderFlags = {}; +// Temporary live combat inspector. Keep this explicit so the production view +// can return to a clean presentation without changing combat geometry. +let debugHitboxes = false; +// The frame meter, the way a training mode has one: one pip per simulation +// frame, colored by what the fighter was DOING on that frame, so a player can +// read an exchange back instead of guessing at it. +// +// Street Fighter 6's legend, kept because it is the one people already know: +// green is startup, red is active, blue is recovery, yellow is stun. What +// those mean HERE is a question about this game rather than that one, and the +// honest answers are not all flattering: +// +// Startup, active and recovery come from the same integer-frame table as +// the collision sampler. A landed strike remains in recovery until its +// original action deadline. Stun still takes precedence over the action. +// +// Shielding gets a color of its own because holding a shield is a stance in +// this game rather than a reaction, and folding it into stun would say +// something false about who is in control. +const frameMeterLength = 120; +const frameMeterStates = { + neutral: { ink: [92, 100, 124], label: "" }, + startup: { ink: [86, 226, 120], label: "STARTUP" }, + active: { ink: [255, 66, 72], label: "ACTIVE" }, + recovery: { ink: [72, 150, 255], label: "RECOVERY" }, + stun: { ink: [255, 208, 64], label: "STUN" }, + shield: { ink: [186, 118, 255], label: "SHIELD" }, + airborne: { ink: [54, 62, 86], label: "" }, +}; +const frameMeters = [[], []]; +// What a fighter is on this exact frame, in one word. Ordered by what beats +// what: being stunned outranks anything you were trying to do, and a swing +// outranks the shield you are no longer really holding. +function frameMeterState(player, now) { + if (!player.alive) return "neutral"; + if (now < player.hitStunUntil) return "stun"; + if (player.attackKind && now < player.attackUntil) { + if (player.attackHit) return "recovery"; + return meleeFrame(player, now).phase; + } + if (player.blocking) return "shield"; + if (!player.grounded) return "airborne"; + return "neutral"; +} +function recordFrameMeter(now) { + if (!debugHitboxes) return; + for (const player of players) { + const meter = frameMeters[player.pad]; + meter.push(frameMeterState(player, now)); + if (meter.length > frameMeterLength) meter.shift(); + } +} +// One FIGHT_DEBUG_PERF telemetry line per debug toggle, so the console's log +// can prove the fps row drew without narrating every frame. +let debugPerfReported = false; +let nextInputDebugAt = 0; +let frameTelemetry = []; +let frameTelemetryFlushAt = 0; +let lastPaintAt = 0; +let displayFps = 0; +let liveSequence = 0; +let liveNextAt = 0; +// The session room ticks slower than a round room: nobody spectates a title +// screen at 20Hz, and an agent reading fps is happy at four. +const sessionSnapshotIntervalUs = 250000; +let sessionNextAt = 0; +// Which round the session room was last told about, so the hand-off frame +// goes out exactly once per round instead of flapping the native shell's +// single publisher socket every tick. +let sessionAnnouncedRound = ""; +let spectatorQr = null; +// Encoding a code costs about 59ms and is the whole 50-100ms tail in the +// frame histogram: it ran at every round reset, for a URL that changes once +// per round. Same URL, same code -- so keep the last one. +let spectatorQrUrl = ""; +let spectatorQrCache = null; +function spectatorCode(url) { + if (typeof qrcode !== "function") return null; + if (url === spectatorQrUrl && spectatorQrCache) return spectatorQrCache; + spectatorQrUrl = url; + spectatorQrCache = qrcode(url, { errorCorrectLevel: 1 }); + return spectatorQrCache; +} + +let roundViewer = null; +let roundViewerStop = null; +let roundViewerMode = ""; +// The chair-holder's own View presses, remembered across viewer ticks — the +// debug toggle needs an edge, and the host's echo never carries system keys. +let viewerSystemPrevious = []; +let roundViewerStatus = "CONNECTING"; +let roundViewerDemo = null; +let roundViewerDemoStartedAt = 0; +// When the last authoritative LIVE frame landed, on the WALL clock in +// milliseconds. Wall, not sim: the frame arrives in a socket callback, where +// the sim clock is not running, and comparing an arrival stamped by one clock +// against a deadline read from the other drifted by every dropped tick until +// the coast fuse below stopped tripping at all. +let roundViewerLiveAt = 0; +// The grandstand's playout buffer. Wire frames are no longer painted the +// instant they land — they queue here with their arrival time and the render +// reads a clock held a little behind the newest of them, so every frame is +// drawn by interpolating the two that bracket it. Extrapolation is what is +// left when the buffer runs dry, not the normal case: a body that coasts on +// stale velocity walks through the floor and then snaps back, which is the +// whole of what "glitchy" meant on a guest screen. +let roundViewerFrames = []; +// The playout clock, in the same wall milliseconds the queue is stamped in. +// It advances on the simulation's own dt so the picture moves at the sim's +// rate, and leans gently toward (now − delay) so it neither runs dry nor +// falls further and further behind. +let roundViewerPlayoutMs = 0; +// How far behind the newest arrival the playout clock sits. One wire frame +// plus the jitter we have actually measured — enough that the next frame is +// usually already in hand when the clock reaches the last one. +let roundViewerDelayMs = 70; +// Wire health, measured from arrivals alone: mean gap, jitter (mean absolute +// deviation of the gap), and the share of sequence numbers that never came. +// These are what the connection meter reads, and what sizes the delay above. +let roundViewerGapMs = 33; +let roundViewerJitterMs = 0; +let roundViewerLossPct = 0; +let roundViewerSeq = -1; +let roundViewerSeqHeard = 0; +let roundViewerSeqExpected = 0; +let roundViewerImpactTick = -1; +// The newest impact number this watcher has spawned. The host repeats a mark +// on every frame it is still burning, so this is what tells a repeat from a +// new spark. +let roundViewerImpactId = 0; +// Whether the round being watched has a clock. The wire says so; the watcher +// must not answer from its own `roundIsTimed()`, which reads a local fight +// that is not happening. +let roundViewerTimed = true; +let livePublishFailed = false; + +// Match names are public URLs and must not collide, so they take real +// entropy — but a recorded round has to reproduce, and the ball kind is +// hashed from the series name and carries radius and mass. So the entropy is +// drawn once per match, carried in the demo, and every name after it falls +// out deterministically. +let nameSeed = 1; +function seedNames(seed) { + nameSeed = (seed >>> 0) || 1; +} +function nameRandom() { + nameSeed = (nameSeed + 0x6d2b79f5) >>> 0; + let value = nameSeed; + value = Math.imul(value ^ (value >>> 15), value | 1); + value ^= value + Math.imul(value ^ (value >>> 7), value | 61); + return ((value ^ (value >>> 14)) >>> 0) / 4294967296; +} + +function pronounceableMatchName() { + const onsets = ["b", "d", "f", "g", "k", "l", "m", "n", "p", "r", + "s", "t", "v", "z", "ch", "sh", "th"]; + const consonants = "bdfgklmnprstvz"; + const vowels = "aeiou"; + const onset = onsets[Math.floor(nameRandom() * onsets.length)]; + const vowel = vowels[Math.floor(nameRandom() * vowels.length)]; + const middle = consonants[Math.floor(nameRandom() * consonants.length)]; + const ending = (vowels + "y")[Math.floor(nameRandom() * (vowels.length + 1))]; + return onset + vowel + middle + middle + ending + + Math.floor(nameRandom() * 1000); +} + +function demoTick(now) { + return replay ? Math.max(0, Math.round((now - replay.startedMonotonicUs) / + replayTickUs)) : 0; +} + +function trackMatchStarted() { + if (!roundIsTimed() || typeof analytics !== "function") return; + const device = typeof capabilities === "function" ? capabilities() : {}; + const platform = String(device.platform || "").toLowerCase(); + const surface = platform === "xbox-uwp" || platform === "xbox" + ? "xbox" + : platform === "macos" ? "macos" : "web"; + const family = String(device.inputFamily || "").toLowerCase(); + analytics("match_started", { + source_system: "browser", + surface, + input_family: ["gamepad", "keyboard", "xbox"].includes(family) + ? family + : "unknown", + opponent_type: selfPlay ? "self-play" + : players[1].bot ? "bot" + : players[1].npc ? "dummy" : "local-player", + }); +} + +function startReplay(now) { + const run = runtime(); + if (!roundIsRecorded()) { + seriesName = ""; + matchName = ""; + previousRoundName = ""; + // Spiderdummy training carries one plain ball; there is no board to + // carry anymore. + matchBallType = "soccer"; + replay = null; + spectatorQr = null; + return; + } + seedNames(Math.floor(Math.random() * 4294967296)); + const nameSeedUsed = nameSeed; + seriesName = pronounceableMatchName(); + // The deal owns the ball in a versus fight — both seats set it from the same + // word — so rolling a series ball here would put the two of them in + // different fights. + if (!versusActive()) matchBallType = seriesBallType(seriesName); + matchName = ""; + previousRoundName = ""; + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = { + format: "ac.oskiedemo", version: 1, game: "oskiewar", + simulation: "oskiewar-physics-1", tickRate: 60, + matchId: "ow-" + seriesName, matchName: seriesName, + seriesId: "ow-" + seriesName, seriesName, roundIds: [], + recordedDisplay: { + width: Number(run.width) || viewWidth(), + height: Number(run.height) || viewHeight, + aspectRatio: (Number(run.width) || viewWidth()) / + Math.max(1, Number(run.height) || viewHeight), + surfaceWidth: Number(run.surfaceWidth) || Number(run.width) || viewWidth(), + surfaceHeight: Number(run.surfaceHeight) || Number(run.height) || viewHeight, + refreshHz: Number(run.refreshHz) || Number(run.measuredHz) || 0, + }, + startedAt: run.unixMs || 0, startedMonotonicUs: now, + // Which room this was played in, so a room can be asked for its own + // history. Only a versus fight has one: in the broadcast lane each round + // IS its own room and the round id already says so. + ...(versusActive() && versusRoomName + ? { roomId: "ow-" + versusRoomName, roomName: versusRoomName } : {}), + // A versus round runs until somebody falls, so a re-run must not be handed + // a clock the original never had. Older demos carry no flag and were all + // timed, which is what the reader below assumes. + timed: roundIsTimed(), + nameSeed: nameSeedUsed, ballType: matchBallType, + map: skateparkMap ? "skatepark" : "station", + fighters: players.map((player) => player.name), + nations: players.map((player) => player.nation || ""), + commands: [], events: [], checkpoints: [], rounds: [], impacts: [], + }; + replayLastCommand = [-1, -1]; + replayNextCheckpointAt = now; + // The sequence counter survives the match: every round room is born empty, + // so a fresh room takes any first number — but the session room lives from + // boot to quit, and the relay silently drops a frame whose sequence ever + // runs backwards. One counter, never rewound, serves them both. + liveNextAt = now; + livePublishFailed = false; + spectatorQr = null; + trackMatchStarted(); +} + +// Whether the round on screen is on the wire: clocked, named, recorded, +// published, counted. The free training round never is, whatever its opponent +// does. An opponent with no bot AI used to be a safe stand-in for "nobody is +// watching this" — the day training started sparring back, that stand-in would +// have put every anonymous session on a series, a demo and a live feed, so the +// gate reads the door the round came through instead. The versus lane is off +// this wire too, by choice rather than freedom: it runs one room, one stream, +// no series and no demo, because the shared URL must keep meaning this fight. +function roundIsTimed() { + // A watcher is answering about somebody else's round. Everything below reads + // this machine's own fight, which for a watcher is not running — and a + // watcher that has not been served a frame yet has no round to report at + // all, so it must not paint a countdown for one. A stored demo still falls + // through: it IS a local re-run, and it was a timed round when recorded. + if (roundViewer && roundViewerMode !== "DEMO") + return roundViewerMode === "LIVE" && roundViewerTimed; + if (survivalActive()) return false; + // Training runs without a clock — except under the reel harness, where a + // scripted dummy bout wants the full round apparatus (clock, demo, result + // card) so it can be recorded and repainted like any match. + if (globalThis.__oskiewarTimedTraining === true) return true; + // Every round that reaches a re-simulation was a timed, recorded round. + if (resimActive) return resimTimed; + if (fightOpponent === "trainingbot" || versusLane()) return false; + return !(players[1].npc && !players[1].bot); +} + +// This machine is the one that writes a versus fight down. Both seats +// simulate it, but the record needs exactly one author or the two would race +// for the same round id — the same reason only the host narrates the stream. +const versusRecorder = () => + versusActive() && (!netSession || netSession.seat === 0); + +// Which rounds leave a record. Timed rounds always did, and a versus fight +// does now: a room's history is the point of the room. The clock was never +// what made a round worth keeping, it was just the only lane that had one. +// The public demo/relay contract has two seats. Local three-player battles +// retain their in-memory round replay without publishing incompatible demos. +const roundIsRecorded = () => !freeForAll() && (roundIsTimed() || versusRecorder()); + +// The frame numbers the debug HUD already prints, packed for the wire. Only +// stages the host actually measured go in — a console reports a real frame and +// present time, a browser reports its rAF span and its own paint cost and +// nothing else — because a zeroed field on a public feed reads as a stall +// rather than as silence. Two decimals is the resolution AC_NATIVE_PROFILE +// prints at, and it holds the whole block under sixty bytes. +function spectatorPerf(run) { + const perf = { fps: Math.round(displayFps || 0) }; + const frameMs = Number(run.frameMs) || 0; + const renderMs = Number(run.renderCpuMs) || 0; + const hz = Number(run.refreshHz) || 0; + if (frameMs) perf.frameMs = Math.round(frameMs * 100) / 100; + if (renderMs) perf.renderMs = Math.round(renderMs * 100) / 100; + if (hz) perf.hz = Math.round(hz); + return perf; +} + +function spectatorState(now, nextRoundId = "") { + const run = runtime(); + const introAge = now - roundStartedAt; + const phase = instantReplay ? "replay" : matchOver ? "match" + : roundResult ? "round" : selecting ? "select" + : introAge < roundIntroDurationUs() ? "intro" : "fight"; + const timed = roundIsTimed(); + // An untimed frame reports zero rather than null: the relay reads every + // remainingMs as an integer, and the title screen's attract fight has no + // clock to misreport. + const remainingMs = roundResult || !timed ? 0 : Math.max(0, + Math.round((roundDurationUs - roundElapsedUs) / 1000)); + const state = { + format: "ac.oskiewar.live", version: 1, seq: liveSequence++, + map: { id: currentMapId, name: currentMapName, highlights: workshopHighlight, + ...(workshopMap ? { workshop: workshopMap } : {}) }, + at: run.unixMs || 0, phase, + course: skateparkMap ? "skatepark" : "station", + ropes: skateRopes.map((rope) => rope.nodes.map((node) => + [node.x, node.y, node.px, node.py].map((value) => Math.round(value * 100) / 100))), + previousRoundId: previousRoundName ? "ow-" + previousRoundName : "", + fighters: players.map((player) => ({ + // The title's still variant seats a fighter with no name yet, and the + // relay turns away a nameless one — so the empty seat gets called what + // it is rather than costing the whole frame. + name: player.name || "NOBODY", nation: player.nation || "", color: player.color, + x: player.x, y: player.y, + z: player.z, vx: player.vx, vy: player.vy, vz: player.vz, + skateboard: player.skateboard, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, + facing: player.facing, alive: player.alive, + grounded: player.grounded, ducking: player.ducking, + sinking: now < player.sinkUntil, + blocking: player.blocking, score: player.score, + roundWins: player.roundWins, attack: player.attackKind || "", + removedParts: player.removedParts.slice(), + // Three numbers the grandstand already knew how to read and had never + // been sent. `applyRoundViewerState` reconstructs the strike spark, the + // limb burst and the swing's real arc from them; without them a live + // watcher saw a body come apart in silence and every swing froze at one + // canned mid-pose. Two decimals is all a fade needs. + hit: Math.round((player.hit || 0) * 100) / 100, + blockFlash: Math.round((player.blockFlash || 0) * 100) / 100, + attackTicks: player.attackKind + ? Math.max(0, Math.round((now - player.attackStartedAt) / replayTickUs)) + : 0, + })), + // Shots and lobs, the fight's projectiles. These used to stay home: a + // watcher — and a challenger on an older build — watched fighters flinch + // and die with nothing visible in the air between them. Flat number rows + // rather than objects, because the relay caps a frame at 8 KiB and 24 + // rounds plus 12 grenades named longhand is most of that cap on its own. + // Velocity rides along so the playout buffer can carry a round smoothly + // between arrivals instead of stepping it 140 units at a time. + shots: bullets.filter((shot) => shot.life > 0).map((shot) => [ + Math.round(shot.x), Math.round(shot.y), Math.round(shot.z), + Math.round(shot.previousX ?? shot.x), + Math.round(shot.previousY ?? shot.y), + Math.round(shot.vx || 0), Math.round(shot.vy || 0), shot.owner | 0, + (shot.spit ? 1 : 0) | (shot.heavy ? 2 : 0) | (shot.rubber ? 4 : 0)]), + // The host's own impact track. A watcher was reconstructing sparks from + // the flag edges it could see, which covers a punch landing and nothing + // else: a ricochet, a spit splat, a ground pound's crater and a grenade's + // own blast raise no flag on any fighter, so they happened in silence on + // every screen but the host's. Newest twelve, each with the number that + // says whether a watcher has already seen it, and its remaining life so + // it is spawned at the age it really is. + impacts: impacts.filter((mark) => mark.life > 0).slice(-12) + .map((mark) => [mark.id | 0, Math.round(mark.x), Math.round(mark.y), + Math.round(mark.z), Math.round((mark.duration || .3) * 1000), + Math.round(Math.max(0, mark.life) * 1000), + (mark.death ? 1 : 0) | (mark.explosion ? 2 : 0)]), + lobs: grenades.filter((lob) => lob.alive).map((lob) => [ + Math.round(lob.x), Math.round(lob.y), Math.round(lob.z), + Math.round(lob.vx || 0), Math.round(lob.vy || 0), lob.owner | 0, + (lob.rocket ? 1 : 0) | (lob.exploding ? 2 : 0), + Math.round(lob.blastRadius || 0), + Math.round(Math.max(0, lob.fuse || 0) * 1000)]), + ball: { active: ball.active, x: ball.x, y: ball.y, + z: ball.z, radius: ball.radius, type: ball.type, mass: ball.mass }, + balls: balls.map((item) => ({ active: item.active, x: item.x, + y: item.y, z: item.z, radius: item.radius, type: item.type, + mass: item.mass, heldBy: item.heldBy, + spawnOwner: item.spawnOwner })), + camera: { x: cameraCenter, y: cameraCenterY, width: cameraWidth, + position: { ...cameraDoll.position }, target: { ...cameraDoll.target }, + perspective: cameraDoll.perspective, fov: cameraDoll.fov, + roll: cameraDoll.roll }, + wind: { direction: windDirection, mph: windMph }, + round: { remainingMs, timed, result: roundResult || "", + cause: roundCause || "", + // How long this round has been running, intro included. A timed round + // could be reconstructed from `remainingMs` alone, but the versus lane + // reports zero there — and a watcher deriving its clock from that zero + // pinned itself thirty seconds in the past, which is why it never + // counted a round off and never played an intro card. + elapsedMs: clamp(Math.round((now - roundStartedAt) / 1000), 0, 3600000) }, + // @jeffrey plays oskiewar.com in Edge on an Xbox, where there are no + // devtools and the console's own AC_NATIVE_PROFILE line only reaches a + // Device Portal on the same LAN. The live socket is the one channel that + // already leaves the box, so the frame rate rides out with the round and + // can be read from anywhere the round can. + perf: spectatorPerf(run), + }; + // A title-screen frame has no series, no round and no demo to link — the + // relay rejects an id it cannot parse, so an empty name stays off the wire + // entirely rather than riding out as "ow-". + if (seriesName) state.seriesId = "ow-" + seriesName; + if (matchName) { + state.roundId = "ow-" + matchName; + state.replayUrl = "/api/oskiewar-replays?id=ow-" + matchName; + } + if (sessionName) state.sessionId = "ow-" + sessionName; + if (nextRoundId) state.nextRoundId = nextRoundId; + return state; +} + +function publishSpectator(now, { target = matchName, nextRoundId = "", + force = false } = {}) { + if (!roundIsTimed() || !target || livePublishFailed || + typeof publishLive !== "function" || + (!force && now < liveNextAt)) return; + liveNextAt = now + liveSnapshotIntervalUs; + try { + publishLive("ow-" + target, + JSON.stringify(spectatorState(now, nextRoundId))); + } catch (error) { + // A native host with an older room-ID contract must never take down play. + // Disable only spectator publishing until the next match/host upgrade. + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// The session channel. Rounds publish their own rooms, but the app run itself +// keeps one room under its own name so an agent has somewhere to attach while +// nothing is being scored — the title screen included. It runs only while the +// debug bug is lit: every anonymous visitor idling on oskiewar.com would +// otherwise claim one of the relay's 128 rooms, and this channel exists for a +// maintainer who asked for it, not for an audience. While a timed round is on +// the wire the session room instead gets exactly one frame naming that round, +// which both points any watcher at the fight and retires this room's publisher +// so the native shell's single socket is free to follow. +function publishSession(now) { + if (freeForAll() || (!debugHitboxes && !globalThis.__oskiewarWorkshopEnabled) || + !sessionName || livePublishFailed || + typeof publishLive !== "function") return; + const liveRound = roundIsTimed() && matchName ? matchName : ""; + if (liveRound) { + if (sessionAnnouncedRound === liveRound) return; + sessionAnnouncedRound = liveRound; + try { + publishLive("ow-" + sessionName, + JSON.stringify(spectatorState(now, "ow-" + liveRound))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } + return; + } + sessionAnnouncedRound = ""; + if (now < sessionNextAt) return; + sessionNextAt = now + sessionSnapshotIntervalUs; + try { + publishLive("ow-" + sessionName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +function inputCommand(pad) { + const input = quantizedInput(pad); + let mask = 0; + if (input.horizontal < 0) mask |= 1; + if (input.horizontal > 0) mask |= 2; + if (input.vertical > 0) mask |= 4; + if (input.vertical < 0) mask |= 8; + for (let index = 4; index < replayButtons.length; index++) + if (pad.down.includes(replayButtons[index])) mask |= 1 << index; + return mask; +} + +function recordReplayCommands(now, inputs = padSnapshots) { + if (!replay) return; + for (let pad = 0; pad < players.length; pad++) { + const command = players[pad].npc && !players[pad].bot + ? 0 : inputCommand(inputs[pad]); + if (command !== replayLastCommand[pad]) { + replay.commands.push([demoTick(now), pad, command]); + replayLastCommand[pad] = command; + } + } +} + +function replayFlags(player) { + // Bit 12 carries which way the fighter faces. Older demos lack it, so a + // replay treats "no facing bits" as "guess from velocity" — bit 13 marks + // that the pair below is real rather than an old demo's zero. + return (player.alive ? 1 : 0) | (player.grounded ? 2 : 0) | + (player.ducking ? 4 : 0) | (player.blocking ? 8 : 0) | + [...limbParts, "torso"].reduce((flags, part, index) => + flags | (hasPart(player, part) ? 0 : 1 << (index + 4)), 0) | + (player.facing > 0 ? 4096 : 0) | 8192 | + (player.hit > .05 ? 16384 : 0) | (player.blockFlash > .05 ? 32768 : 0); +} + +function recordReplayCheckpoint(now, force = false) { + if (!replay || (!force && now < replayNextCheckpointAt)) return; + replayNextCheckpointAt = now + replayCheckpointUs(); + const values = [demoTick(now)]; + for (const player of players) values.push( + Math.round(player.x), Math.round(player.y), Math.round(player.z), + Math.round(player.vx), Math.round(player.vy), replayFlags(player), + player.score, player.roundWins); + values.push(Math.round(ball.x), Math.round(ball.y), Math.round(ball.z), + Math.round(ball.vx), Math.round(ball.vy), ball.active ? 1 : 0, + Math.round(cameraCenter), Math.round(cameraCenterY), Math.round(cameraWidth)); + // The full camera pose rides along so a replay can stand the lens exactly + // where the live pass stood it — re-deriving position from width parks the + // camera inside close shots and near-clips the bodies it came to frame. + values.push(Math.round(cameraDoll.position.x), + Math.round(cameraDoll.position.y), Math.round(cameraDoll.position.z), + cameraDoll.perspective || 0, cameraDoll.fov || 55, cameraDoll.roll || 0); + replay.checkpoints.push(values); + // Dense demos also carry every impact the fight spawned, so the repaint + // can put the sparks and debris back instead of only moving bodies. + if (replayCheckpointUs() < 100000) for (const impact of impacts) + if (!impact.recordedTick) { + impact.recordedTick = demoTick(now) + 1; + replay.impacts?.push([demoTick(now), Math.round(impact.x), + Math.round(impact.y), Math.round(impact.z || 0), + impact.death ? 1 : impact.explosion ? 2 : 0, + Math.round((impact.duration || .3) * 1000)]); + } +} + +function makeRoundReplayFrame(now) { + const poseTime = (now - startedAt) / 1000000; + return { + ropes: structuredClone(skateRopes), + players: players.map((player) => ({ + x: player.x, y: player.y, z: player.z, + vx: player.vx, vy: player.vy, vz: player.vz, + facing: player.facing, grounded: player.grounded, + ducking: player.ducking, alive: player.alive, + ropeIndex: player.ropeIndex, ropeLink: player.ropeLink, + skateRotation: player.skateRotation, skateboard: player.skateboard, + blocking: player.blocking, blockFlash: player.blockFlash, hit: player.hit, + attackKind: player.attackKind, + attackStartedOffset: player.attackStartedAt - now, + attackUntilOffset: player.attackUntil - now, + geometry: runnerWorldGeometry(player, poseTime), + })), + ball: { x: ball.x, y: ball.y, z: ball.z, vx: ball.vx, vy: ball.vy, + active: ball.active }, + balls: balls.map((item) => ({ x: item.x, y: item.y, z: item.z, + vx: item.vx, vy: item.vy, active: item.active })), + camera: { center: cameraCenter, centerY: cameraCenterY, width: cameraWidth }, + }; +} + +function captureRoundReplay(now, force = false) { + if (!INSTANT_REPLAY) return; + if (!force && now - roundReplayLastAt < instantReplayStepUs) return; + roundReplayLastAt = now; + roundReplayFrames.push(makeRoundReplayFrame(now)); + while (roundReplayFrames.length > instantReplayMaxFrames) + roundReplayFrames.shift(); +} + +const frameTelemetrySchema = ["us", "cameraX", "cameraY", "cameraWidth", + "dollX", "dollY", "dollZ", "targetX", "targetY", "targetZ", + "dollWidth", "roll", "p1x", "p1y", "p1z", "p1vx", "p1vy", + "p2x", "p2y", "p2z", "p2vx", "p2vy"]; + +function captureFrameTelemetry(now, force = false) { + if (netSilent || selecting || shellMode === "MENU") return; + const round = (value) => Math.round(Number(value || 0) * 100) / 100; + frameTelemetry.push([ + Math.round(now - roundStartedAt), round(cameraCenter), round(cameraCenterY), + round(cameraWidth), round(cameraDoll.position.x), round(cameraDoll.position.y), + round(cameraDoll.position.z), round(cameraDoll.target.x), + round(cameraDoll.target.y), round(cameraDoll.target.z), + round(cameraDoll.width), round(cameraDoll.roll), + ...players.flatMap((player) => [round(player.x), round(player.y), + round(player.z), round(player.vx), round(player.vy)]), + ]); + if (!force && now < frameTelemetryFlushAt) return; + telemetry("FIGHT_TRACE", JSON.stringify({ + format: "ac.oskiewar.frames", version: 1, round: "ow-" + matchName, + schema: freeForAll() ? [...frameTelemetrySchema, "p3x", "p3y", "p3z", "p3vx", "p3vy"] + : frameTelemetrySchema, frames: frameTelemetry, + })); + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; +} + +function applyRoundReplayFrame(frame, now) { + if (frame.ropes) skateRopes.splice(0, skateRopes.length, ...structuredClone(frame.ropes)); + for (let index = 0; index < players.length; index++) { + const player = players[index]; + const state = frame.players[index]; + for (const key of ["x", "y", "z", "vx", "vy", "vz", "facing", + "grounded", "ducking", "alive", "blocking", "blockFlash", "hit", + "attackKind", "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) player[key] = state[key]; + player.attackStartedAt = now + state.attackStartedOffset; + player.attackUntil = now + state.attackUntilOffset; + player.replayGeometry = state.geometry; + } + const frameBalls = frame.balls || [frame.ball]; + for (let index = 0; index < balls.length; index++) { + const state = frameBalls[index]; + if (!state) continue; + for (const key of ["x", "y", "z", "vx", "vy", "active"]) + balls[index][key] = state[key]; + } + cameraCenter = frame.camera.center; + cameraCenterY = frame.camera.centerY; + cameraWidth = frame.camera.width; +} + +function finishInstantReplay(now) { + if (!instantReplay) return; + applyRoundReplayFrame(instantReplay.endFrame, now); + for (const player of players) delete player.replayGeometry; + instantReplay = null; + roundOverAt = now; + replayOfferPrevious = padSnapshots[0]?.down?.slice() || []; +} + +// A replay is worth watching at the speed the eye needs, not the speed the +// clock kept. Frames already record what a hit looks like, so the playhead can +// read its own footage and slow itself into the action rather than being told +// where the action is — which means every replay already in the store gets +// this without being re-recorded. +function frameAction(frame) { + let action = 0; + for (const player of frame.players) { + if (!player.alive) action = Math.max(action, 1); + if (player.hit) action = Math.max(action, 1); + if (player.blockFlash > 0) action = Math.max(action, .7 * player.blockFlash); + // A swing that has started but not yet landed is the part worth stretching. + if (player.attackKind && player.attackUntilOffset > 0) + action = Math.max(action, .35); + } + return action; +} + +// Look ahead, so the ramp is already down by the time the punch arrives. A +// slowdown that begins on the frame of impact has missed the impact. +function replayActionCurve(frames) { + const raw = frames.map(frameAction); + return raw.map((_, index) => { + let peak = 0; + for (let at = index; at < Math.min(raw.length, index + replayActionLead); at++) + peak = Math.max(peak, raw[at] * (1 - (at - index) / replayActionLead * .35)); + return peak; + }); +} + +// One step of the speed ramp, kept pure so it can be tested and so the demo +// viewer can share it when its playhead learns to accumulate. Easing rather +// than snapping — and capping how far the speed may travel per second of real +// time — is what keeps a dense run of hits reading as one long stretch rather +// than a stutter. +function replayRampStep(speed, action, elapsedSeconds) { + const target = lerp(1, replaySlowest, clamp(action, 0, 1)); + return speed + (target - speed) * + Math.min(1, Math.max(0, elapsedSeconds) * replayRampPerSecond); +} + +function startInstantReplay(now) { + if (!INSTANT_REPLAY) return false; + if (roundReplayFrames.length < 2) return false; + const frames = roundReplayFrames.slice(); + instantReplay = { frames, cursor: 0, lastAt: now, paused: false, + previous: padSnapshots[0]?.down?.slice() || [], + action: replayActionCurve(frames), speed: 1, + endFrame: frames[frames.length - 1] }; + impacts.length = 0; + detachedParts.length = 0; + applyRoundReplayFrame(frames[0], now); + telemetry("ROUND_REPLAY", "start frames=" + frames.length); + return true; +} + +function updateInstantReplay(now, dt) { + if (!instantReplay) return; + const down = padSnapshots[0]?.down || []; + const pressed = (button) => down.includes(button) && + !instantReplay.previous.includes(button); + if (pressed("B")) { + finishInstantReplay(now); + return; + } + if (pressed("A")) instantReplay.paused = !instantReplay.paused; + if (pressed("ArrowLeft") || pressed("ArrowRight")) { + instantReplay.paused = true; + instantReplay.cursor += pressed("ArrowLeft") ? -15 : 15; + } + const elapsed = Math.max(0, now - instantReplay.lastAt) / 1000000; + instantReplay.speed = replayRampStep(instantReplay.speed, + instantReplay.action?.[Math.floor(instantReplay.cursor)] || 0, elapsed); + if (!instantReplay.paused) + instantReplay.cursor += (now - instantReplay.lastAt) / + instantReplayStepUs * instantReplay.speed; + instantReplay.lastAt = now; + instantReplay.cursor = clamp(instantReplay.cursor, 0, + instantReplay.frames.length); + if (instantReplay.cursor >= instantReplay.frames.length) { + finishInstantReplay(now); + return; + } + applyRoundReplayFrame(instantReplay.frames[Math.floor(instantReplay.cursor)], now); + instantReplay.previous = down.slice(); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter - cameraWidth * .06, + y: cameraCenterY - cameraWidth * .04, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: 0, fov: 55 }, dt, 18); +} + +// A finished round in a rollback fight is not finished yet: the frames that +// ended it are still inside the rollback window, and a rival pad arriving late +// can take the knockout back. So the round is marked and filed later, from +// netTick, once both seats have confirmed past its end. A re-simulation +// reaches this line again and simply re-marks the frame. +function saveRoundReplay(now) { + if (!replay) return; + if (netSession) { replayPendingSaveFrame = netSession.frame; return; } + uploadRoundReplay(now); +} + +// Everything that is waiting, filed now whatever the wire is doing. A rival +// who has gone will never confirm anything, and the round they lost still +// happened. +function flushPendingRoundReplay(now) { + if (replayPendingSaveFrame < 0 || !replay) return; + replayPendingSaveFrame = -1; + uploadRoundReplay(now); + if (matchOver) finishReplay(); +} + +function uploadRoundReplay(now) { + if (!replay || workshopTainted) return; + recordReplayCheckpoint(now, true); + const demo = JSON.parse(JSON.stringify(replay)); + demo.matchId = "ow-" + matchName; + demo.matchName = matchName; + demo.roundId = demo.matchId; + demo.roundName = matchName; + demo.roundIndex = Math.max(0, replay.roundIds.length - 1); + // Read off the ledger rather than off `previousRoundName`, so a rollback + // that took a rollover back cannot leave the linkage pointing at a round + // that no longer exists. + demo.previousRoundId = demo.roundIndex > 0 + ? replay.roundIds[demo.roundIndex - 1] : ""; + demo.durationTicks = demoTick(now); + // The names as they were when the round was PLAYED. `replay.fighters` was + // taken when the series opened, which in a versus fight is before the deal + // has dressed either seat — so the winner below could be somebody the demo + // never listed, and the store refused the round with "Invalid winner". + demo.fighters = players.map((player) => player.name); + demo.nations = players.map((player) => player.nation || ""); + demo.winner = players[0].score === players[1].score ? null + : players[0].score > players[1].score ? players[0].name : players[1].name; + demo.finalRoundWins = players.map((player) => player.roundWins); + delete demo.startedMonotonicUs; + const payload = JSON.stringify(demo); + // A dense reel demo is fat by design and never leaves the local shell; the + // half-megabyte gate is for demos headed to the production store. + const payloadLimit = globalThis.__oskiewarDenseReplay ? 8388608 : 524288; + if (payload.length <= payloadLimit && typeof saveReplay === "function") { + const upload = saveReplay(payload); + // Only promise-returning hosts can prove the upload completed. The web + // host does; older native hosts keep saving silently until they adopt the + // same acknowledgement contract. + if (upload && typeof upload.then === "function") + upload.then((saved) => { + if (saved !== true) return; + playDrum("modem", .72, 0); + telemetry("REPLAY", "uploaded " + demo.roundId); + }).catch((error) => telemetry("REPLAY", "upload-error " + error.message)); + telemetry("REPLAY", "queued " + demo.roundId + " bytes=" + payload.length); + } else telemetry("REPLAY", "not-saved bytes=" + payload.length); +} + +function finishReplay() { + if (replayPendingSaveFrame >= 0 && replay) { + replayPendingSaveFrame = -1; + uploadRoundReplay(runtime().monotonicUs); + } + replayRoundMarks = []; + replayPendingSaveFrame = -1; + replay = null; +} + +function emitSignal(event, player = -1, value = 0, value2 = 0) { + // Filed first, and filed even while re-simulating: a rollback truncated + // these rows and the silent pass is what puts the corrected ones back. What + // the silence is for is the PERFORMANCE below — nobody hears a frame twice. + if (replay) replay.events.push([demoTick(runtime().monotonicUs), event, + player, Math.round(value * 1000) / 1000, Math.round(value2 * 1000) / 1000]); + if (netSilent) return; + if (typeof gameSignal === "function") gameSignal(event, player, value, value2); +} + +// Revision 37 exposes native bell/woosh voices in the mixer but its QuickJS +// allowlist predates those names. Fall back without stopping the match; newer +// hosts and the browser still receive the authored voice unchanged. +function playDrum(name, velocity = 1, pan = 0) { + if (performanceStageActive()) return; + if (netSilent || typeof drum !== "function") return; + try { + drum(name, velocity, pan); + } catch (error) { + if (name !== "bell" && name !== "whoosh") throw error; + if (name === "bell" && typeof synth === "function") { + try { synth(880, .12); } catch (_) {} + } + try { + drum(name === "bell" ? "hat" : "block", velocity * .65, pan); + } catch (_) {} + } +} + +function playSine(frequency, duration = .12) { + if (performanceStageActive()) return; + if (netSilent || typeof synth !== "function") return; + try { synth(frequency, duration); } catch (_) {} +} + +let clientError = ""; +let clientErrorDetail = null; +let clientErrorAt = -1; +let clientErrorQr = null; +let clientErrorDumpUrl = ""; + +function clientStateDump() { + try { + const run = runtime(); + return { + build: "v" + buildVersion, + shell: shellMode, + round: { + id: matchName || "local", + result: roundResult || "active", + elapsedMs: Math.round(roundElapsedUs / 1000), + }, + runtime: { + sim: Number(run?.simCount || 0), + paint: Number(run?.paintCount || 0), + unixMs: Number(run?.unixMs || 0), + }, + camera: { + x: Math.round(cameraCenter), y: Math.round(cameraCenterY), + width: Math.round(cameraWidth), aspect: Math.round(cameraAspect * 1000) / 1000, + }, + players: players.map((player) => ({ + handle: player.name, stance: player.stance, alive: player.alive, + x: Math.round(player.x), y: Math.round(player.y), z: Math.round(player.z), + vx: Math.round(player.vx), vy: Math.round(player.vy), + input: [player.inputX, player.inputY], + removed: player.removedParts?.slice() || [], + })), + balls: balls.filter((item) => item.active).map((item) => ({ + type: item.type, x: Math.round(item.x), y: Math.round(item.y), + vx: Math.round(item.vx), vy: Math.round(item.vy), heldBy: item.heldBy, + })), + }; + } catch (error) { + return { dumpError: String(error?.message || error || "state unavailable") }; + } +} + +function errorNowUs() { + try { + const value = Number(runtime()?.monotonicUs); + if (Number.isFinite(value)) return value; + } catch (_) {} + return 0; +} + +// btoa only speaks latin-1, so the dump flattens to ASCII before encoding. +function base64Url(text) { + if (typeof btoa !== "function") return ""; + return btoa(String(text).replace(/[^\x20-\x7e]/g, "?")) + .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); +} + +// The QR carries the entire dump in its own URL, so a crash stays shareable +// even when the console never managed to post its report. Fat fields drop +// away until the payload fits a code that is still scannable off a TV. +function buildClientErrorDump(detail) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + const stack = String(detail.stack || "").split(/\r?\n/).slice(0, 4) + .map((line) => line.trim()).filter(Boolean).join(" | ").slice(0, 240); + for (const trace of [stack, ""]) { + const url = errorDumpBase + base64Url(JSON.stringify({ + v: 1, p: detail.phase, n: detail.name, m: detail.message, + src: detail.source, k: trace || undefined, s: detail.state, + })); + if (url.length <= 2048 && typeof qrcode === "function") { + try { + clientErrorQr = qrcode(url, { errorCorrectLevel: 1 }); + clientErrorDumpUrl = url; + return; + } catch (_) {} + } + } +} + +function errorRestartSeconds() { + if (clientErrorAt < 0) return 0; + return Math.max(0, + Math.ceil((errorRestartUs - (errorNowUs() - clientErrorAt)) / 1000000)); +} + +// A crashed console should not sit on a dead screen forever. The error holds +// long enough to read and scan, then the piece boots itself again. +function restartAfterClientError() { + if (clientErrorAt < 0 || errorNowUs() - clientErrorAt < errorRestartUs) return; + clientError = ""; + clientErrorDetail = null; + clientErrorAt = -1; + clientErrorQr = null; + clientErrorDumpUrl = ""; + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + try { telemetry("SHELL", "error->restart"); } catch (_) {} + boot(); +} + +function errorSource(stack) { + const match = String(stack || "").match( + /(?:\(|\s|^)((?:[a-z]+:\/\/)?[^\s()]+):(\d+):(\d+)\)?/i); + return match ? { file: match[1], line: Number(match[2]), column: Number(match[3]) } + : null; +} + +function captureClientError(phase, error) { + if (clientErrorDetail) return; + const stack = error?.stack ? String(error.stack) : ""; + const message = error?.message ? String(error.message) + : String(error || "unknown error"); + const name = String(error?.name || "Error"); + const state = clientStateDump(); + clientErrorDetail = { + phase: String(phase || "runtime"), name, message, stack, + source: errorSource(stack), state, + reportStatus: "queued for server", + }; + const detail = stack || (name + ": " + message); + clientError = (clientErrorDetail.phase + ": " + detail) + .replace(/[^\x20-\x7e]+/g, " ").replace(/\s+/g, " ").trim(); + clientErrorAt = errorNowUs(); + try { buildClientErrorDump(clientErrorDetail); } catch (_) { + clientErrorQr = null; + clientErrorDumpUrl = ""; + } + try { + telemetry("CLIENT_ERROR", JSON.stringify({ + phase: clientErrorDetail.phase, name, message, stack, + source: clientErrorDetail.source, state, + })); + } catch (_) { + clientErrorDetail.reportStatus = "local report only"; + } +} + +function clientErrorLines(text, limit = 58) { + const words = String(text).split(" "); + const lines = []; + let line = ""; + for (let word of words) { + if (word.length > limit) { + if (line) { lines.push(line); line = ""; } + while (word.length > limit) { + lines.push(word.slice(0, limit)); + word = word.slice(limit); + } + if (!word) continue; + } + if (!line) line = word; + else if (line.length + word.length + 1 <= limit) line += " " + word; + else { lines.push(line); line = word; } + } + if (line) lines.push(line); + return lines.slice(0, 9); +} + +function errorTypeWrite(text, x, y, size, ...color) { + try { + typeWrite(text, x, y, size, ...color); + } catch (_) { + // Error reporting must survive a font renderer failure of its own. + try { systemWrite(String(text).toLowerCase(), x, y, size, ...color); } + catch (_) {} + } +} + +// Diagnostic lines are dense, so every token gets its own ink: handles read as +// people, numbers as measurements, units as scale, and the rest as labels. +const dumpUnits = new Set(["px", "ms", "us", "fps", "vx", "vy", "vz", "in", + "stk", "pos", "vel", "t", "pts"]); + +function dumpTokens(text) { + return String(text).match(/@[a-z0-9_]+|[-+]?\d*\.?\d+|[a-z]+|\s+|./gi) || []; +} + +function dumpTokenInk(token) { + if (token[0] === "@") return [255, 126, 205]; + if (/^[-+]?[\d.]+$/.test(token)) return [116, 255, 184]; + if (/^[a-z]+$/i.test(token)) return dumpUnits.has(token.toLowerCase()) + ? [255, 205, 74] : [188, 204, 230]; + return [112, 234, 255]; +} + +function writeTokens(write, text, x, y, size) { + let cursor = x; + for (const token of dumpTokens(text)) { + if (token.trim()) write(token, cursor, y, size, ...dumpTokenInk(token)); + cursor += handleWidth(token, size); + } +} + +const writeDumpLine = (text, x, y, size) => + writeTokens(errorTypeWrite, text, x, y, size); + +// The HUD sits over sky and ground, so each token carries its own contrast +// shadow the way a handle glyph does. +function writeHudLine(text, x, y, size) { + writeTokens((token, tx, ty, ts, ...color) => + typeWrite(token, tx + 3, ty + 4, ts, ...runShadow(color)), + text, x, y, size); + writeTokens(typeWrite, text, x, y, size); +} + +function errorReportStatus() { + try { + const status = String(runtime()?.clientErrorReportStatus || "").trim(); + if (status) return status; + } catch (_) {} + return clientErrorDetail?.reportStatus || "queued for server"; +} + +function stateDumpRows(state) { + if (!state) return [{ icon: "mode", text: "state unavailable" }]; + if (state.dumpError) + return [{ icon: "mode", text: "state unavailable: " + state.dumpError }]; + const playerRow = (player, index) => ({ icon: "player", + text: "p" + (index + 1) + " " + player.handle + " " + + player.stance.toLowerCase() + " pos " + player.x + "," + player.y + + "," + player.z + " vel " + player.vx + "," + player.vy + + (player.removed?.length ? " lost " + player.removed.join(",") : "") }); + return [ + { icon: "build", text: "build " + state.build }, + { icon: "mode", text: "mode " + state.shell.toLowerCase() + + " round " + state.round.id + " " + state.round.result.toLowerCase() + + " " + state.round.elapsedMs + "ms" }, + { icon: "camera", text: "camera " + state.camera.x + "," + state.camera.y + + " width " + state.camera.width + " aspect " + state.camera.aspect }, + ...(state.players || []).map(playerRow), + { icon: "ball", text: "balls " + (state.balls || []).map((ball) => + ball.type + "@" + ball.x + "," + ball.y + " v" + ball.vx + "," + ball.vy) + .join(" ") }, + ]; +} + +const dumpIconInk = { build: [116, 128, 156], mode: [255, 205, 74], + camera: [112, 214, 255], player: [206, 166, 255], ball: [116, 255, 184] }; + +function drawDumpIcon(kind, x, y, size) { + const ink = dumpIconInk[kind] || [112, 234, 255]; + const unit = Math.max(2, Math.round(size / 9)); + try { + if (kind === "build") + for (let row = 0; row < 3; row++) + hudBox(x, y + row * unit * 3, size - row * unit * 2, unit * 2, ...ink); + else if (kind === "camera") { + strokeBox(x, y + unit, size, size - unit * 2, unit, ink); + hudBox(x + unit * 3, y + unit * 3, size - unit * 6, size - unit * 6, ...ink); + } else if (kind === "player") { + hudBox(x + unit * 2, y, size - unit * 4, unit * 3, ...ink); + hudBox(x, y + unit * 4, size, size - unit * 4, ...ink); + } else if (kind === "ball") { + hudBox(x + unit * 2, y, size - unit * 4, size, ...ink); + hudBox(x, y + unit * 2, size, size - unit * 4, ...ink); + } else strokeBox(x, y, size, size, unit, ink); + } catch (_) {} +} + +// Sized for a phone pointed at a television, so modules stay chunky and the +// state dump wraps narrower to keep clear of the code. +function errorQrGeometry(width, height) { + if (!clientErrorQr || typeof clientErrorQr.getModuleCount !== "function") + return null; + const count = clientErrorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor(Math.min(width * .3, height * .52) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + return { count, quiet, cell, size, + left: width - 92 - size, top: height - 96 - size }; +} + +// Drawn with raw boxes rather than the projected screenRect the HUD uses — +// the triangle pipeline is exactly what may have just died. Dark modules +// coalesce into horizontal runs so a full code stays a few hundred draws. +function drawErrorQr(qr) { + if (!qr) return; + hudBox(qr.left, qr.top, qr.size, qr.size, 250, 250, 247); + for (let row = 0; row < qr.count; row++) { + let run = 0; + for (let column = 0; column <= qr.count; column++) { + if (column < qr.count && clientErrorQr.isDark(row, column)) { run++; continue; } + if (run) hudBox(qr.left + (column - run + qr.quiet) * qr.cell, + qr.top + (row + qr.quiet) * qr.cell, run * qr.cell, qr.cell, 7, 8, 14); + run = 0; + } + } +} + +// Same two-digit face as the round timer, reddening as the restart lands. +function drawErrorCountdown(width) { + const remaining = errorRestartSeconds(); + const text = String(Math.min(99, remaining)).padStart(2, "0"); + const danger = remaining <= 10; + const shake = danger + ? Math.sin(errorNowUs() / 1000000 * 35) * (11 - remaining) * .45 : 0; + let textWidth = 64; + try { textWidth = handleWidth(text, 52); } catch (_) {} + errorTypeWrite(text, width - 92 - textWidth + shake, 82, 52, + ...(danger ? [255, 92, 116] : [255, 205, 74])); +} + +function drawClientError() { + let width = 1920; + let height = 1080; + try { + const view = typeof gameView === "function" ? gameView() : null; + if (view && Number.isFinite(view.width)) width = view.width; + if (view && Number.isFinite(view.height)) height = view.height; + } catch (_) {} + const detail = clientErrorDetail || { + phase: "runtime", name: "Error", message: clientError, + stack: "", source: null, state: null, + }; + const qr = errorQrGeometry(width, height); + wipe(7, 9, 18); + box(48, 48, width - 96, height - 96, 30, 14, 27); + errorTypeWrite("the game needs a moment", 92, 82, 52, 255, 92, 116); + drawErrorCountdown(width); + errorTypeWrite("restarting safely", 94, 158, 31, 255, 205, 74); + const messageLines = clientErrorLines(detail.message, 66).slice(0, 2); + for (let index = 0; index < messageLines.length; index++) + errorTypeWrite(messageLines[index], 94, 226 + index * 42, + 31, 248, 244, 255); + let cursorY = 226 + messageLines.length * 42 + 28; + if (detail.source) { + errorTypeWrite("source", 94, cursorY, 29, 112, 234, 255); + errorTypeWrite(detail.source.file, 214, cursorY, 29, 190, 216, 255); + errorTypeWrite("line " + detail.source.line + " column " + detail.source.column, + Math.min(width - 430, 214 + detail.source.file.length * 17), cursorY, + 29, 116, 255, 184); + cursorY += 48; + } + errorTypeWrite("state dump", 94, cursorY, 29, 116, 255, 184); + cursorY += 42; + for (const row of stateDumpRows(detail.state).slice(0, 6)) { + let leading = true; + for (const wrapped of clientErrorLines(row.text, qr ? 68 : 78).slice(0, 2)) { + if (cursorY > height - 196) break; + if (leading) drawDumpIcon(row.icon, 94, cursorY + 4, 22); + writeDumpLine(wrapped, 132, cursorY, 27); + cursorY += 36; + leading = false; + } + } + drawErrorQr(qr); + if (qr) errorTypeWrite("scan to share this dump", + qr.left, qr.top - 42, 27, 116, 255, 184); + const report = errorReportStatus(); + const posted = report.startsWith("posted"); + errorTypeWrite(report, 94, height - 150, 30, + ...(posted ? [116, 255, 184] : [255, 205, 74])); + errorTypeWrite("relaunch or deploy an update", 94, height - 104, + 30, 190, 202, 230); +} + +function drawClientErrorFallback() { + try { wipe(7, 9, 18); } catch (_) {} + try { systemWrite("aesthetic.computer error", 72, 72, 48, 255, 92, 116); } catch (_) {} + try { systemWrite(errorReportStatus(), 72, 146, 30, 255, 205, 74); } catch (_) {} + try { + systemWrite("restart in " + errorRestartSeconds() + "s", 72, 200, 30, + 255, 205, 74); + } catch (_) {} +} + +function fighterProfile(handle) { + const live = Array.isArray(acFeed.fighters) + ? acFeed.fighters.find((profile) => profile.handle.toUpperCase() === handle.toUpperCase()) + : null; + const fallback = handle === "DUMMY" ? npcFighter + : handle === "SPIDERDUMMY" ? spiderDummyFighter + : handle === "BOT" ? botFighter + : selfPlayFighters.find((profile) => profile.handle === handle) || + fighterRoster.find((profile) => profile.handle === handle); + return { + mood: live?.mood || (handle === "@JEFFREY" && acFeed.moodHandle === "@jeffrey" + ? acFeed.mood : "") || fallback?.mood || "", + lastChat: live?.lastChat || fallback?.lastChat || "", + colors: live?.colors?.length + ? live.colors.map((color) => [color.r, color.g, color.b]) + : fallback?.colors || [], + }; +} + +function syncSignedInFighter() { + if (localVersusActive()) return; + const identity = acFeed?.player; + if (!identity?.handle || players[0].npc) return; + const handle = String(identity.handle).toUpperCase(); + if (players[0].name !== handle) players[0].name = handle; + const colors = Array.isArray(identity.colors) + ? identity.colors.map((color) => Array.isArray(color) + ? color.slice(0, 3) : [color.r, color.g, color.b]) + .filter((color) => color.every(Number.isFinite)) : []; + if (colors.length) { + players[0].handleColors = colors; + players[0].color = colors.reduce((sum, color) => sum.map((value, index) => + value + color[index] / colors.length), [0, 0, 0]).map(Math.round); + } +} + +function applyRoster(player, index) { + if (localVersusActive()) { + player.rosterIndex = [0, 2, 1][player.pad]; + player.name = "PLAYER " + (player.pad + 1); + player.color = fighterRoster[player.rosterIndex].color.slice(); + player.handleColors = []; + return; + } + if (player.npc) { + const fighter = selfPlay && player.bot ? selfPlayFighters[player.pad] + : player.bot ? botFighter + : player.spiderDummy ? spiderDummyFighter : npcFighter; + player.rosterIndex = -1; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = fighter.colors; + if (selfPlay && player.bot) { + // The color IS the nameplate: a self-play bot is called what it wears, + // so the card reads "CORAL WINS ROUND" and the demo carries the color + // name out to any replay that wants to dress the fighter again. The + // harness may force the first seat's color by name for a proof bout. + const forcedName = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const forcedWorn = player.pad === 0 && forcedName && + cssColorBook.find((entry) => entry.name === forcedName); + const dressed = forcedWorn || selfPlayWardrobe(player.pad); + player.color = dressed.rgb.slice(); + player.colorName = dressed.name; + player.name = dressed.name.toUpperCase(); + } + return; + } + if (player.pad === 0 && !acFeed?.player?.handle) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + // A test harness may dress the anonymous seat by CSS color name — + // "YELLOW vs DUMMY" is a scripted sonic and orientation proof, so the + // fighter's look has to be as reproducible as the fight. + const forced = String(globalThis.__oskiewarWardrobe || "").toLowerCase(); + const worn = forced && cssColorBook.find((entry) => entry.name === forced); + if (worn) { + player.name = worn.name.toUpperCase(); + player.color = worn.rgb.slice(); + player.handleColors = []; + } + return; + } + // A negative index means there is no roster fighter here — an anonymous + // seat, or a remote one whose handle has not arrived. It used to wrap: -1 + // came out as the LAST roster entry, so an unnamed chair was dressed as a + // real person, and `Math.max(0, rosterIndex)` at the two versus callers + // floored it to the FIRST one instead. Between them an anonymous fight read + // as @JEFFREY against @SAT. Nobody is nobody. + if (index < 0) { + player.rosterIndex = -1; + player.name = anonymousFighter.handle; + player.color = anonymousFighter.color.slice(); + player.handleColors = anonymousFighter.colors; + return; + } + const rosterIndex = index % fighterRoster.length; + const fighter = fighterRoster[rosterIndex]; + const profile = fighterProfile(fighter.handle); + player.rosterIndex = rosterIndex; + player.name = fighter.handle; + player.color = fighter.color.slice(); + player.handleColors = profile.colors; +} + +// The one door into a fight. Training is free and anonymous — it is the front +// door and must never ask for anything, and `trainingbot` is that door's +// sparring partner: the bot's brain in a round that stays off the wire. Bot +// and ppl are what a handle buys, because they persist: a series, a published +// match, a replay, a ranking. Nothing opens those two doors yet, so only +// training reaches here and this call asks for nothing. +// +// The seam the sign-in actually landed on is `versusAllowed()`, because versus +// is the door that opened first: see `startVersusFight`. When bot and ppl open, +// they gate here on the same reader. +function startFightAgainst(kind, now) { + if (kind !== "local") setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + players[0].spawnX = tileCenterX(spawnColLeft); + players[1].spawnX = tileCenterX(spawnColRight); + if (players[2]) players[2].spawnX = tileCenterX((spawnColLeft + spawnColRight) / 2); + const opponent = players[1]; + fightOpponent = kind; + opponent.npc = kind === "dummy" || kind === "spiderdummy" || + kind === "bot" || kind === "trainingbot"; + opponent.bot = kind === "bot" || kind === "trainingbot"; + opponent.spiderDummy = kind === "spiderdummy"; + opponent.remote = false; + // Pad two is @OSKIE until ppl arrives carrying a handle of its own. + applyRoster(opponent, opponent.npc ? -1 : 2); + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + startReplay(now); + resetRound(now, true); + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +function survivalRequested() { + // The climb is a door asked for by name, and only by name. It used to be + // the empty door on any shell that could not raise the versus flag — the + // native consoles, whose publisher reads the relay and discards — which + // left the Xbox opening on the climb every boot. @jeffrey, on the console: + // "i dont like the climbing mode / map ... i want it in vs / dummy mode". + // So where versus cannot happen the empty door is the training fight + // (`beginTraining`, a sparring partner on the floor), the same landing the + // web gets when the relay is out of reach. + return String(globalThis.__oskiewarOpponent || "") + .trim().toLowerCase() === "survival"; +} + +const localVersusActive = () => fightOpponent === "local"; +// The web shell marks a pad `localController` when a physical gamepad is +// behind it; the console's pad object (QuickJsEngine PadObject) never +// carried the field, so `localControllerPair()` was false on the Xbox with +// three controllers plugged in and the dummy's chair never went to player +// two — @jeffrey, 2026-09-20: "it only sees one controller hmm". The native +// pad object carries no name or id either (PadObject: index, connected, +// sticks, triggers, down). What the console does have is `controllers()`, +// its enumeration of real hardware — a pad whose index sits inside that +// list is a local controller. The test harness stubs `gamepad` with two +// always-connected pads and defines no `controllers`, so its fights stay +// what they were; "connected" alone turned every harness fight into local +// versus (131 tests). +let nativeControllerCount = 0; +let nativeControllerPolls = 0; +function samplePad(index) { + let pad; + try { pad = gamepad(index); } catch (error) { + if (index < 2) throw error; + } + if (!pad) pad = { connected: false, down: [], leftX: 0, leftY: 0 }; + if (pad && pad.localController === undefined && pad.connected === true && + typeof controllers === "function") { + // Re-enumerate about twice a second; a pad joining mid-title waits at + // most that long for its chair. + if (index === 0 && nativeControllerPolls++ % 30 === 0) + nativeControllerCount = controllers().length; + if (index < nativeControllerCount) pad.localController = true; + } + return pad; +} +const localControllerPair = () => + padSnapshots.slice(0, 2).every((pad) => pad?.localController === true); +let localControllerPairSeen = false; +let localControllerMissing = -1; + +function startLocalVersus(now) { + finishReplay(); + fightOpponent = "local"; + setLocalPlayerCount(padSnapshots[2]?.localController === true ? 3 : 2); + telemetry("FIGHT_LOCAL_PLAYERS", String(players.length)); + for (const player of players) { + player.npc = false; + player.bot = false; + player.spiderDummy = false; + player.remote = false; + } + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + localControllerMissing = -1; + globalThis.__oskiewarVersusRoom = ""; + gameSpeed = 1; + startFightAgainst("local", now); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); +} + +function updateLocalVersus(now) { + const paired = localControllerPair(); + const arrived = paired && !localControllerPairSeen; + localControllerPairSeen = paired; + // A second local pad must never take over a remote fight or a recording. + if (roundViewer || netSession || selfPlay || resimActive || versusActive()) + return false; + if ((arrived && !localVersusActive()) || + (localVersusActive() && paired && players.length === 2 && + padSnapshots[2]?.localController === true)) startLocalVersus(now); + if (!localVersusActive()) { localControllerMissing = -1; return false; } + if (!paired || players.some((player) => + padSnapshots[player.pad]?.localController !== true)) { + localControllerMissing = padSnapshots.slice(0, players.length).findIndex( + (pad) => pad?.localController !== true); + return true; + } + if (localControllerMissing !== -1) { + localControllerMissing = -1; + // Restart the interrupted round with the match tally intact. Absolute + // attack/death timers cannot safely resume after an arbitrary unplug. + if (matchOver) startLocalVersus(now); + else resetRound(now, false, true); + startInputPending = true; + navigationPrevious = padSnapshots.map((pad) => pad?.down?.slice() || []); + } + return false; +} + +function versusRequested() { + return !String(globalThis.__oskiewarOpponent || "").trim() && + globalThis.__oskiewarVersusCapable === true; +} + +// --------------------------------------------------------------------------- +// The door. @jeffrey: "i think we should require users to axtually login in +// order to play... and also to make a handle in order to play". +// +// Training stays free and anonymous — it is the front door and must never ask +// for anything — and so does watching: the link a friend sends has to work for +// whoever opens it, account or no account. What a handle buys is the half of +// the game with another person on the other end of it, because that half is +// the half that persists. A fight against a stranger called RIVAL is not worth +// having; those placeholder names were the symptom, not the problem. +// +// The shell owns the account and the panel; this file owns the question of +// when the door is in the way. Two globals carry it: +// +// __oskiewarAccount { ready, signedIn, handle, colors } shell → game +// __oskiewarAccountDoor "" | "login" | "handle" game → shell +// The door is built, tested and wired on both sides, and it is held open until +// the tenant can actually let somebody through it. Native sign-in needs +// "Passwordless OTP" ticked on the Auth0 application, and as of 26.09.11 the +// tenant answers `unauthorized_client` — so the only way in is the redirect, +// which lands on the Universal Login page's Turnstile, which is the loop this +// whole flow exists to avoid. Requiring an account before there is a working +// way to make one does not gate the game, it closes it. +// +// Flip this to true the moment that grant is on. Everything behind it is +// already written and covered by tests, which drive it through +// `setVersusRequiresAccount`. +let versusRequiresAccount = false; + +const webAccountState = () => globalThis.__oskiewarAccount || null; +// Nobody is turned away before the shell has finished asking. A silent session +// check takes a moment, and a door that flashed up inside it would send a +// signed-in player off to sign in again. +const accountReady = () => webAccountState()?.ready === true; +const accountHandle = () => String(webAccountState()?.handle || ""); +// A shell with no account system at all is not a locked-out visitor, it is an +// older build, and it must not be left standing in a waiting room that can +// never start. The two halves of this door — the panel over there, the refusal +// here — ship together, and until the shell offers one there is nothing for +// this to hold shut. +// +// Which is the honest shape of it: this is a door, not a lock. The name on the +// wire has always been whatever the client says it is, and a console can set +// any global it likes. Enforcement would mean the relay verifying a token on +// the seat, and that is a different piece of work. +const versusAllowed = () => !versusRequiresAccount || !webAccountState() || + (accountReady() && webAccountState().signedIn === true && + Boolean(accountHandle())); + +// Which door, if any, stands between this visitor and a fight. Empty while the +// shell is still asking, and empty for anyone already through. +function versusDoor() { + if (!versusRequiresAccount) return ""; + if (!webAccountState() || !accountReady()) return ""; + if (webAccountState().signedIn !== true) return "login"; + if (!accountHandle()) return "handle"; + return ""; +} + +// Raised only while somebody is actually trying to play a person: standing in +// the waiting room, or holding a chair. A spectator is never asked for +// anything, and neither is the title screen. +// What this file last asked the shell for, so a panel that closes on its own +// can be told from one that was never open. +let accountDoorAsked = ""; + +function updateAccountDoor() { + const wanted = shellMode === "GAME" && versusLane() && !roundViewer + ? versusDoor() : ""; + const showing = globalThis.__oskiewarAccountDoor || ""; + // "never mind" drops every request the panel is holding, this one included. + // Left alone, the next frame would simply ask again and the panel would + // spring back up — which is not a dismissal, it is a trap. Somebody who + // backs out goes to the title screen instead, where the account button + // lives, where training is one press away, and where nothing is asking them + // for anything. + if (accountDoorAsked && wanted && !showing) { + accountDoorAsked = ""; + returnToTitle(runtime().monotonicUs, "account"); + return; + } + if (showing !== wanted) globalThis.__oskiewarAccountDoor = wanted; + accountDoorAsked = wanted; +} + +function startSurvivalRun(now, botControlled = false) { + gameMode = "survival"; + selfPlay = botControlled; + fightOpponent = "survival"; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + finishReplay(); + + const runner = players[0]; + runner.spawnX = centerX; + runner.npc = botControlled; + runner.bot = botControlled; + runner.spiderDummy = false; + applyRoster(runner, botControlled ? -1 : Math.max(0, runner.rosterIndex)); + + const absent = players[1]; + absent.spawnX = tileCenterX(cornerColRight); + absent.npc = true; + absent.bot = false; + absent.spiderDummy = false; + absent.remote = false; + applyRoster(absent, -1); + + resetRound(now, true); + absent.alive = false; + absent.respawnAt = Infinity; + absent.x = worldRight + gridWidth; + absent.y = floorY; + survivalStartedAt = now + survivalIntroDurationUs; + survivalLavaY = survivalLavaStart; + survivalHeight = 0; + survivalPeakLevel = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; + cameraWidth = survivalFrameWidth; + cameraContainFloor = 0; + cameraDoll.snap({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, + z: -survivalFrameWidth * 1.35 }, + width: survivalFrameWidth, perspective: 0, fov: 55, roll: 0 }); + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + pickup.active = false; + for (const item of balls) item.active = false; + emitSignal("survival", 0, 1, 0); +} + +// The title is a frozen first foothold, not an attract fight. START resets the +// runner and the lava together, so nobody loses a run beneath the wordmark. +function beginSurvival(now) { + setLocalPlayerCount(2); + startSurvivalRun(now, false); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - survivalIntroDurationUs; + survivalStartedAt = 0; + cameraCenter = (worldLeft + worldRight) / 2; + cameraCenterY = floorY - 240; +} + +// Whatever you land on is already a live training fight; the wordmark simply +// floats over it. The intro countdown is spent before the first frame so +// somebody arriving from a QR code is moving, not watching a number. +function beginTraining(now) { + setLocalPlayerCount(2); + startFightAgainst(trainingOpponentKind(), now); + shellMode = "MENU"; + gameplayStarted = false; + roundStartedAt = now - roundIntroDurationUs(); + const forcedAttract = globalThis.__oskiewarAttractVariant; + titleAttractMode = forcedAttract === "still" || forcedAttract === "action" + ? forcedAttract : hashUnit(matchName) < .5 ? "still" : "action"; + if (titleAttractMode === "action") { + // The title demonstration is a bot working a training dummy, not two + // anonymous red bots. Preserve the dummy's cool neutral material so the + // matchup is legible before START is pressed. + players[0].npc = true; + players[0].bot = true; + players[0].spiderDummy = false; + applyRoster(players[0], -1); + players[1].npc = true; + players[1].bot = false; + players[1].spiderDummy = false; + applyRoster(players[1], -1); + } +} + +// The versus lobby: one fighter, an empty chair, and the address as the +// invitation. Everything a visitor can do here is practice — their own moves +// are named back at them — until the relay seats a rival, at which point +// updateVersusSeat opens the real fight. The empty chair is parked out past +// the wall the way survival parks it, so the camera, the scorekeeping and +// the reactions all read a one-body room. +function beginVersusLobby(now, { title = false } = {}) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus-lobby"; + finishReplay(); + seriesName = ""; + matchName = ""; + previousRoundName = ""; + if (!versusRoomName) versusRoomName = sessionName; + globalThis.__oskiewarVersusRoom = versusRoomName; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const chair = players[1]; + chair.spawnX = tileCenterX(spawnColRight); + chair.npc = true; + chair.bot = false; + chair.spiderDummy = false; + chair.remote = false; + applyRoster(chair, -1); + selecting = false; + shellMode = title ? "MENU" : "GAME"; + gameplayStarted = !title; + titleTransitionAt = null; + resetRound(now, true); + chair.alive = false; + chair.respawnAt = Infinity; + chair.x = worldRight + gridWidth; + chair.y = floorY; + // An empty chair wears no dummy's name — the wire calls it NOBODY. And the + // room forgets who was last in it, so the next person to sit down is dressed + // from their own offer rather than inheriting the last one's. + chair.name = ""; + versusRivalName = ""; + versusRivalOffered = ""; + // Spend the countdown before the first frame: arriving is moving, and + // there is nobody here to count in against anyway. + roundStartedAt = now - roundIntroDurationUs(); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + versusRoomName) : null; + emitSignal("versus-lobby", 0, 1, 0); +} + +// A rival took the chair. Seat them as a real second fighter — no bot brain, +// no npc stillness, their presses riding in off the relay — and open the +// round with the full countdown so both screens see the same three seconds. +function startVersusFight(now, resetMatch = true) { + // The one gate that matters: this is the call that puts two people in a + // round. Everything below it — publishing, the seat, the score — assumes + // both ends have a name worth writing down. + if (!versusAllowed()) return; + gameMode = "fight"; + selfPlay = false; + fightOpponent = "versus"; + const local = players[0]; + local.spawnX = tileCenterX(spawnColLeft); + local.npc = false; + local.bot = false; + local.spiderDummy = false; + local.remote = false; + applyRoster(local, local.rosterIndex); + const rival = players[1]; + rival.spawnX = tileCenterX(spawnColRight); + rival.npc = false; + rival.bot = false; + rival.spiderDummy = false; + rival.remote = true; + selecting = false; + shellMode = "GAME"; + gameplayStarted = true; + titleTransitionAt = null; + // A fresh match is a fresh series, and a versus series is now recorded like + // any other. A round rollover inside a match keeps the one it has. + if (resetMatch) startReplay(now); + resetRound(now, resetMatch); + dressVersusRival(); + if (resetMatch && typeof analytics === "function") { + analytics("match_started", { + source_system: "browser", + surface: "web", + opponent_type: "remote-player", + }); + } + emitSignal("fighters", -1, players[0].rosterIndex, players[1].rosterIndex); +} + +// What the rival is called and what they wear, read off the freshest input +// frame — the challenger mails their handle and colors with every press, so +// a name arriving late still lands. The relay already shape-checked both; +// the sanitize here is for the state schema's sake, because one bent name +// would cost every published frame. +function dressVersusRival() { + if (netSession) { netApplyIdentities(netSession.deal); return; } + const rival = players[1]; + if (!rival.remote) return; + const remote = globalThis.__oskiewarRemotePad; + const offered = versusOfferedName(); + versusRivalOffered = offered; + versusRivalName = /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : ""; + rival.name = versusRivalName; + const colors = (Array.isArray(remote?.colors) ? remote.colors : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)); + if (colors.length) { + rival.handleColors = colors; + rival.color = colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); + } else { + rival.handleColors = []; + rival.color = [38, 82, 176]; + } +} + +// The versus lane's own wire: one room, streamed faster than a grandstand +// needs because for the challenger this feed IS the game. It runs from the +// title screen on — a friend can arrive while the host is still reading the +// wordmark — and rides the same publisher socket the round rooms use. +function publishVersus(now) { + // Both seats simulate, but only the host narrates: the grandstand keeps + // the stream it always had, and the challenger never races the host for + // the room's one publisher socket. + if (netSession && netSession.seat !== 0) return; + if (netSilent || !versusLane() || !versusRoomName || livePublishFailed || + typeof publishLive !== "function") return; + // A waiting room nobody can be invited into is not a room. Publishing it + // would put it in front of the matchmaker as a chair to take. + if (!versusAllowed()) return; + // Paced on the WALL clock, not the simulation's. The driver runs up to four + // owed ticks in one instant to catch up, and a sim-clocked gate let every + // one of those emit its own frame — two or three full state builds in the + // same millisecond, arriving at the relay as a burst it can only coalesce. + // Catch-up is exactly when the fight is busiest, so the cost landed where + // there was least room for it. Wall time makes a burst one frame. + const wall = runtime().unixMs || 0; + if (wall && wall < versusNextAt) return; + versusNextAt = wall + versusSnapshotIntervalMs; + try { + publishLive("ow-" + versusRoomName, JSON.stringify(spectatorState(now))); + } catch (error) { + livePublishFailed = true; + telemetry("OSKIEWAR_LIVE_DISABLED", String(error?.message || error)); + } +} + +// Two visitors can arrive through the same dead address and both decide to +// host it. The relay lets exactly one publish; the other's shell hears "this +// match already has a publisher" and raises a flag, and this walks that +// loser back into the room as a challenger through the bridge it kept. +function updateVersusConflict(now) { + if (!versusLane() || !versusFallbackBridge) return false; + if (globalThis.__oskiewarPublishConflict !== "ow-" + versusRoomName) + return false; + globalThis.__oskiewarPublishConflict = ""; + const bridge = versusFallbackBridge; + versusFallbackBridge = null; + bridge.role = "challenger"; + roundViewer = bridge; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + roundResult = ""; + matchOver = false; + matchName = bridge.name || ""; + roundStartedAt = now - roundIntroDurationUs(); + roundViewerStop = bridge.start(handleRoundViewer); + telemetry("VERSUS_CONFLICT", versusRoomName); + return true; +} + +// The seat, watched every tick. Fresh presses in the lobby open the fight; +// a wire gone quiet mid-fight sends the room back to waiting. The rival's +// wardrobe follows their freshest frame because the handle can arrive after +// the chair was taken. +function updateVersusSeat(now) { + if (netSession) return; + if (updateVersusConflict(now)) return; + if (!versusLane()) return; + // A rival who can roll back says so on the net channel. Their first pad + // usually lands first, so the offer is taken here rather than only from + // the lobby — a streamed fight one second old is upgraded in place. + if (netPeerHello && netHostBegin(now)) return; + const fresh = versusChallengerFresh(); + if (lobbyActive() && fresh && versusAllowed()) { + startVersusFight(now, true); + return; + } + if (versusActive() && !fresh) { + beginVersusLobby(now); + return; + } + if (versusActive() && fresh && versusOfferedName() !== versusRivalOffered) + dressVersusRival(); +} + +// A dead body falling. No input, no collision with anybody, no ledges: a +// corpse is not a fighter and must not catch a rung it would have caught +// alive. It drops, it lands on the ground under it, and it stops. +function settleCorpse(player, dt) { + if (player.grounded) return; + player.vy += fallGravity() * dt; + player.x += player.vx * dt; + player.y += player.vy * dt; + player.vx *= .96; + const terrainY = terrainFloorAt(player.x); + if (player.y < terrainY) return; + player.y = terrainY; + player.vy = 0; + player.vx = 0; + player.grounded = true; +} + +// Lobby deaths have a respawn beat, but no round or killcam to reset state. +function updateLobbyMortality(now) { + if (!lobbyActive()) return; + const player = players[0]; + if (player.alive && hasPart(player, "torso")) return; + if (player.lobbyDeathDressed) return; + if (player.alive) { + player.alive = false; + player.lastButton = "DESTROYED"; + player.lastButtonAt = now; + spawnImpact({ x: player.x, y: player.y - 60, z: player.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(player)); + } + player.lobbyDeathDressed = true; + player.respawnAt = Math.max(player.respawnAt || 0, now + 2500000); + releaseCarriedBall(player, now); + releaseCarriedPart(player, now); + releaseCarriedFighter(player, now); + dismountSkateboard(player, now); + player.attackKind = player.itemAction = ""; + player.attackUntil = player.itemActionUntil = player.dashUntil = 0; + player.attackHit = player.blocking = player.grabHeld = false; + player.pounding = player.pogoDive = player.pogoHit = false; + player.jumpHeld = false; + player.runSince = player.walkSince = 0; + player.jumpPoseUntil = player.landPoseUntil = player.hopUntil = 0; + player.inputX = player.inputY = player.vx = 0; + player.stance = "HIT"; + delete player.frozenGeometry; + delete player.frozenAt; + deathCinematic = null; +} + +// Deprecated with PAL_SELECT — see the flag. +function beginSelect(now) { + selecting = true; + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + selectionReady[1] = false; + selectionPrevious[0] = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + roundResult = ""; + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + fightHitMarks.length = 0; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) + for (const mark of globalThis.__oskiewarFightHitForecast) + fightHitMarks.push({ at: clamp(Number(mark.at) || 0, 0, 1), + color: Array.isArray(mark.color) ? mark.color.slice(0, 3) : [226, 42, 66], + decisive: mark.decisive === true }); + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + roundStartedAt = now; + for (const player of activePlayers()) { + player.roundWins = 0; + player.score = 0; + player.alive = true; + } +} + +function returnToTitle(now, reason = "back") { + finishReplay(); + if (survivalActive()) beginSurvival(now); + else if (versusLane()) beginVersusLobby(now, { title: true }); + else beginTraining(now); + // Menu is a hard navigation boundary: discard the prior fight's zoom and + // right-stick diorama angle before the very first title frame is painted. + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + // The lobby frames its one fighter — the empty chair is parked past the + // wall, and averaging it in would sling the lens a map-width off stage. + cameraCenter = survivalActive() ? (worldLeft + worldRight) / 2 + : lobbyActive() ? players[0].x + : (players[0].x + players[1].x) / 2; + cameraCenterY = survivalActive() ? floorY - 240 + : lobbyActive() ? players[0].y - 90 + : (players[0].y + players[1].y) / 2 - 90; + cameraWidth = survivalActive() ? survivalFrameWidth + : lobbyActive() ? 980 + : Math.max(980, Math.abs(players[1].x - players[0].x) + 760); + cameraContainFloor = 0; + const cameraTarget = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.snap({ target: cameraTarget, + position: { x: cameraCenter, y: cameraCenterY, + z: -cameraWidth * 1.2 }, + width: cameraWidth, perspective: 0, fov: 55, roll: 0 }); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + selectionPrevious[0] = shellPrevious.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + playDrum("block", .8, 0); + telemetry("SHELL", "game->title " + reason + " " + now); +} + +// A mechanical test drives both fighters with the same bot and says so on the +// nameplates, instead of flying a handle nobody is holding. Entered through +// `__oskiewarSelfPlay` before boot or by calling this — never from a button, +// so normal play cannot fall into it. +function startSelfPlay(now) { + setLocalPlayerCount(2); + gameMode = "fight"; + selfPlay = true; + // The harness is not the free door. A self-play run armed from a live title + // inherits whatever training was seated, and leaving that behind would keep + // the whole mechanical test off the wire — no demo, no rollover. + fightOpponent = ""; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of activePlayers()) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.remote = false; + player.rosterIndex = -1; + } + // The reel harness may seat the training dummy in the second chair — a + // scripted "COLOR vs DUMMY" proof bout. The dummy has no bot AI, so the + // timed-training flag keeps the round on the clock it would otherwise + // drop. + if (globalThis.__oskiewarSelfPlayOpponent === "dummy") + players[1].bot = false; + startReplay(now); + resetRound(now, true); + // No dealt equipment. The cube's blade and pistol wait on their floor + // tiles in self-play exactly as they do in a live match, and the bots arm + // themselves by walking over them — or don't. + // The bots' dice are seeded off the round clock, which a re-simulation + // cannot reproduce — so a dense demo carries the seeds themselves, and a + // replayed sim rolls exactly what the live pass rolled. Spawns ride along + // for the same reason: the fight can only rerun from where it stood. + if (replay && replayCheckpointUs() < 100000) { + replay.botSeeds = players.map((player) => player.botRngState >>> 0); + replay.spawns = players.map((player) => Math.round(player.spawnX)); + // Animation runs off the page-boot clock, and limb pose decides where a + // strike lands — a rerun needs the same phase or contacts wander. + replay.posePhaseUs = Math.round(now - startedAt); + } +} + +// Re-simulation: the offline renderer's honest path. Instead of puppeting +// recorded state, the page reruns the ACTUAL fight — same name stream, same +// ball, same bot dice — through the real simulation at the fixed step. Every +// limb tint, item drop, and debris mote is the engine's own, in the current +// build, with nothing lost to the demo schema. State checkpoints remain as a +// drift meter, not as the picture. +let resimActive = false; +// Whether the demo being re-run was a round on a clock. Versus rounds are not, +// and handing one a countdown it never had would end the re-run early on a +// fight the original played past. Demos recorded before this field carry no +// answer and were all timed. +let resimTimed = true; +let resimPending = null; +let resimTick = -1; +let resimCheckpoints = null; +let resimCommands = null; +let resimFirstRowTick = 0; +let resimCommandCursor = 0; +let resimMask = [0, 0]; + +// The inverse of `inputCommand`: a recorded mask back into the pad shape the +// sim reads. Replaying the live pass's actual inputs — instead of letting +// bot AI re-decide — pins every action to its recorded tick, which is what +// keeps the rerun's hits on the audio's timestamps. +function resimPad(pad) { + const mask = resimMask[pad] || 0; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + return { connected: true, down, leftX: 0, leftY: 0, rightX: 0, rightY: 0 }; +} + +function advanceResimCommands() { + if (!resimCommands) return; + while (resimCommandCursor < resimCommands.length && + resimCommands[resimCommandCursor][0] <= resimTick) { + const [, pad, mask] = resimCommands[resimCommandCursor]; + resimMask[pad] = mask; + resimCommandCursor++; + } +} +function startResim(demo, now) { + configureWorldMap(demo.map); + gameMode = "fight"; + resimActive = true; + resimTimed = demo.timed !== false; + // The reset step is demo tick zero; every later sim step counts one. + resimTick = 0; + resimCheckpoints = new Map( + (demo.checkpoints || []).map((row) => [row[0], row])); + resimFirstRowTick = demo.checkpoints?.[0]?.[0] ?? 0; + resimCommands = demo.commands || null; + resimCommandCursor = 0; + resimMask = [0, 0]; + globalThis.__oskiewarResimDrift = { ticks: 0, maxDrift: 0, atTick: 0 }; + selfPlay = true; + shellMode = "GAME"; + gameplayStarted = true; + selecting = false; + titleTransitionAt = null; + for (const player of players) { + player.npc = true; + player.bot = true; + player.spiderDummy = false; + player.rosterIndex = -1; + } + if (demo.fighters?.[1] === "DUMMY") players[1].bot = false; + // A forced first-seat color survives in the demo as the fighter's own + // name, so the rerun dresses itself without being told. + const worn = String(demo.fighters?.[0] || "").toLowerCase(); + if (cssColorBook.some((entry) => entry.name === worn)) + globalThis.__oskiewarWardrobe = worn; + seedNames(demo.nameSeed >>> 0); + seriesName = demo.seriesName || demo.matchName || ""; + matchBallType = demo.ballType || seriesBallType(seriesName); + matchName = String(demo.roundName || "").replace(/^ow-/, ""); + if (Array.isArray(demo.spawns)) + players.forEach((player, index) => { + if (demo.spawns[index] != null) player.spawnX = demo.spawns[index]; + }); + replay = null; + resetRound(now, true); + // Self-play deals nothing at the bell, so the rerun starts from the same + // bare table: both weapons still on their tiles. + if (Array.isArray(demo.botSeeds)) + players.forEach((player, index) => { + if (demo.botSeeds[index] != null) + player.botRngState = demo.botSeeds[index] >>> 0; + }); + // The recording says which tick its fight opened on; anchoring the intro + // clock to that tick removes the ±1-step phase that clock rounding deals + // each pass, so replayed inputs land exactly where they were pressed. + const fightOpen = demo.checkpoints?.[0]?.[0]; + if (fightOpen) roundStartedAt = now + fightOpen * 16667 - + roundIntroDurationUs() - 8000; + if (demo.posePhaseUs != null) startedAt = now - demo.posePhaseUs; +} + +function trackResimDrift(now) { + if (!resimActive || !resimCheckpoints) return; + const report = globalThis.__oskiewarResimDrift; + // The intro's length lands ±1 tick depending on each pass's clock + // rounding, so tick spaces are aligned on the fight's own first physics + // step — this call site is only reached once the fight is live, and the + // recording likewise begins there. + if (report.tickOffset === undefined) + report.tickOffset = resimFirstRowTick - resimTick; + const alignedTick = resimTick + report.tickOffset; + if (roundResult && !report.endedAt) { + report.endedAt = resimTick; + report.endedWith = roundResult; + report.endedCause = roundCause; + } + const row = resimCheckpoints.get(alignedTick); + if (!row) return; + report.ticks++; + for (let pad = 0; pad < players.length; pad++) { + const offset = 1 + pad * 8; + const drift = Math.hypot(players[pad].x - row[offset], + players[pad].y - row[offset + 1]); + if (drift > 4 && report.firstDriftTick === undefined) { + report.firstDriftTick = alignedTick; + report.firstDriftPad = pad; + report.firstDrift = Math.round(drift * 10) / 10; + report.liveAt = [row[offset], row[offset + 1]]; + report.resimAt = [Math.round(players[pad].x), Math.round(players[pad].y)]; + } + if (drift > report.maxDrift) { + report.maxDrift = Math.round(drift * 10) / 10; + report.atTick = alignedTick; + } + } +} + +function consumeSystemButtons(now) { + let pressed = false; + for (let index = 0; index < padSnapshots.length; index++) { + const down = padSnapshots[index]?.down || []; + const previous = navigationPrevious[index] || []; + if (down.includes("RightStick") && !previous.includes("RightStick")) { + playerCameraYaw = 0; + playerCameraPitch = 0; + playerCameraZoom = 1; + } + if (down.includes("View") && !previous.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + if (down.includes("Menu") && !previous.includes("Menu")) pressed = true; + navigationPrevious[index] = down.slice(); + } + // Self-play has no title to return to — a stray Menu press would strand the + // loop on a screen nobody is there to start. + if (!pressed || selfPlay || shellMode !== "GAME" || selecting) return false; + returnToTitle(now, "menu"); + return true; +} + +// Start lifts the wordmark off a fight that is already running underneath. +function enterGame(now) { + startInputPending = true; + if (localControllerPair() && !roundViewer && !netSession && !versusActive()) { + startLocalVersus(now); + return; + } + if (survivalActive()) { + startSurvivalRun(now, false); + globalThis.__oskiewarStartLine = "climb!"; + playDrum("bell", 1.05, 0); + playSine(660, .12); + shellPrevious = padSnapshots[0]?.down?.slice() || []; + return; + } + if (titleAttractMode === "action") { + selfPlay = false; + players[0].npc = false; + players[0].bot = false; + players[0].spiderDummy = false; + applyRoster(players[0], Math.max(0, players[0].rosterIndex)); + // Attract keeps a cool neutral body in the second chair so the tableau + // reads as a matchup rather than two identical red bots. Start hands the + // first seat back and re-seats whichever sparring partner this session was + // actually dealt: hardcoding the inert dummy here left every session the + // clock dealt the action tableau — half of them — still punching a post + // after training switched to the bot. + const training = trainingOpponentKind(); + players[1].npc = true; + players[1].bot = training === "trainingbot"; + players[1].spiderDummy = training === "spiderdummy"; + applyRoster(players[1], -1); + } + shellMode = "GAME"; + gameplayStarted = true; + if (dummyGuideStartedAt === null && players[1].npc && !players[1].bot) + dummyGuideStartedAt = now; + shellPrevious = padSnapshots[0]?.down?.slice() || []; + if (PAL_SELECT) beginSelect(now); +} + +// Comma and period step the pace mid-fight the way +/- do on the title — a +// quarter at a time, but never past full speed: slow motion is for reading a +// bot's tells. A wired fight keeps the clock both seats agreed on, so the +// keys go dead the moment a rival is real, and a watcher's playout is the +// host's clock too. Edge-detected against the same unfiltered pad memory the +// title uses, so a key held across the start steps exactly once. +const paceLocked = () => netSession !== null || versusActive() || + roundViewer !== null; +function updateMatchPace(now) { + const rawDown = padSnapshots[0]?.down || []; + const tap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + const faster = tap("SpeedUp"); + const slower = tap("SpeedDown"); + shellRawPrevious = rawDown.slice(); + if (!faster && !slower) return; + const next = paceLocked() ? gameSpeed + : clamp(gameSpeed + (faster ? .25 : -.25), .25, 1); + if (next === gameSpeed) { playDrum("block", .3, 0); return; } + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, faster ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); +} + +function updateShell(now, tapped = false) { + const pad = padSnapshots[0] || {}; + // The title screen is where the game's pace is set: +/- on a keyboard + // step the clock a quarter at a time, from a quarter speed to double. + // Handled before anything else so a speed tap can never read as "start", + // and edge-detected against the unfiltered pad so holding the key steps + // exactly once. + const rawDown = pad.down || []; + const speedTap = (button) => rawDown.includes(button) && + !shellRawPrevious.includes(button); + if (speedTap("SpeedUp") || speedTap("SpeedDown")) { + const stepped = gameSpeed + (speedTap("SpeedUp") ? .25 : -.25); + const next = clamp(stepped, .25, 2); + if (next !== gameSpeed) { + gameSpeed = next; + gameSpeedChangedAt = now; + playDrum("hat", .55, speedTap("SpeedUp") ? .35 : -.35); + emitSignal("game-speed", -1, gameSpeed, 0); + } else playDrum("block", .3, 0); + } + shellRawPrevious = rawDown.slice(); + // View and Menu are the system's buttons — View toggles the debug HUD and + // must not double as "start the game". Everything else, and a real lean on + // the analog stick, says the player wants in. + const down = rawDown + .filter((button) => button !== "View" && button !== "Menu" && + button !== "SpeedUp" && button !== "SpeedDown"); + const stickLive = Math.abs(pad.leftX || 0) > .5 || Math.abs(pad.leftY || 0) > .5; + if (titleTransitionAt !== null) { + if (now - titleTransitionAt >= 700000) { + titleTransitionAt = null; + enterGame(now); + } + shellPrevious = down.slice(); + shellStickLive = stickLive; + return; + } + if (tapped || down.some((button) => !shellPrevious.includes(button)) || + (stickLive && !shellStickLive)) { + playDrum("hat", .55, 0); + if (typeof titleBeep === "function") titleBeep(); + if (typeof titleVoice === "function") titleVoice(); + emitSignal("select", -1, 1, 0); + titleTransitionAt = now; + startInputPending = true; + } + shellPrevious = down.slice(); + shellStickLive = stickLive; +} + +// Everything from here through `updateSelect` is the deprecated pal select, +// held behind PAL_SELECT — see the flag. +function selectionOptions() { + if (selectionStep === 0) return fighterRoster.map((fighter, rosterIndex) => ({ + kind: "pal", fighter, rosterIndex, + })); + return [ + { kind: "bot", fighter: botFighter, rosterIndex: -1 }, + { kind: "dummy", fighter: npcFighter, rosterIndex: -1 }, + { kind: "spiderdummy", fighter: spiderDummyFighter, rosterIndex: -1 }, + { kind: "people", fighter: peopleFighter, rosterIndex: -1, disabled: true }, + ]; +} + +function startSelectedRound(now) { + selectionReady[0] = true; + selectionReady[1] = true; + startFightAgainst( + players[1].bot ? "bot" : players[1].spiderDummy ? "spiderdummy" + : players[1].npc ? "dummy" : "ppl", now); +} + +function chooseSelection(index, now) { + const option = selectionOptions()[index]; + if (!option) return; + if (option.disabled) { + playDrum("block", .45, 0); + return; + } + if (selectionStep === 0) { + applyRoster(players[0], option.rosterIndex); + selectionReady[0] = true; + selectionStep = 1; + // The dummy is where a fight should start: it stands still and lets you + // learn the buttons. Picking the bot is a decision, not a default. + selectionCursor = Math.max(0, + selectionOptions().findIndex((option) => option.kind === "dummy")); + playDrum("hat", .9, -.55); + emitSignal("select", 0, option.rosterIndex, 0); + return; + } + const opponent = players[1]; + opponent.npc = option.kind === "dummy" || option.kind === "spiderdummy" || + option.kind === "bot"; + opponent.bot = option.kind === "bot"; + opponent.spiderDummy = option.kind === "spiderdummy"; + applyRoster(opponent, option.rosterIndex); + playDrum("clap", 1, .55); + emitSignal("select", 1, option.rosterIndex, opponent.bot ? 2 : opponent.npc ? 1 : 0); + startSelectedRound(now); +} + +function selectionBack(now) { + if (selectionStep === 1) { + selectionStep = 0; + selectionCursor = Math.max(0, players[0].rosterIndex); + selectionReady[0] = false; + playDrum("block", .7, 0); + return; + } + returnToTitle(now, "back"); +} + +// One pal at a time: the cursor holds the middle of the screen and its two +// neighbours recede to either side, so the roster reads as a wheel you turn +// rather than a board you scan. +function selectionTouchLayout() { + const count = selectionOptions().length; + const compact = compactLayout(); + const centerX = viewCenterX(); + const cardWidth = compact ? Math.min(280, viewWidth() * .44) : 680; + const cardHeight = compact ? 360 : 720; + const top = compact ? 176 : 190; + const sideScale = compact ? .5 : .66; + const reach = cardWidth * (1 + sideScale) / 2 + (compact ? 6 : 26); + const slots = count > 2 ? [-1, 0, 1] : count > 1 ? [0, 1] : [0]; + return { + back: compact + ? { x: 24, y: 126, width: 112, height: 50 } + : { x: viewOffsetX() + 90, y: 112, width: 170, height: 70 }, + options: slots.map((slot) => { + const scale = slot === 0 ? 1 : sideScale; + const width = cardWidth * scale; + const height = cardHeight * scale; + return { index: (selectionCursor + slot + count) % count, slot, + x: centerX + slot * reach - width / 2, + y: top + (cardHeight - height) / 2, width, height }; + }), + }; +} + +const pointInRect = (point, rect) => rect && point.x >= rect.x && + point.x <= rect.x + rect.width && point.y >= rect.y && + point.y <= rect.y + rect.height; + +function selectionHover(layout = selectionTouchLayout()) { + const pointer = globalThis.__oskiewarTouch?.pointer; + if (!pointer?.active || !Number.isFinite(pointer.x) || + !Number.isFinite(pointer.y)) return null; + if (pointInRect(pointer, layout.back)) return { back: true }; + const option = layout.options.find((rect) => pointInRect(pointer, rect)); + return option && !selectionOptions()[option.index]?.disabled + ? { option: option.index } : null; +} + +function consumeSelectTouches(now) { + const queue = globalThis.__oskiewarTouch?.taps; + if (!Array.isArray(queue) || !queue.length) return; + const touches = queue.splice(0); + const layout = selectionTouchLayout(); + const options = selectionOptions(); + for (const point of touches) { + if (pointInRect(point, layout.back)) selectionBack(now); + else { + const rect = layout.options.find((option) => pointInRect(point, option)); + // A receding neighbour turns the wheel; the focused card commits. A + // disabled card duds either way. + if (rect && (rect.slot === 0 || options[rect.index]?.disabled)) + chooseSelection(rect.index, now); + else if (rect) { + selectionCursor = rect.index; + playDrum("hat", .55, 0); + } + } + if (!selecting || shellMode === "MENU") break; + } +} + +function updateSelect(now) { + consumeSelectTouches(now); + if (!selecting || shellMode === "MENU") return; + const down = padSnapshots[0]?.down || []; + const previous = selectionPrevious[0]; + const pressed = (button) => down.includes(button) && !previous.includes(button); + const optionCount = selectionOptions().length; + let movement = 0; + if (pressed("ArrowLeft") || pressed("ArrowUp")) movement = -1; + else if (pressed("ArrowRight") || pressed("ArrowDown")) movement = 1; + if (movement) { + let next = selectionCursor; + for (let index = 0; index < optionCount; index++) { + next = (next + movement + optionCount) % optionCount; + if (!selectionOptions()[next]?.disabled) break; + } + if (next !== selectionCursor) { + selectionCursor = next; + playDrum("hat", .55, 0); + } + } + if (pressed("B") || pressed("Menu")) selectionBack(now); + else if (pressed("A")) chooseSelection(selectionCursor, now); + selectionPrevious[0] = down.slice(); + selectionPrevious[1] = padSnapshots[1]?.down?.slice() || []; +} + +function randomWindMph() { + return 0; +} + +function rollWind(now = runtime().monotonicUs, immediate = true) { + windTargetMph = 0; + windTargetDirection = 1; + nextWindChangeAt = Infinity; + windMph = 0; + windDirection = 1; + windAcceleration = 0; + emitSignal("wind", -1, windTargetDirection, windTargetMph); +} + +function updateWind(dt, now) { + windMph = 0; + windDirection = 1; + windAcceleration = 0; +} + +// The match ball is drawn from the series identity. That identity is itself +// seeded once per match and recorded, so re-running a demo's inputs inflates +// the same ball -- the name this hashes used to come straight from +// Math.random, which silently made ball radius and mass unreproducible. +function seriesBallType(name) { + // Only the kinds marked for the series. The hover board lives in `ballKinds` + // because it IS one of these objects to the physics, but a match that + // inflated a board as its ball would put two boards on a station that is + // supposed to hold exactly one. + const deck = ballKinds.filter((kind) => kind.series !== false); + const roll = hashUnit("ball:" + (name || "oskiewar")); + return deck[Math.min(deck.length - 1, Math.floor(roll * deck.length))].type; +} + +function resetBalls(now) { + Object.assign(balls[0], + ballKinds.find((kind) => kind.type === matchBallType && kind.series !== false) || + ballKinds[0]); + for (const item of balls) { + // The board is placed, not served. It lies in the far floor corner from + // the pistol, so the bell offers three ways to spend the same seconds: + // rush the middle bare-handed, break left for the board, or break right + // for the gun. Putting it on the centre line instead would have made it + // the only opening move worth making. + if (item.type === "skateboard") { + item.x = tileCenterX(Math.floor((item.spawnCol ?? cornerColLeft) * gridCols / 40)); + item.riderPad = -1; + item.y = skateContact(item.x, terrainFloorAt(item.x)).y - skateAxleDrop - skateWheelRadius; + item.z = 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.skateSpin = 0; + item.heldBy = -1; + const rider = skateparkMap ? players[balls.indexOf(item) - 1] : null; + item.riderPad = rider?.skateboard ? rider.pad : -1; + item.active = skateBoardEnabled && item.riderPad < 0; + item.serveAt = 0; + item.lastHitBy = -1; + item.safeUntil = 0; + item.safePlayers = 0; + continue; + } + const owner = item.spawnOwner >= 0 ? players[item.spawnOwner] : null; + item.x = owner ? owner.spawnX + owner.facing * 180 + : centerX; + item.y = owner ? terrainFloorAt(item.x) - item.radius + : terrainFloorAt(item.x) - gridHeight + item.radius + 40; + // An unowned ball begins airborne over the cube's center tile seam and + // drops onto the middle of the fight. + item.z = owner ? owner.z : 0; + item.vx = 0; + item.vy = 0; + item.rotation = 0; + item.heldBy = -1; + item.active = ballEnabled; + item.serveAt = now + roundIntroDurationUs() + 150000; + item.lastHitBy = owner ? owner.pad : -1; + item.safeUntil = item.serveAt; + item.safePlayers = owner ? 1 << owner.pad : 0; + // A serve call for a ball that will never inflate is a sound cue lying. + if (ballEnabled) emitSignal("ballserve", owner ? owner.pad : -1, + owner ? owner.facing : 0, windMph); + } +} + +const buttonLabel = (button) => ({ + ArrowUp: "UP", ArrowDown: "DOWN", ArrowLeft: "LEFT", ArrowRight: "RIGHT", + LeftShoulder: "LB", RightShoulder: "RB", LeftStick: "LEFT STICK", + RightStick: "RIGHT STICK", View: "VIEW", Menu: "MENU", + LeftTrigger: "LT", RightTrigger: "RT", +}[button] || String(button).toUpperCase()); + +function roundDemoState(demo, now) { + const checkpoints = demo?.checkpoints || []; + if (!checkpoints.length) return null; + const roundIndex = Number.isInteger(demo.roundIndex) ? demo.roundIndex + : Math.max(0, (demo.rounds?.length || 1) - 1); + const startTick = demo.rounds?.[roundIndex]?.[0] || 0; + const finalCheckpoint = checkpoints[checkpoints.length - 1]; + const endTick = Math.max(startTick + 1, demo.durationTicks || finalCheckpoint[0]); + const elapsed = Math.floor((now - roundViewerDemoStartedAt) / replayTickUs); + const tick = startTick + elapsed % (endTick - startTick + 1); + let before = checkpoints[0], after = finalCheckpoint; + for (const row of checkpoints) { + if (row[0] <= tick) before = row; + if (row[0] >= tick) { after = row; break; } + } + const amount = clamp((tick - before[0]) / Math.max(1, after[0] - before[0]), 0, 1); + const value = (index) => lerp(before[index], after[index], amount); + const recentAttack = (pad) => { + let kind = ""; + let age = 0; + for (const event of demo.events || []) { + if (event[0] > tick || event[0] < tick - 18 || event[2] !== pad) continue; + if (meleeSpecs[event[1].toUpperCase()]) { + kind = event[1].toUpperCase(); + age = tick - event[0]; + } + } + return { kind, age }; + }; + const fighters = [0, 1].map((pad) => { + const offset = 1 + pad * 8; + const flags = before[offset + 5]; + const name = demo.fighters?.[pad] || `P${pad + 1}`; + const profile = name === "DUMMY" ? npcFighter : name === "BOT" ? botFighter + : fighterRoster.find((fighter) => fighter.handle === name); + // A self-play fighter is called what it wears, so a demo's fighter name + // is first tried against the color book itself — the repaint dresses + // straight from the nameplate. Older demos still say "BOT 1"/"BOT 2"; + // those deal from the wardrobe hash so they don't fall back to the + // house red and blue. + const wornColor = cssColorBook.find( + (entry) => entry.name === name.toLowerCase()); + const selfPlayPad = selfPlayFighters.findIndex( + (fighter) => fighter.handle === name); + const swing = recentAttack(pad); + const vx = value(offset + 3); + return { name, nation: demo.nations?.[pad] || "", + color: wornColor ? wornColor.rgb.slice() + : selfPlayPad >= 0 ? selfPlayWardrobe(selfPlayPad).rgb.slice() + : profile?.color || players[pad].color, + x: value(offset), y: value(offset + 1), z: value(offset + 2), + vx, vy: value(offset + 4), vz: 0, + facing: flags & 8192 ? (flags & 4096 ? 1 : -1) + : vx ? Math.sign(vx) : pad ? -1 : 1, + alive: Boolean(flags & 1), grounded: Boolean(flags & 2), + ducking: Boolean(flags & 4), blocking: Boolean(flags & 8), + removedParts: [...limbParts, "torso"].filter((part, index) => + Boolean(flags & (1 << (index + 4)))), + hit: flags & 16384 ? .9 : 0, blockFlash: flags & 32768 ? 1 : 0, + score: Math.round(value(offset + 6)), + roundWins: Math.round(value(offset + 7)), attack: swing.kind, + attackTicks: swing.age }; + }); + const round = demo.rounds?.[roundIndex] || [startTick, 1, 0, 1]; + const nearEnd = tick >= endTick - 20; + const replayBall = { x: value(17), y: value(18), z: value(19), + radius: 42, active: Boolean(before[22]), spawnOwner: 0 }; + const camera = { x: value(23), y: value(24), + width: Math.max(100, value(25)) }; + // Newer demos carry the live pass's whole camera pose; without it the + // lens position is re-derived from width and close shots near-clip. + if (before.length > 26) { + camera.position = { x: value(26), y: value(27), z: value(28) }; + camera.perspective = value(29); + camera.fov = value(30); + camera.roll = value(31); + } + return { phase: "replay", map: demo.map || "station", tick, fighters, ball: replayBall, + balls: [replayBall], camera, + wind: { direction: round[1], mph: round[2] }, + round: { remainingMs: Math.max(0, Math.round((endTick - tick) * 1000 / + (demo.tickRate || 60))), result: nearEnd + ? demo.winner ? `${demo.winner} WINS ROUND` : "TIE" : "" } }; +} + +function applyRoundViewerState(state, now, dt = 1 / 60) { + if (!state?.fighters?.length || !state.camera || !state.round) return; + workshopHighlight = state.map?.highlights === true; + if (state.map?.id && state.map.id !== currentMapId) { + if (state.map.workshop && globalThis.__oskiewarValidateMap) { + try { installWorkshopMap(globalThis.__oskiewarValidateMap(state.map.workshop)); } + catch { return; } + } else if (workshopMap) { + installWorkshopMap(workshopBase, true); + workshopMap = null; + currentMapId = "halfpipe"; + currentMapName = "HALFPIPE"; + } + } + if (((state.course || state.map) === "skatepark") !== skateparkMap) { + configureWorldMap(state.course || state.map); resetSkateRopes(); + } + if (skateparkMap && Array.isArray(state.ropes) && state.ropes.length === skateRopes.length) + state.ropes.forEach((nodes, index) => { + if (!Array.isArray(nodes) || nodes.length !== chainLinks + 1 || + nodes.some((row) => !Array.isArray(row) || row.length !== 4 || + row.some((n) => !Number.isFinite(n) || Math.abs(n) > 100000))) return; + skateRopes[index].nodes = nodes.map(([x, y, px, py]) => ({ x, y, px, py })); + }); + for (let index = 0; index < players.length; index++) { + const source = state.fighters[index]; + const player = players[index]; + const previousX = player.x; + const previousY = player.y; + // Held to spot the edges the live wire reports as flags but never as the + // sparks and debris the host spawned locally. A demo carries its own + // impact track (replayViewerImpacts), so this reconstruction is LIVE-only. + const wasAlive = player.alive; + const wasHit = player.hit || 0; + const priorParts = player.removedParts?.slice() || []; + for (const key of ["name", "nation", "color", "x", "y", "z", "facing", "alive", + "grounded", "ducking", "blocking", "score", "roundWins", "removedParts", + "ropeIndex", "ropeLink", "skateRotation", "skateboard"]) + if (source[key] !== undefined) player[key] = source[key]; + player.vx = source.vx ?? (player.x - previousX) / Math.max(.001, dt); + player.vy = source.vy ?? (player.y - previousY) / Math.max(.001, dt); + player.vz = source.vz || 0; + // Grandstand coasting rides ONLY a velocity the host actually reported. + // The vx/vy above fall back to a frame-to-frame difference for the walk + // cycle's sake, but that difference is a teleport artifact on the first + // snap and after a wire gap — dead-reckoning it would fling the body. + player.wireVx = Number.isFinite(source.vx) ? source.vx : 0; + player.wireVy = Number.isFinite(source.vy) ? source.vy : 0; + player.attackKind = source.attack || ""; + // A demo knows which tick a swing began on, so the replayed pose can run + // its real arc instead of freezing at one canned mid-swing phase. + player.attackStartedAt = player.attackKind + ? now - (source.attackTicks != null + ? source.attackTicks * replayTickUs : 80000) : 0; + player.attackUntil = player.attackKind ? now + 120000 : 0; + player.hit = source.hit || 0; + player.blockFlash = source.blockFlash || 0; + // The host spawns sparks on a strike, a burst on a lost limb and a + // whoosh-lit puff on a kill; none of that rides the state wire, so the + // grandstand used to watch a body silently pop apart. Reconstruct the + // burst from the flag edges the wire DOES carry — a fresh hit, a new + // missing part, a death — so live watchers see the blow land. + if (roundViewerMode === "LIVE") { + // Reconstructing the strike spark is the fallback for a host too old to + // send its impact track. When the real track is on the frame it wins: + // it is the same spark, in the right place, and doubling them reads as + // a heavier hit than the one that landed. + if (!state.impacts && player.hit > .4 && wasHit <= .4) + impacts.push({ x: player.x, y: player.y - 90, z: player.z, + life: .32, duration: .32, death: false, explosion: true }); + const nowParts = player.removedParts || []; + // A fighter who came back whole is a new round, not a healed limb. + const lost = nowParts.length < priorParts.length ? [] + : nowParts.filter((part) => !priorParts.includes(part)); + if (nowParts.length < priorParts.length) clearRoundViewerEffects(); + if (!state.impacts && (lost.length || (wasAlive && !player.alive))) + impacts.push({ x: player.x, y: player.y - 60, z: player.z, + life: .55, duration: .55, death: true, explosion: false }); + // And the limb itself goes flying. The wire says which part is gone; it + // does not say where the pieces went, and the pieces are the part of a + // dismemberment anybody actually watches. They are spawned from the + // fighter's own pose here and then fall under local physics, so they + // land where the body stands rather than where a packet said it did. + if (lost.length && detachedParts.length < 48) { + // Posed from BEFORE the loss, on a copy: the wire's removedParts are + // already applied to the live fighter, and a body's geometry no + // longer carries the limbs it has lost — so asking the fighter as it + // stands now returns no segments to throw. + const pose = runnerWorldGeometry({ ...player, removedParts: priorParts }, + (now - startedAt) / 1000000); + const rival = players[player.pad === 0 ? 1 : 0]; + for (const part of lost) + spawnDetachedPart(player, part, pose, rival?.x ?? player.x, now); + } + } + } + const sources = state.balls || [state.ball]; + for (let index = 0; index < balls.length; index++) { + const source = sources[index]; + if (!source) { balls[index].active = false; continue; } + for (const key of ["x", "y", "z", "radius", "active", "spawnOwner", + "type", "mass", "heldBy"]) + if (source[key] !== undefined) balls[index][key] = source[key]; + } + // A frame that carries no projectile rows is an older host or a stored + // demo, and its shots are simply unknown — leaving the arrays alone is the + // honest answer. A frame that carries an empty row set is a host saying the + // air is clear, and that clears it. + if (state.shots) applyWireShots(state.shots); + if (state.lobs) applyWireLobs(state.lobs); + if (state.impacts) applyWireImpacts(state.impacts); + cameraCenter = state.camera.x; + cameraCenterY = state.camera.y; + cameraWidth = state.camera.width; + if (state.wind) { + windDirection = state.wind.direction; + windMph = state.wind.mph; + windAcceleration = windDirection * windMph * 16; + } + const hadResult = Boolean(roundResult); + roundResult = state.round.result || ""; + roundCause = state.round.cause || + (roundResult.includes("BALLED") ? "BALLED" : roundResult ? "ROUND" : ""); + // Whether the round on the wire has a clock is the HOST's fact, not a thing + // to re-derive locally: `roundIsTimed()` answers from the machine it runs + // on, and a watcher's machine is not in the fight. A demo carries no flag + // and was always a timed, recorded round. + roundViewerTimed = state.round.timed !== false; + // The round's own age, intro included, straight off the wire. Deriving it + // from `remainingMs` instead is what broke the versus lane: that field is + // zero on an untimed round, so the clock landed a full round duration in + // the past, `counting` was never true, and the intro card never drew. + const elapsedUs = Number.isFinite(state.round.elapsedMs) + ? state.round.elapsedMs * 1000 : null; + roundElapsedUs = roundViewerTimed + ? Math.max(0, roundDurationUs - state.round.remainingMs * 1000) + : elapsedUs === null ? 0 + : Math.max(0, elapsedUs - roundIntroDurationUs()); + matchOver = state.phase === "match"; + roundStartedAt = elapsedUs === null + ? now - roundIntroDurationUs() - roundElapsedUs : now - elapsedUs; + if (roundResult && !hadResult) roundOverAt = now; + const target = state.camera.target || { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: state.camera.position || + { x: cameraCenter, y: cameraCenterY, z: -cameraWidth * 1.35 }, + width: cameraWidth, perspective: state.camera.perspective || 0, + fov: state.camera.fov || 55, roll: state.camera.roll || 0 }, dt, 1000); +} + +// Shots and lobs arrive as the flat number rows spectatorState packs (owner +// and kind folded into one flag word). They are rebuilt rather than merged: +// a round has no identity on the wire, so matching this frame's third bullet +// to last frame's third bullet would be a guess, and a wrong guess teleports +// a streak across the arena. The arrays themselves keep their identity — the +// camera's swept-path packer and the render interpolator both hold references +// to them. +function applyWireShots(rows) { + bullets.length = 0; + for (const row of rows) { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + bullets.push({ x, y, z, previousX, previousY, vx, vy, + owner: owner === 1 ? 1 : 0, life: 1, safeUntil: 0, + spit: Boolean(flags & 1), heavy: Boolean(flags & 2), + rubber: Boolean(flags & 4), + // No bounce history came up the wire, so a watched round draws its + // streak and no ricochet tail. drawBulletTrail reads the count first + // and an empty one costs it nothing. + trail: [], trailCount: 0 }); + } +} + +// The host's impact track, which repeats each mark for as long as it burns. +// The id is what makes a repeat readable as a repeat: a watcher spawns only +// the numbers it has not seen, at the age the frame reports, and then runs +// them out on its own physics. +function applyWireImpacts(rows) { + if (!rows.length) return; + const newest = rows[rows.length - 1][0]; + // Numbers only climb within one host's run. A lower one is a different + // host, or the same one restarted, and nothing before it has been seen. + if (newest < roundViewerImpactId) roundViewerImpactId = 0; + for (const row of rows) { + const [id, x, y, z, durationMs, lifeMs, flags] = row; + if (id <= roundViewerImpactId) continue; + impacts.push({ x, y, z, duration: durationMs / 1000, + life: Math.max(.001, lifeMs / 1000), + death: Boolean(flags & 1), explosion: Boolean(flags & 2) }); + } + roundViewerImpactId = Math.max(roundViewerImpactId, newest); +} + +function applyWireLobs(rows) { + grenades.length = 0; + for (const row of rows) { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + // Only live grenades ride out, so anything here is alive by definition — + // which is also what puts it in the render list. + grenades.push({ x, y, z, vx, vy, owner: owner === 1 ? 1 : 0, alive: true, + rocket: Boolean(flags & 1), exploding: Boolean(flags & 2), + blastRadius, blastAge: 0, fuse: fuseMs / 1000, hitPlayers: 0 }); + } +} + +function handleRoundViewer(message) { + const now = runtime().monotonicUs; + matchName = message.roundName || matchName; + if (message.type === "round") { + roundViewerDemo = null; + roundViewerMode = ""; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + return; + } + if (message.type === "status") { + roundViewerStatus = String(message.content?.label || "waiting").toUpperCase(); + // A room that goes dark keeps no queue: whatever arrives next belongs to + // a new timeline, and a stale frame blended into it is a teleport. + if (message.content?.live === false) resetRoundViewerPlayout(); + return; + } + if (message.type === "demo") { + // A demo with bot seeds can be re-simulated — the honest path. The + // bridge hands over the recording and steps aside so the real sim runs; + // seedless demos (older, or human-driven) still puppet through the + // viewer below. + if (globalThis.__oskiewarResim && Array.isArray(message.content?.botSeeds)) { + roundViewerStop?.(); + roundViewer = null; + // The reset waits for the first stepped tick so it lands inside the + // sim clock the way a live round roll does — resetting here, on the + // bridge's wall clock, would skew the intro against the recording. + resimPending = message.content; + globalThis.__oskiewarReplayReady = true; + return; + } + roundViewerDemo = message.content; + roundViewerDemoStartedAt = now; + roundViewerMode = "DEMO"; + resetRoundViewerPlayout(); + globalThis.__oskiewarReplayReady = true; + return; + } + if (message.type === "net") { + if (netSession) netInbox.push(message.content); + else netHandlePreSession(message.content); + return; + } + if (netSession && message.type === "state") return; + if (message.type === "state") { + // The room says whether anybody is publishing, and it says so before it + // hands over any frame. A frame that arrives while nobody is is the last + // thing a host said before it left — kept by the relay and given to + // whoever opens the door next. Going LIVE on it paints that frozen round + // as a fight in progress, and since one frame can never bracket the + // playout clock, nothing in it is ever applied: the fighters keep + // whatever names this engine was already holding and the HUD tells the + // new arrival which of those two strangers they are. + if (!message.live) return; + if (roundViewerDemo && message.content?.phase === "match") return; + roundViewerMode = "LIVE"; + queueRoundViewerState(message.content); + } +} + +// A fresh timeline: a room change, a takeover, a host that went away. The +// queue, the playout clock and the measured health all start over, because +// every one of them is a statement about a wire that no longer exists. +// Sparks, debris and fallen limbs belong to one round on one wire. A new +// round, a new room or a host that went away takes them with it. +function clearRoundViewerEffects() { + impacts.length = 0; + detachedParts.length = 0; + roundViewerImpactId = 0; +} + +function resetRoundViewerPlayout() { + clearRoundViewerEffects(); + roundViewerFrames = []; + roundViewerPlayoutMs = 0; + roundViewerLiveAt = 0; + roundViewerGapMs = 33; + roundViewerJitterMs = 0; + roundViewerLossPct = 0; + roundViewerSeq = -1; + roundViewerSeqHeard = 0; + roundViewerSeqExpected = 0; +} + +// A frame lands here, in a socket callback, between one simulation tick and +// the next paint. Painting it from inside that callback is what smeared every +// correction across two frames: the render interpolator had already captured +// the pre-frame pose, so the next paint landed partway into the new state and +// the one after finished the jump. So the frame is only filed — stamped with +// its arrival and measured — and the tick decides when it is due. +function queueRoundViewerState(state) { + const at = Date.now(); + const gap = roundViewerLiveAt ? at - roundViewerLiveAt : 0; + roundViewerLiveAt = at; + if (gap > 0 && gap < 2000) { + roundViewerGapMs += (gap - roundViewerGapMs) * .12; + roundViewerJitterMs += + (Math.abs(gap - roundViewerGapMs) - roundViewerJitterMs) * .12; + } + // Loss read off the host's own sequence numbers, over a rolling window. + // This is where the relay's coalescing shows: a frame it dropped inside its + // 25 ms gate leaves a hole in the count that nothing else on this side can + // see. A takeover or a fresh room rewinds the sequence, which restarts the + // window rather than reading as a hundred lost frames. + const seq = Number(state?.seq); + if (Number.isFinite(seq)) { + if (roundViewerSeq >= 0 && seq > roundViewerSeq) { + roundViewerSeqExpected += seq - roundViewerSeq; + roundViewerSeqHeard += 1; + if (roundViewerSeqExpected >= 180) { + roundViewerLossPct = clamp(Math.round( + (1 - roundViewerSeqHeard / roundViewerSeqExpected) * 100), 0, 100); + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + } else { + roundViewerSeqExpected = 0; + roundViewerSeqHeard = 0; + } + roundViewerSeq = seq; + } + // One wire frame plus twice the jitter actually measured, held inside a + // window where a buffer is still worth more than it costs. The delay itself + // moves slowly: resizing it quickly would time-warp the picture. + const want = clamp(roundViewerGapMs + roundViewerJitterMs * 2 + 8, 45, 220); + roundViewerDelayMs += (want - roundViewerDelayMs) * .05; + roundViewerFrames.push({ state, at }); + // A ceiling, not a working depth: the playout holds about three frames. + // This only catches a tab whose simulation parked while the wire kept + // arriving, and the clock's own thousand-millisecond reset sorts out the + // rest when the tab comes back. + if (roundViewerFrames.length > 32) roundViewerFrames.shift(); +} + +// How far past the newest frame in hand the grandstand keeps coasting on wire +// velocity before it holds still. Inside the buffer nothing coasts at all — +// the pose is blended between two frames the host really sent. Past the +// buffer the velocity goes stale fast enough that coasting walks a fighter +// through a wall or floats them past a jump's apex, so a long gap freezes the +// pose instead of inventing motion. +const liveDeadReckonMaxMs = 150; + +function updateRoundViewer(now, dt) { + if (roundViewerDemo && roundViewerMode === "DEMO") { + const state = roundDemoState(roundViewerDemo, now); + if (state) { + applyRoundViewerState(state, now, dt); + replayViewerImpacts(state.tick, dt); + } + return; + } + if (roundViewerMode !== "LIVE" || !roundViewerFrames.length) return; + const wall = Date.now(); + const target = wall - roundViewerDelayMs; + // A first frame, or a wire that stopped and came back, sets the clock + // outright. Every other tick advances it by the simulation's own dt and + // leans a twentieth of the way toward where it belongs. Leaning rather than + // snapping is what keeps the picture's rate the sim's rate: a clock pinned + // to the wall every tick replays the network's jitter as motion. + if (!roundViewerPlayoutMs || Math.abs(target - roundViewerPlayoutMs) > 1000) + roundViewerPlayoutMs = target; + else roundViewerPlayoutMs += dt * 1000 + + (target - roundViewerPlayoutMs) * .05; + const play = roundViewerPlayoutMs; + // Hold exactly one frame behind the clock: it is the left end of the pair + // being blended, and the one to coast from if the buffer runs dry. + while (roundViewerFrames.length > 1 && roundViewerFrames[1].at <= play) + roundViewerFrames.shift(); + const before = roundViewerFrames[0].at <= play ? roundViewerFrames[0] : null; + const after = before ? roundViewerFrames[1] : roundViewerFrames[0]; + if (before && after) { + const span = Math.max(1, after.at - before.at); + const alpha = clamp((play - before.at) / span, 0, 1); + applyRoundViewerState(blendRoundViewerStates(before.state, after.state, + alpha, (play - before.at) / 1000), now, dt); + updateRoundViewerEffects(dt); + return; + } + // Starved, or not yet arrived at the first frame. The newest thing in hand + // is the truth; past it the bodies coast on the velocity that frame + // reported — measured from that frame's own position, so the reckoning is + // never compounded and the next arrival needs no correcting snap. + const edge = before || after; + applyRoundViewerState(edge.state, now, dt); + if (before) + coastRoundViewer(Math.min(play - before.at, liveDeadReckonMaxMs) / 1000); + updateRoundViewerEffects(dt); +} + +// The half of the fight a watcher is allowed to run for itself. Sparks, their +// debris and the limbs that came off are cosmetic: nothing here decides a hit +// or a score, so none of it has to agree with the host bit for bit — it only +// has to happen. Before this, `impacts` grew for the life of the connection +// and never drew a mote, because the function that grows an impact's debris +// ran only in a demo or a hosted sim. +function updateRoundViewerEffects(dt) { + updateResultImpactDebris(dt); + if (detachedParts.length) updateDetachedParts(dt, false); +} + +// Dead reckoning, and only past the end of the buffer. +function coastRoundViewer(seconds) { + if (seconds <= 0) return; + for (const player of players) { + if (!player.alive) continue; + // Coast the delta only — the host's reported position is truth and may + // sit anywhere it says (legacy rooms even ran off the cube). + player.x += (player.wireVx || 0) * seconds; + player.y += (player.wireVy || 0) * seconds; + } + for (const item of balls) { + if (!item.active) continue; + item.x += (item.vx || 0) * seconds; + item.y += (item.vy || 0) * seconds; + } + // Both ends of a shot move together: the streak's length is the round's + // speed, not the size of the gap we are papering over. + for (const shot of bullets) { + shot.x += (shot.vx || 0) * seconds; + shot.y += (shot.vy || 0) * seconds; + shot.previousX += (shot.vx || 0) * seconds; + shot.previousY += (shot.vy || 0) * seconds; + } + for (const lob of grenades) { + if (lob.exploding) continue; + lob.x += (lob.vx || 0) * seconds; + lob.y += (lob.vy || 0) * seconds; + } +} + +// The pose the grandstand actually paints: two frames the host really sent, +// blended. Continuous quantities interpolate; everything discrete — who is +// alive, which limbs are gone, what phase the round is in — comes from the +// frame already reached, because a fighter must not die before the pose that +// killed them has finished arriving. +const blendFighterKeys = ["x", "y", "z", "vx", "vy", "vz", "hit", + "blockFlash", "attackTicks"]; +const blendCameraKeys = ["x", "y", "width", "perspective", "fov", "roll"]; +const blendPointKeys = ["x", "y", "z"]; + +function blendNumbers(from, to, keys, t) { + const out = { ...from }; + if (!to) return out; + for (const key of keys) { + const a = Number(from?.[key]); + const b = Number(to[key]); + if (Number.isFinite(a) && Number.isFinite(b)) out[key] = a + (b - a) * t; + } + return out; +} + +function blendRoundViewerStates(from, to, t, seconds) { + const state = { ...from }; + state.fighters = (from.fighters || []).map((fighter, index) => + blendNumbers(fighter, to.fighters?.[index], blendFighterKeys, t)); + const blendBall = (ball, other) => + ball ? blendNumbers(ball, other, blendPointKeys, t) : ball; + if (from.balls) + state.balls = from.balls.map((ball, index) => + blendBall(ball, to.balls?.[index])); + if (from.ball) state.ball = blendBall(from.ball, to.ball); + if (from.camera) { + state.camera = blendNumbers(from.camera, to.camera, blendCameraKeys, t); + for (const part of ["position", "target"]) + if (from.camera[part]) state.camera[part] = + blendNumbers(from.camera[part], to.camera?.[part], blendPointKeys, t); + } + // Projectiles have no identity on the wire, so they are carried forward on + // their own reported velocity rather than matched against the next frame's + // rows — a wrong match teleports a streak across the arena. A shot flies + // straight, so this is not an approximation of the host's path, it IS it. + if (from.shots) state.shots = from.shots.map((row) => { + const [x, y, z, previousX, previousY, vx, vy, owner, flags] = row; + return [x + vx * seconds, y + vy * seconds, z, + previousX + vx * seconds, previousY + vy * seconds, vx, vy, owner, flags]; + }); + if (from.lobs) state.lobs = from.lobs.map((row, index) => { + const [x, y, z, vx, vy, owner, flags, blastRadius, fuseMs] = row; + const next = to.lobs?.[index]; + // A blast's ring grows over a fifth of a second, which is six wire + // frames — steppy enough to see. It blends when the next frame plainly + // holds the same blast; otherwise the radius stands. + const radius = next && next[6] === flags && next[5] === owner + ? blastRadius + (next[7] - blastRadius) * t : blastRadius; + const moving = flags & 2 ? 0 : seconds; + return [x + vx * moving, y + vy * moving, z, vx, vy, owner, flags, + radius, fuseMs]; + }); + return state; +} + +// The buttons a challenger's pad may carry up the wire — the fight's own +// vocabulary, no system keys. View and Menu stay local: a rival must never +// toggle the host's debug overlay or send their game back to the title. +const versusInputButtons = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"]; +// The buttons of the last frame the wire actually took, held apart from the +// whole frame so a press can be told from a stick twitch. +let versusInputLastDown = "[]"; + +// The challenger's half of the versus wire: sample the local pad, ship it on +// change, and heartbeat while idle so silence can mean absence. Sends pace +// themselves a hair above the relay's own floor — a press that lands inside +// the pause simply leaves on the next tick rather than being dropped. +function sendChallengerInput(now) { + if (roundViewer?.seat !== "challenger" || + typeof roundViewer.sendInput !== "function") return; + // Holding the chair is not the same as sitting in it. A visitor who has not + // come through the door sends nothing, so the host reads the seat as empty + // and the room stays open for somebody who has — and this visitor keeps + // watching the fight, which was never gated. + if (!versusAllowed()) return; + const pad = typeof gamepad === "function" ? gamepad(0) : null; + if (!pad) return; + const down = (pad.down || []) + .filter((button) => versusInputButtons.includes(button)).slice(0, 10); + const round2 = (value) => Math.round((Number(value) || 0) * 100) / 100; + const frame = { down, leftX: round2(pad.leftX), leftY: round2(pad.leftY) }; + const worn = JSON.stringify(frame); + // A button edge leaves at once. The 33 ms floor was written to pace a + // stick, which drifts continuously and would otherwise send every tick — + // but a press is a discrete event, and holding one back for up to two + // frames put a third of a display's lag into the one thing a player feels + // most. Only the analog half still waits. + const pressed = JSON.stringify(down); + const edge = pressed !== versusInputLastDown; + if (!edge) { + if (worn !== versusInputLastSent) { + if (now < versusInputMinNextAt) return; + } else if (now < versusInputNextAt) return; + } + versusInputMinNextAt = now + 33000; + // An unchanged frame is repeated once soon after a change, then settles + // into the idle heartbeat. The relay drops what arrives too fast and says + // nothing about it, so a lost edge used to be invisible for a quarter of a + // second; one cheap echo closes that window without adding a protocol. + versusInputNextAt = now + (edge ? 50000 : 250000); + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + if (roundViewer.sendInput({ seq: versusInputSeq++, ...frame, + name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors })) { + versusInputLastSent = worn; + versusInputLastDown = pressed; + } +} + +// --------------------------------------------------------------------------- +// Rollback netplay. Both seats run the whole fight; nobody streams it to the +// other. Each tick a seat schedules its own pad a couple of frames ahead, +// mails it, and simulates the current frame with the rival's last known pad +// standing in for the one that has not arrived. When the real pad lands and +// differs, the sim steps back to the snapshot before that frame and replays +// forward in silence. That is what Street Fighter 6 does; the price is a +// simulation that is a pure function of (frame, both pads), and a snapshot of +// every variable that simulation touches. The list lives in netSimScalars / +// netSimArrays below and the netplay test pins it: two seats fed the same +// pads must hash identical states, round after round. +const NET_TICK_US = replayTickUs; +// Frames a press waits before it is simulated. Two at 60 Hz is 33 ms — the +// same order as a display's own lag, and it means a rival packet arriving +// within ~33 ms costs no rollback at all. +const NET_INPUT_DELAY = 2; +// How far past the rival's newest pad we will guess before we stop and wait. +// Eight frames is 133 ms of one-way silence, well past the relay's p99. +const NET_MAX_ROLLBACK = 8; +// Pads per packet. Every packet re-sends this many recent frames so a lost +// packet costs nothing unless several vanish in a row. +const NET_REDUNDANCY = 10; +const NET_HASH_EVERY = 30; +// The floor of frame zero's clock. The host offers its own clock rounded up +// to a tick so its timeline runs straight into the fight; this floor keeps +// every "0 means unset" deadline in the sim unset whatever the host reports. +const NET_ORIGIN_US = 1000000; +// Wall-clock silence after which the rival is gone and the fight ends. +const NET_PEER_LOST_MS = 4000; +const NET_HELLO_INTERVAL_MS = 1000; +let netInbox = []; +let netPeerHello = null; +let netHelloSentAt = 0; +const netPadCache = new Map(); + +// A recorded mask back into the pad shape the sim reads (see resimPad). One +// object per mask value, frozen, so a frame costs no allocation. +function netPadFromMask(mask) { + mask = mask | 0; + let pad = netPadCache.get(mask); + if (pad) return pad; + const down = []; + if (mask & 1) down.push("ArrowLeft"); + if (mask & 2) down.push("ArrowRight"); + if (mask & 4) down.push("ArrowUp"); + if (mask & 8) down.push("ArrowDown"); + for (let index = 4; index < replayButtons.length; index++) + if (mask & (1 << index)) down.push(replayButtons[index]); + pad = Object.freeze({ connected: true, down: Object.freeze(down), + leftX: 0, leftY: 0, rightX: 0, rightY: 0 }); + netPadCache.set(mask, pad); + return pad; +} + +// Everything the simulation reads or writes that is not a constant, a render +// cache, or the wire. Scalars are captured and restored by name; the arrays +// are deep-copied. The netplay test pins that this list covers the round clock. +function netSimScalars() { + return { + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + }; +} +function netRestoreScalars(saved) { + ({ + gameMode, + netRoundMapIndex, + roundModifier, + netRoundClockDebtUs, + skateparkMap, + terrainPhase, + matchBallType, + ballEnabled, + startedAt, + roundStartedAt, + lastSimAt, + roundElapsedUs, + lastCountdownSecond, + lastIntroSecond, + resultPulseAt, + resultLaughAt, + resultLaughStep, + resultCardStung, + roundOverAt, + roundResult, + matchOver, + roundCause, + deathCinematic, + impactHitboxesUntil, + impactSequence, + fightOpponent, + survivalStartedAt, + survivalLavaY, + survivalHeight, + survivalBestHeight, + survivalPeakLevel, + trainingOpponent, + windMph, + windDirection, + windAcceleration, + windTargetMph, + windTargetDirection, + nextWindChangeAt, + matchName, + seriesName, + previousRoundName, + shellMode, + gameplayStarted, + titleTransitionAt, + nameSeed, + nextPowerupAtUs, + powerupSequence, + selecting, + selfPlay, + titleAttractMode, + hudLeftPad, + dummyGuideStartedAt, + } = saved); +} +const netSimArrays = () => ({ + players, balls, bullets, grenades, impacts, detachedParts, skateRopes, + // `saberPickups` belongs here for the same reason every other array does, + // and leaving it out was a real desync: a rollback that does not restore it + // re-simulates frames in which a blade was already taken, or takes one that + // the rewound timeline had not yet dropped. `swordHeld` itself rides on the + // player and was always restored -- which is what made this so quiet. The + // two seats agreed about every number they hashed while disagreeing about + // whether somebody was holding a sword, and a sword is a 1.5x reach + // multiplier in `meleeSpecFor`, so they went on agreeing right up until a + // strike landed one frame apart on one screen and not the other. + gunPickups, saberPickups, grenadePickups, bodyTrees, gridField, + resultReactionPrevious, fightHitMarks, +}); + +function netSnapshot() { + const arrays = {}; + for (const [name, live] of Object.entries(netSimArrays())) + arrays[name] = structuredClone(live); + return { scalars: netSimScalars(), arrays }; +} + +// Restore in place: the live arrays are `const` and referenced everywhere, so +// their identity stays and their contents are replaced. Keys the live object +// grew since the snapshot are removed too — a key the sim added later must not +// survive a rewind. +function netRestore(snapshot) { + if (!snapshot.scalars.skateparkMap && snapshot.scalars.netRoundMapIndex >= 0 && + netRoundMapIndex !== snapshot.scalars.netRoundMapIndex) + installRoundMap(snapshot.scalars.netRoundMapIndex); + configureWorldMap(snapshot.scalars.skateparkMap ? "skatepark" : "station"); + netRestoreScalars(structuredClone(snapshot.scalars)); + const live = netSimArrays(); + for (const [name, saved] of Object.entries(snapshot.arrays)) { + const target = live[name]; + const copy = structuredClone(saved); + if (ArrayBuffer.isView(target)) { target.set(copy); continue; } + if (target.length === copy.length && copy.every((entry) => + entry && typeof entry === "object" && !Array.isArray(entry))) { + for (let index = 0; index < target.length; index++) { + const item = target[index]; + if (!item || typeof item !== "object") { target[index] = copy[index]; continue; } + for (const key of Object.keys(item)) + if (!(key in copy[index])) delete item[key]; + Object.assign(item, copy[index]); + } + } else { + target.length = 0; + target.push(...copy); + } + } +} + +// FNV-1a over the state that decides a fight. Exact doubles, not rounded: a +// last-bit difference is a real desync and must read as one. +// Debug only: the exact JSON the last hash was taken over, and a ring of it +// per frame while `__oskiewarHashTrace` is set. A desync report names a +// frame and two numbers; this is what turns those numbers back into fields. +let netLastHashText = ""; +const netHashTexts = new Map(); +function netStateHash() { + const view = players.map((player) => [player.x, player.y, player.z, + player.vx, player.vy, player.vz, player.facing, player.alive, + player.grounded, player.ducking, player.blocking, player.score, + player.roundWins, player.attackKind, player.attackUntil, + player.hitStunUntil, player.stance, player.gunAmmo, player.grenadeAmmo, + player.heldBall, player.removedParts, player.dashUntil, + // Holding a blade decides how far a hand reaches, so it decides the + // fight and belongs in the hash. It is here because it was NOT here: two + // seats disagreeing about a sword hashed identically for hundreds of + // frames and were found apart only once the reach changed an outcome, + // which is the most expensive way to learn about a desync. + player.skateboard, player.skateVx, player.skateWallSide, + player.skatePitch || 0, player.skateContacts || 0, player.swordHeld, player.ropeIndex, player.ropeLink, player.ropeGrabLocked, player.skateLoop, + player.loopAngle, player.loopSpeed, player.loopCooldownUntil, player.skateRotation, player.boostUntil, + player.headBounceCharge || 0, player.headPumpDirection || 0, player.headPumpAt || 0, + player.headRoll || 0, player.headRollRate || 0, + player.knockVx, player.windVx, player.dashVx, player.inputX, player.inputY, + player.previous, player.suppressedDirections, player.lastTap, player.lastRelease]); + view.push(skateparkMap, netRoundMapIndex, roundModifier, netRoundClockDebtUs, skateRopes); + view.push(balls.map((item) => [item.active, item.x, item.y, item.z, + item.vx, item.vy, item.heldBy])); + // Projectiles by position, not just by count. A round whose flight differs + // between the two machines kills different fighters, and hashing only the + // length let that drift silently: the count matched right up to the frame + // one seat's bullet connected and the other's missed. + view.push(bullets.map((shot) => [shot.x, shot.y, shot.z, shot.vx, shot.vy, + shot.owner, shot.life])); + view.push(grenades.map((lob) => [lob.x, lob.y, lob.z, lob.vx, lob.vy, + lob.owner, lob.fuse, lob.alive, lob.exploding, lob.blastRadius, + lob.hitPlayers])); + view.push([...gunPickups, ...saberPickups, ...grenadePickups].map(p => + [p.kind || "GRENADE", p.active, p.x, p.y, p.dropVy || 0, + p.dropping || false, p.dropLandingY ?? null, p.respawnAt || 0])); + view.push(roundResult, roundElapsedUs, + matchOver, roundStartedAt, roundOverAt); + const text = JSON.stringify(view); + if (globalThis.__oskiewarHashTrace) netLastHashText = text; + let hash = 0x811c9dc5; + for (let index = 0; index < text.length; index++) { + hash ^= text.charCodeAt(index); + hash = Math.imul(hash, 0x01000193) >>> 0; + } + return hash; +} + +// The local seat's handle and wardrobe, in the shape the pad frames already +// carry, so the host can dress both fighters the same way on both screens. +function netLocalIdentity() { + const identity = acFeed?.player; + const colors = (Array.isArray(identity?.colors) ? identity.colors : []) + .map((entry) => Array.isArray(entry) + ? entry.slice(0, 3) : [entry.r, entry.g, entry.b]) + .filter((entry) => entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .slice(0, 4); + return { name: identity?.handle ? String(identity.handle).toUpperCase() : "", + colors }; +} + +function netCleanName(value, fallback) { + const offered = String(value || "").toUpperCase() + .replace(/[^@A-Z0-9_-]/g, "").slice(0, 24); + return /^@?[A-Z0-9_-]{1,24}$/.test(offered) ? offered : fallback; +} + +function netCleanColors(value) { + return (Array.isArray(value) ? value : []) + .filter((entry) => Array.isArray(entry) && entry.length === 3 && + entry.every((channel) => Number.isInteger(channel) && + channel >= 0 && channel <= 255)) + .map((entry) => entry.slice(0, 3)).slice(0, 4); +} + +function netAverageColor(colors, fallback) { + if (!colors.length) return fallback.slice(); + return colors.reduce((sum, entry) => sum.map((value, index) => + value + entry[index] / colors.length), [0, 0, 0]).map(Math.round); +} + +// The deal the host writes and both seats apply: who sits where, wearing +// what, and the clock and ball they share. Everything the first frame's +// state derives from that is not already a constant of the build. +function netMakeDeal() { + const local = players[0]; + const rival = netPeerHello || {}; + const rivalColors = netCleanColors(rival.colors); + const hostNow = Math.max(NET_ORIGIN_US, runtime().monotonicUs); + const origin = Math.ceil((hostNow + NET_TICK_US) / NET_TICK_US) * NET_TICK_US; + return { t: "start", v: 2, origin, delay: NET_INPUT_DELAY, + ballType: matchBallType, map: skateparkMap ? "skatepark" : "station", + fighters: [ + { name: netCleanName(local.name, ""), rosterIndex: local.rosterIndex, + color: local.color.slice(0, 3), + handleColors: netCleanColors(local.handleColors) }, + { name: netCleanName(rival.name, ""), rosterIndex: -1, + color: netAverageColor(rivalColors, [38, 82, 176]), + handleColors: rivalColors }, + ] }; +} + +function netApplyIdentities(deal) { + deal.fighters.forEach((entry, index) => { + const player = players[index]; + player.name = entry.name; + player.rosterIndex = entry.rosterIndex; + player.color = entry.color.slice(); + player.handleColors = entry.handleColors.map((c) => c.slice()); + }); + versusRivalName = deal.fighters[1].name; +} + +// Frame zero. Both seats run this with the same deal under the same clock, +// and the state that comes out is the state the fight starts from — the +// hash exchange on the first frame says whether it really is. +function netBegin(deal, seat, send) { + netEnd("restart"); + const session = { seat, deal, frame: 0, originUs: deal.origin, + delay: deal.delay, send, + local: new Map(), remote: new Map(), used: new Map(), snapshots: new Map(), + remoteFrame: -1, remoteSimFrame: 0, remoteLead: null, lastRemoteMask: 0, ackFrame: -1, + confirmed: -1, hashes: new Map(), peerHashes: new Map(), + lastPacketAt: Date.now(), startedAt: Date.now(), ticks: 0, + // peerStamp is the newest wall-clock mark heard from the rival, echoed + // back on our next packet so they can read their own round trip; pingMs is + // ours, read from the echoes coming the other way. + peerStamp: 0, + stats: { rollbacks: 0, rolledFrames: 0, maxRollback: 0, stalls: 0, + waits: 0, sent: 0, received: 0, desyncs: 0, snapshotMs: 0, resimMs: 0, + // `pings` counts measurements, not milliseconds: a round trip under half + // a millisecond rounds to zero, and a meter that reads "no measurement + // yet" on a LAN would be wrong at exactly the moment it is best. + pings: 0, pingMs: 0 } }; + for (let frame = 0; frame < deal.delay; frame++) session.local.set(frame, 0); + netSession = session; + // The relay's clock is the fight's clock: a host who was reading tells at + // quarter speed is back at full the moment the rival is real. + if (gameSpeed !== 1) { + gameSpeed = 1; + gameSpeedChangedAt = 0; + emitSignal("game-speed", -1, 1, 0); + } + netRoundClockDebtUs = 0; + netClockUs = deal.origin; + netFrameInputs = [0, 0]; // Never inherit either machine's local Menu/held pad. + try { + configureWorldMap(deal.map); + netRoundMapIndex = -1; + matchBallType = deal.ballType; + // The limb poses that collide are phased off this epoch, so both seats + // must share it; and a rollback fight is never a recorded one. + startedAt = deal.origin; + lastSimAt = deal.origin; + replay = null; + startVersusFight(deal.origin, true); + netApplyIdentities(deal); + } finally { + netFrameInputs = null; + netClockUs = null; + } + telemetry("NET_BEGIN", "seat " + seat + " delay " + deal.delay); +} + +// Leaving on purpose tells the rival at once instead of costing them the +// silence timeout; whatever the leaving seat's game did next stands. +function netLeave(reason) { + if (!netSession) return; + try { netSession.send({ t: "bye", o: netSession.originUs, r: reason }); } + catch (_) {} + netEnd(reason); +} + +function netEnd(reason) { + if (!netSession) return; + // A rival who has gone will never confirm anything, and the round they lost + // still happened — the frames past the frontier cannot change with nobody + // left to press anything. + flushPendingRoundReplay(runtime().monotonicUs); + const stats = netSession.stats; + // A seat in a rollback fight sends net packets, not pads, so the moment + // this lane closes the host has heard nothing on the pad wire for as long + // as the fight lasted. Read literally that is an empty chair, and an empty + // chair resets the match — which would turn a repaired desync into a lost + // score. The grace covers the changeover; a rival who has genuinely gone + // still times out, just three seconds later. + if (reason === "desync" || reason === "desync-peer" || reason === "workshop") + versusSeatGraceUntil = Date.now() + 3000; + // The stream this seat is about to start watching again is a new timeline. + if (roundViewer) resetRoundViewerPlayout(); + // Time never runs backwards: the local clock picks up where the fight's + // clock stood, so every deadline the fight left behind is still meaningful. + scaledClockUs = Math.max(scaledClockUs, + netSession.originUs + netSession.frame * NET_TICK_US - netRoundClockDebtUs); + telemetry("NET_END", reason + " frames " + netSession.frame + + " rollbacks " + stats.rollbacks + " rolled " + stats.rolledFrames + + " max " + stats.maxRollback + " stalls " + stats.stalls + + " waits " + stats.waits + " desyncs " + stats.desyncs); + netSession = null; + netInbox.length = 0; + netPeerHello = null; + globalThis.__oskiewarNetStats = null; +} + +// The rival's pad for a frame: the real one if it came, otherwise the newest +// one we have — a hand mostly keeps doing what it was doing. +function netRemoteInputFor(session, frame) { + const known = session.remote.get(frame); + if (known !== undefined) return known; + for (let back = frame - 1; back >= 0 && back >= frame - NET_MAX_ROLLBACK * 2; back--) { + const older = session.remote.get(back); + if (older !== undefined) return older; + } + return session.lastRemoteMask; +} + +function netInputsFor(session, frame) { + const local = session.local.get(frame) ?? 0; + const remote = netRemoteInputFor(session, frame); + return session.seat === 0 ? [local, remote] : [remote, local]; +} + +function netSimulateFrame(session, frame, silent) { + const started = performance.now(); + session.snapshots.set(frame, netSnapshot()); + session.stats.snapshotMs += performance.now() - started; + const inputs = netInputsFor(session, frame); + session.used.set(frame, inputs); + netFrameInputs = inputs; + netRoundClockDebtUs += NET_TICK_US * (1 - roundSpeed()); + netClockUs = session.originUs + (frame + 1) * NET_TICK_US; + netSilent = silent; + try { + gameSim(); + } finally { + netClockUs = null; + netSilent = false; + netFrameInputs = null; + } +} + +// A rollback un-happens frames, and the frames it un-happens were written +// down. Every row in a demo's logs is stamped with the tick it belongs to, so +// taking the record back to a frame is a truncation — and the silent +// re-simulation that follows re-files the corrected rows itself, which is why +// the recorders are NOT muted while it runs. The two cursors that decide when +// the next row is due are rebuilt from what survives, so they rewind too +// without having to ride in the snapshot. +// +// Without this a versus demo was written from mispredicted frames: it recorded +// the rival pad this seat had GUESSED, so the stored fight replayed into a +// different one. That is what "a rollback fight is never a recorded one" meant. +function replayRewind(session, toFrame) { + if (!replay) return; + const tick = demoTick(session.originUs + (toFrame + 1) * NET_TICK_US); + const keep = (rows) => { + if (!Array.isArray(rows)) return rows; + let length = rows.length; + while (length > 0 && rows[length - 1][0] >= tick) length--; + rows.length = length; + return rows; + }; + keep(replay.commands); + keep(replay.checkpoints); + keep(replay.events); + keep(replay.impacts); + keep(replay.rounds); + keep(replayRoundMarks); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + // The dedupe cursor is whatever each pad was last recorded as saying; a + // command that was truncated must be writable again. + replayLastCommand = [-1, -1]; + for (const row of replay.commands) replayLastCommand[row[1]] = row[2]; + replayNextCheckpointAt = replay.checkpoints.length + ? session.originUs + (toFrame + 1) * NET_TICK_US : 0; + // A round whose end was taken back is not a round to file. + if (replayPendingSaveFrame >= toFrame) replayPendingSaveFrame = -1; +} + +// The earliest frame we simulated with a guessed rival pad that has since +// been contradicted. Frames past `confirmed` are the only candidates. +function netEarliestMisprediction(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + for (let frame = session.confirmed + 1; frame < session.frame; frame++) { + const real = session.remote.get(frame); + if (real === undefined) return null; + const used = session.used.get(frame); + if (used && used[remoteSeat] !== real) return frame; + session.confirmed = frame; + } + return null; +} + +function netRollback(session, toFrame) { + const started = performance.now(); + const depth = session.frame - toFrame; + netRestore(session.snapshots.get(toFrame)); + replayRewind(session, toFrame); + for (let frame = toFrame; frame < session.frame; frame++) + netSimulateFrame(session, frame, true); + session.stats.rollbacks++; + session.stats.rolledFrames += depth; + session.stats.maxRollback = Math.max(session.stats.maxRollback, depth); + session.stats.resimMs += performance.now() - started; +} + +function netPrune(session) { + const floor = Math.min(session.confirmed, session.frame - NET_MAX_ROLLBACK - 2); + for (const frame of session.snapshots.keys()) + if (frame < floor) session.snapshots.delete(frame); + for (const frame of session.used.keys()) + if (frame < floor) session.used.delete(frame); + const inputFloor = floor - NET_REDUNDANCY * 2; + for (const frame of session.local.keys()) + if (frame < inputFloor) session.local.delete(frame); + for (const frame of session.remote.keys()) + if (frame < inputFloor) session.remote.delete(frame); + for (const frame of session.hashes.keys()) + if (frame < inputFloor) session.hashes.delete(frame); + for (const frame of session.peerHashes.keys()) + if (frame < inputFloor) session.peerHashes.delete(frame); +} + +function netDrainInbox(session) { + const remoteSeat = session.seat === 0 ? 1 : 0; + // Taken as a batch: a hash mismatch inside this loop ends the session and + // empties the inbox underneath it. + const batch = netInbox.splice(0, netInbox.length); + for (const packet of batch) { + if (!packet || typeof packet !== "object") continue; + // A hello inside a session is never the rival still talking: the + // challenger stops saying hello the moment it has one. It is somebody with + // no session — the same person having reloaded, or a new arrival in the + // chair — and it has to be read that way BEFORE the clock below is + // touched. Stamping it as a live packet was the deadlock: a tab that is + // killed sends no `bye`, so this seat waited on four seconds of silence + // that the rejoiner's own 1 Hz hello refreshed forever. This seat went on + // simulating against a rival who only ever said hello, and the rejoiner + // never got a deal back. Neither could leave. Treating it as a departure + // frees both: the lobby is one tick away, and the next hello a second + // later deals a fresh session with the fresh identity. + if (packet.t === "hello") { + // Except a straggler still in flight from before the deal was made, + // which would kill a session one frame old. + if (Date.now() - session.startedAt > NET_HELLO_INTERVAL_MS * 2) + session.peerLeft = true; + continue; + } + // A straggler from the fight before. The shell's inbox is not emptied when + // a session ends and packets stay in flight across the changeover, so + // without this the old rival's last presses were written into the new + // fight at frames it had not reached — on the seat that received them and + // nowhere else. Measured: two seats agreed through frame 330 of a rejoined + // fight and were found apart at the next checkpoint. An older build sends + // no tag and is taken at its word, as it always was. + if (packet.o !== undefined && packet.o !== session.originUs) continue; + session.lastPacketAt = Date.now(); + session.stats.received++; + if (packet.t === "workshop" && session.seat === 1) { session.peerWorkshop = true; continue; } + if (packet.t === "bye") { session.peerLeft = true; continue; } + // The rival noticed the divergence first. Same repair from this side, and + // no answering packet: a desync that echoed would ping-pong. + if (packet.t === "desync") { session.peerDesync = true; continue; } + if (packet.t === "i" && Array.isArray(packet.m) && + Number.isInteger(packet.f)) { + // m[k] is the pad for frame f + k; the newest is the last. + for (let index = 0; index < packet.m.length && index < NET_REDUNDANCY * 2; index++) { + const frame = packet.f + index; + const mask = packet.m[index] | 0; + if (frame < 0 || session.remote.has(frame)) continue; + session.remote.set(frame, mask); + if (frame > session.remoteFrame) { + session.remoteFrame = frame; + session.lastRemoteMask = mask; + } + } + if (Number.isInteger(packet.a)) session.ackFrame = Math.max(session.ackFrame, packet.a); + if (Number.isInteger(packet.s) && packet.s >= session.remoteSimFrame) { + session.remoteSimFrame = packet.s; + if (Number.isInteger(packet.l)) session.remoteLead = packet.l; + } + // Ping, by echo. `w` is the rival's own mark, which we hold and send + // back; `e` is one of ours coming home, so the round trip is a + // subtraction in OUR clock and the two machines need no shared time. + // It reads up to one frame long, because the rival holds our mark until + // their next tick — an honest part of what a press actually costs. + if (Number.isInteger(packet.w)) session.peerStamp = packet.w; + if (Number.isInteger(packet.e) && packet.e > 0) { + const trip = Date.now() - packet.e; + if (trip >= 0 && trip < 4000) { + session.stats.pingMs = session.stats.pings + ? session.stats.pingMs + (trip - session.stats.pingMs) * .15 : trip; + session.stats.pings++; + } + } + if (Array.isArray(packet.h) && packet.h.length === 2) + netNotePeerHash(session, packet.h[0], packet.h[1], remoteSeat); + if (netSession !== session) return; + } + } +} + +function netNotePeerHash(session, frame, hash) { + if (!Number.isInteger(frame)) return; + const mine = session.hashes.get(frame); + if (mine === undefined) { session.peerHashes.set(frame, hash); return; } + if (mine !== hash) { + session.stats.desyncs++; + telemetry("NET_DESYNC", "frame " + frame + " mine " + mine + " theirs " + hash); + netDesyncRepair(session, frame); + } +} + +// A desync used to be counted and then lived with: two machines that are no +// longer playing the same fight went on playing their different ones, and the +// two people found out when one of them died on a screen where they had not +// been hit. +// +// The repair is to stop pretending there are two authorities. The host has +// one, so both seats fall back to the lane where the host IS the authority: +// the challenger goes back to watching the host's stream with its pads going +// up the wire, and the host resumes the streamed versus fight it was already +// publishing for the grandstand. The fight does not stop, it does not rewind, +// and nobody has to re-adopt a state that will not fit through a 2 KiB +// channel. What it costs is the rollback lane's latency, which is the honest +// price of one machine having been wrong. +// +// Both seats have to agree, or the host sits waiting for packets that are not +// coming — so the seat that notices says so, and both then refuse to open a +// rollback session again for a while. Without that cooldown the challenger's +// next hello would deal a fresh session into the same divergence, one second +// later, forever. +const NET_DESYNC_COOLDOWN_MS = 60000; +let netLaneBlockedUntil = 0; + +function netDesyncRepair(session, frame) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + try { session.send({ t: "desync", o: session.originUs, f: frame }); } + catch (_) {} + netEnd("desync"); +} + +// Our state hash at the newest frame both pads are known for — a frame that +// will never be rolled back again, so both seats hash the same thing if +// they are the same game. +function netExchangeHash(session) { + const frame = session.confirmed; + if (frame < 0 || frame % NET_HASH_EVERY !== 0 || session.hashes.has(frame)) return; + const snapshotAfter = session.snapshots.get(frame + 1); + if (!snapshotAfter) return; + // Hash the snapshot taken before frame+1, i.e. the state after `frame`, + // without disturbing the live state: restore is destructive, so hash the + // live state only when it IS that frame. + let hash; + if (session.frame === frame + 1) hash = netStateHash(); + else { + const live = netSnapshot(); + netRestore(snapshotAfter); + hash = netStateHash(); + netRestore(live); + } + session.hashes.set(frame, hash); + if (globalThis.__oskiewarHashTrace) { + netHashTexts.set(frame, netLastHashText); + if (netHashTexts.size > 600) + netHashTexts.delete(netHashTexts.keys().next().value); + } + const theirs = session.peerHashes.get(frame); + if (theirs !== undefined) netNotePeerHash(session, frame, theirs); + session.pendingHash = [frame, hash]; +} + +function netSendInputs(session) { + // Every local pad we have decided on, including the one just scheduled for + // frame + delay. Sending one short of it starves the rival: they stall for + // the frame we are holding, we stall for the frame they are holding, and + // both fights crawl (measured in the browser harness: two thirds of ticks + // spent waiting) even on a wire with no latency at all. + const newest = session.frame + session.delay; + const first = Math.max(0, newest - NET_REDUNDANCY + 1); + const masks = []; + for (let frame = first; frame <= newest; frame++) + masks.push(session.local.get(frame) ?? 0); + // `o` is the deal's own origin, which is to say: which fight this is. Frame + // numbers restart at zero every session, so an input packet from the fight + // before is indistinguishable from a current one by its contents alone — and + // it lands on frames the new fight has not reached yet, on one seat only. + const packet = { t: "i", o: session.originUs, f: first, m: masks, + a: session.remoteFrame, s: session.frame, + l: session.frame - session.remoteSimFrame, w: Date.now() }; + if (session.peerStamp) packet.e = session.peerStamp; + if (session.pendingHash) { packet.h = session.pendingHash; session.pendingHash = null; } + if (session.send(packet)) session.stats.sent++; +} + +// One driver tick of a rollback fight. Ingest the rival, repair the past if +// it was guessed wrong, schedule and mail our own pad, then either step one +// frame or hold — hold when we have guessed as far as we dare past the +// rival's last real pad, or when we are simply running ahead of them. +function netTick() { + const session = netSession; + netDrainInbox(session); + if (!netSession) return; + // The rival told us the two fights came apart. Drop to the streamed lane, + // where there is only one authority, and stay out of the rollback lane long + // enough that the next hello is not just the same divergence again. + if (session.peerWorkshop) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("workshop"); + return; + } + if (session.peerDesync) { + netLaneBlockedUntil = Date.now() + NET_DESYNC_COOLDOWN_MS; + netEnd("desync-peer"); + return; + } + if (session.peerLeft || Date.now() - session.lastPacketAt > NET_PEER_LOST_MS) { + const seat = session.seat; + netEnd(session.peerLeft ? "rival-left" : "peer-lost"); + globalThis.__oskiewarRemotePad = null; + // The host is left alone in its room; the challenger's bridge is still + // up and goes back to watching whatever the room shows next. + if (seat === 0 && versusActive()) beginVersusLobby(runtime().monotonicUs); + return; + } + const earliest = netEarliestMisprediction(session); + if (earliest !== null) netRollback(session, earliest); + // A round whose end is now behind the confirmed frontier is a round that + // happened. Past this line no rival pad can reach back and unmake it. + if (replayPendingSaveFrame >= 0 && session.confirmed >= replayPendingSaveFrame) + flushPendingRoundReplay(runtime().monotonicUs); + const scheduled = session.frame + session.delay; + if (!session.local.has(scheduled)) { + const pad = typeof gamepad === "function" ? gamepad(0) : null; + session.local.set(scheduled, pad ? inputCommand(pad) : 0); + } + netSendInputs(session); + session.ticks++; + if (session.frame > session.remoteFrame + NET_MAX_ROLLBACK) { + session.stats.waits++; + return; + } + // Frame advantage: if we are more than a delay's worth ahead of where the + // rival says they are, give back one tick in four until we are level. Paced + // by ticks, not frames — a frame that stalls does not advance, and a stall + // keyed on the frame number would hold that frame forever. + // Each observation includes travel time. Equal-speed peers across a WAN + // both appear ahead of the other's old frame; throttling that raw lead + // slowed BOTH games by 25%. Exchange the peer's observation and cancel + // their shared transit lag. The remaining half-difference measures the + // actual clock advantage. Older peers retain the conservative old rule. + const observedLead = session.frame - session.remoteSimFrame; + const ahead = session.remoteLead === null ? observedLead + : (observedLead - session.remoteLead) / 2; + if (ahead > session.delay + 1 && session.ticks % 4 === 0) { + session.stats.stalls++; + return; + } + netSimulateFrame(session, session.frame, false); + session.frame++; + netPrune(session); + netExchangeHash(session); + // The hash exchange can find the mismatch that ends this session. + if (netSession !== session) return; + // A window into the lane for the debug overlay, the agent tools and the + // browser harness: what the fight is costing and whether it is one game. + globalThis.__oskiewarNetStats = { seat: session.seat, frame: session.frame, + // Who this fight believes is in it. A desync hash cannot see an identity + // fault — two machines can agree perfectly about a fight between two + // people who are not there — so the deal's names ride the same window the + // harness and the debug overlay already read. + names: session.deal.fighters.map((entry) => entry.name), + confirmed: session.confirmed, remoteFrame: session.remoteFrame, + hash: session.hashes.get(session.confirmed) ?? 0, + hashFrame: session.confirmed, ...session.stats, + behind: Math.max(0, session.frame - 1 - session.remoteFrame) }; +} + +// The challenger announces itself on the net channel until the host answers +// with a deal; a host that never answers is an older build, and the fight +// falls back to the streamed lane it always had. +function netChallengerHello(now) { + if (workshopMap) return; + if (netSession || roundViewer?.seat !== "challenger" || + typeof roundViewer.sendNet !== "function" || !versusAllowed()) return; + // Not before the shell has finished asking who is here. Identity rides this + // packet once and is then frozen into the deal for the whole fight, and a + // rejoin IS a fresh page load — so the 1 Hz hello below routinely beat the + // session check and dealt a signed-in player in under no name at all. Worse, + // resetRound re-applies the deal every round, so the wrong name was restamped + // even after the real one arrived. A shell with no account system is an older + // build, not a visitor still being asked, and is never held here. + if (webAccountState() && !accountReady()) return; + const at = Date.now(); + if (at < netLaneBlockedUntil) return; + if (at - netHelloSentAt < NET_HELLO_INTERVAL_MS) return; + netHelloSentAt = at; + roundViewer.sendNet({ t: "hello", v: 2, ...netLocalIdentity() }); +} + +// Packets that arrive before a session exists: the challenger's hello lands +// on the host, the host's deal lands on the challenger. Anything else waits +// in the inbox for the session to drain. +function netHandlePreSession(packet) { + if (!packet || typeof packet !== "object") return; + // A packet from the lane we have just fallen out of. Both ends are watching + // the same cooldown, so this is a straggler in flight, not an offer. + if (Date.now() < netLaneBlockedUntil) return; + if (packet.t === "hello" && packet.v !== 2) return; + if (packet.t === "hello" && !roundViewer) { + netPeerHello = { name: packet.name, colors: packet.colors, at: Date.now() }; + return; + } + if (packet.t === "start" && roundViewer?.seat === "challenger" && + packet.v === 2 && Number.isInteger(packet.origin) && + Number.isInteger(packet.delay) && Array.isArray(packet.fighters) && + packet.fighters.length === 2) { + const bridge = roundViewer; + netBegin(packet, 1, (content) => bridge.sendNet(content)); + return; + } + netInbox.push(packet); +} + +// The host's side of the opening: a fresh challenger who said hello gets a +// deal instead of the streamed fight. +function netHostBegin(now) { + if (workshopMap) return false; + // Same door, other side: a deal struck before this seat knows its own handle + // names the host for the rest of the fight, on both screens. + if (webAccountState() && !accountReady()) return false; + const deal = netMakeDeal(); + const room = "ow-" + versusRoomName; + const send = (content) => typeof globalThis.__oskiewarNetSend === "function" + ? globalThis.__oskiewarNetSend(room, content) : false; + if (!send(deal)) return false; + netBegin(deal, 0, send); + return true; +} + +function netDrainHostInbox() { + const inbox = globalThis.__oskiewarNetInbox; + if (!Array.isArray(inbox) || !inbox.length) return; + for (const packet of inbox) { + if (netSession) netInbox.push(packet); + else netHandlePreSession(packet); + } + inbox.length = 0; +} + +// A visitor who arrived through a shared address and found nobody hosting +// takes the room over — the link a friend sent must keep working after the +// sender's tab closed. The chair-holder claims first; a seat-denied watcher +// waits three times as long, so two arrivals at a dead address stagger +// instead of racing, and updateVersusConflict catches the tie anyway. +function updateVersusClaim(now) { + if (globalThis.__oskiewarVersusCapable !== true || !roundViewer) return false; + // Claiming a dead address means hosting, and hosting is playing. Whoever + // arrives next deserves a room with a named fighter standing in it. + if (!versusAllowed()) return false; + // A room with a live host is a fight to join; a room with a stored demo is + // a replay page and keeps being one — versus rooms never record, so only a + // truly empty address falls through to the claim. + if (roundViewer.live || roundViewerDemo || roundViewerMode === "DEMO") { + versusClaimArmedAt = 0; + return false; + } + if (!versusClaimArmedAt) { + versusClaimArmedAt = now; + return false; + } + const wait = roundViewer.seat === "challenger" + ? versusClaimAfterUs : versusClaimAfterUs * 3; + if (now - versusClaimArmedAt < wait) return false; + const name = roundViewer.name; + versusFallbackBridge = roundViewer; + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + roundViewerMode = ""; + roundViewerDemo = null; + roundViewerStatus = "CONNECTING"; + resetRoundViewerPlayout(); + versusClaimArmedAt = 0; + versusRoomName = name; + globalThis.__oskiewarRemotePad = null; + beginVersusLobby(now); + telemetry("VERSUS_CLAIM", name); + return true; +} + +// A demo carries the impacts the live pass spawned. Replaying them puts the +// sparks and debris back into a repaint that otherwise only moves bodies. +// The demo loops, so a tick that runs backwards restarts the sweep clean. +function replayViewerImpacts(tick, dt) { + const rows = roundViewerDemo?.impacts || []; + if (tick < roundViewerImpactTick) { + roundViewerImpactTick = -1; + impacts.length = 0; + } + for (const row of rows) + if (row[0] > roundViewerImpactTick && row[0] <= tick) { + const seconds = (row[5] || 300) / 1000; + impacts.push({ x: row[1], y: row[2], z: row[3], + life: seconds, duration: seconds, + death: row[4] === 1, explosion: row[4] === 2 }); + } + roundViewerImpactTick = tick; + updateResultImpactDebris(dt); +} + +function gameBoot() { + nativeHudOverlay = typeof capabilities === "function" && capabilities().hudOverlay === true; + globalThis.__oskiewarWorkshopCommand = workshopCommand; + workshopBase ||= workshopSnapshot(); + if (globalThis.__oskiewarPublishedMap && globalThis.__oskiewarValidateMap) { + workshopMap = globalThis.__oskiewarValidateMap(globalThis.__oskiewarPublishedMap); + workshopTainted = true; + } + syncGameView(); + // The reel harness may boot with the debug overlay lit — safe-zone crops, + // stat chassis, input read-outs — to diagnose framing on a rendered reel. + if (globalThis.__oskiewarDebugOverlay === true) debugHitboxes = true; + // Name the session once. A client-error restart re-runs boot inside the + // same app run, and whoever attached to the session should not lose it to + // a crash the restart exists to paper over. + if (!sessionName) { + seedNames(Math.floor(Math.random() * 4294967296)); + sessionName = pronounceableMatchName(); + } + startedAt = runtime().monotonicUs; + roundStartedAt = startedAt; + lastSimAt = startedAt; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + emitSignal("hello", -1, 1, 0); + shellMode = "MENU"; + titleTransitionAt = null; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com") : null; + shellPrevious = []; + startInputPending = false; + localControllerPairSeen = false; + localControllerMissing = -1; + navigationPrevious = [[], []]; + roundViewer = globalThis.__oskiewarRoundBridge || null; + if (roundViewer?.start) { + shellMode = "GAME"; + selecting = false; + roundResult = ""; + matchOver = false; + // Watching a fight IS gameplay for the person doing it. This was false on + // every watcher, and the whole match HUD hangs off it: no round clock, no + // VS or WAITING FOR HOST label, no "you are ..." seat line, no status + // tray. That is the "no state updates on screen" @jeffrey reported. + gameplayStarted = true; + matchName = roundViewer.name || ""; + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + matchName) : spectatorQr; + roundStartedAt = startedAt - roundIntroDurationUs(); + roundViewerStop = roundViewer.start(handleRoundViewer); + return; + } + if (globalThis.__oskiewarSelfPlay) { + // A harness cast keeps the pre-versus reading of the empty door: nobody + // is holding a controller, so "no opponent" means the climb, never a + // lobby waiting on a friend who cannot exist. + if (!String(globalThis.__oskiewarOpponent || "").trim() || + survivalRequested()) + startSurvivalRun(startedAt, true); + else startSelfPlay(startedAt); + return; + } + if (survivalRequested()) beginSurvival(startedAt); + else if (versusRequested()) { + versusRoomName = sessionName; + beginVersusLobby(startedAt, { title: true }); + } else beginTraining(startedAt); +} + +function resetRound(now, resetMatch = false, keepMap = false) { + resetWorkshopMap(); + rotateLocalMap(keepMap, resetMatch); + if (netSession && !skateparkMap) { + if (netRoundMapIndex < 0) netRoundMapIndex = 0; + else if (!keepMap && roundResult) + netRoundMapIndex = (netRoundMapIndex + 1) % localMapVariants.length; + installRoundMap(netRoundMapIndex); + } + if (replay) { + const nextRoundName = pronounceableMatchName(); + // A versus room is one address for a whole match — the link a friend was + // sent, the socket the fight is riding, the code on the wall. Handing over + // to a new room between rounds would move every watcher and close the + // publisher out from under the fight. Only the broadcast lane hands over, + // where each round IS its own room. + if (!versusLane()) { + if (matchName) publishSpectator(now, { + target: matchName, nextRoundId: "ow-" + nextRoundName, force: true, + }); + spectatorQr = typeof qrcode === "function" + ? spectatorCode("https://oskiewar.com/" + nextRoundName) : null; + } + previousRoundName = matchName; + matchName = nextRoundName; + // Stamped, so a rollback across this rollover takes the entry back with it. + replayRoundMarks.push([demoTick(now), matchName]); + replay.roundIds = replayRoundMarks.map((mark) => "ow-" + mark[1]); + } + // Terrain belongs to the simulation contract, not the spectator URL. A + // network series keeps one landscape; local rounds rotate authored maps + // independently of their public room names. + configureWorldMap(skateparkMap ? "skatepark" : "station"); + resetSkateRopes(); + terrainPhase = terrainSeed("oskiewar-physics-1-hills"); + impacts.length = 0; + detachedParts.length = 0; + bullets.length = 0; + grenades.length = 0; + roundReplayFrames = []; + roundReplayLastAt = 0; + instantReplay = null; + replayOfferPrevious = []; + frameTelemetry = []; + frameTelemetryFlushAt = now + 1000000; + for (const player of players) { + applyRoster(player, player.rosterIndex); + player.x = player.spawnX; + player.y = airRoundActive() ? floorY - 400 : terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.facing = player.pad === 0 ? 1 : -1; + player.grounded = !airRoundActive(); + player.ducking = false; + player.alive = true; + player.respawnAt = 0; + player.score = 0; + if (resetMatch) player.roundWins = 0; + player.inputX = 0; + player.inputY = 0; + player.lastTap = {}; + player.lastRelease = {}; + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + player.walkSince = 0; + player.attackKind = ""; + player.attackUntil = 0; + player.attackHit = false; + player.blocking = false; + player.blockFlash = 0; + player.shieldLocked = false; + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + player.shieldBrokenAt = 0; + player.windVx = 0; + player.knockVx = 0; + player.shieldVx = 0; + player.gunAmmo = 0; + player.grenadeAmmo = 0; + player.gunAimX = player.facing; + player.gunAimY = 0; + player.gunAimLive = false; + player.gunMode = "HANDGUN"; + player.itemArm = ""; + player.nextGunShotAt = 0; + player.nextSpitAt = 0; + player.spitAt = -Infinity; + player.spitHeavy = false; + player.resultReaction = ""; + player.resultReactionAt = 0; + resultReactionPrevious[player.pad] = []; + player.stance = "NEUTRAL"; + player.itemAction = ""; + player.itemActionStartedAt = 0; + player.itemActionUntil = 0; + player.heldBall = -1; + player.heldPart = -1; + player.heldPlayer = -1; + player.carryArm = ""; + player.grabbedBy = -1; + resetSkate(player); + player.skateboard = skateparkMap && !survivalActive(); + player.ropeIndex = -1; + player.ropeGrabLocked = false; + player.ropeLink = chainLinks; + player.skateLoop = -1; + player.skateRotation = 0; + player.loopCooldownUntil = 0; + player.boostUntil = 0; + player.skateVx = 0; + player.skateWallSide = 0; + player.swordHeld = false; + player.grabHeld = false; + player.commandStream = []; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + player.partDamage = {}; + player.removedParts = []; + player.fallenBodyGeometry = null; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.poundFrom = 0; + player.poundLevel = 0; + player.standingOn = -1; + player.previousY = player.y; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.botPresses = {}; + player.botAttackAt = now + 420000; + player.botItemAt = now + 600000; + player.botSinkAt = now + 900000; + player.botSinkTaps = 0; + player.botSinkNextAt = 0; + player.botAttackSequence = 0; + player.botJumpAt = now + 900000; + player.survivalTargetLevel = 1; + player.botThreatSeen = 0; + player.botShieldAt = Infinity; + player.botPunishedAt = 0; + player.botScene = null; + player.botGoal = ""; + player.botSubgoal = null; + player.botRngState = (Math.round(now / 1000) ^ + Math.imul(player.pad + 1, 0x9e3779b9)) >>> 0; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.headRoll = 0; + player.headRollRate = 0; + player.headBounceCharge = 0; + player.headPumpDirection = 0; + player.headPumpAt = 0; + // Only a LOCAL hand can still be leaning on a button across the reset; a + // bot's presses were just cleared, and a remote rival's ride their own + // wire — inheriting pad two's local snapshot would suppress them. + player.previous = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]).down.slice() + : player.npc || player.bot || player.remote ? [] + : padSnapshots[player.pad]?.down?.slice() || []; + player.suppressedDirections = player.previous.filter((button) => + button.startsWith("Arrow")); + player.lastButton = "NONE"; + player.lastButtonAt = 0; + } + // A blade dropped by a severed arm is round furniture, not map furniture: + // it exists because a hand stopped existing, and the bell undoes that. Drop + // the dropped ones rather than parking them inactive forever, so a long + // match cannot walk this array up one entry per lost arm. + saberPickups.length = saberPickups.filter((pickup) => pickup.startsActive) + .length; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + pickup.active = Boolean(pickup.startsActive); + pickup.respawnAt = 0; + if (pickup.active) beginPickupDrop(pickup); + } + for (const tree of bodyTrees) { + tree.growth = 0; + tree.spent = false; + tree.y = terrainFloorAt(tree.x) - 60; + } + gridField.fill(0); + // A new round is a new exchange. Carrying the last one's frames across the + // bell would draw a history that never happened. + for (const meter of frameMeters) meter.length = 0; + nextPowerupAtUs = powerupIntervalUs; + powerupSequence = 0; + roundResult = ""; + roundOverAt = 0; // A fresh round cannot inherit a previous match's deadline. + roundCause = ""; + deathCinematic = null; + matchOver = false; + roundElapsedUs = 0; + lastCountdownSecond = -1; + lastIntroSecond = 0; + resultPulseAt = 0; + resultLaughAt = 0; + resultLaughStep = 0; + resultCardStung = false; + lastSimAt = now; + roundStartedAt = now; + rollWind(now); + resetBalls(now); + if (replay) replay.rounds.push([demoTick(now), windDirection, windMph, + balls.length]); + // Live frame one belongs to fighter one: snap to the head, then let the + // authored sequence cross to the other fighter and pull out. A reel has a + // shorter contract and takes the whole face-off on frame zero below. + cameraCenter = (players[0].x + players[1].x) / 2; + cameraWidth = 960; + cameraCenterY = (players[0].y + players[1].y) / 2 - 90; + cameraContainFloor = 0; + const poseTime = (now - startedAt) / 1000000; + if (reelGroundCamera()) { + // Frame zero is the face-off, not one isolated portrait. The short reel + // intro cannot afford to spend half of itself finding the other fighter. + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.snap({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }); + } else { + const firstHead = runnerWorldGeometry(players[0], poseTime).head; + const portraitWidth = Math.max(96, firstHead.radius * 6.5); + const portraitTarget = { x: firstHead.x, y: firstHead.y, z: firstHead.z }; + cameraDoll.snap({ target: portraitTarget, + position: { x: portraitTarget.x, y: portraitTarget.y, + z: portraitTarget.z - Math.max(portraitWidth * 1.35, + Math.abs(worldNear) + 400) }, + width: portraitWidth, perspective: 0, fov: 55, roll: 0 }); + } + // A rollback fight's fighters are named by the deal, not by whichever + // machine ran the reset: applyRoster above dresses seat one from the local + // account, which on the challenger's screen is the challenger. + if (netSession) netApplyIdentities(netSession.deal); +} + +// The box the camera packs. It is a fighting-game pushbox rather than the +// animated silhouette on purpose: breathing and stride would otherwise pump +// the lens once per idle cycle. Reach spans a fully extended punch or kick so +// throwing one never shoves the frame; live limbs still set the containment +// floor for anything this box misses. +function fighterFrameRect() { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + for (const player of activePlayers()) { + // Trimmed 2026-08-09 — @jeffrey wanted the lens closer to the fight. + // The rect still tracks live position, so jumps and knockbacks widen + // the frame as they happen; this is standing headroom, not arc room. + // Rise trimmed 2026-08-11 — @jeffrey read the old headroom as fighters + // sitting too low in a vertical frame; less sky, more fighter. + // Reach is an anticipation margin, not containment — the live-silhouette + // floor catches an actual extended limb. On a narrow stage every world + // unit of width costs its height times the aspect, so the margin is + // priced by the same factor the fixed shot widths already pay; a phone + // spends its width on fighters, a television on room to swing. + const reach = (isHeadOnly(player) ? 34 : isPogo(player) ? 56 : 104) * + portraitPull(); + const rise = isHeadOnly(player) ? 48 : isPogo(player) ? 128 : 150; + left = Math.min(left, player.x - reach); + right = Math.max(right, player.x + reach); + top = Math.min(top, player.y - rise); + // Feet swing below the terrain contact point on slopes. Pack their full + // projected arc so camera yaw cannot shave them off at a safe-zone edge. + bottom = Math.max(bottom, player.y + (isHeadOnly(player) ? 18 : 38)); + } + // A shot remains physical until it hits something, so it remains a camera + // subject too. Include both ends of its swept path to prevent a fast round + // flickering outside the action-safe frame between simulation ticks — + // but only while it stays near the fight. In the padded room the leash + // spans the whole map, so every shot is framed like it always was; it + // exists because on the old street a ricocheting stray dragged the lens + // twenty thousand units from two idle fighters and the draw span took + // the Xbox to eleven frames a second. + const bulletLeash = 5200; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + if (!players.some((player) => + Math.abs(bullet.x - player.x) < bulletLeash && + Math.abs(bullet.y - player.y) < bulletLeash)) continue; + const previousX = bullet.previousX ?? bullet.x; + const previousY = bullet.previousY ?? bullet.y; + left = Math.min(left, previousX - 32, bullet.x - 32); + right = Math.max(right, previousX + 32, bullet.x + 32); + top = Math.min(top, previousY - 32, bullet.y - 32); + bottom = Math.max(bottom, previousY + 32, bullet.y + 32); + } + return { left, right, top, bottom }; +} + +// How far this stage is from a 16:9 television, as a lens factor. The fixed +// shot widths in this file — the framing floor, the killcam stand-off, the +// intro and result close-ups — are all width constants tuned on a widescreen, +// and the same width on a narrow stage reads twice as distant because the +// screen has no width to spare. Multiplying a CONSTANT by this converts it to +// the stage at hand. Multiplying a packed rect by it is how portrait play used +// to lose fighters off the screen edges: the pack already knows the aspect, +// and shrinking its answer shrinks the one axis that was load-bearing. +const portraitPull = () => clamp(cameraAspect / (16 / 9), .52, 1); +// A reel ends on the win. Nobody is holding a controller, so there is no wide +// shot to hand back to — the last thing in frame should be the winner's face. +const reelCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true && + capabilities().reelFullUi !== true; +// Ground coverage belongs to every 9:16 oven burn, including the full-UI +// lane. `reelCamera` is narrower: it also opts into minimal-HUD winner framing. +// Reusing that narrower predicate for terrain left full-UI reels with the TV +// slab edge behind the lens, exposing a hard cut beneath the floor. +const reelGroundCamera = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelHud === true; + +// Rect-pack: the camera width that makes a world rect exactly fill the +// action-safe frame. Whichever axis runs out first decides the lens, so a +// stacked pair frames as tightly as a spread one — and because each term +// carries the live stage aspect, the answer is exact for a phone held +// upright, a television, and an ultrawide alike. +// +// A reel is the one place the pack is allowed to lie. A 9:16 render with +// nobody steering trades its side margins for bigger fighters on purpose — +// that is how the reels were tuned to read. Live play never gets that trade: +// a fighter cropped off a screen edge is a fighter you cannot play. +function rectPackWidth(rect) { + const safe = actionSafeRect(); + return Math.max( + (rect.right - rect.left) * (stageRight - stageLeft) / + Math.max(1, safe.right - safe.left), + (rect.bottom - rect.top) * cameraAspect * (stageBottom - stageTop) / + Math.max(1, safe.bottom - safe.top)) * + (reelCamera() ? portraitPull() : 1); +} +// A fighter reduced to a bouncing head is a few dozen units tall. Without a +// floor the pack would keep closing until one limb filled the screen. +// Lowered with the reach/rise trim above: the closest the lens may sit. +// The tightest the automatic camera may go. It scales with the same pull, or a +// portrait shot closes to the pull and then hits a floor sized for a television. +// The versus lobby holds a mid shot instead: one body under a close-up lens +// filled the screen and sat on top of the very instruction the room exists to +// show, and a visitor deciding whether to share the address wants to see the +// room they are inviting somebody into. Under the wordmark the same lobby +// sits for a portrait — the title is a face, and starting is the pullback +// that reveals the room. +const frameFloorWidth = () => + (lobbyActive() ? shellMode === "MENU" ? 430 : 860 + : compactLayout() ? 215 : 315) * portraitPull(); + +// Terrain is flat color, so it only has to reach as far as the lens can see. +// Submitting the whole arena pushed its far corners past the native ±30000 +// coordinate guard whenever the camera closed in or sat against a wall, which +// culled the ground quad and left the clear color where the stage should be. +function terrainSpan() { + // A lens sees more floor than its nominal width says — perspective, yaw, + // and the orbiting killcam all sweep past it, and a close shot's bottom + // corners un-project far along the ground plane. A fixed apron past the + // width keeps the sheet under every corner of the frame without doubling + // the whole street's quad count when the camera is wide; the near clipper + // has owned the old ±30000 native guard since it learned to cut faces + // instead of culling them. + const reach = cameraDoll.width + 2600; + const worldTop = survivalActive() ? survivalCeilingY : ceilingY; + return { left: Math.max(worldLeft, cameraCenter - reach), + right: Math.min(worldRight, cameraCenter + reach), + top: Math.max(worldTop, cameraCenterY - reach), + bottom: Math.min(parkDeepest, cameraCenterY + reach) }; +} + +function updateCamera(dt) { + if (survivalActive() || skateparkMap) return; + const rect = fighterFrameRect(); + // Look slightly ahead of fast movement so zoom starts before a fighter + // reaches the safe edge instead of reacting after the crossing. + const lookAhead = .2; + let leftDrift = 0; + let rightDrift = 0; + let upDrift = 0; + let downDrift = 0; + for (const player of activePlayers()) { + const dx = (player.vx + (player.windVx || 0) + (player.knockVx || 0) + + (player.shieldVx || 0)) * lookAhead; + const dy = player.vy * lookAhead; + leftDrift = Math.min(leftDrift, dx); + rightDrift = Math.max(rightDrift, dx); + upDrift = Math.min(upDrift, dy); + downDrift = Math.max(downDrift, dy); + } + rect.left += leftDrift; + rect.right += rightDrift; + rect.top += upDrift; + rect.bottom += downDrift; + // AIR DROP has no floor: the starting room cannot cap vertical framing + // once fighters fall farther apart than that room was tall. + const maxWidth = airRoundActive() ? Infinity : Math.max(worldRight - worldLeft, + (floorY - ceilingY) * cameraAspect); + // Perspective orbit and uneven ground skew the projected silhouette beyond + // its orthographic pushbox. A small fixed overscan keeps complete bodies in + // the action-safe rectangle without making the compact room feel distant. + const packWidth = rectPackWidth(rect); + const desiredWidth = clamp(packWidth * 1.08, frameFloorWidth(), maxWidth); + const widthSpeed = desiredWidth > cameraWidth ? 17 : 5.5; + const widthBlend = 1 - Math.exp(-Math.max(0, dt) * widthSpeed); + cameraWidth += (desiredWidth - cameraWidth) * widthBlend; + // An exponential ease always runs a fixed distance behind a target that is + // moving steadily, and the distance is the target's rate over the blend — + // about 160 units of width when the pair is separating at a walk. In the + // cube that debt was invisible: the two walls were 980 apart, so separation + // stopped growing before the debt could show. On a station twice that wide + // it is ten pixels of fighter hanging outside the action-safe rect, every + // frame, for as long as the two of them keep running apart. + // + // So containment gets a floor, and the ease keeps the rest. `rectPackWidth` + // is exactly the width that fits the pack inside the safe rect with nothing + // to spare; the 8% overscan above it is comfort and may arrive late. The + // camera may therefore be behind on looking good, and never behind on + // holding the fight. + cameraWidth = Math.max(cameraWidth, Math.min(packWidth, maxWidth)); + const halfWidth = cameraWidth / 2; + const halfHeight = cameraWidth / cameraAspect / 2; + // Center comes from the same rect the width did, so the frame pans down as + // the action drops and rides up onto the platform with it. + let desiredCenter = cameraWidth >= worldRight - worldLeft + ? (worldLeft + worldRight) / 2 + : clamp((rect.left + rect.right) / 2, + worldLeft + halfWidth, worldRight - halfWidth); + // Feet plant a capsule radius under the floor line, and the ground plane + // keeps covering that far past it, so the frame may sit that low rather + // than widening just to recentre a standing pair. + const footRoom = 40; + // Aim below the fighters' middle, not at it. A vertical frame centered on + // the bodies spends its whole upper half on sky; leaning the aim down + // rides them into the upper third with ground filling in beneath. The + // lean is priced against how much of the frame the pack already fills: + // in the cube's close-ups two fighters stand most of the view tall, and + // the full tower-era lean pushed their heads over the action-safe line — + // so it fades out as the pack closes on the frame's height. + const packFill = clamp((rect.bottom - rect.top) / Math.max(1, halfHeight), + 0, 2); + const aimLean = halfHeight * .22 * clamp((1.8 - packFill) / .8, 0, 1); + let desiredCenterY = airRoundActive() ? (rect.top + rect.bottom) / 2 + aimLean + : halfHeight * 2 >= floorY - ceilingY + ? (ceilingY + floorY) / 2 + : clamp((rect.top + rect.bottom) / 2 + aimLean, + ceilingY + halfHeight, parkDeepest + footRoom - halfHeight); + // Fold containment into the target before easing. Clamping the live camera + // after easing caused a one-frame reset whenever a fighter crossed the safe + // edge; the pack width now absorbs that motion while the center remains + // continuous. + const containLeft = rect.right - halfWidth * .92; + const containRight = rect.left + halfWidth * .92; + if (containLeft <= containRight) + desiredCenter = clamp(desiredCenter, containLeft, containRight); + const containTop = rect.bottom - halfHeight * .92; + const containBottom = rect.top + halfHeight * .92; + if (containTop <= containBottom) + desiredCenterY = clamp(desiredCenterY, containTop, containBottom); + const centerBlend = 1 - Math.exp(-Math.max(0, dt) * 9); + cameraCenter += (desiredCenter - cameraCenter) * centerBlend; + cameraCenterY += (desiredCenterY - cameraCenterY) * centerBlend; +} + +function updateCameraDoll(dt, now) { + if (freeForAll() || airRoundActive()) { + updateCamera(dt); + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + const growth = dt > 0 ? Math.max(0, + containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, containmentWidth + growth / 19); + const naturalWidth = cameraWidth * 1.015; + if (naturalWidth < cameraContainFloor * .92) + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, 1 - Math.exp(-dt * 1.6)); + const width = Math.max(naturalWidth, cameraContainFloor) * playerCameraZoom; + cameraDoll.track({ target, position: { + x: target.x + Math.sin(playerCameraYaw) * width * 1.35, + y: target.y - width * (.026 + playerCameraPitch), + z: -Math.cos(playerCameraYaw) * width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (skateparkMap && !survivalActive() && shellMode === "GAME") { + const rider = players[netSession?.seat || 0]; + const width = Math.max(1100, 900 * cameraAspect) * playerCameraZoom; + const half = width / 2; + const desiredX = clamp(rider.x + clamp(rider.vx * .18, -300, 300), + worldLeft + half, worldRight - half); + const desiredY = rider.y - 180; + const blend = 1 - Math.exp(-dt * 9); + cameraCenter += (desiredX - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth = width; + cameraDoll.track({ target: { x: cameraCenter, y: cameraCenterY, z: 0 }, + position: { x: cameraCenter, y: cameraCenterY, z: -width * 1.35 }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + const introAge = now - roundStartedAt; + if (survivalActive()) { + const runner = players[0]; + const framedWidth = survivalFrameWidth * playerCameraZoom; + const halfHeight = framedWidth / cameraAspect / 2; + const desiredY = clamp(runner.y + halfHeight * .18, + survivalCeilingY + halfHeight, floorY + 40 - halfHeight); + const blend = 1 - Math.exp(-Math.max(0, dt) * 7); + cameraCenter += ((worldLeft + worldRight) / 2 - cameraCenter) * blend; + cameraCenterY += (desiredY - cameraCenterY) * blend; + cameraWidth += (framedWidth - cameraWidth) * blend; + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + cameraDoll.track({ target, + position: { x: cameraCenter, y: cameraCenterY, + z: -framedWidth * 1.35 }, + width: framedWidth, perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + if (roundResult) { + updateResultReactions(now); + const age = Math.max(0, (now - roundOverAt) / 1000000); + // The cinematic hands back to the wide shot at 1.45s so play can resume. + // A reel has no play to resume into, and handing back mid-celebration + // pulled the camera off the winner's face just as the hearts arrived, so + // there the shot is allowed to hold until the recording stops. + if (deathCinematic && (age < 1.45 || (reelCamera() && age < 6))) { + if (age < .11) return; + const loser = players[deathCinematic.loserPad]; + const winner = players[deathCinematic.winnerPad]; + const loserHead = loser.frozenGeometry?.head || + runnerWorldGeometry(loser, (now - startedAt) / 1000000).head; + const winnerHead = winner?.frozenGeometry?.head || (winner + ? runnerWorldGeometry(winner, (now - startedAt) / 1000000).head + : { x: cameraCenter, y: cameraCenterY, z: 0 }); + // The killcam used to sit inside the winner's own head, so the winner + // had to be culled or their body would have filled the lens — which is + // why the fighter who had just won blinked out for three quarters of a + // second. It stands off their shoulder now: back along the line between + // the two of them, raised, and aimed at a point most of the way to the + // fighter going down. Both are in the frustum, so nothing is hidden to + // make the shot and nobody vanishes. + // + // Every distance is drawn from the gap between the heads, because the + // pair can be a step apart or the width of the stage apart, and a fixed + // stand-off frames only one of those. + const headGap = Math.max(320, Math.abs(loserHead.x - winnerHead.x)); + // Center the complete pair. Favoring the loser pushed the winner across + // the viewport edge during the eased handoff. + const focus = { x: lerp(winnerHead.x, loserHead.x, .5), + y: lerp(winnerHead.y, loserHead.y, .5), + z: lerp(winnerHead.z, loserHead.z, .5) }; + const shoulder = { x: focus.x, y: focus.y, + // Stay outside the whole arena depth. The old close killcam entered + // the world volume and near-clipped limbs, floor, and wall polygons. + z: focus.z - Math.max(headGap * 1.3, Math.abs(worldNear) + headGap) }; + // Wider than the old close-up had to be, because it now has to hold two + // fighters rather than one — the 64° lens buys most of that back. Past + // about a 1300 gap this would open onto empty stage, so beyond there it + // settles toward the span the returning wide shot uses. + const shotWidth = Math.min(headGap * 1.7, headGap + 900) * portraitPull(); + if (age < .86) { + cameraDoll.track({ target: focus, position: shoulder, + width: shotWidth, perspective: 0, fov: 55, roll: 0 }, dt, 11); + return; + } + // Reels celebrate instead of returning. The lens narrows onto the + // winner's head rather than the camera dollying toward it: the standoff + // above is deliberately outside the arena depth, and flying in would put + // the floor and the winner's own limbs back through the near plane. + if (reelCamera() && winner) { + const push = clamp((age - .86) / .5, 0, 1); + const headFocus = { x: winnerHead.x, y: winnerHead.y, z: winnerHead.z }; + cameraDoll.track({ target: headFocus, position: { + x: headFocus.x, y: headFocus.y, z: shoulder.z }, + width: lerp(shotWidth, 430 * portraitPull(), push), + perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const returnAmount = clamp((age - .86) / .59, 0, 1); + const midpoint = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const span = Math.max(900, Math.abs(players[1].x - players[0].x) + 540) * + portraitPull(); + cameraDoll.track({ target: midpoint, + position: { x: midpoint.x, y: midpoint.y, + z: lerp(shoulder.z, midpoint.z - span * 1.2, returnAmount) }, + width: lerp(shotWidth, span, returnAmount), + perspective: 0, fov: 55, roll: 0 }, dt, 10); + return; + } + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 95, + z: (players[0].z + players[1].z) / 2 }; + const horizontalSpan = Math.abs(players[1].x - players[0].x); + const verticalSpan = Math.abs(players[1].y - players[0].y) * cameraAspect; + const closeWidth = Math.max( + Math.max(820, horizontalSpan + 540, verticalSpan + 520) * portraitPull(), + rectPackWidth(fighterFrameRect()) * 1.22); + cameraDoll.track({ target, + position: { x: target.x, + y: target.y, + z: target.z - closeWidth * 1.2 }, + width: closeWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 7); + return; + } + if (reelGroundCamera() && introAge < reelOpeningHoldUs) { + const target = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const width = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, + z: target.z - Math.max(width * 1.35, Math.abs(worldNear) + 400) }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 12); + return; + } + if (introAge < roundIntroDurationUs()) { + // One elapsed-time story: first fighter, second fighter, title pullback, + // then the fight. + // Nothing is counted in rendered frames, so live variable speed and an + // offline slow-motion burn tell the identical introduction. + const age = introAge / 1000000; + const firstEnd = 1; + const secondEnd = 2; + const poseTime = (now - startedAt) / 1000000; + const headOf = (player) => + (player.frozenGeometry || runnerWorldGeometry(player, poseTime)).head; + // Enough room around a head to read as a portrait rather than an eyeball. + const faceWidth = (head) => Math.max(96, head.radius * 6.5); + + const opening = { x: (players[0].x + players[1].x) / 2, + y: (players[0].y + players[1].y) / 2 - 90, + z: (players[0].z + players[1].z) / 2 }; + const openingWidth = Math.max(980, + Math.abs(players[1].x - players[0].x) + 760) * portraitPull(); + + let target; + let width; + if (age < secondEnd) { + // Frame one is already on player one. Track easing carries the camera + // across to player two without a cut. + const head = headOf(players[age < firstEnd ? 0 : 1]); + target = { x: head.x, y: head.y, z: head.z }; + width = faceWidth(head); + } else { + const out = clamp((age - secondEnd) / + (roundIntroDurationUs() / 1000000 - secondEnd), 0, 1); + const eased = out * out * (3 - out * 2); + const head = headOf(players[1]); + target = { x: lerp(head.x, opening.x, eased), + y: lerp(head.y, opening.y, eased), + z: lerp(head.z, opening.z, eased) }; + width = lerp(faceWidth(head), openingWidth, eased); + } + // Stand off outside the arena depth. The framing is orthographic, so the + // distance costs nothing and `width` alone decides how close the shot + // reads — but a lens parked a face's width from a head sits inside the + // world volume and near-clips the head it came to look at, which is the + // same trap the killcam fell into and had to be pulled back out of. + const standOff = Math.max(width * 1.35, Math.abs(worldNear) + 400); + cameraDoll.track({ target, + position: { x: target.x, y: target.y, z: target.z - standOff }, + width, perspective: 0, fov: 55, roll: 0 }, dt, 9); + return; + } + const target = { x: cameraCenter, y: cameraCenterY, z: 0 }; + // Measure complete animated silhouettes before rendering. This used to run + // as a final paint-time correction, which made the viewport skip a frame at + // the safe-zone edge. + const containmentWidth = fighterContainmentRequiredWidth( + (now - startedAt) / 1000000) * 1.04; + // Lead the floor by exactly the debt the doll's own ease is about to run up. + // `track` pulls back at speed * 1.9 — 19 here — so a floor growing at R units + // a second settles 19 times slower than that, and the doll sits R/19 units of + // width behind it for as long as the growth lasts. In the cube that debt was + // unreachable: the walls were 980 apart and separation stopped growing long + // before it could accumulate. On a station twice that wide, two fighters + // running in opposite directions hold the growth up indefinitely, and the + // debt reads as a hand hanging outside the action-safe rect every frame. + // + // Adding the debt to the target is not a fudge — it is what makes the ease + // arrive where the fighters actually are rather than where they were. It + // costs nothing when nothing is moving apart, because the growth is zero and + // the lead is zero, so a settled fight frames exactly as it always did. + const containmentGrowth = dt > 0 + ? Math.max(0, containmentWidth - previousContainmentWidth) / dt : 0; + previousContainmentWidth = containmentWidth; + cameraContainFloor = Math.max(cameraContainFloor, + containmentWidth + containmentGrowth / 19); + // A small overscan absorbs animated hands and feet before + // they reach the action-safe edge without loosening the close fight shot. + const naturalWidth = cameraWidth * 1.015; + // Hysteresis prevents a fighter hovering at the safe edge from repeatedly + // switching between close and wide framing. The band and the pushbox above + // are tuned together so the floor never has to release during an idle cycle; + // if it does, the lens breathes in time with the fighter's own animation. + if (cameraContainFloor > naturalWidth && + naturalWidth < cameraContainFloor * .92) { + const release = 1 - Math.exp(-Math.max(0, dt) * 1.6); + cameraContainFloor = lerp(cameraContainFloor, naturalWidth, release); + } + const framedWidth = Math.max(naturalWidth, cameraContainFloor) * + (reelCamera() ? 1 : playerCameraZoom); + // Automatic framing stays orthographic, preventing camera movement from + // bending the arena. The right stick may still rotate the diorama explicitly. + const tilt = .026 + playerCameraPitch; + const dolly = 1.35; + cameraDoll.track({ target, + position: { + x: cameraCenter + Math.sin(playerCameraYaw) * framedWidth * dolly, + y: cameraCenterY - framedWidth * tilt, + z: -Math.cos(playerCameraYaw) * framedWidth * dolly }, + width: framedWidth, perspective: 0, fov: 55, + roll: 0 }, dt, 10); +} + +function freezeFinalFrame(now, livePad = -1) { + const poseTime = (now - startedAt) / 1000000; + for (const player of activePlayers()) { + if (player.pad === livePad) { + delete player.frozenGeometry; + delete player.frozenAt; + continue; + } + player.frozenGeometry = runnerWorldGeometry(player, poseTime); + player.frozenAt = now; + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); +} + +function finishRound(now) { + if (roundResult) return; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + captureRoundReplay(now, true); + let roundPan = 0; + const winner = roundWinner(); + if (!winner) { + roundResult = "TIE"; + emitSignal("tie", -1, players[0].score, players[1].score); + } + else { + roundPan = panPlayer(winner); + winner.roundWins += 1; + matchOver = winner.roundWins >= matchWins; + roundResult = winner.name + (matchOver ? " WINS MATCH" : " WINS ROUND"); + emitSignal(matchOver ? "matchwin" : "roundwin", winner.pad, + winner.roundWins, winner.score); + } + impactHitboxesUntil = Math.max(impactHitboxesUntil, + now + (matchOver ? matchResultUs : roundResultUs)); + roundOverAt = now; + for (const player of players) player.vx = 0; + playDrum("clap", 1.2, roundPan); + captureFrameTelemetry(now, true); + saveRoundReplay(now); + // A deferred round still needs its replay to be filed from; the flush that + // files it closes the match out afterwards. + if (matchOver && !netSession) finishReplay(); +} + +function resultCardText(display = false) { + if (roundResult === "TIE") return { winner: "tie", action: "" }; + const encoded = roundResult.match(/^(@\S+)\s+WINS\b/i); + const winner = encoded?.[1] || + (roundWinner()?.name || "TIE"); + const handle = display && globalThis.__oskiewarDeviceHandles?.[roundWinner()?.pad]; + return { winner: (handle || winner).toLowerCase(), action: "" }; +} + +function updateResultReactions(now) { + const winningPad = roundWinner()?.pad ?? -1; + for (const player of players) { + const down = inputPads[player.pad]?.down || []; + const previous = resultReactionPrevious[player.pad]; + const laughChord = down.includes("A") && down.includes("B") && + (!previous.includes("A") || !previous.includes("B")); + const pressed = laughChord ? "LAUGH" : down.find((button) => + !previous.includes(button)); + if (pressed) { + const winner = player.pad === winningPad; + if (pressed === "ArrowLeft") player.facing = -1; + if (pressed === "ArrowRight") player.facing = 1; + player.resultReaction = winner + ? ({ LAUGH: "LAUGH", A: "KICK", B: "PUNCH", X: "POSE", Y: "DANCE", + ArrowLeft: "DASH", ArrowRight: "DASH", ArrowUp: "AIR", + ArrowDown: "CROUCH" }[pressed] || "DANCE") + : ({ A: "CRY", B: "WOE", X: "SULK", Y: "WIGGLE" }[pressed] || + "WOE"); + player.resultReactionAt = now; + if (player.resultReaction === "LAUGH") + emitSignal("laugh", player.pad, 1, 0); + else { + playSine(winner ? 520 : 145, .1); + emitSignal("reaction", player.pad, winner ? 1 : -1, 0); + } + } + resultReactionPrevious[player.pad] = down.slice(); + } +} + +function quantizedInput(pad, suppressed = []) { + const held = pad.down; + const active = (button) => held.includes(button) && !suppressed.includes(button); + let horizontal = (active("ArrowRight") ? 1 : 0) - + (active("ArrowLeft") ? 1 : 0); + let vertical = (active("ArrowUp") ? 1 : 0) - + (active("ArrowDown") ? 1 : 0); + if (!horizontal && Math.abs(pad.leftX) >= 0.48) horizontal = pad.leftX > 0 ? 1 : -1; + if (!vertical && Math.abs(pad.leftY) >= 0.48) vertical = pad.leftY > 0 ? 1 : -1; + return { horizontal, vertical }; +} + +function remember(player, button) { + player.lastButton = buttonLabel(button); + player.lastButtonAt = runtime().monotonicUs; + const command = { A: "/", B: "*", X: ")", Y: "+", + LeftShoulder: "+", RightShoulder: "+" }[button] || player.lastButton; + if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", + "A", "B", "X", "Y", "LeftShoulder", "RightShoulder"].includes(button)) + recordCommand(player, command, player.lastButtonAt); + telemetry("FIGHT_BUTTON", player.name + " " + player.lastButton); +} + +function recordCommand(player, label, now) { + const previous = player.commandStream.at(-1); + if (previous?.label === label && now - previous.at < 40000) return; + player.commandStream.push({ label, at: now }); + while (player.commandStream.length > commandStreamDepth) + player.commandStream.shift(); +} + +function fireGun(player, input) { + const now = runtime().monotonicUs; + const pose = gunPose(player, now, input); + player.gunAimX = pose.dx; + player.gunAimY = pose.dy; + const smg = player.gunMode === "RUBBER SMG"; + const rocket = player.gunMode === "ROCKET LAUNCHER"; + const laser = player.gunMode === "SPACE LASER"; + if (rocket) { + grenades.push({ x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * 2850, vy: pose.dy * 2850, owner: player.pad, + fuse: 3.2, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0, rocket: true }); + while (grenades.length > 12) grenades.shift(); + player.gunAmmo -= 1; + player.nextGunShotAt = now + 650000; + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 240000; + player.pendingMoveLabel = "ROCKET " + player.gunAmmo; + playDrum("kick", 1.15, panPlayer(player)); + playSine(92, .22); + emitSignal("rocket", player.pad, pose.dx, pose.dy); + return; + } + // Automatic means a fast succession of discrete rounds, never a shotgun + // fan. Holding fire schedules the next SMG round below. + const shots = 1; + for (let shot = 0; shot < shots; shot++) { + bullets.push({ + x: pose.muzzle.x, y: pose.muzzle.y, z: pose.muzzle.z, + vx: pose.dx * (laser ? 9600 : smg ? 5000 : 4200), + vy: pose.dy * (laser ? 9600 : smg ? 5000 : 4200), + owner: player.pad, life: 1, rubber: smg, laser, + safeUntil: now + 100000, + }); + } + while (bullets.length > 24) bullets.shift(); + player.gunAmmo -= shots; + player.nextGunShotAt = now + (laser ? 340000 : smg ? 85000 : 220000); + player.itemAction = "FIRE"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + (laser ? 210000 : 170000); + player.pendingMoveLabel = + (laser ? "LASER " : smg ? "RUBBER SMG " : "FIRE ") + player.gunAmmo; + for (let shot = 0; shot < shots; shot++) { + playDrum(laser ? "whoosh" : smg ? "block" : "hat", + laser ? 1.35 : smg ? .62 + shot * .08 : 1.05, panPlayer(player)); + playSine(laser ? 1180 : (smg ? 310 : 760) + shot * 55, + laser ? .13 : smg ? .055 : .08); + } + emitSignal(laser ? "laser" : "bullet", player.pad, pose.dx, pose.dy); +} + +// The mouth used by both face paint and projectile spawn. Its coordinates are +// authored in face-space, then rotated with a bodyless head. Keeping this one +// transform prevents the visible lips and the physical glob from separating +// while the head rolls. +function spitMouthPose(player) { + const radius = 22; + const direction = player.facing || 1; + const head = { x: player.x, y: player.y - radius }; + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const localX = direction * radius * .2; + const localY = radius * .3; + const offsetX = localX * cosRoll - localY * sinRoll; + const offsetY = localX * sinRoll + localY * cosRoll; + // Position and aim are related but not identical: the mouth sits low on the + // face, while spit travels mostly forward with only a small downward pitch. + // Using center->mouth as velocity made that low placement dominate the shot + // and swing it sideways as the head rolled. + // The runner's `facing` sign names its mirrored drawing side; the visible + // face normal points away from that sign. Treating it as the normal sent the + // release upper-left while the mouth presented lower-right. + const aimLocalX = -direction; + const aimLocalY = -.22; + const aimX = aimLocalX * cosRoll - aimLocalY * sinRoll; + const aimY = aimLocalX * sinRoll + aimLocalY * cosRoll; + // Screen/world Y grows downward. Head roll owns the sideways swing, but a + // spit release always pitches below the mouth instead of becoming an + // upward shot during the top half of a roll. + const downwardAimY = Math.abs(aimY); + const aimLength = Math.hypot(aimX, downwardAimY) || 1; + return { + x: head.x + offsetX, + y: head.y + offsetY, + outX: aimX / aimLength, + outY: downwardAimY / aimLength, + roll, direction, + }; +} + +function spit(player, heavy = false) { + const now = runtime().monotonicUs; + if (now < (player.nextSpitAt || 0)) return; + const mouth = spitMouthPose(player); + const direction = mouth.direction; + // A rolling head spits WHERE ITS MOUTH POINTS. The lob leaves along the + // head's current angle, so aim on a bodyless head is a timing skill — wait + // for the roll to face your rival, or spit skyward and let it rain. Bodied + // fighters have no roll and lob flat-forward as before. headRoll is sim + // state (integrated in updatePlayers), so the re-sim agrees. + // Release at the visible lips, mostly face-forward with a slight downward + // pitch. Both the spawn and aim use the same rolling face transform. + const speed = heavy ? 520 : 680; + const toss = { x: mouth.outX * speed, y: mouth.outY * speed }; + bullets.push({ + x: mouth.x, y: mouth.y, z: player.z, + previousX: mouth.x, previousY: mouth.y, + vx: toss.x, vy: toss.y, + owner: player.pad, life: 1, spit: true, heavy, + // Let the glob visibly clear the lips and the spitter's own fallen limbs. + // Without this, a bodyless fighter often spat directly into its debris + // halo and produced only a yellow impact puff on the release frame. + safeUntil: now + 220000, + }); + while (bullets.length > 24) bullets.shift(); + player.nextSpitAt = now + (heavy ? 520000 : 260000); + player.spitAt = now; + player.spitHeavy = heavy; + player.lastButton = heavy ? "HEAVY SPIT" : "SPIT"; + player.lastButtonAt = now; + player.pendingMoveLabel = player.lastButton; + playSine(heavy ? 118 : 190, heavy ? .16 : .1); + playDrum(heavy ? "kick" : "hat", heavy ? .82 : .55, panPlayer(player)); + emitSignal("spit", player.pad, heavy ? 2 : 1, direction); +} + +function throwGrenade(player, input = null) { + const now = runtime().monotonicUs; + const aimX = input?.horizontal || player.facing; + const aimY = input ? -input.vertical : -.25; + const length = Math.hypot(aimX, aimY) || 1; + grenades.push({ x: player.x + player.facing * 150, + y: player.y - (player.ducking ? 80 : 145), z: player.z, + vx: aimX / length * 1950, vy: aimY / length * 1950, + owner: player.pad, + fuse: 1.15, alive: true, exploding: false, blastAge: 0, blastRadius: 0, + hitPlayers: 0 }); + while (grenades.length > 12) grenades.shift(); + player.grenadeAmmo -= 1; + player.itemAction = "THROW"; + player.itemActionStartedAt = now; + player.itemActionUntil = now + 260000; + player.pendingMoveLabel = "GRENADE " + player.grenadeAmmo; + playDrum("kick", .95, panPlayer(player)); + emitSignal("grenade", player.pad, player.facing, player.ducking ? 1 : 0); +} + +function beginPickupDrop(pickup) { + const live = activePlayers().filter(p => p.alive); + const all = [...gunPickups, ...saberPickups, ...grenadePickups]; + const slot = Math.max(0, all.indexOf(pickup)); + if (airRoundActive()) { + const middle = live.reduce((sum, p) => sum + p.x, 0) / Math.max(1, live.length); + pickup.x = clamp(middle + ((slot % 5) - 2) * 190, + worldLeft + 150, worldRight - 150); + pickup.y = Math.min(...live.map(p => p.y), floorY + 1e9) - 800 - slot * 110; + pickup.dropLandingY = null; + pickup.dropVy = 960; + } else { + pickup.dropLandingY = surfaceYAt(pickup.x, floorY) - 70; + pickup.y = Math.min(pickup.dropLandingY - 520, floorY - 900); + pickup.dropVy = 0; + } + pickup.dropping = true; + pickup.respawnAt = 0; +} + +function updateFallingPickups(dt, now) { + const live = activePlayers().filter(p => p.alive); + const lower = live.length ? Math.max(...live.map(p => p.y)) + 1000 : floorY + 1000; + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) { + if (!pickup.active) { + if (airRoundActive() && pickup.startsActive) { + if (!pickup.respawnAt) pickup.respawnAt = now + 4000000; + if (now >= pickup.respawnAt) { pickup.active = true; beginPickupDrop(pickup); } + } + continue; + } + if (!pickup.dropping) continue; + pickup.dropVy = Math.min(airRoundActive() ? 1100 : 1400, + (pickup.dropVy || 0) + 1900 * dt); + pickup.y += pickup.dropVy * dt; + if (airRoundActive()) { + if (pickup.y > lower) beginPickupDrop(pickup); + } else if (pickup.y >= pickup.dropLandingY) { + pickup.y = pickup.dropLandingY; + pickup.dropVy = 0; + pickup.dropping = false; + } + } +} + +function updateGunPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of gunPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.gunAmmo = Math.min(30, player.gunAmmo + pickup.amount); + player.gunMode = pickup.kind || "HANDGUN"; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, player.gunMode + " +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 1, pickup.amount); + break; + } + } +} + +// A saber is picked up the way a gun is and kept the way a limb is. It needs +// a free arm to take, it lives on `swordHeld` rather than in an ammo count, +// and `meleeSpecFor` is what spends it — every hand strike gets half again +// its reach while the blade is in the hand. Nothing here fires. +function updateSaberPickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of saberPickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || player.swordHeld || + !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, + pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.swordHeld = true; + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "LIGHT SABER"); + playDrum("clap", 1.25, panPlayer(player)); + playSine(520, .14); + emitSignal("saber", player.pad, 1, 0); + break; + } + } +} + +function updateGrenadePickups(now) { + const poseTime = (now - startedAt) / 1000000; + for (const pickup of grenadePickups) { + if (!pickup.active) continue; + for (const player of players) { + if (!player.alive || !nearRunner(player, pickup.x, pickup.y, pickup.z, 90) || + runnerDistanceToPoint(player, poseTime, pickup.x, pickup.y, pickup.z) > 90 || !availableArm(player)) continue; + player.grenadeAmmo = Math.min(4, player.grenadeAmmo + pickup.amount); + player.itemArm = availableArm(player); + pickup.active = false; + remember(player, "GRENADE +" + pickup.amount); + playDrum("clap", 1.1, panPlayer(player)); + emitSignal("pickup", player.pad, 2, pickup.amount); + break; + } + } +} + +// Ripe fruit is a new body and fifteen seconds. The clock is `roundElapsedUs` +// counting up toward `roundDurationUs`, so winding it back is what "adds +// time" means here — and it is clamped at zero, because a tree cannot make +// the round longer than a round. +// The tree leans in off its wall, so both the picture and the pickup test have +// to agree about where the fruit ended up. One function owns that. +// The tree climbs its wall more than it leans off it, because a fighter pinned +// against that wall still has to be able to reach the fruit from a jump. One +// function owns the geometry so the picture and the pickup test agree. +function treeFruit(tree) { + const toward = tree.x < (worldLeft + worldRight) / 2 ? 1 : -1; + // Cube-scale tree. The tower's tree leaned three tiles into a room that + // had thirty; the same lean in a ten-tile cube put ripe fruit inside a + // spawn-idle fighter's reach, and two fighters who never moved wound the + // clock back fifteen seconds every eighteen — no round could end. This + // tree climbs about two tiles of wall, leans under one tile in, and hangs + // its fruit high enough that picking it is a jump at the wall, never a + // side effect of standing near one. + const reach = 45 + 150 * tree.growth; + return { x: tree.x + toward * (reach * .35 + 30), y: tree.y - reach * 1.3, + z: tree.z, toward, reach, + tipX: tree.x + toward * reach * .5, tipY: tree.y - reach * .9 }; +} + +function updateBodyTrees(dt, now) { + const poseTime = (now - startedAt) / 1000000; + for (const tree of bodyTrees) { + // One harvest a round, said out loud. Eighteen seconds of ripening against + // a thirty second round used to say it on its own, and the padded room's + // quarter-pipe said it again by holding the fruit a wall's height above a + // standing fighter. The tower's floor is flat, which put the fruit back + // inside arm's reach — and two fighters then stood at the wall winding + // fifteen seconds off the clock every eighteen, so the round could not + // end. A round that cannot end is worse than a body that stays broken. + if (tree.spent) continue; + if (tree.growth < 1) { + tree.growth = Math.min(1, tree.growth + dt * 1000000 / treeRipenUs); + continue; + } + const fruit = treeFruit(tree); + for (const player of players) { + if (!player.alive) continue; + // A tile and a third — a hand up at the fruit, not the whole corner of + // the room. Sized with treeFruit above so a spawn-mark idler stays out + // of range; the two limits only hold together. + if (runnerDistanceToPoint(player, poseTime, fruit.x, fruit.y, fruit.z) > 120) + continue; + tree.growth = 0; + tree.spent = true; + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + roundElapsedUs = Math.max(0, roundElapsedUs - treeTimeBonusUs); + remember(player, "NEW BODY"); + playDrum("bell", 1.15, panPlayer(player)); + emitSignal("powerup", player.pad, 3, treeTimeBonusUs / 1000000); + break; + } + } +} + +function drawBodyTree(tree, t) { + const scale = cameraScale(); + const ripe = tree.growth >= 1; + // Unripe reads as a sapling rather than a dimmed icon: the trunk and canopy + // are literally shorter, so the stage tells you how long the walk can wait. + const { x: fruitX, y: fruitY, toward, tipX, tipY: crownY } = treeFruit(tree); + const sway = Math.sin(t * 1.4 + tree.x * .0007) * (3 + 9 * tree.growth); + const bark = mixColor([120, 92, 64], [58, 46, 38], visualTheme.light); + const leaf = ripe + ? mixColor([120, 226, 138], [46, 150, 84], visualTheme.light) + : mixColor([96, 140, 104], [44, 84, 60], visualTheme.light); + const tipY = crownY + sway; + worldCapsule(tree.x, tree.y, tree.z, tipX, tipY, tree.z, + Math.max(2, (11 + 9 * tree.growth) * scale), bark); + // Canopy sized with treeFruit's cube-scale lean: fronds stay under a tile + // long so the tree dresses its wall without reaching into the fight. + for (const spread of [-1, -.35, .35, 1]) { + worldCapsule(tipX, tipY, tree.z, + tipX + toward * (30 + 45 * tree.growth), + tipY + spread * (30 + 35 * tree.growth), tree.z, + Math.max(2, (8 + 8 * tree.growth) * scale), leaf); + } + if (!ripe) return; + // The fruit is the part you aim at, so it only exists once it can be taken. + const point = projectPoint(fruitX, fruitY + sway, tree.z); + filledDisc(point.x, point.y, Math.max(3, 46 * scale), + mixColor([236, 108, 132], [188, 62, 92], visualTheme.light)); +} + +function updatePowerups(now) { + while (roundElapsedUs >= nextPowerupAtUs) { + // Only the slot marked `cycle` is the rotation's business. Asking whether + // ANY gun pickup is on the map would let an untouched space laser sitting + // on the top deck stall the pistol reload for the whole round. + const pickup = gunPickups.find((slot) => slot.cycle); + // Authored maps may intentionally have no replenishing weapon. + if (pickup && !pickup.active) { + // The cycle's whole job is to keep six more rounds of ammo appearing + // somewhere worth crossing the station for — the corner tiles, + // alternating, so the reload never lives on one fighter's side. + pickup.active = true; + pickup.x = tileCenterX(powerupSequence % 2 === 0 + ? cornerColLeft : cornerColRight); + pickup.z = 0; + beginPickupDrop(pickup); + powerupSequence += 1; + emitSignal("powerup", -1, powerupSequence, nextPowerupAtUs / 1000000); + playDrum("clap", .9, 0); + } + nextPowerupAtUs += powerupIntervalUs; + } + updateGunPickups(now); + updateSaberPickups(now); + updateGrenadePickups(now); +} + +// Ghost trails map a ricochet's whole path. The fixed length is the entire +// point: shots here have no clock-based expiry, they bounce until they hit +// somebody, so a trail that grew with flight time would be the eleven-frames-a +// -second stray all over again — measured in line segments instead of terrain +// span. A ring buffer costs the same on the thousandth bounce as on the first. +// +// Sampling every third tick buys three times the arc for the same sixteen +// points, and a bounce records out of turn so the corner lands on the wall +// rather than being chorded through it. +const bulletTrailPoints = 12; +const bulletTrailStride = 4; + +function recordBulletTrail(bullet) { + if (!bullet.trail) { + // One allocation at birth, never per frame. + bullet.trail = new Array(bulletTrailPoints * 2).fill(0); + bullet.trailCount = 0; + } + const slot = (bullet.trailCount % bulletTrailPoints) * 2; + bullet.trail[slot] = bullet.x; + bullet.trail[slot + 1] = bullet.y; + bullet.trailCount++; +} + +function updateBullets(dt, now, combat = true) { + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + bullet.vx += windAcceleration * .12 * dt; + // A glob is a ball, not a round: gravity pulls the toss back down, and it + // dries out in flight rather than flying forever. The gravity is soft on + // purpose — the lob should hang for over a second, analog and watchable. + if (bullet.spit) { + bullet.vy += 700 * dt; + bullet.life -= dt * .22; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + continue; + } + } + bullet.previousX = bullet.x; + bullet.previousY = bullet.y; + bullet.x += bullet.vx * dt; + bullet.y += bullet.vy * dt; + // Held so the ricochets below can be spotted by the sign they flip. + const enteredVx = bullet.vx; + const enteredVy = bullet.vy; + // A laser bolt does not ricochet. Everything else in this game's ballistics + // is built on the opposite rule — "shots have no clock-based expiry, arena + // surfaces ricochet them so a long-travelling round remains part of the + // fight" — and that rule is what makes the pistol frightening in a closed + // room. The bolt is the other half of the pair: four of them, travelling + // more than twice as fast, each spent outright the moment it touches + // anything. Fast and honest against slow and haunting, and a laser miss is + // a miss for good. + if (bullet.laser && (bullet.x - 24 <= worldLeft + wallThickness || + bullet.x + 24 >= worldRight - wallThickness || + (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) || + bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness)) { + bullet.life = 0; + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .14, duration: .14, death: false, explosion: false }); + playDrum("hat", 1.4, panAt(bullet.x, bullet.z)); + continue; + } + // Shots have no clock-based expiry. Arena surfaces ricochet them so a + // long-travelling round remains part of the fight until contact. + if (bullet.x - 24 <= worldLeft + wallThickness) { + bullet.x = worldLeft + wallThickness + 24; + bullet.vx = Math.abs(bullet.vx); + } else if (bullet.x + 24 >= worldRight - wallThickness) { + bullet.x = worldRight - wallThickness - 24; + bullet.vx = -Math.abs(bullet.vx); + } + if (!airRoundActive() && bullet.y - 24 <= ceilingY + wallThickness) { + bullet.y = ceilingY + wallThickness + 24; + bullet.vy = Math.abs(bullet.vy); + } else if (bullet.y + 24 >= terrainFloorAt(bullet.x) - wallThickness) { + bullet.y = terrainFloorAt(bullet.x) - wallThickness - 24; + if (bullet.spit) { + // A bouncing ball, not a ricochet: each bounce keeps half the height + // and costs a bite of the glob, and once the bounce is too small to + // read it dissipates where it lies instead of buzzing along the floor. + bullet.vy = -Math.abs(bullet.vy) * .56; + bullet.vx *= .84; + bullet.life -= .18; + if (Math.abs(bullet.vy) < 90) bullet.life = 0; + if (bullet.life <= 0) { + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .16, duration: .16, death: false, explosion: false }); + } else playDrum("hat", .3, panAt(bullet.x, bullet.z)); + // A splash bounces any bodyless head standing in it — including the + // spitter's own, so spitting straight down is a little hop. Popcorn + // physics for the intimate spit fight. + for (const target of players) { + if (!target?.alive || !isHeadOnly(target)) continue; + if (Math.abs(target.x - bullet.x) > 70 || + Math.abs(target.y - bullet.y) > 90) continue; + target.vy = Math.min(target.vy, 0) - 240; + target.grounded = false; + } + } else bullet.vy = -Math.abs(bullet.vy); + } + // A bounce is worth a point of its own: on the stride alone the segment + // spanning a ricochet would cut the corner straight through the wall. + if (bullet.vx !== enteredVx || bullet.vy !== enteredVy || + bullet.trailTick === undefined) { + bullet.trailTick = 0; + recordBulletTrail(bullet); + } else if (++bullet.trailTick % bulletTrailStride === 0) + recordBulletTrail(bullet); + } + for (let left = 0; left < bullets.length; left++) { + const a = bullets[left]; + if (a.life <= 0) continue; + for (let right = left + 1; right < bullets.length; right++) { + const b = bullets[right]; + if (b.life <= 0 || a.owner === b.owner) continue; + if (Math.abs(a.x - b.x) <= 96 && Math.abs(a.y - b.y) <= 52 && + Math.abs(a.z - b.z) <= 48) { + a.life = 0; + b.life = 0; + spawnImpact({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, + z: (a.z + b.z) / 2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", 1, 0); + emitSignal("cancel", -1, a.owner, b.owner); + break; + } + } + } + if (!combat) return; + const poseTime = (now - startedAt) / 1000000; + for (const bullet of bullets) { + if (bullet.life <= 0) continue; + const shot = { x1: bullet.previousX ?? bullet.x, + y1: bullet.previousY ?? bullet.y, z1: bullet.z, + x2: bullet.x, y2: bullet.y, z2: bullet.z, width: 48 }; + for (const fragment of detachedParts) { + if (fragment.owner === bullet.owner && now < bullet.safeUntil) continue; + const contact = segmentSegmentClosest(shot, fragment); + if (contact.distance > (shot.width + fragment.width) / 2) continue; + const impulse = bullet.heavy ? 1500 : bullet.spit ? 900 : 1200; + fragment.vx += Math.sign(bullet.vx || 1) * impulse; + fragment.vy -= bullet.heavy ? 520 : 300; + fragment.owner = bullet.owner; + fragment.hitAfter = now + 120000; + bullet.life = 0; + spawnImpact({ x: contact.secondPoint.x, y: contact.secondPoint.y, + z: contact.secondPoint.z, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("hat", .72, panAt(fragment.x1, fragment.z1)); + break; + } + if (bullet.life <= 0) continue; + const targets = [...players.filter((player) => player.pad !== bullet.owner), players[bullet.owner]]; + for (const target of targets) { + if (!target?.alive || (target.pad === bullet.owner && now < bullet.safeUntil)) + continue; + // Reflect across the circular shield's local surface normal. A square hit + // returns home; a glancing hit leaves at the corresponding ricochet angle. + // Flipping `owner` lets the returned shot hurt whoever fired it. + if (target.blocking) { + const shield = shieldGeometry(target); + const guard = sampleCombatBoxes(target,now,null,false).guard[0]; + if (guard && segmentBoxEntry({x1:bullet.previousX??bullet.x,y1:bullet.previousY??bullet.y, + z1:bullet.z,x2:bullet.x,y2:bullet.y,z2:bullet.z},guard,24)!==null) { + let nx = bullet.x - shield.x; + let ny = bullet.y - shield.y; + const normalLength = Math.hypot(nx, ny); + if (normalLength > .001) { + nx /= normalLength; + ny /= normalLength; + } else { + const speed = Math.hypot(bullet.vx, bullet.vy) || 1; + nx = -bullet.vx / speed; + ny = -bullet.vy / speed; + } + const normalVelocity = bullet.vx * nx + bullet.vy * ny; + bullet.vx -= 2 * normalVelocity * nx; + bullet.vy -= 2 * normalVelocity * ny; + bullet.x = shield.x + nx * (shield.radius + 25); + bullet.y = shield.y + ny * (shield.radius + 25); + bullet.owner = target.pad; + bullet.life = Math.max(bullet.life, .55); + spawnImpact({ x: bullet.x, y: bullet.y, z: bullet.z, + life: .18, duration: .18, death: false, explosion: false }); + breakShield(target, now); + emitSignal("ballblock", target.pad, 1, 0); + continue; + } + } + const contact = sweptProjectileContact([{ + x1: bullet.previousX ?? bullet.x, y1: bullet.previousY ?? bullet.y, + z1: bullet.z, x2: bullet.x, y2: bullet.y, z2: bullet.z, + width: 48, role: "bullet", part: "bullet", + }], target, poseTime); + if (contact && contact.separation <= 3) { + const pointContact = runnerContactToPoint(target, poseTime, + bullet.x, bullet.y, bullet.z); + const endpointHit = Math.min(pointContact.headDistance, + pointContact.bodyDistance) <= 24; + const headshot = endpointHit + ? pointContact.headDistance <= pointContact.bodyDistance + : contact.headshot; + const segmentIndex = endpointHit && !headshot + ? pointContact.segmentIndex : contact.segmentIndex; + bullet.life = 0; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: headshot, + explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + if (headshot) + killPlayer(target, bullet.owner, now, "SHOT"); + else { + applyBodyHit(target, segmentIndex, + bullet.x - bullet.vx, bullet.owner, now, + bullet.heavy ? 1680 : bullet.spit ? 920 : 1180, + bullet.heavy ? 260 : bullet.spit ? 90 : 125); + playDrum("block", .9, panPlayer(target)); + } + break; + } + } + } + for (let index = bullets.length - 1; index >= 0; index--) + if (bullets[index].life <= 0) bullets.splice(index, 1); +} + +function updateGrenades(dt, now, combat = true) { + for (const grenade of grenades) { + if (!grenade.alive) continue; + if (grenade.exploding) { + grenade.blastAge += dt; + grenade.blastRadius = grenadeBlastRadius * + Math.min(1, grenade.blastAge / grenadeBlastDuration); + const poseTime = (now - startedAt) / 1000000; + for (const player of combat ? players : []) { + if (!player.alive || (grenade.hitPlayers & (1 << player.pad))) continue; + const contact = runnerContactToPoint(player, poseTime, + grenade.x, grenade.y, grenade.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > + grenade.blastRadius) continue; + grenade.hitPlayers |= 1 << player.pad; + if (contact.headDistance <= grenade.blastRadius) + killPlayer(player, grenade.owner, now, "BLASTED"); + else { + const blastForce = 1250 + 850 * + (1 - clamp(contact.bodyDistance / grenadeBlastRadius, 0, 1)); + applyBodyHit(player, contact.segmentIndex, grenade.x, + grenade.owner, now, blastForce, 300); + } + } + if (grenade.blastAge >= grenadeBlastDuration) grenade.alive = false; + continue; + } + const previousY = grenade.y; + if (!grenade.rocket) { + grenade.vx += windAcceleration * .45 * dt; + grenade.vy += 1800 * dt; + } + grenade.x += grenade.vx * dt; + grenade.y += grenade.vy * dt; + grenade.fuse -= dt; + if (grenade.rocket) { + const poseTime = (now - startedAt) / 1000000; + for (const target of combat ? players : []) { + if (!target.alive || target.pad === grenade.owner) continue; + if (runnerDistanceToPoint(target, poseTime, + grenade.x, grenade.y, grenade.z) > 34) continue; + grenade.fuse = 0; + break; + } + } + const inset = wallThickness + 35; + if (grenade.x < worldLeft + inset) { + grenade.x = worldLeft + inset; + grenade.vx = Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } else if (grenade.x > worldRight - inset) { + grenade.x = worldRight - inset; + grenade.vx = -Math.abs(grenade.vx) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + if (!airRoundActive() && grenade.y < ceilingY + inset) { + grenade.y = ceilingY + inset; + grenade.vy = Math.abs(grenade.vy) * .65; + if (grenade.rocket) grenade.fuse = 0; + } + const ledge = grenade.vy >= 0 && + ledgeCrossed(grenade.x, previousY, grenade.y, 30); + if (ledge) { + grenade.y = ledge.y - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + } else if (grenade.y >= terrainFloorAt(grenade.x) - 30) { + grenade.y = terrainFloorAt(grenade.x) - 30; + grenade.vy = -Math.abs(grenade.vy) * .55; + grenade.vx *= .82; + if (grenade.rocket) grenade.fuse = 0; + } + if (grenade.fuse <= 0) { + grenade.exploding = true; + grenade.blastAge = 0; + grenade.blastRadius = 0; + grenade.vx = 0; + grenade.vy = 0; + playDrum("kick", 1.25, panPlayer(players[grenade.owner])); + emitSignal("blast", grenade.owner, + grenade.x / worldRight, grenade.y / floorY); + } + } + for (let index = grenades.length - 1; index >= 0; index--) + if (!grenades[index].alive) grenades.splice(index, 1); +} + +function startMelee(player, kind, now) { + if (isHeadOnly(player) || isPogo(player)) return; + // Every fresh press starts a strike, including during the previous swing. + // updatePlayer detects the edge; holding a button does not auto-repeat. + const spec = meleeSpecs[kind]; + if (!spec) return; + const attackingPart = kind === "KICK" + ? player.facing > 0 ? "right-leg" : "left-leg" + : itemHand(player); + if (!hasPart(player, attackingPart)) return; + player.attackKind = kind; + player.lowKick = kind === "KICK" && + (player.ducking || (player.crouchBlend || 0) > .35); + player.attackStartedAt = now; + player.attackUntil = now + spec.windowUs; + player.attackHit = false; + player.attackMomentum = now < player.dashUntil + ? clamp(Math.abs(player.vx) / walkSpeed, 1.35, 2.25) : 1; + player.stance = "ATTACK"; + player.pendingMoveLabel = kind; + playDrum(spec.cue[0], spec.cue[1], panPlayer(player)); + emitSignal(kind.toLowerCase(), player.pad, player.facing, 0); +} + +const limbParts = ["left-arm", "right-arm", "left-leg", "right-leg"]; +const spiderLegParts = Array.from({ length: 8 }, (_, index) => + `spider-leg-${index + 1}`); +const hasPart = (player, part) => !player.removedParts?.includes(part); +const isPogo = (player) => hasPart(player, "torso") && + limbParts.every((part) => !hasPart(player, part)); +const isHeadOnly = (player) => !hasPart(player, "torso"); +const availableArm = (player) => { + const lead = player.facing > 0 ? "right-arm" : "left-arm"; + if (hasPart(player, lead)) return lead; + const other = lead === "right-arm" ? "left-arm" : "right-arm"; + return hasPart(player, other) ? other : ""; +}; +// Ownership stays attached to the arm that picked the object up; turning or +// boarding cannot teleport a gun between hands. +const itemHand = (player) => player.itemArm || availableArm(player); +// Gun before grenade, always: the pistol is the sustained item and the one +// drawn in the hand, so "use what you are holding" needs no mode toggle. +const heldItem = (player) => + isHeadOnly(player) ? player.gunAmmo > 0 ? "GUN" : "" + : isPogo(player) || !itemHand(player) || !hasPart(player, itemHand(player)) + ? "" : player.gunAmmo > 0 ? "GUN" + : player.grenadeAmmo > 0 ? "GRENADE" : ""; +const itemSwinging = (player, now) => + (player.attackKind === "WHIP" || player.attackKind === "BASH") && + meleePulse(player, now) > 0; + +function meleePulse(player, now) { + if (now >= player.attackUntil || player.attackUntil <= player.attackStartedAt) return 0; + const phase = (now - player.attackStartedAt) / + (player.attackUntil - player.attackStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +// Collision starts on the input frame and lasts through the original short +// swing. A landed strike still hits only once; another tap starts a new one. +const meleeFrames = { + PUNCH: { startup: 0, active: 14, recovery: 0 }, + KICK: { startup: 0, active: 14, recovery: 0 }, + WHIP: { startup: 0, active: 12, recovery: 0 }, + BASH: { startup: 0, active: 17, recovery: 0 }, +}; +function meleeFrame(player, now) { + const timing = meleeFrames[player.attackKind]; + if (!timing || now < player.attackStartedAt || now >= player.attackUntil) + return { frame: 0, phase: 'neutral', startup: 0, active: 0, recovery: 0 }; + const frame = Math.floor((now - player.attackStartedAt) / replayTickUs + 1e-7) + 1; + return { ...timing, frame, phase: frame <= timing.startup ? 'startup' + : frame <= timing.startup + timing.active ? 'active' : 'recovery' }; +} + +function meleeTarget(player, now) { + const pulse = meleePulse(player, now); + const spec = meleeSpecFor(player, player.attackKind); + const lowKick = player.attackKind === "KICK" && player.lowKick; + const reachX = player.x + player.facing * (spec.reach + spec.swell * pulse); + // A low kick sweeps the ground in front of the kicker — the ground he is + // standing on. The bare terrain probe read the arena floor, so a low kick + // thrown on a rung aimed a storey down through the rung it stood on. + const sweepY = lowKick + ? Math.min(surfaceYAt(reachX, player.y), player.y + 20) - 5 : 0; + return { + x: player.x + player.facing * (spec.reach + spec.swell * pulse + + (lowKick ? 34 * pulse : 0)), + y: lowKick ? sweepY : player.y - (player.attackKind !== 'KICK' && + (player.ducking || player.crouchBlend > .35) ? 68 : spec.height), + z: player.z, + }; +} + +function itemActionPulse(player, now) { + if (!player.itemAction || now >= player.itemActionUntil) return 0; + const phase = (now - player.itemActionStartedAt) / + Math.max(1, player.itemActionUntil - player.itemActionStartedAt); + return Math.sin(clamp(phase, 0, 1) * Math.PI); +} + +function itemHandTarget(player, now) { + // A surviving head grips the pistol at the mouth. It can still aim and fire, + // but grenades and melee weapons remain limb-dependent. + if (isHeadOnly(player)) return { + x: player.x + player.facing * 18, + y: player.y - 20, z: player.z, + }; + // A swung weapon rides the striking hand, so the drawn pistol or grenade + // sits on the live attack capsule instead of floating out in front. + if (itemSwinging(player, now)) return meleeTarget(player, now); + const pulse = itemActionPulse(player, now); + if (player.itemAction === "THROW") return { + x: player.x + player.facing * (42 + 52 * pulse), + y: player.y - 118 - 52 * pulse, z: player.z, + }; + if (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil)) { + const aimX = player.gunAimX || player.facing; + const aimY = player.gunAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { x: player.x + aimX / length * 108, + y: player.y - 102 + aimY / length * 92, z: player.z }; + } + return { x: player.x + player.facing * 108, + y: player.y - 115, z: player.z }; +} + +function itemForearm(player, geometry) { + const arm = itemHand(player); + return geometry.segments.find(segment => segment.part === arm && + (segment.role === "item-forearm" || segment.role === "attack-forearm")) || + geometry.segments.find(segment => segment.part === arm && + segment.role?.endsWith("forearm")); +} + +function gunPose(player, now, input = null) { + let aimX = input?.horizontal || player.facing; + let aimY = input ? -input.vertical : 0; + if (!input && (player.itemAimLocked || player.gunAimLive || + (player.itemAction === "FIRE" && now < player.itemActionUntil))) { + aimX = player.gunAimX || player.facing; + aimY = player.gunAimY || 0; + } + const length = Math.hypot(aimX, aimY) || 1; + const dx = aimX / length; + const dy = aimY / length; + // The arm solver can clamp its reach, and skating rotates/translates the + // whole skeleton. Use its solved wrist rather than the untransformed aim + // target for both the held weapon and the projectile's muzzle. + const forearm = !isHeadOnly(player) && itemForearm(player, + player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, (now - startedAt) / 1000000)); + const hand = forearm ? {x:forearm.x2, y:forearm.y2, z:forearm.z2} + : itemHandTarget(player, now); + return { + hand, dx, dy, + muzzle: { x: hand.x + dx * 54, y: hand.y + dy * 54, z: hand.z }, + }; +} + +function meleeStrike(player, now) { + const target = meleeTarget(player, now); + return { + x: target.x, y: target.y, z: target.z, + radius: meleeSpecFor(player, player.attackKind).radius, + }; +} + +function shieldGeometry(player) { + const aimX = player.shieldAimX || player.facing; + const aimY = player.shieldAimY || 0; + const length = Math.hypot(aimX, aimY) || 1; + return { + x: player.x + aimX / length * shieldForward, + y: player.y - (player.shieldCrouched ? 58 : 90) - + aimY / length * shieldForward, + z: player.z, + radius: shieldRadius, + }; +} + +// A shield is spent the moment it does its job. It eats exactly one hit, then +// drops — and `shieldLocked` keeps a still-held B from raising it again on the +// very next frame, which is what turns the break into a real opening instead +// of a flicker nobody can see. The shielder is deliberately left free to act: +// breaking the shield is what buys them the swing. +function breakShield(player, now) { + player.blocking = false; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blockFlash = 1; + player.stance = "SHIELD BREAK"; + player.pendingMoveLabel = "SHIELD BREAK"; + playDrum("bell", 1, panPlayer(player)); + emitSignal("shieldbreak", player.pad, 1, 0); +} + +// Stun scales with what the shield ate, so a BASH buys a longer punish than a +// WHIP. The floor is still long enough to answer at 60fps (~8 frames) and the +// ceiling short enough (~18) that a blocked attacker is opened, not deleted. +function shieldStunUs(force) { + return Math.round(140000 + clamp((force - 1000) / 750, 0, 1) * 160000); +} + +function returnBall(ball, player, now, shielded, intensity = 1) { + const incomingVx = ball.vx; + const incomingVy = ball.vy; + const direction = ball.x >= player.x ? 1 : -1; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const response = ball.hitScale || 1; + const momentum = shielded ? 1 : player.attackMomentum || 1; + const normalSpeed = (currentSpeed * 1.34 + 720) * intensity * + momentum * response; + const shieldMinimum = (1800 + clamp(intensity, 0, 1) * 1000) * response; + const speed = shielded + ? Math.min(4200 * response, Math.max(shieldMinimum, normalSpeed * 1.65)) + : Math.min(4800, normalSpeed); + ball.vx = direction * speed; + const lift = shielded ? .72 : player.inputY > 0 ? .58 + : player.attackKind === "KICK" ? .34 : .2; + ball.vy = -speed * lift; + ball.x = player.x + direction * (ball.radius + 85); + ball.y = Math.min(ball.y, player.y - 55); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 140000; + ball.safePlayers = 1 << player.pad; + if (!shielded) { + player.attackHit = true; + player.lastButton = "WACK"; + player.lastButtonAt = now; + } + else { + player.blockFlash = 1; + player.knockVx += incomingVx * .55; + player.vy = Math.min(player.vy + incomingVy * .16, -Math.max(520, speed * .28)); + player.grounded = false; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .22, duration: .22, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum(shielded ? "block" : "clap", shielded ? 1.1 : 1.25, + panAt(ball.x, ball.z)); + emitSignal(shielded ? "ballblock" : "wack", player.pad, + direction, Math.round(speed)); +} + +function crossWackBall(ball, hitters, now) { + const first = hitters[0]; + const second = hitters[1]; + const fighterDistance = Math.abs(first.player.x - second.player.x); + const convergence = clamp(1 - fighterDistance / 520, 0, 1); + const contact = (first.contact + second.contact) * .5; + const currentSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.min(7600, (4100 + currentSpeed * .72 + + convergence * 2300 + contact * 900) * (ball.hitScale || 1)); + const stronger = first.contact >= second.contact ? first.player : second.player; + const direction = Math.sign(ball.vx) || stronger.facing || 1; + ball.vx = direction * speed; + ball.vy = -speed * (.3 + convergence * .18); + ball.x += direction * 35; + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 8); + ball.lastHitBy = -1; + ball.safeUntil = now + 180000; + ball.safePlayers = 3; + for (const hit of hitters) { + hit.player.attackHit = true; + hit.player.lastButton = "CROSS WACK"; + hit.player.lastButtonAt = now; + } + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .32, duration: .32, death: false, explosion: true }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("clap", 1.55, panAt(ball.x, ball.z)); + emitSignal("crosswack", -1, direction, Math.round(speed)); +} + +function bootBall(ball, player, now) { + // Walking contact carries the grounded ball in the player's travel + // direction. A melee strike remains the intentionally stronger launch. + const direction = Math.sign(player.vx) || Math.sign(ball.x - player.x) || + player.facing || 1; + const dashing = now < player.dashUntil && Math.abs(player.dashVx) > walkSpeed; + const speed = Math.min(dashing ? 2600 : 1450, + (420 + Math.abs(player.vx) * (dashing ? .58 : .32)) * + (ball.hitScale || 1)); + ball.vx = direction * speed; + ball.vy = -Math.max(dashing ? 420 : 80, speed * (dashing ? .24 : .06)); + ball.x = player.x + direction * (ball.radius + 58); + ball.y = Math.min(ball.y, terrainFloorAt(ball.x) - ball.radius - 2); + ball.lastHitBy = player.pad; + ball.safeUntil = now + 180000; + ball.safePlayers = 1 << player.pad; + player.lastButton = dashing ? "DASH BOOT" : "BOOT"; + player.lastButtonAt = now; + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("kick", 1.12, panAt(ball.x, ball.z)); + emitSignal("boot", player.pad, direction, Math.round(speed)); +} + +function bounceBallOffBody(ball, player, now, segmentIndex = -1) { + const direction = Math.sign(ball.x - player.x) || -Math.sign(ball.vx) || + player.facing || 1; + const incomingSpeed = Math.hypot(ball.vx, ball.vy); + const speed = Math.max(760, Math.min(3600, incomingSpeed * .86 / + Math.sqrt(ball.mass || 1))); + ball.vx = direction * speed; + ball.vy = -Math.max(260, Math.abs(ball.vy) * .42 + speed * .12); + ball.x += direction * (ball.radius + 18); + ball.lastHitBy = player.pad === 0 ? 1 : 0; + ball.safeUntil = now + 160000; + ball.safePlayers = 1 << player.pad; + applyBodyHit(player, segmentIndex, ball.x - ball.vx, + ball.lastHitBy, now, 760, 110, false); + spawnImpact({ x: ball.x, y: ball.y, z: ball.z, + life: .16, duration: .16, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 300000); + playDrum("block", .82, panAt(ball.x, ball.z)); + emitSignal("bodybounce", player.pad, direction, Math.round(speed)); +} + +function updateBall(ball, dt, now) { + // A popped ball is gone, not retired — a crater should cost the round its + // ball for a moment, not for good. It re-inflates over the middle once its + // serve time comes round. + if (!ball.active && ballEnabled && ball.serveAt && now >= ball.serveAt) { + ball.active = true; + // Re-inflate on the far side from wherever it popped, so the fighter who + // owned the ball's exit does not also own its return. + ball.x = ball.x > centerX + ? tileCenterX(cornerColLeft + 1) : tileCenterX(cornerColRight - 1); + ball.y = ceilingY + ball.radius + 120; + ball.z = 0; + ball.vx = 0; + ball.vy = 0; + ball.rotation = 0; + ball.lastHitBy = -1; + ball.safeUntil = now + 250000; + ball.safePlayers = 0; + emitSignal("ballserve", -1, 0, 0); + } + if (!ball.active || now < ball.serveAt) return; + if (ball.heldBy >= 0) { + const carrier = players[ball.heldBy]; + if (!carrier?.alive || carrier.heldBall !== balls.indexOf(ball)) { + ball.heldBy = -1; + } else { + ball.x = carrier.x + carrier.facing * (ball.radius + 54); + ball.y = carrier.y - (carrier.ducking ? 58 : 94); + ball.z = carrier.z - 6; + ball.vx = carrier.vx; + ball.vy = carrier.vy; + return; + } + } + const isBoard = ball.type === "skateboard"; + const contactRadius = isBoard ? skateAxleDrop + skateWheelRadius : ball.radius; + const platformSupported = ledgeSupports(ball.x, ball.y, contactRadius); + const floorSupported = ball.y >= terrainFloorAt(ball.x) - contactRadius - 2; + const grounded = (platformSupported || floorSupported) && Math.abs(ball.vy) < 180; + if (!grounded) ball.vx += windAcceleration * (ball.windFactor || .45) * dt; + ball.vy += 1900 * (ball.gravityFactor || 1) * dt; + const previous = { x: ball.x, y: ball.y, z: ball.z }; + ball.x += ball.vx * dt; + ball.y += ball.vy * dt; + if (Math.abs(ball.vx) > 20) { + if (isBoard) ball.skateSpin = (ball.skateSpin || 0) + ball.vx * dt / skateWheelRadius; + else ball.rotation += ball.vx * dt / Math.max(1, contactRadius); + } + const inset = wallThickness + contactRadius; + if (ball.x < worldLeft + inset) { + ball.x = worldLeft + inset; + ball.vx = Math.abs(ball.vx); + } else if (ball.x > worldRight - inset) { + ball.x = worldRight - inset; + ball.vx = -Math.abs(ball.vx); + } + if (!airRoundActive() && ball.y < ceilingY + inset) { + ball.y = ceilingY + inset; + ball.vy = Math.abs(ball.vy); + } + const ledge = ball.vy >= 0 && + ledgeCrossed(ball.x, previous.y, ball.y, contactRadius, contactRadius); + if (ledge) { + ball.y = ledge.y - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .58) : 0; + ball.vx *= ball.drag || .992; + } else if (ball.y > terrainFloorAt(ball.x) - contactRadius) { + ball.y = terrainFloorAt(ball.x) - contactRadius; + ball.vy = Math.abs(ball.vy) > 180 + ? -Math.abs(ball.vy) * (ball.bounce || .62) : 0; + ball.vx *= ball.drag || .992; + } + const onSurface = (ledgeSupports(ball.x, ball.y, contactRadius) || + ball.y >= terrainFloorAt(ball.x) - contactRadius - 2) && Math.abs(ball.vy) < 180; + if (isBoard && onSurface) { + const contact = skateContact(ball.x, previous.y + contactRadius); + ball.y = contact.y - contactRadius; + ball.rotation = contact.pitch; + const slope = Math.tan(contact.pitch); + ball.vx += fallGravity() * slope / (1 + slope * slope) * dt; + ball.vx *= Math.exp(-dt * .65); + } + const poseTime = (now - startedAt) / 1000000; + const hitters = []; + // The head test below sweeps from `previous`, so the reach margin carries + // this tick's travel as well as the ball's radius. + const travel = Math.hypot(ball.x - previous.x, ball.y - previous.y); + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + const boxes = sampleCombatBoxes(player, now, null, false); + for (const strike of boxes.hit) { + const distance = pointBoxDistance(strike, ball.x, ball.y, ball.z); + if (distance <= ball.radius) { + hitters.push({ player, contact: clamp(1-distance/ball.radius,0,1) }); break; + } + } + } + if (hitters.length >= 2) { + crossWackBall(ball, hitters, now); + return; + } + if (hitters.length === 1) { + returnBall(ball, hitters[0].player, now, false, + .92 + hitters[0].contact * .38); + return; + } + for (const player of players) { + if (!player.alive || ((ball.safePlayers & (1 << player.pad)) && + now < ball.safeUntil)) + continue; + if (!nearRunner(player, ball.x, ball.y, ball.z, ball.radius + travel)) continue; + if (player.blocking) { + const guard = sampleCombatBoxes(player, now, null, false).guard[0]; + const distance = guard ? pointBoxDistance(guard, ball.x, ball.y, ball.z) : Infinity; + if (distance <= ball.radius) { + const shield = shieldGeometry(player); + const proximity = clamp(1-Math.max(0,Math.hypot(ball.x-shield.x, + ball.y-shield.y,ball.z-shield.z)-ball.radius)/shield.radius,0,1); + returnBall(ball, player, now, true, proximity); + return; + } + } + const headBox = sampleCombatBoxes(player,now,null,false).hurt.find(b=>b.part==='head'); + const currentHeadDistance = pointBoxDistance(headBox,ball.x,ball.y,ball.z); + const sweptHeadDistance = segmentBoxEntry( + { x1: previous.x, y1: previous.y, z1: previous.z, + x2: ball.x, y2: ball.y, z2: ball.z },headBox,ball.radius)!==null ? 0 : Infinity; + const headDistance = Math.min(currentHeadDistance, sweptHeadDistance); + const bodyContact = runnerContactToPoint(player, poseTime, + ball.x, ball.y, ball.z); + const bodyDistance = bodyContact.bodyDistance; + if (Math.min(headDistance, bodyDistance) > ball.radius) continue; + if (ball.type === "skateboard" && headDistance > ball.radius && + bodyDistance <= ball.radius && !player.skateboard && + // A thrown deck is a weapon until it slows down — nobody catches a + // board shot out of the air with their shins. + Math.hypot(ball.vx, ball.vy) < 900) { + resetSkate(player); + player.skateboard = true; + ball.riderPad = player.pad; + player.skateVx = player.vx; + player.skatePitch = skateContact(player.x, player.y).pitch; + ball.active = false; + ball.heldBy = -1; + player.lastButton = "SKATEBOARD"; + player.lastButtonAt = now; + playDrum("clap", .9, panPlayer(player)); + emitSignal("skate-mount", player.pad, 1, 0); + return; + } + const runningContact = player.grounded && Math.abs(player.vx) > 40 && + (onSurface || ball.y >= player.y - ball.radius - 55); + if (runningContact) { + bootBall(ball, player, now); + return; + } + if (headDistance <= ball.radius) { + const sourcePad = ball.lastHitBy >= 0 && ball.lastHitBy !== player.pad + ? ball.lastHitBy : player.pad === 0 ? 1 : 0; + dismountSkateboard(player, now); + damageAllLimbs(player, ball.x - ball.vx, sourcePad, now); + bounceBallOffBody(ball, player, now, -1); + player.lastButton = "HEAD HIT"; + player.lastButtonAt = now; + return; + } + bounceBallOffBody(ball, player, now, bodyContact.segmentIndex); + return; + } +} + +// Returns whether the tap was spent on a double-tap move, so a single tap can +// still mean something else to the caller. +function directionTap(player, direction, now) { + const previousTap = player.lastTap[direction] || -10000000; + const releasedAt = player.lastRelease[direction] || -10000000; + player.lastTap[direction] = now; + if (now - previousTap > doubleTapUs || releasedAt <= previousTap || + now - releasedAt < doubleTapReleaseUs) return false; + player.lastTap[direction] = -10000000; + player.pendingMoveLabel = direction === "UP" ? "ULTRA AIR" : "DASH " + direction; + playDrum("clap", 1.05, panPlayer(player)); + if (direction === "UP") { + player.vy = -ultraJumpVelocity; + player.grounded = false; + player.jumpHeld = false; + emitSignal("ultrajump", player.pad, 1, 0); + } else if (direction === "DOWN") { + if (player.skateboard && !player.grounded) { + // Airborne on the board, the second tap is a throw, not a dive: the + // deck shoots straight down like a spiked item, and whoever it lands + // on takes it like one. The rider pops up off the release. + // The one-ball economy: like a dismount, the round's ball is + // redressed as the board so exactly one object ever exists. + // The station carries its own board, so there is nothing to redress: + // the old one-object economy borrowed the round's ball and handed it + // back at the bell, which is exactly the trick that stopped being + // necessary when the board became furniture with an entry of its own. + const board = boardForRider(player); + resetSkate(player); + if (board) { + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.spawnOwner = player.pad; + board.lastHitBy = player.pad; + board.x = player.x; + board.y = player.y + 40; + board.z = player.z; + board.vx = player.vx * .35; + board.vy = Math.max(2600, player.vy + 2600); + } + player.vy = Math.min(player.vy, -420); + player.pendingMoveLabel = "BOARD SHOT"; + playDrum("whoosh", 1, panPlayer(player)); + playDrum("kick", .8, panPlayer(player)); + emitSignal("board-shot", player.pad, 1, 0); + return true; + } + if (player.pounding) { + player.poundLevel = Math.min(3, Math.max(1, player.poundLevel) + 1); + const cap = poundMaxVelocity * (1 + .5 * (player.poundLevel - 1)); + player.vy = Math.min(cap, Math.max(poundLaunchVelocity, player.vy * 1.55)); + player.pendingMoveLabel = "GROUND POUND " + player.poundLevel; + playSine(620 + player.poundLevel * 190, .12 + player.poundLevel * .04); + emitSignal("fastdrop", player.pad, player.poundLevel, player.vy); + return true; + } + // Grounded anywhere above the real floor and not riding a head means the + // platform, wherever it has been placed. Double-crouch sinks through it. + if (player.grounded && player.standingOn < 0 && + player.y < terrainFloorAt(player.x) - 2) + sink(player, now); + // Standing on the floor there is nothing under you to drop through and no + // height to convert, so the double-tap is spent rather than sold cheap. + else if (player.grounded) return true; + else { + // In the air this is a ground pound, and the height it starts from is + // the whole economy of the move — remember it now, because the crater + // is measured against where the fall actually began. + player.pounding = true; + player.poundFrom = player.y; + player.poundLevel = 1; + player.vy = Math.max(player.vy, poundLaunchVelocity); + player.grounded = false; + player.ducking = false; + player.pendingMoveLabel = "GROUND POUND"; + playSine(520, .16); + emitSignal("fastdrop", player.pad, 1, 0); + } + } else { + player.facing = direction === "RIGHT" ? 1 : -1; + player.dashVx = player.facing * 2400; + player.dashUntil = now + 110000; + emitSignal("dash", player.pad, player.facing, 0); + } + return true; +} + +function sink(player, now) { + player.sinkUntil = now + sinkDurationUs; + // The rung being dropped through, so the sink cannot also eat the next one. + player.sinkFrom = player.y; + player.grounded = false; + player.jumpHeld = false; + player.vy = Math.max(player.vy, 260); + player.pendingMoveLabel = "SINK"; + playDrum("whoosh", .55, panPlayer(player)); + emitSignal("sink", player.pad, -1, 0); +} + +// A short low hop out of crouch. Crouching pins horizontal movement, so a +// direction flick from a tuck has nothing else to mean. +function crouchHop(player, direction, now) { + player.facing = direction; + player.vy = -crouchHopVelocity; + player.grounded = false; + player.jumpHeld = false; + player.hopUntil = now + crouchHopPoseUs; + player.pendingMoveLabel = "CROUCH HOP"; + playDrum("block", .58, panPlayer(player)); + emitSignal("crouchhop", player.pad, direction, 0); +} + +function killPlayer(target, killerPad, now, cause = "KO") { + if (!target.alive) return; + recordFightHit(killerPad, true); + releaseCarriedBall(target, now); + if (!lobbyActive() && (!freeForAll() || + players.filter((player) => player.alive).length <= 2)) { + if (!deathCinematic && killerPad !== target.pad) + deathCinematic = { startedAt: now, loserPad: target.pad, + winnerPad: killerPad, cause }; + freezeFinalFrame(now, deathCinematic?.winnerPad ?? -1); + } + target.alive = false; + target.headBustedAt = now; + target.respawnAt = now + 1200000; + target.vx = 0; + if (!lobbyActive()) target.vy = 0; + target.stance = "HIT"; + target.lastButton = cause; + target.lastButtonAt = now; + if (killerPad !== target.pad) players[killerPad].score += 1; + emitSignal(cause === "BALLED" ? "balled" : "ko", + killerPad, target.pad, players[killerPad]?.score || 0); + roundCause = cause; + spawnImpact({ x: target.x, y: target.y - 120, z: target.z, life: .55, + duration: .55, death: true, explosion: false }); + playDrum("whoosh", 1.15, panPlayer(target)); + if (!lobbyActive()) emitSignal("killcam", killerPad, target.pad, 1); + playDrum("snare", 1.15, panPlayer(target)); + updateLobbyMortality(now); + // The training opponent is the one everybody gets for free, and its fight is + // already running under the title screen — so its head is the one number + // the whole site can share without anybody signing in. The count follows the + // free door rather than the missing AI: once training started sparring back, + // an `!target.bot` gate would have silenced the site's only shared number. + // Balling yourself does not count; somebody has to have popped it. + if (target.npc && killerPad !== target.pad && + (!target.bot || fightOpponent === "trainingbot")) + emitSignal("dummy-popped", killerPad, target.pad, 1); +} + +// The crater. Everything about it is decided by the fall: a pound from a hop +// is a shove, a pound from the ceiling clears the stage. Whoever is standing +// inside the ring when it lands wears it; whoever is in the air over it has +// jumped it, which is the only defence and is meant to be readable from the +// silhouette alone. The ball in the ring is popped and re-served. +// +// The landing consumes the pounder's body but not their life. They continue as +// the existing controllable bouncing-head form, making the move a permanent +// mobility trade without prematurely ending the round. +function groundPound(player, now) { + player.pounding = false; + const poundLevel = Math.max(1, player.poundLevel || 1); + player.poundLevel = 0; + const fall = clamp(player.y - player.poundFrom, 0, poundFullFall); + const power = clamp(fall / poundFullFall + (poundLevel - 1) * .22, 0, 1); + const radius = Math.min(poundMaxRadius, + poundMinRadius + power * 70 + (poundLevel - 1) * 88); + const poseTime = (now - startedAt) / 1000000; + player.stance = "HIT"; + player.lastButton = "GROUND POUND"; + player.lastButtonAt = now; + const terrainY = terrainFloorAt(player.x); + spawnImpact({ x: player.x, y: terrainY, z: player.z, + life: .58, duration: .58, death: false, explosion: true, + blastRadius: radius, power }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + playDrum("kick", 1.3, panPlayer(player)); + playSine(76 + power * 34 + poundLevel * 18, .32 + poundLevel * .09); + emitSignal("blast", player.pad, player.x / worldRight, power); + + for (const target of players) { + if (target.pad === player.pad || !target.alive) continue; + const contact = runnerContactToPoint(target, poseTime, + player.x, terrainY, player.z); + if (Math.min(contact.headDistance, contact.bodyDistance) > radius) continue; + if (!target.grounded) { + // Airborne over the ring is the dodge. It still throws you. + applyBodyHit(target, contact.segmentIndex, player.x, player.pad, now, + 900 + 700 * power, 620); + continue; + } + killPlayer(target, player.pad, now, "BLASTED"); + } + + for (const item of balls) { + if (!item.active) continue; + if (Math.hypot(item.x - player.x, item.y - terrainY) > radius + item.radius) + continue; + item.active = false; + item.heldBy = -1; + item.vx = 0; + item.vy = 0; + item.serveAt = now + 1200000; + spawnImpact({ x: item.x, y: item.y, z: item.z, + life: .22, duration: .22, death: false, explosion: false }); + emitSignal("ballblock", player.pad, 1, power); + } + + const geometry = runnerWorldGeometry(player, poseTime); + for (const limb of limbParts) + detachPart(player, limb, geometry, player.x, now); + detachPart(player, "torso", geometry, player.x, now); + player.alive = true; + player.stance = "BOUNCE"; + player.lastButton = "HEAD ONLY"; + player.lastButtonAt = now; +} + +// Keep the head at its visible position when its body is released. Impact +// momentum lives in knockVx, so releasing the stick cannot erase the kick. +function launchHead(target, sourceX, sourcePad, now, force, lift, incomingVy = 0) { + if (!isHeadOnly(target)) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + target.fallenBodyGeometry = geometry; + releaseCarriedBall(target, now); + releaseCarriedPart(target, now); + releaseCarriedFighter(target, now); + dismountSkateboard(target, now); + target.removedParts = [...limbParts, "torso"]; + target.partDamage = {}; + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + } + const direction = Math.sign(target.x - sourceX) || + players[sourcePad]?.facing || -target.facing || 1; + const velocity = clamp(target.vx * .3 + direction * force, -4200, 4200); + target.knockVx = velocity - (target.windVx || 0); + target.vx = velocity; + target.vy = clamp(target.vy * .25 + incomingVy * .25 - lift, -2600, 2600); + target.headRollRate = clamp(velocity / 260, -8, 8); + target.grounded = false; + target.jumpHeld = false; + target.jumpLaunchAt = 0; + target.attackKind = ""; + target.attackUntil = target.dashUntil = 0; + target.dashVx = 0; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 180000); + target.stance = "HEAD ONLY"; + target.lastButton = "HEAD VOLLEY"; + target.lastButtonAt = now; +} + +function bounceHeadOnSurface(player, incomingVy, horizontal) { + // Restitution keeps hard landings lively and eventually lets a slow head + // settle, so the existing up/down pumping controls remain useful. + if (incomingVy > 360) { + player.vy = -incomingVy * .62; + player.knockVx *= .86; + player.headRollRate = clamp(player.vx / 260, -8, 8); + player.grounded = false; + player.stance = "BOUNCE"; + } else { + player.vy = 0; + player.grounded = true; + player.stance = horizontal ? "ROLL" : "HEAD ONLY"; + } +} + +// Conservative cheap superset of sampleCombatBoxes' hitbox eligibility. +// Missing attack limbs/head-only may pass this gate, but an active hitbox never +// fails it. Pogo contacts remain eligible even without an attackKind. +function mayHaveMeleeHit(player, now) { + if (!player.alive) return false; + if (isPogo(player) && !player.grounded && !player.pogoHit) return true; + return !player.attackHit && !player.blocking && now >= player.hitStunUntil && + meleeFrame(player, now).phase === "active"; +} + +function resolveMelee(now) { + // Most movement ticks have no strike. Avoid building every fighter's full + // skeletal pose and hurtbox tree when no melee contact can possibly occur. + if (!players.some(player => mayHaveMeleeHit(player, now))) return; + const poseTime = (now - startedAt) / 1000000; + const contacts = []; + const samples = players.map(player => sampleCombatBoxes(player, now)); + for (const attacker of players) { + const attacking = samples[attacker.pad]; + if (!attacker.alive || !attacking.hit.length) continue; + for (const fragment of detachedParts) { + const r = fragment.width/2; + const bounds = combatRect('fragment',Math.min(fragment.x1,fragment.x2)-r, + Math.min(fragment.y1,fragment.y2)-r,Math.max(fragment.x1,fragment.x2)+r, + Math.max(fragment.y1,fragment.y2)+r,(fragment.z1+fragment.z2)/2, + Math.abs(fragment.z2-fragment.z1)/2+r); + if (!attacking.hit.some(hit=>boxesOverlap(hit,bounds))) continue; + const spec = meleeSpecFor(attacker, attacker.attackKind); + fragment.vx += attacker.facing * spec.force * .8; + fragment.vy -= Math.max(220, spec.lift); + fragment.owner = attacker.pad; + fragment.hitAfter = now + 120000; + attacker.attackHit = true; + spawnImpact({ x: (bounds.left+bounds.right)/2, y: (bounds.top+bounds.bottom)/2, + z: (bounds.near+bounds.far)/2, life: .18, duration: .18, + death: false, explosion: false }); + playDrum("clap", .82, panPlayer(attacker)); + emitSignal("part-hit", attacker.pad, -1, spec.force); + break; + } + if (attacker.attackHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(attacking, samples[target.pad]); + if (contact?.separation <= 3) { + attacker.attackHit = true; + contacts.push({ attacker, target, + strike: { x: contact.x, y: contact.y, z: contact.z }, + headshot: contact.headshot, segmentIndex: contact.segmentIndex }); + break; + } + } + } + for (const { attacker, target, strike, headshot, segmentIndex } of contacts) { + if (!target.alive && contacts.length < 2) continue; + spawnImpact({ x: strike.x, y: strike.y, z: strike.z, + life: .2, duration: .2, death: false, explosion: false }); + impactHitboxesUntil = Math.max(impactHitboxesUntil, now + 350000); + const away = Math.sign(target.x - attacker.x) || -attacker.facing; + const backBlocking = !isHeadOnly(target) && target.inputX === away; + if (target.blocking || backBlocking) { + target.stance = "DEFEND"; + target.blockFlash = 1; + target.lastButton = target.blocking ? "BLOCK" : "BACK BLOCK"; + target.lastButtonAt = now; + // An explicit shield returns the attacker's commitment as durable + // knockback. Keep it separate from controlled velocity so holding toward + // the defender cannot erase the recoil on the next simulation frame. + const recoil = target.blocking ? 2400 : 900; + attacker.dashUntil = 0; + attacker.dashVx = 0; + attacker.knockVx = -attacker.facing * recoil; + attacker.vx = attacker.knockVx + attacker.windVx; + if (target.blocking) attacker.vy = Math.min(attacker.vy, -415); + else target.vx = 0; + playDrum("block", 1.2, panPlayer(target)); + emitSignal("block", target.pad, attacker.pad, target.blocking ? 1 : 2); + // Only a real shield trades. A back-block still just shoves, because it + // costs nothing to hold a direction. + if (target.blocking) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const stun = shieldStunUs(spec.force * (attacker.attackMomentum || 1)); + attacker.hitStunUntil = Math.max(attacker.hitStunUntil, now + stun); + attacker.attackHit = true; + attacker.attackKind = ""; + attacker.attackUntil = 0; + attacker.stance = "STUN"; + breakShield(target, now); + } + } else if (headshot) { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + const wasHead = isHeadOnly(target); + launchHead(target, attacker.x, attacker.pad, now, + spec.force * momentum * 1.2, + Math.max(620, spec.lift * 3) * momentum, attacker.vy); + playDrum("snare", 1.2, panPlayer(target)); + emitSignal(wasHead ? "head-volley" : "decapitate", + attacker.pad, target.pad, momentum); + } + else { + const spec = meleeSpecFor(attacker, attacker.attackKind); + const momentum = attacker.attackMomentum || 1; + applyBodyHit(target, segmentIndex, attacker.x, attacker.pad, now, + spec.force * momentum, spec.lift * momentum); + playDrum(spec.thud[0], spec.thud[1], panPlayer(target)); + } + } +} + +function resolvePogoAttacks(now) { + const poseTime = (now - startedAt) / 1000000; + for (const attacker of players) { + if (!attacker.alive || !isPogo(attacker) || attacker.grounded || + attacker.pogoHit) continue; + for (const target of rivalsOf(attacker)) { + const contact = combatBoxContact(sampleCombatBoxes(attacker,now),sampleCombatBoxes(target,now)); + if (!contact || contact.separation > 3) continue; + attacker.pogoHit = true; + attacker.vy = Math.min(attacker.vy, -985); + attacker.lastButton = "POGO"; + attacker.lastButtonAt = now; + spawnImpact({ x: contact.x, y: contact.y, z: contact.z, + life: .2, duration: .2, death: contact.headshot, explosion: false }); + if (contact.headshot) killPlayer(target, attacker.pad, now, "POGO"); + else applyBodyHit(target, contact.segmentIndex, attacker.x, + attacker.pad, now, 1350, 260); + playDrum("kick", 1.1, panPlayer(attacker)); + emitSignal("pogo", attacker.pad, contact.headshot ? 1 : 0, 0); + break; + } + } +} + +function resolvePlayerPushboxes() { + for (let a = 0; a < players.length; a++) + for (let b = a + 1; b < players.length; b++) + resolvePlayerPushboxPair(players[a], players[b]); +} + +function resolvePlayerPushboxPair(first, second) { + if ([first, second].some((p) => p.ropeIndex >= 0 || p.skateLoop >= 0)) return; + if (!first.alive || !second.alive) return; + const poseTime = (runtime().monotonicUs - startedAt) / 1000000; + const firstBounds = combatPushbox(first); + const secondBounds = combatPushbox(second); + const verticalOverlap = Math.min(firstBounds.bottom, secondBounds.bottom) - + Math.max(firstBounds.top, secondBounds.top); + // Grounded fighters nudge one another. Once a jumper is clearly above the + // other fighter, the pushboxes separate so cross-over jumps are possible. + if (verticalOverlap <= 18 || + ((!first.grounded || !second.grounded) && + Math.abs(first.y - second.y) > 58)) return; + const left = first.x <= second.x ? first : second; + const right = left === first ? second : first; + const pushRadius = (player) => (combatPushbox(player).right-combatPushbox(player).left)/2; + const minimumGap = pushRadius(left) + pushRadius(right); + const overlap = minimumGap - (right.x - left.x); + if (overlap <= 0) return; + const leftAdvancing = left.vx > 30; + const rightAdvancing = right.vx < -30; + const leftShare = leftAdvancing && !rightAdvancing ? .25 + : rightAdvancing && !leftAdvancing ? .75 : .5; + left.x -= overlap * leftShare; + right.x += overlap * (1 - leftShare); + if (leftAdvancing && !rightAdvancing) { + right.knockVx += Math.min(180, left.vx * .12); + left.vx *= .35; + } else if (rightAdvancing && !leftAdvancing) { + left.knockVx += Math.max(-180, right.vx * .12); + right.vx *= .35; + } else { + if (left.vx > 0) left.vx *= .35; + if (right.vx < 0) right.vx *= .35; + } + resolveRunnerBounds(left, 0); + resolveRunnerBounds(right, 0); +} + +function resolvePlayerStanding(now) { + const poseTime = (now - startedAt) / 1000000; + const previousStanding = players.map((player) => player.standingOn); + for (const player of players) player.standingOn = -1; + for (const rider of players) { + for (const base of rivalsOf(rider)) { + // A committed dive passes through a head contact and completes against + // the terrain. Treating it as ordinary standing used to zero its velocity + // and leave the fighter strangely paused on the opponent's scalp. + if (!rider.alive || !base.alive || rider.vy < 0 || rider.pounding) continue; + const head = runnerWorldGeometry(base, poseTime).head; + const top = head.y - head.radius; + const horizontal = Math.abs(rider.x - head.x) <= head.radius + 42; + const depth = Math.abs(rider.z - head.z) <= head.radius + 32; + const crossed = (rider.previousY ?? rider.y) <= top + 8 && + rider.y >= top - 3; + const stayed = previousStanding[rider.pad] === base.pad && + rider.y <= top + 34; + if (!horizontal || !depth || (!crossed && !stayed)) continue; + const wasGrounded = rider.grounded; + rider.y = top; + rider.vy = Math.min(0, base.vy); + rider.grounded = true; + rider.standingOn = base.pad; + rider.sinkUntil = 0; + rider.hopUntil = 0; + if (!wasGrounded) rider.landPoseUntil = now + 110000; + break; + } + } +} + +function updateStance(player, input, now) { + const opponent = nearestRival(player); + const toward = Math.sign(opponent.x - player.x) || player.facing || 1; + player.stance = !player.alive ? "HIT" + : now < player.hitStunUntil ? "STUN" + : player.blocking ? "DEFEND" + : player.heldBall >= 0 ? "HOLDING" + : player.grabHeld ? "REACHING" + : player.attackKind ? "ATTACK" + : now < player.sinkUntil ? "SINK" + : !player.grounded && now < player.hopUntil ? "CROUCH HOP" + : player.ducking ? player.grounded ? "CROUCH" : "AIR CROUCH" + : player.pogoDive ? "POGO DOWN" + : player.skateboard && player.grounded ? "SKATE" + : !player.grounded ? "AIR" + : now < player.dashUntil ? "DASH" + : input.horizontal === toward ? "ADVANCE" + : input.horizontal === -toward ? "RETREAT" + : "NEUTRAL"; +} + +function grabNearestBall(player, now) { + let nearest = null; + let nearestDistance = 240; + for (let index = 0; index < balls.length; index++) { + const item = balls[index]; + if (!item.active || item.heldBy >= 0) continue; + const distance = Math.hypot(item.x - player.x, + item.y - (player.y - 82), item.z - player.z); + if (distance >= nearestDistance) continue; + nearest = { item, index }; + nearestDistance = distance; + } + if (!nearest) return false; + player.heldBall = nearest.index; + player.carryArm = availableArm(player); + nearest.item.heldBy = player.pad; + nearest.item.safeUntil = now + 180000; + nearest.item.safePlayers = 1 << player.pad; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + emitSignal("grab", player.pad, nearest.index, nearest.item.mass); + playDrum("clap", .72, panPlayer(player)); + return true; +} + +function grabNearestFighter(player, now) { + const target = players.find((candidate) => candidate.pad !== player.pad && + candidate.alive && candidate.grabbedBy < 0 && + Math.hypot(candidate.x - player.x, + candidate.y - (player.y - 72), candidate.z - player.z) < 210); + if (!target) return false; + player.heldPlayer = target.pad; + player.carryArm = availableArm(player); + target.grabbedBy = player.pad; + target.vx = target.vy = target.vz = 0; + target.lastButton = "GRABBED"; + target.lastButtonAt = now; + player.lastButton = "HOLDING"; + player.lastButtonAt = now; + playDrum("clap", .82, panPlayer(player)); + emitSignal("grab-player", player.pad, target.pad, isHeadOnly(target) ? 1 : 0); + return true; +} + +function grabNearestPart(player, now) { + let bestIndex = -1; + let bestDistance = 190; + for (let index = 0; index < detachedParts.length; index++) { + const part = detachedParts[index]; + if (part.heldBy >= 0) continue; + const x = (part.x1 + part.x2) / 2; + const y = (part.y1 + part.y2) / 2; + const z = (part.z1 + part.z2) / 2; + const distance = Math.hypot(x - player.x, y - (player.y - 78), z - player.z); + if (distance >= bestDistance) continue; + bestIndex = index; + bestDistance = distance; + } + if (bestIndex < 0) return false; + const part = detachedParts[bestIndex]; + player.heldPart = bestIndex; + player.carryArm = availableArm(player); + part.heldBy = player.pad; + part.owner = player.pad; + part.vx = part.vy = 0; + player.lastButton = "HOLDING " + part.part.toUpperCase(); + player.lastButtonAt = now; + emitSignal("grab-part", player.pad, bestIndex, 1); + return true; +} + +function stealHeldObject(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.hypot(target.x - player.x, + target.y - player.y, target.z - player.z) > 220) return false; + let label = ""; + if (target.heldBall >= 0) { + const index = target.heldBall; + const item = balls[index]; + target.heldBall = -1; + player.heldBall = index; + if (item) item.heldBy = player.pad; + label = "BALL"; + } else if (target.heldPart >= 0) { + const index = target.heldPart; + const part = detachedParts[index]; + target.heldPart = -1; + player.heldPart = index; + if (part) { part.heldBy = player.pad; part.owner = player.pad; } + label = part?.part?.toUpperCase() || "LIMB"; + } else if (target.gunAmmo > 0) { + player.gunAmmo = target.gunAmmo; + player.gunMode = target.gunMode; + target.gunAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + target.gunMode = "HANDGUN"; + label = player.gunMode; + } else if (target.grenadeAmmo > 0) { + player.grenadeAmmo = target.grenadeAmmo; + target.grenadeAmmo = 0; + player.itemArm = availableArm(player); + target.itemArm = ""; + label = "GRENADES"; + } + if (!label) return false; + target.lastButton = label + " TAKEN"; + target.lastButtonAt = now; + player.lastButton = "STOLE " + label; + player.lastButtonAt = now; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 160000); + playDrum("clap", 1, panPlayer(player)); + emitSignal("steal", player.pad, target.pad, 1); + return true; +} + +function releaseCarriedPart(player, now) { + if (player.heldPart < 0) return; + const part = detachedParts[player.heldPart]; + if (part) { + part.heldBy = -1; + part.owner = player.pad; + part.vx = player.vx + player.facing * 1900; + part.vy = Math.min(player.vy, -460); + part.hitAfter = now + 90000; + part.life = Math.max(part.life, 3.4); + emitSignal("throw-part", player.pad, player.heldPart, player.facing); + } + player.heldPart = -1; + player.carryArm = ""; +} + +function releaseCarriedFighter(player, now) { + if (player.heldPlayer < 0) return; + const target = players[player.heldPlayer]; + if (target) { + target.grabbedBy = -1; + target.x = player.x + player.facing * 118; + target.y = player.y - 74; + target.z = player.z; + target.vx = player.vx + player.facing * 1500; + target.vy = Math.min(player.vy, -620); + target.grounded = false; + target.hitStunUntil = now + 260000; + emitSignal("throw-player", player.pad, target.pad, player.facing); + } + player.heldPlayer = -1; + player.carryArm = ""; +} + +function releaseCarriedBall(player, now) { + if (player.heldBall < 0) return; + const item = balls[player.heldBall]; + if (item) { + item.heldBy = -1; + item.x = player.x + player.facing * (item.radius + 70); + item.y = player.y - 88; + item.z = player.z; + item.vx = player.vx; + item.vy = player.vy; + item.safeUntil = now + 120000; + item.safePlayers = 1 << player.pad; + emitSignal("release", player.pad, player.heldBall, item.mass); + } + player.heldBall = -1; + player.carryArm = ""; +} + +function bouncePogoOnSurface(player, surfaceY, now) { + player.y = surfaceY; + player.vy = -pogoBounceVelocity; + player.grounded = false; + player.pogoDive = false; + player.pogoHit = false; + player.stance = "POGO BOUNCE"; + player.lastButton = "POGO BOUNCE"; + player.lastButtonAt = now; + playDrum("kick", .9, panPlayer(player)); + emitSignal("pogo", player.pad, -2, pogoBounceVelocity); +} + +function shieldBash(player, now) { + const target = nearestRival(player); + if (!target?.alive || Math.abs(target.x - player.x) > shieldRadius * 1.35 || + Math.abs(target.y - player.y) > 170) return; + const direction = Math.sign(target.x - player.x) || player.facing; + player.shieldLocked = true; + player.shieldBrokenAt = now; + player.blocking = false; + player.knockVx -= direction * 620; + player.hitStunUntil = Math.max(player.hitStunUntil, now + 180000); + target.knockVx += direction * 1250; + target.hitStunUntil = Math.max(target.hitStunUntil, now + 240000); + target.grounded = false; + target.vy = Math.min(target.vy, -180); + if (target.blocking) { + target.shieldLocked = true; + target.shieldBrokenAt = now; + target.blocking = false; + target.knockVx += direction * 420; + } + spawnImpact({ x: (player.x + target.x) / 2, y: player.y - 90, + z: (player.z + target.z) / 2, life: .26, duration: .26, + death: false, explosion: true, blastRadius: 180, power: .35 }); + playDrum("block", 1.25, panPlayer(player)); + emitSignal("shield-bash", player.pad, target.pad, target.shieldLocked ? 1 : 0); +} + +function updatePlayer(player, pad, dt, now) { + const parkPreviousX = player.x; + player.previousY = player.y; + if (player.grabbedBy >= 0) { + const carrier = players[player.grabbedBy]; + if (!carrier?.alive || carrier.heldPlayer !== player.pad) { + player.grabbedBy = -1; + } else { + player.x = carrier.x + carrier.facing * 108; + player.y = carrier.y - 76; + player.z = carrier.z; + player.vx = player.vy = player.vz = 0; + player.grounded = false; + player.blocking = false; + player.attackKind = ""; + player.previous = pad.down.slice(); + return; + } + } + if (!player.alive) { + player.previous = pad.down.slice(); + // A body that dies off the ground still has to come down. Everything + // below this branch is skipped while dead, gravity included, which is + // right in a round — the round ends and rebuilds the body, and the + // killcam wants the pose held. The waiting room has no round, so a + // fighter blasted out of a jump hung in mid-air in its jump pose for the + // whole respawn beat. @jeffrey: "it seems possible to die in the waiting + // room but keep jumping stilll" — that is what a frozen hop looks like. + if (lobbyActive() && now < player.respawnAt) settleCorpse(player, dt); + if (now >= player.respawnAt && !freeForAll()) { + player.x = player.spawnX; + player.y = terrainFloorAt(player.spawnX); + player.z = 0; + player.vx = 0; + player.vy = 0; + player.vz = 0; + player.windVx = 0; + player.knockVx = 0; + player.grounded = true; + player.ducking = false; + player.inputX = 0; + player.inputY = 0; + player.dashUntil = 0; + player.stance = "NEUTRAL"; + player.crouchBlend = 0; + player.jumpLaunchAt = 0; + player.jumpPoseUntil = 0; + player.landPoseUntil = 0; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + player.crouchJump = false; + player.attackMomentum = 1; + player.hitSegment = -1; + player.hitSegmentUntil = 0; + player.hitStunUntil = 0; + // The waiting room hands back a whole body and a swept floor: parts, + // corpses and scattered limbs are round furniture, and the lobby has + // no round to rebuild the one or clear the others. + if (lobbyActive()) { + player.removedParts = []; + player.partDamage = {}; + player.fallenBodyGeometry = null; + player.lobbyDeathDressed = false; + delete player.frozenGeometry; + delete player.frozenAt; + delete player.headBustedAt; + player.lastTap = {}; + player.lastRelease = {}; + player.airJumpsUsed = 0; + player.doubleJumpLinesUntil = 0; + deathCinematic = null; + detachedParts.length = 0; + } + player.alive = true; + } + return; + } + player.suppressedDirections = player.suppressedDirections.filter((button) => + pad.down.includes(button)); + const headOnly = isHeadOnly(player); + const pogo = isPogo(player); + const legCount = ["left-leg", "right-leg"] + .filter((part) => hasPart(player, part)).length; + const armCount = ["left-arm", "right-arm"] + .filter((part) => hasPart(player, part)).length; + const rawInput = quantizedInput(pad, player.suppressedDirections); + const hitStunned = now < player.hitStunUntil; + const wasBlocking = player.blocking; + const carrying = player.heldBall >= 0 || player.heldPart >= 0 || + player.heldPlayer >= 0 || Boolean(heldItem(player)); + const aimLocked = carrying && pad.down.includes("X"); + player.itemAimLocked = aimLocked; + if (aimLocked && (rawInput.horizontal || rawInput.vertical)) { + player.gunAimX = rawInput.horizontal; + player.gunAimY = -rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } + // A held gun used to point dead ahead unless you also held X, so the one + // thing a player is plainly doing with it — pointing it somewhere — never + // reached the fighter. A vertical direction now tilts the hand on its own. + // The X lock still earns its keep: it pins an aim while you stand still and + // it turns you. This does neither, deliberately — steering the drawn arm + // must not steer the walk, or every upward shot would rewrite your footing. + player.gunAimLive = false; + if (!aimLocked && player.gunAmmo > 0 && rawInput.vertical) { + player.gunAimX = rawInput.horizontal || player.facing; + player.gunAimY = -rawInput.vertical; + player.gunAimLive = true; + } + // A broken shield stays down until X is let go, so the opening it bought is + // spent on attacking rather than on re-guarding by reflex. + if (player.shieldLocked && !pad.down.includes("X")) player.shieldLocked = false; + player.blocking = !carrying && !headOnly && pad.down.includes("X") && + !player.shieldLocked; + if (player.blocking && !wasBlocking) { + player.attackKind = ""; + player.attackUntil = 0; + player.shieldCrouched = rawInput.vertical < 0 || player.ducking || + player.crouchBlend >= .35; + player.shieldVx = 0; + player.vx = player.windVx + player.knockVx; + player.dashUntil = 0; + player.dashVx = 0; + player.lastTap = {}; + player.lastRelease = {}; + shieldBash(player, now); + } + if (player.blocking && rawInput.vertical < 0) player.shieldCrouched = true; + if (player.blocking) { + player.shieldAimX = rawInput.horizontal; + player.shieldAimY = rawInput.vertical; + if (rawInput.horizontal) player.facing = rawInput.horizontal; + } else { + player.shieldCrouched = false; + player.shieldAimX = 0; + player.shieldAimY = 0; + } + // Guard plants the fighter immediately, but DOWN remains meaningful: a + // standing guard can settle into a crouching guard. Once crouched, the pose + // latches until the shield itself drops even if DOWN is released first. + const input = player.blocking + ? { horizontal: 0, vertical: player.shieldCrouched ? -1 : 0 } : rawInput; + const grabHeld = armCount > 0 && !pogo && !hitStunned && !player.blocking && + pad.down.includes("A") && pad.down.includes("B"); + if (skateparkMap && !survivalActive()) { + const ropeHeld = skateRopeInput(player, input, grabHeld, dt, grabHeld && !player.grabHeld); + if (ropeHeld || skateLoopStep(player, input, dt, now)) { + player.previous = pad.down.slice(); + player.grabHeld = grabHeld; + return; + } + } + if (grabHeld && !player.grabHeld && player.heldBall < 0 && + player.heldPart < 0 && + player.heldPlayer < 0) { + if (!stealHeldObject(player, now) && !grabNearestBall(player, now) && + !grabNearestPart(player, now) && + !grabNearestFighter(player, now)) { + player.lastButton = "REACHING"; + player.lastButtonAt = now; + emitSignal("reach", player.pad, player.facing, 0); + } + } + else if (!grabHeld && player.heldBall >= 0) + releaseCarriedBall(player, now); + else if (!grabHeld && player.heldPart >= 0) + releaseCarriedPart(player, now); + else if (!grabHeld && player.heldPlayer >= 0) + releaseCarriedFighter(player, now); + const inputChanged = input.horizontal !== player.inputX || + input.vertical !== player.inputY; + if (inputChanged && + (input.horizontal || input.vertical)) + emitSignal("move", player.pad, input.horizontal, input.vertical); + player.pendingMoveLabel = ""; + // An ultra jump IS a second press of UP, so the air-jump gate below used to + // see the same press the double-tap had just spent: the ultra fired, a + // double jump launched on top of it a tick later, the move read-out said + // DOUBLE JUMP, and the air jump the fighter never asked for was gone. The + // horizontal branch has always honored the "tap was spent" answer; this is + // the vertical one doing the same. It matters more in a tower, where the + // crow's nest is the one rung an ultra jump is the only way onto. + let verticalTapSpent = false; + const upPressed = input.vertical > 0 && !player.previous.includes("MOVE_UP"); + const downPressed = input.vertical < 0 && player.inputY >= 0; + const wasCrouched = player.ducking || player.crouchBlend >= .35; + const crouchTarget = input.vertical < 0 || + (!player.grounded && player.crouchJump && now < player.jumpPoseUntil) || + (!player.grounded && now < player.hopUntil) ? 1 : 0; + const crouchStep = dt * (crouchTarget ? 9 : 11); + player.crouchBlend += clamp(crouchTarget - player.crouchBlend, + -crouchStep, crouchStep); + player.ducking = player.crouchBlend >= .52; + if (player.attackKind && now >= player.attackUntil) { + player.attackKind = ""; + player.attackHit = false; + player.attackMomentum = 1; + } + if (player.itemAction && now >= player.itemActionUntil) + player.itemAction = ""; + if (player.inputX && input.horizontal !== player.inputX) + player.lastRelease[player.inputX > 0 ? "RIGHT" : "LEFT"] = now; + if (player.inputY && input.vertical !== player.inputY) + player.lastRelease[player.inputY > 0 ? "UP" : "DOWN"] = now; + if (input.horizontal && input.horizontal !== player.inputX) { + const direction = input.horizontal > 0 ? "RIGHT" : "LEFT"; + recordCommand(player, direction, now); + if (!directionTap(player, direction, now) && player.grounded && + player.ducking && !headOnly && !pogo && !hitStunned) + crouchHop(player, input.horizontal, now); + } + if (input.vertical && input.vertical !== player.inputY) { + const direction = input.vertical > 0 ? "UP" : "DOWN"; + recordCommand(player, direction, now); + verticalTapSpent = directionTap(player, direction, now); + if (headOnly) { + const alternating = player.headPumpDirection && + player.headPumpDirection !== input.vertical && + now - (player.headPumpAt || 0) <= 520000; + player.headBounceCharge = clamp((player.headBounceCharge || 0) + + (alternating ? .2 : .035), 0, 1); + player.headPumpDirection = input.vertical; + player.headPumpAt = now; + if (alternating && player.grounded) { + player.vy = -lerp(420, headBounceVelocity * 1.7, + player.headBounceCharge); + player.grounded = false; + player.stance = "BOUNCE " + Math.round(player.headBounceCharge * 5); + playDrum("block", .45 + player.headBounceCharge * .45, + panPlayer(player)); + emitSignal("head-bounce", player.pad, input.vertical, + player.headBounceCharge); + } + } + } + + if (headOnly) { + const sincePump = now - (player.headPumpAt || 0); + if (sincePump > 650000) + player.headBounceCharge = Math.max(0, + (player.headBounceCharge || 0) - dt * .22); + } + + if (input.horizontal) player.facing = input.horizontal; + // Fighting-game directions are digital: full movement begins and ends on + // the sampled edge. The analog stick is only an eight-way gate. + if (player.grounded) player.windVx *= Math.max(0, 1 - dt * 10); + else player.windVx = clamp(player.windVx + windAcceleration * dt, -900, 900); + player.knockVx *= Math.max(0, 1 - dt * (headOnly + ? player.grounded ? 1.6 : .22 : player.grounded ? 7 : 1.8)); + if (now < player.dashUntil && input.horizontal && + Math.sign(player.dashVx) !== input.horizontal) { + player.dashUntil = 0; + player.dashVx = 0; + player.runSince = 0; + } + const dashRunningOut = player.grounded && input.horizontal && + player.dashUntil > 0 && now >= player.dashUntil; + if (dashRunningOut && !player.runSince) { + player.runSince = now; + } + if (!player.grounded || !input.horizontal || player.blocking || + player.ducking || hitStunned) player.runSince = 0; + const walkingCleanly = player.grounded && input.horizontal && !player.blocking && + !player.ducking && !hitStunned && now >= player.dashUntil; + if (!walkingCleanly) player.walkSince = 0; + else if (!player.walkSince) player.walkSince = now; + else if (!player.runSince && now - player.walkSince >= 650000) + player.runSince = now; + const headAirControl = player.grounded ? .55 + : lerp(.55, .9, player.headBounceCharge || 0); + const mobility = headOnly ? headAirControl + : pogo ? .68 : legCount === 1 ? .72 : 1; + const runSpeed = player.runSince + ? Math.min(runTopSpeed, runStartSpeed + + (now - player.runSince) / 1000000 * runAcceleration) : 0; + let controlledVx = aimLocked ? 0 + : player.blocking ? player.shieldVx || 0 + : now < player.dashUntil && Math.abs(player.dashVx) > 0 + ? player.dashVx + : player.runSince ? input.horizontal * runSpeed * mobility + : player.ducking && player.grounded ? 0 + : input.horizontal * walkSpeed * mobility; + if (player.skateboard && player.skateWallSide) { + // Once the board reaches a coping, horizontal momentum has become upward + // wall momentum. Keep the root on that wall until gravity spends it; the + // player can also steer away to peel off early. + const peelAway = input.horizontal === -player.skateWallSide; + if (player.vy >= 0 || peelAway) { + const side = player.skateWallSide; + player.skateWallSide = 0; + player.skateVx = -side * Math.max(720, Math.abs(player.skateVx) * .42); + controlledVx = player.skateVx; + } else controlledVx = 0; + } else if (player.skateboard && player.grounded && !player.blocking) { + // Steering, and ONLY while steering. This used to run every frame against + // a target of `input.horizontal * 2700`, which on an idle stick is zero — + // so a coasting skater was being dragged to a standstill at 3.2 a second + // by the same line that turns them. On a flat cube nobody could tell; + // dropped into a three-tile bowl it is the difference between a 1,400-unit + // drop and a 268-unit one, because the servo ate gravity as fast as + // gravity arrived. Let go of the stick now and you coast, which is what + // rolling IS. + const skateTarget = input.horizontal * 2700; + // Carving is steering against the roll, and it has to stay in scope: the + // scrape it makes is played further down, and hoisting the steer into a + // block took both of these with it. + const carving = Boolean(input.horizontal) && + Math.sign(skateTarget) !== Math.sign(player.skateVx); + if (input.horizontal) { + const turnRate = carving ? 1.8 : 3.2; + player.skateVx += (skateTarget - player.skateVx) * + (1 - Math.exp(-dt * turnRate)); + } + // Gravity along the surface, resolved honestly rather than by a tuned + // constant. The old line was `slope * 1900`, and `slope` is tan(angle) — + // which runs away to infinity as a transition goes vertical and had to be + // clamped at 2.5 to stop it. The horizontal share of gravity on a slope is + // g·sin·cos, which in terms of tan is g·t/(1+t²): it peaks at 45° exactly + // as it should, falls off toward vertical exactly as it should, and needs + // no clamp because it cannot exceed half of g. + const contact = skateContact(player.x, player.y); + const terrainSlope = Math.tan(contact.pitch); + player.skateVx += fallGravity() * terrainSlope / + (1 + terrainSlope * terrainSlope) * dt; + // Pumping. The one thing a skater does that a rolling object does not: + // crouch through the bottom of a transition and stand up through the + // face, and come out with more speed than you went in with. Holding DOWN + // on a slope is that, and it is the only way to gain speed in the bowl + // without pushing — which is what makes a bowl worth being in rather than + // a hole to cross. + // + // Priced against the slope, so it pays on a transition and pays nothing + // on the flat: a crouch in the middle of the park is a crouch, not a + // cheat code. Direction comes from the roll rather than the stick, + // because pumping adds to the speed you have, it does not steer. + const pumping = input.vertical < 0 && Math.abs(terrainSlope) > .18; + if (pumping && player.skateVx) + player.skateVx += Math.sign(player.skateVx) * + Math.abs(terrainSlope) * skatePumpAcceleration * dt; + player.skateVx = clamp(player.skateVx, -4200, 4200); + // Leaving the lip. A rider climbing a transition is carrying real upward + // speed -- `skateVx * slope` -- and the moment the ground stops climbing + // under them, that speed has nowhere to go but into the air. Reading the + // ground a frame ahead is what catches the crest: the coping at the top + // of a quarterpipe, the edge of the funbox, the lip of the bowl. + // + // Without this a skater simply walks over the top of every ramp with the + // speed quietly deleted, which is the difference between a skatepark and + // a set of hills. + const surfaceVy = player.skateVx * terrainSlope; + const aheadSlope = clamp(terrainTangentAt( + player.x + player.skateVx * .05), -2.5, 2.5); + if (surfaceVy < -skateLaunchFloor && + (aheadSlope - terrainSlope) * Math.sign(player.skateVx) > .2) { + player.vy = surfaceVy; + player.grounded = false; + player.skateAirAt = now; + playDrum("whoosh", .5 + Math.min(.45, -surfaceVy / 4000), + panPlayer(player)); + emitSignal("skate-air", player.pad, + Math.round(-surfaceVy), Math.round(player.skateVx)); + } + if (!input.horizontal) player.skateVx *= Math.exp(-dt * .65); + controlledVx = player.skateVx; + const skateSpeed = Math.abs(player.skateVx); + const carveDir = carving ? Math.sign(skateTarget) : 0; + if (carveDir && skateSpeed > 900 && player.skateCarveDir !== carveDir) { + playDrum("whoosh", .45 + Math.min(.4, skateSpeed / 4200 * .5), + panPlayer(player)); + emitSignal("skate-carve", player.pad, carveDir, + Math.round(skateSpeed / 42) / 100); + } + player.skateCarveDir = carveDir; + } else if (player.skateboard && !player.grounded) { + // Keep the board's launch momentum instead of borrowing walking speed + // in the air and reviving a different skateVx on landing. + controlledVx = player.skateVx; + } else if (!player.skateboard) player.skateVx = 0; + player.vx = controlledVx + player.windVx + player.knockVx; + if (inputChanged) telemetry("FIGHT_MOVE", player.name + + " pad=" + (player.pad + 1) + + " held=" + (pad.down.filter((button) => button.startsWith("Arrow")).join("+") || "NONE") + + " stick=" + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + + " quant=" + input.horizontal + "," + input.vertical + + " controlled=" + Math.round(controlledVx) + + " shield=" + (player.blocking ? 1 : 0) + + " wind=" + Math.round(player.windVx) + + " knock=" + Math.round(player.knockVx) + + " vx=" + Math.round(player.vx) + + " x=" + Math.round(player.x)); + + // Checked before liftoff so the launch frame itself can never be cut. + if (player.jumpHeld && player.vy < 0 && !player.blocking && + input.vertical <= 0) { + player.vy *= jumpCutScale; + player.jumpHeld = false; + } + if (airRoundActive()) player.airJumpsUsed = 0; + if (!aimLocked && !headOnly && upPressed && !verticalTapSpent && + !player.jumpLaunchAt && + (player.grounded || player.airJumpsUsed < 1)) { + const airJump = !player.grounded; + player.jumpLaunchAt = now + (airJump ? 1 : jumpAnticipationUs); + player.crouchJump = !airJump && wasCrouched; + if (airJump) { + player.airJumpsUsed++; + player.doubleJumpLinesUntil = now + 280000; + } + player.pendingMoveLabel = player.skateboard ? "OLLIE" + : airJump ? "DOUBLE AIR" + : wasCrouched ? "CROUCH AIR" : "AIR"; + } + if (player.jumpLaunchAt && now >= player.jumpLaunchAt) { + player.jumpLaunchAt = 0; + player.jumpPoseUntil = now + + (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs); + const jumpScale = player.skateboard ? 1.12 + : pogo ? .88 : legCount === 1 ? .78 : 1; + player.vy = Math.min(player.vy, + -(player.crouchJump ? crouchJumpVelocity : jumpVelocity) * jumpScale); + player.jumpHeld = true; + player.pogoHit = false; + player.pogoDive = false; + player.pounding = false; + player.grounded = false; + player.skateWallSide = 0; + player.ducking = player.crouchJump; + playDrum("block", 0.72, panPlayer(player)); + emitSignal("jump", player.pad, 1, 0); + } + if (pogo && !player.grounded && !hitStunned && downPressed) { + player.vy = Math.max(player.vy, 2250); + player.pogoDive = true; + player.pogoHit = false; + player.pendingMoveLabel = "POGO DOWN"; + player.stance = "POGO DOWN"; + playDrum("kick", .78, panPlayer(player)); + playSine(620, .13); + emitSignal("pogo", player.pad, -1, player.vy); + } + if (!player.grounded && !pogo && input.vertical < 0) { + player.ducking = true; + player.pendingMoveLabel ||= "AIR CROUCH"; + } + + // Y and either shoulder spend an item, so reaching for a kick can no + // longer empty a magazine. A loaded hand still colors the punch — into a + // swing, never a shot. + const acting = !headOnly && !pogo && !hitStunned && !player.blocking; + if (acting && player.gunMode === "RUBBER SMG" && player.gunAmmo > 0 && + pad.down.includes("Y") && player.previous.includes("Y") && + now >= player.nextGunShotAt) + fireGun(player, input); + for (const button of pad.down) { + if (!player.previous.includes(button)) { + remember(player, button); + if (button === "X" && !headOnly) { + player.pendingMoveLabel = "SHIELD"; + playDrum("block", .7, panPlayer(player)); + emitSignal("shield", player.pad, 1, 0); + } + else if (acting && !grabHeld && button === "A") + startMelee(player, "KICK", now); + else if (acting && !grabHeld && button === "B") + startMelee(player, itemMelee[heldItem(player)] || "PUNCH", now); + else if (headOnly && !hitStunned && button === "A") + spit(player, false); + else if (headOnly && !hitStunned && button === "B") + spit(player, true); + else if ((acting || (headOnly && !hitStunned)) && + ["Y", "LeftShoulder", "RightShoulder"].includes(button)) { + const item = heldItem(player); + if (item === "GUN") fireGun(player, input); + else if (item === "GRENADE") throwGrenade(player, input); + } + } + } + if (grabHeld) { + player.lastButton = player.heldBall >= 0 ? "HOLDING" : "REACHING"; + player.lastButtonAt = now; + } + if (player.pendingMoveLabel) remember(player, player.pendingMoveLabel); + + const previousX = player.x; + const previousY = player.y; + const wasGrounded = player.grounded; + player.vy += (player.vy < 0 ? riseGravity() : fallGravity()) * dt; + // Keeping DOWN held through a pound drives it down harder. The button is + // the only thing that makes a pound faster, so the height you fell from and + // the pressure you kept on it are the two dials on the crater. + if (player.pounding && input.vertical < 0) + player.vy = Math.min(poundMaxVelocity * + (1 + .5 * Math.max(0, player.poundLevel - 1)), + player.vy + poundHoldAcceleration * dt); + if (airRoundActive()) { + // A shared terminal fall keeps the duel within reach; UP can flap again, + // DOWN dives. The world has no floor and falling never eliminates anyone. + player.vy = Math.min(player.vy, input.vertical < 0 ? 1050 : 760); + player.skateboard = false; + } + player.x += player.vx * dt; + player.y += player.vy * dt; + // A bodyless head is a ball, and a ball that slides without turning reads + // as a sticker on the floor. Ground contact sets the spin to the true + // rolling rate for the 22-unit radius; the spin then integrates every + // frame, because a head that leaves the floor mid-bounce keeps turning — + // spinning only while grounded left the bouncing head (which is how a head + // mostly travels) with a face nailed bolt upright between landings. + // `grounded` still holds last frame's answer here — it resets just below. + if (isHeadOnly(player)) { + // Clamped well below the true rolling rate: honest physics for a 22-unit + // ball at fight speed is eleven revolutions a second, which on screen is + // not a rolling face but a whirl of spinning lines. A lazy tumble — about + // a turn per second, capped — keeps the eyes and mouth readable while + // still saying which way the head is traveling. + if (player.grounded) player.headRollRate = clamp(player.vx / 22, -6, 6); + player.headRoll = (player.headRoll || 0) + (player.headRollRate || 0) * dt; + } + // Walking down a slope is not a new landing on every other tick. + const nextFloor = terrainFloorAt(player.x); + const followingFloor = wasGrounded && player.vy >= 0 && + Math.abs(previousY - terrainFloorAt(previousX)) < 3 && + nextFloor - previousY <= Math.max(20, Math.abs(player.vx * dt) * 2.5); + if (followingFloor) player.y = Math.max(player.y, nextFloor); + const landingSpeed = player.vy; + player.grounded = false; + // A sinking fighter is transparent to the rung it left and to nothing else. + // A window long enough to clear one lip — .25s, 290 units of fall — is + // already long enough to fall past the next rung 260 below, and a + // double-tap that dropped two storeys read as a fall rather than a step + // down. Remembering where the sink started is what keeps it one storey. + // The floor is never transparent, which is why it stays in the else. + const ledge = player.vy >= 0 && ledgeCrossed(player.x, previousY, player.y); + const sinking = now < player.sinkUntil && + ledge && ledge.y <= player.sinkFrom + 4; + if (ledge && !sinking) { + player.y = ledge.y; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, ledge.y, now); + } else { + player.vy = 0; + player.grounded = true; + } + } else if (player.y >= terrainFloorAt(player.x) && + (!player.skateboard || player.vy >= 0)) { + const terrainY = terrainFloorAt(player.x); + player.y = terrainY; + if (headOnly) { + bounceHeadOnSurface(player, landingSpeed, input.horizontal); + } else if (pogo && player.pogoDive) { + bouncePogoOnSurface(player, terrainY, now); + } else { + player.vy = 0; + player.grounded = true; + } + } + if (player.skateboard) { + const contact = skateContact(player.x, previousY); + const supported = player.grounded || (wasGrounded && player.vy >= 0 && + Math.abs(player.y - contact.y) < Math.max(24, Math.abs(player.vx * dt) * 2.5)); + if (supported && !player.skateWallSide) { + player.y = contact.y; + const tangentX = Math.cos(contact.pitch); + const tangentY = Math.sin(contact.pitch); + if (!wasGrounded) { + // Inelastic contact removes normal velocity. A downward impact at a + // lip must count against uphill momentum, not become an upward boost. + player.skateVx = (player.vx * tangentX + landingSpeed * tangentY) * tangentX; + } else { + // Carry tangent speed around the curve; fixed horizontal speed would + // invent vertical energy whenever the slope steepens. + player.skateVx *= tangentX / Math.max(.001, + Math.cos(player.skatePitch || 0)); + } + player.vx = player.skateVx; + player.skatePitch = contact.pitch; + player.skateContacts = Number(contact.left) + Number(contact.right); + player.grounded = true; + player.vy = 0; + const distance = (player.x - previousX) / Math.max(.15, Math.cos(contact.pitch)); + player.skateSpin = (player.skateSpin || 0) + distance / skateWheelRadius; + player.skateRollDistance = (player.skateRollDistance || 0) + Math.abs(distance); + if (player.skateContacts && player.skateRollDistance >= 100) { + player.skateRollDistance %= 100; + playDrum("hat", .12 + Math.min(.35, Math.abs(player.vx) / 8400), panPlayer(player)); + emitSignal("skate-roll", player.pad, Math.round(Math.abs(player.vx)), player.skateContacts); + } + if (!wasGrounded) { + playDrum("clap", clamp(landingSpeed / 2000, .2, 1), panPlayer(player)); + playDrum("block", clamp(landingSpeed / 2800, .15, .7), panPlayer(player)); + emitSignal("skate-land", player.pad, Math.round(landingSpeed), player.skateContacts); + } + } else player.skateContacts = 0; + } + if (!wasGrounded && player.grounded) { + const onBooster = boosterXs.some((x) => Math.abs(player.x - x) <= boosterRadius); + player.landPoseUntil = now + 110000; + player.crouchJump = false; + player.jumpHeld = false; + player.hopUntil = 0; + player.sinkUntil = 0; + if (player.pounding) groundPound(player, now); + else if (!headOnly && onBooster) { + player.vy = -boosterVelocity; + player.grounded = false; + player.jumpHeld = true; + player.airJumpsUsed = 0; + player.lastButton = "BOOST"; + player.lastButtonAt = now; + playSine(880, .22); + playDrum("clap", 1.2, panPlayer(player)); + emitSignal("boost", player.pad, 1, 0); + } else player.airJumpsUsed = 0; + } + resolveRunnerBounds(player, (now - startedAt) / 1000000); + skateBoostStep(player, parkPreviousX, now); + player.hit = Math.max(0, player.hit - dt * 4); + player.blockFlash = Math.max(0, player.blockFlash - dt * 6); + player.previous = pad.down.slice(); + if (input.vertical > 0) player.previous.push("MOVE_UP"); + player.inputX = input.horizontal; + player.inputY = input.vertical; + player.grabHeld = grabHeld; + updateStance(player, input, now); +} + +// How long a bot leans on a button, per action rather than one house number. +// A jump has to outlast the whole rise (1760 / 4800 ≈ .37s) or jumpCutScale +// clips the arc to a third of its height and the platform goes out of reach; +// a strike is a stab; a sink tap is half of a double-tap. +const botHoldUs = { + walk: 90000, jump: 440000, sinkTap: 60000, + strike: 70000, shield: 120000, item: 110000, +}; +// A press cannot reopen until it has been up this long, so `lastRelease` +// always sees a real gap — that gap is what keeps dash, ultra jump and sink +// readable from synthetic input. Four frames clears doubleTapReleaseUs even +// when the release lands a frame late. +const botRestUs = 66668; +// A thumb cannot hold both ends of an axis, so opening one closes the other. +const botAxis = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft", + ArrowUp: "ArrowDown", ArrowDown: "ArrowUp" }; + +// The bot's dice. Not Math.random, deliberately: two fresh sims must roll +// identically (the determinism test holds that line), and the reel factory +// reserves the global stream for the match name. Seeded per fighter at round +// start from the round clock, so rounds differ live while a replayed sim +// replays exactly. +function botRoll(player) { + let s = player.botRngState = (player.botRngState + 0x6d2b79f5) >>> 0; + s = Math.imul(s ^ (s >>> 15), s | 1); + s ^= s + Math.imul(s ^ (s >>> 7), s | 61); + return ((s ^ (s >>> 14)) >>> 0) / 4294967296; +} + +// The one door every synthetic press goes through. Pressing a button that is +// already down extends it, so a pursuit reads as one lean instead of a +// stutter; pressing one that is still resting is refused. +function botPress(player, button, holdUs, now) { + const press = player.botPresses[button]; + if (press && now < press.until) { + press.until = Math.max(press.until, now + holdUs); + return true; + } + if (press && now < press.until + botRestUs) return false; + const other = player.botPresses[botAxis[button]]; + if (other && now < other.until) other.until = now; + player.botPresses[button] = { until: now + holdUs }; + return true; +} + +const botHeld = (player, button, now) => + now < (player.botPresses[button]?.until || 0); + +function botDown(player, now) { + return Object.keys(player.botPresses) + .filter((button) => now < player.botPresses[button].until); +} + +// ── What a bot sees ───────────────────────────────────────────────────────── +// The bots used to steer off the whole table. The climb bot read the ladder +// by index — `platforms[level]` — and the fight bot read the opponent's +// coordinates wherever they were, on screen or not. Neither is what a hand on +// a pad has. A player sees a screen: the rungs the lens has in frame, the lava +// once it has climbed into view, the other fighter while the camera holds +// them — and picks the next move from what that frame offers. +// +// `botScene` is that frame. It is rebuilt every simulation tick from the same +// projection the stage paints with, so a rung is in the scene exactly when +// its lip lands on the screen a person would be watching. `botOptions` is the +// list of moves the scene affords from where the bot is standing: which of +// those rungs one jump reaches, from where; the span it can walk; the deck it +// could sink through. The brains below hold a goal (the summit, the +// opponent), pick the option that advances it as this tick's subgoal, and +// press for that — nothing in them reaches past the frame. +// +// One jump's ceiling, from the same numbers the fighter's legs use: with up +// held, the rise is v²/2g, and everything above it is out of reach. +const jumpApex = () => jumpVelocity * jumpVelocity / (2 * riseGravity()); +// A jump's horizontal budget onto a deck `dy` above the takeoff: the whole +// rise, then the fall from the apex down to the deck's height, walked at +// walking speed. Scaled down hard — the bot is committing to a lip, and a +// landing at the very end of the arc is a landing it can miss by one frame. +const botAirCommit = .6; +function jumpReach(dy) { + const riseSeconds = jumpVelocity / riseGravity(); + const fallSeconds = Math.sqrt(2 * Math.max(0, jumpApex() - dy) / fallGravity()); + return walkSpeed * (riseSeconds + fallSeconds) * botAirCommit; +} +// Where the feet are. Level 0 is the arena floor; a rung answers by its level. +function botFooting(player) { + if (!player.grounded) return null; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (Math.abs(player.y - ledge.y) <= 3 && + player.x >= ledge.left && player.x <= ledge.right) return { ...ledge }; + return { level: 0, left: platformLeft, right: platformRight, y: floorY }; +} +// The screen. The whole screen, not the action-safe rect: a person watching +// a television reads the rung above out of the sky the HUD floats over. +const botViewport = () => + ({ left: stageLeft, right: stageRight, top: 0, bottom: viewHeight }); +function pointInView(view, x, y, z = 0) { + const point = projectPoint(x, y, z); + return Number.isFinite(point.x) && Number.isFinite(point.y) && + point.x >= view.left && point.x <= view.right && + point.y >= view.top && point.y <= view.bottom; +} +// A rung is in view when any of its lip is: both ends projected, the span +// clipped against the screen's sides, its height inside the screen's top and +// bottom. A deck half off the right edge still offers its visible half. +function rungInView(view, ledge) { + const a = projectPoint(ledge.left, ledge.y, 0); + const b = projectPoint(ledge.right, ledge.y, 0); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite)) return false; + const y = (a.y + b.y) / 2; + return y >= view.top && y <= view.bottom && + Math.max(a.x, b.x) >= view.left && Math.min(a.x, b.x) <= view.right; +} + +function botScene(player, opponent, now) { + const view = botViewport(); + const footing = botFooting(player); + const rungs = []; + if (platformsEnabled()) for (const ledge of activeLedges()) + if (rungInView(view, ledge)) + rungs.push({ level: ledge.level, left: ledge.left, right: ledge.right, + y: ledge.y, dy: player.y - ledge.y }); + const scene = { + at: now, + view, + lens: { width: cameraDoll.width, x: cameraDoll.target.x, + y: cameraDoll.target.y }, + self: { x: player.x, y: player.y, vx: player.vx, vy: player.vy, + grounded: player.grounded, facing: player.facing, footing }, + floor: pointInView(view, clamp(player.x, platformLeft, platformRight), + floorY) ? { y: floorY, left: platformLeft, right: platformRight } : null, + rungs, + lava: survivalActive() && + pointInView(view, clamp(player.x, worldLeft, worldRight), survivalLavaY) + ? { y: survivalLavaY, below: survivalLavaY - player.y } : null, + opponent: null, + pickups: [], + }; + if (opponent && opponent.alive && opponent !== player && + pointInView(view, opponent.x, opponent.y - 90, opponent.z || 0)) { + const dx = opponent.x - player.x; + scene.opponent = { x: opponent.x, y: opponent.y, dx, dy: player.y - opponent.y, + distance: Math.abs(dx), facing: opponent.facing, + attacking: Boolean(opponent.attackKind) && now < opponent.attackUntil, + attackStartedAt: opponent.attackStartedAt }; + } + for (const pickup of [...gunPickups, ...saberPickups, ...grenadePickups]) + if (pickup.active && pointInView(view, pickup.x, pickup.y)) + scene.pickups.push({ kind: pickup.kind || "item", + x: pickup.x, y: pickup.y, dx: pickup.x - player.x }); + scene.options = botOptions(player, scene); + return scene; +} + +// The moves the scene affords from this footing. Every option names the deck +// it ends on, so a brain can pick by destination and then read off how to +// get there. In the air there is nothing to enumerate; the brain keeps the +// subgoal it left the ground with. +function botOptions(player, scene) { + const options = []; + const footing = scene.self.footing; + if (!footing) return options; + options.push({ kind: "walk", level: footing.level, y: footing.y, + left: footing.left, right: footing.right }); + const inset = survivalTune().landingInset; + const visible = new Set(scene.rungs.map(r=>r.level)); + const maxReach = jumpReach(0); + const nearby = queryBoxTree(platformBoxTree(), combatRect('jump-window', + footing.left-maxReach, footing.y-jumpApex(), footing.right+maxReach, footing.y)); + for (const box of nearby) { + const rung = box.ledge; + if (!visible.has(rung.level)) continue; + const dy = footing.y - rung.y; + if (dy <= 0 || dy > jumpApex()) continue; + const landLeft = rung.left + inset; + const landRight = rung.right - inset; + if (landRight < landLeft) continue; + const reach = jumpReach(dy); + // Where on this footing a jump can start and still come down on the + // landing band. An empty window is a deck the lens shows but the legs + // cannot have from here. + const takeoffLeft = Math.max(footing.left, landLeft - reach); + const takeoffRight = Math.min(footing.right, landRight + reach); + if (takeoffLeft > takeoffRight) continue; + const aim = clamp(player.x, landLeft, landRight); + options.push({ kind: "jump", level: rung.level, y: rung.y, dy, reach, + landLeft, landRight, takeoffLeft, takeoffRight, aim, + cost: Math.abs(aim - player.x) }); + } + if (footing.level > 0) { + // Sinking drops to whatever is under the feet — and only what is in + // frame counts, the same as a person deciding to fall. + let below = scene.floor ? { level: 0, y: floorY } : null; + for (const rung of scene.rungs) + if (rung.y > footing.y && player.x >= rung.left && + player.x <= rung.right && (!below || rung.y < below.y)) + below = { level: rung.level, y: rung.y }; + if (below) options.push({ kind: "sink", level: below.level, y: below.y, + dy: footing.y - below.y }); + } + return options; +} + +let platformTreeSource = null, platformTreeRevision = -1, platformTree = null; +function platformBoxTree() { + const ledges = activeLedges(); + if (platformTreeSource !== ledges || platformTreeRevision !== workshopRevision) { + platformTreeSource = ledges; platformTreeRevision = workshopRevision; + platformTree = buildBoxTree(ledges.map(ledge => combatRect('platform-'+ledge.level, + ledge.left,ledge.y,ledge.right,ledge.y+12,0,18,{ledge}))); + } + return platformTree; +} + +// The climb's subgoal: the highest deck one jump reaches from this footing, +// the nearest of them when two tie. On the ladder that is the deck above — +// two decks is 470 and the apex is 322 — but the choice is made from the +// scene, so a deck the lens has not shown yet is a deck the bot waits for. +function highestJump(options) { + let best = null; + for (const option of options) { + if (option.kind !== "jump") continue; + if (!best || option.y < best.y || + (option.y === best.y && option.cost < best.cost)) best = option; + } + return best; +} + +function botPad(player, opponent, now) { + if (selfPlay && typeof globalThis.__oskiewarJevPad === 'function') { + const scene = botScene(player, opponent, now); + scene.self.ducking = player.ducking; + scene.self.attackFrame = meleeFrame(player, now).frame; + scene.self.recoveryMs = Math.max(0, (player.attackUntil-now)/1000); + scene.self.combat = { + punch: Boolean(availableArm(player)), + kickLeft: hasPart(player, 'left-leg'), kickRight: hasPart(player, 'right-leg'), + item: Boolean(heldItem(player)), stunned: now < player.hitStunUntil, + headOnly: isHeadOnly(player), pogo: isPogo(player), + }; + if (scene.opponent) { + scene.opponent.grounded = opponent.grounded; + scene.opponent.vx = opponent.vx; scene.opponent.vy = opponent.vy; + scene.opponent.ducking = opponent.ducking; + scene.opponent.headOnly = isHeadOnly(opponent); + scene.opponent.pogo = isPogo(opponent); + scene.opponent.blocking = opponent.blocking; + scene.opponent.attackFrame = meleeFrame(opponent, now).frame; + scene.opponent.recoveryMs = Math.max(0, (opponent.attackUntil-now)/1000); + // The parent calls this only when preparing a model request, not every + // simulation tick. Probes read clones and never advance the live fight. + scene.strikeOptions = () => jevStrikeOptions(player, opponent, + runtime().simMonotonicUs || runtime().monotonicUs); + } + const down = globalThis.__oskiewarJevPad(player.pad, { ...scene, + round: matchName, alive: player.alive && opponent.alive }); + return { connected: true, down: Array.isArray(down) ? down.filter(button => + ['ArrowLeft','ArrowRight','ArrowUp','ArrowDown','A','B','X','Y'].includes(button)) : [], leftX: 0, leftY: 0 }; + } + if (!player.bot) { + player.botPresses = {}; + return { connected: true, down: [], leftX: 0, leftY: 0 }; + } + // Downed, or standing over a downed opponent, the bot opens nothing new — + // but presses already out still run their length instead of vanishing + // mid-hold, which would read as a poke. + if (!player.alive || !opponent.alive) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + + // A scored bot plays its sheet instead of thinking: rows of {at, button, + // hold} in µs from round start, through the same botPress door so holds + // and releases stay human-shaped. An empty score is a dummy that stands + // there and takes it — which is exactly what a sync lab needs on the + // receiving end. Scores arrive via globalThis.__oskiewarBotScores at round + // start; no score, and the brain below plays as always. + if (player.botScore) { + const at = now - roundStartedAt; + while (player.botScoreAt < player.botScore.length && + player.botScore[player.botScoreAt].at <= at) { + const row = player.botScore[player.botScoreAt]; + if (botPress(player, row.button, row.hold ?? botHoldUs.strike, now)) + player.botScoreAt += 1; + else break; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + + // The frame, and the opponent only as the frame shows them. The fight + // camera holds both fighters, so an opponent out of view is the rare case — + // but when it happens the bot has nothing to chase and opens nothing new. + const scene = botScene(player, opponent, now); + player.botScene = scene; + player.botGoal = "opponent"; + const seen = scene.opponent; + if (!seen) { + player.botSubgoal = null; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + const dx = seen.dx; + const distance = seen.distance; + const toward = Math.sign(dx) || player.facing || -1; + const opponentThreatening = seen.attacking && distance < 245 && + seen.facing === -toward; + const striking = botHeld(player, "A", now) || botHeld(player, "X", now); + + // A guard that answers every swing the frame it starts turns the round into + // punch-into-shield until the clock dies — the signal census reads punch×6, + // shield×6 per five seconds and nothing else. So the guard is human now: + // each incoming swing is noticed once, answered late, and sometimes not at + // all. The lapse is what lets damage through, and damage is what ends + // rounds. + if (opponentThreatening) { + if (player.botThreatSeen !== seen.attackStartedAt) { + player.botThreatSeen = seen.attackStartedAt; + const roll = botRoll(player); + player.botShieldAt = roll < 0.55 + ? now + 70000 + Math.round(roll * 250000) : Infinity; + } + } else player.botShieldAt = Infinity; + + // A shield that just ate a swing bought a stun. Swing into it now — the + // neutral-game cooldown would let the opening close unanswered. + if (player.shieldBrokenAt && + player.shieldBrokenAt !== player.botPunishedAt && + now - player.shieldBrokenAt < 80000) { + player.botPunishedAt = player.shieldBrokenAt; + player.botAttackAt = now; + } + + if (opponentThreatening && !striking && now >= player.botShieldAt) + botPress(player, "X", botHoldUs.shield, now); + else { + // The old spacing was tuned for a bigger fighter: stop walking at 155, + // swing at 225. A punch capsule tops out near 130 of separation and a + // kick near 170, so that band was whiff purgatory — the census read + // punch after punch with no body hit until the clock died. Close to + // where a swing actually lands, and swing only from there — and only on + // the ground: steering mid-air wedged the bot against a platform lip it + // used to clear. + if (player.grounded && distance > 95) + botPress(player, toward > 0 ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + // Items are ranged, so the bot spends them while closing rather than + // trading one for a swing it could land anyway. The grenade needs its arc. + const item = heldItem(player); + if (item && now >= player.botItemAt && + distance >= (item === "GUN" ? 320 : 1200) && + botPress(player, "Y", botHoldUs.item, now)) + player.botItemAt = now + 600000; + if (distance < 165 && now >= player.botAttackAt && + botPress(player, player.botAttackSequence % 2 ? "A" : "B", + botHoldUs.strike, now)) { + player.botAttackSequence += 1; + player.botAttackAt = now + 330000 + (player.botAttackSequence % 3) * 70000; + } + } + + // Up and down are read off the scene's options. An opponent a storey up + // is reached by the jump that lands on their deck when the frame offers + // one, and by a plain jump at them when it does not — the cube has no + // rungs, and there the old leap is the only vertical move there is. + const climb = seen.dy > 180 + ? scene.options.find((option) => option.kind === "jump" && + Math.abs(option.y - seen.y) <= 3) || null + : null; + player.botSubgoal = climb; + if (climb && Math.abs(climb.aim - player.x) > 24) + botPress(player, climb.aim > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + const canLeap = climb + ? player.x >= climb.takeoffLeft && player.x <= climb.takeoffRight + : seen.dy > 180; + if (player.grounded && canLeap && now >= player.botJumpAt && + botPress(player, "ArrowUp", botHoldUs.jump, now)) + player.botJumpAt = now + 1250000; + // Knocked up onto a deck the bot would camp out of reach, so it plays the + // same double-tap-down a player would: two real presses with a real + // release between them — and only through a deck the frame shows a floor + // under. + const sink = scene.options.find((option) => option.kind === "sink"); + if (sink && player.grounded && player.standingOn < 0 && + seen.dy < -200 && now >= player.botSinkAt) { + player.botSinkAt = now + 900000; + player.botSinkTaps = 2; + player.botSinkNextAt = now; + } + if (player.botSinkTaps > 0 && now >= player.botSinkNextAt && + botPress(player, "ArrowDown", botHoldUs.sinkTap, now)) { + player.botSinkTaps -= 1; + player.botSinkNextAt = now + botHoldUs.sinkTap + botRestUs; + } + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The climb bot's four numbers, gathered so they can be priced instead of +// guessed. `survival-lab.mjs` runs the ladder headlessly and sweeps one of +// these at a time; the defaults are exactly what the bot shipped with, and +// ordinary play never sets the override, so a human's attract-mode climb is +// unchanged by the seam existing. +const survivalTuneDefaults = { + landingInset: 72, // how far inside a deck's edge still counts as footing + walkThreshold: 24, // closer than this and walking is only jitter + // How far off the aim point the runner may still commit to a jump. This was + // 34, and 34 is why no reel ever summited: decks 5 and 6 do not overlap + // horizontally, so `dx` there never falls below 92 and the bot stood on the + // lip jumping straight up until the lava took it. Committing while the walk + // is still carrying it is what crosses a gap. Measured by `survival-lab.mjs`: + // ≤100 dies on deck 5, ≥110 summits all 32, and it still summits at 420 — + // 160 sits well inside that shelf rather than on its edge. + jumpThreshold: 160, + jumpCooldownUs: 580000, // the floor under one jump per deck + jumpHoldUs: botHoldUs.jump, // held past apex, or `jumpCutScale` clips the rise + // Per-reel variation. The ladder is fixed, the bot is fixed, and under the + // oven's fixed-step clock the round clock the bot's dice seed from is fixed + // too — so every slot rendered a frame-identical climb, and three reels + // shipped the same run. The oven passes a seed; it is folded into the + // fighter's dice once, which moves the aim from deck to deck while leaving + // any single seed exactly reproducible. Zero means no variation, which is + // what ordinary play uses, so a human's attract-mode climb is untouched. + seed: 0, + // Share of the landing band the aim may wander. Bought with `survival-lab`: + // .15 and .3 both summit 4/4, .45 and .6 drop to 3/4 because a hard bias + // toward a deck's edge can leave the next jump unmakeable. .3 is the most + // visible variation that still costs nothing. + aimJitter: .3, +}; +function survivalTune() { + const override = globalThis.__oskiewarSurvivalTune; + if (!override) return survivalTuneDefaults; + return { ...survivalTuneDefaults, ...override }; +} + +function survivalBotPad(player, now) { + if (!player.bot || !player.alive) + return { connected: true, down: [], leftX: 0, leftY: 0 }; + const tune = survivalTune(); + // Folded in once per run, before the first aim is taken. + if (tune.seed && player.survivalSeed !== tune.seed) { + player.survivalSeed = tune.seed; + player.botRngState = + (player.botRngState ^ Math.imul(tune.seed, 0x9e3779b9)) >>> 0; + } + // The frame, every tick. The goal is the summit; the subgoal is the deck + // this frame offers a jump onto. On the ground that is re-chosen from the + // scene each tick — in the air the runner holds the deck it left for. + const scene = botScene(player, null, now); + player.botScene = scene; + player.botGoal = "summit"; + const footing = scene.self.footing; + if (footing) { + const next = highestJump(scene.options); + if (next && next.level !== player.survivalTargetLevel) { + player.survivalTargetLevel = next.level; + // One roll per deck, not per tick: the runner should commit to a line + // and hold it, and rolling every frame would average the wander back + // to zero. + player.survivalAimBias = tune.seed ? botRoll(player) - .5 : 0; + } + player.botSubgoal = next; + if (!next) { + // Nothing above in frame. Stand where a deck cannot end under you — + // the lens is catching up, and the next rung arrives in it. + const middle = (footing.left + footing.right) / 2; + if (Math.abs(middle - player.x) > tune.walkThreshold) + botPress(player, middle > player.x ? "ArrowRight" : "ArrowLeft", + botHoldUs.walk, now); + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + } + } + const target = player.botSubgoal; + if (!target) + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; + // Aim for the nearest safe point on the landing band, not the deck's + // center: a centered aim walked the bot to the lip of an overlapping pair + // and waited forever when the remaining seven units were smaller than its + // jump threshold. The seeded wander moves the aim along the band. + const aim = clamp(clamp(player.x, target.landLeft, target.landRight) + + (player.survivalAimBias || 0) * (target.landRight - target.landLeft) * + tune.aimJitter, target.landLeft, target.landRight); + const dx = aim - player.x; + if (Math.abs(dx) > tune.walkThreshold) + botPress(player, dx > 0 ? "ArrowRight" : "ArrowLeft", botHoldUs.walk, now); + // Commit inside the option's own budget or the tuned threshold, whichever + // is tighter — the threshold was priced by `survival-lab.mjs`, and the + // budget keeps a lab sweep from asking for a jump the legs cannot land. + if (player.grounded && Math.abs(dx) <= Math.min(tune.jumpThreshold, target.reach) && + player.x >= target.takeoffLeft && player.x <= target.takeoffRight && + now >= player.botJumpAt && + botPress(player, "ArrowUp", tune.jumpHoldUs, now)) + player.botJumpAt = now + tune.jumpCooldownUs; + return { connected: true, down: botDown(player, now), leftX: 0, leftY: 0 }; +} + +// The replay oven needs a bounded completion record, not a production replay. +// Its injected fetch keeps this envelope inside the local shell; ordinary +// survival never records, publishes, or analyzes a run. Keeping the seam +// explicit prevents a `?replay-oven` URL typed in a normal browser from +// turning an anonymous climb into stored match data. +function captureSurvivalRun(now, result) { + if (globalThis.__oskiewarCaptureSurvival !== true || + typeof saveReplay !== "function") return; + const tickUs = 1000000 / 60; + const durationTicks = Math.max(1, + Math.round((now - survivalStartedAt) / tickUs)); + // The clock this is built from is fixed under an offline fixed-step pass, so + // without the seed every reel in a day filed the same name — and that name + // becomes the reel's Instagram `audio_name` (`audioNameFor`), which is only + // honoured on the post that mints it. Live climbs pass no seed and keep the + // original name. + const runSeed = survivalTune().seed >>> 0; + const roundName = "survival-v" + buildVersion + "-" + + Math.max(0, Math.round(survivalStartedAt / tickUs)) + + (runSeed ? "-" + runSeed.toString(36) : ""); + const runner = players[0]; + const height = Math.round(survivalHeight); + const demo = { + format: "ac.oskiewar.survival", version: 1, game: "oskiewar", + simulation: "oskiewar-survival-1", tickRate: 60, + matchId: "ow-" + roundName, matchName: roundName, + roundId: "ow-" + roundName, roundName, roundIndex: 0, + startedAt: runtime().unixMs - Math.round(durationTicks / 60 * 1000), + durationTicks, fighters: [runner.name], nations: [runner.nation || ""], + winner: result === "SUMMIT" ? runner.name : null, + finalRoundWins: [result === "SUMMIT" ? 1 : 0], + cause: result, height, + commands: [], checkpoints: [], impacts: [], + events: [[0, "climb", 0, 1, 0], + [durationTicks, "survival-end", 0, height, + result === "SUMMIT" ? 1 : 0]], + }; + const upload = saveReplay(JSON.stringify(demo)); + if (upload && typeof upload.catch === "function") + upload.catch((error) => telemetry("SURVIVAL_CAPTURE", + "local-error " + error.message)); +} + +function finishSurvival(now, result) { + if (roundResult) return; + const runner = players[0]; + survivalBestHeight = Math.max(survivalBestHeight, survivalHeight); + roundResult = result; + roundCause = result; + roundOverAt = now; + runner.vx = 0; + runner.vy = 0; + if (result === "LAVA") { + runner.alive = false; + runner.stance = "HIT"; + spawnImpact({ x: runner.x, y: survivalLavaY, z: runner.z, + life: 1.2, duration: 1.2, death: true, explosion: true, + blastRadius: 240, power: .8 }); + playDrum("kick", 1.25, panPlayer(runner)); + playSine(92, .45); + } else { + playDrum("clap", 1.2, 0); + playSine(880, .3); + } + globalThis.__oskiewarResultLine = result === "SUMMIT" + ? "summit!" : Math.round(survivalHeight) + " high"; + emitSignal("survival-end", 0, Math.round(survivalHeight), + result === "SUMMIT" ? 1 : 0); + captureSurvivalRun(now, result); +} + +function updateSurvival(dt, now) { + const runner = players[0]; + const height = Math.max(0, floorY - runner.y); + survivalHeight = Math.max(survivalHeight, height); + runner.score = Math.round(survivalHeight); + while (survivalPeakLevel < platforms.length && + runner.y <= platforms[survivalPeakLevel].y + 2) + survivalPeakLevel++; + const lavaSpeed = survivalLavaBaseSpeed + + Math.min(76, survivalHeight * .008); + survivalLavaY -= lavaSpeed * dt; + const body = runnerBounds(runner, (now - startedAt) / 1000000); + if (body.bottom >= survivalLavaY) finishSurvival(now, "LAVA"); + else if (survivalPeakLevel >= platforms.length && runner.grounded) + finishSurvival(now, "SUMMIT"); +} + +function drawAirDropSky(t) { + const shift = ((cameraCenterY * .14) % viewHeight + viewHeight) % viewHeight; + const ink = mixColor([65,115,155], [230,248,255], visualTheme.light); + for (let i = 0; i < 14; i++) { + const x = ((i * 197 + 53) % 997) / 997 * viewWidth(); + const y = ((i * 113) % viewHeight - shift + viewHeight) % viewHeight; + screenRect(x, y, 2 + i % 2, 16 + i % 4 * 9, ink); + } +} + +function gameSim() { + captureRenderInterpolationState(); + syncGameView(); + const now = runtime().monotonicUs; + const dt = Math.min(0.04, Math.max(0.001, (now - lastSimAt) / 1000000)); + lastSimAt = now; + // Whether a door is in the way is state, not decoration: the same answer + // gates the fight, the claim and the wire, so it is settled once on the tick + // rather than re-asked by each of them mid-paint. + updateAccountDoor(); + if (resimPending) { + startResim(resimPending, now); + resimPending = null; + } else if (resimActive) { + // Demo ticks count every sim step from the reset, intro included — the + // drift meter has to count in the same currency. + resimTick++; + advanceResimCommands(); + } + if (roundViewer && !netSession) { + // The chair-holder's hands are local even when the fight is not. The + // control legend, the M30 manual page and the touch discs all light off + // inputPads[0], and the debug toggle wants a View edge — none of that + // may wait on the host's echo, so the local pad is sampled here exactly + // as it would be in a hosted fight. + padSnapshots[0] = samplePad(0); + inputPads[0] = padSnapshots[0]; + const down = padSnapshots[0]?.down || []; + if (down.includes("View") && !viewerSystemPrevious.includes("View")) { + debugHitboxes = !debugHitboxes; + debugPerfReported = false; + telemetry("FIGHT_DEBUG", debugHitboxes ? "on" : "off"); + } + viewerSystemPrevious = down.slice(); + updateRoundViewer(now, dt); + // A visitor who holds the second chair plays through this screen: their + // pad goes up the wire every tick it changes, and a room found hostless + // becomes theirs to host. + sendChallengerInput(now); + netChallengerHello(now); + updateVersusClaim(now); + return; + } + padSnapshots[0] = samplePad(0); + padSnapshots[1] = samplePad(1); + padSnapshots[2] = samplePad(2); + inputPads[0] = padSnapshots[0]; + inputPads[1] = padSnapshots[1]; + if (updateLocalVersus(now)) { + consumeSystemButtons(now); + return; + } + const cameraPads = localVersusActive() ? padSnapshots : [padSnapshots[0]]; + const cameraX = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightX) || 0), 0), -1, 1); + const cameraY = clamp(cameraPads.reduce((sum, pad) => + sum + (Number(pad?.rightY) || 0), 0), -1, 1); + if (Math.abs(cameraX) > .08) + playerCameraYaw = clamp(playerCameraYaw + cameraX * dt * 1.15, -.62, .62); + if (Math.abs(cameraY) > .08) + playerCameraPitch = clamp(playerCameraPitch + cameraY * dt * .72, -.24, .28); + // Triggers zoom, but only on a pad whose triggers are analog -- on anything + // else the shell is still aliasing them to A and X, and stealing those two + // buttons would cost a small pad its item and shield. + // Either couch seat can steer the shared camera. Digital M30 shoulders + // remain combat buttons, even beside a controller with analog triggers. + const push = clamp(cameraPads.reduce((sum, pad) => sum + (pad?.analogTriggers + ? (Number(pad.leftTrigger) || 0) - (Number(pad.rightTrigger) || 0) : 0), 0), -1, 1); + if (Math.abs(push) > .08) + playerCameraZoom = clamp(playerCameraZoom + push * dt * .9, .55, 1.9); + // A mouse or a finger on the shell's canvas orbits the same lens the + // right stick does: a drag turns yaw and pitch, the wheel or a pinch + // dollies. The shell banks the gesture between ticks and this drains it, + // so a fast flick is not lost to a slow frame. + const orbit = globalThis.__oskiewarTouch?.orbit; + if (orbit) { + if (orbit.yaw) + playerCameraYaw = clamp(playerCameraYaw + orbit.yaw, -.62, .62); + if (orbit.pitch) + playerCameraPitch = clamp(playerCameraPitch + orbit.pitch, -.24, .28); + if (orbit.zoom) + playerCameraZoom = clamp(playerCameraZoom * Math.exp(orbit.zoom), .55, 1.9); + orbit.yaw = orbit.pitch = orbit.zoom = 0; + } + // A tap anywhere on the wordmark screen is a start press — read before + // the tap queue is wiped for the tick. The shell already turns first-visit + // taps into a button; this catches every visit after that. + const titleTapped = shellMode === "MENU" && !selecting && + (globalThis.__oskiewarTouch?.taps?.length || 0) > 0; + if (!selecting && Array.isArray(globalThis.__oskiewarTouch?.taps)) + globalThis.__oskiewarTouch.taps.length = 0; + if (consumeSystemButtons(now)) { + if (netSession) netLeave("system-button"); + return; + } + // The wordmark screen is a live training round, so the shell reads start + // and then falls straight through into the fight it is sitting on top of. + if (shellMode === "MENU") updateShell(now, titleTapped); + else updateMatchPace(now); + // The versus seat watches from the title on — a friend can take the chair + // while the host is still reading the wordmark, and the fight lifts it. + updateVersusSeat(now); + updateLobbyMortality(now); + if (survivalActive() && shellMode === "MENU") { + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + for (const player of players) + inputPads[player.pad] = netFrameInputs + ? netPadFromMask(netFrameInputs[player.pad]) + : resimActive && resimCommands + ? resimPad(player.pad) + : player.remote ? remotePadSnapshot() + : player.bot && shellMode === "GAME" + ? survivalActive() && player.pad === 0 + ? survivalBotPad(player, now) + : botPad(player, players[player.pad ? 0 : 1], now) + : player.npc ? { connected: true, down: [], leftX: 0, leftY: 0 } + : padSnapshots[player.pad]; + // Start belongs to the shell, including its hold and transition frames. + // The first neutral sample releases gameplay for the next fresh press. + if (!players[0].bot && !players[0].remote && !netFrameInputs && !resimActive) { + const pad = inputPads[0]; + if (shellMode === "MENU" || startInputPending) { + startInputPending = shellMode === "MENU" || pad.down.length > 0 || + Math.abs(pad.leftX || 0) > .08 || Math.abs(pad.leftY || 0) > .08; + inputPads[0] = { ...pad, down: [], leftX: 0, leftY: 0 }; + } + } + if (debugHitboxes && now >= nextInputDebugAt) { + nextInputDebugAt = now + 500000; + const values = players.map((player) => { + const pad = inputPads[player.pad]; + const input = quantizedInput(pad, player.suppressedDirections); + return "P" + (player.pad + 1) + " down=" + + (pad.down.join("+") || "NONE") + " stick=" + + pad.leftX.toFixed(2) + "," + pad.leftY.toFixed(2) + " q=" + + input.horizontal + "," + input.vertical + " vx=" + + Math.round(player.vx); + }); + telemetry("FIGHT_INPUT", values.join(" | ")); + } + recordReplayCommands(now, inputPads); + // Session first: the hand-off frame must leave before the round's first + // frame walks the native shell's one socket over to the round room. + publishSession(now); + publishSpectator(now); + publishVersus(now); + if (survivalActive() && roundResult) { + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + if (now - roundOverAt >= roundResultUs) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSurvivalRun(now, true); + else returnToTitle(now, "survival-end"); + } + return; + } + if (roundResult) { + // The scored tail. The killcam dwell used to be the reel's quietest + // seconds under its most dramatic frames, so the dwell keeps a slow + // heartbeat and the result card lands with a sting of its own. Voice on + // the drum channel, record on unrouted signal names, as everywhere. + if (!resultPulseAt) resultPulseAt = roundOverAt + 900000; + if (now >= resultPulseAt) { + resultPulseAt = now + 1050000; + playDrum("kick", .3, 0); + emitSignal("result-pulse", -1, 0, 0); + } + if (!resultCardStung && now - roundOverAt >= 1100000) { + resultCardStung = true; + playDrum("bell", .95, 0); + // The card's own line rides a global for whichever shell can speak: + // the web shell reads it back through speech synthesis on this same + // signal. Signals carry numbers, and the sentence is presentation. + // The anonymous seat wears a blank nameplate, and a blank name read + // aloud is a stumble — but only the local first seat can be nameless, + // so a nameless winner is always "you". + const card = resultCardText(); + const spokenWinner = card.winner.replace(/^@/, ""); + globalThis.__oskiewarResultLine = roundResult === "TIE" ? "tie!" + : (spokenWinner ? spokenWinner + " wins the " : "you win the ") + + (matchOver ? "match" : "round"); + emitSignal("result-card", -1, roundResult === "TIE" ? 0 : 1, 0); + // The winner gets the last word: a staccato synthesized laugh rides + // out of the bell. A tie amuses nobody. + if (roundResult !== "TIE") { + resultLaughAt = now + 420000; + resultLaughStep = 0; + // The mouth opens on the sting and the laugh lands in it — the same + // open-ring LAUGH face the A+B chord earns, dealt automatically to + // the winner unless they have already chosen their own gloat. + const winner = roundWinner(); + if (winner?.alive && !winner.resultReaction) { + winner.resultReaction = "LAUGH"; + winner.resultReactionAt = now; + } + } + } + if (resultLaughAt && resultLaughStep < 5 && now >= resultLaughAt) { + playSine([760, 640, 700, 580, 500][resultLaughStep], .09); + playDrum("hat", .16, 0); + if (resultLaughStep === 0) emitSignal("victory-laugh", -1, 1, 0); + resultLaughAt = now + 112000 + resultLaughStep * 24000; + resultLaughStep++; + } + if (INSTANT_REPLAY && instantReplay) { + updateInstantReplay(now, dt); + return; + } + if (INSTANT_REPLAY) { + const replayDown = padSnapshots[0]?.down || []; + if (replayDown.includes("Y") && !replayOfferPrevious.includes("Y") && + startInstantReplay(now)) return; + replayOfferPrevious = replayDown.slice(); + } + const cinematicWinner = deathCinematic + ? players[deathCinematic.winnerPad] : null; + if (cinematicWinner?.alive) updatePlayer(cinematicWinner, + { connected: true, down: [], leftX: 0, leftY: 0 }, dt, now); + // Severed pieces belong to the action too; the result clock must not pin + // them in mid-air while the surviving body completes its landing. + updateBullets(dt, now, false); + updateGrenades(dt, now, false); + updateDetachedParts(dt); + updateResultImpactDebris(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + const resultDuration = matchOver ? matchResultUs : roundResultUs; + if (now - roundOverAt >= resultDuration) { + emitSignal("update-safe", -1, buildVersion, 0); + if (selfPlay) startSelfPlay(now); + // A versus result rolls straight into the next round while the rival's + // wire stays warm — the room, not the title, is home base. A finished + // match deals fresh, a finished round keeps the tally. + else if (versusActive() && versusChallengerFresh()) + startVersusFight(now, matchOver); + else if (versusActive()) beginVersusLobby(now); + else if (localVersusActive()) { + if (matchOver) startLocalVersus(now); + else resetRound(now, false); + } + else returnToTitle(now, "round-end"); + } + return; + } + if (PAL_SELECT && selecting) { + updateSelect(now); + return; + } + if (now - roundStartedAt < roundIntroDurationUs()) { + // The intro used to pass in silence — a reel that opens on the countdown + // opened on three mute seconds, and a player heard the round begin with + // nothing. Ring the "3, 2, 1" on the same two channels the round clock + // uses: the drum for the ear, the signal for the record. + const introSecond = Math.ceil( + (roundIntroDurationUs() - (now - roundStartedAt)) / 1000000); + if (introSecond !== lastIntroSecond) { + lastIntroSecond = introSecond; + // playDrum is the voice, the signal is the record — the "countdown" + // name is deliberately not in the sfx routes, or the web would voice + // every bell twice. value2 marks these as the intro's. + playDrum("bell", .72 + (3 - introSecond) * .12, 0); + emitSignal("countdown", -1, introSecond, 1); + } + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + return; + } + if (lastIntroSecond > 0) { + // The first live tick after the intro is the mode opening — one accent, + // so the callout is a sound and not just a vanished word. + lastIntroSecond = -1; + playDrum("block", 1.1, 0); + if (survivalActive()) { + globalThis.__oskiewarStartLine = "climb!"; + emitSignal("climb", 0, 1, 0); + } else emitSignal("fighters-lock", -1, 0, 0); + } + roundElapsedUs += dt * 1000000; + const timedRound = roundIsTimed(); + if (timedRound) { + const countdownSecond = Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + if (countdownSecond > 0 && countdownSecond <= 10 && + countdownSecond !== lastCountdownSecond) { + lastCountdownSecond = countdownSecond; + playDrum("bell", 1 + (10 - countdownSecond) * .025, 0); + emitSignal("countdown", -1, countdownSecond, 0); + } + } + if (survivalActive()) { + updatePlayer(players[0], inputPads[0], dt, now); + updateSurvival(dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + } else { + updateWind(dt, now); + for (const player of players) updatePlayer(player, inputPads[player.pad], dt, now); + updateSkateRopes(dt); + resolvePlayerStanding(now); + resolvePlayerPushboxes(); + updateFallingPickups(dt, now); + updatePowerups(now); + updateBodyTrees(dt, now); + updateBullets(dt, now); + updateGrenades(dt, now); + resolveMelee(now); + resolvePogoAttacks(now); + updateLobbyMortality(now); + // After the exchange resolves, so a frame that landed a hit reads as the + // recovery it has become rather than as the active frame it was. + recordFrameMeter(now); + for (const item of balls) updateBall(item, dt, now); + updateDetachedParts(dt); + updateCamera(dt); + updateCameraDoll(dt, now); + captureFrameTelemetry(now); + captureRoundReplay(now); + recordReplayCheckpoint(now); + trackResimDrift(now); + } + for (const impact of impacts) { + if (!impact.debris) { + // A fresh impact heats the tile it landed in. The debris check is the + // once-per-impact gate — the first sim tick is the only tick an impact + // exists without motes — so a hit stamps its cell exactly once, and + // the overlay on the back wall shows the fight's last half-second as + // cooling squares. + if (onGridField(impact.x, impact.y)) { + const cell = gridFieldIndex(impact.x, impact.y); + gridField[cell] = Math.min(1, gridField[cell] + + (impact.explosion ? 1 : impact.death ? .9 : .55)); + } + const count = impact.explosion ? 24 : impact.death ? 10 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.explosion + ? 1180 + (impact.power || 0) * 720 + : impact.death ? 660 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 260, + vz: Math.sin(angle * 1.7) * force * .22, + radius: impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; + mote.y += mote.vy * dt; + mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; + mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); + // The tile field cools between stamps — a fixed exponential against the + // fixed 60 Hz step, so a replayed round heats and fades identically. Cells + // snap to zero below a hundredth so a quiet map is exactly zeros. + for (let cell = 0; cell < gridField.length; cell++) + gridField[cell] = gridField[cell] < .01 ? 0 + : gridField[cell] * Math.exp(-dt * 1.6); + if (!survivalActive() && !lobbyActive() && + ((freeForAll() ? players.filter((player) => player.alive).length <= 1 + : players.some((player) => !player.alive)) || + (timedRound && roundElapsedUs >= roundDurationUs))) { + if (timedRound && roundElapsedUs >= roundDurationUs && + players.every((player) => player.alive)) + roundCause = "TIME"; + finishRound(now); + } +} + +function updateResultImpactDebris(dt) { + for (const impact of impacts) { + if (!impact.debris) { + const count = impact.death ? 20 : impact.explosion ? 24 : 6; + impact.debris = Array.from({ length: count }, (_, index) => { + const angle = index / count * Math.PI * 2 + + Math.sin(impact.x * .013 + impact.y * .007) * .7; + const force = (impact.death ? 920 : impact.explosion ? 1180 : 420) * + (.65 + (index % 3) * .17); + return { x: impact.x, y: impact.y, z: impact.z || 0, + vx: Math.cos(angle) * force, vy: Math.sin(angle) * force - 360, + vz: Math.sin(angle * 1.7) * force * .28, + radius: impact.death ? 7 : impact.explosion ? 9 : 6 }; + }); + } + for (const mote of impact.debris) { + mote.vy += fallGravity() * .72 * dt; + mote.x += mote.vx * dt; mote.y += mote.vy * dt; mote.z += mote.vz * dt; + const surface = terrainFloorAt(mote.x) - mote.radius; + if (mote.y > surface) { + mote.y = surface; + mote.vy = -Math.abs(mote.vy) * .32; + mote.vx *= .76; mote.vz *= .76; + } + } + impact.life -= dt; + } + while (impacts.length && impacts[0].life <= 0) impacts.shift(); +} + +function circle(x, y, radius, width, color) { + let lastX = x + radius; + let lastY = y; + for (let i = 1; i <= 12; i++) { + const angle = i * Math.PI * 2 / 12; + const nextX = x + Math.cos(angle) * radius; + const nextY = y + Math.sin(angle) * radius; + line(lastX, lastY, nextX, nextY, width, ...color); + lastX = nextX; + lastY = nextY; + } +} + +// Discs are the piece's bulk geometry — every capsule end, every joint. The +// unit ring is constant, so the trig runs once at load, and fanning from a rim +// vertex covers the identical decagon in 8 faces instead of 10 from the center +// (cull is off, depth is flat, colors are flat — the rasterized pixels match). +// A silhouette only has to be as fine as its size on screen. A limb cap a few +// pixels across reads round at six sides; a head at ninety does not, and used +// to show its corners. Rings are precomputed per step so no trig runs inside a +// frame, and the small end is cheaper than the one fixed ring it replaces. +const discRings = [6, 8, 12, 16, 24, 32].map((sides) => { + const ring = []; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + ring.push(Math.cos(a), Math.sin(a)); + } + return ring; +}); +const discRingFor = (radius) => discRings[ + radius < 6 ? 0 : radius < 13 ? 1 : radius < 26 ? 2 + : radius < 52 ? 3 : radius < 110 ? 4 : 5]; + +function filledDisc(x, y, radius, color) { + const [r, g, b] = color; + if (typeof disc3d === "function" && disc3d(x, y, triangleDepth, radius, r, g, b)) return; + const ring = discRingFor(radius); + const originX = x + ring[0] * radius, originY = y + ring[1] * radius; + let lastX = x + ring[2] * radius, lastY = y + ring[3] * radius; + for (let side = 4; side < ring.length; side += 2) { + const nextX = x + ring[side] * radius; + const nextY = y + ring[side + 1] * radius; + screenTriangle(originX, originY, lastX, lastY, nextX, nextY, r, g, b); + lastX = nextX; + lastY = nextY; + } +} + +function filledRing(x, y, outerRadius, innerRadius, color) { + const [r, g, b] = color; + const sides = 14; + const inner = Math.max(0, Math.min(outerRadius, innerRadius)); + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + const outerA = { x: x + Math.cos(a) * outerRadius, + y: y + Math.sin(a) * outerRadius }; + const outerB = { x: x + Math.cos(b) * outerRadius, + y: y + Math.sin(b) * outerRadius }; + const innerA = { x: x + Math.cos(a) * inner, + y: y + Math.sin(a) * inner }; + const innerB = { x: x + Math.cos(b) * inner, + y: y + Math.sin(b) * inner }; + screenTriangle(outerA.x, outerA.y, innerA.x, innerA.y, + outerB.x, outerB.y, r, g, b); + screenTriangle(innerA.x, innerA.y, innerB.x, innerB.y, + outerB.x, outerB.y, r, g, b); + } +} + +function filledCapsule(x1, y1, x2, y2, width, color) { + const [r, g, b] = color; + const dx = x2 - x1; + const dy = y2 - y1; + const length = Math.hypot(dx, dy); + const radius = width / 2; + if (length < .001) { + filledDisc(x1, y1, radius, color); + return; + } + const nx = -dy / length * radius; + const ny = dx / length * radius; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); + filledDisc(x1, y1, radius, color); + filledDisc(x2, y2, radius, color); +} + +// Xbox batches GPU triangles above its D2D line layer, so every bone and joint +// must share this triangle path. The wider silhouette pass and color pass form +// conventional rounded capsules without the native renderer reordering them. +function damagedPartColor(color, player, part) { + const damage = Number(player?.partDamage?.[part] || 0); + if (!damage) return color; + const durability = part === "torso" ? 3 : 2; + const amount = clamp(damage / durability * .92, 0, .92); + return mixColor(color, [244, 34, 50], amount); +} + +function generatedAppearance(player) { + const selected = globalThis.__oskiewarFighterAppearance; + if (!selected || Date.now() >= selected.validUntil || player?.pad !== 0 || player.npc || + netSession || roundViewer || versusLane() || survivalActive() || shellMode !== "GAME") return null; + return selected.appearance; +} +function generatedPartColor(appearance, segment) { + const role = segment.role || ""; + if (/foot/.test(role)) return appearance.shoes; + if (/thigh|shin|leg/.test(role)) return appearance.pants; + if (/forearm|hand/.test(role) && appearance.sleeves === "short") return appearance.skin; + return appearance.shirt; +} + +// Retained photographic materials use the same projected poses and collision +// surfaces as the vector theme. Assets are uploaded by the native host once. +let photoThemeActive = false; +const photoRegions = { + acHead: [80, 104, 285, 285], xboxHead: [524, 104, 285, 285], + acLimb: [1058, 48, 104, 372], xboxLimb: [1503, 48, 104, 372], + gun: [51, 543, 365, 253], skateboard: [460, 611, 412, 136], + platform: [900, 606, 418, 162], rocket: [1368, 542, 372, 236], + concrete: [970, 625, 270, 43], wall: [930, 698, 350, 55], +}; +function photoSprite(region, x, y, width, height, angle = 0, flip = false, + depth = triangleDepth) { + if (!photoThemeActive || ![x, y, width, height, angle, depth].every(Number.isFinite) || + width <= 0 || height <= 0 || width > 30000 || height > 30000 || + Math.abs(x) > 30000 || Math.abs(y) > 30000) return false; + return themeSprite(1, ...photoRegions[region], x, y, width, height, + angle, flip, depth) !== false; +} +function photoLimb(segment, seat) { + const dx = segment.x2 - segment.x1, dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy); + if (length < .001) return; + photoSprite(seat === 0 ? "acLimb" : "xboxLimb", + (segment.x1 + segment.x2) / 2, (segment.y1 + segment.y2) / 2, + segment.width, length + segment.width, + Math.atan2(dy, dx) - Math.PI / 2); +} +function photoSurface(region, a, b, c, d) { + if (!photoThemeActive || typeof themeQuad !== "function") return false; + const points = [a, b, c, d]; + if (points.some(p => ![p.x,p.y,p.z].every(Number.isFinite) || + Math.abs(p.x) > 30000 || Math.abs(p.y) > 30000)) return false; + const wall = region === "wall"; + return themeQuad(wall ? 0 : 1, ...(wall ? [550,180,500,500] : photoRegions[region]), + a.x,a.y,a.z, b.x,b.y,b.z, c.x,c.y,c.z, d.x,d.y,d.z) !== false; +} + +function drawSkeletonSegments(segments, color, outline, player = null) { + if (photoThemeActive && player) { + for (const segment of segments) + if (!segment.hitboxOnly) photoLimb(segment, player.pad); + return; + } + const edge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + if (player?.skateboard) segments = segments.slice().sort((a, b) => b.depth - a.depth); + for (const segment of segments) { + if (segment.hitboxOnly) continue; + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + edge * 2, outline); + } + for (const [index, segment] of segments.entries()) { + if (segment.hitboxOnly) continue; + const appearance = generatedAppearance(player); + drawPaletteCapsule(segment, appearance ? null : player && !player.npc + ? player.handleColors : null, index, appearance ? generatedPartColor(appearance, segment) : color, player); + } +} + +function paletteColorAt(colors, coordinate, fallback) { + if (!colors?.length) return fallback; + const wrapped = ((coordinate % colors.length) + colors.length) % colors.length; + const first = Math.floor(wrapped); + const second = (first + 1) % colors.length; + return mixColor(colors[first], colors[second], wrapped - first); +} + +function drawPaletteCapsule(segment, colors, coordinate, fallback, player = null) { + // The gradient's resolution is an experiment dial: six bands is the look, + // one band is a flat capsule at a third of the faces. + const bands = colors?.length > 1 + ? clamp(Math.round(renderFlags.bands ?? 6), 1, 6) : 1; + if (bands === 1) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width, damagedPartColor(fallback, player, segment.part)); + return; + } + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const length = Math.hypot(dx, dy) || 1; + const radius = segment.width / 2; + const nx = -dy / length * radius; + const ny = dx / length * radius; + let firstColor = fallback; + let lastColor = fallback; + for (let band = 0; band < bands; band++) { + const from = band / bands; + const to = (band + 1) / bands; + // A small overlap keeps the gradient continuous after integer projection. + const overlap = bands > 1 ? .012 : 0; + const x1 = lerp(segment.x1, segment.x2, Math.max(0, from - overlap)); + const y1 = lerp(segment.y1, segment.y2, Math.max(0, from - overlap)); + const x2 = lerp(segment.x1, segment.x2, Math.min(1, to + overlap)); + const y2 = lerp(segment.y1, segment.y2, Math.min(1, to + overlap)); + const mapped = paletteColorAt(colors, + coordinate + (from + to) * .5, fallback); + const color = damagedPartColor(mapped, player, segment.part); + if (band === 0) firstColor = color; + if (band === bands - 1) lastColor = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, ...color); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, ...color); + } + filledDisc(segment.x1, segment.y1, radius, firstColor); + filledDisc(segment.x2, segment.y2, radius, lastColor); +} + +function distantFighterLocator(player, head) { + if (!player?.alive || shellMode !== "GAME" || head.radius >= 8 || + ![head.x, head.y, head.radius].every(Number.isFinite)) return null; + const safe = actionSafeRect(); + const size = compactLayout() ? 24 : 28; + const fullName = visibleHandle(player); + const label = fullName.length > 16 ? fullName.slice(0, 14) + ".." : fullName; + const width = handleWidth(label, size) + 24; + const height = size + 12; + // Leave the top controls/debug block and bottom player/music HUD clear. + const top = Math.max(safe.top + 64, viewHeight * .24); + const bottom = Math.min(safe.bottom - 96, viewHeight * .78); + const anchorX = clamp(head.x, safe.left + 10, safe.right - 10); + const anchorY = clamp(head.y, safe.top + 10, safe.bottom - 10); + const x = clamp(anchorX - width / 2, safe.left + 8, safe.right - width - 8); + // Opposite vertical offsets keep two nearby fighters' labels distinct. + const offset = player.pad === 1 ? 18 : -height - 18 - (player.pad === 2 ? height + 8 : 0); + const y = clamp(anchorY + offset, top, bottom - height); + return { x, y, width, height, size, label, anchorX, anchorY, color: player.color }; +} + +function drawDistantFighterLocator(player, head) { + const marker = distantFighterLocator(player, head); + if (!marker) return; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + try { + const { x, y, width, height, anchorX: ax, anchorY: ay, color } = marker; + const edgeY = ay < y ? y : y + height; + filledCapsule(ax, ay, clamp(ax, x + 10, x + width - 10), edgeY, 2, color); + screenTriangle(ax - 8, ay, ax, ay - 8, ax + 8, ay, ...color); + screenTriangle(ax - 8, ay, ax + 8, ay, ax, ay + 8, ...color); + screenRect(x, y, width, height, [9, 10, 20]); + screenRect(x, y, 3, height, color); + typeWrite(marker.label, x + 12, y + 6, marker.size, ...color); + } finally { triangleDepth = previousDepth; } +} + +function drawFighterSilhouette(geometry, color, outline, player = null) { + drawSkeletonSegments(geometry.segments, color, outline, player); + if (photoThemeActive && player) { + const head = geometry.head, seat = player.pad === 0 ? 0 : 1; + photoSprite(seat ? "xboxHead" : "acHead", head.x, head.y, + head.radius * 2, head.radius * 2, + isHeadOnly(player) ? player.headRoll || 0 : player.skateRotation || 0, + (seat === 0 ? 1 : -1) !== (player.facing || 1), triangleDepth - .01); + return; + } + const headEdge = Math.max(1.25, Math.min(3, cameraScale() * 1.8)); + // The neck connector and solid head are emitted into the same triangle + // silhouette pass, so the head cannot detach as a separate line-layer ring. + filledDisc(geometry.head.x, geometry.head.y, + geometry.head.radius + headEdge, outline); + // AC stores the @ glyph first; the face is the identity anchor for the same + // palette that distorts continuously across the body below it. + const appearance = generatedAppearance(player); + const headColor = appearance ? appearance.skin : player && !player.npc && player.handleColors?.length + ? player.handleColors[0] : color; + filledDisc(geometry.head.x, geometry.head.y, geometry.head.radius, headColor); + if (appearance) { + const { x, y, radius: r } = geometry.head; + if (appearance.hairStyle !== "none") { + filledCapsule(x - r * .7, y - r * .65, x + r * .7, y - r * .65, + r * (appearance.hairStyle === "curly" ? .75 : .48), appearance.hair); + if (appearance.hairStyle === "long") for (const side of [-1, 1]) + filledCapsule(x + side * r * .86, y - r * .3, x + side * r * .86, y + r * .85, r * .3, appearance.hair); + } + if (appearance.beard) filledCapsule(x - r * .4, y + r * .68, x + r * .4, y + r * .68, r * .4, appearance.hair); + if (appearance.glasses) { + for (const side of [-1, 1]) hudCircle(x + side * r * .34, y - r * .08, r * .23, Math.max(1, r * .08), [18, 20, 28]); + filledCapsule(x - r * .1, y - r * .08, x + r * .1, y - r * .08, Math.max(1, r * .06), [18, 20, 28]); + } + } + if (player && isHeadOnly(player)) { + // The shell rolls from distance travelled while the face is drawn later in + // stable screen space. A visible chord makes circular geometry's rotation + // readable without tumbling the eyes or changing their gaze. + const angle = player.x / Math.max(12, geometry.head.radius) + + player.facing * Math.PI * .18; + const reach = geometry.head.radius * .7; + const dx = Math.cos(angle) * reach; + const dy = Math.sin(angle) * reach; + filledCapsule(geometry.head.x - dx, geometry.head.y - dy, + geometry.head.x + dx, geometry.head.y + dy, + Math.max(2, geometry.head.radius * .1), mixColor(headColor, outline, .55)); + } +} + +function fighterAnimationPhase(player, now = null) { + const run = runtime(); + now ??= run.simMonotonicUs || run.monotonicUs; + let state = "IDLE"; + let stateStartedAt = startedAt; + if (!player.alive) { + state = "KO"; + stateStartedAt = player.headBustedAt || player.lastButtonAt || now; + } else if (now < player.hitStunUntil) { + state = "HIT"; + stateStartedAt = player.lastButtonAt || now; + } else if (roundResult && ["KICK", "PUNCH", "POSE", "DANCE", "DASH", + "JUMP", "CROUCH"].includes(player.resultReaction)) { + state = player.resultReaction === "POSE" || player.resultReaction === "DANCE" + ? "MEDITATE" : player.resultReaction; + stateStartedAt = player.resultReactionAt || now; + } else if (player.blocking) { + state = "SHIELD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.heldBall >= 0) { + state = "HOLD"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.grabHeld) { + state = "REACH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.itemAction && now < player.itemActionUntil) { + state = player.itemAction; + stateStartedAt = player.itemActionStartedAt || now; + } else if (player.attackKind && now < player.attackUntil) { + state = player.attackKind; + stateStartedAt = player.attackStartedAt || now; + } else if (isPogo(player)) { + state = "POGO"; + } else if (now < player.sinkUntil) { + state = "SINK"; + stateStartedAt = player.sinkUntil - sinkDurationUs; + } else if (!player.grounded && now < player.hopUntil) { + state = "CROUCH HOP"; + stateStartedAt = player.hopUntil - crouchHopPoseUs; + } else if (player.ducking) { + state = player.grounded ? "CROUCH" : "AIR CROUCH"; + } else if (!player.grounded) { + state = player.vy < 0 ? "JUMP" : "FALL"; + stateStartedAt = player.jumpPoseUntil + ? player.jumpPoseUntil - (player.crouchJump ? crouchJumpPoseUs : jumpPoseUs) + : player.lastButtonAt || now; + } else if (shellMode === "MENU" && titleAttractMode === "still") { + state = "MEDITATE"; + } else if (now < player.dashUntil) { + state = "DASH"; + stateStartedAt = player.lastButtonAt || now; + } else if (player.runSince) { + state = "RUN"; + stateStartedAt = player.runSince; + } else if (Math.abs(player.vx) > 40) { + state = "WALK"; + } + const [authoredSteps, authoredTicksPerStep, basePhase, loop] = + fighterAnimationSpecs[state] || fighterAnimationSpecs.IDLE; + const timing = meleeFrames[state]; + const steps = timing ? timing.startup+timing.active+timing.recovery : authoredSteps; + // Descending terrain advances planted-foot exchanges faster. The result is + // still integer-tick animation, but the legs keep pace with downhill speed + // instead of the body skating through a leisurely flat-ground cycle. + const travel = Math.sign(player.vx); + const downhill = player.grounded && travel + ? Math.max(0, terrainFloorAt(player.x + travel * 150) - + terrainFloorAt(player.x)) / 150 : 0; + const ticksPerStep = ["WALK", "RUN", "DASH"].includes(state) + ? Math.max(1, Math.round(authoredTicksPerStep / + (1 + downhill * 1.9 + Math.min(1, Math.abs(player.vx) / 1800) * .28))) + : authoredTicksPerStep; + const rawTick = Math.max(0, + Math.floor((now - stateStartedAt) / replayTickUs)); + const rawStep = Math.floor(rawTick / ticksPerStep); + const step = loop ? rawStep % steps : Math.min(steps - 1, rawStep); + let phase = basePhase; + if (timing) phase = meleeFrame(player,now).phase.toUpperCase(); + else if (["FIRE", "THROW", "REACH"].includes(state)) { + const section = step / Math.max(1, steps - 1); + phase = section < .3 ? "STARTUP" : section < .68 ? "ACTIVE" : "RECOVERY"; + } else if (state === "JUMP" || state === "FALL") { + phase = Math.abs(player.vy) < 150 ? "APEX" : state === "JUMP" + ? "ASCEND" : "DESCEND"; + } + // `frameNow` is the clock, not the cycle. It has to keep climbing with real + // time — the looping states anchor `stateStartedAt` at match start, so a + // cycle-position clock wraps back to the first second forever and every + // "is this timestamp still in the future" test answers yes for the rest of + // the round. That is what pinned a landed fighter in the crouch pose and + // froze the legs. Quantizing to the tick grid keeps the pose on the sim's + // 60 Hz phase without inventing in-between frames. + return { state, phase, step: step + 1, steps, tick: rawTick, + ticksPerStep, progress: step / Math.max(1, steps - 1), + frameNow: stateStartedAt + rawTick * replayTickUs }; +} + +// Only share poses during one interpolated paint. Simulation and rollback +// always rebuild, because a hit may change limbs between queries in one tick. +const renderPoses = new Map(); +let sharingRenderPoses = false; +function runnerWorldGeometry(player, t) { + const cached = sharingRenderPoses && renderPoses.get(player); + if (cached && (!player.spiderDummy || cached.t === t)) return cached.pose; + const pose = buildRunnerWorldGeometry(player, t); + if (player.skateRotation) { + const c = Math.cos(player.skateRotation), s = Math.sin(player.skateRotation); + const rotate = (x, y) => ({ x: player.x + (x - player.x) * c - (y - player.y) * s, + y: player.y + (x - player.x) * s + (y - player.y) * c }); + Object.assign(pose.head, rotate(pose.head.x, pose.head.y)); + for (const segment of pose.segments) { + const a = rotate(segment.x1, segment.y1), b = rotate(segment.x2, segment.y2); + segment.x1 = a.x; segment.y1 = a.y; segment.x2 = b.x; segment.y2 = b.y; + } + } + if (sharingRenderPoses) renderPoses.set(player, { t, pose }); + return pose; +} + +function buildRunnerWorldGeometry(player, t, at = null) { + if (player.spiderDummy) return spiderDummyWorldGeometry(player, t); + // Rendering consumes the same fixed 60 Hz phase clock as simulation. The + // display can remain uncapped without inventing in-between combat poses. + const animation = fighterAnimationPhase(player, at); + const poseNow = animation.frameNow; + const poseCycle = animation.progress * Math.PI * 2; + const speed = Math.min(1, Math.abs(player.vx) / 1500); + const meditating = shellMode === "MENU" && titleTransitionAt === null && + titleAttractMode === "still"; + const idle = player.grounded && !player.ducking && speed < .03; + const breath = idle ? Math.sin(poseCycle + player.pad * .7) * 5 : 0; + const idleSway = idle ? Math.sin(poseCycle + player.pad) * 7 : 0; + const stride = Math.sin(poseCycle + player.pad * Math.PI) * + 32 * speed; + const pogo = isPogo(player); + const headOnly = isHeadOnly(player); + const noLegs = !hasPart(player, "left-leg") && + !hasPart(player, "right-leg") && !headOnly; + const jumpAnticipation = player.jumpLaunchAt > poseNow + ? clamp(1 - (player.jumpLaunchAt - poseNow) / jumpAnticipationUs, 0, 1) : 0; + const landingRecovery = player.landPoseUntil > poseNow + ? clamp((player.landPoseUntil - poseNow) / 110000, 0, 1) : 0; + const crouchPose = clamp(Math.max(player.crouchBlend || 0, + Math.sin(jumpAnticipation * Math.PI) * .72, + landingRecovery * .45, noLegs ? .45 : 0), 0, 1); + const height = lerp(180, 108, crouchPose); + const formDrop = pogo ? 54 : noLegs ? 31 : 0; + const aimPose = player.itemAimLocked || player.gunAimLive + ? player.gunAimX || player.facing : 0; + const lean = player.facing * (idle ? 5 : 3 + speed * 10) + aimPose * 7; + const x = player.x; + const feet = player.y; + const z = player.z; + // With neither leg present the pelvis itself becomes the ground contact. + // Keeping its capsule tangent to the floor prevents a floating torso pose. + const hipY = noLegs ? feet - 5 + : feet - lerp(58, 40, crouchPose) + formDrop; + const neckX = x + lean; + const neckY = feet - height + 54 - breath + formDrop + + (player.itemAimLocked || player.gunAimLive + ? (player.gunAimY || 0) * 8 : 0); + const attackPulse = meleePulse(player, poseNow); + const head = headOnly + ? { x, y: feet - 22, z, radius: 22 } + : { x: neckX + lean * .2, + y: feet - height + 22 - breath * 1.6 + formDrop, z, radius: 22 }; + const segments = []; + // `startMelee` and `heldItem` both gate on `itemHand`, so the drawn striking + // arm has to name that same part. Naming it by facing alone tagged the + // reaching capsules with the opposite arm the moment a fighter turned around + // while armed — shooting off one arm then erased the other one's limb. + const actionArm = itemHand(player) || + (player.facing > 0 ? "right-arm" : "left-arm"); + const rearArm = actionArm === "right-arm" ? "left-arm" : "right-arm"; + const actionLeg = player.facing > 0 ? "right-leg" : "left-leg"; + const rearLeg = actionLeg === "right-leg" ? "left-leg" : "right-leg"; + const partForRole = (role, startX) => { + if (["neck", "torso", "shoulders"].includes(role)) return "torso"; + if (role.startsWith("attack-") || role.startsWith("item-")) + return role.includes("arm") || role.includes("forearm") + ? actionArm : actionLeg; + if (role.startsWith("rest-")) return rearArm; + if (role.startsWith("lead-")) return actionLeg; + if (role.startsWith("rear-")) + return role.includes("arm") || role.includes("forearm") + ? rearArm : rearLeg; + if (role.startsWith("grab-")) + return startX <= neckX ? "left-arm" : "right-arm"; + if (role.startsWith("left-")) + return role.includes("arm") || role.includes("forearm") + ? "left-arm" : "left-leg"; + if (role.startsWith("right-")) + return role.includes("arm") || role.includes("forearm") + ? "right-arm" : "right-leg"; + return "torso"; + }; + const segment = (x1, y1, x2, y2, width, role = "body") => { + const part = partForRole(role, x1); + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1: z, x2, y2, z2: z, width, role, part }); + }; + const twoBone = (startX, startY, targetX, targetY, length, bend) => { + let dx = targetX - startX; + let dy = targetY - startY; + let distance = Math.hypot(dx, dy) || 1; + const maximum = length * 1.94; + if (distance > maximum) { + targetX = startX + dx / distance * maximum; + targetY = startY + dy / distance * maximum; + dx = targetX - startX; + dy = targetY - startY; + distance = maximum; + } + const middleX = (startX + targetX) / 2; + const middleY = (startY + targetY) / 2; + const height = Math.sqrt(Math.max(0, length * length - + distance * distance / 4)); + return { jointX: middleX - dy / distance * height * bend, + jointY: middleY + dx / distance * height * bend, + targetX, targetY }; + }; + // Where a grounded foot may actually plant. The bare terrain probe reads + // the arena floor, so a fighter standing on a rung planted his feet a + // storey down and the shins stretched to reach — the long legs @jeffrey + // called out. The probe now asks for the surface the fighter is actually + // standing on, and a foot hanging past a rung's lip stops at the leg's own + // reach — a short dangle — instead of the floor below. + const footPlant = (footX) => Math.min(surfaceYAt(footX, feet), feet + 20); + segment(head.x, head.y + head.radius * .78, neckX, neckY, 10, "neck"); + segment(neckX, neckY, x, hipY, 10, "torso"); + // An elbow sags downward whichever way the hand actually reaches. Bending + // by facing alone flipped the joint whenever a hand crossed behind the + // body — the crossed, double-elbowed arms @jeffrey called out. + const armBend = (shoulderX, targetX) => targetX >= shoulderX ? 1 : -1; + const shoulderY = neckY + 11; + const shoulderSpread = 12; + const leftShoulderX = neckX - shoulderSpread; + const rightShoulderX = neckX + shoulderSpread; + // The working hand always reaches out front and the idle one always trails + // behind, so both shoulders follow facing. Anchoring them on the arm that + // owns the item instead meant a fighter who armed himself facing right and + // then turned around hung his reaching arm off the rear shoulder and his + // trailing arm off the front one: the pair crossed once at the neck and + // again past the elbows, boxing the double diamond @jeffrey called out. + const actionShoulderX = neckX + player.facing * shoulderSpread; + const restShoulderX = neckX - player.facing * shoulderSpread; + segment(leftShoulderX, shoulderY, rightShoulderX, shoulderY, 10, + "shoulders"); + if (player.attackKind === "KICK" && attackPulse > 0) { + const target = meleeTarget(player, poseNow); + const lowKick = player.lowKick; + const leg = twoBone(x, hipY, target.x, target.y, + meleeSpecs.KICK.span, lowKick ? player.facing * .35 : -player.facing); + segment(x, hipY, leg.jointX, leg.jointY, 12, "attack-thigh"); + segment(leg.jointX, leg.jointY, leg.targetX, leg.targetY, 12, + "attack-shin"); + segment(x, hipY, x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), 10, "rear-thigh"); + segment(x - player.facing * (lowKick ? 46 : 28), + feet - (lowKick ? 18 : 32), x - player.facing * 8, feet, + 10, "rear-shin"); + } else if (meditating) { + segment(x, hipY, x - 48, feet - 12, 11, "left-thigh"); + segment(x - 48, feet - 12, x + 8, feet, 11, "left-shin"); + segment(x, hipY, x + 48, feet - 12, 11, "right-thigh"); + segment(x + 48, feet - 12, x - 8, feet, 11, "right-shin"); + } else if (player.skateboard) { + // The deck is drawn tilted along the terrain, so each foot plants on + // the deck's own top at its x — flat foot heights ran the board + // through the shins on every slope. + const deckAt = (footX) => footPlant(footX) - 6; + const plantedX = x + player.facing * 28; + const push = Math.sin(poseCycle) * 34; + const leadFootX = plantedX + player.facing * 18; + segment(x, hipY, plantedX, deckAt(plantedX) - 21, 11, "lead-thigh"); + segment(plantedX, deckAt(plantedX) - 21, leadFootX, + deckAt(leadFootX), 11, "lead-shin"); + const pushKnee = x - player.facing * (22 + push * .3); + const pushFootX = x - player.facing * (46 + Math.max(0, push)); + segment(x, hipY, pushKnee, deckAt(pushKnee) - 25, 10, "rear-thigh"); + segment(pushKnee, deckAt(pushKnee) - 25, pushFootX, + deckAt(pushFootX), 10, "rear-shin"); + } else if (crouchPose > .08) { + segment(x, hipY, x - 36, feet - 22, 10, "left-thigh"); + segment(x - 36, feet - 22, x - 4, feet, 10, "left-shin"); + segment(x, hipY, x + 36, feet - 22, 10, "right-thigh"); + segment(x + 36, feet - 22, x + 58, feet, 10, "right-shin"); + } else if (player.grounded) { + // The facing-side foot is visibly planted forward even at rest. + const leadKnee = x + player.facing * 18 + stride * .38; + const leadFoot = x + player.facing * 42 + stride; + const rearKnee = x - player.facing * 16 - stride * .38; + const rearFoot = x - player.facing * 28 - stride; + // The animation phase still chooses the discrete stride; ground probes + // constrain that frame onto the surface underfoot without new sim steps. + const leadGround = footPlant(leadFoot); + const rearGround = footPlant(rearFoot); + segment(x, hipY, leadKnee, leadGround - 30, 10, "lead-thigh"); + segment(leadKnee, leadGround - 30, leadFoot, leadGround, 10, "lead-shin"); + segment(x, hipY, rearKnee, rearGround - 30, 10, "rear-thigh"); + segment(rearKnee, rearGround - 30, rearFoot, rearGround, 10, "rear-shin"); + } else { + segment(x, hipY, x - 32, feet - 32, 10, "left-thigh"); + segment(x - 32, feet - 32, x - 7, feet - 11, 10, "left-shin"); + segment(x, hipY, x + 32, feet - 43, 10, "right-thigh"); + segment(x + 32, feet - 43, x + 50, feet - 22, 10, "right-shin"); + } + const arm = idle ? idleSway : player.grounded ? -stride * .7 : 12; + const elbowY = feet - lerp(94, 76, crouchPose) - breath; + const handY = feet - lerp(65, 50, crouchPose) - breath * .5; + const actionNow = poseNow; + const armAttack = attackPulse > 0 && player.attackKind && + player.attackKind !== "KICK"; + if (player.skateboard && player.grounded && !armAttack && !heldItem(player)) { + const balance = Math.sin(poseCycle) * 18; + segment(leftShoulderX, shoulderY, x - 42, elbowY - 10 - balance, + 10, "left-upper-arm"); + segment(x - 42, elbowY - 10 - balance, x - 66, handY - balance, + 10, "left-forearm"); + segment(rightShoulderX, shoulderY, x + 42, elbowY - 10 + balance, + 10, "right-upper-arm"); + segment(x + 42, elbowY - 10 + balance, x + 66, handY + balance, + 10, "right-forearm"); + } else if (player.grabHeld || player.ropeIndex >= 0) { + const held = player.heldBall >= 0 ? balls[player.heldBall] : null; + const clutchX = player.ropeIndex >= 0 ? x : held?.x ?? x + player.facing * 126; + const clutchY = player.ropeIndex >= 0 ? feet - 125 : held?.y ?? feet - 92; + const spread = held ? Math.max(12, held.radius * .34) : 20; + const hands = [ + { shoulderX: leftShoulderX, x: clutchX - player.facing * 5, + y: clutchY - spread }, + { shoulderX: rightShoulderX, x: clutchX - player.facing * 5, + y: clutchY + spread }, + ]; + for (const hand of hands) { + const pose = twoBone(hand.shoulderX, shoulderY, + hand.x, hand.y, 58, armBend(hand.shoulderX, hand.x)); + segment(hand.shoulderX, shoulderY, pose.jointX, pose.jointY, 12, + "grab-upper-arm"); + segment(pose.jointX, pose.jointY, pose.targetX, pose.targetY, 12, + "grab-forearm"); + } + } else if (armAttack) { + // The striking arm outranks the carry pose: a whip or bash has to publish + // attack capsules or an armed fighter could never land a hand strike. + const target = meleeTarget(player, poseNow); + const armPose = twoBone(actionShoulderX, shoulderY, target.x, target.y, + meleeSpecFor(player, player.attackKind).span, + armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "attack-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "attack-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else if ((player.itemAction && actionNow < player.itemActionUntil) || + (player.gunAmmo > 0 && player.itemAction !== "THROW")) { + const target = itemHandTarget(player, actionNow); + const armPose = twoBone(actionShoulderX, shoulderY, + target.x, target.y, 58, armBend(actionShoulderX, target.x)); + segment(actionShoulderX, shoulderY, armPose.jointX, armPose.jointY, 12, + "item-upper-arm"); + segment(armPose.jointX, armPose.jointY, + armPose.targetX, armPose.targetY, 12, "item-forearm"); + segment(restShoulderX, shoulderY, x - player.facing * 32, elbowY, 10, + "rest-upper-arm"); + segment(x - player.facing * 32, elbowY, + x - player.facing * 36, handY, 10, "rest-forearm"); + } else { + segment(leftShoulderX, shoulderY, x - 30 + arm * .45, elbowY, 10, + "left-upper-arm"); + segment(x - 30 + arm * .45, elbowY, x - 36 + arm * .6, handY, 10, + "left-forearm"); + segment(rightShoulderX, shoulderY, x + 30 - arm * .45, elbowY, 10, + "right-upper-arm"); + segment(x + 30 - arm * .45, elbowY, x + 36 - arm * .6, handY, 10, + "right-forearm"); + } + if (player.skateboard && !headOnly) { + const deck = skateFrame(player); + const pitch = (player.skatePitch || 0) * .35; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const transform = (px, py, depth) => ({ + x: x + (px - x) * c - (py - feet) * sn, + y: feet - skateAxleDrop - skateWheelRadius + (px - x) * sn + (py - feet) * c, + z: z + depth, + }); + Object.assign(head, transform(head.x, head.y, 0)); + for (const bone of segments) { + const side = bone.part.startsWith("left-") ? -1 : bone.part.startsWith("right-") ? 1 : 0; + const depth = side * (bone.part.includes("arm") ? 15 : 9); + const a = transform(bone.x1, bone.y1, depth); + const b = transform(bone.x2, bone.y2, depth); + if (bone.role === "shoulders") { + a.z = z - 15; + b.z = z + 15; + } + Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, x2: b.x, y2: b.y, z2: b.z }); + } + if (player.attackKind !== "KICK" || !attackPulse) { + for (const [role, direction, part] of [["lead", player.facing, actionLeg], + ["rear", -player.facing, rearLeg]]) { + if (!hasPart(player, part)) continue; + const side = part === "left-leg" ? -1 : 1; + const hip = transform(x, hipY, side * 7); + const foot = deck(direction * skateTruck, -4, side * 9); + const dx = foot.x - hip.x, dy = foot.y - hip.y, dz = foot.z - hip.z; + const distance = Math.hypot(dx, dy, dz) || 1; + const length = Math.max(48, distance / 1.98); + const bend = Math.sqrt(Math.max(0, length * length - distance * distance / 4)); + const norm = Math.hypot(dx, dy) || 1; + const knee = { x: (hip.x + foot.x) / 2 + dy / norm * bend * player.facing, + y: (hip.y + foot.y) / 2 - dx / norm * bend * player.facing, + z: (hip.z + foot.z) / 2 }; + const thigh = segments.find((bone) => bone.role === role + "-thigh"); + const shin = segments.find((bone) => bone.role === role + "-shin"); + for (const [bone, a, b] of [[thigh, hip, knee], [shin, knee, foot]]) + if (bone) Object.assign(bone, { x1: a.x, y1: a.y, z1: a.z, + x2: b.x, y2: b.y, z2: b.z }); + } + } + } + return { head, segments }; +} + +// The first spider dummy deliberately shares the inert dummy controller. Its +// threat is physical scale: four independently destructible leg-pairs spread +// across a daddy-long-legs silhouette around one large central body. +function spiderDummyWorldGeometry(player, t) { + const x = player.x; + const feet = player.y; + const z = player.z; + const bodyY = feet - 176; + const sway = Math.sin(t * 1.7 + player.pad) * 5; + const head = { x, y: bodyY + sway, z, radius: 22 }; + const segments = []; + const add = (x1, y1, x2, y2, width, role, part, + z1 = z, z2 = z, hitboxOnly = false) => { + if (!hasPart(player, part)) return; + segments.push({ x1, y1, z1, x2, y2, z2, width, role, part, hitboxOnly }); + }; + add(x - 42, bodyY, x + 42, bodyY, 38, "torso", "torso"); + add(x, bodyY - 30, x, bodyY + 31, 34, "spider-body", "torso"); + const legs = [ + [-1, -1], [-1, -.55], [-1, .25], [-1, .72], + [1, -1], [1, -.55], [1, .25], [1, .72], + ]; + for (let index = 0; index < legs.length; index++) { + const [side, lane] = legs[index]; + const part = spiderLegParts[index]; + const rootX = x + side * 31; + const rootY = bodyY + lane * 31 + sway; + const lift = 34 + Math.abs(lane) * 28; + const depthLane = (index - 3.5) * 72; + const points = [ + [rootX, rootY, z + depthLane * .2], + [x + side * 76, bodyY - lift, z + depthLane * .48], + [x + side * 126, bodyY - lift * .42, z + depthLane * .72], + [x + side * 171, bodyY + 24 + Math.abs(lane) * 19, z + depthLane], + [x + side * 211, feet - 51 - (index % 2) * 12, z + depthLane * 1.08], + [x + side * 246, feet, z + depthLane], + ]; + for (let joint = 0; joint < points.length - 1; joint++) { + const [x1, y1, z1] = points[joint]; + const [x2, y2, z2] = points[joint + 1]; + add(x1, y1, x2, y2, 13 - joint, + `spider-leg-${index + 1}-segment-${joint + 1}`, part, z1, z2); + } + // One broad top-level combat proxy per complete leg keeps the boss + // readable to melee even though the visible joints fan through Z. + add(rootX, rootY, points.at(-1)[0], points.at(-1)[1], 32, + `spider-hitbox-${index + 1}`, part, z, z, true); + } + return { head, segments }; +} + +function runnerGeometry(player, t) { + return projectRunnerWorldGeometry(runnerWorldGeometry(player, t)); +} + +function projectRunnerWorldGeometry(world) { + const headPoint = projectPoint(world.head.x, world.head.y, world.head.z); + return { + head: { x: headPoint.x, y: headPoint.y, + radius: Math.max(1.5, world.head.radius * cameraScale()) }, + segments: world.segments.map((segment) => { + const a = projectPoint(segment.x1, segment.y1, segment.z1); + const b = projectPoint(segment.x2, segment.y2, segment.z2); + return { x1: a.x, y1: a.y, x2: b.x, y2: b.y, depth: (a.z + b.z) / 2, + width: Math.max(1.5, segment.width * cameraScale()), + role: segment.role, part: segment.part, + hitboxOnly: segment.hitboxOnly }; + }), + }; +} + +function runnerBounds(player, t) { + const geometry = runnerWorldGeometry(player, t); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function runnerScreenBounds(player, t) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + const geometry = projectRunnerWorldGeometry(world); + let left = geometry.head.x - geometry.head.radius; + let right = geometry.head.x + geometry.head.radius; + let top = geometry.head.y - geometry.head.radius; + let bottom = geometry.head.y + geometry.head.radius; + for (const segment of geometry.segments) { + const radius = segment.width / 2; + left = Math.min(left, segment.x1 - radius, segment.x2 - radius); + right = Math.max(right, segment.x1 + radius, segment.x2 + radius); + top = Math.min(top, segment.y1 - radius, segment.y2 - radius); + bottom = Math.max(bottom, segment.y1 + radius, segment.y2 + radius); + } + return { left, right, top, bottom }; +} + +function fighterContainmentRequiredWidth(t) { + let left = Infinity; + let right = -Infinity; + let top = Infinity; + let bottom = -Infinity; + const include = (x, y, radius) => { + left = Math.min(left, x - radius); + right = Math.max(right, x + radius); + top = Math.min(top, y - radius); + bottom = Math.max(bottom, y + radius); + }; + for (const player of activePlayers()) { + const world = player.replayGeometry || player.frozenGeometry || + runnerWorldGeometry(player, t); + include(world.head.x, world.head.y, world.head.radius); + for (const segment of world.segments) { + const radius = segment.width / 2; + include(segment.x1, segment.y1, radius); + include(segment.x2, segment.y2, radius); + } + } + return Math.max(rectPackWidth({ left, right, top, bottom }), + frameFloorWidth()); +} + +// Final render invariant: both complete animated fighter geometries must fit +// inside the action-safe viewport. Camera modes may orbit or focus, but this +// aspect-aware correction recenters their shared frame and moves the dolly +// back far enough for landscape, portrait, live, and replay projection alike. +function containFighters(t) { + if (skateparkMap && !survivalActive()) return; + const gameplayContainment = !roundResult && + runtime().monotonicUs - roundStartedAt >= roundIntroDurationUs(); + if (gameplayContainment) { + cameraContainFloor = Math.max(cameraContainFloor, + fighterContainmentRequiredWidth(t) * 1.11); + return; + } + const worlds = activePlayers().map((player) => player.replayGeometry || + player.frozenGeometry || runnerWorldGeometry(player, t)); + if (!worlds.length) return; + const points = []; + for (const world of worlds) { + const { head } = world; + points.push( + { x: head.x - head.radius, y: head.y, z: head.z }, + { x: head.x + head.radius, y: head.y, z: head.z }, + { x: head.x, y: head.y - head.radius, z: head.z }, + { x: head.x, y: head.y + head.radius, z: head.z }, + ); + for (const segment of world.segments) { + const radius = segment.width / 2; + for (const endpoint of [ + { x: segment.x1, y: segment.y1, z: segment.z1 }, + { x: segment.x2, y: segment.y2, z: segment.z2 }, + ]) { + points.push( + { x: endpoint.x - radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x + radius, y: endpoint.y, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y - radius, z: endpoint.z }, + { x: endpoint.x, y: endpoint.y + radius, z: endpoint.z }, + ); + } + } + } + const minX = Math.min(...points.map((point) => point.x)); + const maxX = Math.max(...points.map((point) => point.x)); + const minY = Math.min(...points.map((point) => point.y)); + const maxY = Math.max(...points.map((point) => point.y)); + // Keep the smoothly tracked root target. Animated limb extrema are allowed + // to affect containment scale, but never camera aim. + const target = cameraDoll.target; + + const safe = actionSafeRect(); + const safeWidth = Math.max(1, safe.right - safe.left); + const safeHeight = Math.max(1, safe.bottom - safe.top); + const requiredWidth = Math.max( + rectPackWidth({ left: minX, right: maxX, top: minY, bottom: maxY }), + frameFloorWidth()); + if (requiredWidth > cameraDoll.width) { + const amount = requiredWidth / Math.max(1, cameraDoll.width) * 1.04; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + + // Perspective and z-depth can make the world-space estimate asymmetric. + // Iteratively measure the actual projection and expand along the existing + // camera ray until every point satisfies the screen-space safe rectangle. + const centerX = (safe.left + safe.right) / 2; + const centerY = (safe.top + safe.bottom) / 2; + for (let pass = 0; pass < 4; pass++) { + cameraDoll.dirty = true; + cameraDoll.prepare(); + const projected = points.map((point) => cameraDoll.project(point)); + const left = Math.min(...projected.map((point) => point.x)); + const right = Math.max(...projected.map((point) => point.x)); + const top = Math.min(...projected.map((point) => point.y)); + const bottom = Math.max(...projected.map((point) => point.y)); + const factor = Math.max(1, + (centerX - left) / (safeWidth / 2), + (right - centerX) / (safeWidth / 2), + (centerY - top) / (safeHeight / 2), + (bottom - centerY) / (safeHeight / 2)); + if (factor <= 1.001) break; + const amount = factor * 1.025; + for (const axis of ["x", "y", "z"]) + cameraDoll.position[axis] = target[axis] + + (cameraDoll.position[axis] - target[axis]) * amount; + cameraDoll.width *= amount; + } + cameraDoll.dirty = true; +} + +function resolveRunnerBounds(player, t) { + // Walls use a stable pushbox independent of the character renderer. + const halfWidth = isHeadOnly(player) ? 24 : isPogo(player) ? 38 + : player.ducking ? 76 : 62; + const leftWall = worldLeft + wallThickness; + const rightWall = worldRight - wallThickness; + if (player.x - halfWidth < leftWall) { + player.x = leftWall + halfWidth; + if (player.skateboard && player.grounded && player.skateVx < -900) { + player.skateWallSide = -1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, -1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx < 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.max(0, player.vx); + player.knockVx = Math.max(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + if (player.x + halfWidth > rightWall) { + player.x = rightWall - halfWidth; + if (player.skateboard && player.grounded && player.skateVx > 900) { + player.skateWallSide = 1; + player.vy = -Math.max(820, Math.abs(player.skateVx) * .82); + player.grounded = false; + player.vx = 0; + playDrum("block", .52, panPlayer(player)); + emitSignal("skate-wallride", player.pad, 1, Math.abs(player.skateVx)); + } + if (isHeadOnly(player) && player.vx > 0) { + player.knockVx = -player.vx * .74 - (player.windVx || 0); + player.vx = player.knockVx + (player.windVx || 0); + player.headRollRate = -player.headRollRate * .74; + } else { + player.vx = Math.min(0, player.vx); + player.knockVx = Math.min(0, player.knockVx); + } + player.dashUntil = 0; + player.dashVx = 0; + } + const ceiling = (survivalActive() ? survivalCeilingY : ceilingY) + + wallThickness; + const standingTop = runnerBounds(player, t).top; + if (!airRoundActive() && standingTop < ceiling) { + player.y += ceiling - standingTop; + if (player.vy < 0) player.vy = isHeadOnly(player) ? -player.vy * .62 : 0; + } +} + +function pointSegmentDistance(px, py, pz, segment) { + const dx = segment.x2 - segment.x1; + const dy = segment.y2 - segment.y1; + const dz = segment.z2 - segment.z1; + const lengthSquared = dx * dx + dy * dy + dz * dz; + const amount = lengthSquared > 0 + ? Math.max(0, Math.min(1, + ((px - segment.x1) * dx + (py - segment.y1) * dy + + (pz - segment.z1) * dz) / lengthSquared)) + : 0; + return Math.hypot(px - (segment.x1 + dx * amount), + py - (segment.y1 + dy * amount), pz - (segment.z1 + dz * amount)); +} + +// Closest points for loose debris, independent of the character renderer. +function segmentSegmentClosest(first, second) { + const d1x = first.x2 - first.x1; + const d1y = first.y2 - first.y1; + const d1z = first.z2 - first.z1; + const d2x = second.x2 - second.x1; + const d2y = second.y2 - second.y1; + const d2z = second.z2 - second.z1; + const rx = first.x1 - second.x1; + const ry = first.y1 - second.y1; + const rz = first.z1 - second.z1; + const a = d1x * d1x + d1y * d1y + d1z * d1z; + const e = d2x * d2x + d2y * d2y + d2z * d2z; + const b = d1x * d2x + d1y * d2y + d1z * d2z; + const c = d1x * rx + d1y * ry + d1z * rz; + const f = d2x * rx + d2y * ry + d2z * rz; + const epsilon = .000000001; + let firstAmount = 0; + let secondAmount = 0; + if (a <= epsilon && e <= epsilon) { + firstAmount = 0; + secondAmount = 0; + } else if (a <= epsilon) { + secondAmount = clamp(f / e, 0, 1); + } else if (e <= epsilon) { + firstAmount = clamp(-c / a, 0, 1); + } else { + const denominator = a * e - b * b; + firstAmount = Math.abs(denominator) > epsilon + ? clamp((b * f - c * e) / denominator, 0, 1) : 0; + const secondNumerator = b * firstAmount + f; + if (secondNumerator < 0) { + secondAmount = 0; + firstAmount = clamp(-c / a, 0, 1); + } else if (secondNumerator > e) { + secondAmount = 1; + firstAmount = clamp((b - c) / a, 0, 1); + } else secondAmount = secondNumerator / e; + } + const firstPoint = { + x: first.x1 + d1x * firstAmount, + y: first.y1 + d1y * firstAmount, + z: first.z1 + d1z * firstAmount, + }; + const secondPoint = { + x: second.x1 + d2x * secondAmount, + y: second.y1 + d2y * secondAmount, + z: second.z1 + d2z * secondAmount, + }; + return { firstPoint, secondPoint, + distance: Math.hypot(firstPoint.x - secondPoint.x, + firstPoint.y - secondPoint.y, firstPoint.z - secondPoint.z) }; +} + + +function meleeLimbContact(attacker, target, t) { + const now = runtime().simMonotonicUs || runtime().monotonicUs; + return combatBoxContact(sampleCombatBoxes(attacker, now), sampleCombatBoxes(target, now)); +} + +// World-space rectangles with a shallow Z interval. Visual line width never +// changes these authored radii. The same records feed collision, Tab and Jev. +function combatRect(id, left, top, right, bottom, z = 0, depth = 18, extra = {}) { + return { id, left, top, right, bottom, near: z - depth, far: z + depth, ...extra }; +} +function boxesOverlap(a, b) { + return a.left <= b.right && a.right >= b.left && a.top <= b.bottom && + a.bottom >= b.top && a.near <= b.far && a.far >= b.near; +} +function boxBounds(items) { + return { left: Math.min(...items.map(b => b.left)), right: Math.max(...items.map(b => b.right)), + top: Math.min(...items.map(b => b.top)), bottom: Math.max(...items.map(b => b.bottom)), + near: Math.min(...items.map(b => b.near)), far: Math.max(...items.map(b => b.far)) }; +} +function buildBoxTree(items) { + if (!items.length) return null; + const bounds = boxBounds(items); + if (items.length <= 3) return { bounds, items }; + const horizontal = bounds.right - bounds.left >= bounds.bottom - bounds.top; + const sorted = items.slice().sort((a,b) => horizontal + ? (a.left+a.right)-(b.left+b.right) : (a.top+a.bottom)-(b.top+b.bottom)); + const middle = Math.floor(sorted.length / 2); + return { bounds, children: [buildBoxTree(sorted.slice(0,middle)), buildBoxTree(sorted.slice(middle))] }; +} +function queryBoxTree(tree, area, found = []) { + if (!tree || !boxesOverlap(tree.bounds, area)) return found; + if (tree.items) for (const item of tree.items) { if (boxesOverlap(item, area)) found.push(item); } + else for (const child of tree.children) queryBoxTree(child, area, found); + return found; +} +function pointBoxDistance(box, x, y, z = 0) { + return Math.hypot(Math.max(box.left-x,0,x-box.right), + Math.max(box.top-y,0,y-box.bottom), Math.max(box.near-z,0,z-box.far)); +} +// Slab test on an expanded AABB: a fast projectile cannot skip a thin hurtbox. +function segmentBoxEntry(segment, box, radius = 0) { + let enter = 0, leave = 1; + for (const [axis,low,high] of [['x','left','right'],['y','top','bottom'],['z','near','far']]) { + const origin = segment[axis+'1'], delta = segment[axis+'2']-origin; + if (Math.abs(delta)<1e-9) { + if (originbox[high]+radius) return null; + } else { + const a=(box[low]-radius-origin)/delta,b=(box[high]+radius-origin)/delta; + enter=Math.max(enter,Math.min(a,b));leave=Math.min(leave,Math.max(a,b)); + if(enter>leave)return null; + } + } + return enter; +} +function sweptProjectileContact(segments,target,t) { + const now=runtime().simMonotonicUs || runtime().monotonicUs; + const boxes=sampleCombatBoxes(target,now); + let result=null; + for(const s of segments) { + const r=s.width/2; + const area=combatRect('sweep',Math.min(s.x1,s.x2)-r,Math.min(s.y1,s.y2)-r, + Math.max(s.x1,s.x2)+r,Math.max(s.y1,s.y2)+r,(s.z1+s.z2)/2,Math.abs(s.z2-s.z1)/2+r); + for(const hurt of queryBoxTree(boxes.tree,area)) { + const amount=segmentBoxEntry(s,hurt,r); + if(amount===null || (result && amount>=result.amount))continue; + result={amount,x:s.x1+(s.x2-s.x1)*amount,y:s.y1+(s.y2-s.y1)*amount, + z:s.z1+(s.z2-s.z1)*amount,separation:0,headshot:hurt.part==='head',segmentIndex:hurt.segmentIndex}; + } + } + return result; +} +function combatPushbox(player) { + const half = isHeadOnly(player) ? 24 : isPogo(player) ? 38 : 69; + const height = isHeadOnly(player) ? 44 : isPogo(player) ? 116 : player.ducking ? 118 : 180; + return combatRect('push', player.x-half, player.y-height, player.x+half, player.y, player.z); +} +function sampleCombatBoxes(player, now, world = null, buildTree = true) { + world ||= runnerWorldGeometry(player, (now-startedAt)/1e6); + const hurt = []; + const head = world.head; + hurt.push(combatRect('head', head.x-22, head.y-22, head.x+22, head.y+22, head.z, 22, + { part: 'head', segmentIndex: -1 })); + for (let i=0; is.role==='torso'); + if(torso)hit.push(combatRect('pogo',torso.x2-10,torso.y2-10, + torso.x2+10,torso.y2+10,torso.z2,10,{part:'torso'})); + } + if (player.alive && !player.attackHit && !player.blocking && now >= player.hitStunUntil && + frame.phase === 'active' && !isHeadOnly(player) && !isPogo(player)) { + const kick = player.attackKind === 'KICK'; + const part = kick ? player.facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (part && hasPart(player, part)) { + const tip = meleeTarget(player, now); + const halfX = kick ? 26 : 22; + const halfY = kick && player.lowKick ? 17 : 20; + const inner = player.x+player.facing*(kick ? 42 : 30); + const outer = tip.x+player.facing*halfX; + hit.push(combatRect(player.attackKind.toLowerCase(), Math.min(inner,outer), + tip.y-halfY, Math.max(inner,outer), tip.y+halfY, tip.z, 18, { part })); + } + } + const guard = []; + if (player.blocking) { + const shield = shieldGeometry(player); + guard.push(combatRect('guard', shield.x-shield.radius, shield.y-shield.radius, + shield.x+shield.radius, shield.y+shield.radius, shield.z, shield.radius)); + } + return { hurt, hit, guard, push: combatPushbox(player), frame, + tree: buildTree ? buildBoxTree(hurt) : null }; +} +function combatBoxContact(attacker, target) { + let result = null; + for (const hit of attacker.hit) { + const overlaps = queryBoxTree(target.tree, hit).sort((a,b) => + (a.part === 'head' ? -1 : b.part === 'head' ? 1 : a.segmentIndex-b.segmentIndex)); + const hurt = overlaps[0]; + if (!hurt) continue; + result = { x:(Math.max(hit.left,hurt.left)+Math.min(hit.right,hurt.right))/2, + y:(Math.max(hit.top,hurt.top)+Math.min(hit.bottom,hurt.bottom))/2, + z:(Math.max(hit.near,hurt.near)+Math.min(hit.far,hurt.far))/2, + separation: 0, headshot:hurt.part === 'head', segmentIndex:hurt.segmentIndex, + hitbox:hit.id, hurtbox:hurt.id }; + if (result.headshot) break; + } + return result; +} + +// Sample the game's real strike capsules against the opponent's current +// hurtboxes. This is reach evidence at fixed positions, not a predicted hit: +// travel, input latency, shields and the opponent's next move can change it. +function jevStrikeOptions(player, opponent, now) { + if (!player.alive || !opponent.alive || isHeadOnly(player) || isPogo(player)) return {}; + const t = (now - startedAt) / 1000000; + const target = sampleCombatBoxes(opponent, now); + const facing = Math.sign(opponent.x - player.x) || player.facing; + const result = {}; + for (const [action, kind, crouched] of [ + ['punch', itemMelee[heldItem(player)] || 'PUNCH', false], + ['kick', 'KICK', false], ['low_kick', 'KICK', true], + ['crouch_punch', itemMelee[heldItem(player)] || 'PUNCH', true], + ]) { + const part = kind === 'KICK' ? facing > 0 ? 'right-leg' : 'left-leg' : itemHand(player); + if (!part || !hasPart(player, part) || (crouched && !player.grounded)) continue; + const probe = { ...player, facing, vx: 0, blocking: false, + ducking: crouched, crouchBlend: crouched ? 1 : 0, + grabHeld: false, itemAction: '', hitStunUntil: 0, attackHit: false, + attackKind: kind, lowKick: crouched && kind === 'KICK', + attackStartedAt: now, attackUntil: now + meleeSpecs[kind].windowUs }; + let closest = null, clearance = Infinity; + const timing = meleeFrames[kind]; + for (let frame=timing.startup; frame + item.part === part && !item.hitboxOnly)) { + const paletteCoordinate = geometry.segments.indexOf(segment); + detachedParts.push({ ...segment, color: player.color.slice(), + colors: player.npc ? [] : player.handleColors?.map((value) => value.slice()) || [], + paletteCoordinate, + vx: direction * (420 + detachedParts.length % 3 * 90), + vy: -520 - detachedParts.length % 2 * 120, + spin: direction * (3.5 + detachedParts.length % 4), + life: 2.6, part, owner: player.pad, heldBy: -1, hitAfter: now + 180000 }); + } +} + +function detachPart(player, part, geometry, sourceX, now) { + if (!hasPart(player, part)) return; + spawnDetachedPart(player, part, geometry, sourceX, now); + player.removedParts.push(part); + player.partDamage[part] = Math.max(player.partDamage[part] || 0, + part === "torso" ? 3 : 2); + emitSignal("partremoved", player.pad, + [...limbParts, "torso"].indexOf(part), 1); +} + +function damagePart(target, segmentIndex, sourceX, sourcePad, now) { + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const segment = geometry.segments[segmentIndex]; + const part = segment?.part; + if (!part || !hasPart(target, part)) return; + const durability = target.spiderDummy + ? part === "torso" ? 5 : 3 + : part === "torso" ? 3 : 2; + target.partDamage[part] = (target.partDamage[part] || 0) + 1; + emitSignal("partdamage", target.pad, + [...limbParts, "torso"].indexOf(part), target.partDamage[part] / durability); + if (target.partDamage[part] < durability) return; + if (part === "torso") { + // Removing the body's attachment point releases every surviving limb; + // the circular head remains as the final playable form. + for (const limb of target.spiderDummy ? spiderLegParts : limbParts) + detachPart(target, limb, geometry, sourceX, now); + } + detachPart(target, part, geometry, sourceX, now); + if (part === "torso") { + target.x = geometry.head.x; + target.y = geometry.head.y + geometry.head.radius; + launchHead(target, sourceX, sourcePad, now, 650, 620); + } + if (target.itemArm === part) { + if (target.gunAmmo > 0) gunPickups.push({ kind: target.gunMode, + amount: target.gunAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + if (target.grenadeAmmo > 0) grenadePickups.push({ + amount: target.grenadeAmmo, x: target.x, y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + // The blade goes where the hand went. A saber is held, not carried, so + // losing the item arm has to put it back on the map — otherwise the one + // weapon a fighter can keep all round would quietly cease to exist and + // the reach it was buying would vanish with no object to explain it. + if (target.swordHeld) { + saberPickups.push({ kind: "LIGHT SABER", x: target.x, + y: target.y - 70, z: target.z, + active: true, startsActive: false, respawnAt: Infinity }); + target.swordHeld = false; + } + target.gunAmmo = 0; + target.grenadeAmmo = 0; + target.itemArm = ""; + emitSignal("item-drop", target.pad, sourcePad, 1); + } + if (target.carryArm === part) { + if (target.heldBall >= 0) releaseCarriedBall(target, now); + if (target.heldPart >= 0) releaseCarriedPart(target, now); + if (target.heldPlayer >= 0) releaseCarriedFighter(target, now); + target.carryArm = ""; + } + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.lastButton = part.toUpperCase() + " LOST"; + target.lastButtonAt = now; + playDrum("clap", 1.2, panPlayer(target)); +} + +function damageAllLimbs(target, sourceX, sourcePad, now) { + for (const part of limbParts) { + if (!hasPart(target, part)) continue; + const geometry = runnerWorldGeometry(target, (now - startedAt) / 1000000); + const index = geometry.segments.findIndex((segment) => segment.part === part); + if (index >= 0) damagePart(target, index, sourceX, sourcePad, now); + } +} + +const skateTruck = 32; +const skateWheelRadius = 8; +const skateAxleDrop = 10; + +function skateContact(x, y) { + // Solve the truck chord against the supporting ledge or heightfield. + let pitch = 0, left = 0, right = 0; + for (let i = 0; i < 6; i++) { + const span = skateTruck * Math.cos(pitch); + left = surfaceYAt(x - span, y - 2); + right = surfaceYAt(x + span, y - 2); + pitch = Math.atan2(right - left, span * 2); + } + const c = Math.cos(pitch), sn = Math.sin(pitch); + const wheelX = -sn * skateAxleDrop; + left = surfaceYAt(x - skateTruck * c + wheelX, y - 2); + right = surfaceYAt(x + skateTruck * c + wheelX, y - 2); + const deckY = Math.min(left + skateTruck * sn, right - skateTruck * sn) - + skateAxleDrop * c - skateWheelRadius; + return { pitch, y: deckY + skateAxleDrop + skateWheelRadius, + left: Math.abs(deckY - skateTruck * sn + skateAxleDrop * c + skateWheelRadius - left) < 3, + right: Math.abs(deckY + skateTruck * sn + skateAxleDrop * c + skateWheelRadius - right) < 3 }; +} + +function skateFrame(player) { + const pitch = player.skateWallSide ? Math.PI / 2 : player.skatePitch || 0; + const c = Math.cos(pitch), sn = Math.sin(pitch); + const down = player.skateWallSide > 0 ? -1 : 1; + return (along, height = 0, across = 0) => ({ + x: player.x + c * along - sn * height * down, + y: player.y - skateAxleDrop - skateWheelRadius + sn * along + c * height * down, + z: player.z + across, + }); +} + +function resetSkate(player) { + player.skateboard = false; + player.skateVx = player.skateWallSide = player.skatePitch = 0; + player.skateSpin = player.skateRollDistance = player.skateCarveDir = 0; + player.skateContacts = 0; + player.walkSince = player.runSince = 0; +} + +function boardForRider(player) { + return balls.find(item => item.type === "skateboard" && item.riderPad === player.pad) || + balls.find(item => item.type === "skateboard" && !item.active && item.heldBy < 0 && + (item.riderPad ?? -1) < 0); +} + +function dismountSkateboard(target, now) { + if (!target.skateboard) return false; + resetSkate(target); + const board = boardForRider(target); + if (!board) return true; + board.riderPad = -1; + board.active = true; + board.heldBy = -1; + board.x = target.x - target.facing * 58; + board.y = target.y - skateAxleDrop - skateWheelRadius; + board.z = target.z; + board.vx = -target.facing * 720; + board.vy = -260; + board.safeUntil = now + 260000; + board.safePlayers = 1 << target.pad; + emitSignal("skate-dismount", target.pad, 1, 0); + return true; +} + +function applyBodyHit(target, segmentIndex, sourceX, sourcePad, now, + force = 1100, lift = 150, damageParts = true) { + recordFightHit(sourcePad, false); + const direction = Math.sign(target.x - sourceX) || + (sourcePad === target.pad ? -target.facing : target.facing) || 1; + releaseCarriedBall(target, now); + target.attackKind = ""; + target.attackUntil = 0; + target.attackHit = false; + target.dashUntil = 0; + target.dashVx = 0; + target.hit = Math.max(target.hit, .52); + target.hitSegment = segmentIndex; + target.hitSegmentUntil = Math.max(target.hitSegmentUntil, now + 190000); + if (dismountSkateboard(target, now)) damageParts = false; + // Balls transfer recoil but are sporting hazards, not damaging attacks. + if (damageParts) + damagePart(target, segmentIndex, sourceX, sourcePad, now); + target.hitStunUntil = Math.max(target.hitStunUntil, now + 145000); + if (isHeadOnly(target)) { + launchHead(target, sourceX, sourcePad, now, force * 1.15, + Math.max(420, lift * 2)); + } else { + target.knockVx += direction * force; + target.vx = target.knockVx + target.windVx; + target.vy = Math.min(target.vy, -lift); + } + target.grounded = false; + target.stance = "STUN"; + target.lastButton = "BODY HIT"; + target.lastButtonAt = now; + emitSignal("bodyhit", sourcePad, target.pad, segmentIndex); +} + +// `combat` is false on a watcher: the limbs still tumble, settle and draw, +// but they do not damage anybody. The fight they belong to is being decided +// on another machine, and a watcher that scored its own hits would fight the +// wire for the rest of the round. Same switch `updateBullets` already has. +function updateDetachedParts(dt, combat = true) { + const now = runtime().monotonicUs; + for (const fragment of detachedParts) { + if (fragment.heldBy >= 0) { + const carrier = players[fragment.heldBy]; + if (!carrier?.alive || carrier.heldPart !== detachedParts.indexOf(fragment)) { + fragment.heldBy = -1; + } else { + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const dx = carrier.x + carrier.facing * 112 - centerX; + const dy = carrier.y - 78 - centerY; + fragment.x1 += dx; fragment.x2 += dx; + fragment.y1 += dy; fragment.y2 += dy; + fragment.vx = fragment.vy = 0; + fragment.life = Math.max(fragment.life, 1); + continue; + } + } + fragment.vy += 1900 * dt; + const dx = fragment.vx * dt; + const dy = fragment.vy * dt; + fragment.x1 += dx; + fragment.y1 += dy; + fragment.x2 += dx; + fragment.y2 += dy; + const centerX = (fragment.x1 + fragment.x2) / 2; + const centerY = (fragment.y1 + fragment.y2) / 2; + const angle = fragment.spin * dt; + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + for (const endpoint of [1, 2]) { + const xKey = "x" + endpoint; + const yKey = "y" + endpoint; + const localX = fragment[xKey] - centerX; + const localY = fragment[yKey] - centerY; + fragment[xKey] = centerX + localX * cosine - localY * sine; + fragment[yKey] = centerY + localX * sine + localY * cosine; + } + const bottom = Math.max(fragment.y1, fragment.y2) + fragment.width / 2; + const terrainY = terrainFloorAt(centerX); + if (bottom > terrainY) { + const correction = terrainY - bottom; + fragment.y1 += correction; + fragment.y2 += correction; + fragment.vy = -Math.abs(fragment.vy) * .42; + fragment.vx *= .82; + fragment.spin *= .78; + } + const speed = Math.hypot(fragment.vx, fragment.vy); + if (combat && speed > 650 && now >= (fragment.hitAfter || 0)) { + for (const target of players) { + if (!target.alive || target.pad === fragment.owner) continue; + const contact = runnerContactToPoint(target, + (now - startedAt) / 1000000, centerX, centerY, + (fragment.z1 + fragment.z2) / 2); + if (Math.min(contact.headDistance, contact.bodyDistance) > + fragment.width / 2 + 18) continue; + applyBodyHit(target, contact.segmentIndex, centerX, fragment.owner, + now, Math.min(1800, speed * .72), 240); + fragment.vx *= -.38; + fragment.vy = -Math.abs(fragment.vy) * .45; + fragment.hitAfter = now + 260000; + playDrum("clap", 1, panPlayer(target)); + emitSignal("part-hit", fragment.owner, target.pad, speed); + break; + } + } + // Dismembered anatomy remains a physical arena object. It can settle, + // be picked up again, thrown, and strike either fighter for the rest of + // the round rather than evaporating on a cosmetic timer. On a watcher it + // is only scenery, and scenery that never expires is a leak: the wire + // says which limbs are gone, not which pieces are still worth drawing. + if (combat) fragment.life = Math.max(fragment.life, 1); + else fragment.life -= dt; + } + for (let index = detachedParts.length - 1; index >= 0; index--) { + if (detachedParts[index].life > 0 || detachedParts[index].heldBy >= 0) continue; + detachedParts.splice(index, 1); + for (const player of players) { + if (player.heldPart === index) player.heldPart = -1; + else if (player.heldPart > index) player.heldPart--; + } + } +} + +// Comic Relief's packaged horizontal metrics, normalized from its 2048-unit +// em. Colored text is drawn glyph-by-glyph on every host, so using the font's +// real advances here keeps the web canvas and Xbox DirectWrite runs identical. +const comicAdvanceEm = { + a:.512, b:.593, c:.514, d:.587, e:.548, f:.508, g:.531, h:.578, + i:.28, j:.403, k:.54, l:.274, m:.777, n:.523, o:.526, p:.535, + q:.52, r:.48, s:.487, t:.471, u:.52, v:.486, w:.684, x:.59, + y:.521, z:.538, "0":.61, "1":.45, "2":.61, "3":.61, "4":.61, + "5":.61, "6":.61, "7":.61, "8":.61, "9":.61, "@":.931, + "!":.238, "?":.524, ".":.249, ",":.277, ":":.299, ";":.299, + "<":.381, ">":.381, "^":.581, " ":.299, "/":.512, "-":.417, + "+":.48, "∞":.837, +}; + +function comicGlyphAdvance(character, size) { + if (typeof systemWrite.measureGlyph === "function") + return systemWrite.measureGlyph(String(character).toLowerCase(), size); + return size * (comicAdvanceEm[String(character).toLowerCase()] ?? .58); +} + +function handleWidth(handle, size) { + return [...handle].reduce((width, character) => + width + comicGlyphAdvance(character, size), 0); +} + +function typeWrite(text, x, y, size, ...color) { + const visibleText = String(text).toLowerCase(); + if (typeof comicWrite === "function") comicWrite(visibleText, x, y, size, ...color); + else if (typeof ywftWrite === "function") + ywftWrite(visibleText, x, y, size, ...color); + else systemWrite(visibleText, x, y, size, ...color); +} + +function contrastShadow(color) { + const luminance = color[0] * .2126 + color[1] * .7152 + color[2] * .0722; + return luminance > 142 ? [8, 12, 24] : [232, 238, 248]; +} + +// Per-glyph contrast flips a single mid-tone letter to the opposite shadow +// while its neighbors keep theirs, which reads as a mistake rather than as +// depth. A run of type picks its direction once, from the sky behind it, and +// each shadow keeps a trace of its own glyph's hue. +function runShadow(color) { + // Match disk.mjs corner labels: the shadow is always dark, with a trace of + // the foreground hue. Dark mode must never turn a dark glyph's shadow white. + return mixColor(color, visualTheme.light > .5 ? [30, 20, 50] : [6, 4, 16], + .78); +} + +// Handle colors are authored per name and can be shorter than the name they +// dress. Cycling keeps every glyph on the same palette instead of dropping +// the tail onto a different color source. +function glyphColor(colors, index, fallback) { + return colors?.length ? colors[index % colors.length] : fallback; +} + +function controlLocale() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + const keyboard = caps.inputFamily === "keyboard"; + const touch = caps.inputFamily === "touch"; + if (touch) return { + title: "start", select: "", replayPaused: "paused", + replayPlaying: "", replay: "", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM", + }; + return keyboard ? { + title: "start", + select: "P1 A/D + SPACE P2 LEFT/RIGHT + K H P2/DUMMY/BOT G BACK", + replayPaused: "PAUSED F PLAY A D SCRUB G EXIT", + replayPlaying: "F PAUSE A D SCRUB G EXIT", + replay: "Q REPLAY", + combat: "SPACE KICK ENTER PUNCH SHIFT SHIELD ALT USE ITEM W AIR", + } : { + title: "start", + select: "LEFT RIGHT SELECT A READY X P2 / DUMMY / BOT B BACK", + replayPaused: "PAUSED A PLAY LEFT RIGHT SCRUB B EXIT", + replayPlaying: "A PAUSE LEFT RIGHT SCRUB B EXIT", + replay: "Y REPLAY", + combat: "A KICK B PUNCH X SHIELD Y USE ITEM UP AIR", + }; +} + +// Each entry is the cap to draw, what it does, and the button that lights it, +// so the legend can show a key rather than spell one. +function combatKeys() { + const caps = typeof capabilities === "function" ? capabilities() : {}; + if (caps.inputFamily === "keyboard") return [ + [["A", "D"], "MOVE", "ArrowLeft"], [["D", "D"], ">> DASH", "ArrowRight"], + ["SPACE", "KICK", "A"], ["ENTER", "PUNCH", "B"], + ["SHIFT", "SHIELD", "X"], ["ALT", "USE ITEM", "Y"], + ["W", "AIR", "ArrowUp"]]; + if (caps.inputFamily === "touch") return [ + ["A", "KICK", "A"], ["B", "PUNCH", "B"], + ["X", "SHIELD", "X"], ["Y", "USE ITEM", "Y"]]; + return [ + [["LEFT", "RIGHT"], "MOVE", "ArrowLeft"], + [["RIGHT", "RIGHT"], ">> DASH", "ArrowRight"], + ["A", "KICK", "A"], ["B", "PUNCH", "B"], ["X", "SHIELD", "X"], + ["Y", "USE ITEM", "Y"], ["STICK_UP", "AIR", "ArrowUp"]]; +} + +// What the buttons do, named on the way into a round. B changes meaning with +// what the hand is carrying, so the legend reads the fighter rather than +// reciting a fixed map. +function combatLegendKeys(player) { + const swing = itemMelee[heldItem(player)]; + return combatKeys().map(([cap, action, button]) => + [cap, swing && action === "PUNCH" ? swing : action, button]); +} + +function combatLegend(player) { + return combatLegendKeys(player) + .map(([cap, action]) => (cap === "STICK_UP" ? "STICK" : cap) + + " " + action).join(" "); +} + +function selectionControlKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + [["A", "D"], "SELECT", "ArrowLeft"], ["SPACE", "READY", "A"], + ["SHIFT", "OPPONENT", "X"], ["ENTER", "BACK", "B"]]; + return [[["LEFT", "RIGHT"], "SELECT", "ArrowLeft"], ["A", "READY", "A"], + ["X", "OPPONENT", "X"], ["B", "BACK", "B"]]; +} + +function replayControlKeys(paused) { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + if (family === "keyboard") return [ + ["F", paused ? "PLAY" : "PAUSE", "A"], + [["A", "D"], "SCRUB", "ArrowLeft"], ["G", "EXIT", "B"]]; + return [["A", paused ? "PLAY" : "PAUSE", "A"], + [["LEFT", "RIGHT"], "SCRUB", "ArrowLeft"], ["B", "EXIT", "B"]]; +} + +function replayOfferKeys() { + const family = typeof capabilities === "function" + ? capabilities().inputFamily : "xbox"; + if (family === "touch") return []; + return family === "keyboard" ? [["Q", "REPLAY", "Y"]] + : [["Y", "REPLAY", "Y"]]; +} + +// A key drawn as a key: a gray cap with a line around it, sunk and brightened +// while it is actually held. +// `fade` is how present the cap is: 1 draws it, 0 dissolves it into the stage +// behind. The legend always passes 1; only the command stream ages its caps +// out, and it needs the whole cap to go — face, edge and letter together. +// A controller button drawn as a controller button: the letter in its Xbox +// color on a dark disc with a colored rim; pressed inverts to a filled disc. +// Directions are the same disc with an arrow glyph in neutral ink. Keyboard +// input keeps its keycaps; every other family gets these. +const padButtonInk = { + A: [96, 200, 80], B: [235, 78, 78], X: [86, 148, 235], Y: [240, 198, 60], + // The M30's face wears its own colorway — green A, yellow B, blue C, all + // three top-row buttons gray — which is NOT the Xbox palette above, so the + // cluster keys its own inks rather than borrowing the Xbox letters'. + M30A: [96, 200, 80], M30B: [240, 198, 60], M30C: [86, 148, 235], + M30X: [168, 176, 190], M30Y: [168, 176, 190], M30Z: [168, 176, 190], + M30S: [235, 78, 78], +}; +const padGlyph = { UP: "↑", DOWN: "↓", LEFT: "←", RIGHT: "→" }; +const padButtonDiameter = (size) => Math.round(size * .78) * 2; +function drawPadButton(label, x, y, size, pressed, fade = 1, display = null) { + const radius = Math.round(size * .78); + if (fade <= .01) return radius * 2; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const ink = padButtonInk[label] || mixColor([148, 158, 178], [96, 104, 124], + visualTheme.light); + // Filled like the real thing: the color IS the button. Held brightens it + // and rims it white; the glyph stays dark and dead-center either way. + const face = pressed ? mixColor(ink, [255, 255, 255], .3) : ink; + const cx = x + radius; + const cy = y + Math.round(size * .75); + filledDisc(cx, cy, radius, veil(face)); + if (pressed) filledRing(cx, cy, radius, radius - 3, veil([245, 248, 255])); + const text = display ?? (padGlyph[label] || label).toUpperCase(); + const glyphSize = Math.round(size * .82); + if (label === "STICK_UP" || label === "DOWN" || + label === "LEFT" || label === "RIGHT") { + const arrowInk = veil([12, 14, 26]); + const thickness = Math.max(2, Math.round(radius * .11)); + const dx = label === "LEFT" ? -1 : label === "RIGHT" ? 1 : 0; + const dy = label === "STICK_UP" ? -1 : label === "DOWN" ? 1 : 0; + const tipX = cx + dx * radius * .42; + const tipY = cy + dy * radius * .42; + const tailX = cx - dx * radius * .4; + const tailY = cy - dy * radius * .4; + const perpendicularX = -dy * radius * .32; + const perpendicularY = dx * radius * .32; + const wingX = tipX - dx * radius * .34; + const wingY = tipY - dy * radius * .34; + filledCapsule(tailX, tailY, tipX, tipY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX + perpendicularX, + wingY + perpendicularY, thickness, arrowInk); + filledCapsule(tipX, tipY, wingX - perpendicularX, + wingY - perpendicularY, thickness, arrowInk); + return radius * 2; + } + const glyphX = Math.round(cx - handleWidth(text, glyphSize) / 2); + // DirectWrite's cap shapes carry more visual weight below their nominal + // midpoint. Lift the Xbox face letters together so A/B/X/Y read centered in + // the colored hardware circles rather than sitting on their lower halves. + const glyphY = Math.round(cy - glyphSize * (padButtonInk[label] ? .56 : .5)); + if (padButtonInk[label] || Object.hasOwn(padGlyph, label) || + /^[KPSI<>^v]$/.test(text)) + systemWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + else typeWrite(text, glyphX, glyphY, glyphSize, ...veil([12, 14, 26])); + return radius * 2; +} + +function drawKeycap(label, x, y, size, pressed, fade = 1) { + const padX = Math.round(size * .42); + const height = Math.round(size * 1.5); + const width = handleWidth(label, size) + padX * 2; + if (fade <= .01) return width; + const drop = pressed ? 2 : 0; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const veil = (color) => fade >= 1 ? color : mixColor(ground, color, fade); + const face = veil(pressed + ? mixColor([96, 104, 126], [206, 214, 232], visualTheme.light) + : mixColor([44, 50, 66], [176, 184, 202], visualTheme.light)); + const edge = veil(pressed + ? mixColor([210, 220, 240], [40, 46, 62], visualTheme.light) + : mixColor([112, 122, 146], [96, 104, 124], visualTheme.light)); + if (!pressed) + hudBox(x + 2, y + 4, width, height, ...veil(mixColor([6, 8, 18], [92, 99, 112], + visualTheme.light * .7))); + hudBox(x, y + drop, width, height, ...face); + strokeBox(x, y + drop, width, height, 2, edge); + typeWrite(label, x + padX, y + drop + Math.round((height - size) / 2), size, + ...veil(pressed ? [12, 14, 26] : [238, 242, 252])); + return width; +} + +// `controllers()` walks the whole pad list and the legend asks every painted +// frame, so the name check breathes once a second instead. +let m30CheckAt = 0; +let m30Present = false; +function m30Seated() { + const now = runtime().monotonicUs; + if (now >= m30CheckAt) { + m30CheckAt = now + 1000000; + m30Present = typeof controllers === "function" && + (controllers() || []).some((pad) => /8bitdo\s+m30/i.test(pad?.name || "")); + } + return m30Present; +} + +// The M30 folds two extra moves into its Sega face: C and the top-edge R +// reach the game as the trigger pair, Z and the top-edge L as the shoulders — +// the pad's factory Xbox map wearing Sega names. Which trigger C sends was +// read off the live hardware, not the leaflet; flip this table if 8BitDo's +// firmware ever swaps the pair. +const m30FaceSends = { C: "RightTrigger", Z: "RightShoulder" }; +const m30SendLabel = { RightTrigger: "SHIELD", RightShoulder: "USE ITEM", + LeftTrigger: "KICK", LeftShoulder: "USE ITEM" }; + +// The M30's own manual page, drawn from the device itself: the white +// dogbone body with red L/R nubs over its shoulders, the dark cross on its +// round base, the red start pill, and the two button arcs climbing to the +// right — gray X/Y/Z small on top, green A / yellow B / blue C big below, +// the bottom row shifted toward the thumb. Proportions transcribed from +// 8BitDo's top-down of the M30 2.4G (white), the unit in @jeffrey's hand. +// Every drawn control lights with the live press, so the mapping is not a +// diagram of faith: plug in, press, and the page answers. +function drawM30Cluster(x, y, size, held, directionActive, ink) { + const small = Math.round(size * .58); + const d = padButtonDiameter(size); + const light = visualTheme.light; + const lobeR = Math.round(d * 1.62); + const bodyMidY = y + Math.round(d * .3) + lobeR; + const leftLobeX = x + lobeR; + const rightLobeX = x + Math.round(d * 7.5) - lobeR; + const plastic = mixColor([176, 182, 194], [246, 248, 251], light); + const print = mixColor([92, 98, 112], [118, 124, 138], light); + // Shoulder nubs first, so the body covers their roots. + const nub = mixColor([196, 44, 58], [206, 48, 62], light); + filledCapsule(leftLobeX - d, bodyMidY - lobeR, leftLobeX + Math.round(d * .2), + bodyMidY - lobeR, Math.round(d * .4), nub); + filledCapsule(rightLobeX - Math.round(d * .2), bodyMidY - lobeR, + rightLobeX + d, bodyMidY - lobeR, Math.round(d * .4), nub); + filledDisc(leftLobeX, bodyMidY, lobeR, plastic); + filledDisc(rightLobeX, bodyMidY, lobeR, plastic); + filledCapsule(leftLobeX, bodyMidY, rightLobeX, bodyMidY, + Math.round(lobeR * 1.7), plastic); + // The silkscreen wordmark rides the body's top center. + const markSize = Math.round(small * .9); + typeWrite("8BITDO M30", Math.round((leftLobeX + rightLobeX) / 2 - + handleWidth("8BITDO M30", markSize) / 2), + bodyMidY - lobeR + Math.round(d * .1), markSize, ...print); + // D-pad: the dark cross on its round base, each arm lighting alone. + const dpadBase = mixColor([44, 48, 60], [58, 62, 74], light); + filledDisc(leftLobeX, bodyMidY, Math.round(d * 1.02), dpadBase); + const crossInk = mixColor([24, 27, 36], [32, 35, 44], light); + const armLen = Math.round(d * .8); + const armWidth = Math.round(d * .5); + const arms = [["ArrowUp", 0, -1], ["ArrowDown", 0, 1], + ["ArrowLeft", -1, 0], ["ArrowRight", 1, 0]]; + for (const [button, dx, dy] of arms) + filledCapsule(leftLobeX, bodyMidY, leftLobeX + dx * armLen, + bodyMidY + dy * armLen, armWidth, directionActive(button) + ? mixColor(crossInk, [245, 248, 255], .5) : crossInk); + filledDisc(leftLobeX, bodyMidY, Math.max(2, Math.round(d * .14)), + mixColor([16, 18, 26], [22, 24, 32], light)); + // START — the red pill mid-body, its name silkscreened beneath, with the + // 2.4G's three tiny extras below. Pressed wears the discs' white rim. + const startPressed = held.includes("Menu"); + const midX = Math.round((leftLobeX + rightLobeX) / 2); + const pillHalf = Math.round(size * .5); + const pillY = bodyMidY - Math.round(d * .28); + if (startPressed) filledCapsule(midX - pillHalf, pillY, midX + pillHalf, + pillY, Math.round(size * .44) + 4, [245, 248, 255]); + filledCapsule(midX - pillHalf, pillY, midX + pillHalf, pillY, + Math.round(size * .44), startPressed + ? mixColor(padButtonInk.M30S, [255, 255, 255], .3) : padButtonInk.M30S); + const startLabelSize = Math.round(small * .8); + typeWrite("START", Math.round(midX - handleWidth("START", startLabelSize) / 2), + pillY + Math.round(size * .32), startLabelSize, ...print); + for (let dot = 0; dot < 3; dot++) + filledDisc(midX + (dot - 1) * Math.round(d * .42), + pillY + Math.round(d * .85), Math.max(2, Math.round(d * .09)), print); + // The face arcs climb to the right like the hardware; the top row runs + // smaller and the bottom row leans into the thumb. + const pitch = Math.round(d * 1.05); + const drop = Math.round(d * .3); + const smallFace = Math.round(size * .82); + const disc = (key, cap, cx, cy, buttonSize, pressed) => + drawPadButton(key, cx - Math.round(buttonSize * .78), + cy - Math.round(buttonSize * .75), buttonSize, pressed, 1, cap); + const face = [ + ["M30X", "X", 0, 0, smallFace, held.includes("X")], + ["M30Y", "Y", 1, 0, smallFace, held.includes("Y")], + ["M30Z", "Z", 2, 0, smallFace, held.includes(m30FaceSends.Z)], + ["M30A", "A", 0, 1, size, held.includes("A")], + ["M30B", "B", 1, 1, size, held.includes("B")], + ["M30C", "C", 2, 1, size, held.includes(m30FaceSends.C)], + ]; + for (const [key, cap, column, row, buttonSize, pressed] of face) + disc(key, cap, + rightLobeX + Math.round((column - 1) * pitch - d * .35) + + (row ? Math.round(d * .34) : 0), + bodyMidY - Math.round(d * .8) + (2 - column) * drop + + (row ? Math.round(d * .92) : 0), + buttonSize, pressed); + let rowY = bodyMidY + lobeR + Math.round(small * 1.2); + const captions = [ + `A KICK B PUNCH C ${m30SendLabel[m30FaceSends.C]}`, + `X SHIELD Y USE ITEM Z ${m30SendLabel[m30FaceSends.Z]}`, + `L ${m30SendLabel.LeftShoulder} R ${m30SendLabel.LeftTrigger}`, + "A+B GRAB START PAUSE", + ]; + for (const caption of captions) { + typeWrite(caption, x, rowY, small, ...ink); + rowY += Math.round(small * 1.55); + } + return rowY + Math.round(small * .6); +} + +// Lifted clear of the bottom edge, because the signed-in handle and its +// logout button now sit in that corner and the legend used to run straight +// through them on a narrow view. +function drawControlLegend(ink) { + const device = typeof capabilities === "function" ? capabilities() : {}; + if (device.showControlLegend === false || device.inputFamily === "touch") return; + const safe = hudSafeRect(); + const pad = localPad(); + const held = pad.down || []; + const directionActive = (button) => held.includes(button) || + (button === "ArrowLeft" && pad.leftX < -.12) || + (button === "ArrowRight" && pad.leftX > .12) || + (button === "ArrowUp" && pad.leftY > .12) || + (button === "ArrowDown" && pad.leftY < -.12); + const size = compactLayout() ? 18 : 24; + const x = safe.left + 8; + const both = held.includes("A") && held.includes("B"); + const legendFighter = players[localSeat()]; + const dash = legendFighter.lastButton === "DASH" && + runtime().monotonicUs - legendFighter.lastButtonAt < 700000; + const controls = [ + ["LEFT", "ArrowLeft", "MOVE"], + ["RIGHT", "ArrowRight", dash ? "DASH >>" : "MOVE"], + ["STICK_UP", "ArrowUp", "AIR"], + ["DOWN", "ArrowDown", "CROUCH"], + ["A", "A", both ? "GRAB" : "KICK"], + ["B", "B", both ? "GRAB" : itemMelee[heldItem(legendFighter)] || "PUNCH"], + ["X", "X", "SHIELD"], + ["Y", "Y", "USE ITEM"], + ]; + if (survivalActive()) controls.length = 4; + const keyboard = keycapFamily(); + // A seated M30 trades the whole legend column for the pad's own manual + // page — the drawn controller carries its d-pad, so no rows remain. + const m30 = device.showControllerDiagram !== false && + !keyboard && !survivalActive() && m30Seated(); + if (m30) controls.length = 0; + const keyboardCap = { LEFT: "A", RIGHT: "D", STICK_UP: "W", DOWN: "S", + A: "SPACE", B: "ENTER", X: "SHIFT", Y: "ALT" }; + const step = Math.round(size * 1.82); + for (const [row, [cap, button, action]] of controls.entries()) { + const y = safe.top + row * step; + const width = keyboard + ? drawKeycap(keyboardCap[cap] || cap, + x, y, size, + directionActive(button)) + : drawPadButton(cap, x, y, size, + button.startsWith("Arrow") ? directionActive(button) : held.includes(button)); + if (action) typeWrite(action, x + width + 10, + y + Math.round(size * .25), size, ...ink); + } + let legendBottom = safe.top + controls.length * step; + if (m30) legendBottom = drawM30Cluster(x, legendBottom, size, held, + directionActive, ink); + drawStickGate(x, legendBottom, size, pad, ink); +} + +// The legend named the stick's directions but never its ANGLE, so a fighter +// walking on a half-tilted stick looked identical to one at full lean, and +// the camera stick had no read-out at all. Only drawn while a stick is off +// center: an always-present gate would be one more permanently-lit widget in +// a corner that is already busy. +function drawStickGate(x, y, size, pad, ink) { + const gate = (label, dx, dy, column) => { + const radius = Math.round(size * .82); + const cx = x + radius + column * Math.round(radius * 2.6); + const cy = y + radius; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + // The gate ring is drawn as a disc under a smaller ground-colored disc: + // filledDisc is the only circle primitive the piece owns, and two of them + // cost less than an arc walked out of line segments. + filledDisc(cx, cy, radius, idle); + filledDisc(cx, cy, radius - 3, + mixColor([7, 8, 28], [230, 239, 247], visualTheme.light)); + // Screen y grows downward while the pad reports up as positive. + const knobX = cx + dx * (radius - 5); + const knobY = cy - dy * (radius - 5); + filledDisc(knobX, knobY, Math.max(3, Math.round(size * .26)), ink); + typeWrite(label, cx - radius, cy + radius + 2, + Math.round(size * .62), ...ink); + }; + const live = (dx, dy) => Math.abs(dx) > .12 || Math.abs(dy) > .12; + const leftX = Number(pad.leftX) || 0; + const leftY = Number(pad.leftY) || 0; + const rightX = Number(pad.rightX) || 0; + const rightY = Number(pad.rightY) || 0; + let column = 0; + if (live(leftX, leftY)) gate("move", leftX, leftY, column++); + if (live(rightX, rightY)) gate("cam", rightX, rightY, column++); +} + +const controlRailWidth = () => compactLayout() ? 138 : 188; + +// Touch is part of the game surface, not a DOM overlay. One drawn d-pad and +// four action discs share the exact centers used by mac-test's canvas hit zones. +function drawTouchControls() { + if (typeof capabilities !== "function" || + capabilities().inputFamily !== "touch" || capabilities().socialPreview) + return; + const held = localPad().down || []; + const spread = 64; + // The clusters stand clear of the home indicator and any notch ear; the + // shell's touchKeyAt mirrors this arithmetic, so a shift here must land + // there too or the drawing and the hit test come apart. + const cy = viewHeight - 140 - viewInset.bottom; + const dpadX = 130 + viewInset.left; + const idle = mixColor([58, 66, 86], [170, 180, 196], visualTheme.light); + const live = mixColor([110, 220, 150], [38, 128, 88], visualTheme.light); + const arm = 38; + const thick = 18; + const directions = [[0, -1, "ArrowUp"], [0, 1, "ArrowDown"], + [-1, 0, "ArrowLeft"], [1, 0, "ArrowRight"]]; + for (const [dx, dy, key] of directions) + filledCapsule(dpadX + dx * 8, cy + dy * 8, + dpadX + dx * arm, cy + dy * arm, thick, + held.includes(key) ? live : idle); + filledDisc(dpadX, cy, thick, held.some((key) => key.startsWith("Arrow")) + ? live : idle); + const actionX = viewWidth() - 130 - viewInset.right; + const commandGlyph = { A: "/", B: "*", X: ")", Y: "+" }; + for (const [dx, dy, key] of [[0, -1, "Y"], [0, 1, "A"], + [-1, 0, "X"], [1, 0, "B"]]) + drawPadButton(key, actionX + dx * spread - 27, + cy + dy * spread - 25, 35, held.includes(key), 1, commandGlyph[key]); +} + +function keycapRunWidth(entries, size) { + const keyboard = keycapFamily(); + const padX = Math.round(size * .42); + const capWidth = (label) => keyboard + ? handleWidth(label, size) + padX * 2 : padButtonDiameter(size); + return entries.reduce((total, [cap, action]) => + total + (Array.isArray(cap) ? cap : [cap]).reduce((width, label, index) => + width + capWidth(label) + (index ? 5 : 0), 0) + 8 + + handleWidth(action, size) + 26, 0) - 26; +} + +// Keyboard reads as keycaps; every other family reads as controller discs. +const keycapFamily = () => (typeof capabilities === "function" + ? String(capabilities().inputFamily || "") : "") === "keyboard"; + +function drawKeycapRun(entries, x, y, size, held, ink, revealAction = null) { + const keyboard = keycapFamily(); + let cursor = x; + for (const [cap, action, button] of entries) { + for (const [index, label] of (Array.isArray(cap) ? cap : [cap]).entries()) { + if (index) cursor += 5; + cursor += keyboard + ? drawKeycap(label, cursor, y, size, held.includes(button)) + : drawPadButton(label, cursor, y, size, held.includes(button)); + } + cursor += 8; + if (!revealAction || revealAction([cap, action, button])) + typeWrite(action, cursor, y + Math.round(size * .25), size, ...ink); + cursor += handleWidth(action, size) + 26; + } + return cursor; +} + +function drawCenteredKeycapRun(entries, y, size, held, ink) { + if (!entries.length) return; + drawKeycapRun(entries, viewCenterX() - keycapRunWidth(entries, size) / 2, + y, size, held, ink); +} + +function drawHandle(handle, x, y, size, colors, fallback) { + let cursor = x; + const characters = [...String(handle)]; + for (let index = 0; index < characters.length; index++) { + typeWrite(characters[index], cursor, y, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(characters[index], size); + } +} + +function drawFace(player, head, color, t, now = runtime().monotonicUs) { + if (photoThemeActive) color = [20, 12, 26]; + if (head.radius < 5) return; + const bodyDepth = triangleDepth; + triangleDepth = bodyDepth - .012; + const r = head.radius; + const direction = player.facing || 1; + // The whole face turns with a rolling head. Every feature below is placed + // in flat face-space and spun around the head's center on the way to the + // canvas — eyes, mouth, hair, tears, hearts, all of it — instead of the old + // look where the head traveled and the face stayed nailed upright. + const roll = isHeadOnly(player) ? player.headRoll || 0 : photoThemeActive ? player.skateRotation || 0 : 0; + const cosRoll = Math.cos(roll), sinRoll = Math.sin(roll); + const spin = (x, y) => roll === 0 ? { x, y } : { + x: head.x + (x - head.x) * cosRoll - (y - head.y) * sinRoll, + y: head.y + (x - head.x) * sinRoll + (y - head.y) * cosRoll }; + const stroke = (x1, y1, x2, y2, width, ink = color) => { + const a = spin(x1, y1), b = spin(x2, y2); + filledCapsule(a.x, a.y, b.x, b.y, width, ink); + }; + const ring = (x, y, ringRadius, thickness, ink) => { + const point = spin(x, y); + filledRing(point.x, point.y, ringRadius, thickness, ink); + }; + const disc = (x, y, discRadius, ink) => { + const point = spin(x, y); + filledDisc(point.x, point.y, discRadius, ink); + }; + const glyph = (text, x, y, size, ...ink) => { + const point = spin(x, y); + systemWrite(text, point.x, point.y, size, ...ink); + }; + const celebrating = ["DANCE", "LAUGH", "POSE", "WIGGLE"] + .includes(player.resultReaction); + const grieving = ["CRY", "WOE", "SULK"].includes(player.resultReaction); + if (player.name === "@FIFI") { + const hair = visualTheme.light > .55 ? [105, 38, 116] : [245, 118, 230]; + const sway = Math.sin(t * 2.2 + player.pad) * r * .08; + const width = Math.max(2, r * .13); + stroke(head.x - r * .72, head.y - r * .48, + head.x - r * .32, head.y - r * .9, width, hair); + stroke(head.x - r * .32, head.y - r * .9, + head.x + r * .35, head.y - r * .88, width, hair); + stroke(head.x + r * .35, head.y - r * .88, + head.x + r * .76, head.y - r * .38, width, hair); + stroke(head.x - r * .76, head.y - r * .38, + head.x - r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x + r * .76, head.y - r * .38, + head.x + r * .7 + sway, head.y + r * .92, width, hair); + stroke(head.x - r * .48, head.y - r * .46, + head.x - r * .08, head.y - r * .18, width * .72, hair); + stroke(head.x - r * .08, head.y - r * .18, + head.x + r * .42, head.y - r * .5, width * .72, hair); + } + const eyeY = head.y - r * (photoThemeActive ? .07 : .18); + const eyeGap = r * (photoThemeActive ? .30 : .34); + const faceX = head.x + direction * r * (photoThemeActive ? .22 : .08); + const eyeWidth = Math.max(1.4, r * (photoThemeActive ? .125 : .1)); + const lineWidth = Math.max(1.2, r * .1); + const blink = player.alive && !player.blocking && !player.attackKind && + Math.sin(t * .73 + player.pad * 2.1) > .985; + const spitAge = now - (player.spitAt || -Infinity); + const spitting = isHeadOnly(player) && spitAge >= 0 && spitAge < 190000; + const inertDummy = player.npc && !player.bot; + const victoryAmount = deathCinematic?.winnerPad === player.pad + ? clamp(deathCinematicAge(now) / 1.15, 0, 1) : 0; + if (photoThemeActive) { + // Cover the photographed eyes completely before drawing live gaze and + // expressions. Closed lids are opaque, including the baked pupils. + const socket = blink ? (player.pad === 0 ? [135,101,190] : [115,162,53]) : [237,234,221]; + for (const offset of [-eyeGap,eyeGap]) disc(faceX+offset,eyeY,r*.315,socket); + } + if (!player.alive || player.hit > .6 || inertDummy) { + for (const offset of [-eyeGap, eyeGap]) { + stroke(faceX + offset - eyeWidth, eyeY - eyeWidth, + faceX + offset + eyeWidth, eyeY + eyeWidth, lineWidth); + stroke(faceX + offset + eyeWidth, eyeY - eyeWidth, + faceX + offset - eyeWidth, eyeY + eyeWidth, lineWidth); + } + } else if (spitting) { + // The release reads on the face before the glob clears it: both eyes + // squeeze inward for the same short beat as the pursed lips below. + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset - eyeWidth * 1.35, + eyeY + (offset < 0 ? -1 : 1) * r * .035, + faceX + offset + eyeWidth * 1.35, + eyeY + (offset < 0 ? 1 : -1) * r * .035, + lineWidth * 1.15); + } else if (blink) { + stroke(faceX - eyeGap - eyeWidth, eyeY, faceX - eyeGap + eyeWidth, + eyeY, lineWidth); + stroke(faceX + eyeGap - eyeWidth, eyeY, faceX + eyeGap + eyeWidth, + eyeY, lineWidth); + } else { + const pad = inputPads[player.pad] || {}; + const rawX = Number(pad.leftX) || 0; + const rawY = Number(pad.leftY) || 0; + const movementDeadzone = .48; + const gazeNoiseFloor = .015; + const digitalX = (pad.down || []).includes("ArrowRight") ? 1 + : (pad.down || []).includes("ArrowLeft") ? -1 : 0; + const digitalY = (pad.down || []).includes("ArrowUp") ? 1 + : (pad.down || []).includes("ArrowDown") ? -1 : 0; + const rawMagnitude = Math.hypot(rawX, rawY); + const gazeAmount = rawMagnitude <= gazeNoiseFloor ? 0 + : clamp((rawMagnitude - gazeNoiseFloor) / + (movementDeadzone - gazeNoiseFloor), 0, 1); + const defeated = victoryAmount > 0 + ? players[deathCinematic.loserPad] : null; + const lookX = defeated + ? Math.sign(defeated.x - player.x) || direction + : digitalX || lerp(direction * .2, rawX, gazeAmount); + const lookY = defeated + ? clamp((player.y - defeated.y) / 180, -1, 1) + : digitalY || lerp(0, rawY, gazeAmount); + const pupilX = clamp(lookX, -1, 1) * eyeWidth * 1.05; + const pupilY = clamp(-lookY, -1, 1) * eyeWidth * 1.05; + const socketRadius = eyeWidth * 2.35; + const pupilRadius = eyeWidth * .9; + const socketInk = [246, 248, 244]; + const pupilInk = [8, 12, 24]; + for (const offset of [-eyeGap, eyeGap]) { + disc(faceX + offset, eyeY, socketRadius, socketInk); + triangleDepth = bodyDepth - .02; + disc(faceX + offset + pupilX, eyeY + pupilY, + pupilRadius, pupilInk); + triangleDepth = bodyDepth - .012; + } + } + if (player.bot && player.alive && !player.blocking) { + const browY = eyeY - r * .32; + stroke(faceX - eyeGap - eyeWidth * 1.25, browY - r * .08, + faceX - eyeGap + eyeWidth * 1.25, browY + r * .1, + lineWidth * 1.15); + stroke(faceX + eyeGap - eyeWidth * 1.25, browY + r * .1, + faceX + eyeGap + eyeWidth * 1.25, browY - r * .08, + lineWidth * 1.15); + } + if (grieving) { + const tear = [112, 208, 255]; + const fall = (t * 34) % Math.max(3, r * .55); + for (const offset of [-eyeGap, eyeGap]) + stroke(faceX + offset, eyeY + eyeWidth * 1.5, + faceX + offset, eyeY + eyeWidth * 1.5 + r * .34 + fall, + Math.max(1.5, lineWidth * .72), tear); + } + const mouthY = head.y + r * .3; + if (spitting) { + const release = 1 - clamp(spitAge / 190000, 0, 1); + const lip = player.spitHeavy ? [226, 58, 126] : [232, 92, 132]; + // faceX already carries .08r of facing offset; another .12r makes this + // exactly the .20r face-space mouth used by spitMouthPose(). + ring(faceX + direction * r * .12, mouthY, + r * (.105 + release * .055), Math.max(.7, r * .055), lip); + } else if (player.resultReaction === "LAUGH") { + const age = Math.max(0, (now - player.resultReactionAt) / 1000000); + const open = .35 + Math.abs(Math.sin(age * 18)) * .65; + ring(faceX + direction * r * .08, mouthY, + r * (.12 + open * .1), r * .045, color); + for (let index = 0; index < 3; index++) { + const noteAge = (age * .72 + index * .27) % 1; + const note = index % 2 ? "♫" : "♪"; + glyph(note, + faceX + direction * r * (.34 + noteAge * 1.25) + index * direction * 3, + mouthY - r * (.25 + noteAge * 1.75), + Math.max(8, r * (.55 - noteAge * .16)), ...color); + } + } else if (celebrating || victoryAmount > 0) { + const grin = r * (.09 + victoryAmount * .2); + const width = r * (.23 + victoryAmount * .12); + stroke(faceX - width, mouthY - grin * .18, faceX, + mouthY + grin, lineWidth); + stroke(faceX, mouthY + grin, faceX + width, + mouthY - grin * .18, lineWidth); + // Hearts off a winner, on the laugh notes' trick: a few glyphs on + // staggered loops. A reel carries no HUD to announce the win, so the + // celebration has to be legible on the face itself. + if (victoryAmount > 0) { + const age = deathCinematicAge(now); + for (let index = 0; index < 3; index++) { + const rise = (age * .6 + index * .34) % 1; + const drift = Math.sin(age * 2.2 + index * 2.4) * r * .22; + glyph("♥", + faceX + drift + (index - 1) * r * .42, + mouthY - r * (.95 + rise * 2.1), + Math.max(7, r * (.46 - rise * .17) * victoryAmount), + 255, 96 + index * 22, 148); + } + } + } else if (player.attackKind && meleePulse(player, now) > 0) { + ring(faceX + direction * r * .12, mouthY, + Math.max(1.8, r * .13), Math.max(.4, r * .05), color); + } else if (player.blocking) { + stroke(faceX - r * .26, mouthY, faceX + r * .26, mouthY, lineWidth); + } else if (grieving || !player.alive || player.hit > .6) { + stroke(faceX - r * .24, mouthY + r * .08, faceX, + mouthY - r * .06, lineWidth); + stroke(faceX, mouthY - r * .06, faceX + r * .24, + mouthY + r * .08, lineWidth); + } else { + const smile = Math.sin(t * 2.4 + player.pad) * r * .035; + stroke(faceX - r * .23, mouthY - smile, faceX, + mouthY + r * .09, lineWidth); + stroke(faceX, mouthY + r * .09, faceX + r * .23, + mouthY - smile, lineWidth); + } + triangleDepth = bodyDepth; +} + +function drawInventory(player, now, geometry) { + // A bodyless head carries nothing visible. The sword rode a phantom + // forearm and read as a dark clock hand sweeping through the rolled face — + // steel that never turned with the head it was stuck to. The head keeps its + // items and can still fire; it just doesn't brandish them. + if (isHeadOnly(player)) return; + const scale = cameraScale(); + const gunColor = player.gunMode === "ROCKET LAUNCHER" ? [48, 61, 52] + : player.gunMode === "RUBBER SMG" ? [38, 53, 72] + : player.gunMode === "SPACE LASER" ? [58, 92, 122] : [63, 43, 76]; + const grenadeColor = [255, 105, 105]; + const firing = player.itemAction === "FIRE" && now < player.itemActionUntil; + const throwing = player.itemAction === "THROW" && now < player.itemActionUntil; + // A bash keeps the grenade visible in the fist; itemHandTarget already + // parks both weapons on the swinging hand. + const bashing = player.attackKind === "BASH" && itemSwinging(player, now); + if (player.swordHeld && player.gunAmmo <= 0 && !throwing && + hasPart(player, itemHand(player))) { + // The hilt pins to the hand the silhouette actually draws — the far end + // of the item arm's forearm capsule — and the blade lies along that + // forearm, so grip and angle ride the limb through idle sway, stride, + // whips, freezes, and replays. The gun's aim pose floated here: with no + // ammo the arm never presents, leaving steel mid-air at a fixed angle. + const limbs = geometry.segments; + const forearm = limbs.find((segment) => segment.role === "item-forearm" || + segment.role === "attack-forearm") || + limbs.find((segment) => segment.role?.endsWith("forearm") && + segment.part === itemHand(player)) || + limbs.find((segment) => segment.role?.endsWith("forearm")); + if (forearm) { + const hand = { x: forearm.x2, y: forearm.y2 }; + const alongX = hand.x - forearm.x1; + // A hanging arm would drive the tip into the dirt, so the fist rolls + // the blade skyward at rest; swings still lay steel along the striking + // forearm because melee targets sit at shoulder height. + const alongY = -Math.abs(hand.y - forearm.y1); + const length = Math.hypot(alongX, alongY) || 1; + const tipX = hand.x + alongX / length * 118 * scale; + const tipY = hand.y + alongY / length * 118 * scale; + const acrossX = -alongY / length; + const acrossY = alongX / length; + // Steel became light. Three passes down the same line — a wide halo in + // the fighter's OWN color, then a narrower saturated sheath, then a + // white core — because a blade drawn in one flat tone reads as a stick, + // and because in a versus round the two blades then say which fighter + // is which from across the map, the way the handle colors already do. + // The hum lives in the halo's width: it breathes on the same clock the + // pickups bob on, so a held saber is never a still object. + const hum = 1 + .12 * Math.sin(now / 82000); + const halo = mixColor(player.color, [14, 20, 36], .35); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(4, 13 * scale * hum), halo); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(3, 8 * scale), player.color); + filledCapsule(hand.x, hand.y, tipX, tipY, + Math.max(1.5, 3.5 * scale), [244, 252, 255]); + // The hilt stays machined and dark: it is the one part of a saber that + // is an object, and it is what keeps the blade from reading as a beam + // fired out of a bare fist. + filledCapsule(hand.x + acrossX * 11 * scale, hand.y + acrossY * 11 * scale, + hand.x - acrossX * 11 * scale, hand.y - acrossY * 11 * scale, + Math.max(2, 5 * scale), [148, 156, 172]); + filledCapsule(hand.x, hand.y, + hand.x - alongX / length * 18 * scale, + hand.y - alongY / length * 18 * scale, + Math.max(2, 6 * scale), [34, 30, 40]); + } + } + if ((player.gunAmmo > 0 || firing) && !throwing) { + const forearm = itemForearm(player, geometry); + if (!forearm) return; + const pose = gunPose(player, now); + const projectedHand = projectPoint(pose.hand.x, pose.hand.y, pose.hand.z); + // Render reactions and replay poses may move the drawn skeleton after + // projection. Its actual wrist remains the final attachment point. + const hand = {x:forearm.x2, y:forearm.y2}; + const offsetX = hand.x - projectedHand.x, offsetY = hand.y - projectedHand.y; + const projectWeapon = (x, y, z) => { + const point = projectPoint(x, y, z); + return {x:point.x + offsetX, y:point.y + offsetY}; + }; + const barrel = projectWeapon(pose.muzzle.x, pose.muzzle.y, pose.muzzle.z); + const barrelWidth = Math.max(3, 9 * scale); + const gripWidth = Math.max(2, 6 * scale); + // Xbox batches its native line layer underneath GPU fighter triangles. + // Held items therefore use the same depth-aware capsule path as the hand. + if (photoThemeActive) { + // Place the photograph's grip at the solved wrist. Reflect its local X + // before rotation so aiming left does not turn the grip upside down. + const dx = barrel.x - hand.x, dy = barrel.y - hand.y; + const length = Math.hypot(dx, dy) || 1; + const flip = player.facing < 0; + const width = Math.max(18, length / .72), height = width * 253 / 365; + const angle = Math.atan2(dy, dx) - (flip ? Math.PI : 0); + const ox = (flip ? -1 : 1) * width * .25, oy = -height * .1; + const c = Math.cos(angle), s = Math.sin(angle); + photoSprite("gun", hand.x + ox*c - oy*s, hand.y + ox*s + oy*c, + width, height, angle, flip, triangleDepth - .025); + } else { + filledCapsule(hand.x, hand.y, barrel.x, barrel.y, + barrelWidth, gunColor); + const gripX = hand.x - player.facing * 8 * scale; + const gripY = hand.y + 20 * scale; + filledCapsule(hand.x, hand.y, gripX, gripY, gripWidth, gunColor); + if (player.gunMode === "RUBBER SMG") { + // One uninterrupted dark silhouette: longer receiver, rear stock, and a + // forward magazine distinguish it from the short pistol in-hand. + const stockX = hand.x - pose.dx * 32 * scale; + const stockY = hand.y - pose.dy * 32 * scale; + filledCapsule(hand.x, hand.y, stockX, stockY, + barrelWidth * 1.12, gunColor); + const magazineX = hand.x + pose.dx * 18 * scale - pose.dy * 17 * scale; + const magazineY = hand.y + pose.dy * 18 * scale + pose.dx * 17 * scale; + filledCapsule(hand.x + pose.dx * 18 * scale, + hand.y + pose.dy * 18 * scale, magazineX, magazineY, + gripWidth, gunColor); + } + if (player.gunMode === "ROCKET LAUNCHER") { + const rearX = hand.x - pose.dx * 38 * scale; + const rearY = hand.y - pose.dy * 38 * scale; + filledCapsule(rearX, rearY, barrel.x, barrel.y, + barrelWidth * 1.8, gunColor); + filledDisc(barrel.x, barrel.y, barrelWidth * 1.45, [104, 62, 48]); + } + } + if (firing) { + const normalX = -pose.dy; + const normalY = pose.dx; + const flashA = projectWeapon( + pose.muzzle.x + pose.dx * 28 + normalX * 18, + pose.muzzle.y + pose.dy * 28 + normalY * 18, pose.muzzle.z); + const flashB = projectWeapon( + pose.muzzle.x + pose.dx * 28 - normalX * 18, + pose.muzzle.y + pose.dy * 28 - normalY * 18, pose.muzzle.z); + filledCapsule(barrel.x, barrel.y, flashA.x, flashA.y, + Math.max(2, 5 * scale), [255, 248, 190]); + filledCapsule(barrel.x, barrel.y, flashB.x, flashB.y, + Math.max(2, 5 * scale), [255, 248, 190]); + } + } + if (throwing || bashing) { + const target = itemHandTarget(player, now); + const hand = projectPoint(target.x, target.y, target.z); + hudCircle(hand.x, hand.y, Math.max(5, 15 * scale), + Math.max(2, 5 * scale), grenadeColor); + } +} + +function drawDigitalHeadBurst(player, headWorld, age) { + const burstAge = Math.max(0, age - .11); + const origin = projectPoint(headWorld.x, headWorld.y, headWorld.z); + if (![origin.x, origin.y, origin.z].every(Number.isFinite) || + Math.abs(origin.x) > 30000 || Math.abs(origin.y) > 30000) return; + const palette = [ + [255, 48, 96], [176, 18, 54], [255, 92, 126], + player.color, [116, 8, 38], + ]; + const directions = [-2.92, -2.61, -2.3, -2.01, -1.72, -1.43, + -1.14, -.83, -.52, -.21, .1, .41, .72, 1.03]; + for (let index = 0; index < directions.length; index++) { + const angle = directions[index] + (player.pad ? .14 : -.14); + const speed = 48 + index * 4; + const fall = 10 * burstAge + 72 * burstAge * burstAge; + for (let speck = 0; speck < 3; speck++) { + const spread = .38 + speck * .29; + const distance = (5 + speed * burstAge) * spread; + const depth = (index % 3 - 1) * (3 + burstAge * 9) * spread; + const point = projectPoint( + headWorld.x + Math.cos(angle) * distance, + headWorld.y + Math.sin(angle) * distance + fall * spread, + headWorld.z + depth); + if (![point.x, point.y, point.z].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + triangleDepth = point.z; + const pixel = clamp((2.6 - speck * .48) * cameraScale(), 1.5, 4); + screenRect(point.x - pixel / 2, point.y - pixel / 2, + pixel, pixel, palette[(index + speck) % palette.length]); + } + } + // The face becomes a small broken core rather than remaining an intact disc. + const core = Math.max(2, headWorld.radius * cameraScale() * + Math.max(.08, 1 - burstAge * 6.2)); + triangleDepth = origin.z; + for (let index = 0; index < 4; index++) { + const side = index % 2 ? 1 : -1; + const row = index < 2 ? -1 : 1; + const size = core * (.62 + index * .05); + screenRect(origin.x + side * core * .32 - size / 2, + origin.y + row * core * .3 - size / 2, size, size, + palette[index % palette.length]); + } +} + +function drawBrokenRunner(player, age) { + const world = player.frozenGeometry || + runnerWorldGeometry(player, (runtime().monotonicUs - startedAt) / 1000000); + const slow = Math.max(0, age - .11) * .32; + const gravity = 420 * slow * slow; + const outline = [8, 12, 24]; + for (let index = 0; index < world.segments.length; index++) { + const segment = world.segments[index]; + const midX = (segment.x1 + segment.x2) / 2; + const midY = (segment.y1 + segment.y2) / 2; + const side = index % 2 ? 1 : -1; + const dx = (side * (72 + index * 9) - player.facing * 34) * slow; + const dy = -(150 + index * 13) * slow + gravity; + const dz = side * (24 + index * 4) * slow; + const angle = side * slow * (1.15 + index * .08); + const cosine = Math.cos(angle); + const sine = Math.sin(angle); + const move = (x, y, z) => { + const localX = x - midX; + const localY = y - midY; + return { x: midX + localX * cosine - localY * sine + dx, + y: midY + localX * sine + localY * cosine + dy, + z: z + dz }; + }; + const first = move(segment.x1, segment.y1, segment.z1); + const second = move(segment.x2, segment.y2, segment.z2); + const a = projectPoint(first.x, first.y, first.z); + const b = projectPoint(second.x, second.y, second.z); + if (![a.x, a.y, b.x, b.y].every(Number.isFinite) || + [a.x, a.y, b.x, b.y].some((value) => Math.abs(value) > 30000)) + continue; + triangleDepth = projectPoint(midX + dx, midY + dy, + (segment.z1 + segment.z2) / 2 + dz).z; + const width = Math.max(2, segment.width * cameraScale()); + if (photoThemeActive) photoLimb({x1:a.x,y1:a.y,x2:b.x,y2:b.y,width}, player.pad); + else { + filledCapsule(a.x, a.y, b.x, b.y, width + 3, outline); + filledCapsule(a.x, a.y, b.x, b.y, width, player.color); + } + } + drawDigitalHeadBurst(player, world.head, age); +} + +function deathCinematicAge(now = runtime().monotonicUs) { + return deathCinematic ? Math.max(0, (now - deathCinematic.startedAt) / 1000000) : -1; +} + +function drawDeathFlash() { + const age = deathCinematicAge(); + if (age < 0 || age >= .11) return; + const previousDepth = triangleDepth; + triangleDepth = -1.425; + const flash = age < .055 ? [255, 255, 255] : [255, 226, 116]; + screenRect(0, 0, viewWidth(), viewHeight, flash); + triangleDepth = previousDepth; +} + +function drawRunner(player, t, showLabel = true) { + // A fighter who is down is still on the stage: they read as the broken body + // rather than as nothing. There is no state in which a fighter is skipped. + const headBurstAge = player.headBustedAt + ? Math.max(0, (runtime().monotonicUs - player.headBustedAt) / 1000000) : -1; + if (!player.alive && headBurstAge >= .11) { + drawBrokenRunner(player, headBurstAge); + if (["CRY", "WOE", "SULK"].includes(player.resultReaction)) { + const head = player.frozenGeometry?.head; + if (head) { + // In screen proportion to the head, not in pixels: the celebration + // camera can fill the frame with this face, and fixed-size tears on a + // huge head read as dust. Ratios match the old look at the old + // distance (a ~22px head wore 7/34/3px tears). + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const r = Math.max(4, Math.hypot(edge.x - point.x, edge.y - point.y)); + const sway = Math.sin(t * 11) * r * .22; + for (const side of [-1, 1]) + filledCapsule(point.x + side * r * .32 + sway, point.y, + point.x + side * r * .32 - sway, + point.y + r * 1.5 + (t * 31) % (r * .8), + Math.max(1.5, r * .14), [112, 208, 255]); + } + } + return; + } + if (player.fallenBodyGeometry) { + const fallen = projectRunnerWorldGeometry(player.fallenBodyGeometry); + drawSkeletonSegments(fallen.segments, player.color, [8, 12, 24], photoThemeActive ? player : null); + } + const geometry = player.replayGeometry + ? projectRunnerWorldGeometry(player.replayGeometry) + : player.frozenGeometry + ? projectRunnerWorldGeometry(player.frozenGeometry) + : runnerGeometry(player, t); + if (roundResult && player.resultReaction) { + const age = (runtime().monotonicUs - player.resultReactionAt) / 1000000; + const amount = player.resultReaction === "POSE" || + player.resultReaction === "SULK" ? 3 : 8; + const dx = Math.sin(age * (player.resultReaction === "DANCE" ? 15 : 9)) * amount; + const dy = player.resultReaction === "DANCE" + ? -Math.abs(Math.sin(age * 9)) * 15 + : Math.sin(age * 12) * amount * .35; + geometry.head.x += dx; + geometry.head.y += dy; + for (const segment of geometry.segments) { + segment.x1 += dx; segment.x2 += dx; + segment.y1 += dy; segment.y2 += dy; + } + } + // Preserve the fighter's identity color during hit flash. A pure white body + // disappeared against the daylight arena, so impact now changes only its rim. + const color = player.color; + const outline = player.hit > 0 + ? mixColor([255, 232, 92], [28, 34, 52], visualTheme.light) + : [8, 12, 24]; + const displayNow = player.frozenAt || runtime().monotonicUs; + if (player.skateboard) drawSkateboard(player); + drawFighterSilhouette(geometry, color, outline, player); + const hitNow = runtime().monotonicUs; + if (player.hitSegment >= 0 && hitNow < player.hitSegmentUntil && + Math.floor(hitNow / 45000) % 2 === 0) { + const segment = geometry.segments[player.hitSegment]; + if (segment) { + filledCapsule(segment.x1, segment.y1, segment.x2, segment.y2, + segment.width + Math.max(3, 5 * cameraScale()), [255, 238, 102]); + } + } + // Every fighter wears its face everywhere now, the title included. The + // still tableau used to sit faceless — a sparring-partner special case + // grown from the old dummy door — but the wordmark screen is the + // storefront, and whoever sits under it should look back. + drawFace(player, geometry.head, contrastShadow(color), t, displayNow); + drawInventory(player, displayNow, geometry); + drawDistantFighterLocator(player, geometry.head); + if (player.blocking) { + const worldShield = shieldGeometry(player); + const shield = projectPoint(worldShield.x, worldShield.y, worldShield.z); + const radius = Math.max(18, worldShield.radius * cameraScale()); + const shieldColor = player.blockFlash > 0 ? [255, 255, 255] : player.color; + const outerWidth = Math.max(4, 11 * cameraScale()); + filledRing(shield.x, shield.y, radius, + Math.max(0, radius - outerWidth), shieldColor); + } + +} + +function drawDiveMotion(player, t) { + if (player.grounded || (!player.pounding && !player.pogoDive)) return; + const level = player.pounding ? Math.max(1, player.poundLevel || 1) : 1; + const speed = clamp(Math.abs(player.vy) / poundMaxVelocity, .25, 1.8); + const color = mixColor(player.color, + level === 3 ? [255, 80, 92] : level === 2 ? [255, 190, 62] : [255, 245, 196], + .46 + level * .12); + const count = 3 + level * 3; + for (let index = 0; index < count; index++) { + const spread = (index - (count - 1) / 2) * 24; + const wobble = Math.sin(t * 13 + index * 2.1) * 9; + const x = player.x + spread + wobble; + const startY = player.y - 125 - index % 2 * 36; + const endY = startY - (95 + index * 17) * speed; + worldCapsule(x, startY, player.z + 18, x, endY, player.z + 18, + 3 + speed * 3 + level, color, .028); + } +} + +function drawDoubleJumpMotion(player, t) { + const now = runtime().monotonicUs; + if (now >= (player.doubleJumpLinesUntil || 0)) return; + const life = clamp((player.doubleJumpLinesUntil - now) / 280000, 0, 1); + const color = mixColor(player.color, [244, 250, 255], .55); + for (let index = 0; index < 7; index++) { + const spread = (index - 3) * 24 + Math.sin(t * 18 + index) * 5; + const startY = player.y + 28 + (index % 2) * 18; + const endY = startY + (70 + index * 11) * life; + worldCapsule(player.x + spread, startY, player.z + 16, + player.x + spread, endY, player.z + 16, + 3 + life * 3, color, .029); + } +} + +// Hitboxes are an inspector, not a garnish. They used to flash on every +// impact for anyone watching, which put green boxes over ordinary play and +// over every recording of it. VIEW (tab) is now the only thing that shows +// them — `impactHitboxesUntil` still times the flash, but only for someone +// who has already asked to see the geometry. +// Rectangle outlines need square joins, not tessellated semicircle caps. +function debugCapsule(x1, y1, x2, y2, width, color) { + if (nativeHudOverlay) { line(x1, y1, x2, y2, width, ...color); return; } + const dx = x2 - x1, dy = y2 - y1; + const length = Math.hypot(dx, dy); + const c = length ? dx / length : 1, sn = length ? dy / length : 0; + const radius = width / 2; + const nx = -sn * radius, ny = c * radius; + x1 -= c * radius; y1 -= sn * radius; + x2 += c * radius; y2 += sn * radius; + const [r, g, b] = color; + screenTriangle(x1 + nx, y1 + ny, x1 - nx, y1 - ny, + x2 + nx, y2 + ny, r, g, b); + screenTriangle(x1 - nx, y1 - ny, x2 - nx, y2 - ny, + x2 + nx, y2 + ny, r, g, b); +} + +function drawDebugHitboxes(player, t) { + if (renderFlags.hud === false || !debugHitboxes || !player.alive) return; + const now = player.frozenAt || runtime().simMonotonicUs || runtime().monotonicUs; + const boxes = sampleCombatBoxes(player, now, null, false); + const hurtColor = [82, 226, 116]; + const pushColor = [255, 158, 54]; + const attackColor = [255, 58, 64]; + const guardColor = [186, 118, 255]; + const draw = (b, color, width = 2) => { + const z = (b.near+b.far)/2; + const points = [[b.left,b.top],[b.right,b.top],[b.right,b.bottom],[b.left,b.bottom]] + .map(([x,y])=>projectPoint(x,y,z)); + for (let i=0;i<4;i++) { + const a=points[i], next=points[(i+1)%4]; + debugCapsule(a.x,a.y,next.x,next.y,width,color); + } + }; + for (const b of boxes.hurt) draw(b,hurtColor); + draw(boxes.push,pushColor); + for (const b of boxes.guard) draw(b,guardColor,3); + for (const b of boxes.hit) draw(b,attackColor,4); +} + +// The frame meter. One pip per simulation frame, oldest on the left, the +// frame happening now at the right edge -- so an exchange reads left to +// right the way it happened, and the thing you just did is under your eye +// rather than across the screen. +// +// Two rows, one per fighter, stacked so the frames line up vertically: that +// column alignment IS the instrument. Reading "my recovery sits under their +// active" off two rows is the whole reason a frame meter exists, and it is +// why this is a stacked pair rather than one row per player somewhere +// convenient. +function drawFrameMeter() { + if (!debugHitboxes || renderFlags.hud === false) return; + if (!frameMeters.some((meter) => meter.length)) return; + const safe = hudSafeRect(); + const pip = Math.max(2, Math.min(7, Math.floor( + (safe.right - safe.left) * .55 / frameMeterLength) - 1)); + // Native meters draw contiguous color runs, preserving each frame boundary + // while avoiding hundreds of separate triangle submissions per frame. + const gap = pip > 3 && !nativeHudOverlay && !nativeTrianglePass ? 1 : 0; + // Tall enough to read a color at a glance. The pips are the resolution; + // the row height is only whether you can see them, and a meter you have to + // lean toward is a meter nobody reads mid-fight. + const rowHeight = Math.max(11, pip * 2); + const width = frameMeterLength * (pip + gap); + // Centred, and lifted clear of the bottom furniture -- the session name, + // the bug and the opponent label all live along that edge, and the first + // placement laid the meter straight across them. + const left = Math.round((safe.left + safe.right - width) / 2); + const top = safe.bottom - rowHeight * 2 - 58; + for (const player of players) { + const meter = frameMeters[player.pad]; + const y = top + player.pad * (rowHeight + 3); + // The empty track, so a meter that has not filled yet reads as a meter + // rather than as nothing having happened. + hudBox(left, y, width, rowHeight, 16, 19, 30); + // Adjacent equal pips without a gap are one rectangle. + for (let index = 0; index < meter.length;) { + const key = meter[index]; + let end = index + 1; + if (!gap) while (end < meter.length && meter[end] === key) end++; + const state = frameMeterStates[key] || frameMeterStates.neutral; + const x = left + width - (meter.length - index) * (pip + gap); + hudBox(x, y, pip * (end - index), rowHeight, ...state.ink); + index = end; + } + // Whose row this is, in their own color, at the left end where it cannot + // sit on top of the frames anybody is actually reading. + typeWrite("P" + (player.pad + 1), left - 30, y, 15, ...player.color); + } + // The legend, once, above the pair -- and only the states the last two + // seconds actually contained, because a legend listing colors that are not + // on screen is a thing to decode rather than a thing to read. + const seen = new Set(); + for (const meter of frameMeters) for (const state of meter) + if (frameMeterStates[state]?.label) seen.add(state); + let x = left; + for (const state of seen) { + const entry = frameMeterStates[state]; + hudBox(x, top - 17, 9, 9, ...entry.ink); + typeWrite(entry.label, x + 13, top - 19, 13, 168, 178, 200); + x += 20 + entry.label.length * 8; + } +} + +function drawPlayerHud(player, x, pad) { + const color = visualTheme.light > .55 + ? player.pad === 0 ? [155, 34, 108] : [105, 78, 0] + : player.color; + let label = "P" + (player.pad + 1) + " " + player.roundWins + "/" + + matchWins + " PTS " + player.score; + typeWrite(label, x, 14, 22, ...color); +} + +function visibleHandle(player) { + return (globalThis.__oskiewarDeviceHandles?.[player.pad] || player.name).toLowerCase(); +} + +function nationFlag(country) { + const code = String(country || "").toUpperCase(); + if (!/^[A-Z]{2}$/.test(code)) return ""; + return [...code].map((letter) => String.fromCodePoint( + 0x1f1e6 + letter.charCodeAt(0) - 65)).join(""); +} + +const reelProgressInset = () => typeof capabilities === "function" && + capabilities().replayOven === true && capabilities().reelFullUi === true + ? compactLayout() ? 42 : 50 : 0; + +function playerHandleLayout(player, side) { + const safe = hudSafeRect(); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 24 : hudTypeSize; + const width = handleWidth(visibleHandle(player), size); + // One name per corner: the left fighter reads from the left edge, the + // right fighter from the right. The command phrase mirrors to the inside, + // so neither name has to give up its corner to make room for it. + const x = freeForAll() ? (side === 0 ? safe.left + 8 + : side === 1 ? (safe.left + safe.right - width) / 2 : safe.right - 8 - width) + : side === 0 ? safe.left + 8 : safe.right - 8 - width; + const y = safe.bottom - size - (touch ? 250 : 18) - reelProgressInset(); + return { x, y, size, width }; +} + +function drawFloatingHandle(player, x, y, size) { + const handle = visibleHandle(player); + const shadows = player.handleColors?.map(runShadow); + drawHandle(handle, x + 3, y + 4, size, shadows, runShadow(player.color)); + drawHandle(handle, x, y, size, player.handleColors, player.color); +} + +function drawPlayerHandle(player, t, side) { + const { x, y, size } = playerHandleLayout(player, side); + const handle = visibleHandle(player); + const drawGlyphs = (dx, dy, colors, fallback) => { + let cursor = x + dx; + for (let index = 0; index < handle.length; index++) { + const character = handle[index]; + typeWrite(character, cursor, y + dy, size, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + drawGlyphs(3, 4, player.handleColors?.map(runShadow), runShadow(player.color)); + drawGlyphs(0, 0, player.handleColors, player.color); + const flag = nationFlag(player.nation); + if (flag) { + const flagSize = Math.round(size * .92); + const flagX = side === 0 ? x : x + Math.max(0, handleWidth(handle, size)); + systemWrite(flag, flagX, y - flagSize * 1.05, flagSize, 255, 255, 255); + } +} + +// One name at reel scale: the fighter's own per-glyph palette, every letter on +// its own phase, shadow pass under color pass. Shared by the opening matchup +// and the winner's card, so the only two frames of a reel that carry type +// carry it identically. Advance is keyed to the flat size, so the swell never +// walks the letters apart. +function drawReelName(text, y, size, player, t) { + const total = handleWidth(text, size); + const pass = (dx, dy, colors, fallback) => { + let cursor = viewCenterX() - total / 2 + dx; + for (let index = 0; index < text.length; index++) { + const character = text[index]; + const swell = size * (1 + .07 * Math.sin(t * 6 + index * .9)); + const bob = Math.sin(t * 5.2 + index * .8) * size * .09; + typeWrite(character, cursor - (swell - size) * .5, + y + dy + bob - (swell - size) * .5, swell, + ...glyphColor(colors, index, fallback)); + cursor += comicGlyphAdvance(character, size); + } + }; + const plain = player?.color || [245, 248, 255]; + pass(4, 5, player?.handleColors?.map(runShadow), runShadow(plain)); + pass(0, 0, player?.handleColors, plain); +} + +function playerStatLines(player) { + const pad = inputPads[player.pad] || + { connected: false, down: [], leftX: 0, leftY: 0 }; + const input = quantizedInput(pad, player.suppressedDirections); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const phase = "anim " + animation.state + " " + animation.step + "/" + animation.steps + + " tick " + animation.tick; + if (player.npc && !player.bot) { + const parts = player.spiderDummy + ? [...spiderLegParts, "torso"] : [...limbParts, "torso"]; + const remaining = parts.filter((part) => hasPart(player, part)).length; + const damage = parts.reduce((total, part) => + total + Number(player.partDamage?.[part] || 0), 0); + return [ + "p" + (player.pad + 1) + " " + (player.spiderDummy ? "spider dummy" : "training dummy"), + "parts " + remaining + "/" + parts.length + " damage " + damage, + phase, + ]; + } + return [ + "p" + (player.pad + 1) + " " + player.stance + + (player.attackKind ? " + " + player.attackKind : ""), + "input " + input.horizontal + "," + input.vertical + + " stick " + pad.leftX.toFixed(2) + " vx " + Math.round(player.vx), + phase, + ]; +} + +const playerStatSize = () => compactLayout() ? 16 : 22; +const playerStatPanelHeight = () => { + const size = playerStatSize(); + return 16 + 3 * (size + 7) + 10; +}; + +const debugReadoutMetaSize = () => compactLayout() ? 19 : 24; +const debugReadoutTimingSize = () => + Math.max(17, Math.round(debugReadoutMetaSize() * .76)); +// The band the measured-performance read-out owns, just above the nameplate. +// Everything that stacks over a handle reserves it rather than sharing it: the +// console has always printed a second timing row there and it landed exactly on +// the state card's `anim::` line, and the browser started printing one the day +// it began timing its own frames. Both rows are reserved whether or not the +// host fills the second — the card above must not breathe when a measurement +// finally arrives, the same fixed-chassis rule the card itself follows. +const debugReadoutHeight = () => debugHitboxes + ? debugReadoutMetaSize() + 6 + debugReadoutTimingSize() + 5 + : bareFrameRateShown() ? debugReadoutMetaSize() + 11 : 0; + +// The state trace owns a fixed stack over each handle without a container. +const statStackHeight = () => debugHitboxes + ? debugReadoutHeight() + playerStatPanelHeight() + 8 : debugReadoutHeight(); + +function drawPlayerStats(player, side, t) { + if (!debugHitboxes) return; + const lines = playerStatLines(player); + const animation = fighterAnimationPhase(player, + player.frozenAt || runtime().monotonicUs); + const size = playerStatSize(); + const padding = 8; + const lineHeight = size + 7; + const safe = hudSafeRect(); + // A diagnostic instrument has fixed columns: changing signs and tick counts + // must not make its chassis breathe every frame. + // The tick and velocity columns are the longest legal row, so the chassis + // reserves their full Xbox-width footprint instead of clipping their tail. + const width = compactLayout() ? 360 : 520; + const height = playerStatPanelHeight(); + const handle = playerHandleLayout(player, side); + const x = side === 0 ? safe.left : safe.right - width; + const y = handle.y - debugReadoutHeight() - height - 12; + const previousDepth = triangleDepth; + triangleDepth = -1.445; + for (let row = 0; row < lines.length; row++) { + const rowY = y + padding + row * lineHeight; + writeHudLine(lines[row], x + padding, rowY, size); + } + triangleDepth = previousDepth; +} + +function drawHudInventory(player, side) { + const items = []; + if (player.gunAmmo > 0) items.push("gun " + player.gunAmmo); + if (player.grenadeAmmo > 0) items.push("grenade " + player.grenadeAmmo); + if (!items.length) return; + const text = items.join(" "); + const handle = playerHandleLayout(player, side); + const size = Math.round(hudTypeSize * .62); + const width = handleWidth(text, size); + const x = side === 0 ? handle.x : handle.x + handle.width - width; + // Commands own the rows immediately above the fighter's name. Inventory + // starts above whichever of those rows are still visible, so neither can + // drift over the other as the command history dissolves. + const y = handle.y - statStackHeight() - commandStreamStackHeight(player) - + size - 7; + const shadow = contrastShadow(player.color); + typeWrite(text, x + 2, y + 3, size, ...shadow); + typeWrite(text, x, y, size, ...player.color); +} + +function spatialHudPlayers() { + if (freeForAll()) return players.slice().sort((a, b) => a.x - b.x); + const left = players[hudLeftPad] || players[0]; + const other = players[left.pad === 0 ? 1 : 0]; + // Preserve the lane through the instant of overlap, then swap once the + // crossing is visually unambiguous. This prevents one-frame HUD chatter. + if (other.x < left.x - 36) hudLeftPad = other.pad; + return [players[hudLeftPad], players[hudLeftPad === 0 ? 1 : 0]]; +} + +// How present one glyph of the buffer is. `settle` is how far into the idle +// the dissolve has travelled: 0 for as long as the pad is still saying +// something, 1 once the whole stream has left. Doubling it and offsetting by +// each glyph's place in the stream spends the first half on the oldest glyph +// and the last half on the newest, so the buffer leaves in reading order +// rather than dimming as one sheet. +function commandFade(index, count, idle) { + const settle = clamp((idle - commandHoldUs) / commandFadeUs, 0, 1); + return clamp(index / Math.max(1, count - 1) + 1 - settle * 2, 0, 1); +} + +function commandStreamStackHeight(player, now = runtime().monotonicUs) { + const count = player.commandStream.length; + if (!count) return 0; + const idle = now - (player.commandStream.at(-1)?.at || now); + const visible = player.commandStream.reduce((total, entry, index) => + total + (commandFade(index, count, idle) > .01 ? 1 : 0), 0); + const handle = playerHandleLayout(player, player.pad); + const size = commandStreamTypeSize(handle.size); + const rows = Math.min(commandStreamRows, + Math.ceil(Math.min(commandStreamDepth, visible) / + commandStreamColumnsNow())); + return rows ? rows * (size + 7) + Math.ceil(size * .8) + 4 : 0; +} + +function drawCommandStream(player, side) { + const glyph = { LEFT: "<", RIGHT: ">", UP: "^", DOWN: "v" }; + const buttonFor = { LEFT: "ArrowLeft", RIGHT: "ArrowRight", + UP: "ArrowUp", DOWN: "ArrowDown", "/": "A", "*": "B", ")": "X", + "+": ["Y", "LeftShoulder", "RightShoulder"] }; + const now = runtime().monotonicUs; + const idle = now - (player.commandStream.at(-1)?.at || now); + const count = player.commandStream.length; + const held = inputPads[player.pad]?.down || []; + const entries = player.commandStream.map((entry, index) => ({ ...entry, + text: glyph[entry.label] || entry.label, + fade: commandFade(index, count, idle), + held: Array.isArray(buttonFor[entry.label]) + ? buttonFor[entry.label].some((button) => held.includes(button)) + : held.includes(buttonFor[entry.label]), + })).filter((entry) => entry.fade > .01); + // A held button lights only its newest appearance — not every earlier + // press of the same button still sitting in the buffer's history. + const claimed = new Set(); + for (let index = entries.length - 1; index >= 0; index--) { + const entry = entries[index]; + if (!entry.held) continue; + if (claimed.has(entry.label)) entry.held = false; + else claimed.add(entry.label); + } + if (!entries.length) return; + // The name owns its row. Commands stack in distinct rows above it, aligned + // to the same outside edge, so a long handle can never sit underneath its + // own input history. + entries.reverse(); + const handle = playerHandleLayout(player, side); + const size = commandStreamTypeSize(handle.size); + const columns = commandStreamColumnsNow(); + const lineEntries = entries.slice(0, commandStreamDepth); + const gap = Math.round(size * .34); + const rows = []; + for (let index = 0; index < lineEntries.length; index += columns) + rows.push(lineEntries.slice(index, index + columns)); + const safe = hudSafeRect(); + for (let row = 0; row < rows.length; row++) { + const rowEntries = rows[row]; + const width = rowEntries.reduce((sum, entry, index) => sum + + handleWidth(entry.text, size) + (index ? gap : 0), 0); + let cursor = side === 0 ? handle.x : handle.x + handle.width - width; + cursor = clamp(cursor, safe.left, safe.right - width); + const newestAt = Math.max(...rowEntries.map((entry) => entry.at)); + const rise = clamp((now - newestAt) / 900000, 0, 1) * size * .8; + const y = handle.y - statStackHeight() - (row + 1) * (size + 7) - rise; + for (const entry of rowEntries) { + const quiet = mixColor([104, 114, 136], [82, 90, 108], visualTheme.light); + const live = entry.held ? player.color : quiet; + const glyphInk = entry.fade >= 1 ? live + : mixColor(visualTheme.light > .5 ? [230, 239, 247] : [7, 8, 28], + live, entry.fade); + typeWrite(entry.text, cursor + 2, y + 3, size, + ...contrastShadow(glyphInk)); + typeWrite(entry.text, cursor, y, size, ...glyphInk); + cursor += handleWidth(entry.text, size) + gap; + } + } +} + +function drawFightIntro(introSeconds, titleInk, statusShadow) { + const centerX = viewCenterX(); + const centerY = (stageTop + stageBottom) / 2; + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const nameSize = touch ? 28 : compactLayout() ? 38 : 54; + const drawHeadName = (player) => { + const head = runnerWorldGeometry(player, + (runtime().monotonicUs - startedAt) / 1000000).head; + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const flash = .5 + .5 * Math.sin(introSeconds * Math.PI * 8); + const flashingSize = nameSize * (1 + flash * .1); + const width = handleWidth(visibleHandle(player), flashingSize); + drawFloatingHandle(player, point.x - width / 2, + point.y - radius - flashingSize * 1.28, flashingSize); + }; + if (freeForAll()) { + for (const player of players) drawHeadName(player); + return; + } + if (!reelGroundCamera() && introSeconds < 1) { + drawHeadName(players[0]); + return; + } + if (!reelGroundCamera() && introSeconds < 2) { + drawHeadName(players[1]); + return; + } + { + const title = "oskiewar"; + const titleSize = touch ? 54 : compactLayout() ? 72 : 98; + const width = handleWidth(title, titleSize); + let cursor = centerX - width / 2; + const titleTime = (runtime().monotonicUs - startedAt) / 1000000; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const advance = comicGlyphAdvance(character, titleSize); + typeWrite(character, cursor + 5, centerY - titleSize / 2 + 6, + titleSize, ...statusShadow); + typeWrite(character, cursor, centerY - titleSize / 2, + titleSize, ...animatedTitleColor(index, titleTime)); + cursor += advance; + } + return; + } +} + +function drawSurvivalIntro(titleInk, statusShadow) { + const callout = "climb!"; + const size = compactLayout() ? 74 : 112; + const width = handleWidth(callout, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(callout, x + 5, y + 7, size, ...statusShadow); + typeWrite(callout, x, y, size, ...titleInk); +} + +function drawSurvivalHud(titleInk) { + const safe = hudSafeRect(); + const score = Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 34 : 46; + const width = handleWidth(score, size); + const x = viewCenterX() - width / 2; + const y = safe.top + 2; + typeWrite(score, x + 3, y + 4, size, ...contrastShadow(titleInk)); + typeWrite(score, x, y, size, ...titleInk); +} + +function drawSurvivalResult(titleInk, statusShadow) { + const result = roundResult === "SUMMIT" ? "summit!" + : Math.round(survivalHeight) + " up"; + const size = compactLayout() ? 58 : 82; + const width = handleWidth(result, size); + const x = viewCenterX() - width / 2; + const y = (stageTop + stageBottom) / 2 - size / 2; + typeWrite(result, x + 5, y + 7, size, ...statusShadow); + typeWrite(result, x, y, size, ...titleInk); +} + +function drawReelSectionProgress(now, titleInk) { + const safe = hudSafeRect(); + const gap = compactLayout() ? 5 : 8; + const widths = [.16, .68, .16]; + const labels = ["INTRO", "FIGHT", "OUTRO"]; + const available = safe.right - safe.left - gap * 2; + const resultDuration = matchOver ? matchResultUs : roundResultUs; + const introAge = Math.max(0, now - roundStartedAt); + const introLimit = roundIntroDurationUs(); + const section = roundResult ? 2 : introAge < introLimit ? 0 : 1; + const progress = section === 0 + ? clamp(introAge / introLimit, 0, 1) + : section === 1 + ? clamp(roundElapsedUs / roundDurationUs, 0, 1) + : clamp((now - roundOverAt) / resultDuration, 0, 1); + const labelSize = compactLayout() ? 18 : 22; + const barHeight = compactLayout() ? 6 : 8; + const barY = safe.bottom - barHeight; + const labelY = barY - labelSize - 7; + const track = mixColor([52, 58, 76], [170, 157, 137], visualTheme.light); + const done = mixColor([96, 222, 154], [31, 92, 76], visualTheme.light); + const hitMarks = Array.isArray(globalThis.__oskiewarFightHitForecast) + ? globalThis.__oskiewarFightHitForecast : fightHitMarks; + let x = safe.left; + for (let index = 0; index < widths.length; index++) { + const width = index === widths.length - 1 + ? safe.right - x : Math.round(available * widths[index]); + const amount = index < section ? 1 : index === section ? progress : 0; + hudBox(x, barY, width, barHeight, ...track); + if (amount > 0) hudBox(x, barY, width * amount, barHeight, + ...(index === section ? titleInk : done)); + if (index === 1) { + const markWidth = compactLayout() ? 5 : 6; + for (const mark of hitMarks) { + const markX = x + clamp(mark.at, 0, 1) * width; + const reached = roundElapsedUs / roundDurationUs >= mark.at; + const impactInk = mark.decisive ? [226, 42, 66] : mark.color; + hudBox(markX - markWidth / 2, barY - 3, + markWidth, barHeight + 6, + ...(reached ? impactInk : mixColor(track, impactInk, .72))); + } + } + const labelWidth = handleWidth(labels[index], labelSize); + typeWrite(labels[index], x + (width - labelWidth) / 2, + labelY, labelSize, ...(index === section ? titleInk : track)); + x += width + gap; + } +} + +function recordFightHit(sourcePad, decisive) { + if (roundResult || roundElapsedUs <= 0) return; + if (Array.isArray(globalThis.__oskiewarFightHitForecast)) return; + const fighter = players[sourcePad]; + fightHitMarks.push({ + at: clamp(roundElapsedUs / roundDurationUs, 0, 1), + color: fighter?.color ? [...fighter.color] : [226, 42, 66], + decisive: decisive === true, + }); +} + +// A pole or a branch crossing the near plane has the same problem a face does, +// and the same cure — trim the segment at the plane rather than letting the +// far end pin itself to the near distance and rake across the screen. Null is +// a segment wholly behind the camera. +// The band a face gets, for a line. A segment is two points with no polygon +// to cut, which is why this used to trim at the pin instead: cutting at the +// near plane and handing the result over whole let a line crossing the plane +// rake the length of the guard band. Trimming the PROJECTED segment gives the +// same protection without throwing the line away, so the cut can move back to +// the plane where it belongs. Liang–Barsky, carrying depth along t so a capsule +// still knows how far away its ends are. +function clipSegmentBand(from, to) { + const width = viewWidth(); + const minX = -width * guardBand, maxX = width * (1 + guardBand); + const minY = -viewHeight * guardBand, maxY = viewHeight * (1 + guardBand); + // Most segments sit whole inside the band — every grass blade, most limbs. + // Plain compares answer those; only a segment that actually crosses an + // edge pays for the parametric walk and its rebuilt endpoints. + if (from.x >= minX && from.x <= maxX && from.y >= minY && from.y <= maxY && + to.x >= minX && to.x <= maxX && to.y >= minY && to.y <= maxY) + return { from, to }; + const dx = to.x - from.x, dy = to.y - from.y; + let enter = 0, exit = 1; + for (const [edge, room] of [[-dx, from.x - minX], [dx, maxX - from.x], + [-dy, from.y - minY], [dy, maxY - from.y]]) { + if (edge === 0) { if (room < 0) return null; continue; } + const at = room / edge; + if (edge < 0) { if (at > exit) return null; if (at > enter) enter = at; } + else { if (at < enter) return null; if (at < exit) exit = at; } + } + const along = (t) => ({ x: from.x + dx * t, y: from.y + dy * t, + z: lerp(from.z, to.z, t) }); + return { from: along(enter), to: along(exit) }; +} +// Cut at the real near plane, the same one faces get. The pin is ten times +// further out, and while nothing in normal play passes within eighty units of +// the lens, the death cinematic drives the camera right down to the ground — +// so every limb and blade of grass in front of it was being dropped whole, +// which is what hollowed out the front of the frame on the zoom. +function worldSegment(x1, y1, z1, x2, y2, z2) { + let a = cameraDoll.toView({ x: x1, y: y1, z: z1 }); + let b = cameraDoll.toView({ x: x2, y: y2, z: z2 }); + if (a.z < cameraNear && b.z < cameraNear) return null; + if (a.z < cameraNear) + a = mixVertex(a, b, (cameraNear - a.z) / (b.z - a.z)); + else if (b.z < cameraNear) + b = mixVertex(b, a, (cameraNear - b.z) / (a.z - b.z)); + const from = cameraDoll.projectView(a); + const to = cameraDoll.projectView(b); + // Six plain checks instead of an array built per segment per frame. + return Number.isFinite(from.x) && Number.isFinite(from.y) && + Number.isFinite(from.z) && Number.isFinite(to.x) && + Number.isFinite(to.y) && Number.isFinite(to.z) + ? clipSegmentBand(from, to) : null; +} + +function worldLine(x1, y1, z1, x2, y2, z2, width, color) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + line(segment.from.x, segment.from.y, segment.to.x, segment.to.y, + width, ...color); +} + +function worldCapsule(x1, y1, z1, x2, y2, z2, width, color, + depthBias = -.004) { + const segment = worldSegment(x1, y1, z1, x2, y2, z2); + if (!segment) return; + const { from, to } = segment; + const previousDepth = triangleDepth; + triangleDepth = Math.min(from.z, to.z) + depthBias; + filledCapsule(from.x, from.y, to.x, to.y, width, color); + triangleDepth = previousDepth; +} + +function litQuadColor(a, b, c, color) { + // Lighting is decided in world space, off the surface the quad names, so it + // is the same shade however the clipper ends up cutting the face up. The + // cross, normalize and dot run in scalars: this is every wall panel every + // frame, and the vector objects were pure interpreter garbage. + const abx = b.x - a.x, aby = b.y - a.y, abz = b.z - a.z; + const acx = c.x - a.x, acy = c.y - a.y, acz = c.z - a.z; + const nx = aby * acz - abz * acy; + const ny = abz * acx - abx * acz; + const nz = abx * acy - aby * acx; + const magnitude = Math.hypot(nx, ny, nz) || 1; + const toward = (nx * -globalLight.x + ny * -globalLight.y + + nz * -globalLight.z) / magnitude; + const illumination = .72 + Math.max(0, toward) * .28; + return [Math.round(color[0] * illumination), + Math.round(color[1] * illumination), + Math.round(color[2] * illumination)]; +} +function worldQuad(a, b, c, d, color) { + const lit = litQuadColor(a, b, c, color); + worldTriangle(a, b, c, lit); + worldTriangle(a, c, d, lit); +} + +// Preserve the sampled silhouette, merging only collinear edges. +const terrainProfile = []; +function rebuildTerrainProfile() { + const points = []; + const step = (worldRight - worldLeft) / terrainSamples; + for (let i = 0; i <= terrainSamples; i++) { + const x = worldLeft + i * step; + const point = { x, y: terrainFloorAt(x) }; + while (points.length > 1) { + const a = points[points.length - 2], b = points[points.length - 1]; + if (Math.abs((b.y - a.y) * (point.x - b.x) - + (point.y - b.y) * (b.x - a.x)) > .00001) break; + points.pop(); + } + points.push(point); + } + terrainProfile.splice(0, terrainProfile.length, ...points); + rebuildTerrainDrawProfile(); +} +// The drawn silhouette. `terrainProfile` keeps every sampled height exactly +// (physics and the fidelity test read it); the console draws each profile +// point as six projections and two faces per pass, so the passes read this +// thinned copy instead — a point is dropped while every point it stood for +// stays within `terrainDrawTolerance` world units of the chord that +// replaces it (about a pixel at fight zoom). Flats were already one edge; +// this is for the ramps, where six samples a tile all survived. +const terrainDrawProfile = []; +const terrainDrawTolerance = 1; +function rebuildTerrainDrawProfile() { + const kept = []; + let anchor = 0; + kept.push(terrainProfile[0]); + for (let index = 2; index <= terrainProfile.length; index++) { + const a = terrainProfile[anchor]; + const candidate = terrainProfile[index] || null; + // Try to stretch the chord from the anchor over `index - 1` to `index`; + // when a point in between falls off it, `index - 1` becomes the anchor. + let fits = candidate !== null; + if (fits) { + const dx = candidate.x - a.x, dy = candidate.y - a.y; + const length = Math.hypot(dx, dy) || 1; + for (let between = anchor + 1; between < index; between++) { + const point = terrainProfile[between]; + const distance = Math.abs((point.x - a.x) * dy - (point.y - a.y) * dx) / length; + if (distance > terrainDrawTolerance) { fits = false; break; } + } + } + if (!fits) { + anchor = index - 1; + kept.push(terrainProfile[anchor]); + } + } + terrainDrawProfile.splice(0, terrainDrawProfile.length, ...kept); +} +rebuildTerrainProfile(); + +// The three terrain passes (surface, front wall, back wall) used to hand +// `worldQuad` four fresh corner objects per segment, and each quad ran its +// six vertices through the camera — so every profile point was projected +// twelve times per pass, and the terrain alone cost 8.4 ms of the console's +// interpreted frame (measured on the Xbox 2026-09-20; sim 5.6 + paint 14 ms +// at 1080p). Each pass now projects each point ONCE for its top vertex and +// once for its bottom, keeps the results in two flat scratch arrays, and +// reads a segment's four corners back from them. Segments that sit wholly +// in front of the camera and inside the guard band — nearly all of them — +// go straight to `projectedTriangle`; the rest fall back to `worldQuad`, so +// the near-plane and band clipping is exactly what it was. +const terrainScratch = { top: [], bottom: [] }; +function terrainVertex(slot, index, x, y, z) { + let vertex = slot[index]; + if (!vertex) vertex = slot[index] = { view: { x: 0, y: 0, z: 0 }, + screen: { x: 0, y: 0, z: 0 }, front: false, inBand: false, x: 0, y: 0, z: 0 }; + vertex.x = x; vertex.y = y; vertex.z = z; + const view = cameraDoll.toView(vertex, vertex.view); + vertex.front = view.z >= cameraNear; + vertex.inBand = vertex.front && + bandContains(cameraDoll.projectView(view, vertex.screen)); + return vertex; +} +// `bottomY` null: the bottom vertex shares the profile's y (the surface +// pass, top at z `zTop`, bottom at z `zBottom`). Otherwise a wall: both +// vertices at `zTop`, the bottom one dropped to `bottomY`. +function terrainPass(left, right, zTop, zBottom, bottomY, shadeOf) { + const { top, bottom } = terrainScratch; + const wall = bottomY !== null; + const terrainProfile = terrainDrawProfile; + const count = terrainProfile.length; + let previous = -1; + for (let index = 0; index < count; index++) { + const point = terrainProfile[index]; + const next = terrainProfile[index + 1]; + // A point is projected only when a drawn segment touches it. + const inSpan = (next && !(next.x < left || point.x > right)) || + (index > 0 && !(point.x < left || terrainProfile[index - 1].x > right)); + if (!inSpan) { previous = -1; continue; } + const a = terrainVertex(top, index, point.x, point.y, zTop); + const b = terrainVertex(bottom, index, point.x, wall ? bottomY : point.y, + wall ? zTop : zBottom); + if (previous >= 0 && previous === index - 1 && + !(point.x < left || terrainProfile[previous].x > right)) { + const a1 = top[previous], b1 = bottom[previous]; + const shade = shadeOf(previous); + if (a1.front && a.front && b.front && b1.front) { + // Reject fully offscreen quads before lighting and guard-band + // clipping. The generous world apron includes many invisible ramps. + const p=a1.screen, q=a.screen, r=b.screen, s=b1.screen; + const width=viewWidth(); + if ((p.x<0 && q.x<0 && r.x<0 && s.x<0) || + (p.x>width && q.x>width && r.x>width && s.x>width) || + (p.y<0 && q.y<0 && r.y<0 && s.y<0) || + (p.y>viewHeight && q.y>viewHeight && r.y>viewHeight && s.y>viewHeight)) { + previous=index; + continue; + } + if (photoSurface(wall ? "wall" : "concrete", p, q, r, s)) { + previous = index; + continue; + } + const lit = litQuadColor(a1, a, b, shade); + if (a1.inBand && a.inBand && b.inBand && b1.inBand) { + projectedTriangle(a1.screen, a.screen, b.screen, lit); + projectedTriangle(a1.screen, b.screen, b1.screen, lit); + } else { + // Off the guard band on one side: clip the projected quad once + // rather than re-projecting it as two triangles. + const face = clipScreenBand([a1.screen, a.screen, b.screen, b1.screen]); + for (let corner = 2; corner < face.length; corner++) + projectedTriangle(face[0], face[corner - 1], face[corner], lit); + } + } else worldQuad(a1, a, b, b1, shade); + } + previous = index; + } +} +// Per-segment surface shade, cached against the ground color it was mixed +// from: the slope never changes between rebuilds, and mixing 240 colours a +// frame was measurable on the console. +let terrainShadeKey = ""; +const terrainShades = []; +function terrainSurfaceShades(color) { + const terrainProfile = terrainDrawProfile; + const key = currentMapId + "/" + color.join(",") + "/" + terrainProfile.length; + if (key === terrainShadeKey) return terrainShades; + terrainShadeKey = key; + terrainShades.length = 0; + for (let index = 1; index < terrainProfile.length; index++) { + const { x: x1, y: y1 } = terrainProfile[index - 1]; + const { x: x2, y: y2 } = terrainProfile[index]; + const slope = Math.abs(y2 - y1) / Math.max(1, x2 - x1); + terrainShades[index - 1] = + mixColor(color, [110, 120, 90], .16 + Math.min(1, slope) * .22); + } + return terrainShades; +} +function drawTerrainSurface(left, right, near, far, color) { + const shades = terrainSurfaceShades(color); + terrainPass(left, right, near, far, null, (segment) => shades[segment]); +} + +function drawTerrainFrontWall(left, right, near, color) { + // Close the near edge with a terrain-following skirt so camera pitch never + // exposes what lies beneath the floor. + // + // WHERE the skirt hangs is the whole fix for the reel's under-floor gap. + // The reel lens is orthographic, so the floor plane projects to a line and + // can never cover the bottom of a 9:16 frame — only a vertical surface can. + // The TV skirt at the slab's near edge sits BEHIND the reel camera and gets + // near-clipped (tinting it magenta proved it never reached the frame), which + // left the buried room wall showing through as purple under the grass. For + // reels the skirt hangs just behind the fighters' plane instead, deep enough + // that no frame sees under it, and wears the ground color — so everything + // below the floor line reads as earth. + const reel = reelGroundCamera(); + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = reel ? 55 : near - 2; + const wallBottom = parkDeepest + (reel ? 9000 : 720); + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawTerrainBackWall(left, right, far, color) { + // The far edge was simply open. Yaw clamps at +/-.62rad, which is more than + // enough to swing the diorama around and look straight through the back of + // the slab into the buried room wall. The near edge has hung a skirt since + // the reel work; this is its mirror, and it exists for the ordinary TV lens + // where the right stick can actually reach around. + // + // Reels return early. That lens already hangs its single skirt just behind + // the fighters at z=55, and a second wall out at worldFar would sit behind + // that one where no reel frame ever looks -- pure cost, and a change to + // footage whose framing is test-enshrined. + if (reelGroundCamera()) return; + const wall = mixColor(color, [63, 54, 46], .36); + const wallZ = far + 2; + const wallBottom = floorY + 720; + terrainPass(left, right, wallZ, wallZ, wallBottom, () => wall); +} + +function drawRoomSurfaces(left, right, top, bottom, color) { + // The station has no room to surface. Every plane this function used to + // raise — the plaster sheet behind the fighters, the segmented left wall, + // the ceiling cap — existed because the map was an interior, and the space + // map is not one: what is behind a fighter here is the starfield the + // backdrop already painted, and putting a wall in front of it would be + // painting over the map's whole idea to save nothing. + // + // Two things survive, and both survive because they carry information. + // + // The heat lattice stays: it is the tile field made visible, and on a + // station it reads as a nav hologram hanging in the dark, which is a + // better home than the plaster it used to be ruled onto. + // + // The bounds stay, as a containment field rather than as masonry. This is + // not decoration — `resolveRunnerBounds` stops a body at exactly these two + // planes and `updateBullets` ricochets a pistol round off them, so a fight + // in open space still has two hard edges in it and a player who cannot see + // them is a player being lied to. Drawn as a pair of lit lines at the far + // plane, pulsing, because a wall you can see through is the only honest + // drawing of a rule you cannot walk through. + if (survivalActive()) { + const wallBottom = floorY + 3000; + const roomTop = top - 500; + const shade = mixColor(color, [226, 172, 168], .12); + worldQuad({ x: worldLeft, y: roomTop, z: worldFar }, + { x: worldRight, y: roomTop, z: worldFar }, + { x: worldRight, y: wallBottom, z: worldFar }, + { x: worldLeft, y: wallBottom, z: worldFar }, shade); + const sideFloor = terrainFloorAt(worldLeft) + 120; + const sideShade = mixColor(color, [232, 170, 153], .13); + for (let row = 0; row < 2; row++) { + for (let depth = 0; depth < 2; depth++) { + const y1 = lerp(roomTop, sideFloor, row / 2); + const y2 = lerp(roomTop, sideFloor, (row + 1) / 2); + const z1 = lerp(0, worldFar, depth / 2); + const z2 = lerp(0, worldFar, (depth + 1) / 2); + worldQuad({ x: worldLeft, y: y1, z: z1 }, + { x: worldLeft, y: y1, z: z2 }, + { x: worldLeft, y: y2, z: z2 }, + { x: worldLeft, y: y2, z: z1 }, sideShade); + } + } + const climbEdge = mixColor(color, [64, 78, 72], .24); + worldLine(worldLeft, top, worldFar - 4, worldLeft, bottom, worldFar - 4, + 9, climbEdge); + worldLine(worldRight, top, worldFar - 4, worldRight, bottom, worldFar - 4, + 9, climbEdge); + return; + } + // The heat's base is the vacuum it hangs in, so a cooling tile fades to + // nothing rather than settling into a visible panel with edges. Only the + // bloom is meant to be seen. + drawGridOverlay(mixColor(color, [6, 8, 20], .97), false); + const pulse = .5 + .5 * Math.sin(runtime().monotonicUs / 520000); + const field = mixColor([54, 120, 186], [136, 214, 255], .3 + pulse * .35); + for (const edgeX of [worldLeft, worldRight]) { + worldLine(edgeX, ceilingY, worldFar - 4, edgeX, floorY, worldFar - 4, + 9, field); + worldLine(edgeX, ceilingY, worldNear + 4, edgeX, floorY, worldNear + 4, + 5, mixColor(field, [8, 12, 28], .5)); + } +} + +function drawSurvivalLava(t) { + if (!survivalActive()) return; + const pulse = .5 + .5 * Math.sin(t * 3.1); + const surface = mixColor([255, 58, 24], [255, 212, 42], pulse * .42); + const body = mixColor([116, 10, 26], [238, 50, 18], .58 + pulse * .18); + const far = worldFar - 8; + const bottom = Math.max(floorY + 3000, survivalLavaY + 3200); + worldQuad({ x: worldLeft, y: survivalLavaY, z: far }, + { x: worldRight, y: survivalLavaY, z: far }, + { x: worldRight, y: bottom, z: far }, + { x: worldLeft, y: bottom, z: far }, body); + worldQuad({ x: worldLeft, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldNear }, + { x: worldRight, y: survivalLavaY, z: worldFar }, + { x: worldLeft, y: survivalLavaY, z: worldFar }, surface); + for (let step = 0; step < 9; step++) { + const x1 = lerp(worldLeft, worldRight, step / 9); + const x2 = lerp(worldLeft, worldRight, (step + 1) / 9); + const y1 = survivalLavaY + Math.sin(t * 4.2 + step * 1.7) * 9; + const y2 = survivalLavaY + Math.sin(t * 4.2 + (step + 1) * 1.7) * 9; + worldLine(x1, y1, worldNear - 2, x2, y2, worldNear - 2, 7, surface); + } +} + +// The map's addressing, made visible: the same lattice the spawn marks and +// pickups are authored on, with the heat of `gridField` showing where the +// last half-second of the fight landed. Seams are thin quads rather than +// worldLines because the native renderer buries the whole line stratum +// beneath the world's triangles — the grid would vanish behind its own wall +// on console, the same way the gun once drew under the floor. +// +// A heated cell used to paint its entire ninety-unit face — a square as tall +// as a standing fighter, and a busy exchange flipped a dozen of them on and +// off at once. That is the stripes and the starfield again: a pattern the eye +// keeps reading behind the two things it is supposed to be watching. On the +// light theme it was worse than busy, because the slab's base is the vacuum, +// so what bloomed over the arena was a dark panel rather than heat. +// +// So the cell keeps its job and loses its size. Each hot tile draws a small +// jittered grain patch at its own centre, under half a tile across so two lit +// neighbours can never fuse back into a checker square. Heat sets how many +// specks are lit as well as how bright, so cooling reads as a patch thinning +// out — texture, at a scale that stays decoration. +function drawGridOverlay(shade, seamInk = null) { + const gridZ = worldFar - 2; + const gridTop = floorY - gridHeight; + const hot = mixColor([255, 138, 92], [204, 58, 46], visualTheme.light); + // Sixteen specks over a patch half a tile across, each of them a few units + // on a side against the tile's ninety, so the grain is a texture with air in + // it rather than a smaller solid square. + const grainSteps = 4; + const grainSpan = tileSize * .5; + for (let cell = 0; cell < gridField.length; cell++) { + const heat = gridField[cell]; + if (heat < .05) continue; + const centerX = gridLeft + (cell % gridCols + .5) * tileSize; + const centerY = floorY - (Math.floor(cell / gridCols) + .5) * tileSize; + const ink = mixColor(shade, hot, .4 + heat * .55); + for (let speck = 0; speck < grainSteps * grainSteps; speck++) { + // Hashed off the cell and the speck rather than noised, so a replayed + // round grains exactly the way the live one did. + const seed = .5 + .5 * Math.sin(cell * 12.9898 + speck * 78.233); + // Cooling puts specks out one at a time instead of dimming the lot. + if (seed > heat) continue; + const size = 2 + seed * 2 + heat * 2.5; + const x = centerX + (speck % grainSteps / (grainSteps - 1) - .5) * + grainSpan + (seed - .5) * 11; + const y = centerY + (Math.floor(speck / grainSteps) / (grainSteps - 1) - + .5) * grainSpan + (.5 - seed) * 11; + worldQuad({ x: x - size, y: y - size, z: gridZ }, + { x: x + size, y: y - size, z: gridZ }, + { x: x + size, y: y + size, z: gridZ }, + { x: x - size, y: y + size, z: gridZ }, ink); + } + } + // The climb's lattice is ruled onto plaster and takes its seam from that + // plaster. The station has no plaster, and ruling the same seams across + // vacuum drew a cage over the whole frame — brighter than the starfield it + // was supposed to hang behind, and carrying a hard bright bar wherever the + // ceiling row crossed the top of the shot. + // + // So the space map passes `false` and gets no seams at all. What it keeps + // is the half of this that was always the point: the heat. Cold tiles draw + // nothing, so the lattice is invisible until a blow lands and then blooms + // where it landed — the tile field showing its own contents rather than + // its own graph paper. The ruled version stays for the climb, where there + // is a wall to rule it onto. + if (seamInk === false) return; + const seam = seamInk || mixColor(shade, [30, 34, 48], .22); + const seamZ = gridZ - 1; + for (let col = 0; col <= gridCols; col++) { + const x = gridLeft + col * tileSize; + worldQuad({ x: x - 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: gridTop, z: seamZ }, + { x: x + 1.5, y: floorY, z: seamZ }, + { x: x - 1.5, y: floorY, z: seamZ }, seam); + } + for (let row = 0; row <= gridRows; row++) { + const y = floorY - row * tileSize; + worldQuad({ x: gridLeft, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y - 1.5, z: seamZ }, + { x: gridLeft + gridWidth, y: y + 1.5, z: seamZ }, + { x: gridLeft, y: y + 1.5, z: seamZ }, seam); + } +} + +function drawTerrainGrass(left, right, color) { + // Twenty deterministic tufts cost forty native lines total. Keeping them on + // the line layer avoids turning background dressing into hundreds of faces. + const count = 100; + for (let index = 0; index < count; index++) { + const seed = .5 + .5 * Math.sin(index * 91.73 + terrainPhase * 2.31); + const x = lerp(worldLeft, worldRight, (index + .5) / count); + if (x < left || x > right) continue; + // Keep dressing in the near half of the floor. At the far plane the same + // blades collapse into horizon ticks instead of reading as foreground grass. + const z = lerp(worldNear * .88, worldNear * .22, + .5 + .5 * Math.sin(index * 37.11 + terrainPhase)); + const y = terrainFloorAt(x) - 2; + const height = 22 + seed * 22; + const tuft = mixColor(color, [48, 92, 54], .42 + seed * .22); + worldLine(x, y, z, x - 8 - seed * 5, y - height, z, 3, tuft); + worldLine(x, y, z, x + 7 + seed * 6, y - height * .82, z, 3, tuft); + } +} + +function drawBoosterPad(t) { + const pulse = .5 + .5 * Math.sin(t * 4); + const color = mixColor([55, 174, 244], [255, 224, 74], pulse * .55); + for (const boosterX of boosterXs) { + const y = terrainFloorAt(boosterX) - 7; + worldQuad( + { x: boosterX - boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: -86 }, + { x: boosterX + boosterRadius, y, z: 86 }, + { x: boosterX - boosterRadius, y, z: 86 }, color); + } +} + +function drawSkyAtmosphere(sky, arena) { + // The station's background is one plain color, and the `wipe` at the top of + // the frame has already painted it -- so the space map draws no backdrop at + // all, and this function is the climb's weather again. + // + // It was a starfield: a hundred and twenty parallaxing stars, six gradient + // bands and a planet limb with a lit rim. @jeffrey asked for the same thing + // here he asked for of the cube's plaster -- "can the level background be + // plain colored? not stripey?" -- and the answer is the same both times. A + // decorative background is a pattern the eye keeps reading during a fight + // that has two small figures in it, and every one of those stars was + // competing with the thing you are supposed to be watching. The pattern went + // and about two hundred screen-space draws a frame went with it. + if (!survivalActive()) return; + // Broad D2D bands are effectively free compared with projected meshes and + // make the sky feel spatial without rebuilding a textured skybox each frame. + const bands = 6; + const bottom = Math.round(viewHeight * .78); + for (let band = 0; band < bands; band++) { + const y1 = Math.round(bottom * band / bands); + const y2 = Math.round(bottom * (band + 1) / bands); + const amount = (band + .5) / bands; + const color = mixColor(sky, arena, amount * .22); + box(0, y1, viewWidth(), y2 - y1 + 1, ...color); + } + const haze = mixColor(sky, arena, .34); + for (let streak = 0; streak < 11; streak++) { + const seed = .5 + .5 * Math.sin(streak * 41.37 + terrainPhase * 1.9); + const x = (streak + .18 + seed * .6) / 11 * viewWidth(); + const y = 88 + (.5 + .5 * Math.sin(streak * 19.17 - terrainPhase)) * + viewHeight * .43; + const reach = 32 + seed * 86; + line(x - reach, y, x + reach, y + (seed - .5) * 7, + 2 + seed * 2, ...haze); + } +} + +function shadowSurfaceY(x, y) { + return surfaceYAt(x, y); +} + +function drawSpotShadow(x, y, z, radius, color) { + const surfaceY = shadowSurfaceY(x, y); + const height = Math.max(0, surfaceY - y); + const reach = Math.min(520, height * .22); + const focus = clamp(1 - height / 5200, .42, 1); + const shadowX = x + globalLight.x * reach; + const shadowZ = z + globalLight.z * reach; + const center = projectPoint(shadowX, surfaceY - 2, shadowZ); + const edge = projectPoint(shadowX + radius, surfaceY - 2, shadowZ); + if (![center.x, center.y, edge.x, edge.y].every(Number.isFinite) || + [center.x, center.y, edge.x, edge.y].some((value) => Math.abs(value) > 30000)) + return; + const radiusX = Math.max(4, Math.abs(edge.x - center.x) * + (.5 + .18 * focus)); + const radiusY = Math.max(2, radiusX * (.2 + .08 * focus)); + // Bind the shadow to the owning object's depth, then bias it away from the + // camera. It remains above the terrain pass but can never win against the + // object that casts it. Restore the depth after — this used to leak, and + // everything drawn until the next assignment inherited the last shadow + // caster's depth: nondeterministic layering, frame to frame, on console. + const previousDepth = triangleDepth; + triangleDepth = projectPoint(x, y, z).z + .018; + const sides = 14; + for (let side = 0; side < sides; side++) { + const a = side * Math.PI * 2 / sides; + const b = (side + 1) * Math.PI * 2 / sides; + screenTriangle(center.x, center.y, + center.x + Math.cos(a) * radiusX, + center.y + Math.sin(a) * radiusY, + center.x + Math.cos(b) * radiusX, + center.y + Math.sin(b) * radiusY, ...color); + } + triangleDepth = previousDepth; +} + +function projectedBallRadius(ball) { + const center = projectPoint(ball.x, ball.y, ball.z); + const edge = projectPoint(ball.x + ball.radius, ball.y, ball.z); + // Do not impose a screen-space minimum: on the long street the camera can + // pull far back, and a fixed eight-pixel prop looked as if it grew relative + // to fighters and terrain. + return Math.max(.5, Math.abs(edge.x - center.x)); +} + +function drawSkateboard(player) { + const at = skateFrame(player); + if (photoThemeActive) { + const centerWorld = at(0, 5, 0); + const center = projectPoint(centerWorld.x, centerWorld.y, centerWorld.z); + const left = at(-64, 5, 0), right = at(64, 5, 0); + const a = projectPoint(left.x,left.y,left.z), b = projectPoint(right.x,right.y,right.z); + const width = Math.hypot(b.x-a.x,b.y-a.y); + photoSprite("skateboard", center.x, center.y, width, width * 136 / 412, + Math.atan2(b.y-a.y,b.x-a.x), false, center.z - .01); + return; + } + const deck = [236, 76, 118], grip = [34, 25, 39], truck = [174, 184, 202]; + const quad = (a, b, c, d, color) => worldQuad(at(...a), at(...b), at(...c), at(...d), color); + const axle = (a, b, width, color) => { + const p = at(...a), q = at(...b); + worldCapsule(p.x, p.y, p.z, q.x, q.y, q.z, Math.max(.4, width * cameraScale()), color); + }; + // Far wheels, deck, near wheels: preserve occlusion in the Canvas2D host. + const wheel = (along, side) => { + const spin = player.skateSpin || 0; + const center = at(along, skateAxleDrop, side * 15); + for (let i = 0; i < 10; i++) { + const a = spin + i * Math.PI / 5, b = spin + (i + 1) * Math.PI / 5; + worldTriangle(center, + at(along + Math.cos(a) * skateWheelRadius, + skateAxleDrop + Math.sin(a) * skateWheelRadius, side * 15), + at(along + Math.cos(b) * skateWheelRadius, + skateAxleDrop + Math.sin(b) * skateWheelRadius, side * 15), + i % 5 === 0 ? truck : [243, 210, 103]); + } + }; + const near = cameraDoll.position.z < player.z ? -1 : 1; + for (const along of [-skateTruck, skateTruck]) wheel(along, -near); + quad([-48, -4, -12], [48, -4, -12], [48, -4, 12], [-48, -4, 12], grip); + quad([-48, -4, near * 12], [48, -4, near * 12], [48, 0, near * 12], [-48, 0, near * 12], deck); + for (const end of [-1, 1]) + quad([end * 48, -4, -12], [end * 64, -12, -10], + [end * 64, -12, 10], [end * 48, -4, 12], deck); + for (const along of [-skateTruck, skateTruck]) { + axle([along, 0, 0], [along, skateAxleDrop, 0], 4, truck); + axle([along, skateAxleDrop, -15], [along, skateAxleDrop, 15], 3, truck); + wheel(along, near); + } +} + +function drawBall(ball) { + if (!ball.active) return; + const point = projectPoint(ball.x, ball.y, ball.z); + // A ball is a sphere in the orthographic world. Measuring its projected + // world radius keeps the screen hit shape circular while still respecting + // the perspective intro and loss cameras. + const radius = projectedBallRadius(ball); + if (!Number.isFinite(point.x) || !Number.isFinite(point.y) || + !Number.isFinite(radius) || radius > 12000 || point.x + radius < 0 || + point.x - radius > viewWidth() || point.y + radius < 0 || + point.y - radius > viewHeight) return; + const soccer = ball.type === "soccer"; + const beach = ball.type === "beach"; + const skateboard = ball.type === "skateboard"; + const polygon = (x, y, polygonRadius, sides, rotation, color) => { + for (let side = 0; side < sides; side++) { + const a = rotation + side * Math.PI * 2 / sides; + const b = rotation + (side + 1) * Math.PI * 2 / sides; + screenTriangle(x, y, + x + Math.cos(a) * polygonRadius, + y + Math.sin(a) * polygonRadius, + x + Math.cos(b) * polygonRadius, + y + Math.sin(b) * polygonRadius, ...color); + } + }; + if (skateboard) { + drawSkateboard({ x: ball.x, y: ball.y + skateAxleDrop + skateWheelRadius, + z: ball.z, skatePitch: ball.rotation, skateSpin: ball.skateSpin || 0 }); + return; + } + if (beach) { + const panels = [ + [244, 66, 96], [255, 146, 52], [255, 226, 66], [72, 210, 126], + [54, 196, 224], [70, 112, 238], [184, 82, 224], + ]; + const palettePhase = runtime().monotonicUs / 850000; + const paletteStep = Math.floor(palettePhase); + const paletteMix = palettePhase - paletteStep; + const sides = 16; + for (let side = 0; side < sides; side++) { + const a = ball.rotation + side * Math.PI * 2 / sides; + const b = ball.rotation + (side + 1) * Math.PI * 2 / sides; + // Native monotonic time can read negative, and a negative remainder + // would index off the front of the palette. + const panel = ((Math.floor(side / 2) + paletteStep) % panels.length + + panels.length) % panels.length; + const panelColor = mixColor(panels[panel], + panels[(panel + 1) % panels.length], paletteMix); + screenTriangle(point.x, point.y, + point.x + Math.cos(a) * radius * .92, + point.y + Math.sin(a) * radius * .92, + point.x + Math.cos(b) * radius * .92, + point.y + Math.sin(b) * radius * .92, + ...panelColor); + } + filledDisc(point.x, point.y, radius * .13, [246, 241, 220]); + return; + } + filledDisc(point.x, point.y, radius * .92, + soccer ? [226, 232, 224] : [232, 104, 28]); + const seam = [42, 31, 29]; + if (soccer) { + polygon(point.x, point.y, radius * .22, 5, + ball.rotation - Math.PI / 2, seam); + for (let patch = 0; patch < 5; patch++) { + const angle = ball.rotation + patch * Math.PI * 2 / 5; + const patchX = point.x + Math.cos(angle) * radius * .58; + const patchY = point.y + Math.sin(angle) * radius * .58; + filledCapsule(point.x + Math.cos(angle) * radius * .2, + point.y + Math.sin(angle) * radius * .2, + patchX, patchY, Math.max(1.5, radius * .035), seam); + polygon(patchX, patchY, radius * .13, 5, + angle - Math.PI / 2, seam); + } + } else { + const width = Math.max(2, radius * .075); + for (const angle of [ball.rotation, ball.rotation + Math.PI / 2]) { + const dx = Math.cos(angle) * radius * .84; + const dy = Math.sin(angle) * radius * .84; + filledCapsule(point.x - dx, point.y - dy, + point.x + dx, point.y + dy, width, seam); + } + for (const direction of [-1, 1]) { + let previous = null; + for (let step = -6; step <= 6; step++) { + const y = step / 6 * radius * .82; + const x = direction * Math.cos(step / 6 * Math.PI / 2) * radius * .42; + const next = { x: point.x + x, y: point.y + y }; + if (previous) filledCapsule(previous.x, previous.y, + next.x, next.y, width, seam); + previous = next; + } + } + filledDisc(point.x, point.y, Math.max(1.5, width * .55), seam); + } +} + +// What the bot saw this tick, drawn where it saw it: every rung in its frame +// gets a lip line, the deck it is jumping for gets its landing band, and the +// footing gets the window a jump may start from. A person watching a bot +// stand still can now read whether it is waiting for a deck to enter frame. +function drawBotScene(player) { + if (renderFlags.hud === false) return; + if (!debugHitboxes || !player.bot || !player.botScene) return; + const scene = player.botScene; + const seen = [58, 222, 255]; + for (const rung of scene.rungs) + hudWorldLine(rung.left, rung.y, 0, rung.right, rung.y, 0, 3, seen); + const goal = player.botSubgoal; + if (goal && goal.kind === "jump") { + const band = [120, 255, 120]; + hudWorldLine(goal.landLeft, goal.y, 0, goal.landRight, goal.y, 0, 6, band); + hudWorldLine(goal.aim, goal.y, 0, goal.aim, goal.y - 40, 0, 3, band); + const footing = scene.self.footing; + if (footing) + hudWorldLine(goal.takeoffLeft, footing.y, 0, goal.takeoffRight, + footing.y, 0, 6, [255, 214, 90]); + } + if (scene.lava) + hudWorldLine(worldLeft, scene.lava.y, 0, worldRight, scene.lava.y, 0, 3, + [255, 110, 70]); +} + +function drawBallHitboxes() { + if (renderFlags.hud === false) return; + if (!debugHitboxes) return; + for (const item of balls) { + if (!item.active) continue; + const point = projectPoint(item.x, item.y, item.z); + const radius = projectedBallRadius(item); + if (![point.x, point.y, radius].every(Number.isFinite) || radius > 5000 || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledRing(point.x, point.y, radius + 5, radius + 2, [58, 222, 255]); + } +} + +function drawGunPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const scale = cameraScale(); + if (photoThemeActive) { + const point = projectPoint(pickup.x,bobY,pickup.z); + const width = (pickup.kind === "ROCKET LAUNCHER" ? 105 : 56) * scale; + photoSprite("gun", point.x,point.y,width,width * 253 / 365,0,false,point.z-.02); + return; + } + const metal = mixColor([202, 212, 228], [52, 59, 72], visualTheme.light); + const grip = mixColor([126, 106, 88], [40, 43, 52], visualTheme.light); + const barrelWidth = Math.max(2, 5 * scale); + const gripWidth = Math.max(2, 4 * scale); + const smg = pickup.kind === "RUBBER SMG"; + const rocket = pickup.kind === "ROCKET LAUNCHER"; + if (pickup.kind === "SPACE LASER") { + // Short body, long emitter, and a lit coil at the breech so the thing on + // the top deck is identifiable as light-bearing from the floor three + // decks below. The pulse is on the same 3 Hz bob as every other pickup. + const glow = mixColor([96, 226, 255], [236, 255, 255], + .4 + .35 * Math.sin(t * 5.2)); + const shell = mixColor([206, 224, 240], [44, 54, 78], visualTheme.light); + worldCapsule(pickup.x - 22, bobY, pickup.z, + pickup.x + 14, bobY, pickup.z, barrelWidth * 1.5, shell, -.02); + worldCapsule(pickup.x + 14, bobY, pickup.z, + pickup.x + 40, bobY, pickup.z, barrelWidth * .7, glow, -.02); + worldCapsule(pickup.x - 14, bobY - 9, pickup.z, + pickup.x - 2, bobY - 9, pickup.z, barrelWidth * .6, glow, -.02); + worldCapsule(pickup.x - 6, bobY + 2, pickup.z, + pickup.x - 1, bobY + 22, pickup.z, gripWidth * 1.2, grip, -.02); + return; + } + // A handgun-sized world object in gunmetal and grip material, not a glowing + // pickup glyph with a second silhouette around it. + // Capsules, not line() — the native renderer buries the whole line + // stratum beneath the world's triangles, which is how the gun spent a day + // drawn under the floor on console while the web shell showed it fine. + worldCapsule(pickup.x - (rocket ? 58 : smg ? 42 : 16), bobY, pickup.z, + pickup.x + (rocket ? 62 : smg ? 48 : 20), bobY, pickup.z, + rocket ? barrelWidth * 2.2 : smg ? barrelWidth * 1.45 : barrelWidth, + rocket ? [48, 61, 52] : metal, -.02); + worldCapsule(pickup.x + (smg ? 8 : 2), bobY + 1, pickup.z, + pickup.x + (smg ? 13 : 8), bobY + (smg ? 27 : 18), pickup.z, + smg ? gripWidth * 1.5 : gripWidth, grip, -.02); + if (smg) { + worldCapsule(pickup.x - 42, bobY, pickup.z, + pickup.x - 65, bobY + 18, pickup.z, barrelWidth, grip, -.02); + worldCapsule(pickup.x - 6, bobY + 4, pickup.z, + pickup.x - 1, bobY + 30, pickup.z, gripWidth * 1.4, metal, -.02); + } + if (rocket) { + worldCapsule(pickup.x + 50, bobY, pickup.z, + pickup.x + 68, bobY, pickup.z, barrelWidth * 2.8, [104, 62, 48], -.02); + worldCapsule(pickup.x - 8, bobY + 3, pickup.z, + pickup.x - 3, bobY + 30, pickup.z, gripWidth * 1.5, [38, 45, 42], -.02); + } +} + +// A saber waiting on a deck: the hilt standing upright with a stub of blade +// lit above it, bobbing on the same clock as every other pickup so the map's +// loose objects share one heartbeat. Drawn short on purpose — a full-length +// blade planted in a deck would read as scenery, and this is something you +// pick up. Capsules rather than lines, for the same reason the pistol is +// capsules: the native renderer buries the whole line stratum under the +// world's triangles, and the blade would vanish into the deck it sits on. +function drawSaberPickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3 + pickup.x * .001) * 8; + const pulse = .5 + .5 * Math.sin(t * 5.6 + pickup.x * .002); + const glow = mixColor([120, 226, 255], [244, 252, 255], .35 + pulse * .4); + const hilt = mixColor([172, 182, 198], [46, 52, 68], visualTheme.light); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 34, pickup.z, 13, glow, -.02); + worldCapsule(pickup.x, bobY + 4, pickup.z, + pickup.x, bobY - 30, pickup.z, 6, [244, 252, 255], -.02); + worldCapsule(pickup.x, bobY + 6, pickup.z, + pickup.x, bobY + 34, pickup.z, 9, hilt, -.02); + worldCapsule(pickup.x - 13, bobY + 8, pickup.z, + pickup.x + 13, bobY + 8, pickup.z, 5, hilt, -.02); +} + +function drawBullet(bullet) { + const previous = projectPoint(bullet.previousX ?? bullet.x, + bullet.previousY ?? bullet.y, bullet.z); + const point = projectPoint(bullet.x, bullet.y, bullet.z); + const blink = Math.floor(runtime().monotonicUs / 65000 + bullet.owner) % 2; + // A bolt does not blink. The pistol round's alternating white is what makes + // a slow ricochet findable against a busy floor; the laser is gone in four + // frames and wants to read as one continuous line of light instead. + const core = bullet.spit + ? bullet.heavy ? [255, 92, 174] : [118, 255, 196] + : bullet.laser ? [236, 255, 255] + : blink ? [255, 255, 248] + : bullet.rubber ? [255, 226, 58] : [255, 178, 76]; + const trail = bullet.spit + ? bullet.heavy ? [182, 48, 116] : [58, 190, 132] + : bullet.laser ? [96, 226, 255] + : blink ? [255, 244, 178] + : bullet.rubber ? [214, 178, 42] : [224, 116, 62]; + const scale = cameraScale(); + // Project the complete projectile. The old 2px/4px floors made both the + // trail and blinking core behave like HUD icons once the street zoomed out. + // + // Spit is dots, not tracers: the streak between frames is the thing that + // says "bullet", so a glob doesn't draw one — just a little ball with a + // couple of droplets falling off the arc behind it. + if (bullet.spit) { + // A glob must survive the wide portrait camera as a ball, not sub-pixel + // dust. The darker halo keeps its circular edge legible over sky or earth. + const radius = Math.max(2, (bullet.heavy ? 10 : 7) * scale); + filledDisc(point.x, point.y, radius * 1.35, trail); + filledDisc(point.x, point.y, radius, core); + filledDisc(lerp(point.x, previous.x, .5), lerp(point.y, previous.y, .5), + radius * .45, trail); + filledDisc(previous.x, previous.y, radius * .25, trail); + return; + } + drawBulletTrail(bullet, trail, scale); + if (bullet.laser) { + // Drawn as the stride itself: at 9,600 units a second the gap between two + // frames IS the beam, so a wide cyan sheath over a white core along that + // gap is the whole shot. No round cap at the tip — a bolt has a leading + // edge, not a head. + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(1.2, 9 * scale), trail); + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, 3.5 * scale), core); + return; + } + filledCapsule(previous.x, previous.y, point.x, point.y, + Math.max(.6, (bullet.rubber ? 4 : 3) * scale), trail); + filledDisc(point.x, point.y, Math.max(.9, 7 * scale), core); +} + +// The ghost of where a round has been. Walked oldest to newest so the fade +// runs the right way down the path, and drawn thin: the live tracer is the +// bullet, this is only the shape its bounces have written. +// +// Bare quads, NOT filledCapsule. A capsule is two triangles plus two discs and +// a small disc is a six-sided fan, so it costs ten faces — at the 24-bullet cap +// that is 3,600 faces of ghost against a ~2,100-face frame, which is the eleven +// -frames-a-second stray wearing a different hat. Two faces a segment caps the +// worst case at 528, and a trail wants no round caps anyway. +function drawBulletTrail(bullet, ink, scale) { + const stored = Math.min(bullet.trailCount || 0, bulletTrailPoints); + if (stored < 2) return; + // The same leash the camera uses. A round that has sailed out of the fight + // is off screen, and its ghost should not be paid for either. + if (!players.some((player) => + Math.abs(bullet.x - player.x) < 5200 && + Math.abs(bullet.y - player.y) < 5200)) return; + const ground = mixColor([7, 8, 28], [230, 239, 247], visualTheme.light); + const oldest = (bullet.trailCount || 0) - stored; + let previous = null; + for (let step = 0; step < stored; step++) { + const slot = ((oldest + step) % bulletTrailPoints) * 2; + const here = projectPoint(bullet.trail[slot], bullet.trail[slot + 1], + bullet.z); + if (previous) { + // Newer segments carry more of the tracer's weight and colour, so the + // tail thins toward nothing rather than stopping on a hard edge. + const age = step / stored; + const radius = Math.max(.4, (bullet.rubber ? 3 : 2.2) * scale * age) / 2; + const dx = here.x - previous.x; + const dy = here.y - previous.y; + const length = Math.hypot(dx, dy); + if (length > .001) { + const nx = -dy / length * radius; + const ny = dx / length * radius; + const [r, g, b] = mixColor(ground, ink, .18 + age * .55); + screenTriangle(previous.x + nx, previous.y + ny, + previous.x - nx, previous.y - ny, here.x + nx, here.y + ny, r, g, b); + screenTriangle(previous.x - nx, previous.y - ny, + here.x - nx, here.y - ny, here.x + nx, here.y + ny, r, g, b); + } + } + previous = here; + } +} + +function drawGrenadePickup(pickup, t) { + if (!pickup.active) return; + const bobY = pickup.y + Math.sin(t * 3.2 + pickup.x * .001) * 8; + const point = projectPoint(pickup.x, bobY, pickup.z); + const scale = cameraScale(); + const shell = mixColor([166, 194, 112], [72, 96, 58], visualTheme.light); + const fuse = mixColor([210, 218, 232], [45, 50, 60], visualTheme.light); + const radius = Math.max(3, 9 * scale); + const previousDepth = triangleDepth; + triangleDepth = point.z - .02; + filledDisc(point.x, point.y, radius, shell); + triangleDepth = previousDepth; + worldCapsule(pickup.x + 1, bobY - 10, pickup.z, + pickup.x + 11, bobY - 20, pickup.z, Math.max(2, 3 * scale), fuse, -.02); +} + +function drawGrenade(grenade) { + const point = projectPoint(grenade.x, grenade.y, grenade.z); + if (grenade.exploding) { + const radius = grenade.blastRadius * cameraScale(); + const width = Math.max(3, 10 * cameraScale()); + filledRing(point.x, point.y, radius, + Math.max(0, radius - width), [255, 105, 105]); + return; + } + if (grenade.rocket) { + if (photoThemeActive) { + const scale = cameraScale(); + const angle = Math.atan2(grenade.vy,grenade.vx); + photoSprite("rocket",point.x,point.y,64*scale,41*scale,angle,false,point.z-.02); + return; + } + const length = Math.hypot(grenade.vx, grenade.vy) || 1; + const tail = projectPoint(grenade.x - grenade.vx / length * 54, + grenade.y - grenade.vy / length * 54, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(5, 13 * cameraScale()), [52, 65, 56]); + filledDisc(point.x, point.y, Math.max(5, 12 * cameraScale()), [190, 74, 54]); + const flame = projectPoint(grenade.x - grenade.vx / length * 88, + grenade.y - grenade.vy / length * 88, grenade.z); + filledCapsule(flame.x, flame.y, tail.x, tail.y, + Math.max(3, 7 * cameraScale()), [255, 214, 72]); + return; + } + const blink = grenade.fuse < .45 && Math.floor(grenade.fuse * 20) % 2 === 0; + const color = blink ? [255, 255, 255] : players[grenade.owner].color; + filledDisc(point.x, point.y, Math.max(4, 22 * cameraScale()), color); + const tail = projectPoint(grenade.x - Math.sign(grenade.vx) * 90, + grenade.y - 14, grenade.z); + filledCapsule(tail.x, tail.y, point.x, point.y, + Math.max(2, 6 * cameraScale()), color); +} + +function drawWindFlag(t, color) { + const poleX = (platformLeft + platformRight) / 2; + const poleZ = 480; + const poleBottom = platformY; + const poleTop = platformY - 150; + const calm = windMph < .35; + const flagHeight = 68; + const length = calm ? 58 : 78 + windMph * 7; + const gust = calm ? 0 + : Math.sin(t * (4 + windMph * .16)) * (10 + windMph * .8); + const tipX = poleX + windDirection * length; + const tipY = poleTop + flagHeight * .5 + gust; + const width = Math.max(3, 13 * cameraScale()); + const poleInk = mixColor([214, 222, 236], [50, 57, 70], visualTheme.light); + const edgeInk = mixColor([242, 246, 252], [26, 31, 44], visualTheme.light); + const fabric = calm + ? mixColor([92, 205, 255], [35, 112, 190], visualTheme.light) : color; + const flagPoints = [ + projectPoint(poleX, poleTop, poleZ), + projectPoint(tipX, tipY, poleZ), + projectPoint(poleX, poleTop + flagHeight, poleZ), + ]; + if (flagPoints.every((point) => [point.x, point.y, point.z].every(Number.isFinite))) + projectedTriangle(flagPoints[0], flagPoints[1], flagPoints[2], fabric); + worldCapsule(poleX, poleBottom, poleZ, + poleX, poleTop, poleZ, width, poleInk); + const edgeWidth = Math.max(2, width * .34); + worldCapsule(poleX, poleTop, poleZ, + tipX, tipY, poleZ, edgeWidth, edgeInk); + worldCapsule(tipX, tipY, poleZ, + poleX, poleTop + flagHeight, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX, poleTop + flagHeight, poleZ, + poleX, poleTop, poleZ, edgeWidth, edgeInk); + worldCapsule(poleX - 35, poleBottom, poleZ, + poleX + 35, poleBottom, poleZ, width, poleInk); +} + +function hashUnit(text) { + let hash = 2166136261; + for (let cursor = 0; cursor < text.length; cursor++) { + hash ^= text.charCodeAt(cursor); + hash = Math.imul(hash, 16777619); + } + return (hash >>> 0) / 4294967295; +} + +function airSeedValue(index, channel = 0) { + return hashUnit("oskiewar-air:" + index + ":" + channel); +} + +function resetAirParticles() { + const count = 18; + const spanX = worldRight - worldLeft; + const spanY = floorY - ceilingY; + const spanZ = worldFar - worldNear; + airParticles.length = 0; + for (let index = 0; index < count; index++) + airParticles.push({ + id: "air:" + index, + kind: "air", + position: { + x: worldLeft + airSeedValue(index, 1) * spanX, + y: ceilingY + 180 + airSeedValue(index, 2) * (spanY - 360), + z: worldNear + 100 + airSeedValue(index, 3) * (spanZ - 200), + }, + velocity: { x: 0, y: 0, z: 0 }, + radius: 8 + airSeedValue(index, 4) * 14, + phase: airSeedValue(index, 5) * Math.PI * 2, + }); +} + +// A stream-function curl gives the air a divergence-free-looking circulation +// instead of independent sine wiggles. Entities relax toward this velocity, +// advect in fixed simulation time, and wrap at arena boundaries. +function airFlowAt(position, seconds, phase) { + const nx = (position.x - worldLeft) / (worldRight - worldLeft) * Math.PI * 2; + const ny = (position.y - ceilingY) / (floorY - ceilingY) * Math.PI * 2; + const age = seconds * .32 + phase; + const circulation = 96; + return { + x: windDirection * (42 + windMph * 12) + + circulation * Math.sin(nx + age) * Math.cos(ny - age * .7), + y: -circulation * Math.cos(nx + age) * Math.sin(ny - age * .7), + z: 44 * Math.sin(nx + ny + age * .55), + }; +} + +const wrapWorld = (value, low, high) => { + const span = high - low; + return low + ((value - low) % span + span) % span; +}; + +function simulateAirParticles(dt, now) { + if (!airParticles.length) resetAirParticles(); + const seconds = now / 1000000; + const response = 1 - Math.exp(-dt * 2.8); + for (const entity of airParticles) { + const flow = airFlowAt(entity.position, seconds, entity.phase); + entity.velocity.x = lerp(entity.velocity.x, flow.x, response); + entity.velocity.y = lerp(entity.velocity.y, flow.y, response); + entity.velocity.z = lerp(entity.velocity.z, flow.z, response); + entity.position.x = wrapWorld(entity.position.x + entity.velocity.x * dt, + worldLeft, worldRight); + entity.position.y = wrapWorld(entity.position.y + entity.velocity.y * dt, + ceilingY + 120, floorY - 120); + entity.position.z = wrapWorld(entity.position.z + entity.velocity.z * dt, + worldNear + 80, worldFar - 80); + } +} + +function drawAmbientMotes(color) { + const previousDepth = triangleDepth; + for (const entity of airParticles) { + const { x, y, z } = entity.position; + const point = projectPoint(x, y, z); + const edge = projectPoint(x + entity.radius, y, z); + const radius = Math.max(.8, Math.hypot(edge.x - point.x, edge.y - point.y)); + const depthAmount = (z - worldNear) / (worldFar - worldNear); + const ink = mixColor([18, 24, 48], color, .24 + (1 - depthAmount) * .34); + if (![point.x, point.y, point.z, radius].every(Number.isFinite) || + point.x < stageLeft - radius || point.x > stageRight + radius || + point.y < -radius || point.y > viewHeight + radius) continue; + triangleDepth = point.z; + filledDisc(point.x, point.y, radius, ink); + } + triangleDepth = previousDepth; +} + +function drawSelectPortrait(player, x, y, scale, t) { + const color = player.color; + const head = { x, y: y - 130 * scale, radius: 34 * scale }; + filledDisc(head.x, head.y, head.radius + Math.max(2, 3 * scale), [8, 12, 24]); + filledDisc(head.x, head.y, head.radius, color); + hudLine(x, y - 94 * scale, x, y + 20 * scale, 12 * scale, ...color); + hudLine(x, y - 65 * scale, x - 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y - 65 * scale, x + 62 * scale, y - 8 * scale, 10 * scale, ...color); + hudLine(x, y + 20 * scale, x - 48 * scale, y + 112 * scale, 11 * scale, ...color); + hudLine(x, y + 20 * scale, x + 48 * scale, y + 112 * scale, 11 * scale, ...color); + drawFace(player, head, contrastShadow(color), t); +} + +function selectionPreview(option) { + return { ...players[1], name: option.fighter.handle, + color: option.fighter.color, + npc: option.kind === "dummy" || option.kind === "bot", + bot: option.kind === "bot" }; +} + +function drawSelectionScreen(t, ink, panel) { + const layout = selectionTouchLayout(); + const hover = selectionHover(layout); + if (globalThis.__oskiewarTouch) globalThis.__oskiewarTouch.hover = hover; + const compact = compactLayout(); + const title = selectionStep === 0 ? "pick your pal" : "who are you fighting?"; + const titleSize = compact ? 36 : 58; + const titleY = compact ? 58 : 86; + const titleWidth = handleWidth(title, titleSize); + typeWrite(title, viewCenterX() - titleWidth / 2, titleY, titleSize, ...ink); + const stepText = (selectionStep + 1) + "/2"; + const stepSize = compact ? 24 : 32; + typeWrite(stepText, layout.back.x + layout.back.width + (compact ? 18 : 28), + layout.back.y + (compact ? 11 : 18), stepSize, + ...mixColor([140, 150, 185], ink, .35)); + const backHovered = hover?.back; + const options = selectionOptions(); + // Neighbours first so the focused card always lands on top of them. + const wheel = [...layout.options].sort((a, b) => + Math.abs(b.slot) - Math.abs(a.slot)); + for (const rect of wheel) { + const option = options[rect.index]; + const player = selectionPreview(option); + const disabled = Boolean(option.disabled); + const hovered = !disabled && hover?.option === rect.index; + const focused = !disabled && rect.slot === 0; + const disabledInk = mixColor([74, 80, 96], [164, 168, 178], + visualTheme.light); + const optionColor = disabled ? disabledInk : option.fighter.color; + if (hovered || focused) + box(rect.x, rect.y + rect.height - (hovered ? 8 : 5), rect.width, + hovered ? 8 : 5, ...optionColor); + const scale = rect.height / 520 * 1.05; + const portraitY = rect.y + rect.height * (compact ? .55 : .53); + drawSelectPortrait(player, rect.x + rect.width / 2, portraitY, scale, t); + const label = option.fighter.handle.toLowerCase(); + const labelSize = Math.max(16, Math.round(rect.width * .085)); + const labelWidth = handleWidth(label, labelSize); + drawHandle(label, rect.x + (rect.width - labelWidth) / 2, + rect.y + rect.height - labelSize - (compact ? 10 : 18), labelSize, + disabled ? [disabledInk] : option.fighter.colors, optionColor); + } + // Chevrons inside the focused card name the gesture that turns the wheel, + // without crowding the neighbours they point at. + if (layout.options.length > 1) { + const focus = layout.options.find((rect) => rect.slot === 0); + const arrowSize = compact ? 30 : 52; + const arrowY = focus.y + focus.height / 2 - arrowSize / 2; + const inset = (compact ? 8 : 14) + Math.sin(t * 3.4) * (compact ? 3 : 6); + typeWrite("<", focus.x + inset, arrowY, arrowSize, ...ink); + typeWrite(">", focus.x + focus.width - inset - + comicGlyphAdvance(">", arrowSize), arrowY, arrowSize, ...ink); + } + // Keep navigation above every option on narrow/tall browser layouts. + box(layout.back.x, layout.back.y, layout.back.width, layout.back.height, + ...mixColor(panel, ink, backHovered ? .25 : .08)); + typeWrite("< back", layout.back.x + (compact ? 12 : 20), + layout.back.y + (compact ? 10 : 17), compact ? 25 : 34, ...ink); + const controls = selectionControlKeys(); + drawCenteredKeycapRun(controls, viewHeight - (compact ? 52 : 66), + compact ? 15 : 20, inputPads[0]?.down || [], ink); +} + +const titlePaletteNight = [ + [255, 105, 190], [111, 232, 210], [255, 232, 92], [130, 150, 255], + [255, 126, 92], [188, 128, 255], [92, 205, 255], [246, 248, 255], +]; +const titlePaletteDay = [ + [190, 32, 118], [0, 126, 124], [176, 112, 0], [73, 82, 190], + [204, 59, 43], [114, 68, 185], [24, 107, 181], [47, 56, 82], +]; + +function animatedTitleColor(index, t, daylight = visualTheme.light) { + const count = titlePaletteNight.length; + // Native monotonic time can begin a fraction before startedAt settles. + // Normalize the remainder so that first frame still lands in the palette. + const phase = ((index + t * .42) % count + count) % count; + const from = Math.floor(phase); + const amount = phase - from; + const eased = amount * amount * (3 - amount * 2); + const night = mixColor(titlePaletteNight[from], + titlePaletteNight[(from + 1) % count], eased); + const day = mixColor(titlePaletteDay[from], + titlePaletteDay[(from + 1) % count], eased); + return mixColor(night, day, daylight); +} + +// The dummy count, as a sentence. The host hands over a window and a total; +// the window is already the shortest one that had anything in it, so all that +// is left here is to say it in English. Zero returns nothing at all — an +// arcade does not advertise that nobody played today. +function dummyPopLine(stat) { + const pops = Math.floor(Number(stat?.pops) || 0); + const hours = Math.floor(Number(stat?.hours) || 0); + if (pops <= 0 || hours <= 0 || hours > 48) return ""; + return pops + " dummy head" + (pops === 1 ? "" : "s") + " popped in the last " + + (hours === 1 ? "hour" : hours + " hours"); +} + +function drawDummyPopLine(titleY, titleSize, transitionInk) { + // Not on the poster: the social preview is burned to a file whose hash is + // checked at deploy, and a number that moves would make it stale hourly. + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const line = dummyPopLine(capabilities().pops); + if (!line) return; + const size = Math.round(hudTypeSize * (compactLayout() ? .46 : .56)); + const width = handleWidth(line, size); + const x = viewCenterX() - width / 2; + const y = titleY + titleSize + (compactLayout() ? 12 : 18); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || + mixColor([198, 206, 232], [58, 70, 104], visualTheme.light); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); +} + +// "Add your coach." @jeffrey: "itd be cool so any user can claude into an +// oskiewar game ... 'coach' would be the feature ... which could then analyze +// your matches / do things / get ur data". The relay has always counted a +// read-only `agent` seat apart from the grandstand; this offers that seat on +// the title as a thing a player can do — hand oskiewar.com/coach.mjs to their +// own Claude and it sits in on this room, reading every frame a phone reads. +// The room name is the whole invitation, since it is what a coach attaches +// to, so it is printed here under START where a newcomer is already looking. +// Once a coach is seated the line says so, with the antenna the debug +// read-out lights, and keeps the name up so the player can tell the coach is +// watching this room and not an earlier one. Never on the poster: the social +// preview is hash-bound, and a room name changes with every burn. +function drawCoachLine(button, transitionInk) { + if (typeof capabilities !== "function" || + capabilities().socialPreview === true) return; + const room = versusRoomName || sessionName; + if (!room) return; + const compact = compactLayout(); + const linked = linkedAgents(); + const line = linked ? "coach linked " + room + : "add your coach oskiewar.com/coach " + room; + const size = Math.round(hudTypeSize * (compact ? .46 : .56)); + const width = handleWidth(line, size); + const glyph = linked ? Math.round(size * 1.2) : 0; + const x = viewCenterX() - (width + glyph) / 2 + glyph; + const y = button.y + button.height + (compact ? 6 : 10); + if (y + size > viewHeight - 8) return; + const ink = transitionInk || (linked ? [120, 226, 255] + : mixColor([198, 206, 232], [58, 70, 104], visualTheme.light)); + typeWrite(line, x + 2, y + 2, size, + ...mixColor([8, 10, 26], [226, 234, 246], visualTheme.light)); + typeWrite(line, x, y, size, ...ink); + if (linked) drawAgentLink(x - glyph * .6, y + size * .55, size / 26, linked); +} + +function titleButtonRect() { + const compact = compactLayout(); + const textSize = hudTypeSize; + const textWidth = handleWidth("start", textSize); + const width = textWidth + (compact ? 54 : 76); + const height = textSize + (compact ? 24 : 34); + return { x: viewCenterX() - width / 2, + y: viewHeight * (compact ? .61 : .64) - (compact ? 10 : 15), + width, height, textSize, textWidth }; +} + +// A letter you can push around. `grow` eases toward 1 while the pointer is on +// it and `kick` is a decaying shudder fired the frame it is first touched, so +// the word answers one letter at a time instead of inflating as a block. +function toyGlyph(toys, index, hot, dt) { + const toy = toys[index] || (toys[index] = { grow: 0, kick: 0, hot: false }); + toy.grow += ((hot ? 1 : 0) - toy.grow) * (1 - Math.exp(-dt * (hot ? 16 : 7))); + if (hot && !toy.hot) toy.kick = 1; + toy.hot = hot; + toy.kick *= Math.exp(-dt * 5.5); + return toy; +} + +const pointInCell = (point, x, y, width, height) => point && x <= point.x && + point.x <= x + width && y <= point.y && point.y <= y + height; + +// Screen-space outline, four boxes, no projection — safe anywhere. +function strokeBox(x, y, width, height, thickness, color) { + hudBox(x, y, width, thickness, ...color); + hudBox(x, y + height - thickness, width, thickness, ...color); + hudBox(x, y, thickness, height, ...color); + hudBox(x + width - thickness, y, thickness, height, ...color); +} + +function drawTitleScreen(t, ink, transitionAge = -1) { + const compact = compactLayout(); + const socialPreview = typeof capabilities === "function" && + capabilities().socialPreview === true; + // Keep the game identity visible on the opening frame. The live fighters + // and START remain interactive beneath the wordmark. + const title = "oskiewar"; + const version = "v" + buildVersion; + const breath = 1 + Math.sin(t * .9) * .018; + const socialLockupGap = compact ? 10 : 18; + const socialTitleSize = Math.min(220, + (viewWidth() - 56 - socialLockupGap) / + (handleWidth(title, 1) + handleWidth(version, .3))); + const titleSize = (socialPreview ? socialTitleSize : compact ? 88 : 154) * breath; + const titleWidth = handleWidth(title, titleSize); + const versionSize = Math.round(titleSize * .3); + const versionWidth = handleWidth(version, versionSize); + const lockupGap = socialPreview ? socialLockupGap : compact ? 10 : 18; + const lockupWidth = titleWidth + lockupGap + versionWidth; + const titleX = viewCenterX() - lockupWidth / 2; + const titleY = viewHeight * (compact ? .38 : .35); + + // Air fuzzies: sparse motes drifting the whole frame, no panels or stripes + // behind the wordmark. + if (transitionAge < 0 && renderFlags.dust !== false) + for (let index = 0; index < (compact ? 10 : 16); index++) { + const phase = index * 2.39996; + const x = stageLeft + (stageRight - stageLeft) * + (.5 + .47 * Math.sin(t * (.055 + index % 5 * .01) + phase)); + const y = viewHeight * + (.5 + .45 * Math.cos(t * (.043 + index % 4 * .012) + phase * 1.7)); + const radius = (compact ? 2 : 3) + (index % 3); + hudCircle(x, y, radius, Math.max(1.5, radius * .48), + animatedTitleColor(index, t * .7)); + } + + let cursor = titleX; + // Kerning scaffold: one cell per glyph, taken from the same advance the + // layout walks, so drift and bob read against their own metrics. + const glyphCells = debugHitboxes && transitionAge < 0 && !socialPreview && + renderFlags.hud !== false ? [] : null; + const flashPalette = [[255, 226, 48], [70, 224, 92], [181, 255, 48]]; + const flash = transitionAge >= 0 + ? flashPalette[Math.floor(transitionAge / .065) % flashPalette.length] : null; + const fade = transitionAge >= 0 ? clamp((transitionAge - .46) / .24, 0, 1) : 0; + const transitionInk = flash ? mixColor(flash, [7, 10, 26], fade) : null; + // Toys ease in real time, and the burn renders headless with no pointer, so + // the poster stays the same picture it always was. + const dt = titleToyAt < 0 ? 0 : clamp(t - titleToyAt, 0, .1); + titleToyAt = t; + const raw = globalThis.__oskiewarTouch?.pointer; + const pointer = transitionAge < 0 && !socialPreview && raw?.active && + Number.isFinite(raw.x) && Number.isFinite(raw.y) ? raw : null; + let held = -1; + for (let index = 0; index < title.length; index++) { + const character = title[index]; + const bob = Math.sin(t * 2.05 + index * .72) * (compact ? 5 : 8); + const drift = Math.cos(t * 1.12 + index * .91) * (compact ? 3 : 5) + + Math.sin(t * .63 + index * 1.71) * (compact ? 7 : 12); + const advance = comicGlyphAdvance(character, titleSize); + // The cell is what the pointer touches, so a letter that has swollen out + // of it cannot chase the cursor or shove its neighbours along the line. + // + // The letter the pointer already holds is tested against a cell grown by + // exactly how far this letter can travel — the sum of its drift terms + // across, its bob down — so the whole of its wander happens without the + // grab ever being dropped. Every other letter is tested honestly, or a + // held letter would keep stealing the pointer from its neighbours. + const slackX = titleGlyphHot === index ? (compact ? 10 : 17) : 0; + const slackY = titleGlyphHot === index ? (compact ? 5 : 8) : 0; + const hot = pointInCell(pointer, cursor + drift - slackX, + titleY + bob - slackY, advance + slackX * 2, titleSize + slackY * 2); + if (hot) held = index; + const toy = toyGlyph(titleToys, index, hot, dt); + const size = titleSize * + (1 + toy.grow * .38 + toy.kick * Math.sin(t * 31 + index) * .17); + const shudder = toy.kick * Math.sin(t * 27 + index * 1.3) * + (compact ? 6 : 11); + const glyphX = cursor + drift + + (advance - comicGlyphAdvance(character, size)) / 2 + shudder; + const glyphY = titleY + bob - (size - titleSize) * .5 - + toy.grow * (compact ? 6 : 11); + const shadowOffset = Math.max(4, Math.min(5, Math.round(size * .025))); + typeWrite(character, glyphX + shadowOffset, glyphY + shadowOffset, + size, ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(character, glyphX, glyphY, + size, ...(transitionInk || animatedTitleColor(index, t))); + if (glyphCells) glyphCells.push([cursor + drift, titleY + bob, advance]); + cursor += advance; + } + const versionX = titleX + titleWidth + lockupGap; + const versionY = titleY + titleSize - versionSize * 1.15; + const versionEdge = contrastShadow(transitionInk || ink); + for (const [dx, dy] of [[-2, 0], [2, 0], [0, -2], [0, 2]]) + typeWrite(version, versionX + dx, versionY + dy, versionSize, ...versionEdge); + typeWrite(version, versionX, versionY, versionSize, + ...(transitionInk || ink)); + if (survivalActive()) { + const mode = "survival"; + const modeSize = Math.round(titleSize * .28); + const modeWidth = handleWidth(mode, modeSize); + const modeX = viewCenterX() - modeWidth / 2; + const modeY = titleY + titleSize + (compact ? 8 : 12); + typeWrite(mode, modeX + 2, modeY + 3, modeSize, + ...mixColor([8, 10, 24], [73, 43, 55], visualTheme.light * .35)); + typeWrite(mode, modeX, modeY, modeSize, ...(transitionInk || ink)); + } else drawDummyPopLine(titleY, titleSize, transitionInk); + if (glyphCells) { + strokeBox(titleX, titleY, titleWidth, titleSize, 2, [92, 132, 255]); + for (const [x, y, advance] of glyphCells) { + strokeBox(x, y, advance, titleSize, 2, [255, 92, 116]); + hudBox(x, y, 2, titleSize, 116, 255, 184); + } + } + + const prompt = "start"; + const button = titleButtonRect(); + const hovered = Boolean(pointer) && pointInRect(pointer, button); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.titleButton = button; + globalThis.__oskiewarTouch.titleHover = hovered; + globalThis.__oskiewarTouch.titleGlyph = held; + } + titleGlyphHot = held; + promptBounce += ((hovered ? 1 : 0) - promptBounce) * + (1 - Math.exp(-dt * (hovered ? 14 : 6))); + const promptPulse = .68 + (Math.sin(t * 3.2) + 1) * .16; + const promptInk = transitionInk || + mixColor([196, 142, 18], [255, 238, 82], promptPulse); + // The word floats on its own; the rect survives only as the touch target. + // Yellow type on a bright sky needs an edge, so a sharp offset shadow + // deepens as the background lightens and lifts as it goes to night. + if (!socialPreview) { + let promptCursor = button.x + (button.width - button.textWidth) / 2; + const promptY = button.y + (button.height - button.textSize) / 2 - 2; + const offset = Math.max(3, Math.round(button.textSize * .1)); + const shadowInk = mixColor([10, 12, 30], [86, 26, 116], visualTheme.light); + const litInk = hovered + ? mixColor(promptInk, [255, 255, 255], .35) : promptInk; + for (let index = 0; index < prompt.length; index++) { + const character = prompt[index]; + const advance = comicGlyphAdvance(character, button.textSize); + const toy = toyGlyph(promptToys, index, + pointInCell(pointer, promptCursor, promptY, advance, button.textSize), + dt); + // The whole word takes the bounce, but each letter takes it a beat after + // the one before, so start reads as a hop travelling along the word. + const hop = promptBounce * button.textSize * .3 * + Math.abs(Math.sin(t * 5.4 - index * .62)); + const size = button.textSize * (1 + toy.grow * .2 + toy.kick * .12); + const x = promptCursor + (advance - comicGlyphAdvance(character, size)) / 2; + const y = promptY - hop - (size - button.textSize) * .5; + if (!transitionInk) + typeWrite(character, x + offset, y + offset, size, ...shadowInk); + typeWrite(character, x, y, size, ...litInk); + promptCursor += advance; + } + // The pace dial. Quiet unless the clock is off its default — or was just + // touched, so stepping back to one still answers the keypress — and it + // lives large in the bottom-right corner, a dashboard readout rather + // than a footnote under the start word. + const paceNow = runtime().monotonicUs; + if (gameSpeed !== 1 || (gameSpeedChangedAt && + paceNow - gameSpeedChangedAt < 2400000)) { + const pace = "×" + gameSpeed; + const paceSize = Math.max(30, Math.round(button.textSize * .8)); + const hud = hudSafeRect(); + const paceX = hud.right - handleWidth(pace, paceSize); + const paceY = hud.bottom - paceSize; + typeWrite(pace, paceX + 3, paceY + 4, paceSize, ...shadowInk); + typeWrite(pace, paceX, paceY, paceSize, ...promptInk); + } + drawCoachLine(button, transitionInk); + } + // Touch play keeps its thumbs in the bottom corners, and the fight is live + // under this screen now, so the stamp yields the pad rather than sit on it. + if (transitionAge >= 0 || socialPreview || (typeof capabilities === + "function" && capabilities().inputFamily === "touch")) return; + const titleUnixMs = runtime().unixMs || Date.now(); + const safe = hudSafeRect(); + // No frame rate under the wordmark. The read-out has one home — the + // bottom-left lane above the nameplate, where a fight already shows it — + // and a second copy parked in the middle of the poster only crowded the + // kerning cells it was sitting next to. + const clock = hudClockBox(titleUnixMs); + drawHudClock(clock, safe.top + 2, ink, titleUnixMs); + drawHudStatusTray(clock, ink, titleUnixMs); +} + +function pacificTimeLabel(unixMs) { + // The arena clock follows Pacific time without displaying a zone suffix. + const date = new Date(unixMs); + const year = date.getUTCFullYear(); + const nthSunday = (month, occurrence, hour) => { + const first = new Date(Date.UTC(year, month, 1)); + const day = 1 + ((7 - first.getUTCDay()) % 7) + (occurrence - 1) * 7; + return Date.UTC(year, month, day, hour); + }; + const daylight = unixMs >= nthSunday(2, 2, 10) && + unixMs < nthSunday(10, 1, 9); + const local = new Date(unixMs - (daylight ? 7 : 8) * 3600000); + const hour = local.getUTCHours(); + const minute = String(local.getUTCMinutes()).padStart(2, "0"); + const second = String(local.getUTCSeconds()).padStart(2, "0"); + return String(hour % 12 || 12) + ":" + minute + ":" + second; +} + +// Status indicators share one lane rather than each finding its own corner, so +// they read as a set: same cell, same row, in the title-safe frame just left of +// the wall clock. The lane is right-aligned because the clock and the round QR +// grow leftward from the same edge. +const statusGap = 6; +const statusCellSize = () => shellMode === "GAME" && debugHitboxes ? 56 : 26; + +function hudStatusIcons() { + const icons = []; + if (typeof capabilities === "function" && capabilities().midi) icons.push("midi"); + return icons; +} + +// The clock's footprint is computed once and shared, so the lane cannot drift +// out of step with where the clock actually lands. +function hudClockBox(unixMs) { + const safe = hudSafeRect(); + const label = pacificTimeLabel(unixMs); + const touch = typeof capabilities === "function" && + capabilities().inputFamily === "touch"; + const size = touch ? 16 : hudTypeSize; + const qrBox = spectatorQrBox(); + const anchor = qrBox ? qrBox.left - 14 : safe.right; + // National identity begins at this corner: the local country's flag flies + // just left of the QR and the clock lane slides over to make room. US + // first — more flags join as they are drawn. + const flagCode = typeof capabilities === "function" && + capabilities().country === "US" ? "US" : ""; + const flagWidth = flagCode ? Math.round(size * 2.1) : 0; + const right = anchor - (flagCode ? flagWidth + 12 : 0); + const dialRadius = Math.max(6, Math.round(size * .38)); + const dialGap = Math.max(5, Math.round(size * .2)); + const textRight = right - dialRadius * 2 - dialGap; + return { label, size, right, textRight, dialRadius, anchor, flagCode, + flagWidth, dialX: right - dialRadius, + left: textRight - handleWidth(label, size) }; +} + +// Old Glory at corner scale: seven stripes and a starred canton read as the +// flag long before thirteen would, and the stars stay dots — real stars need +// more pixels than the corner owns. Shadowed like the type beside it so it +// flies on any sky. +function drawUsFlag(x, y, width, height, ink) { + hudBox(x + 2, y + 2, width, height, ...contrastShadow(ink)); + const stripes = 7; + for (let stripe = 0; stripe < stripes; stripe++) { + const top = y + Math.round(stripe * height / stripes); + const bottom = y + Math.round((stripe + 1) * height / stripes); + hudBox(x, top, width, bottom - top, + ...(stripe % 2 ? [238, 242, 247] : [188, 32, 46])); + } + const cantonWidth = Math.round(width * .44); + const cantonHeight = Math.round(height * 4 / stripes); + hudBox(x, y, cantonWidth, cantonHeight, 38, 52, 122); + for (let star = 0; star < 6; star++) + filledDisc(x + Math.round(cantonWidth * (.22 + (star % 3) * .28)), + y + Math.round(cantonHeight * (star < 3 ? .3 : .7)), + Math.max(1, Math.round(height * .05)), [238, 242, 247]); +} + +function drawHudClock(clock, y, ink, unixMs) { + typeWrite(clock.label, clock.left + 3, y + 3, + clock.size, ...contrastShadow(ink)); + const match = clock.label.match(/^(\d+)(:)(\d{2})(:)(\d{2})$/); + const parts = match ? match.slice(1) : [clock.label]; + const syntax = visualTheme.light ? titlePaletteDay : titlePaletteNight; + const colors = [syntax[0], ink, syntax[1], ink, syntax[2]]; + let x = clock.left; + parts.forEach((part, index) => { + typeWrite(part, x, y, clock.size, ...(colors[index] || ink)); + x += handleWidth(part, clock.size); + }); + const centerY = y + clock.size * .48; + const seconds = ((unixMs / 1000) % 60 + 60) % 60; + const segments = 24; + const filled = seconds / 60 * segments; + filledDisc(clock.dialX + 2, centerY + 2, clock.dialRadius, + contrastShadow(ink)); + filledDisc(clock.dialX, centerY, clock.dialRadius, + mixColor([20, 24, 38], [238, 241, 247], visualTheme.light)); + for (let segment = 0; segment < Math.ceil(filled); segment++) { + const start = -Math.PI / 2 + segment / segments * Math.PI * 2; + const end = -Math.PI / 2 + Math.min(segment + 1, filled) / + segments * Math.PI * 2; + screenTriangle(clock.dialX, centerY, + clock.dialX + Math.cos(start) * clock.dialRadius, + centerY + Math.sin(start) * clock.dialRadius, + clock.dialX + Math.cos(end) * clock.dialRadius, + centerY + Math.sin(end) * clock.dialRadius, ...syntax[2]); + } + hudCircle(clock.dialX, centerY, clock.dialRadius, 2, ink); +} + +function hudStatusTray(clock = null) { + const icons = hudStatusIcons(); + if (!icons.length) return null; + const statusCell = statusCellSize(); + const safe = hudSafeRect(); + const qrBox = spectatorQrBox(); + const right = clock ? clock.left - 14 + : qrBox ? qrBox.left - 14 : safe.right; + const width = icons.length * statusCell + (icons.length - 1) * statusGap; + return { icons, right, left: right - width, top: safe.top, + height: statusCell }; +} + +// A one-octave keyboard: seven equal white keys with the black keys only on the +// boundaries that have them, so it reads as a piano at this size instead of an +// approximate smear. It brightens for a beat whenever a note leaves. +function drawStatusPiano(x, y, lit) { + const width = 21, height = 14, key = width / 7; + const left = Math.round(x - width / 2), top = Math.round(y - height / 2); + hudBox(left, top, width, height, ...(lit ? [108, 240, 168] : [176, 184, 202])); + for (const step of [1, 2, 4, 5, 6]) + hudBox(Math.round(left + step * key) - 1, top, 2, Math.round(height * .58), + 23, 27, 40); +} + +function drawHudStatusTray(clock, ink, unixMs) { + const tray = hudStatusTray(clock); + const statusCell = statusCellSize(); + // Debug is global state, so its large indicator owns bottom-center rather than + // masquerading as another peripheral in the clock-side status tray. + if (debugHitboxes && !performanceFooterVisible()) { + const safe = hudSafeRect(); + const top = safe.bottom - statusCell; + drawDebugBug(viewCenterX(), top + statusCell / 2 + 2, + statusCell / 26); + // The session's name rides beside the bug: it is what a telemetry agent + // attaches to, and debug mode is exactly the moment somebody wants to + // read that name off the screen and type it into a terminal. + if (sessionName) { + const size = Math.max(17, Math.round(statusCell * .4)); + typeWrite(sessionName, viewCenterX() + statusCell * .62, + top + statusCell / 2 + 2 - size / 2, size, ...ink); + } + // And the linked-agent mark keeps the bug company on its other side — + // @jeffrey: "can the little agent icon be near the debug ladybug, not by + // the fps". The name says where to attach; the antenna says who has. + const agents = linkedAgents(); + if (agents) { + const scale = statusCell / 34; + drawAgentLink(viewCenterX() - statusCell * .62 - 14 * scale, + top + statusCell / 2 + 2, scale, agents); + } + } + if (!tray) return; + const lit = typeof capabilities === "function" && + unixMs - (capabilities().midiPulse || 0) < 140; + tray.icons.forEach((name, index) => { + const x = tray.left + index * (statusCell + statusGap) + statusCell / 2; + const y = tray.top + tray.height / 2; + if (name === "midi") drawStatusPiano(x, y, lit); + }); +} + +function drawDebugBug(x, y, scale = 1) { + const shell = [255, 86, 126]; + const detail = [22, 12, 34]; + const limb = (x1, y1, x2, y2, width, color) => + filledCapsule(x1, y1, x2, y2, width, color); + filledDisc(x, y + 2 * scale, 8 * scale, shell); + filledDisc(x, y - 6 * scale, 5 * scale, shell); + limb(x, y - 7 * scale, x - 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x, y - 7 * scale, x + 6 * scale, y - 13 * scale, 2 * scale, shell); + limb(x - 5 * scale, y, x - 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x + 5 * scale, y, x + 11 * scale, y - 4 * scale, 2 * scale, shell); + limb(x - 5 * scale, y + 5 * scale, x - 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x + 5 * scale, y + 5 * scale, x + 11 * scale, y + 9 * scale, + 2 * scale, shell); + limb(x, y - scale, x, y + 9 * scale, 2 * scale, detail); + filledDisc(x - 2 * scale, y - 7 * scale, 1.2 * scale, detail); + filledDisc(x + 2 * scale, y - 7 * scale, 1.2 * scale, detail); +} + +// The title owns the share code; active maps keep the corner clear. +function spectatorQrBox() { + if (shellMode === "GAME") return null; + if (typeof capabilities === "function" && capabilities().socialPreview) + return null; + if (!spectatorQr || typeof spectatorQr.getModuleCount !== "function") + return null; + const safe = hudSafeRect(); + const count = spectatorQr.getModuleCount(); + const quiet = 2; + const cell = Math.max(2, + Math.floor((compactLayout() ? 108 : 158) / (count + quiet * 2))); + const size = (count + quiet * 2) * cell; + // The QR anchors on the safe rect's top-right corner — the exact spot the + // debug overlay draws its yellow corner crop. With the bug lit the + // instrument wins: the code steps below the crop instead of covering it, + // and every lane that asks this box (the clock included) follows it down. + const top = safe.top + (debugHitboxes ? 52 : 0); + return { left: safe.right - size, top, size, cell, count, quiet }; +} + +// Where the bare frame rate shows with the overlay off: the console, in a +// fight. The debug read-out itself never asks which screen it is on. +const bareFrameRateShown = () => nativeTrianglePass && shellMode === "GAME"; +function drawDebugPerformance(ink) { + // The wordmark screen used to hide this row, but the title is a running + // fight with a frame budget of its own — debug mode reads the machine, not + // the match, so the numbers stay up wherever the bug is lit. Only a round's + // result card still clears the lane, because the card owns it. + if (roundResult) return; + // The console keeps a bare frame rate on the HUD through a fight even + // with the debug overlay off — @jeffrey, 2026-09-20: "when game is + // playing lets still show fps in hud". One short word, so the read-out + // costs the frame it measures almost nothing. + const bare = !debugHitboxes; + if (bare && !bareFrameRateShown()) return; + const metaSize = debugReadoutMetaSize(); + const run = runtime(); + // Every line waits for a real measurement. The read-out used to answer with + // the logical stage size, the measured frame rate wearing a Hz label, and a + // row of zeroed milliseconds — three numbers that looked like instruments and + // were not. The browser now times its own frame span and its own paint, so it + // fills the rate and two of the three stages honestly; the render surface is + // still the console's alone, and a browser can never time the compositor's + // present, so that stage stays out of the row rather than reading 0.00ms. + // Native frameMs measures the whole host frame. Its legacy refreshHz + // field is also measured FPS, not the display mode's refresh rate. + const measuredFrameMs = Number(run.frameMs) || 0; + const measuredFps = measuredFrameMs > 0 ? 1000 / measuredFrameMs : displayFps; + const rate = Math.round(measuredFps || 0) + " fps"; + if (bare) { + const lane = playerHandleLayout(players[0], 0); + typeWrite(rate, lane.x, lane.y - metaSize - 6, metaSize, ...ink); + return; + } + const renderWidth = Math.round(Number(run.renderWidth) || Number(run.width) || 0); + const renderHeight = Math.round(Number(run.renderHeight) || Number(run.height) || 0); + const aa = Math.max(1, Math.round(Number(run.antialiasingSamples) || 1)); + const surface = renderWidth && renderHeight + ? " · " + renderWidth + "x" + renderHeight + " · " + + String(run.antialiasingMode || (aa + "x")) : ""; + const frameMs = Number(run.frameMs) || 0; + const presentMs = Number(run.presentMs) || 0; + const timing = frameMs + ? "frame " + frameMs.toFixed(2) + "ms render " + + (Number(run.renderCpuMs) || 0).toFixed(2) + "ms" + + (presentMs ? " present " + presentMs.toFixed(2) + "ms" : "") : ""; + // The bottom-left corner belongs to a fighter's nameplate, so the read-out + // stacks upward from just above it instead of printing across a handle. The + // ammo row keeps its own lane a stat card further up, well clear of this. + const lane = playerHandleLayout(players[0], 0); + let y = lane.y - metaSize - 6; + // One line of proof per debug toggle: the console renders this read-out + // where no devtools can confirm it, so the Device Portal log gets told the + // row was actually drawn, with what, and where. + if (!debugPerfReported) { + debugPerfReported = true; + telemetry("FIGHT_DEBUG_PERF", rate + (timing ? " | " + timing : "") + + " | lane=" + Math.round(lane.x) + "," + Math.round(y) + + " session=" + sessionName); + } + for (const [index, label] of [rate + surface, timing].entries()) { + if (!label) continue; + const size = index ? debugReadoutTimingSize() : metaSize; + typeWrite(label, lane.x, y, size, ...ink); + y -= size + 5; + } +} + +// How many telemetry watchers are reading this round. The relay counts +// `role=agent` sockets apart from phone spectators and tells the publishing +// game; a host that has not wired that up answers nothing and the mark stays +// off. Note this can only ever see the live socket: the console's +// AC_NATIVE_PROFILE line goes out one way through OutputDebugStringA, so a +// Device Portal reading it is invisible from in here. +function linkedAgents() { + if (typeof capabilities !== "function") return 0; + return Math.max(0, Math.round(Number(capabilities().liveAgents) || 0)); +} + +// @jeffrey: "if we are in debug mode and reading telemetry on a device can we +// show a little agent icon to show our linked in connection on the telemetry of +// that round". An antenna'd head, so it cannot be read as the debug bug beside +// it or as one more human in the grandstand — a phone that scanned the round QR +// is a viewer and lights nothing here. The mark means a machine is reading +// these numbers right now. +function drawAgentLink(x, y, scale = 1, count = 1) { + const shell = [120, 226, 255]; + const detail = [10, 16, 30]; + // Antenna first so the head caps its stalk: the bulb on the air is the + // "linked" half of the mark and the head is the "agent" half. + filledCapsule(x, y - 5 * scale, x, y - 10 * scale, 1.6 * scale, shell); + filledDisc(x, y - 11 * scale, 2.2 * scale, shell); + filledCapsule(x - 4 * scale, y, x + 4 * scale, y, 12 * scale, shell); + filledDisc(x - 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledDisc(x + 3 * scale, y - 1.5 * scale, 1.7 * scale, detail); + filledCapsule(x - 3 * scale, y + 3 * scale, x + 3 * scale, y + 3 * scale, + 1.6 * scale, detail); + // A second watcher is rare enough to say plainly rather than by stacking + // heads sideways across a read-out that has no room for them. + if (count > 1) typeWrite(String(count), x + 13 * scale, y - 6 * scale, + Math.max(12, Math.round(13 * scale)), ...shell); +} + +// Connection health, as four bars and one number — the thing every online +// game owes a player and oskiewar had no way to say. @jeffrey: "can we show a +// connection health like wifi meter, on the top right of the game". +// +// The number is whatever this seat can honestly measure, which is not the same +// on both lanes: +// +// A rollback fight knows its round trip exactly (see netSendInputs: our own +// wall mark comes home on the rival's next packet), so it reports ping. +// A grandstand or an older-build guest never gets a packet back, so it can +// only measure the wire it is being served: how irregular the frames are and +// how many of them the relay ate. It reports jitter, and loss when there is +// any. +// A host in the streamed lane hears the rival only through pads, so its one +// honest reading is how long ago the last one arrived. +// +// Nothing is invented. A lane with no rival on it draws nothing at all. +const netHealthPalette = [[245, 90, 96], [250, 200, 80], [180, 235, 120], + [108, 240, 168]]; + +function netHealth() { + if (netSession) { + const stats = netSession.stats; + const ping = Math.round(stats.pingMs || 0); + // Nothing has come home yet; a meter that reads four bars before it has + // measured anything is a lie told at exactly the moment somebody is + // deciding whether the connection is good. + let bars = !stats.pings ? 0 + : ping < 50 ? 4 : ping < 100 ? 3 : ping < 170 ? 2 : 1; + // A desync means the two machines are no longer playing the same fight. + // The wire may be fast and the connection is still not healthy. + if (bars && stats.desyncs) bars = Math.min(bars, 1); + return { bars, label: stats.pings ? ping + "MS" : "···", + note: stats.desyncs ? "DESYNC" : "" }; + } + if (roundViewerMode === "LIVE" && roundViewerFrames.length) { + const jitter = Math.round(roundViewerJitterMs); + const loss = roundViewerLossPct; + const bars = jitter < 12 && loss < 3 ? 4 + : jitter < 30 && loss < 10 ? 3 + : jitter < 60 && loss < 25 ? 2 : 1; + return { bars, label: "±" + jitter + "MS", + note: loss ? loss + "% LOST" : "" }; + } + // The host's side of a streamed fight. Only while somebody is actually + // sitting in the second chair — an empty room has no connection to rate. + if (versusLane() && !roundViewer) { + const remote = globalThis.__oskiewarRemotePad; + if (!remote || !Number.isFinite(remote.at)) return null; + const age = Date.now() - remote.at; + if (age > versusChallengerGraceMs) return null; + return { bars: age < 150 ? 4 : age < 400 ? 3 : age < 1000 ? 2 : 1, + label: age + "MS", note: "" }; + } + return null; +} + +// Where the meter stands, and whether it stands at all. Split out so the rest +// of the top-right corner can measure around it: with no QR up the meter owns +// that corner, and a label that assumed the corner was free landed on it. +function netHealthBox() { + if (typeof capabilities === "function" && + (capabilities().socialPreview || capabilities().replayOven === true)) + return null; + if (shellMode !== "GAME") return null; + const health = netHealth(); + if (!health) return null; + const safe = hudSafeRect(); + const qr = spectatorQrBox(); + const compact = compactLayout(); + const bar = compact ? 5 : 7; + const gap = compact ? 3 : 4; + const tall = compact ? 19 : 26; + const count = 4; + const width = count * bar + (count - 1) * gap; + // Under the code, never over it: the QR is the address a friend types and + // the meter is a readout about the friend who already did. + const top = (qr ? qr.top + qr.size + 8 : safe.top) + 2; + // Sized off the bars rather than the HUD's own type scale: the reading is a + // caption to the meter, and at hudTypeSize it swamped the thing it labels. + const size = Math.max(14, Math.round(tall * .8)); + const label = health.note ? health.label + " " + health.note : health.label; + return { health, bar, gap, tall, count, width, top, base: top + tall, + right: safe.right, left: safe.right - Math.max(width, + handleWidth(label, size)), size, label }; +} + +// The left edge of whatever owns the top-right corner — the round's QR, or +// the connection meter when no code is up. Anything else that wants to sit up +// there measures from here instead of from the safe rect, or it draws on top +// of the corner's furniture. +function hudTopRightLeft() { + const qr = spectatorQrBox(); + if (qr) return qr.left; + return netHealthBox()?.left ?? hudSafeRect().right; +} + +function drawNetHealth(ink) { + const box = netHealthBox(); + if (!box) return; + const { health, bar, gap, tall, count, width, base, right, size, label } = box; + const lit = netHealthPalette[Math.max(0, health.bars - 1)]; + const dim = mixColor([58, 64, 78], [196, 201, 212], visualTheme.light); + const previousDepth = triangleDepth; + triangleDepth = -1.43; + for (let index = 0; index < count; index++) { + const height = Math.round(tall * (index + 1) / count); + const x = right - width + index * (bar + gap); + screenRect(x + 2, base - height + 2, bar, height, [24, 26, 34]); + screenRect(x, base - height, bar, height, + index < health.bars ? lit : dim); + } + const labelWidth = handleWidth(label, size); + const labelY = base + 7; + typeWrite(label, right - labelWidth + 2, labelY + 2, size, + ...contrastShadow(ink)); + typeWrite(label, right - labelWidth, labelY, size, + ...(health.note ? netHealthPalette[0] : ink)); + triangleDepth = previousDepth; +} + +function drawMapName(ink) { + const safe = hudSafeRect(), health = netHealthBox(), qr = spectatorQrBox(); + const label = currentMapName.toLowerCase(); + let size = compactLayout() ? 22 : 26; + while (size > 14 && handleWidth(label, size) > (safe.right - safe.left) * .35) size--; + const x = safe.right - handleWidth(label, size); + // Stack below connection/QR furniture; keep the center clear all round. + const y = Math.max(safe.top + 8, + health ? health.base + health.size + 21 : 0, + qr ? qr.top + qr.size + 14 : 0); + typeWrite(label, x + 2, y + 2, size, ...contrastShadow(ink)); + typeWrite(label, x, y, size, ...ink); +} + +function drawSpectatorQr(ink, placement = null) { + if (typeof globalThis.__oskiewarJevPad === 'function') return; + if (typeof capabilities === "function" && capabilities().socialPreview) return; + const qr = placement || spectatorQrBox(); + if (!qr) return; + const { count, quiet, cell, size, left, top } = qr; + // National identity flies beside the code, wherever the code goes. US + // first — more flags join as they are drawn. Reel placements opt out with + // the rest of the HUD furniture. + if (!placement && typeof capabilities === "function" && + capabilities().country === "US") + drawUsFlag(left - Math.round(hudTypeSize * 2.1) - 12, top + 2, + Math.round(hudTypeSize * 2.1), Math.round(hudTypeSize * 1.2), ink); + const shadow = [24, 26, 34]; + const previousDepth = triangleDepth; + triangleDepth = -1.43; + screenRect(left + 3, top + 3, size, size, shadow); + screenRect(left, top, size, size, [250, 250, 247]); + // Dark modules coalesce into horizontal runs so a full code stays a few + // dozen faces instead of a few hundred — drawErrorQr already draws this way. + const dark = [7, 8, 14]; + for (let row = 0; row < count; row++) { + let run = 0; + for (let column = 0; column <= count; column++) { + if (column < count && spectatorQr.isDark(row, column)) { run++; continue; } + if (run) screenRect(left + (column - run + quiet) * cell, + top + (row + quiet) * cell, run * cell, cell, dark); + run = 0; + } + } + triangleDepth = previousDepth; +} + +// Framing marks rather than a full box: the corners state the bounds without +// drawing four lines through the fight. +function drawCornerCrops(rect, reach, width, color) { + const arm = Math.min(reach, (rect.right - rect.left) / 3, + (rect.bottom - rect.top) / 3); + for (const [x, towardX] of [[rect.left, 1], [rect.right, -1]]) + for (const [y, towardY] of [[rect.top, 1], [rect.bottom, -1]]) { + filledCapsule(x, y, x + towardX * arm, y, width, color); + filledCapsule(x, y, x, y + towardY * arm, width, color); + } +} + +function drawImpacts() { + for (const impact of impacts) { + if (impact.explosion && impact.blastRadius) { + const age = clamp(1 - impact.life / impact.duration, 0, 1); + const center = projectPoint(impact.x, impact.y - 3, impact.z || 0); + const edge = projectPoint(impact.x + impact.blastRadius, + impact.y - 3, impact.z || 0); + const radius = Math.abs(edge.x - center.x); + if ([center.x, center.y, radius].every(Number.isFinite) && radius < 4000) { + filledRing(center.x, center.y, radius, + Math.max(0, radius - Math.max(7, 22 * (1 - age))), + mixColor([255, 218, 86], [111, 74, 48], age)); + const shockRadius = radius * (.18 + age * .72); + filledRing(center.x, center.y, shockRadius, + Math.max(0, shockRadius - Math.max(4, 13 * (1 - age))), + mixColor([255, 246, 184], [164, 92, 52], age)); + } + } + for (const mote of impact.debris || []) { + const point = projectPoint(mote.x, mote.y, mote.z); + const radius = Math.max(2, mote.radius * cameraScale()); + if (![point.x, point.y, radius].every(Number.isFinite) || + Math.abs(point.x) > 30000 || Math.abs(point.y) > 30000) continue; + filledDisc(point.x, point.y, radius, + impact.death ? [255, 105, 190] : [255, 232, 92]); + } + } +} + +function drawDetachedPart(fragment) { + const first = projectPoint(fragment.x1, fragment.y1, fragment.z1); + const second = projectPoint(fragment.x2, fragment.y2, fragment.z2); + const width = Math.max(2, fragment.width * cameraScale()); + const values = [first.x, first.y, second.x, second.y, width]; + if (!values.every(Number.isFinite) || width > 2000) return; + const margin = width + 4; + if (Math.abs(first.x) + margin > 30000 || + Math.abs(first.y) + margin > 30000 || + Math.abs(second.x) + margin > 30000 || + Math.abs(second.y) + margin > 30000 || + Math.hypot(second.x - first.x, second.y - first.y) > 30000) return; + if (photoThemeActive) { + // Ownership changes when a limb is hit; its material keeps its source color. + const seat = fragment.color[1] > fragment.color[0] ? 1 : 0; + photoLimb({x1:first.x,y1:first.y,x2:second.x,y2:second.y,width}, seat); + return; + } + filledCapsule(first.x, first.y, second.x, second.y, width + 3, [9, 12, 22]); + drawPaletteCapsule({ x1: first.x, y1: first.y, x2: second.x, y2: second.y, + width, part: fragment.part }, fragment.colors, + fragment.paletteCoordinate || 0, fragment.color); +} + +function drawSafeZones() { + if (!debugHitboxes || renderFlags.hud === false) return; + drawCornerCrops(hudSafeRect(), 46, 3, [255, 214, 84]); + drawCornerCrops(actionSafeRect(), 34, 2, [105, 255, 118]); +} + +// The head is the second door on the title screen. START is still anywhere — +// `tapTitle` in the shell makes the whole frame the button — so the one place +// that must NOT start a fight is the face, because that is where a player who +// wants to BE the fighter is already looking. The game publishes the head's +// screen circle and the shell hit-tests it ahead of the anywhere-button; the +// ring is drawn here rather than in the shell because only the game knows +// where the head went this frame. +// +// Nothing is drawn unless a wizard is actually mounted (`__oskiewarWizard`), +// so the Xbox and the reel renderer — which have no DOM to open — never show +// an affordance that would dud. +function drawTitleHeadDoor(t, ink, suppressed) { + const touch = globalThis.__oskiewarTouch; + if (!touch) return; + const onTitle = shellMode === "MENU" && titleTransitionAt === null; + if (!onTitle || suppressed || !globalThis.__oskiewarWizard) { + if (touch.titleHead) touch.titleHead = null; + return; + } + // Only over a seat that is actually yours. The attract loop's "action" + // variant dresses BOTH fighters as bots (`beginTraining`), and a ring that + // says "add yourself" on a bot's head invites a player to replace somebody + // who was never there. No local body on screen, no door. + const seat = players[0]; + if (!seat || !seat.alive || seat.npc || seat.bot) { touch.titleHead = null; return; } + const head = runnerWorldGeometry(seat, t).head; + if (!head) { touch.titleHead = null; return; } + // Radius in screen units is measured, not guessed: the title camera pushes + // in and out across the attract loop, and a fixed pixel radius would drift + // off the face. Same idiom the killcam tears use. + const point = projectPoint(head.x, head.y, head.z); + const edge = projectPoint(head.x + head.radius, head.y, head.z); + const radius = Math.max(9, Math.hypot(edge.x - point.x, edge.y - point.y)); + const reach = radius * 1.22; + touch.titleHead = { x: point.x, y: point.y, radius: reach }; + // On the screen-UI lane, so a fighter standing in front of their own face + // cannot draw through the invitation. + triangleDepth = -1.42; + const pulse = (Math.sin(t * 2.4) + 1) / 2; + // Gold on its own rather than mixed toward the title ink: ink is near-white + // on the night sky and near-black at noon, so mixing gave a different — and + // on the light theme, muddy — colour every hour. The dark under-ring is what + // carries it across both, the same trick the type beside it uses. + const glow = mixColor([230, 205, 92], [255, 250, 226], pulse * .55); + const stroke = Math.max(1.5, radius * .085); + hudCircle(point.x, point.y, reach, stroke * 2.1, [16, 20, 34]); + hudCircle(point.x, point.y, reach, stroke, glow); + // The words ride a plate. A meditating fighter fills the whole column under + // their own chin, so unplated type landed on shoulders and arms and read as + // part of the body; the plate is dark on both themes because the gold is. + const label = "add yourself"; + const size = Math.max(11, Math.round(radius * .44)); + const width = handleWidth(label, size); + const padX = Math.round(size * .55), padY = Math.round(size * .34); + const left = point.x - width / 2; + const top = point.y + reach + size * .45; + hudBox(left - padX, top - padY, width + padX * 2, size + padY * 2, 16, 20, 34); + typeWrite(label, left, top, size, ...glow); +} + +function gamePaint() { + syncGameView(); + globalThis.__oskiewarLocalVersus = localVersusActive(); + const run = runtime(); + if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.screen = shellMode === "MENU" + ? titleTransitionAt !== null ? "title-transition" : "title" + : selecting ? "select" : "game"; + } + // Each fighter's cues sit where the fighter stands — @jeffrey: "can audio + // be mixed according to the player's position, stereo, for each player, if + // its not local multiplayer". Two humans on one couch share one speaker + // image, so their mix stays centered; against the machine — or a rival on + // the far end of a wire — the stage pans. + const couchVersus = !players[1].npc && !players[1].bot && + !players[1].remote && !selfPlay; + globalThis.__oskiewarPlayerPans = players.map((player) => couchVersus ? 0 : panPlayer(player)); + // The shell's resolution governor steers by this — the game's own measured + // rate, because the host's profile numbers never made it off the Xbox. + globalThis.__oskiewarDisplayFps = displayFps; + const paintAt = run.paintMonotonicUs ?? run.monotonicUs; + if (lastPaintAt > 0 && paintAt > lastPaintAt) { + const sample = clamp(1000000 / (paintAt - lastPaintAt), 1, 240); + displayFps = displayFps ? lerp(displayFps, sample, .12) : sample; + } + lastPaintAt = paintAt; + const t = (run.monotonicUs - startedAt) / 1000000; + if (typeof ac === "function") acFeed = ac(); + syncSignedInFighter(); + const localNation = typeof capabilities === "function" + ? String(capabilities().country || "").toUpperCase() : ""; + if (/^[A-Z]{2}$/.test(localNation)) { + players[0].nation = localNation; + if (!players[1].npc) players[1].nation = localNation; + } + // The remote rival's wardrobe came up the wire, not out of the roster — + // a profile lookup here would answer empty and strip them every frame. + for (const player of players) + if (!player.remote) player.handleColors = fighterProfile(player.name).colors; + visualTheme = displayTheme(); + const replayOven = typeof capabilities === "function" && + capabilities().replayOven === true; + const reelHud = typeof capabilities === "function" && + capabilities().reelHud === true; + const matchHud = !replayOven || reelHud; + // A reel is watched at arm's length with no controller in hand, and the + // corner furniture a player needs — nameplates, stats, inventory, the + // command stream — crowds a 9:16 crop and competes with the fight for the + // eye. So a reel carries no HUD at all while the round is live, and states + // the outcome afterward in the middle of the frame, one line at a time. + const reelMinimal = replayOven && reelHud && + capabilities().reelFullUi !== true; + triangleDepth = -1.4; + // The station uses a plain light or dark backdrop matching the HUD theme. + const space = !survivalActive(); + const mapColors = roundMapColors[Math.max(0, roundMapIds.indexOf(currentMapId))]; + const skyDay = mixColor([176, 215, 245], [255, 160, 112], + visualTheme.sunset * .7); + const sky = space ? mixColor(mapColors.night, mapColors.sky, visualTheme.light) + : mixColor([7, 8, 28], skyDay, visualTheme.light); + // Match the clear color to the arena sky. Camera framing can reveal the + // clear layer during a jump; a different clear color looked like a flash. + const outside = sky; + // Keep the room's planes materially distinct: blue atmosphere, warm plaster + // behind the fighters, and green earth under them. Day/night can tint the + // palette without washing every surface into the same gray. + const arenaDay = mixColor([244, 211, 178], [235, 154, 150], + visualTheme.sunset * .48); + const arena = mixColor([24, 18, 42], arenaDay, visualTheme.light); + // Pale steel in light mode stays distinct from the brighter backdrop. + const groundDay = mixColor([142, 184, 116], [190, 151, 103], + visualTheme.sunset * .38); + const ground = space + ? mixColor(mapColors.floor.map(c => Math.round(c * .32)), mapColors.floor, visualTheme.light) + : mixColor([13, 25, 29], groundDay, visualTheme.light); + // The floating decks are steel with a lit edge. The plate itself stays + // near the hull's own value — a near-white slab against vacuum reads as a + // UI bar laid over the game rather than as a thing in it — and the LIP + // carries the brightness instead, which is the part a player actually has + // to judge. On plaster the relationship is the other way round: the deck is + // the pale thing and the lip is the dark line under it, because there the + // background is what is bright. + const platformColor = space + ? mixColor(mapColors.deck.map(c => Math.round(c * .42)), mapColors.deck, visualTheme.light) + : mixColor([24, 29, 46], [211, 198, 171], visualTheme.light); + const titleInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + const statusShadow = contrastShadow(titleInk); + const menuArena = mixColor([7, 10, 26], [235, 241, 248], visualTheme.light); + const menuPanel = mixColor([20, 28, 56], [215, 225, 239], visualTheme.light); + const menuInk = mixColor([245, 248, 255], [24, 35, 72], visualTheme.light); + renderFlags = globalThis.__oskiewarRenderFlags || renderFlags; + wipe(...outside); + if (photoThemeActive) { + themeSprite(0,0,0,1672,941,viewCenterX(),viewHeight/2, + viewWidth(),viewHeight,0,false,photoBackdropDepth); + } else if (renderFlags.sky !== false) drawSkyAtmosphere(sky, arena); + if (PAL_SELECT && selecting) { + box(0, 0, viewWidth(), viewHeight, ...menuArena); + drawSelectionScreen(t, menuInk, menuPanel); + return; + } + const cinematicAge = deathCinematicAge(run.monotonicUs); + const introAge = run.monotonicUs - roundStartedAt; + const inRoundIntro = !roundResult && introAge >= 0 && + introAge < roundIntroDurationUs(); + // The intro deliberately owns its lens: wide title, two face portraits, + // then a pullback. Final-frame containment would widen every portrait until + // both fighters fitted, erasing the zoom story it was meant to protect. + if (!inRoundIntro && (cinematicAge < 0 || cinematicAge >= 1.45)) + containFighters(t); + cameraDoll.prepare(); + const { left: spanLeft, right: spanRight, + top: spanTop, bottom: spanBottom } = terrainSpan(); + if (!airRoundActive()) drawRoomSurfaces(spanLeft, spanRight, spanTop, spanBottom, arena); + // The reel camera puts the floor's own front edge (worldNear) in front of + // the lens, where it crosses the frame as a hard horizontal step with the + // skirt showing under it. Extending the slab past the camera hands the cut + // to the near plane, which faces already handle correctly, so the ground + // reads as ground all the way down the frame. Past the camera means PAST + // THE CAMERA — a fixed extension was still shy of the wide fight shot, + // which stands several thousand units back, and the step came back on + // every wide frame. Reels only: on the TV lens the visible front edge IS + // the padded-room look. + const groundNear = reelGroundCamera() + ? Math.min(worldNear, cameraDoll.position.z - 400) : worldNear; + if (airRoundActive()) drawAirDropSky(t); + else { + drawTerrainBackWall(spanLeft, spanRight, worldFar, ground); + drawTerrainSurface(spanLeft, spanRight, groundNear, worldFar, ground); + drawTerrainFrontWall(spanLeft, spanRight, groundNear, ground); + drawSkateParkFeatures(); + } + // No grass in vacuum. The blades were the tower's lawn and the cube kept + // them out of habit; on a hull they read as moss on a spaceship. + if (renderFlags.grass !== false && !space) + drawTerrainGrass(spanLeft, spanRight, ground); + if (!airRoundActive()) drawBoosterPad(t); + const platformNear = -520; + const platformFar = 520; + // A rung wants to be a slab, but the stage paints in order with no depth + // buffer — the volume's faces landed over the fighters on console. So each + // one is a plane plus a front-edge line: the plane is the deck a fighter + // stands on, and the line is the lip, which is what keeps a rung readable + // when the camera happens to sit at its height and the deck goes edge-on. + // The line rides the line layer, so twelve rungs cost twenty-four faces and + // the lips cost none. The span clamp is the same one the terrain uses, and + // in a room this size its 2600-unit apron usually covers everything — it is + // here to bound the worst case, not because it culls much today. + const ledgeInk = space + ? mixColor(platformColor, [196, 224, 255], .62) + : mixColor(platformColor, [26, 24, 34], .42); + if (platformsEnabled()) for (const ledge of activeLedges()) { + if (ledge.right < spanLeft || ledge.left > spanRight) continue; + if (ledge.y < spanTop || ledge.y > spanBottom) continue; + const ledgeLeft = Math.max(ledge.left, spanLeft); + const ledgeRight = Math.min(ledge.right, spanRight); + if (ledgeLeft >= ledgeRight) continue; + const photoLedge = photoThemeActive && photoSurface("concrete", + projectPoint(ledgeLeft,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformNear), + projectPoint(ledgeRight,ledge.y,platformFar), + projectPoint(ledgeLeft,ledge.y,platformFar)); + if (!photoLedge) worldQuad( + { x: ledgeLeft, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformNear }, + { x: ledgeRight, y: ledge.y, z: platformFar }, + { x: ledgeLeft, y: ledge.y, z: platformFar }, platformColor); + worldLine(ledgeLeft, ledge.y, platformNear, + ledgeRight, ledge.y, platformNear, 5, ledgeInk); + } + if (workshopHighlight && globalThis.__oskiewarWorkshopEnabled) { + for (const player of players) { + const x = player.spawnX, y = terrainFloorAt(x); + const ink = player.pad === 0 ? [80, 240, 255] : [255, 100, 210]; + worldLine(x - 55, y - 4, -50, x + 55, y - 4, -50, 6, ink); + worldLine(x, y, 0, x, y - 240, 0, 6, ink); + worldLine(x, y - 240, 0, x + 65, y - 210, 0, 6, ink); + } + } + drawSurvivalLava(t); + const shadowInk = mixColor([3, 5, 14], [92, 99, 101], + visualTheme.light * .72); + if (renderFlags.shadows !== false && !airRoundActive()) { + for (const player of activePlayers()) + if (player.alive || roundResult) + drawSpotShadow(player.x, player.y, player.z, player.ducking ? 52 : 64, + shadowInk); + for (const item of balls) + if (item.active) + drawSpotShadow(item.x, item.y, item.z, item.radius * 1.18, shadowInk); + } + const windInk = windDirection < 0 + ? mixColor([72, 174, 255], [28, 88, 188], visualTheme.light) + : mixColor([255, 92, 132], [184, 35, 62], visualTheme.light); + if (WIND_FLAG && shellMode === "GAME") drawWindFlag(t, windInk); + // The round keeps match time and spectator state only. Time of day belongs + // to the title screen; carrying it into gameplay confused two unrelated + // clocks and spent the top-right lane on non-match information. + if (matchHud && !reelMinimal && shellMode === "GAME" && gameplayStarted) { + const timedRound = roundIsTimed(); + const remainingSeconds = roundResult || !timedRound ? 0 : Math.max(0, + Math.ceil((roundDurationUs - roundElapsedUs) / 1000000)); + const timerText = !roundResult && timedRound + ? String(remainingSeconds).padStart(2, "0") : ""; + const hud = hudSafeRect(); + const timerSize = hudTypeSize; + if (timerText) { + const timerWidth = handleWidth(timerText, timerSize); + const timerDanger = timedRound && remainingSeconds > 0 && + remainingSeconds <= 10; + const timerShake = timerDanger + ? Math.sin(t * 35) * (11 - remainingSeconds) * .45 : 0; + const timerInk = timerDanger + ? mixColor(titleInk, [235, 38, 58], (11 - remainingSeconds) / 10) + : titleInk; + typeWrite(timerText, viewCenterX() - timerWidth / 2 + timerShake, + hud.top + 2, timerSize, ...timerInk); + } + if (roundViewer) { + const viewerLabel = roundViewer.seat === "challenger" + ? roundViewerMode === "LIVE" ? "VS" : "WAITING FOR HOST" + : roundViewerMode || roundViewerStatus; + // Left of the corner's furniture, never on it: that corner is the + // round's QR, or the connection meter when there is no code up. + const labelSize = 24; + const labelRight = hudTopRightLeft() - 14; + typeWrite(viewerLabel, + labelRight - handleWidth(viewerLabel, labelSize), hud.top + 7, + labelSize, ...(roundViewerMode === "LIVE" ? [210, 42, 62] : titleInk)); + // The chair-holder plays through this feed: say which body is theirs + // while the matchup is still fresh, then get out of the fight's way. + if (roundViewer.seat === "challenger" && roundViewerMode === "LIVE" && + t < 8) { + const seatLine = "YOU ARE " + + (players[1].name || "THE SECOND FIGHTER") + " — RIGHT SIDE"; + const seatSize = compactLayout() ? 13 : 17; + const seatWidth = handleWidth(seatLine, seatSize); + typeWrite(seatLine, viewCenterX() - seatWidth / 2, + hud.top + hudTypeSize + 16, seatSize, ...titleInk); + } + } + const nowMs = run.unixMs || Date.now(); + drawHudStatusTray(null, titleInk, nowMs); + const updateReady = typeof capabilities === "function" && + capabilities().updateReady === true; + if (updateReady) { + const label = "update ready"; + const size = Math.round(hudTypeSize * .58); + const width = handleWidth(label, size); + const x = hudTopRightLeft() - 14 - width; + const y = hud.top + hudTypeSize + 12; + typeWrite(label, x + 2, y + 3, size, ...contrastShadow(titleInk)); + typeWrite(label, x, y, size, ...titleInk); + if (globalThis.__oskiewarTouch) + globalThis.__oskiewarTouch.updateButton = + { x: x - 8, y: y - 6, width: width + 16, height: size + 12 }; + } else if (globalThis.__oskiewarTouch) { + globalThis.__oskiewarTouch.updateButton = null; + } + } + if (!survivalActive()) { + for (const tree of bodyTrees) drawBodyTree(tree, t); + for (const pickup of gunPickups) drawGunPickup(pickup, t); + for (const pickup of saberPickups) drawSaberPickup(pickup, t); + for (const pickup of grenadePickups) drawGrenadePickup(pickup, t); + } + const showRunnerLabels = matchHud && !reelMinimal && + (Boolean(roundResult) || introAge >= roundIntroDurationUs()); + const viewDirection = normalize3({ + x: cameraDoll.target.x - cameraDoll.position.x, + y: cameraDoll.target.y - cameraDoll.position.y, + z: cameraDoll.target.z - cameraDoll.position.z, + }); + const renderables = [ + ...bullets.map((item) => ({ + kind: "bullet", item, x: item.x, y: item.y, z: item.z })), + ...grenades.filter((item) => item.alive).map((item) => ({ + kind: "grenade", item, x: item.x, y: item.y, z: item.z })), + ...balls.filter((item) => item.active).map((item) => ({ + kind: "ball", item, x: item.x, y: item.y, z: item.z })), + ...detachedParts.map((item) => ({ kind: "detached", item, + x: (item.x1 + item.x2) / 2, y: (item.y1 + item.y2) / 2, + z: (item.z1 + item.z2) / 2 })), + // Both fighters are always in this list. A fighter is never removed from + // the frame to make a camera move work — the shot is what moves. + ...activePlayers().map((item) => ({ + kind: "player", item, x: item.x, y: item.y, z: item.z })), + ]; + const depth = (item) => dot3({ + x: item.x - cameraDoll.position.x, + y: item.y - cameraDoll.position.y, + z: item.z - cameraDoll.position.z, + }, viewDirection); + renderables.sort((a, b) => depth(b) - depth(a)); + for (const renderable of renderables) { + triangleDepth = projectPoint(renderable.x, renderable.y, renderable.z).z; + if (renderable.kind === "bullet") drawBullet(renderable.item); + else if (renderable.kind === "grenade") drawGrenade(renderable.item); + else if (renderable.kind === "ball") drawBall(renderable.item); + else if (renderable.kind === "detached") drawDetachedPart(renderable.item); + else { + drawDiveMotion(renderable.item, t); + drawDoubleJumpMotion(renderable.item, t); + drawRunner(renderable.item, t, showRunnerLabels); + } + } + // Debug geometry sits above the world but below the -1.42 screen-UI lane. + // It must remain visible through fighter bodies without cutting across the + // title, controls, command notation, names, clock, or other HUD furniture. + triangleDepth = -1.4; + drawDebugHitboxes(players[0], t); + if (!survivalActive()) for (const player of players.slice(1)) drawDebugHitboxes(player, t); + for (const player of players) drawBotScene(player); + drawBallHitboxes(); + drawSafeZones(); + triangleDepth = -1.42; + // On the SCREEN UI layer, not the debug-geometry one above it. The meter is + // an instrument being read rather than scenery in the room, and the layering + // test is what caught it sitting at the debug depth where a tall enough + // piece of world could have drawn straight through it. + drawFrameMeter(); + drawImpacts(); + drawTitleHeadDoor(t, titleInk, reelMinimal); + const counting = !roundResult && introAge < roundIntroDurationUs(); + // The matchup card announces two names in the middle of the screen, which + // is exactly where the wordmark sits. On the entry fight the word wins. + if (matchHud && !reelMinimal && counting && shellMode === "GAME") + survivalActive() + ? drawSurvivalIntro(titleInk, statusShadow) + : drawFightIntro(introAge / 1000000, titleInk, statusShadow); + // The keys belong wherever a newcomer is looking: under the wordmark on the + // way in, and again while a round counts itself off. Self-play has no + // newcomer — two bots need no tutorial, and neither does a reel of them. + // The legend is the stable key for the score written beneath it. Keep it + // present throughout every player-controlled screen; only unattended bot + // self-play and marketing reels have no learner to serve. + if (!replayOven && !selfPlay && renderFlags.keys !== false) + drawControlLegend(titleInk); + const resultUiReady = cinematicAge < 0 || cinematicAge >= 1.1; + // A reel opens on the matchup. Both names, both palettes, stacked up top + // where the fighters are not — a stranger scrolling past should know who is + // who before the first hit lands. It clears out early so the round itself + // still plays under nothing at all. + if (reelMinimal && shellMode === "GAME" && !roundResult && + introAge / 1000000 < REEL_MATCHUP_SECONDS) { + const nameSize = compactLayout() ? 40 : 54; + const top = Math.round(viewHeight * .14); + const names = activePlayers(); + for (let side = 0; side < names.length; side++) { + drawReelName(String(names[side].name).toLowerCase(), + top + side * Math.round(nameSize * 1.5), nameSize, names[side], t); + } + } + if (matchHud && survivalActive() && shellMode === "GAME" && + gameplayStarted && !roundResult && !counting) + drawSurvivalHud(titleInk); + if (survivalActive() && roundResult && resultUiReady) { + drawSurvivalResult(titleInk, statusShadow); + } else if (reelMinimal && roundResult && resultUiReady) { + // One fact, in the middle of the frame: who won. The recording stops on + // the result card, so anything queued behind the name would never survive + // the trim — and a name alone is the whole story a reel owes a stranger. + const result = resultCardText(true); + const winnerSize = compactLayout() ? 46 : 64; + // Up top, where the fight is not. The celebration push puts the winner's + // head in the middle of the frame, so a name anywhere near center lands on + // their face. + const champion = players.find((player) => + String(player.name).toLowerCase() === result.winner) || null; + drawReelName(result.winner, Math.round(viewHeight * .17), + winnerSize, champion, t); + } else if (matchHud && roundResult && resultUiReady) { + if (INSTANT_REPLAY && instantReplay) { + const frame = Math.min(instantReplay.frames.length, + Math.floor(instantReplay.cursor) + 1); + const replayLabel = "REPLAY " + frame + "/" + instantReplay.frames.length; + typeWrite(replayLabel, viewCenterX() - replayLabel.length * 10, + 820, 30, ...titleInk); + drawCenteredKeycapRun(replayControlKeys(instantReplay.paused), + 940, 19, inputPads[0]?.down || [], titleInk); + } else { + const result = resultCardText(true); + // The result is a small ownership mark, not a second title screen. + // Character reactions carry the emotional result in the arena. + const winnerSize = compactLayout() ? 30 : 42; + const winnerWidth = handleWidth(result.winner, winnerSize); + const resultY = hudSafeRect().top + 62; + typeWrite(result.winner, viewCenterX() - winnerWidth / 2 + 3, resultY + 4, + winnerSize, ...statusShadow); + typeWrite(result.winner, viewCenterX() - winnerWidth / 2, resultY, + winnerSize, ...titleInk); + if (result.action) { + const actionSize = Math.min(44, winnerSize * .54); + const actionWidth = handleWidth(result.action, actionSize); + typeWrite(result.action, viewCenterX() - actionWidth / 2 + 3, 900, + actionSize, ...statusShadow); + typeWrite(result.action, viewCenterX() - actionWidth / 2, 896, + actionSize, ...titleInk); + } + if (!roundViewer && INSTANT_REPLAY) { + drawCenteredKeycapRun(replayOfferKeys(), 940, 19, + inputPads[0]?.down || [], titleInk); + } + } + } + // Nameplates and stats wait for the wordmark to lift; the entry frame is + // the word, the keys, and the two fighters, and nothing else. + if (!survivalActive() && matchHud && !reelMinimal && shellMode === "GAME" && + ((roundResult && resultUiReady) || + (!roundResult && introAge >= roundIntroDurationUs()))) { + const hudPlayers = spatialHudPlayers(); + for (let side = 0; side < hudPlayers.length; side++) { + const player = hudPlayers[side]; + drawPlayerHandle(player, t, side); + drawPlayerStats(player, side, t); + drawHudInventory(player, side); + drawCommandStream(player, side); + } + } + if (!survivalActive() && replayOven && capabilities().reelFullUi === true && + shellMode === "GAME") + drawReelSectionProgress(run.monotonicUs, titleInk); + if (!replayOven) drawDebugPerformance(titleInk); + drawDeathFlash(); + if (shellMode === "MENU") { + const transitionAge = titleTransitionAt !== null + ? (run.monotonicUs - titleTransitionAt) / 1000000 : -1; + drawTitleScreen(t, menuInk, transitionAge); + if (transitionAge >= 0) return; + } + if (!replayOven) { + // Over the fighters, deliberately: the lobby's lone body stands center + // frame, and an instruction painted under it was an instruction hidden. + if (!reelMinimal) drawVersusHud(t, titleInk, run); + drawSpectatorQr(titleInk); + if (!reelMinimal) drawNetHealth(titleInk); + if (matchHud && !reelMinimal && renderFlags.hud !== false && + shellMode === "GAME" && !survivalActive()) drawMapName(titleInk); + drawTouchControls(); + if (localVersusActive() && localControllerMissing !== -1) { + const label = "reconnect player " + (localControllerMissing + 1); + const size = compactLayout() ? 30 : 48; + const width = handleWidth(label, size); + const left = viewCenterX() - width / 2; + const top = viewHeight * .43; + box(left - 20, top - 16, width + 40, size + 32, 9, 12, 22); + typeWrite(label, left, top, size, 255, 235, 130); + } + } +} + +// The raw pad words remember() files between real moves. The training floor +// captions moves, not fingers — "KICK" teaches, "B" nags. +const versusLabelNoise = new Set(["NONE", "UP", "DOWN", "LEFT", "RIGHT", + "A", "B", "X", "Y", "LB", "RB", "VIEW", "MENU"]); + +// The lobby's interface is a challenge and a code: fight a friend, share +// the address, and until they arrive every move the lone fighter makes is +// named back at them — the empty room as training mode. +function drawVersusHud(t, ink, run) { + if (!versusLane() || shellMode !== "GAME") return; + if (!lobbyActive()) return; + const hud = hudSafeRect(); + const compact = compactLayout(); + const door = versusDoor(); + // Behind the door the address is a lie: nothing is published, so nobody + // could arrive at it. Say what is actually in the way instead. The panel + // that takes the email or the handle is the shell's, over the top of this; + // this is the part that stays legible on a television across a room. + const headline = door === "login" ? "SIGN IN TO PLAY" + : door === "handle" ? "CHOOSE A HANDLE" : "WAITING ROOM"; + const headSize = compact ? 30 : 44; + const pulse = .5 + Math.sin(t * 2.4) * .5; + const headInk = mixColor(ink, [235, 205, 74], .35 + pulse * .45); + const headWidth = handleWidth(headline, headSize); + const headX = viewCenterX() - headWidth / 2; + const headY = hud.top + (compact ? 30 : 42); + typeWrite(headline, headX + 3, headY + 3, headSize, ...contrastShadow(ink)); + typeWrite(headline, headX, headY, headSize, ...headInk); + const address = door === "login" + ? "A FIGHT NEEDS A NAME ON BOTH ENDS" + : door === "handle" ? "YOUR HANDLE IS WHAT THE FIGHT WRITES DOWN" + : "FIGHT A FRIEND OSKIEWAR.COM/" + versusRoomName.toUpperCase(); + const addressSize = compact ? 16 : 23; + const addressWidth = handleWidth(address, addressSize); + const addressY = headY + headSize + 10; + typeWrite(address, viewCenterX() - addressWidth / 2 + 2, addressY + 2, + addressSize, ...contrastShadow(ink)); + typeWrite(address, viewCenterX() - addressWidth / 2, addressY, + addressSize, ...ink); + const player = players[0]; + // The death card owns the middle of the screen for the whole down beat — + // the loop is die, read it, stand back up whole. + if (!player.alive) { + const deadLabel = "YOU DIED"; + const deadSize = compact ? 44 : 66; + const deadWidth = handleWidth(deadLabel, deadSize); + const deadX = viewCenterX() - deadWidth / 2; + const deadY = Math.round(viewHeight * .44 + Math.sin(t * 3.2) * 3); + typeWrite(deadLabel, deadX + 4, deadY + 4, deadSize, + ...contrastShadow(ink)); + typeWrite(deadLabel, deadX, deadY, deadSize, + ...mixColor(ink, [235, 38, 58], .8)); + return; + } + if (!player.lastButtonAt || versusLabelNoise.has(player.lastButton)) return; + const age = (run.monotonicUs - player.lastButtonAt) / 1000000; + if (age < 0 || age > .9) return; + // The caption swells on landing and lets go through the tail — spoken, + // not filed. + const fade = 1 - age / .9; + const moveSize = Math.round((compact ? 26 : 38) * (1.06 - fade * .06)); + const moveWidth = handleWidth(player.lastButton, moveSize); + const moveX = viewCenterX() - moveWidth / 2; + const moveY = Math.round(viewHeight * .62) - Math.round((1 - fade) * 26); + const moveInk = fade > .4 ? ink : mixColor(contrastShadow(ink), ink, fade / .4); + typeWrite(player.lastButton, moveX + 3, moveY + 3, moveSize, + ...contrastShadow(ink)); + typeWrite(player.lastButton, moveX, moveY, moveSize, ...moveInk); +} + +function boot() { + try { + gameBoot(); + } catch (error) { + captureClientError("boot", error); + } +} + +function sim() { + if (!netSession && performanceStageActive()) return; + if (clientError) { restartAfterClientError(); return; } + try { + netDrainHostInbox(); + if (netSession) netTick(); + else gameSim(); + } catch (error) { + captureClientError("sim", error); + } +} + +function paint() { + photoThemeActive = globalThis.__oskiewarGraphicsTheme !== "flat" && + typeof themeReady === "function" && typeof themeSprite === "function" && themeReady(); + globalThis.__oskiewarGraphicsThemeStatus = photoThemeActive ? "photorealistic" : "flat"; + if (drawPerformanceStage()) return; + if (clientError) { + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + return; + } + const previousMath = Math; + Math = platformMath; // Display-only geometry can use the host's fast intrinsics. + const restore = beginRenderInterpolation(runtime().renderAlpha ?? 1); + sharingRenderPoses = true; + try { + gamePaint(); + drawPerformanceFooter(); + } catch (error) { + captureClientError("paint", error); + try { drawClientError(); } + catch (_) { drawClientErrorFallback(); } + } finally { + sharingRenderPoses = false; + renderPoses.clear(); + restore(); + Math = previousMath; + } +} +function act() {} +function leave() { + try { + roundViewerStop?.(); + roundViewerStop = null; + roundViewer = null; + } catch (error) { + captureClientError("leave", error); + } +} + + +// Included in Neo's existing Oskiewar renderer; primitive-only and silent. +function drawFemragDance(music, elapsed) { + const width=viewWidth(), height=viewHeight, beat=elapsed*(Number(music.bpm)||144)/60; + const reverse=/ragga/.test(music.section||'')?-1:1; + const gather=/build/.test(music.section||'')?.7:1; + const fade=/outro/.test(music.section||'')?clamp((music.duration-elapsed)/8,0,1):1; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[249,154,103]]; + const hits=(music.hits||[]).map(e=>({t:music.elapsed+e[0]/100,seat:e[1]===6?'sub':e[1],midi:e[2]<0?null:e[2]})); + const sub=hits.reduce((v,e)=>e.seat==='sub'&&elapsed>=e.t?Math.max(v,Math.exp(-(elapsed-e.t)*9)):v,0); + triangleDepth=-.8; + const scale=Math.min(width,height)*.047; + for(let seat=0;seat<6;seat++) { + let hit=null, level=0; + for(const e of hits)if(e.seat===seat&&elapsed>=e.t&&elapsed-e.t<.6){ + const amp=Math.exp(-(elapsed-e.t)*7);if(amp>level){level=amp;hit=e;} + } + const a=seat*2*Math.PI/5+reverse*beat*Math.PI/32; + const x=seat===5?viewCenterX():viewCenterX()+platformMath.sin(a)*width*.30*gather; + const y=seat===5?height*.40:height*.40+platformMath.cos(a)*height*.23*gather; + const step=platformMath.sin(beat*Math.PI+seat)*(.15+level*.55); + const bob=level*scale*.55; + const color=colors[seat].map(v=>Math.round(v*(.55+.45*fade))); + const limb=scale*.17, bodyY=y-bob; + filledCapsule(x,bodyY-scale*.25,x,bodyY+scale*.65,limb,color); + filledDisc(x,bodyY-scale*.8,scale*.42,color); + for(const side of [-1,1]) { + filledCapsule(x,bodyY,x+side*scale*.8,bodyY-scale*(.15+level*.9)+side*step*scale,limb,color); + filledCapsule(x,bodyY+scale*.6,x+side*scale*(.45+step*.25),y+scale*1.35,limb,color); + } + if(hit&&Number.isFinite(hit.midi)) { + const note=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'][Math.round(hit.midi)%12]; + const size=Math.max(20,scale*.65); + typeWrite(note,x-handleWidth(note,size)/2,bodyY-scale*1.9,size,...color); + } + } + // Sub notes swell a steady floor; no full-screen flash or second soundtrack. + screenRect(width*.12,height*.76,width*.76,3+sub*8,[94,110,143]); +} + +function performanceStageActive() { + const stage = globalThis.__oskiewarStageState; + return Boolean(stage?.curtain || stage?.performance?.active); +} + +// A room-performance display: the transport supplies title, time and notes; +// it never touches fighter physics or creates a second musical soundtrack. +function drawPerformanceStage() { + const stage = globalThis.__oskiewarStageState; + if (!performanceStageActive()) return false; + syncGameView(); + wipe(3, 5, 10); + const music = stage.performance; + const notepatPlaying = music?.visual === 'notepat-score-v1' && music.playing && music.look && music.movement; + if (stage.curtain && !notepatPlaying) { drawCurtainDirections(stage); return true; } + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp(Number(music.elapsed) + (music.playing ? age : 0), 0, Number(music.duration) || 0); + const duration = Math.max(0, Number(music.duration) || 0); + const width = viewWidth(), center = viewCenterX(); + const pulse = clamp(Number(music.intensity) || 0, 0, 1); + const t = elapsed; + triangleDepth = -.8; + if (music.visual === 'notepat-score-v1' && music.playing) drawNotepatScore(music, elapsed); + else if (music.dance === 'femrag-round-v1') drawFemragDance(music, elapsed); + else + for (let index = 0; index < 2; index++) { + const note = music.notes?.[index % Math.max(1, music.notes?.length || 1)]; + const singing = music.playing && Number.isFinite(note); + const level = singing ? .25 + pulse * .75 : pulse * .35; + const radius = Math.min(width * .12, 116); + const x = center + (index ? 1 : -1) * Math.min(width * .19, 225); + const y = viewHeight * .43 + platformMath.sin(t * 1.7 + index * 1.8) * (5 + level * 6); + const color = index ? [77, 188, 222] : [239, 133, 152]; + filledDisc(x, y, radius, color); + triangleDepth = -.85; + const ink = [12, 19, 35]; + const blink = platformMath.sin(t * .73 + index * 2.1) > .988; + for (const side of [-1, 1]) { + const ex = x + side * radius * .32, ey = y - radius * .18; + if (blink) filledCapsule(ex - radius * .09, ey, ex + radius * .09, ey, radius * .055, ink); + else { + filledDisc(ex, ey, radius * .085, ink); + filledDisc(ex + radius * .019, ey - radius * .026, radius * .025, [245, 248, 255]); + } + } + const mouthY = y + radius * .3; + filledCapsule(x - radius * .12, mouthY, x + radius * .12, mouthY, + radius * (.055 + level * .26), ink); + triangleDepth = -.8; + } + const title = String(music.title || "Untitled composition").slice(0, 110); + let size = 38; + while (size > 18 && handleWidth(title, size) > width - 72) size -= 2; + typeWrite(title, center - handleWidth(title, size) / 2, viewHeight - 126, size, 240, 243, 251); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 20) / 2, viewHeight - 76, 20, 150, 168, 193); + const trackWidth = Math.min(width - 100, 620), left = center - trackWidth / 2; + hudBox(left, viewHeight - 37, trackWidth, 4, 31, 42, 61); + if (duration) hudBox(left, viewHeight - 37, trackWidth * elapsed / duration, 4, 105, 205, 213); + return true; +} + +// The composition remains visible during a fight, independently of the +// full-screen performance mode. Its lane replaces the debug session label. +function performanceFooterVisible() { + const stage = globalThis.__oskiewarStageState; + const music = stage?.performance; + return Boolean(!stage?.curtain && music?.title && + (music.playing || music.phase === "countdown" || music.phase === "stale")); +} +function drawPerformanceFooter() { + if (!performanceFooterVisible()) return; + const stage = globalThis.__oskiewarStageState, music = stage.performance; + const duration = Math.max(0, Number(music.duration) || 0); + const age = clamp((Date.now() - (stage.receivedAt || Date.now())) / 1000, 0, 1); + const elapsed = clamp((Number(music.elapsed) || 0) + (music.playing ? age : 0), 0, duration); + const width = Math.min(viewWidth() * .66, 1000), center = viewCenterX(); + const left = center - width / 2, top = viewHeight - 88; + const previousDepth = triangleDepth; + triangleDepth = -1.49; + // Use screen rectangles so the Xbox's GPU pass does not cover the strip. + screenRect(left, top, width, 74, [8, 14, 25]); + const title = String(music.title).slice(0, 110); + let size = 25; + while (size > 16 && handleWidth(title, size) > width - 24) size--; + typeWrite(title, center - handleWidth(title, size) / 2, top + 7, size, 243, 247, 255); + const time = seconds => Math.floor(seconds / 60) + ":" + String(Math.floor(seconds % 60)).padStart(2, "0"); + const label = (music.source || "") + (duration ? " " + time(elapsed) + " / " + time(duration) : "") + + (music.phase === "stale" ? " signal lost" : ""); + typeWrite(label, center - handleWidth(label, 17) / 2, top + 42, 17, 166, 189, 213); + screenRect(left + 12, top + 68, width - 24, 3, [36, 51, 68]); + if (duration) screenRect(left + 12, top + 68, (width - 24) * elapsed / duration, 3, [105, 222, 213]); + triangleDepth = previousDepth; +} + +function drawCurtainDirections(stage = globalThis.__oskiewarStageState) { + const width = viewWidth(), center = viewCenterX(), left = center - width / 2; + const music = stage?.performance; + const age = Math.max(0, (Date.now() - (stage?.receivedAt || Date.now())) / 1000); + const elapsed = (Number(music?.elapsed) || 0) + Math.min(age, 1); + const lyrics = music?.curtainStyle !== "directions" && music?.playing && age < 2.5 + ? (music.lyrics || []).filter(line => elapsed >= line.start - 1.5 && elapsed < line.end + .35).slice(0, 3) : []; + // Wall-clock motion continues while both match simulations are frozen. + const time = Date.now() / 1000; + const palette = [[244, 128, 179], [91, 215, 227], [163, 223, 91], [255, 191, 90], [169, 142, 248]]; + triangleDepth = -1; + for (let lane = 0; lane < 2; lane++) { + const spacing = width / 5, length = spacing * .47, height = length * .55; + const y = viewHeight * (lane ? .85 : .16); + for (let index = -1; index < 6; index++) { + const x = left + index * spacing + ((time * width * .12 + lane * spacing * .5) % spacing); + const base = palette[((index + lane * 2) % 5 + 5) % 5]; + const glow = .52 + .3 * platformMath.sin(time * 2.4 - index * .8); + const color = base.map(v => Math.round(v * glow)); + screenRect(x, y - height * .13, length * .58, height * .26, color); + screenTriangle(x + length * .5, y - height / 2, + x + length, y, x + length * .5, y + height / 2, ...color); + } + } + drawCurtainFighter(left + width * (lyrics.length ? .08 : .24), + viewHeight * (lyrics.length ? .68 : .52), Math.min(width, viewHeight) * (lyrics.length ? .052 : .095), time); + if (lyrics.length) { + for (let row = 0; row < lyrics.length; row++) { + const line = lyrics[row], words = line.words || []; + const text = words.map(word => word.text).join(" "); + let size = Math.min(50, width * .043); + while (size > 16 && handleWidth(text, size) > width * .82) size--; + const y = viewHeight * (.4 + (row - (lyrics.length - 1) / 2) * .16); + let x = center - handleWidth(text, size) / 2; + const color = /^#[a-f0-9]{6}$/i.test(line.color || "") + ? [1, 3, 5].map(i => parseInt(line.color.slice(i, i + 2), 16)) : [163, 223, 91]; + for (const word of words) { + const active = elapsed >= word.start && elapsed < word.end; + const ink = elapsed < word.start ? [129, 141, 158] : color; + typeWrite(word.text, x, y, size, ...ink); + const w = handleWidth(word.text, size); + if (active) screenRect(x, y + size * 1.18, w, Math.max(2, size * .06), color); + x += handleWidth(word.text + " ", size); + } + } + return; + } + const label = "look that way ->", size = Math.min(46, width * .045); + typeWrite(label, center - handleWidth(label, size) / 2, + viewHeight * .68, size, 229, 240, 248); + // A large arrow completes the character's pointing gesture. + const x = center + width * .04, y = viewHeight * .46, length = width * .27; + const color = palette[Math.floor(time / 2) % palette.length]; + screenRect(x, y - length * .07, length * .6, length * .14, color); + screenTriangle(x + length * .55, y - length * .26, + x + length, y, x + length * .55, y + length * .26, ...color); +} + +function drawCurtainFighter(x, y, r, time) { + const bob = platformMath.sin(time * 3) * r * .05; + y += bob; + const ink = [20, 29, 42], skin = [166, 225, 103], boot = [239, 125, 166]; + triangleDepth = -.9; + filledCapsule(x, y + r * .8, x - r * .38, y + r * 1.7, r * .16, skin); + filledCapsule(x, y + r * .8, x + r * .45, y + r * 1.7, r * .16, skin); + filledCapsule(x - r * .52, y + r * 1.72, x - r * .2, y + r * 1.72, r * .17, boot); + filledCapsule(x + r * .4, y + r * 1.72, x + r * .78, y + r * 1.72, r * .17, boot); + filledCapsule(x, y + r * .26, x, y + r * .86, r * .26, boot); + filledCapsule(x + r * .1, y + r * .38, x + r * 1.35, y + r * .13, r * .13, skin); + filledDisc(x + r * 1.35, y + r * .13, r * .19, skin); + filledCapsule(x + r * 1.3, y + r * .05, x + r * 1.68, y + r * .05, r * .08, skin); + filledDisc(x, y - r * .62, r, skin); + // Eyes and nose sit on the right side: gaze agrees with the gesture. + triangleDepth = -1.05; + for (const ex of [x + r * .12, x + r * .62]) { + filledDisc(ex, y - r * .82, r * .22, [243, 248, 232]); + filledDisc(ex + r * .09, y - r * .8, r * .095, ink); + } + filledDisc(x + r * .98, y - r * .44, r * .18, skin); + filledCapsule(x + r * .33, y - r * .13, x + r * .7, y - r * .18, r * .055, ink); + triangleDepth = -1; +} + +// NOTEPAT_SCORE_VISUAL_V1_BEGIN +const NOTEPAT_TV_SCORE={"hash":"139a77d1758773680fe08038f4a39f8e7a6b48838a687369a4d9e17a28cd2a5c","duration":774.4119,"sections":[[0,60.42,"Overture"],[60.42,116.9051,"The Walk"],[116.9051,195.1946,"Waltz"],[195.1946,243.1453,"Chase"],[243.1453,301.4882,"Sneak"],[301.4882,375.8215,"Lullaby"],[375.8215,441,"The Climb"],[441,554.3143,"The Lift"],[554.3143,592.437,"Fanfare"],[592.437,713.2119,"Return"],[713.2119,774.4119,"Vanish"]],"rows":[[[0,0.03,99,26],[0,0.055,50,68],[0.06,0.16,39,64],[0.06,0.14,51,38],[0.4,1.1,60,36],[2.2,0.03,99,26],[2.2,0.055,50,68],[2.26,0.16,39,64],[2.26,0.14,51,38],[4.4,0.03,99,26],[4.4,0.055,50,68],[4.46,0.16,39,64],[4.46,0.14,51,38],[6.6,0.03,99,26],[6.6,0.055,50,68],[6.66,0.16,39,64],[6.66,0.14,51,38],[8.8,0.03,99,26],[8.8,0.055,50,68],[8.86,0.16,39,64],[8.86,0.14,51,38],[11,0.03,99,26],[11,0.055,50,68],[11.06,0.16,39,64],[11.06,0.14,51,38],[13.2,0.03,99,26],[13.2,0.055,50,68],[13.26,0.16,39,64],[13.26,0.14,51,38],[15.4,0.03,99,26],[15.4,0.055,50,68],[15.46,0.16,39,64],[15.46,0.14,51,38],[17.6,0.03,99,26],[17.6,0.055,50,68],[17.66,0.16,39,64],[17.66,0.14,51,38],[19.8,0.03,99,26],[19.8,0.055,50,68],[19.86,0.16,39,64],[19.86,0.14,51,38],[22,0.03,99,26],[22,0.055,50,68],[22.06,0.16,39,64],[22.06,0.14,51,38],[24.2,0.03,99,26],[24.2,0.055,50,68],[24.26,0.16,39,64],[24.26,0.14,51,38],[26.4,0.03,99,26],[26.4,0.055,50,68],[26.46,0.16,39,64],[26.46,0.14,51,38],[28.6,0.03,99,26],[28.6,0.055,50,68],[28.66,0.16,39,64],[28.66,0.14,51,38],[30.8,0.03,99,26],[30.8,0.055,50,68],[30.86,0.16,39,64],[30.86,0.14,51,38],[33,0.855,72,169],[33,0.03,99,26],[33,0.055,50,68],[33.06,0.16,39,64],[33.06,0.14,51,38],[34.9,0.03,99,26],[34.9,0.055,50,68],[34.96,0.16,39,64],[34.96,0.14,51,38],[36.8,0.855,76,199],[36.8,0.03,99,26],[36.8,0.055,50,68],[36.86,0.16,39,64],[36.86,0.14,51,38],[38.7,0.03,99,26],[38.7,0.055,50,68],[38.76,0.16,39,64],[38.76,0.14,51,38],[40.6,0.03,99,26],[40.6,0.055,50,68],[40.66,0.16,39,64],[40.66,0.14,51,38],[42.5,0.03,99,26],[42.5,0.055,50,68],[42.56,0.16,39,64],[42.56,0.14,51,38],[43.61,0.333,79,199],[43.98,0.03,99,26],[43.98,0.055,50,68],[44.04,0.16,39,64],[44.04,0.14,51,38],[45.46,0.03,99,26],[45.46,0.055,50,68],[45.52,0.16,39,64],[45.52,0.14,51,38],[46.94,1.332,72,199],[46.94,0.03,99,26],[46.94,0.055,50,68],[47,0.16,39,64],[47,0.14,51,38],[48.42,0.03,99,26],[48.42,0.055,50,68],[48.48,0.16,39,64],[48.48,0.14,51,38],[49.9,0.03,99,26],[49.9,0.055,50,68],[49.96,0.16,39,64],[49.96,0.14,51,38],[51.02,0.03,99,26],[51.02,0.055,50,68],[51.08,0.16,39,64],[51.08,0.14,51,38],[51.86,0.252,74,199],[52.14,0.03,99,26],[52.14,0.055,50,68],[52.2,0.16,39,64],[52.2,0.14,51,38],[53.26,0.03,99,26],[53.26,0.055,50,68],[53.32,0.16,39,64],[53.32,0.14,51,38],[54.38,0.03,99,26],[54.38,0.055,50,68],[54.44,0.16,39,64],[54.44,0.14,51,38],[55.5,0.03,99,26],[55.5,0.055,50,68],[55.56,0.16,39,64],[55.56,0.14,51,38],[55.94,0.25,76,199],[56.38,0.03,99,26],[56.38,0.055,50,68],[56.44,0.16,39,64],[56.44,0.14,51,38],[57.26,0.03,99,26],[57.26,0.055,50,68],[57.32,0.16,39,64],[57.32,0.14,51,38],[57.7,0.396,74,177],[58.14,0.03,99,26],[58.14,0.055,50,68],[58.2,0.16,39,64],[58.2,0.14,51,38],[59.02,0.03,99,26],[59.02,0.055,50,68],[59.08,0.16,39,64],[59.08,0.14,51,38],[59.62,0.15,60,154],[59.9,0.03,99,26],[59.9,0.055,50,68],[59.96,0.16,39,64],[59.96,0.14,51,38],[60.42,0.27,48,30],[60.42,0.03,83,11],[60.42,0.03,99,19],[60.42,0.055,50,50],[60.44,0.31,42,15],[60.48,0.16,39,47],[60.48,0.14,51,28],[60.9,0.36,76,22],[61.42,0.65,60,60],[61.62,0.27,48,30],[61.62,0.03,83,11],[61.62,0.03,99,19],[61.62,0.055,50,50],[61.64,0.31,42,15],[61.68,0.16,39,47],[61.68,0.14,51,28],[62.1,0.36,76,22],[62.82,0.27,48,32],[62.82,0.03,83,11],[62.82,0.03,99,19],[62.82,0.055,50,50],[62.84,0.31,42,16],[62.88,0.16,39,47],[62.88,0.14,51,28],[63.3,0.36,76,23],[64.02,0.27,48,32],[64.02,0.03,83,11],[64.02,0.03,99,19],[64.02,0.055,50,50],[64.04,0.31,42,16],[64.08,0.16,39,47],[64.08,0.14,51,28],[64.5,0.36,76,23],[65.22,0.27,48,34],[65.22,0.03,83,12],[65.22,0.03,99,19],[65.22,0.055,50,50],[65.24,0.31,42,17],[65.28,0.16,39,47],[65.28,0.14,51,28],[65.7,0.36,72,24],[66.42,0.27,48,34],[66.42,0.03,83,12],[66.42,0.03,99,19],[66.42,0.055,50,50],[66.44,0.31,42,17],[66.48,0.16,39,47],[66.48,0.14,51,28],[66.9,0.36,72,24],[67.62,0.27,48,36],[67.62,0.03,83,13],[67.62,0.03,99,19],[67.62,0.055,50,50],[67.64,0.31,42,18],[67.68,0.16,39,47],[67.68,0.14,51,28],[68.1,0.36,72,25],[68.82,0.27,48,36],[68.82,0.03,83,13],[68.82,0.03,99,19],[68.82,0.055,50,50],[68.84,0.31,42,18],[68.88,0.16,39,47],[68.88,0.14,51,28],[69.3,0.36,72,25],[70.02,0.27,48,38],[70.02,0.03,83,13],[70.02,0.03,99,19],[70.02,0.055,50,50],[70.04,0.31,42,19],[70.08,0.16,39,47],[70.08,0.14,51,28],[70.5,0.36,69,22],[71.22,0.27,48,38],[71.22,0.03,83,13],[71.22,0.03,99,19],[71.22,0.055,50,50],[71.24,0.31,42,19],[71.28,0.16,39,47],[71.28,0.14,51,28],[71.7,0.36,69,22],[72.42,0.27,48,39],[72.42,0.03,83,14],[72.42,0.03,99,19],[72.42,0.055,50,50],[72.44,0.31,42,20],[72.48,0.16,39,47],[72.48,0.14,51,28],[72.9,0.36,69,23],[73.62,0.27,48,39],[73.62,0.03,83,14],[73.62,0.03,99,19],[73.62,0.055,50,50],[73.64,0.31,42,20],[73.68,0.16,39,47],[73.68,0.14,51,28],[74.1,0.36,69,23],[74.82,0.27,48,41],[74.82,0.03,83,14],[74.82,0.03,99,19],[74.82,0.055,50,50],[74.84,0.31,42,21],[74.88,0.16,39,47],[74.88,0.14,51,28],[75.3,0.36,71,24],[76.02,0.27,48,41],[76.02,0.03,83,14],[76.02,0.03,99,19],[76.02,0.055,50,50],[76.04,0.31,42,21],[76.08,0.16,39,47],[76.08,0.14,51,28],[76.5,0.36,71,24],[77.22,0.27,48,38],[77.22,0.03,83,13],[77.22,0.03,99,19],[77.22,0.055,50,50],[77.24,0.31,42,19],[77.28,0.16,39,47],[77.28,0.14,51,28],[77.7,0.36,76,22],[78.42,0.18,60,15],[78.42,0.03,99,19],[78.42,0.055,50,50],[78.48,0.16,39,47],[78.48,0.14,51,28],[79.62,0.27,48,35],[79.62,0.03,83,12],[79.62,0.03,99,19],[79.62,0.055,50,50],[79.64,0.31,42,17],[79.68,0.16,39,47],[79.68,0.14,51,28],[80.091,0.353,76,29],[80.796,0.27,48,35],[80.796,0.03,83,12],[80.796,0.03,99,19],[80.796,0.055,50,50],[80.817,0.31,42,17],[80.856,0.16,39,47],[80.856,0.14,51,28],[81.267,0.353,76,29],[81.973,0.27,48,37],[81.973,0.03,83,13],[81.973,0.03,99,19],[81.973,0.055,50,50],[81.993,0.31,42,18],[82.033,0.16,39,47],[82.033,0.14,51,28],[82.444,0.353,76,31],[83.149,0.27,48,37],[83.149,0.03,83,13],[83.149,0.03,99,19],[83.149,0.055,50,50],[83.169,0.31,42,18],[83.209,0.16,39,47],[83.209,0.14,51,28],[83.62,0.353,76,31],[84.326,0.27,48,39],[84.326,0.03,83,14],[84.326,0.03,99,19],[84.326,0.055,50,50],[84.346,0.31,42,19],[84.386,0.16,39,47],[84.386,0.14,51,28],[84.796,0.353,72,32],[85.502,0.27,48,39],[85.502,0.03,83,14],[85.502,0.03,99,19],[85.502,0.055,50,50],[85.522,0.31,42,19],[85.562,0.16,39,47],[85.562,0.14,51,28],[85.973,0.353,72,32],[86.679,0.27,48,41],[86.679,0.03,83,14],[86.679,0.03,99,19],[86.679,0.055,50,50],[86.699,0.31,42,20],[86.739,0.16,39,47],[86.739,0.14,51,28],[87.149,0.353,72,23],[87.855,0.27,48,41],[87.855,0.03,83,14],[87.855,0.03,99,19],[87.855,0.055,50,50],[87.875,0.31,42,20],[87.915,0.16,39,47],[87.915,0.14,51,28],[88.326,0.353,72,23],[89.032,0.27,48,43],[89.032,0.03,83,15],[89.032,0.03,99,19],[89.032,0.055,50,50],[89.052,0.31,42,21],[89.092,0.16,39,47],[89.092,0.14,51,28],[90.208,0.27,48,43],[90.208,0.03,83,15],[90.208,0.03,99,19],[90.208,0.055,50,50],[90.228,0.31,42,21],[90.268,0.16,39,47],[90.268,0.14,51,28],[91.385,0.27,48,45],[91.385,0.03,83,16],[91.385,0.03,99,19],[91.385,0.055,50,50],[91.405,0.31,42,22],[91.445,0.16,39,47],[91.445,0.14,51,28],[91.679,0.224,72,14],[92.561,0.27,48,45],[92.561,0.03,83,16],[92.561,0.03,99,19],[92.561,0.055,50,50],[92.581,0.31,42,22],[92.621,0.16,39,47],[92.621,0.14,51,28],[93.738,0.27,48,47],[93.738,0.03,83,16],[93.738,0.03,99,19],[93.738,0.055,50,50],[93.758,0.31,42,24],[93.798,0.16,39,47],[93.798,0.14,51,28],[94.914,0.27,48,47],[94.914,0.03,83,16],[94.914,0.03,99,19],[94.914,0.055,50,50],[94.934,0.31,42,24],[94.974,0.16,39,47],[94.974,0.14,51,28],[96.091,0.27,48,44],[96.091,0.03,83,15],[96.091,0.03,99,19],[96.091,0.055,50,50],[96.111,0.31,42,22],[96.151,0.16,39,47],[96.151,0.14,51,28],[97.267,0.176,60,31],[97.267,0.03,99,19],[97.267,0.055,50,50],[97.327,0.16,39,47],[97.327,0.14,51,28],[98.444,0.27,48,39],[98.444,0.03,83,14],[98.444,0.03,99,19],[98.444,0.055,50,50],[98.463,0.31,42,19],[98.504,0.16,39,47],[98.504,0.14,51,28],[98.732,0.219,79,22],[98.905,0.346,76,39],[99.597,0.27,48,39],[99.597,0.03,83,14],[99.597,0.03,99,19],[99.597,0.055,50,50],[99.617,0.31,42,19],[99.657,0.16,39,47],[99.657,0.14,51,28],[99.886,0.035,117,10],[100.059,0.346,76,39],[100.463,0.035,117,10],[100.751,0.27,48,41],[100.751,0.03,83,14],[100.751,0.03,99,19],[100.751,0.055,50,50],[100.771,0.31,42,21],[100.811,0.16,39,47],[100.811,0.14,51,28],[101.213,0.346,76,20],[101.905,0.27,48,41],[101.905,0.03,83,14],[101.905,0.03,99,19],[101.905,0.055,50,50],[101.925,0.31,42,21],[101.965,0.16,39,47],[101.965,0.14,51,28],[102.367,0.346,76,20],[103.059,0.27,48,44],[103.059,0.03,83,15],[103.059,0.03,99,19],[103.059,0.055,50,50],[103.079,0.31,42,22],[103.119,0.16,39,47],[103.119,0.14,51,28],[103.492,0.7,76,11],[103.52,0.346,72,21],[104.213,0.219,72,12],[104.213,0.27,48,44],[104.213,0.03,83,15],[104.213,0.03,99,19],[104.213,0.055,50,50],[104.233,0.31,42,22],[104.273,0.16,39,47],[104.273,0.14,51,28],[104.674,0.346,72,21],[105.078,0.035,117,12],[105.367,0.27,48,46],[105.367,0.03,83,16],[105.367,0.03,99,19],[105.367,0.055,50,50],[105.387,0.31,42,23],[105.427,0.16,39,47],[105.427,0.14,51,28],[105.655,0.035,117,9],[105.828,0.346,72,35],[106.52,0.27,48,46],[106.52,0.03,83,16],[106.52,0.03,99,19],[106.52,0.055,50,50],[106.54,0.31,42,23],[106.58,0.16,39,47],[106.58,0.14,51,28],[106.982,0.346,72,35],[107.674,0.27,48,48],[107.674,0.03,83,17],[107.674,0.03,99,19],[107.674,0.055,50,50],[107.694,0.31,42,24],[107.734,0.16,39,47],[107.734,0.14,51,28],[108.828,0.27,48,48],[108.828,0.03,83,17],[108.828,0.03,99,19],[108.828,0.055,50,50],[108.848,0.31,42,24],[108.888,0.16,39,47],[108.888,0.14,51,28],[109.694,0.219,65,20],[109.694,0.035,117,10],[109.982,0.27,48,51],[109.982,0.03,83,18],[109.982,0.03,99,19],[109.982,0.055,50,50],[110.002,0.31,42,25],[110.042,0.16,39,47],[110.042,0.14,51,28],[110.27,0.219,72,21],[110.27,0.035,117,14],[110.415,0.7,77,18],[111.136,0.27,48,51],[111.136,0.03,83,18],[111.136,0.03,99,19],[111.136,0.055,50,50],[111.156,0.31,42,25],[111.196,0.16,39,47],[111.196,0.14,51,28],[112.29,0.27,48,53],[112.29,0.03,83,19],[112.29,0.03,99,19],[112.29,0.055,50,50],[112.31,0.31,42,26],[112.35,0.16,39,47],[112.35,0.14,51,28],[113.444,0.27,48,53],[113.444,0.03,83,19],[113.444,0.03,99,19],[113.444,0.055,50,50],[113.463,0.31,42,26],[113.504,0.16,39,47],[113.504,0.14,51,28],[114.597,0.27,48,49],[114.597,0.03,83,17],[114.597,0.03,99,19],[114.597,0.055,50,50],[114.617,0.31,42,24],[114.657,0.16,39,47],[114.657,0.14,51,28],[115.751,0.173,60,19],[115.751,0.03,99,19],[115.751,0.055,50,50],[115.811,0.16,39,47],[115.811,0.14,51,28],[116.905,0.03,99,22],[116.905,0.055,50,59],[116.965,0.16,39,56],[116.965,0.14,51,33],[118.269,0.03,99,22],[118.269,0.055,50,59],[118.329,0.16,39,56],[118.329,0.14,51,33],[119.632,0.03,99,22],[119.632,0.055,50,59],[119.692,0.16,39,56],[119.692,0.14,51,33],[120.996,0.03,99,22],[120.996,0.055,50,59],[121.056,0.16,39,56],[121.056,0.14,51,33],[122.36,0.03,99,22],[122.36,0.055,50,59],[122.42,0.16,39,56],[122.42,0.14,51,33],[123.723,0.03,99,22],[123.723,0.055,50,59],[123.783,0.16,39,56],[123.783,0.14,51,33],[125.087,0.03,99,22],[125.087,0.055,50,59],[125.147,0.16,39,56],[125.147,0.14,51,33],[126.451,0.03,99,22],[126.451,0.055,50,59],[126.511,0.16,39,56],[126.511,0.14,51,33],[127.814,0.03,99,22],[127.814,0.055,50,59],[127.874,0.16,39,56],[127.874,0.14,51,33],[129.178,0.03,99,22],[129.178,0.055,50,59],[129.238,0.16,39,56],[129.238,0.14,51,33],[130.542,0.03,99,22],[130.542,0.055,50,59],[130.601,0.16,39,56],[130.601,0.14,51,33],[131.905,0.03,99,22],[131.905,0.055,50,59],[131.965,0.16,39,56],[131.965,0.14,51,33],[133.269,0.03,99,22],[133.269,0.055,50,59],[133.329,0.16,39,56],[133.329,0.14,51,33],[134.632,0.03,99,22],[134.632,0.055,50,59],[134.692,0.16,39,56],[134.692,0.14,51,33],[135.996,0.03,99,22],[135.996,0.055,50,59],[136.056,0.16,39,56],[136.056,0.14,51,33],[137.36,0.03,99,22],[137.36,0.055,50,59],[137.42,0.16,39,56],[137.42,0.14,51,33],[138.723,0.818,76,26],[138.723,0.03,99,22],[138.723,0.055,50,59],[138.783,0.16,39,56],[138.783,0.14,51,33],[140.087,0.03,99,22],[140.087,0.055,50,59],[140.087,0.045,111,21],[140.147,0.16,39,56],[140.147,0.14,51,33],[140.769,0.045,111,9],[141.451,0.03,99,22],[141.451,0.055,50,59],[141.511,0.16,39,56],[141.511,0.14,51,33],[142.36,0.191,77,10],[142.814,1.227,76,26],[142.814,0.03,99,22],[142.814,0.055,50,59],[142.874,0.16,39,56],[142.874,0.14,51,33],[144.178,0.03,99,22],[144.178,0.055,50,59],[144.238,0.16,39,56],[144.238,0.14,51,33],[144.405,0.191,76,10],[144.86,0.045,111,14],[145.541,0.045,111,18],[145.542,0.03,99,22],[145.542,0.055,50,59],[145.601,0.16,39,56],[145.601,0.14,51,33],[146.905,0.818,74,31],[146.905,0.03,99,22],[146.905,0.055,50,59],[146.965,0.16,39,56],[146.965,0.14,51,33],[148.269,0.03,99,22],[148.269,0.055,50,59],[148.329,0.16,39,56],[148.329,0.14,51,33],[149.178,0.191,76,12],[149.632,0.03,99,22],[149.632,0.055,50,59],[149.632,0.045,111,15],[149.692,0.16,39,56],[149.692,0.14,51,33],[150.314,0.045,111,15],[150.996,1.227,76,33],[150.996,0.03,99,22],[150.996,0.055,50,59],[151.056,0.16,39,56],[151.056,0.14,51,33],[151.223,0.191,72,12],[152.36,0.03,99,22],[152.36,0.055,50,59],[152.42,0.16,39,56],[152.42,0.14,51,33],[153.723,0.03,99,22],[153.723,0.055,50,59],[153.783,0.16,39,56],[153.783,0.14,51,33],[155.087,0.03,99,22],[155.087,0.055,50,59],[155.087,0.045,111,21],[155.147,0.16,39,56],[155.147,0.14,51,33],[155.769,0.045,111,9],[155.996,0.409,76,38],[155.996,0.191,76,14],[156.451,0.03,99,22],[156.451,0.055,50,59],[156.511,0.16,39,56],[156.511,0.14,51,33],[157.814,0.03,99,22],[157.814,0.055,50,59],[157.874,0.16,39,56],[157.874,0.14,51,33],[158.041,0.191,76,14],[158.723,0.409,71,38],[159.178,0.03,99,22],[159.178,0.055,50,59],[159.238,0.16,39,56],[159.238,0.14,51,33],[159.86,0.045,111,14],[160.541,0.045,111,18],[160.542,0.03,99,22],[160.542,0.055,50,59],[160.601,0.16,39,56],[160.601,0.14,51,33],[161.905,0.03,99,22],[161.905,0.055,50,59],[161.965,0.16,39,56],[161.965,0.14,51,33],[162.814,0.191,60,20],[163.269,0.818,77,17],[163.269,0.03,99,22],[163.269,0.055,50,59],[163.329,0.16,39,56],[163.329,0.14,51,33],[164.632,0.03,99,22],[164.632,0.055,50,59],[164.632,0.045,111,15],[164.692,0.16,39,56],[164.692,0.14,51,33],[164.86,0.191,71,20],[165.314,0.045,111,15],[165.996,0.03,99,22],[165.996,0.055,50,59],[166.056,0.16,39,56],[166.056,0.14,51,33],[167.36,0.818,73,17],[167.36,0.03,99,22],[167.36,0.055,50,59],[167.42,0.16,39,56],[167.42,0.14,51,33],[168.723,0.03,99,22],[168.723,0.055,50,59],[168.783,0.16,39,56],[168.783,0.14,51,33],[169.632,0.191,62,20],[170.087,0.03,99,22],[170.087,0.055,50,59],[170.087,0.045,111,21],[170.147,0.16,39,56],[170.147,0.14,51,33],[170.769,0.045,111,9],[171.451,0.818,73,16],[171.451,0.03,99,22],[171.451,0.055,50,59],[171.511,0.16,39,56],[171.511,0.14,51,33],[171.678,0.191,60,18],[172.814,0.03,99,22],[172.814,0.055,50,59],[172.874,0.16,39,56],[172.874,0.14,51,33],[174.178,0.03,99,22],[174.178,0.055,50,59],[174.238,0.16,39,56],[174.238,0.14,51,33],[174.86,0.045,111,14],[175.541,1.227,73,16],[175.541,0.045,111,18],[175.542,0.03,99,22],[175.542,0.055,50,59],[175.601,0.16,39,56],[175.601,0.14,51,33],[176.451,0.191,71,18],[176.905,0.03,99,22],[176.905,0.055,50,59],[176.965,0.16,39,56],[176.965,0.14,51,33],[178.269,0.03,99,22],[178.269,0.055,50,59],[178.329,0.16,39,56],[178.329,0.14,51,33],[178.496,0.191,65,18],[179.632,0.409,70,14],[179.632,0.03,99,22],[179.632,0.055,50,59],[179.632,0.045,111,15],[179.692,0.16,39,56],[179.692,0.14,51,33],[180.314,0.045,111,15],[180.996,0.03,99,22],[180.996,0.055,50,59],[181.056,0.16,39,56],[181.056,0.14,51,33],[182.36,0.03,99,22],[182.36,0.055,50,59],[182.42,0.16,39,56],[182.42,0.14,51,33],[183.811,0.03,99,22],[183.811,0.055,50,59],[183.871,0.16,39,56],[183.871,0.14,51,33],[185.263,0.03,99,22],[185.263,0.055,50,59],[185.323,0.16,39,56],[185.323,0.14,51,33],[186.714,0.03,99,22],[186.714,0.055,50,59],[186.774,0.16,39,56],[186.774,0.14,51,33],[188.166,0.03,99,22],[188.166,0.055,50,59],[188.226,0.16,39,56],[188.226,0.14,51,33],[189.773,0.03,99,22],[189.773,0.055,50,59],[189.833,0.16,39,56],[189.833,0.14,51,33],[191.38,0.03,99,22],[191.38,0.055,50,59],[191.44,0.16,39,56],[191.44,0.14,51,33],[192.988,1.607,45,28],[192.988,0.03,99,22],[192.988,0.055,50,59],[193.048,0.16,39,56],[193.048,0.14,51,33],[194.595,0.03,99,22],[194.595,0.055,50,59],[194.655,0.16,39,56],[194.655,0.14,51,33],[195.195,0.27,48,39],[195.195,0.03,83,14],[195.195,0.03,99,21],[195.195,0.055,50,56],[195.215,0.31,42,19],[195.255,0.16,39,52],[195.255,0.14,51,32],[195.589,0.158,69,15],[195.787,0.158,70,15],[195.984,0.27,48,39],[195.984,0.03,83,14],[195.984,0.03,99,21],[195.984,0.055,50,56],[196.004,0.31,42,19],[196.044,0.16,39,52],[196.044,0.14,51,32],[196.195,3,60,54],[196.774,0.27,48,39],[196.774,0.03,83,14],[196.774,0.03,99,21],[196.774,0.055,50,56],[196.794,0.31,42,19],[196.833,0.16,39,52],[196.833,0.14,51,32],[197.168,0.158,56,11],[197.366,0.158,55,11],[197.563,0.158,69,15],[197.563,0.27,48,39],[197.563,0.03,83,14],[197.563,0.03,99,21],[197.563,0.055,50,56],[197.583,0.31,42,19],[197.623,0.16,39,52],[197.623,0.14,51,32],[197.76,0.158,67,15],[198.352,0.27,48,39],[198.352,0.03,83,14],[198.352,0.03,99,21],[198.352,0.055,50,56],[198.373,0.31,42,19],[198.412,0.16,39,52],[198.412,0.14,51,32],[199.142,0.158,72,15],[199.142,0.27,48,39],[199.142,0.03,83,14],[199.142,0.03,99,21],[199.142,0.055,50,56],[199.162,0.31,42,19],[199.202,0.16,39,52],[199.202,0.14,51,32],[199.339,0.158,74,15],[199.931,0.27,48,39],[199.931,0.03,83,14],[199.931,0.03,99,21],[199.931,0.055,50,56],[199.952,0.31,42,19],[199.991,0.16,39,52],[199.991,0.14,51,32],[200.721,0.158,56,11],[200.721,0.27,48,39],[200.721,0.03,83,14],[200.721,0.03,99,21],[200.721,0.055,50,56],[200.741,0.31,42,19],[200.781,0.16,39,52],[200.781,0.14,51,32],[200.918,0.158,58,11],[201.51,0.27,48,39],[201.51,0.03,83,14],[201.51,0.03,99,21],[201.51,0.055,50,56],[201.53,0.31,42,19],[201.57,0.16,39,52],[201.57,0.14,51,32],[202.3,0.158,67,20],[202.3,0.27,48,39],[202.3,0.03,83,14],[202.3,0.03,99,21],[202.3,0.055,50,56],[202.32,0.31,42,19],[202.36,0.16,39,52],[202.36,0.14,51,32],[202.497,0.158,65,20],[202.695,0.158,76,27],[202.892,0.158,77,27],[203.089,0.27,48,39],[203.089,0.03,83,14],[203.089,0.03,99,21],[203.089,0.055,50,56],[203.109,0.31,42,19],[203.149,0.16,39,52],[203.149,0.14,51,32],[203.879,0.27,48,39],[203.879,0.03,83,14],[203.879,0.03,99,21],[203.879,0.055,50,56],[203.899,0.31,42,19],[203.939,0.16,39,52],[203.939,0.14,51,32],[204.274,0.158,60,20],[204.471,0.158,62,20],[204.668,0.27,48,39],[204.668,0.03,83,14],[204.668,0.03,99,21],[204.668,0.055,50,56],[204.688,0.31,42,19],[204.728,0.16,39,52],[204.728,0.14,51,32],[205.383,0.27,48,39],[205.383,0.03,83,14],[205.383,0.03,99,21],[205.383,0.055,50,56],[205.403,0.31,42,19],[205.443,0.16,39,52],[205.443,0.14,51,32],[205.74,0.143,63,20],[205.918,0.143,62,20],[206.097,0.143,76,27],[206.097,0.27,48,39],[206.097,0.03,83,14],[206.097,0.03,99,21],[206.097,0.055,50,56],[206.117,0.31,42,19],[206.157,0.16,39,52],[206.157,0.14,51,32],[206.275,0.143,74,27],[206.811,0.27,48,39],[206.811,0.03,83,14],[206.811,0.03,99,21],[206.811,0.055,50,56],[206.831,0.31,42,19],[206.871,0.16,39,52],[206.871,0.14,51,32],[207.525,0.143,63,17],[207.525,0.143,65,23],[207.525,0.27,48,39],[207.525,0.03,83,14],[207.525,0.03,99,21],[207.525,0.055,50,56],[207.546,0.31,42,19],[207.585,0.16,39,52],[207.585,0.14,51,32],[207.704,0.143,65,17],[207.704,0.143,67,23],[208.24,0.27,48,39],[208.24,0.03,83,14],[208.24,0.03,99,21],[208.24,0.055,50,56],[208.26,0.31,42,19],[208.3,0.16,39,52],[208.3,0.14,51,32],[208.954,0.143,60,17],[208.954,0.27,48,39],[208.954,0.03,83,14],[208.954,0.03,99,21],[208.954,0.055,50,56],[208.974,0.31,42,19],[209.014,0.16,39,52],[209.014,0.14,51,32],[209.133,0.143,58,17],[209.311,0.143,72,23],[209.49,0.143,70,23],[209.668,0.27,48,39],[209.668,0.03,83,14],[209.668,0.03,99,21],[209.668,0.055,50,56],[209.688,0.31,42,19],[209.728,0.16,39,52],[209.728,0.14,51,32],[210.383,0.27,48,39],[210.383,0.03,83,14],[210.383,0.03,99,21],[210.383,0.055,50,56],[210.403,0.31,42,19],[210.443,0.16,39,52],[210.443,0.14,51,32],[210.74,0.143,69,23],[210.918,0.143,70,23],[211.097,0.27,48,39],[211.097,0.03,83,14],[211.097,0.03,99,21],[211.097,0.055,50,56],[211.117,0.31,42,19],[211.157,0.16,39,52],[211.157,0.14,51,32],[211.811,0.27,48,39],[211.811,0.03,83,14],[211.811,0.03,99,21],[211.811,0.055,50,56],[211.831,0.31,42,19],[211.871,0.16,39,52],[211.871,0.14,51,32],[212.168,0.143,56,17],[212.347,0.143,55,17],[212.525,0.143,69,23],[212.525,0.27,48,39],[212.525,0.03,83,14],[212.525,0.03,99,21],[212.525,0.055,50,56],[212.546,0.31,42,19],[212.585,0.16,39,52],[212.585,0.14,51,32],[212.704,0.143,67,23],[213.24,0.27,48,39],[213.24,0.03,83,14],[213.24,0.03,99,21],[213.24,0.055,50,56],[213.26,0.31,42,19],[213.3,0.16,39,52],[213.3,0.14,51,32],[213.892,0.13,72,34],[213.892,0.27,48,39],[213.892,0.03,83,14],[213.892,0.03,99,21],[213.892,0.055,50,56],[213.912,0.31,42,19],[213.952,0.16,39,52],[213.952,0.14,51,32],[214.055,0.13,74,34],[214.544,0.27,48,39],[214.544,0.03,83,14],[214.544,0.03,99,21],[214.544,0.055,50,56],[214.564,0.31,42,19],[214.604,0.16,39,52],[214.604,0.14,51,32],[215.196,0.13,56,25],[215.196,0.27,48,39],[215.196,0.03,83,14],[215.196,0.03,99,21],[215.196,0.055,50,56],[215.216,0.31,42,19],[215.256,0.16,39,52],[215.256,0.14,51,32],[215.359,0.13,58,25],[215.848,0.27,48,39],[215.848,0.03,83,14],[215.848,0.03,99,21],[215.848,0.055,50,56],[215.868,0.31,42,19],[215.908,0.16,39,52],[215.908,0.14,51,32],[216.501,0.13,67,25],[216.501,0.27,48,39],[216.501,0.03,83,14],[216.501,0.03,99,21],[216.501,0.055,50,56],[216.521,0.31,42,19],[216.561,0.16,39,52],[216.561,0.14,51,32],[216.664,0.13,65,25],[216.827,0.13,76,34],[216.99,0.13,77,34],[217.153,0.27,48,39],[217.153,0.03,83,14],[217.153,0.03,99,21],[217.153,0.055,50,56],[217.173,0.31,42,19],[217.213,0.16,39,52],[217.213,0.14,51,32],[217.805,0.27,48,39],[217.805,0.03,83,14],[217.805,0.03,99,21],[217.805,0.055,50,56],[217.825,0.31,42,19],[217.865,0.16,39,52],[217.865,0.14,51,32],[218.131,0.13,60,35],[218.294,0.13,62,35],[218.457,0.114,65,53],[218.457,0.03,99,21],[218.457,0.055,50,56],[218.517,0.16,39,52],[218.517,0.14,51,32],[219.109,0.03,99,21],[219.109,0.055,50,56],[219.15,0.114,70,53],[219.169,0.16,39,52],[219.169,0.14,51,32],[219.598,0.114,75,53],[219.761,0.03,99,21],[219.761,0.055,50,56],[219.821,0.16,39,52],[219.821,0.14,51,32],[220.022,0.391,77,59],[220.414,0.5,102,108],[220.414,0.03,99,21],[220.414,0.055,50,56],[220.474,0.16,39,52],[220.474,0.14,51,32],[221.066,0.03,99,21],[221.066,0.055,50,56],[221.126,0.16,39,52],[221.126,0.14,51,32],[221.718,0.03,99,21],[221.718,0.055,50,56],[221.778,0.16,39,52],[221.778,0.14,51,32],[222.37,0.03,99,21],[222.37,0.055,50,56],[222.43,0.16,39,52],[222.43,0.14,51,32],[222.614,0.27,48,39],[222.614,0.03,83,14],[222.614,0.03,99,21],[222.614,0.055,50,56],[222.634,0.31,42,19],[222.674,0.16,39,52],[222.674,0.14,51,32],[223.328,0.27,48,39],[223.328,0.03,83,14],[223.328,0.03,99,21],[223.328,0.055,50,56],[223.348,0.31,42,19],[223.388,0.16,39,52],[223.388,0.14,51,32],[223.685,0.143,63,35],[223.864,0.143,62,35],[224.042,0.143,76,47],[224.042,0.27,48,39],[224.042,0.03,83,14],[224.042,0.03,99,21],[224.042,0.055,50,56],[224.062,0.31,42,19],[224.102,0.16,39,52],[224.102,0.14,51,32],[224.221,0.143,74,47],[224.756,0.27,48,39],[224.756,0.03,83,14],[224.757,0.03,99,21],[224.757,0.055,50,56],[224.776,0.31,42,19],[224.817,0.16,39,52],[224.817,0.14,51,32],[225.471,0.143,63,43],[225.471,0.143,65,57],[225.471,0.27,48,39],[225.471,0.03,83,14],[225.471,0.03,99,21],[225.471,0.055,50,56],[225.491,0.31,42,19],[225.531,0.16,39,52],[225.531,0.14,51,32],[225.649,0.143,65,43],[225.649,0.143,67,57],[226.185,0.27,48,39],[226.185,0.03,83,14],[226.185,0.03,99,21],[226.185,0.055,50,56],[226.205,0.31,42,19],[226.245,0.16,39,52],[226.245,0.14,51,32],[226.899,0.143,60,43],[226.899,0.27,48,39],[226.899,0.03,83,14],[226.899,0.03,99,21],[226.899,0.055,50,56],[226.919,0.31,42,19],[226.959,0.16,39,52],[226.959,0.14,51,32],[227.078,0.143,58,43],[227.256,0.143,72,57],[227.435,0.143,70,57],[227.614,0.27,48,39],[227.614,0.03,83,14],[227.614,0.03,99,21],[227.614,0.055,50,56],[227.634,0.31,42,19],[227.674,0.16,39,52],[227.674,0.14,51,32],[228.328,0.27,48,39],[228.328,0.03,83,14],[228.328,0.03,99,21],[228.328,0.055,50,56],[228.348,0.31,42,19],[228.388,0.16,39,52],[228.388,0.14,51,32],[228.654,0.13,69,57],[228.817,0.13,70,57],[228.98,0.27,48,39],[228.98,0.03,83,14],[228.98,0.03,99,21],[228.98,0.055,50,56],[229,0.31,42,19],[229.04,0.16,39,52],[229.04,0.14,51,32],[229.632,0.27,48,39],[229.632,0.03,83,14],[229.632,0.03,99,21],[229.632,0.055,50,56],[229.652,0.31,42,19],[229.692,0.16,39,52],[229.692,0.14,51,32],[229.958,0.13,56,43],[230.121,0.13,55,43],[230.284,0.03,99,21],[230.284,0.055,50,56],[230.285,0.13,69,57],[230.285,0.27,48,39],[230.285,0.03,83,14],[230.304,0.31,42,19],[230.344,0.16,39,52],[230.344,0.14,51,32],[230.447,0.13,67,57],[230.937,0.27,48,39],[230.937,0.03,83,14],[230.937,0.03,99,21],[230.937,0.055,50,56],[230.957,0.31,42,19],[230.997,0.16,39,52],[230.997,0.14,51,32],[231.589,0.13,72,67],[231.589,0.27,48,39],[231.589,0.03,83,14],[231.589,0.03,99,21],[231.589,0.055,50,56],[231.609,0.31,42,19],[231.649,0.16,39,52],[231.649,0.14,51,32],[231.752,0.13,74,67],[232.241,0.27,48,39],[232.241,0.03,83,14],[232.241,0.03,99,21],[232.241,0.055,50,56],[232.261,0.31,42,19],[232.301,0.16,39,52],[232.301,0.14,51,32],[232.893,0.13,56,50],[232.893,0.27,48,39],[232.893,0.03,83,14],[232.893,0.03,99,21],[232.893,0.055,50,56],[232.913,0.31,42,19],[232.953,0.16,39,52],[232.953,0.14,51,32],[233.056,0.13,58,50],[233.545,0.27,48,39],[233.545,0.03,83,14],[233.545,0.03,99,21],[233.545,0.055,50,56],[233.565,0.31,42,19],[233.605,0.16,39,52],[233.605,0.14,51,32],[234.145,0.12,67,50],[234.145,0.27,48,39],[234.145,0.03,83,14],[234.145,0.03,99,21],[234.145,0.055,50,56],[234.165,0.31,42,19],[234.205,0.16,39,52],[234.205,0.14,51,32],[234.295,0.12,65,50],[234.445,0.12,76,67],[234.595,0.12,77,67],[234.745,0.27,48,39],[234.745,0.03,83,14],[234.745,0.03,99,21],[234.745,0.055,50,56],[234.765,0.31,42,19],[234.805,0.16,39,52],[234.805,0.14,51,32],[235.345,0.27,48,39],[235.345,0.03,83,14],[235.345,0.03,99,21],[235.345,0.055,50,56],[235.365,0.31,42,19],[235.405,0.16,39,52],[235.405,0.14,51,32],[235.645,0.12,60,31],[235.795,0.12,62,31],[235.945,0.27,48,39],[235.945,0.03,83,14],[235.945,0.03,99,21],[235.945,0.055,50,56],[235.965,0.31,42,19],[236.005,0.16,39,52],[236.005,0.14,51,32],[236.545,0.27,48,39],[236.545,0.03,83,14],[236.545,0.03,99,21],[236.545,0.055,50,56],[236.565,0.31,42,19],[236.605,0.16,39,52],[236.605,0.14,51,32],[236.845,0.12,63,31],[236.995,0.12,62,31],[237.145,0.12,76,42],[237.145,0.27,48,39],[237.145,0.03,83,14],[237.145,0.03,99,21],[237.145,0.055,50,56],[237.165,0.31,42,19],[237.205,0.16,39,52],[237.205,0.14,51,32],[237.295,0.12,74,42],[237.745,0.27,48,39],[237.745,0.03,83,14],[237.745,0.03,99,21],[237.745,0.055,50,56],[237.765,0.31,42,19],[237.805,0.16,39,52],[237.805,0.14,51,32],[238.345,0.12,63,31],[238.345,0.105,65,47],[238.345,0.03,99,21],[238.345,0.055,50,56],[238.405,0.16,39,52],[238.405,0.14,51,32],[238.495,0.12,65,31],[238.945,0.03,99,21],[238.945,0.055,50,56],[238.983,0.105,70,47],[239.005,0.16,39,52],[239.005,0.14,51,32],[239.395,0.105,75,47],[239.545,0.03,99,21],[239.545,0.055,50,56],[239.605,0.16,39,52],[239.605,0.14,51,32],[239.785,0.36,77,52],[240.145,0.5,102,108],[240.145,0.03,99,21],[240.145,0.055,50,56],[240.205,0.16,39,52],[240.205,0.14,51,32],[240.745,0.03,99,21],[240.745,0.055,50,56],[240.805,0.16,39,52],[240.805,0.14,51,32],[241.345,0.03,99,21],[241.345,0.055,50,56],[241.405,0.16,39,52],[241.405,0.14,51,32],[241.945,0.03,99,21],[241.945,0.055,50,56],[242.005,0.16,39,52],[242.005,0.14,51,32],[242.145,0.65,60,16],[242.545,0.03,99,21],[242.545,0.055,50,56],[242.605,0.16,39,52],[242.605,0.14,51,32],[243.145,0.04,99,43],[243.145,0.03,99,16],[243.145,0.055,50,44],[243.205,0.16,39,41],[243.205,0.14,51,24],[243.86,0.16,48,49],[243.86,0.03,99,22],[244.574,0.03,99,16],[244.574,0.055,50,44],[244.634,0.16,39,41],[244.634,0.14,51,24],[245.145,1.5,60,33],[245.288,0.16,48,49],[245.288,0.03,99,22],[246.002,0.03,99,16],[246.002,0.055,50,44],[246.062,0.16,39,41],[246.062,0.14,51,24],[247.431,0.03,99,16],[247.431,0.055,50,44],[247.491,0.16,39,41],[247.491,0.14,51,24],[248.86,0.03,99,16],[248.86,0.055,50,44],[248.92,0.16,39,41],[248.92,0.14,51,24],[250.288,0.03,99,16],[250.288,0.055,50,44],[250.348,0.16,39,41],[250.348,0.14,51,24],[251.717,0.03,99,16],[251.717,0.055,50,44],[251.777,0.16,39,41],[251.777,0.14,51,24],[253.145,0.03,99,16],[253.145,0.055,50,44],[253.205,0.16,39,41],[253.205,0.14,51,24],[254.574,0.03,99,16],[254.574,0.055,50,44],[254.634,0.16,39,41],[254.634,0.14,51,24],[256.002,0.03,99,16],[256.002,0.055,50,44],[256.062,0.16,39,41],[256.062,0.14,51,24],[257.431,0.04,99,43],[257.431,0.03,99,16],[257.431,0.055,50,44],[257.491,0.16,39,41],[257.491,0.14,51,24],[258.145,0.16,43,49],[258.145,0.03,99,22],[258.86,0.03,99,16],[258.86,0.055,50,44],[258.92,0.16,39,41],[258.92,0.14,51,24],[259.574,0.16,43,49],[259.574,0.03,99,22],[260.288,0.03,99,16],[260.288,0.055,50,44],[260.348,0.16,39,41],[260.348,0.14,51,24],[261.717,0.03,99,16],[261.717,0.055,50,44],[261.777,0.16,39,41],[261.777,0.14,51,24],[263.145,0.03,99,16],[263.145,0.055,50,44],[263.205,0.16,39,41],[263.205,0.14,51,24],[264.574,0.03,99,16],[264.574,0.055,50,44],[264.634,0.16,39,41],[264.634,0.14,51,24],[266.002,0.25,59,40],[266.002,0.03,99,16],[266.002,0.055,50,44],[266.062,0.16,39,41],[266.062,0.14,51,24],[267.431,0.03,99,16],[267.431,0.055,50,44],[267.491,0.16,39,41],[267.491,0.14,51,24],[267.788,0.25,69,49],[268.86,0.03,99,16],[268.86,0.055,50,44],[268.92,0.16,39,41],[268.92,0.14,51,24],[270.288,0.03,99,16],[270.288,0.055,50,44],[270.348,0.16,39,41],[270.348,0.14,51,24],[271.717,0.04,99,43],[271.717,0.03,99,16],[271.717,0.055,50,44],[271.777,0.16,39,41],[271.777,0.14,51,24],[272.431,0.16,48,49],[272.431,0.03,99,22],[273.145,0.03,99,16],[273.145,0.055,50,44],[273.205,0.16,39,41],[273.205,0.14,51,24],[273.86,0.16,48,49],[273.86,0.03,99,22],[274.574,0.03,99,16],[274.574,0.055,50,44],[274.634,0.16,39,41],[274.634,0.14,51,24],[276.002,0.03,99,16],[276.002,0.055,50,44],[276.062,0.16,39,41],[276.062,0.14,51,24],[277.431,1.429,60,42],[277.431,0.03,99,16],[277.431,0.055,50,44],[277.491,0.16,39,41],[277.491,0.14,51,24],[278.86,0.03,99,16],[278.86,0.055,50,44],[278.92,0.16,39,41],[278.92,0.14,51,24],[280.288,0.03,99,16],[280.288,0.055,50,44],[280.348,0.16,39,41],[280.348,0.14,51,24],[281.717,0.03,99,16],[281.717,0.055,50,44],[281.777,0.16,39,41],[281.777,0.14,51,24],[283.145,0.03,99,16],[283.145,0.055,50,44],[283.205,0.16,39,41],[283.205,0.14,51,24],[284.574,0.03,99,16],[284.574,0.055,50,44],[284.634,0.16,39,41],[284.634,0.14,51,24],[286.002,0.04,99,43],[286.002,0.03,99,16],[286.002,0.055,50,44],[286.062,0.16,39,41],[286.062,0.14,51,24],[286.36,0.16,43,49],[286.36,0.03,99,22],[287.074,0.16,43,49],[287.074,0.03,99,22],[287.431,0.03,99,16],[287.431,0.055,50,44],[287.491,0.16,39,41],[287.491,0.14,51,24],[287.788,0.16,43,49],[287.788,0.03,99,22],[288.502,0.16,43,49],[288.502,0.03,99,22],[288.86,0.03,99,16],[288.86,0.055,50,44],[288.92,0.16,39,41],[288.92,0.14,51,24],[290.288,0.03,99,16],[290.288,0.055,50,44],[290.348,0.16,39,41],[290.348,0.14,51,24],[291.717,0.03,99,16],[291.717,0.055,50,44],[291.777,0.16,39,41],[291.777,0.14,51,24],[293.145,0.03,99,16],[293.145,0.055,50,44],[293.205,0.16,39,41],[293.205,0.14,51,24],[294.574,0.03,99,16],[294.574,0.055,50,44],[294.634,0.16,39,41],[294.634,0.14,51,24],[296.002,0.03,99,16],[296.002,0.055,50,44],[296.062,0.16,39,41],[296.062,0.14,51,24],[297.431,0.03,99,16],[297.431,0.055,50,44],[297.491,0.16,39,41],[297.491,0.14,51,24],[298.86,0.03,99,16],[298.86,0.055,50,44],[298.92,0.16,39,41],[298.92,0.14,51,24],[300.288,0.03,99,16],[300.288,0.055,50,44],[300.348,0.16,39,41],[300.348,0.14,51,24],[301.488,0.444,53,35],[301.488,0.03,99,20],[301.488,0.055,50,53],[301.488,6.333,65,17],[301.548,0.16,39,50],[301.548,0.14,51,30],[301.766,0.065,99,17],[302.044,0.065,99,17],[302.322,0.03,99,20],[302.322,0.055,50,53],[302.382,0.16,39,50],[302.382,0.14,51,30],[302.488,6,60,10],[302.877,0.444,72,35],[303.155,0.03,99,20],[303.155,0.055,50,53],[303.215,0.16,39,50],[303.215,0.14,51,30],[303.433,0.065,99,17],[303.71,0.065,99,17],[303.988,0.03,99,20],[303.988,0.055,50,53],[304.048,0.16,39,50],[304.048,0.14,51,30],[304.266,0.444,69,35],[304.822,0.03,99,20],[304.822,0.055,50,53],[304.882,0.16,39,50],[304.882,0.14,51,30],[305.099,0.065,99,17],[305.377,0.065,99,17],[305.655,0.444,70,35],[305.655,0.03,99,20],[305.655,0.055,50,53],[305.715,0.16,39,50],[305.715,0.14,51,30],[306.488,0.03,99,20],[306.488,0.055,50,53],[306.548,0.16,39,50],[306.548,0.14,51,30],[306.766,0.065,99,17],[307.044,0.444,67,35],[307.044,0.065,99,17],[307.322,0.03,99,20],[307.322,0.055,50,53],[307.382,0.16,39,50],[307.382,0.14,51,30],[308.155,0.03,99,20],[308.155,0.055,50,53],[308.155,6.333,65,8],[308.215,0.16,39,50],[308.215,0.14,51,30],[308.433,0.444,57,35],[308.433,0.065,99,17],[308.71,0.065,99,17],[308.988,0.03,99,20],[308.988,0.055,50,53],[309.048,0.16,39,50],[309.048,0.14,51,30],[309.822,0.444,50,35],[309.822,0.03,99,20],[309.822,0.055,50,53],[309.882,0.16,39,49],[309.882,0.14,51,30],[310.099,0.065,99,17],[310.377,0.065,99,17],[310.655,0.03,99,20],[310.655,0.055,50,52],[310.715,0.16,39,49],[310.715,0.14,51,30],[311.21,0.444,69,35],[311.488,0.03,99,20],[311.488,0.055,50,52],[311.548,0.16,39,49],[311.548,0.14,51,29],[311.766,0.065,99,16],[312.044,0.065,99,16],[312.322,0.444,70,10],[312.322,0.03,99,19],[312.322,0.055,50,52],[312.382,0.16,39,49],[312.382,0.14,51,29],[312.599,0.444,74,47],[313.155,0.03,99,19],[313.155,0.055,50,51],[313.215,0.16,39,48],[313.215,0.14,51,29],[313.433,0.065,99,16],[313.71,0.444,67,13],[313.71,0.065,99,16],[313.988,0.444,72,46],[313.988,0.03,99,19],[313.988,0.055,50,51],[314.048,0.16,39,47],[314.048,0.14,51,28],[314.822,0.03,99,19],[314.822,0.055,50,50],[314.822,6.333,72,16],[314.882,0.16,39,47],[314.882,0.14,51,28],[315.099,0.444,57,18],[315.099,0.065,99,15],[315.377,0.444,60,44],[315.377,0.065,99,15],[315.655,0.03,99,18],[315.655,0.055,50,48],[315.715,0.16,39,45],[315.715,0.14,51,27],[316.488,0.444,53,22],[316.488,0.03,99,18],[316.488,0.055,50,47],[316.548,0.16,39,44],[316.548,0.14,51,26],[316.766,0.444,57,42],[316.766,0.065,99,15],[317.044,0.065,99,14],[317.322,0.03,99,17],[317.322,0.055,50,45],[317.382,0.16,39,42],[317.382,0.14,51,25],[317.877,0.444,72,28],[318.155,0.444,58,39],[318.155,0.03,99,16],[318.155,0.055,50,43],[318.215,0.16,39,40],[318.215,0.14,51,24],[318.433,0.065,99,13],[318.71,0.065,99,13],[318.988,0.03,99,15],[318.988,0.055,50,40],[319.048,0.16,39,37],[319.048,0.14,51,22],[319.266,0.444,74,33],[319.544,0.444,77,34],[319.822,0.03,99,14],[319.822,0.055,50,36],[319.882,0.16,39,34],[319.882,0.14,51,20],[320.099,0.065,99,11],[320.377,0.065,99,11],[320.655,0.444,72,38],[320.655,0.03,99,12],[320.655,0.055,50,32],[320.715,0.16,39,30],[320.715,0.14,51,18],[320.933,0.444,76,28],[321.488,0.03,99,10],[321.488,0.055,50,28],[321.548,0.16,39,26],[321.548,0.14,51,16],[321.766,0.065,99,8],[322.044,0.444,60,43],[322.044,0.065,99,8],[322.322,0.444,65,21],[322.322,0.03,99,9],[322.322,0.055,50,23],[322.382,0.16,39,21],[322.382,0.14,51,13],[323.155,0.055,50,17],[323.215,0.16,39,16],[323.215,0.14,51,10],[323.433,0.444,53,28],[323.71,0.444,57,7],[323.988,0.055,50,11],[324.048,0.16,39,10],[324.822,0.444,58,29],[326.21,0.444,77,29],[327.322,0.444,72,9],[327.599,0.444,76,28],[328.155,6.333,69,9],[328.71,0.444,60,15],[328.988,0.444,65,24],[330.099,0.444,57,21],[330.377,0.444,60,20],[331.21,0.25,77,13],[331.488,0.444,58,26],[331.766,0.444,62,13],[332.322,0.75,77,23],[332.877,0.444,77,28],[334.266,0.444,76,26],[334.822,6.333,65,13],[335.655,0.444,65,25],[336.488,0.75,79,20],[336.766,0.444,53,13],[337.044,0.444,57,22],[337.599,0.065,99,10],[337.877,0.25,76,15],[337.877,0.065,99,11],[338.155,0.444,58,19],[338.433,0.444,62,18],[339.266,0.065,99,14],[339.544,0.444,77,23],[339.544,0.065,99,15],[339.822,0.444,60,11],[339.822,0.5,77,9],[340.933,0.444,76,26],[340.933,0.5,76,21],[340.933,0.065,99,16],[341.21,0.065,99,16],[341.488,6.333,72,8],[342.322,0.444,65,26],[342.599,0.065,99,17],[342.877,0.065,99,16],[343.71,0.444,60,18],[344.266,0.065,99,15],[344.544,0.065,99,15],[344.822,0.444,58,9],[344.822,0.75,64,11],[345.099,0.444,62,16],[345.933,0.065,99,12],[346.21,0.444,77,13],[346.21,0.065,99,12],[346.488,0.444,60,12],[346.488,0.5,67,10],[347.599,0.444,76,16],[347.599,0.065,99,9],[347.877,0.444,79,9],[347.877,0.065,99,8],[348.155,6.333,69,28],[348.988,0.444,65,18],[350.377,0.444,57,19],[350.655,0.5,65,13],[351.766,0.444,62,18],[352.322,0.055,50,12],[352.382,0.16,39,11],[353.155,0.444,60,18],[353.155,0.055,50,18],[353.215,0.16,39,17],[353.215,0.14,51,10],[353.71,0.5,67,12],[353.988,0.03,99,9],[353.988,0.055,50,23],[354.048,0.16,39,22],[354.048,0.14,51,13],[354.266,0.444,76,7],[354.544,0.444,79,13],[354.822,0.03,99,11],[354.822,0.055,50,28],[354.822,6.333,69,10],[354.882,0.16,39,27],[354.882,0.14,51,16],[355.099,0.065,99,9],[355.377,0.065,99,10],[355.655,0.444,65,10],[355.655,0.03,99,12],[355.655,0.055,50,33],[355.715,0.16,39,31],[355.715,0.14,51,19],[355.933,0.444,69,12],[356.488,0.03,99,14],[356.488,0.055,50,36],[356.548,0.16,39,34],[356.548,0.14,51,21],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,12],[357.322,0.444,65,10],[357.322,0.03,99,15],[357.322,0.055,50,40],[357.382,0.16,39,38],[357.382,0.14,51,23],[358.155,0.03,99,16],[358.155,0.055,50,43],[358.215,0.16,39,40],[358.215,0.14,51,24],[358.433,0.444,62,13],[358.433,0.065,99,14],[358.71,0.444,65,9],[358.71,0.065,99,14],[358.988,0.03,99,17],[358.988,0.055,50,45],[359.048,0.16,39,42],[359.048,0.14,51,25],[359.822,0.444,60,14],[359.822,0.03,99,18],[359.822,0.055,50,47],[359.882,0.16,39,44],[359.882,0.14,51,26],[360.099,0.065,99,15],[360.377,0.065,99,15],[360.655,0.03,99,18],[360.655,0.055,50,48],[360.715,0.16,39,46],[360.715,0.14,51,27],[361.21,0.444,79,14],[361.488,0.03,99,19],[361.488,0.055,50,50],[361.548,0.16,39,47],[361.548,0.14,51,28],[361.766,0.065,99,16],[362.044,0.065,99,16],[362.322,0.03,99,19],[362.322,0.055,50,51],[362.382,0.16,39,48],[362.382,0.14,51,29],[362.599,0.444,69,15],[363.155,0.03,99,19],[363.155,0.055,50,51],[363.215,0.16,39,48],[363.215,0.14,51,29],[363.433,0.065,99,16],[363.71,0.065,99,16],[363.988,0.444,62,13],[363.988,0.03,99,19],[363.988,0.055,50,52],[364.048,0.16,39,49],[364.048,0.14,51,29],[364.822,0.03,99,20],[364.822,0.055,50,52],[364.882,0.16,39,49],[364.882,0.14,51,29],[365.099,0.065,99,16],[365.377,0.444,65,23],[365.377,0.065,99,16],[365.655,0.03,99,20],[365.655,0.055,50,53],[365.715,0.16,39,49],[365.715,0.14,51,30],[366.488,0.03,99,20],[366.488,0.055,50,53],[366.548,0.16,39,49],[366.548,0.14,51,30],[366.766,0.444,64,19],[366.766,0.065,99,17],[367.044,0.065,99,17],[367.322,0.03,99,20],[367.322,0.055,50,53],[367.382,0.16,39,50],[367.382,0.14,51,30],[368.155,0.444,53,16],[368.155,0.03,99,20],[368.155,0.055,50,53],[368.215,0.16,39,50],[368.215,0.14,51,30],[368.433,0.065,99,17],[368.71,0.065,99,17],[368.988,0.03,99,20],[368.988,0.055,50,53],[369.048,0.16,39,50],[369.048,0.14,51,30],[369.544,0.444,72,16],[369.822,0.03,99,20],[369.822,0.055,50,53],[369.882,0.16,39,50],[369.882,0.14,51,30],[370.099,0.065,99,17],[370.377,0.065,99,17],[370.655,0.03,99,20],[370.655,0.055,50,53],[370.715,0.16,39,50],[370.715,0.14,51,30],[370.933,0.444,69,12],[371.488,0.03,99,20],[371.488,0.055,50,53],[371.548,0.16,39,50],[371.548,0.14,51,30],[371.766,0.065,99,17],[372.044,0.065,99,17],[372.322,0.444,70,8],[372.322,0.03,99,20],[372.322,0.055,50,53],[372.382,0.16,39,50],[372.382,0.14,51,30],[373.155,0.03,99,20],[373.155,0.055,50,53],[373.215,0.16,39,50],[373.215,0.14,51,30],[373.433,0.065,99,17],[373.71,0.065,99,17],[373.988,0.03,99,20],[373.988,0.055,50,53],[374.048,0.16,39,50],[374.048,0.14,51,30],[374.822,0.03,99,20],[374.822,0.055,50,53],[374.882,0.16,39,50],[374.882,0.14,51,30],[375.099,0.065,99,17],[375.377,0.065,99,17],[375.655,0.03,99,20],[375.655,0.055,50,53],[375.715,0.16,39,50],[375.715,0.14,51,30],[375.822,0.27,48,39],[375.822,0.03,83,14],[375.822,0.03,99,19],[375.822,0.055,50,50],[375.822,4.071,67,8],[375.841,0.31,42,19],[375.882,0.16,39,47],[375.882,0.14,51,28],[376.25,0.321,64,25],[376.893,0.27,48,39],[376.893,0.03,83,14],[376.893,0.03,99,19],[376.893,0.055,50,50],[376.913,0.31,42,19],[376.953,0.16,39,47],[376.953,0.14,51,28],[377.295,0.7,64,12],[377.964,0.321,60,27],[377.964,0.27,48,41],[377.964,0.03,83,14],[377.964,0.03,99,19],[377.964,0.055,50,50],[377.984,0.31,42,21],[378.024,0.16,39,47],[378.024,0.14,51,28],[379.036,0.27,48,41],[379.036,0.03,83,14],[379.036,0.03,99,19],[379.036,0.055,50,50],[379.056,0.31,42,21],[379.096,0.16,39,47],[379.096,0.14,51,28],[379.822,0.321,67,27],[380.107,0.27,48,44],[380.107,0.03,83,15],[380.107,0.03,99,19],[380.107,0.055,50,50],[380.107,4.071,64,10],[380.127,0.31,42,22],[380.167,0.16,39,47],[380.167,0.14,51,28],[381.179,0.27,48,44],[381.179,0.03,83,15],[381.179,0.03,99,19],[381.179,0.055,50,50],[381.199,0.31,42,22],[381.239,0.16,39,47],[381.239,0.14,51,28],[381.607,0.321,60,28],[382.25,0.27,48,46],[382.25,0.03,83,16],[382.25,0.03,99,19],[382.25,0.055,50,50],[382.27,0.31,42,23],[382.31,0.16,39,47],[382.31,0.14,51,28],[383.054,0.7,62,13],[383.322,0.321,57,30],[383.322,0.27,48,46],[383.322,0.03,83,16],[383.322,0.03,99,19],[383.322,0.055,50,50],[383.341,0.31,42,23],[383.382,0.16,39,47],[383.382,0.14,51,28],[384.393,0.27,48,48],[384.393,0.03,83,17],[384.393,0.03,99,19],[384.393,0.055,50,50],[384.393,4.071,60,18],[384.413,0.31,42,24],[384.453,0.16,39,47],[384.453,0.14,51,28],[384.795,0.7,60,28],[385.179,0.321,60,31],[385.464,0.27,48,48],[385.464,0.03,83,17],[385.464,0.03,99,19],[385.464,0.055,50,50],[385.484,0.31,42,24],[385.524,0.16,39,47],[385.524,0.14,51,28],[386.536,0.27,48,51],[386.536,0.03,83,18],[386.536,0.03,99,19],[386.536,0.055,50,50],[386.556,0.31,42,25],[386.596,0.16,39,47],[386.596,0.14,51,28],[386.804,0.204,60,28],[386.964,0.321,57,51],[387.607,0.27,48,51],[387.607,0.03,83,18],[387.607,0.03,99,19],[387.607,0.055,50,50],[387.627,0.31,42,25],[387.667,0.16,39,47],[387.667,0.14,51,28],[388.679,0.321,55,53],[388.679,0.27,48,53],[388.679,0.03,83,19],[388.679,0.03,99,19],[388.679,0.055,50,50],[388.679,4.071,62,10],[388.699,0.31,42,26],[388.739,0.16,39,47],[388.739,0.14,51,28],[389.75,0.27,48,53],[389.75,0.03,83,19],[389.75,0.03,99,19],[389.75,0.055,50,50],[389.77,0.31,42,26],[389.81,0.16,39,47],[389.81,0.14,51,28],[390.536,0.321,62,53],[390.554,0.7,71,45],[390.822,0.27,48,49],[390.822,0.03,83,17],[390.822,0.03,99,19],[390.822,0.055,50,50],[390.841,0.31,42,24],[390.882,0.16,39,47],[390.882,0.14,51,28],[391.223,0.7,64,86],[391.893,0.161,60,34],[391.893,0.03,99,19],[391.893,0.055,50,50],[391.953,0.16,39,47],[391.953,0.14,51,28],[392.964,0.27,48,41],[392.964,0.03,83,14],[392.964,0.03,99,19],[392.964,0.055,50,50],[392.964,3.931,64,31],[392.984,0.31,42,21],[393.024,0.16,39,47],[393.024,0.14,51,28],[393.223,0.197,79,23],[393.378,0.31,76,41],[393.999,0.27,48,41],[393.999,0.03,83,14],[393.999,0.03,99,19],[393.999,0.055,50,50],[394.019,0.31,42,21],[394.059,0.16,39,47],[394.059,0.14,51,28],[394.775,0.035,117,9],[395.033,0.31,72,55],[395.033,0.27,48,43],[395.033,0.03,83,15],[395.033,0.03,99,19],[395.033,0.055,50,50],[395.053,0.31,42,22],[395.093,0.16,39,47],[395.093,0.14,51,28],[395.292,0.035,117,12],[396.068,0.27,48,43],[396.068,0.03,83,15],[396.068,0.03,99,19],[396.068,0.055,50,50],[396.088,0.31,42,22],[396.128,0.16,39,47],[396.128,0.14,51,28],[396.827,0.31,79,55],[397.102,0.27,48,46],[397.102,0.03,83,16],[397.102,0.03,99,19],[397.102,0.055,50,50],[397.102,3.931,60,53],[397.122,0.31,42,23],[397.162,0.16,39,47],[397.162,0.14,51,28],[397.878,0.7,76,40],[398.137,0.197,72,32],[398.137,0.27,48,46],[398.137,0.03,83,16],[398.137,0.03,99,19],[398.137,0.055,50,50],[398.157,0.31,42,23],[398.197,0.16,39,47],[398.197,0.14,51,28],[398.525,0.7,79,33],[398.551,0.31,72,58],[399.171,0.27,48,48],[399.171,0.03,83,17],[399.171,0.03,99,19],[399.171,0.055,50,50],[399.191,0.31,42,24],[399.231,0.16,39,47],[399.231,0.14,51,28],[399.947,0.035,117,13],[400.206,0.31,69,61],[400.206,0.27,48,48],[400.206,0.03,83,17],[400.206,0.03,99,19],[400.206,0.055,50,50],[400.226,0.31,42,24],[400.266,0.16,39,47],[400.266,0.14,51,28],[400.464,0.035,117,12],[401.24,0.27,48,51],[401.24,0.03,83,18],[401.24,0.03,99,19],[401.24,0.055,50,50],[401.24,3.931,57,27],[401.26,0.31,42,25],[401.3,0.16,39,47],[401.3,0.14,51,28],[401.999,0.31,72,64],[402.275,0.27,48,51],[402.275,0.03,83,18],[402.275,0.03,99,19],[402.275,0.055,50,50],[402.295,0.31,42,25],[402.335,0.16,39,47],[402.335,0.14,51,28],[403.051,0.197,65,37],[403.309,0.27,48,53],[403.309,0.03,83,19],[403.309,0.03,99,19],[403.309,0.055,50,50],[403.329,0.31,42,27],[403.369,0.16,39,47],[403.369,0.14,51,28],[403.568,0.197,72,38],[403.723,0.31,69,68],[404.085,0.7,77,19],[404.344,0.27,48,53],[404.344,0.03,83,19],[404.344,0.03,99,19],[404.344,0.055,50,50],[404.364,0.31,42,27],[404.404,0.16,39,47],[404.404,0.14,51,28],[404.602,0.035,117,9],[405.12,0.035,117,15],[405.378,0.31,67,72],[405.378,0.27,48,56],[405.378,0.03,83,19],[405.378,0.03,99,19],[405.378,0.055,50,50],[405.378,3.931,59,23],[405.398,0.31,42,28],[405.438,0.16,39,47],[405.438,0.14,51,28],[405.637,0.035,117,11],[405.766,0.7,74,32],[406.413,0.27,48,56],[406.413,0.03,83,19],[406.413,0.03,99,19],[406.413,0.055,50,50],[406.433,0.31,42,28],[406.473,0.16,39,47],[406.473,0.14,51,28],[407.171,0.31,74,72],[407.447,0.27,48,52],[407.447,0.03,83,18],[407.447,0.03,99,19],[407.447,0.055,50,50],[407.467,0.31,42,26],[407.507,0.16,39,47],[407.507,0.14,51,28],[408.482,0.155,60,46],[408.482,0.03,99,19],[408.482,0.055,50,50],[408.542,0.16,39,47],[408.542,0.14,51,28],[409.516,0.27,48,43],[409.516,0.03,83,15],[409.516,0.03,99,19],[409.516,0.055,50,50],[409.536,0.31,42,22],[409.576,0.16,39,47],[409.576,0.14,51,28],[409.766,0.19,91,27],[409.766,0.035,117,10],[409.916,0.3,88,48],[410.266,0.035,117,12],[410.516,0.27,48,43],[410.516,0.03,83,15],[410.516,0.03,99,19],[410.516,0.055,50,50],[410.536,0.31,42,22],[410.576,0.16,39,47],[410.576,0.14,51,28],[411.266,0.7,88,11],[411.516,0.3,84,61],[411.516,0.27,48,46],[411.516,0.03,83,16],[411.516,0.03,99,19],[411.516,0.055,50,50],[411.536,0.31,42,23],[411.576,0.16,39,47],[411.576,0.14,51,28],[411.891,0.7,88,21],[412.516,0.27,48,46],[412.516,0.03,83,16],[412.516,0.03,99,19],[412.516,0.055,50,50],[412.536,0.31,42,23],[412.576,0.16,39,47],[412.576,0.14,51,28],[413.249,0.3,91,61],[413.516,0.27,48,48],[413.516,0.03,83,17],[413.516,0.03,99,19],[413.516,0.055,50,50],[413.516,3.8,57,40],[413.536,0.31,42,24],[413.576,0.16,39,47],[413.576,0.14,51,28],[414.516,0.19,84,36],[414.516,0.27,48,48],[414.516,0.03,83,17],[414.516,0.03,99,19],[414.516,0.055,50,50],[414.536,0.31,42,24],[414.576,0.16,39,47],[414.576,0.14,51,28],[414.766,0.035,117,11],[414.916,0.3,84,64],[415.266,0.035,117,13],[415.516,0.27,48,51],[415.516,0.03,83,18],[415.516,0.03,99,19],[415.516,0.055,50,50],[415.536,0.31,42,25],[415.576,0.16,39,47],[415.576,0.14,51,28],[415.766,0.035,117,8],[416.516,0.3,81,67],[416.516,0.27,48,51],[416.516,0.03,83,18],[416.516,0.03,99,19],[416.516,0.055,50,50],[416.536,0.31,42,25],[416.576,0.16,39,47],[416.576,0.14,51,28],[417.516,0.27,48,54],[417.516,0.03,83,19],[417.516,0.03,99,19],[417.516,0.055,50,50],[417.516,3.8,53,63],[417.536,0.31,42,27],[417.576,0.16,39,47],[417.576,0.14,51,28],[418.249,0.3,84,71],[418.266,0.7,84,40],[418.516,0.27,48,54],[418.516,0.03,83,19],[418.516,0.03,99,19],[418.516,0.055,50,50],[418.536,0.31,42,27],[418.576,0.16,39,47],[418.576,0.14,51,28],[418.891,0.7,91,75],[419.266,0.19,77,45],[419.516,0.27,48,56],[419.516,0.03,83,20],[419.516,0.03,99,19],[419.516,0.055,50,50],[419.536,0.31,42,28],[419.576,0.16,39,47],[419.576,0.14,51,28],[419.766,0.19,84,47],[419.766,0.035,117,13],[419.916,0.3,81,84],[420.266,0.035,117,15],[420.516,0.27,48,56],[420.516,0.03,83,20],[420.516,0.03,99,19],[420.516,0.055,50,50],[420.536,0.31,42,28],[420.576,0.16,39,47],[420.576,0.14,51,28],[420.766,0.035,117,9],[421.516,0.3,79,88],[421.516,0.27,48,59],[421.516,0.03,83,21],[421.516,0.03,99,19],[421.516,0.055,50,50],[421.516,3.8,55,65],[421.536,0.31,42,29],[421.576,0.16,39,47],[421.576,0.14,51,28],[422.516,0.27,48,59],[422.516,0.03,83,21],[422.516,0.03,99,19],[422.516,0.055,50,50],[422.536,0.31,42,29],[422.576,0.16,39,47],[422.576,0.14,51,28],[423.249,0.3,86,88],[423.516,0.27,48,54],[423.516,0.03,83,19],[423.516,0.03,99,19],[423.516,0.055,50,50],[423.536,0.31,42,27],[423.576,0.16,39,47],[423.576,0.14,51,28],[423.696,0.4,100,13],[423.926,0.52,102,9],[424.266,0.7,88,39],[424.516,0.15,72,57],[424.516,0.03,99,19],[424.516,0.055,50,50],[424.576,0.16,39,47],[424.576,0.14,51,28],[425.516,0.27,48,43],[425.516,0.03,83,15],[425.516,0.03,99,19],[425.516,0.055,50,50],[425.516,3.677,60,37],[425.516,0.027,117,35],[425.536,0.31,42,22],[425.576,0.16,39,47],[425.576,0.14,51,28],[425.758,0.184,96,31],[425.758,0.045,117,38],[425.879,0.7,96,47],[425.903,0.29,100,55],[426,0.027,117,10],[426.484,0.27,48,43],[426.484,0.03,83,15],[426.484,0.03,99,19],[426.484,0.055,50,50],[426.504,0.31,42,22],[426.544,0.16,39,47],[426.544,0.14,51,28],[427.452,0.29,96,55],[427.452,0.27,48,46],[427.452,0.03,83,16],[427.452,0.03,99,19],[427.452,0.055,50,50],[427.472,0.31,42,23],[427.512,0.16,39,47],[427.512,0.14,51,28],[428.419,0.27,48,46],[428.419,0.03,83,16],[428.419,0.03,99,19],[428.419,0.055,50,50],[428.439,0.31,42,23],[428.479,0.16,39,47],[428.479,0.14,51,28],[429.129,0.29,103,55],[429.387,0.27,48,48],[429.387,0.03,83,17],[429.387,0.03,99,19],[429.387,0.055,50,50],[429.387,3.677,57,15],[429.387,3.677,64,8],[429.387,0.027,117,16],[429.407,0.31,42,24],[429.447,0.16,39,47],[429.447,0.14,51,28],[429.629,0.045,117,49],[429.871,0.027,117,41],[430.113,0.045,117,72],[430.355,0.184,96,32],[430.355,0.27,48,48],[430.355,0.03,83,17],[430.355,0.03,99,19],[430.355,0.055,50,50],[430.355,0.027,117,44],[430.375,0.31,42,24],[430.415,0.16,39,47],[430.415,0.14,51,28],[430.597,0.045,117,56],[430.742,0.29,96,58],[430.839,0.027,117,22],[431.081,0.045,117,9],[431.323,0.27,48,51],[431.323,0.03,83,18],[431.323,0.03,99,19],[431.323,0.055,50,50],[431.343,0.31,42,25],[431.383,0.16,39,47],[431.383,0.14,51,28],[431.685,0.7,98,43],[432.29,0.29,93,61],[432.29,0.27,48,51],[432.29,0.03,83,18],[432.29,0.03,99,19],[432.29,0.055,50,50],[432.31,0.31,42,25],[432.35,0.16,39,47],[432.35,0.14,51,28],[433.258,0.27,48,54],[433.258,0.03,83,19],[433.258,0.03,99,19],[433.258,0.055,50,50],[433.258,3.677,60,31],[433.278,0.31,42,27],[433.318,0.16,39,47],[433.318,0.14,51,28],[433.968,0.29,96,55],[434.226,0.27,48,54],[434.226,0.03,83,19],[434.226,0.03,99,19],[434.226,0.055,50,50],[434.246,0.31,42,27],[434.286,0.16,39,47],[434.286,0.14,51,28],[434.468,0.045,117,38],[434.71,0.027,117,39],[434.952,0.184,89,31],[434.952,0.045,117,76],[435.193,0.27,48,56],[435.193,0.03,83,20],[435.193,0.03,99,19],[435.193,0.055,50,50],[435.193,0.027,117,53],[435.214,0.31,42,28],[435.253,0.16,39,47],[435.253,0.14,51,28],[435.435,0.184,96,32],[435.435,0.045,117,76],[435.581,0.29,93,58],[435.677,0.027,117,36],[435.919,0.045,117,31],[436.161,0.27,48,56],[436.161,0.03,83,20],[436.161,0.03,99,19],[436.161,0.055,50,50],[436.181,0.31,42,28],[436.221,0.16,39,47],[436.221,0.14,51,28],[437.129,0.29,91,60],[437.129,0.27,48,59],[437.129,0.03,83,21],[437.129,0.03,99,19],[437.129,0.055,50,50],[437.129,3.677,62,50],[437.149,0.31,42,29],[437.189,0.16,39,47],[437.189,0.14,51,28],[438.097,0.27,48,59],[438.097,0.03,83,21],[438.097,0.03,99,19],[438.097,0.055,50,50],[438.117,0.31,42,29],[438.157,0.16,39,47],[438.157,0.14,51,28],[438.46,0.7,107,52],[438.806,0.29,98,60],[439.065,0.218,62,79],[439.065,0.27,48,54],[439.065,0.03,83,19],[439.065,0.03,99,19],[439.065,0.055,50,50],[439.084,0.31,42,27],[439.125,0.16,39,47],[439.125,0.14,51,28],[440.032,0.03,99,19],[440.032,0.055,50,50],[440.092,0.16,39,47],[440.092,0.14,51,28],[441,0.055,50,15],[441,3.8,66,10],[441.06,0.16,39,70],[441.06,0.14,51,42],[441.5,0.23,66,64],[441.75,0.23,69,67],[442,0.03,99,61],[442,0.055,50,164],[442,0.69,66,67],[442.06,0.16,39,154],[442.06,0.14,51,92],[443,0.03,99,65],[443,0.055,50,174],[443.06,0.16,39,163],[443.06,0.14,51,98],[444,0.03,99,65],[444,0.055,50,174],[444.06,0.16,39,163],[444.06,0.14,51,98],[445,0.3,59,33],[445,0.03,99,69],[445,0.055,50,184],[445,3.8,66,16],[445.06,0.16,39,172],[445.06,0.14,51,103],[445.733,0.3,66,33],[445.75,0.7,66,9],[446,0.03,99,69],[446,0.055,50,184],[446.06,0.16,39,172],[446.06,0.14,51,103],[446.4,0.3,62,33],[446.75,0.7,69,9],[447,0.3,59,34],[447,0.03,99,73],[447,0.055,50,194],[447.06,0.16,39,182],[447.06,0.14,51,109],[447.4,0.3,62,34],[447.75,0.7,64,9],[448,0.3,59,34],[448,0.03,99,73],[448,0.055,50,194],[448.06,0.16,39,182],[448.06,0.14,51,109],[448.733,0.3,66,34],[448.75,0.03,99,73],[448.75,0.055,50,194],[448.81,0.16,39,182],[448.81,0.14,51,109],[449,0.03,99,76],[449,0.055,50,203],[449,3.8,62,9],[449.06,0.16,39,191],[449.06,0.14,51,114],[449.375,0.7,62,18],[449.4,0.3,59,36],[450,0.03,99,76],[450,0.055,50,203],[450.06,0.16,39,191],[450.06,0.14,51,114],[451,0.03,99,80],[451,0.055,50,213],[451.06,0.16,39,200],[451.06,0.14,51,120],[452,0.03,99,80],[452,0.055,50,213],[452.06,0.16,39,200],[452.06,0.14,51,120],[453,0.03,99,84],[453,0.055,50,223],[453,3.8,61,15],[453,0.46,64,91],[453.06,0.16,39,209],[453.06,0.14,51,125],[453.5,0.23,66,91],[453.75,0.23,69,91],[454,0.03,99,84],[454,0.055,50,223],[454,0.69,73,91],[454.06,0.16,39,209],[454.06,0.14,51,125],[455,0.03,99,78],[455,0.055,50,207],[455.06,0.16,39,194],[455.06,0.14,51,116],[456,0.03,99,78],[456,0.055,50,207],[456.06,0.16,39,194],[456.06,0.14,51,116],[456.75,0.03,99,78],[456.75,0.055,50,207],[456.81,0.16,39,194],[456.81,0.14,51,116],[457,0.03,99,65],[457,0.055,50,173],[457,3.8,66,18],[457.06,0.16,39,162],[457.06,0.14,51,97],[457.733,0.3,69,31],[458,0.03,99,65],[458,0.055,50,173],[458.06,0.16,39,162],[458.06,0.14,51,97],[458.4,0.3,66,31],[458.75,0.7,66,8],[459,0.3,62,33],[459,0.03,99,69],[459,0.055,50,183],[459.06,0.16,39,172],[459.06,0.14,51,103],[459.733,0.3,69,33],[459.75,0.7,66,8],[460,0.3,62,33],[460,0.03,99,69],[460,0.055,50,183],[460.06,0.16,39,172],[460.06,0.14,51,103],[460.733,0.3,69,33],[461,0.03,99,73],[461,0.055,50,194],[461,3.8,62,21],[461.06,0.16,39,181],[461.06,0.14,51,109],[461.375,0.7,66,17],[461.4,0.3,62,34],[462,0.3,59,34],[462,0.03,99,73],[462,0.055,50,194],[462.06,0.16,39,181],[462.06,0.14,51,109],[462.375,0.7,69,17],[463,0.03,99,76],[463,0.055,50,204],[463.06,0.16,39,191],[463.06,0.14,51,115],[464,0.03,99,76],[464,0.055,50,204],[464.06,0.16,39,191],[464.06,0.14,51,115],[464.75,0.03,99,76],[464.75,0.055,50,204],[464.81,0.16,39,191],[464.81,0.14,51,115],[465,0.03,99,80],[465,0.055,50,214],[465,3.8,59,19],[465,0.46,62,87],[465.06,0.16,39,201],[465.06,0.14,51,121],[465.5,0.46,67,87],[466,0.03,99,80],[466,0.055,50,214],[466,0.23,69,87],[466.06,0.16,39,201],[466.06,0.14,51,121],[466.25,0.23,71,87],[466.5,0.46,69,87],[467,0.03,99,84],[467,0.055,50,225],[467,0.46,67,87],[467.06,0.16,39,211],[467.06,0.14,51,126],[468,0.03,99,84],[468,0.055,50,225],[468.06,0.16,39,211],[468.06,0.14,51,126],[469,0.03,99,88],[469,0.055,50,235],[469,3.8,61,10],[469.06,0.16,39,220],[469.06,0.14,51,132],[470,0.03,99,88],[470,0.055,50,235],[470.06,0.16,39,220],[470.06,0.14,51,132],[470.4,0.3,61,59],[470.75,0.7,73,16],[471,0.3,62,54],[471,0.03,99,82],[471,0.055,50,218],[471.06,0.16,39,204],[471.06,0.14,51,122],[471.25,0.276,54,45],[471.733,0.3,69,54],[471.75,0.7,66,16],[471.75,0.276,52,45],[472,0.03,99,82],[472,0.055,50,218],[472.06,0.16,39,204],[472.06,0.14,51,122],[472.25,0.552,50,45],[472.733,0.3,69,54],[472.75,0.03,99,82],[472.75,0.055,50,218],[472.81,0.16,39,204],[472.81,0.14,51,122],[473,0.03,99,65],[473,0.055,50,173],[473,3.738,62,12],[473.06,0.16,39,162],[473.06,0.14,51,97],[473.369,0.7,62,22],[473.393,0.295,66,43],[473.984,0.295,62,43],[473.984,0.03,99,65],[473.984,0.055,50,173],[474.044,0.16,39,162],[474.044,0.14,51,97],[474.229,0.045,117,7],[474.352,0.7,66,22],[474.475,0.027,117,20],[474.705,0.295,69,43],[474.721,0.045,117,50],[474.967,0.03,99,69],[474.967,0.055,50,183],[474.967,0.027,117,42],[475.027,0.16,39,172],[475.027,0.14,51,103],[475.213,0.045,117,68],[475.459,0.027,117,39],[475.705,0.045,117,45],[475.951,0.03,99,69],[475.951,0.055,50,183],[475.951,0.027,117,14],[476.011,0.16,39,172],[476.011,0.14,51,103],[476.934,0.03,99,73],[476.934,0.055,50,194],[476.934,3.738,59,20],[476.994,0.16,39,181],[476.994,0.14,51,109],[477.426,0.226,69,120],[477.672,0.226,71,120],[477.918,0.03,99,73],[477.918,0.055,50,194],[477.918,0.453,69,120],[477.978,0.16,39,181],[477.978,0.14,51,109],[478.41,0.453,66,120],[478.902,0.03,99,76],[478.902,0.055,50,204],[478.902,0.679,64,120],[478.962,0.16,39,191],[478.962,0.14,51,115],[479.393,0.027,117,18],[479.639,0.226,62,120],[479.639,0.045,117,53],[479.885,0.03,99,76],[479.885,0.055,50,204],[479.885,0.027,117,44],[479.945,0.16,39,191],[479.945,0.14,51,115],[480.131,0.045,117,76],[480.377,0.027,117,46],[480.623,0.03,99,76],[480.623,0.055,50,204],[480.623,0.045,117,57],[480.683,0.16,39,191],[480.683,0.14,51,115],[480.869,0.03,99,80],[480.869,0.055,50,214],[480.869,3.738,55,24],[480.869,0.027,117,22],[480.929,0.16,39,201],[480.929,0.14,51,121],[481.852,0.03,99,80],[481.852,0.055,50,214],[481.912,0.16,39,201],[481.912,0.14,51,121],[482.836,0.295,55,56],[482.836,0.03,99,84],[482.836,0.055,50,225],[482.896,0.16,39,211],[482.896,0.14,51,126],[483.557,0.295,62,56],[483.574,0.7,67,14],[483.82,0.03,99,84],[483.82,0.055,50,225],[483.88,0.16,39,211],[483.88,0.14,51,126],[484.213,0.295,59,56],[484.312,0.027,117,13],[484.557,0.045,117,50],[484.803,0.03,99,88],[484.803,0.055,50,235],[484.803,3.738,57,21],[484.803,0.027,117,47],[484.863,0.16,39,220],[484.863,0.14,51,132],[485.049,0.045,117,87],[485.172,0.7,64,29],[485.197,0.295,61,59],[485.295,0.027,117,54],[485.541,0.045,117,73],[485.787,0.295,57,59],[485.787,0.03,99,88],[485.787,0.055,50,235],[485.787,0.027,117,31],[485.847,0.16,39,220],[485.847,0.14,51,132],[486.033,0.045,117,17],[486.156,0.7,73,29],[486.508,0.295,64,59],[486.771,0.03,99,82],[486.771,0.055,50,218],[486.83,0.16,39,204],[486.83,0.14,51,122],[487.016,0.272,54,45],[487.139,0.7,66,29],[487.164,0.295,66,54],[487.754,0.03,99,82],[487.754,0.055,50,218],[487.814,0.16,39,204],[487.814,0.14,51,122],[488.492,0.03,99,82],[488.492,0.055,50,218],[488.552,0.16,39,204],[488.552,0.14,51,122],[488.738,0.03,99,68],[488.738,0.055,50,181],[488.738,3.677,62,8],[488.798,0.16,39,170],[488.798,0.14,51,102],[489.464,0.045,117,32],[489.705,0.03,99,68],[489.705,0.055,50,181],[489.705,0.027,117,33],[489.765,0.16,39,170],[489.765,0.14,51,102],[489.947,0.045,117,65],[490.189,0.027,117,43],[490.431,0.223,64,112],[490.431,0.045,117,59],[490.673,0.03,99,71],[490.673,0.055,50,190],[490.673,0.445,78,112],[490.673,0.027,117,26],[490.733,0.16,39,178],[490.733,0.14,51,107],[490.915,0.045,117,13],[491.157,0.445,76,109],[491.641,0.03,99,65],[491.641,0.055,50,173],[491.641,0.89,74,101],[491.701,0.16,39,160],[491.701,0.14,51,96],[492.609,0.29,59,43],[492.609,0.03,99,40],[492.609,0.055,50,106],[492.609,3.677,66,23],[492.669,0.16,39,92],[492.669,0.14,51,55],[493.318,0.29,66,51],[493.334,0.7,66,13],[493.334,0.045,117,26],[493.576,0.29,59,16],[493.576,0.203,47,21],[493.576,0.027,117,40],[493.818,0.045,117,76],[493.939,0.7,69,17],[493.964,0.29,62,37],[494.06,0.027,117,36],[494.286,0.29,66,47],[494.302,0.203,47,63],[494.302,0.045,117,12],[494.544,0.203,47,71],[494.786,0.401,64,12],[494.907,0.7,76,22],[495.028,0.11,98,67],[495.028,0.095,54,76],[495.27,0.203,47,34],[495.27,0.223,74,111],[495.512,0.89,71,126],[495.512,0.134,62,29],[495.754,0.534,59,27],[495.996,0.11,98,72],[495.996,0.095,54,81],[495.996,0.027,117,28],[496.238,0.045,117,80],[496.48,0.29,55,11],[496.48,0.03,99,22],[496.48,0.055,50,58],[496.48,3.677,55,48],[496.48,0.027,117,38],[496.54,0.16,39,80],[496.54,0.14,51,48],[497.189,0.29,62,40],[497.205,0.7,62,11],[497.447,0.29,55,25],[497.447,0.03,99,50],[497.447,0.055,50,134],[497.507,0.16,39,98],[497.507,0.14,51,59],[497.931,0.445,69,91],[497.931,0.027,117,14],[498.173,0.203,43,51],[498.173,0.045,117,81],[498.415,0.203,43,52],[498.415,0.445,79,148],[498.415,0.027,117,40],[498.899,0.11,98,116],[498.899,0.095,54,130],[499.125,0.29,62,34],[499.141,0.7,79,9],[499.141,0.134,66,26],[499.383,0.03,99,8],[499.383,0.055,50,21],[499.383,0.134,64,32],[499.443,0.16,39,60],[499.443,0.14,51,36],[499.625,0.534,62,24],[499.867,0.027,117,51],[500.109,0.045,117,64],[500.351,3.677,61,48],[500.351,0.445,64,173],[500.834,0.11,98,18],[500.834,0.095,54,21],[501.06,0.29,64,37],[501.076,0.7,64,10],[501.076,0.203,45,32],[501.318,0.29,57,12],[501.318,0.027,117,29],[501.56,0.045,117,91],[501.681,0.7,73,23],[502.028,0.29,64,14],[502.286,0.03,99,69],[502.286,0.055,50,184],[502.286,0.445,78,140],[502.346,0.16,39,140],[502.346,0.14,51,84],[502.528,0.267,66,35],[502.77,0.027,117,14],[502.996,0.29,69,43],[503.012,0.7,78,12],[503.012,0.203,50,53],[503.012,0.045,117,86],[503.254,0.29,62,39],[503.254,0.203,50,24],[503.254,0.027,117,16],[503.738,0.11,98,23],[503.738,0.095,54,25],[503.98,0.03,99,57],[503.98,0.055,50,151],[504.04,0.16,39,174],[504.04,0.14,51,104],[504.222,0.03,99,68],[504.222,0.055,50,181],[504.222,3.677,69,48],[504.222,0.445,62,127],[504.222,0.027,117,7],[504.282,0.16,39,163],[504.282,0.14,51,98],[504.464,0.045,117,68],[504.705,0.027,117,16],[504.931,0.29,69,13],[504.947,0.7,62,9],[504.947,0.203,50,41],[505.189,0.29,62,28],[505.189,0.203,50,35],[505.673,0.11,98,60],[505.673,0.095,54,68],[505.915,0.223,64,126],[505.915,0.045,117,67],[506.157,0.03,99,63],[506.157,0.055,50,169],[506.157,0.445,78,61],[506.157,0.027,117,22],[506.217,0.16,39,173],[506.217,0.14,51,104],[506.867,0.29,69,32],[506.883,0.7,78,8],[506.883,0.203,50,24],[507.125,0.29,62,36],[507.125,0.203,50,45],[507.367,0.045,117,62],[507.609,0.11,98,96],[507.609,0.095,54,108],[507.609,0.027,117,35],[508.092,0.055,50,10],[508.092,3.677,66,59],[508.152,0.16,39,47],[508.152,0.14,51,28],[508.802,0.29,66,27],[508.818,0.045,117,23],[509.06,0.29,59,38],[509.06,0.027,117,48],[509.302,0.045,117,42],[509.423,0.7,69,8],[509.786,0.203,47,39],[510.028,0.203,47,13],[510.028,0.668,76,37],[510.27,0.401,64,27],[510.512,0.11,98,53],[510.512,0.095,54,59],[510.738,0.29,66,40],[510.754,0.7,76,10],[510.754,0.045,117,70],[510.996,0.29,59,27],[510.996,0.03,99,53],[510.996,0.055,50,142],[510.996,0.027,117,45],[511.056,0.16,39,154],[511.056,0.14,51,92],[511.238,0.045,117,10],[511.705,0.29,66,27],[511.722,0.03,99,52],[511.722,0.055,50,139],[511.782,0.16,39,109],[511.782,0.14,51,66],[511.964,0.03,99,15],[511.964,0.055,50,41],[511.964,3.677,59,69],[512.024,0.16,39,11],[512.447,0.445,67,109],[512.689,0.203,43,51],[512.689,0.045,117,43],[512.931,0.203,43,53],[512.931,0.027,117,52],[513.173,0.045,117,71],[513.318,0.29,59,30],[513.415,0.11,98,92],[513.415,0.095,54,103],[513.415,0.027,117,11],[513.657,0.7,69,11],[513.657,0.203,43,13],[513.899,0.29,55,44],[514.141,0.267,67,14],[514.262,0.7,79,12],[514.286,0.29,59,26],[514.383,0.11,98,87],[514.383,0.095,54,98],[514.609,0.29,62,24],[514.867,0.29,55,12],[515.351,0.027,117,26],[515.592,0.045,117,78],[515.835,0.03,99,50],[515.835,0.055,50,134],[515.835,3.677,64,38],[515.835,0.445,64,94],[515.835,0.027,117,58],[515.894,0.16,39,134],[515.894,0.14,51,81],[516.076,0.045,117,75],[516.318,0.223,66,134],[516.318,0.027,117,24],[516.56,0.223,69,147],[516.802,0.03,99,84],[516.802,0.055,50,223],[516.802,0.668,73,157],[516.862,0.16,39,212],[516.862,0.14,51,127],[517.528,0.223,69,33],[517.77,0.03,99,85],[517.77,0.055,50,226],[517.77,0.445,78,23],[517.83,0.16,39,213],[517.83,0.14,51,128],[518.254,0.445,76,10],[518.738,0.03,99,86],[518.738,0.055,50,228],[518.798,0.16,39,214],[518.798,0.14,51,129],[519.463,0.03,99,86],[519.463,0.055,50,229],[519.463,0.045,117,40],[519.524,0.16,39,214],[519.524,0.14,51,129],[519.705,0.03,99,65],[519.705,0.055,50,173],[519.705,3.738,66,56],[519.705,0.027,117,31],[519.765,0.16,39,162],[519.765,0.14,51,97],[519.951,0.045,117,61],[520.197,0.027,117,41],[520.427,0.295,69,32],[520.443,0.045,117,58],[520.689,0.03,99,65],[520.689,0.055,50,173],[520.689,0.027,117,27],[520.749,0.16,39,162],[520.749,0.14,51,97],[520.935,0.045,117,22],[521.082,0.295,66,32],[521.427,0.7,66,10],[521.673,0.295,62,40],[521.673,0.03,99,69],[521.673,0.055,50,183],[521.733,0.16,39,172],[521.733,0.14,51,103],[522.41,0.7,66,10],[522.656,0.295,62,40],[522.656,0.03,99,69],[522.656,0.055,50,183],[522.716,0.16,39,172],[522.716,0.14,51,103],[523.378,0.295,69,40],[523.64,0.03,99,73],[523.64,0.055,50,194],[523.64,3.738,62,56],[523.7,0.16,39,181],[523.7,0.14,51,109],[524.009,0.7,66,21],[524.033,0.295,62,42],[524.378,0.045,117,25],[524.624,0.295,59,42],[524.624,0.03,99,73],[524.624,0.055,50,194],[524.624,0.027,117,31],[524.683,0.16,39,181],[524.683,0.14,51,109],[524.869,0.045,117,65],[524.992,0.7,69,21],[525.115,0.027,117,46],[525.361,0.045,117,69],[525.607,0.03,99,76],[525.607,0.055,50,204],[525.607,0.027,117,37],[525.667,0.16,39,191],[525.667,0.14,51,115],[525.853,0.045,117,35],[526.591,0.03,99,76],[526.591,0.055,50,204],[526.651,0.16,39,191],[526.651,0.14,51,115],[527.328,0.03,99,76],[527.328,0.055,50,204],[527.388,0.16,39,191],[527.388,0.14,51,115],[527.574,0.03,99,80],[527.574,0.055,50,214],[527.574,3.738,59,38],[527.574,0.453,62,120],[527.634,0.16,39,201],[527.634,0.14,51,121],[528.066,0.453,67,120],[528.558,0.03,99,80],[528.558,0.055,50,214],[528.558,0.226,69,120],[528.618,0.16,39,201],[528.618,0.14,51,121],[528.804,0.226,71,120],[529.05,0.453,69,120],[529.296,0.045,117,17],[529.542,0.03,99,84],[529.542,0.055,50,225],[529.542,0.453,67,120],[529.542,0.027,117,30],[529.601,0.16,39,211],[529.601,0.14,51,126],[529.787,0.272,55,35],[529.787,0.045,117,70],[530.033,0.027,117,52],[530.279,0.136,54,35],[530.279,0.045,117,83],[530.525,0.03,99,84],[530.525,0.055,50,225],[530.525,0.136,52,35],[530.525,0.027,117,45],[530.585,0.16,39,211],[530.585,0.14,51,126],[530.771,0.543,50,35],[530.771,0.045,117,48],[531.017,0.027,117,12],[531.509,0.03,99,88],[531.509,0.055,50,235],[531.509,3.738,57,34],[531.569,0.16,39,220],[531.569,0.14,51,132],[532.492,0.03,99,88],[532.492,0.055,50,235],[532.552,0.16,39,220],[532.552,0.14,51,132],[532.886,0.295,61,51],[533.23,0.7,73,13],[533.476,0.295,62,47],[533.476,0.03,99,82],[533.476,0.055,50,218],[533.536,0.16,39,204],[533.536,0.14,51,122],[534.197,0.295,69,47],[534.214,0.7,66,13],[534.214,0.045,117,7],[534.46,0.03,99,82],[534.46,0.055,50,218],[534.46,0.027,117,24],[534.519,0.16,39,204],[534.519,0.14,51,122],[534.705,0.045,117,62],[534.951,0.027,117,49],[535.181,0.295,69,47],[535.197,0.03,99,82],[535.197,0.055,50,218],[535.197,0.045,117,81],[535.257,0.16,39,204],[535.257,0.14,51,122],[535.443,0.03,99,65],[535.443,0.055,50,173],[535.443,3.864,62,46],[535.503,0.16,39,162],[535.503,0.14,51,97],[535.824,0.7,62,19],[535.85,0.305,66,37],[536.46,0.305,62,37],[536.46,0.03,99,65],[536.46,0.055,50,173],[536.52,0.16,39,162],[536.52,0.14,51,97],[536.841,0.7,66,19],[537.206,0.305,69,37],[537.477,0.03,99,69],[537.477,0.055,50,183],[537.537,0.16,39,172],[537.537,0.14,51,103],[538.494,0.03,99,69],[538.494,0.055,50,183],[538.554,0.16,39,172],[538.554,0.14,51,103],[539.511,0.03,99,73],[539.511,0.055,50,194],[539.511,3.864,59,63],[539.571,0.16,39,181],[539.571,0.14,51,109],[540.019,0.234,69,109],[540.274,0.234,71,109],[540.528,0.03,99,73],[540.528,0.055,50,194],[540.528,0.468,69,109],[540.588,0.16,39,181],[540.588,0.14,51,109],[541.036,0.468,66,109],[541.545,0.03,99,76],[541.545,0.055,50,204],[541.545,0.702,64,109],[541.605,0.16,39,191],[541.605,0.14,51,115],[542.562,0.03,99,76],[542.562,0.055,50,204],[542.622,0.16,39,191],[542.622,0.14,51,115],[543.324,0.03,99,76],[543.324,0.055,50,204],[543.385,0.16,39,191],[543.385,0.14,51,115],[543.579,0.03,99,80],[543.579,0.055,50,214],[543.579,3.864,55,62],[543.639,0.16,39,201],[543.639,0.14,51,121],[544.596,0.03,99,80],[544.596,0.055,50,214],[544.656,0.16,39,201],[544.656,0.14,51,121],[545.003,0.305,59,46],[545.613,0.305,55,49],[545.613,0.03,99,84],[545.613,0.055,50,225],[545.673,0.16,39,211],[545.673,0.14,51,126],[546.358,0.305,62,49],[546.63,0.03,99,84],[546.63,0.055,50,225],[546.69,0.16,39,211],[546.69,0.14,51,126],[547.036,0.305,59,49],[547.375,0.305,62,49],[547.646,4.068,62,55],[547.646,0.03,99,88],[547.646,0.055,50,235],[547.646,3.864,57,41],[547.707,0.16,39,220],[547.707,0.14,51,132],[548.028,0.7,64,25],[548.053,0.305,61,51],[548.663,0.305,57,51],[548.663,0.03,99,88],[548.663,0.055,50,235],[548.723,0.16,39,220],[548.723,0.14,51,132],[549.045,0.7,73,25],[549.409,0.305,64,51],[549.68,0.03,99,82],[549.68,0.055,50,218],[549.74,0.16,39,204],[549.74,0.14,51,122],[550.062,0.7,66,25],[550.697,0.03,99,82],[550.697,0.055,50,218],[550.757,0.16,39,204],[550.757,0.14,51,122],[551.46,0.03,99,82],[551.46,0.055,50,218],[551.52,0.16,39,204],[551.52,0.14,51,122],[551.714,0.03,99,19],[551.714,0.055,50,50],[551.774,0.16,39,47],[551.774,0.14,51,28],[552.731,0.03,99,19],[552.731,0.055,50,50],[552.791,0.16,39,47],[552.791,0.14,51,28],[553.748,0.03,99,19],[553.748,0.055,50,50],[553.808,0.16,39,47],[553.808,0.14,51,28],[554.314,0.58,74,33],[554.314,0.8,48,33],[554.314,0.27,48,48],[554.314,0.03,83,17],[554.314,0.03,99,23],[554.314,0.055,50,62],[554.334,0.31,42,24],[554.374,0.16,39,58],[554.374,0.14,51,35],[555.223,0.773,79,33],[555.223,0.03,99,23],[555.223,0.055,50,62],[555.283,0.16,39,58],[555.283,0.14,51,35],[555.314,2.2,60,17],[556.133,0.27,48,48],[556.133,0.03,83,17],[556.133,0.03,99,23],[556.133,0.055,50,62],[556.153,0.31,42,24],[556.192,0.16,39,58],[556.192,0.14,51,35],[556.814,0.193,81,33],[557.042,0.03,99,23],[557.042,0.055,50,62],[557.102,0.16,39,58],[557.102,0.14,51,35],[557.951,0.27,48,48],[557.951,0.03,83,17],[557.951,0.03,99,23],[557.951,0.055,50,62],[557.971,0.31,42,24],[558.011,0.16,39,58],[558.011,0.14,51,35],[558.86,0.03,99,23],[558.86,0.055,50,62],[558.92,0.16,39,58],[558.92,0.14,51,35],[559.769,0.27,48,48],[559.769,0.03,83,17],[559.769,0.03,99,23],[559.769,0.055,50,62],[559.789,0.31,42,24],[559.829,0.16,39,58],[559.829,0.14,51,35],[560.678,0.03,99,23],[560.678,0.055,50,62],[560.738,0.16,39,58],[560.738,0.14,51,35],[561.587,0.58,74,33],[561.587,0.27,48,48],[561.587,0.03,83,17],[561.587,0.03,99,23],[561.587,0.055,50,62],[561.607,0.31,42,24],[561.647,0.16,39,58],[561.647,0.14,51,35],[562.496,0.773,79,33],[562.496,0.03,99,23],[562.496,0.055,50,62],[562.556,0.16,39,58],[562.556,0.14,51,35],[563.405,0.27,48,48],[563.405,0.03,83,17],[563.405,0.03,99,23],[563.405,0.055,50,62],[563.425,0.31,42,24],[563.465,0.16,39,58],[563.465,0.14,51,35],[564.087,0.193,81,33],[564.314,0.03,99,23],[564.314,0.055,50,62],[564.374,0.16,39,58],[564.374,0.14,51,35],[565.223,0.27,48,48],[565.223,0.03,83,17],[565.223,0.03,99,23],[565.223,0.055,50,62],[565.243,0.31,42,24],[565.283,0.16,39,58],[565.283,0.14,51,35],[566.133,0.03,99,23],[566.133,0.055,50,62],[566.192,0.16,39,58],[566.192,0.14,51,35],[567.042,0.27,48,48],[567.042,0.03,83,17],[567.042,0.03,99,23],[567.042,0.055,50,62],[567.062,0.31,42,24],[567.102,0.16,39,58],[567.102,0.14,51,35],[567.951,0.03,99,23],[567.951,0.055,50,62],[568.011,0.16,39,58],[568.011,0.14,51,35],[568.86,0.58,55,16],[568.86,0.03,99,23],[568.86,0.055,50,62],[568.92,0.16,39,58],[568.92,0.14,51,35],[569.542,0.193,55,22],[569.769,0.773,55,22],[569.769,0.03,99,23],[569.769,0.055,50,62],[569.829,0.16,39,58],[569.829,0.14,51,35],[570.678,0.58,55,22],[570.678,0.03,99,23],[570.678,0.055,50,62],[570.738,0.16,39,58],[570.738,0.14,51,35],[571.36,0.193,55,22],[571.587,0.773,55,22],[571.587,0.03,99,23],[571.587,0.055,50,62],[571.647,0.16,39,58],[571.647,0.14,51,35],[572.496,0.58,55,22],[572.496,0.03,99,23],[572.496,0.055,50,62],[572.556,0.16,39,58],[572.556,0.14,51,35],[573.178,0.193,55,16],[573.405,0.773,55,16],[573.405,0.03,99,23],[573.405,0.055,50,62],[573.465,0.16,39,58],[573.465,0.14,51,35],[574.314,0.58,55,16],[574.314,0.03,99,23],[574.314,0.055,50,62],[574.374,0.16,39,58],[574.374,0.14,51,35],[574.996,0.193,55,16],[575.223,0.773,55,16],[575.223,0.03,99,23],[575.223,0.055,50,62],[575.283,0.16,39,58],[575.283,0.14,51,35],[576.133,0.58,55,16],[576.133,0.03,99,23],[576.133,0.055,50,62],[576.192,0.16,39,58],[576.192,0.14,51,35],[576.814,0.193,55,16],[577.042,0.773,55,24],[577.042,0.03,99,23],[577.042,0.055,50,62],[577.102,0.16,39,58],[577.102,0.14,51,35],[577.951,0.58,55,24],[577.951,0.03,99,23],[577.951,0.055,50,62],[578.011,0.16,39,58],[578.011,0.14,51,35],[578.633,0.193,55,24],[578.86,0.773,55,24],[578.86,0.03,99,23],[578.86,0.055,50,62],[578.92,0.16,39,58],[578.92,0.14,51,35],[579.769,0.58,55,24],[579.769,0.03,99,23],[579.769,0.055,50,62],[579.829,0.16,39,58],[579.829,0.14,51,35],[580.451,0.193,55,24],[580.678,0.773,55,24],[580.678,0.03,99,23],[580.678,0.055,50,62],[580.738,0.16,39,58],[580.738,0.14,51,35],[581.587,0.58,55,29],[581.587,0.03,99,23],[581.587,0.055,50,62],[581.647,0.16,39,58],[581.647,0.14,51,35],[582.269,0.193,55,29],[582.496,0.773,55,29],[582.496,0.03,99,23],[582.496,0.055,50,62],[582.556,0.16,39,58],[582.556,0.14,51,35],[583.405,0.58,74,48],[583.405,0.27,48,48],[583.405,0.03,83,17],[583.405,0.03,99,23],[583.405,0.055,50,62],[583.425,0.31,42,24],[583.465,0.16,39,58],[583.465,0.14,51,35],[584.314,0.773,79,48],[584.314,0.03,99,23],[584.314,0.055,50,62],[584.374,0.16,39,58],[584.374,0.14,51,35],[585.223,0.27,48,48],[585.223,0.03,83,17],[585.223,0.03,99,23],[585.223,0.055,50,62],[585.243,0.31,42,24],[585.283,0.16,39,58],[585.283,0.14,51,35],[585.905,0.193,81,48],[586.133,0.03,99,23],[586.133,0.055,50,62],[586.192,0.16,39,58],[586.192,0.14,51,35],[587.042,0.27,48,48],[587.042,0.03,83,17],[587.042,0.03,99,23],[587.042,0.055,50,62],[587.062,0.31,42,24],[587.102,0.16,39,58],[587.102,0.14,51,35],[587.951,0.03,99,23],[587.951,0.055,50,62],[588.011,0.16,39,58],[588.011,0.14,51,35],[588.86,0.27,48,48],[588.86,0.03,83,17],[588.86,0.03,99,23],[588.86,0.055,50,62],[588.88,0.31,42,24],[588.92,0.16,39,58],[588.92,0.14,51,35],[589.769,0.03,99,23],[589.769,0.055,50,62],[589.829,0.16,39,58],[589.829,0.14,51,35],[590.678,0.159,67,54],[590.678,0.03,99,23],[590.678,0.055,50,62],[590.738,0.16,39,58],[590.738,0.14,51,35],[591.587,0.03,99,23],[591.587,0.055,50,62],[591.647,0.16,39,58],[591.647,0.14,51,35],[591.837,0.6,60,47],[592.437,0.346,72,23],[592.437,0.27,48,39],[592.437,0.03,83,14],[592.437,0.03,99,19],[592.437,0.055,50,50],[592.437,4.385,60,13],[592.457,0.31,42,19],[592.497,0.16,39,47],[592.497,0.14,51,28],[592.726,0.219,79,13],[593.591,0.27,48,39],[593.591,0.03,83,14],[593.591,0.03,99,19],[593.591,0.055,50,50],[593.611,0.31,42,19],[593.651,0.16,39,47],[593.651,0.14,51,28],[594.437,0.346,79,23],[594.745,0.27,48,41],[594.745,0.03,83,14],[594.745,0.03,99,18],[594.745,0.055,50,49],[594.765,0.31,42,20],[594.805,0.16,39,46],[594.805,0.14,51,28],[595.033,0.035,117,11],[595.899,0.346,72,7],[595.899,0.27,48,39],[595.899,0.03,83,14],[595.899,0.03,99,18],[595.899,0.055,50,47],[595.919,0.31,42,19],[595.958,0.16,39,44],[595.958,0.14,51,27],[596.36,0.346,76,22],[597.052,0.27,48,34],[597.052,0.03,83,12],[597.052,0.03,99,15],[597.052,0.055,50,39],[597.052,4.385,57,26],[597.072,0.31,42,17],[597.112,0.16,39,36],[597.112,0.14,51,22],[597.485,0.7,76,9],[597.899,0.346,76,22],[598.206,0.346,69,10],[598.206,0.27,48,17],[598.206,0.055,50,19],[598.226,0.31,42,8],[598.266,0.16,39,17],[598.266,0.14,51,10],[599.072,0.219,76,14],[599.072,0.035,117,12],[599.649,0.219,69,14],[599.793,0.277,52,13],[599.822,0.346,72,23],[600.514,0.219,72,12],[600.514,0.277,45,22],[601.206,0.27,64,32],[601.206,0.03,83,11],[601.226,0.31,57,16],[601.36,0.346,76,27],[601.379,0.277,40,26],[601.668,0.277,41,27],[601.668,4.385,60,17],[602.101,0.7,72,7],[602.101,0.277,48,23],[602.245,0.07,98,15],[602.36,0.27,64,23],[602.36,0.03,83,8],[602.38,0.31,57,12],[602.533,0.035,117,13],[602.822,0.346,65,25],[602.822,0.277,41,13],[603.399,0.07,98,24],[604.437,0.346,69,18],[604.552,0.07,98,19],[604.668,0.27,64,24],[604.668,0.03,83,8],[604.688,0.31,57,12],[604.822,0.346,72,18],[605.995,0.035,117,14],[606.283,0.346,67,30],[606.283,0.27,48,12],[606.283,0.055,50,11],[606.283,4.385,55,28],[606.343,0.16,39,12],[606.572,0.035,117,8],[607.437,0.27,48,37],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,34],[607.457,0.31,42,18],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.87,0.7,83,9],[607.899,0.346,71,25],[608.283,0.346,74,15],[608.302,0.219,74,8],[608.591,0.27,48,45],[608.591,0.03,83,16],[608.591,0.03,99,17],[608.591,0.055,50,46],[608.611,0.31,42,23],[608.651,0.16,39,43],[608.651,0.14,51,26],[609.745,0.173,60,20],[609.745,0.03,99,18],[609.745,0.055,50,49],[609.805,0.16,39,46],[609.805,0.14,51,28],[610.899,0.36,72,21],[610.899,0.27,48,37],[610.899,0.03,83,13],[610.899,0.03,99,19],[610.899,0.055,50,50],[610.899,4.56,67,8],[610.919,0.31,42,18],[610.959,0.16,39,47],[610.959,0.14,51,28],[612.099,0.36,72,27],[612.099,0.27,48,37],[612.099,0.03,83,13],[612.099,0.03,99,19],[612.099,0.055,50,50],[612.119,0.31,42,18],[612.159,0.16,39,47],[612.159,0.14,51,28],[613.299,0.36,72,28],[613.299,0.27,48,39],[613.299,0.03,83,14],[613.299,0.03,99,19],[613.299,0.055,50,50],[613.319,0.31,42,19],[613.359,0.16,39,47],[613.359,0.14,51,28],[613.749,0.7,76,13],[614.499,0.36,72,28],[614.499,0.27,48,39],[614.499,0.03,83,14],[614.499,0.03,99,19],[614.499,0.055,50,50],[614.519,0.31,42,19],[614.559,0.16,39,47],[614.559,0.14,51,28],[615.699,0.36,69,30],[615.699,0.27,48,41],[615.699,0.03,83,14],[615.699,0.03,99,19],[615.699,0.055,50,50],[615.699,4.56,64,22],[615.719,0.31,42,21],[615.759,0.16,39,47],[615.759,0.14,51,28],[616.899,0.36,69,30],[616.899,0.27,48,41],[616.899,0.03,83,14],[616.899,0.03,99,19],[616.899,0.055,50,50],[616.919,0.31,42,21],[616.959,0.16,39,47],[616.959,0.14,51,28],[618.099,0.36,69,32],[618.099,0.27,48,43],[618.099,0.03,83,15],[618.099,0.03,99,19],[618.099,0.055,50,50],[618.119,0.31,42,22],[618.159,0.16,39,47],[618.159,0.14,51,28],[619.299,0.36,69,32],[619.299,0.27,48,43],[619.299,0.03,83,15],[619.299,0.03,99,19],[619.299,0.055,50,50],[619.319,0.31,42,22],[619.359,0.16,39,47],[619.359,0.14,51,28],[620.499,0.27,48,46],[620.499,0.03,83,16],[620.499,0.03,99,19],[620.499,0.055,50,50],[620.499,4.56,60,21],[620.519,0.31,42,23],[620.559,0.16,39,47],[620.559,0.14,51,28],[621.399,0.7,72,9],[621.699,0.27,48,46],[621.699,0.03,83,16],[621.699,0.03,99,19],[621.699,0.055,50,50],[621.719,0.31,42,23],[621.759,0.16,39,47],[621.759,0.14,51,28],[622.149,0.7,79,17],[622.899,0.27,48,48],[622.899,0.03,83,17],[622.899,0.03,99,19],[622.899,0.055,50,50],[622.919,0.31,42,24],[622.959,0.16,39,47],[622.959,0.14,51,28],[623.199,0.228,72,20],[624.099,0.27,48,48],[624.099,0.03,83,17],[624.099,0.03,99,19],[624.099,0.055,50,50],[624.119,0.31,42,24],[624.159,0.16,39,47],[624.159,0.14,51,28],[625.299,0.27,48,50],[625.299,0.03,83,17],[625.299,0.03,99,19],[625.299,0.055,50,50],[625.299,4.56,62,18],[625.319,0.31,42,25],[625.359,0.16,39,47],[625.359,0.14,51,28],[626.499,0.27,48,50],[626.499,0.03,83,17],[626.499,0.03,99,19],[626.499,0.055,50,50],[626.519,0.31,42,25],[626.559,0.16,39,47],[626.559,0.14,51,28],[627.699,0.27,48,46],[627.699,0.03,83,16],[627.699,0.03,99,19],[627.699,0.055,50,50],[627.719,0.31,42,23],[627.759,0.16,39,47],[627.759,0.14,51,28],[628.599,0.7,76,10],[628.899,0.18,60,24],[628.899,0.03,99,19],[628.899,0.055,50,50],[628.959,0.16,39,47],[628.959,0.14,51,28],[630.099,0.375,72,24],[630.099,0.27,48,32],[630.099,0.03,83,11],[630.099,0.03,99,19],[630.099,0.055,50,50],[630.119,0.31,42,16],[630.159,0.16,39,47],[630.159,0.14,51,28],[630.567,0.7,72,12],[631.349,0.375,72,24],[631.349,0.27,48,32],[631.349,0.03,83,11],[631.349,0.03,99,19],[631.349,0.055,50,50],[631.369,0.31,42,16],[631.409,0.16,39,47],[631.409,0.14,51,28],[632.599,0.375,72,25],[632.599,0.27,48,34],[632.599,0.03,83,12],[632.599,0.03,99,19],[632.599,0.055,50,50],[632.619,0.31,42,17],[632.659,0.16,39,47],[632.659,0.14,51,28],[633.849,0.375,72,25],[633.849,0.27,48,34],[633.849,0.03,83,12],[633.849,0.03,99,19],[633.849,0.055,50,50],[633.869,0.31,42,17],[633.909,0.16,39,47],[633.909,0.14,51,28],[635.099,0.375,69,27],[635.099,0.27,48,36],[635.099,0.03,83,13],[635.099,0.03,99,19],[635.099,0.055,50,50],[635.099,4.75,60,13],[635.119,0.31,42,18],[635.159,0.16,39,47],[635.159,0.14,51,28],[636.349,0.375,69,27],[636.349,0.27,48,36],[636.349,0.03,83,13],[636.349,0.03,99,19],[636.349,0.055,50,50],[636.369,0.31,42,18],[636.409,0.16,39,47],[636.409,0.14,51,28],[637.599,0.375,69,28],[637.599,0.27,48,38],[637.599,0.03,83,13],[637.599,0.03,99,19],[637.599,0.055,50,50],[637.619,0.31,42,19],[637.659,0.16,39,47],[637.659,0.14,51,28],[638.067,0.7,74,13],[638.849,0.375,69,28],[638.849,0.27,48,38],[638.849,0.03,83,13],[638.849,0.03,99,19],[638.849,0.055,50,50],[638.869,0.31,42,19],[638.909,0.16,39,47],[638.909,0.14,51,28],[640.099,0.375,65,30],[640.099,0.27,48,40],[640.099,0.03,83,14],[640.099,0.03,99,19],[640.099,0.055,50,50],[640.099,4.75,57,19],[640.119,0.31,42,20],[640.159,0.16,39,47],[640.159,0.14,51,28],[641.349,0.375,65,30],[641.349,0.27,48,40],[641.349,0.03,83,14],[641.349,0.03,99,19],[641.349,0.055,50,50],[641.369,0.31,42,20],[641.409,0.16,39,47],[641.409,0.14,51,28],[642.599,0.375,65,31],[642.599,0.27,48,42],[642.599,0.03,83,15],[642.599,0.03,99,19],[642.599,0.055,50,50],[642.619,0.31,42,21],[642.659,0.16,39,47],[642.659,0.14,51,28],[643.849,0.375,65,31],[643.849,0.27,48,42],[643.849,0.03,83,15],[643.849,0.03,99,19],[643.849,0.055,50,50],[643.869,0.31,42,21],[643.909,0.16,39,47],[643.909,0.14,51,28],[645.099,0.375,67,32],[645.099,0.27,48,44],[645.099,0.03,83,15],[645.099,0.03,99,19],[645.099,0.055,50,50],[645.099,4.75,59,16],[645.119,0.31,42,22],[645.159,0.16,39,47],[645.159,0.14,51,28],[646.349,0.375,67,32],[646.349,0.27,48,44],[646.349,0.03,83,15],[646.349,0.03,99,19],[646.349,0.055,50,50],[646.369,0.31,42,22],[646.409,0.16,39,47],[646.409,0.14,51,28],[646.817,0.7,83,16],[647.599,0.375,72,30],[647.599,0.27,48,41],[647.599,0.03,83,14],[647.599,0.03,99,19],[647.599,0.055,50,50],[647.619,0.31,42,20],[647.659,0.16,39,47],[647.659,0.14,51,28],[648.849,0.188,60,21],[648.849,0.03,99,19],[648.849,0.055,50,50],[648.909,0.16,39,47],[648.909,0.14,51,28],[650.099,0.383,72,22],[650.099,0.03,99,19],[650.099,0.055,50,50],[650.159,0.16,39,47],[650.159,0.14,51,28],[651.375,0.383,72,22],[651.375,0.03,99,19],[651.375,0.055,50,50],[651.435,0.16,39,47],[651.435,0.14,51,28],[652.652,0.383,72,24],[652.652,0.03,99,19],[652.652,0.055,50,50],[652.712,0.16,39,47],[652.712,0.14,51,28],[653.928,0.383,72,24],[653.928,0.03,99,19],[653.928,0.055,50,50],[653.988,0.16,39,47],[653.988,0.14,51,28],[655.205,0.383,69,25],[655.205,0.03,99,19],[655.205,0.055,50,50],[655.265,0.16,39,47],[655.265,0.14,51,28],[655.684,0.7,76,12],[656.482,0.383,69,25],[656.482,0.03,99,19],[656.482,0.055,50,50],[656.542,0.16,39,47],[656.542,0.14,51,28],[657.758,0.383,69,26],[657.758,0.03,99,19],[657.758,0.055,50,50],[657.818,0.16,39,47],[657.818,0.14,51,28],[659.035,0.383,69,26],[659.035,0.03,99,19],[659.035,0.055,50,50],[659.095,0.16,39,47],[659.095,0.14,51,28],[660.311,0.383,65,24],[660.311,0.03,99,19],[660.311,0.055,50,50],[660.371,0.16,39,47],[660.371,0.14,51,28],[661.588,0.383,65,24],[661.588,0.03,99,19],[661.588,0.055,50,50],[661.648,0.16,39,47],[661.648,0.14,51,28],[662.865,0.383,65,25],[662.865,0.03,99,19],[662.865,0.055,50,50],[662.925,0.16,39,47],[662.925,0.14,51,28],[663.343,0.7,77,12],[664.141,0.383,65,25],[664.141,0.03,99,19],[664.141,0.055,50,50],[664.201,0.16,39,47],[664.201,0.14,51,28],[665.418,0.383,67,26],[665.418,0.03,99,19],[665.418,0.055,50,50],[665.478,0.16,39,47],[665.478,0.14,51,28],[666.694,0.383,67,26],[666.694,0.03,99,19],[666.694,0.055,50,50],[666.754,0.16,39,47],[666.754,0.14,51,28],[667.971,0.383,72,24],[667.971,0.03,99,19],[667.971,0.055,50,50],[668.031,0.16,39,47],[668.031,0.14,51,28],[669.247,0.192,60,17],[669.247,0.03,99,19],[669.247,0.055,50,50],[669.308,0.16,39,47],[669.308,0.14,51,28],[670.524,0.391,72,18],[670.524,0.03,99,19],[670.524,0.055,50,50],[670.584,0.16,39,47],[670.584,0.14,51,28],[671.046,0.391,76,18],[671.481,0.391,79,18],[671.828,0.391,72,18],[671.828,0.03,99,19],[671.828,0.055,50,50],[671.888,0.16,39,47],[671.888,0.14,51,28],[672.35,0.391,76,18],[672.785,0.391,79,18],[673.133,0.391,72,19],[673.133,0.03,99,19],[673.133,0.055,50,50],[673.193,0.16,39,47],[673.193,0.14,51,28],[673.655,0.391,76,19],[674.089,0.391,79,19],[674.437,0.391,72,19],[674.437,0.03,99,19],[674.437,0.055,50,50],[674.497,0.16,39,47],[674.497,0.14,51,28],[674.959,0.391,76,19],[675.394,0.391,79,19],[675.741,0.391,69,20],[675.741,0.03,99,19],[675.741,0.055,50,50],[675.802,0.16,39,47],[675.802,0.14,51,28],[676.263,0.391,72,20],[676.698,0.391,76,20],[677.046,0.391,69,20],[677.046,0.03,99,19],[677.046,0.055,50,50],[677.106,0.16,39,47],[677.106,0.14,51,28],[677.568,0.391,72,20],[678.002,0.391,76,20],[678.35,0.391,69,21],[678.35,0.03,99,19],[678.35,0.055,50,50],[678.41,0.16,39,47],[678.41,0.14,51,28],[678.872,0.391,72,21],[679.307,0.391,76,21],[679.654,0.03,99,19],[679.654,0.055,50,50],[679.655,0.391,69,21],[679.715,0.16,39,47],[679.715,0.14,51,28],[680.176,0.391,72,21],[680.611,0.391,76,21],[680.959,0.391,65,22],[680.959,0.03,99,19],[680.959,0.055,50,50],[681.019,0.16,39,47],[681.019,0.14,51,28],[681.481,0.391,69,22],[681.915,0.391,72,22],[682.263,0.391,65,22],[682.263,0.03,99,19],[682.263,0.055,50,50],[682.323,0.16,39,47],[682.323,0.14,51,28],[682.785,0.391,69,22],[683.22,0.391,72,22],[683.568,0.391,65,23],[683.568,0.03,99,19],[683.568,0.055,50,50],[683.628,0.16,39,47],[683.628,0.14,51,28],[684.089,0.391,69,23],[684.524,0.391,72,23],[684.872,0.391,65,23],[684.872,0.03,99,19],[684.872,0.055,50,50],[684.932,0.16,39,47],[684.932,0.14,51,28],[685.394,0.391,69,23],[685.828,0.391,72,23],[686.176,0.391,67,24],[686.176,0.03,99,19],[686.176,0.055,50,50],[686.236,0.16,39,47],[686.236,0.14,51,28],[686.698,0.391,71,24],[687.133,0.391,74,24],[687.481,0.391,67,24],[687.481,0.03,99,19],[687.481,0.055,50,50],[687.541,0.16,39,47],[687.541,0.14,51,28],[688.002,0.391,71,24],[688.437,0.391,74,24],[688.785,0.391,72,23],[688.785,0.03,99,19],[688.785,0.055,50,50],[688.845,0.16,39,47],[688.845,0.14,51,28],[689.307,0.391,76,23],[689.741,0.391,79,23],[690.089,0.196,60,16],[690.089,0.03,99,19],[690.089,0.055,50,50],[690.149,0.16,39,47],[690.149,0.14,51,28],[691.394,0.03,99,19],[691.394,0.055,50,50],[691.454,0.16,39,47],[691.454,0.14,51,28],[692.757,0.03,99,19],[692.757,0.055,50,50],[692.817,0.16,39,47],[692.817,0.14,51,28],[694.121,0.03,99,19],[694.121,0.055,50,50],[694.181,0.16,39,47],[694.181,0.14,51,28],[695.485,0.03,99,19],[695.485,0.055,50,50],[695.545,0.16,39,47],[695.545,0.14,51,28],[696.848,0.03,99,19],[696.848,0.055,50,50],[696.908,0.16,39,47],[696.908,0.14,51,28],[698.212,0.03,99,19],[698.212,0.055,50,50],[698.272,0.16,39,47],[698.272,0.14,51,28],[699.576,0.03,99,19],[699.576,0.055,50,50],[699.635,0.16,39,47],[699.635,0.14,51,28],[700.939,0.03,99,19],[700.939,0.055,50,50],[700.999,0.16,39,47],[700.999,0.14,51,28],[702.303,0.03,99,19],[702.303,0.055,50,50],[702.363,0.16,39,47],[702.363,0.14,51,28],[703.666,0.03,99,19],[703.666,0.055,50,50],[703.726,0.16,39,47],[703.726,0.14,51,28],[705.03,0.03,99,19],[705.03,0.055,50,50],[705.09,0.16,39,47],[705.09,0.14,51,28],[706.394,0.03,99,19],[706.394,0.055,50,50],[706.454,0.16,39,47],[706.454,0.14,51,28],[707.757,0.03,99,19],[707.757,0.055,50,50],[707.817,0.16,39,47],[707.817,0.14,51,28],[709.121,0.03,99,19],[709.121,0.055,50,50],[709.181,0.16,39,47],[709.181,0.14,51,28],[710.485,0.03,99,19],[710.485,0.055,50,50],[710.545,0.16,39,47],[710.545,0.14,51,28],[711.848,0.03,99,19],[711.848,0.055,50,50],[711.908,0.16,39,47],[711.908,0.14,51,28],[713.212,0.03,99,16],[713.212,0.055,50,44],[713.272,0.16,39,41],[713.272,0.14,51,24],[714.412,2.4,83,39],[715.212,0.03,99,16],[715.212,0.055,50,44],[715.272,0.16,39,41],[715.272,0.14,51,24],[717.212,0.03,99,16],[717.212,0.055,50,44],[717.272,0.16,39,41],[717.272,0.14,51,24],[718.212,2,60,27],[719.212,0.03,99,16],[719.212,0.055,50,44],[719.272,0.16,39,41],[719.272,0.14,51,24],[721.212,0.03,99,16],[721.212,0.055,50,44],[721.272,0.16,39,41],[721.272,0.14,51,24],[723.212,0.03,99,16],[723.212,0.055,50,44],[723.272,0.16,39,41],[723.272,0.14,51,24],[725.212,0.03,99,16],[725.212,0.055,50,44],[725.272,0.16,39,41],[725.272,0.14,51,24],[727.212,0.03,99,16],[727.212,0.055,50,44],[727.272,0.16,39,41],[727.272,0.14,51,24],[729.212,0.03,99,16],[729.212,0.055,50,44],[729.272,0.16,39,41],[729.272,0.14,51,24],[731.212,0.03,99,16],[731.212,0.055,50,44],[731.272,0.16,39,41],[731.272,0.14,51,24],[733.212,0.03,99,16],[733.212,0.055,50,44],[733.272,0.16,39,41],[733.272,0.14,51,24],[735.212,0.03,99,16],[735.212,0.055,50,44],[735.272,0.16,39,41],[735.272,0.14,51,24],[737.212,0.03,99,16],[737.212,0.055,50,44],[737.272,0.16,39,41],[737.272,0.14,51,24],[739.212,0.03,99,16],[739.212,0.055,50,44],[739.272,0.16,39,41],[739.272,0.14,51,24],[741.212,0.03,99,16],[741.212,0.055,50,44],[741.272,0.16,39,41],[741.272,0.14,51,24],[743.212,0.03,99,16],[743.212,0.055,50,44],[743.272,0.16,39,41],[743.272,0.14,51,24],[745.212,0.03,99,16],[745.212,0.055,50,44],[745.272,0.16,39,41],[745.272,0.14,51,24],[747.212,0.03,99,16],[747.212,0.055,50,44],[747.272,0.16,39,41],[747.272,0.14,51,24],[749.212,0.03,99,16],[749.212,0.055,50,44],[749.272,0.16,39,41],[749.272,0.14,51,24],[751.212,0.03,99,16],[751.212,0.055,50,44],[751.272,0.16,39,41],[751.272,0.14,51,24],[753.212,0.03,99,16],[753.212,0.055,50,44],[753.272,0.16,39,41],[753.272,0.14,51,24],[755.212,0.03,99,16],[755.212,0.055,50,44],[755.272,0.16,39,41],[755.272,0.14,51,24],[757.212,0.03,99,16],[757.212,0.055,50,44],[757.272,0.16,39,41],[757.272,0.14,51,24],[759.212,0.03,99,16],[759.212,0.055,50,44],[759.272,0.16,39,41],[759.272,0.14,51,24],[761.212,0.03,99,16],[761.212,0.055,50,44],[761.272,0.16,39,41],[761.272,0.14,51,24],[763.212,0.03,99,16],[763.212,0.055,50,44],[763.272,0.16,39,41],[763.272,0.14,51,24],[765.212,0.03,99,16],[765.212,0.055,50,44],[765.272,0.16,39,41],[765.272,0.14,51,24],[767.212,0.03,99,16],[767.212,0.055,50,44],[767.272,0.16,39,41],[767.272,0.14,51,24],[769.212,0.03,99,16],[769.212,0.055,50,44],[769.272,0.16,39,41],[769.272,0.14,51,24],[771.212,0.03,99,16],[771.212,0.055,50,44],[771.272,0.16,39,41],[771.272,0.14,51,24]],[[33.95,0.427,76,169],[37.75,0.855,74,199],[43.98,0.999,76,199],[49.9,0.504,72,199],[52.14,0.504,76,199],[56.16,0.25,79,199],[58.14,0.792,72,177],[59.78,0.15,62,173],[61.3,0.36,79,22],[62.5,0.36,79,22],[63.7,0.36,79,23],[64.9,0.36,79,23],[66.1,0.36,76,24],[67.3,0.36,76,24],[68.5,0.36,76,25],[69.7,0.36,76,21],[70.9,0.36,72,22],[72.1,0.36,72,22],[73.3,0.36,72,23],[74.5,0.36,72,23],[75.7,0.36,74,24],[76.9,0.36,74,24],[78.1,0.36,79,22],[78.66,0.18,62,22],[80.483,0.353,79,29],[81.659,0.353,79,29],[82.836,0.353,79,31],[84.012,0.353,79,31],[84.032,0.224,72,17],[85.189,0.353,76,32],[86.365,0.353,76,22],[87.542,0.353,76,23],[88.718,0.353,76,23],[97.502,0.176,62,31],[99.29,0.346,79,39],[100.444,0.346,79,19],[101.04,0.035,117,11],[101.597,0.346,79,20],[101.617,0.035,117,8],[102.751,0.346,79,20],[102.77,0.219,72,11],[103.347,0.219,69,12],[103.905,0.346,76,21],[104.645,0.7,79,11],[105.059,0.346,76,21],[105.655,0.035,117,9],[106.213,0.346,76,35],[106.232,0.035,117,12],[107.367,0.346,76,35],[108.828,0.219,69,20],[110.847,0.035,117,12],[111.424,0.035,117,13],[112.722,0.7,74,14],[114.309,0.219,74,16],[115.982,0.173,62,19],[117.36,0.227,57,10],[117.36,0.227,60,10],[117.36,0.227,64,10],[118.723,0.227,57,10],[118.723,0.227,60,10],[118.723,0.227,64,10],[120.087,0.227,62,10],[120.087,0.227,65,10],[120.087,0.227,69,10],[121.451,0.227,64,10],[121.451,0.227,68,10],[121.451,0.227,71,10],[122.814,0.227,57,10],[122.814,0.227,60,10],[122.814,0.227,64,10],[124.178,0.227,65,10],[124.178,0.227,69,10],[124.178,0.227,72,10],[125.541,0.227,62,10],[125.541,0.227,65,10],[125.541,0.227,69,10],[126.905,0.227,64,10],[126.905,0.227,68,10],[126.905,0.227,71,10],[128.269,0.227,57,10],[128.269,0.227,60,10],[128.269,0.227,64,10],[129.632,0.227,57,10],[129.632,0.227,60,10],[129.632,0.227,64,10],[130.996,0.227,62,10],[130.996,0.227,65,10],[130.996,0.227,69,10],[132.36,0.227,64,10],[132.36,0.227,68,10],[132.36,0.227,71,10],[133.723,0.227,57,10],[133.723,0.227,60,10],[133.723,0.227,64,10],[135.087,0.227,65,9],[135.087,0.227,69,9],[135.087,0.227,72,9],[136.451,0.227,64,9],[136.451,0.227,68,9],[136.451,0.227,71,9],[137.814,0.227,57,9],[137.814,0.227,60,9],[137.814,0.227,64,9],[139.178,0.227,57,9],[139.178,0.227,60,9],[139.178,0.227,64,9],[139.632,0.409,77,26],[140.541,0.227,57,9],[140.541,0.227,60,9],[140.541,0.227,64,9],[140.769,0.045,111,12],[140.996,0.191,69,10],[141.451,0.045,111,19],[141.905,0.227,62,9],[141.905,0.227,65,9],[141.905,0.227,69,9],[143.041,0.191,80,10],[143.269,0.227,64,9],[143.269,0.227,68,9],[143.269,0.227,71,9],[144.178,0.818,74,26],[144.632,0.227,57,9],[144.632,0.227,60,9],[144.632,0.227,64,9],[145.541,0.045,111,12],[145.996,0.227,65,11],[145.996,0.227,69,11],[145.996,0.227,72,11],[146.223,0.045,111,15],[146.905,0.045,111,8],[147.36,0.227,62,11],[147.36,0.227,65,11],[147.36,0.227,69,11],[147.814,0.409,72,31],[147.814,0.191,81,12],[148.723,0.227,64,11],[148.723,0.227,68,11],[148.723,0.227,71,11],[149.86,0.191,69,12],[150.087,0.227,57,11],[150.087,0.227,60,11],[150.087,0.227,64,11],[150.996,0.045,111,21],[151.451,0.227,57,11],[151.451,0.227,60,11],[151.451,0.227,64,11],[151.678,0.045,111,10],[152.36,0.818,81,33],[152.814,0.227,62,11],[152.814,0.227,65,11],[152.814,0.227,69,11],[154.178,0.227,64,13],[154.178,0.227,68,13],[154.178,0.227,71,13],[154.632,0.191,80,14],[155.541,0.227,57,13],[155.541,0.227,60,13],[155.541,0.227,64,13],[155.769,0.045,111,12],[156.451,0.818,77,38],[156.451,0.045,111,19],[156.678,0.191,84,14],[156.905,0.227,65,13],[156.905,0.227,69,13],[156.905,0.227,72,13],[158.269,0.227,64,13],[158.269,0.227,68,13],[158.269,0.227,71,13],[159.178,1.227,69,38],[159.632,0.227,57,13],[159.632,0.227,60,13],[159.632,0.227,64,13],[160.541,0.045,111,12],[160.996,0.227,57,15],[160.996,0.227,60,15],[160.996,0.227,64,15],[161.223,0.045,111,15],[161.451,0.191,57,17],[161.905,0.045,111,8],[162.36,0.227,57,17],[162.36,0.227,60,17],[162.36,0.227,64,17],[163.496,0.191,65,20],[163.723,0.227,62,17],[163.723,0.227,65,17],[163.723,0.227,69,17],[164.178,0.409,75,17],[165.087,0.227,64,17],[165.087,0.227,68,17],[165.087,0.227,71,17],[165.996,0.045,111,21],[166.451,0.227,57,17],[166.451,0.227,60,17],[166.451,0.227,64,17],[166.678,0.045,111,10],[167.814,0.227,65,17],[167.814,0.227,69,17],[167.814,0.227,72,17],[168.269,0.409,73,17],[168.269,0.191,72,20],[169.178,0.227,62,17],[169.178,0.227,65,17],[169.178,0.227,69,17],[170.314,0.191,64,20],[170.541,0.227,64,17],[170.541,0.227,68,17],[170.541,0.227,71,17],[170.769,0.045,111,12],[171.451,0.045,111,19],[171.905,0.227,57,15],[171.905,0.227,60,15],[171.905,0.227,64,15],[172.36,0.409,73,16],[173.269,0.227,57,15],[173.269,0.227,60,15],[173.269,0.227,64,15],[174.632,0.227,62,15],[174.632,0.227,65,15],[174.632,0.227,69,15],[175.087,0.191,65,18],[175.541,0.045,111,12],[175.996,0.227,64,15],[175.996,0.227,68,15],[175.996,0.227,71,15],[176.223,0.045,111,15],[176.905,0.818,70,16],[176.905,0.045,111,8],[177.132,0.191,64,18],[177.36,0.227,57,15],[177.36,0.227,60,15],[177.36,0.227,64,15],[178.723,0.227,65,15],[178.723,0.227,69,15],[178.723,0.227,72,15],[180.087,0.227,64,13],[180.087,0.227,68,13],[180.087,0.227,71,13],[180.087,0.409,68,14],[180.996,0.045,111,21],[181.451,0.227,57,13],[181.451,0.227,60,13],[181.451,0.227,64,13],[181.678,0.045,111,10],[181.905,0.191,57,15],[182.844,0.242,57,12],[182.844,0.242,60,12],[182.844,0.242,64,12],[184.295,0.242,65,12],[184.295,0.242,69,12],[184.295,0.242,72,12],[185.747,0.242,64,12],[185.747,0.242,68,12],[185.747,0.242,71,12],[187.198,0.242,57,12],[187.198,0.242,60,12],[187.198,0.242,64,12],[188.702,0.268,57,12],[188.702,0.268,60,12],[188.702,0.268,64,12],[190.309,0.268,65,12],[190.309,0.268,69,12],[190.309,0.268,72,12],[191.916,0.268,64,12],[191.916,0.268,68,12],[191.916,0.268,71,12],[192.988,1.607,57,28],[193.523,0.268,57,12],[193.523,0.268,60,12],[193.523,0.268,64,12],[195.984,0.158,72,15],[196.181,0.158,74,15],[197.563,0.158,56,11],[197.76,0.158,58,11],[199.142,0.158,67,11],[199.339,0.158,65,11],[199.537,0.158,76,15],[199.734,0.158,77,15],[201.116,0.158,60,11],[201.313,0.158,62,11],[202.695,0.158,63,20],[202.892,0.158,62,20],[203.089,0.158,76,27],[203.287,0.158,74,27],[204.668,0.158,63,20],[204.668,0.143,65,27],[204.847,0.143,67,27],[204.866,0.158,65,20],[206.097,0.143,60,20],[206.275,0.143,58,20],[206.454,0.143,72,27],[206.633,0.143,70,27],[207.883,0.143,69,23],[208.061,0.143,70,23],[209.311,0.143,56,17],[209.49,0.143,55,17],[209.668,0.143,69,23],[209.847,0.143,67,23],[211.097,0.143,72,23],[211.275,0.143,74,23],[212.525,0.143,56,17],[212.704,0.143,58,17],[213.892,0.13,67,25],[214.055,0.13,65,25],[214.218,0.13,76,34],[214.381,0.13,77,34],[215.522,0.13,60,25],[215.685,0.13,62,25],[216.827,0.13,63,25],[216.99,0.13,62,25],[217.153,0.13,76,34],[217.316,0.13,74,34],[218.457,0.13,63,35],[218.615,0.114,66,53],[218.62,0.13,65,35],[219.259,0.114,71,53],[219.659,0.114,76,53],[220.022,0.391,78,59],[220.426,0.5,102,108],[222.614,0.143,65,47],[222.792,0.143,67,47],[224.042,0.143,60,35],[224.221,0.143,58,35],[224.399,0.143,72,47],[224.578,0.143,70,47],[225.828,0.143,69,57],[226.006,0.143,70,57],[227.256,0.143,56,43],[227.435,0.143,55,43],[227.614,0.143,69,57],[227.792,0.143,67,57],[228.98,0.13,72,57],[229.143,0.13,74,57],[230.285,0.13,56,43],[230.447,0.13,58,43],[231.589,0.13,67,50],[231.752,0.13,65,50],[231.915,0.13,76,67],[232.078,0.13,77,67],[233.219,0.13,60,50],[233.382,0.13,62,50],[234.445,0.12,63,50],[234.595,0.12,62,50],[234.745,0.12,76,67],[234.895,0.12,74,67],[235.945,0.12,63,31],[235.945,0.12,65,42],[236.095,0.12,65,31],[236.095,0.12,67,42],[237.145,0.12,60,31],[237.295,0.12,58,31],[237.445,0.12,72,42],[237.595,0.12,70,42],[238.491,0.105,66,47],[239.083,0.105,71,47],[239.451,0.105,76,47],[239.785,0.36,78,52],[240.157,0.5,102,108],[246.002,0.04,99,43],[246.717,0.16,43,49],[246.717,0.03,99,22],[248.145,0.16,43,49],[248.145,0.03,99,22],[260.288,0.04,99,43],[261.002,0.16,48,49],[261.002,0.03,99,22],[262.431,0.16,48,49],[262.431,0.03,99,22],[266.36,0.25,61,40],[268.145,0.25,71,49],[274.574,0.04,99,43],[275.288,0.16,43,49],[275.288,0.03,99,22],[276.717,0.16,43,49],[276.717,0.03,99,22],[277.431,1.429,63,42],[288.86,0.04,99,43],[289.217,0.16,48,49],[289.217,0.03,99,22],[289.931,0.16,48,49],[289.931,0.03,99,22],[290.645,0.16,48,49],[290.645,0.03,99,22],[291.36,0.16,48,49],[291.36,0.03,99,22],[301.766,0.444,57,35],[303.155,0.444,53,35],[304.544,0.444,72,35],[305.933,0.444,74,35],[307.322,0.444,72,35],[308.155,6.333,65,16],[308.71,0.444,60,35],[310.099,0.444,53,35],[311.488,0.444,58,35],[311.488,0.055,50,8],[311.548,0.16,39,8],[312.322,0.055,50,11],[312.382,0.16,39,10],[312.599,0.444,74,10],[312.877,0.444,77,47],[313.155,0.055,50,13],[313.215,0.16,39,12],[313.215,0.14,51,7],[313.988,0.444,72,14],[313.988,0.055,50,15],[314.048,0.16,39,15],[314.048,0.14,51,9],[314.266,0.444,76,46],[314.822,0.055,50,18],[314.822,6.333,65,13],[314.882,0.16,39,17],[314.882,0.14,51,10],[315.377,0.444,60,18],[315.655,0.444,65,44],[315.655,0.03,99,8],[315.655,0.055,50,21],[315.715,0.16,39,20],[315.715,0.14,51,12],[316.488,0.03,99,9],[316.488,0.055,50,25],[316.548,0.16,39,23],[316.548,0.14,51,14],[316.766,0.444,57,23],[316.766,0.065,99,8],[317.044,0.444,60,41],[317.044,0.065,99,8],[317.322,0.03,99,11],[317.322,0.055,50,28],[317.382,0.16,39,27],[317.382,0.14,51,16],[318.155,0.444,58,29],[318.155,0.03,99,12],[318.155,0.055,50,32],[318.215,0.16,39,30],[318.215,0.14,51,18],[318.433,0.444,62,38],[318.433,0.065,99,10],[318.71,0.065,99,11],[318.988,0.03,99,13],[318.988,0.055,50,35],[319.048,0.16,39,33],[319.048,0.14,51,20],[319.544,0.444,77,34],[319.822,0.444,60,33],[319.822,0.03,99,14],[319.822,0.055,50,38],[319.882,0.16,39,36],[319.882,0.14,51,22],[320.099,0.065,99,12],[320.377,0.065,99,13],[320.655,0.03,99,16],[320.655,0.055,50,42],[320.715,0.16,39,39],[320.715,0.14,51,24],[320.933,0.444,76,39],[321.21,0.444,79,27],[321.488,0.03,99,17],[321.488,0.055,50,45],[321.488,6.333,72,15],[321.548,0.16,39,42],[321.548,0.14,51,25],[321.766,0.065,99,14],[322.044,0.065,99,15],[322.322,0.444,65,43],[322.322,0.03,99,18],[322.322,0.055,50,48],[322.382,0.16,39,45],[322.382,0.14,51,27],[322.599,0.444,69,12],[323.155,0.03,99,19],[323.155,0.055,50,50],[323.215,0.16,39,47],[323.215,0.14,51,28],[323.433,0.065,99,16],[323.71,0.444,57,28],[323.71,0.065,99,16],[323.988,0.03,99,19],[323.988,0.055,50,52],[324.048,0.16,39,49],[324.048,0.14,51,29],[324.822,0.03,99,20],[324.822,0.055,50,53],[324.882,0.16,39,50],[324.882,0.14,51,30],[325.099,0.444,62,29],[325.099,0.065,99,17],[325.377,0.065,99,17],[325.655,0.03,99,20],[325.655,0.055,50,53],[325.715,0.16,39,50],[325.715,0.14,51,30],[326.488,0.444,60,29],[326.488,0.03,99,20],[326.488,0.055,50,52],[326.548,0.16,39,49],[326.548,0.14,51,29],[326.766,0.065,99,16],[327.044,0.065,99,16],[327.322,0.03,99,19],[327.322,0.055,50,50],[327.382,0.16,39,47],[327.382,0.14,51,28],[327.599,0.444,76,10],[327.877,0.444,79,27],[328.155,0.03,99,18],[328.155,0.055,50,48],[328.215,0.16,39,45],[328.215,0.14,51,27],[328.433,0.065,99,15],[328.71,0.065,99,14],[328.988,0.444,65,16],[328.988,0.03,99,16],[328.988,0.055,50,44],[329.048,0.16,39,41],[329.048,0.14,51,25],[329.266,0.444,69,24],[329.822,0.75,81,18],[329.822,0.03,99,15],[329.822,0.055,50,39],[329.882,0.16,39,36],[329.882,0.14,51,22],[330.099,0.065,99,12],[330.377,0.444,60,22],[330.377,0.065,99,11],[330.655,0.444,65,18],[330.655,0.03,99,12],[330.655,0.055,50,33],[330.715,0.16,39,31],[330.715,0.14,51,18],[331.21,0.25,77,20],[331.488,0.03,99,10],[331.488,0.055,50,26],[331.548,0.16,39,24],[331.548,0.14,51,15],[331.766,0.444,62,26],[331.766,0.065,99,8],[332.044,0.444,65,12],[332.322,0.055,50,19],[332.382,0.16,39,17],[332.382,0.14,51,10],[333.155,0.444,60,26],[333.155,0.055,50,11],[333.215,0.16,39,9],[334.266,0.5,82,22],[334.544,0.444,79,26],[335.655,0.444,65,8],[335.933,0.444,69,25],[336.488,0.75,79,10],[337.044,0.444,57,14],[337.322,0.444,62,22],[338.155,0.75,74,15],[338.433,0.444,62,20],[338.71,0.444,65,16],[339.822,0.444,60,24],[339.822,0.5,77,20],[340.099,0.444,64,10],[341.21,0.444,79,26],[342.599,0.444,69,26],[343.988,0.444,65,17],[343.988,0.5,67,12],[344.544,0.065,99,8],[345.099,0.444,62,10],[345.377,0.444,65,15],[345.933,0.065,99,11],[346.21,0.065,99,12],[346.488,0.444,60,14],[346.766,0.444,64,12],[347.044,0.5,69,8],[347.599,0.065,99,14],[347.877,0.444,79,16],[347.877,0.065,99,15],[348.155,0.444,53,8],[348.155,1.5,69,12],[348.155,6.333,72,47],[349.266,0.444,69,18],[349.266,0.065,99,16],[349.544,0.065,99,16],[350.655,0.444,62,19],[350.933,0.065,99,17],[351.21,0.065,99,17],[352.044,0.444,65,18],[352.322,0.75,64,13],[352.599,0.065,99,16],[352.877,0.065,99,16],[353.433,0.444,64,17],[354.266,0.065,99,15],[354.544,0.444,79,8],[354.544,0.065,99,14],[354.822,0.444,53,13],[354.822,6.333,69,13],[355.933,0.444,69,10],[355.933,0.065,99,13],[356.21,0.444,72,12],[356.21,0.065,99,12],[357.322,0.444,65,12],[357.599,0.444,69,10],[357.599,0.065,99,11],[357.877,0.065,99,10],[358.71,0.444,65,13],[358.988,0.444,70,8],[359.266,0.065,99,8],[359.544,0.065,99,8],[360.099,0.444,64,14],[361.488,0.444,53,15],[362.877,0.444,72,15],[364.266,0.444,65,13],[365.655,0.444,70,23],[367.044,0.444,67,19],[368.433,0.444,57,16],[369.822,0.444,53,12],[371.21,0.444,72,12],[372.599,0.444,74,8],[375.822,4.071,60,8],[376.607,0.321,67,25],[378.366,0.7,64,12],[378.393,0.321,64,27],[379.839,0.204,60,15],[380.107,0.321,57,28],[381.964,0.321,64,28],[383.75,0.321,60,30],[384.393,4.071,60,12],[385.197,0.7,60,15],[385.464,0.321,53,31],[385.866,0.7,67,28],[387.322,0.321,60,51],[388.679,4.071,62,21],[389.107,0.321,59,53],[390.822,0.321,60,49],[391.625,0.7,64,45],[392.107,0.161,62,34],[392.964,3.931,67,50],[393.352,0.7,72,67],[393.723,0.31,79,41],[395.447,0.31,76,55],[395.809,0.035,117,10],[396.327,0.035,117,11],[396.844,0.197,72,31],[397.102,0.31,69,58],[397.102,3.931,64,45],[397.361,0.197,69,32],[398.895,0.31,76,58],[398.913,0.7,79,17],[399.559,0.7,74,33],[400.62,0.31,72,61],[400.982,0.035,117,13],[401.24,3.931,60,10],[401.499,0.035,117,12],[402.275,0.31,65,64],[402.275,0.197,69,36],[404.068,0.31,72,68],[405.378,3.931,59,20],[405.637,0.035,117,11],[405.792,0.31,71,72],[406.154,0.7,74,17],[406.154,0.035,117,15],[406.671,0.035,117,11],[406.801,0.7,83,32],[407.188,0.197,74,40],[407.447,0.31,72,66],[408.688,0.155,62,46],[409.516,3.8,64,18],[410.249,0.3,91,48],[410.766,0.035,117,10],[411.266,0.035,117,12],[411.766,0.035,117,7],[411.916,0.3,88,61],[412.266,0.7,88,11],[413.266,0.19,84,34],[413.516,0.3,81,64],[413.516,3.8,60,59],[413.766,0.19,81,36],[413.891,0.7,88,68],[415.249,0.3,88,64],[415.696,0.4,96,7],[415.766,0.035,117,11],[416.266,0.035,117,14],[416.766,0.035,117,8],[416.916,0.3,84,67],[417.516,3.8,57,50],[418.516,0.3,77,71],[418.516,0.19,81,40],[419.266,0.7,91,40],[419.696,0.4,93,12],[419.891,0.7,89,68],[419.926,0.52,95,8],[420.249,0.3,84,84],[420.766,0.035,117,13],[421.266,0.035,117,15],[421.516,3.8,55,13],[421.516,3.8,59,21],[421.766,0.035,117,9],[421.916,0.3,83,88],[423.266,0.19,86,49],[423.516,0.3,84,81],[424.716,0.15,74,57],[425.516,3.677,60,32],[425.516,0.027,117,22],[425.758,0.045,117,53],[426,0.027,117,40],[426.226,0.29,103,52],[426.242,0.045,117,64],[426.484,0.027,117,36],[426.726,0.045,117,41],[426.847,0.7,100,47],[426.968,0.027,117,12],[427.839,0.29,100,55],[429.145,0.184,96,31],[429.387,0.29,93,58],[429.387,3.677,57,42],[429.629,0.184,93,32],[430.355,0.027,117,14],[430.597,0.045,117,46],[430.839,0.027,117,40],[431.065,0.29,100,58],[431.081,0.045,117,72],[431.323,0.027,117,47],[431.565,0.045,117,61],[431.806,0.027,117,25],[432.048,0.045,117,13],[432.677,0.29,96,61],[433.258,3.677,53,48],[433.621,0.7,96,48],[434.226,0.29,89,55],[434.226,0.184,93,31],[435.435,0.045,117,36],[435.677,0.027,117,39],[435.903,0.29,96,58],[435.919,0.045,117,78],[436.161,0.027,117,53],[436.403,0.045,117,78],[436.645,0.027,117,38],[436.887,0.045,117,35],[437.129,3.677,55,42],[437.516,0.29,95,60],[438.823,0.184,96,34],[439.065,0.29,96,56],[439.306,0.218,64,79],[439.427,0.7,100,52],[441,0.03,99,61],[441,0.055,50,163],[441,3.8,69,18],[441,0.46,62,66],[441.06,0.16,39,137],[441.06,0.14,51,82],[441.4,0.3,66,8],[441.5,0.11,98,22],[441.5,0.095,54,25],[442,0.055,50,8],[442.75,0.23,64,67],[443,0.46,66,67],[443.5,0.46,64,67],[444,0.92,62,67],[445,3.8,66,12],[447.733,0.3,66,34],[448.4,0.3,62,34],[449,0.3,55,36],[449,3.8,62,21],[449.733,0.3,62,36],[449.75,0.7,62,10],[450,0.3,55,36],[450.375,0.7,69,18],[450.733,0.3,62,36],[451.375,0.7,67,18],[451.4,0.3,59,38],[452,0.3,55,38],[453,3.8,64,25],[454.75,0.23,69,91],[455,0.46,66,91],[455.5,0.46,64,91],[456,0.92,62,91],[457,3.8,69,15],[457,0.46,62,70],[460.4,0.3,66,33],[461,0.3,59,34],[461,3.8,66,8],[461.733,0.3,66,34],[461.75,0.7,66,9],[462.733,0.3,66,34],[462.75,0.7,69,9],[463.375,0.7,64,17],[463.4,0.3,62,36],[464,0.3,59,36],[464.733,0.3,66,36],[465,3.8,59,15],[467.25,0.276,55,29],[467.5,0.23,66,87],[467.75,0.23,64,87],[467.75,0.138,54,29],[468,0.92,62,87],[468,0.138,52,29],[468.25,0.552,50,29],[469,3.8,61,24],[469,0.46,64,146],[469.5,0.23,66,146],[472.4,0.3,66,54],[473,0.295,62,43],[473,3.738,66,19],[473.721,0.295,69,43],[473.738,0.7,62,11],[474.377,0.295,66,43],[474.721,0.7,66,11],[475.336,0.7,66,22],[475.361,0.295,66,46],[475.459,0.027,117,20],[475.705,0.045,117,52],[475.951,0.295,62,46],[475.951,0.027,117,41],[476.197,0.045,117,69],[476.443,0.027,117,39],[476.672,0.295,69,46],[476.688,0.045,117,46],[476.934,3.738,62,17],[476.934,0.027,117,16],[477.303,0.7,66,24],[479.885,0.905,59,120],[480.377,0.027,117,16],[480.623,0.045,117,51],[480.869,3.738,59,10],[480.869,0.453,62,133],[480.869,0.027,117,46],[481.115,0.045,117,80],[481.361,0.453,67,133],[481.361,0.027,117,48],[481.606,0.045,117,61],[481.852,0.226,69,133],[481.852,0.027,117,23],[482.098,0.226,71,133],[482.098,0.045,117,7],[483.082,0.272,55,41],[483.574,0.136,54,41],[483.82,0.136,52,41],[484.066,0.543,50,41],[484.803,0.295,57,59],[484.803,3.738,57,15],[485.295,0.027,117,12],[485.525,0.295,64,59],[485.541,0.7,64,16],[485.541,0.045,117,50],[485.787,0.027,117,47],[486.033,0.045,117,86],[486.18,0.295,61,59],[486.279,0.027,117,55],[486.525,0.7,73,16],[486.525,0.045,117,74],[486.771,0.295,62,54],[486.771,0.027,117,29],[487.016,0.045,117,18],[487.508,0.7,66,16],[487.754,0.295,62,54],[488.475,0.295,69,54],[488.738,3.677,62,18],[489.101,0.7,62,23],[489.125,0.29,66,45],[489.705,0.29,62,45],[490.068,0.7,66,23],[490.431,0.223,64,11],[490.431,0.045,117,34],[490.673,0.03,99,10],[490.673,0.055,50,27],[490.673,0.445,78,16],[490.673,0.027,117,37],[490.733,0.16,39,28],[490.733,0.14,51,17],[490.915,0.045,117,71],[491.157,0.445,76,30],[491.157,0.027,117,44],[491.399,0.045,117,53],[491.641,0.03,99,32],[491.641,0.055,50,85],[491.641,0.89,74,50],[491.641,0.027,117,16],[491.701,0.16,39,84],[491.701,0.14,51,50],[492.609,0.03,99,65],[492.609,0.055,50,173],[492.609,3.677,59,10],[492.609,0.445,66,66],[492.669,0.16,39,167],[492.669,0.14,51,100],[493.092,0.223,69,20],[493.576,0.03,99,72],[493.576,0.055,50,193],[493.636,0.16,39,177],[493.636,0.14,51,106],[493.964,0.29,62,35],[494.06,0.027,117,32],[494.302,0.7,69,13],[494.302,0.045,117,75],[494.544,0.29,59,54],[494.544,0.055,50,11],[494.544,0.027,117,43],[494.786,0.045,117,22],[494.907,0.7,76,12],[494.931,0.29,62,46],[495.27,0.203,47,63],[495.512,0.203,47,71],[495.754,0.534,59,11],[495.996,0.11,98,79],[495.996,0.095,54,89],[496.238,0.203,47,18],[496.48,3.677,55,55],[496.48,0.445,62,135],[496.48,0.027,117,37],[496.722,0.045,117,84],[496.964,0.11,98,26],[496.964,0.095,54,29],[496.964,0.445,67,36],[496.964,0.027,117,27],[497.189,0.29,62,13],[497.447,0.29,55,34],[497.447,0.03,99,68],[497.447,0.055,50,181],[497.507,0.16,39,187],[497.507,0.14,51,112],[497.81,0.7,69,20],[498.157,0.29,62,15],[498.415,0.203,43,20],[498.415,0.445,79,56],[498.415,0.027,117,39],[498.657,0.045,117,85],[498.899,0.11,98,23],[498.899,0.095,54,25],[498.899,0.223,78,155],[498.899,0.027,117,12],[499.141,0.203,43,34],[499.141,0.223,76,96],[499.77,0.29,59,11],[500.092,0.29,62,31],[500.109,0.045,117,61],[500.351,0.03,99,92],[500.351,0.055,50,246],[500.351,3.677,64,80],[500.351,0.445,64,13],[500.351,0.027,117,54],[500.411,0.16,39,223],[500.411,0.14,51,134],[500.834,0.223,66,171],[501.076,0.203,45,49],[501.076,0.223,69,95],[501.318,0.203,45,56],[501.56,0.045,117,18],[501.705,0.29,61,46],[501.802,0.11,98,112],[501.802,0.095,54,126],[501.802,0.027,117,58],[502.028,0.29,64,44],[502.044,0.045,117,39],[502.286,0.03,99,51],[502.286,0.055,50,135],[502.286,0.445,78,103],[502.346,0.16,39,162],[502.346,0.14,51,97],[502.77,0.445,76,113],[503.012,0.203,50,11],[503.012,0.267,64,35],[503.254,0.203,50,48],[503.254,0.027,117,52],[503.496,0.045,117,47],[503.641,0.29,66,23],[503.738,0.11,98,112],[503.738,0.095,54,126],[503.964,0.29,69,34],[504.222,0.055,50,13],[504.222,3.677,69,35],[504.222,0.445,62,9],[504.282,0.16,39,50],[504.282,0.14,51,30],[504.705,0.223,66,120],[504.705,0.027,117,40],[504.931,0.29,69,32],[504.947,0.045,117,41],[505.189,0.29,62,19],[505.189,0.203,50,24],[505.552,0.7,66,16],[505.673,0.11,98,68],[505.673,0.095,54,77],[505.915,0.223,64,22],[506.157,0.445,78,112],[506.157,0.027,117,40],[506.399,0.045,117,52],[506.641,0.445,76,38],[506.867,0.29,69,18],[507.125,0.03,99,10],[507.125,0.055,50,27],[507.609,0.027,117,29],[507.851,0.203,50,32],[507.851,0.045,117,68],[508.092,3.677,59,55],[508.092,0.445,66,143],[508.802,0.29,66,27],[508.818,0.7,66,8],[509.06,0.03,99,76],[509.06,0.055,50,203],[509.12,0.16,39,186],[509.12,0.14,51,112],[509.302,0.045,117,64],[509.423,0.7,69,17],[509.447,0.29,62,14],[509.544,0.027,117,42],[509.786,0.203,47,28],[510.028,0.203,47,49],[510.028,0.668,76,138],[510.27,0.401,64,12],[510.512,0.11,98,93],[510.512,0.095,54,105],[510.996,0.134,62,22],[510.996,0.027,117,23],[511.238,0.534,59,7],[511.238,0.045,117,80],[511.383,0.29,62,40],[511.48,0.027,117,35],[511.705,0.29,66,30],[511.722,0.03,99,61],[511.722,0.055,50,163],[511.782,0.16,39,168],[511.782,0.14,51,101],[511.964,0.29,55,8],[511.964,0.03,99,83],[511.964,0.055,50,221],[511.964,3.677,59,24],[511.964,3.677,62,14],[512.024,0.16,39,211],[512.024,0.14,51,126],[512.326,0.7,62,18],[512.447,0.445,67,114],[512.931,0.203,43,7],[512.931,0.223,69,157],[513.173,0.223,71,134],[513.173,0.045,117,46],[513.415,0.445,69,92],[513.415,0.027,117,52],[513.657,0.203,43,52],[513.657,0.045,117,72],[513.899,0.203,43,55],[513.899,0.027,117,17],[514.383,0.11,98,80],[514.383,0.095,54,89],[514.609,0.29,62,38],[514.625,0.7,79,10],[514.625,0.203,43,29],[514.867,0.29,55,43],[514.867,0.203,43,15],[515.351,0.11,98,116],[515.351,0.095,54,130],[515.576,0.29,62,41],[515.835,3.677,64,71],[516.076,0.045,117,53],[516.197,0.7,64,16],[516.222,0.29,61,31],[516.318,0.11,98,78],[516.318,0.095,54,88],[516.318,0.027,117,53],[516.56,0.045,117,92],[516.802,0.29,57,20],[516.802,0.027,117,49],[517.044,0.045,117,46],[517.286,0.11,98,32],[517.286,0.095,54,36],[517.528,0.223,69,170],[517.77,0.445,78,172],[518.254,0.095,54,7],[518.254,0.445,76,173],[518.738,0.89,74,173],[519.705,3.738,69,30],[519.705,0.453,62,121],[520.443,0.045,117,28],[520.689,0.027,117,30],[520.935,0.045,117,61],[521.181,0.027,117,41],[521.427,0.045,117,59],[521.673,0.027,117,30],[521.918,0.045,117,25],[522.394,0.295,69,40],[523.05,0.295,66,40],[523.64,0.295,59,42],[523.64,3.738,62,29],[524.361,0.295,66,42],[524.378,0.7,66,11],[525.345,0.295,66,42],[525.361,0.7,69,11],[525.361,0.045,117,23],[525.607,0.027,117,31],[525.853,0.045,117,68],[525.976,0.7,64,21],[526,0.295,62,44],[526.099,0.027,117,48],[526.345,0.045,117,73],[526.591,0.295,59,44],[526.591,0.136,50,32],[526.591,0.027,117,38],[526.837,0.543,47,32],[526.837,0.045,117,37],[527.574,3.738,59,58],[530.033,0.226,66,120],[530.279,0.226,64,120],[530.279,0.045,117,16],[530.525,0.905,62,120],[530.525,0.027,117,29],[530.771,0.045,117,69],[531.017,0.027,117,52],[531.263,0.045,117,83],[531.509,3.738,61,76],[531.509,0.453,64,132],[531.509,0.027,117,47],[531.755,0.045,117,52],[532,0.226,66,132],[532,0.027,117,13],[532.246,0.226,69,132],[534.853,0.295,66,47],[535.443,0.305,62,37],[535.443,3.864,66,51],[536.189,0.305,69,37],[536.867,0.305,66,37],[537.858,0.7,66,19],[537.884,0.305,66,40],[538.494,0.305,62,40],[539.24,0.305,69,40],[539.511,3.864,62,35],[539.892,0.7,66,21],[542.308,0.234,62,109],[542.562,0.936,59,109],[543.579,3.864,55,31],[543.579,0.468,62,120],[544.087,0.468,67,120],[544.596,0.234,69,120],[547.646,0.305,57,51],[547.646,4.068,66,55],[547.646,3.864,57,64],[548.392,0.305,64,51],[549.07,0.305,61,51],[549.68,0.305,62,47],[550.087,0.305,66,47],[550.697,0.305,62,47],[551.443,0.305,69,47],[554.996,0.193,74,33],[556.133,0.58,83,33],[557.042,0.773,79,33],[562.269,0.193,74,33],[563.405,0.58,83,33],[564.314,0.773,79,24],[568.86,0.58,59,16],[569.542,0.193,59,22],[569.769,0.773,59,22],[570.678,0.58,59,22],[571.36,0.193,59,22],[571.587,0.773,59,22],[572.496,0.58,59,22],[573.178,0.193,59,16],[573.405,0.773,59,16],[574.314,0.58,59,16],[574.996,0.193,59,16],[575.223,0.773,59,16],[576.133,0.58,59,16],[576.814,0.193,59,16],[577.042,0.773,59,24],[577.951,0.58,59,24],[578.633,0.193,59,24],[578.86,0.773,59,24],[579.769,0.58,59,24],[580.451,0.193,59,24],[580.678,0.773,59,24],[581.587,0.58,59,29],[582.269,0.193,59,29],[582.496,0.773,59,29],[584.087,0.193,74,48],[585.223,0.58,83,48],[586.133,0.773,79,45],[590.678,0.159,71,54],[592.437,4.385,64,24],[592.87,0.7,72,11],[592.899,0.346,76,23],[594.745,0.346,72,24],[595.61,0.035,117,9],[595.899,0.27,48,13],[595.899,0.055,50,15],[595.958,0.16,39,15],[595.958,0.14,51,9],[596.187,0.035,117,10],[596.36,0.346,76,10],[596.745,0.346,79,20],[596.764,0.219,72,11],[597.052,0.27,48,27],[597.052,0.03,83,10],[597.052,0.03,99,12],[597.052,0.055,50,31],[597.052,4.385,57,8],[597.072,0.31,42,14],[597.112,0.16,39,30],[597.112,0.14,51,18],[597.341,0.219,69,10],[598.206,0.346,69,23],[598.206,0.219,72,13],[598.206,0.27,48,40],[598.206,0.03,83,14],[598.206,0.03,99,17],[598.206,0.055,50,46],[598.226,0.31,42,20],[598.266,0.16,39,44],[598.266,0.14,51,26],[598.639,0.7,79,12],[599.36,0.27,48,44],[599.36,0.03,83,16],[599.36,0.03,99,18],[599.36,0.055,50,48],[599.38,0.31,42,22],[599.42,0.16,39,45],[599.42,0.14,51,27],[599.649,0.035,117,12],[599.822,0.346,72,13],[600.206,0.346,76,19],[600.226,0.035,117,8],[600.514,0.27,48,25],[600.514,0.03,83,9],[600.514,0.03,99,10],[600.514,0.055,50,27],[600.534,0.31,42,12],[600.574,0.16,39,24],[600.574,0.14,51,14],[601.668,0.346,65,27],[601.668,4.385,60,25],[602.101,0.277,48,14],[602.822,0.277,41,24],[603.11,0.035,117,12],[603.254,0.7,79,14],[603.283,0.346,69,28],[603.514,0.27,64,34],[603.514,0.03,83,12],[603.534,0.31,57,17],[603.687,0.277,40,27],[603.687,0.035,117,7],[603.976,0.277,41,35],[604.408,0.277,48,30],[604.552,0.07,98,17],[604.668,0.27,64,26],[604.668,0.03,83,9],[604.688,0.31,57,13],[604.822,0.346,72,23],[605.129,0.346,65,13],[605.129,0.277,41,16],[605.706,0.07,98,25],[606.283,4.385,59,29],[606.572,0.035,117,12],[606.745,0.346,71,28],[606.86,0.07,98,23],[606.976,0.27,64,31],[606.976,0.03,83,11],[606.995,0.31,57,16],[607.149,0.035,117,12],[607.437,0.219,71,12],[607.87,0.7,83,12],[608.014,0.07,98,15],[608.283,0.346,74,27],[608.302,0.219,74,15],[608.591,0.346,72,11],[609.976,0.173,62,20],[610.899,4.56,60,23],[611.779,0.36,79,27],[612.549,0.7,76,13],[612.979,0.36,79,27],[614.179,0.36,79,28],[615.379,0.36,79,28],[615.699,4.56,57,23],[616.579,0.36,76,30],[617.779,0.36,76,30],[618.399,0.228,69,18],[618.979,0.36,76,32],[618.999,0.7,74,8],[620.179,0.36,76,32],[620.499,4.56,53,9],[620.949,0.7,72,17],[624.099,0.228,69,20],[625.299,4.56,62,15],[627.399,0.7,83,10],[628.149,0.7,76,18],[629.859,0.18,67,24],[630.099,4.75,67,15],[630.599,0.375,76,24],[631.817,0.7,76,12],[631.849,0.375,76,24],[633.099,0.375,76,25],[634.349,0.375,76,25],[635.099,4.75,64,15],[635.599,0.375,72,27],[636.849,0.375,72,27],[638.099,0.375,72,28],[639.349,0.375,72,28],[640.099,4.75,60,9],[640.567,0.7,72,15],[640.599,0.375,69,30],[641.849,0.375,69,30],[643.099,0.375,69,31],[644.349,0.375,69,31],[645.099,4.75,59,13],[645.599,0.375,71,32],[646.849,0.375,71,32],[648.067,0.7,76,16],[648.099,0.375,76,30],[649.099,0.188,62,21],[651.035,0.383,79,22],[652.311,0.383,79,22],[653.13,0.7,76,11],[653.588,0.383,79,24],[654.865,0.383,79,24],[656.141,0.383,76,25],[657.418,0.383,76,25],[658.694,0.383,76,26],[659.971,0.383,76,23],[661.247,0.383,72,24],[662.067,0.7,79,12],[662.524,0.383,72,24],[663.801,0.383,72,25],[665.077,0.383,72,25],[666.354,0.383,74,26],[667.63,0.383,74,26],[668.907,0.383,79,24],[670.269,0.192,67,17],[690.35,0.196,62,16],[729.612,2.4,72,43]],[[1.1,0.27,64,34],[1.1,0.03,83,12],[1.12,0.31,57,17],[3.3,0.27,64,34],[3.3,0.03,83,12],[3.32,0.31,57,17],[5.5,0.27,64,34],[5.5,0.03,83,12],[5.52,0.31,57,17],[7.7,0.27,64,34],[7.7,0.03,83,12],[7.72,0.31,57,17],[9.9,0.27,64,34],[9.9,0.03,83,12],[9.92,0.31,57,17],[12.1,0.27,64,34],[12.1,0.03,83,12],[12.12,0.31,57,17],[14.3,0.27,64,34],[14.3,0.03,83,12],[14.32,0.31,57,17],[16.5,0.27,64,34],[16.5,0.03,83,12],[16.52,0.31,57,17],[18.7,0.27,64,34],[18.7,0.03,83,12],[18.72,0.31,57,17],[20.9,0.27,64,34],[20.9,0.03,83,12],[20.92,0.31,57,17],[23.1,0.27,64,34],[23.1,0.03,83,12],[23.12,0.31,57,17],[25.3,0.27,64,34],[25.3,0.03,83,12],[25.32,0.31,57,17],[27.5,0.27,64,34],[27.5,0.03,83,12],[27.52,0.31,57,17],[29.7,0.27,64,34],[29.7,0.03,83,12],[29.72,0.31,57,17],[31.9,0.27,64,34],[31.9,0.03,83,12],[31.92,0.31,57,17],[33.95,0.27,64,34],[33.95,0.03,83,12],[33.97,0.31,57,17],[34.425,0.427,79,169],[35.85,0.27,64,34],[35.85,0.03,83,12],[35.87,0.31,57,17],[37.75,0.27,64,34],[37.75,0.03,83,12],[37.77,0.31,57,17],[38.7,1.71,72,199],[39.65,0.27,64,34],[39.65,0.03,83,12],[39.67,0.31,57,17],[41.55,0.27,64,34],[41.55,0.03,83,12],[41.57,0.31,57,17],[43.24,0.27,64,34],[43.24,0.03,83,12],[43.26,0.31,57,17],[44.72,0.27,64,34],[44.72,0.03,83,12],[44.74,0.31,57,17],[45.09,0.333,74,199],[46.2,0.27,64,34],[46.2,0.03,83,12],[46.22,0.31,57,17],[47.68,0.27,64,34],[47.68,0.03,83,12],[47.7,0.31,57,17],[49.16,0.27,64,34],[49.16,0.03,83,12],[49.18,0.31,57,17],[50.46,0.252,76,199],[50.46,0.27,64,34],[50.46,0.03,83,12],[50.48,0.31,57,17],[51.58,0.27,64,34],[51.58,0.03,83,12],[51.6,0.31,57,17],[52.7,0.504,74,199],[52.7,0.27,64,34],[52.7,0.03,83,12],[52.72,0.31,57,17],[53.82,0.27,64,34],[53.82,0.03,83,12],[53.84,0.31,57,17],[54.94,0.27,64,34],[54.94,0.03,83,12],[54.96,0.31,57,17],[55.94,0.27,64,34],[55.94,0.03,83,12],[55.96,0.31,57,17],[56.38,0.594,76,199],[56.82,0.27,64,34],[56.82,0.03,83,12],[56.84,0.31,57,17],[57.7,0.27,64,34],[57.7,0.03,83,12],[57.72,0.31,57,17],[58.58,0.27,64,34],[58.58,0.03,83,12],[58.6,0.31,57,17],[59.46,0.27,64,34],[59.46,0.03,83,12],[59.48,0.31,57,17],[59.94,0.15,64,173],[60.34,0.27,64,34],[60.34,0.03,83,12],[60.36,0.31,57,17],[61.02,0.27,64,25],[61.02,0.03,83,9],[61.04,0.31,57,13],[61.14,0.27,64,21],[61.14,0.03,83,7],[61.16,0.31,57,11],[62.22,0.27,64,25],[62.22,0.03,83,9],[62.24,0.31,57,13],[63.42,0.27,64,25],[63.42,0.03,83,9],[63.44,0.31,57,13],[63.54,0.27,64,22],[63.54,0.03,83,8],[63.56,0.31,57,11],[64.62,0.27,64,25],[64.62,0.03,83,9],[64.64,0.31,57,13],[65.82,0.27,64,25],[65.82,0.03,83,9],[65.84,0.31,57,13],[65.94,0.27,64,24],[65.94,0.03,83,8],[65.96,0.31,57,12],[67.02,0.27,64,25],[67.02,0.03,83,9],[67.04,0.31,57,13],[68.22,0.27,64,25],[68.22,0.03,83,9],[68.24,0.31,57,13],[68.34,0.27,64,25],[68.34,0.03,83,9],[68.36,0.31,57,13],[69.42,0.27,64,25],[69.42,0.03,83,9],[69.44,0.31,57,13],[70.62,0.27,64,25],[70.62,0.03,83,9],[70.64,0.31,57,13],[70.74,0.27,64,26],[70.74,0.03,83,9],[70.76,0.31,57,13],[71.82,0.27,64,25],[71.82,0.03,83,9],[71.84,0.31,57,13],[73.02,0.27,64,25],[73.02,0.03,83,9],[73.04,0.31,57,13],[73.14,0.27,64,27],[73.14,0.03,83,10],[73.16,0.31,57,14],[74.22,0.27,64,25],[74.22,0.03,83,9],[74.24,0.31,57,13],[75.42,0.27,64,25],[75.42,0.03,83,9],[75.44,0.31,57,13],[75.54,0.27,64,29],[75.54,0.03,83,10],[75.56,0.31,57,14],[76.62,0.27,64,25],[76.62,0.03,83,9],[76.64,0.31,57,13],[77.82,0.27,64,25],[77.82,0.03,83,9],[77.84,0.31,57,13],[78.9,0.18,64,22],[79.02,0.27,64,25],[79.02,0.03,83,9],[79.04,0.31,57,13],[80.208,0.27,64,25],[80.208,0.03,83,9],[80.228,0.31,57,13],[80.326,0.27,64,24],[80.326,0.03,83,8],[80.346,0.31,57,12],[81.385,0.27,64,25],[81.385,0.03,83,9],[81.405,0.31,57,13],[82.561,0.27,64,25],[82.561,0.03,83,9],[82.581,0.31,57,13],[82.679,0.27,64,26],[82.679,0.03,83,9],[82.699,0.31,57,13],[83.149,0.224,76,17],[83.738,0.27,64,25],[83.738,0.03,83,9],[83.758,0.31,57,13],[84.914,0.27,64,25],[84.914,0.03,83,9],[84.934,0.31,57,13],[85.032,0.27,64,27],[85.032,0.03,83,10],[85.052,0.31,57,14],[86.091,0.27,64,25],[86.091,0.03,83,9],[86.111,0.31,57,13],[87.267,0.27,64,25],[87.267,0.03,83,9],[87.287,0.31,57,13],[87.385,0.27,64,29],[87.385,0.03,83,10],[87.405,0.31,57,14],[88.444,0.27,64,25],[88.444,0.03,83,9],[88.463,0.31,57,13],[88.738,0.224,76,13],[89.502,0.353,69,25],[89.62,0.27,64,25],[89.62,0.03,83,9],[89.64,0.31,57,13],[89.738,0.27,64,30],[89.738,0.03,83,11],[89.758,0.31,57,15],[90.208,0.353,65,25],[90.796,0.27,64,25],[90.796,0.03,83,9],[90.817,0.31,57,13],[91.071,0.353,72,25],[91.855,0.353,69,26],[91.973,0.27,64,25],[91.973,0.03,83,9],[91.993,0.31,57,13],[92.091,0.27,64,32],[92.091,0.03,83,11],[92.111,0.31,57,16],[92.561,0.353,65,26],[93.149,0.27,64,25],[93.149,0.03,83,9],[93.169,0.31,57,13],[93.424,0.353,72,26],[94.208,0.353,71,47],[94.326,0.27,64,25],[94.326,0.03,83,9],[94.346,0.31,57,13],[94.444,0.27,64,33],[94.444,0.03,83,11],[94.463,0.31,57,16],[94.914,0.353,67,47],[95.502,0.27,64,25],[95.502,0.03,83,9],[95.522,0.31,57,13],[95.777,0.353,74,47],[96.561,0.353,76,44],[96.679,0.27,64,25],[96.679,0.03,83,9],[96.699,0.31,57,13],[97.738,0.176,64,31],[97.855,0.27,64,25],[97.855,0.03,83,9],[97.875,0.31,57,13],[98.876,0.7,72,19],[99.02,0.07,98,19],[99.136,0.27,64,27],[99.136,0.03,83,10],[99.156,0.31,57,14],[100.174,0.07,98,19],[101.328,0.07,98,21],[101.444,0.27,64,29],[101.444,0.03,83,10],[101.463,0.31,57,14],[101.617,0.035,117,7],[101.905,0.219,76,11],[102.194,0.035,117,11],[102.482,0.07,98,21],[103.636,0.07,98,22],[103.751,0.27,64,30],[103.751,0.03,83,11],[103.771,0.31,57,15],[104.79,0.07,98,22],[105.799,0.7,74,16],[105.944,0.07,98,23],[106.059,0.27,64,32],[106.059,0.03,83,11],[106.079,0.31,57,16],[106.809,0.035,117,11],[107.097,0.07,98,23],[107.386,0.219,76,19],[107.386,0.035,117,12],[107.674,0.346,65,36],[107.963,0.219,72,20],[108.251,0.07,98,24],[108.367,0.27,64,34],[108.367,0.03,83,12],[108.387,0.31,57,17],[108.52,0.346,72,36],[109.29,0.346,69,36],[109.405,0.07,98,24],[109.982,0.346,65,38],[110.559,0.07,98,25],[110.674,0.27,64,35],[110.674,0.03,83,12],[110.694,0.31,57,18],[110.828,0.346,72,38],[111.597,0.346,69,27],[111.713,0.07,98,25],[112.001,0.035,117,13],[112.29,0.346,67,29],[112.578,0.035,117,11],[112.867,0.07,98,26],[112.982,0.27,64,37],[112.982,0.03,83,13],[113.002,0.31,57,19],[113.136,0.346,74,29],[113.444,0.219,71,16],[113.876,0.7,83,14],[113.905,0.346,71,29],[114.02,0.07,98,26],[114.597,0.346,72,27],[115.174,0.27,64,25],[115.174,0.03,83,9],[115.194,0.31,57,13],[115.444,0.346,79,27],[116.213,0.173,64,19],[116.328,0.27,64,25],[116.328,0.03,83,9],[116.348,0.31,57,13],[117.36,0.27,64,30],[117.36,0.03,83,10],[117.38,0.31,57,15],[119.178,0.27,64,30],[119.178,0.03,83,10],[119.198,0.31,57,15],[120.087,0.27,64,30],[120.087,0.03,83,10],[120.107,0.31,57,15],[121.905,0.27,64,30],[121.905,0.03,83,10],[121.925,0.31,57,15],[122.814,0.27,64,30],[122.814,0.03,83,10],[122.834,0.31,57,15],[124.632,0.27,64,30],[124.632,0.03,83,10],[124.652,0.31,57,15],[125.541,0.27,64,30],[125.541,0.03,83,10],[125.561,0.31,57,15],[127.36,0.27,64,30],[127.36,0.03,83,10],[127.38,0.31,57,15],[128.269,0.27,64,30],[128.269,0.03,83,10],[128.289,0.31,57,15],[130.087,0.27,64,30],[130.087,0.03,83,10],[130.107,0.31,57,15],[130.996,0.27,64,30],[130.996,0.03,83,10],[131.016,0.31,57,15],[132.814,0.27,64,30],[132.814,0.03,83,10],[132.834,0.31,57,15],[133.723,0.27,64,30],[133.723,0.03,83,10],[133.743,0.31,57,15],[135.542,0.27,64,30],[135.542,0.03,83,10],[135.561,0.31,57,15],[136.451,0.27,64,30],[136.451,0.03,83,10],[136.471,0.31,57,15],[138.269,0.27,64,30],[138.269,0.03,83,10],[138.289,0.31,57,15],[139.178,0.27,64,30],[139.178,0.03,83,10],[139.198,0.31,57,15],[139.632,0.191,76,10],[140.087,1.227,76,26],[140.996,0.27,64,30],[140.996,0.03,83,10],[141.016,0.31,57,15],[141.451,0.045,111,10],[141.678,0.191,74,10],[141.905,0.27,64,30],[141.905,0.03,83,10],[141.925,0.31,57,15],[142.132,0.045,111,15],[142.814,0.045,111,11],[143.723,0.27,64,30],[143.723,0.03,83,10],[143.743,0.31,57,15],[144.632,0.27,64,30],[144.632,0.03,83,10],[144.652,0.31,57,15],[145.087,0.409,76,31],[146.451,0.191,81,12],[146.451,0.27,64,30],[146.451,0.03,83,10],[146.471,0.31,57,15],[146.905,0.045,111,20],[147.36,0.27,64,30],[147.36,0.03,83,10],[147.38,0.31,57,15],[147.587,0.045,111,12],[148.269,1.227,71,31],[148.496,0.191,83,12],[149.178,0.27,64,30],[149.178,0.03,83,10],[149.198,0.31,57,15],[150.087,0.27,64,30],[150.087,0.03,83,10],[150.107,0.31,57,15],[151.678,0.045,111,11],[151.905,0.27,64,30],[151.905,0.03,83,10],[151.925,0.31,57,15],[152.36,0.045,111,21],[152.814,0.27,64,30],[152.814,0.03,83,10],[152.834,0.31,57,15],[153.269,0.409,79,33],[153.269,0.191,74,12],[154.632,0.27,64,30],[154.632,0.03,83,10],[154.652,0.31,57,15],[155.314,0.191,72,14],[155.542,0.27,64,30],[155.542,0.03,83,10],[155.561,0.31,57,15],[156.451,0.045,111,10],[157.132,0.045,111,15],[157.36,0.409,76,38],[157.36,0.27,64,30],[157.36,0.03,83,10],[157.38,0.31,57,15],[157.814,0.045,111,11],[158.269,0.27,64,30],[158.269,0.03,83,10],[158.289,0.31,57,15],[160.087,0.191,76,14],[160.087,0.27,64,30],[160.087,0.03,83,10],[160.107,0.31,57,15],[160.541,0.818,73,14],[160.996,0.27,64,30],[160.996,0.03,83,10],[161.016,0.31,57,15],[161.905,0.045,111,20],[162.132,0.191,57,17],[162.587,0.045,111,12],[162.814,0.27,64,30],[162.814,0.03,83,10],[162.834,0.31,57,15],[163.723,0.27,64,30],[163.723,0.03,83,10],[163.743,0.31,57,15],[164.632,1.227,73,17],[165.542,0.27,64,30],[165.542,0.03,83,10],[165.561,0.31,57,15],[166.451,0.27,64,30],[166.451,0.03,83,10],[166.471,0.31,57,15],[166.678,0.045,111,11],[166.905,0.191,60,20],[167.36,0.045,111,21],[168.269,0.27,64,30],[168.269,0.03,83,10],[168.289,0.31,57,15],[168.723,0.818,70,17],[168.951,0.191,69,20],[169.178,0.27,64,30],[169.178,0.03,83,10],[169.198,0.31,57,15],[170.996,0.27,64,30],[170.996,0.03,83,10],[171.016,0.31,57,15],[171.451,0.045,111,10],[171.905,0.27,64,30],[171.905,0.03,83,10],[171.925,0.31,57,15],[172.132,0.045,111,15],[172.814,1.227,73,16],[172.814,0.045,111,11],[173.723,0.191,57,18],[173.723,0.27,64,30],[173.723,0.03,83,10],[173.743,0.31,57,15],[174.632,0.27,64,30],[174.632,0.03,83,10],[174.652,0.31,57,15],[175.769,0.191,68,18],[176.451,0.27,64,30],[176.451,0.03,83,10],[176.471,0.31,57,15],[176.905,0.045,111,20],[177.36,0.27,64,30],[177.36,0.03,83,10],[177.38,0.31,57,15],[177.587,0.045,111,12],[177.814,0.409,73,16],[179.178,0.27,64,30],[179.178,0.03,83,10],[179.198,0.31,57,15],[180.087,0.27,64,30],[180.087,0.03,83,10],[180.107,0.31,57,15],[180.541,0.409,68,14],[180.541,0.191,71,15],[181.678,0.045,111,11],[181.905,0.27,64,30],[181.905,0.03,83,10],[181.925,0.31,57,15],[182.844,0.27,64,30],[182.844,0.03,83,10],[182.863,0.31,57,15],[184.779,0.27,64,30],[184.779,0.03,83,10],[184.799,0.31,57,15],[185.747,0.27,64,30],[185.747,0.03,83,10],[185.767,0.31,57,15],[187.682,0.27,64,30],[187.682,0.03,83,10],[187.702,0.31,57,15],[188.702,0.27,64,30],[188.702,0.03,83,10],[188.722,0.31,57,15],[190.845,0.27,64,30],[190.845,0.03,83,10],[190.865,0.31,57,15],[191.916,0.27,64,30],[191.916,0.03,83,10],[191.936,0.31,57,15],[192.988,1.607,60,28],[194.059,0.27,64,30],[194.059,0.03,83,10],[194.079,0.31,57,15],[195.13,0.27,64,30],[195.13,0.03,83,10],[195.15,0.31,57,15],[195.589,0.27,64,28],[195.589,0.03,83,10],[195.609,0.31,57,14],[195.984,0.158,67,11],[196.181,0.158,65,11],[196.379,0.158,76,15],[196.379,0.27,64,28],[196.379,0.03,83,10],[196.399,0.31,57,14],[196.576,0.158,77,15],[197.168,0.27,64,28],[197.168,0.03,83,10],[197.188,0.31,57,14],[197.958,0.158,60,11],[197.958,0.27,64,28],[197.958,0.03,83,10],[197.978,0.31,57,14],[198.155,0.158,62,11],[198.747,0.27,64,28],[198.747,0.03,83,10],[198.767,0.31,57,14],[199.537,0.158,63,11],[199.537,0.27,64,28],[199.537,0.03,83,10],[199.557,0.31,57,14],[199.734,0.158,62,11],[199.931,0.158,76,15],[200.129,0.158,74,15],[200.326,0.27,64,28],[200.326,0.03,83,10],[200.346,0.31,57,14],[201.116,0.27,64,28],[201.116,0.03,83,10],[201.136,0.31,57,14],[201.51,0.158,63,20],[201.51,0.158,65,27],[201.708,0.158,65,20],[201.708,0.158,67,27],[201.905,0.27,64,28],[201.905,0.03,83,10],[201.925,0.31,57,14],[202.695,0.27,64,28],[202.695,0.03,83,10],[202.715,0.31,57,14],[203.089,0.158,60,20],[203.287,0.158,58,20],[203.484,0.158,72,27],[203.484,0.27,64,28],[203.484,0.03,83,10],[203.504,0.31,57,14],[203.681,0.158,70,27],[204.274,0.27,64,28],[204.274,0.03,83,10],[204.293,0.31,57,14],[205.025,0.143,69,27],[205.025,0.27,64,28],[205.025,0.03,83,10],[205.045,0.31,57,14],[205.204,0.143,70,27],[205.74,0.27,64,28],[205.74,0.03,83,10],[205.76,0.31,57,14],[206.454,0.143,56,20],[206.454,0.27,64,28],[206.454,0.03,83,10],[206.474,0.31,57,14],[206.633,0.143,55,20],[206.811,0.143,69,27],[206.99,0.143,67,27],[207.168,0.27,64,28],[207.168,0.03,83,10],[207.188,0.31,57,14],[207.883,0.27,64,28],[207.883,0.03,83,10],[207.903,0.31,57,14],[208.24,0.143,72,23],[208.418,0.143,74,23],[208.597,0.27,64,28],[208.597,0.03,83,10],[208.617,0.31,57,14],[209.311,0.27,64,28],[209.311,0.03,83,10],[209.331,0.31,57,14],[209.668,0.143,56,17],[209.847,0.143,58,17],[210.025,0.27,64,28],[210.025,0.03,83,10],[210.045,0.31,57,14],[210.74,0.27,64,28],[210.74,0.03,83,10],[210.76,0.31,57,14],[211.097,0.143,67,17],[211.275,0.143,65,17],[211.454,0.143,76,23],[211.454,0.27,64,28],[211.454,0.03,83,10],[211.474,0.31,57,14],[211.633,0.143,77,23],[212.168,0.27,64,28],[212.168,0.03,83,10],[212.188,0.31,57,14],[212.883,0.143,60,17],[212.883,0.27,64,28],[212.883,0.03,83,10],[212.903,0.31,57,14],[213.061,0.143,62,25],[213.566,0.27,64,28],[213.566,0.03,83,10],[213.586,0.31,57,14],[214.218,0.13,63,25],[214.218,0.27,64,28],[214.218,0.03,83,10],[214.238,0.31,57,14],[214.381,0.13,62,25],[214.544,0.13,76,34],[214.707,0.13,74,34],[214.87,0.27,64,28],[214.87,0.03,83,10],[214.89,0.31,57,14],[215.522,0.27,64,28],[215.522,0.03,83,10],[215.542,0.31,57,14],[215.848,0.13,63,25],[215.848,0.13,65,34],[216.012,0.13,65,25],[216.012,0.13,67,34],[216.174,0.27,64,28],[216.174,0.03,83,10],[216.195,0.31,57,14],[216.827,0.27,64,28],[216.827,0.03,83,10],[216.847,0.31,57,14],[217.153,0.13,60,25],[217.316,0.13,58,25],[217.479,0.13,72,34],[217.479,0.27,64,28],[217.479,0.03,83,10],[217.499,0.31,57,14],[217.642,0.13,70,34],[218.131,0.27,64,28],[218.131,0.03,83,10],[218.151,0.31,57,14],[218.764,0.114,67,53],[218.783,0.27,64,28],[218.783,0.03,83,10],[218.803,0.31,57,14],[219.359,0.114,72,53],[219.435,0.27,64,28],[219.435,0.03,83,10],[219.455,0.31,57,14],[220.022,0.391,80,59],[220.088,0.27,64,28],[220.088,0.03,83,10],[220.107,0.31,57,14],[220.438,0.5,102,108],[220.74,0.27,64,28],[220.74,0.03,83,10],[220.76,0.31,57,14],[221.392,0.27,64,28],[221.392,0.03,83,10],[221.412,0.31,57,14],[222.044,0.27,64,28],[222.044,0.03,83,10],[222.064,0.31,57,14],[222.971,0.143,69,47],[222.971,0.27,64,28],[222.971,0.03,83,10],[222.991,0.31,57,14],[223.149,0.143,70,47],[223.685,0.27,64,28],[223.685,0.03,83,10],[223.705,0.31,57,14],[224.399,0.143,56,35],[224.399,0.27,64,28],[224.399,0.03,83,10],[224.419,0.31,57,14],[224.578,0.143,55,35],[224.756,0.143,69,47],[224.935,0.143,67,47],[225.114,0.27,64,28],[225.114,0.03,83,10],[225.134,0.31,57,14],[225.828,0.27,64,28],[225.828,0.03,83,10],[225.848,0.31,57,14],[226.185,0.143,72,57],[226.364,0.143,74,57],[226.542,0.27,64,28],[226.542,0.03,83,10],[226.562,0.31,57,14],[227.257,0.27,64,28],[227.257,0.03,83,10],[227.277,0.31,57,14],[227.614,0.143,56,43],[227.792,0.143,58,43],[227.971,0.27,64,28],[227.971,0.03,83,10],[227.991,0.31,57,14],[228.654,0.27,64,28],[228.654,0.03,83,10],[228.674,0.31,57,14],[228.98,0.13,67,43],[229.143,0.13,65,43],[229.306,0.13,76,57],[229.306,0.27,64,28],[229.306,0.03,83,10],[229.326,0.31,57,14],[229.469,0.13,77,57],[229.958,0.27,64,28],[229.958,0.03,83,10],[229.978,0.31,57,14],[230.611,0.13,60,43],[230.611,0.27,64,28],[230.611,0.03,83,10],[230.631,0.31,57,14],[230.774,0.13,62,50],[231.263,0.27,64,28],[231.263,0.03,83,10],[231.283,0.31,57,14],[231.915,0.13,63,50],[231.915,0.27,64,28],[231.915,0.03,83,10],[231.935,0.31,57,14],[232.078,0.13,62,50],[232.241,0.13,76,67],[232.404,0.13,74,67],[232.567,0.27,64,28],[232.567,0.03,83,10],[232.587,0.31,57,14],[233.219,0.27,64,28],[233.219,0.03,83,10],[233.239,0.31,57,14],[233.545,0.13,63,50],[233.545,0.12,65,67],[233.695,0.12,67,67],[233.708,0.13,65,50],[233.845,0.27,64,28],[233.845,0.03,83,10],[233.865,0.31,57,14],[234.445,0.27,64,28],[234.445,0.03,83,10],[234.465,0.31,57,14],[234.745,0.12,60,50],[234.895,0.12,58,50],[235.045,0.12,72,67],[235.045,0.27,64,28],[235.045,0.03,83,10],[235.065,0.31,57,14],[235.195,0.12,70,67],[235.645,0.27,64,28],[235.645,0.03,83,10],[235.665,0.31,57,14],[236.245,0.12,69,42],[236.245,0.27,64,28],[236.245,0.03,83,10],[236.265,0.31,57,14],[236.395,0.12,70,42],[236.845,0.27,64,28],[236.845,0.03,83,10],[236.865,0.31,57,14],[237.445,0.12,56,31],[237.445,0.27,64,28],[237.445,0.03,83,10],[237.465,0.31,57,14],[237.595,0.12,55,31],[237.745,0.12,69,42],[237.895,0.12,67,42],[238.045,0.27,64,28],[238.045,0.03,83,10],[238.065,0.31,57,14],[238.627,0.105,67,47],[238.645,0.27,64,28],[238.645,0.03,83,10],[238.665,0.31,57,14],[239.175,0.105,72,47],[239.245,0.27,64,28],[239.245,0.03,83,10],[239.265,0.31,57,14],[239.785,0.36,80,52],[239.845,0.27,64,28],[239.845,0.03,83,10],[239.865,0.31,57,14],[240.169,0.5,102,108],[240.445,0.27,64,28],[240.445,0.03,83,10],[240.465,0.31,57,14],[241.045,0.27,64,28],[241.045,0.03,83,10],[241.065,0.31,57,14],[241.645,0.27,64,28],[241.645,0.03,83,10],[241.665,0.31,57,14],[242.245,0.27,64,28],[242.245,0.03,83,10],[242.265,0.31,57,14],[242.845,0.27,64,28],[242.845,0.03,83,10],[242.865,0.31,57,14],[248.86,0.04,99,43],[249.574,0.16,48,49],[249.574,0.03,99,22],[251.002,0.16,48,49],[251.002,0.03,99,22],[263.145,0.04,99,43],[263.86,0.16,43,49],[263.86,0.03,99,22],[265.288,0.16,43,49],[265.288,0.03,99,22],[266.717,0.25,63,31],[268.502,0.25,73,38],[277.431,1.429,67,42],[278.145,0.27,64,22],[278.145,0.03,83,8],[278.165,0.31,57,11],[279.574,0.27,64,22],[279.574,0.03,83,8],[279.594,0.31,57,11],[281.002,0.27,64,22],[281.002,0.03,83,8],[281.022,0.31,57,11],[282.431,0.27,64,22],[282.431,0.03,83,8],[282.451,0.31,57,11],[283.86,0.27,64,22],[283.86,0.03,83,8],[283.88,0.31,57,11],[285.288,0.27,64,22],[285.288,0.03,83,8],[285.308,0.31,57,11],[286.717,0.27,64,22],[286.717,0.03,83,8],[286.737,0.31,57,11],[288.145,0.27,64,22],[288.145,0.03,83,8],[288.165,0.31,57,11],[289.574,0.27,64,22],[289.574,0.03,83,8],[289.594,0.31,57,11],[291.002,0.27,64,22],[291.002,0.03,83,8],[291.022,0.31,57,11],[291.717,0.04,99,43],[292.074,0.16,43,49],[292.074,0.03,99,22],[292.431,0.27,64,22],[292.431,0.03,83,8],[292.451,0.31,57,11],[292.788,0.16,43,49],[292.788,0.03,99,22],[293.502,0.16,43,49],[293.502,0.03,99,22],[293.86,0.27,64,22],[293.86,0.03,83,8],[293.88,0.31,57,11],[294.217,0.16,43,49],[294.217,0.03,99,22],[295.288,0.27,64,22],[295.288,0.03,83,8],[295.308,0.31,57,11],[296.717,0.27,64,22],[296.717,0.03,83,8],[296.737,0.31,57,11],[298.145,0.27,64,22],[298.145,0.03,83,8],[298.165,0.31,57,11],[299.574,0.27,64,22],[299.574,0.03,83,8],[299.594,0.31,57,11],[301.002,0.27,64,22],[301.002,0.03,83,8],[301.022,0.31,57,11],[301.488,6.333,69,17],[302.044,0.444,60,35],[302.599,0.065,99,17],[302.877,0.065,99,17],[303.433,0.444,57,35],[304.266,0.065,99,17],[304.544,0.065,99,17],[304.822,0.444,58,35],[305.933,0.065,99,17],[306.21,0.444,77,35],[306.21,0.065,99,17],[307.599,0.444,76,35],[307.599,0.065,99,17],[307.877,0.065,99,17],[308.155,6.333,69,15],[308.988,0.444,65,35],[309.266,0.065,99,17],[309.544,0.065,99,17],[310.377,0.444,57,35],[310.933,0.065,99,16],[311.21,0.065,99,16],[311.766,0.444,62,35],[312.599,0.065,99,16],[312.877,0.444,77,11],[312.877,0.065,99,16],[313.155,0.444,60,47],[314.266,0.444,76,15],[314.266,0.065,99,16],[314.544,0.444,79,45],[314.544,0.065,99,16],[314.822,6.333,65,11],[315.655,0.444,65,19],[315.933,0.444,69,44],[315.933,0.065,99,15],[316.21,0.065,99,15],[317.044,0.444,60,24],[317.322,0.444,65,41],[317.599,0.065,99,14],[317.877,0.065,99,14],[318.433,0.444,62,30],[318.71,0.444,65,37],[319.266,0.065,99,12],[319.544,0.065,99,12],[319.822,0.444,60,35],[320.099,0.444,64,32],[320.933,0.065,99,10],[321.21,0.444,79,40],[321.21,0.065,99,9],[321.488,0.444,53,25],[321.488,6.333,65,13],[322.599,0.444,69,27],[322.877,0.444,72,11],[323.988,0.444,62,29],[325.377,0.444,65,29],[326.488,0.055,50,9],[326.548,0.16,39,9],[326.766,0.444,64,29],[327.322,0.055,50,16],[327.382,0.16,39,15],[327.382,0.14,51,9],[327.877,0.444,79,11],[328.155,0.444,53,27],[328.155,0.03,99,9],[328.155,0.055,50,23],[328.155,6.333,72,10],[328.215,0.16,39,22],[328.215,0.14,51,13],[328.433,0.065,99,8],[328.71,0.065,99,9],[328.988,0.03,99,11],[328.988,0.055,50,30],[329.048,0.16,39,28],[329.048,0.14,51,17],[329.266,0.444,69,18],[329.544,0.444,72,23],[329.822,0.75,81,16],[329.822,0.03,99,13],[329.822,0.055,50,36],[329.882,0.16,39,34],[329.882,0.14,51,20],[330.099,0.065,99,12],[330.377,0.065,99,12],[330.655,0.444,65,23],[330.655,0.03,99,15],[330.655,0.055,50,41],[330.715,0.16,39,39],[330.715,0.14,51,23],[330.933,0.444,69,17],[331.488,0.75,76,12],[331.488,0.03,99,17],[331.488,0.055,50,46],[331.548,0.16,39,43],[331.548,0.14,51,26],[331.766,0.065,99,15],[332.044,0.444,65,27],[332.044,0.065,99,15],[332.322,0.444,70,10],[332.322,0.03,99,19],[332.322,0.055,50,49],[332.382,0.16,39,47],[332.382,0.14,51,28],[333.155,0.5,79,21],[333.155,0.03,99,19],[333.155,0.055,50,52],[333.215,0.16,39,49],[333.215,0.14,51,29],[333.433,0.444,64,26],[333.433,0.065,99,16],[333.71,0.065,99,17],[333.988,0.03,99,20],[333.988,0.055,50,53],[334.048,0.16,39,50],[334.048,0.14,51,30],[334.822,0.444,53,26],[334.822,0.03,99,20],[334.822,0.055,50,53],[334.822,6.333,69,11],[334.882,0.16,39,49],[334.882,0.14,51,30],[335.099,0.065,99,16],[335.377,0.065,99,16],[335.655,0.03,99,19],[335.655,0.055,50,51],[335.715,0.16,39,47],[335.715,0.14,51,28],[335.933,0.444,69,9],[336.21,0.444,72,24],[336.488,0.03,99,18],[336.488,0.055,50,48],[336.548,0.16,39,44],[336.548,0.14,51,27],[336.766,0.065,99,15],[337.044,0.065,99,14],[337.322,0.444,62,15],[337.322,0.5,77,18],[337.322,0.03,99,16],[337.322,0.055,50,43],[337.382,0.16,39,40],[337.382,0.14,51,24],[337.599,0.444,65,21],[338.155,0.75,74,15],[338.155,0.03,99,14],[338.155,0.055,50,37],[338.215,0.16,39,35],[338.215,0.14,51,21],[338.433,0.065,99,11],[338.71,0.444,65,21],[338.71,0.065,99,10],[338.988,0.444,70,15],[338.988,0.03,99,11],[338.988,0.055,50,31],[339.048,0.16,39,28],[339.048,0.14,51,17],[339.822,0.03,99,9],[339.822,0.055,50,23],[339.882,0.16,39,21],[339.882,0.14,51,13],[340.099,0.444,64,24],[340.377,0.444,67,9],[340.377,0.5,79,7],[340.655,0.055,50,15],[340.715,0.16,39,13],[340.715,0.14,51,8],[341.488,0.444,53,26],[341.488,1.5,77,22],[342.877,0.444,72,26],[344.266,0.444,69,17],[345.377,0.444,65,11],[345.655,0.444,70,14],[345.655,0.75,65,10],[346.766,0.444,64,14],[347.044,0.444,67,11],[347.044,0.5,69,11],[348.155,0.444,53,17],[348.155,6.333,65,20],[349.544,0.444,72,18],[350.933,0.444,65,19],[351.21,0.25,64,13],[352.322,0.444,70,18],[353.71,0.444,67,17],[354.266,0.5,64,10],[354.266,0.065,99,8],[354.544,0.065,99,8],[354.822,0.444,53,8],[354.822,6.333,72,15],[355.099,0.444,57,13],[355.933,0.065,99,11],[356.21,0.444,72,10],[356.21,0.065,99,11],[356.488,0.444,53,11],[357.599,0.444,69,12],[357.599,0.065,99,13],[357.877,0.444,72,10],[357.877,0.065,99,13],[358.988,0.444,70,13],[359.266,0.444,74,8],[359.266,0.065,99,14],[359.544,0.065,99,15],[360.377,0.444,67,14],[360.933,0.065,99,15],[361.21,0.065,99,15],[361.766,0.444,57,15],[362.599,0.065,99,16],[362.877,0.065,99,16],[363.155,0.444,50,13],[364.266,0.065,99,16],[364.544,0.444,69,27],[364.544,0.065,99,16],[365.933,0.444,74,23],[365.933,0.065,99,17],[366.21,0.065,99,17],[367.322,0.444,72,19],[367.599,0.065,99,17],[367.877,0.065,99,17],[368.71,0.444,60,16],[369.266,0.065,99,17],[369.544,0.065,99,17],[370.099,0.444,57,12],[370.933,0.065,99,17],[371.21,0.065,99,17],[371.488,0.444,58,8],[372.599,0.065,99,17],[372.877,0.444,77,8],[372.877,0.065,99,17],[374.266,0.065,99,17],[374.544,0.065,99,17],[376.357,0.27,64,25],[376.357,0.03,83,9],[376.377,0.31,57,13],[376.464,0.27,64,27],[376.464,0.03,83,10],[376.484,0.31,57,14],[376.893,0.321,60,25],[377.429,0.27,64,25],[377.429,0.03,83,9],[377.449,0.31,57,13],[378.5,0.27,64,25],[378.5,0.03,83,9],[378.52,0.31,57,13],[378.607,0.27,64,29],[378.607,0.03,83,10],[378.627,0.31,57,14],[378.75,0.321,67,27],[379.036,0.204,64,15],[379.572,0.27,64,25],[379.572,0.03,83,9],[379.591,0.31,57,13],[380.107,4.071,57,9],[380.509,0.7,64,13],[380.536,0.321,60,28],[380.643,0.27,64,25],[380.643,0.03,83,9],[380.663,0.31,57,13],[380.75,0.27,64,30],[380.75,0.03,83,11],[380.77,0.31,57,15],[381.714,0.27,64,25],[381.714,0.03,83,9],[381.734,0.31,57,13],[382.25,0.321,57,30],[382.786,0.27,64,25],[382.786,0.03,83,9],[382.806,0.31,57,13],[382.893,0.27,64,32],[382.893,0.03,83,11],[382.913,0.31,57,16],[383.857,0.27,64,25],[383.857,0.03,83,9],[383.877,0.31,57,13],[384.107,0.321,64,30],[384.125,0.204,64,17],[384.393,4.071,53,21],[384.929,0.27,64,25],[384.929,0.03,83,9],[384.949,0.31,57,13],[385.036,0.27,64,34],[385.036,0.03,83,12],[385.056,0.31,57,17],[385.893,0.321,57,48],[386,0.27,64,25],[386,0.03,83,9],[386.02,0.31,57,13],[386.268,0.7,67,15],[386.938,0.7,65,28],[387.072,0.27,64,25],[387.072,0.03,83,9],[387.091,0.31,57,13],[387.179,0.27,64,35],[387.179,0.03,83,12],[387.199,0.31,57,18],[387.607,0.321,53,51],[388.143,0.27,64,25],[388.143,0.03,83,9],[388.163,0.31,57,13],[388.679,4.071,55,19],[389.214,0.27,64,25],[389.214,0.03,83,9],[389.234,0.31,57,13],[389.322,0.27,64,37],[389.322,0.03,83,13],[389.341,0.31,57,19],[389.464,0.321,62,53],[390.286,0.27,64,25],[390.286,0.03,83,9],[390.306,0.31,57,13],[391.25,0.321,64,49],[391.357,0.27,64,25],[391.357,0.03,83,9],[391.377,0.31,57,13],[392.322,0.161,64,34],[392.429,0.27,64,25],[392.429,0.03,83,9],[392.449,0.31,57,13],[392.964,3.931,60,20],[393.482,0.07,98,21],[393.585,0.27,64,29],[393.585,0.03,83,10],[393.605,0.31,57,14],[393.74,0.7,72,35],[393.999,0.31,72,41],[394.387,0.7,76,67],[394.516,0.07,98,21],[395.551,0.07,98,22],[395.654,0.27,64,30],[395.654,0.03,83,11],[395.674,0.31,57,15],[395.792,0.31,79,55],[396.068,0.197,76,31],[396.585,0.07,98,22],[396.844,0.035,117,10],[397.102,3.931,64,35],[397.361,0.035,117,12],[397.516,0.31,72,58],[397.62,0.07,98,23],[397.723,0.27,64,32],[397.723,0.03,83,11],[397.743,0.31,57,16],[398.654,0.07,98,23],[399.171,0.31,69,61],[399.688,0.07,98,24],[399.792,0.27,64,34],[399.792,0.03,83,12],[399.812,0.31,57,17],[399.947,0.7,74,17],[400.723,0.07,98,24],[400.964,0.31,76,61],[400.982,0.197,76,34],[401.24,3.931,60,26],[401.499,0.197,72,36],[401.628,0.7,72,36],[401.757,0.07,98,25],[401.861,0.27,64,36],[401.861,0.03,83,13],[401.881,0.31,57,18],[402.016,0.035,117,14],[402.533,0.035,117,12],[402.688,0.31,69,64],[402.792,0.07,98,25],[403.827,0.07,98,27],[403.93,0.27,64,37],[403.93,0.03,83,13],[403.95,0.31,57,19],[404.344,0.31,65,68],[404.861,0.07,98,27],[405.378,3.931,62,30],[405.895,0.07,98,28],[405.999,0.27,64,39],[405.999,0.03,83,14],[406.019,0.31,57,19],[406.137,0.31,74,72],[406.413,0.197,71,40],[406.671,0.035,117,11],[406.93,0.07,98,28],[407.188,0.7,83,17],[407.188,0.035,117,15],[407.835,0.7,76,32],[407.861,0.31,76,66],[407.964,0.27,64,25],[407.964,0.03,83,9],[407.984,0.31,57,13],[408.895,0.155,64,46],[408.999,0.27,64,25],[408.999,0.03,83,9],[409.019,0.31,57,13],[409.516,3.8,67,14],[410.016,0.07,98,22],[410.116,0.27,64,30],[410.116,0.03,83,11],[410.136,0.31,57,15],[410.516,0.3,84,48],[411.016,0.07,98,22],[411.696,0.4,100,8],[411.766,0.035,117,10],[412.016,0.07,98,23],[412.116,0.27,64,32],[412.116,0.03,83,11],[412.136,0.31,57,16],[412.249,0.3,91,61],[412.266,0.035,117,12],[412.516,0.19,88,34],[412.766,0.035,117,7],[413.016,0.07,98,23],[413.516,3.8,60,12],[413.516,3.8,64,19],[413.916,0.3,84,64],[414.016,0.07,98,24],[414.116,0.27,64,34],[414.116,0.03,83,12],[414.136,0.31,57,17],[414.266,0.7,88,36],[414.891,0.7,91,68],[415.016,0.07,98,24],[415.516,0.3,81,67],[415.696,0.4,96,8],[416.016,0.07,98,25],[416.116,0.27,64,36],[416.116,0.03,83,13],[416.136,0.31,57,18],[416.766,0.035,117,11],[416.891,0.27,64,31],[416.891,0.03,83,11],[416.911,0.31,57,15],[417.016,0.07,98,25],[417.249,0.3,88,67],[417.266,0.19,88,38],[417.266,0.035,117,14],[417.516,3.8,57,44],[417.766,0.19,84,40],[417.766,0.035,117,8],[418.016,0.07,98,27],[418.116,0.27,64,38],[418.116,0.03,83,13],[418.136,0.31,57,19],[418.916,0.3,81,71],[419.016,0.07,98,27],[420.016,0.07,98,28],[420.116,0.27,64,39],[420.116,0.03,83,14],[420.136,0.31,57,20],[420.266,0.7,89,36],[420.516,0.3,77,84],[421.016,0.07,98,28],[421.516,3.8,59,63],[421.766,0.035,117,13],[421.891,0.7,86,75],[422.016,0.07,98,29],[422.116,0.27,64,41],[422.116,0.03,83,14],[422.136,0.31,57,21],[422.249,0.3,86,88],[422.266,0.035,117,16],[422.516,0.19,83,49],[422.766,0.035,117,9],[423.016,0.07,98,29],[423.916,0.3,88,81],[424.016,0.27,64,25],[424.016,0.03,83,9],[424.036,0.31,57,13],[424.916,0.15,76,57],[425.016,0.27,64,25],[425.016,0.03,83,9],[425.036,0.31,57,13],[425.516,3.677,64,48],[426,0.07,98,22],[426.097,0.27,64,30],[426.097,0.03,83,11],[426.117,0.31,57,15],[426.242,0.045,117,9],[426.484,0.29,96,52],[426.484,0.027,117,20],[426.726,0.045,117,51],[426.968,0.07,98,22],[426.968,0.027,117,39],[427.21,0.045,117,65],[427.452,0.027,117,39],[427.693,0.045,117,46],[427.815,0.7,100,47],[427.935,0.07,98,23],[427.935,0.027,117,15],[428.032,0.27,64,32],[428.032,0.03,83,11],[428.052,0.31,57,16],[428.161,0.29,103,55],[428.419,0.184,96,31],[428.903,0.07,98,23],[429.387,3.677,60,34],[429.774,0.29,96,58],[429.871,0.07,98,24],[429.968,0.27,64,34],[429.968,0.03,83,12],[429.988,0.31,57,17],[430.839,0.07,98,24],[431.323,0.29,93,61],[431.323,0.027,117,12],[431.565,0.045,117,46],[431.806,0.07,98,25],[431.806,0.027,117,41],[431.903,0.27,64,36],[431.903,0.03,83,13],[431.923,0.31,57,18],[432.048,0.045,117,75],[432.29,0.027,117,47],[432.532,0.045,117,64],[432.653,0.27,64,31],[432.653,0.03,83,11],[432.673,0.31,57,15],[432.774,0.07,98,25],[432.774,0.027,117,27],[433,0.29,100,61],[433.016,0.184,96,34],[433.016,0.045,117,17],[433.258,3.677,53,8],[433.258,3.677,57,17],[433.5,0.184,96,36],[433.742,0.07,98,27],[433.839,0.27,64,38],[433.839,0.03,83,13],[433.859,0.31,57,19],[434.589,0.7,103,48],[434.613,0.29,93,55],[434.71,0.07,98,27],[435.368,0.4,105,7],[435.677,0.07,98,28],[435.774,0.27,64,39],[435.774,0.03,83,14],[435.794,0.31,57,20],[436.161,0.29,89,58],[436.403,0.045,117,32],[436.645,0.07,98,28],[436.645,0.027,117,37],[436.887,0.045,117,77],[437.129,3.677,55,34],[437.129,0.027,117,56],[437.371,0.045,117,83],[437.613,0.07,98,29],[437.613,0.027,117,42],[437.71,0.27,64,41],[437.71,0.03,83,14],[437.73,0.31,57,21],[437.839,0.29,98,60],[437.855,0.045,117,40],[438.097,0.184,95,34],[438.581,0.07,98,29],[439.239,0.4,106,7],[439.452,0.29,100,56],[439.548,0.218,66,79],[439.548,0.27,64,25],[439.548,0.03,83,9],[439.568,0.31,57,13],[440.516,0.27,64,25],[440.516,0.03,83,9],[440.536,0.31,57,13],[441,3.8,62,9],[441.375,0.7,62,14],[441.4,0.3,66,28],[441.5,0.11,98,79],[441.5,0.095,54,89],[442,0.3,62,29],[442.375,0.7,66,15],[442.5,0.11,98,82],[442.5,0.095,54,92],[443.5,0.11,98,87],[443.5,0.095,54,98],[444.5,0.11,98,87],[444.5,0.095,54,98],[445,3.8,59,20],[445,0.46,66,75],[445.5,0.11,98,92],[445.5,0.095,54,103],[445.5,0.23,69,75],[445.75,0.23,71,75],[446,0.46,69,75],[446.5,0.11,98,92],[446.5,0.095,54,103],[446.5,0.46,66,75],[447,0.69,64,75],[447.5,0.11,98,97],[447.5,0.095,54,109],[448.5,0.11,98,97],[448.5,0.095,54,109],[449,3.8,55,18],[449.5,0.11,98,102],[449.5,0.095,54,114],[450.4,0.3,59,36],[450.5,0.11,98,102],[450.5,0.095,54,114],[450.75,0.7,69,10],[451,0.3,55,38],[451.5,0.11,98,107],[451.5,0.095,54,120],[451.733,0.3,62,38],[451.75,0.7,67,10],[452.5,0.11,98,107],[452.5,0.095,54,120],[452.733,0.3,62,38],[453,3.8,57,10],[453.375,0.7,64,20],[453.4,0.3,61,40],[453.5,0.11,98,112],[453.5,0.095,54,125],[454,0.3,57,40],[454.375,0.7,73,20],[454.5,0.11,98,112],[454.5,0.095,54,125],[454.733,0.3,64,40],[455.5,0.11,98,103],[455.5,0.095,54,116],[456.5,0.11,98,103],[456.5,0.095,54,116],[457,3.8,69,12],[457.5,0.11,98,86],[457.5,0.095,54,97],[457.5,0.23,66,70],[457.75,0.23,69,70],[458,0.69,66,70],[458.5,0.11,98,86],[458.5,0.095,54,97],[458.75,0.23,64,70],[459,0.46,66,70],[459.5,0.11,98,92],[459.5,0.095,54,103],[459.5,0.46,64,70],[460.5,0.11,98,92],[460.5,0.095,54,103],[461,3.8,66,20],[461.5,0.11,98,97],[461.5,0.095,54,109],[462.4,0.3,62,34],[462.5,0.11,98,97],[462.5,0.095,54,109],[463,0.3,59,36],[463.5,0.11,98,102],[463.5,0.095,54,115],[463.733,0.3,66,36],[463.75,0.7,64,9],[464,0.138,50,26],[464.25,0.552,47,26],[464.4,0.3,62,36],[464.5,0.11,98,102],[464.5,0.095,54,115],[465,3.8,62,24],[465.375,0.7,62,19],[465.4,0.3,59,38],[465.5,0.11,98,107],[465.5,0.095,54,121],[466,0.3,55,38],[466.375,0.7,69,19],[466.5,0.11,98,107],[466.5,0.095,54,121],[466.733,0.3,62,38],[467.375,0.7,67,19],[467.5,0.11,98,112],[467.5,0.095,54,126],[468.5,0.11,98,112],[468.5,0.095,54,126],[469,3.8,64,21],[469.5,0.11,98,118],[469.5,0.095,54,132],[469.75,0.23,69,146],[470,0.69,73,146],[470.5,0.11,98,118],[470.5,0.095,54,132],[470.75,0.23,69,146],[471,0.46,66,146],[471.5,0.11,98,109],[471.5,0.095,54,122],[471.5,0.46,64,146],[472,0.92,62,146],[472.5,0.11,98,109],[472.5,0.095,54,122],[473,3.738,69,7],[473,0.027,117,10],[473.492,0.11,98,86],[473.492,0.095,54,97],[474.475,0.11,98,86],[474.475,0.095,54,97],[474.967,0.295,62,46],[475.459,0.11,98,92],[475.459,0.095,54,103],[475.688,0.295,69,46],[475.705,0.7,66,11],[476.344,0.295,66,46],[476.443,0.11,98,92],[476.443,0.095,54,103],[476.443,0.027,117,19],[476.688,0.045,117,51],[476.934,0.295,59,48],[476.934,3.738,62,13],[476.934,0.027,117,43],[477.18,0.045,117,73],[477.328,0.295,62,48],[477.426,0.11,98,97],[477.426,0.095,54,109],[477.426,0.027,117,42],[477.672,0.7,66,13],[477.672,0.045,117,50],[477.918,0.295,59,48],[477.918,0.027,117,17],[478.287,0.7,69,24],[478.41,0.11,98,97],[478.41,0.095,54,109],[478.639,0.295,66,48],[479.147,0.407,52,37],[479.271,0.7,64,24],[479.295,0.295,62,51],[479.393,0.11,98,102],[479.393,0.095,54,115],[479.885,0.136,50,37],[480.131,0.543,47,37],[480.377,0.11,98,102],[480.377,0.095,54,115],[480.869,3.738,59,22],[481.361,0.11,98,107],[481.361,0.095,54,121],[481.361,0.027,117,16],[481.606,0.045,117,52],[481.852,0.027,117,45],[482.098,0.045,117,80],[482.344,0.11,98,107],[482.344,0.095,54,121],[482.344,0.453,69,133],[482.344,0.027,117,49],[482.59,0.045,117,62],[482.836,0.453,67,133],[482.836,0.027,117,26],[483.082,0.045,117,10],[483.328,0.11,98,112],[483.328,0.095,54,126],[483.328,0.226,66,133],[483.574,0.226,64,133],[483.82,0.905,62,133],[484.312,0.11,98,112],[484.312,0.095,54,126],[484.803,3.738,61,26],[485.295,0.11,98,118],[485.295,0.095,54,132],[486.279,0.11,98,118],[486.279,0.095,54,132],[486.279,0.027,117,11],[486.525,0.045,117,48],[486.771,0.027,117,42],[487.016,0.045,117,80],[487.262,0.11,98,109],[487.262,0.095,54,122],[487.262,0.027,117,51],[487.492,0.295,69,54],[487.508,0.045,117,69],[487.754,0.027,117,30],[488,0.045,117,20],[488.147,0.295,66,54],[488.246,0.11,98,109],[488.246,0.095,54,122],[488.738,0.29,62,45],[488.738,3.677,66,17],[489.222,0.11,98,91],[489.222,0.095,54,102],[489.447,0.29,69,45],[489.464,0.7,62,12],[490.189,0.11,98,91],[490.189,0.095,54,102],[490.415,0.29,69,45],[490.431,0.7,66,12],[491.036,0.7,78,22],[491.06,0.29,66,47],[491.157,0.11,98,93],[491.157,0.095,54,104],[491.157,0.027,117,12],[491.399,0.045,117,48],[491.641,0.29,62,43],[491.641,0.027,117,43],[491.883,0.045,117,71],[492.125,0.11,98,73],[492.125,0.095,54,83],[492.125,0.027,117,36],[492.367,0.045,117,27],[492.609,3.677,59,20],[492.609,0.445,66,108],[493.092,0.11,98,16],[493.092,0.095,54,18],[493.092,0.223,69,125],[493.334,0.223,71,126],[493.576,0.03,99,24],[493.576,0.055,50,64],[493.576,0.445,69,120],[493.636,0.16,39,71],[493.636,0.14,51,43],[494.06,0.445,66,81],[494.544,0.03,99,80],[494.544,0.055,50,214],[494.544,0.027,117,27],[494.604,0.16,39,201],[494.604,0.14,51,120],[494.786,0.045,117,77],[494.931,0.29,62,27],[495.028,0.027,117,45],[495.254,0.29,66,27],[495.27,0.7,76,9],[495.27,0.045,117,25],[495.512,0.29,59,40],[495.512,0.055,50,16],[496.222,0.29,66,11],[496.238,0.203,47,69],[496.48,0.203,43,51],[496.48,3.677,59,69],[496.48,0.445,62,36],[496.722,0.045,117,9],[496.964,0.11,98,110],[496.964,0.095,54,123],[496.964,0.445,67,154],[496.964,0.027,117,46],[497.205,0.045,117,77],[497.447,0.027,117,9],[497.834,0.29,59,40],[498.157,0.29,62,40],[498.415,0.03,99,83],[498.415,0.055,50,220],[498.475,0.16,39,190],[498.475,0.14,51,114],[498.657,0.045,117,24],[498.899,0.223,78,30],[498.899,0.027,117,55],[499.141,0.203,43,44],[499.141,0.223,76,126],[499.141,0.045,117,55],[499.383,0.203,43,56],[499.383,0.89,74,157],[499.77,0.29,59,43],[499.867,0.11,98,118],[499.867,0.095,54,132],[500.092,0.29,62,31],[500.351,0.055,50,18],[500.351,3.677,57,32],[500.351,3.677,64,10],[500.351,0.027,117,22],[500.411,0.16,39,63],[500.411,0.14,51,38],[500.592,0.045,117,92],[500.738,0.29,61,9],[500.834,0.223,66,26],[500.834,0.027,117,20],[501.076,0.223,69,145],[501.318,0.203,45,16],[501.318,0.668,73,167],[501.802,0.11,98,52],[501.802,0.095,54,59],[502.044,0.7,73,12],[502.044,0.203,45,15],[502.044,0.045,117,84],[502.286,0.027,117,36],[502.77,0.445,76,131],[503.254,0.03,99,38],[503.254,0.055,50,102],[503.254,0.89,74,77],[503.314,0.16,39,50],[503.314,0.14,51,30],[503.496,0.534,62,32],[503.496,0.045,117,72],[503.641,0.29,66,36],[503.738,0.027,117,41],[503.964,0.29,69,26],[503.98,0.203,50,41],[504.222,3.677,62,59],[504.705,0.223,66,42],[504.947,0.223,69,40],[504.947,0.045,117,54],[505.189,0.03,99,56],[505.189,0.055,50,150],[505.189,0.027,117,34],[505.249,0.16,39,115],[505.249,0.14,51,69],[505.576,0.29,66,30],[505.899,0.29,69,34],[505.915,0.203,50,42],[506.157,0.203,50,22],[506.399,0.045,117,50],[506.641,0.11,98,29],[506.641,0.095,54,32],[506.641,0.445,76,122],[506.641,0.027,117,41],[507.125,0.03,99,71],[507.125,0.055,50,190],[507.125,0.89,74,18],[507.185,0.16,39,180],[507.185,0.14,51,108],[507.512,0.29,66,13],[507.834,0.29,69,26],[507.851,0.203,50,33],[507.851,0.045,117,23],[508.092,0.203,47,48],[508.092,3.677,59,36],[508.092,0.027,117,48],[508.334,0.045,117,33],[508.576,0.11,98,101],[508.576,0.095,54,114],[508.576,0.223,69,143],[508.818,0.223,71,96],[509.12,0.16,39,39],[509.12,0.14,51,24],[509.447,0.29,62,36],[509.544,0.027,117,24],[509.77,0.29,66,32],[509.786,0.7,69,8],[509.786,0.045,117,76],[510.028,0.03,99,21],[510.028,0.055,50,56],[510.028,0.027,117,23],[510.088,0.16,39,19],[510.088,0.14,51,11],[510.754,0.203,47,50],[510.754,0.223,74,142],[510.996,0.203,47,38],[510.996,0.89,71,107],[510.996,0.134,62,19],[511.238,0.534,59,28],[511.48,0.11,98,102],[511.48,0.095,54,115],[511.48,0.027,117,37],[511.722,0.045,117,79],[511.964,0.29,55,42],[511.964,3.677,62,72],[511.964,0.027,117,25],[512.326,0.7,62,11],[512.351,0.29,59,35],[512.931,0.03,99,84],[512.931,0.055,50,223],[512.931,0.223,69,22],[512.991,0.16,39,205],[512.991,0.14,51,123],[513.173,0.223,71,83],[513.415,0.445,69,129],[513.657,0.045,117,43],[513.899,0.445,79,157],[513.899,0.027,117,53],[514.141,0.045,117,81],[514.383,0.223,78,117],[514.383,0.027,117,26],[514.625,0.203,43,48],[514.625,0.223,76,82],[514.867,0.203,43,54],[515.254,0.29,59,44],[515.351,0.11,98,22],[515.351,0.095,54,25],[515.576,0.29,62,16],[515.592,0.203,43,52],[515.835,0.29,57,39],[515.835,0.203,45,49],[515.835,3.677,57,68],[516.197,0.7,64,17],[516.222,0.29,61,34],[516.318,0.11,98,96],[516.318,0.095,54,108],[516.544,0.29,64,25],[516.56,0.203,45,31],[516.56,0.045,117,8],[516.802,0.29,57,42],[516.802,0.203,45,25],[516.802,0.027,117,32],[517.044,0.045,117,80],[517.165,0.7,73,22],[517.189,0.29,61,13],[517.286,0.11,98,119],[517.286,0.095,54,134],[517.286,0.027,117,58],[517.512,0.29,64,9],[517.528,0.203,45,11],[517.528,0.045,117,85],[517.77,0.203,50,7],[517.77,0.027,117,37],[518.012,0.045,117,27],[518.254,0.11,98,114],[518.254,0.095,54,128],[519.222,0.11,98,114],[519.222,0.095,54,129],[519.705,3.738,69,48],[520.197,0.11,98,86],[520.197,0.095,54,97],[520.197,0.226,66,121],[520.443,0.226,69,121],[520.689,0.679,66,121],[521.181,0.11,98,86],[521.181,0.095,54,97],[521.427,0.226,64,121],[521.427,0.045,117,27],[521.673,0.453,66,121],[521.673,0.027,117,31],[521.918,0.045,117,64],[522.164,0.11,98,92],[522.164,0.095,54,103],[522.164,0.453,64,121],[522.164,0.027,117,43],[522.41,0.045,117,63],[522.656,0.027,117,31],[522.902,0.045,117,27],[523.148,0.11,98,92],[523.148,0.095,54,103],[523.64,3.738,66,63],[524.132,0.11,98,97],[524.132,0.095,54,109],[525.017,0.295,62,42],[525.115,0.11,98,97],[525.115,0.095,54,109],[525.607,0.295,59,44],[525.853,0.407,52,32],[526.099,0.11,98,102],[526.099,0.095,54,115],[526.328,0.295,66,44],[526.345,0.7,64,11],[526.345,0.045,117,22],[526.591,0.027,117,31],[526.837,0.045,117,67],[526.984,0.295,62,44],[527.082,0.11,98,102],[527.082,0.095,54,115],[527.082,0.027,117,48],[527.312,0.295,66,44],[527.328,0.045,117,74],[527.574,3.738,62,62],[527.574,0.027,117,40],[527.82,0.045,117,40],[527.943,0.7,62,23],[527.968,0.295,59,46],[528.066,0.11,98,107],[528.066,0.095,54,121],[528.558,0.295,55,46],[528.927,0.7,69,23],[529.05,0.11,98,107],[529.05,0.095,54,121],[529.279,0.295,62,46],[529.91,0.7,67,23],[530.033,0.11,98,112],[530.033,0.095,54,126],[531.017,0.11,98,112],[531.017,0.095,54,126],[531.263,0.045,117,14],[531.509,3.738,64,42],[531.509,0.027,117,29],[531.755,0.045,117,71],[532,0.11,98,118],[532,0.095,54,132],[532,0.027,117,54],[532.246,0.045,117,87],[532.492,0.679,73,132],[532.492,0.027,117,48],[532.738,0.045,117,54],[532.984,0.11,98,118],[532.984,0.095,54,132],[532.984,0.027,117,15],[533.23,0.226,69,132],[533.476,0.453,66,132],[533.968,0.11,98,109],[533.968,0.095,54,122],[533.968,0.453,64,132],[534.46,0.905,62,132],[534.951,0.11,98,109],[534.951,0.095,54,122],[535.443,3.864,66,24],[535.952,0.11,98,86],[535.952,0.095,54,97],[536.969,0.11,98,86],[536.969,0.095,54,97],[537.477,0.305,62,40],[537.986,0.11,98,92],[537.986,0.095,54,103],[538.223,0.305,69,40],[538.901,0.305,66,40],[539.003,0.11,98,92],[539.003,0.095,54,103],[539.511,0.305,59,42],[539.511,3.864,62,52],[539.918,0.305,62,42],[540.019,0.11,98,97],[540.019,0.095,54,109],[540.528,0.305,59,42],[540.909,0.7,69,21],[541.036,0.11,98,97],[541.036,0.095,54,109],[541.274,0.305,66,42],[541.926,0.7,64,21],[541.952,0.305,62,44],[542.053,0.11,98,102],[542.053,0.095,54,115],[543.07,0.11,98,102],[543.07,0.095,54,115],[543.579,3.864,59,69],[544.087,0.11,98,107],[544.087,0.095,54,121],[544.85,0.234,71,120],[545.104,0.11,98,107],[545.104,0.095,54,121],[545.104,0.468,69,120],[545.613,0.468,67,120],[546.121,0.11,98,112],[546.121,0.095,54,126],[546.121,0.234,66,120],[546.375,0.234,64,120],[546.63,0.936,62,120],[547.138,0.11,98,112],[547.138,0.095,54,126],[547.646,4.068,69,55],[547.646,3.864,61,68],[548.155,0.11,98,118],[548.155,0.095,54,132],[549.172,0.11,98,118],[549.172,0.095,54,132],[550.189,0.27,64,25],[550.189,0.03,83,9],[550.209,0.31,57,13],[550.426,0.305,69,47],[551.104,0.305,66,47],[551.206,0.27,64,25],[551.206,0.03,83,9],[551.226,0.31,57,13],[552.223,0.27,64,25],[552.223,0.03,83,9],[552.243,0.31,57,13],[553.24,0.27,64,25],[553.24,0.03,83,9],[553.26,0.31,57,13],[554.257,0.27,64,25],[554.257,0.03,83,9],[554.277,0.31,57,13],[554.769,0.27,64,31],[554.769,0.03,83,11],[554.789,0.31,57,16],[555.678,0.27,64,31],[555.678,0.03,83,11],[555.698,0.31,57,16],[556.587,0.27,64,31],[556.587,0.03,83,11],[556.607,0.31,57,16],[557.496,0.27,64,31],[557.496,0.03,83,11],[557.516,0.31,57,16],[557.951,0.58,71,29],[558.405,0.27,64,31],[558.405,0.03,83,11],[558.425,0.31,57,16],[558.86,0.773,74,29],[559.314,0.27,64,31],[559.314,0.03,83,11],[559.334,0.31,57,16],[560.223,0.27,64,31],[560.223,0.03,83,11],[560.243,0.31,57,16],[560.451,0.193,78,30],[561.133,0.27,64,31],[561.133,0.03,83,11],[561.153,0.31,57,16],[562.042,0.27,64,31],[562.042,0.03,83,11],[562.062,0.31,57,16],[562.951,0.27,64,31],[562.951,0.03,83,11],[562.971,0.31,57,16],[563.86,0.27,64,31],[563.86,0.03,83,11],[563.88,0.31,57,16],[564.769,0.27,64,31],[564.769,0.03,83,11],[564.789,0.31,57,16],[565.223,0.58,71,22],[565.678,0.27,64,31],[565.678,0.03,83,11],[565.698,0.31,57,16],[566.133,0.773,74,22],[566.587,0.27,64,31],[566.587,0.03,83,11],[566.607,0.31,57,16],[567.496,0.27,64,31],[567.496,0.03,83,11],[567.516,0.31,57,16],[567.723,0.193,78,22],[568.405,0.27,64,31],[568.405,0.03,83,11],[568.425,0.31,57,16],[568.86,0.58,62,16],[569.314,0.27,64,31],[569.314,0.03,83,11],[569.334,0.31,57,16],[569.542,0.193,62,22],[569.769,0.773,62,22],[570.223,0.27,64,31],[570.223,0.03,83,11],[570.243,0.31,57,16],[570.678,0.58,62,22],[571.133,0.27,64,31],[571.133,0.03,83,11],[571.153,0.31,57,16],[571.36,0.193,62,22],[571.587,0.773,62,22],[572.042,0.27,64,31],[572.042,0.03,83,11],[572.062,0.31,57,16],[572.496,0.58,62,22],[572.951,0.27,64,31],[572.951,0.03,83,11],[572.971,0.31,57,16],[573.178,0.193,62,16],[573.405,0.773,62,16],[573.86,0.27,64,31],[573.86,0.03,83,11],[573.88,0.31,57,16],[574.314,0.58,62,16],[574.769,0.27,64,31],[574.769,0.03,83,11],[574.789,0.31,57,16],[574.996,0.193,62,16],[575.223,0.773,62,16],[575.678,0.27,64,31],[575.678,0.03,83,11],[575.698,0.31,57,16],[576.133,0.58,62,16],[576.587,0.27,64,31],[576.587,0.03,83,11],[576.607,0.31,57,16],[576.814,0.193,62,16],[577.042,0.773,62,24],[577.496,0.27,64,31],[577.496,0.03,83,11],[577.516,0.31,57,16],[577.951,0.58,62,24],[578.405,0.27,64,31],[578.405,0.03,83,11],[578.425,0.31,57,16],[578.633,0.193,62,24],[578.86,0.773,62,24],[579.314,0.27,64,31],[579.314,0.03,83,11],[579.334,0.31,57,16],[579.769,0.58,62,24],[580.223,0.27,64,31],[580.223,0.03,83,11],[580.243,0.31,57,16],[580.451,0.193,62,24],[580.678,0.773,62,24],[581.133,0.27,64,31],[581.133,0.03,83,11],[581.153,0.31,57,16],[581.587,0.58,62,29],[582.042,0.27,64,31],[582.042,0.03,83,11],[582.062,0.31,57,16],[582.269,0.193,62,29],[582.496,0.773,62,29],[582.951,0.27,64,31],[582.951,0.03,83,11],[582.971,0.31,57,16],[583.86,0.27,64,31],[583.86,0.03,83,11],[583.88,0.31,57,16],[584.769,0.27,64,31],[584.769,0.03,83,11],[584.789,0.31,57,16],[585.678,0.27,64,31],[585.678,0.03,83,11],[585.698,0.31,57,16],[586.587,0.27,64,31],[586.587,0.03,83,11],[586.607,0.31,57,16],[587.042,0.58,83,41],[587.496,0.27,64,31],[587.496,0.03,83,11],[587.516,0.31,57,16],[587.951,0.773,86,41],[588.405,0.27,64,31],[588.405,0.03,83,11],[588.425,0.31,57,16],[589.314,0.27,64,31],[589.314,0.03,83,11],[589.334,0.31,57,16],[589.542,0.193,90,41],[590.223,0.27,64,31],[590.223,0.03,83,11],[590.243,0.31,57,16],[590.678,0.159,74,54],[591.133,0.27,64,31],[591.133,0.03,83,11],[591.153,0.31,57,16],[592.042,0.27,64,31],[592.042,0.03,83,11],[592.062,0.31,57,16],[592.437,4.385,67,11],[593.014,0.07,98,19],[593.129,0.27,64,27],[593.129,0.03,83,10],[593.149,0.31,57,14],[593.283,0.346,79,23],[594.024,0.7,76,11],[594.168,0.07,98,19],[595.206,0.346,76,24],[595.322,0.07,98,20],[595.437,0.27,64,28],[595.437,0.03,83,10],[595.457,0.31,57,14],[595.899,0.219,76,13],[596.476,0.07,98,18],[596.745,0.346,79,13],[596.764,0.035,117,11],[597.052,0.346,69,20],[597.052,4.385,60,26],[597.341,0.219,69,10],[597.629,0.07,98,13],[597.745,0.27,64,18],[597.765,0.31,57,9],[598.668,0.346,72,25],[599.36,0.27,48,11],[599.36,0.055,50,12],[599.42,0.16,39,13],[599.42,0.14,51,8],[599.793,0.7,74,11],[600.206,0.346,76,19],[600.226,0.035,117,10],[600.514,0.346,69,15],[600.514,0.27,48,38],[600.514,0.03,83,13],[600.514,0.03,99,16],[600.514,0.055,50,42],[600.534,0.31,42,19],[600.574,0.16,39,40],[600.574,0.14,51,24],[600.802,0.035,117,10],[601.668,0.27,48,47],[601.668,0.03,83,16],[601.668,0.03,99,18],[601.668,0.055,50,48],[601.668,4.385,53,27],[601.688,0.31,42,23],[601.728,0.16,39,45],[601.728,0.14,51,27],[602.129,0.346,69,23],[602.822,0.27,48,23],[602.822,0.03,83,8],[602.822,0.03,99,9],[602.822,0.055,50,23],[602.842,0.31,42,11],[602.882,0.16,39,20],[602.882,0.14,51,12],[603.668,0.346,72,28],[603.687,0.7,79,7],[603.687,0.035,117,11],[603.976,0.277,41,13],[604.264,0.035,117,10],[604.408,0.7,77,11],[604.408,0.277,48,22],[605.129,0.346,65,26],[605.129,0.277,41,33],[605.822,0.27,64,35],[605.822,0.03,83,12],[605.842,0.31,57,18],[605.995,0.219,65,16],[605.995,0.277,42,37],[606.283,0.277,43,38],[606.283,4.385,59,16],[606.572,0.219,67,16],[606.716,0.277,50,35],[606.745,0.346,71,13],[606.86,0.07,98,13],[606.976,0.27,64,20],[606.995,0.31,57,10],[607.129,0.346,74,25],[607.149,0.035,117,9],[607.437,0.219,71,12],[607.437,0.277,43,28],[607.726,0.035,117,14],[608.014,0.07,98,22],[608.129,0.27,64,19],[608.149,0.31,57,10],[608.302,0.277,47,18],[608.591,0.346,72,26],[608.591,2.077,48,16],[609.024,0.7,76,15],[609.052,0.346,76,8],[609.168,0.27,64,24],[609.168,0.03,83,8],[609.188,0.31,57,12],[610.206,0.173,64,20],[610.322,0.27,64,25],[610.322,0.03,83,9],[610.342,0.31,57,12],[610.899,4.56,64,15],[611.349,0.7,72,13],[611.499,0.27,64,25],[611.499,0.03,83,9],[611.519,0.31,57,13],[611.619,0.27,64,26],[611.619,0.03,83,9],[611.639,0.31,57,13],[612.699,0.27,64,25],[612.699,0.03,83,9],[612.719,0.31,57,13],[613.599,0.228,79,16],[613.899,0.27,64,25],[613.899,0.03,83,9],[613.919,0.31,57,13],[614.019,0.27,64,27],[614.019,0.03,83,10],[614.039,0.31,57,14],[615.099,0.27,64,25],[615.099,0.03,83,9],[615.119,0.31,57,13],[615.699,4.56,57,12],[616.299,0.27,64,25],[616.299,0.03,83,9],[616.319,0.31,57,13],[616.419,0.27,64,29],[616.419,0.03,83,10],[616.439,0.31,57,14],[617.499,0.27,64,25],[617.499,0.03,83,9],[617.519,0.31,57,13],[617.799,0.7,79,8],[618.549,0.7,74,15],[618.699,0.27,64,25],[618.699,0.03,83,9],[618.719,0.31,57,13],[618.819,0.27,64,30],[618.819,0.03,83,11],[618.839,0.31,57,15],[619.299,0.228,72,18],[619.899,0.27,64,25],[619.899,0.03,83,9],[619.919,0.31,57,13],[620.499,4.56,53,19],[620.979,0.36,69,33],[621.099,0.27,64,25],[621.099,0.03,83,9],[621.119,0.31,57,13],[621.219,0.27,64,32],[621.219,0.03,83,11],[621.239,0.31,57,16],[621.699,0.36,65,33],[622.299,0.27,64,25],[622.299,0.03,83,9],[622.319,0.31,57,13],[622.579,0.36,72,33],[623.379,0.36,69,35],[623.499,0.27,64,25],[623.499,0.03,83,9],[623.519,0.31,57,13],[623.619,0.27,64,33],[623.619,0.03,83,12],[623.639,0.31,57,17],[624.099,0.36,65,35],[624.699,0.27,64,25],[624.699,0.03,83,9],[624.719,0.31,57,13],[624.979,0.36,72,35],[624.999,0.228,65,20],[625.299,4.56,55,23],[625.779,0.36,71,37],[625.899,0.27,64,25],[625.899,0.03,83,9],[625.919,0.31,57,13],[626.019,0.27,64,35],[626.019,0.03,83,12],[626.039,0.31,57,17],[626.199,0.7,74,10],[626.499,0.36,67,37],[626.949,0.7,83,18],[627.099,0.27,64,25],[627.099,0.03,83,9],[627.119,0.31,57,13],[627.379,0.36,74,37],[628.179,0.36,76,34],[628.299,0.27,64,25],[628.299,0.03,83,9],[628.319,0.31,57,13],[629.499,0.27,64,25],[629.499,0.03,83,9],[629.519,0.31,57,13],[629.619,0.18,65,24],[630.099,4.75,60,11],[630.724,0.27,64,25],[630.724,0.03,83,9],[630.744,0.31,57,13],[630.849,0.27,64,23],[630.849,0.03,83,8],[630.869,0.31,57,11],[631.974,0.27,64,25],[631.974,0.03,83,9],[631.994,0.31,57,13],[633.067,0.7,76,12],[633.224,0.27,64,25],[633.224,0.03,83,9],[633.244,0.31,57,13],[633.349,0.27,64,24],[633.349,0.03,83,8],[633.369,0.31,57,12],[634.474,0.27,64,25],[634.474,0.03,83,9],[634.494,0.31,57,13],[635.724,0.27,64,25],[635.724,0.03,83,9],[635.744,0.31,57,13],[635.849,0.27,64,25],[635.849,0.03,83,9],[635.869,0.31,57,13],[636.974,0.27,64,25],[636.974,0.03,83,9],[636.994,0.31,57,13],[638.224,0.27,64,25],[638.224,0.03,83,9],[638.244,0.31,57,13],[638.349,0.27,64,27],[638.349,0.03,83,9],[638.369,0.31,57,13],[639.474,0.27,64,25],[639.474,0.03,83,9],[639.494,0.31,57,13],[640.099,4.75,60,16],[640.724,0.27,64,25],[640.724,0.03,83,9],[640.744,0.31,57,13],[640.849,0.27,64,28],[640.849,0.03,83,10],[640.869,0.31,57,14],[641.817,0.7,79,15],[641.974,0.27,64,25],[641.974,0.03,83,9],[641.994,0.31,57,13],[643.224,0.27,64,25],[643.224,0.03,83,9],[643.244,0.31,57,13],[643.349,0.27,64,30],[643.349,0.03,83,10],[643.369,0.31,57,15],[644.474,0.27,64,25],[644.474,0.03,83,9],[644.494,0.31,57,13],[645.099,4.75,62,20],[645.724,0.27,64,25],[645.724,0.03,83,9],[645.744,0.31,57,13],[645.849,0.27,64,31],[645.849,0.03,83,11],[645.869,0.31,57,15],[646.974,0.27,64,25],[646.974,0.03,83,9],[646.994,0.31,57,13],[648.224,0.27,64,25],[648.224,0.03,83,9],[648.244,0.31,57,13],[649.349,0.188,64,21],[649.474,0.27,64,25],[649.474,0.03,83,9],[649.494,0.31,57,13],[650.737,0.27,64,25],[650.737,0.03,83,9],[650.757,0.31,57,13],[651.854,0.7,76,11],[652.014,0.27,64,25],[652.014,0.03,83,9],[652.034,0.31,57,13],[653.29,0.27,64,25],[653.29,0.03,83,9],[653.31,0.31,57,13],[654.567,0.27,64,25],[654.567,0.03,83,9],[654.587,0.31,57,13],[655.843,0.27,64,25],[655.843,0.03,83,9],[655.863,0.31,57,13],[657.12,0.27,64,25],[657.12,0.03,83,9],[657.14,0.31,57,13],[658.396,0.27,64,25],[658.396,0.03,83,9],[658.417,0.31,57,13],[659.673,0.27,64,25],[659.673,0.03,83,9],[659.693,0.31,57,13],[660.79,0.7,72,12],[660.95,0.27,64,25],[660.95,0.03,83,9],[660.97,0.31,57,13],[662.226,0.27,64,25],[662.226,0.03,83,9],[662.246,0.31,57,13],[663.503,0.27,64,25],[663.503,0.03,83,9],[663.523,0.31,57,13],[664.779,0.27,64,25],[664.779,0.03,83,9],[664.799,0.31,57,13],[666.056,0.27,64,25],[666.056,0.03,83,9],[666.076,0.31,57,13],[667.333,0.27,64,25],[667.333,0.03,83,9],[667.353,0.31,57,13],[668.45,0.7,76,13],[668.609,0.27,64,25],[668.609,0.03,83,9],[668.629,0.31,57,13],[669.886,0.27,64,25],[669.886,0.03,83,9],[669.906,0.31,57,13],[670.014,0.192,65,17],[671.176,0.27,64,25],[671.176,0.03,83,9],[671.196,0.31,57,13],[672.481,0.27,64,25],[672.481,0.03,83,9],[672.501,0.31,57,13],[673.785,0.27,64,25],[673.785,0.03,83,9],[673.805,0.31,57,13],[675.089,0.27,64,25],[675.089,0.03,83,9],[675.109,0.31,57,13],[676.394,0.27,64,25],[676.394,0.03,83,9],[676.414,0.31,57,13],[677.698,0.27,64,25],[677.698,0.03,83,9],[677.718,0.31,57,13],[679.002,0.27,64,25],[679.002,0.03,83,9],[679.022,0.31,57,13],[680.307,0.27,64,25],[680.307,0.03,83,9],[680.327,0.31,57,13],[681.611,0.27,64,25],[681.611,0.03,83,9],[681.631,0.31,57,13],[682.915,0.27,64,25],[682.915,0.03,83,9],[682.935,0.31,57,13],[684.22,0.27,64,25],[684.22,0.03,83,9],[684.24,0.31,57,13],[685.524,0.27,64,25],[685.524,0.03,83,9],[685.544,0.31,57,13],[686.828,0.27,64,25],[686.828,0.03,83,9],[686.848,0.31,57,13],[688.133,0.27,64,25],[688.133,0.03,83,9],[688.153,0.31,57,13],[689.437,0.27,64,25],[689.437,0.03,83,9],[689.457,0.31,57,13],[690.611,0.196,64,16],[690.741,0.27,64,25],[690.741,0.03,83,9],[690.761,0.31,57,13],[692.076,0.27,64,25],[692.076,0.03,83,9],[692.096,0.31,57,13],[693.439,0.27,64,25],[693.439,0.03,83,9],[693.459,0.31,57,13],[694.803,0.27,64,25],[694.803,0.03,83,9],[694.823,0.31,57,13],[696.166,0.27,64,25],[696.166,0.03,83,9],[696.186,0.31,57,13],[697.53,0.27,64,25],[697.53,0.03,83,9],[697.55,0.31,57,13],[698.894,0.27,64,25],[698.894,0.03,83,9],[698.914,0.31,57,13],[700.257,0.27,64,25],[700.257,0.03,83,9],[700.277,0.31,57,13],[701.621,0.27,64,25],[701.621,0.03,83,9],[701.641,0.31,57,13],[702.985,0.27,64,25],[702.985,0.03,83,9],[703.005,0.31,57,13],[704.348,0.27,64,25],[704.348,0.03,83,9],[704.368,0.31,57,13],[705.712,0.27,64,25],[705.712,0.03,83,9],[705.732,0.31,57,13],[707.076,0.27,64,25],[707.076,0.03,83,9],[707.096,0.31,57,13],[708.439,0.27,64,25],[708.439,0.03,83,9],[708.459,0.31,57,13],[709.803,0.27,64,25],[709.803,0.03,83,9],[709.823,0.31,57,13],[711.166,0.27,64,25],[711.166,0.03,83,9],[711.186,0.31,57,13],[712.53,0.27,64,25],[712.53,0.03,83,9],[712.55,0.31,57,13],[714.212,0.27,64,22],[714.212,0.03,83,8],[714.232,0.31,57,11],[716.212,0.27,64,22],[716.212,0.03,83,8],[716.232,0.31,57,11],[718.212,0.27,64,22],[718.212,0.03,83,8],[718.232,0.31,57,11],[720.212,0.27,64,22],[720.212,0.03,83,8],[720.232,0.31,57,11],[722.212,0.27,64,22],[722.212,0.03,83,8],[722.232,0.31,57,11],[724.212,0.27,64,22],[724.212,0.03,83,8],[724.232,0.31,57,11],[725.212,2.4,74,43],[726.212,0.27,64,22],[726.212,0.03,83,8],[726.232,0.31,57,11],[728.212,0.27,64,22],[728.212,0.03,83,8],[728.232,0.31,57,11],[730.212,0.27,64,22],[730.212,0.03,83,8],[730.232,0.31,57,11],[732.212,0.27,64,22],[732.212,0.03,83,8],[732.232,0.31,57,11],[734.212,0.27,64,22],[734.212,0.03,83,8],[734.232,0.31,57,11],[736.212,0.27,64,22],[736.212,0.03,83,8],[736.232,0.31,57,11],[738.212,0.27,64,22],[738.212,0.03,83,8],[738.232,0.31,57,11],[740.212,0.27,64,22],[740.212,0.03,83,8],[740.232,0.31,57,11],[742.212,0.27,64,22],[742.212,0.03,83,8],[742.232,0.31,57,11],[744.212,0.27,64,22],[744.212,0.03,83,8],[744.232,0.31,57,11],[746.212,0.27,64,22],[746.212,0.03,83,8],[746.232,0.31,57,11],[748.212,0.27,64,22],[748.212,0.03,83,8],[748.232,0.31,57,11],[750.212,0.27,64,22],[750.212,0.03,83,8],[750.232,0.31,57,11],[752.212,0.27,64,22],[752.212,0.03,83,8],[752.232,0.31,57,11],[754.212,0.27,64,22],[754.212,0.03,83,8],[754.232,0.31,57,11],[756.212,0.27,64,22],[756.212,0.03,83,8],[756.232,0.31,57,11],[758.212,0.27,64,22],[758.212,0.03,83,8],[758.232,0.31,57,11],[760.212,0.27,64,22],[760.212,0.03,83,8],[760.232,0.31,57,11],[762.212,0.27,64,22],[762.212,0.03,83,8],[762.232,0.31,57,11],[764.212,0.27,64,22],[764.212,0.03,83,8],[764.232,0.31,57,11],[766.212,0.27,64,22],[766.212,0.03,83,8],[766.232,0.31,57,11],[768.212,0.27,64,22],[768.212,0.03,83,8],[768.232,0.31,57,11],[770.212,0.27,64,22],[770.212,0.03,83,8],[770.232,0.31,57,11]],[[34.9,1.282,76,169],[42.5,0.666,72,199],[45.46,0.666,76,199],[50.74,0.252,79,199],[53.26,1.008,72,199],[57.04,0.25,74,177],[60.1,0.15,65,173],[60.42,0.96,48,26],[61.62,0.96,48,26],[62.34,0.27,64,21],[62.34,0.03,83,7],[62.36,0.31,57,11],[62.82,0.96,48,28],[64.02,0.96,48,28],[64.74,0.27,64,22],[64.74,0.03,83,8],[64.76,0.31,57,11],[65.22,0.96,45,29],[66.42,0.96,45,29],[67.14,0.27,64,24],[67.14,0.03,83,8],[67.16,0.31,57,12],[67.62,0.96,45,31],[68.82,0.96,45,31],[69.54,0.27,64,25],[69.54,0.03,83,9],[69.56,0.31,57,13],[70.02,0.96,41,24],[71.22,0.96,41,24],[71.94,0.27,64,26],[71.94,0.03,83,9],[71.96,0.31,57,13],[72.42,0.96,41,25],[73.62,0.96,41,25],[74.34,0.27,64,27],[74.34,0.03,83,10],[74.36,0.31,57,14],[74.82,0.96,43,26],[76.02,0.96,43,26],[76.74,0.27,64,29],[76.74,0.03,83,10],[76.76,0.31,57,14],[77.22,2.16,48,23],[79.14,0.18,65,22],[79.62,0.941,48,17],[80.796,0.941,48,17],[81.502,0.27,64,24],[81.502,0.03,83,8],[81.522,0.31,57,12],[81.973,0.941,48,18],[82.267,0.224,79,17],[83.149,0.941,48,18],[83.855,0.27,64,26],[83.855,0.03,83,9],[83.875,0.31,57,13],[84.326,0.941,45,19],[85.502,0.941,45,19],[86.208,0.27,64,27],[86.208,0.03,83,10],[86.228,0.31,57,14],[86.679,0.941,45,20],[87.855,0.224,72,13],[87.855,0.941,45,20],[88.561,0.27,64,29],[88.561,0.03,83,10],[88.581,0.31,57,14],[89.032,0.353,65,25],[89.032,0.941,41,29],[89.894,0.353,72,25],[90.208,0.941,41,29],[90.679,0.353,69,25],[90.914,0.27,64,30],[90.914,0.03,83,11],[90.934,0.31,57,15],[91.385,0.353,65,26],[91.385,0.941,41,30],[92.248,0.353,72,26],[92.561,0.941,41,30],[93.032,0.353,69,26],[93.267,0.27,64,32],[93.267,0.03,83,11],[93.287,0.31,57,16],[93.444,0.224,65,25],[93.738,0.353,67,47],[93.738,0.941,43,31],[94.6,0.353,74,47],[94.914,0.941,43,31],[95.385,0.353,71,47],[95.62,0.27,64,33],[95.62,0.03,83,11],[95.64,0.31,57,16],[96.091,0.353,72,44],[96.091,2.118,48,28],[96.953,0.353,79,44],[97.973,0.176,65,31],[98.444,0.277,48,18],[98.876,0.277,55,18],[99.597,0.277,48,18],[100.03,0.7,76,19],[100.29,0.27,64,27],[100.29,0.03,83,10],[100.31,0.31,57,14],[100.463,0.219,72,11],[100.463,0.277,47,18],[100.751,0.277,48,19],[101.04,0.219,79,11],[101.184,0.277,55,19],[101.905,0.277,48,19],[102.597,0.27,64,29],[102.597,0.03,83,10],[102.617,0.31,57,14],[102.77,0.277,44,17],[102.77,0.035,117,9],[103.059,0.277,45,18],[103.347,0.035,117,11],[103.492,0.277,52,18],[104.213,0.277,45,18],[104.905,0.27,64,30],[104.905,0.03,83,11],[104.925,0.31,57,15],[105.078,0.277,44,18],[105.367,0.277,45,19],[105.799,0.277,52,19],[106.52,0.219,72,19],[106.52,0.277,45,19],[107.213,0.27,64,32],[107.213,0.03,83,11],[107.233,0.31,57,16],[107.386,0.277,40,44],[107.674,0.277,41,46],[107.963,0.035,117,13],[108.107,0.7,72,18],[108.107,0.277,48,46],[108.136,0.346,69,36],[108.54,0.035,117,11],[108.828,0.346,65,36],[108.828,0.277,41,46],[109.52,0.27,64,34],[109.52,0.03,83,12],[109.54,0.31,57,17],[109.674,0.346,72,36],[109.694,0.277,40,46],[109.982,0.277,41,49],[110.415,0.277,48,49],[110.444,0.346,69,38],[111.136,0.346,65,38],[111.136,0.277,41,34],[111.828,0.27,64,35],[111.828,0.03,83,12],[111.848,0.31,57,18],[111.982,0.346,72,27],[112.001,0.219,65,15],[112.001,0.277,42,34],[112.29,0.277,43,36],[112.578,0.219,67,16],[112.578,0.035,117,9],[112.722,0.277,50,36],[112.751,0.346,71,29],[113.155,0.035,117,14],[113.444,0.346,67,29],[113.444,0.277,43,36],[113.732,0.035,117,9],[114.136,0.27,64,37],[114.136,0.03,83,13],[114.156,0.31,57,19],[114.29,0.346,74,29],[114.309,0.277,47,36],[114.597,2.077,48,37],[115.03,0.7,76,14],[115.059,0.346,76,27],[116.444,0.173,65,19],[116.905,0.25,45,46],[117.814,0.27,64,30],[117.814,0.03,83,10],[117.834,0.31,57,15],[118.269,0.25,45,46],[118.723,0.27,64,30],[118.723,0.03,83,10],[118.743,0.31,57,15],[119.632,0.25,50,46],[120.541,0.27,64,30],[120.541,0.03,83,10],[120.561,0.31,57,15],[120.996,0.25,52,46],[121.451,0.27,64,30],[121.451,0.03,83,10],[121.471,0.31,57,15],[122.36,0.25,45,46],[123.269,0.27,64,30],[123.269,0.03,83,10],[123.289,0.31,57,15],[123.723,0.25,53,46],[124.178,0.27,64,30],[124.178,0.03,83,10],[124.198,0.31,57,15],[125.087,0.25,50,46],[125.996,0.27,64,30],[125.996,0.03,83,10],[126.016,0.31,57,15],[126.451,0.25,52,46],[126.905,0.27,64,30],[126.905,0.03,83,10],[126.925,0.31,57,15],[127.814,0.25,45,46],[128.723,0.27,64,30],[128.723,0.03,83,10],[128.743,0.31,57,15],[129.178,0.25,45,46],[129.632,0.27,64,30],[129.632,0.03,83,10],[129.652,0.31,57,15],[130.541,0.25,50,46],[131.451,0.27,64,30],[131.451,0.03,83,10],[131.471,0.31,57,15],[131.905,0.25,52,46],[132.36,0.27,64,30],[132.36,0.03,83,10],[132.38,0.31,57,15],[133.269,0.25,45,46],[134.178,0.27,64,30],[134.178,0.03,83,10],[134.198,0.31,57,15],[134.632,0.25,53,46],[135.087,0.27,64,30],[135.087,0.03,83,10],[135.107,0.31,57,15],[135.996,0.25,52,46],[136.905,0.27,64,30],[136.905,0.03,83,10],[136.925,0.31,57,15],[137.36,0.25,45,46],[137.814,0.27,64,30],[137.814,0.03,83,10],[137.834,0.31,57,15],[138.723,0.25,45,49],[138.723,0.045,111,14],[139.632,0.27,64,30],[139.632,0.03,83,10],[139.652,0.31,57,15],[140.087,0.25,45,49],[140.314,0.191,76,10],[140.542,0.27,64,30],[140.542,0.03,83,10],[140.561,0.31,57,15],[141.451,0.818,81,26],[141.451,0.25,50,49],[142.36,0.27,64,30],[142.36,0.03,83,10],[142.38,0.31,57,15],[142.814,0.25,52,49],[142.814,0.045,111,19],[143.269,0.27,64,30],[143.269,0.03,83,10],[143.289,0.31,57,15],[143.496,0.045,111,13],[144.178,0.25,45,49],[145.087,0.191,69,12],[145.087,0.27,64,30],[145.087,0.03,83,10],[145.107,0.31,57,15],[145.541,0.818,77,31],[145.541,0.25,53,49],[145.996,0.27,64,30],[145.996,0.03,83,10],[146.016,0.31,57,15],[146.905,0.25,50,49],[147.132,0.191,77,12],[147.587,0.045,111,9],[147.814,0.27,64,30],[147.814,0.03,83,10],[147.834,0.31,57,15],[148.269,0.25,52,49],[148.269,0.045,111,21],[148.723,0.27,64,30],[148.723,0.03,83,10],[148.743,0.31,57,15],[149.632,0.818,76,33],[149.632,0.25,45,49],[150.542,0.27,64,30],[150.542,0.03,83,10],[150.561,0.31,57,15],[150.996,0.25,45,49],[151.451,0.27,64,30],[151.451,0.03,83,10],[151.471,0.31,57,15],[151.905,0.191,76,12],[152.36,0.25,50,49],[153.041,0.045,111,15],[153.269,0.27,64,30],[153.269,0.03,83,10],[153.289,0.31,57,15],[153.723,1.227,76,38],[153.723,0.25,52,49],[153.723,0.045,111,14],[153.951,0.191,76,14],[154.178,0.27,64,30],[154.178,0.03,83,10],[154.198,0.31,57,15],[155.087,0.25,45,49],[155.996,0.27,64,30],[155.996,0.03,83,10],[156.016,0.31,57,15],[156.451,0.25,53,49],[156.905,0.27,64,30],[156.905,0.03,83,10],[156.925,0.31,57,15],[157.814,0.409,74,38],[157.814,0.25,52,49],[157.814,0.045,111,19],[158.496,0.045,111,13],[158.723,0.191,80,14],[158.723,0.27,64,30],[158.723,0.03,83,10],[158.743,0.31,57,15],[159.178,0.25,45,49],[159.632,0.27,64,30],[159.632,0.03,83,10],[159.652,0.31,57,15],[160.541,0.25,45,55],[160.769,0.191,64,17],[161.451,0.409,73,14],[161.451,0.27,64,30],[161.451,0.03,83,10],[161.471,0.31,57,15],[161.678,0.127,44,23],[161.905,0.25,45,55],[162.36,0.27,64,30],[162.36,0.03,83,10],[162.38,0.31,57,15],[162.587,0.045,111,9],[163.041,0.127,49,23],[163.269,0.25,50,55],[163.269,0.045,111,21],[164.178,0.27,64,30],[164.178,0.03,83,10],[164.198,0.31,57,15],[164.405,0.127,51,23],[164.632,0.25,52,55],[165.087,0.27,64,30],[165.087,0.03,83,10],[165.107,0.31,57,15],[165.541,0.191,64,20],[165.996,0.818,70,17],[165.996,0.25,45,55],[166.905,0.27,64,30],[166.905,0.03,83,10],[166.925,0.31,57,15],[167.132,0.127,52,23],[167.36,0.25,53,55],[167.587,0.191,69,20],[167.814,0.27,64,30],[167.814,0.03,83,10],[167.834,0.31,57,15],[168.041,0.045,111,15],[168.496,0.127,49,23],[168.723,0.25,50,55],[168.723,0.045,111,14],[169.632,0.409,68,17],[169.632,0.27,64,30],[169.632,0.03,83,10],[169.652,0.31,57,15],[169.86,0.127,51,23],[170.087,0.25,52,55],[170.542,0.27,64,30],[170.542,0.03,83,10],[170.561,0.31,57,15],[171.451,0.25,45,55],[172.36,0.191,64,18],[172.36,0.27,64,30],[172.36,0.03,83,10],[172.38,0.31,57,15],[172.587,0.127,44,23],[172.814,0.25,45,55],[172.814,0.045,111,19],[173.269,0.27,64,30],[173.269,0.03,83,10],[173.289,0.31,57,15],[173.496,0.045,111,13],[173.951,0.127,49,23],[174.178,0.818,77,16],[174.178,0.25,50,55],[174.405,0.191,62,18],[175.087,0.27,64,30],[175.087,0.03,83,10],[175.107,0.31,57,15],[175.314,0.127,51,23],[175.541,0.25,52,55],[175.996,0.27,64,30],[175.996,0.03,83,10],[176.016,0.31,57,15],[176.905,0.25,45,55],[177.587,0.045,111,9],[177.814,0.27,64,30],[177.814,0.03,83,10],[177.834,0.31,57,15],[178.041,0.127,52,23],[178.269,0.818,73,16],[178.269,0.25,53,55],[178.269,0.045,111,21],[178.723,0.27,64,30],[178.723,0.03,83,10],[178.743,0.31,57,15],[179.178,0.191,69,18],[179.405,0.127,51,23],[179.632,0.25,52,55],[180.542,0.27,64,30],[180.542,0.03,83,10],[180.561,0.31,57,15],[180.769,0.127,44,23],[180.996,1.227,65,14],[180.996,0.25,45,55],[181.223,0.191,64,15],[181.451,0.27,64,30],[181.451,0.03,83,10],[181.471,0.31,57,15],[182.36,0.266,45,52],[183.327,0.27,64,30],[183.327,0.03,83,10],[183.347,0.31,57,15],[183.811,0.266,53,52],[184.295,0.27,64,30],[184.295,0.03,83,10],[184.315,0.31,57,15],[185.263,0.266,52,52],[186.231,0.27,64,30],[186.231,0.03,83,10],[186.251,0.31,57,15],[186.714,0.266,45,52],[187.198,0.27,64,30],[187.198,0.03,83,10],[187.218,0.31,57,15],[188.166,0.295,45,52],[189.238,0.27,64,30],[189.238,0.03,83,10],[189.257,0.31,57,15],[189.773,0.295,53,52],[190.309,0.27,64,30],[190.309,0.03,83,10],[190.329,0.31,57,15],[191.38,0.295,52,52],[192.452,0.27,64,30],[192.452,0.03,83,10],[192.472,0.31,57,15],[192.988,1.607,64,28],[192.988,0.295,45,52],[193.523,0.27,64,30],[193.523,0.03,83,10],[193.543,0.31,57,15],[196.379,0.158,63,11],[196.576,0.158,62,11],[196.774,0.158,76,15],[196.971,0.158,74,15],[198.352,0.158,63,11],[198.352,0.158,65,15],[198.55,0.158,65,11],[198.55,0.158,67,15],[199.931,0.158,60,11],[200.129,0.158,58,11],[200.326,0.158,72,15],[200.524,0.158,70,15],[201.905,0.158,69,27],[202.102,0.158,70,27],[203.484,0.158,56,20],[203.681,0.158,55,20],[203.879,0.158,69,27],[204.076,0.158,67,27],[205.383,0.143,72,27],[205.561,0.143,74,27],[206.811,0.143,56,20],[206.99,0.143,58,20],[208.24,0.143,67,17],[208.418,0.143,65,17],[208.597,0.143,76,23],[208.775,0.143,77,23],[210.025,0.143,60,17],[210.204,0.143,62,17],[211.454,0.143,63,17],[211.633,0.143,62,17],[211.811,0.143,76,23],[211.99,0.143,74,23],[213.24,0.143,63,25],[213.24,0.13,65,34],[213.403,0.13,67,34],[213.418,0.143,65,25],[214.544,0.13,60,25],[214.707,0.13,58,25],[214.87,0.13,72,34],[215.033,0.13,70,34],[216.174,0.13,69,34],[216.338,0.13,70,34],[217.479,0.13,56,25],[217.642,0.13,55,25],[217.805,0.13,69,34],[217.968,0.13,67,34],[218.902,0.114,68,53],[219.448,0.114,73,53],[220.022,0.391,83,59],[220.45,0.5,102,108],[223.328,0.143,72,47],[223.506,0.143,74,47],[224.756,0.143,56,35],[224.935,0.143,58,35],[226.185,0.143,67,43],[226.364,0.143,65,43],[226.542,0.143,76,57],[226.721,0.143,77,57],[227.971,0.143,60,43],[228.149,0.143,62,43],[229.306,0.13,63,43],[229.469,0.13,62,43],[229.632,0.13,76,57],[229.795,0.13,74,57],[230.937,0.13,63,50],[230.937,0.13,65,67],[231.1,0.13,65,50],[231.1,0.13,67,67],[232.241,0.13,60,50],[232.404,0.13,58,50],[232.567,0.13,72,67],[232.73,0.13,70,67],[233.845,0.12,69,67],[233.995,0.12,70,67],[235.045,0.12,56,50],[235.195,0.12,55,50],[235.345,0.12,69,67],[235.495,0.12,67,67],[236.545,0.12,72,42],[236.695,0.12,74,42],[237.745,0.12,56,31],[237.895,0.12,58,31],[238.755,0.105,68,47],[239.257,0.105,73,47],[239.785,0.36,83,52],[240.181,0.5,102,108],[251.717,0.04,99,43],[252.431,0.16,43,49],[252.431,0.03,99,22],[253.86,0.16,43,49],[253.86,0.03,99,22],[266.002,0.04,99,43],[266.717,0.16,48,49],[266.717,0.03,99,22],[267.074,0.25,65,31],[268.145,0.16,48,49],[268.145,0.03,99,22],[268.86,0.25,75,38],[277.431,1.429,72,42],[280.288,0.04,99,43],[280.645,0.16,43,49],[280.645,0.03,99,22],[281.36,0.16,43,49],[281.36,0.03,99,22],[282.074,0.16,43,49],[282.074,0.03,99,22],[282.788,0.16,43,49],[282.788,0.03,99,22],[294.574,0.04,99,43],[294.931,0.16,48,49],[294.931,0.03,99,22],[295.645,0.16,48,49],[295.645,0.03,99,22],[296.36,0.16,48,49],[296.36,0.03,99,22],[297.074,0.16,48,49],[297.074,0.03,99,22],[301.488,6.333,72,13],[302.322,0.444,65,35],[303.71,0.444,60,35],[305.099,0.444,62,35],[306.488,0.444,60,35],[307.877,0.444,79,35],[308.155,6.333,69,10],[309.266,0.444,69,35],[310.655,0.444,62,35],[312.044,0.444,65,47],[313.155,0.444,60,12],[313.433,0.444,64,46],[314.544,0.444,79,16],[314.822,0.444,53,45],[314.822,6.333,69,17],[315.933,0.444,69,20],[316.21,0.444,72,43],[316.21,0.065,99,7],[317.322,0.444,65,25],[317.599,0.444,69,40],[317.599,0.065,99,9],[317.877,0.065,99,10],[318.71,0.444,65,31],[318.988,0.444,70,36],[319.266,0.065,99,11],[319.544,0.065,99,12],[320.099,0.444,64,36],[320.377,0.444,67,31],[320.933,0.065,99,13],[321.21,0.065,99,14],[321.488,0.444,53,41],[321.488,6.333,65,10],[321.766,0.444,57,24],[322.599,0.065,99,15],[322.877,0.444,72,27],[322.877,0.065,99,15],[323.155,0.444,50,10],[324.266,0.444,65,29],[324.266,0.065,99,16],[324.544,0.065,99,16],[325.655,0.444,70,29],[325.933,0.065,99,17],[326.21,0.065,99,17],[327.044,0.444,67,28],[327.599,0.065,99,16],[327.877,0.065,99,15],[328.155,0.444,53,13],[328.433,0.444,57,26],[329.266,0.065,99,13],[329.544,0.444,72,19],[329.544,0.065,99,13],[329.822,0.444,53,22],[330.655,0.5,79,15],[330.933,0.444,69,24],[330.933,0.065,99,10],[331.21,0.444,72,16],[331.21,0.065,99,9],[331.488,0.75,76,21],[332.322,0.444,70,28],[332.599,0.444,74,9],[333.71,0.444,67,26],[334.822,1.5,81,22],[334.822,6.333,72,12],[335.099,0.444,57,26],[335.655,0.055,50,15],[335.715,0.16,39,15],[335.715,0.14,51,9],[336.21,0.444,72,10],[336.488,0.444,50,24],[336.488,0.03,99,9],[336.488,0.055,50,23],[336.548,0.16,39,22],[336.548,0.14,51,13],[336.766,0.065,99,8],[337.044,0.065,99,9],[337.322,0.5,77,13],[337.322,0.03,99,12],[337.322,0.055,50,31],[337.382,0.16,39,29],[337.382,0.14,51,18],[337.599,0.444,65,17],[337.877,0.444,69,20],[338.155,0.03,99,14],[338.155,0.055,50,38],[338.215,0.16,39,36],[338.215,0.14,51,21],[338.433,0.065,99,12],[338.71,0.065,99,13],[338.988,0.444,70,22],[338.988,0.75,76,13],[338.988,0.03,99,16],[338.988,0.055,50,43],[339.048,0.16,39,41],[339.048,0.14,51,25],[339.266,0.444,74,14],[339.822,0.03,99,18],[339.822,0.055,50,48],[339.882,0.16,39,45],[339.882,0.14,51,27],[340.099,0.065,99,15],[340.377,0.444,67,25],[340.377,0.5,79,21],[340.377,0.065,99,16],[340.655,0.444,72,7],[340.655,0.03,99,19],[340.655,0.055,50,51],[340.715,0.16,39,48],[340.715,0.14,51,29],[341.488,0.03,99,20],[341.488,0.055,50,53],[341.488,6.333,69,9],[341.548,0.16,39,49],[341.548,0.14,51,30],[341.766,0.444,57,26],[341.766,0.065,99,17],[342.044,0.065,99,17],[342.322,0.03,99,20],[342.322,0.055,50,53],[342.382,0.16,39,50],[342.382,0.14,51,30],[343.155,0.444,53,26],[343.155,0.03,99,19],[343.155,0.055,50,52],[343.215,0.16,39,48],[343.215,0.14,51,29],[343.433,0.065,99,16],[343.71,0.065,99,16],[343.988,0.03,99,19],[343.988,0.055,50,49],[344.048,0.16,39,46],[344.048,0.14,51,28],[344.266,0.444,69,8],[344.544,0.444,72,17],[344.544,0.25,65,12],[344.822,0.03,99,17],[344.822,0.055,50,46],[344.882,0.16,39,43],[344.882,0.14,51,26],[345.099,0.065,99,14],[345.377,0.065,99,13],[345.655,0.444,70,12],[345.655,0.75,65,8],[345.655,0.03,99,15],[345.655,0.055,50,41],[345.715,0.16,39,38],[345.715,0.14,51,23],[345.933,0.444,74,14],[346.488,0.03,99,13],[346.488,0.055,50,36],[346.548,0.16,39,33],[346.548,0.14,51,20],[346.766,0.065,99,11],[347.044,0.444,67,15],[347.044,0.065,99,10],[347.322,0.444,72,10],[347.322,0.03,99,11],[347.322,0.055,50,29],[347.382,0.16,39,27],[347.382,0.14,51,16],[348.155,0.03,99,9],[348.155,0.055,50,23],[348.155,6.333,65,43],[348.215,0.16,39,21],[348.215,0.14,51,13],[348.433,0.444,57,17],[348.988,0.055,50,16],[349.048,0.16,39,14],[349.048,0.14,51,9],[349.822,0.444,50,18],[349.822,0.75,67,13],[349.822,0.055,50,9],[349.882,0.16,39,8],[351.21,0.444,69,19],[352.599,0.444,74,18],[353.155,0.5,65,12],[353.71,0.444,67,7],[353.988,0.444,72,14],[355.099,0.444,57,9],[355.377,0.444,60,13],[356.488,0.444,53,11],[356.766,0.444,57,11],[357.877,0.444,72,12],[358.155,0.444,58,9],[359.266,0.444,74,13],[359.544,0.444,77,8],[360.655,0.444,72,14],[362.044,0.444,60,15],[363.433,0.444,53,13],[364.822,0.444,58,23],[366.21,0.444,77,23],[367.599,0.444,76,19],[368.988,0.444,65,16],[370.377,0.444,60,12],[371.766,0.444,62,8],[375.822,0.857,48,44],[375.822,4.071,64,9],[376.893,0.857,48,44],[377.322,0.321,64,25],[377.536,0.27,64,27],[377.536,0.03,83,10],[377.556,0.31,57,14],[377.964,0.857,48,46],[378.232,0.204,67,15],[379.036,0.321,60,27],[379.036,0.857,48,46],[379.679,0.27,64,29],[379.679,0.03,83,10],[379.699,0.31,57,14],[380.107,0.857,45,49],[380.107,4.071,60,9],[380.893,0.321,64,28],[381.179,0.857,45,49],[381.58,0.7,67,13],[381.822,0.27,64,30],[381.822,0.03,83,11],[381.841,0.31,57,15],[382.25,0.857,45,52],[382.679,0.321,60,30],[383.322,0.204,60,17],[383.322,0.857,45,52],[383.964,0.27,64,32],[383.964,0.03,83,11],[383.984,0.31,57,16],[384.393,0.321,53,31],[384.393,0.857,41,54],[384.393,4.071,57,10],[385.464,0.857,41,54],[386.107,0.27,64,34],[386.107,0.03,83,12],[386.127,0.31,57,17],[386.25,0.321,60,48],[386.536,0.857,41,57],[387.339,0.7,65,15],[387.607,0.857,41,57],[388.036,0.321,57,51],[388.25,0.27,64,35],[388.25,0.03,83,12],[388.27,0.31,57,18],[388.411,0.204,53,28],[388.679,0.857,43,59],[388.679,4.071,55,13],[389.08,0.7,62,31],[389.75,0.321,55,53],[389.75,0.857,43,59],[390.393,0.27,64,37],[390.393,0.03,83,13],[390.413,0.31,57,19],[390.822,1.929,48,52],[391.607,0.321,67,49],[392.536,0.161,65,34],[392.964,0.248,48,40],[392.964,3.931,60,47],[393.223,0.035,117,11],[393.352,0.248,55,40],[393.999,0.248,48,40],[394.413,0.31,76,41],[394.62,0.27,64,29],[394.62,0.03,83,10],[394.64,0.31,57,14],[394.775,0.7,76,35],[394.775,0.197,72,29],[394.775,0.248,47,40],[395.033,0.248,48,42],[395.292,0.197,79,31],[395.421,0.7,76,67],[395.421,0.248,55,42],[396.068,0.31,72,55],[396.068,0.248,48,42],[396.688,0.27,64,30],[396.688,0.03,83,11],[396.709,0.31,57,15],[396.844,0.248,44,42],[397.102,0.248,45,44],[397.102,3.931,57,56],[397.49,0.248,52,44],[397.861,0.31,76,58],[397.878,0.035,117,12],[398.137,0.248,45,44],[398.395,0.035,117,12],[398.757,0.27,64,32],[398.757,0.03,83,11],[398.777,0.31,57,16],[398.913,0.248,44,44],[399.171,0.248,45,47],[399.559,0.248,52,47],[399.585,0.31,72,61],[400.206,0.197,72,34],[400.206,0.248,45,47],[400.827,0.27,64,34],[400.827,0.03,83,12],[400.846,0.31,57,17],[400.982,0.248,40,47],[401.24,0.31,65,64],[401.24,0.248,41,49],[401.24,3.931,53,22],[401.628,0.248,48,49],[402.016,0.7,72,19],[402.275,0.248,41,49],[402.533,0.035,117,8],[402.663,0.7,79,36],[402.895,0.27,64,36],[402.895,0.03,83,13],[402.915,0.31,57,18],[403.033,0.31,72,64],[403.051,0.248,40,49],[403.051,0.035,117,14],[403.309,0.248,41,51],[403.568,0.035,117,12],[403.697,0.248,48,51],[404.344,0.248,41,51],[404.757,0.31,69,68],[404.964,0.27,64,37],[404.964,0.03,83,13],[404.984,0.31,57,19],[405.12,0.197,65,38],[405.12,0.248,42,51],[405.378,0.248,43,54],[405.378,3.931,55,10],[405.637,0.197,67,40],[405.766,0.248,50,54],[406.413,0.31,67,72],[406.413,0.248,43,54],[407.033,0.27,64,39],[407.033,0.03,83,14],[407.053,0.31,57,19],[407.188,0.248,47,54],[407.447,1.862,48,55],[408.206,0.31,79,66],[408.223,0.7,76,17],[409.102,0.155,65,46],[409.516,0.24,48,42],[409.516,3.8,67,12],[409.891,0.7,84,21],[409.891,0.24,55,42],[410.516,0.24,48,42],[410.916,0.3,88,48],[411.116,0.27,64,30],[411.116,0.03,83,11],[411.136,0.31,57,15],[411.266,0.19,84,27],[411.266,0.24,47,42],[411.516,0.24,48,44],[411.766,0.19,91,34],[411.891,0.24,55,44],[412.516,0.3,84,61],[412.516,0.24,48,44],[412.766,0.035,117,10],[413.116,0.27,64,32],[413.116,0.03,83,11],[413.136,0.31,57,16],[413.266,0.24,44,44],[413.266,0.035,117,12],[413.516,0.24,45,47],[413.516,3.8,64,57],[413.766,0.035,117,8],[413.891,0.24,52,47],[414.249,0.3,88,64],[414.516,0.24,45,47],[415.116,0.27,64,34],[415.116,0.03,83,12],[415.136,0.31,57,17],[415.266,0.7,91,36],[415.266,0.24,44,47],[415.516,0.24,45,49],[415.891,0.7,86,68],[415.891,0.24,52,49],[415.916,0.3,84,67],[416.516,0.19,84,38],[416.516,0.24,45,49],[417.116,0.27,64,36],[417.116,0.03,83,13],[417.136,0.31,57,18],[417.141,0.27,48,36],[417.141,0.03,83,13],[417.161,0.31,42,18],[417.266,0.24,40,49],[417.516,0.3,77,71],[417.516,0.24,41,52],[417.516,3.8,60,66],[417.766,0.035,117,12],[417.891,0.24,48,52],[418.266,0.035,117,14],[418.516,0.24,41,52],[418.766,0.035,117,8],[419.116,0.27,64,38],[419.116,0.03,83,13],[419.136,0.31,57,19],[419.249,0.3,84,80],[419.266,0.24,40,52],[419.516,0.24,41,54],[419.891,0.24,48,54],[420.516,0.24,41,54],[420.916,0.3,81,84],[421.116,0.27,64,39],[421.116,0.03,83,14],[421.136,0.31,57,20],[421.266,0.19,77,47],[421.266,0.24,42,54],[421.516,0.24,43,57],[421.516,3.8,62,50],[421.766,0.19,79,49],[421.891,0.24,50,57],[422.266,0.7,86,39],[422.516,0.3,79,88],[422.516,0.24,43,57],[422.766,0.035,117,13],[422.891,0.7,95,75],[423.116,0.27,64,41],[423.116,0.03,83,14],[423.136,0.31,57,21],[423.266,0.24,47,57],[423.266,0.035,117,16],[423.516,1.8,48,58],[424.249,0.3,91,81],[425.116,0.15,77,57],[425.516,0.232,48,42],[425.516,3.677,64,10],[425.516,3.677,67,16],[425.879,0.232,55,42],[426.484,0.232,48,42],[426.871,0.29,100,52],[427.065,0.27,64,30],[427.065,0.03,83,11],[427.084,0.31,57,15],[427.21,0.184,96,29],[427.21,0.232,47,42],[427.452,0.232,48,44],[427.452,0.027,117,19],[427.693,0.184,96,31],[427.693,0.045,117,51],[427.815,0.232,55,44],[427.935,0.027,117,41],[428.177,0.045,117,69],[428.419,0.29,96,55],[428.419,0.232,48,44],[428.419,0.027,117,40],[428.661,0.045,117,48],[428.903,0.027,117,17],[429,0.27,64,32],[429,0.03,83,11],[429.02,0.31,57,16],[429.145,0.232,44,44],[429.387,0.232,45,47],[429.387,3.677,60,29],[429.75,0.7,100,43],[429.75,0.232,52,47],[430.097,0.29,100,58],[430.355,0.232,45,47],[430.935,0.27,64,34],[430.935,0.03,83,12],[430.955,0.31,57,17],[431.081,0.232,44,47],[431.323,0.232,45,49],[431.497,0.4,106,9],[431.685,0.232,52,49],[431.71,0.29,96,61],[432.29,0.184,96,34],[432.29,0.232,45,49],[432.29,0.027,117,10],[432.532,0.045,117,43],[432.774,0.027,117,40],[432.871,0.27,64,36],[432.871,0.03,83,13],[432.891,0.31,57,18],[432.895,0.27,48,36],[432.895,0.03,83,13],[432.915,0.31,42,18],[433.016,0.232,40,49],[433.016,0.045,117,75],[433.258,0.29,89,65],[433.258,0.232,41,52],[433.258,3.677,57,46],[433.258,0.027,117,50],[433.5,0.045,117,69],[433.621,0.232,48,52],[433.742,0.027,117,31],[433.984,0.045,117,21],[434.226,0.232,41,52],[434.806,0.27,64,38],[434.806,0.03,83,13],[434.826,0.31,57,19],[434.935,0.29,96,55],[434.952,0.232,40,52],[435.193,0.232,41,54],[435.556,0.7,101,48],[435.556,0.232,48,54],[436.161,0.232,41,54],[436.548,0.29,93,58],[436.742,0.27,64,39],[436.742,0.03,83,14],[436.762,0.31,57,20],[436.887,0.184,89,32],[436.887,0.232,42,54],[437.129,0.232,43,57],[437.129,3.677,59,53],[437.371,0.184,91,34],[437.371,0.045,117,29],[437.492,0.232,50,57],[437.613,0.027,117,37],[437.855,0.045,117,78],[438.097,0.29,91,60],[438.097,0.232,43,57],[438.097,0.027,117,55],[438.339,0.045,117,85],[438.581,0.027,117,44],[438.677,0.27,64,41],[438.677,0.03,83,14],[438.697,0.31,57,21],[438.823,0.232,47,57],[438.823,0.045,117,44],[439.065,1.742,48,58],[439.774,0.29,103,56],[439.79,0.218,67,79],[441,3.8,62,16],[441.733,0.3,69,29],[441.75,0.7,62,8],[441.75,0.21,50,55],[442,0.21,50,55],[442.733,0.3,69,29],[442.75,0.7,66,8],[442.75,0.21,50,55],[443,0.21,50,58],[443.375,0.7,66,15],[443.4,0.3,66,31],[443.75,0.21,50,58],[444,0.3,62,31],[444,0.21,50,58],[444.733,0.3,69,31],[444.75,0.21,50,58],[445,0.21,47,61],[445,3.8,62,8],[445.75,0.21,47,61],[446,0.21,47,61],[446.75,0.21,47,61],[447,0.21,47,65],[447.75,0.21,47,65],[447.75,0.23,62,75],[448,0.21,47,65],[448,0.92,59,75],[448.75,0.21,47,65],[449,0.21,43,68],[449,3.8,55,14],[449,0.46,62,83],[449.5,0.46,67,83],[449.75,0.21,43,68],[450,0.21,43,68],[450.75,0.21,43,68],[451,0.21,43,71],[451.75,0.21,43,71],[452,0.21,43,71],[452.4,0.3,59,38],[452.75,0.21,43,71],[453,0.3,57,40],[453,0.21,45,75],[453,3.8,57,23],[453.733,0.3,64,40],[453.75,0.7,64,11],[453.75,0.21,45,75],[454,0.21,45,75],[454.4,0.3,61,40],[454.75,0.7,73,11],[454.75,0.21,45,75],[455,0.21,50,69],[455.375,0.7,66,20],[455.4,0.3,66,37],[455.75,0.21,50,69],[456,0.3,62,37],[456,0.21,50,69],[456.733,0.3,69,37],[456.75,0.21,50,69],[457,0.21,50,58],[457,3.8,62,19],[457.375,0.7,62,15],[457.75,0.21,50,58],[458,0.21,50,58],[458.75,0.21,50,58],[459,0.21,50,61],[459.75,0.21,50,61],[460,0.21,50,61],[460,0.92,62,70],[460.75,0.21,50,61],[461,0.21,47,65],[461,3.8,59,17],[461,0.46,66,79],[461.5,0.23,69,79],[461.75,0.21,47,65],[461.75,0.23,71,79],[462,0.21,47,65],[462,0.46,69,79],[462.75,0.21,47,65],[463,0.21,47,68],[463.25,0.414,52,26],[463.75,0.21,47,68],[464,0.21,47,68],[464.75,0.21,47,68],[465,0.3,55,38],[465,0.21,43,72],[465,3.8,55,9],[465.733,0.3,62,38],[465.75,0.7,62,10],[465.75,0.21,43,72],[466,0.21,43,72],[466.4,0.3,59,38],[466.75,0.7,69,10],[466.75,0.21,43,72],[467,0.3,55,40],[467,0.21,43,75],[467.4,0.3,59,40],[467.75,0.7,67,10],[467.75,0.21,43,75],[468,0.3,55,40],[468,0.21,43,75],[468.733,0.3,62,40],[468.75,0.21,43,75],[469,0.21,45,79],[469,3.8,64,16],[469.375,0.7,64,29],[469.4,0.3,61,59],[469.75,0.21,45,79],[470,0.21,45,79],[470.75,0.21,45,79],[471,0.21,50,73],[471.75,0.21,50,73],[472,0.21,50,73],[472.75,0.21,50,73],[473,0.207,50,58],[473,3.738,69,18],[473,0.453,62,107],[473,0.027,117,40],[473.246,0.045,117,64],[473.492,0.226,66,107],[473.492,0.027,117,35],[473.738,0.207,50,58],[473.738,0.226,69,107],[473.738,0.045,117,40],[473.984,0.207,50,58],[473.984,0.679,66,107],[473.984,0.027,117,11],[474.721,0.207,50,58],[474.721,0.226,64,107],[474.967,0.207,50,61],[475.705,0.207,50,61],[475.951,0.207,50,61],[476.688,0.207,50,61],[476.934,0.207,47,65],[476.934,3.738,66,21],[477.426,0.027,117,19],[477.656,0.295,66,48],[477.672,0.207,47,65],[477.672,0.045,117,53],[477.918,0.207,47,65],[477.918,0.027,117,43],[478.164,0.045,117,73],[478.312,0.295,62,48],[478.41,0.027,117,42],[478.656,0.7,69,13],[478.656,0.207,47,65],[478.656,0.045,117,51],[478.902,0.295,59,51],[478.902,0.207,47,68],[478.902,0.027,117,19],[479.623,0.295,66,51],[479.639,0.7,64,13],[479.639,0.207,47,68],[479.885,0.295,59,51],[479.885,0.207,47,68],[480.606,0.295,66,51],[480.623,0.207,47,68],[480.869,0.207,43,72],[480.869,3.738,62,19],[481.238,0.7,62,27],[481.262,0.295,59,54],[481.606,0.207,43,72],[481.852,0.295,55,54],[481.852,0.207,43,72],[482.221,0.7,69,27],[482.344,0.027,117,15],[482.59,0.207,43,72],[482.59,0.045,117,51],[482.836,0.207,43,75],[482.836,0.027,117,47],[483.082,0.045,117,84],[483.328,0.027,117,51],[483.574,0.207,43,75],[483.574,0.045,117,67],[483.82,0.207,43,75],[483.82,0.027,117,27],[484.066,0.045,117,12],[484.557,0.207,43,75],[484.803,0.207,45,79],[484.803,3.738,64,11],[484.803,0.453,64,146],[485.295,0.226,66,146],[485.541,0.207,45,79],[485.541,0.226,69,146],[485.787,0.207,45,79],[485.787,0.679,73,146],[486.525,0.207,45,79],[486.525,0.226,69,146],[486.771,0.207,50,73],[486.771,0.453,66,146],[487.262,0.027,117,9],[487.508,0.207,50,73],[487.508,0.045,117,43],[487.754,0.207,50,73],[487.754,0.027,117,42],[488,0.045,117,79],[488.246,0.027,117,51],[488.492,0.207,50,73],[488.492,0.045,117,71],[488.738,0.203,50,61],[488.738,3.677,66,12],[488.738,0.027,117,26],[488.98,0.045,117,19],[489.464,0.203,50,61],[489.705,0.203,50,61],[490.092,0.29,66,45],[490.431,0.203,50,60],[490.673,0.29,62,48],[490.673,0.203,50,64],[491.06,0.29,66,11],[491.157,0.11,98,26],[491.157,0.095,54,29],[491.383,0.29,69,45],[491.399,0.7,78,11],[491.399,0.203,50,60],[491.641,0.29,62,21],[491.641,0.203,50,58],[491.883,0.045,117,10],[492.028,0.29,66,38],[492.125,0.11,98,62],[492.125,0.095,54,70],[492.125,0.027,117,28],[492.351,0.29,69,32],[492.367,0.203,50,42],[492.367,0.045,117,67],[492.609,0.203,47,35],[492.609,3.677,62,19],[492.609,0.027,117,48],[492.851,0.045,117,57],[492.996,0.29,62,12],[493.092,0.11,98,100],[493.092,0.095,54,113],[493.092,0.027,117,12],[493.334,0.223,71,9],[493.576,0.445,69,40],[494.06,0.11,98,65],[494.06,0.095,54,73],[494.06,0.445,66,97],[494.544,0.668,76,126],[495.028,0.027,117,23],[495.254,0.29,66,46],[495.27,0.045,117,76],[495.512,0.03,99,80],[495.512,0.055,50,213],[495.512,0.027,117,45],[495.572,0.16,39,201],[495.572,0.14,51,120],[495.754,0.045,117,21],[495.899,0.29,62,32],[496.222,0.29,66,39],[496.238,0.03,99,20],[496.238,0.055,50,53],[496.298,0.16,39,25],[496.298,0.14,51,15],[496.48,0.203,43,14],[496.48,3.677,59,23],[496.48,3.677,62,15],[496.842,0.7,62,10],[496.867,0.29,59,19],[497.205,0.203,43,50],[497.205,0.045,117,34],[497.447,0.203,43,32],[497.447,0.223,69,94],[497.447,0.027,117,53],[497.689,0.045,117,58],[497.834,0.29,59,15],[497.931,0.11,98,92],[497.931,0.095,54,104],[498.173,0.7,69,11],[498.415,0.29,55,41],[498.415,0.03,99,32],[498.415,0.055,50,84],[498.475,0.16,39,113],[498.475,0.14,51,68],[498.657,0.267,67,16],[498.778,0.7,79,21],[498.802,0.29,59,44],[499.141,0.045,117,69],[499.383,0.89,74,14],[499.383,0.027,117,50],[500.109,0.203,43,37],[500.351,0.29,57,46],[500.351,3.677,57,74],[500.714,0.7,64,22],[500.738,0.29,61,46],[500.834,0.027,117,55],[501.076,0.045,117,60],[501.318,0.03,99,89],[501.318,0.055,50,238],[501.318,0.668,73,46],[501.378,0.16,39,205],[501.378,0.14,51,123],[502.044,0.203,45,56],[502.044,0.223,69,44],[502.286,0.29,62,35],[502.286,0.203,50,43],[502.286,0.027,117,40],[502.528,0.045,117,73],[502.649,0.7,78,21],[502.673,0.29,66,38],[502.77,0.11,98,74],[502.77,0.095,54,84],[503.254,0.03,99,77],[503.254,0.055,50,205],[503.254,0.89,74,155],[503.314,0.16,39,208],[503.314,0.14,51,125],[503.496,0.534,62,16],[503.738,0.027,117,36],[503.98,0.203,50,36],[503.98,0.045,117,77],[504.222,0.29,62,34],[504.222,0.203,50,43],[504.222,3.677,66,24],[504.584,0.7,62,17],[504.609,0.29,66,34],[504.705,0.11,98,86],[504.705,0.095,54,96],[504.947,0.223,69,121],[505.189,0.03,99,38],[505.189,0.055,50,102],[505.189,0.668,66,105],[505.189,0.027,117,26],[505.249,0.16,39,125],[505.249,0.14,51,75],[505.431,0.045,117,63],[505.576,0.29,66,16],[505.915,0.7,66,9],[505.915,0.203,50,8],[506.157,0.29,62,17],[506.157,0.203,50,40],[506.52,0.7,78,12],[506.544,0.29,66,22],[506.641,0.11,98,92],[506.641,0.095,54,103],[506.641,0.027,117,20],[506.883,0.045,117,71],[507.125,0.89,74,126],[507.125,0.027,117,9],[507.185,0.16,39,13],[507.185,0.14,51,8],[507.512,0.29,66,34],[507.834,0.29,69,25],[508.092,3.677,62,66],[508.334,0.045,117,69],[508.48,0.29,62,9],[508.576,0.095,54,7],[508.576,0.223,69,9],[508.576,0.027,117,36],[508.818,0.203,47,32],[508.818,0.223,71,106],[509.06,0.445,69,143],[509.544,0.11,98,9],[509.544,0.095,54,10],[509.544,0.445,66,12],[509.77,0.29,66,21],[510.028,0.29,59,10],[510.028,0.03,99,78],[510.028,0.055,50,207],[510.028,0.027,117,45],[510.088,0.16,39,200],[510.088,0.14,51,120],[510.27,0.045,117,67],[510.391,0.7,76,14],[510.415,0.29,62,28],[510.754,0.223,74,16],[510.996,0.203,47,34],[510.996,0.89,71,95],[511.48,0.11,98,33],[511.48,0.095,54,37],[511.722,0.203,47,33],[511.722,0.045,117,14],[511.964,0.203,43,10],[511.964,3.677,55,48],[511.964,0.445,62,28],[511.964,0.027,117,47],[512.205,0.045,117,78],[512.351,0.29,59,24],[512.447,0.11,98,78],[512.447,0.095,54,88],[512.447,0.027,117,16],[512.673,0.29,62,14],[512.689,0.7,62,11],[512.931,0.29,55,42],[512.931,0.03,99,12],[512.931,0.055,50,31],[512.991,0.16,39,51],[512.991,0.14,51,30],[513.294,0.7,69,15],[513.641,0.29,62,11],[513.899,0.03,99,88],[513.899,0.055,50,235],[513.899,0.445,79,16],[513.959,0.16,39,217],[513.959,0.14,51,130],[514.141,0.045,117,35],[514.383,0.223,78,107],[514.383,0.027,117,50],[514.625,0.223,76,135],[514.625,0.134,66,17],[514.625,0.045,117,87],[514.867,0.03,99,24],[514.867,0.055,50,65],[514.867,0.89,74,44],[514.867,0.134,64,9],[514.867,0.027,117,38],[514.927,0.16,39,48],[514.927,0.14,51,29],[515.109,0.045,117,10],[515.592,0.203,43,21],[515.835,0.29,57,25],[515.835,0.203,45,32],[515.835,3.677,57,42],[516.544,0.29,64,39],[516.56,0.7,64,10],[516.56,0.203,45,50],[516.802,0.203,45,53],[517.189,0.29,61,44],[517.512,0.29,64,46],[517.528,0.7,73,12],[517.528,0.203,45,57],[517.528,0.045,117,35],[517.77,0.203,50,53],[517.77,0.027,117,40],[518.012,0.045,117,81],[518.133,0.7,78,23],[518.157,0.29,66,43],[518.254,0.027,117,54],[518.496,0.203,50,54],[518.496,0.045,117,75],[518.738,0.29,62,43],[518.738,0.203,50,54],[518.738,0.027,117,34],[518.98,0.045,117,24],[519.447,0.29,69,43],[519.463,0.203,50,54],[519.705,0.207,50,41],[519.705,3.738,62,50],[520.074,0.7,62,16],[520.443,0.207,50,41],[520.689,0.207,50,41],[521.427,0.207,50,41],[521.673,0.207,50,43],[522.41,0.207,50,43],[522.41,0.045,117,27],[522.656,0.207,50,43],[522.656,0.905,62,121],[522.656,0.027,117,31],[522.902,0.045,117,63],[523.148,0.027,117,43],[523.394,0.207,50,43],[523.394,0.045,117,64],[523.64,0.207,47,46],[523.64,3.738,59,34],[523.64,0.453,66,136],[523.64,0.027,117,33],[523.886,0.045,117,30],[524.132,0.226,69,109],[524.378,0.207,47,46],[524.378,0.226,71,109],[524.624,0.207,47,46],[524.624,0.453,69,109],[525.361,0.207,47,46],[525.607,0.207,47,48],[526.345,0.207,47,48],[526.591,0.207,47,48],[527.328,0.207,47,48],[527.328,0.045,117,20],[527.574,0.295,55,46],[527.574,0.207,43,51],[527.574,3.738,62,31],[527.574,0.027,117,31],[527.82,0.045,117,69],[528.066,0.027,117,50],[528.296,0.295,62,46],[528.312,0.7,62,12],[528.312,0.207,43,51],[528.312,0.045,117,78],[528.558,0.207,43,51],[528.558,0.027,117,41],[528.804,0.045,117,42],[528.951,0.295,59,46],[529.05,0.027,117,8],[529.296,0.7,69,12],[529.296,0.207,43,51],[529.542,0.295,55,49],[529.542,0.207,43,53],[529.935,0.295,59,49],[530.279,0.7,67,12],[530.279,0.207,43,53],[530.525,0.295,55,49],[530.525,0.207,43,53],[531.246,0.295,62,49],[531.263,0.207,43,53],[531.509,0.207,45,56],[531.509,3.738,64,64],[531.878,0.7,64,25],[531.902,0.295,61,51],[532.246,0.207,45,56],[532.246,0.045,117,12],[532.492,0.207,45,56],[532.492,0.027,117,28],[532.738,0.045,117,70],[532.984,0.027,117,54],[533.23,0.207,45,56],[533.23,0.045,117,88],[533.476,0.207,50,51],[533.476,0.027,117,45],[533.722,0.045,117,51],[533.968,0.027,117,15],[534.214,0.207,50,51],[534.46,0.207,50,51],[535.197,0.207,50,51],[535.443,0.214,50,41],[535.443,3.864,69,56],[535.443,0.468,62,97],[535.952,0.234,66,97],[536.206,0.214,50,41],[536.206,0.234,69,97],[536.46,0.214,50,41],[536.46,0.702,66,97],[537.223,0.214,50,41],[537.223,0.234,64,97],[537.477,0.214,50,43],[538.24,0.214,50,43],[538.494,0.214,50,43],[539.257,0.214,50,43],[539.511,0.214,47,46],[539.511,3.864,66,57],[540.257,0.305,66,42],[540.274,0.214,47,46],[540.528,0.214,47,46],[540.935,0.305,62,42],[541.291,0.214,47,46],[541.545,0.305,59,44],[541.545,0.214,47,48],[542.308,0.214,47,48],[542.562,0.305,59,44],[542.562,0.214,47,48],[543.308,0.305,66,44],[543.324,0.214,47,48],[543.579,0.214,43,51],[543.579,3.864,62,38],[543.96,0.7,62,23],[543.986,0.305,59,46],[544.341,0.214,43,51],[544.596,0.305,55,46],[544.596,0.214,43,51],[544.977,0.7,69,23],[545.358,0.214,43,51],[545.613,0.214,43,53],[546.375,0.214,43,53],[546.63,0.214,43,53],[547.392,0.214,43,53],[547.646,4.068,74,55],[547.646,0.214,45,56],[547.646,4.068,50,41],[547.646,3.864,61,35],[547.646,0.468,64,132],[548.155,0.234,66,132],[548.409,0.214,45,56],[548.409,0.234,69,132],[548.663,0.214,45,56],[548.663,0.702,73,132],[549.426,0.214,45,56],[549.426,0.234,69,132],[549.68,0.214,50,51],[549.68,0.468,66,132],[550.443,0.214,50,51],[550.697,0.214,50,51],[551.46,0.214,50,51],[558.633,0.193,71,29],[559.769,0.58,79,30],[560.678,0.773,74,30],[565.905,0.193,71,22],[567.042,0.58,79,22],[567.951,0.773,74,22],[568.86,0.58,67,16],[568.86,0.227,43,58],[569.542,0.193,67,22],[569.769,0.773,67,22],[569.769,0.227,50,52],[570.678,0.58,67,22],[570.678,0.227,43,58],[571.36,0.193,67,22],[571.587,0.773,67,22],[571.587,0.227,50,52],[572.496,0.58,67,22],[572.496,0.227,43,58],[573.178,0.193,67,16],[573.405,0.773,67,16],[573.405,0.227,50,52],[574.314,0.58,67,16],[574.314,0.227,43,58],[574.996,0.193,67,16],[575.223,0.773,67,16],[575.223,0.227,50,52],[576.133,0.58,67,16],[576.133,0.227,43,58],[576.814,0.193,67,16],[577.042,0.773,67,24],[577.042,0.227,50,52],[577.951,0.58,67,24],[577.951,0.227,43,58],[578.633,0.193,67,24],[578.86,0.773,67,24],[578.86,0.227,50,52],[579.769,0.58,67,24],[579.769,0.227,43,58],[580.451,0.193,67,24],[580.678,0.773,67,24],[580.678,0.227,50,52],[581.587,0.58,67,29],[581.587,0.227,43,58],[582.269,0.193,67,29],[582.496,0.773,67,29],[582.496,0.227,50,52],[587.723,0.193,83,41],[588.86,0.58,91,41],[589.769,0.773,86,41],[590.678,0.159,79,54],[590.678,0.159,43,69],[592.437,0.277,48,21],[592.437,4.385,67,22],[592.726,0.035,117,8],[592.87,0.277,55,21],[593.302,0.035,117,11],[593.591,0.346,72,23],[593.591,0.277,48,21],[594.283,0.27,64,27],[594.283,0.03,83,9],[594.303,0.31,57,14],[594.456,0.219,72,13],[594.456,0.277,47,21],[594.745,0.277,48,22],[595.033,0.219,79,13],[595.177,0.7,76,11],[595.177,0.277,55,22],[595.591,0.346,79,23],[595.899,0.277,48,21],[596.476,0.07,98,9],[596.591,0.27,64,25],[596.591,0.03,83,9],[596.611,0.31,57,13],[596.764,0.277,44,19],[597.052,0.346,69,16],[597.052,0.277,45,19],[597.052,4.385,64,19],[597.341,0.035,117,10],[597.485,0.277,52,16],[597.514,0.346,72,17],[597.629,0.07,98,17],[597.745,0.27,64,25],[597.745,0.03,83,9],[597.765,0.31,57,13],[597.918,0.035,117,9],[598.206,0.277,45,10],[598.783,0.07,98,22],[599.052,0.346,76,25],[599.937,0.07,98,19],[600.052,0.27,64,25],[600.052,0.03,83,9],[600.072,0.31,57,12],[600.514,0.346,69,22],[600.802,0.035,117,7],[601.379,0.035,117,12],[601.668,0.27,48,11],[601.668,0.055,50,12],[601.668,4.385,53,13],[601.728,0.16,39,13],[601.728,0.14,51,8],[602.129,0.346,69,15],[602.514,0.346,72,18],[602.822,0.219,69,7],[602.822,0.27,48,43],[602.822,0.03,83,15],[602.822,0.03,99,16],[602.822,0.055,50,44],[602.842,0.31,42,22],[602.882,0.16,39,42],[602.882,0.14,51,25],[603.687,0.219,65,15],[603.976,0.346,65,28],[603.976,0.27,48,48],[603.976,0.03,83,17],[603.976,0.03,99,17],[603.976,0.055,50,47],[603.995,0.31,42,24],[604.035,0.16,39,43],[604.035,0.14,51,26],[604.264,0.219,72,14],[604.264,0.035,117,9],[604.408,0.7,77,8],[604.841,0.035,117,13],[605.129,0.219,69,15],[605.129,0.27,48,22],[605.129,0.03,83,8],[605.129,0.03,99,8],[605.129,0.055,50,22],[605.149,0.31,42,11],[605.189,0.16,39,19],[605.189,0.14,51,11],[605.591,0.346,69,29],[606.283,0.277,43,9],[606.283,4.385,62,33],[606.716,0.277,50,17],[607.129,0.346,74,18],[607.437,0.346,67,22],[607.437,0.277,43,27],[608.129,0.27,64,32],[608.129,0.03,83,11],[608.149,0.31,57,16],[608.302,0.277,47,34],[608.302,0.035,117,14],[608.591,2.077,48,37],[609.052,0.346,76,27],[609.456,0.7,76,8],[610.437,0.173,65,20],[610.899,4.56,64,18],[612.819,0.27,64,26],[612.819,0.03,83,9],[612.839,0.31,57,13],[614.499,0.228,76,16],[615.219,0.27,64,27],[615.219,0.03,83,10],[615.239,0.31,57,14],[615.699,4.56,60,26],[616.599,0.7,76,8],[617.349,0.7,79,15],[617.619,0.27,64,29],[617.619,0.03,83,10],[617.639,0.31,57,14],[620.019,0.27,64,30],[620.019,0.03,83,11],[620.039,0.31,57,15],[620.199,0.228,76,18],[620.499,0.36,65,33],[620.499,4.56,57,18],[621.379,0.36,72,33],[622.179,0.36,69,33],[622.419,0.27,64,32],[622.419,0.03,83,11],[622.439,0.31,57,16],[622.899,0.36,65,35],[623.779,0.36,72,35],[623.799,0.7,77,9],[624.579,0.36,69,35],[624.819,0.27,64,33],[624.819,0.03,83,12],[624.839,0.31,57,17],[625.299,0.36,67,37],[625.299,4.56,59,8],[625.749,0.7,74,18],[626.179,0.36,74,37],[626.979,0.36,71,37],[627.219,0.27,64,35],[627.219,0.03,83,12],[627.239,0.31,57,17],[627.699,0.36,72,34],[628.579,0.36,79,34],[629.379,0.18,64,24],[630.099,4.75,60,11],[632.099,0.27,64,23],[632.099,0.03,83,8],[632.119,0.31,57,11],[634.599,0.27,64,24],[634.599,0.03,83,8],[634.619,0.31,57,12],[635.099,4.75,57,17],[635.567,0.7,76,13],[637.099,0.27,64,25],[637.099,0.03,83,9],[637.119,0.31,57,13],[639.599,0.27,64,27],[639.599,0.03,83,9],[639.619,0.31,57,13],[640.099,4.75,53,16],[642.099,0.27,64,28],[642.099,0.03,83,10],[642.119,0.31,57,14],[643.067,0.7,77,15],[644.599,0.27,64,30],[644.599,0.03,83,10],[644.619,0.31,57,15],[645.099,4.75,55,8],[647.099,0.27,64,31],[647.099,0.03,83,11],[647.119,0.31,57,15],[649.599,0.188,65,21],[650.577,0.7,72,11],[658.237,0.7,74,12],[667.173,0.7,83,13],[669.758,0.192,64,17],[690.872,0.196,65,16],[721.212,2.4,76,39],[771.412,0.27,48,65],[771.412,0.03,83,23],[771.432,0.31,42,32]],[[36.325,0.427,74,169],[43.24,0.333,76,199],[46.2,0.666,74,199],[51.02,0.756,76,199],[55.5,0.396,72,199],[57.26,0.396,76,177],[60.26,0.15,67,173],[60.42,0.36,72,22],[61.62,0.36,72,22],[62.82,0.36,72,23],[64.02,0.36,72,23],[65.22,0.36,69,24],[66.42,0.36,69,24],[67.62,0.36,69,25],[68.82,0.36,69,25],[70.02,0.36,65,22],[71.22,0.36,65,22],[72.42,0.36,65,23],[73.62,0.36,65,23],[74.82,0.36,67,24],[76.02,0.36,67,24],[77.22,0.36,72,22],[79.38,0.18,67,22],[79.62,0.353,72,29],[80.796,0.353,72,29],[81.973,0.353,72,31],[83.149,0.353,72,31],[84.326,0.353,69,32],[85.502,0.353,69,32],[86.679,0.353,69,23],[86.973,0.224,69,13],[87.855,0.353,69,23],[92.561,0.224,69,14],[98.208,0.176,67,31],[98.444,0.346,72,39],[98.732,0.035,117,8],[99.309,0.035,117,10],[99.597,0.346,72,39],[99.597,0.219,76,22],[100.751,0.346,72,20],[101.184,0.7,76,9],[101.905,0.346,72,20],[103.059,0.346,69,21],[103.924,0.035,117,11],[104.213,0.346,69,21],[104.501,0.035,117,10],[105.078,0.219,76,12],[105.367,0.346,69,22],[105.655,0.219,69,13],[106.52,0.346,69,35],[108.54,0.035,117,7],[109.117,0.035,117,13],[109.261,0.7,79,18],[109.694,0.035,117,9],[111.136,0.219,69,21],[113.732,0.035,117,11],[114.309,0.035,117,14],[116.674,0.173,67,19],[117.814,0.227,57,10],[117.814,0.227,60,10],[117.814,0.227,64,10],[119.178,0.227,57,10],[119.178,0.227,60,10],[119.178,0.227,64,10],[120.541,0.227,62,10],[120.541,0.227,65,10],[120.541,0.227,69,10],[121.905,0.227,64,10],[121.905,0.227,68,10],[121.905,0.227,71,10],[123.269,0.227,57,10],[123.269,0.227,60,10],[123.269,0.227,64,10],[124.632,0.227,65,10],[124.632,0.227,69,10],[124.632,0.227,72,10],[125.996,0.227,62,10],[125.996,0.227,65,10],[125.996,0.227,69,10],[127.36,0.227,64,10],[127.36,0.227,68,10],[127.36,0.227,71,10],[128.723,0.227,57,10],[128.723,0.227,60,10],[128.723,0.227,64,10],[130.087,0.227,57,10],[130.087,0.227,60,10],[130.087,0.227,64,10],[131.451,0.227,62,10],[131.451,0.227,65,10],[131.451,0.227,69,10],[132.814,0.227,64,10],[132.814,0.227,68,10],[132.814,0.227,71,10],[134.178,0.227,57,10],[134.178,0.227,60,10],[134.178,0.227,64,10],[135.541,0.227,65,9],[135.541,0.227,69,9],[135.541,0.227,72,9],[136.905,0.227,64,9],[136.905,0.227,68,9],[136.905,0.227,71,9],[138.269,0.227,57,9],[138.269,0.227,60,9],[138.269,0.227,64,9],[138.723,0.045,111,17],[138.951,0.191,72,10],[139.405,0.045,111,14],[139.632,0.227,57,9],[139.632,0.227,60,9],[139.632,0.227,64,9],[140.996,0.227,57,9],[140.996,0.227,60,9],[140.996,0.227,64,9],[142.36,0.227,62,9],[142.36,0.227,65,9],[142.36,0.227,69,9],[142.36,0.409,79,26],[143.496,0.045,111,8],[143.723,0.227,64,9],[143.723,0.227,68,9],[143.723,0.227,71,9],[143.723,0.191,83,10],[144.178,0.045,111,22],[145.087,0.227,57,11],[145.087,0.227,60,11],[145.087,0.227,64,11],[145.769,0.191,77,12],[146.451,0.227,65,11],[146.451,0.227,69,11],[146.451,0.227,72,11],[146.451,0.409,76,31],[147.814,0.227,62,11],[147.814,0.227,65,11],[147.814,0.227,69,11],[148.951,0.045,111,14],[149.178,0.227,64,11],[149.178,0.227,68,11],[149.178,0.227,71,11],[149.632,0.045,111,16],[150.541,0.227,57,11],[150.541,0.227,60,11],[150.541,0.227,64,11],[150.541,0.409,77,33],[150.541,0.191,72,12],[151.905,0.227,57,11],[151.905,0.227,60,11],[151.905,0.227,64,11],[152.587,0.191,81,12],[153.269,0.227,62,11],[153.269,0.227,65,11],[153.269,0.227,69,11],[153.723,0.045,111,17],[154.405,0.045,111,14],[154.632,0.227,64,13],[154.632,0.227,68,13],[154.632,0.227,71,13],[155.087,0.818,74,38],[155.996,0.227,57,13],[155.996,0.227,60,13],[155.996,0.227,64,13],[157.36,0.227,65,13],[157.36,0.227,69,13],[157.36,0.227,72,13],[157.36,0.191,77,14],[158.269,0.409,72,38],[158.496,0.045,111,8],[158.723,0.227,64,13],[158.723,0.227,68,13],[158.723,0.227,71,13],[159.178,0.045,111,22],[159.405,0.191,72,14],[160.087,0.227,57,13],[160.087,0.227,60,13],[160.087,0.227,64,13],[161.451,0.227,57,15],[161.451,0.227,60,15],[161.451,0.227,64,15],[161.905,1.227,73,14],[162.814,0.227,57,17],[162.814,0.227,60,17],[162.814,0.227,64,17],[163.951,0.045,111,14],[164.178,0.227,62,17],[164.178,0.227,65,17],[164.178,0.227,69,17],[164.178,0.191,69,20],[164.632,0.045,111,16],[165.541,0.227,64,17],[165.541,0.227,68,17],[165.541,0.227,71,17],[166.223,0.191,57,20],[166.905,0.227,57,17],[166.905,0.227,60,17],[166.905,0.227,64,17],[166.905,0.409,73,17],[168.269,0.227,65,17],[168.269,0.227,69,17],[168.269,0.227,72,17],[168.723,0.045,111,17],[169.405,0.045,111,14],[169.632,0.227,62,17],[169.632,0.227,65,17],[169.632,0.227,69,17],[170.087,1.227,68,17],[170.996,0.227,64,15],[170.996,0.227,68,15],[170.996,0.227,71,15],[170.996,0.191,68,18],[172.36,0.227,57,15],[172.36,0.227,60,15],[172.36,0.227,64,15],[173.041,0.191,64,18],[173.496,0.045,111,8],[173.723,0.227,57,15],[173.723,0.227,60,15],[173.723,0.227,64,15],[174.178,0.045,111,22],[175.087,0.227,62,15],[175.087,0.227,65,15],[175.087,0.227,69,15],[175.087,0.409,75,16],[176.451,0.227,64,15],[176.451,0.227,68,15],[176.451,0.227,71,15],[177.814,0.227,57,15],[177.814,0.227,60,15],[177.814,0.227,64,15],[177.814,0.191,57,18],[178.951,0.045,111,14],[179.178,0.227,65,15],[179.178,0.227,69,15],[179.178,0.227,72,15],[179.178,0.409,73,16],[179.632,0.045,111,16],[179.86,0.191,68,15],[180.541,0.227,64,13],[180.541,0.227,68,13],[180.541,0.227,71,13],[181.905,0.227,57,13],[181.905,0.227,60,13],[181.905,0.227,64,13],[183.327,0.242,57,12],[183.327,0.242,60,12],[183.327,0.242,64,12],[184.779,0.242,65,12],[184.779,0.242,69,12],[184.779,0.242,72,12],[186.231,0.242,64,12],[186.231,0.242,68,12],[186.231,0.242,71,12],[187.682,0.242,57,12],[187.682,0.242,60,12],[187.682,0.242,64,12],[189.238,0.268,57,12],[189.238,0.268,60,12],[189.238,0.268,64,12],[190.845,0.268,65,12],[190.845,0.268,69,12],[190.845,0.268,72,12],[192.452,0.268,64,12],[192.452,0.268,68,12],[192.452,0.268,71,12],[192.988,1.607,69,28],[194.059,0.268,57,12],[194.059,0.268,60,12],[194.059,0.268,64,12],[195.195,0.158,65,15],[195.392,0.158,67,15],[196.774,0.158,60,11],[196.971,0.158,58,11],[197.168,0.158,72,15],[197.366,0.158,70,15],[198.747,0.158,69,15],[198.945,0.158,70,15],[200.326,0.158,56,11],[200.524,0.158,55,11],[200.721,0.158,69,15],[200.918,0.158,67,15],[202.3,0.158,72,27],[202.497,0.158,74,27],[203.879,0.158,56,20],[204.076,0.158,58,20],[205.383,0.143,67,20],[205.561,0.143,65,20],[205.74,0.143,76,27],[205.918,0.143,77,27],[207.168,0.143,60,20],[207.347,0.143,62,17],[208.597,0.143,63,17],[208.775,0.143,62,17],[208.954,0.143,76,23],[209.133,0.143,74,23],[210.383,0.143,63,17],[210.383,0.143,65,23],[210.561,0.143,65,17],[210.561,0.143,67,23],[211.811,0.143,60,17],[211.99,0.143,58,17],[212.168,0.143,72,23],[212.347,0.143,70,23],[213.566,0.13,69,34],[213.729,0.13,70,34],[214.87,0.13,56,25],[215.033,0.13,55,25],[215.196,0.13,69,34],[215.359,0.13,67,34],[216.501,0.13,72,34],[216.664,0.13,74,34],[217.805,0.13,56,25],[217.968,0.13,58,25],[219.031,0.114,69,53],[219.528,0.114,74,53],[220.462,0.5,102,108],[223.328,0.143,67,35],[223.506,0.143,65,35],[223.685,0.143,76,47],[223.864,0.143,77,47],[225.114,0.143,60,35],[225.292,0.143,62,35],[226.542,0.143,63,43],[226.721,0.143,62,43],[226.899,0.143,76,57],[227.078,0.143,74,57],[228.328,0.143,63,43],[228.328,0.13,65,57],[228.491,0.13,67,57],[228.506,0.143,65,43],[229.632,0.13,60,43],[229.795,0.13,58,43],[229.958,0.13,72,57],[230.121,0.13,70,57],[231.263,0.13,69,67],[231.426,0.13,70,67],[232.567,0.13,56,50],[232.73,0.13,55,50],[232.893,0.13,69,67],[233.056,0.13,67,67],[234.145,0.12,72,67],[234.295,0.12,74,67],[235.345,0.12,56,50],[235.495,0.12,58,50],[236.545,0.12,67,31],[236.695,0.12,65,31],[236.845,0.12,76,42],[236.995,0.12,77,42],[238.045,0.12,60,31],[238.195,0.12,62,31],[238.873,0.105,69,47],[239.331,0.105,74,47],[240.193,0.5,102,108],[254.574,0.04,99,43],[255.288,0.16,48,49],[255.288,0.03,99,22],[256.717,0.16,48,49],[256.717,0.03,99,22],[267.431,0.25,67,55],[268.86,0.04,99,43],[269.217,0.25,77,46],[269.574,0.16,43,49],[269.574,0.03,99,22],[271.002,0.16,43,49],[271.002,0.03,99,22],[277.431,1.429,75,42],[283.145,0.04,99,43],[283.502,0.16,48,49],[283.502,0.03,99,22],[284.217,0.16,48,49],[284.217,0.03,99,22],[284.931,0.16,48,49],[284.931,0.03,99,22],[285.645,0.16,48,49],[285.645,0.03,99,22],[297.431,1.071,36,58],[301.488,6.333,72,12],[302.599,0.444,69,35],[303.988,0.444,65,35],[305.377,0.444,65,35],[306.766,0.444,64,35],[308.155,0.444,53,35],[308.155,6.333,72,18],[309.544,0.444,72,35],[310.933,0.444,65,35],[312.044,0.444,65,9],[312.322,0.444,70,47],[313.433,0.444,64,12],[313.71,0.444,67,46],[314.822,0.444,53,17],[315.099,0.444,57,45],[316.21,0.444,72,21],[316.488,0.444,53,43],[317.599,0.444,69,26],[317.877,0.444,72,39],[318.988,0.444,70,32],[319.266,0.444,74,35],[320.377,0.444,67,37],[320.655,0.444,72,29],[321.488,6.333,69,16],[321.766,0.444,57,42],[322.044,0.444,60,22],[323.155,0.444,50,28],[323.433,0.444,53,9],[324.544,0.444,69,29],[325.933,0.444,74,29],[327.044,0.444,67,8],[327.322,0.444,72,28],[328.155,6.333,65,8],[328.433,0.444,57,14],[328.71,0.444,60,25],[329.266,0.065,99,10],[329.544,0.065,99,11],[329.822,0.444,53,20],[330.099,0.444,57,21],[330.655,0.5,79,19],[330.933,0.065,99,13],[331.21,0.444,72,25],[331.21,0.065,99,14],[331.488,0.444,58,15],[332.322,0.75,77,9],[332.599,0.444,74,28],[332.599,0.065,99,16],[332.877,0.444,77,7],[332.877,0.065,99,16],[333.71,0.5,81,22],[333.988,0.444,72,26],[334.266,0.065,99,17],[334.544,0.065,99,17],[335.377,0.444,60,26],[335.933,0.065,99,16],[336.21,0.065,99,15],[336.488,0.444,50,12],[336.766,0.444,53,23],[337.599,0.065,99,13],[337.877,0.444,69,18],[337.877,0.25,76,16],[337.877,0.065,99,12],[338.155,0.444,58,19],[338.988,0.75,76,18],[339.266,0.444,74,22],[339.266,0.065,99,9],[339.544,0.444,77,13],[339.544,0.065,99,8],[340.655,0.444,72,25],[342.044,0.444,60,26],[343.155,0.75,69,18],[343.155,0.055,50,11],[343.215,0.16,39,11],[343.433,0.444,57,18],[343.988,0.055,50,19],[344.048,0.16,39,18],[344.048,0.14,51,11],[344.544,0.444,72,8],[344.822,0.444,58,16],[344.822,0.03,99,10],[344.822,0.055,50,27],[344.882,0.16,39,25],[344.882,0.14,51,15],[345.099,0.065,99,9],[345.377,0.065,99,10],[345.655,0.03,99,13],[345.655,0.055,50,33],[345.715,0.16,39,32],[345.715,0.14,51,19],[345.933,0.444,74,12],[346.21,0.444,77,13],[346.488,0.5,67,9],[346.488,0.03,99,15],[346.488,0.055,50,39],[346.548,0.16,39,37],[346.548,0.14,51,22],[346.766,0.065,99,13],[347.044,0.065,99,13],[347.322,0.444,72,15],[347.322,0.03,99,17],[347.322,0.055,50,44],[347.382,0.16,39,42],[347.382,0.14,51,25],[347.599,0.444,76,10],[347.599,0.5,70,11],[348.155,0.03,99,18],[348.155,0.055,50,48],[348.155,6.333,69,39],[348.215,0.16,39,45],[348.215,0.14,51,27],[348.433,0.065,99,15],[348.71,0.444,60,17],[348.71,0.065,99,16],[348.988,0.03,99,19],[348.988,0.055,50,51],[349.048,0.16,39,48],[349.048,0.14,51,29],[349.822,0.03,99,20],[349.822,0.055,50,52],[349.882,0.16,39,49],[349.882,0.14,51,29],[350.099,0.444,53,18],[350.099,0.065,99,17],[350.377,0.065,99,17],[350.655,0.03,99,20],[350.655,0.055,50,53],[350.715,0.16,39,50],[350.715,0.14,51,30],[351.488,0.444,58,18],[351.488,0.75,62,13],[351.488,0.03,99,20],[351.488,0.055,50,53],[351.548,0.16,39,49],[351.548,0.14,51,30],[351.766,0.065,99,16],[352.044,0.065,99,16],[352.322,0.03,99,19],[352.322,0.055,50,52],[352.382,0.16,39,48],[352.382,0.14,51,29],[352.877,0.444,77,18],[353.155,0.03,99,19],[353.155,0.055,50,50],[353.215,0.16,39,47],[353.215,0.14,51,28],[353.433,0.065,99,15],[353.71,0.065,99,15],[353.988,0.03,99,18],[353.988,0.055,50,48],[354.048,0.16,39,45],[354.048,0.14,51,27],[354.266,0.444,76,14],[354.822,1.5,65,9],[354.822,0.03,99,17],[354.822,0.055,50,45],[354.822,6.333,65,16],[354.882,0.16,39,42],[354.882,0.14,51,25],[355.099,0.065,99,14],[355.377,0.444,60,9],[355.377,0.065,99,13],[355.655,0.444,65,12],[355.655,0.03,99,16],[355.655,0.055,50,42],[355.715,0.16,39,39],[355.715,0.14,51,23],[356.488,0.03,99,14],[356.488,0.055,50,38],[356.548,0.16,39,36],[356.548,0.14,51,21],[356.766,0.444,57,11],[356.766,0.065,99,12],[357.044,0.444,60,11],[357.044,0.065,99,11],[357.322,0.03,99,13],[357.322,0.055,50,35],[357.382,0.16,39,33],[357.382,0.14,51,20],[358.155,0.444,58,12],[358.155,0.03,99,12],[358.155,0.055,50,31],[358.215,0.16,39,29],[358.215,0.14,51,18],[358.433,0.444,62,9],[358.433,0.065,99,9],[358.71,0.065,99,9],[358.988,0.03,99,10],[358.988,0.055,50,28],[359.048,0.16,39,26],[359.048,0.14,51,16],[359.544,0.444,77,14],[359.822,0.03,99,9],[359.822,0.055,50,25],[359.882,0.16,39,23],[359.882,0.14,51,14],[360.099,0.065,99,7],[360.655,0.03,99,8],[360.655,0.055,50,21],[360.715,0.16,39,20],[360.715,0.14,51,12],[360.933,0.444,76,14],[361.488,0.055,50,18],[361.548,0.16,39,17],[361.548,0.14,51,10],[362.322,0.444,65,15],[362.322,0.055,50,15],[362.382,0.16,39,14],[362.382,0.14,51,9],[363.155,0.055,50,13],[363.215,0.16,39,12],[363.71,0.444,57,13],[363.988,0.055,50,11],[364.048,0.16,39,10],[364.822,0.055,50,8],[364.882,0.16,39,8],[365.099,0.444,62,23],[366.488,0.444,60,19],[367.877,0.444,79,19],[369.266,0.444,69,16],[370.655,0.444,65,12],[372.044,0.444,65,8],[375.822,0.321,60,25],[376.223,0.7,60,12],[377.679,0.321,67,25],[379.464,0.321,64,27],[381.179,0.321,57,28],[382.518,0.204,57,17],[382.652,0.7,62,13],[383.036,0.321,64,30],[384.393,4.071,57,19],[384.822,0.321,57,31],[386.536,0.321,53,51],[387.607,0.204,57,28],[388.393,0.321,60,51],[388.679,4.071,59,23],[389.482,0.7,62,16],[390.152,0.7,71,31],[390.179,0.321,59,53],[392.75,0.161,67,34],[392.964,0.31,72,41],[392.964,3.931,64,40],[393.74,0.035,117,9],[393.999,0.197,76,23],[394.257,0.035,117,11],[394.757,0.31,79,52],[395.809,0.7,76,35],[396.482,0.31,76,55],[397.102,3.931,57,8],[397.102,3.931,60,21],[397.49,0.7,76,75],[398.137,0.31,69,58],[398.913,0.197,76,32],[398.913,0.035,117,12],[399.43,0.197,69,34],[399.43,0.035,117,12],[399.93,0.31,76,61],[401.24,3.931,53,18],[401.654,0.31,69,64],[403.051,0.7,79,19],[403.309,0.31,65,68],[403.568,0.035,117,9],[403.697,0.7,77,36],[404.085,0.035,117,15],[404.344,0.197,69,38],[404.602,0.035,117,11],[405.102,0.31,72,68],[405.378,3.931,55,29],[406.827,0.31,71,72],[409.309,0.155,67,46],[409.516,0.3,84,48],[409.516,3.8,60,18],[410.266,0.7,84,11],[410.516,0.19,88,27],[410.891,0.7,88,21],[411.249,0.3,91,48],[412.916,0.3,88,61],[413.516,3.8,57,46],[413.766,0.035,117,11],[414.266,0.035,117,13],[414.516,0.3,81,64],[414.766,0.035,117,8],[415.266,0.19,88,36],[415.766,0.19,81,38],[416.249,0.3,88,67],[416.266,0.7,86,36],[417.516,3.8,53,21],[417.516,3.8,60,13],[417.891,0.7,84,75],[417.916,0.3,81,71],[418.766,0.035,117,12],[419.266,0.035,117,14],[419.516,0.3,77,84],[419.766,0.035,117,9],[420.516,0.19,81,47],[421.249,0.3,84,84],[421.516,3.8,62,44],[422.916,0.3,83,88],[423.266,0.7,95,39],[423.891,0.7,88,75],[425.316,0.15,79,57],[425.516,0.29,96,55],[425.516,3.677,67,46],[426.484,0.184,96,29],[427.193,0.29,103,52],[427.626,0.4,106,9],[428.419,0.027,117,17],[428.661,0.045,117,49],[428.806,0.29,100,55],[428.903,0.027,117,40],[429.145,0.045,117,69],[429.387,3.677,64,44],[429.387,0.027,117,43],[429.629,0.045,117,53],[429.871,0.027,117,20],[430.355,0.29,93,58],[430.718,0.7,103,43],[431.081,0.184,96,32],[431.565,0.184,93,34],[432.032,0.29,100,61],[433.258,3.677,60,38],[433.258,0.027,117,8],[433.5,0.045,117,41],[433.645,0.29,93,55],[433.742,0.027,117,41],[433.984,0.045,117,77],[434.226,0.027,117,51],[434.468,0.045,117,71],[434.71,0.027,117,33],[434.952,0.045,117,25],[435.193,0.29,89,58],[436.161,0.184,93,32],[436.871,0.29,96,58],[437.129,3.677,59,8],[437.129,3.677,62,20],[437.492,0.7,98,52],[438.339,0.045,117,25],[438.484,0.29,95,60],[438.581,0.027,117,34],[438.823,0.045,117,76],[440.032,0.218,69,79],[441,0.3,62,29],[441,0.21,50,55],[441,3.8,66,15],[441.5,0.23,66,18],[442.4,0.3,66,29],[443,0.3,62,31],[443.733,0.3,69,31],[443.75,0.7,66,8],[444.4,0.3,66,31],[445,3.8,62,19],[445.375,0.7,66,16],[445.4,0.3,62,33],[446,0.3,59,33],[446.375,0.7,69,16],[446.733,0.3,66,33],[447.375,0.7,64,16],[449,3.8,59,22],[450,0.23,69,83],[450.25,0.23,71,83],[450.5,0.46,69,83],[451,0.46,67,83],[451.5,0.23,66,83],[451.75,0.23,64,83],[452,0.92,62,83],[453,3.8,61,20],[455,0.3,62,37],[455.733,0.3,69,37],[455.75,0.7,66,11],[456.4,0.3,66,37],[457,0.3,62,31],[457,3.8,66,7],[457.4,0.3,66,31],[457.75,0.7,62,8],[458,0.3,62,31],[458.375,0.7,66,15],[458.733,0.3,69,31],[459.375,0.7,66,15],[459.4,0.3,66,33],[461,3.8,59,13],[462.5,0.46,66,79],[463,0.69,64,79],[463.75,0.23,62,79],[464,0.92,59,79],[465,3.8,55,22],[467.733,0.3,62,40],[468.4,0.3,59,40],[469,0.3,57,42],[469,3.8,57,26],[469.733,0.3,64,59],[469.75,0.7,64,16],[470,0.3,57,59],[470.375,0.7,73,29],[470.733,0.3,64,59],[471.375,0.7,66,29],[471.4,0.3,66,54],[472,0.3,62,54],[473,3.738,62,15],[473.246,0.045,117,9],[473.492,0.027,117,21],[473.738,0.045,117,51],[473.984,0.027,117,40],[474.229,0.045,117,64],[474.475,0.027,117,36],[474.721,0.045,117,41],[474.967,0.453,66,107],[474.967,0.027,117,13],[475.459,0.453,64,107],[475.951,0.905,62,107],[476.934,3.738,59,8],[476.934,0.453,66,120],[478.41,0.027,117,18],[478.656,0.045,117,51],[478.902,0.027,117,45],[479.147,0.045,117,76],[479.393,0.027,117,45],[479.639,0.045,117,55],[479.885,0.027,117,20],[480.279,0.295,62,51],[480.869,0.295,55,54],[480.869,3.738,62,14],[481.59,0.295,62,54],[481.606,0.7,62,14],[482.246,0.295,59,54],[482.574,0.295,62,54],[482.59,0.7,69,14],[483.205,0.7,67,27],[483.229,0.295,59,56],[483.328,0.027,117,14],[483.574,0.045,117,51],[483.82,0.295,55,56],[483.82,0.027,117,46],[484.066,0.045,117,83],[484.312,0.027,117,52],[484.541,0.295,62,56],[484.557,0.045,117,68],[484.803,3.738,64,24],[484.803,0.027,117,29],[485.049,0.045,117,15],[487.262,0.453,64,146],[487.508,0.272,52,45],[487.754,0.905,62,146],[488,0.543,50,45],[488.246,0.027,117,7],[488.492,0.045,117,41],[488.738,3.677,69,20],[488.738,0.445,62,113],[488.738,0.027,117,34],[488.98,0.045,117,65],[489.222,0.223,66,113],[489.222,0.027,117,43],[489.464,0.223,69,113],[489.464,0.045,117,60],[489.705,0.668,66,113],[489.705,0.027,117,27],[489.947,0.045,117,20],[490.673,0.203,50,9],[491.383,0.29,69,16],[491.399,0.203,50,22],[491.641,0.203,50,28],[492.028,0.29,66,29],[492.351,0.29,69,36],[492.367,0.203,50,48],[492.609,0.29,59,27],[492.609,0.203,47,58],[492.609,3.677,62,12],[492.609,0.027,117,8],[492.851,0.045,117,51],[492.972,0.7,66,25],[492.996,0.29,62,49],[493.092,0.027,117,47],[493.334,0.203,47,68],[493.334,0.045,117,72],[493.576,0.29,59,48],[493.576,0.203,47,65],[493.576,0.027,117,27],[493.939,0.7,69,19],[494.06,0.11,98,78],[494.06,0.095,54,88],[494.286,0.29,66,20],[494.302,0.203,47,25],[494.786,0.401,64,37],[495.028,0.11,98,83],[495.028,0.095,54,94],[495.27,0.223,74,60],[495.512,0.89,71,9],[495.512,0.027,117,24],[495.754,0.045,117,78],[495.899,0.29,62,24],[495.996,0.027,117,42],[496.238,0.03,99,78],[496.238,0.055,50,207],[496.238,0.045,117,10],[496.298,0.16,39,199],[496.298,0.14,51,120],[496.48,0.29,55,41],[496.48,0.03,99,82],[496.48,0.055,50,218],[496.48,3.677,62,72],[496.54,0.16,39,195],[496.54,0.14,51,117],[496.842,0.7,62,18],[496.867,0.29,59,38],[497.205,0.203,43,18],[497.447,0.203,43,43],[497.447,0.223,69,127],[497.689,0.223,71,158],[497.689,0.045,117,61],[497.931,0.11,98,65],[497.931,0.095,54,73],[497.931,0.445,69,129],[497.931,0.027,117,52],[498.173,0.203,43,16],[498.173,0.045,117,23],[498.415,0.29,55,16],[498.657,0.267,67,28],[499.125,0.29,62,29],[499.141,0.134,66,20],[499.383,0.29,55,44],[499.383,0.03,99,88],[499.383,0.055,50,235],[499.383,0.027,117,24],[499.443,0.16,39,213],[499.443,0.14,51,128],[499.625,0.534,62,21],[499.625,0.045,117,89],[499.867,0.027,117,22],[500.109,0.203,43,42],[500.351,0.203,45,58],[500.351,3.677,61,64],[500.834,0.11,98,122],[500.834,0.095,54,137],[501.06,0.29,64,28],[501.076,0.045,117,70],[501.318,0.29,57,45],[501.318,0.03,99,25],[501.318,0.055,50,66],[501.318,0.027,117,51],[501.378,0.16,39,108],[501.378,0.14,51,65],[502.044,0.223,69,168],[502.286,0.29,62,25],[502.286,0.203,50,32],[502.528,0.045,117,44],[502.649,0.7,78,9],[502.673,0.29,66,21],[502.77,0.11,98,87],[502.77,0.095,54,97],[502.77,0.027,117,52],[503.254,0.29,62,19],[503.98,0.03,99,64],[503.98,0.055,50,172],[503.98,0.045,117,37],[504.04,0.16,39,125],[504.04,0.14,51,75],[504.222,3.677,66,54],[504.222,0.027,117,43],[504.705,0.11,98,30],[504.705,0.095,54,34],[504.947,0.203,50,13],[505.189,0.668,66,72],[505.431,0.045,117,25],[505.673,0.027,117,43],[505.915,0.045,117,14],[506.157,0.29,62,32],[506.157,0.03,99,35],[506.157,0.055,50,92],[506.217,0.16,39,50],[506.217,0.14,51,30],[506.52,0.7,78,13],[506.544,0.29,66,29],[506.883,0.203,50,38],[506.883,0.045,117,10],[507.125,0.027,117,45],[507.367,0.045,117,37],[508.092,0.29,59,38],[508.092,0.03,99,76],[508.092,0.055,50,203],[508.092,3.677,66,30],[508.152,0.16,39,185],[508.152,0.14,51,111],[508.455,0.7,66,18],[508.48,0.29,62,37],[508.576,0.027,117,32],[508.818,0.203,47,36],[508.818,0.045,117,73],[509.06,0.203,47,48],[509.544,0.11,98,101],[509.544,0.095,54,114],[509.544,0.445,66,142],[510.028,0.29,59,39],[510.27,0.045,117,44],[510.391,0.7,76,13],[510.415,0.29,62,29],[510.512,0.027,117,51],[510.754,0.045,117,40],[510.996,0.29,59,30],[510.996,0.03,99,60],[510.996,0.055,50,160],[511.056,0.16,39,129],[511.056,0.14,51,77],[511.722,0.203,47,38],[511.964,0.203,43,52],[511.964,3.677,55,55],[511.964,0.445,62,155],[512.205,0.045,117,33],[512.447,0.11,98,81],[512.447,0.095,54,91],[512.447,0.027,117,51],[512.673,0.29,62,40],[512.689,0.203,43,16],[512.689,0.045,117,73],[512.931,0.027,117,11],[513.294,0.7,69,14],[513.318,0.29,59,30],[513.415,0.11,98,65],[513.415,0.095,54,74],[513.641,0.29,62,41],[513.899,0.03,99,9],[513.899,0.055,50,24],[513.959,0.16,39,41],[513.959,0.14,51,25],[514.141,0.267,67,29],[514.262,0.7,79,18],[514.286,0.29,59,36],[514.625,0.134,66,28],[514.625,0.045,117,17],[514.867,0.03,99,85],[514.867,0.055,50,227],[514.867,0.89,74,152],[514.867,0.134,64,31],[514.867,0.027,117,42],[514.927,0.16,39,216],[514.927,0.14,51,130],[515.109,0.534,62,32],[515.109,0.045,117,88],[515.351,0.027,117,49],[515.592,0.045,117,42],[515.835,0.03,99,78],[515.835,0.055,50,207],[515.835,3.677,61,80],[515.835,0.445,64,145],[515.894,0.16,39,188],[515.894,0.14,51,113],[516.318,0.223,66,109],[516.56,0.223,69,91],[516.802,0.03,99,39],[516.802,0.055,50,105],[516.802,0.668,73,74],[516.862,0.16,39,93],[516.862,0.14,51,56],[517.77,0.29,62,43],[517.77,0.03,99,12],[517.77,0.055,50,31],[517.83,0.16,39,26],[517.83,0.14,51,16],[518.012,0.267,66,35],[518.48,0.29,69,43],[518.496,0.7,78,12],[518.496,0.267,64,35],[518.496,0.045,117,41],[518.738,0.027,117,42],[518.98,0.534,62,35],[518.98,0.045,117,82],[519.125,0.29,66,43],[519.222,0.027,117,54],[519.463,0.045,117,76],[519.705,0.295,62,32],[519.705,3.738,62,26],[519.705,0.027,117,27],[519.951,0.045,117,21],[520.099,0.295,66,32],[520.443,0.7,62,9],[520.689,0.295,62,32],[521.058,0.7,66,16],[521.41,0.295,69,37],[522.042,0.7,66,19],[522.066,0.295,66,40],[523.394,0.045,117,25],[523.64,3.738,59,53],[523.64,0.027,117,32],[523.886,0.045,117,66],[524.132,0.027,117,46],[524.378,0.045,117,68],[524.624,0.027,117,34],[524.869,0.045,117,32],[525.115,0.453,66,109],[525.607,0.679,64,109],[526.345,0.226,62,109],[526.591,0.905,59,109],[527.574,3.738,55,69],[528.312,0.045,117,19],[528.558,0.027,117,30],[528.804,0.045,117,68],[529.05,0.027,117,50],[529.296,0.045,117,78],[529.542,0.027,117,44],[529.787,0.045,117,46],[530.033,0.027,117,10],[530.263,0.295,62,49],[530.918,0.295,59,49],[531.509,0.295,57,51],[531.509,3.738,57,69],[532.23,0.295,64,51],[532.246,0.7,64,13],[532.492,0.295,57,51],[532.861,0.7,73,25],[533.214,0.295,64,51],[533.23,0.045,117,10],[533.476,0.027,117,25],[533.722,0.272,54,39],[533.722,0.045,117,63],[533.845,0.7,66,25],[533.869,0.295,66,47],[533.968,0.027,117,49],[534.214,0.272,52,39],[534.214,0.045,117,81],[534.46,0.295,62,47],[534.46,0.027,117,46],[534.705,0.543,50,39],[534.705,0.045,117,53],[534.951,0.027,117,16],[535.443,3.864,62,32],[537.477,0.468,66,97],[537.986,0.468,64,97],[538.494,0.936,62,97],[539.511,3.864,66,28],[539.511,0.468,66,109],[542.291,0.305,66,44],[542.969,0.305,62,44],[543.579,0.305,55,46],[543.579,3.864,62,58],[544.324,0.305,62,46],[545.341,0.305,62,46],[545.994,0.7,67,23],[546.019,0.305,59,49],[546.63,0.305,55,49],[547.646,4.068,78,55],[547.646,3.864,64,76],[550.189,0.468,64,132],[550.697,0.936,62,132],[568.86,0.58,71,16],[569.542,0.193,71,22],[569.769,0.773,71,22],[570.678,0.58,71,22],[571.36,0.193,71,22],[571.587,0.773,71,22],[572.496,0.58,71,22],[573.178,0.193,71,16],[573.405,0.773,71,16],[574.314,0.58,71,16],[574.996,0.193,71,16],[575.223,0.773,71,16],[576.133,0.58,71,16],[576.814,0.193,71,16],[577.042,0.773,71,24],[577.951,0.58,71,24],[578.633,0.193,71,24],[578.86,0.773,71,24],[579.769,0.58,71,24],[580.451,0.193,71,24],[580.678,0.773,71,24],[581.587,0.58,71,29],[582.269,0.193,71,29],[582.496,0.773,71,29],[590.678,0.159,83,54],[592.437,4.385,60,20],[593.591,0.219,76,13],[593.879,0.035,117,10],[594.052,0.346,76,23],[594.456,0.035,117,9],[595.899,0.346,72,23],[596.591,0.27,64,14],[596.764,0.277,44,12],[597.052,0.277,45,15],[597.052,4.385,64,20],[597.485,0.7,76,8],[597.485,0.277,52,18],[597.514,0.346,72,19],[597.899,0.346,76,13],[597.918,0.035,117,7],[598.206,0.277,45,23],[598.495,0.035,117,11],[598.899,0.27,64,30],[598.899,0.03,83,11],[598.919,0.31,57,15],[599.072,0.277,44,25],[599.36,0.346,69,26],[599.36,0.277,45,25],[599.793,0.277,52,23],[599.937,0.07,98,13],[600.052,0.27,64,20],[600.072,0.31,57,10],[600.514,0.219,72,8],[600.514,0.277,45,14],[600.976,0.346,72,26],[601.091,0.07,98,23],[601.379,0.219,76,15],[601.668,4.385,57,30],[601.956,0.219,72,14],[601.956,0.035,117,13],[602.101,0.7,72,12],[602.245,0.07,98,19],[602.36,0.27,64,25],[602.36,0.03,83,9],[602.38,0.31,57,12],[602.514,0.346,72,21],[602.822,0.346,65,13],[602.822,0.219,69,14],[603.976,0.346,65,10],[603.976,0.27,48,17],[603.976,0.055,50,17],[603.995,0.31,42,9],[604.035,0.16,39,18],[604.035,0.14,51,11],[604.264,0.219,72,8],[604.437,0.346,69,23],[605.129,0.27,48,45],[605.129,0.03,83,16],[605.129,0.03,99,17],[605.129,0.055,50,45],[605.149,0.31,42,23],[605.189,0.16,39,43],[605.189,0.14,51,26],[605.418,0.035,117,14],[605.976,0.346,72,29],[606.283,0.27,48,52],[606.283,0.03,83,18],[606.283,0.03,99,18],[606.283,0.055,50,48],[606.283,4.385,55,17],[606.303,0.31,42,26],[606.343,0.16,39,45],[606.343,0.14,51,27],[606.716,0.7,74,14],[607.437,0.346,67,21],[607.437,0.27,48,38],[607.437,0.03,83,13],[607.437,0.03,99,13],[607.437,0.055,50,36],[607.457,0.31,42,19],[607.497,0.16,39,33],[607.497,0.14,51,20],[607.899,0.346,71,18],[608.591,0.27,48,19],[608.591,0.03,99,7],[608.591,0.055,50,20],[608.611,0.31,42,9],[608.651,0.16,39,18],[608.651,0.14,51,11],[609.437,0.346,79,28],[609.745,0.055,50,7],[610.668,0.173,67,20],[610.899,4.56,67,22],[611.379,0.36,76,27],[612.579,0.36,76,27],[613.779,0.36,76,28],[614.979,0.36,76,28],[615.399,0.228,72,16],[615.699,4.56,64,14],[616.149,0.7,76,15],[616.179,0.36,72,30],[617.379,0.36,72,30],[618.579,0.36,72,32],[619.779,0.36,72,32],[620.499,4.56,57,12],[622.599,0.7,79,9],[623.349,0.7,77,17],[625.299,4.56,59,22],[629.139,0.18,62,24],[630.099,4.75,64,15],[631.015,0.375,79,24],[632.265,0.375,79,24],[633.515,0.375,79,25],[634.765,0.375,79,25],[635.099,4.75,60,10],[636.015,0.375,76,27],[636.817,0.7,79,13],[637.265,0.375,76,27],[638.515,0.375,76,28],[639.765,0.375,76,28],[640.099,4.75,53,10],[641.015,0.375,72,30],[642.265,0.375,72,30],[643.515,0.375,72,31],[644.765,0.375,72,31],[645.099,4.75,55,19],[645.567,0.7,74,16],[646.015,0.375,74,32],[647.265,0.375,74,32],[648.515,0.375,79,30],[649.849,0.188,67,21],[650.609,0.383,76,22],[651.886,0.383,76,22],[653.162,0.383,76,24],[654.439,0.383,76,24],[655.716,0.383,72,25],[656.96,0.7,79,12],[656.992,0.383,72,25],[658.269,0.383,72,26],[659.545,0.383,72,23],[660.822,0.383,69,24],[662.099,0.383,69,24],[663.375,0.383,69,25],[664.652,0.383,69,25],[665.896,0.7,74,13],[665.928,0.383,71,26],[667.205,0.383,71,26],[668.482,0.383,76,24],[669.503,0.192,62,17],[691.133,0.196,67,16],[717.612,2.4,79,39]],[[0,3.2,60,77],[5.8,3.4,67,77],[11.2,3,64,80],[16,3.6,60,80],[22,0.99,72,85],[23.1,0.495,76,85],[23.65,0.495,79,115],[24.2,1.485,76,115],[25.85,0.495,74,36],[26.4,0.99,76,36],[27.5,0.99,74,40],[28.6,1.98,72,40],[38.7,1.9,72,30],[46.94,1.48,72,30],[53.26,1.12,72,53],[98.444,0.531,72,46],[99.02,0.265,76,46],[99.309,0.265,79,46],[99.597,0.796,76,46],[100.463,0.265,74,46],[100.751,0.531,76,57],[101.328,0.531,74,57],[101.905,1.062,72,57],[103.059,0.531,76,64],[103.636,0.265,79,47],[103.924,0.265,81,47],[104.213,0.531,79,47],[104.79,0.531,76,47],[105.367,0.796,74,55],[106.232,0.265,72,55],[106.52,1.062,69,55],[107.674,0.531,72,61],[108.251,0.531,77,52],[108.828,0.265,79,52],[109.117,0.265,81,52],[109.405,0.531,79,52],[109.982,0.531,77,65],[110.559,0.265,76,65],[110.847,0.265,74,65],[111.136,1.062,72,65],[112.29,0.531,74,81],[112.867,0.265,76,81],[113.155,0.265,79,81],[113.444,0.796,83,81],[114.309,0.265,79,45],[114.597,0.531,76,45],[115.174,0.531,74,45],[115.751,1.062,72,45],[116.905,0.818,76,22],[117.814,0.409,77,22],[118.269,1.227,76,22],[119.632,0.818,81,22],[120.541,0.409,79,22],[120.996,1.227,76,22],[122.36,0.818,74,22],[123.269,0.409,76,22],[123.723,0.818,77,22],[124.632,0.409,76,22],[125.087,0.818,74,22],[125.996,0.409,72,22],[126.451,1.227,71,22],[127.814,0.818,76,22],[128.723,0.409,77,22],[129.178,1.227,76,22],[130.541,0.818,81,22],[131.451,0.409,79,22],[131.905,1.227,76,22],[133.269,0.818,74,22],[134.178,0.409,76,22],[134.632,0.818,77,21],[135.541,0.409,76,21],[135.996,0.409,74,21],[136.451,0.409,72,21],[136.905,0.409,71,21],[137.36,1.227,69,21],[138.723,2.618,72,15],[141.451,1.309,77,15],[142.814,1.309,76,15],[144.178,2.618,68,15],[146.905,2.618,72,14],[149.632,1.309,77,14],[150.996,1.309,76,14],[152.36,2.618,71,14],[155.087,2.618,69,14],[157.814,1.309,72,14],[159.178,1.309,74,14],[160.541,0.818,76,21],[161.451,0.409,77,21],[161.905,1.227,76,21],[163.269,0.818,81,24],[164.178,0.409,79,24],[164.632,1.227,76,24],[165.996,0.818,74,24],[166.905,0.409,76,24],[167.36,0.818,77,24],[168.269,0.409,76,24],[168.723,0.818,74,24],[169.632,0.409,72,24],[170.087,1.227,71,24],[171.451,0.818,76,24],[172.36,0.409,77,24],[172.814,1.227,76,24],[174.178,0.818,81,24],[175.087,0.409,79,24],[175.541,1.227,76,24],[176.905,0.818,74,24],[177.814,0.409,76,24],[178.269,0.818,77,24],[179.178,0.409,76,24],[179.632,0.409,74,23],[180.087,0.409,72,23],[180.541,0.409,71,23],[180.996,1.227,69,23],[182.36,0.871,74,20],[183.327,0.435,76,20],[183.811,0.871,77,20],[184.779,0.435,76,20],[185.263,0.435,74,20],[185.747,0.435,72,20],[186.231,0.435,71,22],[186.714,1.306,69,22],[188.166,0.964,74,22],[189.238,0.482,76,22],[189.773,0.964,77,22],[190.845,0.482,76,22],[191.38,0.482,74,22],[191.916,0.482,72,22],[192.452,0.482,71,22],[192.988,1.446,69,22],[197.958,0.355,84,42],[201.116,0.355,77,42],[204.274,0.355,84,42],[207.168,0.321,84,47],[210.025,0.321,77,47],[212.883,0.321,84,46],[215.522,0.293,84,46],[218.131,0.293,77,79],[220.022,0.391,86,113],[220.414,0.4,102,65],[221.414,1,72,37],[225.114,0.321,84,44],[227.971,0.321,77,39],[230.611,0.293,84,39],[233.219,0.293,77,29],[235.645,0.27,84,29],[238.045,0.27,77,151],[239.785,0.36,86,216],[240.145,0.4,102,65],[243.145,0.393,75,91],[243.86,0.393,73,91],[244.574,0.393,71,91],[246.002,0.393,69,91],[246.717,0.393,67,91],[247.431,0.393,65,91],[248.86,0.393,63,91],[249.574,0.393,61,91],[250.288,0.393,59,91],[254.574,0.393,63,86],[255.288,0.393,61,86],[256.002,0.393,59,86],[257.431,0.393,57,86],[258.145,0.393,55,86],[258.86,0.393,53,86],[260.288,0.393,51,86],[261.002,0.393,49,86],[261.717,0.393,47,86],[274.574,1.429,79,23],[277.431,1.429,84,42],[280.288,0.214,75,82],[281.002,0.214,73,82],[281.717,0.214,71,82],[283.145,0.214,69,82],[283.86,0.214,67,82],[284.574,0.214,65,82],[286.002,0.214,63,82],[286.717,0.214,61,82],[287.431,0.214,59,82],[297.431,1.429,60,32],[301.488,0.767,81,95],[302.322,0.511,79,95],[302.877,0.256,77,95],[303.155,0.767,76,95],[303.988,0.767,77,95],[304.228,0.4,77,17],[304.822,0.511,79,95],[305.062,0.383,79,17],[305.377,0.511,81,95],[305.617,0.383,81,17],[305.933,0.511,82,95],[306.173,0.383,82,17],[306.488,1.533,81,95],[306.728,0.4,81,17],[308.155,0.767,79,95],[308.395,0.4,79,17],[308.988,0.511,77,95],[309.228,0.383,77,17],[309.544,0.256,76,95],[309.784,0.192,76,17],[309.822,0.767,74,95],[310.062,0.4,74,17],[310.655,0.767,76,95],[310.895,0.4,76,17],[311.488,0.511,77,95],[311.728,0.383,77,17],[312.044,0.511,79,130],[312.284,0.383,79,23],[312.524,0.383,79,9],[312.599,0.511,76,130],[312.839,0.383,76,23],[313.079,0.383,76,9],[313.155,1.533,77,130],[313.395,0.4,77,23],[313.635,0.4,77,9],[314.822,0.767,81,136],[315.062,0.4,81,24],[315.301,0.4,81,10],[315.655,0.511,79,136],[315.895,0.383,79,24],[316.135,0.383,79,10],[316.21,0.256,77,136],[316.45,0.192,77,24],[316.488,0.767,76,136],[316.69,0.192,77,10],[316.728,0.4,76,24],[316.968,0.4,76,10],[317.322,0.767,77,136],[317.562,0.4,77,24],[317.801,0.4,77,10],[318.155,0.511,79,136],[318.395,0.383,79,24],[318.635,0.383,79,10],[318.71,0.511,81,136],[318.95,0.383,81,24],[319.19,0.383,81,10],[319.266,0.511,82,136],[319.506,0.383,82,24],[319.746,0.383,82,10],[319.822,1.533,81,136],[320.062,0.4,81,24],[320.301,0.4,81,10],[321.488,0.767,79,136],[321.728,0.4,79,24],[321.968,0.4,79,10],[322.322,0.511,77,136],[322.562,0.383,77,24],[322.801,0.383,77,10],[322.877,0.256,76,83],[323.117,0.192,76,15],[323.155,0.767,74,83],[323.395,0.4,74,15],[323.988,0.767,76,83],[324.228,0.4,76,15],[324.822,0.511,77,83],[325.062,0.383,77,15],[325.377,0.511,79,83],[325.617,0.383,79,15],[325.933,0.511,76,83],[326.173,0.383,76,15],[326.488,1.533,77,83],[326.728,0.4,77,15],[328.155,0.767,69,73],[328.395,0.4,69,13],[328.988,0.511,67,73],[329.228,0.383,67,13],[329.544,0.256,65,73],[329.784,0.192,65,13],[329.822,0.767,64,73],[330.062,0.4,64,13],[330.655,0.767,65,73],[330.895,0.4,65,13],[331.488,0.511,67,73],[331.728,0.383,67,13],[332.044,0.511,69,73],[332.284,0.383,69,13],[332.599,0.511,70,73],[332.839,0.383,70,13],[333.155,1.533,69,65],[333.395,0.4,69,12],[334.822,0.767,67,65],[335.062,0.4,67,12],[335.655,0.511,65,65],[335.895,0.383,65,12],[336.21,0.256,64,65],[336.45,0.192,64,12],[336.488,0.767,62,65],[336.728,0.4,62,12],[337.322,0.767,64,65],[337.562,0.4,64,12],[338.155,0.511,65,65],[338.395,0.383,65,12],[338.71,0.511,67,65],[338.95,0.383,67,12],[339.266,0.511,64,65],[339.506,0.383,64,12],[339.822,1.533,65,65],[340.062,0.4,65,12],[341.488,0.767,69,62],[341.728,0.4,69,11],[342.322,0.511,67,62],[342.562,0.383,67,11],[342.877,0.256,65,62],[343.117,0.192,65,11],[343.155,0.767,64,62],[343.395,0.4,64,11],[343.988,0.767,65,44],[344.228,0.4,65,8],[344.822,0.511,67,44],[345.062,0.383,67,8],[345.377,0.511,69,44],[345.617,0.383,69,8],[345.933,0.511,70,44],[346.173,0.383,70,8],[346.488,1.533,69,44],[346.728,0.4,69,8],[348.155,0.767,67,44],[348.395,0.4,67,8],[348.988,0.511,65,44],[349.228,0.383,65,8],[349.544,0.256,64,44],[349.784,0.192,64,8],[349.822,0.767,62,44],[350.062,0.4,62,8],[350.655,0.767,64,44],[350.895,0.4,64,8],[351.488,0.511,65,44],[351.728,0.383,65,8],[352.044,0.511,67,44],[352.284,0.383,67,8],[352.599,0.511,64,44],[352.839,0.383,64,8],[353.155,1.533,65,44],[353.395,0.4,65,8],[368.155,6.667,65,64],[368.395,0.4,65,12],[375.822,0.493,60,37],[376.357,0.246,64,37],[376.625,0.246,67,37],[376.893,0.739,64,37],[377.697,0.246,62,37],[377.964,0.493,64,37],[378.5,0.493,62,37],[379.036,0.986,60,37],[380.107,0.493,64,41],[380.643,0.246,67,41],[380.911,0.246,69,41],[381.179,0.493,67,41],[381.714,0.493,64,41],[382.25,0.739,62,41],[383.054,0.246,60,41],[383.322,0.986,57,41],[384.393,0.493,60,46],[384.929,0.493,65,46],[385.464,0.246,67,46],[385.732,0.246,69,71],[386,0.493,67,71],[386.536,0.493,65,71],[387.072,0.246,64,71],[387.339,0.246,62,71],[387.607,0.986,60,71],[388.679,0.493,62,78],[389.214,0.246,64,78],[389.482,0.246,67,78],[389.75,0.739,71,78],[390.554,0.246,67,78],[390.822,0.493,64,78],[391.357,0.493,62,78],[391.893,0.986,60,78],[392.964,0.476,72,61],[393.482,0.238,76,61],[393.74,0.238,79,61],[393.999,0.714,76,61],[394.775,0.238,74,76],[395.033,0.476,76,76],[395.551,0.476,74,76],[396.068,0.952,72,76],[397.102,0.476,76,85],[397.62,0.238,79,85],[397.878,0.238,81,85],[398.137,0.476,79,85],[398.654,0.476,76,85],[399.171,0.714,74,85],[399.947,0.238,72,85],[400.206,0.952,69,85],[401.24,0.476,72,94],[401.757,0.476,77,94],[402.275,0.238,79,94],[402.533,0.238,81,94],[402.792,0.476,79,94],[403.309,0.476,77,96],[403.827,0.238,76,96],[404.085,0.238,74,96],[404.344,0.952,72,96],[405.378,0.476,74,105],[405.895,0.238,76,105],[406.154,0.238,79,105],[406.413,0.714,83,105],[407.188,0.238,79,105],[407.447,0.476,76,105],[407.964,0.476,74,105],[408.482,0.952,72,105],[409.516,0.46,84,70],[410.016,0.23,88,70],[410.266,0.23,91,70],[410.516,0.69,88,70],[411.266,0.23,86,70],[411.516,0.46,88,84],[412.016,0.46,86,84],[412.516,0.92,84,84],[413.516,0.46,88,94],[414.016,0.23,91,94],[414.266,0.23,93,94],[414.516,0.46,91,94],[415.016,0.46,88,94],[415.516,0.69,86,94],[416.266,0.23,84,94],[416.516,0.92,81,94],[417.516,0.46,84,104],[418.016,0.46,89,104],[418.516,0.23,91,104],[418.766,0.23,93,104],[419.016,0.46,91,118],[419.516,0.46,89,118],[420.016,0.23,88,118],[420.266,0.23,86,118],[420.516,0.92,84,118],[421.516,0.46,86,129],[422.016,0.23,88,129],[422.266,0.23,91,129],[422.516,0.69,95,129],[423.266,0.23,91,129],[423.516,0.46,88,129],[424.016,0.46,86,129],[424.516,0.92,84,129],[425.516,0.445,96,82],[426,0.223,100,82],[426.242,0.223,103,76],[426.484,0.668,100,76],[427.21,0.223,98,76],[427.452,0.445,100,76],[427.935,0.445,98,76],[428.419,0.89,96,76],[429.387,0.445,100,86],[429.871,0.223,103,86],[430.113,0.223,105,86],[430.355,0.445,103,86],[430.839,0.445,100,86],[431.323,0.668,98,86],[432.048,0.223,96,86],[432.29,0.89,93,86],[433.258,0.445,96,95],[433.742,0.445,101,81],[434.226,0.223,103,81],[434.468,0.223,105,81],[434.71,0.445,103,81],[435.193,0.445,101,81],[435.677,0.223,100,81],[435.919,0.223,98,81],[436.161,0.89,96,81],[437.129,0.445,98,89],[437.613,0.223,100,89],[437.855,0.223,103,89],[438.097,0.668,107,89],[438.823,0.223,103,89],[439.065,0.445,100,89],[439.548,0.445,98,89],[440.032,0.89,96,89],[547.646,4.068,86,97],[568.86,0.409,79,30],[569.314,0.204,83,30],[569.542,0.204,86,40],[569.769,0.614,83,40],[570.451,0.204,81,40],[570.678,0.409,83,40],[571.133,0.409,81,40],[571.587,0.818,79,40],[576.133,0.409,81,29],[576.587,0.204,83,29],[576.814,0.204,86,29],[577.042,0.614,90,44],[577.723,0.204,86,44],[577.951,0.409,83,44],[578.405,0.409,81,44],[578.86,0.818,79,44],[590.678,0.159,91,54],[592.437,0.531,72,69],[593.014,0.265,76,69],[593.302,0.265,79,69],[593.591,0.796,76,69],[594.456,0.265,74,69],[594.696,0.199,74,12],[594.745,0.531,76,69],[594.985,0.398,76,12],[595.322,0.531,74,69],[595.562,0.398,74,12],[595.899,1.062,72,69],[596.139,0.4,72,12],[597.052,0.531,76,77],[597.292,0.398,76,14],[597.629,0.265,79,77],[597.869,0.199,79,14],[597.918,0.265,81,77],[598.158,0.199,81,14],[598.206,0.531,79,77],[598.446,0.398,79,14],[598.783,0.531,76,77],[599.023,0.398,76,14],[599.36,0.796,74,77],[599.6,0.4,74,14],[600.226,0.265,72,77],[600.466,0.199,72,14],[600.514,1.062,69,77],[600.754,0.4,69,14],[601.668,0.531,72,85],[601.908,0.398,72,15],[602.245,0.531,77,85],[602.485,0.398,77,15],[602.822,0.265,79,85],[603.062,0.199,79,15],[603.11,0.265,81,85],[603.35,0.199,81,15],[603.399,0.531,79,85],[603.639,0.398,79,15],[603.976,0.531,77,85],[604.216,0.398,77,15],[604.552,0.265,76,85],[604.792,0.199,76,15],[604.841,0.265,74,85],[605.081,0.199,74,15],[605.129,1.062,72,85],[605.369,0.4,72,15],[606.283,0.531,74,94],[606.523,0.398,74,17],[606.86,0.265,76,94],[607.1,0.199,76,17],[607.149,0.265,79,94],[607.389,0.199,79,17],[607.437,0.796,83,94],[607.677,0.4,83,17],[608.302,0.265,79,94],[608.542,0.199,79,17],[608.591,0.531,76,94],[608.831,0.398,76,17],[609.168,0.531,74,94],[609.408,0.398,74,17],[609.745,1.062,72,94],[609.985,0.4,72,17],[610.899,0.552,72,65],[611.139,0.4,72,12],[611.499,0.276,76,65],[611.739,0.207,76,12],[611.799,0.276,79,65],[612.039,0.207,79,12],[612.099,0.828,76,65],[612.339,0.4,76,12],[612.999,0.276,74,65],[613.239,0.207,74,12],[613.299,0.552,76,65],[613.539,0.4,76,12],[613.899,0.552,74,65],[614.139,0.4,74,12],[614.499,1.104,72,65],[614.739,0.4,72,12],[615.699,0.552,76,73],[615.939,0.4,76,13],[616.299,0.276,79,73],[616.539,0.207,79,13],[616.599,0.276,81,73],[616.839,0.207,81,13],[616.899,0.552,79,73],[617.139,0.4,79,13],[617.499,0.552,76,73],[617.739,0.4,76,13],[618.099,0.828,74,73],[618.339,0.4,74,13],[618.999,0.276,72,73],[619.239,0.207,72,13],[619.299,1.104,69,73],[619.539,0.4,69,13],[620.499,0.552,72,81],[620.739,0.4,72,15],[621.099,0.552,77,38],[621.699,0.276,79,38],[621.999,0.276,81,38],[622.299,0.552,79,38],[622.899,0.552,77,38],[623.499,0.276,76,38],[623.799,0.276,74,38],[624.099,1.104,72,38],[625.299,0.552,74,42],[625.539,0.4,74,8],[625.899,0.276,76,42],[626.139,0.207,76,8],[626.199,0.276,79,42],[626.439,0.207,79,8],[626.499,0.828,83,42],[626.739,0.4,83,8],[627.399,0.276,79,42],[627.639,0.207,79,8],[627.699,0.552,76,42],[627.939,0.4,76,8],[628.299,0.552,74,42],[628.539,0.4,74,8],[628.899,1.104,72,42],[629.139,0.4,72,8],[630.099,0.575,72,27],[630.724,0.287,76,27],[631.036,0.287,79,27],[631.349,0.863,76,27],[632.286,0.287,74,27],[632.599,0.575,76,27],[633.224,0.575,74,27],[633.849,1.15,72,27],[635.099,0.575,76,30],[635.724,0.287,79,30],[636.036,0.287,81,30],[636.349,0.575,79,30],[636.974,0.575,76,30],[637.599,0.863,74,30],[638.536,0.287,72,30],[638.849,1.15,69,30],[640.099,0.575,72,34],[640.724,0.575,77,34],[641.349,0.287,79,34],[641.661,0.287,81,34],[641.974,0.575,79,34],[642.599,0.575,77,34],[643.224,0.287,76,34],[643.536,0.287,74,34],[643.849,1.15,72,34],[645.099,0.575,74,37],[645.724,0.287,76,37],[646.036,0.287,79,37],[646.349,0.863,83,37],[647.286,0.287,79,37],[647.599,0.575,76,37],[648.224,0.575,74,37],[648.849,1.15,72,37],[650.099,0.587,72,38],[650.737,0.294,76,38],[651.056,0.294,79,38],[651.375,0.881,76,38],[652.333,0.294,74,38],[652.652,0.587,76,38],[653.29,0.587,74,38],[653.928,1.175,72,38],[655.205,0.587,76,43],[655.445,0.4,76,8],[655.843,0.294,79,43],[656.083,0.22,79,8],[656.162,0.294,81,43],[656.402,0.22,81,8],[656.482,0.587,79,43],[656.722,0.4,79,8],[657.12,0.587,76,43],[657.36,0.4,76,8],[657.758,0.881,74,43],[657.998,0.4,74,8],[658.716,0.294,72,43],[658.956,0.22,72,8],[659.035,1.175,69,43],[659.275,0.4,69,8],[660.311,0.587,72,48],[660.551,0.4,72,9],[660.95,0.587,77,48],[661.19,0.4,77,9],[661.588,0.294,79,48],[661.828,0.22,79,9],[661.907,0.294,81,48],[662.147,0.22,81,9],[662.226,0.587,79,48],[662.466,0.4,79,9],[662.865,0.587,77,48],[663.105,0.4,77,9],[663.503,0.294,76,48],[663.743,0.22,76,9],[663.822,0.294,74,48],[664.062,0.22,74,9],[664.141,1.175,72,48],[664.381,0.4,72,9],[665.418,0.587,74,52],[665.658,0.4,74,9],[666.056,0.294,76,52],[666.296,0.22,76,9],[666.375,0.294,79,52],[666.615,0.22,79,9],[666.694,0.881,83,52],[666.934,0.4,83,9],[667.652,0.294,79,52],[667.892,0.22,79,9],[667.971,0.587,76,52],[668.211,0.4,76,9],[668.609,0.587,74,52],[668.849,0.4,74,9],[669.247,1.175,72,52],[669.487,0.4,72,9],[670.524,0.6,72,36],[671.176,0.3,76,36],[671.502,0.3,79,36],[671.828,0.9,76,36],[672.807,0.3,74,36],[673.133,0.6,76,36],[673.785,0.6,74,36],[674.437,1.2,72,36],[675.741,0.6,76,40],[675.981,0.4,76,7],[676.394,0.3,79,40],[676.634,0.225,79,7],[676.72,0.3,81,40],[676.96,0.225,81,7],[677.046,0.6,79,40],[677.286,0.4,79,7],[677.698,0.6,76,40],[677.938,0.4,76,7],[678.35,0.9,74,40],[678.59,0.4,74,7],[679.328,0.3,72,40],[679.568,0.225,72,7],[679.655,1.2,69,40],[679.895,0.4,69,7],[680.959,0.6,72,44],[681.199,0.4,72,8],[681.611,0.6,77,174],[681.851,0.4,77,31],[682.091,0.4,77,12],[682.263,0.3,79,174],[682.503,0.225,79,31],[682.589,0.3,81,174],[682.743,0.225,79,12],[682.829,0.225,81,31],[682.915,0.6,79,174],[683.069,0.225,81,12],[683.155,0.4,79,31],[683.395,0.4,79,12],[683.568,0.6,77,174],[683.808,0.4,77,31],[684.048,0.4,77,12],[684.22,0.3,76,174],[684.46,0.225,76,31],[684.546,0.3,74,174],[684.7,0.225,76,12],[684.786,0.225,74,31],[684.872,1.2,72,174],[685.026,0.225,74,12],[685.112,0.4,72,31],[685.352,0.4,72,12],[686.176,0.6,74,191],[686.416,0.4,74,34],[686.656,0.4,74,13],[686.828,0.3,76,191],[687.068,0.225,76,34],[687.155,0.3,79,191],[687.308,0.225,76,13],[687.395,0.225,79,34],[687.481,0.9,83,191],[687.635,0.225,79,13],[687.721,0.4,83,34],[687.961,0.4,83,13],[688.459,0.3,79,191],[688.699,0.225,79,34],[688.785,0.6,76,191],[688.939,0.225,79,13],[689.025,0.4,76,34],[689.265,0.4,76,13],[689.437,0.6,74,191],[689.677,0.4,74,34],[689.917,0.4,74,13],[690.089,1.2,72,191],[690.329,0.4,72,34],[690.569,0.4,72,13],[691.394,0.627,72,108],[691.634,0.4,72,19],[691.874,0.4,72,8],[692.076,0.314,76,108],[692.316,0.235,76,19],[692.416,0.314,79,108],[692.556,0.235,76,8],[692.656,0.235,79,19],[692.757,0.941,76,108],[692.896,0.235,79,8],[692.997,0.4,76,19],[693.237,0.4,76,8],[693.78,0.314,74,108],[694.02,0.235,74,19],[694.121,0.627,76,108],[694.26,0.235,74,8],[694.361,0.4,76,19],[694.601,0.4,76,8],[694.803,0.627,74,108],[695.043,0.4,74,19],[695.283,0.4,74,8],[695.485,1.254,72,108],[695.725,0.4,72,19],[695.965,0.4,72,8],[696.848,0.627,76,121],[697.088,0.4,76,22],[697.328,0.4,76,8],[697.53,0.314,79,121],[697.77,0.235,79,22],[697.871,0.314,81,121],[698.01,0.235,79,8],[698.111,0.235,81,22],[698.212,0.627,79,121],[698.351,0.235,81,8],[698.452,0.4,79,22],[698.692,0.4,79,8],[698.894,0.627,76,121],[699.134,0.4,76,22],[699.374,0.4,76,8],[699.576,0.941,74,121],[699.816,0.4,74,22],[700.056,0.4,74,8],[700.598,0.314,72,121],[700.838,0.235,72,22],[700.939,1.254,69,121],[701.078,0.235,72,8],[701.179,0.4,69,22],[701.419,0.4,69,8],[702.303,0.627,72,134],[702.543,0.4,72,24],[702.783,0.4,72,9],[702.985,0.627,77,134],[703.225,0.4,77,24],[703.465,0.4,77,9],[703.666,0.314,79,134],[703.906,0.235,79,24],[704.007,0.314,81,134],[704.146,0.235,79,9],[704.247,0.235,81,24],[704.348,0.627,79,134],[704.487,0.235,81,9],[704.588,0.4,79,24],[704.828,0.4,79,9],[705.03,0.627,77,134],[705.27,0.4,77,24],[705.51,0.4,77,9],[705.712,0.314,76,134],[705.952,0.235,76,24],[706.053,0.314,74,134],[706.192,0.235,76,9],[706.293,0.235,74,24],[706.394,1.254,72,134],[706.533,0.235,74,9],[706.634,0.4,72,24],[706.874,0.4,72,9],[707.757,0.627,74,147],[707.997,0.4,74,26],[708.237,0.4,74,10],[708.439,0.314,76,147],[708.679,0.235,76,26],[708.78,0.314,79,147],[708.919,0.235,76,10],[709.02,0.235,79,26],[709.121,0.941,83,147],[709.26,0.235,79,10],[709.361,0.4,83,26],[709.601,0.4,83,10],[710.144,0.314,79,147],[710.384,0.235,79,26],[710.485,0.627,76,147],[710.624,0.235,79,10],[710.725,0.4,76,26],[710.965,0.4,76,10],[711.166,0.627,74,147],[711.406,0.4,74,26],[711.646,0.4,74,10],[711.848,1.254,72,147],[734.412,3.4,67,46],[740.812,3.8,64,69],[748.812,4.4,60,69],[758.812,10,60,97]],[[0,0.055,38,103],[0.06,0.16,27,96],[0.06,0.14,39,58],[2.2,0.055,38,103],[2.26,0.16,27,96],[2.26,0.14,39,58],[4.4,0.055,38,103],[4.46,0.16,27,96],[4.46,0.14,39,58],[6.6,0.055,38,103],[6.66,0.16,27,96],[6.66,0.14,39,58],[8.8,0.055,38,103],[8.86,0.16,27,96],[8.86,0.14,39,58],[11,0.055,38,103],[11.06,0.16,27,96],[11.06,0.14,39,58],[13.2,0.055,38,103],[13.26,0.16,27,96],[13.26,0.14,39,58],[15.4,0.055,38,103],[15.46,0.16,27,96],[15.46,0.14,39,58],[17.6,0.055,38,103],[17.66,0.16,27,96],[17.66,0.14,39,58],[19.8,0.055,38,103],[19.86,0.16,27,96],[19.86,0.14,39,58],[22,0.055,38,103],[22.06,0.16,27,96],[22.06,0.14,39,58],[24.2,0.055,38,103],[24.26,0.16,27,96],[24.26,0.14,39,58],[26.4,0.055,38,103],[26.46,0.16,27,96],[26.46,0.14,39,58],[28.6,0.055,38,103],[28.66,0.16,27,96],[28.66,0.14,39,58],[30.8,0.055,38,103],[30.86,0.16,27,96],[30.86,0.14,39,58],[33,0.055,38,103],[33.06,0.16,27,96],[33.06,0.14,39,58],[34.9,0.055,38,103],[34.96,0.16,27,96],[34.96,0.14,39,58],[36.8,0.055,38,103],[36.86,0.16,27,96],[36.86,0.14,39,58],[38.7,0.055,38,103],[38.76,0.16,27,96],[38.76,0.14,39,58],[40.6,0.055,38,103],[40.66,0.16,27,96],[40.66,0.14,39,58],[42.5,0.055,38,103],[42.56,0.16,27,96],[42.56,0.14,39,58],[43.98,0.055,38,103],[44.04,0.16,27,96],[44.04,0.14,39,58],[45.46,0.055,38,103],[45.52,0.16,27,96],[45.52,0.14,39,58],[46.94,0.055,38,103],[47,0.16,27,96],[47,0.14,39,58],[48.42,0.055,38,103],[48.48,0.16,27,96],[48.48,0.14,39,58],[49.9,0.055,38,103],[49.96,0.16,27,96],[49.96,0.14,39,58],[51.02,0.055,38,103],[51.08,0.16,27,96],[51.08,0.14,39,58],[52.14,0.055,38,103],[52.2,0.16,27,96],[52.2,0.14,39,58],[53.26,0.055,38,103],[53.32,0.16,27,96],[53.32,0.14,39,58],[54.38,0.055,38,103],[54.44,0.16,27,96],[54.44,0.14,39,58],[55.5,0.055,38,103],[55.56,0.16,27,96],[55.56,0.14,39,58],[56.38,0.055,38,103],[56.44,0.16,27,96],[56.44,0.14,39,58],[57.26,0.055,38,103],[57.32,0.16,27,96],[57.32,0.14,39,58],[58.14,0.055,38,103],[58.2,0.16,27,96],[58.2,0.14,39,58],[59.02,0.055,38,103],[59.08,0.16,27,96],[59.08,0.14,39,58],[59.9,0.055,38,103],[59.96,0.16,27,96],[59.96,0.14,39,58],[60.42,0.96,36,95],[60.42,0.055,38,75],[60.48,0.16,27,70],[60.48,0.14,39,42],[61.62,0.96,36,95],[61.62,0.055,38,75],[61.68,0.16,27,70],[61.68,0.14,39,42],[62.82,0.96,36,101],[62.82,0.055,38,75],[62.88,0.16,27,70],[62.88,0.14,39,42],[64.02,0.96,36,101],[64.02,0.055,38,75],[64.08,0.16,27,70],[64.08,0.14,39,42],[65.22,0.96,33,107],[65.22,0.055,38,75],[65.28,0.16,27,70],[65.28,0.14,39,42],[66.42,0.96,33,107],[66.42,0.055,38,75],[66.48,0.16,27,70],[66.48,0.14,39,42],[67.62,0.96,33,112],[67.62,0.055,38,75],[67.68,0.16,27,70],[67.68,0.14,39,42],[68.82,0.96,33,112],[68.82,0.055,38,75],[68.88,0.16,27,70],[68.88,0.14,39,42],[70.02,0.96,29,118],[70.02,0.055,38,75],[70.08,0.16,27,70],[70.08,0.14,39,42],[71.22,0.96,29,118],[71.22,0.055,38,75],[71.28,0.16,27,70],[71.28,0.14,39,42],[72.42,0.96,29,124],[72.42,0.055,38,75],[72.48,0.16,27,70],[72.48,0.14,39,42],[73.62,0.96,29,124],[73.62,0.055,38,75],[73.68,0.16,27,70],[73.68,0.14,39,42],[74.82,0.96,31,130],[74.82,0.055,38,75],[74.88,0.16,27,70],[74.88,0.14,39,42],[76.02,0.96,31,130],[76.02,0.055,38,75],[76.08,0.16,27,70],[76.08,0.14,39,42],[77.22,2.16,36,114],[77.22,0.055,38,75],[77.28,0.16,27,70],[77.28,0.14,39,42],[78.42,0.055,38,75],[78.48,0.16,27,70],[78.48,0.14,39,42],[79.62,0.941,36,109],[79.62,0.055,38,75],[79.68,0.16,27,70],[79.68,0.14,39,42],[80.796,0.941,36,109],[80.796,0.055,38,75],[80.856,0.16,27,70],[80.856,0.14,39,42],[81.973,0.941,36,115],[81.973,0.055,38,75],[82.033,0.16,27,70],[82.033,0.14,39,42],[83.149,0.941,36,115],[83.149,0.055,38,75],[83.209,0.16,27,70],[83.209,0.14,39,42],[84.326,0.941,33,122],[84.326,0.055,38,75],[84.386,0.16,27,70],[84.386,0.14,39,42],[85.502,0.941,33,122],[85.502,0.055,38,75],[85.562,0.16,27,70],[85.562,0.14,39,42],[86.679,0.941,33,128],[86.679,0.055,38,75],[86.739,0.16,27,70],[86.739,0.14,39,42],[87.855,0.941,33,128],[87.855,0.055,38,75],[87.915,0.16,27,70],[87.915,0.14,39,42],[89.032,0.941,29,135],[89.032,0.055,38,75],[89.092,0.16,27,70],[89.092,0.14,39,42],[90.208,0.941,29,135],[90.208,0.055,38,75],[90.268,0.16,27,70],[90.268,0.14,39,42],[91.385,0.941,29,142],[91.385,0.055,38,75],[91.445,0.16,27,70],[91.445,0.14,39,42],[92.561,0.941,29,142],[92.561,0.055,38,75],[92.621,0.16,27,70],[92.621,0.14,39,42],[93.738,0.941,31,148],[93.738,0.055,38,75],[93.798,0.16,27,70],[93.798,0.14,39,42],[94.914,0.941,31,148],[94.914,0.055,38,75],[94.974,0.16,27,70],[94.974,0.14,39,42],[96.091,2.118,36,131],[96.091,0.055,38,75],[96.151,0.16,27,70],[96.151,0.14,39,42],[97.267,0.055,38,75],[97.327,0.16,27,70],[97.327,0.14,39,42],[98.444,0.277,36,105],[98.444,0.055,38,75],[98.504,0.16,27,70],[98.504,0.14,39,42],[98.876,0.277,43,105],[99.597,0.055,38,75],[99.597,0.277,36,105],[99.657,0.16,27,70],[99.657,0.14,39,42],[100.463,0.277,35,105],[100.751,0.277,36,111],[100.751,0.055,38,75],[100.811,0.16,27,70],[100.811,0.14,39,42],[101.184,0.277,43,111],[101.905,0.055,38,75],[101.905,0.277,36,111],[101.965,0.16,27,70],[101.965,0.14,39,42],[102.77,0.277,32,111],[103.059,0.277,33,118],[103.059,0.055,38,75],[103.119,0.16,27,70],[103.119,0.14,39,42],[103.492,0.277,40,118],[104.213,0.055,38,75],[104.213,0.277,33,118],[104.273,0.16,27,70],[104.273,0.14,39,42],[105.078,0.277,32,118],[105.367,0.277,33,124],[105.367,0.055,38,75],[105.427,0.16,27,70],[105.427,0.14,39,42],[105.799,0.277,40,124],[106.52,0.055,38,75],[106.52,0.277,33,124],[106.58,0.16,27,70],[106.58,0.14,39,42],[107.386,0.277,28,124],[107.674,0.277,29,130],[107.674,0.055,38,75],[107.734,0.16,27,70],[107.734,0.14,39,42],[108.107,0.277,36,130],[108.828,0.277,29,130],[108.828,0.055,38,75],[108.888,0.16,27,70],[108.888,0.14,39,42],[109.694,0.277,28,130],[109.982,0.277,29,136],[109.982,0.055,38,75],[110.042,0.16,27,70],[110.042,0.14,39,42],[110.415,0.277,36,136],[111.136,0.277,29,136],[111.136,0.055,38,75],[111.196,0.16,27,70],[111.196,0.14,39,42],[112.001,0.277,30,136],[112.29,0.277,31,143],[112.29,0.055,38,75],[112.35,0.16,27,70],[112.35,0.14,39,42],[112.722,0.277,38,143],[113.444,0.277,31,143],[113.444,0.055,38,75],[113.504,0.16,27,70],[113.504,0.14,39,42],[114.309,0.277,35,143],[114.597,0.055,38,75],[114.597,2.077,36,147],[114.657,0.16,27,70],[114.657,0.14,39,42],[115.751,0.055,38,75],[115.811,0.16,27,70],[115.811,0.14,39,42],[116.905,0.25,33,130],[116.905,0.055,38,89],[116.965,0.16,27,83],[116.965,0.14,39,50],[118.269,0.25,33,130],[118.269,0.055,38,89],[118.329,0.16,27,83],[118.329,0.14,39,50],[119.632,0.25,38,130],[119.632,0.055,38,89],[119.692,0.16,27,83],[119.692,0.14,39,50],[120.996,0.25,40,130],[120.996,0.055,38,89],[121.056,0.16,27,83],[121.056,0.14,39,50],[122.36,0.25,33,130],[122.36,0.055,38,89],[122.42,0.16,27,83],[122.42,0.14,39,50],[123.723,0.25,41,130],[123.723,0.055,38,89],[123.783,0.16,27,83],[123.783,0.14,39,50],[125.087,0.25,38,130],[125.087,0.055,38,89],[125.147,0.16,27,83],[125.147,0.14,39,50],[126.451,0.25,40,130],[126.451,0.055,38,89],[126.511,0.16,27,83],[126.511,0.14,39,50],[127.814,0.25,33,130],[127.814,0.055,38,89],[127.874,0.16,27,83],[127.874,0.14,39,50],[129.178,0.25,33,130],[129.178,0.055,38,89],[129.238,0.16,27,83],[129.238,0.14,39,50],[130.541,0.25,38,130],[130.542,0.055,38,89],[130.601,0.16,27,83],[130.601,0.14,39,50],[131.905,0.25,40,130],[131.905,0.055,38,89],[131.965,0.16,27,83],[131.965,0.14,39,50],[133.269,0.25,33,130],[133.269,0.055,38,89],[133.329,0.16,27,83],[133.329,0.14,39,50],[134.632,0.25,41,130],[134.632,0.055,38,89],[134.692,0.16,27,83],[134.692,0.14,39,50],[135.996,0.25,40,130],[135.996,0.055,38,89],[136.056,0.16,27,83],[136.056,0.14,39,50],[137.36,0.25,33,130],[137.36,0.055,38,89],[137.42,0.16,27,83],[137.42,0.14,39,50],[138.723,0.25,33,138],[138.723,0.055,38,89],[138.783,0.16,27,83],[138.783,0.14,39,50],[140.087,0.25,33,138],[140.087,0.055,38,89],[140.147,0.16,27,83],[140.147,0.14,39,50],[141.451,0.25,38,138],[141.451,0.055,38,89],[141.511,0.16,27,83],[141.511,0.14,39,50],[142.814,0.25,40,138],[142.814,0.055,38,89],[142.874,0.16,27,83],[142.874,0.14,39,50],[144.178,0.25,33,138],[144.178,0.055,38,89],[144.238,0.16,27,83],[144.238,0.14,39,50],[145.541,0.25,41,138],[145.542,0.055,38,89],[145.601,0.16,27,83],[145.601,0.14,39,50],[146.905,0.25,38,138],[146.905,0.055,38,89],[146.965,0.16,27,83],[146.965,0.14,39,50],[148.269,0.25,40,138],[148.269,0.055,38,89],[148.329,0.16,27,83],[148.329,0.14,39,50],[149.632,0.25,33,138],[149.632,0.055,38,89],[149.692,0.16,27,83],[149.692,0.14,39,50],[150.996,0.25,33,138],[150.996,0.055,38,89],[151.056,0.16,27,83],[151.056,0.14,39,50],[152.36,0.25,38,138],[152.36,0.055,38,89],[152.42,0.16,27,83],[152.42,0.14,39,50],[153.723,0.25,40,138],[153.723,0.055,38,89],[153.783,0.16,27,83],[153.783,0.14,39,50],[155.087,0.25,33,138],[155.087,0.055,38,89],[155.147,0.16,27,83],[155.147,0.14,39,50],[156.451,0.25,41,138],[156.451,0.055,38,89],[156.511,0.16,27,83],[156.511,0.14,39,50],[157.814,0.25,40,138],[157.814,0.055,38,89],[157.874,0.16,27,83],[157.874,0.14,39,50],[159.178,0.25,33,138],[159.178,0.055,38,89],[159.238,0.16,27,83],[159.238,0.14,39,50],[160.541,0.25,33,154],[160.542,0.055,38,89],[160.601,0.16,27,83],[160.601,0.14,39,50],[161.678,0.127,32,65],[161.905,0.25,33,154],[161.905,0.055,38,89],[161.965,0.16,27,83],[161.965,0.14,39,50],[163.041,0.127,37,65],[163.269,0.25,38,154],[163.269,0.055,38,89],[163.329,0.16,27,83],[163.329,0.14,39,50],[164.405,0.127,39,65],[164.632,0.25,40,154],[164.632,0.055,38,89],[164.692,0.16,27,83],[164.692,0.14,39,50],[165.996,0.25,33,154],[165.996,0.055,38,89],[166.056,0.16,27,83],[166.056,0.14,39,50],[167.132,0.127,40,65],[167.36,0.25,41,154],[167.36,0.055,38,89],[167.42,0.16,27,83],[167.42,0.14,39,50],[168.496,0.127,37,65],[168.723,0.25,38,154],[168.723,0.055,38,89],[168.783,0.16,27,83],[168.783,0.14,39,50],[169.86,0.127,39,65],[170.087,0.25,40,154],[170.087,0.055,38,89],[170.147,0.16,27,83],[170.147,0.14,39,50],[171.451,0.25,33,154],[171.451,0.055,38,89],[171.511,0.16,27,83],[171.511,0.14,39,50],[172.587,0.127,32,65],[172.814,0.25,33,154],[172.814,0.055,38,89],[172.874,0.16,27,83],[172.874,0.14,39,50],[173.951,0.127,37,65],[174.178,0.25,38,154],[174.178,0.055,38,89],[174.238,0.16,27,83],[174.238,0.14,39,50],[175.314,0.127,39,65],[175.541,0.25,40,154],[175.542,0.055,38,89],[175.601,0.16,27,83],[175.601,0.14,39,50],[176.905,0.25,33,154],[176.905,0.055,38,89],[176.965,0.16,27,83],[176.965,0.14,39,50],[178.041,0.127,40,65],[178.269,0.25,41,154],[178.269,0.055,38,89],[178.329,0.16,27,83],[178.329,0.14,39,50],[179.405,0.127,39,65],[179.632,0.25,40,154],[179.632,0.055,38,89],[179.692,0.16,27,83],[179.692,0.14,39,50],[180.769,0.127,32,65],[180.996,0.25,33,154],[180.996,0.055,38,89],[181.056,0.16,27,83],[181.056,0.14,39,50],[182.36,0.266,33,146],[182.36,0.055,38,89],[182.42,0.16,27,83],[182.42,0.14,39,50],[183.811,0.266,41,146],[183.811,0.055,38,89],[183.871,0.16,27,83],[183.871,0.14,39,50],[185.263,0.266,40,146],[185.263,0.055,38,89],[185.323,0.16,27,83],[185.323,0.14,39,50],[186.714,0.055,38,89],[186.714,0.266,33,146],[186.774,0.16,27,83],[186.774,0.14,39,50],[188.166,0.295,33,146],[188.166,0.055,38,89],[188.226,0.16,27,83],[188.226,0.14,39,50],[189.773,0.295,41,146],[189.773,0.055,38,89],[189.833,0.16,27,83],[189.833,0.14,39,50],[191.38,0.295,40,146],[191.38,0.055,38,89],[191.44,0.16,27,83],[191.44,0.14,39,50],[192.988,0.295,33,146],[192.988,0.055,38,89],[193.048,0.16,27,83],[193.048,0.14,39,50],[194.595,0.055,38,89],[194.655,0.16,27,83],[194.655,0.14,39,50],[195.195,0.055,38,84],[195.255,0.16,27,79],[195.255,0.14,39,47],[195.984,0.055,38,84],[196.044,0.16,27,79],[196.044,0.14,39,47],[196.774,0.055,38,84],[196.833,0.16,27,79],[196.833,0.14,39,47],[197.563,0.055,38,84],[197.623,0.16,27,79],[197.623,0.14,39,47],[198.352,0.055,38,84],[198.412,0.16,27,79],[198.412,0.14,39,47],[199.142,0.055,38,84],[199.202,0.16,27,79],[199.202,0.14,39,47],[199.931,0.055,38,84],[199.991,0.16,27,79],[199.991,0.14,39,47],[200.721,0.055,38,84],[200.781,0.16,27,79],[200.781,0.14,39,47],[201.51,0.055,38,84],[201.57,0.16,27,79],[201.57,0.14,39,47],[202.3,0.055,38,84],[202.36,0.16,27,79],[202.36,0.14,39,47],[203.089,0.055,38,84],[203.149,0.16,27,79],[203.149,0.14,39,47],[203.879,0.055,38,84],[203.939,0.16,27,79],[203.939,0.14,39,47],[204.668,0.055,38,84],[204.728,0.16,27,79],[204.728,0.14,39,47],[205.383,0.055,38,84],[205.443,0.16,27,79],[205.443,0.14,39,47],[206.097,0.055,38,84],[206.157,0.16,27,79],[206.157,0.14,39,47],[206.811,0.055,38,84],[206.871,0.16,27,79],[206.871,0.14,39,47],[207.525,0.055,38,84],[207.585,0.16,27,79],[207.585,0.14,39,47],[208.24,0.055,38,84],[208.3,0.16,27,79],[208.3,0.14,39,47],[208.954,0.055,38,84],[209.014,0.16,27,79],[209.014,0.14,39,47],[209.668,0.055,38,84],[209.728,0.16,27,79],[209.728,0.14,39,47],[210.383,0.055,38,84],[210.443,0.16,27,79],[210.443,0.14,39,47],[211.097,0.055,38,84],[211.157,0.16,27,79],[211.157,0.14,39,47],[211.811,0.055,38,84],[211.871,0.16,27,79],[211.871,0.14,39,47],[212.525,0.055,38,84],[212.585,0.16,27,79],[212.585,0.14,39,47],[213.24,0.055,38,84],[213.3,0.16,27,79],[213.3,0.14,39,47],[213.892,0.055,38,84],[213.952,0.16,27,79],[213.952,0.14,39,47],[214.544,0.055,38,84],[214.604,0.16,27,79],[214.604,0.14,39,47],[215.196,0.055,38,84],[215.256,0.16,27,79],[215.256,0.14,39,47],[215.848,0.055,38,84],[215.908,0.16,27,79],[215.908,0.14,39,47],[216.501,0.055,38,84],[216.561,0.16,27,79],[216.561,0.14,39,47],[217.153,0.055,38,84],[217.213,0.16,27,79],[217.213,0.14,39,47],[217.805,0.055,38,84],[217.865,0.16,27,79],[217.865,0.14,39,47],[218.457,0.055,38,84],[218.517,0.16,27,79],[218.517,0.14,39,47],[219.109,0.055,38,84],[219.169,0.16,27,79],[219.169,0.14,39,47],[219.761,0.055,38,84],[219.821,0.16,27,79],[219.821,0.14,39,47],[220.414,0.055,38,84],[220.474,0.16,27,79],[220.474,0.14,39,47],[221.066,0.055,38,84],[221.126,0.16,27,79],[221.126,0.14,39,47],[221.718,0.055,38,84],[221.778,0.16,27,79],[221.778,0.14,39,47],[222.37,0.055,38,84],[222.43,0.16,27,79],[222.43,0.14,39,47],[222.614,0.055,38,84],[222.674,0.16,27,79],[222.674,0.14,39,47],[223.328,0.055,38,84],[223.388,0.16,27,79],[223.388,0.14,39,47],[224.042,0.055,38,84],[224.102,0.16,27,79],[224.102,0.14,39,47],[224.757,0.055,38,84],[224.817,0.16,27,79],[224.817,0.14,39,47],[225.471,0.055,38,84],[225.531,0.16,27,79],[225.531,0.14,39,47],[226.185,0.055,38,84],[226.245,0.16,27,79],[226.245,0.14,39,47],[226.899,0.055,38,84],[226.959,0.16,27,79],[226.959,0.14,39,47],[227.614,0.055,38,84],[227.674,0.16,27,79],[227.674,0.14,39,47],[228.328,0.055,38,84],[228.388,0.16,27,79],[228.388,0.14,39,47],[228.98,0.055,38,84],[229.04,0.16,27,79],[229.04,0.14,39,47],[229.632,0.055,38,84],[229.692,0.16,27,79],[229.692,0.14,39,47],[230.284,0.055,38,84],[230.344,0.16,27,79],[230.344,0.14,39,47],[230.937,0.055,38,84],[230.997,0.16,27,79],[230.997,0.14,39,47],[231.589,0.055,38,84],[231.649,0.16,27,79],[231.649,0.14,39,47],[232.241,0.055,38,84],[232.301,0.16,27,79],[232.301,0.14,39,47],[232.893,0.055,38,84],[232.953,0.16,27,79],[232.953,0.14,39,47],[233.545,0.055,38,84],[233.605,0.16,27,79],[233.605,0.14,39,47],[234.145,0.055,38,84],[234.205,0.16,27,79],[234.205,0.14,39,47],[234.745,0.055,38,84],[234.805,0.16,27,79],[234.805,0.14,39,47],[235.345,0.055,38,84],[235.405,0.16,27,79],[235.405,0.14,39,47],[235.945,0.055,38,84],[236.005,0.16,27,79],[236.005,0.14,39,47],[236.545,0.055,38,84],[236.605,0.16,27,79],[236.605,0.14,39,47],[237.145,0.055,38,84],[237.205,0.16,27,79],[237.205,0.14,39,47],[237.745,0.055,38,84],[237.805,0.16,27,79],[237.805,0.14,39,47],[238.345,0.055,38,84],[238.405,0.16,27,79],[238.405,0.14,39,47],[238.945,0.055,38,84],[239.005,0.16,27,79],[239.005,0.14,39,47],[239.545,0.055,38,84],[239.605,0.16,27,79],[239.605,0.14,39,47],[240.145,0.055,38,84],[240.205,0.16,27,79],[240.205,0.14,39,47],[240.745,0.055,38,84],[240.805,0.16,27,79],[240.805,0.14,39,47],[241.345,0.055,38,84],[241.405,0.16,27,79],[241.405,0.14,39,47],[241.945,0.055,38,84],[242.005,0.16,27,79],[242.005,0.14,39,47],[242.545,0.055,38,84],[242.605,0.16,27,79],[242.605,0.14,39,47],[243.145,0.055,38,65],[243.205,0.16,27,61],[243.205,0.14,39,37],[244.574,0.055,38,65],[244.634,0.16,27,61],[244.634,0.14,39,37],[246.002,0.055,38,65],[246.062,0.16,27,61],[246.062,0.14,39,37],[247.431,0.055,38,65],[247.491,0.16,27,61],[247.491,0.14,39,37],[248.86,0.055,38,65],[248.92,0.16,27,61],[248.92,0.14,39,37],[250.288,0.055,38,65],[250.348,0.16,27,61],[250.348,0.14,39,37],[251.717,0.055,38,65],[251.777,0.16,27,61],[251.777,0.14,39,37],[253.145,0.055,38,65],[253.205,0.16,27,61],[253.205,0.14,39,37],[254.574,0.055,38,65],[254.634,0.16,27,61],[254.634,0.14,39,37],[256.002,0.055,38,65],[256.062,0.16,27,61],[256.062,0.14,39,37],[257.431,0.055,38,65],[257.491,0.16,27,61],[257.491,0.14,39,37],[258.86,0.055,38,65],[258.92,0.16,27,61],[258.92,0.14,39,37],[260.288,0.055,38,65],[260.348,0.16,27,61],[260.348,0.14,39,37],[261.717,0.055,38,65],[261.777,0.16,27,61],[261.777,0.14,39,37],[263.145,0.055,38,65],[263.205,0.16,27,61],[263.205,0.14,39,37],[264.574,0.055,38,65],[264.634,0.16,27,61],[264.634,0.14,39,37],[266.002,0.055,38,65],[266.062,0.16,27,61],[266.062,0.14,39,37],[267.431,0.055,38,65],[267.491,0.16,27,61],[267.491,0.14,39,37],[268.86,0.055,38,65],[268.92,0.16,27,61],[268.92,0.14,39,37],[270.288,0.055,38,65],[270.348,0.16,27,61],[270.348,0.14,39,37],[271.717,0.055,38,65],[271.777,0.16,27,61],[271.777,0.14,39,37],[273.145,0.055,38,65],[273.205,0.16,27,61],[273.205,0.14,39,37],[274.574,0.055,38,65],[274.634,0.16,27,61],[274.634,0.14,39,37],[276.002,0.055,38,65],[276.062,0.16,27,61],[276.062,0.14,39,37],[277.431,0.055,38,65],[277.491,0.16,27,61],[277.491,0.14,39,37],[278.86,0.055,38,65],[278.92,0.16,27,61],[278.92,0.14,39,37],[280.288,0.055,38,65],[280.348,0.16,27,61],[280.348,0.14,39,37],[281.717,0.055,38,65],[281.777,0.16,27,61],[281.777,0.14,39,37],[283.145,0.055,38,65],[283.205,0.16,27,61],[283.205,0.14,39,37],[284.574,0.055,38,65],[284.634,0.16,27,61],[284.634,0.14,39,37],[286.002,0.055,38,65],[286.062,0.16,27,61],[286.062,0.14,39,37],[287.431,0.055,38,65],[287.491,0.16,27,61],[287.491,0.14,39,37],[288.86,0.055,38,65],[288.92,0.16,27,61],[288.92,0.14,39,37],[290.288,0.055,38,65],[290.348,0.16,27,61],[290.348,0.14,39,37],[291.717,0.055,38,65],[291.777,0.16,27,61],[291.777,0.14,39,37],[293.145,0.055,38,65],[293.205,0.16,27,61],[293.205,0.14,39,37],[294.574,0.055,38,65],[294.634,0.16,27,61],[294.634,0.14,39,37],[296.002,0.055,38,65],[296.062,0.16,27,61],[296.062,0.14,39,37],[297.431,0.055,38,65],[297.491,0.16,27,61],[297.491,0.14,39,37],[298.86,0.055,38,65],[298.92,0.16,27,61],[298.92,0.14,39,37],[300.288,0.055,38,65],[300.348,0.16,27,61],[300.348,0.14,39,37],[301.488,0.055,38,79],[301.548,0.16,27,75],[301.548,0.14,39,45],[302.322,0.055,38,79],[302.382,0.16,27,75],[302.382,0.14,39,45],[303.155,0.055,38,79],[303.215,0.16,27,75],[303.215,0.14,39,45],[303.988,0.055,38,79],[304.048,0.16,27,75],[304.048,0.14,39,45],[304.822,0.055,38,79],[304.882,0.16,27,75],[304.882,0.14,39,45],[305.655,0.055,38,79],[305.715,0.16,27,75],[305.715,0.14,39,45],[306.488,0.055,38,79],[306.548,0.16,27,75],[306.548,0.14,39,45],[307.322,0.055,38,79],[307.382,0.16,27,75],[307.382,0.14,39,45],[308.155,0.055,38,79],[308.215,0.16,27,75],[308.215,0.14,39,45],[308.988,0.055,38,79],[309.048,0.16,27,75],[309.048,0.14,39,45],[309.822,0.055,38,79],[309.882,0.16,27,75],[309.882,0.14,39,45],[310.655,0.055,38,79],[310.715,0.16,27,75],[310.715,0.14,39,45],[311.488,0.055,38,79],[311.548,0.16,27,75],[311.548,0.14,39,45],[312.322,0.055,38,79],[312.382,0.16,27,75],[312.382,0.14,39,45],[313.155,0.055,38,79],[313.215,0.16,27,75],[313.215,0.14,39,45],[313.988,0.055,38,79],[314.048,0.16,27,75],[314.048,0.14,39,45],[314.822,0.055,38,79],[314.882,0.16,27,75],[314.882,0.14,39,45],[315.655,0.055,38,79],[315.715,0.16,27,75],[315.715,0.14,39,45],[316.488,0.055,38,79],[316.548,0.16,27,75],[316.548,0.14,39,45],[317.322,0.055,38,79],[317.382,0.16,27,75],[317.382,0.14,39,45],[318.155,0.055,38,79],[318.215,0.16,27,75],[318.215,0.14,39,45],[318.988,0.055,38,79],[319.048,0.16,27,75],[319.048,0.14,39,45],[319.822,0.055,38,79],[319.882,0.16,27,75],[319.882,0.14,39,45],[320.655,0.055,38,79],[320.715,0.16,27,75],[320.715,0.14,39,45],[321.488,0.055,38,79],[321.548,0.16,27,75],[321.548,0.14,39,45],[322.322,0.055,38,79],[322.382,0.16,27,75],[322.382,0.14,39,45],[323.155,0.055,38,79],[323.215,0.16,27,75],[323.215,0.14,39,45],[323.988,0.055,38,79],[324.048,0.16,27,75],[324.048,0.14,39,45],[324.822,0.055,38,79],[324.882,0.16,27,75],[324.882,0.14,39,45],[325.655,0.055,38,79],[325.715,0.16,27,75],[325.715,0.14,39,45],[326.488,0.055,38,79],[326.548,0.16,27,75],[326.548,0.14,39,45],[327.322,0.055,38,79],[327.382,0.16,27,75],[327.382,0.14,39,45],[328.155,0.055,38,79],[328.215,0.16,27,75],[328.215,0.14,39,45],[328.988,0.055,38,79],[329.048,0.16,27,75],[329.048,0.14,39,45],[329.822,0.055,38,79],[329.882,0.16,27,75],[329.882,0.14,39,45],[330.655,0.055,38,79],[330.715,0.16,27,75],[330.715,0.14,39,45],[331.488,0.055,38,79],[331.548,0.16,27,75],[331.548,0.14,39,45],[332.322,0.055,38,79],[332.382,0.16,27,75],[332.382,0.14,39,45],[333.155,0.055,38,79],[333.215,0.16,27,75],[333.215,0.14,39,45],[333.988,0.055,38,79],[334.048,0.16,27,75],[334.048,0.14,39,45],[334.822,0.055,38,79],[334.882,0.16,27,75],[334.882,0.14,39,45],[335.655,0.055,38,79],[335.715,0.16,27,75],[335.715,0.14,39,45],[336.488,0.055,38,79],[336.548,0.16,27,75],[336.548,0.14,39,45],[337.322,0.055,38,79],[337.382,0.16,27,75],[337.382,0.14,39,45],[338.155,0.055,38,79],[338.215,0.16,27,75],[338.215,0.14,39,45],[338.988,0.055,38,79],[339.048,0.16,27,75],[339.048,0.14,39,45],[339.822,0.055,38,79],[339.882,0.16,27,75],[339.882,0.14,39,45],[340.655,0.055,38,79],[340.715,0.16,27,75],[340.715,0.14,39,45],[341.488,0.055,38,79],[341.548,0.16,27,75],[341.548,0.14,39,45],[342.322,0.055,38,79],[342.382,0.16,27,75],[342.382,0.14,39,45],[343.155,0.055,38,79],[343.215,0.16,27,75],[343.215,0.14,39,45],[343.988,0.055,38,79],[344.048,0.16,27,75],[344.048,0.14,39,45],[344.822,0.055,38,79],[344.882,0.16,27,75],[344.882,0.14,39,45],[345.655,0.055,38,79],[345.715,0.16,27,75],[345.715,0.14,39,45],[346.488,0.055,38,79],[346.548,0.16,27,75],[346.548,0.14,39,45],[347.322,0.055,38,79],[347.382,0.16,27,75],[347.382,0.14,39,45],[348.155,0.055,38,79],[348.215,0.16,27,75],[348.215,0.14,39,45],[348.988,0.055,38,79],[349.048,0.16,27,75],[349.048,0.14,39,45],[349.822,0.055,38,79],[349.882,0.16,27,75],[349.882,0.14,39,45],[350.655,0.055,38,79],[350.715,0.16,27,75],[350.715,0.14,39,45],[351.488,0.055,38,79],[351.548,0.16,27,75],[351.548,0.14,39,45],[352.322,0.055,38,79],[352.382,0.16,27,75],[352.382,0.14,39,45],[353.155,0.055,38,79],[353.215,0.16,27,75],[353.215,0.14,39,45],[353.988,0.055,38,79],[354.048,0.16,27,75],[354.048,0.14,39,45],[354.822,0.055,38,79],[354.882,0.16,27,75],[354.882,0.14,39,45],[355.655,0.055,38,79],[355.715,0.16,27,75],[355.715,0.14,39,45],[356.488,0.055,38,79],[356.548,0.16,27,75],[356.548,0.14,39,45],[357.322,0.055,38,79],[357.382,0.16,27,75],[357.382,0.14,39,45],[358.155,0.055,38,79],[358.215,0.16,27,75],[358.215,0.14,39,45],[358.988,0.055,38,79],[359.048,0.16,27,75],[359.048,0.14,39,45],[359.822,0.055,38,79],[359.882,0.16,27,75],[359.882,0.14,39,45],[360.655,0.055,38,79],[360.715,0.16,27,75],[360.715,0.14,39,45],[361.488,0.055,38,79],[361.548,0.16,27,75],[361.548,0.14,39,45],[362.322,0.055,38,79],[362.382,0.16,27,75],[362.382,0.14,39,45],[363.155,0.055,38,79],[363.215,0.16,27,75],[363.215,0.14,39,45],[363.988,0.055,38,79],[364.048,0.16,27,75],[364.048,0.14,39,45],[364.822,0.055,38,79],[364.882,0.16,27,75],[364.882,0.14,39,45],[365.655,0.055,38,79],[365.715,0.16,27,75],[365.715,0.14,39,45],[366.488,0.055,38,79],[366.548,0.16,27,75],[366.548,0.14,39,45],[367.322,0.055,38,79],[367.382,0.16,27,75],[367.382,0.14,39,45],[368.155,0.055,38,79],[368.215,0.16,27,75],[368.215,0.14,39,45],[368.988,0.055,38,79],[369.048,0.16,27,75],[369.048,0.14,39,45],[369.822,0.055,38,79],[369.882,0.16,27,75],[369.882,0.14,39,45],[370.655,0.055,38,79],[370.715,0.16,27,75],[370.715,0.14,39,45],[371.488,0.055,38,79],[371.548,0.16,27,75],[371.548,0.14,39,45],[372.322,0.055,38,79],[372.382,0.16,27,75],[372.382,0.14,39,45],[373.155,0.055,38,79],[373.215,0.16,27,75],[373.215,0.14,39,45],[373.988,0.055,38,79],[374.048,0.16,27,75],[374.048,0.14,39,45],[374.822,0.055,38,79],[374.882,0.16,27,75],[374.882,0.14,39,45],[375.655,0.055,38,79],[375.715,0.16,27,75],[375.715,0.14,39,45],[375.822,0.857,36,122],[375.822,0.055,38,75],[375.882,0.16,27,70],[375.882,0.14,39,42],[376.893,0.055,38,75],[376.893,0.857,36,122],[376.953,0.16,27,70],[376.953,0.14,39,42],[377.964,0.857,36,130],[377.964,0.055,38,75],[378.024,0.16,27,70],[378.024,0.14,39,42],[379.036,0.857,36,130],[379.036,0.055,38,75],[379.096,0.16,27,70],[379.096,0.14,39,42],[380.107,0.857,33,137],[380.107,0.055,38,75],[380.167,0.16,27,70],[380.167,0.14,39,42],[381.179,0.055,38,75],[381.179,0.857,33,137],[381.239,0.16,27,70],[381.239,0.14,39,42],[382.25,0.857,33,145],[382.25,0.055,38,75],[382.31,0.16,27,70],[382.31,0.14,39,42],[383.322,0.857,33,145],[383.322,0.055,38,75],[383.382,0.16,27,70],[383.382,0.14,39,42],[384.393,0.055,38,75],[384.393,0.857,29,152],[384.453,0.16,27,70],[384.453,0.14,39,42],[385.464,0.857,29,152],[385.464,0.055,38,75],[385.524,0.16,27,70],[385.524,0.14,39,42],[386.536,0.857,29,159],[386.536,0.055,38,75],[386.596,0.16,27,70],[386.596,0.14,39,42],[387.607,0.857,29,159],[387.607,0.055,38,75],[387.667,0.16,27,70],[387.667,0.14,39,42],[388.679,0.055,38,75],[388.679,0.857,31,167],[388.739,0.16,27,70],[388.739,0.14,39,42],[389.75,0.857,31,167],[389.75,0.055,38,75],[389.81,0.16,27,70],[389.81,0.14,39,42],[390.822,1.929,36,147],[390.822,0.055,38,75],[390.882,0.16,27,70],[390.882,0.14,39,42],[391.893,0.055,38,75],[391.953,0.16,27,70],[391.953,0.14,39,42],[392.964,0.248,36,111],[392.964,0.055,38,75],[393.024,0.16,27,70],[393.024,0.14,39,42],[393.352,0.248,43,111],[393.999,0.248,36,111],[393.999,0.055,38,75],[394.059,0.16,27,70],[394.059,0.14,39,42],[394.775,0.248,35,111],[395.033,0.248,36,118],[395.033,0.055,38,75],[395.093,0.16,27,70],[395.093,0.14,39,42],[395.421,0.248,43,118],[396.068,0.248,36,118],[396.068,0.055,38,75],[396.128,0.16,27,70],[396.128,0.14,39,42],[396.844,0.248,32,118],[397.102,0.248,33,124],[397.102,0.055,38,75],[397.162,0.16,27,70],[397.162,0.14,39,42],[397.49,0.248,40,124],[398.137,0.248,33,124],[398.137,0.055,38,75],[398.197,0.16,27,70],[398.197,0.14,39,42],[398.913,0.248,32,124],[399.171,0.248,33,131],[399.171,0.055,38,75],[399.231,0.16,27,70],[399.231,0.14,39,42],[399.559,0.248,40,131],[400.206,0.248,33,131],[400.206,0.055,38,75],[400.266,0.16,27,70],[400.266,0.14,39,42],[400.982,0.248,28,131],[401.24,0.248,29,137],[401.24,0.055,38,75],[401.3,0.16,27,70],[401.3,0.14,39,42],[401.628,0.248,36,137],[402.275,0.248,29,137],[402.275,0.055,38,75],[402.335,0.16,27,70],[402.335,0.14,39,42],[403.051,0.248,28,137],[403.309,0.248,29,144],[403.309,0.055,38,75],[403.369,0.16,27,70],[403.369,0.14,39,42],[403.697,0.248,36,144],[404.344,0.248,29,144],[404.344,0.055,38,75],[404.404,0.16,27,70],[404.404,0.14,39,42],[405.12,0.248,30,144],[405.378,0.248,31,151],[405.378,0.055,38,75],[405.438,0.16,27,70],[405.438,0.14,39,42],[405.766,0.248,38,151],[406.413,0.248,31,151],[406.413,0.055,38,75],[406.473,0.16,27,70],[406.473,0.14,39,42],[407.188,0.248,35,151],[407.447,1.862,36,155],[407.447,0.055,38,75],[407.507,0.16,27,70],[407.507,0.14,39,42],[408.482,0.055,38,75],[408.542,0.16,27,70],[408.542,0.14,39,42],[409.516,0.24,36,117],[409.516,0.055,38,75],[409.576,0.16,27,70],[409.576,0.14,39,42],[409.891,0.24,43,117],[410.516,0.24,36,117],[410.516,0.055,38,75],[410.576,0.16,27,70],[410.576,0.14,39,42],[411.266,0.24,35,117],[411.516,0.24,36,124],[411.516,0.055,38,75],[411.576,0.16,27,70],[411.576,0.14,39,42],[411.891,0.24,43,124],[412.516,0.24,36,124],[412.516,0.055,38,75],[412.576,0.16,27,70],[412.576,0.14,39,42],[413.266,0.24,32,124],[413.516,0.24,33,131],[413.516,0.055,38,75],[413.576,0.16,27,70],[413.576,0.14,39,42],[413.891,0.24,40,131],[414.516,0.24,33,131],[414.516,0.055,38,75],[414.576,0.16,27,70],[414.576,0.14,39,42],[415.266,0.24,32,131],[415.516,0.24,33,138],[415.516,0.055,38,75],[415.576,0.16,27,70],[415.576,0.14,39,42],[415.891,0.24,40,138],[416.516,0.24,33,138],[416.516,0.055,38,75],[416.576,0.16,27,70],[416.576,0.14,39,42],[417.266,0.24,28,138],[417.516,0.24,29,145],[417.516,0.055,38,75],[417.576,0.16,27,70],[417.576,0.14,39,42],[417.891,0.24,36,145],[418.516,0.24,29,145],[418.516,0.055,38,75],[418.576,0.16,27,70],[418.576,0.14,39,42],[419.266,0.24,28,145],[419.516,0.24,29,152],[419.516,0.055,38,75],[419.576,0.16,27,70],[419.576,0.14,39,42],[419.891,0.24,36,152],[420.516,0.24,29,152],[420.516,0.055,38,75],[420.576,0.16,27,70],[420.576,0.14,39,42],[421.266,0.24,30,152],[421.516,0.24,31,159],[421.516,0.055,38,75],[421.576,0.16,27,70],[421.576,0.14,39,42],[421.891,0.24,38,159],[422.516,0.24,31,159],[422.516,0.055,38,75],[422.576,0.16,27,70],[422.576,0.14,39,42],[423.266,0.24,35,159],[423.516,1.8,36,163],[423.516,0.055,38,75],[423.576,0.16,27,70],[423.576,0.14,39,42],[424.516,0.055,38,75],[424.576,0.16,27,70],[424.576,0.14,39,42],[425.516,0.232,36,117],[425.516,0.055,38,75],[425.576,0.16,27,70],[425.576,0.14,39,42],[425.879,0.232,43,117],[426.484,0.055,38,75],[426.484,0.232,36,117],[426.544,0.16,27,70],[426.544,0.14,39,42],[427.21,0.232,35,117],[427.452,0.232,36,124],[427.452,0.055,38,75],[427.512,0.16,27,70],[427.512,0.14,39,42],[427.815,0.232,43,124],[428.419,0.232,36,124],[428.419,0.055,38,75],[428.479,0.16,27,70],[428.479,0.14,39,42],[429.145,0.232,32,124],[429.387,0.232,33,131],[429.387,0.055,38,75],[429.447,0.16,27,70],[429.447,0.14,39,42],[429.75,0.232,40,131],[430.355,0.232,33,131],[430.355,0.055,38,75],[430.415,0.16,27,70],[430.415,0.14,39,42],[431.081,0.232,32,131],[431.323,0.232,33,138],[431.323,0.055,38,75],[431.383,0.16,27,70],[431.383,0.14,39,42],[431.685,0.232,40,138],[432.29,0.232,33,138],[432.29,0.055,38,75],[432.35,0.16,27,70],[432.35,0.14,39,42],[433.016,0.232,28,138],[433.258,0.232,29,145],[433.258,0.055,38,75],[433.318,0.16,27,70],[433.318,0.14,39,42],[433.621,0.232,36,145],[434.226,0.232,29,145],[434.226,0.055,38,75],[434.286,0.16,27,70],[434.286,0.14,39,42],[434.952,0.232,28,145],[435.193,0.232,29,152],[435.193,0.055,38,75],[435.253,0.16,27,70],[435.253,0.14,39,42],[435.556,0.232,36,152],[436.161,0.232,29,152],[436.161,0.055,38,75],[436.221,0.16,27,70],[436.221,0.14,39,42],[436.887,0.232,30,152],[437.129,0.232,31,159],[437.129,0.055,38,75],[437.189,0.16,27,70],[437.189,0.14,39,42],[437.492,0.232,38,159],[438.097,0.055,38,75],[438.097,0.232,31,159],[438.157,0.16,27,70],[438.157,0.14,39,42],[438.823,0.232,35,159],[439.065,1.742,36,163],[439.065,0.055,38,75],[439.125,0.16,27,70],[439.125,0.14,39,42],[440.032,0.055,38,75],[440.092,0.16,27,70],[440.092,0.14,39,42],[441,0.21,38,154],[441,0.055,38,246],[441.06,0.16,27,231],[441.06,0.14,39,138],[441.75,0.21,38,154],[442,0.21,38,154],[442,0.055,38,246],[442.06,0.16,27,231],[442.06,0.14,39,138],[442.75,0.21,38,154],[443,0.21,38,163],[443,0.055,38,255],[443.06,0.16,27,245],[443.06,0.14,39,147],[443.75,0.21,38,163],[444,0.21,38,163],[444,0.055,38,255],[444.06,0.16,27,245],[444.06,0.14,39,147],[444.75,0.21,38,163],[445,0.21,35,172],[445,0.055,38,255],[445.06,0.16,27,255],[445.06,0.14,39,155],[445.75,0.21,35,172],[446,0.21,35,172],[446,0.055,38,255],[446.06,0.16,27,255],[446.06,0.14,39,155],[446.75,0.21,35,172],[447,0.21,35,181],[447,0.055,38,255],[447.06,0.16,27,255],[447.06,0.14,39,163],[447.75,0.21,35,181],[448,0.21,35,181],[448,0.055,38,255],[448.06,0.16,27,255],[448.06,0.14,39,163],[448.75,0.21,35,181],[448.75,0.055,38,255],[448.81,0.16,27,255],[448.81,0.14,39,163],[449,0.21,31,191],[449,0.055,38,255],[449.06,0.16,27,255],[449.06,0.14,39,172],[449.75,0.21,31,191],[450,0.21,31,191],[450,0.055,38,255],[450.06,0.16,27,255],[450.06,0.14,39,172],[450.75,0.21,31,191],[451,0.21,31,200],[451,0.055,38,255],[451.06,0.16,27,255],[451.06,0.14,39,180],[451.75,0.21,31,200],[452,0.21,31,200],[452,0.055,38,255],[452.06,0.16,27,255],[452.06,0.14,39,180],[452.75,0.21,31,200],[453,0.21,33,209],[453,0.055,38,255],[453.06,0.16,27,255],[453.06,0.14,39,188],[453.75,0.21,33,209],[454,0.21,33,209],[454,0.055,38,255],[454.06,0.16,27,255],[454.06,0.14,39,188],[454.75,0.21,33,209],[455,0.21,38,194],[455,0.055,38,255],[455.06,0.16,27,255],[455.06,0.14,39,175],[455.75,0.21,38,194],[456,0.21,38,194],[456,0.055,38,255],[456.06,0.16,27,255],[456.06,0.14,39,175],[456.75,0.21,38,194],[456.75,0.055,38,255],[456.81,0.16,27,255],[456.81,0.14,39,175],[457,0.21,38,162],[457,0.055,38,255],[457.06,0.16,27,243],[457.06,0.14,39,146],[457.75,0.21,38,162],[458,0.21,38,162],[458,0.055,38,255],[458.06,0.16,27,243],[458.06,0.14,39,146],[458.75,0.21,38,162],[459,0.21,38,172],[459,0.055,38,255],[459.06,0.16,27,255],[459.06,0.14,39,155],[459.75,0.21,38,172],[460,0.21,38,172],[460,0.055,38,255],[460.06,0.16,27,255],[460.06,0.14,39,155],[460.75,0.21,38,172],[461,0.21,35,181],[461,0.055,38,255],[461.06,0.16,27,255],[461.06,0.14,39,163],[461.75,0.21,35,181],[462,0.21,35,181],[462,0.055,38,255],[462.06,0.16,27,255],[462.06,0.14,39,163],[462.75,0.21,35,181],[463,0.21,35,191],[463,0.055,38,255],[463.06,0.16,27,255],[463.06,0.14,39,172],[463.75,0.21,35,191],[464,0.21,35,191],[464,0.055,38,255],[464.06,0.16,27,255],[464.06,0.14,39,172],[464.75,0.21,35,191],[464.75,0.055,38,255],[464.81,0.16,27,255],[464.81,0.14,39,172],[465,0.21,31,201],[465,0.055,38,255],[465.06,0.16,27,255],[465.06,0.14,39,181],[465.75,0.21,31,201],[466,0.21,31,201],[466,0.055,38,255],[466.06,0.16,27,255],[466.06,0.14,39,181],[466.75,0.21,31,201],[467,0.21,31,211],[467,0.055,38,255],[467.06,0.16,27,255],[467.06,0.14,39,190],[467.75,0.21,31,211],[468,0.21,31,211],[468,0.055,38,255],[468.06,0.16,27,255],[468.06,0.14,39,190],[468.75,0.21,31,211],[469,0.21,33,220],[469,0.055,38,255],[469.06,0.16,27,255],[469.06,0.14,39,198],[469.75,0.21,33,220],[470,0.21,33,220],[470,0.055,38,255],[470.06,0.16,27,255],[470.06,0.14,39,198],[470.75,0.21,33,220],[471,0.21,38,204],[471,0.055,38,255],[471.06,0.16,27,255],[471.06,0.14,39,184],[471.75,0.21,38,204],[472,0.21,38,204],[472,0.055,38,255],[472.06,0.16,27,255],[472.06,0.14,39,184],[472.75,0.21,38,204],[472.75,0.055,38,255],[472.81,0.16,27,255],[472.81,0.14,39,184],[473,0.207,38,162],[473,0.055,38,255],[473.06,0.16,27,243],[473.06,0.14,39,146],[473.738,0.207,38,162],[473.984,0.207,38,162],[473.984,0.055,38,255],[474.044,0.16,27,243],[474.044,0.14,39,146],[474.721,0.207,38,162],[474.967,0.207,38,172],[474.967,0.055,38,255],[475.027,0.16,27,255],[475.027,0.14,39,155],[475.705,0.207,38,172],[475.951,0.207,38,172],[475.951,0.055,38,255],[476.011,0.16,27,255],[476.011,0.14,39,155],[476.688,0.207,38,172],[476.934,0.207,35,181],[476.934,0.055,38,255],[476.994,0.16,27,255],[476.994,0.14,39,163],[477.672,0.207,35,181],[477.918,0.207,35,181],[477.918,0.055,38,255],[477.978,0.16,27,255],[477.978,0.14,39,163],[478.656,0.207,35,181],[478.902,0.207,35,191],[478.902,0.055,38,255],[478.962,0.16,27,255],[478.962,0.14,39,172],[479.639,0.207,35,191],[479.885,0.207,35,191],[479.885,0.055,38,255],[479.945,0.16,27,255],[479.945,0.14,39,172],[480.623,0.207,35,191],[480.623,0.055,38,255],[480.683,0.16,27,255],[480.683,0.14,39,172],[480.869,0.207,31,201],[480.869,0.055,38,255],[480.929,0.16,27,255],[480.929,0.14,39,181],[481.606,0.207,31,201],[481.852,0.207,31,201],[481.852,0.055,38,255],[481.912,0.16,27,255],[481.912,0.14,39,181],[482.59,0.207,31,201],[482.836,0.207,31,211],[482.836,0.055,38,255],[482.896,0.16,27,255],[482.896,0.14,39,190],[483.574,0.207,31,211],[483.82,0.207,31,211],[483.82,0.055,38,255],[483.88,0.16,27,255],[483.88,0.14,39,190],[484.557,0.207,31,211],[484.803,0.207,33,220],[484.803,0.055,38,255],[484.863,0.16,27,255],[484.863,0.14,39,198],[485.541,0.207,33,220],[485.787,0.207,33,220],[485.787,0.055,38,255],[485.847,0.16,27,255],[485.847,0.14,39,198],[486.525,0.207,33,220],[486.771,0.207,38,204],[486.771,0.055,38,255],[486.83,0.16,27,255],[486.83,0.14,39,184],[487.508,0.207,38,204],[487.754,0.207,38,204],[487.754,0.055,38,255],[487.814,0.16,27,255],[487.814,0.14,39,184],[488.492,0.207,38,204],[488.492,0.055,38,255],[488.552,0.16,27,255],[488.552,0.14,39,184],[488.738,0.203,38,170],[488.738,0.055,38,255],[488.798,0.16,27,255],[488.798,0.14,39,153],[489.464,0.203,38,170],[489.705,0.203,38,170],[489.705,0.055,38,255],[489.765,0.16,27,255],[489.765,0.14,39,153],[490.431,0.203,38,170],[490.673,0.203,38,180],[490.673,0.055,38,255],[490.733,0.16,27,255],[490.733,0.14,39,162],[491.399,0.203,38,180],[491.641,0.203,38,180],[491.641,0.055,38,255],[491.701,0.16,27,255],[491.701,0.14,39,162],[492.367,0.203,38,180],[492.609,0.203,35,191],[492.609,0.055,38,255],[492.669,0.16,27,255],[492.669,0.14,39,171],[493.334,0.203,35,191],[493.576,0.203,35,191],[493.576,0.055,38,255],[493.636,0.16,27,255],[493.636,0.14,39,171],[494.302,0.203,35,191],[494.544,0.203,35,201],[494.544,0.055,38,255],[494.604,0.16,27,255],[494.604,0.14,39,181],[495.27,0.203,35,201],[495.512,0.203,35,201],[495.512,0.055,38,255],[495.572,0.16,27,255],[495.572,0.14,39,181],[496.238,0.203,35,201],[496.238,0.055,38,255],[496.298,0.16,27,255],[496.298,0.14,39,181],[496.48,0.203,31,211],[496.48,0.055,38,255],[496.54,0.16,27,255],[496.54,0.14,39,190],[497.205,0.203,31,211],[497.447,0.203,31,211],[497.447,0.055,38,255],[497.507,0.16,27,255],[497.507,0.14,39,190],[498.173,0.203,31,211],[498.415,0.203,31,221],[498.415,0.055,38,255],[498.475,0.16,27,255],[498.475,0.14,39,199],[499.141,0.203,31,221],[499.383,0.203,31,221],[499.383,0.055,38,255],[499.443,0.16,27,255],[499.443,0.14,39,199],[500.109,0.203,31,221],[500.351,0.203,33,231],[500.351,0.055,38,255],[500.411,0.16,27,255],[500.411,0.14,39,208],[501.076,0.203,33,231],[501.318,0.203,33,231],[501.318,0.055,38,255],[501.378,0.16,27,255],[501.378,0.14,39,208],[502.044,0.203,33,231],[502.286,0.203,38,214],[502.286,0.055,38,255],[502.346,0.16,27,255],[502.346,0.14,39,193],[503.012,0.203,38,214],[503.254,0.203,38,214],[503.254,0.055,38,255],[503.314,0.16,27,255],[503.314,0.14,39,193],[503.98,0.203,38,214],[503.98,0.055,38,255],[504.04,0.16,27,255],[504.04,0.14,39,193],[504.222,0.203,38,170],[504.222,0.055,38,255],[504.282,0.16,27,255],[504.282,0.14,39,153],[504.947,0.203,38,170],[505.189,0.203,38,170],[505.189,0.055,38,255],[505.249,0.16,27,255],[505.249,0.14,39,153],[505.915,0.203,38,170],[506.157,0.203,38,180],[506.157,0.055,38,255],[506.217,0.16,27,255],[506.217,0.14,39,162],[506.883,0.203,38,180],[507.125,0.203,38,180],[507.125,0.055,38,255],[507.185,0.16,27,255],[507.185,0.14,39,162],[507.851,0.203,38,180],[508.092,0.203,35,191],[508.092,0.055,38,255],[508.152,0.16,27,255],[508.152,0.14,39,171],[508.818,0.203,35,191],[509.06,0.203,35,191],[509.06,0.055,38,255],[509.12,0.16,27,255],[509.12,0.14,39,171],[509.786,0.203,35,191],[510.028,0.203,35,201],[510.028,0.055,38,255],[510.088,0.16,27,255],[510.088,0.14,39,181],[510.754,0.203,35,201],[510.996,0.203,35,201],[510.996,0.055,38,255],[511.056,0.16,27,255],[511.056,0.14,39,181],[511.722,0.203,35,201],[511.722,0.055,38,255],[511.782,0.16,27,255],[511.782,0.14,39,181],[511.964,0.203,31,211],[511.964,0.055,38,255],[512.024,0.16,27,255],[512.024,0.14,39,190],[512.689,0.203,31,211],[512.931,0.203,31,211],[512.931,0.055,38,255],[512.991,0.16,27,255],[512.991,0.14,39,190],[513.657,0.203,31,211],[513.899,0.203,31,221],[513.899,0.055,38,255],[513.959,0.16,27,255],[513.959,0.14,39,199],[514.625,0.203,31,221],[514.867,0.203,31,221],[514.867,0.055,38,255],[514.927,0.16,27,255],[514.927,0.14,39,199],[515.592,0.203,31,221],[515.835,0.203,33,231],[515.835,0.055,38,255],[515.894,0.16,27,255],[515.894,0.14,39,208],[516.56,0.203,33,231],[516.802,0.203,33,231],[516.802,0.055,38,255],[516.862,0.16,27,255],[516.862,0.14,39,208],[517.528,0.203,33,231],[517.77,0.203,38,214],[517.77,0.055,38,255],[517.83,0.16,27,255],[517.83,0.14,39,193],[518.496,0.203,38,214],[518.738,0.203,38,214],[518.738,0.055,38,255],[518.798,0.16,27,255],[518.798,0.14,39,193],[519.463,0.203,38,214],[519.463,0.055,38,255],[519.524,0.16,27,255],[519.524,0.14,39,193],[519.705,0.207,38,162],[519.705,0.055,38,255],[519.765,0.16,27,243],[519.765,0.14,39,146],[520.443,0.207,38,162],[520.689,0.207,38,162],[520.689,0.055,38,255],[520.749,0.16,27,243],[520.749,0.14,39,146],[521.427,0.207,38,162],[521.673,0.207,38,172],[521.673,0.055,38,255],[521.733,0.16,27,255],[521.733,0.14,39,155],[522.41,0.207,38,172],[522.656,0.207,38,172],[522.656,0.055,38,255],[522.716,0.16,27,255],[522.716,0.14,39,155],[523.394,0.207,38,172],[523.64,0.207,35,181],[523.64,0.055,38,255],[523.7,0.16,27,255],[523.7,0.14,39,163],[524.378,0.207,35,181],[524.624,0.207,35,181],[524.624,0.055,38,255],[524.683,0.16,27,255],[524.683,0.14,39,163],[525.361,0.207,35,181],[525.607,0.207,35,191],[525.607,0.055,38,255],[525.667,0.16,27,255],[525.667,0.14,39,172],[526.345,0.207,35,191],[526.591,0.207,35,191],[526.591,0.055,38,255],[526.651,0.16,27,255],[526.651,0.14,39,172],[527.328,0.207,35,191],[527.328,0.055,38,255],[527.388,0.16,27,255],[527.388,0.14,39,172],[527.574,0.207,31,201],[527.574,0.055,38,255],[527.634,0.16,27,255],[527.634,0.14,39,181],[528.312,0.207,31,201],[528.558,0.207,31,201],[528.558,0.055,38,255],[528.618,0.16,27,255],[528.618,0.14,39,181],[529.296,0.207,31,201],[529.542,0.207,31,211],[529.542,0.055,38,255],[529.601,0.16,27,255],[529.601,0.14,39,190],[530.279,0.207,31,211],[530.525,0.207,31,211],[530.525,0.055,38,255],[530.585,0.16,27,255],[530.585,0.14,39,190],[531.263,0.207,31,211],[531.509,0.207,33,220],[531.509,0.055,38,255],[531.569,0.16,27,255],[531.569,0.14,39,198],[532.246,0.207,33,220],[532.492,0.207,33,220],[532.492,0.055,38,255],[532.552,0.16,27,255],[532.552,0.14,39,198],[533.23,0.207,33,220],[533.476,0.207,38,204],[533.476,0.055,38,255],[533.536,0.16,27,255],[533.536,0.14,39,184],[534.214,0.207,38,204],[534.46,0.207,38,204],[534.46,0.055,38,255],[534.519,0.16,27,255],[534.519,0.14,39,184],[535.197,0.207,38,204],[535.197,0.055,38,255],[535.257,0.16,27,255],[535.257,0.14,39,184],[535.443,0.214,38,162],[535.443,0.055,38,255],[535.503,0.16,27,243],[535.503,0.14,39,146],[536.206,0.214,38,162],[536.46,0.214,38,162],[536.46,0.055,38,255],[536.52,0.16,27,243],[536.52,0.14,39,146],[537.223,0.214,38,162],[537.477,0.214,38,172],[537.477,0.055,38,255],[537.537,0.16,27,255],[537.537,0.14,39,155],[538.24,0.214,38,172],[538.494,0.214,38,172],[538.494,0.055,38,255],[538.554,0.16,27,255],[538.554,0.14,39,155],[539.257,0.214,38,172],[539.511,0.214,35,181],[539.511,0.055,38,255],[539.571,0.16,27,255],[539.571,0.14,39,163],[540.274,0.214,35,181],[540.528,0.214,35,181],[540.528,0.055,38,255],[540.588,0.16,27,255],[540.588,0.14,39,163],[541.291,0.214,35,181],[541.545,0.214,35,191],[541.545,0.055,38,255],[541.605,0.16,27,255],[541.605,0.14,39,172],[542.308,0.214,35,191],[542.562,0.214,35,191],[542.562,0.055,38,255],[542.622,0.16,27,255],[542.622,0.14,39,172],[543.324,0.214,35,191],[543.324,0.055,38,255],[543.385,0.16,27,255],[543.385,0.14,39,172],[543.579,0.214,31,201],[543.579,0.055,38,255],[543.639,0.16,27,255],[543.639,0.14,39,181],[544.341,0.214,31,201],[544.596,0.214,31,201],[544.596,0.055,38,255],[544.656,0.16,27,255],[544.656,0.14,39,181],[545.358,0.214,31,201],[545.613,0.214,31,211],[545.613,0.055,38,255],[545.673,0.16,27,255],[545.673,0.14,39,190],[546.375,0.214,31,211],[546.63,0.214,31,211],[546.63,0.055,38,255],[546.69,0.16,27,255],[546.69,0.14,39,190],[547.392,0.214,31,211],[547.646,0.214,33,220],[547.646,4.068,38,162],[547.646,0.055,38,255],[547.707,0.16,27,255],[547.707,0.14,39,198],[548.409,0.214,33,220],[548.663,0.214,33,220],[548.663,0.055,38,255],[548.723,0.16,27,255],[548.723,0.14,39,198],[549.426,0.214,33,220],[549.68,0.214,38,204],[549.68,0.055,38,255],[549.74,0.16,27,255],[549.74,0.14,39,184],[550.443,0.214,38,204],[550.697,0.214,38,204],[550.697,0.055,38,255],[550.757,0.16,27,255],[550.757,0.14,39,184],[551.46,0.214,38,204],[551.46,0.055,38,255],[551.52,0.16,27,255],[551.52,0.14,39,184],[551.714,0.055,38,75],[551.774,0.16,27,70],[551.774,0.14,39,42],[552.731,0.055,38,75],[552.791,0.16,27,70],[552.791,0.14,39,42],[553.748,0.055,38,75],[553.808,0.16,27,70],[553.808,0.14,39,42],[554.314,0.055,38,93],[554.374,0.16,27,87],[554.374,0.14,39,52],[555.223,0.055,38,93],[555.283,0.16,27,87],[555.283,0.14,39,52],[556.133,0.055,38,93],[556.192,0.16,27,87],[556.192,0.14,39,52],[557.042,0.055,38,93],[557.102,0.16,27,87],[557.102,0.14,39,52],[557.951,0.055,38,93],[558.011,0.16,27,87],[558.011,0.14,39,52],[558.86,0.055,38,93],[558.92,0.16,27,87],[558.92,0.14,39,52],[559.769,0.055,38,93],[559.829,0.16,27,87],[559.829,0.14,39,52],[560.678,0.055,38,93],[560.738,0.16,27,87],[560.738,0.14,39,52],[561.587,0.055,38,93],[561.647,0.16,27,87],[561.647,0.14,39,52],[562.496,0.055,38,93],[562.556,0.16,27,87],[562.556,0.14,39,52],[563.405,0.055,38,93],[563.465,0.16,27,87],[563.465,0.14,39,52],[564.314,0.055,38,93],[564.374,0.16,27,87],[564.374,0.14,39,52],[565.223,0.055,38,93],[565.283,0.16,27,87],[565.283,0.14,39,52],[566.133,0.055,38,93],[566.192,0.16,27,87],[566.192,0.14,39,52],[567.042,0.055,38,93],[567.102,0.16,27,87],[567.102,0.14,39,52],[567.951,0.055,38,93],[568.011,0.16,27,87],[568.011,0.14,39,52],[568.86,0.227,31,162],[568.86,0.055,38,93],[568.92,0.16,27,87],[568.92,0.14,39,52],[569.769,0.055,38,93],[569.769,0.227,38,146],[569.829,0.16,27,87],[569.829,0.14,39,52],[570.678,0.055,38,93],[570.678,0.227,31,162],[570.738,0.16,27,87],[570.738,0.14,39,52],[571.587,0.227,38,146],[571.587,0.055,38,93],[571.647,0.16,27,87],[571.647,0.14,39,52],[572.496,0.227,31,162],[572.496,0.055,38,93],[572.556,0.16,27,87],[572.556,0.14,39,52],[573.405,0.227,38,146],[573.405,0.055,38,93],[573.465,0.16,27,87],[573.465,0.14,39,52],[574.314,0.227,31,162],[574.314,0.055,38,93],[574.374,0.16,27,87],[574.374,0.14,39,52],[575.223,0.227,38,146],[575.223,0.055,38,93],[575.283,0.16,27,87],[575.283,0.14,39,52],[576.133,0.227,31,162],[576.133,0.055,38,93],[576.192,0.16,27,87],[576.192,0.14,39,52],[577.042,0.227,38,146],[577.042,0.055,38,93],[577.102,0.16,27,87],[577.102,0.14,39,52],[577.951,0.227,31,162],[577.951,0.055,38,93],[578.011,0.16,27,87],[578.011,0.14,39,52],[578.86,0.227,38,146],[578.86,0.055,38,93],[578.92,0.16,27,87],[578.92,0.14,39,52],[579.769,0.055,38,93],[579.769,0.227,31,162],[579.829,0.16,27,87],[579.829,0.14,39,52],[580.678,0.055,38,93],[580.678,0.227,38,146],[580.738,0.16,27,87],[580.738,0.14,39,52],[581.587,0.227,31,162],[581.587,0.055,38,93],[581.647,0.16,27,87],[581.647,0.14,39,52],[582.496,0.227,38,146],[582.496,0.055,38,93],[582.556,0.16,27,87],[582.556,0.14,39,52],[583.405,0.055,38,93],[583.465,0.16,27,87],[583.465,0.14,39,52],[584.314,0.055,38,93],[584.374,0.16,27,87],[584.374,0.14,39,52],[585.223,0.055,38,93],[585.283,0.16,27,87],[585.283,0.14,39,52],[586.133,0.055,38,93],[586.192,0.16,27,87],[586.192,0.14,39,52],[587.042,0.055,38,93],[587.102,0.16,27,87],[587.102,0.14,39,52],[587.951,0.055,38,93],[588.011,0.16,27,87],[588.011,0.14,39,52],[588.86,0.055,38,93],[588.92,0.16,27,87],[588.92,0.14,39,52],[589.769,0.055,38,93],[589.829,0.16,27,87],[589.829,0.14,39,52],[590.678,0.055,38,93],[590.678,0.159,31,194],[590.738,0.16,27,87],[590.738,0.14,39,52],[591.587,0.055,38,93],[591.647,0.16,27,87],[591.647,0.14,39,52],[592.437,0.277,36,105],[592.437,0.055,38,75],[592.497,0.16,27,70],[592.497,0.14,39,42],[592.87,0.277,43,105],[593.591,0.055,38,75],[593.591,0.277,36,105],[593.651,0.16,27,70],[593.651,0.14,39,42],[594.456,0.277,35,105],[594.745,0.277,36,111],[594.745,0.055,38,75],[594.805,0.16,27,70],[594.805,0.14,39,42],[595.177,0.277,43,111],[595.899,0.055,38,75],[595.899,0.277,36,111],[595.958,0.16,27,70],[595.958,0.14,39,42],[596.764,0.277,32,111],[597.052,0.277,33,118],[597.052,0.055,38,75],[597.112,0.16,27,70],[597.112,0.14,39,42],[597.485,0.277,40,118],[598.206,0.055,38,75],[598.206,0.277,33,118],[598.266,0.16,27,70],[598.266,0.14,39,42],[599.072,0.277,32,118],[599.36,0.277,33,124],[599.36,0.055,38,75],[599.42,0.16,27,70],[599.42,0.14,39,42],[599.793,0.277,40,124],[600.514,0.055,38,75],[600.514,0.277,33,124],[600.574,0.16,27,70],[600.574,0.14,39,42],[601.379,0.277,28,124],[601.668,0.277,29,130],[601.668,0.055,38,75],[601.728,0.16,27,70],[601.728,0.14,39,42],[602.101,0.277,36,130],[602.822,0.055,38,75],[602.822,0.277,29,130],[602.882,0.16,27,70],[602.882,0.14,39,42],[603.687,0.277,28,130],[603.976,0.277,29,136],[603.976,0.055,38,75],[604.035,0.16,27,70],[604.035,0.14,39,42],[604.408,0.277,36,136],[605.129,0.055,38,75],[605.129,0.277,29,136],[605.189,0.16,27,70],[605.189,0.14,39,42],[605.995,0.277,30,136],[606.283,0.277,31,143],[606.283,0.055,38,75],[606.343,0.16,27,70],[606.343,0.14,39,42],[606.716,0.277,38,143],[607.437,0.277,31,143],[607.437,0.055,38,75],[607.497,0.16,27,70],[607.497,0.14,39,42],[608.302,0.277,35,143],[608.591,0.055,38,75],[608.591,2.077,36,147],[608.651,0.16,27,70],[608.651,0.14,39,42],[609.745,0.055,38,75],[609.805,0.16,27,70],[609.805,0.14,39,42],[610.899,0.055,38,75],[610.959,0.16,27,70],[610.959,0.14,39,42],[612.099,0.055,38,75],[612.159,0.16,27,70],[612.159,0.14,39,42],[613.299,0.055,38,75],[613.359,0.16,27,70],[613.359,0.14,39,42],[614.499,0.055,38,75],[614.559,0.16,27,70],[614.559,0.14,39,42],[615.699,0.055,38,75],[615.759,0.16,27,70],[615.759,0.14,39,42],[616.899,0.055,38,75],[616.959,0.16,27,70],[616.959,0.14,39,42],[618.099,0.055,38,75],[618.159,0.16,27,70],[618.159,0.14,39,42],[619.299,0.055,38,75],[619.359,0.16,27,70],[619.359,0.14,39,42],[620.499,0.055,38,75],[620.559,0.16,27,70],[620.559,0.14,39,42],[621.699,0.055,38,75],[621.759,0.16,27,70],[621.759,0.14,39,42],[622.899,0.055,38,75],[622.959,0.16,27,70],[622.959,0.14,39,42],[624.099,0.055,38,75],[624.159,0.16,27,70],[624.159,0.14,39,42],[625.299,0.055,38,75],[625.359,0.16,27,70],[625.359,0.14,39,42],[626.499,0.055,38,75],[626.559,0.16,27,70],[626.559,0.14,39,42],[627.699,0.055,38,75],[627.759,0.16,27,70],[627.759,0.14,39,42],[628.899,0.055,38,75],[628.959,0.16,27,70],[628.959,0.14,39,42],[630.099,0.055,38,75],[630.159,0.16,27,70],[630.159,0.14,39,42],[631.349,0.055,38,75],[631.409,0.16,27,70],[631.409,0.14,39,42],[632.599,0.055,38,75],[632.659,0.16,27,70],[632.659,0.14,39,42],[633.849,0.055,38,75],[633.909,0.16,27,70],[633.909,0.14,39,42],[635.099,0.055,38,75],[635.159,0.16,27,70],[635.159,0.14,39,42],[636.349,0.055,38,75],[636.409,0.16,27,70],[636.409,0.14,39,42],[637.599,0.055,38,75],[637.659,0.16,27,70],[637.659,0.14,39,42],[638.849,0.055,38,75],[638.909,0.16,27,70],[638.909,0.14,39,42],[640.099,0.055,38,75],[640.159,0.16,27,70],[640.159,0.14,39,42],[641.349,0.055,38,75],[641.409,0.16,27,70],[641.409,0.14,39,42],[642.599,0.055,38,75],[642.659,0.16,27,70],[642.659,0.14,39,42],[643.849,0.055,38,75],[643.909,0.16,27,70],[643.909,0.14,39,42],[645.099,0.055,38,75],[645.159,0.16,27,70],[645.159,0.14,39,42],[646.349,0.055,38,75],[646.409,0.16,27,70],[646.409,0.14,39,42],[647.599,0.055,38,75],[647.659,0.16,27,70],[647.659,0.14,39,42],[648.849,0.055,38,75],[648.909,0.16,27,70],[648.909,0.14,39,42],[650.099,0.055,38,75],[650.159,0.16,27,70],[650.159,0.14,39,42],[651.375,0.055,38,75],[651.435,0.16,27,70],[651.435,0.14,39,42],[652.652,0.055,38,75],[652.712,0.16,27,70],[652.712,0.14,39,42],[653.928,0.055,38,75],[653.988,0.16,27,70],[653.988,0.14,39,42],[655.205,0.055,38,75],[655.265,0.16,27,70],[655.265,0.14,39,42],[656.482,0.055,38,75],[656.542,0.16,27,70],[656.542,0.14,39,42],[657.758,0.055,38,75],[657.818,0.16,27,70],[657.818,0.14,39,42],[659.035,0.055,38,75],[659.095,0.16,27,70],[659.095,0.14,39,42],[660.311,0.055,38,75],[660.371,0.16,27,70],[660.371,0.14,39,42],[661.588,0.055,38,75],[661.648,0.16,27,70],[661.648,0.14,39,42],[662.865,0.055,38,75],[662.925,0.16,27,70],[662.925,0.14,39,42],[664.141,0.055,38,75],[664.201,0.16,27,70],[664.201,0.14,39,42],[665.418,0.055,38,75],[665.478,0.16,27,70],[665.478,0.14,39,42],[666.694,0.055,38,75],[666.754,0.16,27,70],[666.754,0.14,39,42],[667.971,0.055,38,75],[668.031,0.16,27,70],[668.031,0.14,39,42],[669.247,0.055,38,75],[669.308,0.16,27,70],[669.308,0.14,39,42],[670.524,0.055,38,75],[670.584,0.16,27,70],[670.584,0.14,39,42],[671.828,0.055,38,75],[671.888,0.16,27,70],[671.888,0.14,39,42],[673.133,0.055,38,75],[673.193,0.16,27,70],[673.193,0.14,39,42],[674.437,0.055,38,75],[674.497,0.16,27,70],[674.497,0.14,39,42],[675.741,0.055,38,75],[675.802,0.16,27,70],[675.802,0.14,39,42],[677.046,0.055,38,75],[677.106,0.16,27,70],[677.106,0.14,39,42],[678.35,0.055,38,75],[678.41,0.16,27,70],[678.41,0.14,39,42],[679.654,0.055,38,75],[679.715,0.16,27,70],[679.715,0.14,39,42],[680.959,0.055,38,75],[681.019,0.16,27,70],[681.019,0.14,39,42],[682.263,0.055,38,75],[682.323,0.16,27,70],[682.323,0.14,39,42],[683.568,0.055,38,75],[683.628,0.16,27,70],[683.628,0.14,39,42],[684.872,0.055,38,75],[684.932,0.16,27,70],[684.932,0.14,39,42],[686.176,0.055,38,75],[686.236,0.16,27,70],[686.236,0.14,39,42],[687.481,0.055,38,75],[687.541,0.16,27,70],[687.541,0.14,39,42],[688.785,0.055,38,75],[688.845,0.16,27,70],[688.845,0.14,39,42],[690.089,0.055,38,75],[690.149,0.16,27,70],[690.149,0.14,39,42],[691.394,0.055,38,75],[691.454,0.16,27,70],[691.454,0.14,39,42],[692.757,0.055,38,75],[692.817,0.16,27,70],[692.817,0.14,39,42],[694.121,0.055,38,75],[694.181,0.16,27,70],[694.181,0.14,39,42],[695.485,0.055,38,75],[695.545,0.16,27,70],[695.545,0.14,39,42],[696.848,0.055,38,75],[696.908,0.16,27,70],[696.908,0.14,39,42],[698.212,0.055,38,75],[698.272,0.16,27,70],[698.272,0.14,39,42],[699.576,0.055,38,75],[699.635,0.16,27,70],[699.635,0.14,39,42],[700.939,0.055,38,75],[700.999,0.16,27,70],[700.999,0.14,39,42],[702.303,0.055,38,75],[702.363,0.16,27,70],[702.363,0.14,39,42],[703.666,0.055,38,75],[703.726,0.16,27,70],[703.726,0.14,39,42],[705.03,0.055,38,75],[705.09,0.16,27,70],[705.09,0.14,39,42],[706.394,0.055,38,75],[706.454,0.16,27,70],[706.454,0.14,39,42],[707.757,0.055,38,75],[707.817,0.16,27,70],[707.817,0.14,39,42],[709.121,0.055,38,75],[709.181,0.16,27,70],[709.181,0.14,39,42],[710.485,0.055,38,75],[710.545,0.16,27,70],[710.545,0.14,39,42],[711.848,0.055,38,75],[711.908,0.16,27,70],[711.908,0.14,39,42],[713.212,0.055,38,65],[713.272,0.16,27,61],[713.272,0.14,39,37],[715.212,0.055,38,65],[715.272,0.16,27,61],[715.272,0.14,39,37],[717.212,0.055,38,65],[717.272,0.16,27,61],[717.272,0.14,39,37],[719.212,0.055,38,65],[719.272,0.16,27,61],[719.272,0.14,39,37],[721.212,0.055,38,65],[721.272,0.16,27,61],[721.272,0.14,39,37],[723.212,0.055,38,65],[723.272,0.16,27,61],[723.272,0.14,39,37],[725.212,0.055,38,65],[725.272,0.16,27,61],[725.272,0.14,39,37],[727.212,0.055,38,65],[727.272,0.16,27,61],[727.272,0.14,39,37],[729.212,0.055,38,65],[729.272,0.16,27,61],[729.272,0.14,39,37],[731.212,0.055,38,65],[731.272,0.16,27,61],[731.272,0.14,39,37],[733.212,0.055,38,65],[733.272,0.16,27,61],[733.272,0.14,39,37],[735.212,0.055,38,65],[735.272,0.16,27,61],[735.272,0.14,39,37],[737.212,0.055,38,65],[737.272,0.16,27,61],[737.272,0.14,39,37],[739.212,0.055,38,65],[739.272,0.16,27,61],[739.272,0.14,39,37],[741.212,0.055,38,65],[741.272,0.16,27,61],[741.272,0.14,39,37],[743.212,0.055,38,65],[743.272,0.16,27,61],[743.272,0.14,39,37],[745.212,0.055,38,65],[745.272,0.16,27,61],[745.272,0.14,39,37],[747.212,0.055,38,65],[747.272,0.16,27,61],[747.272,0.14,39,37],[749.212,0.055,38,65],[749.272,0.16,27,61],[749.272,0.14,39,37],[751.212,0.055,38,65],[751.272,0.16,27,61],[751.272,0.14,39,37],[753.212,0.055,38,65],[753.272,0.16,27,61],[753.272,0.14,39,37],[755.212,0.055,38,65],[755.272,0.16,27,61],[755.272,0.14,39,37],[757.212,0.055,38,65],[757.272,0.16,27,61],[757.272,0.14,39,37],[759.212,0.055,38,65],[759.272,0.16,27,61],[759.272,0.14,39,37],[761.212,0.055,38,65],[761.272,0.16,27,61],[761.272,0.14,39,37],[763.212,0.055,38,65],[763.272,0.16,27,61],[763.272,0.14,39,37],[765.212,0.055,38,65],[765.272,0.16,27,61],[765.272,0.14,39,37],[767.212,0.055,38,65],[767.272,0.16,27,61],[767.272,0.14,39,37],[769.212,0.055,38,65],[769.272,0.16,27,61],[769.272,0.14,39,37],[771.212,0.055,38,65],[771.272,0.16,27,61],[771.272,0.14,39,37]]],"overview":[[2,2,2,2,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,4,4,4,4,4,4,3,3,3,4,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,3,2,2,2,3,3,2,4,4,4,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,0],[1,1,1,1,4,4,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,2,2,2,2,2,2,2,3,3,3,4,3,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,3,3,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0,2],[0,0,0,0,3,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,4,4,4,3,2,2,2,3,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,0,0,0,0,0,0],[2,2,2,2,1,1,1,0,0,0,0,0,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,4,2,2,2,0,2,2,1,2,3,3,3,2,2,1,0,1,1,2,2,2,2,2,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,2,2,2,2,1,1,1,1,1,1,1,3,3,2,3,3,0,0,2,2,2,2,2],[2,2,2,2,2,2,2,2,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,3,3,3,4,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]],"maxDur":[6.333,6.333,6.333,6.333,6.333,10,4.068]}; +// Whole-piece density above, routed note onsets in a moving 20-second window below. +let notepatTvClock=null; +function smoothNotepatTvTime(music,target){ + const now=Date.now()/1000,run=music.runId||'notepat'; + if(!notepatTvClock||notepatTvClock.run!==run||Math.abs(target-notepatTvClock.time)>5){ + notepatTvClock={run,time:target,wall:now};return target; + } + const dt=Math.max(0,Math.min(.1,now-notepatTvClock.wall));notepatTvClock.wall=now; + const error=target-notepatTvClock.time; + // Rate corrections absorb packet jitter without moving the playhead backwards. + notepatTvClock.time+=dt*(1+clamp(error*.7,-.12,.12)); + return Math.min(music.duration||774.4119,notepatTvClock.time); +} +function drawNotepatScore(music, elapsed) { + elapsed=smoothNotepatTvTime(music,elapsed); + const score=NOTEPAT_TV_SCORE; + if(music.scoreHash && music.scoreHash!==score.hash)return; + const w=viewWidth(),h=viewHeight,left=w*.16,right=w*.97,width=right-left; + const names=['Left front','Right front','Right rear','Left rear','Center rear','Held center','Sub']; + const colors=[[244,128,179],[91,215,227],[163,223,91],[255,191,90],[169,142,248],[248,151,91],[232,227,166]]; + triangleDepth=-.8; + const palette=music.look?.color||[100,150,220]; + wipe(Math.round(palette[0]*.035),Math.round(palette[1]*.035),Math.round(palette[2]*.055)); + const top=h*.075,overviewRow=h*.026,overviewHeight=overviewRow*7; + const labelSize=Math.max(17,Math.min(26,w*.015)); + // All section boundaries stay visible for the entire piece. + for(let i=0;i=a&&elapsedMath.round(v*gain))); + } + } + const overviewX=left+clamp(elapsed/score.duration,0,1)*width; + screenRect(overviewX-6,top-5,12,overviewHeight+7,[67,71,72]); + screenRect(overviewX-1,top-5,3,overviewHeight+7,[255,255,242]); + // A fixed NOW line; score notes approach it from the right. + const detailTop=h*.35,rowHeight=h*.068,from=elapsed-4,span=20,nowX=left+width*.2; + for(let dt=0;dt<=16;dt+=4){const x=nowX+dt/span*width; + screenRect(x,detailTop-10,1,rowHeight*7+10,[34,45,61]); + typeWrite(dt?'+'+dt+'s':'NOW',x+5,detailTop-35,22,210,221,235); + } + for(let row=0;row<7;row++){ + const y=detailTop+row*rowHeight,events=score.rows[row]; + typeWrite(names[row],w*.016,y+rowHeight*.28,labelSize,...colors[row]); + screenRect(left,y+rowHeight-3,width,1,[37,49,65]); + screenRect(nowX-22,y+2,44,rowHeight-5,colors[row].map(v=>Math.round(v*.065))); + let lo=0,hi=events.length; + while(lo>1;if(events[m][0]elapsed; + const gain=endMath.round(v*.15))); + screenRect(x-1,py-2,noteWidth+2,14,colors[row].map(v=>Math.round(v*.32))); + } + screenRect(x,py,noteWidth,sounding?10:6,colors[row].map(v=>Math.round(v*gain))); + if(sounding)screenRect(nowX-2,py-2,4,14+attack*6,[255,248,224]); + } + } + screenRect(nowX-2,detailTop-8,4,rowHeight*7+6,[255,255,242]); +} + +// NOTEPAT_SCORE_VISUAL_V1_END diff --git a/xbox/live/tests/lan-test.test.mjs b/xbox/live/tests/lan-test.test.mjs new file mode 100644 index 0000000000..715a686cdf --- /dev/null +++ b/xbox/live/tests/lan-test.test.mjs @@ -0,0 +1,462 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { createContext, runInContext } from 'node:vm'; +const source = readFileSync(new URL('../oskiewar.js', import.meta.url), 'utf8') + '\n' + + readFileSync(new URL('../lan-test.js', import.meta.url), 'utf8'); +function pair({ expires = 1000000, priorResult = false, differentMath = false, curtain = false, nativeSingleSlot = false, inputSendHz, phaseProfile = false, accounts = false, photo = false } = {}) { + let wall = 10000; + const queues = [[], []], clients = [], sent = [[], []]; + for (let seat = 0; seat < 2; seat++) { + let frame = 0; + let pending = null; + const noop = () => {}; + const triangles=[], sprites=[], accountCalls=[], telemetryEvents=[]; + const account={status:"signed-out"}; + const pad = { connected: true, down: [], leftX: 0, leftY: 0 }; + const ctx = createContext({ + ...(accounts ? {accountState:()=>account, accountAction:(...args)=>{accountCalls.push(args); return true;}, accountReport:body=>{accountCalls.push(["report",JSON.parse(body)]);return true;}} : {}), + ...(photo ? {themeReady:()=>true, themeSprite:(...args)=>{sprites.push(args);return true;},themeQuad:()=>true} : {}), + Math: differentMath && seat === 1 ? Object.assign(Object.create(Math), + Object.fromEntries(['sin','cos','tan','atan','atan2','asin','exp','hypot'] + .map(name => [name, (...args) => Math[name](...args) * (1 + 1e-12)]))) : Math, + Date: class extends Date { static now() { return wall; } }, + performance: { now: () => wall }, + __oskiewarLanTest: { seat, room: 'ow-lantest924', expires, curtain, inputSendHz, phaseProfile }, + runtime: () => ({ monotonicUs: frame * 1e6 / 60, unixMs: wall, simCount: frame, renderAlpha: 1 }), + gamepad: (i = 0) => i === 0 ? pad : { ...pad, down: [] }, + controllers: () => seat === 0 ? [{}, {}, {}] : [{}], + capabilities: () => ({ platform: seat === 0 ? 'xbox' : 'ac-native', inputFamily: 'xbox' }), + gameView: () => ({ width: 1366, height: 768 }), + telemetry: (...args)=>telemetryEvents.push(args), gameSignal: noop, drum: noop, synth: noop, + wipe: noop, box: noop, line: noop, triangle: noop, triangle3d: (...args)=>triangles.push(args), + write: noop, systemWrite: noop, + oskiewarNetSend: (room, raw) => { const packet = JSON.parse(raw); sent[seat].push(packet); + if(nativeSingleSlot && seat===1) pending=packet; else queues[1-seat].push(packet); return true; }, + oskiewarNetPoll: () => queues[seat].splice(0), + }); + runInContext(source + '\nboot();', ctx); + if (priorResult && seat === 0) runInContext('roundOverAt = 571594765;', ctx); + clients.push({ ctx, pad, triangles, sprites, account, accountCalls, telemetryEvents, tick() { frame++; ctx.sim(); if(pending){queues[1-seat].push(pending);pending=null;} }, + state: () => runInContext('({error:clientError || undefined, count:players.length, names:players.map(p=>p.name), net:globalThis.__oskiewarNetStats, session:netSession && {frame:netSession.frame,stats:netSession.stats}, hash:netStateHash(), x:players.map(p=>p.x)})', ctx) }); + } + return { clients, queues, sent, tick(n) { for (let i = 0; i < n; i++) { wall += 1000/60; clients.forEach(c=>c.tick()); } } }; +} +test('temporary room names both seats, exchanges inputs, keeps three Xbox pads to two network seats', () => { + const p = pair(); p.tick(240); + for (const c of p.clients) { + const s = c.state(); assert.equal(s.error, undefined); + assert.equal(s.count, 2); assert.deepEqual([...s.names], ['AC','XBOX']); + assert.ok(s.net, JSON.stringify(s)); assert.ok(s.net.frame > 200); assert.ok(s.net.received > 200); + assert.equal(s.net.desyncs, 0); c.ctx.paint(); + } + p.clients[1].pad.down = ['ArrowLeft']; p.tick(90); + for (const c of p.clients) assert.equal(c.state().net.desyncs, 0); + assert.ok(Math.abs(p.clients[0].state().x[1] - p.clients[1].state().x[1]) < 20); +}); +test('expired temporary setup leaves the ordinary game available', () => { + const p = pair({expires: 12000}); p.tick(180); + for (const c of p.clients) assert.equal(c.ctx.__oskiewarLanStatus, 'expired'); +}); + +test('30 Hz redundant input transport preserves 60 Hz play, hashes and curtain control', () => { + const p = pair({ inputSendHz: 30, nativeSingleSlot: true }); + p.tick(180); + const start = p.clients.map(c => c.state().net.frame); + for (let i = 0; i < 600; i++) { + p.clients[0].pad.down = [i % 120 < 60 ? 'ArrowLeft' : 'ArrowRight']; + p.clients[1].pad.down = [i % 90 < 45 ? 'ArrowRight' : 'ArrowLeft']; + p.tick(1); + } + for (let seat = 0; seat < 2; seat++) { + assert.ok(p.clients[seat].state().net.frame - start[seat] >= 590); + assert.equal(p.clients[seat].state().net.desyncs, 0); + const inputs = p.sent[seat].filter(packet => packet.t === 'i'); + assert.ok(inputs.length < 430, 'input transport is bounded near 30 Hz'); + assert.ok(inputs.some(packet => packet.h), 'hash checks are delivered'); + } + p.clients[1].ctx.__oskiewarStageCommand = { id: 'limited-curtain', curtain: true }; + p.tick(180); + assert.equal(p.clients[1].ctx.__oskiewarStageState.peerAck, 'limited-curtain'); + assert.equal(p.clients[0].state().session.frame, p.clients[1].state().session.frame); +}); + +test('fresh network round clears an earlier local match end timestamp', () => { + const p = pair({priorResult: true}); p.tick(600); + for (const c of p.clients) { + assert.equal(c.state().error, undefined); + assert.equal(c.state().net.desyncs, 0); + assert.ok(c.state().net.frame > 500); + assert.equal(runInContext('roundOverAt', c.ctx), 0); + } +}); + +test('delayed duplicate hello does not restart an active match', () => { + const p = pair(); p.tick(240); + const hello = p.sent[1].find(packet => packet.t === 'hello'); + assert.ok(hello); + const before = p.clients.map(c => c.state().net.frame); + p.queues[0].push(hello); p.tick(30); + p.clients.forEach((c, i) => { + assert.ok(c.state().net.frame > before[i]); + assert.equal(c.state().net.desyncs, 0); + }); +}); + +test('a mismatch reports once and automatically resets after a bounded delay', () => { + const p = pair(); p.tick(240); + const origin = runInContext('netSession.originUs', p.clients[1].ctx); + p.queues[1].push({t:'desync',o:origin,f:200}); p.tick(10); + assert.match(p.clients[1].ctx.__oskiewarLanStatus, /restarting in/); + const helloCount = p.sent[1].filter(packet => packet.t === 'hello').length; + p.tick(100); + assert.equal(p.sent[1].filter(packet => packet.t === 'hello').length, helloCount); + p.tick(180); + assert.ok(p.clients[1].state().session); + assert.equal(p.clients[1].ctx.__oskiewarLanStatus, 'connected'); +}); + + + +test('network spit and head motion ignore platform transcendental rounding', () => { + const p = pair({differentMath:true}); p.tick(240); + for (const c of p.clients) runInContext(` + players[1].removedParts = ['left-arm','right-arm','left-leg','right-leg','torso']; + players[1].headRoll = 1.23456789; + spit(players[1]); + `, c.ctx); + const shots = p.clients.map(c => runInContext('JSON.stringify(bullets)', c.ctx)); + assert.equal(shots[0], shots[1], 'projectile doubles are exactly equal'); + for (let frame = 0; frame < 1800; frame++) { + p.clients[1].pad.down = [frame % 120 < 60 ? 'ArrowRight' : 'ArrowLeft', + frame % 32 < 16 ? 'ArrowUp' : 'ArrowDown', ...(frame % 37 < 5 ? ['A'] : [])]; + p.tick(1); + if (frame % 2 === 0) p.clients[0].ctx.paint(); + if (frame % 3 === 0) p.clients[1].ctx.paint(); + for (const c of p.clients) assert.ok(c.state().session, 'still synchronized at ' + frame); + } +}); + +test('shared elementary math stays accurate across game-sized inputs', () => { + const p = pair(); p.tick(10); + const c = p.clients[0]; + for (const name of ['sin','cos','tan','atan','asin','exp','hypot']) { + for (let i = -100; i <= 100; i++) { + const x = name === 'asin' ? i / 100 : name === 'exp' ? i / 10 : i * .12345; + const actual = runInContext(`Math.${name}(${x})`, c.ctx); + const expected = Math[name](x); + assert.ok(Math.abs(actual - expected) <= 2e-12 * Math.max(1, Math.abs(expected)), + name + '(' + x + '): ' + actual + ' vs ' + expected); + } + } +}); + +test('deterministic math memoization preserves signed zero, NaN and eviction results', () => { + const p = pair(); + const ctx = p.clients[0].ctx; + const memo = runInContext('memoizeNetUnary(value => value)', ctx); + for (let repeat = 0; repeat < 2; repeat++) + for (const value of [0, -0, NaN, Infinity, -Infinity, .25, -.25]) + assert.ok(Object.is(memo(value), value)); + for (let value = 1; value < 1100; value++) assert.equal(memo(value), value); + assert.ok(Object.is(memo(-0), -0)); + assert.ok(Object.is(memo(0), 0)); + assert.ok(Number.isNaN(memo(NaN))); +}); + + +test('curtain acknowledges both seats, freezes one frame and resumes without a reset', () => { + const p=pair();p.tick(240); + const origin=runInContext('netSession.originUs',p.clients[0].ctx); + p.clients[1].ctx.__oskiewarStageCommand={id:'curtain-test',curtain:true}; + p.tick(180); + const frames=p.clients.map(c=>c.state().session.frame); + assert.equal(frames[0],frames[1]); + p.tick(120); + assert.deepEqual(p.clients.map(c=>c.state().session.frame),frames); + for(const c of p.clients) {assert.equal(c.ctx.__oskiewarStageState.curtain,true);c.ctx.paint();} + assert.equal(p.clients[1].ctx.__oskiewarStageState.peerAck,'curtain-test'); + p.clients[1].ctx.__oskiewarStageCommand={id:'resume-test',curtain:false}; + p.tick(60); + for(const c of p.clients) { + assert.ok(c.state().session.frame>frames[0]); + assert.equal(runInContext('netSession.originUs',c.ctx),origin); + } +}); + +test('a live composition renders at the bottom during game mode and survives a stale feed',()=>{ + const p=pair();p.tick(180); + for(const c of p.clients){ + const text=[];c.ctx.systemWrite=(...args)=>text.push(args); + c.ctx.__oskiewarStageState={curtain:false,receivedAt:13000, + performance:{active:false,title:'Live composition',source:'Notepat Spatial',playing:true,phase:'playing',elapsed:100,duration:300}}; + c.ctx.paint(); + const title=text.find(a=>a[0]==='live composition'); + assert.ok(title);assert.ok(title[2]>600);assert.equal(runInContext('performanceStageActive()',c.ctx),false); + c.ctx.__oskiewarStageState.performance.playing=false; + c.ctx.__oskiewarStageState.performance.phase='stale';text.length=0;c.ctx.paint(); + assert.ok(text.some(a=>a[0].includes('signal lost'))); + c.ctx.__oskiewarStageState.curtain=true;text.length=0;c.ctx.paint(); + assert.deepEqual(text.map(a=>a[0]),["look that way ->"]); + } +}); + +test('a lowered curtain survives reload, animates, and still accepts resume',()=>{ + const p=pair({curtain:true});p.tick(180); + for(const c of p.clients){ + assert.equal(c.ctx.__oskiewarStageState.curtain,true); + assert.equal(c.state().session.frame,0); + const triangles=c.triangles;triangles.length=0; + c.ctx.paint();const before=JSON.stringify(triangles);triangles.length=0; + p.tick(20);c.ctx.paint(); + assert.notEqual(JSON.stringify(triangles),before); + assert.equal(c.state().session.frame,0); + } + p.clients[1].ctx.__oskiewarStageCommand={id:'raise-after-reload',curtain:false};p.tick(90); + for(const c of p.clients)assert.ok(c.state().session.frame>0); +}); + +test('curtain sing-along highlights current words without resuming and expires a lost feed',()=>{ + const p=pair({curtain:true});p.tick(180); + for(const c of p.clients){ + const text=[];c.ctx.systemWrite=(...a)=>text.push(a); + c.ctx.__oskiewarStageState={curtain:true,receivedAt:13000,performance:{playing:true,elapsed:2,duration:10, + lyrics:[{member:'neo',color:'#8fd13f',start:1,end:5,words:[{text:'hello',start:1,end:3},{text:'world',start:3,end:5}]}]}}; + c.ctx.paint();assert.deepEqual(text.map(a=>a[0]),['hello','world']); + assert.equal(c.state().session.frame,0); + c.ctx.__oskiewarStageState.performance.curtainStyle='directions';text.length=0;c.ctx.paint(); + assert.deepEqual(text.map(a=>a[0]),['look that way ->']); + c.ctx.__oskiewarStageState.performance.curtainStyle='auto'; + c.ctx.__oskiewarStageState.receivedAt=9000;text.length=0;c.ctx.paint(); + assert.deepEqual(text.map(a=>a[0]),['look that way ->']); + } +}); + +test('native single-slot transport delivers curtain commands during active input traffic',()=>{ + const p=pair({nativeSingleSlot:true});p.tick(240); + p.clients[1].ctx.__oskiewarStageCommand={id:'single-slot-down',curtain:true};p.tick(300); + for(const c of p.clients)assert.equal(c.ctx.__oskiewarStageState.curtain,true); + assert.equal(p.clients[1].ctx.__oskiewarStageState.peerAck,'single-slot-down'); + const frames=p.clients.map(c=>c.state().session.frame);p.tick(60); + assert.deepEqual(p.clients.map(c=>c.state().session.frame),frames); + p.clients[1].ctx.__oskiewarStageCommand={id:'single-slot-up',curtain:false};p.tick(180); + assert.equal(p.clients[1].ctx.__oskiewarStageState.peerAck,'single-slot-up'); + p.clients.forEach((c,i)=>{assert.ok(c.state().session.frame>frames[i]);assert.equal(c.state().net.desyncs,0);}); +}); + +test('purple AC owns the left seat and green Xbox owns the right seat on both screens',()=>{ + const p=pair();p.tick(240); + assert.equal(p.clients[0].state().net.seat,1); + assert.equal(p.clients[1].state().net.seat,0); + for(const c of p.clients){ + assert.equal(runInContext('players[0].name',c.ctx),'AC'); + assert.equal(runInContext('players[1].name',c.ctx),'XBOX'); + assert.ok(runInContext('players[0].spawnX < players[1].spawnX',c.ctx)); + assert.deepEqual(JSON.parse(runInContext('JSON.stringify(players.map(p=>p.color))',c.ctx)),[[159,122,232],[120,200,72]]); + assert.equal(runInContext('displayTheme().light',c.ctx),0); + } + p.clients[0].pad.down=['ArrowRight'];p.clients[1].pad.down=['ArrowLeft'];p.tick(90); + for(const c of p.clients){ + const directions=JSON.parse(runInContext('JSON.stringify(netInputsFor(netSession,netSession.frame-1).map(mask=>netPadFromMask(mask).down))',c.ctx)); + assert.ok(directions[0].includes('ArrowLeft'));assert.ok(!directions[0].includes('ArrowRight')); + assert.ok(directions[1].includes('ArrowRight'));assert.ok(!directions[1].includes('ArrowLeft')); + assert.equal(c.state().net.desyncs,0); + } +}); + +test('HUD reserves separate rows for FPS, commands and inventory with debug on or off', () => { + const p = pair(); p.tick(10); + const {ctx} = p.clients[1]; + ctx.drawn = []; + ctx.systemWrite = (...args) => ctx.drawn.push(args); + for (const debug of [false, true]) { + runInContext(`debugHitboxes = ${debug}; roundResult = null; + players[0].gunAmmo = 4; players[0].grenadeAmmo = 3; + players[0].commandStream = [{label:'LEFT', at:runtime().monotonicUs - 850000}];`, ctx); + ctx.drawn.length = 0; + runInContext('drawHudInventory(players[0], 0);', ctx); + const ammo = ctx.drawn.filter(row=>row[0].includes('grenade')); + assert.equal(ammo.length,2); + ctx.drawn.length = 0; + runInContext('drawCommandStream(players[0], 0);', ctx); + const commands = [...ctx.drawn]; + assert.ok(commands.length); + assert.ok(Math.max(...ammo.map(row=>row[2]+row[3])) < Math.min(...commands.map(row=>row[2]))); + ctx.drawn.length = 0; + runInContext('drawDebugPerformance([255,255,255]);', ctx); + const fps = ctx.drawn.find(row=>row[0].includes('fps')); + assert.ok(fps); + assert.ok(Math.max(...commands.map(row=>row[2]+row[3])) < fps[2]); + } +}); + +test('native FPS comes from measured host frame duration, without a fabricated refresh rate', () => { + const p = pair(); p.tick(10); + const {ctx} = p.clients[0]; + ctx.drawn = []; + ctx.systemWrite = (...args) => ctx.drawn.push(args); + runInContext('debugHitboxes = false; roundResult = null; displayFps = 60; runtime = () => ({frameMs:25,refreshHz:40}); drawDebugPerformance([255,255,255]);',ctx); + assert.equal(ctx.drawn.find(row => row[0].includes('fps'))[0], '40 fps'); +}); + + +test('device menu consumes Menu and D-pad locally while peer simulation stays synchronized', () => { + const p=pair({accounts:true,nativeSingleSlot:true}); p.tick(240); + const c=p.clients[0], frame=c.state().session.frame; + c.pad.down=['Menu']; p.tick(1); c.pad.down=[]; p.tick(1); + assert.equal(c.ctx.__oskiewarDeviceMenu.open,true); + c.pad.down=['ArrowDown']; p.tick(1); c.pad.down=[]; p.tick(1); + c.pad.down=['A']; p.tick(1); c.pad.down=[]; p.tick(120); + assert.ok(c.accountCalls.some(call=>call[0]==='login')); + assert.ok(c.state().session.frame > frame+115); + assert.equal(c.state().net.desyncs,0); + assert.equal(p.clients[1].ctx.__oskiewarDeviceMenu.open,false); + c.pad.down=['B']; p.tick(1); c.pad.down=[]; p.tick(30); + assert.equal(c.ctx.__oskiewarDeviceMenu.open,false); + assert.equal(c.state().net.desyncs,0); +}); + +test('device handles stay out of physics and tokens stay out of network packets', () => { + const p=pair({accounts:true,nativeSingleSlot:true}); p.tick(240); + p.clients[0].account.status='signed-in';p.clients[0].account.handle='green'; + p.clients[1].account.status='signed-in';p.clients[1].account.handle='purple'; + p.tick(180); + for(const c of p.clients) { + assert.deepEqual([...c.ctx.__oskiewarDeviceHandles],['@purple','@green']); + assert.equal(c.state().net.desyncs,0); + assert.deepEqual([...c.state().names],['AC','XBOX']); + assert.equal(runInContext('visibleHandle(players[0])',c.ctx),'@purple'); + } + assert.ok(!JSON.stringify(p.sent).includes('accessToken')); + p.clients[0].account.status='signed-out';p.tick(120); + assert.equal(p.clients[1].ctx.__oskiewarDeviceHandles[1],''); +}); + +test('photographic paint uses retained textures without changing simulation state', () => { + const p=pair({photo:true});p.tick(300); + for(const c of p.clients) { + const before=c.state().hash;c.ctx.paint(); + assert.equal(c.state().error,undefined); + assert.equal(c.state().hash,before); + assert.equal(c.ctx.__oskiewarGraphicsThemeStatus,'photorealistic'); + assert.ok(c.sprites.length>5); + assert.ok(c.sprites.some(args=>args[0]===0),'background texture'); + assert.ok(c.sprites.some(args=>args[0]===1),'fighter/prop textures'); + for(const args of c.sprites) assert.ok(args.every(v=>typeof v==='boolean'||Number.isFinite(v))); + } +}); + +test('ground map ceiling leaves four ground-grid heights for aerial launches', () => { + const p=pair();p.tick(240); + const c=p.clients[0]; + const result=runInContext('({floorY, ceilingY, gridHeight})',c.ctx); + assert.ok(result.floorY-result.ceilingY >= result.gridHeight*4); +}); + +test('complete signed-in match reports once per device after confirmed rollback frontier', () => { + const p=pair({accounts:true});p.tick(240); + p.clients[0].account.status='signed-in';p.clients[0].account.handle='green'; + p.clients[1].account.status='signed-in';p.clients[1].account.handle='purple';p.tick(120); + for(const c of p.clients) runInContext(`matchOver=true;roundResult='AC WINS MATCH';players[0].roundWins=5; + roundOverAt=netSession.originUs+netSession.frame*NET_TICK_US;`,c.ctx); + p.tick(90); + const reports=p.clients.map(c=>c.accountCalls.filter(call=>call[0]==='report')); + assert.equal(reports[0].length,1);assert.equal(reports[1].length,1); + assert.deepEqual(reports[0][0][1].handles,['purple','green']); + assert.equal(reports[0][0][1].seat,1);assert.equal(reports[1][0][1].seat,0); + assert.equal(reports[0][0][1].matchId,reports[1][0][1].matchId); +}); + +test('anonymous pause creates one code and keeps it across resume and reopening', () => { + const p=pair({accounts:true,nativeSingleSlot:true});p.tick(240); + const c=p.clients[1];c.pad.down=['Menu'];p.tick(1);c.pad.down=[];p.tick(1); + assert.equal(c.ctx.__oskiewarDeviceMenu.open,true); + assert.equal(c.accountCalls.filter(x=>x[0]==='login').length,1); + c.account.status='waiting';c.account.code='ABC234';c.account.pairUrl='https://aesthetic.computer/api/device-pair-login?code=ABC234'; + c.pad.down=['B'];p.tick(1);c.pad.down=[];p.tick(1); + c.pad.down=['Menu'];p.tick(1);c.pad.down=[];p.tick(1); + assert.equal(c.ctx.__oskiewarDeviceMenu.open,true); + assert.equal(c.accountCalls.filter(x=>x[0]==='login').length,1); + assert.equal(c.account.code,'ABC234');c.ctx.paint();assert.equal(c.state().error,undefined); +}); + +test('USB analog D-pad can select logout once per edge', () => { + const p=pair({accounts:true});p.tick(240);const c=p.clients[1]; + c.account.status='signed-in';c.account.handle='purple'; + c.pad.down=['Menu'];p.tick(1);c.pad.down=[];p.tick(1); + c.pad.leftY=-1;p.tick(30);assert.equal(c.ctx.__oskiewarDeviceMenu.selection,1); + c.pad.leftY=0;p.tick(1);c.pad.down=['A'];p.tick(1); + assert.equal(c.accountCalls.filter(x=>x[0]==='logout').length,1); +}); + +test('photo faces draw live eyes and distinct mouths without changing physics', () => { + const p=pair({photo:true});p.tick(240);const c=p.clients[0]; + const draw = expression => { + c.triangles.length=0; + runInContext(`photoThemeActive=true; drawFace({...players[0],hit:0,alive:true,resultReaction:${JSON.stringify(expression)}}, {x:300,y:300,radius:60}, [0,0,0], 1, 1000000)`,c.ctx); + return JSON.stringify(c.triangles); + }; + const before=c.state().hash, smile=draw(''), grief=draw('CRY'); + assert.ok(c.triangles.length>10);assert.notEqual(smile,grief);assert.equal(c.state().hash,before); +}); + + +test('opt-in inclusive phase counters preserve netplay and stay absent by default', () => { + for (const phaseProfile of [false, true]) { + const p=pair({phaseProfile,inputSendHz:60}); + p.tick(240); for (const c of p.clients) c.ctx.paint(); + for (const c of p.clients) { + const entry=c.telemetryEvents.find(([kind,body])=>kind==='NET_PHASES'&&JSON.parse(body).lane==='sim'); + if (phaseProfile) { + assert.ok(entry); + const report=JSON.parse(entry[1]); + assert.ok(report.phases.snapshot[1]>0); + assert.ok(report.phases.player[1]>0); + assert.ok(report.phases.pose[1]>0); + assert.ok(entry[1].length<900, 'native telemetry must not truncate phase JSON'); + } else assert.equal(entry,undefined); + assert.equal(c.state().net.desyncs,0); + } + } +}); + +test('every round overlays the arena with huge WIN and LOSE for the correct device, or a single TIE',()=>{ + const p=pair({accounts:true,photo:true});p.tick(240); + for(const match of [false,true]) for(const winningSeat of [0,1,-1]) { + for(const [device,c] of p.clients.entries()) { + c.ctx.drawn=[];c.ctx.systemWrite=(...args)=>c.ctx.drawn.push(args); + runInContext(`players[0].score=${winningSeat===0?2:0};players[1].score=${winningSeat===1?2:0}; + roundResult=${JSON.stringify(winningSeat<0?'TIE':'WINS ROUND')};matchOver=${match};roundOverAt=netSession.originUs+netSession.frame*NET_TICK_US;`,c.ctx); + c.sprites.length=0; + const hash=runInContext('netStateHash()',c.ctx);c.ctx.paint(); + assert.ok(c.sprites.length>5,'the arena and fighters remain behind the result'); + const results=c.ctx.drawn.filter(row=>['WIN','LOSE','TIE'].includes(row[0])); + assert.equal(results.length,1); + const row=results[0]; + assert.equal(row[0],winningSeat<0?'TIE':winningSeat===(device===0?1:0)?'WIN':'LOSE'); + assert.ok(row[3]>=240,'outcome fills the upper screen'); + const board=c.ctx.drawn.find(row=>row[0]==='global wins'); + assert.ok(row[2]+row[3]{ + const p=pair({accounts:true,photo:true});p.tick(240); + const c=p.clients[1], colors=Array.from({length:7},(_,i)=>({r:30+i,g:80+i,b:140+i})); + Object.assign(c.account,{status:'signed-in',handle:'purple',leaderboard:{players:[{handle:'purple',colors}],top:[]}}); + c.pad.down=['Menu'];p.tick(1);c.pad.down=[];p.tick(1); + runInContext('debugHitboxes=true',c.ctx); + c.ctx.drawn=[];c.ctx.systemWrite=(...args)=>c.ctx.drawn.push(args);c.sprites.length=0; + const hash=c.state().hash;c.ctx.paint(); + assert.ok(c.sprites.length>5,'live world and fighters remain behind Start'); + assert.equal(c.state().hash,hash);assert.equal(runInContext('debugHitboxes',c.ctx),true); + assert.equal(c.ctx.drawn.some(row=>row[0].includes('fps')),false,'game HUD cannot overwrite menu'); + const title=c.ctx.drawn.filter(row=>row[2]===162); + assert.equal(title.map(row=>row[0]).join(''),'@purple'); + assert.deepEqual(title.map(row=>row.slice(4,7)),colors.map(c=>[c.r,c.g,c.b])); + c.pad.down=['B'];p.tick(1);c.pad.down=[];p.tick(1); + c.ctx.drawn.length=0;c.ctx.paint(); + assert.equal(c.ctx.drawn.some(row=>row[0].includes('fps')),true,'normal HUD restores after closing'); +}); diff --git a/xbox/live/tests/oskiewar-final-kill-replay.test.mjs b/xbox/live/tests/oskiewar-final-kill-replay.test.mjs new file mode 100644 index 0000000000..60b7caf600 --- /dev/null +++ b/xbox/live/tests/oskiewar-final-kill-replay.test.mjs @@ -0,0 +1,154 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +import {createContext,runInContext} from 'node:vm'; +const source=readFileSync(new URL('../oskiewar.js',import.meta.url),'utf8'); +function fixture(){ + let now=1000000;const noop=()=>{}; + const context=createContext({Math,Date,performance,structuredClone, + runtime:()=>({monotonicUs:now,unixMs:1790000000000+now/1000,renderAlpha:1}), + gamepad:()=>({connected:true,down:[],leftX:0,leftY:0}), + capabilities:()=>({platform:'xbox',inputFamily:'xbox'}),gameView:()=>({width:1366,height:768}), + telemetry:noop,gameSignal:noop,drum:noop,synth:noop,wipe:noop,box:noop,line:noop,triangle:noop,triangle3d:noop,write:noop,systemWrite:noop}); + const run=s=>runInContext(s,context);run(source+'\nboot();shellMode="GAME";selecting=false;roundResult="";'); + return {run,advance:us=>now+=us}; +} +function recordKill(f){f.run(` + for(let i=0;i<32;i++) {players[0].x=1400+i*3;players[1].x=1700;captureFinalKillReplay(1000000+i*50000,true);} + killPlayer(players[1],0,2600000,'KO');finishRound(2600000); + for(let i=0;i<=5;i++)captureFinalKillReplay(2600000+i*50000,true); + `);f.advance(2850000);} +test('records bounded pre-kill poses and the actual fatal head/debris scene',()=>{ + const f=fixture();recordKill(f); + assert.equal(f.run('finalKillReplayActive()'),true);assert.ok(f.run('finalKillReplay.frames.length<=26')); + assert.ok(f.run('finalKillReplay.frames[0].players[1].alive')); + assert.equal(f.run('finalKillReplay.frames.at(-1).players[1].alive'),false); + assert.ok(f.run('finalKillReplay.frames.at(-1).arrays.impacts.length>0')); + assert.ok(f.run('finalKillReplay.frames.every(f=>f.players.every(p=>p.replayGeometry.head))')); + assert.equal(f.run('roundResultUs'),6000000);assert.equal(f.run('matchResultUs'),6000000); +}); +test('render playback restores authoritative snapshot/hash, references, camera and clock after every angle',()=>{ + const f=fixture();recordKill(f); + f.run('globalThis.before=JSON.stringify(netSnapshot());globalThis.hash=netStateHash();globalThis.refs=players.slice();globalThis.cameraBefore=JSON.stringify(cameraDoll);globalThis.clockBefore=runtime().monotonicUs;'); + const positions=[]; + for(const offset of [0,450000,1800000,2250000,3600000,4050000,5400000,21000000]){ + f.run(`globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+${offset});`); + positions.push(f.run('JSON.stringify(cameraDoll.position)')); + assert.equal(f.run('finalKillReplayRendering'),true); + assert.ok(f.run('players.every(p=>p.replayGeometry&&Number.isFinite(p.x))')); + f.run('undo();'); + assert.equal(f.run('JSON.stringify(netSnapshot())===before'),true); + assert.equal(f.run('netStateHash()===hash'),true); + assert.equal(f.run('players.every((p,i)=>p===refs[i])'),true); + assert.equal(f.run('JSON.stringify(cameraDoll)===cameraBefore'),true); + assert.equal(f.run('runtime().monotonicUs===clockBefore'),true); + } + assert.ok(new Set(positions).size>=5); +}); +test('slow playback interpolates motion and all orbit angles keep heads in front of lens',()=>{ + const f=fixture();recordKill(f); + const x=[]; + for(const offset of [100000,125000]){ + f.run(`globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+${offset});`); + x.push(f.run('players[0].x'));f.run('undo();'); + } + assert.ok(x[1]>x[0]&&x[1]-x[0]<3); + for(const offset of [0,1800000,3600000]){ + f.run(`globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+${offset});cameraDoll.prepare();`); + assert.ok(f.run(`players.every(p=>{const q=cameraDoll.toView(p.replayGeometry.head,{});return q.z>cameraNear;})`)); + assert.ok(f.run(`players.every(p=>{const q=projectPoint(p.replayGeometry.head.x,p.replayGeometry.head.y,p.replayGeometry.head.z);return Number.isFinite(q.x)&&Number.isFinite(q.y)&&q.x>0&&q.x0&&q.y{ + const f=fixture();recordKill(f); + f.run('roundResult="";captureFinalKillReplay(2900000,true);');assert.equal(f.run('finalKillReplayActive()'),false); + assert.equal(f.run('finalKillReplayHistory.length'),1); + f.run('roundResult="KO";captureFinalKillReplay(2950000,true);captureFinalKillReplay(3200000,true);');assert.equal(f.run('finalKillReplayActive()'),true); + f.run('resetRound(3300000,false,true);');assert.equal(f.run('finalKillReplayActive()'),false);assert.equal(f.run('finalKillReplayHistory.length'),0); + assert.equal(f.run('players.some(p=>p.replayGeometry)'),false); +}); +test('paint exception cannot leave recorded poses or replay time in simulation',()=>{ + const f=fixture();recordKill(f); + f.run('globalThis.before=JSON.stringify(netSnapshot());globalThis.refs=players.slice();gamePaint=()=>{throw Error("test paint failure");};captureClientError=()=>{};drawClientError=()=>{};paint();'); + assert.equal(f.run('JSON.stringify(netSnapshot())===before'),true); + assert.equal(f.run('players.every((p,i)=>p===refs[i])'),true); + assert.equal(f.run('finalKillReplayClockUs'),null);assert.equal(f.run('finalKillReplayRendering'),false); +}); + +test('full arena paint loops recorded combat without changing the live round snapshot',()=>{ + const f=fixture();recordKill(f); + f.run('globalThis.before=JSON.stringify(netSnapshot());globalThis.hash=netStateHash();'); + for(let i=0;i<18;i++) { + f.advance(400000);f.run('paint();'); + assert.equal(f.run('Boolean(clientError)'),false); + assert.equal(f.run('JSON.stringify(netSnapshot())===before'),true); + assert.equal(f.run('netStateHash()===hash'),true); + assert.equal(f.run('globalThis.__oskiewarFinalKillReplay.active'),true); + } +}); + +test('records a quarter-second post-impact tail before starting the looping angles',()=>{ + const f=fixture(); + f.run('captureFinalKillReplay(1000000,true);killPlayer(players[1],0,1050000,"KO");finishRound(1050000);captureFinalKillReplay(1050000,true);'); + assert.equal(f.run('finalKillReplayActive()'),false); + f.run('captureFinalKillReplay(1250000,true);');assert.equal(f.run('finalKillReplayActive()'),false); + f.run('captureFinalKillReplay(1300000,true);');assert.equal(f.run('finalKillReplayActive()'),true); + assert.equal(f.run('finalKillReplay.frames.at(-1).now-finalKillReplayResultAt'),250000); +}); +test('offline native recorder does not depend on a browser structuredClone global',()=>{ + const f=fixture();f.run('globalThis.structuredClone=undefined;');recordKill(f); + assert.equal(f.run('finalKillReplayActive()'),true); + f.run('const undoNative=beginFinalKillReplay();undoNative();'); + assert.equal(f.run('finalKillReplayRendering'),false); +}); +test('replay hides only intervening ledges while keeping supporting and distant platforms',()=>{ + const f=fixture();recordKill(f); + f.run('globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+3600000);'); + f.run('cameraDoll.position={x:1500,y:1000,z:-1000};players[0].x=1500;players[0].y=1800;players[0].z=0;players[0].replayGeometry.head={x:1500,y:1600,z:0,radius:24};'); + assert.equal(f.run('finalKillLedgeOccludes({left:1300,right:1700,y:1400},-520,520)'),true); + assert.equal(f.run('finalKillLedgeOccludes({left:1300,right:1700,y:1900},-520,520)'),false); + assert.equal(f.run('finalKillLedgeOccludes({left:2800,right:3000,y:1400},-520,520)'),false); + f.run('undo();'); + assert.equal(f.run('finalKillLedgeOccludes({left:1300,right:1700,y:1400},-520,520)'),false); +}); + +test('distant stray debris cannot pull final-kill camera away from combat',()=>{ + const f=fixture();recordKill(f); + f.run(`for(const frame of finalKillReplay.frames) frame.arrays.detachedParts.push({x1:1000000,x2:1000020,y1:1000000,y2:1000020}); + globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+800000);`); + assert.ok(f.run('cameraDoll.width<5000')); + assert.ok(f.run('Math.abs(cameraCenter-1550)<500')); + f.run('undo();'); +}); + +test('both themes rotate from shared map state without changing gameplay state',()=>{ + const f=fixture(); + for(let round=0;round<20;round++) { + f.run(`installRoundMap(${round}%10);globalThis.before=netStateHash();refreshPhotoTheme();`); + assert.equal(f.run('roundGraphicsTheme()'),Math.floor(round/5)%2?'flat':'photorealistic'); + assert.equal(f.run('netStateHash()===before'),true); + } + f.run('globalThis.__oskiewarGraphicsTheme="flat";installRoundMap(0);'); + assert.equal(f.run('roundGraphicsTheme()'),'flat'); +}); + +test('WIN/LOSE replay never paints the full-screen death flash before or after the hit',()=>{ + const f=fixture();recordKill(f); + f.run(`globalThis.fullscreenFlashes=[]; + const originalRect=screenRect; + screenRect=(x,y,w,h,color)=>{ + if(x===0 && y===0 && w>=viewWidth() && h>=viewHeight && color.every(c=>c>=100)) + fullscreenFlashes.push(color); + return originalRect(x,y,w,h,color); + };`); + // Rewind through the complete impact window in each angle and a repeated loop. + for (const shot of [0,1,2,3]) for (const phase of [0,100000,200000,700000,1100000,1400000,1700000]) { + f.run(`globalThis.undo=beginFinalKillReplay(finalKillReplay.wallStarted+${shot*1800000+phase});gamePaint();undo();`); + } + assert.equal(f.run('fullscreenFlashes.length'),0); + // Results must also stay visible during the live quarter-second capture tail. + f.run('finalKillReplayRendering=false;finalKillReplayClockUs=deathCinematic.startedAt+20000;drawDeathFlash();finalKillReplayClockUs=null;'); + assert.equal(f.run('fullscreenFlashes.length'),0); + assert.ok(f.run('deathCinematicAge(deathCinematic.startedAt-200000)<0')); +}); diff --git a/xbox/live/tests/oskiewar-netplay.test.mjs b/xbox/live/tests/oskiewar-netplay.test.mjs index 74e13044b4..f1dd4d92cb 100644 --- a/xbox/live/tests/oskiewar-netplay.test.mjs +++ b/xbox/live/tests/oskiewar-netplay.test.mjs @@ -15,10 +15,11 @@ const source = await readFile(new URL("../oskiewar.js", import.meta.url), "utf8" // A seat: the piece loaded headless, with a clock the test owns, a pad the // test presses, and every host hook counted rather than performed. function createSeat({ viewport = { width: 1920, height: 1080 }, - roundBridge = null, netSend = null, knockoutFrame = null } = {}) { + roundBridge = null, netSend = null, knockoutFrame = null, renderAlpha = 0 } = {}) { let now = 5000000; const pad = { connected: true, down: [], leftX: 0, leftY: 0 }; - const counts = { drums: 0, signals: 0, telemetry: [], analytics: 0, published: 0 }; + const counts = { drums: 0, signals: 0, telemetry: [], analytics: 0, published: 0, + publishedRooms: [] }; // Every demo this seat filed, in the order it filed them. const replays = []; const noOp = () => {}; @@ -43,7 +44,15 @@ function createSeat({ viewport = { width: 1920, height: 1080 }, } }; } - return { configureWorldMap, skateRopes, boot, sim, paint, saberPickups, players, workshopCommand, + return { fixtureRound: (index, head = false) => { + netRoundMapIndex=index; resetRound(runtime().monotonicUs, false, true); + if(head) for(const p of players) { + p.removedParts=['left-arm','right-arm','left-leg','right-leg','torso']; + p.headRoll=0; p.headRollRate=0; + } + }, fixtureCamera: () => ({y:cameraCenterY,width:cameraDoll.width, + target:{...cameraDoll.target},position:{...cameraDoll.position},error:clientError}), + configureWorldMap, skateRopes, boot, sim, paint, saberPickups, players, workshopCommand, workshopFrame: () => spectatorState(runtime().monotonicUs), workshopView: (frame) => applyRoundViewerState(frame, runtime().monotonicUs), netHashTextAt: (f) => netHashTexts.get(f), netHashFrames: () => [...netHashTexts.keys()], fixtureKnockouts: () => fixtureKnockouts.slice(), @@ -77,20 +86,21 @@ function createSeat({ viewport = { width: 1920, height: 1080 }, fighters: () => players.map((player) => ({ name: player.name, x: player.x, y: player.y, alive: player.alive, score: player.score, roundWins: player.roundWins, remote: player.remote })), - roundState: () => ({ roundResult, roundElapsedUs, matchOver, + roundState: () => ({ roundResult, roundElapsedUs, matchOver, map:currentMapName, shellMode, gameplayStarted, fightOpponent, gameMode }), startVersus: () => startVersusFight(runtime().monotonicUs, true), clock: () => runtime().monotonicUs };` )( () => ({ monotonicUs: now, unixMs: 1785870000000 + Math.floor(now / 1000), - simCount: Math.floor(now / 16667), paintCount: 0, renderAlpha: 0 }), + simCount: Math.floor(now / 16667), paintCount: 0, renderAlpha }), (index = 0) => index === 0 ? { ...pad, down: pad.down.slice() } : { connected: false, down: [], leftX: 0, leftY: 0 }, () => ({ platform: "web", inputFamily: "keyboard" }), (event, detail) => counts.telemetry.push([event, detail]), () => { counts.signals++; }, (payload) => { replays.push(payload); return Promise.resolve(true); }, - () => { counts.published++; }, () => { counts.analytics++; }, + (room) => { counts.published++; counts.publishedRooms.push(room); }, + () => { counts.analytics++; }, () => { counts.drums++; }, noOp, noOp, noOp, noOp, undefined, undefined, noOp, noOp, () => viewport, knockoutFrame, ); @@ -135,7 +145,8 @@ function createWire(a, b, { delay = 3, loss = 0, jitter = 0, seed = 7 } = {}) { sent[from]++; if (loss && random() < loss) { dropped[from]++; return true; } const extra = jitter ? Math.floor(random() * (jitter + 1)) : 0; - queues[from].push({ at: tick + delay + extra, packet: structuredClone(packet) }); + queues[from].push({ at: tick + (Array.isArray(delay) ? delay[from] : delay) + extra, + packet: structuredClone(packet) }); return true; }; const seats = [a, b]; @@ -331,6 +342,44 @@ test("a seat that stops hearing the rival waits instead of guessing forever", () assert.ok(later.frame >= frozen, "the host never rewinds its own frame count"); }); +test("equal clocks keep 60 Hz simulation across a seven-frame one-way wire", () => { + const host = createSeat(), guest = createSeat(); + const wire = createWire(host, guest, { delay: 7 }); + beginPair(host, guest, wire); + for (let frame = 0; frame < 660; frame++) { wire.step(); host.tick(); guest.tick(); } + for (const seat of [host, guest]) { + const state = seat.fight.netplayState(); + assert.ok(state.frame >= 650, 'WAN transit must not look like a fast local clock'); + assert.equal(state.stats.desyncs, 0); + assert.ok(state.stats.stalls < 8, 'equal peers do not both lose one tick in four'); + } +}); + +test("lead exchange still bounds a genuinely faster peer over a delayed wire", () => { + const host = createSeat(), guest = createSeat(); + const wire = createWire(host, guest, { delay: 5, jitter: 2 }); + beginPair(host, guest, wire); + for (let frame = 0; frame < 660; frame++) { + wire.step(); host.tick(); if (frame % 5 !== 0) guest.tick(); + } + const a = host.fight.netplayState(), b = guest.fight.netplayState(); + assert.ok(a.stats.stalls + a.stats.waits > 30, 'faster peer gives back time'); + assert.ok(Math.abs(a.frame - b.frame) <= 10, 'simulation clocks remain bounded'); + assert.equal(a.stats.desyncs + b.stats.desyncs, 0); +}); + +test("unequal one-way delays do not continuously throttle equal clocks", () => { + const host = createSeat(), guest = createSeat(); + const wire = createWire(host, guest, { delay: [2, 7] }); + beginPair(host, guest, wire); + for (let frame = 0; frame < 660; frame++) { wire.step(); host.tick(); guest.tick(); } + for (const seat of [host, guest]) { + const state = seat.fight.netplayState(); + assert.ok(state.frame >= 640, 'both seats maintain nearly 60 Hz despite asymmetric transit'); + assert.equal(state.stats.desyncs, 0); + } +}); + // A desync used to be counted and lived with: two machines no longer playing // the same fight went on playing their different ones, and the two people // found out when one died on a screen where they had not been hit. The repair @@ -400,6 +449,8 @@ test("rounds roll over inside the fight and both seats agree on the score", () = assert.ok(seat.fight.fixtureKnockouts().includes(500), "the scheduled KO occurred"); assert.ok(equalize(host, guest, wire)); assert.equal(host.fight.netplayHash(), guest.fight.netplayHash()); + assert.notEqual(host.fight.roundState().map, "HALFPIPE"); + assert.equal(host.fight.roundState().map, guest.fight.roundState().map); const hostState = host.fight.netplayState(); assert.equal(hostState.stats.desyncs, 0); assert.equal(guest.fight.netplayState().stats.desyncs, 0); @@ -674,7 +725,7 @@ test("a recorded rollback round holds the fight that really happened", () => { const record = host.fight.replayState(); assert.ok(record, "the host is recording"); assert.equal(guest.fight.replayState(), null, "and the challenger is not"); - assert.equal(record.timed, false, "a versus round is not on a clock"); + assert.equal(record.timed, true, "the replay preserves the versus round deadline"); // A demo is read strictly forward — `advanceResimCommands` walks the stream // with a cursor that only moves on — so the stream has to be in time order. @@ -723,12 +774,16 @@ test("a recorded rollback round holds the fight that really happened", () => { // two halves cannot drift apart the way the checkpoint row and its contract // did for seventeen days. test("a versus round is filed, and the store accepts what was written", () => { - const host = createSeat(); - const guest = createSeat(); + const host = createSeat({knockoutFrame:500}); + const guest = createSeat({knockoutFrame:500}); host.fight.setVersusRoom("regga890"); guest.fight.setVersusRoom("regga890"); const wire = createWire(host, guest, { delay: 3, jitter: 2, loss: .05, seed: 11 }); + const hostAnalytics = host.counts.analytics, guestAnalytics = guest.counts.analytics; beginPair(host, guest, wire); + assert.equal(host.counts.analytics - hostAnalytics, 1, "one host-authored match event"); + assert.equal(guest.counts.analytics - guestAnalytics, 0, "the guest does not duplicate the match event"); + host.counts.publishedRooms.length = guest.counts.publishedRooms.length = 0; // Long enough for a knockout, the result card, and the next round's bell. run(host, guest, wire, 2400, { settle: 60 }); @@ -736,13 +791,17 @@ test("a versus round is filed, and the store accepts what was written", () => { assert.ok(filed.length > 0, "the host filed at least one round"); assert.equal(guest.saved().length, 0, "and the challenger filed none — two authors would race for one id"); + assert.ok(host.counts.publishedRooms.length > 0, "the host publishes the live fight"); + assert.deepEqual([...new Set(host.counts.publishedRooms)], ["ow-regga890"], + "timed rounds keep publishing the stable versus room instead of opening a second round room"); + assert.equal(guest.counts.publishedRooms.length, 0, "the challenger never claims a publisher socket"); for (const demo of filed) { assert.equal(validateDemo(demo), null, `the store accepts ${demo.roundId}: ${validateDemo(demo)}`); assert.equal(demo.roomId, "ow-regga890", "stamped with the room it was played in"); assert.equal(demo.roomName, "regga890"); - assert.equal(demo.timed, false, "a versus round runs on no clock"); + assert.equal(demo.timed, true, "a saved versus round keeps its time limit"); assert.ok(demo.commands.length > 0, "and it carries the fight's inputs"); } @@ -844,6 +903,24 @@ test("a sword survives a rollback the same way on both seats", () => { }); +test('head-only bounce controls survive delayed input and unequal paint cadence', () => { + const host=createSeat({renderAlpha:.4}), guest=createSeat({renderAlpha:1}); + const wire=createWire(host,guest,{delay:7,jitter:3,seed:31}); + beginPair(host,guest,wire); + for(const seat of [host,guest]) { + seat.fight.players[1].removedParts=['left-arm','right-arm','left-leg','right-leg','torso']; + } + for(let frame=0;frame<1200;frame++) { + assert.ok(host.fight.netplayState() && guest.fight.netplayState(),`desync at ${frame}`); + const f=guest.fight.netplayState().frame; + guest.press(f%180<90?'ArrowLeft':'ArrowRight', f%24<12?'ArrowUp':'ArrowDown'); + host.tick();guest.tick();wire.step(); + host.fight.paint();if(frame%2===0)guest.fight.paint(); + } + assert.equal(host.fight.netplayState().stats.desyncs,0); + assert.equal(guest.fight.netplayState().stats.desyncs,0); +}); + test('a coach map edit moves both network seats to the host stream', async () => { const { validateMap } = await import('../oskiewar-map.mjs'); const host = createSeat(), guest = createSeat(); @@ -906,3 +983,118 @@ test("networked skatepark ropes converge after delayed grab, climb and swing inp assert.equal(host.fight.players[1].ropeIndex, 1); assert.deepEqual(host.fight.skateRopes, guest.fight.skateRopes); }); + + +test('a fresh network deal clears head pumping inherited from local play', () => { + const host = createSeat(), guest = createSeat(); + Object.assign(host.fight.players[1], {headBounceCharge: .8, + headPumpDirection: -1, headPumpAt: 4700000}); + const wire = createWire(host, guest, {delay: 7}); + beginPair(host, guest, wire); + for (const field of ['headBounceCharge', 'headPumpDirection', 'headPumpAt']) + assert.equal(host.fight.players[1][field], 0, field); + assert.equal(host.fight.netplayHash(), guest.fight.netplayHash()); +}); + + +test('network frame zero never inherits a locally held Menu button', () => { + const host=createSeat(),guest=createSeat(); + host.press('Menu');host.tick();guest.press('ArrowLeft');guest.tick(); + const wire=createWire(host,guest);beginPair(host,guest,wire); + assert.equal(host.fight.netplayHash(),guest.fight.netplayHash()); + assert.deepEqual(host.fight.players.map(p=>p.previous),[[],[]]); +}); + +for (const [index, name] of [[7,"SLOW MOTION"],[8,"AIR DROP"],[9,"UNARMED"]]) { + test(`${name} remains synchronized through 25 seconds of delayed inputs and unequal paints`, () => { + const host=createSeat(), guest=createSeat(); + const wire=createWire(host,guest,{delay:4,jitter:3,loss:.015,seed:190+index}); + beginPair(host,guest,wire); + host.fight.fixtureRound(index,index===8); + guest.fight.fixtureRound(index,index===8); + for(let frame=0;frame<1560;frame++) { + for(const [seat,client] of [host,guest].entries()) { + const beat=client.fight.netplayState().frame % 150; + client.press(beat<65 ? (seat ? "ArrowRight":"ArrowLeft") + : beat<130 ? (seat ? "ArrowLeft":"ArrowRight") : "ArrowUp"); + client.tick(); + } + wire.step(); + if(frame%3===0)host.fight.paint(); + if(frame%7===0)guest.fight.paint(); + for(const client of [host,guest]) { + assert.ok(client.fight.netplayState(), `still connected at frame ${frame}`); + assert.equal(client.fight.netplayState().stats.desyncs,0); + } + } + host.press();guest.press(); + for(let i=0;i<40;i++){host.tick();guest.tick();wire.step();} + assert.ok(equalize(host,guest,wire)); + assert.equal(host.fight.netplayHash(),guest.fight.netplayHash()); + for(const client of [host,guest]) { + assert.equal(client.fight.roundState().map,name); + assert.ok(client.fight.netplayState().stats.rollbacks>0); + client.fight.paint(); + const camera=client.fight.fixtureCamera(); + assert.equal(camera.error,""); + assert.ok([camera.y,camera.width,...Object.values(camera.target), + ...Object.values(camera.position)].every(Number.isFinite)); + if(index===8) { + assert.ok(client.fight.fighters().every(p=>p.alive&&p.y>12000)); + assert.ok(camera.y>10000,"camera follows the late falling heads"); + } + } + }); +} + +test("both LAN seats reach the ninety-second TIME deadline together and reset the next round clock", () => { + const host = createSeat(), guest = createSeat(); + const wire = createWire(host, guest, { delay: 4, jitter: 3, loss: .01, seed: 174 }); + beginPair(host, guest, wire); + const deadlineUs = 90000000, tickUs = 16667; + const observations = [host, guest].map(() => ({ before: null, ended: null, reset: null })); + for (let tick = 0; tick < 6400 && observations.some((one) => !one.reset); tick++) { + for (const [index, seat] of [host, guest].entries()) { + const observation = observations[index]; + const net = seat.fight.netplayState(); + assert.ok(net, `seat ${index} stays connected at tick ${tick}`); + // A few harmless jumps exercise late-input rollback without ending the + // round through combat. Near the deadline both pads remain neutral. + seat.press(...(net.frame < 1800 && net.frame % 240 < 8 ? ["ArrowUp"] : [])); + const before = seat.fight.roundState(); + seat.tick(); + const after = seat.fight.roundState(); + assert.equal(seat.fight.netplayState().stats.desyncs, 0); + if (!observation.ended && !after.roundResult) { + assert.ok(after.roundElapsedUs < deadlineUs, "a live round never runs past its deadline"); + observation.before = after.roundElapsedUs; + } else if (!observation.ended && after.roundResult) { + const snapshot = seat.fight.netplaySnapshot(); + assert.ok(before.roundElapsedUs < deadlineUs); + assert.ok(observation.before >= deadlineUs - tickUs, "still playing on the last tick before 90 seconds"); + assert.ok(after.roundElapsedUs >= deadlineUs && after.roundElapsedUs < deadlineUs + tickUs); + assert.equal(snapshot.scalars.roundCause, "TIME"); + assert.ok(seat.fight.fighters().every((fighter) => fighter.alive), "timeout, not an accidental knockout"); + observation.ended = { frame: seat.fight.netplayState().frame, + elapsed: after.roundElapsedUs, cause: snapshot.scalars.roundCause, + result: after.roundResult, hash: seat.fight.netplayHash() }; + } else if (observation.ended && !after.roundResult && !observation.reset) { + assert.equal(after.roundElapsedUs, 0, "the next round gets a fresh countdown"); + assert.notEqual(after.map, before.map, "the new map marks a real round transition"); + observation.reset = { frame: seat.fight.netplayState().frame, map: after.map, + hash: seat.fight.netplayHash() }; + } + } + wire.step(); + if (tick % 19 === 0) host.fight.paint(); + if (tick % 31 === 0) guest.fight.paint(); + } + for (const observation of observations) { + assert.ok(observation.ended, "the round ended at 90 seconds"); + assert.ok(observation.reset, "the next round started after the result replay"); + } + assert.deepEqual(observations[0].ended, observations[1].ended, + "both simulations end on the same tick, cause, result and state hash"); + assert.deepEqual(observations[0].reset, observations[1].reset, + "round rotation and clock reset happen without drift"); +}); diff --git a/xbox/live/tests/oskiewar-notepat-layout.test.mjs b/xbox/live/tests/oskiewar-notepat-layout.test.mjs new file mode 100644 index 0000000000..6f7f846190 --- /dev/null +++ b/xbox/live/tests/oskiewar-notepat-layout.test.mjs @@ -0,0 +1,43 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {readFileSync} from 'node:fs'; +import {createContext,runInContext} from 'node:vm'; +import {pixelGlyph} from '../../../fedac/native/lib/oskiewar-host.mjs'; +const source=readFileSync(new URL('../oskiewar.js',import.meta.url),'utf8'); + +test('Notepat score labels fit their bands and viewport using actual AC bitmap metrics',()=>{ + for(const width of [1024,1366,1920]) { + const text=[],rects=[],noop=()=>{}; + const write=(label,x,y,size,...color)=>text.push({label,x,y,size,color}); + write.measureGlyph=(char,size)=>pixelGlyph(char,size,.5).advance/.5; + const context=createContext({Math,Date,performance,structuredClone, + runtime:()=>({monotonicUs:1000000,unixMs:1790000000000}), + gamepad:()=>({connected:false,down:[]}),capabilities:()=>({platform:'ac-native'}), + gameView:()=>({width,height:768}),telemetry:noop,gameSignal:noop,drum:noop,synth:noop, + wipe:noop,box:noop,line:noop,triangle:noop,triangle3d:noop,write,systemWrite:write}); + runInContext(source+'\nboot();syncGameView();',context); + context.captureRect=(x,y,w,h,color)=>rects.push({x,y,w,h,color}); + runInContext('screenRect=captureRect;',context); + for(const elapsed of [0,90,390,770]) { + text.length=0;rects.length=0; + runInContext(`globalThis.__oskiewarStageState={performance:{active:true,playing:true,visual:'notepat-score-v1',look:{color:[100,150,220]},movement:'test',title:'Notepat Spatial',source:'the walk',elapsed:${elapsed},duration:NOTEPAT_TV_SCORE.duration},receivedAt:Date.now()};drawPerformanceStage();`,context); + const bands=rects.filter(r=>['23,32,47','86,116,151'].includes(r.color.join(','))); + assert.ok(bands.length>5); + for(const band of bands) { + assert.ok(band.y>=44,'section names clear the native battery badge'); + const labels=text.filter(t=>t.y>=band.y&&t.y=band.x&&t.xsum+write.measureGlyph(c,label.size),0); + assert.ok(label.x+measured<=band.x+band.w,`${label.label} crosses its section at width ${width}`); + } + } + for(const tick of text.filter(t=>/^\+\d+s$/.test(t.label))) { + const measured=[...tick.label].reduce((sum,c)=>sum+write.measureGlyph(c,tick.size),0); + assert.ok(tick.x>=0&&tick.x+measured<=width*.97,`${tick.label} leaves the viewport`); + } + const footer=text.find(t=>t.label==='notepat spatial'); + const sub=text.filter(t=>t.label==='sub').at(-1); + assert.ok(footer&&sub&&sub.y+pixelGlyph('s',sub.size,.5).height/.5< footer.y-12); + } + } +}); diff --git a/xbox/live/tests/oskiewar-round-modifiers.test.mjs b/xbox/live/tests/oskiewar-round-modifiers.test.mjs new file mode 100644 index 0000000000..d61f306e6e --- /dev/null +++ b/xbox/live/tests/oskiewar-round-modifiers.test.mjs @@ -0,0 +1,127 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { createContext, runInContext } from 'node:vm'; +const source = readFileSync(new URL('../oskiewar.js', import.meta.url), 'utf8'); +function fixture() { + let now = 1000000; + const noop = () => {}; + const ctx = createContext({ Math, Date, performance, structuredClone, + runtime: () => ({monotonicUs:now,unixMs:1790000000000 + now / 1000,renderAlpha:0}), + gamepad: () => ({connected:true,down:[],leftX:0,leftY:0}), + capabilities: () => ({platform:'xbox',inputFamily:'xbox'}), + gameView: () => ({width:1366,height:768}), + telemetry:noop, gameSignal:noop, drum:noop, synth:noop, + wipe:noop,box:noop,line:noop,triangle:noop,triangle3d:noop,write:noop,systemWrite:noop, + }); + const run = script => runInContext(script,ctx); + run(source + '\nboot();'); + return {run,advance:us => {now += us; return run('runtime().monotonicUs');}}; +} +test('all ten authored maps restore modifiers and keep weapons out of UNARMED',()=>{ + const f=fixture(); + assert.equal(f.run('localMapVariants.length'),10); + for(let i=0;i<10;i++) { + f.run(`installRoundMap(${i})`); + if(i===9) assert.equal(f.run('gunPickups.length+saberPickups.length+grenadePickups.length'),0); + else { + assert.ok(f.run('gunPickups.some(p=>p.kind === "ROCKET LAUNCHER")')); + assert.ok(f.run('grenadePickups.length > 0')); + } + assert.ok(f.run('parkSegments.every(s=>Number.isFinite(s.left)&&Number.isFinite(s.right))')); + } + assert.equal(f.run('roundModifier'),'unarmed'); + f.run('installRoundMap(8)');assert.equal(f.run('roundModifier'),'air'); + f.run('installRoundMap(7)'); assert.equal(f.run('roundSpeed()'),.5); + f.run('installRoundMap(0)'); assert.equal(f.run('roundModifier'),''); +}); +test('slow motion halves the entire gameplay clock and restores full speed continuously',()=>{ + const f=fixture(); + f.run('installRoundMap(7)'); + const a=f.run('runtime().monotonicUs'); + assert.equal(f.advance(1000000)-a,500000); + f.run('installRoundMap(0)'); + const b=f.run('runtime().monotonicUs'); + assert.equal(f.advance(1000000)-b,1000000); +}); +test('air drop falls past the old floor for 20 seconds without killing or grounding either fighter',()=>{ + const f=fixture(); + f.run(`installRoundMap(8); + for(const p of players) {p.x=p.spawnX;p.y=floorY-400;p.vy=0;p.grounded=false;p.alive=true;p.bot=false;} + shellMode='GAME'; selecting=false; roundResult=''; + for(let frame=0;frame<1200;frame++) { + const now=5000000+frame*16667; + for(const p of players) updatePlayer(p,{connected:true,down:[],leftX:0,leftY:0},1/60,now); + } + `); + assert.ok(f.run('players.every(p=>p.alive&&!p.grounded&&p.y>floorY+12000&&p.yp.vy<=760)')); + f.run('updateCameraDoll(1/60,25000000); paint();'); + assert.ok(f.run('Number.isFinite(cameraCenterY)&&cameraCenterY>floorY')); +}); +test('pickups visibly fall onto normal maps and keep returning within reach during air drop',()=>{ + const f=fixture(); + f.run('installRoundMap(0); for(const p of gunPickups) beginPickupDrop(p);'); + const before=f.run('gunPickups[0].y'); + f.run('updateFallingPickups(.1,5000000)'); + assert.ok(f.run('gunPickups[0].y')>before); + f.run('for(let i=0;i<180;i++)updateFallingPickups(1/60,5000000+i*16667)'); + assert.equal(f.run('gunPickups[0].dropping'),false); + f.run(`installRoundMap(8); for(const p of players){p.y=15000;p.x=p.spawnX;p.alive=true;} + for(const p of gunPickups)beginPickupDrop(p); + gunPickups[0].y=18000;updateFallingPickups(1/60,9000000);`); + assert.ok(f.run('gunPickups[0].y<15000&&gunPickups[0].y>12000')); + f.run('gunPickups[0].active=false;updateFallingPickups(1/60,10000000);updateFallingPickups(1/60,15000000)'); + assert.equal(f.run('gunPickups[0].active'),true); +}); +test('rollback restores the slow clock debt and falling pickup motion together',()=>{ + const f=fixture(); + f.run(`installRoundMap(7);netRoundMapIndex=7; + const deal=netMakeDeal(); netBegin(deal,0,()=>{}); + installRoundMap(7); netRoundMapIndex=7; + for(const p of gunPickups)beginPickupDrop(p); + netSimulateFrame(netSession,0,false); netSession.frame=1; + globalThis.saved=netSnapshot(); globalThis.savedHash=netStateHash(); + netSimulateFrame(netSession,1,false); netSession.frame=2; + globalThis.nextHash=netStateHash(); + `); + assert.equal(f.run('netRoundClockDebtUs'),f.run('NET_TICK_US')); + f.run('netRestore(saved)'); + assert.equal(f.run('netStateHash()'),f.run('savedHash')); + f.run('netSimulateFrame(netSession,1,true)'); + assert.equal(f.run('netStateHash()'),f.run('nextHash')); +}); + +test('UNARMED clears prior loadouts/projectiles and never replenishes weapon powerups',()=>{ + const f=fixture();f.run(`players[0].gunAmmo=12;players[0].grenadeAmmo=3;players[0].swordHeld=true; + bullets.push({x:100});grenades.push({alive:true});installRoundMap(9); + roundElapsedUs=60000000;updatePowerups(60000000);updateFallingPickups(1,60000000);`); + assert.equal(f.run('currentMapName'),'UNARMED'); + assert.ok(f.run('players.every(p=>p.gunAmmo===0&&p.grenadeAmmo===0&&!p.swordHeld)')); + assert.equal(f.run('bullets.length+grenades.length+gunPickups.length+saberPickups.length+grenadePickups.length'),0); + f.run('globalThis.slot={active:true,dropping:true};beginPickupDrop(slot);'); + assert.equal(f.run('slot.active'),false);assert.equal(f.run('slot.dropping'),false); +}); +test('UNARMED rejects stale gun/grenade use and saber reach while keeping punches, kicks and movement',()=>{ + const f=fixture();f.run('installRoundMap(9);players[0].gunAmmo=9;players[0].gunMode="ROCKET LAUNCHER";players[0].swordHeld=true;'); + assert.equal(f.run('heldItem(players[0])'),''); + assert.equal(f.run('meleeSpecFor(players[0],"PUNCH")===meleeSpecs.PUNCH'),true); + f.run('fireGun(players[0],{horizontal:1,vertical:0});players[0].grenadeAmmo=3;throwGrenade(players[0]);'); + assert.equal(f.run('bullets.length+grenades.length'),0); + f.run('startMelee(players[0],"PUNCH",5000000);');assert.equal(f.run('players[0].attackKind'),'PUNCH'); + f.run('players[0].attackUntil=0;startMelee(players[0],"KICK",6000000);');assert.equal(f.run('players[0].attackKind'),'KICK'); + const x=f.run('players[0].x'); + f.run('updatePlayer(players[0],{connected:true,down:["ArrowRight"],leftX:1,leftY:0},.1,7000000);'); + assert.ok(f.run('players[0].x')>x); +}); +test('UNARMED severed arms cannot drop or transfer stale weapon inventory',()=>{ + const f=fixture();f.run(`installRoundMap(9);const target=players[1];target.itemArm="left-arm"; + target.gunAmmo=8;target.grenadeAmmo=2;target.swordHeld=true; + const segment=runnerWorldGeometry(target,0).segments.findIndex(s=>s.part==="left-arm"); + damagePart(target,segment,target.x-100,0,5000000);damagePart(target,segment,target.x-100,0,5000001);`); + assert.ok(f.run('players[1].removedParts.includes("left-arm")')); + assert.equal(f.run('gunPickups.length+saberPickups.length+grenadePickups.length'),0); + assert.ok(f.run('players[1].gunAmmo===0&&players[1].grenadeAmmo===0&&!players[1].swordHeld')); + f.run('players[1].x=players[0].x+100;players[1].gunAmmo=6;players[1].heldBall=players[1].heldPart=-1;'); + assert.equal(f.run('stealHeldObject(players[0],6000000)'),false);assert.equal(f.run('players[0].gunAmmo'),0); +}); diff --git a/xbox/native-bios/NET-QUEUE.md b/xbox/native-bios/NET-QUEUE.md new file mode 100644 index 0000000000..992477fb5e --- /dev/null +++ b/xbox/native-bios/NET-QUEUE.md @@ -0,0 +1,36 @@ +# Xbox input send queue + +`NetSendQueue` coalesces only adjacent, same-session input packets waiting for +`DataWriter::StoreAsync`. The in-flight write is unchanged. Simulation and the +configured input frequency are unchanged; the paired build remains at 30 Hz +until a separate device trial establishes a benefit at 60 Hz. + +Every frame from both packets survives in the merged history. Overlapping +masks must agree, ranges cannot move backwards or leave a gap, and the union +cannot exceed the receiver's existing 20-frame limit (`NET_REDUNDANCY * 2`). +Newest acknowledgement, simulation-frame, lead, timestamp and echo fields +remain verbatim. Hashes, controls, unknown extensions, different session +origins and malformed/unrecognized packets remain FIFO barriers. Queue +capacity stays 32; a full queue may accept an input only by safely merging its +tail. This does not change existing socket-error recovery or retry semantics. + +`xbox/runtime/tests/net_send_queue_contract.cpp` checks parsing boundaries, +both JSON field orders, conflicting overlaps, gaps, session changes, barriers, +maximum packet size, queue capacity, and complete frame preservation through a +100-packet burst. It passes with C++17, AddressSanitizer and UndefinedBehaviorSanitizer. +The Windows native preflight also compiles and runs it. + +A deterministic 30-second simulation with 60 Hz input and a 25 ms serialized +writer produced these results: + +| Queue | Maximum queued packets | Rejected packets | Mean newest-input age at completion | +| --- | ---: | ---: | ---: | +| Previous FIFO | 32 | 568 | 789.4 ms | +| Complete-history merge | 1 | 0 | 37.2 ms | + +These are synthetic results. They do not establish Xbox RTT, game FPS, or +improved performance on the current LAN. Native package **1.0.0.44** passed +Windows preflight, GDK and UWP builds (AppVeyor 1.0.462) and was installed with +shared game v169, photographic assets and the LAN relay verified. A matched +device profile is still required before raising the configured 30 Hz send +frequency. diff --git a/xbox/native-bios/NativeBios.vcxproj b/xbox/native-bios/NativeBios.vcxproj index 711e203073..0a49e2b85f 100644 --- a/xbox/native-bios/NativeBios.vcxproj +++ b/xbox/native-bios/NativeBios.vcxproj @@ -83,6 +83,23 @@ verified on hardware. --> PreserveNewest PreserveNewest + + + Assets\ThemeUnderpass.rgbaPreserveNewest + + + Assets\ThemeProps.rgbaPreserveNewest + + + Assets\ThemeExplosions.rgbaPreserveNewest + + + Assets\ThemeSkyClouds.rgbaPreserveNewest + + + Assets\ThemeWeapons.rgbaPreserveNewest + + Assets\ywft-processing-regular.ttf diff --git a/xbox/themes/photorealistic/README.md b/xbox/themes/photorealistic/README.md new file mode 100644 index 0000000000..1608cb057c --- /dev/null +++ b/xbox/themes/photorealistic/README.md @@ -0,0 +1,50 @@ +# Miniature night + +Generated miniature photography was introduced in Xbox package **1.0.0.43** and runs in **1.0.0.44** and the paired AC OS build. Both native displays were visually verified. Sustained 60 FPS is **not yet verified**. The room, puppet heads and limbs, blaster, skateboard, concrete platforms, and rocket share this asset set. AC is purple on the left; Xbox is green on the right. The gun remains in the posed hand. + +Run from this directory with `python3 -m http.server 7893 --bind 127.0.0.1`, then open `http://127.0.0.1:7893`. The theme selector switches the same animated pose between flat and miniature materials without restarting it. This is a material/rig demo with synthetic poses, not a running multiplayer game. `preview-miniature.png` is an inspected render; `preview-flat.png` is the comparison. + +`theme.mjs` is a presentation-only adapter: the host supplies head position, limb endpoints, hand position, facing, and seat identity. It does not mutate those inputs or touch gameplay random state. `canvasDriver` implements the abstract image/shape drawing contract. All generation happens before play. Two decoded images are retained for the session; animation transforms atlas regions without downloading or regenerating anything. + +## Native integration + +Xbox package 1.0.0.43 adds the retained texture path and bounded APIs below; its Windows build, packaged asset hashes, installation, and actual display are verified. AC OS implements the same API in its GLES renderer and was visually verified on HDMI. `nativeReady` means available and visually verified on both hosts; `native60FpsVerified` remains false. See `native-verification.json` and `verification-xbox43.png`. + +The common native API is `themeReady()`, `themeSprite(asset,sx,sy,sw,sh,cx,cy,w,h,radians,flip,z)`, and `themeQuad(asset,sx,sy,sw,sh,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4)`. Quad vertices follow TL/TR/BR/BL order. Asset 0 is the background, asset 1 the props. Source rectangles use original master pixels; destination/depth match each host's triangle API. Alpha below 0.5 is discarded before depth writes. `native/prepare.mjs` reproducibly converts the masters into the shared RGBA8 variants, with hashes in `native/manifest.json`. + +| Runtime | Existing path | Missing work | +| --- | --- | --- | +| Xbox | D3D11 uploads two packaged RGBA images once, reuses the sprite shader and vertex buffer, and submits at most two theme batches. | Sustained performance measurement. The existing spark and Jeffrey texture paths are preserved. Queue capacity is 1,024 quads. | +| AC OS | Retained atlas textures and UV quads share the offscreen GLES target and its existing final readback. | Continue frame pacing work and measure sustained performance with debug and HDMI enabled. CPU font rasterization is not a GPU glyph atlas. No per-pixel JS rendering. | + +Native hosts load the packaged raw RGBA assets once and expose availability through `themeReady()`. The shared game uses photographic materials when available; `__oskiewarGraphicsTheme='flat'` selects vectors, which are also the fallback when the host lacks the texture API. Collision shapes, player state, hash calculation and fixed-step simulation remain unchanged. A future menu selector could switch materials independently at a round boundary without changing the physics protocol. + +The game now draws projected heads, limbs, held guns, skateboards and terrain with these assets; the browser adapter remains an isolated reference. Gameplay supplies the detached-head pose, and sprite bounds never determine its collision radius. Version 171 adds photographic grenade pickups, held grenades, launcher/SMG props, muzzle flashes, eight-frame fire/smoke explosions, and bounded WIN/LOSE/TIE accents when the extended native capabilities are available. Individual map materials and some small powerup/debris graphics still use the original artwork or procedural shapes. The browser preview covers one map and two figures. + +## Effects extension (native 45 / game 171) + +This extension is built and tested but is pending coordinated device installation and visual verification. `themeAssetReady(id)` probes each optional atlas independently: asset 2 is the explosion flipbook (master 1774×887), and asset 3 is the grenade/weapon/flash sheet (master 1254×1254). `themeSprite` accepts an optional thirteenth argument, `depthWrite`, defaulting to true. Older hosts retain the original theme and procedural effects. + +Explosions and flashes use straight alpha blending, discard nearly transparent fragments, and never write depth. Solid weapon props retain the 0.5 alpha cutoff before depth writes to prevent faint edge pixels from occluding the scene. Xbox submits original materials, solid props, soft flashes, then explosions; the original 1,024-quad bound remains. Generated assets are retained, and the added graphics never alter gameplay state or random numbers. + +`drawPhotoRoundOutcome(result, ageSeconds, x, y, width, height)` draws two bounded photographic accents behind the caller’s result word. It emits no text, refreshes capabilities even on result-only frames, and leaves the caller’s stats and QR panel in front. Exact generation prompts and original output paths are in `effects-provenance.json`; native hashes are in `native/manifest.json`. + +Portable native and QuickJS tests pass, as do 28 netplay tests and targeted rendering tests covering frame bounds, pose immutability, depth flags, and older-host fallback. Actual native 45 frame rate and display quality still need verification after installation. The browser material demo intentionally remains the original two-atlas pose reference. + +## Cloud sky extension (native 46) + +Asset 4 adds an opaque cloud sky for AIR: master `assets/sky-clouds-v1.png` is 1672×940; native `sky-clouds-v1-1024x576.rgba` is 1024×576. Probe `themeAssetReady(4)` before drawing through the existing sprite or quad API. A missing sky never disables the original theme. It uses the original cutout shader and normal depth writes, without blending, and renders before foreground materials. The source image was visually inspected: cloud banks surround open blue-violet sky, with no ground, objects or text. Exact built-in generation prompt and provider are in `sky-provenance.json`. + +The fifth atlas adds 2.25 MiB, bringing retained RGBA textures to **12.5 MiB** (13,107,200 bytes). Xbox portable/QuickJS tests verify availability and the exact master bounds. AC native tests cover sky depth and optional-asset fallback. Device deployment and actual display verification are coordinated separately. + +## Frame budget + +The master images total about 12 MiB decoded RGBA; encoded assets total about 2.8 MiB. The original native pair uses a capped 1024×576 background and 1024×512 atlas, totaling **4.25 MiB RGBA**. The optional effects extension adds a 1024×512 explosion atlas and 1024×1024 weapon atlas, bringing retained texture memory to **10.25 MiB RGBA** (10,747,904 bytes), uploaded outside the frame loop. The runtime retains GPU buffers and batches by atlas. Keep alpha overdraw to each sprite's tight bounds; do not add blur, per-frame image decoding, per-frame uploads, runtime model calls, or JavaScript pixel loops. + +The remaining performance acceptance target: run the same deterministic replay on **both actual devices**, debug overlay and HDMI mirroring enabled, with guns, detached heads, grenades, and falling powerups. Measure total frame p95 ≤16.67 ms for sustained 60 FPS, not just this renderer's submission time. Compare dark and miniature variants, check memory and texture-loss recovery, and verify zero new netplay mismatches. Adding assets alone does not establish that target. + +## Verification + +`node --test theme.test.mjs` checks pose immutability, independent seat/facing identity, atlas bounds, and explicit missing-capability behavior. `node verify.mjs` uses installed Google Chrome through Playwright to render both themes, switch while paused without time changing, resume animation, and record browser errors plus CPU draw-submission samples. See `verification.json`; its timings are **not Xbox/AC OS FPS**. + +Generated with the built-in `image_gen` tool. Exact prompts, dimensions, file hashes, and alpha verification are in `provenance.json`. Generated imagery is a first coherent visual direction, not a claim that every effect or every map has unique photographic artwork. The original browser preview remains isolated; native integration is in the shared game and platform renderers. diff --git a/xbox/themes/photorealistic/assets/explosions-v1.png b/xbox/themes/photorealistic/assets/explosions-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..687b63c2247e6990d6588e7f8c662dca89cfc51e GIT binary patch literal 1401757 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
  • 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%0Dpgz7s2{v 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�`UaaqZnDXRVN&uw`> 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 =i{Gj zf)*t04Oo4`K_O)+@5~({E-h*+ws5}UC|&yEao9$;w9|gS);<4Zw@I{m+jfT-5nG$E zWziXvH?=vayTJv=@udqs&*u@#EQVZ#xn(8lGmoz9 z(w2$!nU#B}a%$DuDBissr;_GbT80M|-3ZdOdp%=Gi@uH<&(|F)dQ7V~JGf;&lT@GP z_?9E~QmF8f*DZQ3s>+6|j!iK=regVOS=J2US)tc!lVoqqF#n;Wc2H~8ocY>6yG|TP zbF({ra9x2-a9Fp`WZu&$7OxZU9$a!q!FTtJm%?kV&uqxy%B+2M$T`A9Wv%R#Nvdl% z`+aZKzRq>0-+Jc!?{D~f?%mk5W7~1J8~4g5?Q(e|v{cZ`)y4S!4Y#^V`KY&@jwd-U z@|^2hk$2a=_nn-8mNyL9R?;e}r&-cX;kwPno`i6!f}%iL6(vl#X% zq&SzwIW^gRUBVr(evwp?2y4-aRhAc@XB2UHiMbfEI!zZUyn4Y@HgLiO1?8Y9|F^Q| zM3u5m?z~>Mb&|kj$v!u&R&y1%o!!lMO21A1=ko4uwL<zb@;nV)>iHQFxz{4&4c{4;T8>vDU4?+R_$YPzZ7iE)nM z+Qbd}jo97G3nu@3kT4_lQtb7g<(Y9yH_QJ!7xrWR-%sox=Q_7+*K_z${(ctwo}+(% zKl%Uao^A2|O80;7{<1&ptuEiARrB8b9nU}W^3S@J->M%+o;|#F{m;n1592sbKQ!6# zZu9hKvOb*wXRGJ4XK6)D&N2LIxcpev^Pnl0ZtnbAHepd-WRB4Nztg@R-C}SuCHq@Y zdcLJ{c#)dv>biwmwIP$8Peg9ME0@!|{AkIJtl2MuFMDa-{kiAucQ(}Jx9Ior|KUp_ zJ7)8QwB7ESn>6R*8!tg+k4nX9vH6|*YlJnwPkHE)Gi$-U=CTf11vdjVX6*yb5=VFO zzCO3lOYT3f%eMu;6?bMYyu)PPni!<%-)azC`N`$$$=e&^ly>jui1p_a{dVhm;{WIk z75sl6=$@7T6Ogn2%=Nrn;~hUu4Ht8UcsfaM+Bh$Cc~!}kZO1?F+n(jOeR-_y7EWopnF$UUh90EoSppt+^28X4$t{iVxh79mJd(#(_JsR zFWq?eq;QoOyYA&3{rf|0rfe=`~c(7W|y_dT2Q$B%bEetNW!c{cAi>F?&||2S@a z{rpiqe#gH@7Js$={rIuz+pkr;|KA=v|7!Ptw-Za*zfbu6{p6iS^L_o51r7I@|6LTa z-0i#X^P%&0c@vJmw|S8Dcb4AX^Va=w*DkM}`ue(A&eXe;)=D;~1an;zNy}Mlo4ae@ zja6(*`;M3GjN82V)N4*X`TbkWZGL|#w0?Oscd5+u+Begk^Yc5+?Io15a`!1MvFr>9 zGrA`$sV3ZdKd|U%XWQvZr;SGhf+(=>>Moof*G*b|q_kJ5YTlVaXKM8BEH|A8t>Qe8qN_aYfRR zy11FuhCPjclD@wCS*ypvTdCaovohvP9oPBX_aY}}C+|^nu{N0_xVzurqcczYD=zI2 zQ>}Clo8wnlAMM|F@ykThv|1+D#uNKC6!#wdrh4X=q-WJpF@dTjK`V4`rTd&(WH#Bq z>TKoVq$?_`_Bw7>RFIN#oh(!pG4F8FOik|@IR`Vi?;H^bJCrqVhHjPE>3L~86Z_|^ zT~NK~3zz@72Rj09ovmM$G(p9n-@#ywu}Ij(6(YwrWEjuAX~3e@&f{GYz>%~$%~0p| z0$-t`hf8>6KR=a9f1NUiG4aCW{k;?AJ16fKGFk6*CUsKG7tf}T>v-baJq>R!o^vk! zXi#Tt^O1auc-vAd-CZKx_gYn={QXkDemY&SOVI53DUPQv`Vzl9_`LD|oWk;@JC!f< z%g?y{cRKH1_5;szqT(1f*NE1eEsU@Ds}KnFYUZxKq{r@5}n@rx(3V za{Rda+APi1>d4J}zhc$IO?S>*IPved=P#M_MtQ z*E*l9$=Z{6bNeOpzQC8B#}-JN%{9xNq^I^ac+#1)b#HEUTP^!q`*3Ao5z| z*T;`t&a^d$%?xvjbc*EcR*i6MRtUUcmdj#$WRYj93R|W~ub}mfi2DBTJuZR2%!1!n zpSim5*<^*+=dEJ(C+N6o=POw8*}wVmWv|1TwwL>szijzgd45-@X3y0_ksF;azA(xX zj-Bqx!W$T=6Dn6Lli}B#mn(TJSbrG64AFyJs$WDz*E6=>ww~-qI@E z>@yCUy}SLK=dstBbEZ>IYG-xlFA7-%w?M$dJk!OQ5v#nkb+z!t+2LN2*Tv=w`=vadnko|Gvc$RP zMMje6&4(gR!UDV&yCI~O%;oBFad1urD~vQ4z7wwIoo#rtH5&a7#x)&)E-a9+$f zaY1C0sPC~?Num*RO5WOJ$Zwt*zO*vq^cVi(^XkjA`>nL^F7cR{WM2Eb!2Yvd&Hu04 z>o#57RlHE^v#MO#`#X;NzpMQ^CtY88lcnDCar#{U`d5~FX1G@v-v6M){Ql=_@wd!; zd>3ABy5_uK=Ql?yYlq|S?+89~tt#Lzlz;WIOz7vo*fVR}S4vNKlCs{seKG&9=Ec^3 zUNy7dZMLqf_CHm>YeS;B^8KwdW?wvgI(EKWmh9ZLbRjLJV-c&_)ZaOM(mUcIBpSGa z%l#?u*-Yv3Qw~DkXrZ3(maPd}FocqLE%Db80RC;?%dpz^Qi!%!j zPtwy43;FKuw`_6KU)}ZR4jrC6buMC3c?qCc);s@J69emyZp%iEPiY*|q1Argmfr<{!|y$&q_% zmXSny!Ky4?9xla=6E!t@jifq!_FUW+*ynG(<^4{RO~1IUl{|&^`N!NAKXt0$Yuee% z{^Bh&ubvm%5PHa4^waizdNI3I{;X!VT^P)j9mr_dRNGwDtS+`zD-{Kv3;jDzgxm6Q9 z9XmA}S5+k+jTF?@m^DG}nXiApf?voHrE6Xswz2nvpRQTQ@LXqI!K}d6DQhOq6s(qW zayM{ee{=lzfxq+5UESwV@Js2%qkb#%KRf4d1rPmp)qnmmGpFPC_mkh>C7#Qhe7t4? zqg>pHL^(Mn_WgS*YsD*4e?~=JKC$ObRr>3-i_D*TX+&PTbHnK2T6cZX(^DhY$8WB( z@Vfh&-M#YHt?Xa>zn$;;edqo9clGHX_U|r_wtpM+Z~p&RYqhg(Sx=qlnR(OL(d}*f z>E#=*r7jiCyfAJ0xg8TXXG%@(oxCq&Z6?pVE4xKv9v?j3$x-U{cAxfM?H(kcFAtr+ysD1a-hT6+=$p6q z7o3^+=Y?*{d#xu;K8in9XLUsdcW2yJn6z*Q+hVq@OEct>PBChlWt8_#5oR%%BJpui zrQiChD<#fk#)&D4S+&%3OSJn|9z@pJeu9FD9=$ zU;1Ka+L}Mxmwou3_~!7;jn68ko{67-{_%QIy}Fp&U--kagD&K4h~~G~*>$u?^Ia9+ z%@DU`2hG;{?%VUo=hYvt7iZ$E^~FxV{9`kBqZ#wrW1(Ts&hpIsyhI{|r|aMM$7kM{ z9RKv=o56dXD$CSk=YI6P)2Vv6;--p({;$82pJsnz*b~lodSGEa5l)EAYAezS`c8Y#$O1Uz+!?mPh#uU-_HA z<#Gk=51h{kKe+mL`q|{B3pH~pzw({-pKsZ4IbLsy|Ls*p+;eXRv1gY**mml%oxZ8= z;|FgN{^vaZu=2)KzW&__x7O{RyE*#wg7>6=H=ePCq%`hR@iLuwQh+}wd9M3Bu@r< zuH9hKUKpEP_t5IyNlWF*o^?haA1|G8Da%i(E+XTUBqyiw$BxiXN=nY{vKDK^FDWIS zV*Gl#?Nd!(mE+3=(cF_iy6xXQYr$QXPXaf0vFvKPDmbfI==zJSK9TH#&MVt8_V!Bj zXZ3d+OwgMbrP6+L*^cz%4T|{;QWBe2UU*s)xS{#%-Z}dF$_qa)x}I`(!}pS6-KMN_ zy&c;;=1tsve!>r)LrquMH(7Y}PyD*u<3EdWt?1^zvS%F^)~h95&swv1zUHBT+P^}P zuAe?}1cgm@ob4AOv-mR`FJo?X$-Tv|9mJ>XJ2|CQJ@xpf4e17g-|}*NHuuj@RdEh< z49$I$b^CLV)WTIQSFg=vJ4I(*W!p&V9mG1Swx*Rggv!~{GH{T?W zxb;8XHD9mWnD=7Ba<@-mU0JISJxQJR_e#2EZ0d=f(YMsLZG5qPk4lh6@}!qF$899_ z`VX!CSoQnd2`zW|=c~Um*PihWe^-6?=aLJTrKNYO^_|Pv`M;>>`P#@_!S^|TlIyen z{&^(xVNUDsd=u$f(f@Wwk~M z*P1ll_UEUr?U@{OVVB-gqg9iG3@n}RcMGpzk1O(6Q*`Zysw8i(M9V(j1QF$?$-O>O zP3OXA-jn*o6S?kT_V2d4fy-i5ZpCSOJ9BUaMs9C1KUJ`4;{G?&yTYCK2bsQBaDBT( zhNEhpCO=ECWQgmTfDKcVg4`x`&95+x_FLrkE6zl%qD*9_ZfjcS6TWX{`hP-#muUn( zpUbmJXqHM+V0@%%T4&|s?kT%{lQh;FO*MSt*ty=k;`q-(m8}zBih7$iZR^aK;CrcZ z>cw8C#VeXOZS&}vWoIdp&)#+V$zxHkV{hI$#UDD=wDP2HL)gT1j(0e3?d^VLnP%XS zGJT40(w-GNR~G#gH<(`MdS(A21Cf%>XU>M#8ueUm+c!L`efY$7>Nl3T`V*&Iyq5Ri zyX}iA-6uUhSy$Z*qm}=dCEeOub$el9aJM#hqLEluzJap0X~?R;#=S;P%@d+qSN|56 z{^3i{9-HG|)B}1A*sYfw=dJoBQEtFg_#}&)jn8<+iRbPCRv~2*eu@29&l#1U!L(0R z?tkzu_W$}1H~WWX@gLLN=sbV!BHw1op2mh2%aGd%yl0GWCu9u7HHI}BIEUf zX{GOx&_fD5dltTBGE`Y4D)o}%qT>na%-x~W{4Or*m52`D%U)A@$?bI3T*KDMGYXfl zEjz6zzg>%4`;+IXKhyf39hS2^yZh{_ian|BwWsFC8N8i$ynA11{Fe>Yb?@)he)_K0 zRc7z4^jUk`-Th&I)@=Sg|Hql{kM2G1&c59JG3n#GovW_yUc7y4-IqsQwOxcTPCudmB) zO#L3?_xsp|iZgP0KiBmud2SXgT)O$DMf(bgvz|Pj+Ucq*@?Ol+n$YU~m~s2I>^9AA zeV6Z9$Ny|u{@T^wfAgC+lCL_xeBR=?*t2Qzyr-8vQaW}t?R$OmrtXd{<_QnH*J^7s zPoK#@cg}om&6Km!@j7cv1r9dNIFu!?v@<*~`Q`(L&>$`oUWw_3F1t#bPq1aI;F8q7 zm#U_G@zBAKnNKbY7qD&9lJGV9Yb@FmsL7Kkw_<(coqKJCy)}E@Uat4JQk}-F)IPKeMmF6;%su6JDD-DT%A6cK8K_y5$C4U4Hs(#ePF3 zX>nY5V^8AOuf;p6JfD7RET~&|g)3ZddJs?Vvwf4->NZ=SztR;W$F={Px9aqG!CmUQ zX6ZdrdqfvGbx3BjbYCbJJS)Akptthy0rS~6ZPOE{R`sbC8AwcU)@SBd%-hpC+yB|7 zt;P#(-41&`ag#`==f`{b{{mK@N|7!S@C#p6*2<~m*}JWFn!x8{_f7LYv0U~%`1P&V zb}nz8$ZHF)-iThJp`aam`Sh;d6xW*2ph)#qOp`s>phzv11F zL%-)wUHq4O^8MeSV<)y#`)y;trHuKh)|U*G(>V`Q;sW%HI#Z##8;(zhi~ za8&ZYv&83cW9;O&^8{rp=hxjYO`EV~&(zrJlZ%$mIwPjGd&c2HA>ZZMk6n)PZkFZC z65eE5>y@_8>*e&|+57iJ^XlzRv^DWqeQmpIq>bT5dzaMxE7*1)zV+TKV1DoK5T92? z6TBrPRg%vXiMqr*eO;)!)o`yQ%j2F55!3YJ+_E-y(?6Cv=J_O8xV(~b6IE);d8?%E z{$g5#eM?E#tc^Ru>zsFfl|5>r5WGRzbQ{y0j`wEO86QtPP`kl(Y0?}cscM$?8MAsX z{1=^83VtJh_T%J8p|!ye78ia_YAEGWvdYwl=Z+Hs{yn^Vip8uYVU7*)6kKMKa{t zvPzNZ&Ksi5ex6&l@8#uNB5S=3-8rL{?Yb>$zc$jO`_hk4(>N|K4_MX?woC?1yHHXP=QS`089y-5Fz9bzqCz{Fpy~vNt5^ z>Q)=ijG2D1oj+;!|Dw8zd$TwL`ny!Jr>BY)?R?8TY0b+e_ZPie_eo)H@A@svrr$E# zdv;ZJ`i%0^l^+gQ-TZR%O6wI@lZz3>DH-+VEAJPbv(sw(w9)jPy(p)3?d`cM%6~7u zTWGk)?CkF8VrpxqojD&BIfp$=*QF&!tC^|ho(#)zVdqdzldi5ut6g42_i%msq`OLU z5&!&5yO$#CcdU;4C}#UEAz*=;;#9{Pw`1aI&z-wxajn&Q@{4cT4$hqoCqqvxeWbjJ zz31D+0?t+03&i#us^~qE+#&lTcE!5p+s7o@J6yL0PULE4)nS+^=Bsnai`je!3&D8n3_Deu%7%4z zj&l_AW0@wmUhNOLuI^+S8XnK8lUb+IGIQ1lzI6LY#`0R8HHU-PPv=a#-W73n@yt@!q>z+`lYcgU zxw-m@cDsGA+W$u~A8OYBJoeXqBmcedkMHCE=!CpEAG+oDCJP&vxca(}Rx_PbBHu=w zt1jNVJMPRmsqo0fTaBeofB2vN{(PP8>37!tZ$3w7zy0V_-dCM`?nJ^ei6s^qrc(kY zoqQ!GWps)yXM3i|8+LoM2kFdpDnHeK9NqByAb;KKbJN*Qv8`IYYV{Jm(A5z^UQ3Sf zOqzM{M8}zq9fIZi(r;Xrs;jdQ3^B4^xzH!{iR(e5>#RnQl^G{@+q;Gu-qFU)|_}%N>6`LU-_gppXL-r86Uc^ z)=FVPn8YF_#RXiOb&^dq6;7WN)1A3d=a$%HOQlXTwp&Y9MD)(OCQ>}%0(*?lliu{j zCO4iOaa}Lny3{}^R(k7pPp!~RcP_L}?^^0(;+ir=@(7o6lYr8OZJXbO?D)_*Iqam7 zMo)%;$9AUfi;EhjzjM1Gw<+kt)~ouOTAT+%6?SIq>`nRYc2-CHRZOt1(Za>|7!Ad4 zZk!-}*Q#Of^Ft3;K3v55a>|21bq~R7W{1KitPwbMXw?yyc=wfRJAIC+?tA$%d@ff4 zZ_=8D{cQUK)`)((Ybbqg!YkF+4APu^eLZCFA#1t zHrdyHq}YY0g>}~-hL`gkvRGz^EK{B!xJ;sD+x0Jhg!Y6gDcN;iu?%@_IqNfHG+)#; zuQ2Y#oe7>k-;S5WGMg=MJMgk(2@%oz=n`x8tK-??$@&Q9*hs|{uz%xZin zlfo*Ue5QiunfHYJ!x{dMHUxDw7(QS1{QZHG_SbD>lrK-5akg`n#l*<9X%Z3LF0xmo zFR&ZvKC!%F>2V~C`-ncQ%by)On8VjkJ7ZS-Y3(ctrObT}j~gmfwg;}}Nm5m*-8pZyOsLTepAXH) zrBsU-aI7{n`kw7HSv&lVTu$=psNbm*E+;O~G1Bewdb2@cvZ8b7X{Bl*w*PtdSDuGn zeWmxoeH-UfmGFkg(`UZ@aG7hjfAHdIaY`U3^9&J&3C$*1zc5 zqAu@Mo9>BwOicAz-E;TuET!PPw`Q$S_PAg5j9cHgLEyTyVsO+4K|SFmEmB8Aoh&1t zcZjm~xUuyHPU}6+lA4}UQa{Vv_{$^STih=1kGfy6?Dp-ry5yYGYi8StI^}B=dp&w4 zDkQiBhB^hElF9QadY5OFm*djW$nU3gUV7oFYwsj#7hmdLwKBwKefEV1DW3D}-TBHA ztEF%5;@w^^x-7osT(bG`o^ARXixh7gx%Bo-Iw<8Wp(7>J<=(SG(8Y1Buwme}BXevP zcYASV2b@24V#leOeFr<;n2k`oy`+FWhJB)s2XmP!rW&(ZA-_%m-awZ=Qdjnk||ZHF=eJ!t45lBJnK+ zJ(+dl7OFE9md(jLWwfFwb=RR1?N5pa3c35wpY#jAGP!4w%td}#e}8td+7z2p8b<;} zob)}#a~~xwP3oE8nUe2*g1cSxXq59j^-#g4b(~UmTY1x@r7yLT+Jk*$%Y{Zu0>oC4Qu0x{LvD<@EGUfs0(sIYDYH2 z$vENqhhfl;bm z-v!N9x+u3wY_H(aqSDO|w$7ciX~Uejs=3>3E1U!R`30iRU#Q;GAfrrFL<(IyGu5h|`oZI;JtrzBMp?Tk57p31c%<_u8TcEae?fFk@^0w8O z&z_#68@A={h4^oKCAZq{4-wtA$4EO*V)_TWskIkQY0eM#%?IzFXLt8zekEc+G})rUC)w;vXlFQEobxE=KrvJm10%7wxE(XZ`K6; zn{(W6wfC#+XlRiCGj&C#m7e>xl#ToLyyz^Qy3Nepb$^D54!e>1q#ngG#^PNEu1wuv z>$;oot;pue2AP`HE3(4#_jRBC*E*xQe$5fiS@(r~+-0Uk7^``1`*!7om!qPqK^a?K z%crI%{(*)wiiA(DXLwvXNnOlSaAR~w?uMTYQ`lcWW-v_f_1!ejq+#Xv3s-|L{$fkn zuVM82e8{KH74@eI{{LTC_^(l9{r~){=k|5P{Xg&dQ%s4|*0OQ(@=0N`-OroPo##FJ zE`lw8#(ZApr8DZ5)=hc7c;S0Jo2oz&v+d_BpZj>lZBM#lZ}O;4v0{I@RsK1Dz2E=e zCG4MPJv&@n@rJ>Le19L!YpE5AT{9cXliDqAWF$|&y6ua*t6A2eN}G(f4Yy662d}-< zdG$=m@r6AzJvCMBGoA18s6RZ({p+^5)#lQt6K%5GUS1S`_RXsJwOHz{ti3iXjGjJ= zWqk9qaP{-IwmZMGT0EFr@?q=Ot^eK$-uZvb|Gyl=KGsh`GF#UDG_kw2cm6cvC*e_F zX8(WVf5mnFr|RE1o4?FY`@1&r!5`i$=Ywwkoq7G&>7&6lUw=s7KXB)_*)N_i53;x4 zQS49NSbhCY?T3c)^d;%+?2_E`k41YvbDq4L_fq6<1;4+Ivhj1$(q`T)oS0r{+}$0w zJ4x`=+dVA1uCn`Ye{GX}thwBoFW9Fo%2Yb%9$Q?GgcWC+^`qF>kmqLF^Ih%d9L+f0 z8?||=VfrMaoiF~r-1E|MCV%+mmuH?-yKY#0$fGPX_Syy8EYqYEt8*(nA|~}6cMIwY z@!N9COz7$blg6j~`ZK4>C+z!T)uX1h+gpe6@wLg0n?yhTV$8{Ry1wu(=gXIpn_hT2 zJH6r9`S;l^ugc1fog2BW%N^1tbd^^8e7bbgmP0A*n`UQ7ALv>jCwZ4mXoccZp~*@| zj30esIeAR!X{hf;#>oNOHoP+p+UEU8rey29)e-w$gJSc4)dkI)BGPks!@2sZ)=QF? zeo3rS(o$G;vRh(#07sWrvf#~ztge*yjQ@6*=6C28UEQLdr2XQ&%WTn2R;^EsFFkdi z@yXdh_1_PVR;;-t+!tIO|mTCvZ{Z!K>C{ zJxb0B(#~;`cUleXgKs%j)bXWjr`BKIU>ww>vgeQ+Tik?;-e)%FE_9#B7q<72%odK? z*&cFgV#k)cUM;Zr-qE_ZGjSTHw)|0*iy2c+?^KU$?()cVjTP}aB6UT$eNptCKUOJ59X8p4U#P`)M)n?w;(5 z?~Qx^vp%x@r?UR(WUk%$&Ho~wNc^koUpxQm`E~wU^8c>bo;}{bH>;uU@6@iRKjuBm zJ(E}(&+n&pc=7EGUmqVAdaElhXWw`D?%G$oN(tMpsi8Fg_qJr`=)@FSQG|DzSc9D0UqDoDVi=bI~ zc9FJ_>C0nV4y7>(eROs=$lkWa@n!9l6$xuOxVrU%Qrte>$#h8F`6((>C_f;*hpqL3 zy6?;r5e{n~EKUlFGCw^hfZ1<~-3k?Dsl}JfIDUnXpvO#6j&bJ(j4_Qxc+S-~vQFTsl2HWSUUY9jz8cx}&SmI^; zJ!I{q=UP3+o9<*@uh2U;<<1({1Q!LT+iRv?2xYvvOT1^J-wWoCi-lKcPt}&5@O;Tq z_Hxcd*3+U^4I!o`&tH60G@7fhOnvTuvmNd;ZmxGYbs^EO>-y1Y#uGRmI$wHa_vm@Y z*6c~$`HosaFG9itU5rdyg+H;yR$Y-+l}Z#S;VW9)rgG|(cMkKSLnY57+FV{SKW#hQ zXZ%WgwuY{btrgFSe`0T98!yW(W;?~wZG7oyvBX)!_5ag9-1;w=<2y+-N=LAoZF)V+ zX;GhgLAU*EQ=BY<@7o9;|E=|sXYZfbM;F;2skoaRUr~BN_1eM%qCVTMFHxTEalHM| zMdhQSGuFy-a51+yW`=XljtmOv>7U}aWX^J~4gqCn-+Wzoa#dwG1X@HDUHHPjHF-We)B)6e+TM&%za z9TNqFVi%imPfT5I;&>$c(w{|7kDhGOJ^5sjch#ORGZGW37hhN;*V(0c=D~5d;6U+X z#|q}S9_xOrc4`Z&+RnUr+h5zhwEY4~?X}W>ubEE_-@ZQX`@7T6|Mf6_*K`wb z?koPDS5|E1&Hgz1@5P(!lb>qM*tBV``LkBfmm#6@5!v!nv%W8#uwE-|+Vj?qjBQzq zrCx7PT*)uz;*uGzRMFL%_b9`{lYUl)-R|8cK<)=d4yY+Q=vGd4y}{wd|L zn6qs0@>)5I-7T&g=9J6I&z%hKs?3hw`yrI`u1T74;*|XE-BrP>_c~WFPS_xMMY``s^tp2_ zhbtc)wYgZ`(h`+^WKjh3HICc>rzX29x19kUD|kF7na5~t@l{yQ6_fn*i%!8!%X3l+ znv;{(7VOSZT4AKeVqMlEur!{fly!%a(Cy$g!6g|Jvi3}q-^DXCM`2yeaSf5VGtRCo zs^-^HUb$~w&OhZ9b&XT@Nc{K6yx;s&<__PL@D_mvMlZ$QSEh%e)}CxN!ytd1V=ASZoxuy`MfxYrEZx+6bhD|@u~N5pi*&>q*LmLJfAPR|Qn-p+ zR{NP%GU+^j4Gc1zoJAr}Yn!&J9BXj7cuT`Nd17aC=<+=oEp}YTq|{EI*qc3Vm5I=8 zkChw3xi_ClC{k%%GF@9$)M=B!7tgevucponXjiCod2J}P_C?lGo&HN#EBA(oucP?%Ao!v(1-xi0Ro9@&RcC7XC%M(dCO-h1V%5^WkCS6<@ zw?yQknWl5luXV?}7Oru(ns+Tov~Q7y$>9X2gegxwW}ZyaOKFk{{AiaEu-NQ8D^KBv zFK4~l7F{?LxyWiw;k9X68>MgUdmTQj#`yk=--n%_Ja{m>#;fA6`tg_Zmu~wV9Xg+} ze7@)h`|tPuRV;pbRq4@Hrle0-*&l{FKU=%qE_ zsPU?mPN$CaLT#IhHZLqM*Nd{x{T(W&blv#u^spZsuXk~1 zjQ*Y}f1hr;ZE0t9Z|jniTeYL5t2bZN_1^QvFn5`vZw=43DH@X(DHQ8T9n^ZTsz;@w$O>Dh~ps$QCZ@KelAi|Je5d|2J~rr7+%w`~{ya0!W>_;WvVQrwwm_5ml$4u)t+ zHfffeW%SCwV5)duUFwmPUN-Q-i6-QXJEr=6|p!kEWzEY&=7LP2)PiPQzt zZp0<6VZN_8)AiMThVT3#O9hyv#P;jIegC(JAdr)$AaQ&qqEw3+7j)I)~WLu6cu*d)aX9!cEP~u&Ep#@Pap9+7&m9$*6?-% z8IR}jDWOw0E$X`|@cG=bsM=j6m5R<8>)GBM{c`L@!tlRyPG?HMIN_beg2jHZoA6Z+EsfGm>>M(I>luDvq|e~dH2=* zv5)KRE}hjQ1xu*-!m=@9~zJiiBB*Tz9C-^q;A*y8iM|mVq+==S8#4Q@=acIA8?~|n`k1y7`>(#>Rqv12x+Wc0}*Jm>x9bLI*+VN$POHK58ZpuZU zj8&4>3|zQM=h%v42^@hctWQ7vR-dw*yX*Dr85>zAdn5)N6MpzW>rE}=&HcQ0g(CO# z$JMky+gq&SxOa2&o^RS7c1_*you@iSI~gACNeke(;vv;HrTe~U@SY1Mf9FV;Uz;MN z!e01xzUo7sn&uYeHy0K^+cin);}?FlsOy`z#`>mb4!sk(CaE43 z?F=@VqbM@rKAUy*%;xXvf|YC+zr4B>pz6B6?oxy(&#H+n31`?QMTf*Mh;7{YiPbRG z*XyX1>}jqWH--OL{yWURMPKe!!909>d%0=iUVA;AEu1ciPg`Ranw;|E4LeYtt-blWdGXn`r!H5zOgd=kewn?; zRqfoPIiap6xE8yu-RiXEr1-_}nJBobosEUtTB}x8?J_$dgyCrUvE6ZQh~&Xq(CrTm5%NCcE}}Ewq@keR215oBw|0 zACt1x`158}?VNP%d8}AB+vU#+cW=ACuYXg{YoE*e_2cpRHUENNZQl82b5-d45Su^j zn(xfwqx9u_0(YFh%C*$>8GGQe(3#8D3(tFFd+m1r#os?8zyIMra(?f2Q_-B6mY$l+ zEtTL2TPM8=PHJKY|30a3_7M=dgHuty6HAxdSQNtBViYiw+ zlUTzodfk?EuWITtT;$nX6~eP(V~0fLO@6OcT~Ds9(Cu|=b-c!tUee3!ntUxw$z^V| z{AbP_zC~SICxkoMiS-2bgvT`GoKCubBWQO_*B9-Ks4EM4v>#scy_%|B^i3urGiyqP zr0G|-+1x@3YA4>@dX&%cVpFK@Y!z3vA8He#CHz^_TTCi)!yDIyzhqC)yAtOaC%I=r zjlbMpt85E<&JtUZxsMhv)Z(dKyoL7%75Bx?7Whf8@`saiCwg7;$n%^mZi({9VZEhG2e9S ze8h22xx2w;XTwL9;&ay*s{Nj8J8npP`SXP-d2QM17PW;h*%EKQ&?!DCd9usq`>dvTUT^0qky-7b8M!mU zXY$Ry>fd19kiWmim&@f3N+R`(f#~yvw#f3{vv3MN%J#IO@a(BGx4v6#_^_tqSjP>U;uggf8^dZmIt0&l`K&3OvyM$}{+2uY zCK<{}y>Z$3&28Z=>zCqdMRu$DaP@dEIh2@YToMv|-TP6$|IZH=MU$qO9s6n^E}HaY z>)Ru*FFsUG*{QsiEvchJLFk92(LVPY{V&tK_A2hswtRPN_KEEMEytF> z`1rr$NbroD)iZlF`MI9SSB0rhytvIF_k!r07&bZE@4KX2x(==4niQ>Q<=|3nx{1qa zzR*q$KKH4qKPK$>;O3iuB-L+e_(mZ|*}dXDk+H8$&n}UPMAY&e?*ZwzCd>6tOc1Y(YphpjznHP%$?ZrXpO=GrH&h0SDjsYVnuRmf|_5d&TdB(4@#f!IX^VS%*$N zTeh&k$uTA0S#|%W#+{2&rn8=rxlU`QfxwL-llV;jtAi z-NgaFy|yn`&YbLZpYK(3QcptBa?Q>T!8Kd6LKIycU09`iQuI7;7&MjIN!xArv5FP> zwf6t@?O$)(_ul@?{#Nmy*_HGIchgz_loUUG%(KAXEUYgs?ZMtnR*z&K{pV`AuU0$z z@U#Dawnk^(<1ezBAGe^mdakSJvs4ZDe+s->YcFq!Fp=(Fwtnr5-M1ItoVvd5;n&ZR z^DaGonIxie|6JPSX0=&~_jnIq7I**j@AKqW8TWG5h^`7C}_r0rq*e_kECBl~{{T%VU=WhJ!Rt82C3>wwuW!oBXhob{g0f0EDcNa2^4 zFSo2)u`G0+%5LGRt&UG(=a&e7sdjwI6CL;F-R#eWsT&pB?A9sGyWaHLFL+u!-#)I( zd+tWL?0kIXu2j$sp~C*@e*=D=yPrF0{)`m;BI_)#Y`x_7>%Rz2JriK<*1SwI(2GrX zbKTadQ@FZ}hVkAG@j-LIb)T6sMSN&3-krfr{{R~J?< z{MFOo*VVuK3(Bsp{`u^mTvdI4#oxslXOGOzer&zdL_cUV(>Xqw$2M1=tUUG1HQM%D zFn{h|<6_r)dy4D6e)0~tyK~R$xAV?j5lc?xrgb~M%k8<-AG$2|>hsAlv%*eGd~}Ty z`F!bEP2rt4ouyj;|TCB5QMe2s<`=5P!d8$QYuk7k&Jd32Ryt}3}Q&G;WM4VY6Dr(}@z$I^^j%a=j zw`Vt9@?5{glh^!S!zZy*IeQ^aYNO1b?ANJP-rFX=48NG@8PtDF?2^z%xulglWPP?CIL@DHnqOign{9Sa z=oa^xM;!&9SZpm_YXm|rp38p4{7Sgcqs8&#+DqpXv!+U4Zz+`BAT*Kd$a?*>`;8w1 zA|;Y7xK|xl5A;(zba!=Iq^!p0(s=WwTRR+WRy3YHdF!usNw)XdQyh<2_6XGoO+TF0 zch1eASWBt1({$Iln|wJ_nu^1EyPoWvI3Z-MTTkd3=QV}rzU1mYvNo->JDap`rtpy^ z($?0h=N7D9ci+@3MO)u}#TUzuSy#T)rq^~TzDr$ZeYZ^c?C((PwRh?QcVB-tz3#iv znMK`K9|rxlx668b^uXqI-{oucLXNM`joLod*DuoU-MM%7raoePw*46YqwD<>!dI34 zC}DVip7B;~*!-*URkA%7533e^`|>VIZO?Coi$Nl*UCngo>HNsOvA_EI-T%j$3*L8p zd2#>#sYmB(BGvxindB?@`&^~4f1ls%q-U#oCwP|akyygLLib2S@)qeuYV9jJcmlV+ zXEy9)Da>G5FSx#=twp7E2~XV2seVrHgA0`O%1uu5^)~8MdI=YvG@k9Snoa-2Q`bYk zJ@k~sOk7yIOKL9^rn(AS@pN8OFI+Usdg7@C_p~>~IVrEv)!n^d#R5w$CaqPIx*vHp zu8?s3Wp`;!%ch9${`%9k-ZosjTD4*u+cEaGoWmDotG9%jFfNw)md{<+_wPsT(;eb^ zRSToECUfrE?rl@Eu={&cjGb^_f9QGXrP2yZw;qkWubirv&}-6MR3f!f=E~BGjV&uY zA~|XUENkU5;*DND_f^^)@HFkLn}6p*&m${Lv=wHjnt2dYE|93uF#%d%a*^5!1P* zyA38zTUD1bX0KPg%ILxOkK>Vh#%B@1?wh;xQi7LM^4IdqTWjBbdN5D#x-KQ`26HpkF1lBH@(60>$6Ko)BEag_wptG|Iw`ZSUTx;)7t0> z{Re$LBm3(%D==SB^ywGnM}NNu$QQ6z2TYkU;Xw-D`RWd*jzdpv7G+tkVBrpW+IC56 zx$PP~rdH!OIhMcdE_@SgPna9c-Fn2s)^Nw=J}bUIf9B4*zRyVYhnOwrks@K^SqtB` zmpq?-MBqfRMw$1vNdifi#Kq@b{(R)!w4Od zKlhgYIp)s@5_|u@S-kJ3NnY4gJ-<^|#9rGS@xS+n`@1s#eWTg@_kVRN*A@#r_4a>% zYv=c%`@5#@{J6tf;{S@;!a{8yTV~dTlItCvo+?Krj@ zuBv-nO6NpPtaP~46`1;Bu~5^a!%}lzw5xc}_t2PpXyS9pd)2oT8`-#gLzKBW4A=I? zzPeM8U4G`@w;89WZrUaB!s^Ctoh2vse)D~z;D6^|km8=W0NtuPpFN7@uHC$xd}4j< z!MOeIQ{uiXey`fk+SxqIgi$KJYjp! ztfzVoPIV#QbRgiPJ=LP4!raKZ{7?;Gn}m+fqFIo4`WH#2>A=EKj|b$?r5_-?BgZf4Gt z$9H4NLjOl=0zwaIX>APdvMDU}o^d5ZXyQQ$+o&qvMUOW4WM7%MWJA+@^{&E4ulfw4 z90VU+QsnPf-WOi`c-F*KA-lQ{7;(xvS@_P;OAr+GPDyI@5sl{1bUAg%siDz@y=0f# z#3dY+YHyyLI<`8-J#g91Q&VRayxnywZwVC~P$9=gTF%C0b^6L3E|Cfr1bNJo# z)esS$VJm0+j_vHU<{2zqD^@5L^MyZq;@Y}( zn#80@O@i%;H8@ zPTn-izG~wty|90?PA_?JIP%}W$%kLb-@A1xJydUsvV3tcOZb(?fsUcm>MoXj{PHK{ zyV~PN;_vq6#qZy`U1!eekjLU%q~0DmZDt+!<@fpXVskpLX1-iinD#ofXWxrU2TvY- zm2i=7s&@CD6~jYhL&^lbObMPu)KET`Kuu_ni<`bthgKJ5zd6p>7{Wrs8x9ZJ<>sNg7e)Q+}k*Dt`g@>j7Q8moV zU%SqG1!G`6$49PXxeQK9ifP=6il2-e*dw*Ygd{e{ZIF=BWEILbZJ6QFW$UK9Y{tY% z&6`|4*`D}TH%U`uSO0~Y*{|0A-^+Al`Fn#s|J`q#woEjfATFt=Z}>YnX7QHkwrNqX zkG-3gcG_>+=}@cv9I0WV2XEYQop|e3j`poR7p6$rAGyx-vQcgGpUsPdHLKW@&wTZ~8+%>De2(|@d&kYxHs9s1vno+kF}bp{+T@h`GOZnjXpuX|Blx38Ni zZ=QVHW`0fSJH0yd`={JHw@rQ8YW~=Gaq|3>nXWs_OH^v+e(?(Zn;9m`5dS~-(sJAX z*F)z2u|0hM)5&M{2Y>zk6ZwDXN>6*c^?UxBy__9i{pjY7^ooiXvkEs|pC7l4f5&Mt zZSQJ{TX*m7DD|w_w0&;Ac;vRZTlSPU*ssls;hVkfouBbV?IY2vZFc>=rSs|JH?1Fu z`4^8YGqrgeHn})_&N;5>=SwCf#kMMbSJRK(WxK9)^M!XmA1o?co78F;n7%RmvRAzf zr_+7@!>${{{j|343=9lcd+CdZ%kF_U-dZX zk_Nl3!qtG#1#zumJ8T>ebDxlX_HFu#{F<4s-UtR+X3TerShcNP=_$)H(*UKvLOC(Y zsfz7xJ8IrHy}K#D;b)lhH}2{UJ6l&C7dXGr+HIHmi<_D^L?`KA%d(oOaQV7nouf_l z{D(jK4WxxrUaPItm{>DC#pr`}kM-dKrX|z8cGo5axv+)ED(Oe|HmzFa5HwNcb-`?> zIijJpt6rELV(W;VUGqTUHq%YEYNmg!U7`#7UOctDwAEu{>t4ge;>TU*?8rP)12gKzPHZh z>fS!VZ~rPs`tKftBNL})hpXNEC;j{AgH0v#Ya&X*&8M>S@2YdVb=%qU*Ui^1KXk6Y z+x*LW{rr=2LNDYu{<(JDAiiFl`Fq9kRbTx6^}XXSfBH|ZYVUrzyOrACzh9`1cb@lt zt*k4<-rDztQopqy+H@a3BC$bltfUN{~4z2tR<`Ib|z zU8P$(rda+^P%%vLyU39wlAOAhr^MiP@GJei-i^oGFUDykkaW;o7tzx`6XAW zDz!skt|H3|_Edul>`V1pZMLtu)ly{;rr~ZN#d)sd%yiH5`cu1~?s{)AbDi|5T8|wJ zERBU*&&7T2`o=tG&g!$-pE@18W!A|ZNMSlVNrXMZt~Fx8X+ACH%HF+MjiN2e2BJz+ zrG&4iXJ0$5S!g{WEaShkie04p`D^A=wm7s27sRQqR*YQuTBLW1%fZd40t9!<9X#f;oybsr~VifeyTWlO?|NKet*S+_O ztCe?rX-jqPt>BWy|~FA`t|sd#r+B@OK!QY(#%WmDp@}3od1L; ziNCExl;5bh-`l|z9e*t5zftB-fzJ>3AGUup(eK)|guhnlwfnrR_O{%NQNIId1$oARk%>>gzV~j9Tv?=r5ic6C>qYzh~E|Z>Du+}8vFP3URwCM;Y}@P^;I+hjexIPrS7 zoKw#YivX+UlWrB>Ik)=smV`!1ICo4H>aUu*ctz-$T(PL_o1S+k%I;$IiPlfo&v&n0 z{ND{GM~a zQho0(+g~@VdVZSZ+3t}4_ab|S`Sg6x!pckuVf9--4enN~TK#O<$vgVehPP)$sLn{e zcCl6QsDzJKV5n%ei`Q#`3yxD$eQGvHJh7HvJ0s%w+nS^I{1)8#c;fl}fN%MyjxPTG zbNc_sTspsIZ<{##;LGpz?}PUJf82O_!ee7^{WVv2txySl7W+V_{MKxh(`Felr?ao{ z$NgUNDAZ$-MEcB7*6s;2_$S7FO=W9Nnscz@0Z))<*lMkCqth4nJieLg-}dR}-I(`# zXL?J8&FbfQ=C?32sik>k%I`kUjog=gzkCvU=KZL@j(?3-znpS9qs6f|_Q5_&qE+U} zHmx-N^YmyHxsyD{BHHX0`dzzr+LiUOW{-M@d_qP@ zf1HQa*IP9=yaZ*_%#WYhHnDeg0^6lO{Z~_-&v+QKQBpJf;Q7RjEzgAXo_C#Hu%b~a z`nkcJNpUu=^7A*;m_1;3KV&plN;XNPP*5~Gpi_JUtut=kq?BWu{Hg5q{;fAduIB7Le*3my*QHNSDj!@d ze6l3aa8^mq#7h#A`BJ)Tx&$@cot{k%)RT!h8&R>?zUo5fd(qIu?Ar@h&6%rN+t8sn zNkVj$-Aa}VIVnrDrd&8wv1#5fe;XOS>ydB$uDxUDOWiI|rhRbrg|buE&b+#}EYZj_ z>E4~h#TwTvZhQ>B;GMFkab~Xby@~T`1b) zoOy6ZQHR74=}%Vfa~5XXWa(aAlc3DCIy0#$jE_9MVYFPsyK9k%c9Voi;3BrgHx5SZHaM4}cj8ONMvmz2 zyI}-uXM%!SKJ_)%m+G{>ozf`0Cr) zr_rC3?>)@DCRrgLAEEIf{-=ijJI{jV^-b6fTKjKr6B63h>$%vv9JXRp!i zjNku0H$Rv+ul&4t?V9tm>r7T{n)rU##aB<1mTh|Rc@Ni8#r@l2)35p8dAoP+o9B7& zj_lH^y?*T0jy*E{b7%5}`9D7>H#g>0*3}lR^31U5m)91qm0s**a`a5p^U2?ry|0a0 zsTVd?f7O}39F@&kpU*^Y6Bz zu-qgex}|^7-35vrH|F-3%;~uMukyyP%EXUTo_upT!}mhOx9RM*BYn#Z_Vh2a3=`4l zSf$a_v1aCU`;}jUa@o5!nLSTfd(^G5LC7QPqJ`5N7ESF5x`LopU zu(7P%KmHdN<%3(i-EnsYqL*OIKNq(o^`4CW$kmez{hKP zdMqYid8=Z&k$YhrZ=t=awCknkK574^9!^>DuPW`#e&O@$vpT#zZ?=c3-+pSc|JkH7 zzbs^)B=uD%r@!5FTk4miTj)3I%e$s6`Dprb$AuG;AJ zkzHEP|3U4}?(er>{;O@t|Ks`ik4I=FJoPQ?eYIB$8YTSeg1v=-|c^V z=igo)>pXwY|5b5&-|4d+_-*#W{C?d@Bip9KXT8*;DQ*9GmlDJ%6r!j%%ODeR{J%`nwR{w{MKLsF%G;tK4hK+ulF_d{66+x5BS^<|~c%ar~`)t8Cg`uw^3*_xkopGN*>KY0AV@9R{X zdoy2Eq+g#kXU3nb4Dr>gEaM{YbL5?pnyYDa>De*^yM`*BZDO};9b!yc8lFuR)c3n} zT=wUm+BY|nzX!b3bA3{qSjLgrsxy5y3Ur(obr8f9d@58!s7q)-8B)|zU*gXxKOPESI?B|>H@9k|_4bRO zxQzDkIUks5xOFY3xc^7-=_#{~XWVhf;eE(-XydY{!G=F)Owl^weI(>SMsG=H=#h@5 z4viOFM^|LAX=#-yt*lChHjmzy;llP9!L3S*yu7r+t{2_E!zrcoc0o#+tZLiFSBo#TsqAbG%w1Zf zba%p)sEOBBx2;&TD!ckYj09VOrBTs@*`;FNQ#Xg%FJZ{kty}bdq07qeMQ6UgUUKN+ zx2Ru-J1UOK^X_Qp-?;xnzl+`X?jxV?tLcU%ZFPI)TT$g>k+pQc!)(?SqP>QW0k51I zwr|v_z>j_}aP!*;ntp{CG<*CqjGXb>C;V9_-CBS2@BExYB5ana)`)Pp(cQ z^I6Xiz2XsDZ7O!H#4F0-?SjY^A*~Ozn)8*)l3Q$7c*@IN-1|bqT<2sei*Ll_18PUU z969daQR}|V*zNVnUoq`2Ro?`z@;`hav)feh<-CTYFDBjipWwSp@^14daf52}#2mddnt#On@1~axX^UDY?j%adQO1{ zD^3UGPZKbnHoY_P;^baiH=d2r3(o6jywg8myJ(ixmnS?|JAUtUesXHzijA+Agi~lZE&r993`>Bc2 z9GwvTY0QeNj!f`4Se(o@|NpC&kI%D{wmUuNt-EKeb8m9s*7Y|tyf^hm)n;vsp1mX? zB|~q^yeW6~nJ@bNShW6&!UeY*E2h4_ZuG6(yGdR`%76c-BMT%-mna%$^gq!yd}?wt z<7$^^@=0Z$+UuHXWVTij+r5*|$?r?u zcfk7Pc?o&@tzX_R(7kbg=m&!+zqb$qq_O4*-IZLtIQKH3&F zKiBV+Pgh=Rs>1uwk}d9)Pn)c&PgTor{iOf@CG)obx}Oeup8xFaeW^o!iiT5%k|GP2 z_N%!kQmsAYr!2VOcJ=6krJS7SZwXy!cbVc-RaqtSvu{{(>vxS+`rX+Hhamp{+IH$u5$Yo z^tn?+6Eazzo4%cwXyz`G+BwuWg_0i^g-^CV$nKf0ebsW3R7b1o8m7v5gP zqMKtJCm#?kc+K`EM)9ow(GvNU^Y$fJ4Wmtm{+^@Dy3=CY?`Y38SV`RsDfX>WFB@zL+E*JYcEUGg|# ztZIJhg6qrb)Qr%qWDT#D1uDuhac-WbyDWtxzZMiNdocN4<=vD2zB+wd|744=`s2=| zG^JAJ)5Q{#f}R{Y7O{dUNV;I_gOHQOC(K$VOz~!Z{yaOKInc2==n0#l17nC^tf&YQs`@O$jXT0+_Q+mUBvnTb&Up+lv%#ZxOzY#Rn zCtZHeGvBV}^qbnpvc>b~f4lcj?8Lzzy^Y(~%{r|5@$K*TE%*PN-Tg^B{=`G3vMt%u zlP-s8-ZyWaD;v8levahceTKTVmU{i{>2_VGmKA2sso8J5U?<lD;nE5)f&dfWQkq~{y=$=r6medS1lZ>P@oS?OV1;WIL4KF_^9;~+ohir)gp6GP5q zJ@0bznb$pYhS#ip<_qO>;?jD)Z7bciUt50f?}pQhllK-be)O*HY{_EPHBoKy-xGu` zYg?+UmlCLcKmF?4J&JGn|LuQu|G%u{{om@Zw(V0m=_k1DT4cFrYl`7d(SoJRNQ@bbSg0PiMrL!`FaNzyjD@@nP}QEU1VaC?QajxNsN-KB;9z9scorWW>|Zq;Fq#* z`+v6DU(8;@2JE+A%QU-PIJmHuq4`#?P+IhjxF`Si|C}dh_b1@qj=jg%{tcY<-SPS7 zmh*4@gncb}6z9b0r2C3bcbzJG#_Slk=gZP;ja)D7=`Rl*E3t05lByRn^Ty{*2BFV< zl=s@s-JW@A>*1Ua7iTGzyUyD?uQN8H@N>@Ly9FEGC)ei(<;I-Ol?f01WcIT*{iUkv z#+iM|9o4m$&j$I`S4^8#|MT!Un;FH88PktGOn9MuY4mihnx^4RqGX6b+28_U+e+YcHZzVA}^CHno0^~KtK^X>d<9?I?i{H}KI_txr% zuMRu^O{}+#d!PC2qtKd+*s$87l{dBRr2J;hK30B@cadUu)tgwm&c#dAPrpnuGje@4 zyZ8T7`=3|u&$wIr_j=occaIJ>Z@w&FzadNf?a{gG?{rG<|8uobdj9@Z2jBJlUbfWo z_SB~vW#`%I{r;Kca^`Tw^D15I+pXL5J^1S<9DQ7TQd|32`Hq_sb?+R`t`S)^$zmtp z?s%7VHtO=CR?`0?9)0e++`mWf_K8KI%Tmv$xX+v_`G#k~@>3@}XDDTLwF;~;I@8+i zKI_lSfTscP55MS}^^<+lxqlq<{xIgm1viWOxNQ^>Vd!^UwV=T){Pd~MIYzBeB5 z>N$O2npeh=l<6v*yV9QcN31?J`INUb?uvFs}w0}uHqm)lhNo1>qh@fW9{|33ioV^I5AW5(Bju;Uw+6~ zZsh-sV>Z8GwQkY;>N~ghu77&UO?P^lZ|>{gkFAf)o?LpZ zqWC#R&ex{BmHn-SJ` zg{MP&5_4!`#=;Xki?`kgclLS2!mH^yF`8@fg4Z>nzAMhMWV@QE@hs94o_VEj*M?Qv z=W8TGdK|9_E|ySF*?F*~B~XKFVMzv$hxi58)j{H${z(gqNS-lM+#hu4+PA86H>})N zEuArC%C!UT@?Af7rf>M)eJXs?i+}tR@7^}J8$NUXWtuY)`iH#O{c654$X$iDnL$xo4U_*%{O~=hmGKQ7mnIG28a7*>r2dR3|xC zQ^lJh3&hT9tvIH%OZg3T9}vbNR4#w9cOWV)N83{r(|#H9lsm zP2=La;!BS#*x}iD$HL*;w~ME_AKeTVV$Lg@yM^)CHHY;}yd!GmZL7sEHRRMuZqny` z$M)=*^oC!xCjYWq`Bq(@aQ^T6gs&2|^<5ViY}(1Y+t{`G$>CrQ#v;enQW6^PRlfaJ zJ*;I|yH;Vh;V}!wY)yUTfI}ygen-EUFroXv$?w&>mL>o0N;Y$R+a`L>-l6}0wCV2q z2O`{~YQmo$UVg~AfBzm8-|9tDZ3Ywe#|5rv&5E8G=e(rpv;5+P#{~>-8=KBlwD~vT z%f0@K57}oOS#Y?)bE1xU2J1cTqaHI?JTme&Kk%vbdbilTIck=7 zv~9|SM2UtKrKu^Kw^h|1Ke2-6HDBht3yY_1dEw%5M;z?Jg{cJH6|%Vg8z^K1Io*T>zB7jC)l`TwhRc98M`#rGe6$zR-e&i{7$ zzbmu%?lAzZJWgHuX5s#Q->-hqm;ZO}S$m=8|M%qzb}gnkF32mZTan|kMhz~ zE0&ZesoAL|dCf9mRet1PvQ*_5mqc9I$<{j^eXHg~PR%xzO#T%2`@*J}FGkk(p(n+R z{+)`be;V$-DOcZgN!pq znSafzWaFVl-(~cp)|5(!9*OF@qhw~pvBgt!(gKaU4V+DxH~Lkb2}t_wAam@@(^L z-t1KQ^hD<7N|)tZSA6cgw|?)YHJepRW7aYCuKCXH7wWAYl-gG3@%p=)tH{*SBa$qe z)jqlggtiG-#IwBZEZUHH()ehKrBat$7B2fPzfkSbJ(-q^BA;q~D>+YQD;?a@@`>w-^o7b7Vzb1& zPZ;0%){}Je(!5n=&0d#00#kjC@BAf@y715*&PAGmsnZr2y!x#o#uDkyeDhA%*~xxt zVP@aCuTIH0XZv~c3SV*8o`9)~6tx0fnLLF(mu)rZbKtH1-KSkGHdEqFTHm*MYnP_) z5tP{Fkzvy;HEF{(_WhQ}=6%1iF8DHs(ByNA6$*RJ3%`Qx9zeDjx_U% zTt8PTDN6g_Aumm}fIi;tsT*p9Ix}rgOp%NbJ#{F+Td8X63P|bG~awuDld=G`(zYqW*)>P@(KcSqzeUw)rYQe_kBIqkjDPtVajj z0u8pTM_L`_o_Ew69k0+y8Crmx7ruQ*PzxG_CWJ{I`6S$=T=Y^0!XD zRW~7W_x?AJc?E0LHtMfQlxoZS^yFvK`^DWypCoZS{kiFK9>=$1_uK+Smbz_R_;S%# zuWRgEM4WB4j$|oDUk+OLzSmcDkKwD*jH`M%YT~P1E`Qq^x$e@jvUm4x$nNw^-5R|u z&5|WJ>gu;mlXG6&*s)VP{QizZId?9d(@S}*u>95w)jj2n_Sw8MuPza2Q)%)0y)hs( zze6)lSvUOB|BwG2Gy^}G|Kpapt2RS7rZ!l`{=kwqsUOZqOkkQ68_ak{YR%;NHLL7B zxBceqnf^d^#d7`7icRyLo?z%cF-vk%&>@cl5v^Yu_2mC=7n;p};q2BajIzCgvpu>+ zmt|j^uu$b{sD4HNN}DC=n`-jU?f?J&-t)to`+i*)+W$e@+-IF&a$9cjb7}EdDZlyg zC96M|O*!TD$>@Bp&qkA%+O8AzorRaJeEYBPHt%z_Um@wAvZa$RTTW73$+0N*Q>28G zWZQ+S*Jc*R{fT+Gse4aRy54E`b2kE>+}1n)!uj@+3;KUg9Y3RA)vtES%O&_lutEEj zn+3aGwaLqtKffREvVE@Mox6JVHZ#TUAN{7jRCw+A390EN8ne&TivE9cH}lS#2L(H) z_VyR%Gh^dtT+8Pb1mmC?@KH< zc_i~4wzcY2=R8dOIOXBq_ZRCv$aHpoJhpAdP0>(m#n>%Mj|GEVF8z@_rfR~YkgRgQ z@yUg6GP(aFE*<3$oSk^wJn^xw;(jlqt*hRT2hn;Is@1}r_ z!iLYf)U2+=xL^9NAlDS<6tm#7`~)%nDeDARWoJ}MZ{#ifDR=s?dkTBJLj7BLg{yog z*Ijd&VxS(`DA8KzW+rE7Q*-L$#FU>xNi8-S%G_}-N&-S_ zm`Y-&Xa_G=l8j9JFkLp%>&eoo2eo6LcM2YB-B_v?SQPkP&_wdF%Uo68WulXBY9uO7 ze3JBZ^6Q%Y8|UhOKBKVNX7!|s@LPYLm~2t+{x|pNgudy23lg6ne(Sl+Uya*XzVqK> z#bxHx=I%Q&m$$d{@#zg*%VS@qDgRz{{O{|th5xMk^_+I(X4PMtlDTE_&Pw@8qvJAq z*YB6}-^u^4a`=Zw66B`cegzT-~atx+Y>Lhw0ZIG%$m9=o!^;)pVwr}ezED+FYlZ= zE8bWNpI+8GJ9VC~x~o`m_MKDg#V;4fo19FYspjj{qr~iWnLU=*^V1mvEv_|cJrY*$ zGjI19nZG%gmXnufbc*GoOPAnmo6EP1w)I`UJa1Wekcei{;+^5U6g_4}2Lvou2~}L# zrKH$Y>fvS3;*!a$sOBlSCi1;}n*e8XSH#s*QaRhs-P`QENT@3++x{4Ol7 z*Ln7Xqd0r^-t6CJoa5^8$Hli|^_V3O#D>Z4h=yG-P!6?1G= zYVCM0TsCvVWuZ3FUpamA_zrDRNK-B~Ht(he zO`|!=Peb243->TmYinH<*L6{N>bl0GoTt9KF4GsWR?b|x>_@8N?o~yLn}5bG`6U|k zw|hoT_?fxoQ_>hOOTRF1*PG{{w}B_yY5Cd25XGYhe)KZ+@@+O|T7G2N@ve5oq`3~Z zio9Jeih2o#?LUj=#v9MN+Qjy#-|onf|MPd4_n9*Oc~Rbae0s{x#WPaZgtbjhZ`70Y zo45YSvU-2>e-}eiii>4~QiV0SSM+SiYJIk{=#Nb8y-Cv)lvt7vNKI-K;T1paai67& zY15^GZB3JRcKJUr>Q=bK7g%c~)NiY{>faq+_3i5-_SR(pS$M!KebzKE|X=NS=-&$D`pE!Zx@;zdYduVKahV?KKIB-6{VQyr9e1>Tx_Qm+{Y}5TZ))$265spR>}BY+ zyMOZ)+}&R=>R0FL&;Px4ed4!o7sC7B@9mY__jTIei$7%VvV8mhVcqZLv;UXP*}i(p z^T}`jpAP?)f85Q^qM=fJQO@o>Jl0xv#E;t~tpx`}UIpNff-Jxfm7%FjI$ zeedkqbntAZW8##h+ZSc7IlJ-tmv=kQEZe`{NH4WsdDGW6ac70wOh(RKecj1F&LuzG z|Np}0E#?xh9VTZ4^|HOK6B*qO#i%0^?u_&YkdpLo($s?-}2hD zy_05hC?*9wS>rq}^3p$^l@CsZdzIOnPre#?yuYsCq-*mWIrh0BZHGF)1b*4%J?Hod zn{}TrIW^sh+9-9AVQRF!ob?N(~bzD?B*ocibkhxXc2KbdyAOmM0C zAmOxr&(GI~jy(_Y?VWNwTgzczYnzYCT9J?0&nLglKG9qI>Z7pO{{IoXjQtgkr+AsG zd^~yK%c+``DP|M1oS*irF#h5AaTW(hw^~q?;9YHx6*q1ftn+q@)t*x&6VTDYXd}RM zsp|pTQWK}heRrCyoVUeKJSEeqTDEz)me>sCrMCVpc7boW)AC*HdkiMWY`)X^KXCE$ z<(-$kI}&rv_ig8$8CbJeXFBJe4T0SWLNmWc_4JfDhv;W7Z@O&!^rP#9#mBNTduqO1 z*<6`>v}`*|y1@I3!Ybzv-VxKZGf(=Gaq^?HVzF0R>l&9$w%!2~wuIeV>Nt@hS-GQ` z!J{XqPgincnw;b$Rkc*3jWc`{PTjh8JLSZZnwMv;IoESU@|yosG}_C&P(5}|a^Ji_ z(P^t&r+glFzygZ(K1+TB09La)DCsiDS_xvOLA(r0SUzde)|xNs(&n0s~lnuO#v zqDQ7_9%H^zcT-}z=+`HQm*v(=@B8b1pW$9C|Hk^nkC*N*`!)OAj^8;KKbVKtKTH1~ z%sYMi!|nUNaamW%*v)(Y)${d%&(`mkROc_|uPeU0N3-s8p4e@5^G&^PZ02m4ZhOJm z`qrs`f0v#1n|q2s^ibQQeJN8G3$$I&eOebgY3GSkZ!&fn&ieNG+w-<-;m4OxKYK%C zYw<3bwnsHj=lWYk=v<2w%%0?V(vPp~%(r!hvzG;TuI<@YoVwfN^R*jk6I0S-W?YZc zPTjRM%gaB@CR&~Q?X2v9&OvXv?!0@O|Yq>mTt(nxD z6|+#vZ@;?EJcE0;j!H5gHk_0$(HAH;VHWR}8s?Mhn)Za8m^nSpe=-ZeAP0lS?&r~{IlB? z)8OABDj~!pxT|>K-0a9h*X`{eeXo=G_*e38r0U|8m-p(HetNd=<}7JF{`u|v;_CN) zMcUpx@o3#gBiY?rp5bSLqqo;}+%gY-zU1Dl9`kMHYJ$p1Ygk+!AG^_-nffcWpJnQ) zw3$m>#HM(1Eu4Ny@0Q4!8cF@>-A6C13tJ|Ah@I)a^3qKl?@9y9FH~AycZ)r7+U(+j)UvFe^oZ`1C(bn~*>lZ10StWqn=w$1I9 zT&kwK+vs)fyX4IoIh=)yozf3pd0GB%`Em90^K|zApIZNAY1QkktIOwXsf<~7$|B~A zP2HSb0#!#k=lZOX4BdNkhDGVJ3&+$gck0|eoa|TsW1pr^a@oE=Ze8K|9lKgQ*Pb%) z*px7BddvH|1Do&LI+@)|{dG%X_Thqxbq}{3@0rpZyKrAMZZ{&oE1i+^Y@~y zGtT8rTxF|}xc*M+G=GEN``cpva#_te{Kt-G?hUKVsB@mvy(h*@xpMeIqLKSP%Y(gh z+K&4lg4z%d6_T^!3zZix*$=knf$hHe_0C(m$gakG-B*?AY0CCVRThA*bzh zvG1|&%TtcIKKj}mv;LmM(w`45O;)enk>jlMYR~=KGq*;w8=KDysokBGWBz5MtkdL{ z!0J0UdyP&X-`a9<%Llddm+rK8KeWg@*Isa?<0td9U+iZu*!KOtyw>iqcJKScT4J{I z)|p?scVo8Ca_L<2 z+4@PT?CzFNpyQYQlXOpSGWLBFUH$&@-FIKlN0oopvr#(JoMJHNrorUMb4^D=#3n6u z;^gvO(%8bplCfx|3HPyx0L}>vyeu3}3*DOdRXk=cZ86d|p5tjWxpy<~cAoDaj@`L? z=HBM(cmK`Hd%x9WM;Z@z`j(K1E-Ale-T8ga@*7Y7`^~$*uK)jEw}D0Y8fRMe(t=~V zOs{mZHs0ZOP5Yws%(Y|HrI*(ZpF26NG~7bN{m?&_HdZsKTi3$Qw%jbYzO=mG(=W$D zXw`xi+x*NtrAKFDeOuk@Ti)5QFP{GJOY)=J@0IxVPwp=|UGm>y)qLwGWzTx+s}Ei+ z551KUCg!m&`sR5h@z+(4SAJOJqWp}ULf4`u)=!M`E-@RYCdTld=X0>ct zE3_vfv~!2o1)(;j6`dv1-SijCoRP|LZ=3g2jyczFJf8K;vHzOEk4+CxGnW03Nvu!O zk#~+)o*j25CE?!(30sS{E$oYxIhgMpERFff6%sFc{KAytBWZ1G4p=YIIB4ExEnabR zPH}=@Nnd13QV&l)Q`_15hU?@M_qEhC96kH(&9Yl)XsSVyU8ugUE zR(fyuNMT->Bl>?%`&>qq6YO%UMYWA}&KoS>k+I|D)SK-4Ij2kSh*3QGFz&|kEpvYD z<-OdyX@#O)R~WCj$WQr*!k-M=(>+vwT>tNW;@tFu>vhi7@!u3b6zKVhQ*n9x!K$m5 zb9z!vr6p(Z-^(vP)a|xoP2vRWHs<`vON{zXgr=Ll?>R30*zfKw@wl5)@9OjT?pD<^ zo5Zf{yM3R#N1x!fslW8p^_hO8tq$80d%kx+&+T`cKU!vd4;Qlc+4^L;myrGJ;0msL zcWZ@r{|@o{eD=L?P|?}+f^V%xaADXTZ~#;Sz| z&uPhw_`Ogr=TfOj`KyQ-my)M(ruFGEpJQLHsrGi#&UJ4;+Ibb6V+%d^&tiIWpyRyi zu#M@PJIy{?y4M{!x99nr_&J{{R;hVEJ-2T|wTjX`A1_gF-s|rq_Ltctu9f|N_V1BP zJ(t*xpC36R@tm>H>8|Q2g&k)$=Ufg;Jtd>5Hpy|ai28&pJFUvPyP2zQ-058A^m%7Q@7`>JrjPavU}~KPAm8IZYQ=m zxI3+!lRPDTit_OdJUL?8*`^m?P74*~T49uv&S9?Zc#N4{Zrba64j)^qm9C|VNM5_* z8N{DDRhj*1*zx@@KV*4?Jt$6Bo0xWWhPHzK-W@k)taCY{R2L$}l2h23BX{sm|JhwL zC(N1oKGCwhitXqL9n*r!F57($-(=qSo`~Od_F>7XEX(9=6_2cMZ_Tkvj?^wKNqKZr zr+U>r;XM~jJMFlpS#m!L=$y38)YHOviTAXfCo*J~L_5FPwrPf<(~Vy%gWVU0CSN@C zRBKaa%k5VZwJTln-#OfOOq=qPZFe_5(lB<3B*(uAxpv4_&-gq5E#IYy`-kL->uIka^y&q?K#fxFnnTMir6NpQrr zFshk*O`N@bMc?&p(e@L{w8WT#d|Arx3Q8Hejkper~GiY0m|(r`Txe%N#oB z5piBQSNNmfj@ojUZ~XI|`}-3rT4e6I>D_Ct{?DZswqq{W*|ukSF~VONkFg8L&JtcacHvcdj5Zr{1*bQb zKdO4abjq3iQ>wOK*mphg<-R`;?%Dr&@@iM~|8w@0aS#80GWJ#ZJ)7;FUH|@_KPL9f zPfzXLcktTjcQf9yJ=DzjF0!Fo?0|J;?bB~z>re09z4gx8exdlC^6TtQ9IKQptIpZH zCs?oidGGzRryR34dBy%eslzQZ@BN+cyI=3vSSAt^u|Di;k=WC=)T3$Y=hyF&kpH^m z;@iC!pLCmlcVGPA-oKJvaw+@%S)RGH;ml^8)3LY9GB0nb^vDh`(e5kX`(wqDUtDiZ zL?-1Jc)WbEQ)%_SkOaOPI(y{RK416Jlw$rmVQ21C&(94alZz{re4pGw z?yFlC6Lk~V>(A}G%~Zj~bO;GY1rDEKxa-9^;lQ(qYW{5bAele1pQ8UK zhgf%hw%=TL+3Q69412K~wyoXXOM)jZu64G0n3dU~cz*hx4^yRO{@m{WdG7t(6U*zr ztlRtLbNjlApK2_=H@kP=41ad`U|#t;vq?37VkYbj)cCc|eEOW-Cz|*FFO1Q>Rw}wm zN1Hv>T23Tz&J2C$^uW`F6M6a64u9O_`I~?F>t|Uv&AL{fsq)>Cw>k6N0lBre^R}&= zZMDezjNO`=x_xDzv`Wc^?BCpIbrIW+#q#J zc~|l9SI6Fe>*M)%w0-^V_51&BtDBblz4^ed^!5Kmy=!adZTWNXW99BYUytx7pRuog zzxjUsqWiyj3+}U23-9>Nb|~7PZ%z7+>f^Ut{-5NsWQ<#H@amqa`}!S$QNQ$bV>s_# zfAsdB&C3UeFM0<(oK?F2Fe)Q ze~7-Tzqjhgi=D3zZ~FA3?B=_iXn-^yp-IDD|&TT$@x$@pR zGb5f?ee>iiH0NgCx0;=QB&N4wYJrvdUF)ZZ|9@+GzvuqM=cbeM&!2F2l53ee(MZnv z+rEfH2N?ntb+a^hHYud-Efnm{Q~t0r@V#>UpWjY_vtEk@*gN_En^9M)TKH?mn%TlC zhu^+k9Fnn{`+8i{2K9`zyiNUiRVDYBcuRt}ten`K-1Ttc1LMoSlPU~N!&4XV{;Ft} z<}v8)D2Wy>>dwg7c_4X+{P8F6ywnTm% z=ahy5#VhhNZ~fl!kTFG{vFql!Z>?OSV%IlhPF#0z*VdOW%~dlFo;|D(za#L*$F)I+mrSV< z6q>Z%y7vtG;>26lGc=OS;;&BHbwh9Z-T$>)ui0mt{8i70(OLcF>0{4|omr{da;}^e zzngD%F)ZtwM)yt0sXMRAuUUWR)am0pq@<*f>Ti0#cq1}DB)%s=r34_mOwa*=A?Q{EeRXzL3<-JcfSD#8(Z%%*z zKVvpB%J*iq&lWlFzqqs$FsYpn9k{ zRn1wra^c(RaQD}{?^(WY4h~(rJI=)I=6(6w=M<*zdVluTA-BZ~Eo@G2JG_hUqDQCD zn(3?8sU1GkH2GFYm|*s#i|T@muNO~BjWbd8?yxwl(z${o*5uQj#I&Gt&Zfgrj}PuS zKD+V$DS>B|&Mfwryg`lY@~smrZmc{ zT%Yi^o8`=sQw0Y-tvb`>>r_77v8>zR{(bKIf=~YEGvyEVem-vWbE-rAj^^_=aV-+9 zKaVN6YJc1N=Dn4(!*#dV)oab8!xB19<)ogmPP}zsSFoV|w!Q}rVcN!~$uXgFNZFT#PwzEI_R#j~OJ$r}vzi_9on_m8k@0#;> z-_9(K^?e2J=U=|NzH{qsv5m8m_`a=s%2QUfM}przZ%2eyxU_rGhIFmP32(ytN`tZl zuLVARvuNv;aI+h`^<*up>bkzk)~TzvFf@0$EST+-=2NRMp|Jfjcu_I^8h^|g`hdfCaX_HjN!qTdevwO(jp<8%1U zMjH+urM{I%s7}qjzvt<(7M?R_PASwpTrlNs;lZPewz{u&d%+UAxUY*ba#~~VP5+rHvu0%c zI#JSEDST_iob^}S?s@E;&SMAh*U zHhZ1eWgNrCnJ81blAVE(fx*+oG34iw)Bd(gW@t1om#C7o+Waw3Gq%et+O#73rew;L znH}X9L*{f^q<8E(!_67of6?`2mg)P60zyB(GVJD4cGCA)dqJv&>3L58=h;=qz5GAk z5lpn0VsTfYbko~|XMIj7dgzsXJ2B(PTFV&Y_T&8XJX)UKuv)~Qc4RZJVSMnJ-h$^1 z5A#mOspdSJC~{Y{2Rrm#d?3}(_vY}^;hduUTRCj+U3$U`9_lY*S~Hm z30azGeDv4aBimO6iX7S?prfUk7wS9fT;YF{i`TN_?w(xH=dLpSU<%X43CAz^T5qgW zDOb(=FJ-oSLf*b@d3OW(Yz{x^c&+}VO<~L03ttr&e?`5V<`u~CY|feI7xySMH!k*{ z*RQXXzBT#QERok9Ggy`cUz0EA5i|aD+xf{;L7(uX-1M@G9lO6y^7%LK<{xu;FMDQo zu`@1xMuOfy78X9fFp=MAotU7D~6bF-mtm*Tdo zu%b9$Gl`A(`+xdAUBA!a@BYs}W;4C3OOtwW|M8EBwI56xKYjW9+J;eU z-#^>jxAG$9Zu!#r3oq|3XWsv7+P(kR<`z|$uD_l2zE0=Wo;P7j^yl8hf45gx z)gGUutai4Hy-1roFNWRyVXf}1Hh+J)=<27ZCS=_|6SgvYao5WGrze+xHM#de{KxI) z9wUj!Hc`iGV1@9+5P{j2}J^KyzIy?r>Il^Y94==kW(Dn_?F{@!b2S>|-%s3HQ<3^AGd5 zZ`rbb`Zs6d_m*7s`-|__`X^tuy0T7SHv@m-`}Yqw)lP`I^yvQ0m-&C?HIFOb{(Y&w z?M)5m%M|O#@&hS6lO)-v2jm~9`oQ{l|5us#SJSrH%n!!v6?xTAw=DUW6zW%gi;^)gVt+a3hH{UhU=GP;=OYy&7sFqbsoVxp9!G;|(yY_51@K9r)$*p;*e#@iX`>mhfb?=f+?{S~E zDoC5_1b5<=`GHe7PanuUk}CJSIB5UDX>$cdPd0V(qmHww=- z@%XC#5W1*a*cZv1*&N`!-(@*}f&25cT|#X73ReYk7~W3x{KHYavvbOWZw_1&j)Y|% z7Z6!{eTU8iL7(#n{2ZQp6!Sfu?-=&rj$-Zo#$t=|o)Bq^e@rIwi}~*#-qn9Z&)zX6 zvFLZUL4{z)4gtY~CyoiUJK35`PIH^-65%v=g3iWWtA0+lf6L*T^4)%~vXRA+G-H>? z-`@7^y}9c6G{GzfUhfOvFI@fb^0@8&zY&!+Q{No3laZStBi}i3QLfyVqPkYg{Z|jy zREWO4c3{Uw?yDCfpUQ?yPhE13M@MAd0=3QjC+0O zrkYvzT)WvOz5C*x#H_vb?m^bg{mHZTFQ4jLbGO`gUb+7N^Xo*@)&H#u`>m|HR>b_W zlFh5C(#C!9zfxn?+}y+P?(RRwKS^cQEsMkNsP|8sci~6r`t7@NT7cBZu zWX12mHM`F{?mqu`dC&Y65l?riwW}pz`d`beUvy{p-@5wggL0s~LHcFC$cZ@t zVh_LGdCBqlpijP~@UInG8c!93LsKuWzFFhimOSbC6!zVV&TYPPMJIc4zLbt;tBRKR zS|43UrP*$|g0i-5mvR*wzxUbY@fOw;Y?^HSt&FW`W7drCZVo3xPRw7TdWO?Cf5|z4 z+g0-ajgS zv!>4cJb|6L-?MeX(+=(g`Ahr%H=O2I+B`G;@9wR4-@PmT@TuXM*2XxA()4W^Jz=em zy}WK}ix;YUXLUAo?sfDff55wkL5xGa+zmsBj zk0|XZk&~1;{6o!dcW0L7D}EkMwJO%P<-FDhbJG;Mb}>wTULeMEo!PkgWSQ>S^@>t2 z{p1x-|7R=T)NWnb@paz_3?*PiHZ+R5h~GF3nVqW6Y@ehni(G%FJXvYb3$Hq zPsOBSo$3==sS~Q#`8TPqH(EW_=PJ*V$gS7DH`Raa`|0VR@84SL;^utEuXU}G)YKae zdQQ_)Po((Vuyxp~eD-{y%3`5K!7z5RL9G8e-)PxqYXh+AQl?kA(Us)v2v z^KV?zDScPEaG+K4;qAJ7W!fA!t#W}b9!hG|M1Etds zg+-KWyXPuNG;wBleeuhPeehB1V#%p2=Hq~uv} z+p-RK30`BFiK)Vo@vfG0)pWhxpS2!d+`y|eOLei=q_-A-F7Df@|F=oN=*>s^YNpRANc6+iBCBGc_7Zw0OB2SDoTKIC1K!lC>plP41y5n*yFR3bZub zN=Y!1QP52MTs8Z>%-f2t+VhPXv%_}Gk=)y;FXPI1P%`mBf!~Vk=3^e5%cM81_McYt zx-4@~O~VnVFGicsK6MKdPkPL}(1+=6m&tFIY1x|^A3yMBUEG^ob?>3fn|EwXUN3t+ zA4b?`1iW9fUHxT*@JS}IqVu~1ciu|qcH{Juuzpjae&XGY7r#2zh}=|JB5~l}frQSM zdlFW6&e!_7ZN7J{zM%1&+NBvM#nmsAE6p~Yytm`Lm767xm*UllccbSe%_-R4{=@qG z!*zd|c;emEuWwj)|5f3%WS)LMy~J|y@;!#ivoDUNM0ZRwAeO zJe|5>wsdo#=jFr4Kl|z3zULPvEzQ%+GbcIbiIG(JwJ0avUCXBPZPt^D&HwW3;)BlG z{uM$->9d!3T;CM6H6|wR#?3{F#XEc2rt)?Lh1KS7{yJ%eQpY4~#@>uq8&x#2o;6z< z9~Oz>c=R+XE>zvnjQREB^)2k1@Bg&l^VR;xhu7uzdCcoR*!(pXte<<}Zo2m8`ejnD z?jNqW#csbvzAl3G3xCor+rK~G&3w(_i-g zKQF)i|Lps9n*Hys9^bO!`+M-mlO7;FW#>SKh2)?(j$5QbJMKAG{-6TePfLcuC5RB`?T$S*KzUE8H;1{q>{wv9zPj3 zvAMj=GPj`q*GhZ4^Jnf$XdJArNtAitJ-;WAcgF+Q&$h|={PiW_JN|_(IZ<$Y{h_Vv z4}G1USj)9|_m8yZ%Tk&w+WZB_EhIPqUB0lVqxR?^%LGOJl~`{ z+3%obqW0947T-hEidRqmX`ATtH)p#I=ixPnFR4z`J34394c$KvD!0`8lz;ob_1~9V zNtVqA*Tx@w|4-*uJe!YPyf-$Ki6Jwo^6R;v~AUQo}J%IALP8w{LUBMX?(6Q zKRhD(`=vQWZzCN1%*!=yy*x2irb$Xn?e!8!k`L=J;b?MXFc4V;M6s?^ese3Ku zmDp<&t=b8z?d;}v|2NK3?$pLT>3d zW|P@FrYh<6{9B|}V*4g!0%wWswQn48YYGA^Hg>bU@^9%jzLNeTt9gs9P1lpX2?rHt zHS=6NwlL_yCc`C3+VPpXyJ{G^zqg)s-uyF*`-*Gxj-=wMq=mf}&yU95HnrwI@p=1% zgM4K-l~eh49njNHG(J2{dxic{z2zs?YH!Rc&o;lS<6E{a@h!99_T*`bO3cFMY=S}e zA2c6lWsQ3D%w>hW(e|Gb4}}gVukJrOYis6Dp>-9J6BrHG738&Ozguurc1LN)g@|8I z73=*CG%1Hg_wiUvE46jaj(wEvvD%zoO(n2-$zFCI#0N+{Cez#`KdSozICZZC6{%+ODwm&rM|N&p{%kqMbhlW z6s}~0hBYou$zlO*J2&rQoId50^y7t__2r&?d*wUPD0)`$T;4n`{U00e%*Z#%vs%5* zdh&xsd6%3{&RUkfd1dmE-;tM9?r;73c*d`*S;FFn(#)ef-&D{rKoJ|35tW zdGeh}>FR9fV-?jG)FjikA71p~*w0(~n{^Y)7k?<*^viQ;r^ex@_XNKV=hto=tY#t@qMd{O_`#M zbJ^JSS1$4h%vHNB&2^Z?<;F}7J%_uJ5Kf`QMEvf6S|Q|9j|k<%nHfPR!W}aV@)!?fdMIS^eiA!ww0+{f|tIWVkVg`UA)(cBS}&CByY&%)FzpbG;8OHe>tahPKr8Od7)L&`RRkB zP5Wn8`^n|}jrf#wyUmW{@ax8d#jLlq5}O`~?%v~K(p=W87k!0&;@op5Wb0y@)-8y4 z3{<@N_3f;f{rY-!NkR1uX5s?MI~ZrVJ^B`JbS6>Lv6#P$=ZTciK97ob^&WqoC|_DE zTKP)RVhhg%eg!GBxyq$Xo&vmA8}z-`m|a?P+>=f3f@$YA)2@XAO^frUUbHx@s+!kg zlD~5XtDktmf1`;(j~*y&|LLhed+NsR;TxoFGv@}FetUOs(#5yg+x|TfynORcrqJo) zazICU<|UH_jvA+VM46)>bxr&5N20!c_VjK*PXs)^(@vRi^1xpIY(zbj2Oc8MXW7{qsGVe%{Ca&7Uvg>;A5Yxf9Gi zd;2}5y#?(L{7>in`kep0`Tp+7b9*<~CS3W}ow;Lg)jqrP|JC#F@m62ml3s5wvv>O+ zr{0*u?M9mB)mI&Z1TP3&O)6L?5;}+Tp7rx1(O!YqV)faTH?A{`ERhZl4OyTetH+&V zW_x++%|^GIwFlp5D=O<+Z<;H|*7$JU<44So4{N?S@W#tJEYKz3%n>8?3#+%z)|l%W z?JKQaqxSgH#T+ZH_W{O9A$y8Bx-t)?JH2Dhz5dwq+nsw80?j71iyLSDz9&^Ui81a- zk-7zct$d;9hn|?gDw9OQ_48A zd9SJVcU)XGd0qJJEn2Z(G>&bZXz-;kGTA0V`*NJ4&05LQ9+!_xd>3`QeQ3%&Fnc1; zk|IUimN-!OYW+v4yeZ|hEOV4t+_bG`7ne-f)% zUy8i$y^-_R*E#UvI{73$Ve8qEnC!SGF4d4(+_--lj_TVd~=sWEfeV@E|o)Fe> z=kPAm+V>vomb{(v>`IR5U5-af?pDkx-|^tXIf-da+A#TAMo5*P%t3v!fFm@KcX8HJI zNqSAa-sI=r%5G--W<{0Drd2Ag_FCvY&F)9v3wM4Wvj^J!D<^ULWG(I&`0XN5JtzE+ zm7z>^81E&Mu41>T)}LZ_M6I%kN!;4WbL36IlZvk=P8w+VDVlL@ov}3P)H}tZ4eIZX z%3i+eWl@rK-RPd%9TE>-B0gJjXEJp$bqKPlbV^)|B9cCBOnh3{VT z6;^JD`=*m~>}y!zx($t8EjJ>kWE}B1HDTjR>zixB)+~NBH@!SY(8yn4!?umbCbTH0 z%xux=XgQPWYB*)l4%1WL<3DKck2K%>s{ZG%&iVVkME!bZzW=B3?D>CVv_9M4`LR*| z?PlrL<)L==C%(Tn{_j@*x8`mBrfb#ucQ@~Te_+zn1=B`Tn)~|HL`p z_FvC?)Ohc0-yKf%kH@@A_eAxn{O1CIIkj74a$()xQ?ZK!lZvW} zx8AC;{Pxm@|KSp?&52^4^2=lYb5H$tuqh@X&gW~yp6^;7kyG9!gp_RObAM;>z4hwn z8@K0_Ot4;Vg10k{{r!v83;xzu|B|*Z z)BSkv?TjA{wl6cEPhGQ1x92&}zi;+xGJ6_-*$VWhr#-4t)StMERo^YgG0Nvmi&(F= zgj?ZpR;%ou?*7(4TAsPb?rf+`&RJykJUcVJ^xm3VWtZFDEk14-yDlj9`?>Vi?AH>9 z_izS>KS{4XT*UH^VfoFIC%07Wc_DXfLhQFC?7r9MKR@{O-ilo-j6XhQUm1Dd>(<*Y zVbhIvpWmsJP70EKc5^|r%E?;=r=`=sR4E(3iu<h#N@>+a1opZLHvC}^4S)Uuf;oD+7wiOjp=_gpL8dt<7;Oz)Ah?-L$c%w+lg z{K%^;^9GHLom*zlTf|t{_PNdC;IVT#3!9Qu)Gw)a&(}G^-#TT(n+%QW{Q*jmee168 zVD3-TebV+t_K0RgzTWPZpORPlFS@^t1?B6cC)XZYB`OwvY?-m%a*t5Q z-3;aqU9~T+UC`Zlm1p+(0*NbWCCd*zY+Rbw_xa+T4E`>~M{aHT2jrxB9GeatIl_D? z`Icg$p5MLZZ?P+uZ?Jc|qj=)RnQM>kxIg=&J0(^?;D|=N==YdIA3DyTZ2K=&{X7>F1%cR;~7hm$j9Wx7Hx@YFLM%aS^jy*%Vz&y)$J%p?(%8R`V;nw1)jM! zH*kBx1Fm+zq9xrHBA$F}Mcz*NTYJ1%|JjtqXJTe<*rs|`St+T)e^bV)Q)_ECUXN?I zzV8*s)XPU#df6TCnz&*AGw=Ix=}4ES?+g{y_nz*;6?yHKZk@<^Rw3~E zYxCFn>yoOr^u*pYyIB%>d*+XC_ZGd2zi{o{_t@)Sy>70SG10W$wW@UPdz*RLdyP-H zi*j>c6kU}o?Z2r|j$q1l@C29<9MY=4#n-oJkKsh^b2oTK_HH}B6?)31Er7W%Sl z%9+l~DM~wb__px5sV*)&y2|rQ(v_8qUs@&IPh1w!vqB2$@}+IlJ~tka%u9lf`IQ{mIWnksgIU;FGz}3o7JF}b2`@Gwa6-;HC)FIIL zkmXqU+>(Jef>;W`jXSCCDJuF+O^ot zkKf#V>=E+{`Q~jin%=y75R^8<@p{hnj}`Kka~wZ@Z?rD>GC#29Ez{gT#V16>bl2rv zJX|YLZDHGdRMba0M$Wo)otx}$+X6l1eYVT1E;j? z+Vu25l_58&B|E_mVuRnaTdqWlbp@Q2JH?~YUv+miUs@9V1CGRJ6SUz9D z)|dD`z_3QIB<+dBZ|37E>4(1FW;fDF{Pv@3bNklbe_sT5@BcGri8T8&F5&Bpjsn^z zxSJaVUrsazuXZ^zY1JC5 zHO@;82!4n;n|&^fH#~c@!HNZEbRX?rb3!jje*La1M|X66yy)#0mu+loUw8V!yYFk; z{cGROJJz3k_pgS*`{E1l@@?#@w^fPlss1Kqv$@T7w|mvD@~U0^zl!^<7g*T%^jAEI zv#)lpGq27#{=8f^^s2vk|Ml|!-PIrO{r|dce_WXnuU6>sC0`$=33*+Zyy9P5Cx4pe ztjP8WtFw$$JDPQhJA^+ZWw{A48wy3tpR~Yjc6v_L;*!2p?yrx}ecHJAhVd2dbsTPb zZ}v+(5jWlZa{i2(^jRqj&v7(1ObpRH<-mStzFA75_SrYa8xKuT`hJB;FHiEwLGG;E zJU6GY^C?!mvO9G%>FmFceRuE3pFCNjS8F0HxamX7Mm@ggBBf5#OI{mhB}kO7V~wlY z=wdu0?rY7D#M4KGy7fFw1-;&1P%;*rXcAog#Z$k3*+jExDT>QaTyc6gVcEpHckhHK zxz3mPb>ytT}@ys+m0-eU(*6NewC7D5x(xaiIGQZqamYr z(&0;izoIrRzV}C)`Nz)ihu{7?N&IsT7Jhm2fv!?ynulVc+{I-p96PlEIkH;lcQ%f=2N5x~RcIvbprMC^GIJ!R{TejIFvhwC#&J@;ZR_9CBZF=8bDhDEf^yOdAwSXaKEx&Qtww~2eh zxuoyiH9V_aQ;_*m=TTP!%R<}t8Pdnoa*t&E2r6V;V_wBN=fND?kB#LedoQS~KYu;% zr;u0UW7*?xW7E&ebKUxC6rH%NPsid`r4skt)*MA0*>eV>&iZ~n`)a1Y$=|PbrT)yX z%e+6;dv^vMy)XHA-?vp8%iTBm-)p{VdC$^BfBqQ_?TDD9<@d#E8=6|J3<@47X{j~X)_EsHP;$$idi z_*`f56dSwTW3J!w?nYm~Rv1zd{xk63+bc_Bd;iu2KDl0|e%0Xo-uo+-31}_9xbt%5 z<=)pRyKBV`9k5)s_oaGoi=)Hd+wUaS$z80k>HEb~pY8tRkaR(@Q_Mc@vR3K+dT(T; z-*hfY@)OvuD;*g8LPUJi+ht0P0S{~U*;Zt>y$W8CH`_nps=8cxbp7t!8h`%c*U8_v zaPMDlKffj|`og)H49lYO^INh{WOz)w@A^r3(wj-Y<^{wY7LA{MjvUo9$*F5qaubPz-wV|%?*CcxF#g8bH&1HZ{Tm)-ysMDk zx2gEX{<#NFm+I;?9Gxt-`oX>H_l99edtU&?s?%gN`T@A{wj__NvH)5rU> zcb}J2s=xBNUUS)9^Ph4V-@n`n-hW~}^ZPlulh-hm-#<7%z$WhQes~o%l*bTdFu4ld+)Kzhh%-cX6k*UiRaTS#(na9wf}0~2Wjq@GRa1-cXoBC znS`}Co9FjUS0X>Oa=Ti}RcHpXA0UT%O!_L-Cw- z_%R~!C?-LOp(|JE8b)B|5R{N68=#IF1u8;fz{&NfB9OPSX9!l9c z>Fe*}fQ^M&E_wI16+Ac1DRun)w))6%?M;6bSTiV<{_&Vji zl?rl@cbQ|JYrE;A!90#yqip%+@_=VdRTz{p@8d+T48XL|b1`*PC;5TNf#Po|p6HL*&VX zyxHf>(MA1R&G_x|?DyQ*QGapLPrpaIyk8awf8G7)@qVwhG4Wpv zt+=<_mL)&_S}S}zKE5y9`D1vnihR$rvsngtWpY^&$G2s#TDbMC+bk=+%eP)9C@nsk zYNvcaH}7YD{c`X1doGSzyDGEiu?WQ3g%f)j$NF5_Jm>CW6w(&zl5qDzx?r6 z@!p2{x@A8(x#I2Szqjv~7q>5P{`36z7WMZJH*+bT|M!PiVBgQZPhOZS@NB;Q@70ml z70W-KVW0geW5W%bKR3j(|A_akJGp)4az;()o9b zSfB5IHZlIlQizsr<;<%mm0)LpIxm5CSCyEe?dSG;}dudLs? z#rofsOwvLHe0Xw&7oSShT@$5avH0E1S!Xy}rf!OMl;ButylboBERLf`6sHxmO0+v# zu-VO;e9!uLJC9}b$v;A~^F!QjnthzbB4)ZK%Y#)Vq&uR!Ql_V((wR+WY3sj;+yIax3QL z#&v?1j%C=pPM23a>+WHH_!@6e)dG=Q*G`D&*^BPAFxIpU>TUgT;mkjlo&Wk5{L%V! z=f8;k&fdIz%**8;nrU|&xXQE4_{&3{=r1=MCM5Fdv5Rl(<6iAy?On1pC{%8~<)vlm z7Uwdu&zD>@o?UiHEph6cOed#zDyo~WXe?gb_~t$D8ZB1kht3;Lu3qo8?YGR=!`^cC z5d}LKsM*;zVKp4 zea~?1l8cY7Zj4iz6`B;l)-^S#+)KjZ#Z)`jw#8i!S0p`8nEr5wL(NI``?eF`|9i%~ z&*odtzk{V0=Zfu(ahzP>c|whKiCCu9rWnO70rpI9A3j)J@T0$VZt~E~nQm+I;o$*SGIx-?;aB{qD!>_rLuiQ1&c$$Mo8S$MH26-quzuzVT(c(TCJs z|JPdoytno6j`-_F+BG+iEW46%&~u;k;*@8(E0Q8Ng)Cno%=p}3^4edMmn_km;cmcu zd&}N4MfnG(tm`&Av*(HJjXmb8_sludb2r#gWs>z#>-5!|Rpw<}?cQnoebb5S=O%rf z`{A9I*X7xj#f!L-(hRwaF1a{QVo^`=WqKdTvS?x_bN=nEpFGnnzefMJ61gIyzFMxg z_@=JxIT=H>!1N4(VvCJ$H>u}(i3xhHa%)m@x-WUpwMnAYc$dnYGu!K;fA5Yk6?o}C zX$6b*{+^=$Avt%`rzlP@oOp5Bw4;j_o|@Bm+(zkcSazfV+fsv1$BsxJpPIa9_Q#WI zA20f3nhH){{x0#FYDhJk;*Q0lV)ud_b?QH zKI!J4`JA8c8{7T#codmZysl*K^7FP|BvZc~Ii8c znLW+6StszBlUUD34n@mJZZDK8)Mpx(9c%olWjNn0$fQPKSJcPorKx+wH)Uy8OK~k+ zWppbl^VPfuy@#AT`s(KG_%m7bp7d1@iGFUi?Oq&QmqmlrodP?Kt&M7WGH=I)x7p8R zzuwBYZp-Jsw(n)=lJwIGZ#ZMtDRrA&bV;6Iee>kQjN{&HX0d95!fD#60UbX!8s{q4 z*>~8!=_zZpYMjkCbB)XYH@S1ZO?x~2k$g_hM~#U-C-ua7{{BAnQ1xqj|A%hTpI-$( zoicr~O>X-Umiv_sR{k?A?i^_R{vq-BD;Lc=yTCpFWR?Y6L^|qda;Kl}Jy~=&dT!H| zS8rAsFM3_@Y{r|Ao}(AnEAQlAbfCgu%Zsa?({Ap%&v(qu(%|?8fp0~L517nO1%|#f zpZG$dLVxwW3=y5A@Y!y8@74RBjlSz5?Q(D<|KyUlw}xH`QE-Y){>|s>>f(={pMC%TpS|mq%ikx}2>(0UF8`}+OIdpUg8NMG?(G(@e9Zg( zoTZiJtlhJ#r`EO~zop~3d7X~>dEI9`Gd}*V{>8ptaK8Sm&xcn&4SxPv>FxEnU$gY0 z%MaQH(ivq-wMB&y))aCllSCjj;-*wl=i); ziZ<1Me}AuwPUjZ%kgz?+DtM5G`DSBMN2mB2e#|&=ZbM~tLSbQn!B?p z_(qP8zxcAx^8$FM+8u~G>%Ms%=gX{lH)}e*CaymJ*;V~hV$YgQI(NA4r3*>rTAAnX z&Y1hEXy2_r7k7Ck>wG=AwEWW|5A${W_A{fRvtK#CYRdNLew8%Mue~~)eR1XKEmpU` zbaltx$#_P2?v%f_ZoaKRtz5lfUCiy8Zw5b``KH^y zy8rLQ;b-aB`L9|Nryv zudKgw{Qcx%v-0kbH<$Mv6;Jkk>lRY{KWo{|@Q~b~&`9M|6E~YkgfEnNdb2TjwaO~- zgT49hb{I&c)rO!=a<5@ z8)2~)m79HA+MiF<`Mg6zM{mmA4w<*s+UrD8Sg}_=rdH-HmH&cW>Df z;br|cvgY@xO}#;H?;nx9tG2(iYw!I7yO@Q{Y8$RhkJxN@%k&&eo8?N+B`GPgJ5v33 z6yE+|tFumEZ^O6X!@d*hHpZTgY4$WJX*I3ySW>>Ng#V`KO%6h>WR+^!*L5csv$t_<+pTUTC+%`4t8;gbXSQmp z-1C+_y*nC}*Y>W<^yFH-kAPE8nvzzEt_K$?JxE z#O>Jbs63;adqR3nJuO(1?s~l}efs0Nl3xnHF3SF9nps=*Z{N4Y7j3xjt$WM&Xlm{& z*RY!@9~FGBRSYDt}MeYo&gQ$@_lqX9W9e>vb#a{MNreaNGLDsyZEg zo`)+|znU6fz3EcL?jpL@x3=9yW3C-*uV_#6ol>~@Q+Ec14k7k+&$<5F4G8y+*krbeqZc~f=?clo5u z=w=N*B3XOunhg(kVh9sw*M_%j*`nc%Z>n-;dYrZ_yFX!u2a8(#?o9pKO0BcnBZnI7}3vu~H%!}XT6$iSh9 z`J@9+SHtdY&eN3PnIb3|?qq2eW!%lXM*h&F zGc$A-$Q(TP?^?vyKiduevh>yQO8(_~^T%dNU3b(wzru9m8!?yS^%8|Io-1%>pDgrN zc-PAX%-K`Zrgj8M@W@Q#iBHQAGV|Tk-K}z&b;XRGGHQzxCTYgr`Ssaj*)`^wYMXeL ztWgPJp8VD8+56g*MW;K`BJLh~!z^*fbXDz| zzb;4g6|6dnmGf9^R`RXUkJ@!@V!zB`jW_%W!4{`{1mrI~>B!QV&bxWFs@g@9uOW6F zUn1t{FW9fRtz5RSe`9K|TjRpO5VviQ3wQIalA2y_P$$V($9hLQEwk05U3=<=$%%U} zeDAy(>Ap9JZSt9KdA&EHyKj~+n-lkKi?^bn&tCKS?8eVcmaV(Et9r$)`Uf#Fe5WtW zk>?i``i+%a?Z?i3m;W>W$mRog_?h0hCnA_LfJ*dof^X%@;KBnIftRK?ABXmOdzxt8-C&T} z9Kq0;miRbjQ$dAL^BKcAPjsGV)lQzV#7(XGVqBeRz`N=;`Ge)>g!scQvb3A)+qwyD zPj!)2;#66t+kMM2=EkOXIocaE*;XX{dUE!hv3t*{N@-6EE@NT+A7?tdHiT_v=+N@p zR@xTGXsU9EefdPkc@pnA#DjD8nZ2B>9J#?vH0M>qTcLGkossfyHhoQE5q`f`Kv{L7 z$GKIlOD=3ldS-J_{LJLQtVKM1k2gL4+4<>JuT$JT3+em$JMLHP+EMGeNyv>k+1~%o z4RN;X2iq=g%GCe6XZhUDpA1jCl^=f9Z&=^Ex!>j5|E(YY?Ce81T*xKV}Ic-v8kmlUw@y+_Z zpS-W@)PEGy317y4?&9RH+XS8@bXbdchwDypvU@)>rR&iRohje;EDv6|zSZjBF_}O| z;WOfUW7mZWISHIFUU=i0UEx;0Mc$k5aQ}AZ7nD{@wK=j!!bSb7`_`?mW~4N32#@&n zBrBT7M03raiKk!fK53S{X1?n>J$tqFc3Xc|>R*$-K0p8FN?{)3KSvZl%k3^HS?(6@ zTp2Lo{d5a&ov`d<-Y3?}KHSAy^-tnt?;iz&S7*(_k8SETd!MMhDRjQG$J&d#kL=J| zo8PMU`APGn#F^2{-QF{;<$5M-_u0XJnQi5~723)7s-Io-nJfO)ZSs*l3PLhZHyDZA ztjyQ6HPhPuX;o>^YmrTh6!g7=;v{#U(BCQNEMNX^yIM2PYpckoJ^TmD zQ`WuxAiLoEzP|dP3*U`*e*5d|o%+vb(Omn*A9IqT>yB)dm!6+0XFI!P?{BqZ()kt@ z-i+_|e=W56XLao6^Ve*RdZqT?B<0+~m)?3ia_VK;R+Qe|b$Qd3 z`~AJvU*n`b|0z8B_G;bh>95nmL?&N$d=?aPr8U6y{OQfU#Sxv-YR}uRc_S?98~7`v}B5&BA??Cldnmdv%d4?+NCJ8%Lctf8}{Ca?{#v)!(;`+inS4ioG!3HB)losgIc%;`6r{#aGWPXU?2^ z-@zbcQ{37YbF1%sv++CmtTIlp!=J&_%{x5iSVZTLft=hc4nd$cX89$v(Pc@pKnD>9@lY4?yk7dfg z{?RUqJAe4&TIQX<3$EB-Dc!m&>(^zu-T$nwud080{9|99QReTt0=K4iXuou_{cicI@o3Abkf2Orw%&v#c)$E9oeSE&r=3cot>8EdEjN?Ux(u>1ZPd%e=z1{fZ z5hqpYDR0E)v0mize)sL*0W;>*%6esW?agBC-X1{*9j={D5nHIQXzP>0^m=OG9GBmx zv>o5QX-+v8HNlm4vv!72s)?8+i>bMoibIU#F6N(avrl}EcX}*t-7wd_##KE@vE>C zM$Sbk`TX@0oW(poo5o2c34fezx^Vr%n+v+RGoGvL*8lfl+s-2Y37wJK1y)YGw*KDa zieLYg&ddBeW-sK%{^c@vO{k!k|E&6!x%oV2k8~zo_TTum-gix$1Kaiq0ZthkpNe$P zUc0mAr_B$=ZF~4mV4}T>${^Gp!e8J2~*XDB_z0@IV_TJ+&pC^Nyc+XwW2RrA^o4(Ix z!^!)5)iTo;hn?5GbL#9CA-3yhUaq^yVRlzy=PaJRo)b(@pS`qpcG&Z~eYwA^Ov@H3 zoxXD7ee9e{-;?jd&dJU^(Y&vB9`UxC7UzEg*EuM0WPR$KY${c^pV zyPRum-}N2q)h~a4>dWEkmzPBg9=ny9^G&}WsjK!}{Ovu}$E#;QzPDCviMw*o=iPma ztAAy**qVOY_nSv~+V%ju$HjjppJO~9_gnDux${YXLf8MEzrMWQ@E=pgcN4qnu%Cq= zL+sMu+v>jlbGhKV)aS{slB>&GHah+Lt-tX7p62-0Y{{9IH?KOaRyuX+{RNc|%f0`u zy~*6yJ$qs1^R=HJ`-W88FErn5b6Ya4Rm3%MwVBs#w_j5{_IkYOeZagj`@)P5St)+o zj1tlwT{&Yd7^-}8+r5O#GfgxN^Lta*8m(-a>i8mh>FY@@hTKXiT<2z5u-7hc6V|i| z@sp^!p}BzF==ltDulv$^92En>*jnJRkC^E?x=~(uUEV5ZoDyDM>R4uxAEcCLl%`2 zo_t&yDLz+ZsrcJP7oA0ACh-`jZq2Ej)AP4*!=D{XqQ4jXpOSa6;Oj-_opZjeNlv)> z&12fay&F57q?uQ?S6nP8y;f}H`$nFv?B480?EBmQ9@0(xq8f3>T&_+b@25oW;uD#^ z<#H>{C+uqY*7nU!F>u}cloGKu+1uZ*Wjnsh^xV1WI@5F??{#Wpo$^eg)#uU6o)Ga5 zr`9h#tZ7s)eNFywNiQGkcKfDNi)S8hm7Nl<5OzRr6l(uBM z>Lgw=uqwKfXB1X?K22_+hU=syH`FH^nfsRAEC1WtvgJr-^p(By?ilVYy!GqT&+L!= z{^3tooQO4!cAx)!PqEvR@cs8yAOB|9v%lrM?Cq05^Zx#`toR--H~+5qpCxbq)}FVG z?kW22`{v2l>wkAI-p+f^?A!$Xb#c?(uPU#7wbx?pvgSqWyN(To=}NU3dHKBNg{g=FNQLH&v&1FOSQc zE#Z+%&+XznQW?0NwSHIL>qs^KQpH1o-L(@o zU8P++&ur}MSR?HE&c{mKSN>(_#*`@s7kdW2mP|kPuJ7@$x`QA0soxjeZCUom_N3%I zj_>+aT!lU{lcaZ_TlfAMPrvUHuY$ExUL9rbs$5iMB3_vG@2a(dmDuh-5_a<(_ceq~ zJp4S-SiJhehPoLMXKmUVw9Z+dnXt|5_0b(M>gS#v(qgR<> z!A`%_bftH#&V`c?J^CrLF6#(WXzNk$)Vr!KGV|0ItZ2}z92oHhkbI-uG>}JtE3k6uq7RKY)hHIEAvQb~3>mTv0i~e=_zR=$f3wJ(9uxLuTQ0}4kfJKs}ChbP*qBF9K8`Jj% zOxwCCYvFa>h8tfF)l5#gER`z2#@w$KQKEKME4MpT>B+ex>3kk$F&ggYt2^i3D47?b z@9J~)PJ!;^g~t0cRMuKabbBl-DNWkzvgSnYuNCT%lYFH!CKYV+s3|ml`r#^<>LII1 zW_7Rk-muI`Yw@?fwe}Z3>(hB!$ zUhDp4GpPNY`#03!9?QLoPxUggn(^(`2OfGp@82D2Rax79)&29YgYO<6+243HdvXc? zj_MLM)0KDmBa2Nh&pp0xQ|e70{_vSHZ+Q0wRs43{d~mVd(tf*&9l!j8wwOr#s;`n* z^*v_)F8Nar0>0;c`8$v8XKTytCy_tOT_?U5YkjlBVZrO-^{IhR#kk%(-!HGs|8erf zV~#cH(n*(Z@8I$Xkqp0A#J+On#GE9aGM4$tg`Be{1U4)(nj92h9M7{|Vb13j-yY3* z=+VIZeE)TA|0>7%8~gsrC8VGKaz|{&?|pJdxB2Wz|K6tNzi#DB*Ez<{+t#qH{NGXX zE4}5h_(Y|{=I@m=x9W<|oEQE5gWwu-i;pR6K4&JZT{1f(weJg6-aedmp3CSl<~vO4%yZkk5GhyaCHRHO2W%W%>Jd+N%8B z!16d=>EaJ?!_+<}_ovN1ar-oXUP7XcvODAtn+!bV0-Ra_kaHiE89MPydr!v%vV5AVtmnAz!Q8(^eg7Y6 ze4jkmahmu{dyP$Rj-^cTocc6xn@3rh<>XBQ+ly;FcJ6+D>5bs@_w`xRmrEC)o4DG` z<78W;+HqmU`gM~w9s0&^ENQ;i_xX(y<(O|y%Nd-W83rDnbK&c$)RMH`uHr+hn!nqH zM*Cz-zO!0)PB>Qm$hjSMZGSrrZ+wkDR?7I(uhU2EM1}k&j$?J>JOE$*b+RPIU5 z*z=)j-_DTV6@U(o>S5WKbfw* zbK35*=J-ptUas2C>32$gO4L^H$DaB4SjaGHb}FGjzra^LTo zAb!;^BK6q0q{r)Lx!HG0Op%IP^=b3vIBt30Pxth)<-3edZt>B&Ebzrn{`mgK@f+{k z?q1&WU~6*DuZN!hcklPR_4nGjP*a2BOkuGzEu1R3pT4vGe#`LNImu7A48Psnd~UO= z-uzUPTCo-NW)Hu-F}6=T_jBdr`31y$B`G_=`&QE-&Z~VFW>$6 zp0B<6dGCAO<&TM||GQ^cCO$(h`LcTQgLi_f`^6Z{< zFV}1Qy4bfS%6sQ=|0Ck8PXnwC#cCh#_S4+#Ft6JCk;+kz7uy;n_~uBhuvO&fwlEZS z+@xMVx59mL!d2<#rRk4DQy%p+wy!FACVNCLGPEkF|K>LirGsa@^otC>@p$Z*BEc`C z$hFGt`N7UWjVY}GVi7MVbVP{v7An4(65V;=L8|w!RRir@XX4#lai$wC8Tk6xH8wL*q2hP0elBGHVz2c;C2rUZcoCdEXr+ ziG9s=c@qrm%QgganX?&a30!wvDZoE*c6{U78C-{)C3+q{%k9uDx|MrA_$Tj)cMYNz zkq#FZX%#NK^iE%|Jh_pLo4 z*@O3%jZ=8>jO`PuQYIz#XK#61_;|zDQ`uH~ByTz2RyMS{ZE`Zo)TPHxa<=J}?4y%} zUC!K?XMa^h{nPWDDeHXCtWoBSxHq}_=qAO65NxY>THUdW$LLiW#&xBH=$iN zn-BW=t#90B99EnfDc!Z{<AIcmdj5ru1=qhP?CH0Od$gIg^|Ki3uA@@9HYLa2 zU5M157rOkKxMbJ$4j19fQ;8eBF3mr3Bi5v~EOqzd%T;TuuWSnc@-Faxi|g{tNxS7O zuiK~IwVnB9-btB1DIZ1F{Fd4BJG=9L{WsS7#QR^4N&k49ob&$h``G_iw_lii{p0D2 zp5K4nR{!0}7o(kZJnR_m3CW=3o~ z{kCdDVoO8aD>kVBTa%m{4*N|mFiigMWPZot_1260y4xP+Es(oYu(P{FQtM>uw2&Yp zqnRm2p2wcL%=vwDd+E&LzKi_YO2!_6L93PoX{q+L-^f0G&pPS7>Ge6uXFvA7{~dHG z^vpD0-osw{VPXd>)q~jDMb4#eSoXGcj;reBl%*ycm(G&;c5+*>;Bv)>%%ei}1Td!QNo#nrCdFQXoS>LkjG)}h;cAs#>;iA@r>H9kO|K$GhY|f*PT?Rx5SZ{~g_dA$j~Eo(I|@0#%T>Y-`1{__u>am(4qOoSYV=eB5#FRd(fkB}IwLoy%9)Jl0ured1NE%Vj+MxoO#_jc1DQIJClz zuT3L29Z@-c>oY}xpH$=NBh@12`Aca0gB-h+8Q=L%zuloaeDL|gQ}UF+<+ zd~cU;x>Pi$UjU=^Xaf3&;y-`})toYUWy{onEXoAmnM+u!Y*UHA8T{O1~m z-HQ`fNBK;aUmZFt)Nj|>CAL$3zI*rM;|>kGe@8!N-~W47{@>&L6)&&z`#10Z`FZl) zkSoeBqebKAJeVZiUA)-nisZIQ+><6xyEdDD-HK(8vzDE^`g%t3iT@VGlm*BNQ*o=kOo$W(T%acf(#)5F9`iKYBv?g6oeuVz1~U`bR8if58txRO09 zW+%H=bKG_t*-6V6E8lqT=H7N!%ZBmsyh_&tKJ$29T(+OjP`PYD_8BR`!zVanYxy(n zm(7#7r{D9GweVv{%|=J_EJvkv`X^#f{;X`bsmS>HX3od0GrPI3el~t`kooz!>!t5Z z9$cHs{*{+$UZ*UV zUsADc=Ax&+{@$s5`)r^3{K`|hk0OPiEq2{k`MJ(MR;W&WPgvcr=)igL^Ym^_Uu^xk z^x3V_?{5!>cjfQ@nD_r}dBOV+X4CbPxAVtO-#z{Q*7Az!`EU2XnUOeM@xMpcd)_JA z+dfx(KUeV9PS>t3a^v%xPLIXs*DLOO)%E{#zy7?->DCetSAYJyUikm6Hxu;h{C*^V zIyryZR|e(R#dy~-QT;KJF&De@7gB&;+XqiW#m<+-F>iE*k?s{ z`-=;lcCy-!*x6!lOMI7?$Ak^I8TUMbZnI({1# z`(IeHW48IjPx{LGdps)gEIl$qlM^?aoVzdHSKqNt>71jTf5m>sR}9k}Sib)W)%Z5y zW#|^)6E~fYNFViU^;v%6v$+FTOkktymj}jc-cAq~t^AnZaR1PBeaHWX+kQw`TPf(9 z8{Afl`6*f$UUyU@?a9^l6x$^n=1XSmX^Q=S{>V?kA3k=!pYNz(k-c$LSw&9q?8+xk z1+DHLpDL_zY=f0+m#PYX_t68hZpZL6ByDBc&-__@V_l<}`;5GVs|&u$#Hd{{UXi_| z;bk=kIc!kN9+rA~R25Fh3GdD!s7w#1e;Zxgc5kEUlhkf$5k9@mM z?eJ7obcvpu-VxAeQ>yyn%0`3u;!M~b6@3X%cVS1_f zapL^>YQ=|0VdvUx$_} z-&r;7>hZDEE<8)fkw`ewWS1TMHc{plt9#NMBg-Se-$|GQZ( zzRdoE!>>N~yS!p$cSL_dneW{DuQ)$n-NkQsR3}pNw9w&+tb59L zX!xw^Dm{1PhVbVDLB(wuVcx5XRXvv zSQTU`!K&V>buHaQBC_SG+G2}S3KfzyKJLoyolz4Lqnrh0W``{;O1s8?DPB|hc)Ed> zqxFmG72Fb61H=N@+t16Hi|yFj|L@U#w{3NNwm+CFe#92-cKLU$ILLq9p_`KC@w<-y z+i&&w^8MEpHS0u7bIw?NHhb}NsiS0Mj)Ueh(Kr1MZk0LSJk%Vjme=V+7Qg><@ljQcZ!Ja1JzVZPMGI2frV2(!%;%3@UD&%LGS_N$$JXpO513O*c+>3J z&GQmpyHA+D8WX@Wl zaJ}o-ZaLk$wj*PzYm@8cN6qcNDb?j|+Fa+ZJ8dnIk#V!DyR!L}%->@Y^)iz7(^I!} zWtboAn$9A7`_W}%%lbDtSEWz7M46s(U8&`6`>CQW+aQFs>rw2IT;tbqCttlNUUZ`I z?p)35@jDM?aIKB@h?x@*(Y$)U-3GD4Vqtr2R!IDa)mT1(zwoVd$ybJV^-ZR-Y1%QC zZmTWNlyO|oV`AUZFTO^sO{CARa#m`7uJ)s)%Y-&=?O2+VQ4n-xs`l$$BA#2n=LzfF zS3bVs*Wcq0XWyP&6ZGwCW5C?GDw@lc*B-yMkL%l&$9((d?Heo z&ya(XSN0kFN!TCCwuI~4)zU-@_1w^if-V(7-T0>5Brvs@;b}I8&Ge zF;c-P0dvKI+WvLs=L8;_W>sbCXVz(U=mfv&o=c9F9yLyErEU@iJXOtiPZ`b*3+hq3 zw!}eL){{wUZt$5o-j}}h&g5tn=Wx0|d#03SVw&Te#)VfnLIW>-mCY@=|o3|DYU z-iEi5{m1Xr>=S!?rR1Vwtcn@u;m7;GmG1bsUBRdD@8d?1fDmWVjot!T5@!={9u$g@ zNlc%4RXKI@w-psf6kaM!eVLo^;QP&p;|}v}Z}!ND&UCn}@pQ4+_V|S0#?nKgsMVfrz61Qg6oD8GO*OtuaUK^%1 zdq&PhhF0}eCx2NO)#iEW^?uU`l1V*eVK8$=$BM19Rn~n`W16jZab^1C*7x$#r^71p z_BZJ@3KxAkvgQj%YG%ycbvw3MAB&j4cdnqg{r0+tnjDtpIhE=+XC4hrVRqqs!1Suc zPI9kmWR%L2HCN)Q1ZUlF_UqZB-ohm~RnIzl+p#mQo-3Dkd!$E{wHllW{@g0;tdp(u zO-rk7vP!F~4d-djkD?k&rf{ZqYHMAT(Oo6frO*)>$f8nlJ^ktwOP+)E%L^WUpPlyE zbJ6dEMZcn@|COwHuK!N`U(l1&>l=2je{^1VURmt@oz3;PI{*H=?R@;zU2Bf=`ZvYp zxm|bn{@L;N$L}|v>+G%K``6Fkr}qCveWkf#!Q1AQACK++b@HzC(K(gRHpI;97yJGE z`Ct8`bL=g@ysqEK)w|c|{@yQjKX2>5J9A9_*bMXCyD!hrpLo1f*6wPANMBm|Zl3!d ze)hNS&9f1r{hNJ;t*I(=+;wmHF5mYyw>)P@WNzFX?x_#eSvSY;Y0K&U z`MbZxX~SC0A6#8UAFjXyY1MYf9=QD&$Y3O`+Mm6`jaU(v%ckB zxxXRxe{*WAkKXkvGrgFbvf1%p*B#D2dS}0V-M$%$*~V+0ybiq4%E6 zU+RDOG=JPPbH2FG?Ds4B&DTw2eD_Ij`}~}WGR?Po+jsu`7Q4GT-6DGX{F`rVwEKVN z1b%$^QJlNio-z8t>K~tb^~UXJr&iv$GwtJ#1!0^6N@GoF?Rc|L=)iS0`O==8jy;Tj*DFz(m`UX_3-O zL-)?&#wo%p&$c|6$+r1Y_YS8u;ZqN_{OY`aKIKVHoa0_q5ycxH1NC#;T+@ZDbr|GQ z^4WeDulb<1Md7w;UVdL*)#l^sN7$dg=u`?`u`lpIPWgrBEA)BoEY_L#)rtRpVf*F> zkA0zs=mm`pSrd{pL?+8_3U$!faCWDs$Dvn-n<8fSFvr|A4eviOn`3s{pAQXZ?*zxL17{|6-YGyD|1RM%E4d?cQ!eDa1;?f@UT z#DBFf{0jClS>35(ynE_}v0HZ}uc4ydp|D0>^Ma%&>yA$CTH#nKx$}#;VcEhPj5ihD za{c<6(6!`&TJ!?jBW(LajrJNQyG6^` zp5OY%TgjY!>B)i*TV+=#x!*~-vf=A4Va3yrmTdo;q@jDp>iC;1&-zytUn2A6WoNl= zpZG1L=<^Q$uQtXv=lN`p`?+-6j!!kqSNo=ZxBC}nRr}@6r;AqGZ4+<)@-JQ%t#dtD z++v=;+d7V`CHW@1cbS zjrPxb;&RX7|H;@V;pGLFzrS1FK7HNE^YSq-zIU0;scXBx_v@xVo7p$~e&_!2q|M)$ z8o$(s-k%fSGgx2FD_axulFuXCOMn%i=w3p+dYBn`Q{l)rJlXIZ{uqwsDUA-B{8 z@o6U9fxS7-?^eo&Rk@2zOi3#(VDSl2lnTkM;U?rWu#_HT7MW2DzprPFfgqWR3v%F3!aRzd|5zU<2#vL2*x zZocp8rp&Qjp?|?DgY8VY?AyNOFkQZV;)htzezPAfuQf}`&t8-7+@U);dp#r9^81cy z%Eo(6RJ6>M<@$0EyrWgPc9$7FqijI-&xk4^$RB3M$9=FvtUN^>W7a+Zbk>m z%~!a~7W?&u*2Klk?7oxVG`+4q}1FiqpzaP{~Ez6I7zPc6SSS3g;-x^1)Xk8Agv^Y^rc z?q^-?{KD))&I|oTb7iznvj2La6X_~!DDUMR^uWz@+T59+!=^2rHnrbUvv1EzwawjX ztvjN(Zksjr+V|z5aleZ8s+~J!cSm`{j^4dh-;ck(w)tM!`CoVcF6n*}eBhn-g?H)3 z^X`S;-P=56eq0Y<7{BoJmwCClng<>#Zrb%F^I!X(bD4D);y3Kuu`hUnbhh}t*I|=m zq*(W^Q(G7@)z@(Cx4C`WT)b7)zrOsGBU4tWmzlirlhe{RW6pb)u54EiU)s4yV-K5P zyhY*TLRSvIr1?H)QzlP|JFqVc+Sp>NK5%h|@=_->zP*s@8d)53dgy3(l% znKwnUPYyanO`CCrh0Wl&W}0G z^QOD6cbq-7Oa9-yCDro-OmyqYnas6r%#(cTl2Xqf;go;F)xTONW)1V~f0_S8CUL1b z#agIEv$_WLElvt7y!W_Sc~#-2o*9Q9 zyzcXoRbS0w&3oTTjt^54cBv;{mh`mQS>RK6WvlvgpV=*HoT)~6G3#c;Yjv!B$i@Eq z_J(jN&WY!i%t`OEi>_?B(YX0@uyX3s(-UM}WcbWabWV2tE%w#TO!f-58(%4(e(Ox_ z53P?+)tvfvVxyO~-Za}s+}x=PuIpS&v{)*zRA*1G*Kv!EEwd!s@4YhecrJ6!QhGy> zzo1uf*o+I_X2vxRLMx8NOlcLfvv_~l>&UyW7i*2Ae;`&YSf5HpioEo{wGRkKbp{hu{CR-EC>@ zwb}Bqx97%f4UseM>Wz#$>3Vzm(xYZ#@!pLQQ|flUd;2r+X!qk?d)%j)so&nJ5h8@6NWXlTSSr$qi{ULxjJ{rkqQ<4@bRM0nJ1+p_9QSb$>Gi6qr)Uk-WK z&Hr@lbk6j(BK-2VSDjo}#=7|AivE*NKeu^4jMYv}-MfMr7wU zn_Z2+n6q2`^gn*F*Ei0u&dT&tyT4OnX^{S`uRBU?Y?6!KwB}E-`g?Ba8Pk+=PG$Ui z=N|R{{55~?v5Wsr3e#8j^Ts8Y|BAD#eWz@(`|ZE$+vBhQe|@){^})B?H}7Jfe9L_^ zxBT5J>HGzIIPd(m3HW|ATXNr>${IZh&)$I5mXEqmq zd?%aoJo!$v+pn+jb`ri(yX&@enyo*c-hFQVjkUWsWqhlxDiATRTmR)Z|Edy?7q9E` zgTm%o*=ODUHhtHW_=shDO84x!aa)#kT|c*^sn{OlFvlhD7v+e}J$>@d-^Zr%_7#r-0;F9w|1eCq;*n^r``M9Euj;`be|vJa7W|foR&+1(W0h{&pNyRuTbl8 zcal|@G4ry{X5IGJi5Jr*vux(tX(H}rI%{d?`U6*+qD!B=OG)s5E+)n-tW<9BPCdh_ z@qC^9xA+F{{D#mMH;nRPNg!TPywRxNYL; zhwjIpY;)a~{=(J!|4q%=?6P0EO^e<}2jnmOYngfZ@oOQ?Z;CzzyY(OE|50BNbL^I= zkW$|7&^dPw{0UuD<bC01Or2AHXqlnL3Ex9+eP?toNZ-5Vx$VY$pPC6D zzn%Eip%NNBx4||2bLP`^PImE`G5SSyQ^JgH9zEB$=$4=L?W%vDmfV@w^?7OZvN^k* zr*2MrtAEaXvCg-{c~|TFwRQ!xcyGS>BP%^m_1>&S+oxXj<4&x;GDlvoR`Sbc_S?SU zrk^brUpR91rR<~C2 zk3W8Q@1M$qzc+vWbvK;xucz{}erWsSc!xh*>R!hmE&kJ9bVw?8WDD?Z=3Dqb7QHd$p? z?yGH^e*9f?<@LVn+g{$;vTEkCh1oXGT)b}Xl2AR$lcpm5r*aX~sxz`>sc&xTwWct8 zud7yKR_p5VN?cu_q$#-gCYOMt*83AHa;-!iRV+IqC0X6)w=t!O@_uBtUi*H^B8ikk zDpCszI*f}%UZ3@7+iGi6mK4glRB|cL(Q_X;xEc#tr?#)PU3iP_%)+h5{iIsHCx$%I zujk$Su~dV{^4EP>MIWCJh`!o-SgsO z*GZeVHYHh4^?1lTeUoV3hh2uvYuYq+w1_HmD6EuLSu;)1n3FH+;ggL8MJZ;h=H{Gb z73Yb~yKq#>TwI0Y&TqSGW+$FXpQvCjk+#m<;IzT!xM;P(KF+77XY_5n^021)DEFHu z3j^~K{^%~*qg52y^K4&4abr)_<2TMP>nr>(9qyg_Ip|NE$uHqI58@B7q!e>Z7A)I% zFsHf2FlZi+_46X585e!HkEp-dp)CJ(iLYDei}qjod--~QxH36UNJ@xfXfBB=5HgJZ z=GN23;{N7yLxa|rTs7qt601Y|S9I!YPun|@ol7%!GUwFiZx%7iub3t)W!=|rWi;>J zlxI1I*X|VFUd&ndL++a5yI0-I_D$J$(B;6M3nk8pcP#@%#kyOHz48n8yb5SMRPAXw zgGqDs6}=np_AKM;`}ShaA@@Uh$L!-aRek5*Ve$LFQT1an>;Dhy87J5CFKPdw&%W~9 zo~Gmdp7$$#KHuc}`O|Xq{_o|5*85#-A~*aC|IeFR?jvbDRr}_>lXGG^=FUm;T)53u zU92=?&Zb2hdL|1r9m}{?wo+vIN|94vU3cH_|HGb_Zo)Y2n&?rLC1qRJ9?g1MQh2nU zZ%gy}&2Jv~v)^Krm_Pm6l>K#;-_mvM%+35iUp{wy{Z3W>)9-e?spLF2%kA7d1(`$M z`U~0R>-WD(T6sG#HTL|TmelZvFMy6lJI@{hloyTwn4f$z{n);a1M6pRbiP zD6I^ieML3N&EoaaW%5>XWwNi@^)*Ua*R}A=ZH%*-vRPhk@o62#;}!abR`zOpX0+U7 z>C)wBn_Ir7U%0>DRy^BX%snf#saQ>E1=q6!S;zNi%ve|LciXY(#>@#xkM{U4d2>Ye zYtOP{JJ`~_q;0cie$@(!ooRS)u0Vaosj7<$<~B8ND)Vt;U7B+3W?hNtYzaNdOX_bb zd^h)9TC2R+D&Wxx&C|Qi=Y(h;H83r6Gverf>T#)MhM_FGf%|>!R7-}f_k=#bb=doQ z;#osFv$&bB^SuehfnMEA>br_0Wt*tTZ8JNwJ@()S&Ou7>&^&vj$dmvD5as;POr zy0OJg+Bl8R_+X{G^i;cB3og!O>&z5yxgnj}ATTE*sL7afnTQ2<>xrU?IaY30I*;Z| zGoN`(dvf5(qwd)=?`dhQpK`&%Ox`?a8fU+tOX}tHs?Uf2r@93NJdgZVP%v+&QJG5U znaZ%6#T!CQ(z`Y)`pvxBcyp^})lV%akudIV znenooEZkg7r5_UdZb+Z2ZYs9eboRKK_4KT1zRCUiQjtp%Bwda~&Y!%3%e(~lr20&fTrA*Hu*|a2xM{V@@s1ADbGwUO`__7kFZAvH zY`2B~{T;!3b-!;O`#(SB?cYa_r>{F(Kk=hD@15Gx;t!X*?Y|fQKg#sx@}oDi^O@r{ zKHb^-XB}_aF75K)v0vWJEw`-sG^^q7uf=~u&27Kk7khH+_4}J!Z{Lu9uW ?hARp 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

    *5@1{%;M3A0$)qZ(A=z}G;jBqv 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∨)`RAdw=#6 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≥zf@R$L}d!{#|{{BBNtp0lZ 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

    =|uK5<70nUn-lXmGAk85qBt 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%0Aujexi!tGGX7v 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 Y@W!So+B;@4FfcH9y85}Sb4q9e01_dRrvLx| literal 0 HcmV?d00001 diff --git a/xbox/themes/photorealistic/assets/sky-clouds-v1.png b/xbox/themes/photorealistic/assets/sky-clouds-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d3d47279fdc9103df9ad9d93405bd4c723975b GIT binary patch literal 2021551 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≪;`}~Dd-$%EKBQN2WL$S^Kd&~KGPIe@?9l3YR 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ℓKv*v-NU9HDvuTP)5%Bh~rb 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%0AtN6l2&qvCs#!dKge!jkt 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%0Dj6opLco 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 z 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

    xPm6T5Q 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ňI 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 z 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%0A1>J(9kTXv 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ℑ}m<4j`% z$7~1RY>5fYhRjAY&K&;Eli<;{j*&@{e|P)s_UY5V{CoV-;^ZCa@ZHL@(=Xcp_b$yb z|9E@qM3MA#mDN{G8HBDLI~ggmYU|y(>FN8LWAl}jh9-)0YQL_FjX&~r+U{%I4y%piSf&VH zXJ$OevS8WyMn(loiM`b?Pg`_KDC?aMPe|PFf86kU`@h5A&6#4uJ~tM6wkl72IQx3~ z^XaqO+n4jp$8Cz>=$*kRCG;{!Gi3MaUs)4RFf6d*RAy0f@Q*P65&1n;?^Eg*ksDs> zD~&9#80>x=?$-GI6-Qb`(830`14rJhdtqvSPdjE#Y^UEr4?U~TTQr$jR$kkc!R8XO z+p|Q>r}V;Aug9xm+GlYeY~gt4b=jrQaGPO)O5er%`&K;YtWHgMcJtxAy;TO<%olyW z9M<9}ERId{mt%F^z!Y$p#stM>i&Pa7Os;T*4EOYPGub`VlpYNpTC_E#rFQ(7HM%x@%3{%*wgE9X(q^KRy3e zY}I$`%qbNGm$ZPTWrzd-HGB`W% zStsT4?zv!gUT#&~bc5*+w;unzc=rCiY zFZSjxrk^DRasF5D<(a89a|vA4e`@xip&?|gp8vh{&&SPH?$J?KSt0#;!S=uz$9S|7 z9v!eStUgw$d8$#+!R5l&V`&@`Gp5BxY%9Fk<}mGmPvX|hTkEbe9e+Aui$cY3E1C8w zYDZ64I%uYza&2&7?Cj>!S|Pce@yZPzPiG#@?2j9TW?AgNs?WmAf6$mg;hS|^W}D%2 z&Na+AeK|?21?g?hvTj#d*WFuocun<@T^+9kyG{Gj~)WF{SSSxzG$CJ2{Qw8QQ+S7i++8RomSp* zk-;H7d(SJu1Pf*F2e-X#d$#zQ%bdDUHP>p_+lPlWHYYb-i|sL96tTbB@NkmP0UtJt z)T=6IL^_#5-z{Bz>oo)Kg*6JshxYv8b=gvMkTY2 _mnz&9-a&+Fu`Hkf_5iOo%Y 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%0Dmn|1)02eQD}# z<^rL%1|LnPlp~BT0TZet9E6NFU2v3M#_^s_L)=l2^HafVwlu9jA2y%=_sV^K?7sR} z%kuaA;Bh_k`?UFe1)gbfY7RR%I8U5iT@c>wZ&H8a;Ou3KeYkkoMNi(?IOn!oT)^?d zKEohahBGp0X%cbECTeZs!Qj;U@H4XQqu<9L^?J80_gVeQ0OBHMJ?Jri0)I4l`2 zS1K*LwD(zTKcy?MyM7)`nHN)#?w5ZZ36jcz*fI2ZNihLQ-d? zryM)A<>b#kwI&?}&z=b!hDA3XRb)!I9+@F3=*zt=b~b4IX67-$!(P)OLIqeWtF}G+ za=LJG#4hQR3ARsT7A$$oe7R`WGN;cv%gy^|h_htWa`H#L6KKiZ`uus>&LvhacYRfe zyMAxW?3*T`0`1GwHFyG-rmPf?J>Pvsm~+uQr?~ky4?f?1u;{Sc;i&>2*lusk-2w?#YHNIo>;~T(0-yvl;XI zW}lZ;`uR2T!?VoO&d0>`QmcOb_+?)IfA;%*wVcm-l>8pYFsN!S5_6VtP)Uw?Gl%Qn z9Nub!V9(pLKNxj;yfv$tzC~GK*I$aHUO}RCeOU?xr#^?X3oz zPi$D_sn&Pc;o-BO(hX$?=ee z$bte>y(xJC5*AvnJeh2L^``1OW*`5$DY`f`G&I6zv&TcNF9rMW+?{_aCbH}6%_|)z zuSEDfTRKH3F*UAk&#bC1>ts3_1Q~L&VrwHL%hKBzSSBeoDmfN;~%}PIS=s2|J%BPCBckh>{Y92{_H1*82YfTbz4;S9OGgs1K z#kZhVfrnZ)p$CIfwGL-4{~E@!O4WUykHWI3m;YjR`@Pe8?7VT=hXwa)7hC8C8*MtV z*j#w!t*u+*vQ(cefA5`G8FTC2_qE-(GY_TbpIa~^+jZ5)U3)Fh=F6oE*xIh$`lIu-N7(}w^*3jk=623WT4@rzwpCrxykAQ0-t72mX}7A) zzgFxmiob>g|3!BbPUIC8{ZuX|@_vzFuL+vjDU3#1yE zCFJH;P8QObv|`d8OPSuphGS2KI=Lr!PYha?y6TY3O)m9{@*fWAj#I*-o++!BoU!3o zu*-jB|4eO3?(5t;btR5ROg?n$9BpX1H{sStrY99P6PI1QaW|(yNg%L7Bf|Yavdmv= z#z@IOg5f%a4KhE1RW4ip%@pMD^YXJY7T^u;Rr$0-_|iLG9zXTnd$cpp6cnBa>6xrm zeCO6YMLq|fD?0Ilt;%nw&EV9T$Dm}~bf{)cdtzCu$30&o>CNXj(>b`?k6t{je!K5- zcJoZx2Hq7WCwto0pEpeBV_NFLCDHa=L#H!4L{O~g{2a3-tcgi~pI;7%!y?5vNqpXI(%$bFZ-vD>^?%YS%1fB4&)YtoiEw#U9I z>gXg{eQ9PA<9o(fV<33wbDnSeGQ-Vw4yrwxX=;a-e_i-QL;c{TJG&!4ToSx9ajQh% zlm^4}b4i+yww+Msi;|I@6)csn-1w@{yp=hSZ_ZWa+|A9FCzrT1=Dh5DXf@%G$(2P7 zGgFtvFw{L+!L-iH=~-LJ?ej|KmCo4mz0?&rW8yz~XX)OHD{L6#w=~@OH-Fugpokf} zzvU%7di=vn{g;i{BQ>k#%FPN5J^WVNwhJ3@{b5e{aNuF6d0#&>o77UR)Y6}wrc+ZE ze^61mcc-;|g8nYlB&J>*Uw z-}J=7VxfdY_6q5zS%v#G>px4JZMpxr`EjDpx8pU3EqpEu-H^6eoUCxsWWh1ROX{n?32$L`%*yMxRVm&m3;b3yQq)LE>r6u}!&3eSn?BR?3 zLQ`z>p4;pxHdPCs@#ny+mj*FBG1l1Be^L$J6*HaJzJ~YU13prFL{6T6aD{h zmjC}W|No0$U%q_m|6MfeTzTI-TnXd{-00c z@v(91<7>YD47abGUamUb=qz_=(+uH%U)KNo@_he~pZEX1U0?rs_I(?@)9e3z^1uJ@ zjkm|1==XO2-{fUi{lEG6%eRm6|G)3wXJhO8^xfOTFHH)4b(csxUCG>?bJcem7k6~| z-Ew1YZi_Y2EqCKnqn4G=_YB_oX4R^_*F8_YJd(O7GiUY$O{PS#y~4(Z?hLmSSqeXK zY}FCiykKEsash|JvZi%PO)~Gcip3rbdM6gJ@!rymf;sgi{Es$d$lGnpdsR!KWi3U zu3W;>aX@$NsZVp*rt9P^vcA(IxwK`g)zyN0YnPOHN6&b#4YEA&=7qz%2f4R9S~(9L zayk;iB|LeTU-B|DvHE+bIPCizC4&#n5nmd3WCmMW(!GrL6Gb(Z?o76FmV0U)=>-35nk8F#Z8S!eyd&8qf-2$ffi}!hMz1COMcBil_;&`h0y4@lj z20?D_CI&hjzQ(>=-{#(*J@fm!d4_A!>~=iavDfiaa)O+*{%qy>j=w$GBqpXa$aZ)v zdm8foyus(^>KV-jzAf*5J$(7}W!2rNY(Ay(Ti^fv+O^VD$xK?Z{8q2)x4UP|jMo~U zzZ~=I)$Z(gfA4zfki{Qr)TSKXZRpUj{f6GgwN-n+)#gVBU(LH_X4*YTbWc;(**l?& z4=ueEb1HLXzTC9bMVD8qC~vsJGdnfJZoc}~DI0_pmvC@Tw>l)PEZ`S&dIN{)0wJXZ z?_L#LQCe$iKGi2^xx`_OA_uqUB{N=~I=kQeec1V+(O*tcij z8jp6T zcc%X7d;a|CGqpueEi(N(RcVj;Sr0FPny(#U%V)(ZvAP^NbGS6b$>(91w!O`n(=pq8 z@7Gt{{Fe4AdCsxQ`AywV*6_D$`L@_D5-V|DIp??%-|3|V@|o7jQf6M(jD~^YU4j16 zP2XzSom9dN!@JD;m+$o2Q5Y-Wvee*m-QDQ=wb?6|ue!VD^}d^5cL_c<(HG`*Z?`cT8DRaQIAlf7Fd;yM1q5mZbTbe%@U8Mf-K$?KBCVM1hMcC3aKK z-=A~up8oTdI?JURcgx%AE&udY-Y#bSS=qd4A;)uWc|G)ScRl#m=e?cvT>oOhZym8$ zW53J(4w=^3(!$kh>8c}aKkxOu4Qq8@zufS`F*x;ELAK8kr|R2xSCobuzuk7Gb@P*} zdM<0V?_7VqZEKkC{W+<2XO~yLyUo_ns=l&dzL?$r7loBKBP#CZ-VRk;x7BB9#*te( zO+Ir^Dg0yUuAX5fzKuhT!?{C!;^mbb8cfUN{H|}c-~VQ9dBeKw{W)nzZoj*`%WQqI zu2ZYvySvUFb{~&BZattAx22l@&E8KNX6ZOBtGjrtmAN7|H~e<_XNT9T_>9$ACRXrI zj!SPme(mq!%iG>No^dO@`*l+m`;r31dDA8>%DK8OExO$G{$0r%rZ*F8(vpsENHef= z^PeO)%QEblQtQmB>pEA2|DST6#BjM;{i&UrQr!dQ#s2#jJ~_#@m$6LcWy$2^R~va( z`ULGPP?~Cy&~s&%Rm0&A9R&)G9$iOtS*+DP7H>{!SvN$Z8VAK6@2c;ox9#LiQ9Mwi88=iNs?-BSLf$5Q8UbjeP8n2%WtDvybsn6NB ze|c}$h$-;CE+a9aeKn7-(khiJM{5+McA9a?^6mJrLE})nMY)N(&y@`Dwld!PTlKi?E(t_?X@4q!HJ>0J8V%6d^IYe`xtNC8un#sQ{6>^=7S_~BSy}7TX zF1+}^yaoUA*2q)MEF}^}st#tec1Z}c-|^%5eB#3l#=wh>l8PA*f+`I*q;KYu(a*SY zkU2$OHuVF?+!O5ciY*Gu6a9YlcHYqy4BcONfi29*{9i)NEtX`N0_AD42Oi9L&64mg z`n4{K=^zhkho^Dw7`92fhM z8EekWVg8w6*sp757uj{&SZd3Pk6$LFpO-&dBAoK&BYVdiSGV>VpH|vgbM=3S=x2De z;Dq8GTYg9G_GjWpas_!!j2m(|6W+OQSh7UxMDzA{tJW?1d82lR{WA3xt`)k$iGiWJ zBUza>pQS2Y{*#&Vjzxia6FX|=H%$^0<%=w=tPbqVE+@8eIuWAQVmNW4AZn`8;Y-Il}mx=)$N}Fc4U9A%bgcHZHZ(qoc?P~O;U~IHyLQjoHFJ^n$&mYVvtD1D`r75R4CDK^ zW^x@YE42^n#&k9a1-O2ec)`*d=+SnsTBdF(L$y3le}L+a?`(qWOl?*)y!HrW+`X=P z#n;@cr}y2N`r%X6-GwWrcC37B=9{!EEiPq;%(N|DEI)!-0?v7THb_^vVsx`+g2U%C zlHY{3|1#>$=(N2NH|vL2xrB+PX33s+OY%w@Z-=={?TkL&vW zAy2`5`_4_)-_4etn6fRAqda`;shm{}6IgmR&let%{eIR$Nobzb@ydTMB^qSSPZ{zj zs)@{;er1b66Vu!^9pV>*W;9%W8S<>Ce*c>6``cpA);=oOlFfYZ?warB`F`CA@xQl~ zrp=tb(`5BsKZTi&pCxTpb?i~uTxYp%o=wwXO_iGcF>&+bZZF$g{XUED`{J7Olj;h} z9*ecQJbrf~?^bodt>%W4JbRNQ|BzQa^K56`*Q2xV*ZeKHyMFP%Htx+G zPd0>{4c54L^-NF4^rgGDzTOu;@%ZoEpEHxnTc&z0xl;P}{=W}jz7)N^X<#caY@d{L zlE?b$0TB@k-KWd*<=?+cdz*W|oaJOlWXk@$TenIkX%+3=Hhp^T?b?9k{9X_rv9 zL1)2}(CJTv{nSOKJ1x^wU2-8MFni@?_3OodCKg#P6>xE3O>uO2XQcPd;8~zlnmm(O zUxZ)r+L$h%=aLO`vQ+s@x#G6JJ$(H6zq#+$et-8m?O7tDn4?9gfA2DWFO z=gNz9S(L=)O+TdMu~0kMBEseOHl54+f4~2CH9i0Q|A*`AfB#!r{y4Cizc4_h{eRl6 ziBSu;T$h+RiN*WRS?9-T(X*7Vcs#8tV={R*)h@iQy8hpvkAHq_xHI=zrPkI0mevif zH9vk--HqZ}@p+}t#DZDtj@W#@-Tt%t`0n!j^PiR8F;4Q$eSfjKJp64}q>{~--CeE%QNa!0UN6g1xG=Hv&9j3c%YtUKt_+J?Ry6B%<}@qM zZOe6>Tz;?H{cG#XZ95NNO*W4IKJO)uV8-rAw?nemy3AdCBcyxg;aC@&da(-Atx$ed&)sVt%5Bu% zdfs)J%yNU)V1pH#7}xJsni+AX`BH6hzZFxd!7;gs#s?U7&D=esT7mm(;n&(7`td|Tjy z1Y`YTVJ3}A&V!G?NPZPIibqD_4 zob`l(r6Is*YSEKqHS3Bdw!e^8$xN6pIKO$>0e1(X z^jpjmpZdI&FqMxj;G5iTU^zkSo-@-V)4Zr2!HW<21eJV^kGBU&djFUmJXhQ?Vdg3E z_wQuBye(h9ezlQ`;D>v2T6!N#U7umZDy)!>|4`XEd+GhE${Qj$-SQ` zv`@uqgTaxHv-)pM?a0o}%iXG^I_c=lW70oM9hI0@iafK}GWqdA?`?-W^JMnrIAvBI z^zkXMNIoOW{-<>Ilm7o|W>dagiHS~L&br{;z2q$y%^l46-hON7nk00@@7&_9zb%iF zYSt%v-pg9cTzhPxLk|a=;mNy|bu||I_r!TW{AkS0e8RuI^Vv>=iTrZvR~((**@;%} znBBY~&V+&YGh@E%+M;?p(Pw+VzTS0tMrV3huz(^*Wp!M*bU?v81rv)Z39~hm-t9kJ z>Gkm5S)0X=_%zz{kDpUGq1qzTv1RqKvk_L|T*5|c4P*qxd}L%g1DUrUIdw7Vj^5KF zvyV-aw__-AP%)fvF(s|wp7<2?2s3HU5S9SG6O&&Ezb&lMU=ZG!$~ZH+T4C5bT@t>E6b)zF6tUIggiwxF_9abh#1~6f5*l zrl+~~@pf&~f*9++pw3TWg`V>v_rZi1Ww)_i}5r^+~%sy*_ZbbHX-{ zN?#$qi93Rg3XZG(cR%v2q0N}@hrIF|rjsIm*;oAA)h%Rg`i?(l|28W?wb04U`JJx< zKbyuO>l4*N?2Ap+PkP!4G(6If>v4D(%cWobaUl3!uCc`?cclHoxA`45BwUxcblr`EQN0~Xa0_gmML_-Bduf{6rL7ZwsPGx zW}oi@5vTUyhJA|uCvK{zjxa1 z*^=^SYUi(TNDDo-_j%67Y5L`x&)aRBZ@*)~nRjO@-Go9y&zD}bRrEcXeevnMJ7=VI za@KXEICf~ke^{=0v?ti;lKmPvS z*h?yNT3aK8xVJ9zz8cbVSM}+X&E93tGLHwFu3mO4!X-2_?Udx9O?TOL&e!3A!4=m`_k<^!b_lFTe>_j6hsg02au z`^@B=q2^e8_L{^hzL%1`jT7CsicE=KR5AB+o{Y2Cs~&l!MR|XuF8MqwxRI{D<=N|? zz<19tX{hhqqvoj~pjzQ9G(+iW-Mj6t-W(AV(c3A&v4pjTL1=-5->zxF=F=3-ve!xp zKh;qZIu?_4?3PEvGafOa3Z}nnb@>=#I*8SLbD zJM-R}rRzdNdo9o2-g7(XnYVFpwEVTphyOnOw?XFml%m{aYeknnzT~y}Qq)>KNdeWg zsOw+At`%J8SDs z<`oOSym`vx?D9<0zgVsOWX@Tym9H~bW-FE+SU$&Wc4ueV?nwRe|KyB8_HIPbJy6gmDQ<8#tB&%gIi3M$N8eRb7qF4LsEs}VCSX36Mo-I{gQhcR2s zKW*i+4_l|GNLuJ_bt!mz%qSr5UH|+1>6dKOw&(Hno?}VjQakCSr1ECj@3UW;-`D+k zbhPyHrg?s;nOijtvu^IZoj1FDcTGjaz8{bNhOd9e=e;`Zh?4_{?po7;6T!OOOI&Up z;89+GR>q`Nxw|<)QZjC@6m#VxojteDt$Sr=_&90%&K-BQ1%18oOmid0!OLkvlPb?K z#B99wDy!1C@Kx}g6Zp8t4i zDZe9&%MH_(ODa!(@3q-`V_(g->W^=f*#EY2I?aAtVs%q7>-UG+7m+#V9-T2sE%Ww$ zxX$s!syvSSyF?`B$xnafuuj)_z4z`LPcwydugYdcU7s~M<;JdcI(M#|+Lib0OoNot ztB|?;?Mqj#mJHgq>}qXf*2=P&*Sog8Fbkb}(DGuM@@*aQ+nLth^ENkZ`f{f6fzzhI zz}1knG{)=7BwUOCshqh*FNq^#Q6_+JZ*OEf_&WiHC$t-9g*yD5hNRCccP0X#|v)i|qzka(iie<}6*1z`;GU=Vo zm%lb;hNsSf*)O6DJrX5++AjLv-nmmow0O>yJimn2tmjX7HU;M2%3Y9g@8!GXloxXi z`VVp?9%$#exbpV1_T&&RCqd_f>GOB^g}e}CG_fe;nCH@Q^3R$LZ=UCMIRAckf2Zq5 z%Y?a!Ne%3*rBfbC-Li73_*!hzd`~*y2*dWM2~$q)`KlS`enzl&-EP}cfisnpjZWFf z+glYBet*~`KB3&^F7u-$0xwu!KD@KBtkQK(k>9FiGDn1q!v$7XWv{&^(BiuLwMwGJ zrQ`i|*JKzuM9#4bw_B-*hT`%<<)1yNCJuT^AE z@Be4Jw^{A)uN?-qGOwfF`I@fbd~WGF>EfK2t69a_YLQWaYuCOHdBw17%C^}zAC_)S z&Ac|TP}yO|-8C7-%g>s~UtjcU@lN^TPl~HJF3<5e?sX>Nxu=TH>lq9|Tf^9ywN4}# zhB`krpBHslqGrx1I*}hIPXg}owk3ASdx$I=^r-Q zFO3k6*f1|yma`+~fq?PE8C4bv-@Vuxv>v>g)?(|T`mW>i^_a6;^}p`B z^&o-Ia&uPz&*91*;aE}IM_qUBiWYy9|NG;k;KTp2b{rdZ~ z;K%m=hu2SA)R*$=b6wK)Oztg1uO(4zwXr!SXi*~lAZI{%Us5f zQd}+5v!7)@ek(G4?t*n^=cJn7+;#2Ntxd~x()R7YB{==|?5n*+lcKr}Y&OKUUu`LS#$ab{Rlu!oh?qa)aF>eb9yDcj4%3^Y0| z%EWWmhwm;gH(!76-rYM}lbqgUZ4FU~d?GY^y|?j&HeprYt)HSY9$mO~e5d${y}J)i z-Lr7c8WCH)?d$LFudEGUeKqaY9ocn!^4s-enyn2_JY4WjO)_`K?p@v@>sPGudvcC% z^(sqGrt8mibb4dBJ6Tv2-0p47DlUIiuyyrWzWr5Sf9A)Z*R-wOwg2CPpGQBZ-&PNw zox5+w=hgc6a%SJNyR!TC(FbP>V$R6yPTsxS^4#vZPhNd(*rS*f(HOQONa%^np>Th_ z@2~q_e)#uoi(Fsl%In9^91&tlD=W`^)!8v=RdgSxtap;vldffP)3V+zH3`k$D&6ie zN#c`m)gw=@OJ2FAXFt0r6qjzlmK7P6J1gkYvr=8l?kAaEOt)s<+H}qCO7B(|W{Ks7 z-=vbyFP7M#{xC}!*6b#z2Lmj$c6jyWb1@?%acVnzjgDwe& zF*5bDd#b5^Pi5x(H)gY6J}UZs^!oPqd40MDVQTqzn>1A!8QDy|JCFbIlD)!{@+M`g zWZ>M1ich@PhCa94o#mCOt@6T(OYmIqx~(g-{gPfK#Abh4oT$Q>d8#w%d3wOPlXLGJ z;8X}ReOII0wd2>1cbc5)egBTj$}F*96Z!r3&aJxG>x!P;Ggk;U2F=*LU~_c)ByK+; z$?bpj=0A-;?8uegy=1|~cAG9K^RSowhK-#n#_Dmirj>u6w8K<6G29~2a$2gUH@9-E zf2XZeUW-bg`qUY!-|m*(%T>3C%JnljKhsgLa?&Q2Uy7EO_|^tXAI|PLc`Hfh{;z9S zx7**S`F3>oF~f$JlY2IF1;33;VBk>exgu@W`D%G-yyz7{nYZs;?)A)&xIclp<3rk{ zGwY&0+iX0s%OqXq`lo+)KVIE^J2lrgSH(t(yVGFv`?Siky+1#^Jox2|g6m8TvVzUxNb zv(BwQqgFNY9S@3PwlrL38G7~d%6H{PZ&KO%+f7s2JKc;CmXFi9I`jmbi>N*{Jul;?S4t`Fi(rS zx^n0J>E-6_zaJNAEc019vn_DTlEi4oXHOim&&fPwOW%>>GiRm$0s+Q(ete510&9vB z3>B=belzp*F|zGFcuv4UgtcJ#kKQ~nv3W)!H!T7;_xzaUpwgr#&N^XU;#LbE`M?S1 zjs}#sBnFq4E@hneFvn?$R0yk7u82UGdsb|ffm)l{tThQmb85dB{#qBf)?&}=X^$>l z_-QonV}oMfLgW8$r0=@#INhXV9qPv1w?TI~W+be9-{~wc8T$Px1?_`dFv#G^|O%YrBOphkae4xB#^XBuv zg0Fa<`nbOEO9{g?nU>A}So3rqMzXbY25zu9_QzIZjf*YA65+tgA6=dof*KmH&TCzF zap#=ErbaP~MZbB}4}HGcJO7o^`VIHFd`$U5Dr9Eddg=UpUzN|brkty$cIkTzv?`^} zzlsoAJh!YocFNAwhbnVgR5zOYPu`KN8x?J6e6?Y7<~(CV{cPQ<*A{IrcW+mp<;4>s&)GcHamvd$yXqLv>f7&G%-8w9 zmV0>ahW0PlZyt5a1uCtTws$!hJIj_GX3%~-HRHogHbH%ci4ym}r?eUO-Lfxu;=o(5 zqu(hhTW*Om|MRsDQS$Oxl`&Hsz9+r=Kj-?S@6x@W#lIMaNiJO4pYBp$W-wv(!S~&o zo*|bF89Dnp`%ROXt1s?Lp7`yP`H3Wp|C z)G^=vSSPhmTC?Q)tK+<{KmL4a5%zz@;>`u}=Dg1>FI1+#*{*v=?~KzF--oBpK6%IW z-cj*gL6Vr%b@_wVTi;bB@F^DU=-9B~Tf@PRb4s%k80I!k`L3FHcf!M*kXx#^6_c3D zkF(iN_O*IE;gQYahL_f_`2i8!;(xsf#4#y9gEt+ zW(ppwabbBjBi~{{0sHGm^XtE*#mWVJ%CCR^=_kAVfe+&Kzq;EW2S(?4?SB0vjKADH zZI+O2{jSPiN#?neb~Xz=y?NC!&+@%}%}$w9zsP7s%ugsNMJ{-J>7M`AbK`zgc66jf@RuV!3f&a4o^;;0h!|JtE{98NZ8E1h$5 zFX!#vxogX+4~OsOE);Myeya24%9g9weyQv^UwWgB_w-H$o92=)y_@^o{QX}{(sX41 zJA38P%kihuCimXFva8{|iI;5vlcvW3p747TvnB{XF0~`6kSKkT5MX zNh#paoP(bto_XsW|91Y@K^-0~v9U#7O7Bt@zGMoTG^3-qrH)VKc}&*9 zho@KG-DiLIj_kYsU#ofE|-fK7hG}@>lD9F|l(c=91;6Qi$0pox@ebnX@v7r}1!ujaPlmW|OyvU;52@oOhy0agyYJ z17Yq%TbBNOI=TDx>9^tW_YH;AFJ@)ko3(A#nL~%Rni_|HjnK&lBbAs3QwyJnfn-WxZ;HuL;&LhIttuq!pUjOj9*q<2|?-!r->}2Fx zdv%4N&x~!eI~z)MA5Ii`SX}G;rhR8M%W7WbsS~UPn|JnqIVAXajc3<=aW?5G)s@bj zGZSAmTDX^9pJlGQtoFW9d2Uu#u0cxc(ZvT-P95&-Z#~;1{CwWzSDBMCXUz^{T4s5+ zxNnz^sv_T&xsva0o$*-mzL~{AI`r;&o6Xar<{o|EX|epGv{9*lys>9R-PYYV&ha0A z`Yu4k$;U6RYuT+US;pqiANI4dwO-sBU~}u%mx`#_o|$%Q&CXw1b@#sB`}h6r!Li-P z6q&Xcn|zp(VgCHCO|JRFv;Greq^B)iyLIXUIfJE|J9n-+xc8bDi{D-O*_Kb=DCE6b zo}8JNwjpbk-&q|Njt^6Ulk~PmF4kPVa%zxYsQ1OoE2o6bc=1VT`I)6JGc`3+%XZa9 z+_Rn2=h_+UwP@=qsm4`R6MV8wi`AEFK2P`m=CA*Z)9n1F`{z3?(iIa|zADH)X2`jw zD(2PSm3wwa^JVYeslPPhjjmzMt5>4mD<7SmvdN$!_3DMUQ^nG3Q_fDmwCY>gu4#E@ zYx=^@9@G&?%ub8CBgLI*e9rP|8BJPUj z9gE8!cl(Q-*&U?%W6Q$}HEc&_Xi81K_|Zy`|Fo>jQknIZdota^MJ{&~M?Zh}?2Mt( zmjkDlp63%-^l9BZncJ=+d_FCL_a(1%>**~%K67_+MQOJEA?3qzi&ev|%L@$3C5>hl z99d-Bq7G_R88!pTTU#J40Pc zMf!G{#mAl15#~F-bF(i05XgE*u;lHJ1$JHGCCeAZ3D3J}C$c$1Non)v`^PytJA)qS z9APOocYC+nxMjkU&1+qM{CoGs^mpC-8YTa^^G5ebOdIeJGQj0M5>`SY5OOu1$Y}6@u2rtNkj9s+Bpg=GJpI+GwKmTj zkDq$?!?h;J-d^Y(o5jHkK|(vGuUcE`{qh3;QDxcLr<4^gm40Nj|C-*}xrpm6lT^tD zEt#Ch_X7N@8!jX_3pDh6H7{Vu(zAVbjQx{aLH;w@E}6rJcN|UDUe@^7Uh13TB00Bo zk>*Tu`6+hN{8>EAzy5i>%R0c2X}fKr0N-xmlRqlwM9AC;?Xvst{@sN{OR@++w#=AF9>)~GHrI3?4dnY?0Ua`4x>|4hQN>kO|wmp*qd z{CmW)7aU$C|3040@o76}TbCm|*G6Kcv!FXG(e$|jOXSM=Kk8rH5#iGO!s^6~ji0wKv%PaI>cR4R zooDuHIG9g;?UDOLDmbO>`{AXZ-)K3wImwDIelVe}K0qST;*8+A2U}zUA8(%j|7^9%d8Ipd82wk?uiR|5{M+OAwSUy>|Ci6R+h6hf>F@RXYrc2K@2M;P zTu{Bg;2c9}E?=4PdzV0V;VV;T&OFL!DmX1}l7t~Q`;+B<96Eu#^Z&oPdf58s@&8Z0 z*Z=3Am#4q(-zWe7&z^-}-7r^Q&G7rGCEHG3+2R{4mKd$2HnEaPHJ{Hb>h0$!UqLD;=6g;SFLWk_3+ul&GB_V-<|DkF5CU~ z2h7AF0IS+)}pnV=Y>DJxP^IJ>iSGF*I7^&{^{6( z9NtxW!OP|Z{QdCk+uzsM^QyMq_qPl;-o1airSbF3{SzyjHf(j%Y(8r{m#TN9`?(ME6==4bF9qF3w#(~nGJYlVmIFVpqkJm%s^VcNJ_$k-y1=Q&4W zfY6b+bH#PD=Dq!Ped*S%nVL_x%!*uHY8hsFy7T#4le3dKme1+9aixNzOhf71W7*Ks z*wVFedqcN$1?}lcQU7Fd>R12w;Kk<;&15w0PxS1`da#hqkayWmr>zrJ%tEd{^6hB0 z35jYxd}g+*qBBp+V--W|Ig2+jwd~X@v(fdgtS*mVrg{JF-TU|FW_{hda#r)wt!heB z|CC&j{QB^lg}+W}=IdLlt}orSc#Z2>M#hEH)Rb5v#hQzYER2Krj!0{swpo7q@3W%) zH*+tiSsyJA+nRNak6SiF_v^zAI^K>AJCu}+&KIB4@eG=zxqM2}ngt8R1v@vysX4T4 zo2_|Xvd_k!<*@<7%p{RamxT9ug)f|6#a$6Tbh!U_iq@&UiK+sd3vC`1vM3n@pPDjh zaeG3%&CNd#%I$2${{DKq(M;oWq2@BbBRWrB`4k-6`MO&%ZvDUA@rtgGrJnk_U+$C@ zGpLypd|>g71yZJ47uD5kY`yl_EcY4DqD;Ta*`KFO-zv-h`tII5v!B0`W*ghrZkqZf z>E5~Z_wUS~rsj8B_Iz;GQLoT$qt=zxewQtpozIKzcFWE)^SAWeAXGIYhfA<$_K_P? zPyU^Aed%moVGYlFae2!tKNU##r|B7Ud%;!0i0v;(as|ua8^qh3hiUiCs_zc1GIf3EFr|7HL8&DBdCGldenR0Iy_+}J$f$$7o!@-@HyoSb}jb-4Nd ze{X-c%Wd%Wy7p_qO8?>&=EAjNBAta(Zg4zXanvjF)|<1Nt@8YzK1+;^&OdWTXOShR zN6(3*dwE8Nnl>9{`oD&}+H_^vs|9m5J4EFcWN}?R<#Ms2EPzS zJon?@RCvwbzpMJ|vm04m>WPtBCv=%ik^{XSugzE ze{B8E%vN%2?hgL7nKCS-NUyHm(092QzV&L$Z=XcX4s&{KWG23eF0gd?lQrQ$k;?(Oc&5u(?+H zx><*C-v;@2A!@H*MmHW{k!`(WJL$AxR5pK^n>;_uEzvzLJ2V@U>={oa-kP(xT1MP) z_xjM~pV~|Pw$J=x_)hYD+THk-!A|Gy`7B)6by!Qz_Wi6Vqj04~2L7*(_Ixg=>x{mU zcp`DTQCols!^}p*FOw&nvzc|g*4!stf-$Ps^y=~5iIorEoe4Y}mhU#_1d{<%b<2b@FZ%(dHgY>*XO$f(k<-5=rf@x{f8rj|ns_0I(D zK5w+9n{CbEC4#G7Tw?EWJR-ekd4rDfg|E`(bzj&%?5{oc^{PLMgYKr=kCuJwmpvbz zmgHtW`MH4jm%^O}M~#i+{#>-nv0;i`YTfciL}{ZjhfMYX_7&m+GlgbL&YYg)3rUpEGbhRtXZDl(=VYUuv$4u95xu9X8(&*W0xHz4NAfn@RSo zAQLmO;u(%Aaz3v+dzn+V+?bJ6bH7?@LjRiE*Cu=J6`$&JW_fKP6!jv#Oa)j zC%@OpEm+;2AR;?^*~XtPr(bON81e0tiJDq%;;$b&GoI%zc&^aEYub@*^x)%X!x#7N zN*F#9Ywop@3v&0`bobolBZmqOzloc@a?z}-i?ZBI9z2pLIV!PA->4$}mD2C~vkJZx zn=Ptd!~F5_P6__Z76H3QEfYHA9Tg-Wzp^|QeDCM^Z)fMW?3(m2$EZWk+;M{jPwfI7 z&qJ!s4_fr*_dVBDRhl5MveZ}G{2CQOgfaaD)x^x!^eBOzwTAH(X)9p z^}w3~*){gb{U_{;{yzLZ|8MjD|A#gG|No2s|K{si*_`i-^Xp%Kd-m<>Yx83l9-N*r zyK?ojytTUe^Yi|FuK(h0|FhZu;n|h8|F1pme!uU}MgM)jf2Obhf4u(p^!$5rXK$!( z7uX%SVuPhzT9Np7!8MNzrXSefacAM$EnlCUjCMSylr;a}hoj&3|3A6C{=>?thj*Xf zf9ct8b@9_u-1~B${W)1aukOc7_RLwToUbP>4HTNC*0NDuxNy;?eLw$veH~tYMl;o9 z>oONM!5xdu^7;5Sxq3~R;qYP?o0HN6mIVQ;_x?N^9$)|S>fyUdS(YE&=iAhNySQ|k zu=>pHmqT)P?~S@I|L%R>^0QT*yQ7r!r#{b|tzVvL{yS53)09??U_Tqx6|>Du6ns^h z_AH#@b2h=pWs=9FUDGf5wToIj^PP6s(c-QCcAM0jR=$^a&Uks(JN?9_W{vbyH?N+! zbB)V9c=BuRQ<7LQI6ZIg&)MhWt#6?nbpWcc*m-KS$$fBo?F_1)9UZO+F@Ilg}B zqLX(zI z$9X4xic9gS+jAT~ls)vztBN{(I5YCv(;YJ^HO=xPpSftdov8hApWh(h`4Ly%Q*Rbz zty^$Hq$t4umT_ys0{z+}k1YJPf7L$uY@xl+%l@$2B({k&&4W$zpZOl%qjyVFsp}2P zj>a<`Cw=bDaor-xtyxeW!QZadc{N%$%g>g3p3M=StcX>5v*h|*^ZKq|pMC4r$AD=| zC0DHRy}B#o)SW$BUcK5A=DSgOw$^eLpV^vk%V$^4T4vdPU7{g#R!DB_>5p6VvURua zYK$ln6P&lq##i(Clu2ib{bs6ivPOw4@$SA8p7L;k%EVx`66Zny`obfvwtF&pX>h1_ZA*75Ie9q+R`BHak9npb+7KQPs@tS z(s*-Y+O;zlO@>11&x1-MZ$)K=UQV0s`7Qi&-R$-H<)>GsJUlyR+h>#9qIr|7uPrLy zetfH0>-WUVlJUyRpDA6rqxc}ow{vF5O=I?dTW4;bHFK8AyyaV_J=>eETs$l2UXFR? z_EwJ2>$jYCcoq0{#@@A62e8aEl;CKQ)XIl-sxrKOTC}7Ohdz> zc)~Zw333yky9kAPT-evN&#ysc;l1tU#-=|Ct{Zi)WGY>})y`%5jLwoqiJj%bjKSR} zj^3-|aad%nBUI#Pc#2Qiu++P=*h`c1ObVCMK5s8u&Ev5`&7RFO4>(2M;knA=c2q^Z zVT~3?gWcaBuiihE-(UIvgZciQ6VIBZeNsuho8iZ|{chQ>4@aNYCFQ+l505sg`o7_w z+_d(~Ql}Q&NQ}5KyU{t4tw6=kBE79LGHQ15q$dk@w{P9D)MWQwdzrpcpL5DtTvvYT zOj7w!7IyXWBgN45OIfv7u9|7u#3t<(%WL*@O7WtJf399}R8dL{tB#p=sb|%*IYmiq zx#>G^oj;OyHfYuzpV@2kmIp^(Tf}DZ)a329lcCwhVv5V#cLz7#v7K_+b8ckzQjL8# zLl_&)T7}fRZicOW`jGMZ?mhFDPdU#de0|wg6Ju}7sllC^FF!``@h^`GS*@yAUX*)b z3Tveo&#m{Dk0?}R-&@4fcvVa-K*V|<2BftP14k1=guOX$hIe!SXOrD&mFbV$&uzKG&RgS*8xM z=G@#)N|P6ewoI|!aV+8WyVAujjz8*3+zNJZDfFndtCoG4dvB*me|CfWc6TMkqR!us z3lh5m{9d)5$w>MAL$l%By@#bLidARkHD$_~Uz)S$`2uftRl_%ZI+H>*|FCEr2uf<0 zvH3#Uso+Nq8zvpOalT!V`9k~iHlNQ&-GX+-zPfw(<(6&c{L@?MD#WC$0H*fB}FQU;{ zHDi4{w?dHYHF`offmdHwsX zO*y-fV=G)O%XC1r2lUG~vAeQr< z>jRU09lckXmw$L@(thl^+>Kh7zdx(l z?DexF&;0oK*!QjoYD)ImsC-oA>Vt;H<9c3)nHleXQ(C8~(Y7X0E#a=!1P1kNHzlTW zBjtjQFV!!PKAa+-vu5ARS%<48ooP7F<8wiQ(QUEkN2`y$bI(Wjmpi*zoH13q7r4aY zgiceXRnZm2WBb0lv3#g}&$Hze)7?J##qOUH>-Vh)ekB*&@T-~SS)q>GZOKJ?(hNyC zEsUQd&*!{dD|b%)Mn~+^&CiN^I@(wrzLf7h*_~>A;_f=W(kp3)7982BUJ{gfmhs+_ zW$T_TTei0F`^m!GM*UJdMj5Yt*V3L{R{3}^az;c#N$RYDTN;WYIubSN1cV+4%m1mzG!%n59@!% z|2g<|^4jap*>0M%Cob>{|LI=;r+W9@KllIc|NnON?8lqTTsJwImt>#eVVk&m)+&`m zL!+iH;mHlxcKv(7F8}YH|NiQ)Z+`vzdvMmSweq#En^~%N?2W$m^=o+h`h8U^_}JHK zM+M$Xj6J>Qthjs)gI`%yGXM8gDhb+dCl9!7yI24B>+19ISFcuVTDIz{Z*1$g>Eh?@ zYj*9tak@^;QKU$Anb?6lS%skr)o08l6m*uq%JaOmYs%M>sJy(Qq>=LIsbi}-S*#yf8VdW zdSRORy1w1z{GFaNwoRXXNPQ;%>rH-_Q?_mmx|W)%w(R!ZJmtv&P1CZnqx-H->|1^R z&bs#CNOi@V9-EKUzEQH>Y4?Z2rh|`B)?TUG&S>8`QT8p#UCYunY!<95n3_7>IC`J` z!G#}+n7Y3&Qi?nL=hPTxD8nx}vuEy3DzwVzahMq%7t?m+7PSOK0PIvx_&_lw}*t@}Ia|S#@>U z(p^>dz8o@lOMD(Dt@7mfT*b6vC6mi5mJp`N#Y+`#wxy<*xE$VjQ1@eI?)T$UPZTAk z$;e%Mywc2>;b>~^;&X1AUQ<>_ak&N0khKuV@eAb@$-I{$khS&Jt*Ey9d-D@T_NZS|cmw1YqyFOoe0aF6Z8 zyYi-W%G&wn2t;r7pDUxu$!%V``o*n`i8Cs{eo}w1@OZGTU$xx)DaTznTvT)d8CUOQ zUMtx+>A}B$DOqW{-7~6JO8q|J=xb{E`DIDWwOPV%=f%au<_T}!o%?;W2iwx+{?p30 z^P8LVXWcvdb&dJE!q}h{wr3aV8X4zKn`E$X+N@0mfoe(*Glh!NCaze%-1F0%j?R|Y znKKr9G0YKCi4!V#7rIqNOw2rZ>od1Rt&=V;nw*B7LMm;_!aF8e8yVioUb{8y;RS_= zo{r?Ui@kFN#S45m8Z7dD#UD8`#Zf`<j1Z!fVv&Vzq_HmYlg+}pDD=oUj^ zQ&mAfCZ+6vTzQ+je;-`tkK0?Bk>Ho)kb8D_meB3oef#db-6lM7@lUhm?`vM4RM*ST z=bK;u_1o36j^e@-?>Ro-m+h65D3ql1dxV!6d$(iSwrgUp8h1J(TW0o1 zSe~2`6taD(R)b1L+k?y9D(1!cUJb@GqfM1IlvH17tg8rJdv>d6sg8H);tRJoDQ^nU z-xe%n(C&13t_+i>0+X@7{(XCP;}g5>mcRcBtVlPtVtr=R@lxdT#(TQO|LZNx zKXg3wx6%Aq^7US|%YWY6#trSZl{1b9%5R_OQkJgX!KgRa=|X(Kp&j>gZK@a?SF~@K z{Z01dZnag5c^Cu>6*TMS^?u(bd6zGV=a9~sg&v``IeP;ee*}cgJ2%9}ms2h00hZ@c8r*`~FhYxh2|%~9%I_k#Ouol$0;M|N|R|CJYBTI`k|zQIDc z@X=0517T0e?hi2Q5&p_s>7Jy<+Z zY10SBHxe8d3J=%i?>KLG^GwHI9`kv(Up{PeXW)IjVg?s4&vIq|xo0HGPn_|->N!Q? z$+X}!w@ktBH|o_2=Im24II>E1-2sh{>>{oVi6sH|kK{RjmRzG|a#bVCJCrTLWpx)z zyq#UO#FO0zeSRBVc2K!{gRBX$0m8`H;Y<)7@p9?NOmQb_syu_Yh z&Zaj)e*Aq8(gl+0ZIf>XKK#hBxliA#_K$%6s^seuznwL>9rN^R?fhNRh2rAv3a2`^ zYx9(cmwL*wr9b+7WPh^%U1#=7;i5Bla_nBc+xXXc%bhciZF}F(Q6%El?`ae`f7`Rh zjEfG>j&JKoykh?3pg38rR|;Fvw44&<~E-0)8Ca`vh&4@^#2F> ztoqj!9IJfnwEdK9eL-CD!Hq@|KcsJbj9~gWwYsS&{@LFE>tGI6nce4aytbO;`k1Mz z{D-YQ_rdeZNkN+fLi5#6N~0f(hHu2Y{@hFf4KhF@$>e7 zST;PDHx-yZyPQA&e*L#sZ)bXsX7~2n>erVnfBG!! z#PZYLXQWrLF=c)%+7x78@pF+#t%dCUeY;nC`&ur|+3PPS+%vaxEy~=icy7UUMvmq)D< zGf!&QKR#*oxyc(p{3}Y{YH9F%f==|5MH0-*9o#+CY}e%1eZBg3cYF8Ww9T`>hNLc@ zqQ-C`>8Z;hgE{x^@BjJf?b+SQ+4rVg%i1T#&P8o#11n=_u=h8cX}%_qauBzyJJgo}VxG z?)uxb;=d`|_xl}h-?h(P*8g>x@!M^c^OmcvNX=cFvHA4s+($GTD?$nX0D$3?7J$Lj}$X~7g=WK z)1{}D#ci>1$z8UsKmMNlctTT6DSbktTSUjfre(&*)J594j06bb09KlvQVv0xVWWYEEs7pZ(G$ zg~Ag)Z1tFJ%A~3mQMlMr)_--_*~u;u?`=8-j2ExGe^>8yl=s#-L1KE@rZ4kt&XyI< zEf){Jeb+>_uD)C&G*e=qVfCaLQ+99!ZaB#xD8QNEaxvVxb$;!mDJt{&r=*_Jlrkw= zAmYM*`Of50_0Yt`8OJpG9WLFjpUA=X)NjVi^983eU+nK_@$7w?({nfYxn|$D7oHE& z9i}k|6}hZtUc~2m`T_IY*yq)qS3ll~>usAT<{hzRSHcFzCG6+j_a2gY_xr(xUriAm zCzl`Do!j<1DlBcju&=PNU}_mV_ft!D*FdG@^Uiy846a@)(M`M6Ia|RrT|!k+ebUL( zv&{ZnJnpam@73qo&8p{?-MSL#z>|3Mz1i=#Tjat`ZuxC0zVAQh$o{WI-@jCW*3{_CE!FRxu}qJfKB;x?k1cDwS1Pua?O16vnM06umsIRz>x|qs z=eg;#gNoMrin?q##WL?k*Y<5~KP$a#mbhP{tg_^hS$lS^~b*RPWv`VG* z^1EuBlg*sFo;a?k$`0!`QuIG5V%dH8^sQc=QwvRw-g@&eLVHix+Gi>}-LLOSY&-e# z=;zhy;lFjJY-Z3?N|`4Vc{y~dq+XtSbawZI{q4!chYoMNV>@N{VJYr{d8yk^URFCk zE$G@Mp0j(`9CP`)WnFe=)-xBj^-qiD*Zs1d|E%&?_x@jh-rhZ_u~f5CIk-Q`JW%Pw z+uzcc&VH@?{iJI8&7*(6Y*^NvSs8KWPy771zYnVQ---X?xBva8{s;eli!hIQyvE&OiIY;l_ zN}FPO@Y%~%c4 zk?T)8PA@rr+iP*W?23-|!rRIzmoDxMy#M3GySLR(%-2O9dF5Iyqw1$Kn`3S_(}gwj z3lx}J-0sP5bVl z`&lrrYtoF)-#KLu+!x5*zA3wFALG@FCm1D8S1GKutGlNAMr3wqQkxcsr8?Jjj@-i! z4HMM4*3CS)dS%3d3fp4cYaJ^KlN6s_IJr9d^9A0+&2mrg>aJkVTcoeb?!+r~*Fpb^ z)te{Hv!uLDvN(B-pEXQMdd|~#^FTkti^mCvWeslJ6j)nc_0grM{6TN^ahH|{UxTll z3^eXJEnS!USnS7+iG3U17liU0ou8@v>|A(9sDrbap3#l%X%Fij#4i4KR@?YpdivLe z`QGU#ZWK(b-Z?w+`4razovN*3uf8+%owe#!`oV2>$aAIid0q|C$F9GF?1b%_qOZEU zyYz>#CEFLX{d{ojYh6zQqtw@p{_@-V)wt{yX_YuQJr+M6%JKD)@(S7Lef_~{e>OHh zU|YYo&~NEX*=uKYKF^uqFz3o#zg5q+nxwM@X0Q5NQ@cX7&eZXRXU`gi3epI;AdQ&KF@Ze^Iqr z>9(Bt@)9Kmv$QYhW>$S;HJ)hc^YEU=4703_pW7#yED6-H-P|-Y`EJ1X+P4j>XL8P* z5&Px``~LqA{p&uQJk7t(+_>!e^hKxl$4xgc7rpmP^7fQ{-<$jG{(Wf9ul?i1|N3Q! z-Jfse^Xfh||NrrPf2{w$y|bo0{(E}5c>Nc4`yaF8|Ge6K{+{5A=HQ1`mKE&Zx*+qG&F_lek1nUj@7wkJ>HR%=Yv#4AViHi? z;XO$sZPu{}GohtteeG+09xS`ZuypRb)O%Oj53jHP_WHbib#ZZZP(tjPDo{apG~jQq5_&u5#z&+}_%P2tP; z_N-hsg;|<)2Fp9P&{sj6SzA3~XPVy|tdC*Ia`d;I+=roNW>X&=+xmMxrfzrObO z(e?4N@AyCa>FJeE_g{bc>r%0ua+ureVKLcb@9zI+ z=l}n8HGI3}(n}RXIx+|_xw#-{K3y>_9Ut@?HMUovlhadzv@nUk*f+wJ)=_x|6C{||*v37>ou z7At<;>)xF$cjn)_fA9YN>(9>cwqJewcGH^NwQJXHo2F#BoF(aAT#U>+`3^~)r%O^V zX3m* zN+9^ZtLgPyM|D?aJ!5$#x9QxR8LfvDH_IzI+NhgNFn=30r?6yNnv;ssR?VulGEc1g zSs%AWnR;h=ozCKKXF9ZU%jKxUv0m;eRUgbvlNdQWHABqi2rWOO^yb6T5cRBQ-hr3d z+=E#scPyC`^hnd&D|7c<6-7^*=Q_f|iaGDCYhKr0In`Y2;FD1Fb<>t>SMC&_WBfAf z=f@puUK`|El~*~PnKEgK$_urpcNOk%@Vq`Jzj$ZL%sly5^Z#C5U-xzP_N|=VSAvxl z1$Wx7-T(7!c2VumN559D&)@g&RajC^lxxpM7{K;g8l zFFjo~)H{13PA=Dd^C`*irKi`Qf8P`rtTT||*qNHIr4;Yu(PADv@0msVoT?OdYn!Da zOS=p{O)2(bSR*1-xb>cvS?T+lbN_6Y_Rl`=pWEc|W}l6hrqC&&I8BB%mdmHetX;9Y zlcnn9GOa@sW~gL`I9*IRBHflOby>o}c!pb!W^Y%Kft8cSJH?g7U5-|pSxzOaO1to( z#YBCX%gGZAOKu$Rbg@vqb!N|P)%wM8FeHT)%a&0QO z@!0a~t3BZl&Uvb+&%boqKWGUL=`o7DF3^60a?!G5P#K251i z{@q#keE0e7w_oc2f42H|`y;&XUw@e<-zZ}UmpGXlw^MP zWFlLspqN{BSXcJi0*>U(bF(%s`c{yYeYw4TQ<&|#rD4X-vsn7l6iP$dHJ@)Wvyux} zZ3yr#E_L-*in}`NUD~gU+vETJwg2(%>*d$ar~m%{?*5-QSAQ!%*ENy+m$&HEtlKYuV0>D`|0=j`S1SE|Nl4s&K-TD{Kf0~73Y6x zEwk(QsImz$`F!_~S&oKMw*^)ssRfISC$jY_*{J9oC@)JgwT~9dczr~&0grn`;Y(s zOZ%U@JEgZ=no{}u%W?Z(-~NC6|L1)D*Q2-JJ{3Nv$*0+)qGW8ZU9&iw_tDhyB;LdY z*3O%*pEvzv>}r4DyInxx`xA^+%iIsBHXi<3n7RL^^3p;XM~21BOcT%k;E-eqGmlb# zS!|#7$%DUNmdT|f<2|3ycjv~272BHHJq6S{i$m#WMjMC6+U3X1?dIzQ=2{5cS;1#0z^c0Svq)wDduQj&q|{AP zEk3;w269Pq>h2xAd$mJe@a1Kl zCw*9TC$BE&QO&btR+0I!_4}Np_X$kA!G8>UWJ)5=AL>8-=A!QE!xkn1sa#u?c&&YQ zBtJ3!vbXWkM3x6!N>V~sKAXRJn#?gdTl#X%mqS_^;m=QB2oJ1pv5s*w)cX<`bIi7T z{jukc%)!&|PQL80dd1<}=bTk-9~ALuSk6&hdHUW($thR5rQ6GwMmYpBXmVck@kf{=iYqc#iSlmokNEnfD!hOc#9Od(tykaoXvdDVv%%G*|!H(f@sJ z#~~wQJI_0R_bu!(iE~d+Fqr?Gi#hXM_u}SfA8)p#p7?xx@$cUGw)Vas)t^s!U8De=+QD*L^A?$!Q&tp5K?{lD** zr@T6xxOac^FZq9q@7M2$|9AEO_w?zzU&{YKeE;{q<>ya){P*|n$C4l2|6e|5n7Z{z z_u26LyluN@&OA{$???Z?ALY+ew#V=PebT?~Lwo)6-9i4R&-$+1DtWd1Gjs;-m)-sK_uJ|4FDk-uF2|GRSY zXto;Ld4BPAe_wUqzF+tA-@AP}+BOGo++_;s-6^u$*{J@*r%xxZUh`9*@mBwPrupw( zQO$SnPF_51n$S|q#q&xUpL|*SzV^eLqfhVtX6BilJIN(sxm~WbN0vM@N3Pjqm5kuv zSbv>PiLV=`{AN$Qou{72_~&1prQMaw4@;`cx38PpVfX9D;r{)fg*fY?EYI)pWZ8b1 z>ye52q&MdrjT#IxgqYO>+UEAXe)yxHdcTbSyDL%F^ZGQGc6Z-B`gGsU{ngc<-<{Q+ z>=RseIVv{#(b3Cgk93}}1g|Mbnx+1XGpl`l-2Y$C_t*Y?#^IyB_2{XfHHNRw@7q(i z%fDsHlSiLsZH|cMcq6t@FXI_oP-*V5Lu)g-K3qG;%PwtsC?z)_Gs)?(Lf^;iQXa;mhUwbG`^8MxqWx`m34;c zTwgaTs~s-%;##hEv!z9(=b=NA;pdbD|bXen)` zs%mBn%(Rzn-B}=i+h8+?zs~0=<-aTEeKt{LQrW2Dd8u1otj${F-u9;rOZQ4w9T&Xq zbl}0Vcf4L|PQKACi?ZH2TW;>ymLjlpic8DPpf0zbyLV^$YzC<+sn)S+iT8 zKYL(_ud9X3spelN4_T@Tmhq}a=4&rH(OD7p{@CsUR@Ws7A3o3Cu@i8XVkA`($ z4o*%@a!O7(6?8^ME@=9kqgSLB7<%=cn#kr}Y7%#8V>5%woO8(*P4gyS)^S;rQ^3FY z)Qg1OjV-$~bpkp4#Vo`5rcCCj_S!Pj^-ikSp}5u0H8&YYIQV)8r=Hg2mbiE4uH|u& z?fu2k*_P>^i(ct49SC`-&{rbYw0%y6vHJG3w92$Zzax_@3Yqp?af=KRJ9)D6V9tWe z&Z?jG9MoHWcFMimOz)R%cz0~gY~OqNn*_Em%TrX@k~t~OLRV1PW$l)Wu4Qi%bGV#h zX0P1Iz075o*38b1nW3Q;)6y0OPo7u$@QKs1EhjHe$;!O7LNe;=wKH>r(#rj1Vh$NB z{}{#d=ul3_$7GJZ8`p%*ZeB8T+cFi!T?aOqczr3z;Xi&&=CsgC-i)I&7>~`le6?=- zUDe!D%PltEvr=NSt+xhk+3M6+nPlPT9euUy(X+Ch)>9uB>iV9wol?GZ%ao&>OEWxm zA6=QYG{S4?!G~+J<~NwJ)(HK2@bYN6eWlvkZHM39|2a25_xaEIKbQAcegAi5O2)Ho z8DY2HJwJPf>DIZ~Q#P5-`etS<^8``pU2xy z30-=f_u{E}=TF7$`@Ts=aM3;6YPKjb`=^VeIb9QTjyBr~6ejsii0gBiEwsg?&qAxe zruD{Ew!`)Uj>VHB?l4Qqo3Ou^D^Bct?sdz6rS`MRyDd7aTqXs12|ZyFII1jjw~pcc z-MFM9OZxAv-h3)qKWRtw!etlpW?L?usp{&_V;66Fe1Yzd9SVDG`;YYSeRFq~zTMyc z=WOZE7e9~wf3*MCMih|h1|RUNMK!A1VXS<}49t1Nd~X8MOeeX;s%Pvjk|=u=gfRy>scU(r$=c)h=M zqwePG%hvgIGFYwIy0`kq)NN+5t6t5P4rSkYNW-ST3+MKA_FnQcj8~8c3Mwt z{X9!LMwX9*Sx|az=iXK7iGB~g4yN3jGs)lv8^g0&kzCnV63n;ydKMfOW}Ye?(Aw|r z-~R8~#G+Zx@ASPsd{{|mH?Mtt)yYgP-}t??7S~>7O`6nx+;ZY>ww;TaZS5v(iI{P( zx>PBt@2~tV9f6|v9t;;^Z`rO1>wLi0y4+>ywga78-g`H%HjT5LmX>~5_=@1|*^Ek$ zUcE{v?eci~@2>1$&sXf#5BO{TJ&?W2QD@W0#4i(IUL}<^CF7%cqsGz0Z1S7e7%vhj zXS980c5nN18QCiap9@a2pUd24%Xs0T$j`OTD{jYM5b%(hyWVp~z3X?0-3j4q54(w9 zjqhlQZN6}Izp9UN?%v1K?|qJYTsFsYS^9c&9ua-9s0+q-e_wV^E)l$!D}U~q!WUrQ5zE}!cWg#-{c^^`N7cmE8V9P^9{;t$xadyd*@`KT@;0!4 zX}j=EN_fxj&xPA#y5COxmCjvLwxIE@0B?HZ^7+q2)9*;W3)4=RA+)?@)w-LL4$L|` z+s5BhHgxatUCep!9)4T7c;&k}sZG1egtkoG%J=2+gaWgiLS82An+jWdKc9{^PV-l) z6}!7JLRlf{;mnBH&A)yhYcee^HFe>%sc5aRiFJPK$7gC@E|~xB%7jS)=M}b97+u`6 zE8pzpud2gS zZf#^_m*lduQ#^8Qn<9;>MYA6q;o1JX+BjamZ^@2byEMEv&zWz(f8J-82``HtyUcv? zWy6$fUYWwl#!K6GI}7dHanJAfO)uW9YlKoQ9(;e#zyFti{Qli*&kA$ATEdo__Wt_q z@27XK&s(p5X?y*TjW&0yRt9TTp861U?G>N#y0tqeOSv9i#Fi#;=mKX0xA%?CBWxZ% z1{wE1K73YtPQ*g=&TMY$82hTqug&l6lqDAC>8-ze^PqxTw8!)#`{YjDHveA!y>zYF zd$Uy*b7!e&uAV2>-SGaBSLBaRMZ4F$Y70Aa=Gx^=`{xuryIp>~JfA-_*5dXmg}G(H zNh_C|sU{VzeU^0gpr-3BXLl*9Q$}hADz#FlCUPw@6z+Jn;e4@xqrlp1eWssHlYXzz zs}^7oVGL|j(xiw)WQ)n&^hnUvj2Grvh3T=X+4C-Tl*bwST5MiEIN zOs_V0hP-Ro85TP|$~3C1XYI=V@VmR6SMNToT4yd(`eXKg&ZLkPua9j|Qd)m--IKo3 z+_Njp`fILa={=d;l(gc^2}?s}x4kmVl@VuJE%^_(Df_G?SiL z#8z6im!ni~596J!W(r9YJ(B*mT{n2J>eho<%SFDd+OW+ycVSG&rg_#er!2j_G_RD& z6z+>P5jJA{|&%)TqK{D;ZX z(zV%<*Ry<5Tw7OMWmD|Z$g{8(bQGFho!xuF*U2?}ndW=_Wj3+${+Bn2@E1;*IorS3 z=<5^4o1EYEK4_+X=2E^)_gf`)phPl2D%#W@16__$|2_B;G&UYiBWL~*~`w9_4r zPIpXJDAX@oVs3cu&ApG-Mmu(;_{}`4@wD#0OT?iQzFW+ArS?Y_@UPrn(s-$N*Vj88 zf#J(7=BKyta57F~7JMmWP_44wLa|KEGP&b!)cnq%MJkho&rkN*e1vVv<_{_?%S0-L z0>aBn)n9oqJ-W#C%tSqrcNfock#Fs_D{gB}Q%Jg(`}9+iaqc9;5JuyZce2xx)brlW zOmJC#DJuI+ZPI=_n?1W?rv;~OU=+I@{{E83-Tu=-vv&y>GZjS4o;kDFIQ(kj^$Z^$ zpXc8^&N4qvFPGpv@J{zftDK+bxz0OlLj8p~6LpXFsBRRVSQMP?wzOsH{+WtAC$_9o zaS4{4wKzd2`?3Y!>{mf&&q({+oxOXuk!o@Fy8^9et8XQ)+**3ylvT*NMSoq{=Q%R5 z6YqrSeq~v9`PKV;{<^~;lqixSHrwKEoWvu@q9XGwbV7IxSbcD zy6LUgn@S#`McXBf0FirOJ^eHwl1?=DG=!!_W$Gk-}n0K zzDNJRUjK1<{m;|i&js7dHY#fNUY_o7FVesNUC`Xajv~`uJ%486mi_$Na%FDEjgKu> zH9K6~J=d^E!GdX30bA48lb2S@^r;s;QNQqDd*Jd9f)kxf{dVk`b@t7>eK~q&@-+pu zQMdBleBhHe&t<*ZuYd0P^WUf&-&z0qeBIYy zX)7mfdzG$N7c)n(_0?LNa|djD&1PHlTubKIsC$a%UhQ0PYRa8C z3cvoXe!pkR|GWRc?f>&M{QLj*|EKGJ|B6-gnsV|=C;RMHHi=u7=Km_f9~yp;`ykOMVq6E=az3{r$Vp zsYd1%p>LM^^w{LbP1>_}_kR01Cl*URyZ5L4lNFQa)lQ8)*|wX)tlAY8oUgdQ;`8q; zxqhvK?jIPOc+O>|Z(;rTqSZ#pZU5XiXaD*(UUaEg!0>Pi&jaZv^LMP3mF_zGhG$EU z`a| z7gf(FOsttFQLhJGTJB}0WLHF4sd>?DoDrYZo z&XVZ4buX;qcu>-vG{st_?~Y&k)z9u~TDd)sLFr1;o0H78?|%F3_)}t1nIqb~OQP~h z;{x9AB2u^O+Wn84Ns5=f36d2KH|DyRXTP~=zkB+WJA%{K$k!*w)R{59cwcPifBZUw zaH0DAN}*}#Qx}IP-*{By&n-B@Q*lEy zaY;+LN7U6>ogN1Nc6>i05nY?^ne8Jbqsc3$GTVBlmPGp2eDQY|B-P%y@9%KAEMCv_ z>2uwsm-F5|eqnW8x6C z_RSHollL}M+OJ>!Rsa7l-8&AK=l}b2ReyiQ{5>b#K3@LLrLU_0_tt-CRu{KE`SZE`??2z(zWsXj zsQsVg_O-uGPCozdRrtwimtTkP|MB|#zCVA~N%;BBKA3Q8i!008?RF}K>WQ8%E!*?` zo`ytaUvK^PJM)(B+Mm0(x2GDOoYd0t^I^oZvnKgzN%?18E*(8O?Xu4#rF4BcQ-|N5 z-sa7Hq@qytXbbDi_3fVu>hGWGyz|{(Z`tzjxHEOXzrMXI_~C5XzYmY6&#(D&@ZC{W z&YK&jgn!t!`-_wFL=q`VPIrn@N{tunY&3PP3h6h zIWaD)UcIbX(*FBth@6~Q@uVr58?8)xe=d;idsbv%ByzIB%G1-xRxskJ~OV*?qu&;C$l&nf%pS4^k`FsjH)7h8) zP3*P1Pn#vH_f_hBTyej_rN;7f*{8FUb9YrWPI=&9S(zCprc(7ktMc==g6in7!#3x$ zjvcD>TDmRm&VyXtXVYf*zPP*l@#NEQpMI@dyZrFW5}PYrm%?7(;yXTVxyqZh*Y4Ks zyYXBz*ze}nm0vGk<2^genDg_L;yK=Y&Dt7Y+x8v~WGl^hV`b;ZlCWcw+dU@64|(EZ z6;&dc7f<)S3}mSBTI+cAu1y%Lo1^EuwJW7Kw_a{kU3#}I;sVzzEzSuuw^yH$7FX;D zeqs}7zkba(PfyEjmo<;wI3wf~q&`8w#O7@C+1`s{2V~DoVd_yfDBhm-Y8QKX`zj&D zr8$1>&YG*TjZL-Aid;D(vBZE?<;r|6S8o+1ALolkeVlxe{`p%LX}q}n-7(>9{gG!D zbHy~~+5S)1J#*Ez_S?a0zZOJzWj=f_UWQewgkkJUQ`?mR9Q_AO}NIz^?=Fj1_l zgu|>fciEjFA&Z@n+|Sk2vpIf=3a+fu{rc}=$ZDg+TWP_wT|TK;de3_HWXrm*4_BOC zX<@^?bdPADJQKH4(#s``UA249-|S@YdgS+RqqeKIW8=2EKc8N<%isI+>Uw_GewwCztJ0J?;E`VPgrMgVz>LQ4L7-6jJEZl(}-J)pGfhh0bB!DF-dSK3tcU`66_t zRcH^p_q1y6w!S+`ZyX|8T$hAiKDlbvysX@+n5?zOSk{T{&CAGlX%RLx-dIo;ymm?} zGMQJQHbH^&qe02T#uxwBM%`Mp^7Nr2PhNetsa!wl zppUQT)g+zw?`)fW*fuYIFMsj<%^xTBO4(0e`@Aw?{*SSf1B%FaIPG#mU zUs^bA(<)1qVuLNwn^%Rse{G_w7VVen^(JNcqxX5!gEiZ)UdvkkxTrd&&zpHkuV+c* z>jq;E#-MG#=Jv1qck%x3lkC@jXFmG-_2~3?`#<0Rf7Ac>>+^bl?q`|KX`knOv)o@( zR=acNsa16+GtH+ay)AHwoOkZ!(XZc5UOxT%_tUqlXSe@;Y_fcciuv8QpY!IQy2Np$ z>G49t>a&@<=SF|sB&IauR@!vCGrMcs%v|4@&s{SA!2N`;gH>8fw@q<vf@5^!fT_Sb=QtG}xOM5hn)$-$%9ig}1nonA>u9Zb&yZz6H$L;?fZ2$ju z^?uLU>aUJ9@9C&xw-UIJKaJl<+bC7}bpOt2lQ(ldNb6MXoZ)zBN$;%k#|I~BIsW@G z%VjZRt97{)*9F!}*&>PT6o-~NHGWs|<9+V(>kL@T8=6DjNd00e=hwDmQe@k1xG8;F zgjH>46i4*#J%Z`C9(QagC@$uW-nN4yt&EMcr)h@>dy;+fnZ5pp9{npfy;s5UD2TuI z$b|HnKOOk*$X;sP#-O@Loc~VC_TqD$t8Z=k*2wpL`7u`uwSdVN%r4i>I;$HvPwifO z{`>dW*6-VQvNLUAe|(JLWBWb-R;ynRum4kCe1^d|CgeF zUvBHm^DV#r{{8;C;(!CQm%7Y+`PBXTa##D`k9tE-3tPvCzGG4RzEHQ6=k(t^Bgw=y zh4-88ho5=v8GOiO>F)O6*(uv+zkAPb-d=i2nEU;59T&}=Gp}B~c5M~&p=IxMuGk7V z9-htf+&aNl@X+1Pix zoVkD3WL=`d#>K%O?_I6jUm&|pe(JpMySk6@Ke!|Ny|Rh<@f1e4MS2}`OlCa1W?k@J zqON}z->dZPnk~DmC$gOLzW;&ijrWz@9KOFU3;Y(?G)D#MA6lDysqnw=#gNDL37gnt zSEb5dc;XaLYM6B*&s;j#PU3im!PjlO-I zpS(NkR#n8Ib#AIJJPt0DUtn2le688Vp)GTE*4Oj(f8X7F`Yr9e{r}D9<7)ogxgd0P z_36{;=gsS%^V|PD9lvka&!4N`PF{U2;e=bB&(dGOiq{kmlN z(Pxon@6LA4oP6T%M%k|YmHW>;%AEanM@FXR#mjphnoJg4&U^i7`~BYmC-d*=co=c# zF8}f+=~jG9PW`91j}LdNpV!ydH;?~wRR8XuZ)ZP-@Ber7_wLlpny6Ui{_wL`A{T_V zR%yr!M{b>SlP7-vuHRjAW|+m#wfp%bYy0W%-wJQ**t)n( zTDE2W1ddmXFNC;fD9N|ToZ$HukRLqj($}w3mz>>WdFSq|YkO`w96Tdm_xiBQg|u*g zJ-vCkpQn7;5+HPH=4|zkQ`D!$WOHv``89$;MbUhHsH=zCH?_61A|;%Qb#rxHLuXd% zUS-scx>jZr%Dg)8l+OnydzrUM>YOE2D_*bMp*^{IUQXxqr$7F^efjtI<)TMy`MNbf zIkPlRo{UbNm%efG-e14Iy}W$$Odr3u<`TAskh>z!0^VLt304kbT6puo%il*H<*dn^ z8*yd3=Cch)%b84kHp{NklAL|U$al|e<^w^uKK^*u{k{G6(E|x}_0e*CTP2>(nHGHW zOr+4vtkv7X;%860B;(N;{yFN5;<=X(7v8z2bNunAcV(Gdo7T!kXL(9gimle2)O79E zwWYJH44-)~rq^Sv}nm)$>c=|JV@&P1tWS4`9#4I~^NgmrSv`FO+X z`05KA{=3?{csXW2>06Z-=AFH@$|NT0?rqtrQ9Hw@Dj(S!9>t_1?UstcUJD-i5B|K2ONtNHeZ>&f)s~DMt_$Ro3!LvXQ%3`ZSU0F^e)EE z*zIs;NyzHcx3&l>a+_~zs6TTsvHRXi_AC5yX zU8~96dSn7;hOcVTy2W~><%?B>*8Mx9qG@Ndg1I8Yce&2)yDCl!bNtTv72dtm%&HkI zmiTOrhm*Ok&Yf9J7a0>Dc4Tn6W#@}O{>k}5SBk-tWx0WRu5a6V76oxWQuf1)HT|j%RENXDyrYSA5D3+q7#Pi@OZk?gf1R_i0aU$?75tLBqp5 zi8hZMPOLxh=ExGZ&YPQd>}Jig+Lp3F{@xLRWtPh;tvwgzDQg<`t97_+(4J#-!k683 zOLOg!7s{U^H7rf;otxvJ6u8_wL|0{9TV~a_ho8@y-Is|z7kTz!%Gy>2lWxhrgD+~hepW5T(Bg0g2i z5C3_;c_p`LzQoU6yWQS1&!{w=uV!c(pEFhK(bkze-Q8vyu<~x}6o`40B(z3?JDbHz z;A&cX@XD^J-iEYk5my4Tqy3kqDe-xQ-tG8ov(=%#)-$0|NC(N8kyMJZ=N2% zU;S(E`~TwqKkC>2{r_`%eN}O|-nP%(;^F>fm!HltzrE+?S#M^!SAXBGoN_DbX5Mnm zr)xhPW&bViU-mkxSHYhJ&)bxpWv(k+p*Yqg9osl48_O)JrPw%O$^-un{lm)_Nx zdh^kYB^la=QoC=oH%#o1vXi=KRJNR%XC8}NTK4lDi4&5mn0a=1xSO2OWh&oOZo}ag zIpf!c3C)MLUP=D)Y_D5?SX*Lejq=8TQ897 z^EJ*sWb@qSWSaSDojI3O&UBu>b-~a6@4wUgfBgUZ=k3EVGwW$jj_l>N<35s9QeBo% zFqH zec>t3(8%L-=j?2^uaezMn3XSzR?V;ca+`#9d3n|9+opn;eBx|A$F4)-x0p6EWTQ& zUMmXpd9C!1x2mXilQ0Z8xFCN*b-!HE_XVBo+G|}S6YrVVTBUQ8omWvj(<5K^yLtNg zZ_5uG9ORqKd^aRt$6QM6;=O}w{k9!4w}@|;RiC`Mv(zPalFhN4A8h-L{d>Cx+ z#dAMf$$w$X^yq&-VvlJai>-h2m#e?Gt1WuocQGruclkPt9qTw9Ca{_E$X33e?HKQB zQ{msB&cEBDnR`!6eG&ER}E^xv)jVe6l9@ zbI)@})8}pKsFY7MzH?IY%&N5Kdkz);+;>p4_t<5o6WUu-PHTGh%$I$#q3`{?SSgz@ zvqJk$lkSk_-KM!47R)d12&vg)xbXbs3>&?|+QU0LB=@b8wDRTgV~x3bc$a3_q=Pe$ z|Lc5r-}b4FOYyWhE6jdxw*P;2%8GTVAHRRr+h0@p^Viq2r~T*UzW8AB`Rvt_EY>rx zR=7GgTdp(w$$BT+@M>S`>c~C&&z!uo_2-n$A+v+)e!WrRY`uQ!>~H1W!p*&U*Ej9m z$F$k}w%zVsdA|;x{dd{_b>Y>h>+}C!O`p$g|NB9f(9Gp8{~e2YefIV4tr-`8mzyt7 zb~M&r+j#NHuCGn5A6-|?TlV1K&!YUQQUCPOqh;G?&VRRe>w<`en*T}r zYk%by{kWAAxyQ2Q%z>F!W-*frPt1^`wqC+;rp8ew4r^(cL*CRfJz+$JK!O3;uV`XZ@P) zaQCEde9ezPyX(KZ&*8b&apT&j+w=4Gj$od)C__TwM^K{WEGQm-C5}dqdZ!F+VKG*?KGJ)XOa<%_?&3 zDl9@g&gU{Yj=u{1EuJED@1JnmCZBUH6TZxDRB=k%TYt)8N^ec;m5ceu^5d>DJn%|c zch;--=H{m%&nm^1eW^I^9MxC4a;=Wqlgrb#W?4>+nw_>20*T%Nw;v zFD_f+q_gRhnY;EGaCdLqxq3Ipi4(Q57a~9YWAKqVcj%CglaJn^JdLI2iq~HCHa+R& zb9|}n>T|D_q-F7Ol)pL`{+q?LUv6_&#SFzw%dfRxW{itdw2Zob>eq{o2qv$V--}n@ zb-!PyADeQW)#gd}#2KHCi1+I!eETWBKL5VVRF5LI3s;03Dt!w0`yb5+U#_z5+{(=l z7G6A3RJj9EtDKb5PcFSB9)Gvy*U!`E_f-UoNmR_5G|R}OO_6{3*<^6Se!Fv?$_HcU-#k3&C93Xnz6<`d8S#IZ?(wo)u|70 z`V%(noH>=>euv$hXOI8fyc^3BFw5Fv;;ied9?!7cxN@88q(rS#j>~ z$D7VvwPs}(u#)Wj=X>P(mN+XpA$zXN2M<^)Z`_)`Wuk#?bQN{gZr{ch4y}y%ne%9=vm~Kb}K4b%~EWdYJO+6>)az(_r^MirQS5~>8`8J)l;zqo$_B%VPC1>kCid*!y@ano-*WU?u zzH9NF*y(&}zB(s2qm%#rz590E*tcV6qL^v;jtvr~*9Tyc&K5VbuSy{UNR?(^5cb}cy-0d=HMoUP`ryY-{Oj~Sc zV^j0@(btzDIUZ*&WIa}ETq!EO{jkZCs8t^4l8ah7_I>|&IsE(6Zu77I7D_PAaajHG z{VJPHp~|j&uU6}^Raq@`o;Yuh(=C^dy4DA)>!vU)muTs7n_2a*d;;UPRn5l5UP}(1 zv<}(*=dkQM-C2GXGyc4M{O2vdobApT&mQl&FQ4#b_W8W}pEuvW{+%=_;>Lk@0j6pS zHSfaD&3Bq3RNQed)%W7lZxe$hB7Z)3`K|x|1NQ5?9X;;-eDLz`>*?$F|H}G&@3La7 z-JEyp@6WCKv-tb^`G1!Gf3^Sj?frj#ua|0j5q?cgsxaew*ga=~{c@>K6lUyPVY~B2 zQRe)=uQo4`K5=k2W7jrQzfShBR%65E^Aaxm+5eiG|5yG$|Nlqk@%R2cjsO4a>1)g0 zXl1^j?U!#ZOm`4a%3JGq?cWD}yPtRG*OdH!<(K~V!{c(ZU^i{~H}ecme>?QQ{QqnF zifp=9UKT#sd)Vxr(yiGH z=`VdmOHK6N{9*Dw$hEzNXRUYdire!mFYLK^byfNO4-+f|zorU*3@y0yBF6dHPDN3BAdg_FT4r#p*s|RQJoPf~U?tn$|g^vCq52;PA#pOof6+c6W77{jt*f;!cg$ zU-`Ygw%&^(j-2JZ(Nk&dd+p1oPf7dj-+f>Hw4|zP=id*DmtR)V-+yBH(u<8A|CClEK@G;-;%8lQ* zOW#*IX>V{jk8%33JgH@c676BDaN4~9#Zzz8%!MwWAhuy7e!RGng4@xi23zV>8-lH9Jzgnm3_lEzMa!sd{ zq`o}1za=8?wbuI$`Trvu)lTd@9%(DLX0_Sk)rm@Fmm6*@TEHKtBD1#8ZTX@YpGh-k zulg1=?^>SWxy*(+eHp9;>To zW-N$3b8WMJQkTQ^z2(!G87B5VW{6x+^zh=bJx+S7zvbq7KM+tVuIO<++R@aJdEWKy z{h0alI5ITvF&MUP=-_=8Xn1Us(hM!ure$7tAM0H6ZrCc9y0DZtFTC}u<6k}buEUBf z#u1S-8q()pU$*D*DmlJwjl9+I+6-rcmff8)bLCXA>+7RVEIx9VNicJ3p@MU4sHcw8 z6P-D(zjV^~Ow2nV)vjfku$KR6#r6vKiY~!jmYWRBLz}r>W|!%wnEx z&lPq0PnM*at12;>n|eN($|1PgW6vjHmn%!dqu9O~J`J0#ET|sLe(2hUpEm!`mCyfo z@qNAi^M~*2K3<*w|EYeDQLFOq^$E{zDY4wrQp&O7v)S-+(WC;SDM$6?a^>rPy!qC> z`~JUY&n}wT-Z^(W^Vj40Z|AJz_xyZa|KrtW{r7V>Oi}ARxa8HUV+|Y&+zOOdxwfCp zc(>N|_(B#b2Y-3r^XtkNFS+|zaWeOxlb^c_Pp$o#W?t~jq&H4mB{O@|?HsvyS@}9= z(b(`Ru%oceg9tQ=cNmEZf#j;eu1&QBp_Bu zJ+1Mr+s_9-RhK_3*>!bkkx=Ts+u~gTyH9*CFgWbRd`BYu_T9_svt8D#%L|(pDVEm% zZSD8$dxz|F`0hM=HHCG~wQa4AoyU1M?KEpYc;)O&$*XsIg{M|-Z2S0VQc+yrR#`vI z=V|-y>qq&{P&C+Hw8nS#?B3=rs~(&5%wG8B`Qf`0JB~N%tvB61GU`JvivMnzuR$TX*az4ThYTPz_9Mt*Yjy& zNgouZ`z^ox_xk$ni+lRF2dqAR`Q-(##B+OQ=wE%lYR-<8dd0Jk)s*kg*_M2@YS!&N z8M)7-_;&K_FuK0Gs(o_UQXQ$@nqX$V`8iu}KHM_ncAC%Ir*_=4UfP(eh`F7c)B1UW z**WpuCzcfimx^cc9xCAT4*q^&m9*9Ti}k!r9s)KKg`JKwln1W~+8h_QFj{W+?Dkmq zwNYJDug#j*_jJdWZ6QfUQJ*%xE#_KKCY<$&L98hk-5IVtL&l32W6`kS_qelPjvo# z`L9rv+;f*R0j%8z<1ZAD&^S&wXA3IT6<-;wu zHR3!S8V{rwq@QEh3bxJ()zQ!I-5{r$Cg(NIraU0fb5 zyEQH9`R%fZWtzRgOdEGD(lD|JHdZx0nbS~ebS?Jq0_o?h+Ye=k$RFFinPcUw!yG*A zGuh_lKHDWHxmWkA-4oSAPt^SUmOOJ7YMPztqFjCCK;(4a6|Wu^bXlmUUAopbN3ZO1 znpDuFIYE9#JUV9{TP$sNK8cuRM4n z?e{sRuUl?f7Mrc*0~Yz^bKG{`@q2tiDdVW;jfVE!M%Ry>S!z~(WkFYGhl&bU~Fu`Eu6aTX5a0zY1V2?k-8E`&#HEBe-yQScj4~6WmjjLmzPEsovZZG z^cK38*Oqz8Q$h22W(SjH|DV74_NOcNSiW2yzwhT+ar56Z!6c>?Ylc$eNkFQ?XHut&dg3{c}!m&xM1a~qW@*>S{;dL zGb}x&+9Ej4-@6$T7hC)H*^kxt@7=Kxk!CZ#a;a$Al$Nu zzdic@^Y-*yiJ}~?*S-b?cK5^Ho~imeTUzM$& z(+m&Zx$-b=Rpkl$Unh^-|2lmC@7(uwpXz_=|NpwWSxhvM@3?#REq`5elhlu|yC0U< ze|Y;{F5fNx`tCV$xi_a**3bEVJoB)@`Ah5M?SI|>_k90%_x=Cp{(oKnH^1)dSEnhO z7bSOaNV^+<{`?{5h+*b|`#BpDrXIc$DirwrEk|=d--Tr!AzwGkPvusRnz;U5if=3tWEAa z=(t+xlaKiNTPhXuA5>ngt9q-~Qb@V^>l4Gb23M@3O}3w-r{p%OAA|=dPWlz215D3r&{Q ztE0>v4i>I_vTm&^f z9L%Yd=&jwd zXW4tv^}0|^@*cA=xBIIDr?sm(yLkyTWN(`UGh_ws+X}U z-P_M!`0al1SBZ7!>D3v#zDsR6A4si_sUjGO=*~Mc1mm8 zoY1==&PASr+p6tkWF~c}gsbMh%KOV%;oem~`^)0@`+l$GzyI_0{=a9J&$nN)@px2J zsp9V^b5H;OGXMX(_W3rMy!!jA=EfMl3%PpJno(!2d`f4fiBFQh{w4l>zwf2({=2*W z|L5!5f7_@D2|lfw@%rV5cbnb!|98K?bI+bR{I08OKmI&@`0&XqhC6spUcJ3$Png5n zZJMWdzqgY+_T}pI{AsW9=CzA_>^-dEFZbT==ZlYzUvpkndXcwV_PAzz+*_6In7pka zNf)0T(hF{S`ErL&yH=ZfxOl1Fq||D|+_J+CKQA6FD>sbe{d8{oJpEAr)2k21W=>)d z*pcZhUbo4))8grrUr!yK{S@qErw7dvyqkPV)A6~W$mo4T)*_3_f;t$gURM; zSzGhVi;H$_eRfJG=jw?UTW;jJXP(HKHHnXT)hd-!N6ubYt~C3olfAZwRaHY=z!9zT z_Qmc2!90JHed8N92Ry1N-~H!m{GUfZzaC}3U&pq7yMF%jqYf)WV!L$D@~k<_6l6d3 z+7)@eqn+Ja9b5AwckEtio+0z%-MOm?1=}(w>mAE9ezsRG+gSPAs?&=Ulm)sSF3wuD zQ*H8@RoAX;36)~WTj!KOjva2 zYP553dC>RDb;pA(&zV|%`t<9;lV>N+WQusM*&13ZxFc}oHLaDiUuCYIwtP-dnc0>{ zTWat8`4? zd9GV5`13Up2G*MXssBD*Z8~tKs%z#^-7C>QqoRe%j6=D-U0+XLzGT%A8KIdwSkB%} zOgpFKXL0tlc>JDqpZ~ z6EiY7Te~dQaisI^+X^lI-_Dx4X~%ad zc71=P{6JfcFG?q6!Cs9;0b)W7NnV|k1tx`Ty_WRy`z1-a1Ove{A*OpycAT4DeoDuQ zrzIrQqomSs>$Tbssc-kXL@c@PyzG>c;qmgkDW9gq-i>-PtNV$|A(2Jf_SMYUr5TW4 zETFPO;DE{{MLne*N~_{ZdO3eRDBiyK&EB0_9utG!zb;(IGB-kr@6asP9kOYrN=;Le ztKzDbMzpr{X65Q!@fNqsR{A&5N_j%0ara~MWt@l7pV%}y)h)2MyNK}S2-2aeRs;=&t5the){PD&s%N7cH*KEA)BR;ujajVIm zOv|Z{A6{8?)#0)hPyfwFK3dYC03p!)H z%I~m&@8h(|!tE+ITQz-r9;)d)p5gC(wJqxF+1bIF=Z-v{QU2JVS2KOml!K+~(tiIc zm?QtqJ5y^?KWnLG`_602G&io!-R`V(>up=&iAtZ+l}jxS3aKkG78}pl6?K32{SD?l zM}-2X3+5*={lE74wf(=p@9nBhw%oc`yD$6M=Z!IO`RwQ3?Ws0-l2}m@5m#6C`PswI zv(3A$m+BnacH8$*&7ADjvu136Y>}o{ywdyT8==V)cTF(fy)n4ZVV>=7Df3USUYl># z+_~`5mbuGv`Qn!+PCh%+;^cwcI5W+^53Jw+`SB{Ne$D@H_y0Z8|Mx0n}+hJLTzYn(m|Fr+d1Q^v~o(B#kNITUsTzD zPk)o|sdd=A{vxNjdRbBFC9`+O7HykxJLqtjU-b1HRl&6DX?aWXd}n`mJml9_`c{d< zmPu3Pd&;wfsM)jrofT}&bXeb#`_=NTdBu)y+hB8mR_XqP17{A%6z^}_erA2;`qwtgekaTB zsw(k*E#1Ae;+R&a!s`=DR-0cIXq~ybLLo2qL{9A6OaGUxSJc{=JjtLmO{wnmx!r5{ zSAA)_eAhu{`Re(FR)-{a6umn5n&myKv%j~){i!0-S9W(Td98Qe>hd|(S+m{DIObM1 zIv9n&sj*%Ad*0M@3%<|0Vr?MxGBI|7bnWz@fDIoNA6FhJsEoi>CL)-E89-S?myk~=TG^yeRDZP7O}tXn4!zv;n~sIY31Ja@5bC2 zN^N!>dWmk+OFrxp-g@5n@WPJ{3~K^nO^O>`zW*-Y>iRBXmFwTM=gC{^?~Abcu5<93 z)W%YrIBT1-@m#**%`09cX0_;jcKMOYEvV5gFtK&cl|7Zpp%1rImwf&4XwlT4pOSXZ z^-}e7x;H2Gex=FZllK2VR-ZRpu3x7;+dHc7_M7dW1J8D}DkyBqI+N#n^HiF#&E8w@ zg#JD`{{HVhf4hsTq_yK~{$=fvxclen^zT*We=hdh|G1|vKgIQZ{&)M|H=nQ1>zlv7 zLc{N}+UjacnS)ENdKgWy@Z@fH{2cXcf@oL4m17Ho?&NI>U;VkL)be13-8pymo!*nW zSNqAOGuU^ju_y)YhE`q)eA8Hl93uUPEj8Erx)!^=v^xmhlt){CqU7PLmAVd*$)# z!*35iG}&I1bNE32yx_}K#l;$DKTT*`!m`Na^WQaRv$CVQS8l!57wW$}b@xiwT+3_i z?Y4|Fe-@bgKMtF2bU*4=kBz`2i;Y)LJ=ru4dY3d5~SPySv!Xmk2= z|K?Tue*Vd`yt{4F1a-lzb#3n&Bp;bJtd=_L>8O|g?)h1@_`ITQZbNUSH19*J{PND& zS{a*7_OAa5cl(d|*~`{Ol^4CqnA?`kaz@58Vv!SSTm#dh1LDZZte z%a*-bYnE$xE9G=dcIeiykgH8xjMW*F7Nzy9%us5uG-~p+3gk%?e3h(u@nZN@*Q*Ve zbOM-4v^vin+rXG!w0}iU_^ac#P5W1_Y>nXLb-TMJ-pCj%Y33QG@ciM4w>H|NSS z50+Qvw+`>CIr@G2^uq=@mYes#m3H9aD6I*9RDYnO?d+FxyZ!U>o=;yt?V4D?r&V`3 znD%NIGPPtIZ(f#GIU(y=@ya`XOSisya^}sdi5)2u?}*zw%$WS;M1PzxyRob?yNj*R zT^>!t%O@tym?eE?#;$pDB(k3Wh&N~rnc$Kkk!t)TQ6xL-*<+1xadAuIV$E)&;!|@r zJyGmWmOFMvDQ%in=aWY{X?)7(MD}_LF$Ia8<2-X>)3znD1w232*x$B$a?m5u@6yc3 zf+m;V_Z-uAt8m<9zjL?h*Hp~}?QHo_DGnFUj$oUO4o`fpKAhwl^sLa~%vB-vv~{7= zZ-xq9O%b?Id%huKZfe}l>JsOBaqExN2g{#$E6QIe-p=L8{w^mG7|0W?|R-EO#a+g7>Z)rzEgwPQ~W4Wi6(=@1N(JxO4BqpC_-DN$oJRKC?C~ zc=OIJLDDm_BP;ZlolTxO>uuTL%j(mel?0~mJm+mYca~Z5u_sB_c=8&)rMfS9z@QTn z*>S)v(9K%CZkO!6`l7G*HoKQb@>Tavy2Vo|6IFb!bn{*doozNUcEA5TJNx%xMb?=) zD#C|7<>aOv{>$`9Cv&&t+N+y(%=Vmi*)j6+)2nK#LAjoju4z5eTz-7|Gwpu8_;pk~f1CK>e|7&KojqJ< zce23ni6?WGV~RvMhjrohyPT#htur+lgpZ`;PQG25Yl zd+}?Dd0dM$4GkyHlD*p3cRTs#pJxlwj=ec@Zc9}8LD4fTifeV-7i-lv7j&l05foqI z(B5bkDWshE>tOl4yLnHpzSY((y}`5mu}v=DlW%WsmYT+TeU$8sG_tn2`Kg&-KJiAZ zZCy#R{r|(u^|j0tE>5^4w8K4UQSpo{rHZoJj~73?Gw<2@YMnRl-#ylhPN8c<=C)lq zpr>zHDE-CecQe{oBr1^_CYoZ`qi8I#k`Vqko6-K8~2X zyn|uGtnGeN9Cw?jw>@eo{c&3P?m}nbz596d1rP7C%4n5aq0Po|?)i$X0pA5?25*;+ zEwy8LU-shT^>D^IbFH@q0*_Q5JU6&D@Bcl{+4pWva-HS=q@q!LX{BEI@t?*;o_wYT z^ZkzAneAx7+kB<1(c#g$w-=A5O?dL`bIg1BXW`}Q>PAd+Tuw-Mo9aioZHo-leY)%! zgZy(V?Jg(JS(@AvXSaN{yV!M~MOIXs;f39QzV_9s&oa+gPP7)u;A@b1l=94P^=Sp( zl_p=|}2ZFqE+YC0m z2$yR5`-VZohX2!xtlc-CTu!tUy(%$ts$KOjUKM|z{^yFI@cf?pOa?io4gnc$u0|&;5G&;}tK$Ze;$gexOi)UQI=I>esL8!U>7j zA7*c2NxXYU+x$Z4-hBH5zwYe0{>CL;NBV`MqQj0`3$z6VmH%IvKgn9+m0x1?n|*b> ze%V%DF87ZdWa2t=k$1vohbg*mngNd?%0iOj27#d*FSgWWSBUsEu%%o(DBm! zldpuc9&Ub`w`yrf)AcY{mk5iAuU^S)xVOPYr0eUEMTQT)qrWJCoz^gto#RyY2tIlKizo*Up_kMo-|7NoM|9jh0rEXoS`}e-Su-yLe zrRn%MN*Up@8j;UqP2aY@bnbw4-Uee&I|a@Wn?<9{>jSFFE3$3bOw%Cq_PU$vO# zs`f8r>s$H!ZP|`J_h!7VQF>vxT*p(!Vy>6m39q?&$IdS9JTPe~cf!KMV)y?y_phz2 zoWXzm@a);``p1d! zgHJergMie&Z6&O2t9Jj|bR#ouOPSX8_3!uBR90AodYrS|TeYKfVNi%lY>MG?#fv+n zw=A4;`RLJ#+MgwNdQS(%)zlW3@2;<~nD=beS+9$C^A1QXygldm8>U3{GHrD!HA%Ll zPhpxDch9dWDE!+YwDs}HEmv+=TP%OuV5oY&f1de*nV0L<7q3)OYFaf{pxgLR=N94Q zI<2a5jVDKJc8It0CV#p#YnCPF37a&lgV$80{5UKQUAd^MzAu~-r$gh}?WCy9 z!Z|**WlXhdyI%K&$EVFWs4Gvl?Mtdmf zY|^Q+xq5ixoM~kiR~Nl<(KVWLICTem$Igy5<=v-eg@gf=hdsM z%`=TSKCfwi{PNwylIm)mg}r6l#TWx!3^KmIDgN&I^IhHlqo>Ww%Rgu4^=eF#jun0A zo6}Z$$lz7?HIojPTrsV=DkA$fv#gk9yg175Of1XO-frV=b*{iY(KAz~z3`N#x&Xh>QbQTVXGRC^Ua_gU%+xO= z#3&qgC1>s3UEZPbb1#-|b~%5gcI)EPT>le=IvS4N(KL)nWHY?t@blqThq;piJYH#B zGICnFY1{8WnT8p{{F18^rhRfyn$*%!Vpn=w@!gx|^`ZF*Gw<%=kXsXY`Jd?FgN9-o z!>(MMc_iV;Dfi%lpSHg1@^y~9@yfi_r@*A{ee-gk=cMqv`|B!di|cKsP58@vZSVF? zPjr@*SsAg^YN0;?;xcLy7vo}~IbbNkJ=3;3764JyA}vQaYsp3L1z z=H}Tf+r1Xd`|s;kc>73*)0B`S8v+a%?=4Ti@Nm0={Z$zeL03NRU^4;FG|tl+Op=Vp zdfqBH`-v2<&zp2)%iJx~mw%XX+AL9gV&<8=dr`M@+cG@_TZO0QGZdf6Ud3=gXRWDe z`ZJchd2O$cPd~nBJHN4X$Aaz0kF4pt9F%1oTI{6D_3fG#&$DSl(Z)h2D+Qii+Y(Z1 zab{~}sDJ0(pCM_9kxiwHYk%)G*Otj~`yN`fd6)F3{`wymza9hmmT<-MW zO3gD?-@Un5UE2Tj>G0#z&40K5<#ftBqqOwOH68VN{a0uAO;(v0CcRVdxQVY(M9?7- z`{Oqpw{Dp;^Jb~0z|EZFb3WV3X0Og-Y!~i~Fb;PPPAe=}Yu6F28+Yn`&39*2y|w@T zZNFbxRcq<II0A0i-dViMdtLDLDFF)(cju<>;IS6fBXNhe8#$tO~TTTR`J;g zzgu^W?a*%j^~ZcpZ(MNXj`56|6N|2HS=nt7u&V!PR8TIPnO|j%NtNd5OIud)I9t!z zw)?F8@5AzTf42YM_TtZ*m(RZc`|v$4@7@1*`SrGbv)?)_|GV$pavPO4h6!_?MW$<7 z277hh;ou97HRw6RH`l*kug(7NWBGqS@7I2NI@?*w+(l*51Iuq^6Bb&COJ%n}k7%U(ZT)gm&(;8Dfyprz)m5dg{O*S;D@-)c=(-rDrHCEa zms#S_*w_A7wsm8m{?v-SQ?6Y)eSP%}4xXgXb?4T9VC?WX{9xw2LqfG4M-_DnN}iuJ zzW(IOf4yrB=Qgux?RrpZ(jU&RGvVvbi*`RQ@#@WxY+LqDCvD68*IIhTo9*P!bjlW4 zW$u%C=GvPpbvADPGGF6QgaoM@lQ7Re$x7WZwBld{{~ z-FNOfp4i~2aWwD!v)}DME3|x9rYG#&%8|wQp4H&mty@;NZ}Yz8xbI>1J#N>`=8h%Z z*Q=Nu7xV_6yBKY`qV&RTW!;6!J6G%8;Cgbf`asEY6Q-1n9c3S;a@lJ8CQo91eV=zp z>-GJ%){VhvoHa@88LPF{A3u zg%|gKo!swMr{Hz_z>D0Y_2C|Cc1IpNv57U~?Tde28`JOoyZLY5$-B+YT=jcGp9|NU zK6=MI`+e@b^5qNVws}~He~Zl%^WHSyh-HTH&0nf}*K)5|9QXIci(QY_d6uj(+I!>Q ztG_o_ZHq7tOlb~#xB76g%e!TL=ccxQHaObc6&V^Wp7=uSLAL)MsR(v)pYjZ!KT-EX?~sUYxhL<(gR&H@W0V$mpy&+qAH|QRj94KJlk(Z*`03PYYgo zPXBx8REKFnE1oi2E!U5`_WO3c&8dI)cHd5)e=jyRw&ugT&E@y&zkhmpdH=89=l}i6 zw_ESna@t_Y!vd{x^X;Es{!7x3kEx$fWtM$b+*)^^S|Ymy0;}R`FXId_tS)lN2VP+6fk+tiW~2;t~{;S>Fxjj zr22G!y=msl@BewTdi}nAwl}+-pHAl9ctpTL@T<0_o>*D2w@c#Lz;2^%# zHVb;R^ei|!X~M?YRjV7SgSAg@x?SL>({9vj)R!61^n1(96scbki!4l@6&;yXbz`zP zYxpV7tyQ^UQdt{=POqGrs_9*AaV7cdU!AMIOC}0)c7I5l%;)~~;IY*kb)%jo`L5TK zxBva&)*Z81^0xQ({P}ctef{6Be-C@|TJn0U?$))Gyz6jw{+`{Jmu_OLRLM8s<74c6 z8nkYmTys#h#lBxp)A#@TbN%rQ`Mtj@zQ5br*uJ`3JNNkS)OoQprmZ^TleKZ<8LONl zXMFG8<-Yj(`exIfNFV9$h*%DRWye@d6?bsVYP>(|)YtemmqRXQ@7TG%IR4}RW3HLY zmUXP0zjRmi+N+lp1RFS=bdM=*O$szlX0KW_clY7N3gv9fc_n3D8#V-YnVogGBXrv4 z`ZU(FQLE>uJ~N&ZxO(UA9jb{Mi#jEX~6jK(<3UHnVP&B-Yc)Ixt8{maV!sYj@?3=;9@}X9`a|)S7s$mTiXR+~aD_ z)6cExI-FTqTx~UP%N8^7+*fOlnO>?~d2i0Qk1O-8iCn!OmB+GE`cPTJqU5$$SwgE4 zCQ4|(Iu~${Em5^%^OTsDty-!x(`Ak3_qhrCpIx|a!p{JCxp%&`fp_J*q|B8|%{Ql{ zm9D&WKu$I0jCOz_?oIqU8oOFi$K@1Nf-yOHzB z}1tD zv7H>dn!V2pycb=u{!I0WZyXzq6lB)5$OLl+ZhxxcQc!Fx%vtNTWvj@>6+Dkz9Gi5# zy^WsC*?zlF>e!T>S6UBbK9HL;eMYOxAwk~*M-JujZN4TmH$G8q`Vp2#i3~GTf|7Sh zp4$23&C$#)1!n}lZTK3y+v>T69P61t&1R)JR~Q#<*=A8FBjKZce2G5yCWdV7YqgCs zhvuX_V4PHW;@sXv@9&+SBk7lNF?2>4=OM=DU)cMXiWXQITkmvCGHMMg4am_g(Yus< z{}^A2nBS9Ut7H>8_>8v5Y+XEwkxB1ULDBZdnU*qMv9o4%7cAIoFlE{Dw-t}oENNGwoWW~S=e4l7Y(;Zn@=o$ z`>wfME$aUbXYb6t@@K=AzlSp;O*kx9*`&;Ko9aBSu`FerE%}oL%%xrP$PzH87iPQQs7ftzo&j7H96Bn0@>0-<8+c zegsA5X1OJl`K{_zb*z5-YA>hz^X1Kl+~OGmZTJ8Gb1_fm%4}}kXOa?Ev`gYbeB0;b z$IZ9<|Lb3!y*TRuM*nuL+rFil1rv6LKHqsw?4q7s?vc9|CoMSdcv!gZ;1J$8!Gd#R z!jzh$yO)L-PgWH4t_k)LIOU-<(|z6+&1p}IwEO=*u#S5B?6i2o?tOC4|0=5goc{l& ze3o|ozwr4pzpqzV7pPQL5D=d9gXD|P3v6VBM(nh~WrJAl4 z^{tbdcK27_Fq>Gu`sls2U!|KgS-)pUna^}jp0uDV&5-Y;!Remo{@eQX%I4SC{{OXM z0?*QI9g0gfA8Fc?eqojEK8gL`KUz;;Jjbuypgzh=xu`hO@9m?P-#%VG{a~8YF@4LY zXW2fSG+VhebGzqZj)rHCj~e{d{~unzVBP=z`oF=Sd$|qOg*IK=A{y>*+5IDLa$xDU zq`X5rSN1Y<8{TO%T(0w2&3CpUcj2VW-HC!731?CsY?*n?!RyZISzGOYEPiia`~BnW z+mCJZK0y*qa3MoxR-f+;6_@6OQVoq0jS@wn`Am9Hk<4Uz5# z=l}T(T5FX4fBFAU@$#oTGh_VR{Y-qt<(5Ufc;mmI^TmeDnn*)2#t7x&P~XU?V6QWN zVci_dO;&tu)cUgR+U^+{x*ip8uU1dJY`Bo`vTF;+*GmzV{l`1Vu=&YpeV z@9e7PZL=G*fAF*E3(2vBO`oN5TH)-EhdV+(H++iK)etZjSBiFR*}MA1hxWA_jz+EA zA-s9kJO9s>ew+F?v+SLJL%2o+uxUJ?IzwL+n252MqRmSc04>u7!s zx^jhGZB~%b&0KYZxmmm_`)9rNFOJ%=(zw`*skB&D$Z&a7R5vHPQoH!qsuincw|tPC z_%b4V`XNR?p}(OURx*ArVOlTV+3{c#U-Q8#PPPYYzx5XQ#d3IExSPPS-zIvm?zJF; zX*1?_A7(gS`Ih;-(;AOBt}lJztMB)5yEE3@+x#(~edFpXd8SzYS355Ld85+Kwy;r1x$72cUOZlsV^eajOz>DN4^8I3F3 zUj#8kwQM!(Tp(z>|3z1aU~~A4w>&#ox%TU+AGj6$VMG0M*=cdlEgl^&YX5z9gI4b2 z*9qK9jVFFLycgHLdwt`ojwUMy?~EJq$L6F>&t3PcZ+p8$rp!Nv=IaNQjLJheNWeRP}dbm5H3naggU9J0>#c%IBwWC~I%%I|eQ$QCWz z7JF`Y?yO61ub1<0-hb=&>h@J0Q;hlZ&I)y|x2PylsV(bx@H(JUN2_(UWK;&j9qp#T zKHpW(UX{&wooJ|de&!|ttUIT_j{FV{-xEg zn4`hDbk3YxcmD>7m2OIWl4n`GSMw>O_}2V<1!mc(~yPmXO+I4zl`@XbcWR5elXl+PqfPGg16sY&1zFtx{xUt7<%Qf4lbNB2#?0JM!siA5lwsbj4fs1t(o8bsVH?8>IL65WzY+4-Yt-`HZl3$ z?5cDA;fw~sUPmrIQ4vz|%z1VE@uv;(eck6mXIB|_-?F%MuugpU@+nR2QD4h*UYEoy zH{NX>S>DLOrnyGP!o~RLuKqVsUX~`M?m88hZ8~OMV-v8x9Q4=3e0|*AX^*zvwAubF zY-&tw_$=$GN!P@T@4s!!oIF!=`IjeE=Dvr^if_q3yBzZZKPJTdx&)t~Wn_B+2TQl}{c1~Yawk4`m;?mKy z9XFmH@88xx??!YMz_Y zoEG1`B8w%ItGr))pLFtkx2Z)^S+3WnRXK-^CLBECq;kgjnTkxXahBdCNe6)rrS1*i zUy7KTxU|f?aVK=G>D=tIYL@+Oaap-%E4F^~=yVi0c}GcxiP<7z#pf0lrXVE=Mi)(I zi6i^&$;bx2QPJGBR!JjG(3)Ao)X!qwgPyu|KW2X0`7F-6L!r{5y7k<#Xv*oC(5brYsSFg%jJS}!|t}gaJ?)|>*ulN18QQzUm?z^XCR{lRUh380T z_Qlz=+t=^g_w&)}>)+dVE>9C|Jn|sa^pVc*l|BnM7ZzVmTe~t!URv37^)}hhlV5kg zHQ|`3a?|JV*Tr}9d=4L2=9wF_=Irus1v3`L+E!VK8q0omc#wHYe0QOTQJ>^9w^>E! zAF3+(o!O-2FCnF-z?F2)xvXq$uGEi{Pq*0T#qF`&_TkX=6CQ=?U7p+5UColpN;GCo zxNz&%$}K9h@Py|}FXULBG*HVgshJV! zA-mkwfAh3Ue#>t)Okpv|SRvwJA=hI(Ss?QBh9xJQE}KMs-E%TIP4{f%9gj&H3bNB~ z1^FGhGbN&8hMQkzWL9>g#$is)r9alpVe^YS?HPJ`!X%aT-rB7vRE#ISxqoM0dF|K3 z@9RI9+y8#`E}}itXtT)VTWLBUh1Z@{57@cy*1s3(^J|_*pTAdGweu#=+MBblx9jh( z`}_HR&DWRH%aBYRoxiPqx&DuT{g2iEKfKn@OWS$l zuHBrd*6mL}KGm4;w@z&0>P+s-t4`g$*z(BOFZou^r8MIwE{EnAFQ1dW)x;_xPI{>f zui>4oCNn2VEDf~#cWv|AZx6-of4`aj|ATgOj?w#N2el_9Y@WTxafZj$RsFlq_%Ln1 zcBFS=+nkvfP6VAR@JY6^xl{YU`S|~z_Wv*L|CL|=O7H)Z{(YNYe0qKVj``Ac6BC!^ zx$--)hYBuRux^V^xOLsHA4zDp&y8KN;Z(q`mZiJPSZiPI z-5Hard@r@cFulsn=8@TlbqRX&y@JZXM!3s<0rF%U4mh@2kmb%a!vOdVw`oUYvG}7zk+fOe z$DZrD22a|NVg2Kh2}hSW7CzYIj;*d zKN=Z?m$L2neUEKDQ=;TCmIbbyUH9smt|g`vnZCWccz5gW%ImfkjVE8`#-7?M!ts5= zflS?JpYDc4vwSFf{aRpp=?on$2mXuV7IV%fxwjrNelRgY_M>q4<;iiJ4Q z@-M-9-dErLZKBePuD(0QDfRv)bFpE0-(`zw8%vcg+Bk7G#ecMz7v6H>?VN1_1?I&p z^S%YwwqBCaz9PG!T>Px%fsOah%xT^I&qVL)c2oQHuej93X0WbsJ+tnf^dZsJhkrTk zSr)|7o^N~n6ld&tnL9D|tukBA#jFij@pVSW*T3aYF6=%2{#cdhvJXA4{mTEQyooSo z?DNogUGbdjo9p{$uYZaNZPrVE!@Papt`nt4F7O_Cq{!T7f92rA&)JjLmKEpgil0AZ z@xCID=c{_6V3@hK!B)9biE<0}R9^SH`78CuuVAfN=U9#u%w!aJHQh*f`IXaV60BO+ z(-R~$4HW{7BeN4#6S9=n_&(&QcStw6u;$3TZ`I$gU86lWnI}+045jZ1%X=a^m+5O2*kUybBGYm@gi+xx4>nzI$awt%Uo| zT_E1 zyB*Iy-|6F1B)C_)*&^nQ^UbDZ0ausGyyHLKuA1;9=$(_2>;c+#oe@mKA$~8rcsI}6ayV{Kk z8FCez`tx7To^@jG%(HvLe3h23TE?XoUi|&R`7;lXWZkm%Exmm0RLt~Q!W?EfY-(ny z+m}=wbF=xPE0t{88EdO@^n%5qUB?bwQB^g+k~PP2R*ZbgiJ3DVXPmNR@L2xDfVuwj zkEY$uSDzi7&MK0&D(6+28*}FpyB!p|U&F7Xc?Rw?rzf7s^jLMPD@#IfC*wJnR|z`|_Cz(PFMPoF zSCQG}97~!%WTBFuj-O;4^V&o`25}dO0xc` zQfxA>jjm@-b~W%(7UsP8^yv(C$^MmF!o+&JC$^rQc>KuKD|fGmo@!v7>C3{tJnz|6 zNuJ{O$F2y5sGJdanQSU&ruX+;^GvB8&6P6+HkW+5Z){zYcksuAotqMhC$dRfIn9}| zYUe7RhDKSx39VpoA+=^i*|8Nh}GiFdo|pB40NsrOu1e;zd-Kg&uuz7_kx{8#rn9Z~PVW|}r>YC5SSXm4+Rr(a zxl;4Phchk@;~FzKnWjwansejq-pK2%s)s=XBz8xH6Tqv3Z?p zin?N?(kdsFBir)}r^Qvf);ZQ!Dc#9V4DUW!aN&P_ipv*KmL0nkgFRC4p5_a!h*PWHUR%GsLzX+rL+l6!5qP|S#*SjoV`+WNTKcCkB`>QX<_c`dT!St}l zCF)-d-bQI(|93VbebwX5D`xJV5M#gV*Sq8IbJYY3&N-zxC$$ON^mCrM)DoLzxVBGM zeci1!W<0^W>WU0`I~y}koMCac5mwulVWzaD$nv@s;p1}OpY~{pNv@B`xr}|EtoKe!v)WzpMON<2jh$(+ zTbUjk9GO$FY>VXQ$E$s#rzOg4nQ8TG>AYu`d={UN5OtZGzWQoJ)xq^25>GiRsYz{m zqT~E5Px<7L&S1Z5KCzrS%>vw=OMF~9h59ci^rgm$m_0FBV%VR2VueQfcC%c!V&?BW z=1TI*c&;XTOxc#ZQvC6k4D&b7n;5Eo3-#waBz}#SkEwaS`1yPL+Akm3`owGw% zeD=qmM{mtP;QVo5Jy&J<9(e*N%U zrVc|lcAG;rzao;t3k)`|48MH(?T3HX{c>`C^Y`!AYdy>RnqE}nY{QQ`(^xxL*V#Q= zleTtd0hgUsoIbzN+hdmt?`@wnmn{%^_dZ2|{Zx>9O71nk;L~uzb;D5XSd25r;}GAHTWmF6g{)y zeO9nstZvDiVABP>SzAJqk^{Mp&2dP2T2b}$>+IdXFaLe}@Zk=bzS23%4j-P>R35_Z{1ttn}^ENXa`%pODeD>K5(ht}QmHZwbn5`*#e&^rK^K0H;|Nr5o`1*JM zC)a;_%yehZzt867ZfD+zaR|3su3F8}u}81h;lj6rm%Hmf{k~uMEoJ)~Z>b8I_Sv)B z4}bje_x)afm-?^U?f<|3e>Z=sx@U6xp$q39*BvfbNnzc4XsYG|w)Y?Q9DOoxa;1H{ zt{Bt$#;LMNh7t3*T7Fi!?GN?crJVNd_wl`-ko?*Wql-j&8n66Hn0bZY&aI3E9<-@{>b0p*}*5OXL|0Pt<{pEE5XFUx!Jr} z(JQ7)cWFqd-*b6+~*8lv{8O?oi-xPa%PoB}-WHjeNLE^F}epgHmu$F(a5aLJ> z;=R5;K>VQbX_F@tZmwKp(w^P6B0%?T$mu;-UI_gzRyQgU+a1b#^J~zoS;tGN*;}n^ zPUVT62sv?cSBJKUN-cx6$nI;}UHg1&dU&nf-ctc$FufB5-X(VnZ9iX2)$R)*cE{hG_%u(|Pj z7h}+UEiMm^CnsVTHFt0ADbDL$KXHxRW_8BHM((Wp_dWj+z}J7ks%G)J7q{1%XR<7u zw~@`w&*;gOJ6R~(wMusl9x+ocI7{rTx%{9p6`b=I8P_H{OY{(Sy@>&4^uef+-<-~apPwD@}QoFcVN z&r0`aWFLKF9)G7{&q~Xa8K2%&_h%i>-&eDv*5a;gy1LNIrQNwD%lL8B8J{-6M+I-gOM;s&&Nw>fz|yT&+iz_MS%1#AGIN{8 zS+C`{UM|~bINP$>HN;R{b$#ZBDH==Hq@`YqN>f_Dd0Effyc;>2RLV9OcU0U-Yi2lB zdFHkvZ_e7v4=%qri@2b7qDb4$N!u}bb$UHZ$@<9V9Ff*+z`3yswn7R6Z$ zer+`WBv8(-ny~tNWVY@F9p!)|3C3s3FRQ$r{NC+8R5 z7SBtbV|;6hVxHg3YP%O&t5V-7C3xnXt=aqXm*Ei|&8Lb_RW7F`xSg`>mAuGM&TnWh ze}rS>q@62gwTbHQ%+5~ZOMGnju5x+8`U?v;u9&VQ*Q4@Dj#*n_3FDC~A}Y+2*mrMp zl>0p6@}4QFD-CTDxSY3pXRPY8J2P>1zl%>ycCfKv8k^u6%f_NdVj}4q_BbU9tbTs` z&fLyop+uEs9$Vjh;K-3mHC|Hra^du4emsf-o+^D-RUQm;n~%;E{vKlU*uwtomEIF` zXU*J|{b7^emS0;JWG4!6FN^=mXL?#QbBgrA9Ko&6&KYtp*}77bagASE+*amSo zMY_OF%|Q9E)@Iikwl7{^TXf&KWvWN{Cx#Q88u!>1ZaWqyv4E#+k;~Z}y|Z&CUpf0$ z=Ru-%fM3Yh&+&VIoE2Z6a>vBq{{Po*@qE5#MW3H}I6ch0s2jd(snhm2-jbD5CS*%m zsvNE0>iE5Iy;S5Zj_b-?wK8A#Y`&+6L{Lt|E+p>gb5)M53bI&X3B-I+2sbwCzd1)4B;0(8~UWSME?5Li&F6&3A zqsx`g#~S3WU)Xs(u5FRITYj%?$4y1X_U|p+Y8$FU%|BRlR_m%&KAFPc z7g~k49Oa7Z&fFo@`Capm#?Cd?w!)KpZf31r`*q%hbIsn*^4a@5Tpk@>Hbc+?{`VJ-uoY#azxU@_Cl}H zmxE_>WrM;(8(dW$NO)!xXGcYcY(Jvoy?ppH$nSIy)vXw>&Y8&TYHQ)WFsi9?&K~l zH(Ido^scpjSANdDWF8gD`Q*>9e6>K ze#xQwuALkA+xqSnP?z@xw?`Zv}_WEz}e}B&Zd$WFV zrp?@*;#Ve`Yi9^`G`fe+b`PJu>&oASZ@#l%`0(`l_ww@JPXjKgc`v&iUY@*d;(Xh^ z67&AM+wYro?Em@yU%GEQOD>z+nCt8HR!up!cjKy3nZ(;3t35ozlUw4h34FbHLsaMc zRIQJp)859O5X+zEJV7M*`G)!w4BrXYT=1^pC@@KO<&Q1wm98qE3 z%VqaQK2iAf`tXY}fWGG8Z1QgnsG1ZR2UfmEExGdXkoa^V(d! zwX4z>B}zCPc~g1nFO!H}SbQIE2xrE+?lyCM^@SZts!C#MO)IyrI%JZ@nO`2IxMbbq z1Haa<;OGed(|k^4&aAo9rn!V%)p2s<$>z!x(K>SSZuZ51&9h3o4D%|Y6N8Pz4`14F zC2ZBXwG)M}w#^Ljl|6Xd?G}%F@Y{8FC(I7%?bs4|d56)t59$Ibb@8?zOXnKj{%y3# zulTm4!Y97>a~k8gWFv313A6~88>dfPrh99CM|phm&qeEt8?MM+RGpBWa(4IbcKc_q z^knjHg?(fVw8(F1@!HYNqdci8*{N*nw!-qHcZV3KH8{;!k*wVzfBE#WiXUFD=Ue9Q zou_d@P$xQFx_Nc?=3UKCUMs&6@Xz>o=+${0o^&0L3j*&s-Iu<4eY{7b;@vSd$CqEu z%2Xdayl6|epyszJf-%n5Z@%UFsWZK2=k)Cf(KT7y{>jw56?>%6`TPQN_Qous-$%06 zRI9x+SiD{%W4S)_#y1Z{)~*+Q7+Anw`u^O8lMDGWs{gON(l~R$wB{2}6E0S_%Ei|Q z^gLE!4w|&=)v9&AyytvYU2{xQbDAH-z_ghAy~6TU433ABwU;r->kF1oPTypNnp`2G6tDL(ps;cm<5cz4-U~dU<|d>c+Bu{rp#d|6ZJ;u~gjr z_}`5t?sKzq=38vNk|S$SmMayL%5XpQs?4q^BZEMV3lFnDOKj|ls4D1v1?CzKD^~?s4FzVndNQ52H{m(uX!9b4cuqnt0@>r`?PG;y9*)S#apKoXPfEk`fEN_am`dqJms8}C@6P) zijcS0*}W@wAKv1(`)upyJuhBv*&@NoXKc1;N9ym6MeB=q#`bxwT6gVH(&Gasa+c1p zX#KT!=VC!-0jXbmvKcZ1LQ`jT-`iugBhgByQmXZHxIVxA@26*jRy2P1);@dn>MGYL zK6a;556_CujlEGeVdd`QM=ZipZp~0-4fT`o*di(8$@1)8z02}9GYp>Xxy^G~;n1C4 z&a-C^Fd40gx*8UpEYN;&j_I?4!eXIUVrDEm7^g{C78XZMdz3bZ zCoh|{RZ|yPz1l4QJW)yL;fw#tTPEKyX5;t1r}6y2Yj?ZJb#wVkcevRuTpe!Q*x_Ok z!@0O)yXn&_XCAot2xc4is8}A{!&Pb=+jS$ENilUMQ)dRr+-9a%S<)sfiWe@4m19^wIkNyZpMZ=KFs^0#`=A27APO=!Vi@3cLTQzfquJf9y!s!#2t}@Hc zE7kPf8s@Dz{gR*e#anXrx9oP^u&u8#&F$z=ue4IDE8gC}X6mc5;?Exp&cA+eA*$+_ zP-NPUr)Lh?@ZOZ*ir2DuYS-a@QJeL(^q!hOeY}x+<-u}C&dhpLFza|>x-0+j%V+;S zEXdh*?B4niTi5@NK0c4~^4t_(sv1mAQFHOmHg2V@9TcuJRAS-Yrc5c;xlu#zSd0=YP>ULy6f{xPJ5P4iNA9`et+GK9HCjJxqV^N zicBBVs+T^E(ec zvk?&e!gl-qs)?++AS2`fq4`AD}t(BAm*oQyr!UKi%N7dp!xTNtt||ESHC5Wxo2(e|*)gSsPWDf`qc&3K$iWtgdNts|S5=cb44b zG0At@Xcpb@Yj9A zkTp;3XYMre^EUkywRRR8Z~C(Pf0%x4yfwenV#?Y@OEj2wt$V&k*13M0!pnNby|+}p z=gBx8PPmJ73q#v8WJUEcXs#eI(mPV(OCw* z=#LU=ynhc^6?-ZEEl_&T#8INN+I(jEHj`}?AC9iRvmyJ+0}Fn}y`qcPT=eg_7|Ri6 zV!E&VeYu+rQ}KZ-*S)Xq+^i?d)BW|O?RtZI#(Q4>zP7Nhj%99UebTF0t?Qn|y)KT@ zoicNA?W-TUjE9oaTxvIMZ=RP|z`-G7TmEIaY|fI>j55|&j)yL;YM1MuajELjk=qH0 zYDOP|Ouof7T-TB7SSJu9))ja0$Y zhrZ3u;NUr;bEL7>dJntZ53P%D44C)InnX$pa!T?yy8iMhPyZ<>R@yk#ZA$R*89HIS z%{u&%tG%X`-`l<8PEUOO&r>bmy{+%r{P}fsuc6E&Bh%m+0>zqM%Pvolv)}#a-1hss zD=WVr?Vi0fp>FBBS8oKaO}+g3#*bG40=107&5Ax@w>O;$zrMRrDq_O2Ju+S^>*kcs z>tA~1?39QVX7;ktyVf56n`yUYY1OP_x7(j?&@t`$kn_EK`R?{85xyd~>}MP)lf(3` zY6_&gmsA9-U&WUG>IHMvf!^(Mj}(_3JL3`P)ZFO!7QsuCg)XLvtS-*weyIw>MhN^JaOpiEq-Riha@V;_dI;*XRG8x^kAwgDI?;GIJ{S%@1FDy-S2ONAO<; zht00(R;!jADN(v3yIj%w#zUQu$IYeYigVsS`Yh^yiSc{is@>l&%3rVhxaQ)?nzWaT zKD^jAapAm2JK8!MZ>(mvQY6 zd6l|jqGn-K_qqe|9V#0$bfco?PG9zFl0|y1~-IH>Fd_G;EriizcV~slyK*9A0?mj@+}Qdd1OKyeU*|r0mQd8(Dw^;p%Wdhw zJNIQ~+AJ@Ldb3&lJNwe$!-;d95tQMh& z%KvP%bQL=yIgk60e#7P+$rjwIi751V}fw>Yu5g(;xvco%^cp6Z8>5_ndhD5*dNwCUc8o* zZ{EZc&o66kwdy&{{yr|{=e?q+KJ)#jj$A)4xA*&-S4j$qXPfPB<<7U?yJz3Mzkko$ z)mIkR*OvY~*?xY0T<(d}TTUt^y*tG7Zo~5MwX(tOvokLz#bsH`o{l-KV8nYk&z#S) z^^Stk@|M_+O&gZ*)jyjuspZoJ$!WsZxmH|XI`7#st8mj|^R4dTw_hK>otYrA^ojWF zFDHLre{Z+9q&zhDS-;-0_3^efA78DT>6xTdRJ!fk52gC=(ek$Y_svmL{CawIXHZq~ z{y$&R<7N%QRb4nPc7!Bc{2QY`1SSsx<7wz%iI0^{{KTN zv*aGL-K)vJyl_c={d3!f`mZm$Z)tSLytcDX7CbdrKBco_#x~9V(?L_0hKdTt zYF+%~U-$p_`g?Ece_nNL4AYr&{Y=jq zyDDxjZ&M|o6gf@)|A)DSQvdV+uiyXg%~{Rf=u*@7zxb`4^BbZ?HU_>8QqYz2OurJi zO0;Lg)ITpb$j+TPEo1BNJ9A5Ow|~EMWo`ViZNFx=9X@euf4QbmM@6e_*pl4b<5!(# zim*PNDXwZIev9$o&FIHm?-gVtXZ#L&m7DoK?|xDN1H)Fi8yTzf^uDoh_`bC{lhGj( z%24phCM8&6gN|?L^O;4HY`lKl+aypJQCjGCWQv*7=}TEtcKq#}xl??)!7QnuwB=`N zx12hc5OX0m+h}gRFx%Epk<&tz6F-(53Oe5Dv_Wzae>}Ui^Az^aSz>MZirc!xR+*U= zmuCB}OqP!oN-=mfxmpEixm!)1Q`FW&dJzjRYez;&TTqZW*yih;hHV0*KlX@ zrWrzCMdfl`RV)lSCYtzuxK{c+G3Dj!PetF2RTBz=#f%o*-mvD~qSv853o=Za%J~<| zc5zI(wzTP@WLcHu!sP~@Po7QS%PW$YzgvBp-R`8kkA5|G*Bd4!y-RE6U{p$SJAT+` zK3{&G|G6`Z&%D|iB{$yPx!+4lF2)aA@=OHCG+SzW!nNLNJq^;apbH5(lJb{{``LL;Ut$>oa3 zLFr19{kM!O4=geK%$Uwv8E`)-ZF@f7`E};u{(27-l5*dEFwo!XbJ@gC+JmWe$!X2W zQ`yY(%Wj?joGE91c+1Q^k-EJucTUcFr+57L@v{0G;#X4j-hF#=Q`PYPy}6HC*qqN^ z@p){LAiij6RK`SxR^h|`-Ibe{xgD8VF*EeW%+9O9rBaHA4qFHn%<)hC_OrysZp-TD zbIezC&*xiu?(M^XZ|zSluCI!dZp#s${qWb_*N+ds{P)j5Mb9@pG%Dw1HdMmdYR0n+T_`Sy0QQ)1~1f5HbwoEdSlXhxOnJF8q+G6qd@iY!r!-NRW z{;f=f&6|VI+%UAb_;iL_Szfo762q%obEFPVaj*Vgey{S^!_Cw8|H?|J|8&t*Yj1_+ z|6kYN-aBJ?W5v8ld!_}(vdFpz3rzbQbpOuEtlFx*KOg*Dd^d0M<{jC~duO$|T;Ec< zbNB4QvkdQD zi>1FKIs_&*TY65gKGCVVw32ggX~6z>vH{V#Axv7FJ=&92{$BJdw9!me&GgLHu+ZQy zzt?=0S(nz?Ipge{le-!xRWCT8*P(Fal~`F!+KOd9CHuq<&pLE>wv>jBo#rAt2LFY@ zoBhnBExlG+dd5U;wKATin)j#Rin#u}eS3D^mp5JDD3rBo?s=tWa`CKU+h)u-TBZ4W zR(G36IEQP}hO82?g9d`${Qe$33x9bZ(utVstkl&e8?eA~TGE+)S3doE_T$&thXt!b zXI3%k2~M0ao+8ZT8F*Pt!Qp+5suhQXViHJQuuh&`X`*_3M%6q9#e4OJhzMHDmD?MX|XHA^n zcK*{rQNcoG&uw_qu4L{0`Rm!))8<=esf1mYS$Njj%v4>+Ti17TfzAG1FBY{1FXEfL zy;5M}?zcxxp6uCshi5k9CbxZ;Z>eA0X%_R}(=%w(s#qphzVdfbOYKfcNtaG#NRVJ> z5IuVRnC6a{c=sTO*zbDG&ut1$RnCzJ30b=Y*>C^%uloOLno9IJX2;;$cadk6aMQPFWA%*~|F25h zg{d@7;G)5o)vwLV!~fr}|MBg8{r9rWX)3p6te2m4beY~8pJTrC%gre>=Q6!2o>ju2 z#O!+Sp{JwoN{{W28aQ5TE#kZ5(lJvqkfq(R%VXX7EIa*mRZKmpc`ZNw)F`=yAAdJp zOZ1fmr*Ia7uz&@tLUBYx^=eUp3r$i>T2v&CosGELzx?TkO#+AV%(Z0S<>miB8(;VL zN5u?nuZf9Mn7;ff`~Fotd^&Sb#LPAhh7Y@5aI>6pk?^r?XK&dmw_dNT{`30!fBySx zzu!IH|E{fxbNcg}H+=Oc&GwRzSThK2c+)Y=lW)-wU! zo15MHRlHA?e3|Im!@O_b9f1|Q1-V;?_WysL{mp+~{{CK7mnxn?2jtuV)kFpVO}%d^`5T4$Z?BEG)9xVr+*r9(C(} ze)-kB{Qv3tf3N%h_wWDv;Y|xq%3Qa`T4nbJ*BMT+A~Vk(=9?a@!fr}(U9;c+>>r0GJ}PS!PF*0pqnv9ZtjyS(6QQB>oM zb4(^hg;=z{u{xqt+T^RBcucicX@HPy65upEI+Go$f+VIV^_;k zYtfm^I|L^(>V-pM1opYwhH&hu-obEz&UZ*E9W(Ter4T6w{G0_Xf`>Pxo0 z;+e4aMz({yLiNg4kBn{q9PV35WQr8sD-mIwV7KS5z5k6}=BuBFU%j~d>z8*EuC1!{ z=ojix=rNhq^QXts^{sIp&*vo~r6JbYMKAK-oVgtFam(k)J}*mzZZa62ofmY&eXiX8 zq8ANS)43T$7zNJFF%4O^KIwjWYwr5o&-;1D zh+Bx^j^Y`G>UG!d`v$e>E?`e^RR8>KRzTx4yp<738=Rlzu$E z{%4fOzQ6z08gIOCyubQcgHueG`-A|;q+c$`L9GO(XnJ4`B>b@Ckmf14cTds7v z%5*9DxH41Kwr95%JS`P#T+7vNut;)O%S8*{$8D7tzDtKb1aa~QFW%uG=4Wi+JMV0iG&7ZY)^74@NVdYtF z3}93JcflO&)%HUJ63vVS{Y}B+)vl?EoZ+?7EoNH)$;ev z?A`P0i^aPwwfcjnOBt|EuUNUmglGP-m#gFNUio`++RU9X_x-k;U;aJ4mcdvx?EmDK z%w@-{zFJSZwy53g_Sy9OxchaLXA{@mN@u#;a_E5UBGzJ!1eO`@!TC|st7c8F%u6%i z70Szdl6J3yD@e#a;OuXci+6v2yd3?~&eZ9laklKG%n1gzUXy*MEqfK?HBWBuUAIpj zvYIAagDlS31b^^ZtI8plqH)G0E$!XGn^EjcFMp}+DCd#rTrR-L?V!N9Nanl#dH-sc zB*yadnk-ev&vrI6Sm@d*uDGu@V;=_}TZ`C*Ggq!_=)ddRCAcEXA#vlSWri;`MeZ!O zekUlwG3RzySWS>EOJk9h^t36TT^K&!it`to@Io$_&y<0K;ibcxm zt{$HQ7ha3GWmwMs_H|u!wnj%p)atdI6HT%ny;NCsuXn0IQ+Thud$^Cv8-A9?nW4OS zQ60+@CDiA2bu8eCvDg{$D$g=Y)J^OOhvv#73SNr~ErNXnTRJcFy?yxj^X1Eh>rNfX zeav8Z)Zh)%Ooim6%|$)}kt(a~YknVo{P*(1rzx*WGc%`l_^iu&xYo=iX<4C$hsU9J z328^pa5x@pJ$TuIRdIsnuf22iXUq_IcDQI$^6ckl%WlQwWyoyQPhfa;G{2^6Wfc3t zi`mCZ*YWNZSY&*k(Qa!)ixQJy-nv@_wl&vhFQ2@aGjNB1ckG*rTj_7I8vLCd)3jU~ z1mCIUopS04nIUuF(sl+;jypV?qY|AM;>>NoFJ7{ofq`L`6?dS?SBAC|Z=@ZZjLkQf zT$SZ|F7{$|+eQYr1<`7W9`p2NPbU=F*M7VDcK`GJec$fCdNk+b(nckxGspiH{eP%= zCN4I2yYS1P$u*q~N-wh;Ja`(fF=;3{%r^Hvx|W$uIB!{^&f$P11>3q$ct{-dcv)4E zxBAXvZfBcKt4pqO@Lq1R$W^-`Xt63=VTUE-M3KnaE4BhAPIqm))0Dec7ydXszjmMW z>ErzVk0bWg6#sp_KCk}k)w8LEEor(f&a3D1sk8t8^XpUnKlwUM=by{#e{EbD=@QEA z?Z&&q%J^Pv{GHgh8cnLpzn=4%W^KFsc-%Mjv@6r2R(&ms5q@@N%DD?X9t^iic1z~# znY*6)XrjOQTGrZGtChYR8(vu|;O28XkR|Dw(h^_c*&fq15;&MY2rSb$dX{M}gQo&R z_SNY-<@|dkUa#Ex*vCbqrlw-fiG7vDiGC~*Y?56*K1;m4%k@44NhqCJyhwgt^R~n9 zvb2IdO%6uS(2uXJ``&K9=l{F@`?|SLj9Rr1N!IeIy_v)H{ZL)0ZJfxyy;605Plw0X zSMI)>8_)Ol{lC}w|Igpw6U!vH(vrvdlB;gJ@bkNOR5NuhmZ$Y8D~35uW@&O?>+Mpq z`1c-Pj#kUvhh`}qHt{$kD!Bfg9@~T2uiu(*#ZAfIS6TeOq@v2o@Ik<-r%wwiw~C7C z?U{4SMw{tcR_f&R&M9jh4s0^{q;dI}PwqVX{d;%G{XBlS`LWuO*LOPDRgCyw`>8TM z^vJk%LH3Zo%f3B#{=Dg49smE+vn=n0$7%{o4Rg0Kvvlx;W@r5UX}&&B@86d{`+^=S z`1tV$r9|(Lt(2PCapi!>)w?z!d!@72wUtb;d7h(NeemYjh!38k9Tz+uE4O}|>STHP zRB-Lz?|)C7@>bhZ{#sk5MO(6G*GIlIw=-Psj*CjQw@tSV5j!k#_sGo8!RxoBPU-Ma zb5u=|SiNQGY2yh-f~razk8l0p@x<`ZLFF4)WF2N3DhUe&R%xc#K5BTk@EIc)V~Yy2 za>D93#w$^R$qTQYvAwKiEX~Idc$QT_DdNwws%ncf-+xP;*!#3e^kbxJ&AzmFCTQ_I*Rf~1(E-ABNp3TtN>ew)wb!phTY&mAD`wN++)A@|oe4Md& z>$|TPe;ISm`*t&NJ~wwP@PeCTrBqMc?rpyv=%Qs8YnZp0h-2Hq~ z^X4xm=T9E-G+w5>>kk9d`9nS)HR*p3@A?z=D$_lqYHM%y*ZD?k`}j%>`<}0UACYM# zvv&5{-y+rSiozc)mD65__nmmZ^;%K^TU~L@Y@Hb*yifT|zx!Q!e{=cHO2yVtxrya| z@?W2G9ja-Y_&Mc;Ry4~2lb5HYm1Vmh_~^gx@X+gQ@K_wd@xpQSM19l$*WPWNo-3)k zqmpgjxkE8;EMyIefB7&OFMVJWo@S@@c3EU0UyF~Q2AgpE?wPBevCByb>>v0-!VN%!rG)~_!6t+V`<#L=#1r{xM?^?bZ`^(Ko5Dq5X6 zT@)pA;c(<7N%r%Tsv>4y_I#}JsNiG+Gw`h>NIce=I+;-zi;-n zKm7Jg$>W}VZGDZIYld9b#Vc2pWX}AW>fph+;O5eGt#WIgD7-MaaHP@JhGSQoO_1)> zy28l1pJ(6Ry&K}cIqbQUT*UKADeefJ_9(T$&p$6**vJz+SN0IoBNP47jZw4p)^Zpo zMPE5Q;l)?Wtv}1DhGHbOAM4oN?@zgJF|GquDWP}%&x2Ilw+~kq6Y^~|qhmBkd zUTtL+Si$bbvDs~p&Ds3@^(B|D8QJwrxHFsiORmJeUzSztWt3!91Q;Dm^W_^jjQrKs z&3-DvVj1-2Vj|az!^Sa^S%1YCdam{y`h9ll?}F0o1EIzJCzKxcrCsj0|L4!wqh-I( z>f7(G+p21N^)jcO4e#{b4*a+zCtyHb&Er#b#Rj+W&v`O5A?`?p^oPnq?&SvYNepBXS_(*@2#estg;J-n_JB z+v7w_nPCnMp%b^&&r0P}L{ubtm2M#Xyymj)VnU5`u!`~|9E4A5d znsBGN<&G}XfjPf;x1SPB&~0JT>Hp7Qte)gmR(`Hpnc))K#@#t!8eRUp(_&_c z+=(lt7t<2%y*PCq>SUH)F(|BbqBE*)xfWPtKn6K~BX0A!PSngL*V#;2k z$}2R*NN=;O+&nSUG^b~Y8ne%qRc}>fnc}d(=|qPw9RCp&AeyAM#kI<8_ceUy_fGlufJR=RYqlY_k{_b9GV96`GkUm_ap=AS)WN=ozBptkoHndTOx5~ioOy{gqvFu)29igQd85k=VZDZ z5J_CN@SS(t&z1ekduJWH`)%{Dr)Q6reSTI|TpYXM>fg=%lNm04G)QkZ>{)tlIk!}O z;qImL@5kJYJ!$aonfd+wwH20nR(-8%yYA%Xty^|>L(~$7^g|DCU3gv;x&GCjH=K)p zZxL8%Aav0}iLIxV!GVp(y(MAM(ru4dF6&+Cx+wdHlV-o&DS86FV)XTC69t z1s@g*9zc)KR#@GFST-O$~WNYfhRZ=>wbA;Y< zM6C4I{8HGJa(LYpNv9cVf)h(zU5zKrEAVY-xbpXntU!`RkJ8qk4RmsY-TRQI2RFmvZs4`>$R`RQ%dr|M6>$g|43= zkG_7zs=BO3rxb}*iCl6L0UU~t-lcu-)?aVGTdJIAMQF6hso&QXWi~o2?9sWwld9uz zqoduS>Dff?Mnk15wKHuQX7AM6!E7+GV9svg&tD`3md!c5t~M*~jO{GNzmI;;+;`1v z<`#*$cdjt*{i^dnWqQ><^=q05^O;JYF_p#iTOVE8|6+!Q&AFWmBGr@}Pw^@?$^WpSWV)Dh_vXgF2xjJJ}6Y#N2#*Dr&dh_Bnj{-`+!!ucy68nl>T(W5qnbXRA9D z-u?aEl{@dYH_O{aJN(iQcbuvB7uIFr@CgcdepzYV$8z0S=zHwz+3!N- zb3ZUKm7e_kYnBy{(`#vNo&}-|$L?jU-Qv)svf=Cc3)MUOgr2UB`P_8<{Id(e!Uw|& z)DP~Mvs8WECNZs@BD)`&teKxsn^Zf6fkUvbWZTihAN<5#XFTW<{eE6T)-zH(ZF#xd z62YIho;=_GT9&ay>~2@n*V1-@ib1xawuNiJ`Pf`?|;P zq8E9;4trB*Th3r-=omC_V*eG{u;B9_UYK;$h&;bL{rEBi-e!YIX2qK|)NY>*=`t&2 zckAL{a$@qm81m}m<2N479FDHDUdiwK8#tRuk=u=7naPr!%t49;_x);q|C%Hi-*#bN{7yPw%nO+wYpN1ng7rcyLJOUr&NvEZ+G0~ZC^fF z{~R;l;+Xed-1GfE=b7IOY<>Ey`>pu=`#evaDz-3muRi_uS(cT}`LweCA6H(LFuVNt z@5W3G*W8qV27XL}7j0T9 zuiZ_%^F~ceq@jF$*(^_msKCQlXNATuS9rbdyr9;S%StQ`T-g`wZ&nH~XrHZo(13Fh zf2-M<{C9eGzu!z^T@xv>#nskH*-t%~_jAV8#nE#Z1O&>rIG$}g#P{*r-D0_tTWeO$ zemdtrPua5NUU9~@(aPsHHSleI&cl3Xv2gsPvy3kSI65yVEs0l{@Lohfz$tud^1Y9; zo8IS}2q>?YWnbR(*kF=!%ha_sb>$zwhOgiEFMPf*n{umOfPkOJkp#Ic{(Sjosd3Yy zrtg{~Ca`PM+lrmaEK=qc$KTFgeLMN^pux8|R=G#@Uwdbt0`E51!fY*kR zT(Ue2FT~DdGKt@K?8P8(XzAgWi+}%Vly-RV8H5|RUyI7!X0P{qvfeAf2dmqy$~Z2Z zH&(5Q-uBKZ z-!oVF)u;5|Ifbn`wWb^@ZyrRwD?3*wx7ff-aC1b~>5DUW8#6KbHuLo4>0Y`Uv3VPV zla7<~!o&w__INv<6H$t?7Cq9V&e`5x-Y%JrYhH1vG`noubG)^=P$zqSL&FqyUN@KG{Cka$=On7lHP)UM zG1uh|;{l)8y{5*SqeK&BA1NwKVlP`HyqWz9oB#1$GP8P&rWDRdDK9nbVQppD^WE6V zC3Qu@+Naaf_?;D&^<^_Ge&Q>7S>o71*b92hQ7ZQ3^xnlN z5;_k0C<)2A8aU`YnxmWkEHBgR(WX*QA)<2cfz*mPKN{<8Ox&fRTO`;|GPW>@4vT~ z`M)1O`|gtO=D)A9BTMJ}cpe{fKaRJ`>cNrg;n$sZ$fUb4Slo?!|8M>Om*>l;AHM(Z z@B8?9^VYfV`}?dcu;%-}4<8ecB{HPP|Kv!VAXBk9Mc^`5{H>#DIzGPQEI$5KX=*JT z`DYt<{S|APEMjCKH*Klb@`FZAv$JAneE6}5U;lLC#XY4;F}*DY3_i^QJPSmaSn~Ba z%BRn^{~sP7b3ZSC{nHKc^W^k|&wf9j zzI0n=@Cu%^gDfX1tggJjZ>O{N+R-~NzDiGPTDZYRK5Oe)lY4iQ49@+&Y-8R~AhBhe z(X>M2-rI&euRK$|Pdv$TXy94*>&L@~6*g6|>+;wA{}f;U_t#lpY1_OI6Hy~X<@40@_cA&>w5R@XeV^vWv*3t{decA)t9M5cA85z}(`miJ6Ub2XSlfc9So30eTshg}_s($U6vG?~6 zqIOZi6$M9q!(z4`Zj;^D`_EM{tm*NuPYFj0H}nVWs`k-adt#<|+Psu{-Iby*=dbji zF0A(Yh3?$xH@kS&Cb%<{Sr&dO1ukvWv)Xp^W`X_BUl*L$hHceW*O@xU zmnR~&PIz|O2fJObeO8N}j4ls)-si#|d|7GhVo%w_3?AoW;yvY07M+}J{_yjgrPdPM zdlNnX@|A4lZEG(P(o2fkQ+i?JeD{rZWf87df7V<((zzjY0{e!4k6Lzr>etTuB&^HJ zQ0ngNqxP(-N@dlo88g{A1PX3QDJ&Bc>F{~>knzPuBX&-OHHUXy$u!X1Q?OmmVA{GH zoDEJX8}j&Ab_u%w6OMT~;bqtcv9q%Cot;kD{aUl*aPi_BsmaCVNC%RYW8Vmgu%ToL}b%Ef#$H+$5{MVendLbqFQnHMtEtE@>xq@2;H;rHy>um69M z|DR<&?f&0?$3cr69B`Va6Oc`g)ucCqP! zb2Bs({KZ~mUTNKV_T%5}-;b;BnQ`juTR;C(%J0j9X2f0%xv)WZm;JTFr;T`6B#zhG zp7~|;`g8Y6D^U*P#CttKV$YkLD%Pm;YaHHilXukvUvuf5J8zv?{_RUa&F{xD0_WSq zR?l>exOHmbuI0HN=R+MnPwV8kd$5<`ZjQi>KGogXCA%a}J)eL7&fS;@?xZ_0{+~~O zDyXliTGu{VKKsm71tyupqLSv9H_T)an3h_|tivL(Y+pr)X_A-v3WqIIh2-W+N^@jh zczL5-QLS&#ues9*4dIm9#8(* z@6q&SYS7%u)L;1G)Yd&KwX?+I8Qeot5BnQmTuP7W%oj+KYMlI%B-6ocbt*@&2x8-Hvi1N^NLR_ zXUDCI)GS#SUvcj6A=|0(9@<;^l+1m8?fCf1|8s({Q)1lO9UKg2Y!4s$Y|dPi`{Cce zpLhSB4q9vGpS;h>rpH4i>z&kG$?4&_PH(a&y0;v9^zLAznmF=xNG ziet`%Iq6nSl{2z~w`Ta>y>lhfqWa$|xrd1gN_-VoTbEh!F*BsL>@j%O>osTb1(AoA zygV`s+881vcsC-SO!DfvyXj2Vxsy(A1;uGBNyWu1UTt$CSFd)@ z6f!>}IyK{~yVH^<(N#~PUQOM;ThFfd@$>ontL*m8&i4M{cQz}OL4r+^O>kL?xN=gs z`MNLuDO@kMJ-t~Wlz8g~=Vb*G-c}A?tGDJ74JS++j9=a~Q0ir!$U0f{O+IQwUlvG7G|%Af=1}Siko0Dd z`M#NbN+V<8Ed~C|Mz;&&)@@^*D5rnAk)%3bw9)EuM@8Lu#SHWX%k3GA#s`Ep@4go&b zNo@z3mKG!?DT+Oc@qFo)uwd37WwnQMg8#0bU;k15|F87_=lB10-kfSKlD397r#EW% zEuQE@E7a9?+{laDzjN;%DaJW1hhz`r=P&#J)c((}@cVc6*8eWl`t($PU%-R?|9{K> z|0cix@4v*l$}0&T94a&UmtE8T=fL6Kb+@dhw*2wBjl1rZJl=BEf7XuTZh?U8EvYNd zGI(;eH?4kW_T}vL_?WwQ|Gn#%|9?CGe`Bhb_KGXaOI`~&s0i9IusCvc|K9YXy#9yW zn|GhG_UyU0r>^v4L4D2thZ7CUtmVw#ylM$C%jqi(eI;&w`}J;ahq@mhQr6|ptmSjjxVubqMx^4ECZ&KD z1E1T!x4*aF_n+fk-0fvkR=@6Ezkg5B=61*F?p@~A#nm^iTW!~mkNtBtzNWZ#>)*@r z_x`@y&F}Bup0uho(;-!1X4fp)=>l$Y1@Y2)xg0KO4pMCYw%7knKhF05!&`RV)JG0{ z-rwDFa{p~!pTGaln_uPoe}BAtxygueqgzXB_6{kR%c=WzPI`T|z~&lPQp6oWPoq8h zzaFq`@@?ZQm~(o%UBg?}ig%YyT-!UY>I;RPQApJ(+_tFsjnL#5l5^i)t&ea2G3lIx z=O)W$W=Dn_mce^NoLoYTlYAPP7-qCT<@-8Mk-L`Z#`Us_lC#NTI)9xDnCztb{MZ<0 zT=6&X@6=vqUFz~(pZN#_m%-OH^^^SFJsR#=PxDh?326P!?=BejUhAl1g*9(s%$0MG z8vZc|PH4TuG&%S%&%@SE3H@!C)3lC9^0TuyY)E(~Wp&I>Sf!;!^VskUD`|nJORlM1|I&v-UoS z;GfBNtYn&tmhq-}3K5DeU*lbu^C%_x%N_7g_bGRe(`>zY@@eiZ!}}?dj-GmIbNTRw z#~1dPJ+F)7dCg#Tpz4@&Le$!yk`K8fRwn!mvF2)C?X9fLqTtAN_S}KW_Q%(@me)P5 zT$&OVv&lKx)m>2VP7}xZHx@0Tl`lmT)_43~`{OsU!Psp^?Ui_&zC>Gd{}vB%Iv#e%>VzI zoxiX0ajE55Qw^6>26^VA(TjpEYMHToMe_5~jb|e5Q`2$AL#luSY3IL|@%l{pyZgdvC?@zPdKcZ~|jQ?(A+} zzCRyotYmXGYdU=Vv&UxNnfA1^CuALD4UR0BDeg9JAqUs-Es_CjI!%c$c(%SZ+cfiu z|LQ+AU-J2EmAn(@g)hEtmFsT)>JE$u*q%7Pi$@S~)*LULa_0Lwlzjwd+xcL12 zzuuhImOOfeH03>D{->JI=`HdFtxXFRSDCRNBbyumA1jaenPAr&E*k%nrXj`_#f?tA$Lu z(mkJ&^6fi!NUphhxmcIygsM6 zs&iYb9F?-pPJi|}XmPUR$%-#I_6K44ep|YUOz}`v-qPk1VY>40%uLyt+fLm% z%k11MxxCOJVu60!I`uP7%>tKWPMupP{>(8YOLAEbN1E7cQ8B@jOeci@GM^En8K~ap%5MMTxN0o1+C`dn&twT_h@&{4eAaV3=_5kcx%-fg6u+G&0PXc$wL9 zKSM*biFsOAN7^&KGYkUfGSWIEI+jna{ZUbI>wL%!g*877K3MS1JUV%{xv%7|jWXY& zlsf09I|y*>{?d2tWo6lxceT5#BKm}?d?%?s$U4z5qf+l@fknQ#(=t1;lRI|k+}(6a z$La8aFlMD04Tic}pDZ_7GE^$cwX`cOonY{Al>}qKw5E;|EF4$voSmMUX?4Here;sQ z)x2p(OlD^8o?Ev2W0HBVb0VJ-lc~cZrw7lrp8fr^AST4o#pQv;`K*O+VH|^P;3MIo_U z({9M88Z#zmaP#}v9k{f{G+RtCQS*7jhZp-2A4V7(u-V%1KZ>(*X=pafJ-e_nJ1}(h zu9c-n*%BB8Hd(J)c|0NS-G<#WPH9||G0?c)UeJ=r!u53ZQl^%ZliMUNn6Ak*c&eY~ z*E6+2gXi#``>FzW`*f`$n*|n#=j_#GWN+8Ve0lIlYvJ5W>n2~!k>!}ltfV|WG&W-2 zuTNL|-_N^WZ?TbQ>(-8h#EDy;D2YAcnRwQEhM>}wVi$SAYaw@IeVLWaU1sdI;$@wo zbZ1tXJHNAs@}nM!C0kusOt`gXe2w9Y>#UHNaOKkJo@>7>uDuPJeSO()XKR_~OLtZ2 z_$ptOVJNtC)R&QJLQ4{^Q zJ0h-HC~vrN*f24&WKNerq_K-hx#|8rcLan*y|SYfjJP>errmpN=o*|M#c*QIvUB%q zJ|C^Sw%y+D#I%(kY*y=4&057pgKhCCH_)O)lkWFk8*;m!8Qb|NVEP zHuvY}_2BdEk6*9;_!IP9=GxMXE1pbp6O0`l=C1a* zQ&+b4?vzx^)CtpOGrMK4;!wJ~#?hAj&yr;ir!mhsGdrQBdv$mGzn}WipXKfUEz_KK zNbXomouy2M^oT7yqpP?O(t3@9+D6uh;*1SYa}Yt;j1dYxTCdPwfBy-v48EeErY;|K$Jw zIKRKTK=ZQ2O!KXkIvW>Oe9ij3+P?bh=J~Zh`Tzg<`~Ua*y6znt4@h#f>#BKY>+)Ya zy!QW2;U(emJKsnMtHe(h_}#yrMKz|eJ*81$-M=6{KM%{w*Fx9zq*UL(na{_Rmipwb zlAVr>QqXD-iIyePmPqjwA1-)()lZ+BZ{fD-S2T-_50x5`WIhBtlYN>DgDUexl*Ye`?%-jQ>jee zwvI@L%aMMJKZ6dQPjWrb*Z$0@>#D>WX3M#fS9T_QCPq)(^1|`%+<)zYed&u2ZsrWF z`lf2c=4h$q{Vrm;q0++kryuVvq= z;=g-h!#m+ZFI8=polvKt?IdwQ-Rgqp`W<2$Z>}s~ zy|3l4)j~$ctDDj~IGTDE|2?VLIyZ)mk!`hNEYsJ-%w1c)aXv`gsdvfJZ)^IzC$kh3 z!rL95h{}~2b33$o=*dNtY)gN%U~f~;)ttSL#Tzp{3hK^jvp&AO^VY>U{~ZFq?@xJi zm_?wmlXDXT|D+TXcEe+*UcP2Xv0uS_PR{M8zmA5%%lDS|&Ay(<5Im4_TX52DLna|v z@xOP!^WSg#JA40u{Xb{h|9*4&{QqzJ|D68(Z_Dl*eM@cL@_+B|?qJwuI$Mv;XxINA zJL;?M@qIe_Jbdwq=ka_0z5oAZccyo_`SpBzyE)IEoj87z;m^yTPtKNwFJ2|4xjz1W z&bFtwzst{;e{}WkmtUL1`T396|5`48+$p}MuyT+6x$aH_!}Gb8dRZLzt{835cG{iB zn)7t#Gr^>@GfpZ?@6D6idFZu(W^r>2^NE%-R~CA*uxB)QcW=6zV|MxOS%d3k{~vzX zGoO9o>DjOI#MgiPR8&*5j3F+|I@DHAOygl*UeF0fsUK+@63_7`>-Hl+ET;c8WlTb^~#>Q?65y$w_HIh zf7cqG;^%6zTGzZU2y|ZVDxJ%wvU~gb&r^Hns7J^dwRBW^K0C*HB7-x+SDLYSdQ!Tr z3&XdYAd(b>mY8J6$}^!c0)5_VuM#g^EpQ*BK!g{pR|_X)WJK8pMi~3FF1F?rZc23(NU1!ZCVl7Sl*WdxHjVE=d1-v3OGN1Z|Cq`n&yV@pOtqoc#mqcR6%Wlz|c)X27_zhN=@ zTE+KkiNF=66HBXKEnUd=ZOQaCHVnbrv+rG=Bw)oR{$S-#R*#}|wa)KSF;*#^J`HZ8d_I!6e)^*b1>Fm=1kU1l}eT1;BX0W5wPC4x_`NV@Kvj~{rvvN z9|z8lf40-CSfy>_2NT}gZ@288(dFURvF#?0l(+XShv+LxUK1IPD=K)HemkzJbmp#( z?@c8^AC;7cK^+44h?Q+0l=(QL_Hn|pCX$|Pxp7Pd8I{GN3iAyV?u=K72PwE77WqGrkCY(FST#~so~?x zr8t>+Md`oI)*_QQ)~`(yH{1{)WX^1}MqpLyl!v#P4Y{~kwsbTEFguxW7c+Bgz95!n zxcytv3hz+vH4j4{7tGP+QPMMieDr9C(v35mNAAWhJ5(HOr^BPz+O@%&<#XZ8+c}TQ zqF!A-9mC7lEi2BfGOe!Qm{#Sfq)p*dvyC4-V0wA)PJV%s1UG-n;{)qXH9cu$ICIdY zg=qob!fi#VVN=+P;(V68I&kB1v|z)=mA#8w+|QSt?RQ*Pny7JNirwM7W0Qip8QM%oHXFQvo z=pcCDK-$5NPsPpazoy6YeR|j(zPr8s@+SKP4gs!1PuueH%@a)*{yh9pW6k4;1I?04 z83b3E@}#q6-%8v5pt8Q=*T=fbbvzfMO3o{@rHHxpXM}PlS|2Kt$={Z|y0}7u?dxeC zhUNyL85|7U-kXJAJX*hH17}jvp??13|3Ah5fBIYg{r{i*?@#SeZFwRsGI5JipWic8 zCmkObiDw!r%>qYHU)=Zma`PK+fam7BG|N4fQI=Dh73M>HJF&8IsS*38Ua zdp5`J>;pxm*>62MGOu>^+&=qaYp$NzHl1B2{SN}y+&o>Uws7`cu@1=(6*75xY6YLA zQXgEue)!92^JVj#j$W?IOk`Uor_`g;aAiwz{HG4JYrD07%Gdu*wcYmrUps$ydHvE3 z2g!ZEAHJ0T_wsxFztj5vKiB_QefL@a{=e@&rml~8`+4@u`+xcO|9N%wXqe1GzuBLj z-`}&ZzPi4$);#XbKl}fG`{lnCOKxAu+mo_)&UTeKqUE*iY)r}hsZoJnb0+U@JTvS0 zkIpr0bNg$MSdDE_F{tK_o9mbq14m&iizVu%>UN6!4NZP&N7uGR%rcSC`re>MqEPXe8+8rLI z&XwXj?$&TK7=G59y={(XO6tjzDVzqyxo_v}^>8_~Me^sbDybRvcl3Q51sW42ZYXwK zvJ^dg=kVQyrvB|I5m)^Sjs;qOd))Cv>X{oSV}7c?_tyV?@e1eq6oVJa zZ?Ci`sjDuXf21qU={Uz^ooDmR%qKJ`ukki=)vQfm+Ze>x*>Fhr#BYTSmoHoGn4Yg1 zCNz~*!KlGe<<2cZD~FQT$s5)*h6Tue-ng7&!TyAXkPj+S^ZG2Wm>UZTBr`PqwEFoj zT0Nez9^}t=fD@@!yX$No$M|&1Th?+`2W}X zx_`f(eR}+Rx%_?mnvbu(efsvSB5VK8x8?Hp&WYc?$hq)WW}g4?UG_SD8&p)>e0lk^jp)vM9~jmu1P-$0ohY z|33V8H}QXw#^R1QeeIX`T4HIrS69FW`KK;U9(-PoE~yDg zEd7=1+776jacc{%EC}W|e=(;rU32DiEzb_eBaRnj8x^^fw>@iUlUvotpwh!AaN=d% zxh1~OceXX}o}E6)dH-X9-*>K@narO4PD-=7yENe$!v)4WEms8Vi+(un@=^*s|KV)0 zsPkttri3FVN1sfIYi(96f4^nHRVjn@vk%q$yX(rqWD_$hie-%z9g-r;^GccRl~=GXtLn6F;xUb|*$##(<{he_dL7iFHgKHs@4 zOEb0HCxDB)Skr^=RioUqJ|%wt<$qUB4cykaJoxJ~xeX>?59@GT`y4UB$R=U!QVrR8 zzay?+mp@sV;PntS&2flw4XYrWo<` z90@Ag@XW=8uVmxwEw_?Rah&v@5ZGbBwA4Uwr?t1=DZ^re#b)!Nk74brcPDg?o=#ho$>5;Evx!B8A?$p}k`s>vFBKiC zj+`~iCNccQBwQYXxL$;s_j;HXmc)xm(Hdxhzh*sGzlD>;_m+wMPWMxaFN%$Y&5b2hD=!^-Lw zT>Sme8yU{2S=kL5J}yj*tHN4l?(~loWZYodd?In>>e;JQlU0o0S1JS;eZ9P9b5^Kp z&s&Qev&kD+oU*Tlm^ z)_h-$*LL@A*nFbOcGtEawepI>P0GfZp-K+l&#KIx=$f+U&c6En|3CgcecJPL+Ifq6 zf4DoVzrGWc({nQ7*d?4Cyn3y#aJuk;Gjf7*@3>eNFp4c(y=J-K1{dQGW#!c$E6P8< z``gW)sQRMNtNErELsaA#&30&&Q7?H|A%BF4-h8@18u@{1mOvF?Vb3Ov{uyZIWa5*ktPT>4$4< z7!?F(S`|7^3}9~99lo7ogN~?RMMCLi*G7*v#@8_%_wMAZTVJ+z+o7DTH$6(@BTt!p zD6mv9+q+Z3_4db<3)&Gq`)n8M`F1I|DAv^7+kC$M=j!YI%b&*o`*Npgl6~J9e*Itj z|KFXz@9(#V&+UKzIek8F^<(@0?+WYJBtCj|?N-vR`diV}GUd1J{~w*bdiU+bT{rCI zzkdJDzg&5PNZeYzKL1bNeZ}hQ zOm#aoXP@5Kq3~db^vsI?MZZ3LSoF@P)%B90qV=5!Mx8gCf(`ha8BSbct*V^zYKBhF zE{*pxzqd^)sd^9;<@Gc2`;$(G z8KJvprm2MKCn%^WM7=)Yr+OluWn&2Mw8Vt-D{{X!W>{~qTG5^*pj`ZEjWdhu4!vns z@uuO-{M~uq{X8GKO?mgOZGxSnkHmzP{EaV|#zHk-reFA%MJaY^(<^&WQD5{U^_n!NMZm??!VlU?(l@O<`a3$}GfKkPck%yhtT^C~NalzWcT?dI^mnG*2gj>-9*=YOtL z$$RmTC z8^fruxZwJTD{Hq`s=3Ea--x1A>k#PH!#>~HdW_&KAL>*_v#~!9oAu`&*VxT zMVE9r@UMQEr@ryf!qq!$a+MTauW3J$oXPWUwSbAxyi=AoZZ~!@UDvzMe68nrpUQGU z*F|S+OL)$696S{neNgwk=OIP`#x1o+Sq=IS=kCR$8>2SN*6$ z_)=$;qnn&3f9RCBY92D}($WtBT>??p8IqzNrT*NO^knb;1M@X@2wFu=nj`Gs;AHHb zb3u7i%=fSDE_rLR!ZG(%)`>40uJ8Z*{=V=eYpaXx#~)vQ+#?ck<1F{()#1B0 zZn(Y^YHt9|KDzxue>4qt?bWP=AB%pPbWr7oyqEW@v1?EiD5$Uq!)ol zXG~!|E|>L0kmu~Rj@h4=3fTIqg;l*fby<~#n?+iEW=B~o>w}V*d;7N@VqkEsi2U<7 z|NZyh!7MzFBSibV-L#4?FkTFiWmcFarLZjY|JSQuzMjw1UsuMEDA)e?)5nLYc3V&1 zO}oRf@65Xg&q}}fNCusLwqkwy>BR<{!o19w8+L2+DCcv<76@qvVO}S zFO-}2{PgLfQd`A?1}E;mj(xC6M{d`G4_PJep9{+|UU~F%=~-`YrA6#VUwyk|xN*y- zSH=vd1Ks5{7#ys`1zcJ-MC@?q2rg%EY0(RM^XB<8wdVzABDVIv%-TOsddBgR`OjG- z1P=vhoZ0{Xaew*s$9L~uHRwr@x;8tKMV)Ex>zY}w*PP|(zshsw?FM_^m}Pe@MD(1V zSuhAI`74W8)!51Tb&1H!Z8=-2^W|vz^!&Kq_4(V&9m=OqZ7IpjTlH!;_pdjbd3%#h z=JS94o0)fZ!jq3Lzx=7FshKH1?|Brn$+yps7Mkz&Oj(?_%&p-}j$Edxo7{nr7S|4r zLn1RLUX1Qvp{Vq1(bieJ*snc%sLS+hRaP9&_7hi>4jto-oWUY;kmKD&_M2M`1R0YZ zUOwKyvAof&$jt+%W1*PTX9QkM4Coc71GIxkL=Ganrts&s7iI7Lo zp{h<{mTg(>hi$?`IJ)17`CFcU|K*#5OD@}lcST|h*Yf+;sWUhkM8sPCHhH1!*E_v7&ih^aVbTlP;+l|&pft-hcGj-h zm4_amIWi@%E~3Hq40Gp3vue97(+_V7ne5nbNccY+&xc#9oUTuOo;!o>!q1?VbLL5P zb5HCEUKk|xwW#NBoo{{p>t1&GcUj234E)VS9#P^r0 zI5@K`x+7x1(Z^bTyKuASWeYxLbw-tgf?k^2r}$s<%07FH+5dLtoioR?ZkWibF|1tm zJH~ryYMAC64yCXD&y`%*1U=^bJMPFF8`G1jB|qQ4B5Gq#%41=#lPnBL3xie|6j{A^ z+LhqabhgZd+fp~nlI2UHNTO%v@|kJ;N6*}}T-dyOYm_f9^OAxYk=dU&x;kX9lFK{S zl6J3F?6=*ElIO%+qWs&*B-k_E;$M zHQnAA^L|;T%l8YbPA^*f>hkBBS-1Z!5!m={(`Uc7O{lN={^#)S>3=s?3W#$tpHN6+NSfj(puo^| z;DC*9>MXW!UULy9Aq78MPR>?VrWD>OpLrJ5oECY;!PoFkE%io@+p@*kCn7E_&%QC` z-CXw>SHq%MHZAb*I@W4or8DmzThF_Ns~l96Yz^lK&O9t~=>DD92_Lr1eV12f=ll5o z>-Tl_7F*5NZxa`9b)1Qv0yYr22mGscW+Lq1{q z+AmKltYrN1%1U=TJEoLy7ciH!aU9us?bpYbSKlt}IokAW=iB%-nX8Mt8QgEY7dLk2 zShs7=uF`V>5}n7CxgWm0`!vm5bfS{X?vtygo}Ex`lyZ;zV#(IsW%jcDYeQpK83+qk z#oUik_-N3#aGxfRwPF9$C1ROJu5O&#GgVupaZ9J5VB-P~<_6{&v$Lk(R&bhewd|JP zGARR@8+1# z=A5~1efif48#`J1-Sb{tU;jS6{(nJL)vBAt$GfI|(F_X{zu=i_zI}Fh_sgVfpIk(#a{f)Wm5@W)?ca^tMSXSYwx);^I7>{ zAL4o;V;nK@dED#o{f&Gx6KCIN=}YcTVJF|cjQ#b?j9HOmqdBMTmIe0h9!rE97J~F6TQ%%7k{PSMyJb z+Nh?dA|W$_cb22uMYYZLN<3j|4%fdub(tP)Ie$IhLv`+T{4Lhg-`{DP8~>Lp_rY>u zE{Tbq+#6e;9Xp{VB~%?@`1D@Q1IhpXVfn`|UVgZ`{=JC2D}Pm_;X#=M1*MSQ>B+4O zzIF>3nPz|c#VsJSlW7UtDbpPnjvjs19e!Q#+vC5VFQ0x{vH$eT$i6dTWBxu zcUExehTE@F9vI~P)c^Nsw*LEV7v6l#{9hF1*R}ue-@p6+{Cj-)bm2#hbz#$gi>vjV zT^7+T5-X%EX_XYp++lJ>(M6<)x22@V?L*$fJUNa4ug1RPj#|HF7&P6PE8r>gXjuct z;mk?rpfczuUS6XZ}FLXexc18-7m{vFIrxi`1E#R$>vHsq0eW(UTciHaeCugO`R7L!@4>+o)vC6 z)>V1uYiGovf`Yae3+88VI6QdQawqe^1=CNJ?!tw)X3whT`XZBXR_Xm}Luvohn=k!l zd@7*LxUIkZm(Gy}iLM7npDyv;|MxF*UG48zUquZKy(Nqa%NG@}GbHkzyzRKfwBO;8 zf?a5Fcczr5fKppfjP3!kug}cnvsbTMdvV9ib?bV5{QTGIdhBdT>2A?OMjN(Uy>k4lqiDwhL&!n5V$t%n~r2fq_9- zeW!?mK@Yd5VDS2_k)H$7A3Z;;$fUGFL}$_!&2sa^BtbbZ1_eeDN2eUKzJu+TZMH{6 z$ImL+c=!xIn|lPnpuf?CTro9tY#IJCY6qkX)e}I3b z1(qGHZBOGlR$e-_ipl2C)dmY;Hb#bdael`mXS343WyfMH%$ylCk=e~Uw zx^)#R*IE{}RIgpj{cy&HtXB;)G!J!lT$wR(#)i}ej?}}~Oaz)(3{Ut9GAg^e%vd!u z=+jyz#*AP&$=}*;g8O#d;kf)VWcsa!n^)SDl#ZM^#2~QBt;Ivr^Y9!`7FJd+&gqZl zDOW`J<<5Nm#lO=-qc*odz(&B~vuJy?pG}6TTqlRnnr>PDuOZPXlU}HwerhM0{_u_R zv5B1AIotJrKYm&9N-I0bC8V`-9XktGf|}B!Ly3h}rV}ge=Co~`VzfklPEXL1fP2?o z3ccoe{dI!glnxf3i#A13SAAx?3k2T^Y!-R6Br5Ru^p*0tk)6A$D^?3J7tPvi#F=gC zF25{sju+oDp)ks`V+9%+|BRFm2^oF#^J57}q-Vz;JGG>EJP^Nr`}XU*3K>~PEc%?9Zv82U`PP1P0@IV9PbJasDf6E5#6sbBV#^#}@J?W4C|SAm zgF%4x+#^5r>pw=F{r|DtenND_1rO(ig%V7OaXAvL6LJg}I2gqz9AOf?_2uQyFCRZX z{g?Uk!^00BAK&BD_2_DN{coe+MPtUi&_*L7?mx8 z*49~iYNks3`1NcOLsYQbjn%XRzK~dseSCQ(}#o(7l+vwuy1? z;vJX;OV%B-@jd);#kz^gmf7zbi~=l_7IW-&j_qMN92o60Cx%TP-LHj*h9zNc)_uid* zF+Uz{-TF2!VwUWel49G~{WH(J`>ucX+A-Zoi<$qq86>?p=IR+kWru{U-OOoDuM7p0ai4yU^*!qh^+zJ?*7a%-C}9T;-`ET~71WsVYj(#9xONAM*RT_1Xu+ z7{O&KR<%lRzC7=caj_9u4L+#S$0SKZ>sz?XRq@zc^UPt=FJwR-de7` zO3B*$ZZStEt=+Gg>cM%&i78qn(z5zdq(HVH#{=yLH@QFD5wVpwXA;u%Enbi^b?q*1 z{^#emTb_;zzkRRoj#?wbwfFN&OWq}%>MXF*QS;YzyymyBr%r%njYn#}&?4cm#mqBV z61BNGtoD}2Hmu}$sowwGXZ7L*f3<_t&OCW@YT;#-V$0|MPF}xqUgwA(V_f~gT?$p} zr*rOqExvq1#)^)F*S9|Y+k5W833a#3`B$9I8><~Sr=-Sn-k9-xL(aa<=OS9;RaiwTa|&%s<6DtcYRJvc zpw{KEewsm1$*we~hZAqcK0MgcFxOG|f@}0nC!;m~XT2_@1+UXzX1;y*`S|#_*t`e{ zrM~vZr%!)0xP5&2uTAUy9`GH1o|SdACa-geAKKy&H^`Zr)y*-~D1)hBP@b$?en>!QR1lO@p z{xpCklX>~ARrCCE>({isxxbf(^|egyOntp&t5x^afikq(kZyMqFanR>45)sONB=pG>t@dC~OYsJrs1-<=Ewwa`V!8+1q_J zAEz~l9cHyUFwd|3anh@krDeVbN~G3JvrN@`J=APYCU>$p6Fyh zH?%ub^W{Ns)bRn~R<(dy2XD*#{eUacIQtQLIit+A` zZSxm8F+5vos&F_{W9G_9OZ2y&U}j+u@bn86|GKksGebh!so6&_EnX*YvGGy(MRiG+ zEbWc<`bi(`YFf6YMC$9Dxta4ta3TASovUtEeYy4X3|o(fE34YyAd91g6TY$uxi&mc zZI$4d=6Ee~`r4f8C3bd88Q$pZox`up62R2>m$@$Khk{b^|Gvz>ehnf`du{ohQX1wp zF`ZjI(dO%pV=ZbEFI$N!F(odII25JRnw%~6Eb@Jlf^cs6(_dNT-(MANo~?BL%c{I- zbsuJCb4#4zXvun*)pEqO!9a$&;#SY&fLSwV8BW}p%uu+(ImMQ*vCmhRV}=Z4;KUOK z90D^u)63)emP>LjU%AD#R<^F&AYn-n$HX&^wg++)jGEtY2uzfSlvpgFEVt22)$IsN z(juNF*&k<5DNpENYELXMjGeXX*`E44eYIiQJMPa9>799Zw-mGz)cbEZ#b&lTFyDSkg;R z=M=|lj#740houJ?iZ^SVJ9MUlS-D7GZ-sZlr<|sa1eW9T>L;vFf6ifIDC;*fOe|UD zPWtYiHw#`(?A&rtJ6pLya+_r9;1@e8 z%1ck4G+yGvY;!Yr@4UBD^UnoY*)vaGAv*DBi$ZAk--W)xq2D)YPHtkHEv2NSETGiP zbEf5t2GeDg-5c-Rdv{3m(DvPo9&z*H7yTUo-nPu z_S2kaj=fbV5@lo*%Zrm1b8_eS`ZVN}g1EIxWsObE@4Lyli40q{Cb9@N>26)ArNCkB zrqJ2pk!T=#?DgyJ*{``Zuaso2?fPWV=RDDfS0F5%mHm3oA;T+;4KvEZZxy8dnTUWf2WtP@88|;-}TQQpZ)rD_i5gKRR+6# zbLREuUfWT>DnvkuJIUvecfQl!*AF`88pz4r=`|O=~L2UQif}OYd9Q=>( znt%JxyO;m|J)OS)->c91dDCD0ulbQ@r*lF@sZ-a`$YDlh!14oMMUHLGS;T+G@R0RZ zwS)EluS~mq%YF{yKE94QtY0@caR~NJ3}syNz(J{@v##`Agn~l^!}rUahZnChEp}01 zTM#l?u|)Z29&5kLRiEh|SC}Uh3CJ>t&AZQ_saHPxZdtX})#cBFjnAKaY|`g?LTT2o zOG-yuH%76n30cMwG5P(5+c9f>cpOrq0vEHGFF3y@JdVF?_X7X4wAc6V96vN6$@!Il zq{F7J>o;u_)N*xKzw{{Ac(a>z0ka98q;auZcU5ZFhN>xRPh{?|{=DR+&5pQt-%d@R zAoJ^Cio~3iH6J+lzTNJdZuqTj^5(L)71782b@oU1b!@N}6`IWyVLdJ*$d9_`E!gf zUEf)^p-B4o{A=%L@Xsy8P# zmH%>u*X-VZ#^<6}=lNUx^-*o}UUM%L&-&|rZR#ye`MS1=%H>sgZ(1Y_7I25|yzb68 zFD<3vf^w?D>i%NcChgr~E7jQ^RF+-Yz3%IhgIiq>t?TM6D1UISvfzdP#{JW-_;uf6hoJ8#>RK;`?=4=JsFxb~ z#(aOJ_53`p%kuRVHkNj0SMfRWG_F$2OBE8jmX^o1cuFP%e`(IDRdKpkY9s^%@5U+~ zm@?D&!W!mJ94<`)4z}yf7-nvGyz^nplZSbIJ%?gCw(U-w)3ti{?azn1E#ItL_H)af zdW$>z=lEr9j$HlV!P=E(;oP4Yj=gYOu`^%r&SE!B8=k{?;d*+r4$VUXNpsj{dd)to)L^{8fa3)7IVRR;=V}@JM1l_YdWQUcnHj%2EVy2KTG_}+)2*89()h1;v4+6<$u+7Fx38a z@LQF1w)9KsiYAVoLJFV%{yNsOXL=EHMcxmaIV(QDFu3-0#_x8AvvTwKclYwN%E$Tr z|8#r%Zo_+f_T7lhJLOSXxcs9Sx6mdQ5oSTVxwk%5gsfewdpJ!*=9I%>g@ty$cczxI zgz74ZU3SVk{qon>ckix>8+|gEvPt*a6rM^cfrD2UgszBMefPfn{CTevzdf(LEgw4B zGOv-zFJ#%Ko4HStx*v-icyMs{p`f$Qx=jhQ)Y1}FlnO!xUe@XR2pniK;yK!suKLPM z=kp~Ke(Pp|^->LfN6t1~Ij+EPC}-;Dt7^;^&nK;xS1@p85cueF#YAMu0~1frV7>1~ zCk!|^MH8i1*_qrVxD;H4=5#nt-}5-qLPlr7%J=?ne^%DnnM?~3wSCRvRIbjE_^Pw# zhW_t!Ctqo7_->?d+>GI+`xKsxv=)cb;|wJpSEpOw$l5R~dEsU!vul}QmwGs@+Zhx- zt0iPkJ5vxS&2HJ8<8z6d!QAp(Syai&*hkLu+(Z+0DV-5`{qs)wam#R}V1Z5E{zabb z(Lp&L8UHeiX4Yk`k`wft>8U2mu;j4(+DVKGB1(#W9(^1$J(uL~N!iG!v^-;-6vwhk zr|0=czb;mLacsubbcZGEzV8ozW>Y!vHEsEvXM(}o6}UOXUM+t4!Q;N)iI1`#k}W5% zT$#eKvj1P$|9da~L|y0LIdyV3&Z{D}RTW>zx zv1OS{j2B}^)NHflhlMijnI}Z;&wu^-bH|lee71|{>^i1(Nb=^nuT$Gq16l+Hr_2oQ z5Gb^Gc}a?e$K`R^hQ0?5Mj{M{b?-2@o@F$Rak@HVqYu-Jg$DxE+?H`TsD+lA3Z^*) z>ppIf$eVX})9lRx%0inq&s-TQ&*tcyb}w&v&<$O`<(4N|ckF6;64)o0J}aebz3qWB z9fF-v-AkjM9F)C~*=;HKR`36W@+FZn@vjtg)=b~ct6*op|4QU$HP3YmIF`TnT6I&| zCU---?YfoZm%H z-B~{+)N-HDPNq8%EDbTDoQGc?KK%Ic>3ch8FBA&eY*1{f%<^Kop2d=2F4r%YFCS_Z z5Y$a_2>5E3-rI3PENAaGlZmI^6>&3U=4c#R)z_euA|^GfzBo9Zy=}&k%4J)&ZCtfM zLg$sYaVh_T4-v~_V$Zd0kTT%*du+f{H0$=9aJ55qfeaaIQ?FzStZ0mq5zoz9`}Df= zkrV%<7$zSPyfE`sB4dwJ=8czZ91|E-=gK!Sa5g#23O0y((Ej`KBDrU5COyqjPbPA4 z?h7(ka^-QmoR!M;pp$r$J5W$I)j`1)EgogHXTs(VdZ$2vr6Gy12vSRMH zPbC#qc3arm7ptu=&Rc%#L)CWP{+(f((lhpMv*J*0oiF9YrXPeWpucox{e@%wB?(R;3yG^Wzh5g-MZ@U>O zC8Zo?w!vlLH1&S#9o9xORFl}{*43tMS*GaxWa;cW?&l4CF%|RdDm}y$1U0|5atJXk z+4jPM)56UpX-eX%H>GAt?{@wrg zwEegJKI6kP-{})mysF%SE#G9UF`GdfwpG;wSD(a#zWU z&ATH1-Q)iKE0dX0Y^7o!cE~bBy3g9UZNuvw8#Ze%SnLp6^R9N&{1Dmrla99cE?!Y_ zz1W%aE&h)6_7^N7XVkcNDhF>{byX)O+DEy&M?QWUzr6hX@1{+G7fhdJ9Y1_&l7sJ? zXD?T7J-1VVq4UC-ut#6H{99YAOBb#^GuiIUs~Z9TDwZ!-yws&r zdSdnTrCY9DWtezp)z^t?_1cb$Mf0)MBs(&4*4`bzhGCrA_?$~>ui^m%)> zOMGhZg#R^W+a3AZO%-2dezNB3IN6q@_Qv4gU-O$~!JXzydp0Zh6({O&IwdS*l$f-# zI!5|p$%mW|4E!GhrFLl+82{2eCp&em`eD)YDuzdI81CGnVSeI{cqFGv_qu{0{+m7~ zA7t*^#!Edb;+i{4`AwZ7k3$)U;o{1!5{?Gm^BWH29|%sU@JUQ%xZ^ZElOad1_WZQB zegA!Plmge^NW0Is)FMhoI5kXNG0~{`+5R&>x!y-Du2}Fr&uZ7?ow|?q&R#C`@!yKW zC%OHDwQ8BqtIM_j3AnFPzIpnYxpJ}*fA|_Bj@g-)^Tl1dd*{aI2o6KN8RgBhy<47S zZ8-L9qWXg3jg=2>GA*xt@3!IfhW-0~U3gZPxvTs%4_AWil&v~03GJ3|?;dzu^Rl%v z|M9N3%0G3#A5&9qSZH{K$FfUn&8dXTJJc7fVtG`s#lm9B>5q3fTYqer(tP5^*F)8b zZ?3<686rQwzcx9PIay;{+V*?j@AlrgQ!OoabCHxrQ{)e=MX3hSt7WbiS?F-x-~H?M zzW3MP?%ICw!M(h{&tkLgZh!k{+uZ!WZ?DN*G&$;V_D93AohO+t6)rnru=JvvuyONd zp6ut-{}xHJ%#phmdTQ62>uY&s6{J?_OkFqkPH9G@_YRKhTlsR!4Q_w#;mv#SFZk}~ z8y)lPig!N~tPI!oH~+PV``N_j4aOECtlzy2*cKkyiX zv4L@WiN?#9j!~O$-+ue?h4<9dl}Zna{{K|q66)FcA*v<2@Ik?f_w)QVg_z6l-MUu( z{@N!2o7*qn;{Cmr`{MrJe?Nb}Z)ZaqkM$ba|5%^mJ8<`^ zp-Vx8tGAKfnS_a@u`VqqJLh^W%b&!t!l`|4tp5DC+je&rw!B?6eeM3(+gmHE?}}{S zd;Fx^!?(@X@!c4#IsdtW{;YJgVn6pc&7+VdAP4Uch=-PyETnxpVQI1bN+*+ zw#~Dxu0M{>72YXsb#rdfipgGI{xteXYxYnoGnQ4oSgag|~LkHI-TucY(dS^d=eR`>RYGwX?xS0y)Xm#3 zT?^9m&N%O#S#CNlLo|qYO14hh2bW*B_S*I3czoJhy>f-2T4&3R4iBxVK|aCi%d(Wt z97#MI%lEayYTfHYTaSrdGYl!+Vs~Xv^!vvNaq{vCta=TNy~h|N+pHVCJ;FU^oV}bg z``@C79j%W$8qeISd%{u`JpZWiM1jhkcfQ&Gf2|+C|K5&uX=$r`OxjkhWM-Pils4(m z8xgzGqElBK%a^d2UHxXYXxZsEQlY+Y^F-RR-YGs&`~JcH)QeLtP8TH3iI(LqpAa@< zC*$7e>l^dmZtFi?dVhERUjEsR&v+8K+7v~5-?{9&_Up%nd3;kjqr=m(Ufr(C&6Qa5 zRZi4@$KA8FEK_DEUCXgvbp6zS`iZS9sd$J-A@kas)!@ErPzI|);Yu%|9R}~kDGa)yo z2hEccFOFG%xbfoJ^3db=Las(#-*n>T2AS)(+NTB8|9SZGXX4&c+x)ll|NmTmtu}F) zN70`BOIjW#8a|q|pe|h3@owTQF9CLwMS+61teQd-i}~&M?Y44F37@p#ou132w|lvZ z1s}fIqS19f$GQD*;qG4l`oE`oo|pIE`YqvgCtEkR_P+FvnqN;($JbX@TlX*9XD+Po zbL8W*EXBhR&J7+0=^9a9cV9PiahyY^GU?;KCA7mw1l+iIq5 zyn*|BuYG;{bj_{X&q9uz`IWco-ILmU6&Dw?MUx!zqqu^9f8X-sE+vxFMoU~_;q={+{~5R|NXqaeO=Yg zJhofk4)$qGaLRniX1;mGGtr~W5@#gsvYsjIZ&q&PZdueuWQW~6tqsr@nbUM%rYbk|fC?l!Hze_lri@6EFg zzOiXd@5ZfyVWI98k(>5*YV|4S>Rr*U?DT!;9Cf-$q=BG{=}-85**)^RC|P$mj4mF`SXe3!lO!z(JrMa%jR*m2VZup%q;ll zccSn>u?mNgHFu#dcc2f;naHGhTXwrzTlxx5TM+tezPb#T+vBbP7ethhP=4O-kRUunv-hL3d-m2-II&WE-Q=-_k=RE#y>(*2_ zEOVLT7p9`*_O5Yu;6HV{tu5yYl@fpUYh-#EHO@9TUUAp@U;2U>Y9fy|TzGwF;UZ4o zv-jB-K{-grDgRc-4H!@v$@kBnJfcXl#49uYZaR&3s|D0EL?=-HR93X9MZziG$zgZiFnvn93vc2eIY^MSe9 zp)Fwg?)&`h0na|xm^0{v{Ny~dlbzpFv07%sAGx|D==Slb*Sk0l zD_2?kYBe+wcIAAQVrUj&(6(!X0jI!cA@1bZ>8JK|cr3I#mMWbPBOCLy+`pgo%cmk{ z;qaUHzis;+@Y;|$+V`&Q8_t!p&H6eGeGa)CxoubXuVmkx@5kGFXX;JAd#0bCyZQEp z*Ll&mtK^?=FT45eVaDC#1ss_z4|gUpJr%NJ=JjQBEjo4Y*IF!-&M8Mx2x(+|;_*GBCm(J2TdurUI5H(z&)wu_zcup|qwOb^ zk7Q0Ll`58-y>VyDrO77Kt>49X+<7`pP0QeS`}42$KlwB>8Oef_`J`qQ(Em6Zy=y)KQ(PtLw2dVN{eHPb0i-P(TZ*lEUa zA5?Z~x$Ew6fkSX&W=BKFck6Othu-v9@xV#@Jr(CL6vx~%zEC2j^6r68n(u;}7uzjA zM_C*@R~Fjdy1e53!53e(lv)qPo@jXWL9_o_%IqS8$W0EBSD&``N>5s@WADEF;0yER zx<{wZ{puvd^YPSWJE@l;C*Hp};&Mi4r}~pKdP++<4m%1Y>ai-AmIND24a(suH}}=B zJ@>*v=<(?V8-zJKI(735)R+ppH0E4B-Mm9ESGY*EN5-_;)0(eWy%V};!HP3zu$xF3m%hv0a&7VLm-FN0c~7^ei+nWfxYK&!_Fu~#J2?sy zXA2uU)jEirQtvwYs{A$U;nHLGXYZEed?4^_`{}pW&*!JP7%DTFgyep+JD1XS;)ufX z88_#IKDCWJdf-rEcFJ-?qobG4_!^!GNnd?1^1|`!PyPs-eZIEU=fh>5+#9*?*Y?_- zdARmlEu-0sdbmchnrf}Zph0_i%w3EGl%H&E%z|w7o+wSH?cOTTx z%#^D9)b6EdmwQ6d$-+$dqfDbuLyJd;__T8Vr#o!EJbZrpTiMO~aq9$?&vG6SR_4m* zF=q2j)JZzCZr}EU2R0RH#&|t^vCQF+PhRf*{P6WtS6wX9Xw<*n+L%>aplE)7)~uPl ztpcKbx{f@I+wN_Dox6YQ6LJ$SN1N3G@o-*FUH)tZ!0G!FL!Ut!m7e;+>l@?+=OH)VHix5cljPujGtU1pQPt01MqsR_5Lf1H1P$gHdHo$roG zt7k^XcF%6S<9zsTTm06q_hyAME_}1EH*cAt-sPSJmbOzL=FNJ{7|Q7E^08sUvHc6* zohfKC{Jlx!;iAL8148d^Pjs&T^Y3K#&%fo%@7G)W{kmTNZce0EqSUIdJ9_TAy_cUS zKd-Me_SEO!j~l%iN;{%=ByY*Gv}@6m4=LT5z3tKI!qR2ar@y}c z@2j}_o@%Q-FZRhzFP%7f%KiWEewIwR7b>B%XaBeL`PW}7l*O+qS@e1OTD=-8**Jac z4T~Fik3W9+^KNFz-yi>0&aVIU%!VbNu(-(iSJFsWUuH5A7Q<`Te`Z!z+ zGFq<0<}>4Y`4pR-y9&ay&mQV}w<2^=@x|#)o80Dp5Z-C+{$*Fyw*w**uX`>%=QK-= zEhY0@&%9vKv=phk;cJhcxu5sDV1r27t6B+zuR3Q~O#2-U?>=_s4EKsD0WX*PL#jOn;Z=`!90@w|AOWsjY^YD9Bey{!*Cu1t(V@<(RQJDiVPszRO{v6*^E~U4ljRrgJyiQRW0C>env$y_DnH*a25%L- zk(8iT>G||ItI|Hk%+ykgvmJYPPtmx$jPX~}r`=Y9LFdbuI{l2Q|J;5f_$>RN>GQSI z7bK{?X0beF*=ty$^X}Q1Wv4D@%=j{K=?*o9DHFD`x>f%_&BCevKzh2q?_94bM_lAM zbs3-CI1=qt^Wf22~%3P3Fw7X}fXepz+Zyi#To` z5|KLa+_}&1eOwmXmf(=7r|6eovWc3^sJ+O}un1f%d-UN`Q%6n=E3y`i8{WvZC_qr0;O?-njv zSou>uP2v=%nrFiwbLn?{@-13_cIYuNt>Aw>jQ!Rb?#?9qCmhRsVoKU{V?yZ;@$1Se7BlmYi zR_@_9yVke<|8;t&CSPdWzL>JjYqRBV?Jm7+SCU~Td?#FXr~9=2mCfB(7JmD>XYTzs zKOYL5fB*FDHs09#)7mc|l+f3|efsvjvk5O`qhDurYBRWeR%H`*EZ=lsq0}*{TT|`! zZ#}(i>!)2I9rN{bO=_#`xL$nR@@9A5^}YO075su`K6-UwuRGVn7^c2XUY}W}{WD{B zDt=epRsXS5K=~p6yzd8GR3FtjHx$;LmzvR??DeJS`t6uYdEOuQ|KI)n|L^}FkAJ?t z{r2nW@pgN67OwS{F5A0x;jyXT)^X`8oql-4_13j2!*@PGr#7;%bh2DZ-oq{^$myv% zV>++vhJDsD{M?L&%umX6mtX$$*#6Ikb=~1c91bp%dU!S(C!MqGkTkiHzq{_&t-61u z_uJgpur%&mCbU+pwkk?aK1?rZ@yBh8^*+p)bJoRGi#PxGw*2k0d2QvynHoE}W=Dz1 zy4~9=7B#(U_t%D#$z}6}eXbr1SyHO1l=!Bay|H`7!Vo=eZovo#p0ti5^Osw4^QCj_ z5Ie+`w&>kq=KP}_ z&SzB*n?1^BV-r?TJ3jT8)4FT3w=VRFS+ykNLTr*8m!#sBgaTHwCa3GDc0cg48>>a)CXW@AyM-pLCBG{lpPbQEVeD=nKKDShW^ za?v{j)9r`ed`QxnDqNJTZ*FZ-0Gz>B_3uRf2QZpOy4k^2+b_*IV)N>!)X*7V!PPi{r|) zR{6fx4tM{|+AoWLT3INtl^GX%n+xxmvPw$WnDKbo>-{xVJ7c#mtg@K0w1Y$5|8=5f zs^+1PX-a1jwk1ALsnk8SCrBV`)gf+U^Sj%&ZM{})EyJf1(v;S`2cDgPR zyW+L*SK!n`cCVl5OnQ7yL1@`755Y+O(3XQmRTf_yr=PC7eS2U3!!Q?tnVl;YXI->4 zIh}MNqw3}D7s?w}70fXFd}VH9Yx1sEj;l)>c5*Pkh}AX>?-UYPcvO}1?8{B-R_(f* z_q5_cyYP|&I%>Xdk}o^6nHxkH4^Cb5OL?A#-c!|?OU+aly%)UHmKgJBUsg49M&$H` zV!{iUno^c0E;HNZbk|*=D$sc5?&=2r8Akbcwoeki6MFYd+pCVU1B_*gdWRHF6>$YV zT&{C&!NvVs^YW+vy%d#wYqw>fyyX)`KXbjyOkTxxmABeg8tAT;nO+sMier@ni;@#d zaq_{33VScx={RiW>3{I#u5R$ukI@2`jrC@waXwc$;*-k0aA0})@?CNVww7{VDqZpWLe$TXTWr>(MtaHnR!=U~ z41I9tHizuK?5@)(s_ftPiceHpqg!LmrWnfJJagOad$$?>eEASC{qWNGd+Vl8-+ruH zN3m{SZ?1f7X};91Nfxs$1K1^M=A2h?+uoeooY{eXmpT4)6tNpL*=YqOJgj8AqI*S|uYB^MAdBbIj`K>t zp0g>3%VEF4;klBb6}nCz5*TA`i>}@E_09YJYg|}zf>MXRGs+DJUEMt1Kx$Qi;>+OqYuDW&lbSaNkP)PE& z?%8cROZrz&xGwb7CX0)2Z{@A^ocb<6{qw&0`3!%5B>sK) zvi#VNShH|__Bi>z=iC3i){j57@9{$hx9nP5k1uN@o0yk{iAPxny1v)T;%+=Stu?W# z+E#x0r^oN-zj^-o=`H@L_xIcHdi?aYZ+ZHs!-<8`Z+5LKS@raH`SI`X``srx>%M+` z>3DlN|L#fLFMgKP)J07560~@-An0_^D$##GWcO|<%)PeKTX5YKw!G=zitg3)99}5L zw{=SDmqH8KL(hJ^dwFDO&9A3xR~`&({r_Qi`uB@v`Cirb(I4EN1U`+5_!MljBg$9MhbLYJ`^ZMEGzYAdPK3wyK<3-_j1*W6V zC-`zd4g01&XOq<_GtF~PrtD{qWV8+}>;4%clK462-A~Uycbxyz3@gXYXM>AH#1c2jw24%PP0C=O`<8(M z33J5fF2DWFujKst`QIA;Xl-1Rlv2>8Dg1K5l}i&R7T5WzY57PPe)gDL+{V6cv1R}Z zbDBt@m~hI>WiwXTKNFagW4Gv=(yng(bo==Z(JSmWXZ~0_QLRz=(x2ItLPu6a&ax59$x-L@=2buuUBW?(j~^b z4Z903&gr(g7qBSd#9fIA)oOxDQ`1Bw+?aMNE;t)6{6fj|&uf(#MO$v9nZzp?CN7J) z|NPREkSunM#UE8vmj<7h?jT+5ws2`~<1!<~>8#Ig?_0m*=eoz@o~u?LiuL|nvnPBN zTfi0R$^RB~Y-{kJxvpB?tgWr9)K)}rm-}tr%lF#SYdCjTzwZn1@?5gVnL}yLRT&@i z?Mn@OI-cuTpE|+8Euk+mRrOqKXzDcAjM%I?t2A@v4Sf@?{#x66d+q)?-%p8nnjc=6 z_UhKJfMDYpR>szqJg52Eg_js$j=vkurVPtd(!xrJb7?{7QKe`{A?xId|E4-fZIy-7i|V_f4YBu6xHM z{ZbawKg$6>tB zdmBUo&d+FdX*v6x@wL*g!{7Vse?2}P_2zH;*Z*JU|9^P;^i`gOpTE9-)BpeX^7QMv zy(b#?h)z?=&F6^%d z>O1z~V#(RRr`u9nFaP{}+uuI+-?z`Vr*AKlwPQQ_Qi~~(>F2H+^XvZn*#CRE{J!e? znku`Zsc)vw4B&RHOyEij-JiRvmgno?B%OV0Ow}x>Mn!OK)Cnz#xV_N1^h*MxZmaAn zsfW7Dx)$o(-4=a$Vd&En-5k3Gy9BtGSadSG2;ExWvruH&3!9mVTBrCt5(5+kr)($> zy>fJ?P)5zqUoYeT{ra^@x?;x6*8$8ErDh)1Q5Rva;!sQ5mh(M1CwbreiW7y=OC$Um zCA}Oj9uX8=@Jb~3{@JU!EUg9c`xzSFy)0>rYP@;rg4NPP&!(+e*gaWuo!zY|mqL>^ z-#EP{i_KZO`un0+d>IO@uL8Ah@=DhLmME|~i zJ@rngsfNCY_ymEgOXu`uPptS7(7virb4rh##bV1jEi;bHo#Arzo7t~`a`o>)KWg^H zt}_pvs^nS``#N!Is_xclLCM$h6_)9o`N-fXa<+NqWQQe3=0>mP+gf&WH(zkA>5q(d$%u4Jh3ok_2-tJ)myGbX-`*rm(XUQAKKTRn*X@w z-Z!&vd;1r5uypn`bxq|EVp(_n+qzqk8M@sDlRH+f($d)L`fT46rPgep#l}3PT4~Ov zAC6|Ymu*hG)!xCPxLYnRBMv=xbeVQ+d-(3my{o&kcrwfrj>rgj*}m5Ku-R(%0U5!cK~Hy_2wK`z zaE|-qp`~FL(`vs2y?B_Z_{l&1-j&5gv$xIR==TV15)Lj>_DE_}s}nBRx{B}6?Va)K z_pYw1sr&P9_wwWRb?!0${#@73TQSx9>AkBS?&Zsbj32Lh@UX&S?Wg7Tb>Dv!R8;Q# z^JV(^yJw8I@Z7q3G(7#P#Z4#5ew~g=9CY_^i z3M_JNr)oYue0=%opVxNlwen}1exE+QSUPv@QZco(T(hX_h8;^+3p%&lT9&Q(RAJe@ z^481uj(xor^*SwXx{^+{^xEx8Pw%d%zW@Js{JuYbe%_iAal?0JM@#kP+7(&bRGlmf zeKd^Bbfae4oabEEeBw?~pD2T3PS^VBd3W`;U)y%9W%*^V){+^sd2rj(t;Ca-Vi6J_?pUs{cGT2qIu)ei;@**{o}7?g z6khrwWBKJzUw&)|xo9}!$L{y`e|{DH{CYZk%2K&&QR3!WKJAZRt-Aht-`n0LGX1Y} z^YzznKhS+uRxj{M$@0*(a$J+Yo86hh^|PR8ZR^^vZ_BodIqSy6<)3j`Iz!5Md+zpi zX%~`qtyn2kv$B z<@Q(qKf>3jKlRv)OCLV|{86y#_S*S zvYvjfyxqnZ8mhnbP219=I=kJ(!=W$v3mD71{88iH4F> z5BCEbmvn8HK-1LvId8W=`zbeJcB|W5rQO9^F*$& za=fW7f`wsg6pwS=j(w*0!^QL+g9M|QPJUBlhqca^#f8CV9A+Iz%jhzbsXVW6o!~cRG{GL+j$S9pW1hD zW(LnQ-(T|T;v2brM`ZN;RXE$PJn~I>xld(zZ`C5L#I>oP-UM23|IS~MIq805!7ZPv zo$V-ap6|EoStvL znz7uUd)awGZ4txuAD=3pD9tHeX34=XY>HER3ty;ph)>UC zN}6#%eZv1Dp27t$zy9t`nWP?Y&?CZn`*YjFMbAXlnB>l7Z&)E|!*u$f(ubWVl%F3q zn(=#f@AR9OXIeBGm!C>;UQ%4kbmpd8QIf`tj8`^IA8tSHbIO?UAWB9<*m^(ntnY1k zcI$oyZkC;UI&0p%&w(p`eZ7@bKK<0|ptha6CL1&!yD-B=PBB1oL8J95jve9)4+nK` zkjlF)SGQ^1E-}fh$J_c7vljF78-BUqlOUhW5zKceOef~dUascMFN!?N1fq8EtBS={ z-Y((8@yqRT%=6?e!qb{VAKmYIC-fP&x-$K)x}f*fZPe8suo)D@9MJL zK1m+-QgyAFX?iX!@`XJ92W}Yk7>G@74^g{q;`C>+wVmuFgPOxH-i0?6znYY6F5#q= zek}M>i%($t;bb+(n8dVmDWM;J%g?)4ZeY+p~f=(1vzTRK6tLE3Pe7D04Z4HbrQMQNwec1i{{~!Cmf93!G*rMa7 z#P)6J4navl?v{uL4 zE<%wd=uM%+?AL(7qY669Mha!WqNik z(pzvS=GfD(r{n9a?pH-lTj-W&s8qP3{Ij8q%R0L%frigci3&D5h32?wtb8u&B{c8D zllUgRAoi!8a_@fa*nMbzULbeiHuihi2~&5$fN zQsue&#mnUab5I&dPMEC($-IxA9F3( zx-WmRLDtlzr#6Xc3b~fgS-n`g_(b@ksKUgq&h1k!$6Wkw*d|!B_NsVfmZoh zk8d)C1+H%X8+Ijsn6uHLXX&-}_QO>xu76&8bI0}Tfs=Wz?%3STF{f0*IO5NSBF*FX z{ubTbzV`07WnN;I-%n`V-gV;f%L8Y^KfN_uGOaZBY|at3Q`RjrJcPo{k`fa+Q|EJt z2VO19YYaWok>+o(!#KF}bBjVNmq5X01Lk#ohQ}ms zC8so}|EfD7Ve|A+OM$SjX3`E@rc)*ArZv@}9WA=uw<_%7%GEXB7`6!NwQ8L%T-n~5 zEoffMy?^HwrB+U-hAFOn#}B7w&yc+x8#U2B=)}7V%Ts%O65X9@WJT19nx#Z{Y?i9E zeSdxJcEi5*)Gr%D82>!}effRe_jw81ukGI#bKKx+;Pj}L`Sbbg|2_QszV3V7$}e9u zxL-fL6n}qR?h2_LLI;mA=pQ=hJ6p0Rl=EC@hVy&p_NEHUb+12a=-m3VD|dVL{(Wy_ zI$Eo)Z{Pm5D$`q3bCcfJf)xch(b8tOu64ZFU?6C?P$WuQGQ#D~jk{-Zd6E|$O}!oZ z`$h7b+?aK?ZY(lRuRUZvFr5)6=h?UY`ECVa363nq4VO+#4O(4QJk4-k<1_ zlOeNyp4Zk6=dx3lkJhm@iQC2BDt-N~@V$Vr>D|s31zL}-c&_BIoHcdhGwhu3JEAyk zoy(+s(m%HQSn(Juwk?<~s=DlgfyJ_-nGH*)G3@o7%enPK(2NtUE5-D9w3J%!PI+J; z-1e>Too~C`byk+E8)M6w=KH-azi(UrYm?=Vf)xt4@?sn3+wZOYStRSMn3EPCmv8IL zZ+L~_`5x6+E`4rsKF5q4-QwW%>C96dcV%ZM^JK4Wt#R{`j8$G(x^mH3xBao}trQ8spm6LD`Pi@|HYF<~hHaWpT8$m#bX=)5E)y%cpNeY*%;boKAe$mOS+g6mK8Dug)qz zbVM$`_wLZ8nE*wT0*VtOQf` zg>u*T^+&mOuFrqFYvmzV4wrL(o~FKD%+LFlZ>@KvnB?Jg*X@>VZDY_}qbyyh6!i64 zo6a7+pwzqU>u%@0GgN3#KRlbg?nJfn?@mh_NvD~+w@s1Q`aIye;fY^L$E zEG3QKKOgigU#;S}XT{mzBhTd~nJckx_G`FQyUBF&7S1;nVm}-8I6oD#em+_GT19J` zN}PlLyOUm*%pshDOvjp|s8&>P)8l)AgSHs6BM%ceH_?*t+uqxh=-!b}TiA7ba^fOz>vb zkXccfI`eqO^@QKTTb{a@acyj5>M`q5DE`eWm3Hw0i~iJ?s+N|P2M=djn;Gw`H!^RT zWv!YmcyfB)!5in~CYE=K9J5hX>R#L5IcKSef_(Q~!{ZEM`x&=xoP6n^?0id23noGL zcBk)ciXov7gNoc=JhNFHxFkyQyQ;peu6$8WZ$IR%=SrKyb z^I{P_k>^_s?)P)}r~Anjf6TedqbJb5Yv!z-FIxETCWJJtl$YDZ+rB#c%~p;yMRw;C ziR+ve?H5cs?mYX{2Me}?E@xC#R)1ts`IFkG_Q#W>MG!q0E-<){Fzwu8B+F0yaFovUupDe-aLnqxY0 z9ZolvFfX-|>0i5b|DT`h@7MqT@Z+Iu7NhW$*cOhAz4y2MeOpzxyG<^;#5R6+wRlrm z>ZjxFtSal)?QL(**DSFLW2lz4Sz&5wnsjRC+=7Q4DN+V$-KS4%(e9q${zYoy9sX$v z=aj3u9eiA89Ep4+a&GzYR);A{L^aPUlvyGrq4 zAE9~yUg^pbSFKu!mqN2Y7l<4?_Wg>6dQfZUpIOiE^FN)%8gb@{m~dIh-8+gsmCK*G z%D>atzDMxo?S=W(uTM<0&S_X}SiLh>xot0x?>obpyw7>w%~>e-(X+2)sN?6`B`>J?FilXvH4 zEaRBTR3Mc1?68f<8sXw*>kvoPoqAojJ(+UK#M*=#LnV?|WHqEc)0op{`Mg!lS1cOj!&m9i_G*E65nR|b)j0yY_*%mg0e%GzP@+v zx?R-zm5^Pw(P5c-qnB#GH`K_uI_76&?9j?9@6_QqnzPeMj@e z4^PDE{@48Z@UXEXZ~EV&G%-85>oYdLG)M}1o$JrkJR?NcWl@O4vmloi$2G|odtzsQ zW4y8H3dcsTKrus;yBr$>lPj27A~xBW%j!6_eBE&2bLJOCm-YJ3ud#9OOyo&^xUK)* zN)hcxsR}-uuDQJsn)#w6YKG_4vb)RQ37^@gx9M6Gx8OpKsag&F*L2@$n`$cN`WzKI z&f~sJYRi-l66@V(S{zXPjdN*@sVnNyYeCGux z80X6Ih2}a}%PVJOZ53P;?EIctZ|Q{U3hu|vu5WX*5)zer-c8TG?bL0bw$Fu&t=Mc{ z`{L?J$p<&;Ze7>P{V~>l!7SBSqxtPg&$geg+nd+wdf0_G;nzYVKBFZ;(_SRJb35Ru zq`)ri^|0ObniqfnYU#Y)ao_$;kB`$f4i|iQ$U^RP`TOaY69W^n<)fshf9`GB5}mqc zDyP{lu}%H&`Tg5}eTlHI-M43-S-3i5Qcb@j$5I0&&$fqYOTDfxdiKuMednH+`|iix z&(mLjJK*}mGgpqkh`k-aBv_SbwdQGofb_kn{KcV~$DM0yBDyS``Ma;|T6eZBs^i#i zJG1xO*T%2Ad!?{Dh<%|VRG0To44E2c7OFMZ(Z-w?}jD2w;Gnbw-O0S zS<$*t(beQtLB^Ho507j<@voS{%4r#El9cW9^RwFd)+PKXSUdHr)rpn-xw#hHMsFMM z$hs+~Fg5C@&(XMZBI!UufCx{iGAqZcHD)^+gz}Ws_0O~_Dn09nIV=;k5Fok_Dk5zXzsvr^jl8~56o23;4* z-k#CX`Kqu?VOjg-L*9i>_e&$QHQ!{N4mz8V#l>6MK6CQ|F|JLDY%*IHGR8~^nsf2+ zyTgax=sYQqZR==bVF)s3;wsjBTJgl`Oob|c+ zVK*zM-d;C9K0iKw-McL!zxe;>{r&gzL*CQp%MbrF+qU*z}@U zUi$tWOWCGGZ(W9C2IBW-HFaOu?U3`=s+aNc+tar33UG^;IZG(%=f>8k_>TeZVylTnh zPR;;I<|Cb1QFIHs(KIRjgd<;QcOEK6TcCy}Yb7Y4citBr)}P zEKqzaZTE0m<~*0Ir*+D~Mm~R(e=n_J*|Be?7fSGtJJ=%c-)9D0ek*IA|@+XHJ^>b3coYSLc43856-6?&FYQ_gHf3L%x&?YIp4& zmsQ>kJ^A^6;eUlG$Nd;K9@zFZWB-|+NTxC_^^!kZSS|@|JKQk)wgm6A%l~Z*qof_J z1RmJ=%sdo&z-VLAqyrZZyr~XXoRPdjj_dEk-OIl(uhOWql8rx?`#Sl)$-S*JdzS?% z9C~+h4)15VtVRo7Bh6a5B9XTGRjyp3(l1_Jug$4W4_F(tTQ=Ns&Z)1tudCUA@6y>{ zzkSZDMbF%xUMtDAx)P<)&ymFwJS(Q{*m*Usp4qzfdsZ1)w@;k8g3DgcYpT(iwppx? zU7oZoe7H5;ZyTG?aY4iCCE5vnAtzg%&nfYI+IH7xtxk~F$Gm2b_O1woU)O4ZD?-QP@7<-z_VnD#a-7!Zs!i=Oj+Zj_+EGYnM8*Z zmmGNZ<}S`%vm^J**VlDBT`x&r=QyFnzh{w1n&$fTZ}` za(H+9>!;JFU!PuUeWhUUo9Va9c7EN~Z|J5O)8Vsm9^c-tN}*ggU$~U5aBSY0BDC{E z!34tta#c%uv|SI}NNbqMcj-(?izbJHXRJ@owvx-nEsmL%=@*+{I2Z>vFjo1-|d71AI+JO`fTaU z%uW8D@+_`w{?F6f952}(H@tKs=bnCLkd;j0FXiG=#gCDB2ORU9&xV|x8Whg%$De;Zv>z(FniKkfFUOW@x<34CA_|(4nV_5z&TJV&Q>8B@WvL8cgl;)7MO>AH8XKY%+%q-SUzuS&`LZ6M!xpy*R(LGZ&zuQs_|SYzF>x`lUfSYf|mLjiyCs^go*8%wJz zBGymOmNse5ymN)KgWa%d@+8MnhK(soY#U!(IIzR{AEyJCs9@rCJC};JN<}xm%Uvi= zRaz&qvqfi_m(SLYE03P#@_cD1d4E-PS>FBHM=u>0&eB?7cH#TByW6(CUH-VxQYIxb zfJMd6WnDor+woQWmor&Z8#W7fiW#VEb}SCQ!OfFr<|gm9Ve176YmOs}3|oZcw5B$= z&IoYf^H%)6@LAfSprGd`4B1TQyqUF9-Q@U*nU*abys})aQmu6=UdJoW9!%u>x~%H< z@6_ytht>a?+3Re3vq#6+!kRtSAbi?krL6}4+ishFH*|aNy5mlE)9r2I)B4|ssaxf5 z-=-ZNfy#!zsjW7YI9~yOvV>-yTgZ-3{$FWdX>_l0$8L7kDuUnCzf7EzN8Yi-lah&}Y(CpGfPhJvXI&(?}W zF5$R+%`N}%)RuyX*JZEcCv6kZGdild>WO~-+p?`eGfrIFTJz&aiPc=K(?u(u z?T9fq*7$Jwy#D+;+s&1tVHR!tz8707tF|vXYg&BZ=FG#{m7@}#M7sbJ(mw`-n`N>*s7^;d*#lZtDU%fFL66{B+N|+=twxc!@wf5Y)5PO zy)$jQ&08H?k~H4$nznrT# z*}=0#i7(+v=QFe1%Ae**iiHa{+wAsRHs_GLK%1q~9@Uk77b;tQkJKFMV|?5Cj6*Oi zy=~?{2cC>u>=W%?>EtRgA1Iu^Rn#MP(y8(r`W?$UCip2{tvUFyla+kc53SMtJ7vzt2~=I+fqWt$i#S8^y3LaCgneByf?neQOYm){_sRa zEV~ECD@M85DZ3NOFKBo#j*z~*e~!M6NY|tVuVNN#;TeZKL;RV?{JGtYKSQM>ef=aI*IPvv}n^ga1e)Dg#k ztqz+z1Qb2{e%^f)al)?R(2tE*9X0#EUpX5Xcj_b83>)cH`RgJMoq77jWme4Mql;U< z-BE5zv-_COdPGJ|NWN{tEs;OZt25L!(#ohl_ z=_oxYh~&v&dYI=DBhF}eXi9?KRy!Lx?$2LuRb4kc)5*K#?XKUM5z%^P3)`kQh3i|+@Y)p%0m zVt8C&$Gcxu_vEi_wV9J4YMsw`XQtKU*{gSMja~2ieIaPu)4H`=?Pl@aco-4>ELHOU zPGiU08!jI2NHC2OZ{zmaC@}fW+4fZiT@81Xnqw^(thSbHow2%VV#8|(o|#TdtRMKD z;ItO1*7#Ma1hdnXDFA4)^}b8ck> z$vnH)R%Y6(d3>kQyQu$q1d|EWj4)UH^_WWGRk&TvtPQAO$gm2VUe{P+WH_0Y1%%yGBZtlw$-o5fG zn4LaHh5ckPR~(NY$D92ehK)8|Zp%9V9}vup{JhRjy-CyI+!@9WKOf$AUM`UehIh_H z3f)stDpyJuD}T2v_lw~ao%WBc!a_j{T-YPJj!X~`Q&RMpsueP0iGg5m;`VF#zcZAJ zULH8ZGf9NUs(4nq=Grxl#oY#lZG{Ez7te0$klg$G-mTQvYh6`34tdOo*&n;rwIJfj zM~(M#uM0($#5HwNZyzgteLedA?zg+QCVqVJ=zEx~9Os3HzGC8u!NC^{{{Q-V>D#t7 zpFR{Q1gsQVudlavT63vE#{-VJ(%ssUpZCl<>+tO16Td$0cYdzdmYxdoj(x!3dV*LSwui05>IYW3;(x0#kqMD&Qo)kZ8>2i*6?O^n0kxwq!YUd;S&d%p<59_i3v3Y$q zownwaPkJxeGx^K9=dbH>e{=Yx8ifSjEEEepXZcJo@QZ`*G_6pJ*BOs&k`BMSyE{a1 z`MuH^)0WoQ$jQm^v;6zAwWfAw&x(@88=m_JbBNjRS4%&nY}sg0vU~fo+8?>E6TalF z)8k&dG-TQ1h4cJQ2VIzTbn*IBnZ9gM$BE9J%B*Q-yEYr>d*>&=Im{U|Gd6i*@rlqG zXBAx!@H`57UAEbOe%$}J>-X>5^ES7fo%eG`{D#{8Nr9zLBK=(sNR$<)J}Qdh+qxj- z;g#PjxYutz;utO#*%@{Hc5eLiA{)66e=eN0tG{?p_mgRf%L9hp2_~|S?yMA;cW>@I zIX?d7QQ5h%_v6k*XZxS`KYqOZ_O*NGX3uE$xVv?wsr26Sr$2YZz03wCB_GXo0fZ70OwkKP~WBAk67ib?MGQ zo1#YP%{v@58}3YD4;AP*c6G-2N^a1vXfS?ka?aqO!Z>wHMtqz#@ z_tGu96MMoczwg-aqfYwOs}D~Vt`_Vzi|Y5D`1!)^YqKYbC^qsncUXU0$0EfjZKy5N zwcyd#*LOSIToj9wADwi!>M&Ki&F*VasF!54!1@G3TYsR}KevT1d1rdBFqIeo`S9<< z!-pTbRT@jT39igh*;;3N|KF$2*K=>rxH~ms1&8fkYq_qP?u_68Vd}iq{0~5}&bh>(665@9jUmCw$`8tVNQZjXfXF8j7E|(88p|tCg00?5#kw zS?9e24$gN3{ja@0c6EoIL8CBNB2#M568B7j^R|D=K66{NhM$^jG+*^=4xe+HTfj?S*+{q4V=u1@TFGkc2g^J3$2&nw3Evkvc0 zpD=q?`_qh7b57j-v~{z~NBP;8g*GmJ)5dT{LqeS&q4|MC;#qt znJV=A=NZ2yEq;1KI88QL zpo4YqN^!MKx6j^-%m31zF7)%)(?3sByBl??v)?JKOt@~>qw(d|x_u&gOY@{}t=kyf zePLG^(^k2}s4druZ1fZst^J;tT=666Sb?ei{yTN`QU5;I|FTZ3`Ss=3-OCT}|9|-R zVZ-7A>36R8=4Mrw|8V}kzt-;m*XN&KFMZ3b(D!rd&#OZA=OoJc>I{==+69C2zpbi{ zUn?T?P|0u?v#;qo;oaYrFCJX_uD!!i?s8hf%#Nnp`wril|L@1&|3CkKtGBS5WB32l z_0O+=e*9QyyKbqN^xypdZ}q2dKV6r7UfzD)^2`49e?L9{f8XEvxyh#(`GcLu<8Pdi z=>MMC`sQxt-^=~-`~LrHEZM&HW6;7k?_OvAeAw=;S7TYO`Sr^VyZ!c_3!}P2G`%MV z?GQ_9Yq%04Ar}1ZuCUY2?r@DfqlTW=8I$9S)DrX0w!7|qp5?-2oROcOe>?T^Iwe-; zZTHs2o)4FumEY`e#^;TqX75jzuA*ECFA1((tAK_gtD_m$4gc(Vxm^GH=WF`6@3nuc zondw4y#8&A6NfWHTX){ycDK2==%JERgqE@HCHBh-lk7ZZcq=BJ;V^o1;&X^`A?Kr` zmQB%{&du-JS>eRla8|D2NnP{i=Zw$K*yXLyumAb__4#fls5}0O-p1tm!Nuj*NHot$Ly697h9}9GxO#dXMGM{!o zwNvW)+jDAWqvvF6bth55(cX5^^2$sa9z z^RB_Lc!!YFlNHNckDR^okV*F42Fuht%KG;n$h<5n*v@&-;!J?*F*&ym&#Y@QM?@|@ zlyULeF|Dnt>!K5TX&8?rY7)OMWmctmG}( z;BltCH%1}-k(SJ-*d6>^U$48q*S#*DLDTTko@r?X$8hf_hA!V$2QsN@G{Ite=`O<9^=m<3FlcC*SuB5)(SH zMqYuZ$f%fYs!-shgiaOq9lIr8Gs$LMJZH5t@^)EpwEt?It9NaWZ`)yg#>(N0&}*xk zqRfpQmU1~F86O0?rHvh!oHU=x|NDD!=70JBr|bW}ynJ@$gE+-zjkIG1>{BEUZOm}e z5VrC;{QBL!_R`Pm);%mQD|TmeSZ6Ttgb9Q3*M*TQW_}KGxbo{p)c$wX*Dr7sbJ)(@ z>9%2dz=J9lfk06$#l6C62`7C8gFim{7-h08mnToTW(R}(wW<|Q9|m|&+_gvi!RPD7 z#y+-FG#THs>b%Qh=-MFA{$J-wc3R!tT@!@oG<+~K4qQ3WL-qBccYKPb`|q;(m7FM0 zE=Wzg#*oJIY+vrJ%g4Vf z*CctZpKe=Ywm1FH)UxEn^6+x4qT9z`zc$+?n7_9F^wO_(XY_xs`(4WIU!J|n`S=DN z6+f?nW!$c;Eg6hX`Y*HmrYL`AxYU!YXf9vK7#)%!V>fHzP50UN*7}&V9^zE}ux06n z1Ez~im@B;h9XmT$Q!Su5;;d(^%HxNeVci}R{}e2 zAid%3+H4bpJ#se`t3Ml>>|3_VcsH-F+Ub+KI1k@F6(!f#{HL7?R}Y%9GRsnvc=EmaiMyt zd1}#M}1#-d}@w{m+ay06E6>3FTOqdZeH?k-r^}s zk5yfF2+pO^3F@t>)d-X5Lo;IiY??bl_u^QPyTZ!V3z_W0Iu17?}ig_YLvXL-z~ z`9E(jt^NP-$M1gr?AQ};bMtG%lQf+?>gBm7M_F+`KJ#UF&%t*E(hd0!nK(Ipnp<5h zI;9PFFU`}-U&oornk4_-w@268M(M%959^d}H;U}OWIK;<|6Hbrp7!@YHvc%0H}6im z&69P_oBp_8+4i~D)h|ZqipLi{jT;;Em%LN0{oFEPw&a7fL;GttzI*5MsPb%5*6wFp zOlI?661wMfz`60$5nq>;Mt%1uzB6bPcCU(#w1HFp+3{YcwxSAgUw1W$Hyh5JJe?~rf4;>( zT@}9Hyh>hwG`wQn)AqVv%zkBAbmipLxlC{SGi@7%q-_-5KQR)XrlK_a^~vBy*^s%< zzx=!s>q)z=<*zwG4)&{YQEdD2j&-biSpVafI*7t{r z-GwR9Z2cwm7bLYs7J3*OJp9MB`P@aBxQTLiOpdTP<}x%-{C3S{_lboLoQ&Mc$^LHV zS`(g`{8Rns*Rl15i%Vj@%co<-d)(hG`?2BU>CY=a?-5$=WfE`b`}yZxX~AgytaBmk z%j&fb{Z_N?bE#&4(FRi*0mI@0zh|mz5*e<|!S$O3O|?RVa<* zU!TAI?>5J;Kl{%wFVDU|t0O{MfB(HDA0BR4qit;awa@Hc+gF_}cLd#+U(V;NUlDDx z{qWhTTsN+={|s=+$X~0p^hVA;4v9jhNRfY<$JM6Y*pR3us4R4E+uM&1f6V{i|NnA- z{jbCA_BHGu4*%wlyyL{k`scTN{hf8u_t(ANsMr4Zeckt;%j^HHjBlHARk?oRf?xqw zl@(o2y579pQCGA5--mx++TY(d+?jd(;`LJr4xZCK{rMNtmE-T+-0%#=;z97uNS|tUDI0;%}D{ZFD$aZ5_WY_qDJ5Jh@wE z>wdld`F#C!{ruYw_bkeL)cbno++KO=jQ;eG>;HeceDVIy{`2$o51;;c*ZOT$?e2en zKEGbSKks>MiSuptiH0AGgv#HZy_48dd;RrRZ${&8kJwe#3*!8l-0!-!EKQa1O$T?yiFd!&I(F-**oQy1-U`>udL5=Mdw$Y9;hN9HeVh#f zTST7Pv{xq?3N)phpB&*Et7~TVm~YRKTF*4O2h2=nj}8>viS>wRVV?2*p({&E)KN*> zNvkHbWbTPiW1G^-<*B*uorzP{i|<@oCwZ4$*}=uUXM16G^?NVBLy@*YM?_f-IT$o_ zS|fv2*#F*}Vs-J#ce6a(9G{;NOkYn#)T+%YvJ~K)$gzs$Mtjtbj)s%GYdyldk8N80 zF1Fp0C(F?Lbi)Npc9ouWW!b09<*a7hTzNmQHhY(Pfm%#}SO#~-3{M@->;n=)?>iF> z3OEIOpN4Q}<;w7xs>!&-b#%!1oxb;or{U-w1&QiMzK3HkJ@HqRQ&URxc(`j?khW-{ zAcM-}pieUPT@0;P4*0k}`mr!`VWL{P-qH;p?tPv2MLy!1%R=X8S&1<{rulh>+2Wp` z7I^G@CBu}a*UOn%9C!ncswfSd39jV zf!LH4nMYoATCCW5_pbk$ryFhsOkneu@>1H+eB*J9vXe)5$Yu*}kK1Q_?jCe)Sy|B< zt@+3Q|BuJli~oOly8ml+TyOKE$A;5m4hKf)ty4Dbu)FPO zoSY=f_0e^Sn4^gEGoE@YvHw2;Zphl~n!En@)~$jUxT-H5bV%zh{MO*ZqNvn9E99go zBZI`<+=sdHeDPY_7e3N>kQ;8f{rK@_ktS7Vr90K&d82ohImv5!NKkxtd>;At#FQ1kcrwjIN+;mM=A=r3DM}&@~;*QPLD}!3DrwV?1 ztavEpWr>#3(yt38p55CmpZ!pYLGbfK4`=0dQ$1HqE3yzX)jqRSVCU?}+oj=eouh-3 zjGnzNl|P(!Th8O`=g*Hf>BPsMxBvU+>$Y;!`@6R-td-9y&Q`QMv?sTI@^!o4k1}{J z>%2(0IOAr{G*k6=j%OVt5+{_LKKHTitK!+m^R_LJ5O}$+QFF#J?Q?URS2fR`xWW3& z9OvdoaoKCw*SB_ZgjUI4YcIa z_M?QCiyyK{6majiU_P{Gohyey8MC)e@PUilmc4qtYr~X=qr0nif88Zget$NvF|*HH z8-a^wP75#_ep{xa#v)s0apkbqml~C27u$A;rZHu{Um4-R^6l5QQgiFMd@SM%mDU{o zX6F&%^nbR$tl+B5EKT1u5ycW=zJE4S&vm-1PgruW@VE*Z2zSf#rQWbQ7p<$HReNLQ zG_N;l{Kub0oC;F$I+v>3x^YU8#T3o$hXQuLz3cYNYR~I{{jt&J(ru@2m+kyA(eZ6b zZuITrg}VIy?60d{Ybh-XTlFUPzFw`x@kz1WGS@#nyS+8iN5Vtul7o}d8?&iF->YU9 zO;rxFynj%B$>wvLHa&Wvzn{}GVde%o^@T@{v^q~M_g{TrX6E~E)90VF`jsnPd*kJn zUjeGSVxqIxEqlH2-mew23l}~OaKC;!`}XdcS~G2HD^|59Jz@F(0E~zT~3Czt=SF zsbaF5Ic@fu8-M$R&e&ZQXzN|`!uZ0}O+_cnv}XVK<7M2LWv25zxJgL=i^V!6{tHo7MXK=2>Co-s3Wt4b=E&?SJOy z`g^%{m|Z|p?-zr6ihsds7j^hxhGow#v(-g*09N(^}~7x0?;uUfGAq8GQ2>-*$a6YqI< zW;|c}u+ybI@;uYTuJCyiVzzxgSy~)&@&2y^46EPt%?X;&C@kr_GRtG1Ky1XK{U!O$ zw!w~%uYK4(_14{nLp%v9c1a6Is%alQoX2u4MrF$GAAPfqAAjaCTRCZ#-0a^gE$o@k ze>}`0tr+pR;YP)}P8*BMU-RE|%rooG>o3{Ud7;)?@}1wC3pei04cnp5=wlnxC2whb zcVFVujiO9%pZ%WK!Rgd<#N+dvIk!z7vhH)=m)I3E$**8Tv&W73a$#Q#cL`s9zFvH5 zf?TDF!t>|R_qWX!6jjoEx`FA;?Q5$a@BY4e%CD+>TOF5Jef)WAR&U3@$SaXGx4+-s z+Pw2h(5|g!$0TBY6vSv>)?fej`v0f*b8i28c%1*;8Y_=G4%65E|ME0V<-Ob<4$uLx z*Up?Ue0s>Pzppc#MeU=sSKF1lzXTRK-D#Uyt($YU>(~!J=~=6f2B{hO|4ZP|yl%OX zNA_<~_5X)I>i_QlA7A(9cs+kb{=>3WCRZ%4+KL^ZGVZ zP9HMt{HP~Bw>+9-C4cC@AMM}o?~k7^KmGB_8v&*bUDncc1oCBY3pWN&}Hf2Zcn!!s^Snl1(c))FFJQC+tWBzt@Gh?Z{<^(52koz6m_tl~430i77W`*m~S`Y1ui$oLld}XSKe_bS`%vovXhmoqPCfW1y+~8ioJYpC3$f z+-{)!czegeRelYTSI)OE$U44a+kECu&%bJ~p2zPqb~O1co~GIsm2hW?RC~Ah@wt{h zaz>{m(#|lN+<&$32=nuat~?G#6I6Nc9{gPy@@L8y_iNGbE}xh-?JFn$49Ql#iw_U_ zS=VI8mg;O35z`7e;Ik$xOUf;RTVV-dfA;hqgCFGjBC7*K^viR4h$# z#s(h~K^280iGTyDPr`NvE)nP`*|BDi&eM+{fBYyY`Fw5n?#Tke@?mjVlB>+lH0=BS zK!$tsD#3KA)SgD|)@z{=D@2}kOyFj+U3cZ-=f*?4R%~Y?>x@&Z^32?O&e+bGR{s9p z#++Q9w`x-oi-iyLZEkcF@o;$(x>H&>eb?qAH`v5aU6C$U_Ry7?lGzgADX8>mv#Gp~ z%xbS08cd8v*V|eh6$JHE(=JRlxE^G1GJoaKtM1{goJ!5Q5k76nFAO&Sh@E7!rTQ#u zlG?)^e>-k|jlRibE`8Un+(MkwqJ{OMVdm>)g$G)!rW!q&u;N4htSLHAZM8MZC00iB zWL-G$tc_JjZl{it$k}O-NR$y|z^+C+}MCOk){g zgX6Y+!B(UH|rJTYTQ$t%|N!j{m&G?_K+6$G>;w{mU<}e0y7e zEpLEy*>2ONk}{KZe%*aErPO(c)uH!mPcE-{edvy(iej8XLub3{Q(+!|7A47^2V1+U zIbNh?W{ACwO<|g`RIhdJowZ_JANfqOU%Xhv+|Fk&b(BT&(L%A=@n<~`IwjwbIM!q5 z(>`;y-(#_~H9K~_-e4Hw>!@NV+^8UV{E3o~*eZ=no{yF_33PqfltLV~h9pVV-jJ|MK3lkA`u5iu zz7Kiot8Cunep%@B#Jlj(y|(8EB+oyvQAoSSq<3gh(!1mphdU#Zxh^eP=5fUB%9bU0 zTR$91edCq$F>Vo$(4wVXyAPK}s+?*s)s4-(dG+9JvlGWZM#LUG@cH-Uk0EQN@9>58 zd9U2+u`^iz-nWfgx4n&R_fA#ZlIHt%*Uen{=-1Pu^J62ITw&T=Cw;57{MAwY{Oj4T zmtKp>)meW%mxr}`b+qC46Q`T%nJ+N0C7zmW6)wEo(D>Hjl?OVf&FFCI$qU}_IQZkk z&5?5@4d3bY^z7|SV|~%LF*^V8=bf`xPB|6h_PI>f`Kshn5h;(uD+;8y?ai%zy_T1w zfA4%hZ%f&>t@VFj8i^b~{K#eXl=pUad9{1?=9u|EzxdhNsQAQ&&1d|#sU7t;`M9%T zH3NtDiBs=W)l#ocFU_nM@>e~udWq}%9dmcG`#%;go6%FcXO>2H zM$oF2VJ9^v?eP`9>TyN+>zBrr5szdV@2AG({+V>)i~kJ450)Nx(u1qQQ)fr>EwKjb%{U6qvb};n1m^*l!P(QcxW!~BK*_*3*wA2DObh7w; z;Pae)&R{D;P}BE$=LL;t9sj&Bvx`NEtEENBQLeLzk<+AlQH`Ye91Cmp8s=Z$il2wg z=Sa`_ykmmpyqj;f>l!?n;(082*6B$G%HN8XFt?~bGHyK4l6P`O#~kM3p6`X`oNn{@ znwPs9O?Ygf^62r;*zeEZz1-NpN4uzjrFGF6Gk?2lkEb|^tXp_Zpo>>`!yFE|_x)!K zl^Z@kKlps6#ozWk;nK$@Y1Lj<#f>eO^~ zjdhDBmoKZ4VDLB*+ZxfZ=-0m!UtgB&-nMkw>1$Q*+aJH$uw^2YZj{-}loh{qp1HF;|E-x%dvzp>!~0i#hHr}QEBH~Rt^Ct8yO>Tl&2zde!apZS{lSw* zPRrc-f@a8ut=`~u{t5dm-k!=Hi}}a3CmU4mzU#HIee$2>{~!9>|9jkjOTR!pDtY#$ zJvALi3}ddwo@JYJ$4Bdb|NqbScDAWUyxhqr z=K6uNFA7@LBsBD9NA@4*c%q&p)cI;whv$v=X@7q(b#A-=b<53N$E-XICN8?dt6{%E z#(|S-N8#FSyhf^R+O{OXU{sJ557g=g1_>YE&k3Xly2AHG|Ado^WE91MV>R}RDap) zwr*Se@u%7or!GzEVMnYxNt-q&#O|@0hRe0a ztf(8B59KUmr(65Y7jf=jXu5scdBRLx)!V`K{TUVpTa85mgzgmZZ|*SGobqW(=f`(X z%(l8XiOK3SR)o#5;$Tr+^4TO(wOHSk>G`J%1@3X@&)D{=>6V4eS!?qC zP^W28!E8r{)+zeut;=`tn||HbF@5E(l$zSd{U*~gK6@KsP!}~qe z%IzU90z$i{9x%RW&YdoBJav*?kIr2uXFda`TTc($)=pa4K)8>*C2b4X+D6 zUo&}Ukff)YAL}D;$gT0j>f_qyuiJ#Lh-+>QOUtXho_I{-aMsgQO};f-j4r>}b@f`* z>)Z@KO+Ra6!x^qz8w*x`%;9KlmM-jVG?{10^nBH+B5zRWQ={(h*Y`iq zA0Mx$AAhf@d#8M$%M@;lRRI=;;)(*hEro+SqYp+b37IIPF7wrM((l5D4m(8Fw7=TD zd(oAm^!}vuSyJL@e18{DIdn$n>AEkccFDbSNf0b;==D^JW^_5^TDryVRKQ9fE_1Jy z3auuJDF-%&Zu(qM{-lWeAx9^N5=XpjgUHWMPrsh8|5y4YLtoe+{h5ypYx4;no^n1B zMys9~p}8|w?LM^2ZO)YQcBhKj4Q5Mne_hD(LFkEN$^-_Hy1M>S3+`n)eMwv#CJWTn z7Z|k47{A**WB${3%gi1aUUt8vIeGa7gQrfbUM*X&>HXZhPZJHxgQKr4IvcWegWU8* zhlP1lj97VsB9wTV0$JKm+1J!me6K0FzPI;u>i#<=`FA@HWYlg5DBS;6?|3M0@&XRa zhh?ua&R|LVo#p9^bh>i>M&Rr{~%<~O|~F+X>F$P~TwF1g;~+U1S+ z;%2S1+Bs9mxRs~(gknH0GKu9=UASM5zabl~x;F!glQxow&7yi$+XUV0g*0OE)qr%@iSBIM_EAb}VsqTshx04gMIJc_$ zz15a0LdnZ+UyI8AeQ$bd=eEG#dQ0c{X)nonbNkx1y}~C>uvOeY9@IVa?cqCnIeH(8 zg`bs3Zi&&ckzDeyCGA}-`(=aoQVeVcrapxa%eWa1{4x+sd$ca=Kvm2fwuv(S+?LZy zYpY_i71>@${QMU3Zsj2ck+=;vB&~=|@V|-MYV3+O;C|Hwqs z^}${9=gHoy4Vz(URDLY@QtJN1-OhJKgtRJ)l2Q zMV-aivDnt*l4Jy{~B2i3j-(ffFWHI#f>Sv`SxBlt&vuZ~3Rf4;gFs*nZqba@l z$+H9lrZ;{$5lwq4{m#7ioN_r)XZJZDjjr=1=O^Ag^`vi^jnJcsvyN9hV!6fO6Q|f; z>b@lP$w5DxqdUI5-RrX7!8p3>(@f^eKP2lki<31|!aV+e_u4kRgzvEG1$I$WrMeFba(bFMFn-E zoZANGY7;g(r>yn;`*f}7qSssZ?|C;retTmQSMb+PljwDZ2Q>ZGcm(*SB)qG2I#Khe zp@EN|KlA-Iofz-H%|gxJ?)d1c?iagj*WC11A$zgjkLCYA+~v2g`~U9me0 zjWeuoHf*16eo<+EwchJP*;5aDDRumJ{^johuci1l1Ixaf><=2nT zi=@Bp|5qRX@7MNgqPG>+T@_JL_ar{5UX`Yp!ZQvAMwdBz431`esPuSdG}HIHOu!IsoTw9uxVkIt&UTo;8B}y+bJ6p?Or)QpJL+QV4G)G zll*bfQ3Gx@l~o5cPH2Soix~ZHc>eC%fPJdu3Tk3ZRrZDiLGxo=(x6A+p3p+b6Zj6-mlj* ztHlJAV|G1ydHs~;@#IYsCN9&0RlT-HUC+4TaA=uZK+i)zD>g-&osqlOGTt!G-~RjS zHo+5TEQ(nt9=KxI`P4-qv3RpXzgn$5)7Gt;z1az{>v&<-b_;klE_Mdz{OPqt- z7E75m`h;{B`qyq-?)~qzqRWzVo!@_d#u23ha^6=isaOqrz51x_{{H;HAe70_q zdKJ`hC#pSL*U#s1$b0jR_vX*P<}ZK#_*S9KZ>_`reR%od;nOd_t`$}KCxr0Nf7;G2 z_+n$S;V0ioDK+16-uG~Lt$25_A$@s@&%!_a_e9%y<}^$=d4#w7WBbhG8hTaJ5=43u zH)Ea%_dKtltT(e?D=#gs-TvcD8dpGI*KfYEvwbZ-?dJn$%w8Ss@pefE zbF#zJ?hXkpF4f9e_lhm)t(Vg8fbz)^y=?p; zb2(S-$ln#Bcj!qRN5T78-gRj{7W1+B zT{4UFqe8V`)s*`)bS=}o=Wn>E9N@nCO`rSxmyscRjt8ktIW%#NvOpF`^c+*s4VKJWENM7B_s82ZYnkhZGc}nK zFXerSlM}Ai`2K0OPlDQh?Pbb^U%s#jKYKCBW+Us2Um=28!4)n7jkDQW%Vs@^5>d2i z7mzVo!l8LcqV397m(P*n{+st0fipb?Se3A=vc#Bf}J-i5#nvtR4pFtv+Y|)~&x- z^!T-;2`^uMJpJcJ`!5TP4;%D3_(Ep!&WiqIC8T;<($07C*5kn&-t0Bpzn)#jScFAf zsq}@*(=$#NlZ1bHP3O5Du&y%i4M$J95WnyRo(~3wPuKWOWYTjBdTk&)WBHrs6E`GD z7yOYbZs}j4${^xyn>p1iDXTB?2}^_5O&izxvzuMHcxSRNPBikpq4BcYEVFak`=*XJ zja|WVicGB2t@r71w`*sMh5oFVyJ-K$@7YiDIAk~Zwiq2eU167*@A2{bk+{|+J!zFc zrFp~^x*pjl9{Hi_lao{6{Xg{)gI(v$lPw+(?RZz{ifv|#H(0+!_+!YO=LwG$CHUe3 zn>O*s8rz5%NM1_b{o~Di=2gWKYS+XU&Q)xfoqgut+)rO!dncD!pXBDapqMX{K6~kW zyEXq`?*I8P;I;j~$MurF({~j-+_$sO@j#V8b}~=uvt3in+Gg#I{jRi^pZodNYi=>K zmHvHv>}h9P`}0@T-7<-dQ?C7f{rc_fe*fp6SMB<0_Gmjl_j%XwQoSWD)2sh)pRad| z{oCKipNnd&a{8(--&mIYC84o(vd6TXDaS8$F0XXha-Oj;?XCO8SgQjpEAo9q*KW|s zmf>MO?D$N@waDbrDWyEOOZEQ`Z~uS%|I7W>bHvwlzdyTmvPFU&o28}U3M&bnm+n&G znfo{mc(&9;?Em}aOO4f^UzgYa|Fk^*OeoV}6ykK`^;qe&>5Rk=J)82!x9)o04v(q|aQ?TK47H-tXDF zv@7v4%A0FA z%;;csT;?H^ny=)LxZ~hi-(sWAE#b~Nh2m|(K8<{LYj^klzBh|^*Sodv%UK;_8p`Ki zxuVUGcJKI)Pi576zwE7!So!0O>^y~c$vUoPtZzIYcHVT}v_ZLE?Mmy-DQpL(Pg-W+ z!2e~dh`I7NgCD&rt0(979-kFCii9UCbBKwHCO%wf zRWl>G$I;JCg-=Lv!S=+4Su1z3-*a<#5SntiQ$bJU&Ro|l-gl`{i;jHmmVeCo;mP*y zQioA(e*4*Pd08e` z+A>Asy@h7^1W(Rlv|DxVm;x^!=giBT34&tlT8kIDB>vcxpL@UU%A7fTp^92AUK77> zjw*I=*!bCUUq@xmmXghOyNo7Z5t7>E;1b#K&}@%R%>*Ua887N~Z(kdDP4gTJn@fPo zTj7}v3w4}W%(veAy*F@zAvg1(tuCAAKfbW+om?NM3Xk6b_tGgZoh+hR{d<>HCHzR^ z{9viEqkLY3ko#GykkuZ#j~J#`hVN`!(k#~Kykw1gnfY7UXE9Fx>5SKd-Yr(w)S0@H zW!_wef4jAvbLQh;Eek)Mmv6@|)ICu6@@{_;80yUD=X zb&vAbWs5~P8--_tzOBn$w^Zz9Z2ouOcEi(&YyHoxeJ#CsW#;z>hM@-&b=w~+9f#|L^OjQuc`Ae5NyVLXLV$WItT~ zc~h9)o8!*5^4E8@l^DHJQ}hgXYKX|-$<6Iq=UmFu&ppAe>CDoihXsa=qJ_&Jn(@@W zc68QpIbQnnN6DXOmowL{Iea$oMBB~F3+q1r-15Jobtgk|PfqhE{qsIEq}nYnY-G7} z>EskmokE$FI;XaL70`AK@Um*YbJOYlcKen9M zKEK~vcYXf%_3`=~vkWG$+_*sG<>6=@k0SQ!{Bsw>dv3IggxDAvn;VsKU2AI(RTX!; z{IJcir}J*k4DRDyk2}&?lo+Q)&71F6zHM7M!`_=w75A&3ITqwEJAC%rL;K3v!DEl#guYRGM&oYgnRzXX?G3<*7{3KmE;`)wC(m(KV{hX3wfEoqCa=vu zFoRFF?)EMH_;>5Cuj?zF$S=>oX4MA%{l68K{`+;=+gv>HZJOSZPi4~8`*ZKw6m%_E zlxpm@nU($0E;~j3@;%x{n>%~utool{S;11vJoz;f%iE`hPrl6P**WvNkjtL~4}6}O zOPn-d-^sfAgyx(0vok7f*Jk_9)e!t@I7^Cq#*XiTuCXgyJGai{U^d$|?NqHr$NSjt z>&?^5q}#VTyx7OPH6rR!;z9|tpc9326;E5T#7!1xJ-?P&cveZeV3Gy5VX>f|_f|nI zBbKvfT~XfWq*@oulQFt(a=C|@Gt;oOMt@VnJ$3&QO(lLtKC#XwtGPi89uj}mOvJ?t zl~RMfB-b0Bv`|o*w>we(P0xl$bJyQ7yt;0|gS*EWY^)g=f^T=eeCgdE+nDm@UFO5d zAH|;^6Ba94ToUKCMDyi=kJiOjv*S;y_f6XSzT{p{`IM9cF1?XVwi`l{)&9&nv+NC1 z&9t*WrxZDevtL)^5Hg$fQCIV#xy_SVKWm?_?PPo4IAie}!O!kfoW}6Z%(pIu_R+pLx zhsDy*C)b>xW5DUVu}V*VtNk{`mZx@~{{LcDnZ3a3yh+c``71YgE{jkqEB4?y@Zd?~ zvnM5I)wjs7YhUdP+`)EI`q{D0M-B(v($aDcc5^S9dAdaAm`TBz<1h1G=9}N#TscGO z*tv2?7Y5^Hh93XaS9yKAAG7qw-o|yxem}drMBjG|V(}BpFuBpryKU>K z?f30u&wt9V|CM_CEMsuY)~mbhZDp@*&HMc#x5X)gr+A0K%2~#_TK_*izaC$|Z^Em~ z#XmpP{Q9&lzFc%#)Ew1Y{_0I4Gw(W@9AGR6oOI;QNzEEvqdOOOt6a3Xn)9k**7k#E zwoaR|?6ySh{X6U)iD6l?&hzJ=y8r*Uy^Njg_v!Py)*WF=<7u@vx$%kVWdU2bhvG^F zE^Cp7j;__sl_jiG`cK>cxyx_=|Ig|5>t}l#E?;2XW9RbW?{@$D^ZVuJzxsaPe!jh3 zpx}mvqmC+%bT&^sU8TS*X{q*ryS!Mn_!8r5JGM2u&+)RIW(x6$P(OCiZ}FOTn~ZJk zuaYMmzJ0+^Pk(y%Gm{rJHVq&1|9^XZd+B5y16#T7UB3fZ7EJu-K4V$*=SS>uYAzar z))Rm4K67X3hLw@o^X=CD|0uuj_qW5vy5GJe{{8S*-BR|f=u}Uh#lde>jhSy>xO+=r z;!c^)5Jx8U_lJ)gl(tU%aColrkBt1CP{Gj4x;k+_moknzqp zxl8r|pZLx!zkS^KeM5uNP0a-99YTe1oGFuv7kp#m?%O-DWx?;-C`TlXTgBk zf!;eSCmU|{a*06210q&u))-4)XKi?w`(@eT87(a{Eb|;gBz1V&Jw>XHxE@+Oi#s|z z$;f2(;frfH&m2fN!K}csNPd&ef=nLq?KizwE?@q&AmVCFsP9&e*;Xx0wqnQKRxvpF zT-&|skc~i!DZ7q>hmgmX;Qk%nmPx$+n(Q|wTMO54MshJKf76-K=Xj`<%XqWD`=lTC ziKoO^)#TnPHM-n6>DxN@byC;q)c-%PZ~y<({{PSYe}1lZJ~V4W(q`vAM(#kN6`e85 zw;khgnYQFl!waF;pLzTXxVTlCEPExYgnJWt)~Q~6IVXYbhWEx`sm1)~jyD-5M)C=$ zzFrmiKFxdf3_klaC+;S06xRBFI8dtWR8%*^s%I_t9vp7F9Z>3?s5!ND!k( zEj4ynWi$76(9=IP3Jeb}9)G&e`18vxec9$*47OWN8nyMU=;GP?`ktlK6&)7AYcYCC zh3>w&C9mz8{wzG)Q4rC2GGgP7Eh73M5$PYEpI^R7kL}mf*MH08*}QVwc1yoHbpH8P zqqW|ehgRL2b^Q_F<4McrU8|bL=aaVN+2U;ZYt`la>UC2NEj4QNo*3oIE4oL=n``a$ z!xFIs1Jb!=gw;f-1fIwMy&)S=*<(lnN&wJah-*n&eq@TB4EUmTao ztM%dYdbJ~s`{f+nZLRAorda>W;F8m|H@x!VBBwyQt+2UDmF7$au1&>`n>t#rEuHZ5 za;0rpRO`I+PY+*SzVyO+{pu;PTTks0D+=PtUw8OGL2;MB(%My$E*NP%;Fs)J( zI##G#I(6Ub$ecCPF3p`$y`i76d`-8^t3x{GZ=COT{^~H*Pu{VDZ);ut?`^r>E01gy zGe~}a@{@k+_p^H6&)(U}Z@RYi`qFuR+#6>Etz^3KBJD`b-UB5W6;F3o=Px#WyJ~H@ z>^f(~l(xOQnR0LBUS6kRy2s}z&u=?EZ{6&@`G5CmdpNC?Khu4>_J&xy=2K?F-VQ=CJ&Gp`gc7u5~$%^+m0~3cW|~Vr^|~PHVL; zEtOt%qBe`AxzH%3VW(?Ckj9z654Vc93ftbgx}u&-I3qS|iWgfyXZ^$weUH?nYjTR=`L*$Uk2a~l+l>(kK zUrfI%cl<;=HX@n}9hJZZ~8_NrOGd6j->PLeWh+-V{8%FiUTlT+^bYj3^V&52U0 z^3QZA^zU??Q|NxEaYKRUi59uOmm=T08wJ+e$t*~?Hd(-Z%7TQtKQ=EpbTUM;TWQzs1}sQh7SvRjy6WNl)Kz(H2O4Zy%JZH*sk#4q`ucqT?QzgyeiNtM zAK#vwR236AW4g+?^sAwIsGCEo*(0rDX|>4$%9Zo|p8PJ`d@uW8Vyxf%Rad@#{=WS1 z$CAq3e?Qy*yHG*~>5G{~ccb`OxyqzkYt7|0HvvQK)mshuemJ zH}Y*Bl^ywT=IldF6N9$zdAXl&Fq~u2T;#P$B}XiM);&X|9nEKag%72xZTnSYk@zND z^4W2IZ$ZnNUk1DCem*U`StBiRS0t-#;ksx1mgx)Zd5Y@xbM|R|;xk)s$()uihQ|p2cd7&e4*VNmj<^C9Fam zHGG;r9S~!XkDck!wa8o`fR$y(t|+giK6`Wj{!04J-F@Qow)w`E*(YQ6`uzxOia>f5^a4iS5*!gVK|S2-7@ zFwKQ?w}ItnmAF}}XB#NIah{&c`19{Imxz`#Tf+EcET=79mn~bBaoeozScUGVeKWZ) zzc|br)V1Yd!%D&6Sh1C+J0j$Mo^wf~O-J-e-E{N9lJerl%ewNg#zId-`|yeb)#L#@or7P1ns+uM>$`Vv->CN2iMg&{O zwYN7-5%P9zy~_S*5A&)_FHQ&3wHb3ZycbAY7u1@qyH(7%{QdFIo91~Xs@dDT`q8{= zUhfQ_%#prJ zGuaZKDflqpvWS~{yGm7%VVjmwWAu-g*40 z5@)VFXg&IHBIlzlLI028JOwh(cI3~E`y253H&=4?5)C1Yp&w%euA{N1bG)%HA0xPErU1cMR_=ku?NVoqgF zeZ29&;nL1;(Xa1X)FifE@x8r4;(*1}Lw-A>q<9kJrY&;V{pPmawrlyb4s;{a;&&|{KG@3kga?B_kMkQ z@7vu&%O-Fn^GIJ|+jsBFw(J)EXS?S0xk%LRiTi%>c)`xUC9l(h#3y7#FgCR<+jBm> z*+P2lgXIM>K1F9Pil3eTKx0kDq_9aj_Ag_Fi)LO3TC?JyHP@78R;P*|9)b;RtN6N0 z9#5Ng@ZE!*Ul(w63ryrLj6J={| zMMX3*J#+b9JE4Ex>63@{u~e9(%W>;z{<`+3FEYQfVp7GV*p8Xmf_x>%1@G)#$i}Sk zd~2RwPpV*=;kCpop`0zJJoUBn4s%3?So(iA^h$sFpd@6XQc~Ytw<}lMRy>|4yd-0z zP0U8i#a|mm_J+d-)8mK2QkVX?o)g|b|cWcZB?71hc%JYT=~&3=LTEuWavKmYu}G|_6Y;L?+pya)8}3w~Pi zATWDh^5w~^B>xxutDMhn8~K?dA!kzbbKjEfH`pb0x(vF$w-^R1&+mzK-{7gP^sMvU zj)}`Z%0K(_sPM}2BN8qtg;u)p!52z&wA)=?%lVwm3C*nIW@4zk?>8sjpf|E9V$m_5 zd6(b5u(h0eo-a*IP0?QF$>qx{dH*22%z5x|iK5Mx*~;Ih)YtBn&Hnl2VTIk**Vk^PHuSo--8%i+m&@4uhn;YTh2--y zZxl-9UtRh-JKt~Buh06^V|!a>y1(4DeWOlk$c`=7K{M*XXBdi(5EE%Yo zxLI^ryVdoJK@%*u<i?W|7qY|0#ao?{5_muRpF# z+TZqeLF>=(_l>-&f3~d9Keyrt3tyLU@ByJ)or|w>mKUv&_y7O)|Bw0me!o7y|KFEy zPhWq1`}W?t@A>;{e?4r^pKmY2=l}ZhcKMxQk0xZhhi&7y|NT_7Gd4eH#TBka3vV4aFb-xuEaJTTxR9BkSeMV= zhCQV#zRlA*7POH0j6$36%-dhfe*X;5kB-cEZ?!KjW##(yzi<0~7i(C-UL{;o=hvHX zB&DxFCRIqrQFCS}w^68@>;E0w47Liap1ktBngk#3q7^$Qa@t3vo%r;2``k?-jh7{^ ziKaQZu_l0SQbibz`m%LIX`0(P62|K`ebB^55Z__i$9`Zb4D z+NW)DIc1Bs9N<2?_PRss3D+IRuGuRI3NkP9oqob&~rA7r?+aQgPs`^;y_%qf_+V8eNS({o1}n0~6N zEn2W{qJg-k&zAhX@7_6B0 zZ$&tRnBJ3B0Y19c#*&+xE(D1A|7h1KT6fA-y+aD$oc*@p1POU2TdF7NAqd+(aEN5$)^{Id7oe;j#r z?o6^q;PE+&s=jlaS|`9ad#2?dGxJj8>oM|c((*2MwJ-?3x_d0>n(MLay*KlhA8zMg z{dZzr0k_=E`oihP z&(o#BX`I*R*~BOYJ(8(*zdd)Z>b|s$-s@7;xm&;1?cQGdqE$%cxc!J~%?_AnYS!J*(^U6d&Iqhu% zlRG7xW;wRBEajS+sc5&(wdJ^7&s>LfQu7bU7=Ba@HkDsBai-7IR@VowmU3_`GxJ%h z(zw4@Ch6$^k~5X3&g}P)P%sop@wQ`p;ZqTL)M!pelzI94$eRacmkOO}XZslMGnaF# z*T<&4%o^T`?R}0;%voYV5V<`j~M`o2lT@kx7pZpPI8I z$Z5v2ITJXFr~R6<$n}%UPG%*~7uOzs(Kw)X%EKki?Ch$mbL5v;2bcRvT&`7me9_3z z@KC}e4#hyTC7lr$xHfq`oMGxF?zC=}7;`aq%$tzX^Y$6f?oLkU?OZGCk*e1kb?xqn z8-hMlGNbIoLKyTE;89+M9bHbrbQt9|ux=3U?7 zS@N-y&N_U{W1P8Y;{rvs_lnu4J)P#2cw9fR)+T&b%Kho`7mXjv{PEnepkQ!6i@TcM+Xn^{?=hq zKWTEjYu&l-`YO9R3)%g9;_B*let)N!Tc*a_wJa&oZ1LLfdwVYz#%f32KJWj!Dk45E z|Ms=HHxs136c%ajdHeVJ^xK!)AGh~E-=1Ax{Z?_^segCYN*ElP{wq*l@y`O~9dB--hfPyZ2ZBdN+A%_x<*5Zrxd@ zn-}}uzII}z4v&J!8i9EkSq494jum{qS7TzKkaBx2tNou3XXF2W_$#n8?)}>$>oChX ztHT%W`n1r=Syncfr7e5Sc@?dRX?JXwtzW0yYX8j4YWA%Rvt94bnocuf-P<~o+v{xV zn>klmg%UX?Z}QwaSAu8d4k_7bU-vX+g)uAK{q}cTwtV|xMy2Ezx#91piDaHTW3jsb z=YN?Q*V@Gj=V?eNKL5=4``gQy{r}(1oZl7cq^j^_SB@;BRFw4g>%U*0zP;`3(i1;x z;-*=ZETVQ)2{XA?=GmgS64pC@8^)1%9wh-?|zq9$CaKFZxb20yMA_7&QP8>JIa8k(}LGl z&|f8>>A~T10qmzrCPk?lOP{kj`M^$a*N=V?%}GBduUf6PKUSqZDsmw+XGztKZ_X{+ z+#bIILb)$Dt(kpzuK5Wi;cT_EPQ}U3rR*w}9c&QlzOZRZkcysG;3m667gRWMKU|q; z)I760VB&GNEOCQ)nj6=K zyG|2$+vKksZMm1X(RRkkKZV;WKRru|P6xH)H|V`qI%IRKBh$A*@!h_=)(7wEh|RsW zYGKKV=W?!rKddB$4`~E2xtRxZ`KTGGY`)SIWz#MyxvPWq&_tCxcdMS{)?GOssJ7*I z+0K|83s0`TD>ez{J67|F%{x=`&1LtZ=ZcBzLS=4z(`yisjCI#s>JiJD5PUn@-Opz3 ziHo8QQ-ZWM7R0VTyq4E^`G!?OYI--1MxMKMfJsrShqpjA@%sgDi8C{8l%(0G`&c9% z+;WoPAm_#zIYvpF50#m>8x*#3_(X2Yum8S#|E}rvf3}}J{vfI(L+0gz=oH_SV~1P} zO6Okljm!_cWayxA#0ps9&fap-4Dw1*Voo>S6eC|E?}L!<=r{2edc%DFP+X^+j?|*X{D9?|8M!Hsv_$C z{9L{A@4Mao^vSn>}}1BSf#iuDk7aWe1Pc;ad{b!P6c!@IKyh zWOL+0f!4VV>2t+4-uUdSs4=HPLgV6;0M&^a|7|>F*$;P#Z#1@GsEC;)9?2YVw$UGNUlA4aQoVP-^1J%o6;2u3%_4& zGMXAtA9Hm}(eW*-`WM+OFTXtLlWaEk-qY)5{zv0d!smA| zYlLo9NSo=erxnrH{!QcEBF0pJ4H-o{oO&dPc-d>*U zPG=rrdhg$0@{DKq-B(?)X*pTD+?lZ12g z2ZoD}ec25glW)D99Gk=toafZJdiwOg7e6sQ*ePYvcVNqM&i7X|wr14rS=o8oe3JdN zzl)d)9?!V##qBL*Q^U& z^`Ii++Tlyz<$iY-|1vt<#C`w!zsLId_jgq5?D8>JStMXAYGt?n``*~?e2YC)*11h7 zG7bIvsmwYgN%6L>Mq1jkg4?+QrynSl#E6@v7o1>vgtE=oG0!Y*!XfX ze%V|9|L@EHU+Vwb|9SWRe{%M%-kdiry&l=6P1Bbai0WUszASq4#lsdI9x-d*-`aM} zCGBYdvua4VYD=uO zN*+7BE``NT{;;{y4y~ONC2M{J%($6hc4bSuqJz%mCqm~`ABG;Ex7kR2#>%ulBXtAO zqBO4WCm$^5UM!~Yt&L+r%7Gw<@=Z!mEiuV{>Qx%F&swt4VjkLH~|*DvNhvlBb6%szYf(%Uza1;qBWKG5C$ zbXw){CAXrC7%OL7e0M}9A*kUR!<945Vq%>dhs%%g&pRSpS0VYNLixnGNU4BnO&Xi4 z7}fsH?I_90eti1l;YZ5sd}pRS^_wA-@?uFv1LyvtQ!1W^)J@CJrpYBMr3v)~Zc{SU zlTYq=vh2zV)>Q`6oD8EAwUbe*%oJI5_Sps{<$iGa7O?2M1} z?A@4_b?N5jJ12tXJ`0%9a7ag{>~`|0^O|aAk;|UDp05vfT_v!wcwy8G8J6x+miA3^ z`bukW*8TaqE!WIue$6?d&3Xnta)lvB&jiijRu_+*(b|0eC68%$s5`?3ouW%dv%V#I zof9(qCAP-eZ=0MMIXN~&{{aft*zOkq9(j=OV%nEoi_%ihXO)F885VNyY@gp@Rlq~r;y8zu*hpc zeB3j3ioJJ^W@mH_I3h28vP7!Z?Wjnah115}OP7CB6rTCigdsUW^UNBsj5QW-J?|0ZV()~IFA{~W+1d}Xsx59gHG!W(}Hh`G(^6nbIKw`b)Jj|y|Cg;P2O zln%2#IH|h(o811_VP`g_g(him*=7=@o|z6sj*&gIH&hTw4Hw}LlxETbOR(HSK14)E?#6?&Kg{QM-Hl?YzTIhb8(ipKVirvj6)%_5-J@R_uNK zdf#@tqB`f42eq#^c1PYlxQ|~;>9vyg#MaD}r$2xGIGbPHeE+?7S-Zq6=ZYm|t=+!u z{a(w;Gks1MP8ldonYCF*piq$0L)4__u3_6ODbBBExAt8xwU?cy^(Iee(>nH~vS+8) zM!qlAJ^b=(>hDiww{ICNKODrr+^HbVYF_{O^X^Jt)}{S;>AzoR>i-XSH_!a{sfatd z?tI;xnlFd8tjlS;W*XHf@snfY&ENlIk4V^Y^~H#=B$=5C95QV<!TfaI^ioSi6ae;`P?5pFSKR#|> zY!ED{X~PzBaaZZrb=%C}u8O^TFo=tDwxU~kV(8`Fraa2Gs(*hftKWHtm*qoU{`YHF zbMhabKAro;?#k7d1sc)jg2~Tvv$xwF2wC+bAjw|ub!Kee)-~P}wbu4(dxT!!Y7l%s zw6XT}^xI`S-@S{<+WB^IuAPYfdTH*mV&=EcWUShG{5wjGKKdV;JDG`Ru1(r}-*3!* zM}MC%acs$uQ?E9!TC>umqwBz;$hn+$i*ofG961^nzU&gXGeacHlIwS&?$pj1-|o6y z{>Tu^QE)wRqsh<5pEq{J=zY)4XL%GfkMH&J<<6z*3xgM0%siHGwc?YV+u9VrymO&Z z(h>=b(uZ>+z3%T`$z^Q3dRK74(;^wC_a7xbM=!k}vqi4(-ezx89oFTCxxVi$Z=XAD ztB6$WY}IaEm5>ur=g!t@D($r5s(m4MdjDbh{ZoP?#oKlt?Q2Th_BBM-{?vRG^R!Eh zY3cH%PF_!x#Zzw1Ju+WL%604XC$Zl%KZ<>v$0Izu#9~+KQJa_f6E|``Ni;d*cH~$~ zkjjSJK@}x$S3Th`ik$WJ_(h&OPh|tE=3hE|GPblt-NB_}C6|7;OxQZ7tQ+4xZsTp; zk-VMJ%}nv1M#CpozeSHiF3nP-)%Ue^#^lW#qvykVrusbJ{xKGVvdUWoh*6o()O$x`D z#ZIpO^lRZ^t*PioYLK?FVnufXxho8A?qqvcKN7Nl3 zr#03q*JnlAA4{6K;H+Tqt1X+W<{z5LslM!*(!wWClCq2fcof*HWlWFfpIdw0VEXaP zi7Q=-)Gi%)B=>hqutR2GL4;0;F?YWNpYuEM$RTiUgV~qo@p|j0>$*)gbUF1qPs9D+ zyWh)im)`#WckT12tV=2rb_uuL*54m9uP>frvQ~M`p*X`WP zzPH!?-s_laIYnt-?C*W0(prbk@DyJ@Sj*mCoOmEYxF_jh&>1a9&s8#F>w?a#5NqGP zvRqYy(TuHe;->8S^O8GLu3QpqJ8`y#XGb!RwD0$K%goq(I1>a{ayzVI-f*Mr$vXqp z#2vQ^5_YWOzr43HJ2mpjPnK2uB5YFStO*AVR$SC7_Roq@%p1<2wIK{bDb5?ova<*d!4YzaLw2{f5{_SgS_T4KB zoo$sv&Z+ynomjD1pZmiN&1E_>7jEJx`Yv;pb)lZdQ_VFhWkG$rbAEJIjSmKIMEoPv9h@!S;tyN$kP>Z)W$iKUr$9lx00X@6Nouo?fM8 z28E0rZ8Ifa#^f3s@^b5+D~Xw=)cpP0**Plh-IKNCUZ43K!LBUlq3rLprjR2=T|lBp zX$R+L8S~Uu2b1YrjJgA+8vJw<6cpPrk@@Iq=TkEy>i)beyUU)=;Cp6*qXOsakL{cD ze3mSdxz~fmvMZabN=Iuix7AI;X32+heIayiky?X`x28` z_LqK%dFt%6M{m=*8jAwmWv^01oX*))&09a!BAla=<5=qbZR_o8Gk>3p*?go=>yzQz zbTwm*4h5dRR(bwKahY{Vx(b9=Pv$XJ~lZ z$wHSM5<8oo7`B}0aJ4*Ezo9g9*&L3PG&z%m@}2<6S?=vp4)uE`O0e@*IDFgt+AgQ) zuFhNL2)TrE18&=U6*b1oBvu9AD&IWCrbnbyE1=WA{prg+0vGq)yj}WTz+x#+mvWhF zo5#O~}`|SyZ8Zm8I}%&tgp$>6^Dxt7~toC`QTO{bqPa-^VAf zRJZR_*<1bm-21zy6x|jT7f;fgpl_ZQcg;28-S)EAk82+E-=FjUTmHUi{`J3>$H(8> zB|TA+bNZqA^QQaD_ow}M`ugo#E2mX6=7vpTY?^GqY-yRQp{BIx)RRn3uN3cxmkWRX zIXg3?Gb1uZccIO@iG}@(%V+pq8*dJ{J}u}>&z=7EUoQ_oe3{vMb$O7M zxRmqvb%zuEY7^e4JquCM^lj8;tvc$m?#MmSx7YM$*VW!$_kG_wZo}B`|Eg~CrdYMD zob8#Il(lTq7Q^Pz-!`EhYb-VAID^Gj2ZuY*vPq%VN&RBh*cyk=Xxr;a4Hoofr?<&c?S#HC91)&c= z<2B5zEB>**f9DunH#J!!Ax(AOevN+)HMQllIwDPX(q-Q(B&^8hqzWTb<2S|Ko?-mF2aYJ=ldmXWUKDmgi^x`SSGF zduKS#9my^f5Hmb}A@M;}_sYoyd}U|P>OR|RIN^xR`OTY`9bcfyGhKOG^tr6PMzuDw zcC|JKU+&xf`re%benF9Qw(MRe{y!#;lR@IyyHm$9t7H-jEd*CgGVo@c{AJzt+WS%B z%a%@CC*^1OGe~FJw5Ul_HYIgv-c43kO%16&AoISo{NIB1Z2P^{a?vu9pYKSYb17zZ zS+ZZ@?arSD!WR-(K3~3-Yj>2O)x2q6H+)I7|65dDdG}1~=M0qt=07t}K0Ty7!{tD` zTzHk8+>DIuSAF?*bM5Otm&B#&KCOtm|L$A;@B06z{o~EGyu*1VG-o}Tv&Jy`UG>sG z=RUvQ=gjw|LWFVYlE+dVCwgW$zn1#ER_D>?sA-mvfZo+*>qb@8E#0dH|$g@{#uIG;i53!NX? zH{}=t9~B9$aZnMS;%;})^MCgvh1WM06ciLa5D}Xf#pmBM@y^|&4_izgmS4Z)G=cr| zMF%^E^%8gO_a)2iW!JOl4-VLKCbna9#3P=XLXYRy=N#F)!bRi#Vdht!g1IW2WNeNt z_nf17b*%D@9$TxIx*2UjH}}Dj%Vq!uQzr)Gjp47Bl<`r zxZO=#cf~XL2bE=ph6i^jaB!B*x$~!wjfuO|_*L1Or5yRu>K2>1y`_&C`lT)^Xgs~0 z+eQ1}oi;<|3?;$McbVoab)CWg^=CxfJLXre6_(R#Upx0|aZl#Gd~kWN!da9BR*I zUKA{9>>j)E?zii=>+*ls#@v@`4sZQ%BX6;J>+eL-&@H(kw^kV>F^5Y|U=2~KT|A|z zPH#EC0+V<{(NUoX>pn2U)~rbdgI9Ds^aYy@-7V%@|(GK7H99c z`*q*zwf(p4+IEWcWoW!V)Apf#`OHUYYDeCwY{u{Qdvc?=>+^ z+B3elaxODyT^)V>VpaZP^S8H3YBt{c`sL5VO4~Jzzt?7mhRaGx*{uw^=GtZ&%IvyS zGPd70rDlcb$G4mQ|Czo%e*c|scRL(2TQkmMh(j`4bVWH=?-aT>~?(2ws;86D5%p4fC zch@qhw$Ja)>epL$-toEr`XZ0Us%aA>p3YFIIs8yh#LQv==f+)!IaP%i45f97LN!ue zPGnzn*!`S_+OqEv`p+0o6;^E!H1dXAK z9tho&c4=+qd45EM`_dW1@PeJIj@Q{R z6_u@9Dzk#e4*_pt}0CVz5j~Gqm2v&M*K6^&Murf(`e;avnuzB?k6V3$64ncX?365 zb?6a`CeL@HxvP`Bqy+c{cTc|ZVVP11&+Cn|8#34JWN!)HnvlgZfjjGA^UJqsYrP{C zL=XCR*R=9{W^`&VGfBB>cO|#t{jytb*Vl>J%Eg{ew6w9memOFWv73LZzzcT`FP5&c?WpYZhZgy`t;kXySv)ljM+~+2=My`D<6AzZTH?t zWg%|1=F2DEPG)>+A*#3az`;k}Q!g*9u~>h<#%ivXc#`ZX)*~S^&lnyvFy3yUm#X-@ zM5tlr^`&zBQx|(HDk=3&z3{t3+M=ydQ)Z>ez1`p5J-fF%zxw{Rdu_9J@(MJ6zWe!u zOwWrKIcHqdjx4y#V^{G0jfKwE5W&a0dhcD?Z6}+p>yx-vL#5^O!gZp4CiD1i*IhMy zn8-CjtnZAAq=}5oh0HH9b3WV++EHK`l4Rbf-|dmupV>2EW&FCgZ+FGN`@J_a-|bMc zM8m0=){M1>V`mF4)2TF?amOd3>D!adI}OVfPsO_UO;+m-*=Eu7QTD4`QNm$HRpE&h zH_lC*nIBz$^lgdVm8Cl-u6lW48^5~O%U2S9r)1V>uVF9TyzT4b&sy0#^B;e`rMG>V z+v1fQ!oTejVd6Cwml3yI|MlgLb**=0TF>5TA4@FWM zGX#@mgG1a`u`z9A5t|U|v~4@%tv$>Cu9(-M_EK-pT7$-(Hy;JklbmcW?>;L3z~REO z1-Cfs1T5!xKdid%etkvO8j)WWcJs0iZuq-z|GvB1uH8||TFLIg!gOYvS>4aCm(G{! zetP+H16TdOFD0vL1RSi})!SSmUp!~#*7d2&{r0t#yZ!ey-4on~=QC?X^e$fdmMF9P z(;|ycmhZZ6zLWXyD$)JW^~vH7}1Fhpp=0xTwE9Y%q@>u zgzg;jJ}>w!)$#K~pBq1( zie(yi&z^Dao$@yFkXK^~o35^+a*?^8)5m5HqlX*+#3;s}%$lHaEk39qqP2K(g2A>R zVYk3(hY!n%8JvE&`h357q;mUz{}-1o`OJQn?#h!S|Dv>FPNd(n8mD}pMn0!UnpO`t zvReH6x6@qA_=dlQ+C7WI3^%TLsVw-lIO~nBYi;ng+OV_S`Rr7A=(F5Pt z-oN+G-~H#m+0NH*f4$~4H7N7Vy{dGf9fH4Co?_ayn(y4ppdX8#Z{E1Yth_kcjM;cs z)Qj&$hnem)F7$I*baDOhqS-HYb@p6yoj2c)rC8$y2g9{F9a*iyzufNqzPE1u_v!l6 zYvtE!?|kUnd8Yl?5nEZ`m8*BI@}7FhS~jF_;|+szQH>lc7~V{9m@_f#JnNQ#SOs(S zPy2TA`I)HR(bLfly0bt^WA*C>=H!ZeIjPl`JEuE0*(E#Nh^Sa3w<~wuv%F<(ZYnNs z5+Z_&GG5od&a1mq_NYlof-fllZd+BkCX--P&7QZ(H*Tl?|F!k+%lq;1>)viFSFM=A z7&U2naN7@wg?o?BaKG~<6&<;(Ny|94J*CFlF$aDc*`_ab|5zQ|j=L0+s) ztNXgw@xu>G>`p~(E%lnah#@3P(}{0c(0TdSo7P$Fsyt*C({bp}!Al z{O_yZoLO#y?GH^_k;N zpZ0Ygl1rUyovih=c*ey4HpUOObn&Xsl<`Sbwn|pCHJHM3R8BPOiOy*g_a}0%IW%I| zI}gaiT~YG(phvGRd)B#@l2fc%sTQ+dKF(*m^vguZGI+%f6(89d5lsc|F)iMS>@m(Q zqW^7`M0jM!RpGfNMd3lE#&6deKaOzqZehAz&G+MMOy`y7FVyYS z&nSK<@bNcN_P%h%X@yklR^gwUJl?Nb<}_#aY1V`CQ(_`t=V}Ocacs8OaYboq-@T** ziX$VZ9w92+}C zBz@m+U%k@vflOig((zfQYn-rfG~)3)5-9!@ScEZ-!SraMbA3Lj}%c1%Q_#q-%zhT6R%b~;~o=&3N2 z#6CIv@*%CbeH&Io0W!;39Qp^@UQ~&c9RW;1FzI9Cn7|Y6*||=XFxH z-O_DQ@2l=d=QF;(bnolFufMMyHz+S^UKY>x)M1|B=?jI*#bU*V?c=7WE4Q(DtuRiH4TfC}jzqEK(b#cLMcVp>^cbM-i z%UQ1RDrR#~R&2|P70JQXd$*c(oXDOSw1Gpmf9lNW%h!H?448M$JGJkz?JldI0r|-i zf%4aOSxw%x|L(1T=<8lQf|A?AR8s2G`Zny``~LCi*MH5n@F%}YV|F>SD2w5$)?)s* zwYEC#mp7Te-MilVZ%N$#-y7`aUXNN~6#nVnu@{dwgoU+LYQ8xXy?y%jzfZrG?cTn& z_e9C>Ytjp&-&|1mlXg!d(bf89?8Rg5+c~RR#Lk>dQZjsJ7ykaIPKNqR#tAp3{?w?J z)6@~I{=m-Wz<;X2aKnW9?=L^R{JG=(-MjPW^DV#3b>jT~xPAM+*1q3*>htA?yWiX8 zT>pD|`s?}sJ{8@KzHH&JnW6jDEg6UK{W0anw&MT(oPBxu^TU?`E+I3H%c&pN*>e2M zwPOo|{{AW1QJz+J``FWaof-MHVQ<%D8P4L>3+BrdTxI1y=UL;yK(q9Ieo@P*9W8St zmmhw(+uy(a)LK*7TNz)>?qr5P&b%eGW?rSQ+8^-_{^AmG?^MAuwQ}jh>%MOj_7p4) zFD=hIeAg{!>G>1C@0DKY5%2V4d2niD!0)-=ns2Ht=kI^+(8sVtOIS3qxQEl9!+T{= zH_z33)j9gkKE8J%D`Ka8-e@=f`ckj^-^8kSi~hcS?Y9Ekbk~Z!)Ndgo&mwNzmrpyv z#}Rd6)raSgf1O=;>V_4=jnaJk{qJ6_Dv)op-@kJ9M1l6IY^y}Jxs#d0s^^4P`RsrD z(N8c~P)#XOMyvMo!vO8A%W~zp_%{B(;BIQ_T=z#@g+(-p)412?!Mhlhb+-x@%N#rY z(=*3UcQ)&p_ec8^-Ce}3y*=d>QUq$2qFdO#1?X8T3Qa}@&&3_2{&KYp^+HLqjU+)wI{ zeF9J1T`aVqrM}L2ZAq78iriw(8A;Pz__OuXyw+=1ExDj`TIiq)({)K{+hvmjr>PWK zw@W+ZIsA*ie&wWiagm5(L#upzpHK2d6`SyIcebAWO81JG=2{AP9LfGS!8)Tz)FRS{ zvH6gL%dZEP$FIFO()9WI@x5Ks6xmXO=TCc~cAoQA&6O*hqhQwTyUy>|{jeRyCJv6441$&mUoKGky&-F#%=KL9>9_A)br48oiww6| zF-=G7uJ^;GT*B|qev1efmlmJ7Jum-`0Ce|0T(%z^zAaR&e?qQhG+Eltv{;-inM|@ z$Q?MyroqtOcP@5$gZ1jG9!(#dN)8>G(DnD(;=}h-PY7_9>TaqwDk?U;q3~@}SRDTf z?rF-8{wWohxct8Ua;Ma^pzk{MA&kxC8Qb^me!0u*Z;e^|lp+h+>&t~*7}6E>g!)Tkr#-Gz ze6&e!N0^}I(k;2KPtKlL@OgvbqjTS{ZF{}$?iJ6ob3J6IXIJk%!y4l9YDw0d3%jDj znOs`fr#QwsA9eEiem73?Rh7zmIA}O`H04Kev7z$`E)93V8Ams<&pY`p zZ?AJ`JD=CF$&8wddkaoXnY<)nJx6e=*uy9fiKz}#&s1`>1--p@^I6;W$W`sN(L$cd z`vkYKY!+v^bI{30Pb6-ho{(FYfZN1^*_)P3nk_t8M9=ZE!K`&$_l%N_N{hKCig+ug zH?5lWb=~6R75BF1Jqvvj5W)35?fY*&r^r|LzEs^_+}$TFuB;sT^i220|ID6MNt%-&r@VPyyk7QW6wK>8*dGbrziDYdsFwmI=Dq`N>jhE^w~S6 z-8Jp$52aK6{B>?7A2WO#bw#8=X=2pk&n2cd*Q}TR&Y!e5bnlMh#BkP$rFY-`etkOi z%Z*vm)75j2-ncB`(c-#dO2mv;e#@RYZMh;8ZQY@8sBpK2jQf=np*v0l{nCq;KXN1? zQAqK7OSh9>_TJ)^d`$-4SMQbPryPj-ID=P8qu|c*xyem#E*z5PN!fDTZr2Un&P>?a zAH6##fBOzE7EhIfb6fk)FMsU*?5hLQ`>u;;*K9A`{dRr+^~NiYcI63?k6pZ%jQfeIo0q#*kQh@ z&Bryn8a_yyE1Gt97Kp@4eZIPrM`88j`!_B;*&uOb-lm%lS$7n24wcne)qVf@^YV88 z>(g&fpT52J{`uvHH-#9-+<&L=`^VXjKY!NPt$m$YTfK8{+^@%ul{OfG~_GDe|WWgz3hn8-?c&uQv!%NP%mJ<~RrfGR=uDa&N|6Nix%k5ms zvbB}(tZ9>xRU=UGIFO<=3(+YL{(VTE4@|BC9X*yL*Ew(;Qhhr;XQ>Vqey1 z+^@5#|Ni!KR4UK)dtC;{)3R0;#N_`y{rYRs{qn5~-}yKPuMJK*llrc2;j(37Y@dDJ zrHOrTzwlr|){NVYwTliLJxrdps$lDsX9Z#}6#Sb~cRb!Xn{TVDn{=?O%foKNGvCc- zwOwy-6j&d+uysc3G}m+OPq$3_oGE+udv^WKobA=&ri@EIUCvYuPSkQzQ3>f=x<)lB zN@~?wZI5ktcip}`JnQ6KHLu1eWfs1!l_4sHk(&Y*vJ2~^*k80g z`rx`rl=1wkIgz##)PJR$R0cC79DB0d`RBjOFE6(%bI%S`%&XmT;o%0E*;kvMFaP>- z$E2INx7WpP_j_h~E&F)F)QBI3^(;xhZnVEWaPQdLU5EE_g-tX_l|9_Hb7p79l|xQu z1$KI`OmcSLWlK2ohDG*SmXb{O4o{W7zi)D%KXKUnztVL3FOD6`g zY+C2~YF$><^<^S56Mk@iku~^OezQZ_($ubvQSb1gUpR6IgsFD9Lh6dSiO-MHnLZ_yh{{mo5Jij<*csD?q5F)XBpgXX*i+oYgDq_ z>goJsF#lDym?AST z#PEgn_Pj+aIb)yQovp<6s3-K@iATJ0r&*e3Kg+bxFTQZpu=A9#$<3t3g_G@Wte;_S z75Kb-o@AQpkA&4rnDV(8g=TkHX{$2@76u#XG%sOa^83-@k8RIYOBv3+mpNGz_pvj5 zM?XuF$m@7b&B-c`8Rh0pOUq?Ar1D(n%rEwuIay%Vd*#d%l`gSw%icTZ-u_klUPWcW z1Ko~}YLg`*zAr9U+RhJO@aNChUHk7$Dt^JycjI*F|I_QI^Dk$$_i}d_!drBL2mtIIdr_)qXoAyyO zV}($FXHU)j_XV+8v3y%~j$XN)%RFm0leEJEN2@pc4oBbr{(AcD>+yN(^M7AkcxqMQ zK~|ub5$n0XtP*G<^ws^T0dJ7T`u$81NXJWi=aJN+8B4exM)t_0v z(^e%~J*jaap&+jHZ>WPj7>wOe(#Ij*@2IJIujj=DZC%dohhqjZ99%C2ss zR*{pkc{``J?3%<8GquAjQGNg0$NOGN{8SZmoY%PKZ-!Mung+wfm4_z&;ORINELBk6 zd9G;Df02LwS;AfQF)>U|J(4_6Pl!aOq-}lt?!pIWhk|EU4c$|pEy&C(+fBS9oZbop+lK9FKQO)zs+bbL$PIJ1NEXq7CY!&Ul z=G>jOm9GMLcL*{Z=PF?gd=M?tm%y?rbX7rO-`^5f3#pK_l*IT9mrU!bJvN-n4cR-c z2=1BnQfTsu43YPN7m6buKVSds2uo&LJ^LLFjnTr_R;Dc1U;aiw8} z(aAfll1>5UrsiAaY(p-sU2Y?hGV_0~#(Goc(@R#mXq@@L)KJsY=caSUXYcLn(_i0n z3tfE|+xNhNpp;0jwXUTse5YFug>bKL-?eV4^VY1!A1zZAXC`lXCigo!G3%9I zs6dPsU!++xM^=Vxy8%PWv{%cLc^(Sn7k@~9w#P!=SZPD+&RW5hM#mf$oXt^5O5V}# zclE5rKBLVcX_pNYq;Ky%tl!?hAS&_Ivg8-neGw(%=M2HU26a6a^H%l`LVvbjNnU>AzU{Xk4DZ&h ziaaQM$LC<+W#z2QVz#;S`~P3P|L5J~%P$|7KmYgf&)KhkKD|EuvE;{>mz^H_{{6Dr zQvdnmPyYI^wVIpcrfuuLzWw(8f4BSX|Ni>=X_v5XRPdx5n;UC-EM9J`JzAXa@uKj% z!WlPKSwp+$(_|D6@2^YWAMTXMNn>LS zeB<8c(J`5EnW56@Lzh1@Zv48D<+8}Xf(5+Sq|Yl>Y|1$N=)y_Pi)sHbk}SvED( z>yhm}qs=1AN+;f1n|s*zay)083yWXO1B?0BE*IL)@87%i;g+vucaKk>UM;=zS#xKO z#Np$1YXN<&50c`+{b?? z^a{)SR}{%D3aFG>kmBxfYW~d2%gyUe#O)7uD(hcR>16pM)|za#Bk?Ma(u=~W&mTYB zapCW^ZNKBDGdXm9NmF_Hw5a^T%aD2V`EMONzdtT+eYLU1vpHH17pk0UIlgT+m+={{ zi@Q2z?vMF)dM{^z&02r$`FlMQ%l60aE{ztuQu@;QwN_AS?CF<#F04Cqn8Rt-q)<<* z0)^u@|Nc8>z%4wj!FuBJTNXv^oej1=MV!yJ=l*}n?YDZ0Yl(!o<=krzf7jh#Dw6VL z-qxHyO_m;~CvX{k->V(`D_=2dgTzHkUVbHsy2n+f>_?^q*fVytzUh>Is-48G#85Nq zWYx2NnThi_4+wVnpKY8zb zmFK~-WQhYdyLKiYQSRusbPp0K_I^F}YmLtQ{guDIlx*57%T@pR=g-;x{)=DNZvVSH zTbe;saEn~@h9-AW+Xnlf%Qh1Ovs`_ABUE2#8TvCZ3t9PUAJ}zj*A!QSZ*7bnU)J6G zyKi=tQOhH7ws`{Q`Q9mgDOoe$UWPxEZ~3mfzpvG1e|!Dl1eJ7c_ zPb}5@T#|C&;r&}a>d8ij_o)A{IDL)tNYK0^KgwN%SI=N<`4ns;$1A6i%(QLeHf_3A$`MRKXPhI8ieKA=pmre-T8T;4-XwFvRS)!^{b94KA9J0ifzwqn-#9g#W_o0 zQ{{_&y&WD2%bHt$2FztK4C`l+x*xv#d*UjUkR?JBMH)o}WW>C4Jh;vzi$%{|7%Hv4bY?)+%(oYp>+<{sViHTOh!5#tzGkN(Qb8~83PCg?f5EbO0uu*fK>YIv> zAKvqv-KV^i_ht7h%SoNjPhLD7@#(Cv=#oDwPx!7VN#1^3bhPet<^7JGXATA=$Ox`t zvimsWhsB)W-xCVXB(D;ff8w&uwawCuliVIpxG{H9;HBUX@7-3qa_wK9(9hC-=FAnF zKUFrCm3(SiE9;mAuPPntsC%|y+My$kbG4tOWu2S)V58mC88zP%`8d}!H}7@wTJmn; zO#U<4tJvnb*gaDbe6IBArN^fW*8~NN-_$Ifse7^gm4RTAo1puINqY`BJUV>At%oo8 z{!F2VGJO&UefNgNb+p~i&}dnnEZd&Czkk6|_5VL7rk&|s$Y)ei6l7eiucUmuqM%~} z$M%JV3p}Q_*#3#lu}8*6lxRg!UTDUS7PWOm$ZC!iAY!j|!Sr2`=1VP#h4rlj~~N zmqWz{6)O$O+LupdU3%JONiCb)*IsLhbqRvviN>azPll^cPL$&|KO>-9eWiA(QOBKE z5{r4SPVW{`EDC-d8y~;k{_mHf-FYoq7Y;A1`TuwM{$H=}@7=fW?`8S_U&?MK?@rRZ zvrCTuX-(Am_CpTu-(Ic+H9+3JjG6Cu`e)6b&-?#>`nJnkaMtBZCC5_5oK@8edADkB zTwW_9r+asU=Ylui4(xpF`D4SJWa$8=wWZ1q%lGE-MK>PU?2ydjwSMDt_ok&Y+6>;M z$xMoQtkgR5_TRdni%x4Dcl~iVGj{de?Ypj>pU;=pe(2FH$E>sS{MtYN{Jh-%y#2o) zulN5s9bfnJ>(bJtA=lHsiZcD)@j~v`=Z?J-kC?hIR?C~^_@&X1)v#gG_wP#^~^#pOHj_aJ3k)zWoZ~KQ z#p-vn;c3O$y9}O(rdlre7ZGmM&Fm|F+9c26lTxBv_Y{Y(j5{V?jym=8!J5Zka~Izc zeEs~hkX_dOnmVy*W?zcr^Yg2v%kJN!PL2@~+#>nKf%)PJ5JW+56vFYYuGjvm_U*ZM%rWd??)^?hpQ|qq7ykW_xc1Dx)yYuVu>3zHnXNlC6=6da=~N$9O3w;n@S~iYq=jhn_ivmeEO9C zyWgUJet!9rnEE4NfBEk!*-}}hH{TQUR@Fr;UH7zZx#1b@*~#}qZFy=;4c%>atjIZh zfMsh!qn}Vadj`kWpbAFA1-tnUZTPtL_1ANyg0G{dpK853Y5MV*4~4r=7BI|@tus4@mIbf;@~37;e%0Tqw{BwdXWsXI z>X3Qkk;Av-ule)*>c8&xzh7rHJ+$uUcl})X-`DE?ynI@;GyksM_Pf06*wR9IyK3Jp z>TX}=_vt`y=RwasUo>0~vkU8NlsG>#rsaBQAN#)_B{m{<_H*~uRqnoTJ>7_HU(Ma^ zdAAK}ITCEQ=6IBxJDK$O_@}e&&0p)P_r~R~mFZh%H@j;`l1PvKTLxaV>7ndEVa4NlPSxqNP0Ak9EoL zb14MI2yME?+=#igypU*w{E_YG)yUE;a^)9|F0TRd5KF&Q8 zld*5{pXck|?Oag&>+I13o>!SxGR{$|c604@*m8+0DJgPR{k51GS4C#LW)?bJb!Do{ zj4hio94vX6k|znRx9e=3q5kdSLm{Ip0)-r+4-^)b`1bGDTYCSQTR~Y@$+LOatQWkz zEWJZ_j|!{!6eiP#8FC3m6L)j}`1_!}N$#SIdzm!ynp zoLJ3}ciYy@bIRMoZ7SPdzxaLQ*IzTe{M%o}#1wpk|9dnh7)~~u*eSUk# zi4$u#O}lr)*j8mWgJ%NAg#Qf>^q;XasTeRgemX3$cf-xQS3~E9&YURu@O1V0Ga>Iq z1?vO?KTD)74iuDo_wP)|d!?c$I@@1Qe|w&1-E*^b=9>#nJhj?h`S-BA{ojY}`qN*x zn1tr83ORH4&ie<|GR?Ez=m>rHomH^z?*wP_1q+lc*iTI8V@`4UX8CSI=fvi!fLSXH zjCVH+EcI#;kP5j_8d+^FU!5<-lit9U`PL_pbG}D|-AQ4sODX%$T)%#O`t#|3&7O5| zbT+8|>y-KDwo0Tav93c%$X1bIm%ovHxW%12-z2AnyRP(hl}xVMx35`&m2;V<)+J53 zNxHc#P6_91#P~zJ9sP5{LIwYY9ur_!VlrBFQtOYcjlC6P;MqR8%&>n`ug);_Z{&~M z&yifU(?Z>9;wgi`Oo22XUVer~76nx=j}NBl2BAE%m)Wj8RXaW*il2SUmSt0tgC;H) ze0Pkql#}J%mJiOl(hM#t3M~&js?KWocy7@67^rnI`j|({f+Vpi6PEfG8>c(8%vv|i z$vAytnb*XPdc99()ZKkSGVhW=RbX%p|M}xV7-;7j;}zV(Gdp* zF-5^!3f`BOe%_+8TXC7QOE~A3u9A-V3;zaf>6Vd`7nQlm!cmr6Aa&tL+6+rqkr%f# zUfR5Pw(gb-Yv30R_a8kQr&sRp<$Uz<gniy^kx9|UXRN`Ct{}0RkctXaIqyWs;#pg)x+d57xEM*Ed))9(c|zgzV}`?kS^-&@=!6zzO#cKhX((i>&B^RJ(^N#5aXvevTpjHXxX_i3m5oFb0gSkB&d z++@a42|J^`!UYNPmzmA(-ilOQz|VV?#MZDc*)uZ*^tRXEAI1gESB+F<#j69ytjCcgR;EeuXl-+DI<+|S#51;i5NR=#O&4RX2}!vF4QZI_;)o@C9FnPta!l`igh zdPZgSufL^}WOc3|Uf|-wzWK{QB*&|Mc9Jn@f^flov3S&)Tt~Cv)%XOOgq%XZAjI+_Agm z#*BCWo}PaC^_BSN>$m@Wc^WmDr7L>J?Z=0eF74a%=CjrE-`jj=?`u=IV`SIV~pSQR3=by_y z@bJpA<)QcYTCU%{by+`ucCe0mZAHzmhyL+-+xO~Qnaf*F3*s_S+BWgo2KLg286^cL za$Qz!32Ee-nlw))xxOZ*{`=qE`Sxb?N?@kw^CVUS<4b_LjG$B=DRMKQ{VG%@BH3S^K(n=85W@@W;t!Ey=El(t=e+zMsZcw z0mlSutAC5wn>^l&P7@TFAvW!*3VYGq&<)S_u3EZ0n~CfH3gaKzKh!k;tm3j%+NANJ z`lXcX67SnAA3JK_tkIks?Z>1~xq0W3kM!67`BSrV?ef%@ zpH%KVGh3D!%}ul9mz2_JzJwns%)H^GeN{s9U}#J(_zH#e(khm(8 z-8$=1{BI768-+jSA4ojGwUVQZJw)xyJB99*T<#MWOZkgSnlH*axI}Zov-y!zt{qzO zv~gFqkPtWjA)9wdJ7aIJZoQe^S%BF84R=4Aa}gcUs6+ z1WpOuVcl^6 ze_Xfs`k8XI0J~#V>n!35oMx4;nQp)Q#lg zPPaEazT%=7q1ripN4Uk!o2hn++!sz6zt-+wbV}+`#%kL+Zrh%`eez|+HHMSRbgV6n zJ709~cvy9Fsiu;M0{JpbA0^kv#S$@}_Fzn-VFv-b1ptJ@6omG2nn-hD6p zV)}=U4a**--r<|A=u+kIm2JoE+{>xYwU#7q|9JWN>*vo6-5ib?*m~yw{ZsO8Ijdbx zURBXH_A5UenR@@~6d(79xy;Dfzw!Levu{(YYwyLyf6u+K?>LXk0?iWwAJ-MgUw^$$ zKRS4hpRdUB<)44O``dp1->WZQzMY=`|Ig3%`DL?{cUi{Q*VO)hdwao~>4kICg4fNT z_y41ReA2D$_igr7T5Z2)SAX;0kIVdS^2&Dg_tY$&O)Hj^(rEX+mRMaouBV5P8#^}e#w8G&QV&Wca$KA*Yy){ziC#oRxWN~WEDn=yIsvGT8Tm+cH% z@i33;){z;;hYx%{;JM}a8;(ZJ@Jm)jO{od8kr}cUvGb%fe@$iHf2!N|xPIAzIg{jO zeV^C+UC3a5^|S@72cB5YovCnUNBiRqyAJ2DS}*DgPg!v1yoyurcS*LsX2UrmtGV~L z{5ifw_4aa^EdimD9@kh_>U?*7^27b4l4xjiu+N)mGnU^j{QS{iLKBOElxn!9R8*ME z#I8eDoBJa>j?1WVh*~KxU|@Rp@Z~(QXG#&f`m~Z>h&g;&wzqTJHRC^)sT}3<`;!Co;Okqcb8iXa<~>+NP`?4|N)&q8DlOSH5r2RX>jlM`9yRJcr`e3_5XahW!gewlOAHB5F+ zG`sm_MV5@_*;OJE{E4f7L}y4j2#I~T`%Gq@C5wC7(&`Scd|&2sQfoP`-j!LX#d6qY zS+KY6e6!<~-=^>ev;^f!>+4@XU8*hDCv)A#A>e(RxaH{;r}WZh>^!@YlcQyKWX}w< z+{{~6(^D0d9^8^XvwDGxK*X*YSLO+>bZVJ*$M3`zD_e#Q)2GjA=8(T!)3sv@Th^|; zD@T{jdhqKYqiTq>=&D5rYx$&C-TIZ3X2vei6S848`*XYFb1daMPDC{`wph0A|Mj&! z{@<_Nr(fsZ|MqpugnfJK1Si)2GQa=to&LVxkNM~SKYjoI!_%ifZ-0OP&)N5Nf8YK- zeth{-)2=!XZr3)y*`Ld*|9?yD`Ck7&zW&VWi+2SKxXq3EH$OV;`#Cdl;x+c4+7C}w z@yx$`V1kUV!IERs<~&@vW?QC`PyyqLtjn9Hc||uKn2~I=?r(nG_t*9RuJ8YKR^OiG z>HYu5@Bg>|7yo~L?(*j8w>KCtq%Av?QSd!?v;X`&{q^SCcbe2zyb!3ZvYLDDwT#%Q z)7;0mB-$}&=U=*ggH14hzTCc_AKvBv|L0%aqG$8rJBz$`K~?^x#RrbQ(Yh@8Sz-l? zYf06yB`%Xb3UAw9DBJM2!@pK{ zlJBQ)I$$I4;icWO%8KjT%;pwLEy@m0oF#lt@b{M58ymhzola}NZP&3&#B;@o%&S|4 zKU_YvELL&*-LuXPmYLZy@5~N4Xx&Y`e5sM|p>JVab#~RxzTDZNk3D8SR_HHaIcfN* z^m!l;SM9X@yR1XJF9fGMZ7X;wx$x4%*O%n3U*kCBx>a@cm8aWoo__td?DlgG!Ipyi z&$j(8k^XJ-=+feB>-l1{+rC_r+3@AnqKYWrV|%aZr`yiHnV0VGwj}211J+6h&uJ`i z9Lp{=A4<)9y{Pz?gy)Z9=Cm)CEsOLHa6S%-}}A4 zH|Lq1U2T=*;ZP|_mHRffdujz-e&pS+srd2i@8h>tdfOMqKA&DIUl#ZK^6kx8v#-nM z`A)07t#@6znSZ%i%@MH>t;=5ww7;f!f1Z(|l*pQPJNca2T#L1Dw`_AwjV+n+{`%jy zx7*|EDs0NnoD9AGI`>_-y{*pt_-*~?r{^v+P}{vCq*}R;r9tBg=Y<)0^6`4>Z|fzz zH%gbV__mQ>xgu)1!<%Qf?UW|GYc1X-Q|r6w&zfZkjS2BfOpk7H{ZNtDZDiw>DfiGg zZ_ew>o6cG;SN}UfAn<0pZ+ltKoo7!E&0HBAmZ-Ejuck_carLT-^0zTn$`)sGD;QR} z7F9<4n10{3_WQ#-9m`%%H@|)S`d@x~8-Ma=A31OdDbnbwmv+Kj6q8()pOIC9n zU8Zd9)4r2gQA_h`=%$q&U2i{|Ju8ahh*^L8!xy2$GuAzw$gXte(bFR5YfdK|cAcpB zvgpnX_Qjbs6;btH-#$*B&iA_K<;GS2eqDcm{&~B6-L4$_I?mkFnVGQ#bA1nf6rFhT z(5Hsh2X)(hT@FmH>ULrX5S#ukU;h04`rljLKmM9}fBD}pmtXIDFLmSijWeY$*I)lw zH2ZK(n)_4s2`Wdwywc)dUK*?N>i4g&X?!=A*~T9$@OZCe)b`UcYL)Zu7vDC{iOSEC z`)$U3-1GaY6`{YTX3XIgR<&_?@T`5;<}d*zzSWIyS~jKZc2{uOrjwGC|9#=<@C^rL z4|=5Sa}T)_w~cM4WthF0ItcbC6g z<-A<}S#`yqcbb{CBl^3qU&*A6@{R$J9zHbpJTR~AS)vw`Ug zpUxJa!%PlVQfx0CF4DR>ablg#Er%rqJOxI|)`!ntPBG3upR%8G@f@!U5i1(6huc+j zwmMA}x~431^pD@yT*iVTcO7G)mY^50nv(C;9TzRobDv-Dv9&@*RxO`Doir;Y zo-Z&Ib#hrU)iLPNzC{(SkyriBEM2{7W$+1^GA7?6XHTuvb++lU4R3FsJS*zG27`_c z&(mj9(gG?)nDri1zP)}{|N6__?mz5u_rIV2a_z~-o`;l{>GJzdEq?LV$X(!+XWgE= z^S=H2_HxhLe;=!48^u4LpFjWqpPJ8aZWas56uZb+efhPEHQ-)g@(;VlpFb|tf4&|6 z=XL$x>-YaX`dIZ-&@MUX_NTY+_tkIi`}_I$<=Mpzb$7R){_*GIx1z1N-L=QeY?#xR zE!A|jy5Hi(qN*};R;Tro4e}GkPIligtGQY7reXKY``=E_w~vp@zh3JmEUhTbF-QOQ z?B(s34?lX_#$l^1a&W0wut(3s>Ct}i$Mb%h>FaMlox1y8j{L+4F;YJmUKX_8OMPP| z9_rM#-K{*kx9{xR$A`ba{j)lL?)~}<{`!i4AJ5OP`!5`#u*-M;?TUXj(sDVq#W8t@ zm(6~oZ+++S>CdGSN(FTmJGbP@7w_P@oUXf3?X%0{_fIp%#-ZqtRQF-6Ox9KlCQ(^#spS&tLKlvD~=DrX zXwfV6ZQE>YzC7K@prdkrZCZKfrzP{>8uG1NELrZAz;g7n7C%SMjGGds*Sd{l&(G>g zb2#$QCTw}t-E&Xb%eUmH@T>JIYt7p6;m3?=%U%A}EML~B=3>!P$&eQ3D3s+|WHZaU zS#aT@jv02Jz8i#gEZCWuZJBdvnVl{>hsOWP!tK*GBqsT9Wn~RJ)%ZBZdY`9VB)>SL zYnMxD#fguv4d=VX?w^K ztu|kybIV;dT7?_JPHygKn7vvkpnQ6qiPPr}!|yMPqrRRDnzA~^*7Js+V9DL-$E`&t z_Iy+^Jo~Ab+jZ8i^bGwgjnJJMaIwNz1O3Ee06Bi_m zT~vNv(J<~F#XJ6o22Qe#ws1II8?7p0cx;2A*yWwK zH?3H~AtZC;yjYZ2*vs7M3+08p6dYOj*)(p6eVMd2=wVyIcgwRkrzNzQtPRZLTvB{b zEQe>c8iUfMi>(svf5VKF7#W}C75g>sHq=s|71_}3v?6WJ<-Ga!OPk`3e4G7ssqS;p zhk1(`_y7KS`~7~)`+3_hZ`xC7wbCNlU`r~eQ|4UtFP1Sc?(eDI6Zg&j?~k4ULHWaH zYIa34`3cGye3vwQX5#LW#yX?Y=W}A-<<^ANYZ#_zm#ni)DYbtt!WFuwH>nF zuixMQGydQ9|6k1S?~S~&@6VU!M)kS>Kh3W>Uv}%@{{Oq>|NptXIWj}oaZUF;`7o}$ z?RzalotCUNE5EbtU=O3>_0oxHw|>ppH%G~4%hryHzeRul{5;wg*>F!F@9@&BOnaZe!g|&nsxiLqNZL7yNAhfZLTdw zye>YQZ|6>!=;&lDBVs;ZZueQIrPn3WcA9>h5w&}UoLzcEg^Q0l|3{CDf}8tuwPKg9 zZu>oFb7`j1p$q1_&fO@JzAV2u`oXTVr%T^lKAb3&ct%y*=)Ohfr9=e4-VR_yRI0s%-v0^`;g%89=qJPMR`}2hla|Z`}?V= zy7uP$c=NZfpHF{#`E{Li;|;-ku~pfZO!(ykgO=#O!{*@yk2+*V^p2 zT)TX0@R#G~x69k#U$M(%*US}mcD6O&>qLEgvU4l<-sHEB{rBhc((<#r9-Y1YHPGan zqEqJSJ9jeoemuOJ{Y&ZQ>({eyF(@rp4P@(NUp~?O>h#SicI~%U&4wzmx2!_4%C8!l%0N ze2LPM4zKIE^Yy38@&p!g2S)Dxrl!)K$g}y&9>GaxR(CMY*UPT1h}nJW^YpztK8h`G z|5gw;?Ow={L*lvfJl!kZcit}GkI8R#np(E|?L0q`o0;kUPbVxZTu`(kxwo`i@#tDd zF^0mtKhOR)d+phG=ic5}yFHfQw;ulRGqw6=Ucf9x)22%TD-|wC?3QJ|`&)q5eMP5w zL(r8TsrS!wm@5VDywr>o77t%3b<{&dxbuXYsGW`5wzh<&M??JMS?(-Y#g%P$%EBr5 zA2cm;CQdFdESIF}@@v*6L?z1{E-ncC|L^eO z_`gTne^&kc^!Ryue0{{Vv}Cpm(^BWx?RpA|_6K)@PTC_PqY3ih%7p1Csb+W@^XZ3tJ8C#|9Y9f=j%vWjW z|KzAR)>7ALK_Ps>;UVGkbe^zqJ#vWZDhQwYbE5v7k0piwzpfJC*D&v%utsRI<>#rl z<`tZmt@nrvTc|ekUHDw7LiGySw}O0HwY(oRc(xzbQ)P9YWMiCuC?V*o>$!x9Prq%P z)UV9uE*R>hp{i7STsWgg`G(4*H<|B_3KTnMIq@lZivCPFxlHMliP7vm&HK~KPGmJN zQF$XAddR^`cb;hMzSmoR7ICzlRokogOJ-eq#N<1kNvtQ-`?u%?M(iuC(Y@Q>(A}If z?fnvgNPexm&Jl4|9z9z>#4=^9YFF9*!0P9!e-o{KSFC9&;%k(1KObIxy1DD54A+&( z`eMl;JntG0Dmko}^1V>>wNj_1v26RM_?7R&>=*ZSXBluFy7Og1=gxx<3iG(U%!|Ce_Q{5|Bv+lf6AA$f1R#T?Nf!k32Y3P7isJGzK}Zp zuH&ZPvFo?L?%G>d!}#%6>TUNk1({s!EK$>QrHgI$e?I({?AGk!Uk~neeDBZRYj|2_{cva!wigNSwZun#4Ene5}g4eOsqrFWs3` z`~9u`?+*{J&!2Di=i$@k{p;6H7uefdTfQgnS#-|J%PIS6_Z{&+e{0s%=4o-?9wwiA zIOR)TU&$N$byEtAL(j@s?!3OZWw&^(*zt;)7iY!j-=6>PjqSN`?S_i%F-Cp9%&7IMpKWxud|m$e=gWn)RVPn3 zNp1PC!eg?=g&2i)YoUOT=a2uFQG6NEG~=0jK(%65>O5_R6$_@T3UO#1Z7jL>^Cn~L zi&_Jd$4?@@6)?8lysqh?$hY+5{_8VmDzk(&_`FmT*7v%uV{rE7q_730#SIHqwOMms zm05j3a%RUIDSxK7{~qt{3GEV9I8`HA7u@M9-ZxFXo6L^P*Fm47y@`IYc`PjL&Q4StT+C zOkKv?P&s4g%>2vS4UhY@%oAP1z2c5#d;sIZ$_LkfiNExnrNw<$yj;FAgx%%Hn-d3C z&79b>#FNEEl4;@#uk#9lt@oruSQ}nmobj#3Y3aOKTA@4Nm)$o0w@^s8(kAOktaQ(; z8)w|;$@aX9bx zy!UMmuZ7+jAD%BzY|iw^MN5`pfsd+<)9LMeJ8zvTC}6YJJezy&;q=$vepUItpR~S> zH}a!6`-ge?p~k&;uB?1`R*z3rjGs|wu1cB-+f-hL1y4Pv%vRZK`uTkO3XkBIYv(vl z_4uf|^i#rNLAK8`j4xd?s>xF`+pzAqjYK53h-=%gm8vQrY5@7msE zy;;Svbj9LOzAWJ`wj*=-+N^JG@t!2?B4v9>*34?Ht;V5eb+4aKTb5(vlNchQ<>a?n z@7LS*wvPMBMiAuQK>-#jIn#^MKumr<=@`$M8mw7!&t++(y1}6X>+<% zfWo3bRVNtkI3Im3^St%{tN4Fsdbl0%`IwISm73=qF!!aLMKbJ+DUSIOh-uZo3 z>ra#KdPPyUcV+p!Ief<})Vpo=(&%g}CpWWcPcGe_v+T;Xt7q@>%$nC*nRIl~S(O_3 z-8bh{=DEwTEj;NwSIp(?k?QMux1u;M&i-=GBTjFz`M#KAxw8``^@U%FcwH6~yq)WR zzGcpn9hRZ*rp)-UihtelqL{;`?^f5T|Ce2+#CcHHxAopGn>k++LtT7|g}zA2Iqtsu z>~!w#T;?ea{g%f|4&_GOvndchcInF&lhl@F_q4xdrt;679rg0r&0Q&<<=eNMd}-P0 z?KjQcL80St$~oIRccmxJ@-E+>`|h3QOkESj7h=oyyj!+Lb)v{GLuReVW_OZo*E8s? z|NXkOzHZ;%9J9E;pHt($RaVL_XAey}mvNR;w8*xUF?#YnzH9z%54jYJZZG%cKJqo` z5}T{khi{2H_f*f2k3U`_eeb&1p~R0rD|hGp&YiC~Yns!`%txx8PI2Dv&P_{JS)+A- zpY7jIzqjXA{4J_BtG<`>{le0V9S2zAzW*$`y!qFyFJ^!8|3ADeZ@+&=W_(p}X3yKj z^?x?a_5b^Dk4JLwRJYu2$^7e<-zwv^_5{yn4%)bDVbGbp18?Lqhj5N`fK|t@2bmON;y|;kTNSqe&5N&DsjJtv~4=O^lIPc zZZ`aWL+`iQprVdM8r>b!Aykv825z99IH^w!5s|z5?Z1vM0P29Gn^|q_b zF}+4hTm9R64&T0XibL7j|LViM!@5a+(!aM9w%>aom&fqhV6>Ir-G;-$(numLYNReFNdy{LzYK=V>Z$tt(<2_~?>?;xqati*x@Yr$osa%EA#T40p#w`!n!M;gm{Y8D| zg;%P-y83_L>SmPCaV0_i&=Q@1=5q`yH2c3u2^uKXG&x=L$X^^}<+^VI%cQioGmi*# z&s4X#wb$CJ)n$sp645E5l4ob`u@)>Wzvp;~!PV%L_VH;&e@vIS&EUA}v_!TehVwXw zPdS(BPNNm;C*}4ouPw>irp;?-eah+6syF+a7u(ppm}JlqpmOKLqNfZ?QjB9tE%s!{ zaV&YHWpkH*67Tf$flvE>xpyA#@}4Lm#ofp3ay2NqB%x!a>!zg5syj4=9@=F5%={I? zzi9_+TyjTNdPmEg%a7D&9Z9`yzyHnQ7he*^EZ*2LsqFsd_R{;dPMrDqL#JO(Ed1zV z5hr{5`Rrwv^^X=kXt}!5~wEuhi{~!MS|1Up(ZtE16pDgiwhRSm5X2x3ut2lP_ z3;v$R*qb=>Zu5@a#d4eV_|;t+-|Vb7vwOnfPj{9a)qXnTv!X}`VA z*1~x@%URMC1&ts7&00A-xOr9q!;K5)R6~iv`%2v`RMwOB94|6zWmQVH5mV;4x#ldEhzyM+>%A{&`bZ z&=T-@&-rdOYsF<|+6z`ab8KC;%}SOpN1HE2CVoDrVk&3Ivs=gO#WkmIbT0IJ*3$8P ze)pW`3qJWDW}afuJd)h$Qu%-6HV$W5^E`ztg@ z>A0Z_)9#Fs%S^@P~a-XjwG@-Oq; zjLQ-aZPRcyDiUd#x%+ahx`*h(mbAq}hjk;{KgifWztHpY@~LH)zt{RHyuJP>;mz|; z4vMu$3)dVx$H-v(IDNKP+RDjl$4X|ZGVv|$uU)Wx*`sGpYp3up^!jd6`#QEdIsZ)0 zl3SW9e(tk=ma^}<;e%sB>)Heo`wUkwiF+CGzYk%UB;@{P*X(KwP0P>C-PJRGnyg+Sq~Hs9~vudhhHEO+j-e*M>nZ)YDb`14r4?$=-Y ze=mP+3N~5Fwf5=bE59zxOJ08B*s(jj$4}N}n0=D_n!HceRhMnTKE>SFsOwb+Z=0=j zJj9$fLpf*G%>J3n(_D5$KMNN>A92bhs4?kw6${5(-S5RSIajbrBq~L{G`-xM;XCWZ zr7h~dZW0fA1hhh3ZY*4q^IIi3^U}R_r*FCB9lE{Ew`pzZdk^{Mw`RFfw-mIp_g$H? zmfQ6b$ND>4H*c`;O8@?N%X#KmOI(cp`FTgrHe2YSv)6V`N^Ho~XA-wrG@h6pd%De^ zzu4u6$$YuXvSKPBErPdh?y{Ndw^vi;S>BRKlV6HF$T)Ol;j5{YW?2hQ6@+`P4Q4Tk zJ^8r6)~e%KYObtcqM~l6@ynT#YdgOcT@jy}rK(!_R7h^ui%nZ%q>bnNE_rzR^xMAb`@6;3O(oy_%)Uw%TXDJy zD8@3~`EGf9&dEQGZ>A^yuCd9isi?U7?5o*w(cmM@H?#akua6HIKZW`qt`f-tM=vBVC%l@&qw1FqD(Ob@^pU)R&sL<94-G z_Fp%D^4U{sp&J_|&RuV@_Vg}=bmrZfp~3#I9;P+yYHvM%rE7V_le+!fe^)0;o<6xi z=N9+mjs^kA4<%OLOW)oS>prXb+?@Z*Mwi#Oj_s@eB@V96HN<3GO5P<|#jack(*-R*DV*M42|@;zI~ z6WJ*L-Th8{?-s@iK1`dY8Qxy(?Q%9R_(@<{P~=6i-7gH{R;g`MnIW*=QG=^@u;TV9xDF#D1Jx%3r?6BEm>1!-JHFZY>M92be`*{N6qU6D;bL|Bpp|1B&4a$ zQnBE$EVS_zSaBv1RjxOVYDq2?4O!%`+zlSwH{gm#Lo>EzxtaVoz9>%`!V zCpH>!wutMmy=5Th{riNRLsv%U;YZuH`8<&qb8!%|e|Ei2VeXa*AKX=Le40AP$-wdL z8{SQa^i%p@jOH`ajzIRtv;`Zk)2qL6)c8LiT(9tTR(`w3k=~ zhE?i|aOv({c-bygYw_Xk;35v$OVfmc+PouY3R*Pz@)Z`E3A*;K4wp-vsPpx>fX|5q zF-Nl*L(dDTn6ebLYrj6jYJ2Bo*Xdx(4cDw}UNx-v^v_`eBbTaI&2zpp2j+bKYGu12 z`bPKz9~~!!OAij@elN|uBK9G2*S~`9qH|lTHden<>u7j-!Aj?^o3Ml{@9AvM`lTtd z%d_gN>)-sz|95nK{nzmQ_wvG-7R}9AVyyN+q}BIJTW*~F{e3p~_tor*%`e=0bA!ZY zg`F~b(ptv4HZG=yr%DdavfItEY3YfBmrDc#ZZFs0?mvJ1?Y!b+96Nq*+OpAC)G&U! zTJEbk1wXb_)ZHt2`8Sv8{W%avW9O?5wcnrJj<5TCm|s3VK7Ofb$c?B4 zpQgVuVtX~c(!Yu`V#ft#7S>a&in^0k*Dm8J3~%|YSHEuGs%xt}wwRsCkDsTnKmFeC zpD!7g&)dgzb>0l&c6O`xGZ|JU{JmAJ%wu=4C6L{x>3F+$eMnh1^Av@{>O0r;KR>?w z^7QAoSyV6FxYHcUtsql=E+u6fKX*2}0%O;cx)LXalNr_=C4tFvv;-Y4HMTw8BcilC zwZlPU>7P!`6H7KcPC2(+E%nSCe#R1&#_0=!<|a;Sa4mc`sWSY33v(l9I%7&Cql!PX zSX|y5*5xTn;6mTrMdbhGdSS9h)GAORbWeDfibjjt>JN3+ zs&Op|l`9{Pq$4FX;eDTuj>Ejhb4MWdrdt14V@)vD|7dNW;PE@=JaI~LQVCU0|nRSGg4SaG!sjBz8M2qGFks+ewy&4`G>JdP`?dkXrbp@?}d=)SKHCq6-szHVZPa zlpb2Xm@Ht0<6O2`*EbN8&$bD>n5?_c@! zU#M>{K6r)Uq}rS1*GyaQ7#&-3`SMI7B^l#Io$cM{C6e}T4{7f(33}ldntQ40_^t;D zd&FBJuU0hdVqj!o@N{tuc^e_cZy{@V_uJj&>X}}z&p7QkZpV@Iw)D>j2JcU1-xv-F zo%(vB^U;iAzti!ax#_Q76v-@Cdgv&sSQ{0e^3v*?;ayKb(Q^N@eo|YX{C6?X$!Y7# ztg~Qg`25 z*1_~J?J9F)8k^T^r%P!CfyNAa*{eD&m+7wZUA=_2-}24l{`vNQf6P4ayPQ9N-nsoh z-|FAnTN%*U@#oWTe))U$|N8$wuHSP{=k7;lpL7-O?aYCu{ehl5tS7T?O-rBuf+3*p zQTt8DzMjypTlARDNcui3o_4E;=y;%;3fR>atAoo1gH0ms#!q9qWA8-QL%Kqg?*5 zjEA@rSI}d=#xA|RD>v!a&e|XIt@hd3iuv=dzge!vveS%(DIn!#u4trq>@2f~mr`He zI<-mo_nhAw&cw}mw>|fn@P4Pq8{MVS3 z`5MzX7SF%6%Oo%^{`+e);nz$8@6;F;2XD3%PqkRVaenutcXo}3d$!Ii<`oqRSDL;o zd-A>1J82$oF5A`K>#eKYSzCF}XS#j;t+?g3`}-b#{Ba@bjemM=g!q}i4?q67@byk{ z(}G1+R_kxMxSUCTS1cdh5wpGW?sK!+H*#|P{Fij*MOA;_o$vH>x&5AhKPzX8-@bdi zL?iKxW?<~YptLTZqR9$#J>=x4<=ytm-Az>{~o^GZ$JLD z5|MaT9S~(+wJW4(iLlEB8Ljo(KBjhaq#L}pTcQ|b_awPZ+#{RMZO3c@fA!kmTh@8+ z&#T+ryKl?7FS&ZYe$UI|q;%4LY~q^y?$NalbN=qiS+P-DUd(#-(`xxmp0)cfubi~> z^ra_e1h6o1W#_2YkA5_cx)+|MfQPx2=@w)jar zxF{_@{oC2u?c4Lk@8{f4|Mho$cC_E!G@aPHXW0C*>#f%NUbU4vdia~A@*?fC{69|C z&YImGP_%B|_7s=SV+9g9!tQ?;boO3mGF<%q$&~l^GvCt z_+8UgS?-5&%k}c-om)Tq{qD04lJW|DJ|YJ$v%S;y{C`8x^r*-DFot5apQ|G31j|eP z{x1CW=Om*K$6~X*&?S>%dzB|FYM->AYr#q_)rKvu+F@0C%l~WotMpy8`7`t64 z|7t#+*4RgamixIBUi=K%{__8a<>%+yeY`X4RdIAlUuQ!6@64B{A9o(Itlhq2PhaA^ zd9(ZbmruR4;e7$C?V)A5dow2+*7^wxCak-)zxw-+yXO6?t;D@r{O<4D)A8WS&iOxo zroOpuyDT{4@RIEt&oVTJ-Rjf1HF@QvRY98>yxyy?(N`QbSA%=IZQ7gfB{ z=Nv7Z^6_6;|Iv_>Y+H|Q;$OA0l;O-t7M3$1+M719`6G@qL^zj5owB{n?{<@>WUloly5P5fIn^OTCzDIquc>5l@6k1p#nNiy(Q=KTG!>1Nt)0cGw*kJz3*%xC2iTEX&W&)i$Gt84d^^{# zJvzeW*n8E-qQ{lKXuQ`hkEr5M{cdo{t*w}ile@ZBR{we?8^2F^OaAR8k9OVWx8F18 zoNtIW%Znvml|O&%va{96KVI?EW?p>M`_tw3pEt{0j@!3qU(EB@r|p)XmrQ0zxn(3$ z?_hA|tA+i64=R$LNr|rnf2S4Sy7O(H?dLDN7g)A8)cyFX|9|Jtr=R}+{doDPTg%k@ z(<2=O+j&eZ<9C_`l$=j-{c+J?*#TF^`KCdqRAXzb&gM=kT$v!iX#U~y^Vjlq|3B_2 z$hm%e`SELF0t>t^@47pQ*J`cXhD_-&%hRS)lpfk8`EmZ(!E~YQ)UFM`K1i(*2$?6h zbNh`v1N9rzQ(tcKkH3)6x!ss|$LiWs?9pupzps;)yI8bIz_cluF;Zc%<{6=#dyXGe zR~6vc6)h*r@O|cKi>|^sQx4Wlw*OpwI@vT;R6#?a>wHV!13O_$-O85r(k1xq zs#Q6ARerwF?H3pItl6?m*C#2lO~~!4&#(VY1dXWc21ZRx_Z))O&m;XAMW{z_N|chHJGA z;*z=EHDzjDsAVPpwNxInhcEBQ&GYll&)X5Z?vTXR<}1sh{W7`kbTgdsjp^3*oOU$h z-bb?tRm+2Cn0*s1lswIL|C}@L+3_^N8JA_1v`TK76mc}KeXQ-bY=VGo#tD|CJEH|8 zqb9yyrm7adn|o(WYs%_V4pRj4E}smz>Y(7`I@$Ro^EqKvjfX;ct72wN%2?%lbkckW zP6ZZ@m$FF}RWbMWSO56*E4ay`Sgldvn2E9Z_LuXP6&LUN8QUAgdBQ_~5=XA(0gtr& zk3X{SZ?wtiyPoiT^1oNN`R~_MFv(oG-SIFvY~7I)b0XTmEL~h7YV=L8fg}35(kia4 zp+(tCnxeAWIh-ZeY9IWQ5V_maCA{+Uj&)}RZRZ-`_A{p^Mf^Bs@gv{Ic_3e6!oT<&EcY@ z@|D(2Ti9OBNb9SOs`|N9!16_@in2yz(6NIxj3<|V|6G|Hd${s8f0L~ecV*%BO+mYa zPjl6IU#nL*6RSDv@syZ9PD0+<%U$Qm&34mS-Ewor$Df~1`^)E_Gx+|xcUAoU_ww&=^HTw#lTL4%BY(~3{ma-dJD#n-T{rjh>DRiIyDh)k ze=W1p4e9uBHnZ~Ao`>J%pZBj1J`|ekR(5epQr(m3eZPtlkEz+roz{N*@^k&`{p)X^ zHa&J=e*F3`9IFBse0i9fcybGU`iS@A+eZd_P#R4jqy>$A1PQKjNrnlOv zEk#A6=H;hnSN8w@P!Mggi&Iv;EfI2mqnxHZ z>&@xCJa(z`UXn0?*t&rMxPknWZA>Y;?hU?DO@%miQKCbF|qe0>C?~t8euI<{F zz5L_b+vdxKm9}ti3wYSReYyGjYtyg){j_U;Oj-u_DYN6JODiIMQaa~}R=ciz;<4=4 zua4bz%F;JkUg+9X{!>+7GtX?TR#C%ixe3fq848}?ebQpCKYh=I*&Ry)Jtr`3|F9vF zQTU|mF~^uwb2b&3>qSi5`s}jgEPLaVNu}54rRXZirt)v%@zQwvqUw)d+{d4_y*Kgy`j-6X$Q_l4~&zwc#^sarC7TSN7%iC!_ zez?&4$lGnYrG#gy)e}C+>Q7D73S8Z|Gr70&<9)|F zi!Pl!Xp{P3LCEG;JEG3q6m%7J5S`WD{8_N@!pjqcS{$b{+F}YJJ3VZ@VCG`_d;4M>lin z{4u}O&w2dp`Ssfx*i$E7t*TZ~nQ?x~M7@-QlXz6mYfE0XNx1%4NbQN=Z^7Q?JI_ls zu9|ZxO_(|P>VZ`91S9CP71Xy+SS65`8BEOWW7#XNmWJq z&)6B^N!>yx_xS{`cG9eYLVb%C~-CY0w)BOLTzgXq}pYPzbx|`Hv;9cJLbc>Dc zkNHnZ@4K_yP1+%!_H)Y}t?%g_JSW0Jv}b)6vc0p&ce%#PJ#lY}W-Ifythv_Ts=d?q zGiUqub5HMV@pMp%3CW%P*uTE&-;Y4qg}z%ItJgX4-^@?GpDZspq2X%x8ct`K=RXU> zX57DPaJX5}scTuY#{@RM4eo0gk9+R_Kl}dQY|Fp9>p#o?|6Kpmam!L2<%8`ZTt*H{ z)o*|Cn5O)?o5aL*}KT<|`Rn7IZG&9kR=VA@#Jv#+{<=$Q&eo-xNX7AL+Gav6@i{_4XnY~5M zjKSJ=?)}<|ro8Fd9fzHblGFMYIL!KSCc%=^-SYcn29rrKfn57b3@1#p>FMEiVcyxZ>y+D4WSz4d5thgGdzTxfBwJMbX z+xg6F_&>-`DveP2fAg+pYn95g_6`Bx(^E2z2)fP9*3LIz`*Xm{b@mIz=SxprnkDm? zNoM(O)?7aCy&RfM-*=pDzRSJ6E< za9(``1KYB@-$lJ;ynL({dbK3+q%#Qa*;yXAiTlQmZ{G^8m1eG*6&n*Cvpw_hGYN~D z=;&Ufm@QA{AD_a}wa4s{MyRqwdBu$xhbQ~CUlM#UgZrxL(N#Xe5ho=BTvT@IYcA6= z(v=TaPzo*USh=d0h56PL*MDca%$NeE#yIKnt`2o|jrRV%tI67yAw64ZPwl>%e_xW4 zm0q!|RdoD-uO!^NAu{g<1a*mwl z^EE0xrd7RDJM^-z!Awx$Ws%%Mu8Nk&`gLEsJ9Ij`O*C-rUC9{$##WuDMm2DSywFXZeI!%XQXwtKO^R z>4#tZcly2kpMT%$<;>@ceUM0dTp-5b|3bcyeSPbP4O%*%cq~npOR7v$lUgugmQ0$e zz-60*E7x=yPnQ)k72%V4|1EEZBX7p=(=u{O8BXUHkg-qsY^CS+j?Nw@ki$d|LVY zPu1T~MbXormgL?3Jm>b?!`u5`@4Rhy_)pEH_#a94ZRh&GZJ!?(uXp&l!pnOMy^n9K z7yG?}dHM0vr+pKXfBDCM6MQ6CXDDYLfk+oAt!VpbMDUnTR_iOKBUJmFTAYO&b! z+EZ7oE8{G-2;%4|aCZsbSHHRL`?tckT^lw=N6eXaZ>#CU!_E6F=lU(T+iv*WXH&x| z#p`0rVn5|=%TJzPvGeTn)BlQg&vb5mIsMkAd$}>UE~zltsa*@bez_>FN_5lapLarc zlvGyAGTO`u7tPylsFwHp2K${}-#drZcWLp~PQ13Xwf*dEUCEex)7VqEv7&m2d@4A0%)0X%>_1aJFlpUD8>Fc)JOFDA@9e(=s_<8fmbvK{oR;A|LHvBnl z)<;*l?(aXJ)fP#c?s{0rAg1GRXZrafSo|*Gk z%A8&#p>Xw&Shd>OT(3O`ABzi=%WAK__-#?T;vHwsKvCVdGp;{AJ7?<>S0&%?oey{} z99obh89VpR%6(bFxxTiKKJA)+E?fC|u6Szx-!B)$r+%2Q{98%Z+LZ=dw%&fa&0WA? zo7%O|Hm$Pz=G8mjZGWiZpDi!E{`y(X%L#cWZ=Ra*^zp=YmQyZo(iP_(ZwzP6{kN+! zqx8>#i`zD}v>%r~9{wvqCHS;3hsBSGK*j~f9Vhl2uGu{4=@r=*HnaL$)(4c=7QWb% z@W5h@kdVJ+-UXfCpVwa~N-#HYlDGa!yx{Bq)<=*pyWM z-Z@!wM~-1CYk26}DKqO+56@ZSlW}0_51p5nVrEod$+J3E{qx)^$u;NRGi=TBeRjTU z*G#Q$K}Ow_xu>jORoYBD;mv>Y-dXWA>_)RW?p?fZ_!c$${#0$g{VsXG-TTXbx6FI~ ztoX(ZL)~Lro*a)VT)aB)>^wtrU%eE@hXyXfE(JW!87yTta&K?X_3J(o{3)}mqqo3V z=fla?kk8ki)a3d5pWglc-tjM|pHJV}sdxIR)x7`T`~&RvRlfN9=We{6UG0s!|MB%T zKMx81*;& z*mZN;&9r|ezfxoF#k}4A>)FeV&N7Udla4F&dD$;h-f;h$;kV5K+Z>ecC^5&j+!FWd z7g?#?UUQs9!Q0MXVc}EGUHfW(_}%!$UB4$s`Rwl(uS^a(X=p`O3-hpYER$@Pv--^P zD#Syae}#o+vD>6aXFsK!$Y4ErDTcLy$JnT4=Gs@QxU{R2*cNa4_($dYmTP#>UCsjs$!*#B8n-wolhzQ&7lJsUpZiLxP9)DSfWZ6eI<(|&-by4V3 zR4G*Wb@jy6*T19qIMmTH|Bp_hFk=(oNx%oG;Y zc)ZZ$Wy(o2&9$j=*|S>wj^8*w=kVRuOVy_x8Tbw+^p-2R1g;5DG-21%Ve6lMJC^IN z;L%P6g|0*Ux2*i(H#@J~%dGL<)iZa`GBt`=sC<$tu&CK}V8IhRqq9Ldk4j!Sy;WMP zdLVbzDql~Q2a3yG#X>t{`$VHY%d!O9O=Ay!viY%LF;`IN%X5i&j1yKJ`ZD)u;ABS6 z{FPBgOr1?v{w`mWr2QaNq#^Mk&yp<~0+-XA>@9!CPB?E|be>al)#*!7;uCI#Oq;iD zpWwsG3zl%qKD04@-Tb;=d-mR26miz^$zI2ht-r7CGdN!&#HG`_*Yn05J-LZ><(u^G z9=jtk+rQCb=>gM)mXm5b6}(qxcnXBBy;$8K;wzT4Hg>bbG;6L^y&Qr!ci#VVVu|l- z9s3VKJJ^q>C|CWuvm|K6(x-{t2bM6*R%i9uG-22L>pS1PH(A|avdXvEN3cWPk>~gV z1Yq{eIuyRbF1w#!ZU74-fs? zEabjhWoHfp$E6r~o~2*r8D5U?|NHXemx6bkFHtpFbm@*6opNp61Mzkrsl}T1!?kU%shinU^Va@4YUfMFt`Wg$wy?BZlw|e&V%rSf(qC3$y&NW2r1_NVZtT) z#I9(|`PXJ~>wo9UrwMLJN|NdAHF!I3OL?r=+eIO15gS&is7zlzIq2D!jc3n(JDV0K zqf}zdKck&JUC>;)G~3wcK!It?`%r7Os0oYT#!R26ccO!%>Hy!oYR6*1-$%B+Pv|T2 zNV^yCuBk@y_AQUB{@>dVt+-_Og(znQy#w*R8E+xMnV(>YUc`&;47 zZ}RmuH_tkUEca_`t^ZRbnEC$R+|YvE?|h$z@2~m%SO5OMZ@X{z&yTaWy{{*1Uw3QX z`pcJ({@Ng@SF8D=@%igLch9gMp7f6)bLOj7Lp2Xy_N05(lbX2$!oyROnRB)E zS=ZDjFRK4;+AVyBBZ^=ANajRy{?psv%g>kF<$r%!j-sN)`qQ)9%U;>&u9cneVvm&4 zwBz??FN&Ea@$PWWxmv#cac_(6e(w=9(KfQ~;1FEXZL?;rxux!=RW|dcU%qsG-AbG8 zt9N%_Oqst{*(t}WDf!1!Gj|J*^b2YS3vP65(}}&=ddg(=#;;eDCGu|FnAPII^8E6r ze=i@_WZg>f+x_-(nnTT-&76L7*ZFSs3|1_>nVNgJi$h$nq{^>kwW;>CW+6v=-Ah%w z<8u2t56CR*Wm=IDK2eQv71y26m&`kpcbgP4?wq$*|8DB-w%$X5n|OTKk5yatraTEf zUZr3q@~?+UhW)qlRHcc|F`p{~*xzktNz-dWyzFQGvpWTn#Yefr%tbHZ~s-F^1dO7HfUj-}?i->fRM z)196;KR>)!{_^*S%S$g7n6uAJuejzTSvdKq+k~jH<&)})1*TVT}wmr z{osQ87axoK3%_CC+Q}rlz$-~C$Wy+o;jqF=))-m&g*Gqy@&mhV_Fic&O}diX=d{ji zS^0e3=gp~hOIO_~u-A>WtypxtkfEmhb)3wa3k*spGbcSPY+N6`=HGOki6Q|z#9Kdb z960e|qYJ|(FV9P1rA~!4-hH1mC-GJ;ckx)s?LjCBYy2! z(cfr&l6B&e4bGw=y#AF>Lm59B@1GmRc06lcFsy<(EYTt$%YyJn;thIXo z>Az1v|Kl%q@(O%Q{pFfl>*RjiuH78i6!@~9_4r-?=gon#fj0fj3-cVFZBW;r(tiBj zrD*%P|Nia&^Yi|H`~QdI|99X2)^2K)pd|Bq&iUzopBk-GK67jf$G&&BPoFNkn=^y| z^O7?nOWq%U&fqOHMbV`}X3{K;9W5tpcD-~sW7vLQ@$Zhq3x4i51?p@xJq$rkx{WW}B4DL^qU*OreeVU^I zkMVX(Nx92U%lTUfn)@xcvT~*Z;r%|MUM-{XhA2=HacBN-Pt)L%0! z=UHD7v({!A6K7z=if0R}V*0neuS0$e4ogH$7;nf7MYp!*ZAJ5;a)XX$-daUA!y!QDOeE)$Z;SfLy7lP)dA#V9Qrw9N3=4$>id)X6oS%Jr zpT9Zt1(7E%*-8i2TvYF$ZGF?YxXR;Eq+lMOrnzlag~eglsKio_G2omyJtmfI#Zzc&5d{r^w<{=a|cmrs_=JN*6bH^cTy)>%_n)RtK*b$hdXf-L^egD-XZ_b*pVmE4&te6anv zY0v!m>wg;J&k$1O>7R9|`c}M)$mza_UGrucZOCWtUHjGk|BqiUPoF-0`fEvEZsf&TjWefP zJ)4u4n`xk663i zYb^WRw7++(K6dHHyTZRm+mByf)M4=9r_sKcve36@{pPCso_|oX?qrbPs*Rsd?K)kb zw`gtW&3We<=eAt(oNX)<@;27AAnVt&mGiG%YvNyiPeSP4taFK6^R8{{&H8$LMxI?q z?fm3l9LqcSyFZ-CPCRjI!NctA=b_cvhbDww=jB{@;!x_v;QZH%I(EcCJp^pQY}pzh>JEw-(-UdwnbP#h#dLYLf-ocHevRXNS$5Yqvjtm>CnAa_z=m z_pbScn<~DXNZ{rFWWFoB;myVUi%(o^@R)5U>AHPQvvyES#2q!w=+f(-IMQ8i@c91> zJiAe~Va1#7O`K^$pI#@i&B$|S6xlRC{=vHMhYMTf6O%qjwTKzo><NDN95AM12S^4SC{Qjji2OXw=Xs~sJc5-udvD{u;BKY{Lj03U+2bcmu;waiTrg$_G`4k=ZZU@-NXb}te83Ty7!rte(PRcV%GRP z`%tGAxAN5PGp841{kV1f>#5fdI7DoBUbwcySf_4VRMGzQo@*b?WqUP^QYBLS4)ujL zFt7SG^MiJ{tb=>T+ATj$`7L)5+WKh1%N^XJ0p1}RUF{`bY;7JKdHnd!ez#MiEzcIR zuujeD5a|*7zfjIPEBAPKfHA+Bnl{hz>%MUXfueo()e{8x&loy2Pc!5=>GyHHztB9k zFDD*+Oi@{;v}s?XH6LfR(&>DQD@; zKd`r{onb>=!N0k64-SMDED~EF%l0UYyKAdd@x0L7I=RsHBFVt#YA3o5uGOD)BIjXW zeErIQrvF=56!thf3kF8~Hx|E;+F?fUCGWt$zA=o_pMsrYc(SLxV>yAO^At!c~(Gx{kREcH;( z?EwGA1;0xeljLVI>_2^a^*7;Ni}(!N|Npb=|G(M)ZLj}c{_BHBy208l z9M)U@xbE2F9A|lcg?VZI$3qWQbvmlIvwjFDT$){)_tazatlXZ|%-vx8=FrG+=SGPi^9rZ+3>)!t_w~6Bng5Jl`{y3a{7nRr*(2S7EvKgT&MwsS@qaSDskF;WbOQ{mYg* zop68mG2fj&r|1N{LZo5!+OEZTW?tpUH8+}%oIKLbD_fb+ltCF3oY_eqV+R6&oqlY(%{BGTUO<8nGYw#}lF0cH#Q!Lda%+mC{(&gGr z*L?WEF*&Jo>3POhzi$uwW^8&fqnL+z@ziQb{`75HDysz@Ika6>)y)*YOo&ZUawxlc z?efZ_p(W0yd2;VsCNXT*+E7q#;wp6L%!66GZ{KAW*s-kVrtA}0>2E?ZZcEDW68W2yadZqFe#nF|{n zmhV)5vevi1)g$P}lrD}x!0{6%R-l2kgf7zE%NgVn7yS%x5Y$0d6sl&hU0?FWyf1YPID@p<;~H3sW|D} z%J!Lhm%Dq-iW@|q%neY&@w#boB@ zwT8v-7At*DCO$~-KPr>19j)^nT5 z3FT*Y*`Hm%Y0azKe!^LsK_=w?u3)Z*wp{W1%k>%$y*i_G$f!kNW~7e7ikWTA4pRc> z%9y%0%<*$syn{7u#?icD`8=^zSC%FJ+SkjmA}s37#rU5+9h{tRl#6w9tu7UYW?f?v zSk-yzol~R3l3JG*_-!|sKeI09w?&7-iA0f2 zFHiL;DVtsvifi?XoK|+=X7sFjR->+s|2$eAFZdi{J^gL@HFph1-o7eZY3Zv` zSI%E)xK++~Hv9L?+ski1jXb}cZK`}-&CkpJ`qN*R*?rdw-yY%5t*Nw6?{sNiLC2-$ zy{|WI;h21{{K)asceWYMEt~y1b@$uF>x*h-pD%X}oj-rOzW#at{(k@We)IFEPrv>4 z?B&bTZ%;U2_9pAP{QejfQ|1Y`ODzP2WIw(AT|WJ;{_S~}CzW0`d~WvcGShe9rriKn}k;R zc~@7w=zsq7&h4tK?p51z-YQuxxoJEhVwcdJ?=LsZY|h($tu$Ac-Qm`akQHWOh zGj99K&)@F-K3jf5|NQmO9)I1moM~nG*Mb*^c4bcx_iae!EK|@|c|6akWgZpLK zTD?lQHu&?i%)GqN^3L{^i*9f0w=AFS@JcethySUB++~@IA;B3MO=sWi;(ePN)!>mG zHAyLnHJI&WrkjhpRCG|-vk#9O3DpqvsviS>#P>RHD^vN`{_b!u3+nFo^p%ZXBYU%d=9*F zV(xdBPL2DAlFt69O`ADA#7Cq;!?fpo-&tl3l^0>x!^#rcw}#5DV^L~8%;2#4srNJ$ zjSp8=hOD1med)o&i9g*s&pkS@LgVG)kayY-{nj$v+GDP>EG6k>;5%njliOL6GB^z82LIKCQsPHDqPx->+e#P zxL9iMA0wp{$(iDBCa`BRu&>=QyY_oOF`M#fV`Iz0U8&AJ^O?oR>a-?PE?A1L2 z|MLI+uK)Y;^K@F1uLs z+ip)6J9y*!_V@C2KUeeLulc=hu0LbDwP;6!v`W&g9lh7j>rbB^Ui;g{)Bi^Y$110& znUg&OD+*31e0sy`5tzk1r}%zcy#D<7xcEFKn?2LNeR<}bz5MCdc6*!Ml6+wsCv#}; zP!zhrz;x-tq`9Y*t*1VEw`iuz`hE3_7o1VUS zx53N(?TIz2?~121?fJ2Fj;@1-gJ}Pr>?v|Dquo!=k67P)T<-r(r~gqbGJgg4JZ=7x zysw;P&!R~!4T~4|9lofL-u|>C;#UOIyO~d>%(n4m`?Sr}TdzI3CByre36RPx_Lizw zP`Y!+IqKCEof#_PVzNiLuQN<|?Vw?nbjETS_fDPIs7`eW%Y|z*Bm9y#d-!_HSTMCR z;+VuygUNzxFP_<+d*x?-D!bL)b=PZWZC|RrvqUoQ5KCw?i}KUI4c9DBH*J~4F;!rL z{;lZv>)Z03cXgcD_VTHa^4YK2SLbqw+n(xKy!yz)-Qw&X(sB2sZ@%Kb5W;D)mf2^j zXn{`1!%aFNUfN;Ny#*nMWJF%}+&yNtZvFPxub-CPeAk(&6W^2J%c&DPJvDPR(;ai? zoM#COR!%7Sd`Jymp zc;6A5J34n7K3Ep-?OMULd4*8!Evab7>rXjjc-baS`KNIB@R?&B1&mdb3znG{U3ZBN zo-(VJMNn|s!&!YFmhmhR%&cN*U%@u9lEjT>%RuYCRT z%j~CL{Qtkq|Noj_e*51rx9)d~0>n)WEYi8y&)%8zoxSDk1lPM>E;5RI;nO8&p7q); zb2zBMQnAPN@%+DE^XtC;-JWOM-#v$Qxk$Y6(%XxFd_BHtip$4r56P2DGPQ0VnIw^1 z_sfJce5ygbKkw|;5l4FK>TO=Ip5! z{bJpsEzw^(QtVY2@1A)k@hm8bYx9}yeU{36v1==DY^hy#FnL~w>GX3ey{65RoA}a5OC<5M z)ZN2p?iwER@L#uu`{ZQn@C3e76Owhmr?_5U`{nEWO(u?W=eRr*Y+c@~@;Ps5utM^! zx4ZstxG%Bs+qIC~Tc7Q=ak^LEyz~9%hi6-2^L)3=za^wM{q8qOrofqE^X=ky2kkmn z`^(>4;I;GS=eK9vJ1cijw|M^Z!o0P2^By0Uk7xSyqa@C5e%+7DpSK-ecGmWn=WHc5 zKYwrWyY2hml>B;XmA8I-fBc&HVVf^Wuk{u_W|k(Xzglx`y~TuSIhR-Y6|?AMPb`@4 zzV6E1?`)~!Q-TdFv+PvXH)NdML6clOpsT`Fv4lv0oo<(en+?UmdYcZTjoDtvWTCulLPn z65AO2ZJ){42V0iR__j51hNZoY-Jf66^RKZnvE}^!_vcg56C3w)Fs;+=V-gj;a1ftG~#--@W|FrLvxu;!MRuceuXz`$s&KJ-+hR z%%(TnG(4Y`?URe^Cg#zV!qF}?Sk$W zOE6#B7%gNcG=n2xX=&;9O+u%yF^UMzezt|<=5|TJMN!pa9??%2a;i4`d4Hy9&dfPs zzxhr|eyrw}J*ug4DtGgRH7m~D&u*H2*S%~*p~JFPPS=f-_$3b2^Suohed zPSR?5-)-~A@4_ze>ZO7ME+5da_l)wJZmxsH}*}dM0 z@P7Dt8gz2y&Y!Py&pk~3^-hpc`*-Oq%YCOBBO?my>NRU-Na;jq*?VcM6mXGnWV`J7 zbKNq>%7agim+5OQRTS6xJj=*@LQt{%ncI90A!nMD@}}i%cKZJ3LhbR|0}Nu7linRX z*5Y$UndzNf{_gu`*Tdg(Z&7Ajc`@X=uO{n;Ik`(}|+B8F*` z92Er99+z>;KfkP()v)NzNo9*YoOkx7Jp0j=q3V^J#xl!|!OZ4puV$&! zW4pB8@75mVnbveu#w+4rjTyVEcL~ppi%cr-N)|jm_jt#YWz%$o znA-P1rBKPp&q_eB_fM443M`Ni*k84F-5*@wa7x|&mn@T+z=`-Dvfn=Ln+ zU5dNirg37WX0)(_jR5;+OUYHfM~q&$x|~p(qP*It@32~A!_SpLkF0do&Gs)Ad>gxU zVvD5GrOQT|X+N8bEQ%kje;F(;Fma!U;la+@83L;wy(?DRCi?Ks_sYA^Z^Y)C_4-~2 zc~B;EqFp%kpni~5?X}m_*6rP%8YpOMuebg6j(gv7XYaf`>(#>|R#C4qsn88FiCZ(h z%ilO#o>O5ES>YipXq2h{GtfnNm2lw2WoxxvTulY{otW#mKwGC~{`Kjvzg9{Ao^!c> zPjOeq5y5Lw6Aw&M&|>O3qqpL4$5c%bfg2`Hzc0C%NE%73^Sxr4rm#q#aY5%QGr_j7 z$qN>7-d#CG`}lQ92Bv9;Jpu(+&4`YAAo61o*951DT`CinZq{@OoT?_kIF-x$yx=<5 z8HZ&b&M=nW&c)pssQFoHtvHuTyY;LI7giM7*#51ZIN#4hV)ONl22PqFL+||MLGYkd;#i4cR=cdFJ0#4jw6md&g#rfnzPO##Zgf~|fxbSHO9ND%fq?2n2_j2Vshn7`uowY`_^{{wD z{A<0?F0rYbqhbyy3+D(tkg;3VYnjfpfj$2GVb)73rV;-(bIrL~&FZjx>6;rV-#NA? znz{L`j=UffAT8%wcq*Og>5OS-qpB*GTUSisvFU!WI4mvH)JyEYFk|`bgB=-D63uFE zKflqf@_Y%ecez;qiIyp6zMMMxtYdfFiZ_9M#Sins7R{3ITE%?m%=+JZdJFH~QC=2p z_jHref2s3F=5L+R-rmj8C)d`#Jhb)Q~vxgjAzBg`L zl25b8eGN@ZzpBR6M1~C&@?UcniNxF#TgVgg$wZ-Z!mN7sqC-<$?!`DbWn5QdjdtJZ zn*Ma&>z>~d*R`*0U0E=D=G zN_IK3_1nGUG2d%uomvBetIimuO!U34dwW8|G=V(_E0XwQbvsD_2KEMH@6kOJA8lQjY&_rU1o0D*CVdat@!O5Z1-`YO*3Z0``Hl@9eanpOLrkc<*lKy_P z58HN%UHzYay0>b@njl7D$7=Nw<#ijl)brQc9aH(iFrmOa=*g+253l#-8|AmFJUA)( zXvTfz{O5muNQN;S3EdLmbw=dcQxlJn}b#M-kAGS^@P!}wXYv%zwbXfDM2#I z=kXp+1|d`1ZmH*o);oN^KF_NzOpL=;Sen71Nq}X`6Njy@6&k|6n^;z{zDc(~@J=f}b;zh{*B3WbGzDZP~*J;`IqlCmAQ{1W$W@+{b`RmUB7YRR52vsb%E zSLF7c;)Ly!cxZng8|n{l6b3^Uv#lE7YWZeqLFIsf4idM&Gg2+jZ4e(qmrlQ z1}%*{Vp4EkH&#YKlSL~&;au=kkH~AAG#XD&YmUB~5Y4izfO4{Bx?0_`}jjgrY*1IFRndvHjeqRfw7t2?%Zq9v#;m; zTmRH<#SEi8wZ*?a@Bi`j?L7I~ivN!$Ki`zmq8RwhkR$$kZshze+n&U8@S803NU8Sc z^eNe)_vy;)r|qIHH_CSHsqD^;UJ+r^mLYuLSmEbfYukB#x6PJYGAMYw*ITkp@aiPz z&{=BdZFL@WE*A7y7qN1N5x)b|yq(9?9;N98^iqXq!3v7Tc8x0D(_ag0{PSmp)b4^+WxlCX!yI&Wl=qddZE+T1j~hE)n^&{R;<`h2#x0i#b|riJ8?K3 zPZBbnI_0eS)onWSVs~hTK6qLq@bIGN()?uWdHwyz-x}SS%OrYehu+$AzAdvubCYhI zQE^?DF!8V8!*fZDJ0(LUnY^;DcgzV}rVy-r#zm@&gJVKBS7^ZX4SGf%xKOdvlvvxdOz}#c z)xGym^Z!k~|F1W{=F9!RPtxmuJ)bX>d+owSse8Nk|9?-~aKVHdN~Dndq~xvRNj? zY*=wnK4hhqZ)ZcQrj6z)gYsQn&jNR^QPS!@wMj#E_u*Z)*J~DS?|A(3jhNOH=Gus8 z)AP2{eo2Cr@Av-xd-v@8|4+s3e_uU)k$vk-Ro)GGA5T~*~Q#B|es3Neo-QUwzY$JehN! z&d$6%%ci7gUzdP!Ik(;>J?|OwcjwN2zW+<22g7EKN-lU3D&DJ?k}>OGfD` zuXir_OrBV`#s0esBBm5=wzrFO zGdJcwE}?ee;#yrBS^epg*Y^6yy@|Kky>ox`>=Wzls{dXM=a;YhQ?vi}{y&e-Zu<7O zZl~>*(+3V`W@|CsY~wzZQ`~Oz?b?9@mv8_5J6Za~r%w-a*4MVI-thgQCHGqCSx>D@ z+Lf+qo}KuADw{B)*XgKj%l-$NhX!?hn$MKun|7y!N%i(p z^Qoz#+XE(+Zhs?wckQaKzq@oix9pn~A?O()ci3HCPVYft?z=aOPhT>znD*juRJQr= z(z6G2%QH>NUw>fro%-dWnwO}l^fSd*$v-M@pPQc8_Kt5ux%^^v4J)@c&DD}?SZDDV z_uYJU-NX9Whk~NUNw+HMcW=A4?evR$z2u69v_^%kUq9&Y-^KFx;SK-UvAaB(AHGdV z{&Ku{e@S*W^WnFb#2!A7_`BolWwSE^h8M*|)T?7tW2aqwTd~LGs$%GtV>w$V$2>Ni z?i^Aa*XyxSp3A(j+a#rcf2!J?u5h*b|4~af)oeRZxgsp0_@BE_zC=9p1fwZ>T#?ET zpB1IP**wc#OikuM$+bO6#+@No*gQ|jd9CyPzFX}?f$nSNwaQ9CQ#x$+9V-6tveR%A zr|lwsbA?L7w8d64)_ASCDcRW8pb3^ubqx-UZ7qVkkcA;Xj+KHGggn7{x4^~uTCqndVPG!oTuxb&d~n5=d(5yE<@5LW``5QD^?SkmHQ?1$k*D_-A4ur0l7|yk=Wl=9v;XGZy%kEkYnKQc=5M|G=U#vP@Bcsc|K9)a)8+QE9o|b+QZvrX zOnqX;B6N1XFVmV=-FKM6H}ABZb9TLwhFIw4S3H z%(V6AAEP}jrCM=@mt9&@?cTWj%$VSBU;DQ^e$TJo{Jr%WHHZ!_c7*V!*{^hv0wQ%HN< z!(s)s)jAK9oLhr$Oq?@6lWmq`&8aEN7!8dYR(yPzxOv~(BQ?9%E>PEUs}et$w${tOT@)2_&(eIxi1r*H9@b056?anIL_>(*OmI(e-3GCQf!bY;@% zOG4gPrde(D5sVF4Rjljh+0uGpd&xhQZHC+GZtCsa>$+f7NMI<}^i;-#wA)XMcJ|!c zd^o`+V$tD~lQsRXtvFcGvSQ0Jk;Z9))lXiVXqjHJ+cw8#ui;8-rTELgjviSSyqbC9 zm3z%UPdU%9$n}YlS&~r}%d(_XD@1rBbCH!TJCDvEX|qdt_jQ*(*tyVY#yZ!fd*-&r z?$~)oKyBh{yGv_ojTp?CR$W1#i56`t0AcZw0$= z>;8Xt-u~_#<7%sN-&->|6)jySigA3uu%%PfX!n7fv^DQ$?6}suM$zk#@H@E^YaSfg zp|q-X$+ktwF|}VD3f(^)y<@X`+J}M)r{px(YtPoap14}$aRyg+`uB!*gXRVS)w_)C z5i@Ux%u0-n>+`8R`=~Ykb@eX~>xMsxGyhGOTXFL2vV+C{B8$sK*6K9wo?_O)vXbLv zZH(T`d_JLPjd!F`Pw{Uao+JjmGf!_)pTDBjv`epL7a8m3p_a%R#W=EL!->8becC;_g-`4S#7t7C{xUhG(YuW3%{n_8mdF`C8 z@bvfpeOSTSkx{zj@S{C94dhQAZ{LxelUAVgf=TO)MUw3szU*iz@u}BTwCDfvU!|~D zbH()22AgwVi%rbb@it%-VmQ61cE`@H6PLVp%x*7c+kV_*>-vfv6$jc^G{{Wf_|-5c zrfNs1zWFf;!NvRz&0D&6{;rFiw$;{dURieb+Dexr5@`o7sL9jJ0J)}5{{6^|J6M9aT!&7JL<`stR; z^?T)yTp5<%^iWWWRFn$~NLc&eP>Y)FHoIWncSWtw?`vLMX1cLmc}Cl=oqfyiGi*P2 z*-US5Qi;-`^y@R03$zNo$Xof0D{&KZm*BBab2X=FMHupl?B8{8vy!ZESMla2**n?y z*sT3*$hxk}yF;Plnn~n>!|rTWPtV+cTUF}&#BkA_ziIL(oO)mF=3reJ^W5|k>rLtF zyB$^;H^^+c&Y$qgN9d)OO@|9t+R`|C8=X&HXKnV_ls~z(sZx;3;{Unq(}&7WYpph# zX^^<@bJbIavy!hW*)E5#=y+zjF#YKJq-}najm@*`)|ZAlZqZzF*hTTAjMcOM-+xJ1 z*)v`azBBQu)rmQ-*Vxa$%w;q?*c8C1|Jz(Bf{pfu}S&)Pq~{0lbEVhOf`4g?EK|bbZo9`<4K?94PU}1Ug2?^ zc+6|zp=&N7pLT9NmYS<2aM7lF+hx~jTfde%EmL6GHQ~@#h9BR)ZCTuBbKj+AhR3?N zC4V!WZ0st#54=%wWfDmEa=QQDhwb%$-0gpS|Nra$|JU{3mM=fuk;>V0Wya=)D<_*A zIy(dp<|#Jk-k0nD`!ziO+xOj1H&kuEXw5iL&3m=%eU4|oiVG&qivA<(Cl}w`xom@g z(v;ZU?6+3#ui6~DYbNL8k8eFs>{e&b+e<|hvP_WIWXmO8X z&peMB6}<+7&nNfrFuk;n{?2`1%k(C0NzXePIiGgvUY^kIa)Xw*^5r4HnML!8`wNoWwD}zv>e~&hsU?nO9@77nYbh+p3iGl%%tz0WwUAHUB)4J6CgeZQu^z5VgWl6!j5(>f<|nN4zSUsqTg ztQfsZ^_M}{41W2Oj%NjncxE%L32~8H`E%}~Q%tHWGpF)$eqk(M@yt|Wx^7O$OgE+} z%Weg&(C%?ic3IEOuvy|X-{P!JnWsGcN2cGsvur9$(-OZcHl6D|SATJm_d3Dn5V|?6 zwaYq~MN8>t=5Mnz?L1vv)2G$;#m5ROEb@qxy_?jNs5Idkix^9P|MB?$zfPY{-BQ~7 zAvXKH{odaXj{ePi`l2>7N0UD^b(w+ktY>a<{J)?6{r*1AKCk|x@y|!6w|8bnmh&&Z za7^IG-Oaa``_FedlKNVi^JLpLfhFzQFM?lgQ~MRUwRoGcX7IA3S1)jxwFM}~ocR6w z@87$6^^17#o88`4XftoySr@UZIpI6@$DfrwvMKt)T0Xsrb(Z(<-u?TJzy9^r+sEVo z{PGp54^i3k;+eO^j=wrUvUN=2^y`uoLLcQrKK7$QaQeDL&g& zTFBz`(b+p9%(h(ZSD9#cr$}nTiP$CEmV4CfJiRV#_Zle^|N0rr-zI!@oPPR6UgEqX zKPGrQ_4e0vIU+K_ki9x=hQcSFGu}b#_m!S<75yy1{_xq|J9qSNzj*d8aj}v73^&V} zlja$JE119Z_97nsT!9U1eU$_k1;tbC?%Uhr{(RAoo2UQyaMP<7(f>bvJ*;n6Uu|*cm7iwbvsJIc57oy!m%sWZZmBct)*~#ZCx#Sw7u;3; zVOqT}`>2kG%DCLYsRdv1c3QOGRuXuT7aNisxawv>;o)n? z!}IlypBA|K*H84tVYBUaNj%%LUg=J_awRI+S4nDin5>1g^ib|ckO+@)UT$EnGjb-B1HL6wVL4fj*h%}3G*vCQokhj zC0=aLRsK06Ze536%f-;X>HF4s@0)HoCvso+w}*#$mc;f5?g;*>P_sQ+=gr4E&4za# zKjJ7q-l}1mpz3i ziOJ=0az1@_igltvbr?sW&dx*kO&TTltmYGb_r1V8>lIV;w9RH-J0xRP`0U@AWp}VV z>MPUCPwrgm!rMMPdZm>zEqBVM*;|dQJCp7#+1O?+>07EfolzijC5LpH-0a&D>$Ld3 z+|#dJVz^?t*j?Er=X(y7*nUXNa7p2^&2eesjMooi)wJ(ObXAv44vP@fyw})YqI7Dp zjrR35519jUIrEr~a&(4FPT1i->t^s}KbM?{eKJjQ;k_TOzSNM{xZLZ=l6Uiodxe4a zkDRW(J`UcInkpI%GZlH4Ev~6gGMX;Ts=fQbPrksooUeLHUPq^WxYV-lmB6gGKC05o z9K) zYMZv!i_1F7oBsM(NT)6ppLpm-iNz`HRj-aXxGY_AdMo$oeDgy8X-#H}=2R{Vu-Nan zw`<3|OF{ATg;{q+F)BTh3KBfDWTMcCGe2JEpJLv;7f|UoJ*;K2oaA#cOG55oU;_k$~^}i=S zum79>_h9+{|8xI;uK)M{$MpY?rvIM(oa@Wy!+ibqKmNY2`S9k#{;JHfgO_e>FG$SJ z-OdsnaO>TK^F=w&-~WG6{yzWR|BLp&^8f$!ueKv<2W>v^ z76iJrbiJ2y+}?ZXNHR~!=M6TZ0%7Ie(`NN-S>`q= zrg-Dd>kIaDWiqdR?7C#3#Kw+w+1b1g70*lv(9?aX#t=G{ySeGwl$Ng-WPe@z`N5;@ zO?iyiidL4VW`_j$GTVRu?l{{XG@G3(WaaX+vl7(izrN+NZOd!P?o&=Ne#iUgZ~Hsh z_1EkCeb*J**US0o$H&X~mKwUSH9XrHcznk37xRLq9`^eskrvi>`nH+gwOMS3d2?Rz zZ3>i7%HUoRcsySBq)N;a-3d{ftvFtv2(&nE*4O{{&RX51yN4g|sg&1v6e-pxx^<3u z{X8D4->iN-roOYgH)UQBOzW!^XsoyxzN48rrlZ`z-F65pu^VA=~Z6 z;bm2tht{a1YJ9lz=~S0w%7H}}Hut@k$>w-qq~7Uy-YdwGY4xiOm91`{DorEzcKB2! zn7!H@>+`Jm;nwRXgpPgvaoX1Ix?_qET7&ln_a&D+=^#wcpO}+Sh!Yd-Es*DaS~k{C>^T6RGcjmYIZa)^ZC(s z{;sy2XVoG(a!u_5rY@V+y!=z|F1rb{)EzeEewd&(Pw&^&bA?=L2D?AbdgBr)-Bmf~ zc!Yvj#B4K<7KOl$HnyP%8bP)lvt*@8qBobo2LKu;S0f27bgeJ2>zR~ zh|g?d!|vHCoO7*s`JjsIJ#nis`sfDl0C{#IlZOe%XT9ejQBuGVi zehQg3t-~iW=t<)X+o!sD%#5NB&$x$Q?McnC_U$tdEeXA;e?Gr_d;jgz;p@*Y=YBqM zR(DY7r)%-yvDZSyuP&>69{IkKeYKXN;D(EiQ_92bHXji_bGg0QN3@o=TzFB3-HYCv zDnB^Nmj*}*tXQGdBC;uStuKR8>PZFG`Bypvwx^!yQnv^%Iwe@dcyi188G8-7l*?_; zU$T{05O8m%t){7R(M)T7n=^CoO0(Zc`X?f`cSXtx4tJibuEs*#*Gg`lyDdI{f5~RI zch~Q>zrSn0*P5e8Z>C=I_a~zaDn~&Xr#7?QibPzvJem9r>rL z_2=EYx909Ivon|Z_CGB(XHHXMnkZLom|GS3*u>y2!{_f44w-y!=DHnJ*R)nJM$gc1 z`RR`p-#SvaFH3&6>D0rt`fZ|L zjE*yYZ@9pt!)7dVsy+Bc@{_Nw3%g!yN^6u5ylK{c)a1;%;P-b$s>~)VaY!QOc*TqLVPYqrhaXZYEqph_c^k)rKR%znVOX2tB+1vARv~g@iNFtCg4S1 z;076uz&|=l*Oghlor6P{F4|)xJ2OMCwueFKc%tA$8^85I_t!`{^?ST>Kb@_d6B*(> z?V8X(zf~un+Ei^n{nY4==nmUA)3%GzZc6xR07o_)9aeBQa+->$9>mS1*gwtBk{ zo8*?W$Dgm)=ia!vHaPa$(Wd$PEx+cimp?AZpR|6y?cSX`@4mlQCb_Tozy`-}@8nXl z{VFZK9^Y&^eRJ|nH>I8iwoXA!md^E zS=`8-aABHRk)%_E@-7Cw!`EE3!aq`-`Gh#9oLm?l zt)J}Dsa|t+>DC+Xr(G7)kYBwgq+4a)MP?S`YrIFluDDyp%6o4i`{%GeOZ9%v?i6|1 z87iDcr*E|cC4DQpS-*$*{yLHKyUuQ&sPW5+QS|GT`pya;_ZgbTr+4Y<&#`1)u}}HG zcjRBI-RYNoLoa5&n8uPdwd`iw?EX2L>ccALr`c(6Zmue!tXM{-|v3Rz{j4y${8n;m1&`0RtmZHdnc z%bm9VdsLMl`1;864{kPWQ@`FcKDOZ6+UJM+y4I~?JI-x*=*SKxhGw4rPpP0oB2^R) zl?VTPtu%AaR?Ev8H*`(gHMm~|Ow^dJHEsT0k&_liuZ0VF(@&c^OxKnT4B6yyV)m@7 zLT6lSTwONR&0#ifdikoQ%JKb&jepih_9o@^{@PJ0cx8@7{FOICix({G4{+#k2g**cx~`OtR!@J-tYcd(Gvkn{(9y)pEkMGHq?uw9eezlrF$3`*5LL zQ}3net}BerD0*M{<;yv7t)Q>beL=H2*u;+3P25_zy`wAp#x1eHO9vOYPrJC=`+J>P zw?%B#z4tFG7IRPBP}|U?;*vHwNObq_Ey8Q9+ZXtSB}`kh_GIFIjqJG9i(apKZM8O6 z!gqz_@ALWJUb~;axBq?ozh6hYZ|B#1x;I(G#iK8zUd79}jmg=L`s4WBu$&-KKI2 z-QB`st5VNZesWnB?b9mGx$2qXB=H&x+e3HScebi;?^L?$_Vd4g{gSNitVx18+zmCa zj;`|9fAQz-ly{AXmK6nWQEBvI3>I~dGz%+@N^GmmzPK?l&GXFi35#YH2^&U*@IDRw zc5KeH2A$v2=X6#0dJD}=KetuL+rRs@(qhHnqAev1k(yV96Ox`6xa`os{L^B&#@f!^ zt2tEe*t~zDQmc?~c(cGZo<03VK_`B?J2`annXY}qB^Y@r^ycXWhU}UT<;1j}YFl1( zP^b)YRBFlb4e`+Ibyn&QURL8PKzL%1Wm2_@@{BTX>;xC;~Egn94Usv6l=CC5euAE^J@0m`G$=c!n zYvyJ}E^#;K6r6GJ?1XtL?*exidi*MgWm$D%NrK|_)a_fu53S!EBy{KOPJ2dr6 zu8WJ#Z`btKEavH{eh1pwo7Q@^{0{iFdAYgVpGQ|`w_l#-^YX)ij^F9ux9={E*~NX_ zp!>wf*cMl-gHM8H2`%Tb_syRYqhe{`R~O>i6!5LvU{X-(-%W4%SF>+hEAKx&_r|5D z?3}eXKb(;>c)ly2Q+KN<-?0@dPj0$h+P&w+N=`Ag=}ONSWb+=n+`q%}@S@tR*LG5m z-{pOObae9JM9yQg!;c?7-p#LbS}1a1$OqNCmp3&BJ`}y)G_Rp&p4QC*_w9ze7Vg?4 zwVwC9pv|3{CEu7Aru;nRxaryH8oot!EUw4SaCsFd-rjcT?Va}J;c9Cpg-goCZ(p%C zo^MvVanqZppUkgB?C`i{I>Tw#UG>jaMlU&e78@w{Vn~TWq_x-L9(KJKmt!i>b`g`7|5nVV&;sZB=t`eR`GZ zadb+oL?rh!|v;IfX>{HfG)U0ric>lcdhW_?;(Fu<~eyX^4Pj2_*?GK#xRcy2V z`tTVR%cQIyKXI!Go~L{ z*Uyxsv}o%zW*!62??z|N$n<%$yo~zL*K=0?WFNPZQ%KH^33)fRU2M00z$iV9nPH=X z;iR~yevBut1vu1CT{~sfvOT6-&8OeJHLFry`SY|*8J^qnyAIr49Q~>6=Gn8qZq-Ca z`P5Inmm6DdmLnJ$V$Qd_?4iP`gUjz&uSk0K^5%rSz7^XtLtS^B@80Znfm5JDF`zS} z;_9WB9YH&sr=0X~^?!Ebj?GsLSjSa4$@5w7v#U(c=j1*Asn?m{Vxe_Wo|91Qi! zC690hc3x24w)T^rVQccsqYuTVZIa)t@**`n?6}DxWp@GANxKp^ubFk`aA>sZ$E#P= zblq$_dGd~BZj4%N5%;tIWbfAxg|a5Ara1e}W83-k`9>Me5Rt7h9Oa&Gb06_Y)*U>P zKEH0ahHQzOwUO-qmUr_`^i2Kje|82J_rmUszM4&J>N6g%mSGC}D7kZm&t_Z0(_Pl_ z|4dGv+j2xZdY!IzDHYvR6JmTSUROX6^fJbkfpX(jn zEQ6Plyn@rb7ai)|eD%Z3_Bea(@_=`K6H5xuU9(?yHQ{V^_xj1)HyL)tD<0V+WIOTx zoR4Z3rhI#wdY5B~^3LNeU%0f-KYz@zOI;{rGuMMt3r_k^Ieye<-3mE%p`>-{?}hok zWE`C}b1U1SL&E1a^qf8|KV{NH8~Z6dGWz-ZexIED|LOln`@etr8*OiA@#fEmpj(go z|39ey|M&k3{{J`a|DBZoH}(F{$@@Q9zps7$*TVisVa1kxk@9Vu*Jo$<-1}X$z>7QG zs=8WW(~oZtCdmKWx?d^j|M&lw|Nl;uj>$ij^Ws!n@p&!t->&XnDOvV~i(Kte_X~#i zUa{VnvW-8{kL#d;#oS4{sxNMst`qvc``g|3wV(FBumAJW-2T_o_4|IU|3Cl#lkV{J z%xtS4L4li|{rdfSu85{87stwzuY9uj%$4Ho;{JWK|GQc2<6HlEJ^vCkA4x9F)}H=U zfn`!+-t|`d&n(5d?F+X4G2f@N>HhlNv6oF6jGG@6Y~B`neXflB;&>gARhRs~Ju9@% zzjs_DJV$W>pW+3PwQu%2w;W~?zMsJ9ziQdjJz1xgn*NQ`u**azN(13f~S6C{m1b6_y0cium3r@ z{`cwY?)PKd_&IJ`v|VfxT$aMGBeHq--+%AQmiC|CIJ@1fH*ulj>aPLj9$F8s3 z6Qrcn%d(eG`dnwwRsNYr?w&oH6k%qdaMkU+vPo{Sgu(3f);sr<{ygT9&e`9P`d^=E zJ5N?pMT$Vl+5FGX!-HA5*6SNyzpQfn42$-m!|pGC9oBI%eVpoHXe_wwdu(#3+4YxR zqK<*32W-?nv-O@Z$}TGA`c>FJlQq)f5YOpV#WO7z?fLX_*;I!0Wh_COmu@}_6k67K z#>z!#!}2YOGp-(#>kDanww7Hj&|5&|Qq6MCsK=MIPPQKDSl|%(zoD@-B%|h#~pTDz&Uw>;lfLtYp%6y_|i8=bWO}!&r6RKaxGQP z++3Sh-)gD5R@Gh8pJ%_A)kN{YRcwpWuKxUS*v7^*gKJ4aXlcph*z8rlu2a`$c1KK8 z>s=+YH{0W1S_jhtcGm8U=qWDIQA=wkDcrtw=|b4V7Pcrrnv>ZLE@bCuZ(W zDIG5-3BPieIEIHQeGvtztDdO7{QT&^o7{#8Ems3#_Sl?uoiVrGwDaakiPyi6?2(dG z(eK;3wdHD&UD#p+{Rc++;<`@@^qwy%3NoG?c`B(>@9=K}^YUWv+k&lp=Oq-s*lm*a zII=DEMC*mS7hR^vy_ml7a>To7OJCkNcJ24iJ)Ig7-iP1r@_2muI{(_0{fgYzr{3-2 ztNET1JMHOP@#ncMlczsie*V5)ZB@kdZF0Brw#V(-|LQnbt@xYptH%=cw1l$y!t?un zU%RHZTb*5rul;V>y?68F=Ge^Bo2gNC=h)=*a-(emJ7ea|k~Q9&$i2s^Z|g-_z5h?E)mo)z zTP>z?Uu{?9n7{8m!(rYPlF15bJW(pwb6UDR79DuKE;7O8LXu0xgSU^LUfEt;bi-`- zizk`0)XTN?FPvJ>aAsrII$yr_uN$IoS>OII;KSgg(v)^@R!r^UP3$j{BNBM5jPw|aaxzB;S-T)>>jHnqMm<>i*4 zt`GNV>QCu>RkUhj*B@&`i_JL?Rv$U*YOXi z*-dx0?y&mk&Z5I4$r;xEk>xsvdG&YOPczP0e6rMH=1xsEtXUk;b)s!g9mn(2UpqGZ zTJd$UjGXFIZ)x@UdvYfA9SAwOCz#DT-EjUhCYj8NDZz6(ids@8uHJlnMrK!~$oYfi zA+H@YcT3OIc(rHkCewwp)pe@h9t)BUax8TXVwv0%5cuHBmiF!*#?I9|jjD1Q9$FVq zYIv$}b{w*0xwIs;!Ev5d*hj^tB;h5#UD?6q<;@w*?)Z{zLvB|Gy{e{~!GRZl3*RxB805d;1?AKmJba zoq*;mE!KO?cb;r(<)7nTQE<~y%yq`zzjN>Z{%0}o|Lpot>;HWc&+pjlvASyJ)&-tL zeVad>nds!*JZFo)nBDCAk*lBWXG*_rc|+8Ay6cu!S*d-W?|%RPpnu>0liTONf0sY~ z@VT7oe+MTYZrcAp{@>;E`z`c;nnq6X zK6msj-ExB{w)>h`wua8ep*ID&m zc4ZdW(OXgRV6&{L;f1ef&)5IlZ2$N4QcuQK(>-&n_kM_Ia9k*$_3>eQ`Tmb*zk~2~ zaev*SG{q~^CTe|XWWM(M_xn%E_Wkqgzdh@|KHd9+jm*QQ2-9h5r#D5s|8D;0!`|Kb zwO`)+&9{jylbNo|pr<`MKztqdbXFhr9Xi@vXU;Lt3zqUr+~D%F!+|G)-9h^C+ruy4 zI-8pxpK)u}j;<|dg*L6%(pu%~abO9@htI#(t`acWZs-Cx3Jg;9V z{dlgF=HK<%vWx!Ju>?JgX4-GaWg;+frYg&nKk`jRoEqPYm>SY@J751ik*yznziY{p zwGnlFol|$Rs`{4-dU2o6R{g%yJ;prh?~gsPHH-W$+1GA5^4zu0!(Mkvfb#9lbF@5n zxJ!D4-JRGv>AJ^_&L`}u5izxqBEL%(i8w^~m}pOKZ)lk0=CZ+YnP3!a$ur*tQ=UrY z_`E#4{oUcc{LU55Tb40)7zy+Q^=m8kTuX_K&dcfcn3%vbDS2k&$y`^D5Xv5)l4JFHx#P8*&ckQ-)bEWNV*=zRq zch@_GCT=;Mx}qpI%Iw?9-jBcZg8qpxD(GaD^?qsA=W=y1nfiCp_wwC$*G;@B_Uqc) zBFX%Fa=R;oQ;$q4T)XJB(!`w{O35zSkFGB3=1AJHqUPJ`@c*CG>;FA_8+kqSkoXbx z`&Iw`ynH+R`tkGe`~UvA&c8{o;r6!LPX{M|kE^Mux^r&%>7ONbGG+4n{=Zq=Kfn9I zmmd{&zw)-P@&5hHd|u>>O&QTGIp^oy`}aiM{`aS=$_fR1eno|OQSAp;KH`w(Q`q|< z{r2fSOM~`45=@)+U%+#jL;$CO@9R}hKi_B@@h&X7Fw{v}q0#EZqB2 zpku=;y%T5lcpbQTXVUgp##$Fo?^Me_ZTe%9c&ne^Q|26v|kbE{8Q51Ph(!Q{W!7iFb0J_Z4w zwye#cuw(zzODni4)Zdn^m#_cw=j7RkPhTI8ulagQhU*>wZicgN+Y4XjzAlt}-v0U9 zx55o43o1U`Si9dg_-d!2&7n_AxIX&C+|Y~m+q7waEdS}US22g1`}6gGH(z?Rfons3 zg-v@)WX;b{jxEVk(sFaw`L3U$RDNBpRyuya=lUBi_wL_}{r!QLZ`;;PmnV$xpY7bg zs$N@jr{ksd(}QjscWSh)7o2uDH|+*fs!)8f>t~O!@T7e^TUMRjy-h}VQ%BT;OT8QCi?p99atJ4wAa3+$J8#@VF2XXTpJYkprde{FW|x!{Ae^8E1bvwnGDr*^iVNn31qX~nWXiA+!ZXX_mLV;&x|_Ek!| z_`DhCpWp3bbqadezos~VaeC#U>WH|9fn84ik{-R61HT1^?-GCTY@U&SL`!hSVV5ID zJ^MBsvhvxadwQ~Ppz*_-=2rvfAN8$^bo{Hc$j*f|Ok_gHhk&iAKi6ps?v9gekyA5P zR%$QKd?GkwvG&T`N$XYhb%ZK!b27F^7kL<8FgRWMy}_f|;EYB5A}-}1u~|!te8M8a zqF;K7`7|Fhr0l#X&e_xSK~3_JWxGtnQoYk{9c~L(zjvuoZSfEC{dJ8|v-H%7SQkatt$)=- zg+!%ZfBnf>?!7Iov14bG@fq`lvIlCn31U_4lC9sq=il_2u{(G3!$rRN{5S62 zu-x;K|Npu8pZDbdKA8XC{QoEUe~0V8{!Dj|ET1?tS+pYRYp->3eMS=Hu57|4wed|NmLL ze%-&#_Obld3nvNP`~6fg{k-q=Yu}Rj0<*)_f_F<)aayQczRbEfU)=qU{oVh+PMaI9 zSatZgjP9AN{_C~8Zd;al&du%43NGGPdBbmdp;i1biA2X%fp*u>g3ndIUp@V49zWmy z=eO#&-!|k_{Ow+E_xI6{3&Km9Di=%&-~7@}AW6O4KsoRPCUR@PN4gyy+=AF8dv+#`eE}K~6^%Zj`3pKCCYF0-IK^+4J(ZrpIAy)z zCd>Wz_6dG8JwJ2S9EJ}CyuJZErK{B~;xm%33C)@A_jQhGKv!h?`B`e~y(Yas(Q-Y7 zS?NQ?t{Ai3Uo^Km>2#+(o!nGDY3<2HNxOe?*vyYJ7dk5^Yeme9L( z$gAg1-XXz-PO-DCb1Ig9W%-m+W~=k9KdnSZ_0Vju%QH1heI1mWR()|?@^!bKcb%x% zkM>Vj)_iyrW^rlJtB1a=y_PRciskiI`I>I72wl0#`|_Uku8*G8{eSXvuh~u;ulv99 zw!iyU-SH)N_Z)w-J7<^Lw7g*C+|h1uV~JYa&zI^YQ`hfn(ct_UZ(S_8{H4k3z(R2;qwztmXyT6V@p5jtmZRW{Z?{vwBH1-Zi#0njlDX| zZ1!AHc9kuth?rJ4aRJZsDGJqHS6I_o&#d^lh-1oyq)UoSVS7)0eOMh<&t&1^GRrG_ zmmWhx!S+{klsL9rTe0iiwJ9!M7u%Bdf7-qOVx4{Jh7v38TCwU)nXk*K82!1{AvG4u ziajSC?pyx(=N(3)KhN@huFbFgvRMA#vCsVTZT8sJeSCVm{&W7nPtWJqef{?F+qQc>%4s#3PxDwNvbyS{Dmvx!S@PWfCMTM`>J>)9DIbz8~R zXB}l{UKQ*AkZAYo#3a@3zrPGOhbJxLUg)t~A?W0*)ZEF5+$#jD(@5Y62|?X6m})k;vO<%G1E z{$tC@&ZXNslN+vopT0juPV2f^XP|0!Y^{@D@cO1Z77LZrS!4^Rer^u*O!R%8q3{p;Jw@_t}XZQnb^?d602s3EV4@XVBq_b zch^T@;;YjVjz3P+3p;SQiqCz~&d|AD)6~FAXj;*>%=Hrwgt%PIm>|j3%bAk;<8EH2 zrHY*LuA^pdQqkwatls?1t8-4fiiELziRcUlgT-eKoZ2{ZYx-4#9shV9WPcLpKRt67|M}VG zg1uJz)VF9(E)G9$p49hv@>kY{Dd}@Qq=-gcw^Ht2TczH?vG>~dpZr%Vo+$dKySTJ| zuKerBbYb;`Fdg3uHZG@U_4~}9^Xg^`52tVZ)R(U>v@|^HOKuTAY2I>alZNxvw}oFd zR{xu#YSXXt#3);FkxN6txyC;^$*tikR%y#;dgR(IUZVQYsxig3H74qM^*+6iG17;; z%+Iw>IG(s}rpXWQ>j(dMeqI`EAZRGo7RAEJ61Z#WA-Rd_p6jxfna^=Inm0-4#m?#l zGi76}HN`_NDSmqGqirt|>UH@@fO;oysQ%)AE`krU53(EVy~5&o)pJ3l>*W)+wx?>i zY-H`Yi zVZQ(S;rsv2|L6bz)c^mZ)!XbHUTgVP^1lug`K4RR^n5CNV;WZnSIeWm6&~xHwklt6 zdAaY!4bPen_a^WETmJt;_5R<|F$|p&%jZ1b{PNw;&!5Bf?f-wCfBb35{^>8oZzm-G zK4$*D{?B6h+Q-uJ`)%a@KeYcLzW?8sEi!q#N+)%_zGFN4SLXCJy&Uq>@Bcc-UjID* z?~BF#dA|=Ip1k|;2i-YIN0)|jddsCcnBHA@+HvXvoutO&=Fi(7KYjSINV4;`nE8Iw z&JwR(2|3RV>v9vz{onul>u>+}bG+>wGhR_?ztv|ZsO;HT?P74&z3mz9+ipADe|y{ge#O66A2*xx&(>@G8c~sC zIpwvE%IEf^?a_ylt>g0M$xf(_I&fw6llreBo@{y3X8X^pd!6R~u=4fYGp+Lb>c5|K zKYwKRPTT$aYs<=a?7aQit@+@EP0itFPKSE>KDQ7P5Rv?0_`1^nTgqA%wl&GtiPnk? zojYQLaz7^Yg-)`Z^G0a?A0`zY*R+L`rn~4>oLl8`X|9H=aUaVQR|T(>t!xU(?^frp z>b~J^Jbk&sfvlU0kMZ{$_+aR+zh~apt8FpdA#rn!pFKV?d+8;|*V7grIQ;zhy8q#6 zvz;oYth+B+pn1M`*LP-tiyaCVYvlg5ep}jkG{tSt?w!d-k=%M8%J(b3dbDcOF|EFv zXH1R;$2FF(jA6YOtH;25ZV6YLr-oX*dFhFt5qoOHHU%75(eXuVgX+Vs6Z2!_vho^S zX7nFiQoZ~4wy&2{OSD6#9*sH8tvJhRwn^gT2(g=MwGM85`SV_E-I_xc95@ z_1{U%E6*f-j%56ODP(HHcD0OEvM(;W-)f&4?xB<#^y^+kneOdut=b!DJ?5I3oZq3cp=yR6CzbuTQ*EMZpk&B*Cq zv7-9%HT`SCzV>tVZkuh<-MyscsrRNQsSHOpnF)1g-8Y+hv~8gm*9rkoOAn(}%_%{} zN_W=On7rDsS~K*mO}D_oJ0X@fJ}+1JzYuv4dOAq`ib>q52o0A->{<`oT%?bmc&y}o z>$RLm-$Ro{=lm=-ZTl*C^J;6li_YP0E~(9L&Yk6)>$I@ul%d0@nRbL(xo4th2EJM zJohY9+T7Tk@w54Z1@C5d_S-0LfAP*pR9;icFZBAQkWl{JW%c#d)z!uOa^m;Ze13K| z`GDrFv)l6o7ZlyFn7{qB*)M~uDzmQ5+_jE-xxUZcLx(QvnqPjpMb=-PrOe#?d%5}d z?XMrdyfo$hp9g#G|1`gsEz7O0juE~8_iVp?&HtbN^}jyH|M|4}`#k%dyKnCQ`AA#Q z&@KC>-|cOp#Vcf|E#T`flv)&1KA}Ka#ZUiT{=WZr`?u$vkGBz@8vpNAcYNKir?1^cDHh0b-nz3^5)6?4wGz-IcR-6dq-BzKwffc z>W33A?AsbvsYocZ^|nMB6+f6Z^MOG{6knu;s8^$ZPK1i>Q=QM2P0`!EW zyZ756LGgNNA-~5LyGgkzhi7e2e3yUi@4B02WxJnVT^g^~-1Yh8mfsKlHH({{{`I7w zIG{yf(XYezf2C|+6Th#n#%7-Lho|ZMD=&5*YyUjq*yp1fRrhp~z640=?X@;MBi?yq zk1mUBn&Z8D?-ofPi{RURx6V@5ylRW5p@J3G?;q;|?1Z#{XqHu6?t?DeIp+QAOeZk{blmv6+*W}CqD>Wr&eWQ+BJ+20fI zDwj|0iecY8bB0Y@_k}at*OqfTW?X)|W#XmwR%g>Yv88nD|43;Q3%Q$Jq`6Cuw#WTa*7c5!tx$CTPrPyoMHwrrUdiesR zR_wCp&f-o<^s<_i(dHnby>)HD0u^PIfcfk7wHs$7+`Dct@rh3HEq+m*pv623cc+&d zt~EGQ)b&xdu8!^+yGo|M z5%%&4bc#B7W%k)wOSV|9;aYXC+HPxR^sF6eW|9+wwsyV{k!j|UZ*lp$?Boqys}!I4 zTYrWwIyp5;FYt|)n~T}3!^yAmxg4hbVcHz7wJs*eXp%_G=1vy%^jygWB9~WRtFim? z=UCjcSvPH;DcUaGAy-)Xqln#Q%bdiSsu8_=Fa44e4oQ<`|576*U-myzxcS?Vq>rS9~k~cdp<5=Z}|p%gxWvFHn5U z#IaR%%`DZQ@7}$1zkg}}#yfxR_3!_Fb@t=+|2}QLz5B5Izmxp-|NiCAcwPSV*~!0W z|NpE1U2nbrZr;3mmHjJMu6bnXUZK#Ec$mK%G#d2V+WudkY`pp2%5QHzygJL~oV~W( z`O!bgZK^WQq^@iU=gaq+l{35c=c|fcJt`5Ehm09H^Jcr>xTM0iLpU<;{I=gO_y2kt z|L5sxMeQkz+j+eUbF;Zp7W=ZePHq-`SMdE_@fug9X=GeS+CiB_}#OYmlxbl z-JI)T?JU*s_C`Pd^UsenGrfU%=S!Sh_VL@pqJ4Ap_xA7dE}R?Ss(bJClE%;1HyfR{ zQg=RZVTTT{3y=Iu3uhLm34(k^E;|^hWpjZWP|qIp4Mw8vz!QH-^{e4 zyG`<~@TynSGJ{lJrWqenXeo77xOlr#_W7s6?Nd%EDec@9dL+uWwM9Xe!+1%YOZ2qx zge|WF<6V|p{f;>5Dku1P*GbK)nSxigsKl!jJ<#wt!QHW7inr?~W1*J5)mz=;eBW=H z$#Lk8x|R|9TnCY31*RN3_IXapy|~+Y)=37hW7C|OcI4Dbw0kk!%}Vu2)SD5P$RN3D z6Gzz7y8C>;%ZejzUkaIJS@-kwdb{7B&Ym_uUi`h|$viigt;#?DEWcpP_2pCz{{mB^ zjCY#p)48+O4-cfP0Wjep9y zwsV!9*1isoX{nLX-YzzWx6NQt{Zw-A-oCns>CfI>Qqf70;D{^{+*W$FRY1Y@Syy7k zjT`IKBX=oWv7O@)`LHc`rh}(FZ>-8%M-LYr-=k)emkHeZAo954Nb2n^Teo_K-scEt zT(Ib_&ZehcS57ZYk4Y;lbjlLWocUTN*+nHpeqzYh*Fv*GO9E6;kMk4pjkPG6^-;3^WS&#->u}Vot>2}rNn>S*X2&HL-0=C`|G_9cWl&od;5N!d`k57ZCk$I z-~aoG^!vY0?*Dx=egD6#o=@{n{xj2No#XL@q>%0y|6)yrpwFg1XB9sGbTVAJK+s`T9n+LM z4|I0QFjVdEwe&ID>3hZf?V3N{JV$3b-Q3F7s;rvB(W}ijBj-sM5+xxxc-zzpg{`u+K+n>wZ%P3& zzB#<3+<=?g#*rnBA*t$Yh;^XSoMm_3hPbpHm3a5A)~TZLWkTyBrn8&W9n!Ww7Mv&e z@+PPI3Xe**4SQ@DraYG7C|8^oyW3jk+wN)pYj)+kx0tuGImU+hE?NBC?_|J~5@o*k zcWoX#d}w52v`_Q=gKMV>#2cCq2X7JM`ys)YvsYbDGHmhr2?{>5wJgr8FyS`eAF+Q@ zQ0g+d*!Rr(JJ>fboYs{6NuQlDPi*h+%Ga}9`=;4Ctrl&c8N6g`>h}0MhZec(Kb;lb zFsU^6+~G-Y8s_ms%TTYGQ%DC%krdu5p+IIVNy??_$DQ#YK9u?}Is=Qg zWpVn8saSkf{h9q$>=m!dyXmv9s%y+zxPr6g+J26%9jPHA4LX}wcg%8naDwOZj=Jld zo@p!RzP*;>5#v9X(_Gc1rTj(i5$hKV8GMWUEy;`&U|Nq->Z~Z&BcG{jjfBs}nH@`2q`QMYP6?TD} zP8}0{zO{X|?xc$AU#*v)jk#3ZnptGA|I}A)Ul(0_$EM~(Cxv;Ah`71$z4P<=^Z3a> zcAtn5nX_N2_jr?_ao8r|>uT)r%!5jg#A*DqmSXd(9nCbSnN>H|Ler zTxZI%|FGBpX0QKIUblX}{0`fMJ!~gaRiy<2R80>t9lV?O{o%vO{B}QD9OMgYo@`2Z zTJd+K@|Tm7@Bg`%|0n<7=Km+{f3W}mqF?uI=c%)s?k`_iBDdV|=rN|Q+kMZT2k)u$ zEHyE5Q*cS`@nX|nRJlz>uuo!QlmeHCT>tdk%{&H928WbJ<%rlZ(|3o2QiN{-H%d&&BK6Mu#KC>%L@170g z#?t?vPCx$mN8JBi{<}PW^X=R7<@;|N9CE!7bzA4p$4f1lhtGBQ7c!=N|FZ6F^zN7d zLkqU|zxm_;ypyl{zd3&IzpLWvH{U8L=Egj2(_GJdY4-tP>4t!Xj8$5PHCbODw!Pz_ zpmXfmarW2G5BJvnxp=m2{qx-Fzt2AXdRn>t)!(yu^%2uUXDnJ>RB2}3oH4WV>84ee z&mH1T<2e8N!!66=`x@K~KR(nIO0Rk}{p_}PhlLVb7&1LC7A=S?54W({s(@bPQ10G&$RnAw4{SZ)1ShGrO*6nKzK6lQoyy$bFFJ%X3)+00T zj0tDko^Cz(X3i?58KEqhd7WESc0`&B3;eoNcC`>t;Hs#kgY?c@KP)!+Z;(dy&xzMS~E>HN%qM~RBQ zDQRVb8#+WXnJnd|7#SIRt94fMu(UabicVee;^OI&7PC@WCq3WXo-<(%F5f4G_D`%c z>1k8S)RN>e=GeNjpQD9i_O{adCT}0kxcMm6YwGbwKW*;x?VhX0sVY(Ca9ej`U%BsQ zx0P!f_DpLPd}FjN_x845LPzx+c6|vT{bP zYX!&UcDv=TUuvAVHZ3(!@IY+n-L<->H?2FFw|B4Yo{Eo8zP@fxlylksA$LcmeBMfB zX4BX;3={J59w{ALpmRs>am~HH|^krIA<>i;7vb*2pUt_qp$2RwPv3y!u&kgx$hx4{R zoMxw#CGxH;`}W%8mfm%~c0XU-e0%ocGynge{Qv*eZ?|0eGeJ3No{h}mO#)jDn|;^+ zmC)o6)VmdS^=7x>#?G82$_8!U6VpuRYRB;T%-?FW`%wCAlZ$UU?;YLx_r!iX&zj;R zCw|U8&6ULDeAD*YmpMg(5^)R|kdsYF_Ep|9xVElxXD@y1Pm6&aV8scQ*%piD_lh)1CX(wqB+wT0TwrPSCrO^4(hsN`o0$+tauI{##Ui zqxQ?i$)Oj-ei*z@jtqV9*l5~T-6xx+Enj?kllJ$+&$sFE`~JT4x3}*5_v!1;k2V4i z+YGbHSP!|IOcgjXjm5-8UcR>A|Hc+ss{5pb(^Qp%q3>tdiO<+u6ti$bd46}}jbAtPyH_lDWFEOy z{}RWVU-i@e*!WAhvv}EZJ6<>(ne@L%KZ$SCq^T>D6`D=%9!ftDcun!ZmD6#%uQ!NH zl$mxSVy#6SFXJlH`9d4-D0n^#p6FUxe&eo8*mnu#2NGsQtJvDs=Pv9>ieTV#IUluI zuDktkg7V`@?bQ+!KVG;Pb$YFE-r9wxlD9pkmhjAqc8N&1T~%q?;G5YdxNXf@z1SlT zal5|06T5i)gHeaqDqqW>#Q_V~oKSiy{`0&ihuTrM7&GQaHImQs65Qh0T5FA3gZ2H2 zZnrHjlW<__s|+@Z-!kKfL3Y$`HNm%~6H_w}C%?A+y{_hiu+Xk1qtIK=X3cq;!MmrU z>)Vqz{=!wAE;lx$I_6(WG?&y3=_9+^S$AAYU37``7>1e!r0!Wc<=pfCOCs-W{uO;=LUSp~lOm-&2?DxmHU(G$2D|n=oZ(_icnEI;^JX)To7kM>J zzPjt0SnYDX6Zh;Ie9ZgHwUaJs6)y=&-7+#Jmg*7tL6|_{=NiG}l?& zrv497cB(2#n%4PEO4i%2U29UEF0wl4K$O$GhJ!4MfnudMjpBC}RUTFD3hVr}-m_x$ zU#^)JHZ3PCxXvp)teLBr8E;zoYfh>PSNR;cURW1UFz-NkAG3q%`RB)v9+px;HlJt&QFH$4G3;VaI86c_)3GZU1j?{=aM6|G%~W{rvy0`+pyO)<1XK^+Hs| z4ofM{9WyKTRP6izuiWm(F>`wk#xwW+y;`lmzhaA=*tP8&bLBE$O+FUwD(5<-wJJ{7 zCU)DDrPcGYD)ro!*jBOR{9r5leEFM4$cfS>=CxZ>F0&;lw;M~yX_c67zoVJ?bjeHp z-6p+>Uh}r^3%(lmJWJ1m-+k9~_mnKHpnZ>b^nCnLQThMqj{W;N)89M0sOJ9L<$gGU zXY$gEvc6B3h_mw*E`BW~D9D`9(Y57m((6O&<)@SNwHGzb+2XfJ^Gp}R_S`%6d-)H( zJiYz(U9EOeMG3x#CjJZu1vqkg5|elDygFO``}upjYb&aETH45*k9Ey|SGFtbz1~^r z7l$R84Z4D)S4R5zTr*(!@nU1H!TL9Sb68#+;#eZOl3hVD>ROjIU$L?LVULM!RYekv zFLcZt)-t-5u^is`bz^CF0`spAc17M_qMm&`_rQb0LMP_+HGbn_=kw=`AEfTojy!Y1 z#x~thKrp~}pQ-TfnY@0b4@3;lGh|49x-Lr)0W9Q$<2cJx|_YnDT=^cvJY{DK!f;JvS&l6+Ah=nC(zb z&{Cl*K9+6M^mBs+&rZ0uOfd6g0ml(dM|@BSM&5@y}HzJ;rGDb0V200HgR&sMu&NvQ4-iJx5H1re05cf z-}8OBoee4GcE3(comPB0HCCfb?8Gv|h6Wv7nN1T^&dfe#WOR0syGwB7r{4?@kNMvRU+Q$v9B91i8MI4s2o!LDpmYQ)91Hl*QrUC#jh8wO}&>lZO#gzWqE&U zYVtZixaH}uxW+p3)1Ddp9;?5f&fY9k%$0RM%<@^=ZoQ`=)<>rDc-O2wp!3k5y_#ORt3UwQ`-yDQCaf>D^9^ykFI{<(f7(-ifk@_z z?A@XVR-HauSH5HS#8lRu`?Jq;a>(DCClus$R-BcKD>e4gxu#npFaMv+Snc+qVo%M_ ztFu2>dOIY>xMf!r@0QE^zI*mjGv>el^6vWmu6wut$IbP-Z@#SXRC8;!k8XI8wSHe! zb@l%6qPtsD*T3Gi>*(X3pMJglSo2Qll31wGoV71^MNi4BbYMSL5E*lOk;j%=o652u zkLCY6EU^E1IsVH#C8I;eOP8nmEbp#tWii;$u_A3TW6O56-AglPFKjApIsdTsSzwjj zijD_Q44!DIPyQ|C`ex2di4Kh{=`JJl*E4KZ9w*5uB!)I*U(%{l@2O3ESTF z`82q?MqdeKx^P;@x=Z=7BVYN<2%83-YoW{RjEeM<7Y*UJ)7}HAVzxrk%!syBoDsG)81-2>+F}QS&IS<+baLiyCvP6$Y*)|M7W6l z!@HNydCuBj{PNWPb)5|#jGFb=m7Lk9d+^4uzmxrD@asLAyFGTAfU52x7vA*A6ExBv z%Kof3Ra~Q(y6#%Ys)|_=ZeAA;z7q7>tuguE9QUT{ALeQ4Dseqr)p3mFP}5A-nO))a z)Av{=&hdy)5mZ~hS(}yhXk>8XOzo)&Ev-|&M{ZJL@|?S3=|s~>Q^I*B-#zifyG8Zj z9*4bAO~nrs!hKAinPiFSsowM{kujUA`l|cH6uG5q%S8NneR^3GR7JI>rOo=w{>(Fa z@no0A&ELIlhc4_$DV+A(P>pX+yh&rfP;T)0*{iN?e zPSY{;Zq`s$Ui72U@%B0Yyr=emM_#U;KL7vC_AOvk5X9%g>v_;CVYYQ^-L=V@m<6=A_=7pox}|NHm+TW+MgWq2}{^6Bq=CtNe z@hNhbO}_2k+H0}jcJiIKJ-d%xOWFJRLPy2Fwf+BZ-M_4FSN(PUzoYv5Dn6f3vwZ0o zFx%zZ6`^+#;&%0gU}?M{oG_N>5cY1W2Dp;a8mlB#a(?3J***YS6sZFSj> zm#=rN`+ojih--Pbp7km<8M%xpt*7~Jy_z*U+Fwa2_Eb*F3R?!9?lrtC8P0s&a+{H@ zSm=eV^^TJ7mpQ&?bgTWnuQi2Xfy;qCCl+LW3wtb;xF|$3PVr{c$Mv5!U-jZ^H!+t^ z&bb?uogtSt(aid&vn%88DK_U8n;PnK-&nGieZitg>Ga%}AB4(O`X{$2>o$KjGT1&v zuF3UEX@5!j`M@-r z@cOP*JBnVGG&V4D%{XqBllh3}{bz-y<<}}Nb#dig>{{8rLPN0ca^>!v#1*V zkkX9A#a$5-jou5m&04nPXVaNun(G!Hm0~=b|CjIf32t*=fpxm>E>XRlbMy+=o^ufm zb)7Wnp~=yVy;)6nCSR_)8{oLSU(xK4%HC^t&zxQJ{qp0FdvaItIt5(%c;W8!t+D5B zKabyc(@jVBc7xWZ&2e8iSm&Hzh-^MvIp4+LO_lN?U4@N7Q#W=52;_P8oDQsfI^}E_ zZ{Xs)c5|AxD!#vXx32v66Te$cM;5jGp8eNXK6?ATkG_t zLyoTw-~N2~aOL)Q@AAYO(&Jn#&z04DuBg6zt@%K5Z2tDgPcQq&+sbVJq;b+*lwS|L(h94Zd44U3P3f{P)gu z*{!BQH;%a3%kbI%IaqG@`_a|)b$=DEN~l{)Mtxbrpm=EM*12iFTzBl=z2!-7Rgd5* zqv=6?-VYiLZDc&Bd#|u;|805pThQhw^H18xG`Gxgz4~@y$=#p#Yf~NsRmM-=k~rh( z{)}65l-@2f4zsH6>`|1p`>PSzyJ}hg+dE#KR=%qyhR5=IhPAdEPEnZAI%UFi!wH}A z1b6p5Ogx~`xwj$j@MRg<&2vt#JYBbZ_uLy9=D)wb+i-9FB+;Wf4lk`M(M5<_V zzT3weJaNXEJo${*NrL?O=H=Ymr+zy4`EYoCUfe#bdF+#JWGm0qSok3C>S4dN+f(n( z{JHx0X^XkjmTli|U4HxhEWy7^bC=gynB>GVF16nq|Ned6zKWke3QPhG%g;|K@cF^i zCtxv4W9l{cLl=H3Sl;$)it87h%oC{5rta}@N6$IY*NZ$XnU;FVo%{JbMc{n4)aUmr z=PPlfdY;-8-ZP^qN9DE6v6R^^Q;wB>YxsJzZ8wL6%-v1XcmGNgJ(wcZm1-`|$#tE- zRI4>2`u5wfT&Z`;tIF^0%1_?0bKspFol!{-elwOTE2 z1g8Xqw(gv|oSpG=*4|$m*6yyHQJF1uSh*&1*0XN!;HsRv=W0v11I|uf7B{6g^74`! z>9^FUFVPm+7%eSfSF=C*nrqIFk0w!%Z`j=Nycnaql;MQ&F~JvNmmTwO35zHk{Igfd z=+0W_DbpO+_TKH0JIu6nM@9P@)mWc(!GD|fN(jDG?lJi}EBTyKb?Ei5xj$R%R`H#= zKe-2VPogB-ezR2veCFsCCN~tQPjsvaa#{0bms8AR-PhkY80=f4rO;YjUE3N{ROw(C z@6vlNM~dOf38mLx|NK&|6_GSPu&_ zV?HP}&&(6aR8nl3^rE}%{7gfJ^)6dgyi_I_URHdi{lr1fep`lOv#IWi>$c^!Q+ID> z)tBN;zUdA`ukXUod^l@9eh47hg1W1;We zn!s4Gv-v8AUfgwepRukzV|(IU7T3dlAO3FN|MTMARqNyCRz|$p<-#4iHg3ncomt<6 z7th;k?`5<-!&+Y6uI~MZ?f>7&@BRMh+u7&yS54^q_wCJL=N%6m&+d44p`-As2Zs&I zl80ZOt-k!S;>GUI)Acpi-@2S$^!ZQ?=Z>UoySg8L`Rm{J@BhBM{@ZE$zbDtH+`QRv zAQertS|+j2Fv@%0Ojqs(_} zPc}O@be&)kIFmc0sy}MSLaoKOn`2F0pHu6R5X|(_XjnF(b60NjgI%x6Zb{s@|0Y)K z^|I5vD%;*ZeYfCYa%SQGl^Gw_pZ#z`1ZL( zC0|FDR$t|{D|aL;l=0d9^~RhIwU{0EblCT1?n;qAbxlU7S!tE8bIYz`lXDL$wIy5B6f_z8-+CklG)%brYWi7yX`Nj=E4M5=bF*}DrG({+5`NbdpJ=ml za%OWpQ0qT zy|lbJVD6bkdxW3wTP*}?%V zYdv?&{&{!d-FMT&^MAiSeyV5oQjRuB&(O&0&t6`bb}VJZwL^D#oit zfBkEv+|1h7f-jN}EY!U1|5^0A0&m3DOzu$C8zy(Rx=LR!jlAv}TJ^qCzJNzC@7C2N zx(cc_4GC`MD;DW;MipL6-M(tu=dwoSJD;*brzYL6cGEIQw3VTEZEIyv+{8yKRTL)#2q^hRXZ@PQ5`OiIPF3fM%9l$na?j41U1&XvFGXv@ zk_bk@i3P54pIstagHM(om>0f;O zw1StDTmSX-ef-CZPZ^&!Y6umXbYayWr%kE9{!jdx?mId6WU0coX}|5%mGFh~oc4ex)a?D*;ccnk)a`TTXS;6I(T})=@G%+{|urOY!Sp9Co zWpkG~o44y@=<-gjH1=gUu9zcuEQM|xKG&WG#V7@byp+Msdh`77xs zK}{azQeM+0867t@)Q)0b^73JcgIrGXrxAW%T54iO+vAVdt{(ps>*?tS< zGsS)OW#ennr9!?vssjBvTuO2{8|y1Y4@Jr2@Gn zKXHj`P3+BcTW~8RGHTtP{fr%(b{8M{c;U>V^E*R)A{9^VnNxgATyTNYR34Lq3ttw- zPE&h#r|kB&xmw+32X?o+`id`0({XiXdeX<5W$3Onht)WJ@u~|Gm>NtzzFQ#?Q(C#x zR7vB(E5JI%~3Mc5miZ4u#md;>-&Y4|-O`HAM!mwND822vce)`H~|(S5AzH zXNxOKPr<4gmG2FC#0=O&-DYu#a|t+^r3QPx^>>PS`8z-GtX%U>lb_lz{8RVMp8d7N zqUWCNBH1rDFJIQGxnp)E>U!NhwXG zy-QdU+5har;!}rGHVdEF`>Lbi+*3AJ1D)(oDkj`ZJLW366q&5fy__RA`PDRCf~Ug!eoR?%_ScogF~5bR*Iw%1 z9KUA$%)6>x89}?RE87T&O>;C_XWiYnYfDSOwznVU|6Bx}>QX1)AOGuyzVx~0$G7)? z`*DGn;V$p)-k(7?wi~I;n#xl0$#ZkOvQlZ>&s7RMBE@PBv9s1`EBt<%G~K;X-osYT zApPn>rv3F_U!MO}DSjyDNvVdL>UxEcy2ngQR@rIS`R=`-miy)O_I)3}?Eh!~_h9+H zj}H&ueO+8Gf2}Nfx{_4mg=;oV(>wC6xhtI(nRsnMQE~OJAK`Wr+m7%4z3=<&3AY~` zUt|;daGCx5{-3XZJ;|1@eQsX=wSE8R)934c{_6JMZ?o=W?|OSnT?K~78zt2>UvHj| zyMMob?QyfD_i{@_Yr1AgmvGhSHKim9`Dp%VIj1ThY<>ET*!57$$yu|$8yJ4`(X&iD zQWG=D^CJa|>_jt=jF z%PLxXC%0ES|8w26a*JsRr(jOL-T#mM^7n0PzP;SN?bzke+AY)P+th!2bW`81_Uq5- z@2{yXx)c&$SMmEJyTAR<7cXBjwCVWXIvW+89dg5@T&k%nC{%OWWIINFHiw)whYvYz zIe2I{@8^A$)@^!048E6I?=Lpn>dGmXIdg(-=(OLH_M7PZYP-0wE7di)#Y1?S_ms;O)%@9boWHHD zym-`hZrG7phk$R~ndvimjWj1reCFUeaTSNW$VI83+2`YyUp299Te#SQPvv%nBc9$ErX}6rO zb?c>0^qbP6by{{+#FTno?bRv!j!N8{#USy{Q>$<@;|9;{(#xOpmoj;HYkEsNYrH;G zdVSrdNc~)+xr=;vW<<|6OBEIrYza=yWLns@`{14T`un~wDtCSR`P7bvz0vP&*QA_V z#l!!aFSWpBhY+vl1V)=1UAy_Ve_gQHdcmy{>wcGP#*EMo`ZtCED+8YV20Y++u|-eJM?&hXHg zNgPteF_Rh17WapE2B`80zuvZDO<>5PmPNX!j%~WOb;UUg>w3Fki=d3eUnujjkYM^v_>6IRlM}Y$R*)yb`Ep0R8UwvsZ z+jox7tIoM~g=)4KR4!KX;r4CYxx(p-xPAR!@%oSD`R~tJ{*JvqC4~Ltip5i1u4~;n z6uj4UwP;0Uv(ay{%UX9-h39oV@3|?+=Q~YCX=S4-kN@Kh6HE?epLRMW;U^fiVM|}k zwXYlUe&2GFmy2+no%Jk1m!p5zmd9szt?Q2568ihy?Q3TXZXVlrzxQHry4-=gcc0em zx3B+rL^l8ao&9yS;W})i*nb$y~Qjb~`Dv#nt`!@DZ8so$Z`G`m5V zqhD^?$^NOlsYxae0|hw+k{7I5~+`_3$Fz2Bt%QZRXiq3vIZ|$G$aD zIVsaOB;&>J1rKU&9{yWWY|y>^z1(@`_-o$v(fR#i z^~9TZ4lWb=JkzCxSJ?L@qfSkdjPSk_Y&JzzF-Chi&xlQ)*f8_GT>I9w-McEyPs{0t z=cOF=ev)9!F2dJh!ROn@ZmIY7+lD!Q+OBf)zaJ~}AOH5`*$cV%a^H8i@0&gKjz#G9 z6*qTj3Hz_v#~;djq}0<@ZPTI%CktJp?1>h4VnU}K+qQz`66>`+EW&A=J0iorhCZF` zzfRa=Ml|1#Nix%=o~}O-D}Z-)1}K{9fy5 z?@4tG`=SF6HJFq>z4IkXWz(NMpHn8BI4gQpt*yU-LoAZxrSi9T$_vkS2Dr5Na5S9! zIcr6H)90sG**cj7K4qybnl5}u>iDzM(^Tf9nhKor?CtrmBs~0lwAZDkY8jSNwv|Fh zj?Ot+d~W6AzZ!jlfwj_`Vm<#w9Mm=yS)VL%Ic;%6q{tGn*6Q@56GT3*Y}B#lJF|=B zv9N`n6D5l+kMYZSdF2YFFj!ih zUZ(EeYN)Lp*5G-r^4=1Ym9st;g>^SF>3p&_OWcrScWIUJ>WpdU?F;|@w7gYtyrnlJ zBe`S6^@OxX>7S=Ri(cD)glk>LN%l2@L1)-RoFcneraX20*T_`d@oHTmud(Q|nz;Qu zw=(0Se7CMT@OH}S zyHb!%)uE|ht6p3`wpSo!<&hchT|GV*Mm(8H& z=0C3S$JKl`H{V_V_1AKH^^G+j45u?Eec5fkzW&>@x4Y|J7T(O^nbGcQ6whrxH`ifm z&&m=h*6H2t)-hAkrfq78Ib-gAsM0vyI{w+V8GaT8@~eWba5P3o?9xc_7GI{7w{1%p z>yPl7>QBn5&Ss95i^TR!iZHobE;H$@_gz)~^b2j9HI;NOOft<~S;oa3&yxJ3(`i+{ z-tnn19G@?;a%@(s`SoT;?6HqGA2vT<{`TX?k2U_gg67#pXMX&0!LF*Xrf5<}VMWoI z6~{_bvxQAgC1g$!}4@geUW!OS-3&A??K0mGrbl@XL8Ct zHcwcaU%TC|X2wrDm#wCuUPU@Kb1UC^U0mDZ+A9%U8AXXUvGS(60>fO7?3@o;1^Vb*I7ghA017{@9AdE}DEo&m!RTY^{0eEb|T(#hKP7 zT+TYct*gUepIII06*_fJyMFJQbw{^{T=L-9^GSp=$nyB&o9!xX3z-6HeqBf{O<PVLIL%#K)N*SP}81Aj5q5(~6vvx3jtzXxVOab#W0D zyL8tv?n?X5duMfoHO~I|xaa%c*{*5#Pdr@Hp-}tO;YrVoj)s8QOa{hFSC|E6F3QpF zOwIlM?B9;cQ?VIk;TqDI|r)@Kdy{>vS zfl^MB<rM%6oM`pk<6@SM9fKjig#&RH7eorVGp&+2E|GaoT|cuFw&sm|KAAGVRU^0UvZ z_f|X|&bN7TW&ayjt()Fo7O+YMPZpDTw``#$3-cb`Dw{QCYx+0lM`!PnxwglAe%-HE z_y69k|95kF{HCp!KVIST)@^C+;)*ykL;mT83Cmubtm&Ck&?Kbm@5+=mXSYI&;1bu` zt2-Ynt&KN$y=zayTF(lt^D2hZx2^DsoFdo1`X_^uYS+qEPpOU-E)A=GHcUTkG-v&N zyE)tWir(Md)mgw3eNAmi|BeXz|Bp^jR12~^^hKfgq><3#mUhWqtQ_q#X8SxgW#5*^ z|NM0D(~l)w5AXecq0CS&FV^mQds2%(V^iCr4Kq8vTDr3oo)vwv;#;*U$ZUa8rF^AP zu*UQy7a5Lvu3aq@%5w1T+2BWWWZqw~@@}zw_)bX2`PrWOpSKskxIAM42ZxHq?9Vf` zwZsJrx;N>aV(huXocymWry9%ww+Am+zmTt(*?{P_YTC*HKx52!+0-@`d3-{LV$=Tidpdc#b$;XA?1vaz9%33aQ4eb?v znlMeuha>Hg{K?MMcHj1T&KHj_b({A+(f z^Z$DD^5G6W-xXX&^Xy~u@}-!3Z>aLI_ddwm*K6q3m+E-tp{2z2s|T89XsL%joyr`# zcmD1~rX0!HP9j=1I#o6+R_$O7J)`66b|_h;|H@+1SQqiccQem%oEN!vSl7UfQEam2 z^nb2zB=ei)O8AX~Q?qrKd#SWpwq7f|`71B;{S0TRu8gn=$Cqt4Z$G@SH*asblHc;F zR=+qtFL~SW^{r-t#{r>ekx38lwcFd|Ri9T)E4r8anm@T`Vt2#ErkG zU+z~pwC2caM~z+5&u{m<;XM)bG%eQ7FkY#8{ja!Ejc2l6i$Zdzcl>Z2>HrDC-1{H)ObYDJ3A9CvwK{Hngo>@C~! z#V1&_U(ZbSHhTQThwF3s)x@=}6N0W@3HcVT8j^AHtL#h>!Grzplc4w{9q6gvks+;tRWrU5DJv=U+{VLerDoVi!(YkPl?4KH*k2fB?e`1|m{y*u7rpXk^O-FB&WnKx1#yKhZ$G_W_xJJp zy63O?apJjn-*J)N1U04jmwyFp zWbFSvGtZxIv%B(B#ERVy{_N=8%U$rh&as4i z{{M?%%B34DlTzk4X{}UhUs^i3g>xyQab^%$Yy?a(mnB*}H3bX0PQ^%6OKy z&^1;hcan?R_kvkV{!1U`of5Tk=DUIuRp#BoPYSB!_H|53=e&H=c>NwP=EO9;nR`E< z3coRP=SwM{=2Z;S*VqTTmSt7XEMCSjEkamCjaO-NaoH);BQqMO77MM=%6+y}Tb%L4 z-9?jroL0%XZt=KlhDE2P!NfT&G0t^y44MswyN%P|Rj&$&syHc{#BzGQX_MxAPphd+ z2V!RS?0GtK#UhKhnZIjGkDuHfE42L%537D!=!!5)3x1b|kPEiIIx;pX2x)rH3pX;= z&=m@4zfsUUJ$GS1>-Oc(8Un5@UE95)%ev>H`^77p_2ijX6_oFipHg?_@WNd2-5lHB z{Wfdh*!11-Sc-h=-&8?C&xw6T&y=49t?h70aEk6e@S;u*ukY`hrm=I9p|_&q ziqlH(I(R3YI^ZD<& zI=;7q;!4{ezmiK9^1O4DdC}4ZDl>1%EBY-jv(ZW0vHQM`Z*K64rxJ&6FLIPTtbaS; z?sV2wHfvumaQi4UXA#E>C8u4EAU=!W&o>6sP0_TMICz-Jl4KF6uG~;vZ=@L&a*q} zr)upVhY9@HXe|zs)439DbGj!t?uS z3%M}e0!&_*TA;-YHSTgDij2=d*^*pDW_6$Ic{Ct)3lQv+1;~+_c$}Jx6w( zn*8|Jmoi(ET&K{pr_`FXUWiRUTedk*(Wz9&*HtMuh%w_`W&e|Xg>4UW0)?kEaxI>f z$#EnpL{P-?z~M_zo^6mRdRp@1PJVNuUE4yf>oI+fb3g6TiCyA(O~z|$fwA=DpjUEA zcWgC-8yjvOVBxy_(qAcOhiiw|do!Nry4PnqO*!neUbk@a<6YZyrXF(Ney@GY(*;X@ zcU*9L?-vv%dn~typ=i(i!x81%AI8r7u-b&@Gl%?1pM7}`PqRcd-!rM29Qi-io$Ff8SS{ws3Of62~lSpS(ox_5UIR!nQ7e(J^?4Dm-^Fw91Q9A@r&P+ZnyJk z(bk_mLKA+!dOYjFlPPw`{@+ht(;X5TTX?x^@x-f@mo6S+p2)&`XwS6ese9(`&9uu^ zd|;>X=xUBi>jp72vBOZ?7hVesxKm zz~d^o#7IHsxW$4yN0O#J3j9}M?99-3VGm2IerWMzjvIeI8NIK#w!o-9$HQsDj1?K% zCQUJlJ78KKW_{SoTKIy_f~_;M*OZ$G`_>+CnqYZ9zc%8T*qxh`3UzulZYGX7G81#E`ZSRg+7%tq9`P7I%hVj@Ohqr5Z4>s)fpX)wX z?c92?pPy=@Y(u|tol%}uZ?|cty0Gf!A_<+WxVgWW*q2t_?Gor*V9~tc;`#hIyQ}rT z;{QE+`SR@feKo)H|Nl|Ht#|sN#6v});Ge5C{e1$2CR_Gvm+s%UVYauEn4;mg`+xVw z$BWl|TkQY-z5d?QWo5!M+^=xN6_shMc@tplH!(}+()|QAH^tVY%Q6pr-66E7_v@oA zH$S{hEZ($L)_~>kfzTQriRKo$nh$SxpMIRWMSA^>Df+`rg?!%sXc!Ep+(Sz4QC&RGXMzFU~czYZqGSe!8&t_RE)x+EYa@ zZr#axcZUWC5BH>8RKT=K9>J$y8#oNzuHKC+7V%xiRzR#Ozj z#h#~%tv4o_#t80OZm{O3gu{f3-wXeLd-(5dZT6+@6Mw$0$YI`cdEIHDr_Kq6Zn-~n z=1k#uekmj^Nz5sH)d6Ll=!)%j26J*wzj|13TgI@8-+ZE!sE)7r(ykdZPdJ^L9sc|8 z-=CY_20BW|edg#a*u2*?c8{Q4+w$u89~s@#!e`8$+ST59yHE4iNk(7KG6p85X|iP} z3s-bL*P7kI$mj1>$=0~aucas8lKRHiucl2^R1C1bW;|cbBDiX~PnpwagYPM#J%S>K zjP$Pw`7PX0z57w2;mzZmW>049N|TBV_4w)?6sdD?%l8GPMN>a*d8WSBOk=s5VZGh+ z{aty%H_pw;JIQmmc#^Q<%oOFK%U*S%J~=E;e~Bu%%>3QE`FKUVtzy*b)^&?EZ%K~( z{VO7^QEAutQ^K6Ry)K-;UmRZaTjVj{>6xCh94aczXYm$Wu6fmXFE{qqq=Oxg!X6yj zWOm`qpASpsw$0Oj95`{BZFSy(`n4O?|(rmglk|9o%% zM2US9RvtR-*wVFaY3HFf*9Er)Cf4%IoIHO`*|7~K&x9^A{nFm-r=ue-yFz(`%=Fo_ zFFQ*G1RUESGQW4?tY2;mx2gGNGjl~sdwsHUP5pMH)p17Ux9E2Zx%iJu_=@=j39X-d zWb5HGO>Uwrp|?I>xbyw9S<%hzU@uDxe%I7O#yzHeYsG6h!xy?K%D0}_dwo&5{|nQF z;w}+EwX1lN3_fn=;md9gv|KikDQzcf+i#D#YpzJ>%s##5N#|>m*&dR5&JEh%3#RQn z;dsC0xd&%d-HXiiCYzR-mcQBk&XZU5;I$n(mqe=N`@i#V-*b2C{}=i7-!{kBybH4H z6!?be!7s;_S-_w|56@)1TRY`O8YK1G`r2e9!8+ zTlZ+vqzTpLp?81FU7WU+v$W^jtjjC{-9~)58pl6unbq~lZ&GUR%ST&sA77n)egBU) zXAd9VCnq+EY0dJM4?eCv3J+P1=*k@2=J9azrJ%;$I;X25^l!g&$<$rqb8(5p`<1K+g{K=vFWl)Hm7q>hmVk5_q#p0jB3i~S07v^@>kI#K-F+ZOx(<0 z7nsgY@HAnX%n`}qaCgy~v&x4KtvaxB)#oZ@=Lyn}KYh9|^Sf~_Cl+jo0g|Mu_Cuk-)rh%~?zO$HidnJ6@L1pP-0z2` zF7V21;AWk8Alo72%$#S7oEEN{_3-L$_spcbif7y1lQr6ZK7K54)gU>teEQOjd*0V~ z9eCH*abm7wTJsuLyO&w9b2c0OI-4|$v874)t(JiLOXbEp$+Mcf*DU%m@2`l~t9NPB zrfc6hd#rNuU8e(X%^P&Be%sDUetq=mna|CcL3R_L*Ze%Oe0rH>>Pky@^*|T)Fn)iQ zIgFx~vL&(8QU!(5R>&nLm`lqgPw7}_s^=XYrQP5^HQ_`_@|h@ut7+3tdlxxhoBBpL zO^)xPz{8gtWcalkYwvrwUQXOG=XhT0kuYc5=qIID4<|R76ekfgE7$n--DIBxD zobAOv*V6=*>FkXxn8N_9EfgEtYf}eb z6kT`iU~(5u(alQ}SaUS)XUyd56U@CXf9K+8+4H}SVZFPF^^QlMo;>zaeNmJ9^JkY{ zu<@jn@@ap~ExvzWHsMp%8|DYqT**N$S+Y5bm3t1gyHL3- z{rCOX)!K8M|NqhXf6M>>@xNzt?`6@f?wC`LRhQj!)i@_LH*LDr#jjlJdN{r>>pk#z z_wL{2(f5;oaO@QN_xIGxDP|9CCOG6?^=b%Pd8X1J#K_rISZ}q>{|6^GPd}e~n9LNS zuu~*+&9&Jo%@de%Eo86P?aWEO{cU5vhobt5T_&G*d?~#7yKH0ak1` zB@7c&7P0J+5NRw-WB1E){K{eU_Ti@6-itrw$Zg){xwy0D^Sg;Hx43E#m9&aYTJ-Rl z;9h<`?|mocTrZC@SZIW# z-3Z^X&@@s^#`jv8#O;sUY;EPmdLMUvep*v(Q}^ZMWq!LIiWkFF538!QItfpoce%1j zM}6z6^;-|!aC!B6=l%P4?QQ0L&)wndYO_Jl_qOBFz41BWmO2hhxtxuiI=Oky0!F^` z=Za)a%4bmJxn^DTY_nc&)E>?BkIF9Ew>w6!fBNaP z%eIYPQFotuWu?W5J?A;l&iK$a$HBGeyy~fQ)B1Kk+}+X5IiGD}Ez7g2`8E;@7ie_< zmGXJ!Xu11rQq$FIZ61M(RA(M7V$D_lpW~Wc(RC;2r13}fC63$@i+Bu{$(d+)5FmJ&}1b$Oe0c9Mpd=dMr@TN26fR6B+5_2n4BuXC4tx-iv0ZmQ!|{!&*} z=h(20iQDzwK0b1H<~a#FZ!3k)!Vd|;qM0uxp>Jixw5VbhwxUSI zSzbGWo7}f;yU|hpy}Hcosj~3VD<;N*YS)V9CWLk7EL*#BRV0rw%dZWofeXLveJ@s- zXVWC-q;+xHHa%{ooE_0UhDuE)ZtLE1Z;Du^wJRfV=9F2d^-6PB^-eOo!Z*LQ@5IZJ z9WmSXeJx;L^nSuiFSi9-)w;!WbsArH7;MhV%R5{x|8Ps9*__bnPejhPcAey1qY=ld zbZD;^`*)RV2X!yHHwfgu&N5S4wDsBbYW^A3x|b(0`Lvb@E)dK15n0f|uVbG5tYSjs z4=$x1H=V6>H!=vHxwgE=ghObpp^WSH5H_ZBCi?6C8L8@pnw*|1{nPkiMsy34$4v>rQ>={AY7OtNopre|t83euJ1$qx{jR(ndi&|cx<8NO@9eeJ zKdyY|u!~sF+Vm>r7O(RBmtix+onrOv%#*O!5$ERIVY=;gkH*Zh(=a1i4C!?lfJ$J)373rO8{F&!zaD>x__+DvB`;$ujP?{_E2wD zUtKu6icn^6%;qDnnO8oDURrf&O2@BmMUnE!FLNjGbl3EWO?hP_yKbp2!(nC1dbxYM zqZfSNSl;b9*YDOdgY!$|lwDMn+N#sSBX{Q4ZkJ>1yijVX`|Huovl|Ov>UFPcPtCdZ zeczn0%@+4$j-}mFIdQt|CI8=#8{Z4AzyGDZcFpQzw?999S0q{c=33vDTK?>Lzcq>u zuKv9tYImhYhQhCRi+8836_{AnC)4$m@74|Ht&BGgCz^PBC7p}fROzGSvo`lsn~Q7I zx;&R#%FnDWN(EGBo|$ySGIQr<_1R54%f5H_PW;kXqHrpDf9$s-J0^XZzvlS4+mv9|uq+)r|)6QX8J z-Iti*o6q-l!-^F>?-ZB|ZyqbizH%@3yQ7!zDv!yR_9`fvccT;q2dY z=Jq}8{PxWGO54{9*S6X1wB@|GeIt7t@9TTb(faG=oI7$WgA^&w<~`=Q*QmNkzA z?acL_cNQ;E*)z}IEF-T3;2- z@G8x`_LXzmHRVo@iC3JSUE2Mm_3H5nO}Duoc!u9~id<*oXr*nfZewxt9LJNIIZc}$ zo^C%>G|TtMPp=JKGvb$ini{{+U*yR&XTR0XGu=}U<^IeLt=(lSwk&LBTPw@cdC?6I z+g^KrI(cE8_gwp^h>5RkOGGt$wLSFIq+Sb8T|G1W>dch^zNO)^hBG;C+tgowsdNAS zidjd(W*+mnqi?Y>#LwwY4PWKMOVXK>=1=@}J!B`Bjd`fgk*Rt3QmgDT=jT1TW#bsrnLU) z<=pNQy0uk-i(IB@4%?)HG~9%gK>Ha_2bTJ(~W z!)zn(NX@VNI~o*y!sR$p11-0eMcjUQbFIU+#()7-0dZs#_va=EbgPRO3Jz;5ML6g>}HC(TfF znZlGIJij8f;>kJ_$4b+VeeAKTIL})KzFY3%VsLq(>lU?wSC_6$T|FuB^rA}=dRLe) z+3ZYkXS^)wwqsp}!1l!t!uS1rQ}UsF{hMbe&wfsK4}5VcC0B7)bQRM{5zi@qrC8MX zLTBC(TK-*dQccG8w?&l|1yP6XsXR%~IZ0vA;cIl2(zKZSH3C&rb9SU<#b31t?f6_BrvD>SX zW0eONU&Q;J)0h^rY>aeDKiQ(>xcJ}E6-T%nTu)uFK3+6W-iaYXv(Z3R&0|S6kN+=+ z$1&aWKJ5Eh!)5w!_NzOqER&*Eai;&6r*M0X^`lq+B{i604{?T`J&--r+E3zzP42mu9vY_)x~UeZN?hHt&XH?G{t{ z=cvmwMT$?R=FHsIx@K*Xl9%~;PrK*0tOK_kGu*Il?WB_fPO1iuWj6rwSWGV}$-CCmAlF_SlRsGq{F156WGJ!eM-`@Ou zn7{tV>-_tFkDj-$W{*6a+@bvSV9)CbI!SuVy+16fN{>m5y((tV)_rNY_4L^GXIItI z-%n`W9cn5oy7cfJLFK7(la2DiE^9p8vZE^g;Pa;^Ey9mF#hfhmOg^*nN%f{f;RY}M z^xvG$b(ZPF9OrcTRY57a{T|D2Fzia4kss|UP;9<^+0Me&spqmRrnHGHTUeRA#`@*) z*G_v3}{wngWN#YlyHyeGH)-mHB; zet0f!`1IuF+2!`tUw`gCZaBjsDa7#~d-%S2?WIo;R_3hEvFy z;*zB&WzN5SaW&Stlqv*$&5{Mi=N=> z70qmc6Xo8$Td6gZW%bJAdlsp*n28!OFKRK4YItW*!7)pV@RV9~;f*Zl+JX4(IO>{THx*-c8R=nQ7bf&em2)tUUZ^)7L%QV|6l@G+Asbi!%Lr zn`6oIo}HX6BFp=O4(=9CZofLc)&1gofjX-#{q_|_Rys^v8`fy`mW71g%m01%@w-bp z6Xx7nbKmu-@+_}lOWA(kERuI=Fa$&f|X%g`N~hAKojWdE!`Q+3y2i z0#}?%R0=z4_V?7*UB~zoMU$om2q&G)t?1l!X0Ki5{!>ZbqF)R@U;drrHSPnViq$I=_Hj2QudOO03(Rq55^v(QEqL+hp2OPR==R@qVKC?Q`k8h98e_ z$y&4{@|2F2^UpPR)52zK@QATyP+Rd_cq6yU;f#H|-|&BOR+OHU-6`D=aPVZ+%)L(M zEQ(X&&1EXTHb_-%df;&7ii?Pe$-^2H(n6nzyu=r_8wP^KzZ;>b>xN#s3qppKr|R;(B^sF>=zT!0%Q& zZ(naNJ<7AHl$-tN3;y~)hx6-ROY85i`TFd5{pZX6^X~rnC|~pchs)bP0vtNt?~iS( zf8T!p@6`DJVfX*f2VEZQHT~<&%ZDf5UTkJJ$NZq8i{h7udPfR;YIe%SF1n<-YRb3C z{_+1meLbwM?|1O{rh6;YW?i4?AasH?V5;lscQX%}eLub3Ew@vI`O8*L*55yi>OOy~ z*pAv~+>-6r=sWN=(ZGTUxpRaqqeP3y{Ma_?`prw>& z>;M1%c|HH$+)`UMQ=3Kk2kN3qVyD0RyNB0na_Usq;;0R4e5KAm_dVpSWl^<&|8`T} z&ep97!41Bm2_8DD=jHJqS2vHb(3ug?)Gu&qQ^%T1d^y|_9gb`ZCO)w7+3?*wf8U?m z^Y{IGy1TtQ|JdDR`IBD#F7J(Oj_cGg?c8L!Xj@8KWRBUlJfn(;QwQ#@Td%f}C1t0d zQplwKuvJ%08hvhaFLjX$a*?z?=MpQrj6Ek}*_B5!+_p}|?A3Qqc`4qMHeRsvsO7qa z%jz_1r4Wwm@(t2v{I&uQILA33-W zKK%Bqp)PCn3#VA=>8)!Wr>u1}+V5!^c6GkcgbMkYvM2r;Uww1o;)&A8X^$7qH$kbD4{Z|(xDm4A0&9+E%%tSS zzZ+RL#LL~7p_g10b4clq;jWwe-rwGErgEW+Uw_EacF|kYvR=fzm9VUw6`PtCG&8q( z3BPQ{#CQ8Rn_W8>Ost-$qI9YITu)QX0`)y%8xsOn1hVmL-lyf{cj#2y%)(9A)?ErZ zb7k_r=@XOtzc286YvAB8!GvQOZ`Gwvr9DSwidP%6k zGpqS0I|QY*@RT3EdPHQ=^-rqvmmH~CC&yWyV(#ke(RV^MSWZoZwf(sd=fN%Ir*+h| zuITiAnqbVuAe@pYdwolKUh$sE+@34HB<{R*p1r-$$C{ZO&wdPDJ! z^38c}YPb2Tw{z%eU2d6w&3#7d&Mt=yIr_@m zJD4U0B%EUt^jN#xTJN@kZLQFj33t{wEjhJj%?*~*TJQGFKE6S2-rxSpj-quP%(B_p z?=&Blif$FOWn!o4-Te^mg}^alwIjPy>D+_x!wE2IkD50%iG1zv*)&2lm68H zq45H-e$ImudArqhERX(ARpn0Etq_`GVEcY)*UdM3UUMrRb9nD5rk!P&{&wo=?z>Gt zmt8ucvu1hP&d7+J_7(yGp-T;ZJbU~1{@)*;fA8MRbvM_sx~%xeE%)>D?%dn6`@Y@Z zH(#%@D=+b^kZ{XBmC*I<)4mz5GoG5xTvE3ym4}nX_RivMo6@}H_;&YQ_L%T2pj@kc zCd*{8H*$+_uiIwEIelOG)kAFV@-r@1gl#b5U};fj=hLeB_T|Ude!CwZpML(F${+5S z5Ib#Y7<FQ_-79+6buZEpac;SGSysR`T>o$S|9|59_gubxyFfDU=ZfO3 z6FVe$P9llG56_-Cd*{@* z2`O(MB`~br>Jzv%WwF!@&+RidznOVq;i`u_`{vA({=I2}$EO&tEUyHS%!lG)Y6{JI zS{->muj%iO-?p)w`-DVtk3l(Cjf;ZP^z&{iojX=$Bws8#d$#8GZmt{&rE8^?MOJn@ zZ9Q)6_)->gEj{aZhOgi9r<>kZ->)pbasHTi&js`Ex0lD;^fl<^+P{~zN_rz+|8q_4 zckB52vdh0xW&GR4{rUcX%(wr&TfSB>*O${^Qt}hQQ)UhaGjsbk$i?h@TP7K&q+h-& z&EE2ii;2=tPs73qCr@ZB^k$qh)#~oFYb^%uJl;61C`Ekdc z`|*0eGj;`7?s5(Z-F9|cZOQQsI$q3zVmJ34a%=K=@5A7!CzLCCqJNrqFQw_{Fm;PVHO~Sj3vxApBd;^{1%iq)&&q*B@o{s9LO&^-%Bq z*Z1#)XPij=>~Lwmt>U&5-E;TPa9Q>>@=B=k)b|^&th{;HwUK9OMX#2ux{Og}pTeTD z{tvZH=PD;#OHA9!khwEzZI|j1l^nMuUnld~$)_WiJ=@Wp(&Ec;^WjaC*U$*Gu>-;T}?ALnjV^- zK4CZWB0m4veGDPXgM>nNEz)z{@x(97XNN$Azs>AtF)D{2o?%@n#t`~S(kjU--D{_D zyP0PE#D@0e{vEs1uM5jrgDM2=_kL zT7QmYF3V-C^3N>%Ub$>oV_eLx6f{M9iMW%UWomKzJr{LVwfS5oBuyE*!c7Lx-UNuAD+AF)=wWLs|zhEvs?1FpO63d@qOL%<^O-`*Z=sv z|LfuVf4}zI*J?+{xZOVMS(h!2&VF0?x&G(=f5+?p zxbJ7pdarDMI^^ON7sn8Ri!LF}Oun`fP8_0{-2wtjb#yPpxi6|KYFy@#N;@-@o6U|Nl1r@74JKFRtEg zF5kPi_SV|dFZAczR{#3)?N5cdTkB%OGlI{yOpNZGF*Z$G~KZ({fHyWig(-V?p!dD6y?2OkP5SadFx z#y(m#gGr~ze|q%+0YU44Wj>sHpGqk8*D&}lEjuN+sO7TI@=gYWLl1b46m&ajDYYP*u`01ES$Mgf?^ZLg)a_5tuFn2jq?l11_&Ly`)cV@cAo)S$IOyF}!e5NqP$9&?c zWZy#*+qo+2`8-cWIn6s04+{C7O^Q5rp&4ZDfJa!$ixNlq;sVDW)K`S+Xc43j2 zw}@Y6nfD7rnr zX(bZ|ev5^kmFl_<9x=J)6P4nZU4CmI|1A80YGfu8XF!Xus_iYNH+hHe*t#rzdMAY8 z#I~Q6-`l%;C(gP($I&rpM+AqSt9Kk%Q&&{}DV|)poeE0omv#ELt!dSAv7_G z4xNAHCZlr99#5xipa;s0QXWiI+fA8M?`|Ex7m0nhQrrRyk|GFw-M)!i(pIBQmg8JRG z7cwwzHu%2J{r>6&?T3A@J4>myJWqC6+2P{Qr4=;M)z2y6o2PG`;>QxJQ)$XothRG&oeCXtSLe#(^!+}hhU z`pf1sRiEVNmd=w>*b9dE4-RQB)4wT5YC;l=IM@$LsC?Y5%Xg{`-zx_m$Zq#V4n>c6P8!W*&NAI-Q-Php8Z7snDT2$2ZtD zZu)b0^WxKvsau^pud^IF<*lc%^1!+}S;1M}TLZc8C{21WHO_A7npw}UW*?hsXW7F1 z+u-v=`x#Di-S#AGS>ka(xMy?7s;G`9{~}Lsu6~((fA8#miQ4;)t1_5fXG%wYZb^SV z#dNODBTqy2_TQ06)kKYo*Gm=<5#WbO7%de-%kwAEDZ1LunjI1RLM>?X=cCr z^uie--ZtS)0WRNj?|4-ID!F-9zh8E@ZFSv`d*ybIQf(p&e;+)Xc=x^BxwL;zUJ5>$ z9nL>JajojR-Xoh9Kbv;_M3egQZ@2INKem1U-;erse;-{wfA7xR;~O?S)a5Pj@cv#a zKY`XclobvzB#5Q4K2~Yj+cL)7WpUt$Ci@Lltzj{`( z-A-G%ciYh8HEZ3;2`oVf4p;YPIt%fBhD z({69yd_r@>nroXGduGjEHcQoghwzpn51#opC$nXRGnX0mOLP61YszYvxX(jl?qv4< zC)#`S{XC*J23phxO#IaL>%|VYHB~#}{<1bs`nl9aEm2VaU$@&6CW~3FXC_IRZs+6T zEBz1aW1pZXyJs5bxtpGFbZ&Y5&2q2zGXJTGsqWF| z=a?>XzsmJ~^=F0*yVbmpPR&wKtKaY{&M(rZG5+Pu2a3Xxb5?DB6}7}+(UF^*tu;2E zxFF={y{c24&pelFv$)o&V@q~$s7;zCT6%6;NcQ{mDWaYW%C0zi_((HMF?wvfEbOjp zW8_uiDIetoIx8qZ$81&$o+Tq?6wZZ_x>0Ee<-gj?LEDt-omE#*V*{L z74;QtGv2GMW}2YD&)u@2@ZX>3+wT82|NmzHpNIB;_Lj!hyxz4=|KG{?Odsw4bl2CP zd$#7)j9l)P_UQQN$u zFmz$cboSL>gIQu)%yO*f&t7G+vGxXs=T>%ui* z>b(LV>He(XNV#aotEsuGxHXf1+}q6&>Z;7wzV+^%PX*4gTz+4t9+zoalWOnA|)k{OVEN3)cBot5fwRH=Jbc+M>KU>O|P*pWjWQTND$vnap+YnG)B? z!5=EPHq1MSNq5Nvt=neXK0iI#J-z96+2xhIp)v1|I7pN%^jP9=T6678!sQ2EPm8Ps zCT-x>Sh;ECNhh{to>$Jza5|B)OO5H!q2^W*NU+wPyg?en)EA08Y&oIInQ z;lR&A<~Icb>!J=%c2n7&SiWnynWPz>I*X?|rnjZ(jPE3cvzJcuzWa9X;pCIE+a|>A zVrH1QMx<@&;#K?$dK|mv&)y+A;|T9cjx!qOXFC{b4mCavOwOC*CN=X^iI`l<+iA&# zayCj^Jg42fp6Ip7Zg0%XAbXqJjv_m3*%x_Sit(FU)HJQOfYG>8Gvtm>=x4rVmxC`o zVv$+=?6I8Tnrk9quTrN-<}%ETepTsaHkVn(>j=PTU3z(nE{*Uq3fJ-*R*FFW(QoE-KR%mx)S!4&0Ixr50E-gWW~g zY25;`$URSb`gCSHr|+n|-)Yi9);D+`L*>2R|x=YFj{S>xSRotw-FJ9JL(JGxr` z{=L1`J8akL+tqE{Yy1C^`112bG{<}O}ZZw#&+Sr`o=~;U6v-GWAmX^WK)?P~t`q2k{5x?Ps*)^=8z9hi3~G_2&+ z;Z(&7I%{V89`>IgGF2*#BlPIq>DN3Iaw3Cs=6U}6KffK{|Ji!~uk`wF%CC=YRXlaBn}g%Q!9^P*%#_PiBSMY~zhp~P z{9Ct3Kl;hC;a%0)MiYwd}g6`hloC$n3-qB`ccS)aSFPP)XsJ=I?xu%FLA_uSo# zX_HRw=ZczIvjmA-3s)xWx5=CS@#yq^d0YFxx618groVmZS^su-eD&9F$L|#z9ayBt z+P*lt=kBdl-5d{YxorDhXe~I?CbLsr%|K<*$-*bUV@oH?$QDPnNgTesH)2Yn#9=>o z+qJw;Qsti?j}0&6UYOau%KM1mm8tSJyDJN;_k{A5%I~oGcKrA08@pF^6x?qURdI1r z5}1L#lJ*sUN>iUoL!_KL5V`z5LUs9~Z^EzxS4Ze!iVmtMZ}Ay0+VU zpMSVNXUd#nS=Asksk-0p*fvYS zOD?Ok8z$U6ySDGbaB9*S?jw!}T>xt_1Pyx=bb`ZJM#rO zgDWN|8NHRxx+DG7M|j~(EB|xp!Sz0`Wqy6@ir%R8XQ*qpJ+UDNPwc^?5 zyS6oC-!IU;lU*Tw^2kZ?IUlB<*Afd{xn5;b==LX*R;<_`x<%&Pv#dwDhgVHs?YD~U z+RYnJG*8LT^SD%VdQDqU|Ju%6O_2E?)bG2*^HjiHl&(D`z zc#6)r{hPNna^dkDoz<(qWS_Lw>|E10-F=-o%jGY7KdjeITvhk%PTE6F+1@8l3^TW= z91e5}ND-a$pw0Ko+gC1%74O%Y6&~k2mo;tiOunK6!4jcjKPGn+%Jw~LKb`0#vbN!B z`Qh$oPv0fvmTNeb`F*P0mBL_lFwFZ`+%}m=^J~XT)Q`-aXlC?Iv+7w*_VqrwP~rW@ z-@H1o=)n)IR0DrQqk=02Gv2Shx5t&?PS=Vm)(Nk!hNzwW)%o$CjqeK`AyxnUH65A; z^WM?#2E2NIWvXM6Y~b4Trs8d z_3diE|2lhIzW&R*?(psYez}<&Z+}Ypd60kK=lp+P^55CnJ4+bJii|JiNtSQ@st{PyJR;5h*+I$TtK>xg>q{e8Gn_)wc}_pL`Fv3Yp~dpI*6 zIzE&BVz5}cMxjUX+S|M5lpGOw)MlMV^*%))o zW=6AP#f=kNrU;alX|?mulbd&6PTzdn``?G__SnX3tF_PHTR!h@tU%0E2@VaW#Jg?3 zIga!#;Fq3m=ho3zce9g~sr{ss)7Lp_9)ax-97An&TKk&}kL}An8+&up?JQpxhH}AO zEo{st#*HSrnV&=F$P`atD44NwMT)9|rV@|h3V{oE+a+hne0EuC={)&4i|)#+i<)#2 zg5Eej>sf1XonvLnkGg*o|E~3OpS~ojsx}JY)B#DMH$fV!iucob|NPnB3F#VQbwB+v&X5&n}#*Rj}=O9HF3T;xQ65N(Ueu6zpN@TkI`P;`BY@u=_OlJ?I$wtT~XKYPV7+zuh`)= z{fQ4VkBBYa;_4K6O=tJ#hR|&%ZZ3{VuM+(yvva!W^($S67AZx&n=-S$)yXr9`SD)` zkBwWd-J0auw`cq36TFu5Ha(0~KL0VK<@N^KhR|6_VUq-8{9a4c-p}HimzLYHKKi&cz+>$yvA|oW-|San3fq@+<&XE7ON;JFdq0gj?=opg z&l0QP?pOXZL%Gy!Rh>e%Z~pt`dHlV*@eF11>)+em{I-0#%))z_EmdS`bYUltp? z;Fs`c4tI+)no3$3T`}DYb?qw;m4`k}_n!1Uxb@weX(y!=EepTS@zIq0_~hG%v-x#f zbWTs6efi}Mo$jtJwK{*dY%8t3ReQhoec8S@%72Pp?)`pE#f@ddrl*nH^IF9h7=^|C zH{@M4$8}}*rmz)16i%gPnlJy_Jl(&gqNcn&g8%-XXV>NAIZSOo{P9_dLel+TbvqNjyzSX?DCX9r=$E-p(~ud;7>k!&!-;GseP1G8fim1`0=Oy0KUmyXic zg^oeWOqt&$w@MjVPnJBZb4Mq^?vhG~>kFs+JG$G>vfc|(6nan;!Sw6f*=0Rnw^SUt z>-@g$?&F_l8O1L@{`Aq^KVD$%%g3p^>+h^IYSZnuE0O+wyYIsJ>HYKN;`Z&y%wBVx z`Ip?}B{2&FRaHIj7Ti33Fk+pU@1_RTY}YHLlg?N!*K{g5cWBbjzC9leUmDGvw6b?? zXDjQDa_1b$x7R}ZmWw$SW=y_)yY=Df7iSayzALx4;ka|~>C@HQ`|W?;e7(K@@Y2>E z{rmII-f5aul-(qveag7_kSK$wl2Jo=zMNfEnU!8m*@W5oHv4nR{#O*T_`iLp(7)Tl zz|7ycKfx~`EnwBYy;>7R)=mjo`0r;<-0SJe+ArV9JY3A4%&<{daN&j3fnDl-v!9d; zIh^kdEKgHPK9iXIch|4f@JEcVD%@K%s&{O#?R)TdDZjNWe{PTAB6fLs{oi?-kLATe z|F}+5TBm3>XVHmo4JtGCi6!^kU^^tavC3L!)0R|o`L@H06qqLWnBD&^vusg-hJt%S z>K;q)Qynwe7t5Wjnf5cB`}x@>BlqUO$NzpE=5$!0;W%Hno{wX)w4&>z2~(2eLVHEG zL`>ep68kA-d8)!p){+g+S_6LsZT%ss6Qd#QI(d@_m%zkXt-C(26qx%oqsil8PAEh+7!%i|4A3I^= ztzq1_f^~5v!}IrhCaEZ2@?5@6|7?DlYlGVCcU*SQKPyjq6|;P|T&Wv1)8uW!BKne@zn|Dnuh5&m_v zuKnUE{m-H6B4dfggvjLDl?K7D@vS?kO9zs$M<1xY(5CUP0`Ogv+wAN<#O&vhrxn<1euSd=4k z1m1Uin`^r-PPW(;o3q!_?CRsm>KuJH z=E*#k|93IJ{>P`x`}%oi2b63Br?ndON`0>7@MxUiJ40#BH4&jjIcr}zOJAFOz}AgJ zRcFrH%xfEu&z`*Qby2l&JM(mAj}#9wO8lu$`2=wTs|rgTZ=PNLB6);G#`uC=b!Y+bZz4fixw)g_;$cokC9namn* z-TnD*di=hhfBrqJ+Z}V}Ok29h8aG+jo9kW#f7JEoRptzod-3k+L6g>Y&l59J6&qq0 zMHCVlz27i7TsddAp3(Ku(>W6r7nkV@%wOkKIm0yndranpLL1eR!%9~(g*(?LX$$bp z*lAYEeX(N`L+8Vbd$v>?HfDCIG}#~9@%s_CV0@qXuQ!@GJ^K6a+}|Tv{r<4WJ-Pg) zYd3p(OEV~a`V!kXuj@ge^0Gfn6IJxpN@y1H9BXlcH! zm=eOC9Q!UMeCM3)wfC#po8B%st#y%|(PGi>7inTa+D%U?0#>#CzVW@p=+K0SIZBe# zBR|wjm6@IFxw_?M;m$irZ?wLAUe|Rv@!~bt1rq`$IQBPG?MN{_xk2Uh<~g?`R?d>! z*{W3S!KQ4IHMQB;)^o~|OUfafMLmV7LJFqhGv^A2`<`H(R8jb(P^)N87~kA$_bi>~ zpH%*IK7c!8-L1?h$&^(~&MWbX7EZDYnH;#_sl}PQtuuVyXfOVxJ@dm}|Mrt}q^~aP zII&+p@|j!A#<^!!2wm>6$zOS;h1Iii1BbE!l{Mwi0%bAkp^%m?dJYgU$H|blo+}f*A8#k2%nmv`#7Gg~` zxLly8E$CR`!M)ki$>*Igv!7s9l6i1WyzlPxqfuskT1CZHYfevE<}J8TE3q*q-lEA@ zh-nSuA&%JB#@2I^MRKMDH_I66u1$ZwR^j2{TZx?fEQcSyyH;!)wxfFD)3iiw(HaHU z#O7;GY%RPTi9E`)eHME9rXFq5J!rioRPl~+uqsdb;z?9kO|9O)nLIjCuG&qNIRF1v&Sln%gfCj zxB^dRZ50$W$Uc2Y?eLwpp9P!mwwY#oXHPDewNvAL{<|5@O&pPemLA2282S?#1GcPE z?Vk}Ldv@0Au<6Y*e!LG(^XHv?^X^~Ky{hex z4?q6*bo%$_XMfv8dAsk=Se5)lLWgNq`C_;3o%u(&-^PiZZJjmoWsO<+>%_?GWtBH3 zXBXJKRVuPDId%5wL!(QLJQMdE+NL3(v?y0GLHXAW`SZ8;m6q?el-cAdYkU0Fr>Cob z@Bh0yKJJ@>s)zhEgM#@}M5x&8;{BZM8S^&em~B`#6IV@;y+>R1 z`(*jW?_&?9CNdnq%I}>uBelf%HuJ7ifwQ{;#3Kq9AJV;c`0ey~yFXv!|9^S+PiBG@ z1C!cwB?rbcM)p&uEhxy0xbj7ZDbLL2OkmSK4wjwP?)|r$z8fBDQntgk0@UJ3Ta zg*T)X_q+5iR`9;r_APPMtG;{3uU-D#cX;(dHs^)a=5B9xid=i}Zl3qLgM0anGnK+- z`#zL=`Yw4|mD!C(e%cc>H?z-;aM@eeJ%@|Nia2J^AA4 z3X(xekDk3dsG4o~I*-FHZ!Sy79VeAq^P)w;e7-OD&8lcN$ju9W!m4P%x#@ZyzrfkR z+Z=(a7u@f+Gh4{qdby$KOX|VP;{Ip%#{b%^e){{qpARoz_Ppb_J$LiB?ell$YP!rG%h zHyXcrEPgysPkj2dck;jNcv`QdoaYvZ^7-{DY2r^XNFj0D-{XN%N|tX{|Q#Pr+g zlDQ0V0tMYWpV}O}tun9aO3Y-#i7e+{=6t)i;-t;<{63B@_nh53FP*Eq`R3$`H^w~t z)%AD2aa9|Ji>Oy6IY@ZicN6>j^2+nH!rFx#LU(tyn&+k^KHIqE8poEs(Hl1{a(Xe9 zf5wMt;a`&kUpmg_n0037Lzet!;X4wHte!|)WACtjmtrNwnLC0kS6w?<-;upgCj5gzW@+OV)m3M6W?W)aIwaX- zspFFuzVXq_xC+kwQ@X^C{+M~VYsKxrfT(>(Uw`xsIA>$wt~@c(Vs?1TQnw?5p_$21 zyJHI9&Dd|FGqb|VakWimr%rg`tfX^ix>&DwFw9fUbh11%UE}NSL)lp;G7Fs4b{n6M zHlfpM}1&JC{ze zxFOi{eR0DQ(Uj7e3zSw_tf-AYn!kpBhSF8ewMB7zV_cpJ8_)MJRl6+s?z%MR0i7ii zvd>%VDe>HwJ16H{5;?17_N9&;Ha#2uZS9};@7nwS$F}eL{58I&?tA|KH~IT&cI%p( zzZ42HnKL7!YTom#%I8_nYji#<#|v`QJiUF^I%fL};a_V63ln1Wgl_*UC@;QJ|K<1o z(*IAV=kKdYo_k57>-4qhTW9Kb7iFs7_T_7w=Ehs}=fltP`F4`g+XK)2Y6zaDzrW)1 zyLU|4GQZ0#FV~9JygmAH{-4M8|GsUvtK3oj%VW0-&g(H_5Cv5|4-)s z`FsE0+59>8_jYq+O6_fnUVF9sJEziaNtbD^#i5NRf=;4Zn{;w~C#G48e1E50ofxo0 z_fkmz_V(1sEnCa17OuVGX3HS<{PW}6<=^A?8EvnttN3=%c$?|A3C_+6ZQk$hY@WbT zT~i#<4_ZF`|Fr$z?!Eo_e~+!7Tlc(k4&Q0t#iwrkHn6|9rlM^3-r9}@Gnc=;B_YSS z*<)&YFK^aw_nwED96MvJ?i^By@jQ8K!;*sV&gc{+?O!DcoWE{-`yJl@{r$GRzxUm? z+r-0NEZtVpx30)eJ$mXKi}!YS_e5WvEvR_;vh}ls_B~8`2?jq4XDGeimES2-bZeeM z;gwyQl6%%4RtVhGCce;h@~Ry1z@GCCTXz25ywc^sovoZrW;!lRc9WwVRPKC}5Lue8 z(88Op+_W;TIJ^1F>c(u`+dK-;K#&k?p76P0c#HkY5ZREM(y*)c*R3O zTa*tO`?gj8b>}m4ee@~Ou*zo6_U+|=H=W!hGwROH07QlI{C;@(PA(oT;^ynR2vgRr>iamVQ+e*+Q>he#!dh z!%FU7EKjV4f$zARTPP3-+ zU2Ctrs_tRz<#$YyX|2Ew?Ww&VMK4!gd66E}acZ~D&Z0F+EUu?^PTRLR=II%|(8sCU zPJ4Z@a^U&C;1GLE%n~7)hBsZ$PiS5KHph6{cVpKb9&eZEX*&P#_-?hfROM#d(^=aM zm*v?sMdoU)4Eo0ZaOav!wu#=~-`q`SI~yPTHDl)jWuuyePj4bNKTZs_KKc8iP*ISD zQ0t;<2UkAsRx_q)``TXK4Eg(}M~!9Er>>uZ>lSY{dEj8N(6K>`k>A%g#^u#B?u+{N z5(i#g+rG>{k6+$qzoqQ--0$V({lD#AwTE9k{3JX|A#~ZvhTyYDn~jTNR!es?gt)l= zvAQGL*%8vLY|y57L-%U=JLAR5oA)w^uzyH>Ewjv~6?kx0|oS^X1!KUrLGG@O~o0hoYEkrbl0{ zI+Ys8syJa8&-uW-=p#34jHQ=#cX`aHHYuKNxh`a?>c*=Vp4e_#rZg!o(JqJoyWrYP zJy!PYhnf+0&T+n&zSoiG^TkThh3yN?BsMMEzVmbU%hYFlS|*2<8ZNk0W4VUC$!HeW zfjf)k7#(H8mL|+#%FV2>$gc|e`Qzs8-Jfr7=NFW_(sE09^{MLFTeqfuD(3gT$t*JY zsX??6gGl7{wuYVYIqVztPG56xk?%iUcJuySTZ0NKS$_7bsVk3Jc5`mG`*ry4<9omN zl?Tk?n!V=rq)Sm5yJOybz5CZLCS_yH@yS~>jaNA_xNVQ{fBowrt&6(x!B#cK4g(vxC<)pNM|??n}hA z$FFyvulq9jyqx^^rv)EG%sT+Jr^c97%_$Yh&VY-pm67$wb9X0 zzZUPZZo2sWaMS(22iO1qP`+>Zqr}4E4FCCS{p~H7e(lZQ_ha?{AKSNY-+uq^z4cqJ z-P=?5mD^9}+5dlYcJ=PfJ3VG@yY}nQ!?p!Gr$@^ka(kpaGtD)KAz%kz8@tn) zi?!>l5){6-bG+Eto3~l|%=_2LXXLg$vo_T|v3Kds39GO4XiIR!-dgl#w`PHb?)K$R zUv9pfD0rVejblm7bS z!w%lfshOIK@6O#{@%6*2x2!zeTb3O@z0CZ4f3?Q?WTuq6nvseQvuwg4a)zqtMC})m>XyRuxNKdoo6hTxeA?2u zImA=q!{5l+$1T-nwS6jF?cem%$+PH!jey7NhuTM`PgaR}SuJ<{kWqaKTU6D7;veDt zOZyx>#nzioWId~LL%ZX(_BrF(BFCIg2yji@H0^QC+N&HlO!Si{1{Obb&aKui{PIWT z>-(TNkDPe3s`{m7Ph>i)d??aX^z-Xq%@G%3ri7}$4q#LG+;R9<8RzD0>vqYUh`Igf z*-InN@6)mmdN)r#-zr?YpNV;eNAUV79M@*4DW*Ru2wclr-x3Bs5>%!68xYxA^3CRMyr$}{$_z!jYSa` zbUR+mWy#r7_x0Jwe`hz8#eBGJ|L0iw{@*7b|9yOT`uzIe$^TyE*9yFSegFUB_dNOg zf2@}O|MUO1@c4Z@e;-?4^Edkb&tE%iSe$27e7~fqsu}g**{b4+9&rNv8ZIlQT)8gP zA)ue15>XV(F^TD7+t&?x+1cH%l&W%a7BIb?aPZWxZDv1zZQtK%5b=Jxx3!D4+)X7N zF;$eC*QR&C%ip0$iMX2p?B0n=5s@G9}I7L^I{;y9G>`^L9@<@eirKRDd@;_dlz zZ>WoyQI>_bNROL~UteGu!)HFG%*jEub*fDrlOh$Iylh({`>*d8T)B4MxdoX^rtZ3H zk~#Cb0apd9!1Zf!TRaMHoeG{BUa;%LhK4ImKg`}9j);kw;a+mWX=Z$VMTbJ$<>bf* zhf{JDrM~kg@9yZ*xi#hZa(!3+>mnxG_Z$&bINtO8ee>=RyA_6qWHkH|<2J|~w)s}O zySlut{C(P4ozN>2*m%9XP1==mS^~?X%DvVcSA8I`=J?bQ?_2Yh&ehUc#Q(l_iIRRN z$Lq}4(Bd`?r!F=%)$g_cxSEQhayLsTwl~X&WgUK8nX}+SMaJ>P^V}l}IFchwe`?9O zd7gT5^^}tMo13KxY$2OCpWRq}uR1Br_r*Mg@W55#PYe7ew+Kv{b*&_0SAfk^7db^= z)wOaFt&w8Zt4=kXJ*9NJS0>Q;w4+M6{A|_WsXrS8I8^2;gdEk)Z0LNIzP(TE-4rp0 zR|(1nimzlQC@kyA>k61SY4Wf4ha^uj&0oKiuYSR^760TGt}gsFM7}#Uk=?JJYCkR7<+xLDO=g38#=FEx6CQkc?Wa0xch<%-_%JjVQxu4S_&jOIyk{Mc}>+Sk}5 zvrsVEKq`>Sr1<-sS3La=7JH^_ldLV0E)krR?iy=5xji#GkuCRV+_f!-GelZ1WnQ(t zazFUe+V3Uu1;?*d@6h*N-Ku^#v{g~gFImH*^7E^Qr^EXvEMv;eI^4E%cJqt70v2-9 z&)j);Z`w7nRF=@-$KD%OwjIfs%Dh0*Si5Cbt9ew5P~^*rOO|X;>nb>8IqDc?i9}Btcn{xd4+jsx!?oU2{xHPw* z=KzP^Ee)kha(d5CS6b_IvmQ3cVQ3ImddH`(aC*_=-TE8XoIUd0sjA2{_R!pbsU0s% z;v;R87F^Hl^kUgmDdzQRW$2BN%S*kdYH9h3Uu9X5dt+O!wxZ~N&f?fALQ z^_N^sio_930rA5t7`IhVm7XZxF8DQ`}@UW_4cP9o=(qy zckeEHboSY{uera^t*`mCyZ*iP{U1*>k6u%2Xunxk?tbdJ-LA@iPkuLA$b>PSpJ(&` zUAg_EU3$kK?>4`^|IhXRAM1Z_-oLPW@eQkIiOOr)4l{2pOSq)sctMHfoh##uY0}~s z*Z%nzqVkiSucdXS@D42jLv<$3hoVytuQZy-6xMlwgR}GDRvil`#S1%Z<>L13sQvh; ztp3j3oY>ocZ-1_oewcB(sC@t3d+YiSZ@atl^v>HaH|(j~{`T;7wS+xCzx;dod9j(! z0k2H$YI7@Qo`cug6=!*5@3MdAndjeSF0fZRYRTeW-qX|09Xqks+$Sx}u;J1H?sr$C z+ah=Vs@9mvv1^OT9)SZ(KWP>ZGQc) zXEirtzi!r-ulsfL?(Sl94~h2gMkgE!<7{j+Uj_cTF^7SZd8hEnHSWR1f4+P!Z>y*- z|M%i&@48Q~zCQk2Yd=R!&~XRv?mO=vP88lU4$q_wy|gzKhBg4k3Mu;dzf)*S(0FF&!394 zr-73?LTW$cJXL*oyGHNK>j@jY+BTJZn4}fORpNPpcXL+<)8nL73CxcEe3I(ZH-xNy z%3_h&;S#+*!EaA{^{QQ->6@c0tqukr`O>?pZcW01nvPE8EiYBd?rMfyS;oVyviX;= zn1WPCi;|bWp|3~8@ilK|MfN8#m3$6w|C2jFs-mWE= z=lAa0zD>jQ(7M`Np~05@_kS;*G{r`A>%QbYzwQ4mzW;0gzs>b7t+9I3+vl3a)qQF- z+uQs3@6U(P_baM)R{wZ;zxLOc#p3$&@76t^{Cxet%jb96gl1k%6_W^HaXX{kW8%^WKTPmGg)AWI zPs>@f$lRJ>Xi_!#Ye|FjufEjAXvtiauf`8kCWg9N; zcai_RZMl2?{h9vz=blwvFFs!5|8O*1N6KSyf>%`AwqpfBe#@5!a2oVp(_9;{Eq8fG z?61FfljYyN+dG@}%!FnCzQ$=+iz(?V@d;~9TAO?-;f6y{pzVw+Ul+NgO!4Q5zp(x9 z*}r$i^Yy3i`);^v=HWYcA5L>z^X8$JTXmKl>ynw=3QE(KYBd*R-R*Vk-oxXHt&rUi2_Sv^*tDKFQI&tTWIv#)PzL4h}3tzqdeE8QB3#Amx1-gN^ zcMBHG5PlhT^v2?A!96Dm^p$qXeg5x$b-vljX)2LPHv&U9SKqZ&x;O2o(Pks86NxC$M}8Ogtvz{_}<4W80<1y=W&W{QPs&=+F#SAYbngTs&wdyklX~J zqw6+${4m=zMI%H;PHl%zg48SB#bS{=r$0z@_4{He5B?yOO> zoG?qU*m?1WGfWSI)P!s%x5<78@{CyK`E7Sq?F_!(QRSf>hi-H{ST5Xpu$Pf3=1~6P z&4H%V1WGpScDlrI!}L*h$n3mq?zw>`Y4UI3aV+(dy)D&8`uhMz*_8w^! z9ySH$E{`mID~|~&#jY*|(<)MuN(*OXdNfMR2z>6dtF!gFOUQ~VN=px{<;r|6S>wFL zbZs_!p~BR)(#F>IVTmJ4(yDUW>R?cF)5}WzTm~)EX^W3+8Uln}) zlBv1X?v8$TK0iM{&&=nNKF>ejx_W4B>O61VOVQPHIu-kKjRGyac)gbVxb;HCBDeYQ zQ4bC|ri{dOt&T@ppRc@j=yFKPq@b>qTh}d-f?#!?IeKLH0?Jw06 z2kvc|EF{kKdxI{UkL<*>`-PCQ}qaaZo?mmyr& zE9YfR?VS1cFaP|1hgaM0u$TM)rvCSqGwj7CUk|91aQxim%2oVm<`EaayKB~WiBu>{ zrG0&2Ymp$j^iFPQu;TjyV|~l)N6sD7y!Cnd4rMkyoH*_E)yP$n&sIikUwPs4_j!9O z%9P)QCOEAKp0RxW+4A3=t-o&db>Ef0{`h21N4G}C?U32F)rQkOr~JG#XVzKQWy>cU zzPmTa=FK-<^K7OKEdIXR z|9#y4yHbB{{Q8^brn-q$r&j*Kv%3xsD|C*}nG?U_y~gp!Y}@k=1ss3BZ%6eG``XWY zXV0GfclPb4t8a%cvDtaAdxL@RROXzh>IXIbU!A^q`z6kqSmMOw&R0h+tl+QFu6SI@mww~k)fq_{#x60Bvjje} zYW>PmP9~?4gOctr`|C2K_ez;QWxeLS&+FbBMaFJ>Pv7qLt}eZT+$E}i&l-Aoxft}{ zP?>3Cc=q(M$v={85)u!$FHC;Gy>5EB!fDrr7FNqA(!X{${#tgZ%RrCSEnOnHvGeJZ zW*?EuWt^*A9==)}vMk~E%o!6U4=b)a!*1nu?Sz~Bbh}gT{uNg8{Wp9vGn_x|5}3I= z<;L|Lr+&`zORnzPzdPi@&Ic!UOHMxVA!5m%WXt7;7k8vi+xVmLg-*qSy1I!H2^H@y z8a$U=Ecninakg|p#mAal*UzpS{%-v$yR}-*Tjl7Vnt%VyGS_wT^~RD<#Bl%-I)6CKMzO7w%IBCGhdx{exIS6)g!hiSKGL`Uq;o= zT{ZtU+s*EfVA=lkea8#ly79HE?G$J&eE5xh|Npu5zv_Q1UT%D?efK79|7E*uUQ~Ur z%C6c|eS51e|M!>_!2j_Ul%R-X!5f zzrq#$zrBCXseaV6L13pq@|pU{yA2<|@~Zo@xBp(vr<)(&`G(8*X9u&mtG6C_k+pZV z|E211-Mp@K3Ja>GthUMtaCxzGvghPyxSdX`MTsrtN#VYwNnb9*GZ6yy&*F%ALuk!W@vY*j0V$%Gm|M zyXUAC&X3#?CMYP-Ei#kKQRdKRzEXa!TYZg(za-T;eR?(7|J>uWY(<{&G)<eM#T~BApL_JWmheQzZF!Y^ET;X1X0hh+yZp@?AKi1-a@0Hg?X=`Gg9$tJ`IkrC zFM9v`?zw|*sdc}YQsvlAKY3-){m@FvR#Ssv$C_$A>#H1_*fsQ|W$&aLy+l_Xdbgt0+tK_xUy+`U&az`IR_7JgwTj*gD=in8EHHDU2kT19 zh|tY@}%$Pq#~zZe-1_7xZ=8Mx7*3Qtfd`?_u7grI^zZll!Fv(R+zP)l=$N_vF~|0Pu)cB*|U}y*;#F8aGcb z9&0A7h_|_XVdjiEA+;8#j_o}tF!OWk|2Ju&9BG0trF``TXE>V(i01YMs{A{r5HO>) z%~@vm#&(UIARc?YYY1g>Ecwu%b}n?f2?xU*4@seSOyGkVuxElVt+mh6x$U%c5duoQ$%O z%6+}|>pfA1$=S!+CRyJSIKp?4ooln;_H{G0m;?efm7JXPR2fbgygHl^`N^0q-lzC! zT6z54+HW^!-`*XZUsk&H_IvrbJ-iY6?$kgzXMymLgdN~GtW7! z;c($lmbp+7;XZSPT(nTY5-z3RZORQQi!5tbvChl7oH^<49`4PS6J|(riXXpvwl2M{ ze)}Ymd0P8+?cZyA^siBAy1@ps^@mti9JM;~v`bXbJm`DS&kgq-_m)R*f97^MgyZh6 ztgD&R&hdN>-4pia+27sg*YDnyRep8b4AHU+fB(KLvDuwy9p0j$A?Cq+O|!kW2Ub9(|5DKz0KHr(^~)A??;zIp5A=;^{tVF(fjQC@xJ=^ZDssx zem&`pes=K)qw>_tRYs!nk%j`h1$G{4>&>*uN?h%AMl-j3`XT>y%MPWqPP@8g_7oZO z$%kUsZk4-b#p~j`!ku%)E`e27Rv&(M^YZFzzg}$!%GvaJ)p6ZL>-LtbD(O9vTGtR* z$^T6!FQe>0@~^&2(y2M2-^GhKTrI_bL@!f(L%j`e$Q)vJ{~)(U%T)3im&cz z8~F`Gp8QkOobRL+?)*OMUD}JRGfON}W*OHl4waV(t(!Py*{q`iyQ>zt*|x2BzJ4ru zN$ZhF@+N;M`V45tXXmML>}226jr9|I?n$k<9q`S5Dn(;%eiG?kB{B59)1CJ1~c_sp-U3 zqxmM!xE@z8ifA;L$^Y8o$5AEqyx>b`4IevAx4eC4fu{e)1>(v(wbO#`#(w%*vt~+- zQj5l~kKHUr>5{Pu6k*Vh;Se)@U(`+tw#|I4@)`r*r` zo4mj0zc1T8|NozM(0#7m`v33l6cqL3W_==8(bzpv+JBY2Q%Q98#!}l4hwFbWuYb*7 z_igh3^Z$RW|KDE!ak^VfSA;qLGv%*Y3p38}i+`E7^Hot@p>ge(f2Z&Ndv^K%)BXR? zey#g;jep-p?M?H{R=#<6{krf+zE$hv?%T`wXE808|NrE0|Ng&^^y|M~T^_%uwzRyi zc)w=X@5OIzY=o8-1kNi8;&{_o@H^w_A0~wcHw7ODyEHa7%dJoU95kO-^Wom-uYWFB z@7)`}Z5o%9QwQ$~Q~j1w<3zKgRrhvGJ2g3b`?|cW*ty0d&l9?#3;Qfij%fZnIWgV zNXf8%!4aYJQ)Xpv&&lWH6YF;mjAa_LUWm=qZS&mY4*fRNna`drv9p8Y(pzCUw&KGI{T7?f=`O3O zVDT37(*727;>>R5R*nZwd`8V>3I4mjeJeQQS$4gu^l<5^gQs^0uiD@@<%b>5V+#l z$CG*@izO{;$C9HteRc*nW=32siuUkLHL^+kG@*6b@`bBbRyOo!PDo9zE=~+%o;)Qf zO=^=@;>$FbGfnq&`Le(BJSq7s6k&Q%HPOH^qxdlk<3SmwXFB37nj!Cmk|rKBc5f9^ zoycM+S#VqRv`*D6$Kqo@pFCsOyun~+VvB>IpvBFLjCDuPSjaS}d9X`0I86zeby;}& z%!Y^0gj)9n&-fqhwp`eaU%)rX;a!1w(MjhkPW~d38W%L&Y0v6A^jhUA%g64+k9sY- zJWt7*ivDcX(3{qu^!MYm=}ZlG8=KOu?T$`a$2x1O9mn*>&Mlg%iN%kfNI8o0DXueY zElmzP>SA|3Rm*f^eewIf=9)__SQ^fVu9H4spxNp$d;5;aj+tS~>f6`7DG=#Xj@~lC z<^KWAV_u$lQTYn>PIjc^a?IN!!soGfn$V_03!FSoSUWtpG3D-E&mD8_ z&$IvgWp(&^xoJxmi(VVT)IM zl#(@d2FK=eTi=y4g$SCJi^ZAc=3Y%(xIsrr^<0nVjw{&@-p>C0xk_!Bk*|@bpxO_U zqcsn|?(%aA(T=VC@}?%MJilLI*UowC`F5x4=dGJ3WB2p!>c^EECs?+q+~8^85H3#h z^S1dK(lz7Nhs9^R>~oY|SBT78)v;mnaThs3*Et?v7bV`3xKOt+bCqjE*Bd_TWxv1H zyb3L2(O9$E(0{j=Pu9C@&zj!X{dp+=_aOiL{hz-)yz~Ff{eMsQ|J)ou&(C{q`H`8T z$@kP=+5c;P|M$uFeV^~<*Z=r)^3Jx)+gAKMe0B2d{h!(I|9)dW|NrUwucr@hUVV6B zUbgb#hqIRcxYl!G$Alfz4_y{vXU|_1qrxyLXw_lHzX!|re|?+(@9X}*PnR!!cRA#O zqsYf^4}%Y>7)DK>uAy!%oafft82>8k*)gA(RSg`za~CpC`n;r~X_MR{xl_;Qb{=-0 z`5@@YhWR-`jk?cE!z=C2FFkSg>Xq}p;pq$SKHM;8`|igd&;I>c^C}_IFFM<6>UrPl z8<9eHV$RN7@vf_B+va)O*Ivmw@V8KK)%!g=*o^P5&r>KCoU~)7R-3pZ+kUx z&RMad%n64(59%;xmo7daeB!WD^9&EKWoP|dAKjVd;-wo}5xZSu!IBLtwP)x`#G7rF zxSL@cJb|zM=dYI!_lldF|9<&vgZ27fuik$Ae4YP!+v8=&KfmG=D>@rl(V(|LB5;RJ zWz{`J{ofZPCmhUBkac|8bYbp28S}-D|7KdRkLtQJf1B`&4f-th>!p}Cm{_o=FtIC1 zT{~E?-{e!-%CN$joL{DxRrsChw>(=Y;Z`m;Uvb`i!_Q91+rB30+RyQvJi#|e@#}|9 zxgXab|!4{>Wa_nVvR zRN9CdOn=|sduX!andhfA_blJvsAqKNYOmu0o8HGa6=F{O;=azqbma!aLyjBCa_?K_ z#MD;Q9uMtzm*%im-`5~(vu>h$le^TR3rnq~Pb=R#+8FYmcVaq+`d!fzWg`9Q;zkR2 zAAb&*b3sNpDAFg%A?oJTrPs9Mo`1B9d6!zi8o0DSROrQ%8x8_(am$Vg?Y`rB=&_(s zt4rkJbLJv1I0c@6ITkS`&rODH$CPUaKCWB%u*TOgbYj95;RPmk?r|4tuFZ74?R9&l zShH34{_jcu_kQ31_qhH4d)w{nK3;vE|Nh)-@%TNJU%#Cby;c}AP5%D_=_8-l*ZS|+?NjY%(VOU?R5Wq`@e6><7EynW}tllOmK%(vVBd;R~}^*>*}p8EVI z`&lElSh?p1C$l#`-*CDj#$d_H#h3QjEEV4q62Gtd>+=6U`WM{Vo!ht6at+0c`cRIPmm6(iuTc-wiuT)hpa4cZu=Il0jptqEvv7h-!;;}?Qt*P@3 z8;tZ!x1@!5O$_pASw3_9dIQ_SDHr9{n}xjuXMX#Xw66Vcna#IU#gDsgd+I)zQCryM zevPS9rZ**oFPT{_Gs6LkQgZbOC@bByYnkVr zsu%A(9wZ(LQlG?`bD7(QasIt~+s)kro^Nd1^tb=%ltSloK5ZP&PM()L>&$a|=gy=O zHaP+N4wiez|B33)cw{a2>SFhNpKCP|9Q&RI<~`GKoa~-FH(fitI)t1@Oa`6TZXSstT#4X#BI%ayQZrhjpE-t%Kr0KZ^ zchW44*AFjLK9zp%_%iU;vF9I;HcU>xQGF)(Fn5CNnSiUgFZb>ac8T8>D(m;+bE4Me zDVv^N z(@wW#Cg1&9Y`wSAV(z)qo3<{K(pWUha+hHDh8?TZK0ZJ9f$j2#zv^61RL|sg$gTIO zxw%_R(=cW7uHP4nD$dMxO)V8HH@3dCCUTLg=N|11Q4AVJa#~{Tn|DhcHZ3VPOp)I) zQEhtHIxim|pLsKUU#*$sD-ztRd+d()#2*rJjQ9OqVl*sI-gzx}JnM`u^Ta-Z|C!=J zCO1r+^7nQeQFD!yyu37|^Rwx;&pS?d)bQH1ZGY^U+~s*+;LPshIo1}XH9zMv_RQ)L ziFv-k#`s~AK+D8~9V$g@g)TnHsqzuMyQTc?EY=CLgp7Cd%v~hdY47Kwu=h#>ft$A>kx`?gOx*f3V{@u;rZ>6hidY?~VTPXL(%FLxFZin-4kC&alubBDx z?cHDhee-d;#<218va~nHmZw_JGZ#3Lnfa|CE`(93WJR+jpBLMOSk+BS?|M&EifL(C z;JcHnVeQIQU+-1FUc2>1aHI!UcZY!IL#0D=T&sUYa?HGW_wTLUcVpf!-&y38_9X4e zk=ByWPxpk(T{3~)vh~W$+16)vGPtapXAvl};^qBmy2liL3ccz+cXN&K#8vvsOC!U| zR|mDmJP2_)duPknuvaCTdXrh11MgHU+BVBfH@I-?InW-&6R+T6NxL{F@LzNSk` z`3>QRr}gj2^{2m8@hM%j?%3?BrwpeqH(dX`m80P8S#`}|-J1u6@9Q4_{k!;m*yR%tX z{}a9c|J?Gpn8`1HR`?erHdaNS+pT5)@1OaR+*!+Ob#GNCTj{Sgy?Zv4EBW=hZMQ>} zgeKm-x^LF@dm&SoY_QfWiM9K2?DGFF|9_~z`hR)e zGW>U@&^lx5>7O&JKYuH!F0ZRD-)B2-dtO6JaSQV@G3Shf2RsC~pGeobTXOf;wT2|0 z8k^kUr@tS6D#%(}x+LgE>Z;tA{QS2Q!@mbx>faKHH5ECyERKs=?3>}cM0uCJyLSr~ z&r^?_wrrZpmZ(EKJ65ed-R9{tnc=$J#Ao~R0^h#8s^UK{j@e?a6!+V#%I8PVp8cAq zw@3GN<;(bew)=L)?yIVP_aOK6+SP|w7Rp5a%Xp*6wl_jGa@Qty;|tCQ)*W%4AS5kf zG0XP(=atd%+w$0M&0^cK-L@nxZuYhl+oX>=C%3Pf8D@5E9oy02yf95=7lIda6 zQ85s^_+;e~$pumxrtF+8yA*eqoLk!J&Dt*U<^Qb~C$pBvzgS!v6QAda^YA!deQGu9 zPhy@7*T$TkHtQGi28Jr^D-3O)^TlZzpYY@h^^G>EW^Eq?dpBR~?P&VDS0OsSxSX#+ z{AT^ZqyVFN{4q<4-tDN^-@o%^O`CvO*~eT?My7aa-{Q#+UI}w@Ch9y_S@3-CpIcc4 z^?$bN9WmpZF=L~$pLJS0e`)A}&^c-@l@s;ipB(4wGnn^8=kZ;`HwQHxF8QqWyc%M5 znZZUWPcvtwt=4QAA3s;GfBny0{1!0BtN+&2z0S5$=%0CI7~2iMjVi&5SIv`HU0D*Z z=y>h|-;sMAIliBocqa&2vd{X^wV`4A=a+la|H%Jso?rKSvH06PzQMKM@6Im2R~yCo zcF&%QpC#KLe%62gUe0fR{jYET{`EB7{rBta$FJ+_K41NKB_J!~NKnkAuNO6r2uXO< zEc8(Q@vqv0H|Oc_`TKvrxoQ8a`u^`Xr?2n-^~mJx?~XmP>~R{| z4lyhVg5jb+HqTbyy}BxDVLm0kK0%C^T^hTyJxLVP1-Wi(KEuv<&^UA%j}C}w>673evJ?Q{VcBaiS~iT z>es)0maqR_eZTg5_x+lEdH+6K5L)yt@%nidH;)#FJ9oFAZK>HLzLR&;!I%Y<$m?m`Z$)@`sziz#*UGapeH07mD z&&E5(8X0zPmfiftRxYGy^nUf$-Wdl~ZzZ$a%xv5^Q>de6_ulBZy*H;V;|g8lEBnMR z_VOW5(>+sE{`3@m_h`J3;HS|fP*`3rwsUV?T`br4+}F{{6F1#1oH@7b36tW!b-Pzi z%Pd>`c~ODrBQvJNpf>-Tzm6|EpB!2AV$=dukoLMn|VV<9s_~_HHY|UxG zO9_*poa-kh@(MJbiRH~wp9{XA3m#-#aXp`M~i__Js6OBV*pa;$mKT(SR2=CpcfM zo!!+^SpVw3z`^woKa2P@v)T&%tz3{V6360aC$w51)|f+tEi=o&VzTh&Sd9&Q^jnwXohzpzVV@L!IxiTuf!{HY^(qJgT9+s@s|YZe$>bhu@wz`ED*m7w>B zv@%+C?XzR@(L0my>YZ=zb+h-XAHqvtbGhXAbo(6O zowBfSqjcF~uf!#J?=qgft9||P?-Wz7mWOVJ?^N%}x1N=3{o{LS>A}nI8j2!kDQ!<~ z7D<$xe2wMVucztx^P5a%2leJd9`nYH7wRth``LA2AG}2Y78A%A*5^^*c1Lkd)?&$f)u*)QHs{1CLLreYc83My zHo3HVKfJdkr0jLjj@hE>Z)4T=?V9=Q=g+f~{~rGM<<-}}yGpN4aB}DfWK)o9nbZDB z_2Tmb5uF}SE=9NMGl?wmxx?EqaVJ|z|F&<2mD#Iy&F}u5_v>A?{MPdOdv@8&PG5e$ zZ2ym={(0-Z|9?||r|$E~*RRFf=l^@Ld;kB>@-eaR@2r?@z3pyX-LK8>@5H?Sck}{_vvyH~B9eXCvGX8qDTvi-MiU7IyU z>RpF+=}U(<)1^C7>jkD=I2Lv`?`j7N-}bk=@7MqT|0({D^49;~;{WdcAMl*nqDgkr zK_6xLB|dH^PsFw?>MME_;mA3|!|=P9R)l|N*qh&emOnkuNHBO$vEW%{n$fpLaNE80 z-+!0SdmF!Jhuik${@-?2Mw$Kn^!07#>+Sr{w|{?qI5U*%m}u-=?&r7p8XDwc{bod7 zwYAZ22|c;sb4eLmN1(KPtats*_Z3I&-xs%4vXcJxEW`f_5E#H zG}uKZE&urNLjR3>E3YY?dA%!lm5ati9)TiX>9srJ7wOe*;dL$$5uK|o%)h^rqwvHc zUB!KW-f0NxrEL}>TTyr{8;K|-njTfmAB@aXokLd z$tDKs3q5+xPyJ-|Pq2~CzrL_b+BEQsZi}L&kBYE^%cTR%|E@M%*e_-x``v(7Me~mF zQJa>Uo2QPvj`;9!`gczSCS~WOCe04@W9_HJokJZ(g3gyTn>yrb*8H11|Nk5Nf9&@A zEGKLW^V)iL+U39N?dw0k6fghYz0UXC>UaFbJ9h~^3Xhk|umAomFIvoW`lAAK-yN3n z2WN;a+Oxj#fr#3Ts$IJKY6@)sPqzPA{r`iw{i>wrmv7CQx4)uvv-bY~f4}Fwum8It zPvvrI^MT~>C26tK#TYyD_h0zV|NifXc6s~y!p(EeUE8kiUv@s9&zyao@%FVxQ!?ki z{(4p}sPFkclmA!6%eSBYHTU=Q@7qtWx2yj9El<&F0pmHhhNljBIS=L~q}O#tc>UYa zsW$0#a=lckdc(JO-FMH|y`Npa{=UTTOI79@I1-QW3wu5^aO(Y~X=PNpy)Wx99ui=bb+nYJKX+A-9KGej!@Lg5h2B z`htu2)n;|=i2Tw}*kJOt^zyZ+_l!@ICry}ZD7-{OPpOsLTeGz_b>5Q=$7>im)>w;V z+za2)sC{zEzwaG=eH?yE*^W%^w^MFir?L2DKX10ft9J&r_xJ6q|C%;$oh1`{!@GNT zJ#Uz(O*tV`a8+Q_ZIk~{V8u?!IiA+LR`srJt>o!r6bzcUDdX8Xx59?D3o6w&Z0;KJy=QSO zR{wZo;bXzxhIfB*I*n$2_>iY;5d5$syW9Ts@@ejSC0;$u@D~x>{K_`Lw_LF7vr@{j ztsa___Um16jLDchV|t0gqfXsmjTXjB0co<|YG%AFSyst3#e=D;lV6nSj7f5(4ZD8& z{(}z-vrSp1wiM*H@6_ITz=~9x6gE|SZCRiYJR>!|G9BY=gKQi4=!i&CimPc zwp5wHvcb9f{x;w3p<9I$XK6K_^<1lZ(@AIP29fgStaYkID{k+4RrvDus#UKq`Onr} zn}2qaMM_Ssla8Kz z$Cc&cl4je-rnaut+apDA)tWtuLVLd|2s)o{I#Hn-QU2{pQ?^`*bEny=qX%kdp6JxA z(7b%&Fbk8z_bu(GnG`xN8p){p+-$P zCHX0CmhzokF*Cef++yxcZ~q>BD^MWzi0Z+ujh!u*PgullU*f6WVHxve&fTi2Zg%fC zdA3-4 zyeB_Ck!G~g-I!VUw`xgW#|@s`x2IRdF0S}=eAgW27yd^s+AvtSwS4U{5@6sIO+Z}0S35FReST;#^$_3vYitX|RG;VORu%F|ynVM=l(Ugz)wwr`)#=X`E|1yD zn%}UWaoe)ZaqkwUFibzhBKJp4@s^TOXtv-fiNkNj&oWmsl%;B=hMzXc_x}G@ef_!g z^`%8kWyylZ?ZIF@DMHNnh`oUfRpZ zx7$JBj@1mAp1iCNQ5$j#(%*_qzA{_+w|Tk2vZ$ml#&Q9Ss;g4l4k>9C=}q{MBP3v) z`Tq8@)0^I|Q&art=)Ega2 zk4pYL#-`T3ymvz$o zR&NVUO;g(zJiEMjhQC0;=aTY@q8iSN8p;u(qPJXhI!y(!w+w|%^bM2)v-*yL`-YUJh=Fh)ka|6lkm-oG?`_bH= z@atan`#&Gr@6T!3qCMU7>Qb-wXRklqeg8ij_k20O`L+LkJ?6jv``z|?>z~v{FZc8@ zJyw6^%)XMc5G9NQ|l zz078vk51quCWRGQf_(f_7i_ORptOO(s)O^5ps7=e+8LvdF)ODT`MUbHb1Ja>Y|A^f zS=Xl8&3D!@e#ML3`kym)8JsM%o7BF`Z-OMZf<=$cF_zDqlAJ=EY&?n;d)#DJ&a0_k z5HzoaZK*8->!KusbI-3a`y6C_q`2t8F|Weq>)s}5h^bz9s_FY7=TG{%j|UG=d^_o+ zL~8b)%bY*XY}VxEuA=tml})5{)ye6`>}&Rr#TmF^;beg+F;@o9O{2Y()a|Nj3u`F~HU z@BjZWSKYk*)cpFN&%*cr{Pgv;aAf_rHy;k3o-JSdd$0ZPr?ZpGIX3013rMc8?o0&0|Xq zjw^U2av3|Ph2FkaX1CpA-#XJ{6)I+NLhH5$obeD#TvWMg&;3UAAlCAT!&OfC_pA=- ztrgJ{T`J_C&^g!2bg@Wj;2GhT%wF~NB{xs8P2zi>W9M&O9yM(lANR58H%#&rEN>L= zE^3fayi$<1sx|vz>{IpYm#y{Jt)CwoD43MA`QEJ6zL!mGD^Kmt-tH9SasF?&e%#-$ z%eQ}5XWyRo{rSF96V>9f8MBU-Eq!%%!K>(gTg{@A57M4Z{FLZyGC4_BzVCyW8_&wK z94)dZ7`HBQTJ+?z`!en4z7Dw)`z&)o^U9XJ4!4ao3HRo@EU@k1Id_n?Ir_?(Cv{fyPI<-bnPPPH5R2*ddso-y z@15fGEK6_qsWaDne<$tzer>BXYOxP>Rc%Rat(A7R|eL^N$}e zWim4@V-Kse9!hFSa`2yQrR30(*@eHZTV=_{u{@7!LcxtI3oI%p1SnhPTv4>S_w@Q2&oc^>gm3yW z-c@Y3t9hfaKxxjyqwiXL7WH1A=H;p+WE3i_U}RxZ{+H$JrTMKgewh)1wR(@V)mGIM z8ZQnqns?ZQ&CfP{($y<#EW28c_{rGvecEws;{@KB_a>jSG-cyu zno5ccJevdxtQ3@#60hYfQ?P`myz6Uv3TlWUH5#OaBvvwj^swy4;JRbO>s%a>oq@3UsT z3Qy8ox~u$l6~9BviZHh`nu3l2OC|(Ou)I0vNZ+w3T_Ve(PG2>B_IHci^=(^M7KQ)+ zw0V2_+pP!YZc97#?p)ALkzG5hsx02{{rUb6c5>Uab3CNox}iwW8*N zC)}Ik=WukK@!9HrYsKugnUyk@d6HRcHUxRknDZ{btoZV_Qnd{QD}&$f&7b}C+n1{U z_pHtR^S|k=+uIt>kr~kZ=uYBomtSvAp84`f`n{d)nMe0p)zyqb1t&^zbWe9O2)lau z=bdf2+h@zB@ENa=GQN5$C}oz{%vB<6A2l*FuDsruv{hi{>TQq9?drbu|9_Ic{{Ef1 z((N5@Z0^1=R+_8#>eaG$+t#hlp8qU!*0OaSKMK{Cr73iLc0DBfj$ex7tny(o;|*`# z3HjBw@THxzay;v3^ZxnaIxD%~@%5i>zTdaw_p7UiuifQ%b?%796;r-gw%t1;Uu9(M zs8T+{Jj;vc)Vz$iFe?4o$U441^dA{rByO&((3O=FIR@YdpF(u`}3ui9l9J6NsnG=pE$lHN=Z^@o!J2{ zo3iG9y&R4m2b6_7Y%=3%(4Tl+z9N@CM zagbZqX2YR1E^QB`mqy7othPMSsmd;pA!0C3*Ya3t-?=|dSJclOS5)p3y7VWgn*Yfc zrYSr5e}DLKcFJnIb-{UOoR3MoKWwb^(rC*gF5j5!hAN3EbqDk!Wt;yLz7REfccNlX z!jf0wuTSi6EQ;9^6SV*7%NOGQ3I}`V%#q9qP-r#vh)b9t`r%FHBcHy~qsg-xJ}rKJ z!SLv0A^-fQRX#$WgAFy^IEo*yxaP>hyZ@jAN3%>S%ZggTxk8_&Uz*XYd`$IjvBu}e zHYGjQG95F856Wq0FsQ0u@6ZeE)-!>?f84!`?Vk5ZI-Y3y*K^(g{6_NmxissRJt|o){i|~+PCIDS^fL& zbpCs#=GR}(mJMC@tYhM8iw>nVdT-)7bR};-dXl$x{c64P|1aLx|KInoEY zf5rd#G`ar&^!>lDKHt84@u4q2FW>$BKDInJsB!CT?_al=^8W5!{#pM27k2v}|4uLW z=VO{ze%a=F?bKY$@7unX2H(Bb{_eL|fl(s2x>(ur+|9qYFW(+-I=QpF^yRl-TXssH zpS=4^UdSR@=@f@Ef|iRyfBjngW5?rN?z#DmJ9f24vNLoXo_p~1CHvohz81c|l(;c! z(GlrMQR)(F0yy^uY4l`tNbl_MQ7T=uask)MgEy+s{o7VKn5v{4Rh$-1;0>(ClBT=QMU0N;SsDo{fsXwr@@DZ4npO6&zC! z1;%xVXv#d_A+mDoncXX6&fa)0`)r$&^wz8A({G!6T$wQCZinQh%Li=~zd72rKAJLP zri|OeVU|2j*;ve!Z{k`U(9_2Aew8Ty=l_J)*NO;Lh@y;cI@(Xg_bJ9=^8ug#6~|pV(sg z7TkGmIqy)%;{pXwBfo>+Zx|L^FI&G~B(RU6{IwkG`BWc+XJsl5!83NQG-7}B?q`0A z_7TJUhtpU!0=T+2h?E&ST$J`u5P5X};69~o#w6Feh@pT*~2I5|nYYIZa4iN$gpW zakT2U4;m-9FRR8F>Qyc;oY&4gPr!kzxM=Ghe&*M`x0JIo7X^M|O>Vp}d-m+5{c^&u zRUc^V%@8a;$9eUVvi?*nQ>9ZYZM5ok`Q)`gkMrO~qn%pUu2l!Wy`>uwHg$`{g)OJ0a}H{l96yvM{%A+nAw#F03lCaj4(&w?46k47>4Siab3lMZ)!r&63tzgSMT24ez~l=oJ-C%dcm}H zua=6aZFY?`^|xZc_C-=AM!|2}ccZU4|6tIz8M>t0^xH8C^% zu8fk=#?_JGZ?!fzY_#|J9CIqB`t$buckla;f4y^qdxF11MXs?hH)rsS@Up9Ka$Azx z1rxhA&xzdK8sxU@klwp6t<|QA&zuw&zQ60R#s18zvKkBPk6*tY^!5M#{H5#5*viPA zBCmDNdd;@IBg^^a+~(J-?=IOpb5?2L!%V%zTU-j$%qDLUo3X=1@j_Jk%9IQ5mO8j( z%{`RC?69o8Cz$=swcWzvf@)vZTHf-ndoMk|=I7!6&+9+ySLc7OlV|#Wqu{}-Tg#l< zSKf&^uYbRGeaD}x`Sw3wT`in7zajOtl!?!Rtq0XA%Py@fKCg5>R&KZ6fwLjA+vBSf z{%ibR<(L2d`gZ=;fB$~^_4enEQvJ!1mkmmuZLsff$XhhWoLTkBhtf*UU72c)M?C!- zto_%VUGr5v+}bYx+Ln$j#ou2uwa;At+%0BV)ETMN$)1L<6S9_0VOTJeQ}e~P4SOAS zP5%(1$a=5Wm1D~stApp)ZeQo4GtqX_s@>e1IlhMOmf{YHb$qzJPwo^;zml{2C9|bL z$Jo4F-zBnIWE{5OIK#Mps$IqVXNSeFpU>y>pZ_NP;p$r3v)k^U{j{O$M%|%@PrpuH z{`>qso4fMS8!G0RH43V{P3(Glj^p*TfaTV0FVtH+obQ`#DGIEWuvr$N$Dk=75`RcS zyhh38K%^m~pzLzLLbfFd&yzk(*SIU-HgWlxx;wu={%Sr}-;&9oo+zXysHbEY7xitb zxz+q@d6CRZa(zC#`pp#nz9m<8(KNTS@?O&x&e^qRD$iEmna)YEeh&}oKNMt6-ytHFRQ&zg zoy*b6d$&6kCND1hq&V->kGIM~{Ex#J#NTK>m|F2$v$-Z_ax&8iL4VhK*7BF%G@g3; z)z?D9FM#Qc$!}#9P3yQj)*3P~59&X=rGEaRak9HfZT$@GM%}#64Fb0L^ZSoZP1>aK zq{c8{BK+)nQ20oKIBS}mIlwspV$)*AIMN>g0ocIzEg|3;N#<-43M za#jC+bhmX2O!l0VGE>HC%7LV_MOKi_ql7+z2-yHP960p3f6)ra_m3L|N9cX|Hp3oISVsxfBaUu z|N7xGzgKgH+)n#__s^&1=ile{{rUFw?xX1KYp}SRujcoMf^X*EPyhcXZ}BJ~#jGqx}C1rp0kh{QRr zqB~{Q(@r(SzklYu_VmxSVa25!`zv?5Xs2bJd3R*qU84@SdGA;ycdR-3=E9yd#b& z3mKg2BmB#cfBw5F>&o79NBy)n&v4v5@BH5KaMQbId|w}N&6v03T2bxZ`OmE0KhNO2 zw)X4gv@8~_sSCtxv)=Dpmm7O)*Uep9Z@4UV*?jVdifPQwnJuS6^5?}|eJ#s*dP_6Q zle-tq;?1MO-_Pxw+v>$?eEm`2=GBdh**+w?Ot}>}N$7~EYWigJRFg>xP36VUOD|u} z%+)ng(VV8<`&Mg<0K+BEi3(>fhm^VU8OPuE*&WO3bA7GOrBc?3Z=T%|I9nQ>y8Uu$ z<>%@9e?Gb%FMB>Ww`zAqd02Y$_dJn_Qwr2yE_;6V+PrnGf?GJ8%MS;95GefNd;Fu} zH>(!gSdJRu(C-b;doL@vI&bt=VXiUo`oHSS(niVl8c~to6*@tRT}(YK4_D{bc<@PkqhXwrx)M<#{}Pk=u^PuEmlZ(!_K28=$vUI-R&W*9qia!rwqMx5Cu1(g*mG&dmDJ@AcT0bgmybVQ zB0V#(My)hCtxWFKuPH`6HiA>;8BKDV?((GLp)5;ypNbN@TKgAa*)0c-1}m+x?DR-6 zNnB_nXAnFuj&H{5Ru<8;1V!@|%X|E;HeFFYGPb-!!To}*VHJk$*X_w+O{H&xg@93%Pn7|G;_(J)S}*% z&ARqhj|%(x^L-vY`N`H8b+V_)-q_STk)fzNnCg`y*01;=#mw-0*`ZZN#6q~zlxw5PyBPB10^NWQcA z-g=Ag>(0-QdtVm3Wh!5qnP6Arl0bvXKiav$$G@~qJRI{W|K#23_py6T-$wI4E=!xY zYFD7SaVb|`yM|?YP@2hW6`QM4XC>Oh?_|m*35swLELtRx!PtyG_?jio?@61MatUa0^#Ne|>xRZ{^)pKC!x={Ewx* zWqju`QQ}pz^C|=5U5Px81rldHom)QtTygE^XLZrhA=!-<1yw68jlCM4N?)2cO=H2U zJ6C2{Twgsa>PX(Is_lM0u3Vv7JZbmdpK#P!vMenw>)_|vx_c*F-NJZGP;Bulw&_gU zV^>}_>10@TtM>M`s2K-kI5>hEB-8HsGERxoNS8a|z$KJ6iA#`Uvq)Of#03FM+NADH z{PZ+qnn%};-=E9B{eK`{|N8Ci&;Q@o|NZ>6B}h%ZIg-(S@4ea&pN_u&`(SbTytw$c zPn-MWVr+N*d%FMs>;J$0e?4FS^L4n9{4%5MJ}&h+XNy6HQJ)goe}hy0x?13imL_4Y z9qUa0zWVm%=Vo*Ny?bMOYqF)Hoi0Qvsq#g>ZQNlk?82c^yQS*Lxt7Br->U_W zy-a+a^}ub4@Z)!%Ss1no9D2)Y_)FlN^t*K*f68R|3j2R`U*1%~@_1Ftiy0Xn zC6iut@^&Y1_@}*Hn}0b^Kj=qQ`2NoicL!@eznA;k+<*CV{dLc+{(t*?d-vtEHVIcL zgSMTKCr;OTq&Ur*`XXY><>`klXZ>oFQ{bD}D8#y*m*KFl+QXeM!Z+n`T~qovGf`2f zUaY*t!93H;@C~QXA*Ta@iL(W#pN^^gqbkf9oY-0Zny*}Vq9@DlU6Br{OVaEL?)AiQ z2c2JhnDc-D3zx?v_FBo++#9~wFrUedlop)YaIB`~Vk>j-zTOq4jthcLT++;a!O7fQ z*8h)5bK03(M<^a@SOR<#?1-EZfe1Y^^%Wgp!5j!i!k-ESD!Ayv6F*ZSQmW@|@%jLnHpXF$^8= zK3rrDIMg+9-^>>YXJ$T6KYf?oajNp7OeGuL@4rme$#MPuA^LHiZKxbG`*#_6!*H%3 zsfXSZW2<`9Rd&r{&A4Hm5oM5`X+7^-h_m5t#RWTS0;akb928j36C<6{v2=dTNe8A(ME8 zmEZrDtLXO+sV&mcZaNhyH;lI`ENKVQ3g=f=*=^7NTTcC)!H@9Z)(6gQIidN%t0+ZVr9)qGz({r;b0lb`#q zn`gVX>f@hR-S_KmUX8oEzW&?(`cJp@-<{Lb+K|Su^3l5++qYV>?pyGTYm!sNuaaBg zRfEzD-xt_X$`oQ_;Wl#dJeuK~2{goimrMyteX8@!H*|Tm!hzJm5O8y>6H7 zy?wUZ*7^r4GH=dV?Pr|p`#Wu|^`(-d&v#x4YI$+;?7L?#-xcgtSD&fXvZngI>_xq% zJC>7-8Lj4TzrFkNwUE2Mx;&GarZP9GF5kB(V#U@s>%Nr~vkL6kCB5e0uI$g-c4jSM z_;BQgXp=?piQEPbX_NL^-?mv-g;`t8V(b>h_wUpwG6+x4&bFR+ed%iM$rH21qH z9k*yDX1``=@7))a*HAd^n4`?TAJaqYHs-q8oMAY#W{J^>vvcoAtjW?@GwqnsMoSMd z#SMuc#8)lo*vQGWG9@W<%J#*%{ZGtyD0C%p9PV6VVA-M2qgCyuMboW6KKFi2<8dGP$ha>h>r}d}X(crQ?idb@%U_une`CEf;{=nR%r!X$F5yWPJ;{3o+`kG7Yka)WyYc6Rx4%<$S&zx~hUfI1 z_~Tu!&e2_M^=X%|amt$);=eYR_A7^1_t}42$7iI>ex>StWEP8@Nc8%ho0nV&cU!Vf zVd{%lhYzcA$)4vjS2B5N^vX#_pzhfGzy%d*I?wpNZpk)WzTt#vdcq1ZO?!iOVb(hf zvvM~}MDiV1x2Q5tOWN6U!{F(IPzhTHrgI&WCLTU}y`@#P?O=>b%k3!-9erFLC>4a4 zs%M^1oTBsS;!=aJ6WC|Wj=p`SF;A+yMK8o) z>Fx>XVI>;Ngkrs0jT;ZdzO9M!?_N8*EYu+8?i%44XUxAwt>!ptk`uxfz5Uu1*^r28 zA87@pB<24{&)%&vH@+M(F;9W1dqb3_(8SA!Vz_1=YPk~gd%}j9+)GymtZ939Y~F)8 zn!?uNYE4rF*o?WS9ug`P2;AvDH(RW6-(JnlhNrjX=HI&~{BZBfnM;^!Z88%UExQ)g z@56c8V}{J)zIPgCwQrvVH2Ch#&VN-K{PtSa8D8dynJi4fsshqe&d9#rCa_Q>&0*QA zE~}{1W*A(~mqI&iHsO;A!o>L{$PFF5Hw4@--Jby{>L~;M`Ra==q7sZ@AT@>}} z<(k{qrmV5?Ft@9Es&OckeJBcefB5@|y9C^8Ew;z|qSvNnua_42i zilFXQ(<{5?8LXIGdi9>~Rf&-2x30$T-C6zn*^7i(Z))=LEM!)h#U5UBa--hd6-V<_ z4z)@eZ(qCpT4!g+?@Om+PN`h?=W{CgUl4Ph*UrGsOQ$)3^Z2z(SKlnsPFNxJKs6*# zq(l1FG`94;t9Nhy5aOjNvZ*quNL}dVU5*w0>$l|@%$dG6Z0@pMb3>E#j+_iVnWN>( z75zSL)ynN#%_Cb&=dIc>W0y$cq~E_wBexeMCOo<*?aHjhRWxDd%F2}oCmVDgP)tgE zsw#PYl5Cmgn%mzFT8ICC{{N5o_3OXuf4~1X>%jSWarGbmS)X55em;-yeEzrh`>I2^ zR|VX?xbB7gzdyV6?^l1^|L=7CKmY%y=huI_`S#tjmzzrYxBAL7h)1z^ES`RBp*Xif zm48gv_6hX|x1YV9yLnFK;~<`QV(m!=XWp@;Cl+%rZR2of<5!()c4PLDL>mW_zCZSh z?p4i9dA(}(x#F8|pKO@Ta^dWrfZJb6?xkqmjd7W_l$~eo-J~t&t}1QZ%XNP0!As1O z0~RZ>gom1|J*u2{qBhc8?A6^l6~^yZEsOZ2=CgaJ*s`szOW1vSSr|%7rDh~_Tt77H zSo@YE%Igi*G6=l&?YYV(XZtI@%X^0|9!AmT1fBC{o1;E?rJhqVS!sT0u`^}| zYqrijVdW6JmfhsNh@t6|{^lovIZrIsPBN(e6eNByJZ|@!ZiXdu^j2+Qu+jD0`eJv; z*&Yd@ID@;vW^?wkE;Z9zAF*hKrO?B7iD7ax0xr#WVF~(vLU#e{*ufm5*~j+KO|Z+bDiC#9Kl)a*5DUvl(%WHg*AB zmzo9HowD4O^6WO<%)sh^X{1YEH*=AL7q@6mcz3gXPiSoKx z*RKY1W*m{**pqj2MV}#SyJ28R$Vx*_r%Sfpg?^l=9!8hHsH$)J>~>7LOQ=(lXYbCN z_Vpj99OUx(EO#|!neWGf?XrBrqW7nj)$gC@mu+oYX#M8NhSjg5?@m*5&7K%!!B%o8 z|N6rq4!$z2q~ELjvwxoKxBK(5->&Zc-Q{l|9?A2+xAWGn+OIc1ZZ`iu|IWOBzb^mY z{{8i`vv;?DeztdNP}a(J^{rEy`YPk&_Wl3zv|Ih&-G$cA{Of+F&5GH*esyDq%bW`9 z@|7W8FWdILs?+0pxw`84-M(js`JV0C_P+l6-k$}o|3An7xf#DVt5)Ho(vd6E!_@3! zu6~c-rz5)m?~|*uZzu2E^~pzo`OMi{tGxKcE?&E}ZBK>K|M~wW@BbgZ|JS4We?QyL z|91VMulV`q<~zMDvtO;=zWn?AyD@K9V_LnYmiRR+nkUhSD* z87?#@p`7Vj-Je(AzOLT=xiWk9+0F01T|Rs`Z28MQD^`6?J1Eo?SU$Cb>-1#x%ahfA z-(7d@@R8QU4a;s-<*(ho?A20_HwOwb&%Wz_{`>JWHqAMfIzk@3&+k;N$a7%%;_Lr? z`K{`k=WV1V48E3ry;qZc&FYNrgqsUK^Dua2Rxg@T8QHmoVWQ4^mX<8LFNu!#CNm#- zyteFp^!;7=b4^N2pQ!j`9g(>p#&GC^9z)lOkR4ptAAN55d)DUeohjx;fBtNZQeO7- z+m-42*4+NN<;?HDTR(lQ`}t?`b$ zZ+&w5e(l48(D`bYwocE=y*x&iRdog>Z_K71W?rh0+o6jh6;mEBsd&)O2 zQ<%QgH+cPSt*uv_A6k|ykX1<9mb$U5ZKhALgIN1=>!e+^yJwZG-}2StH1G8PFPej= zC3fwcmZs(RAt}vZqEfJ~$ldl6A$v=MRi&?O@j1i9`C(4SiO$E5C5^MM7ry4^fSq>DkA_Pwvj~FnwoXZ20Jj z>%7y+K}Wil|GuMa?)_Nechvu8hmznmZhjtLv@U3zw^hEQJjvkot(iL)sOir&weOvz z5O?#FYJ>N$$;H3&RJ1JCOZ-%WwMuVpHkcHCxg+NGxXh88^SkZ6?>dZJP)0DdmeCE2yFPw7NlJ^XIs9Zsb? zyJszCyIZZl7S3S}aA9^!v-nD!864%v*pK=N>Cas;kThLoDDN!?Z zRg6p0=@nD6CkALO^*Xd-^=v_LJ-ubEsW+B%1|()T+8H15PVIHHT|MVqi_5dbyDc;1 z6?g1Bbmrn>md_XRg#>3R&uP8$@EYR=j-9KsPDn~7EDKs9HgkrIz=jDc4xLrCHH_JP zl#f4yQ+9U2ZL2%iL*M6}U;Dbw{_V3>&r)Y?na%k8^R_j)k+-+)va0H7KOS)VLLo;%%5C+PIH%$q-#>B$DY=6KcnE^^zobKddW z!;WUYe4blfTfJV&V*1v+BS*ORM5r7vdmA16R<}m|`Q0s&UcsgB*G>=Wuz1Tfi|g{$ zv+G2vc39`#7Te&oDeK`prVRm_hvr7V?=v_h(%;b9Y=*t9H-Y1_KHF|6l$8_y6DN`}h2=`)|8e z%NXcvUv-u6%vW#ZfCoDvEDIyIS{|MFl-i-y|;W z?{1#9{NvTD3&oz5zP?pGhwn(pGb8zB6BK4#I9!>X_H0Q*#kSv5cq>b6`Fu+^H!~D2 zzmYMcBYmP)?c3O|?-EzGE|1c%kVsR%ziXXt1wY4**|WbZJvwN_&v0n-offwjaaJO$ z`%`>QTUkgIpOQ)`xqWe#0*k?!b9MV)-1>N-Vo~nJeR`)iJJW`}4Iof)5tntC88_bJbdIH;?z5Grb3%B)pU2 zbIIW~**HTvT=}Y};ytb#&7CF>_uCv~*6TVix;5S*mQ7iSS9OM@Qt!EynSS{# zcLQG7B?+J8JgRfVf#ot||5MZbG4ba&YCQR9D^kkfD)YCYLg;8oQ^vK*lxJC5XB5J= zwj5t1;>~g;Qzym!Us$+t(6UF*3}t6$GCxV1>0~#-Ov;%(k45f~!}k?0+r$iCpLUO2 zF}eMs^A+7hmWk0`Wv(TRiH_Iq8or79Y`BQyk<%9Ok8z7Ob+Ws#-+MmgsK)1vwZghZ zES_?qb9;3T$%HfrEWOow^vujfW}CZzdY5#ZoS+~I-|Cs4;V&bmj8G?`B9`Eg) zH0_hQTl56xZ_{@_Vs`qnVLlM-O^2_ulI6aPPCtEHoyA5|DJcL^U^ePWT#DvHr#seDyNQ;((O+h^k2*W zf4KeM2lxB`j{QD=|L+6N$p4>etmJQ(#mz~%`73?BeBI}pt8d>vI=8H0!`}aQ%lChO z%P*l38n^HJo(*%}ix+b%@4Q^N*IxJbE?NJ#|86h}>BVr|-L>t|kphPS|tq$+9TzHI2 zlr4@+OmBZKx$SK0jHAhA3k|fA^>mg@-6^)}jgp9unQK(ioGzBve;+2=%9}UO{(bGr z&dw=$y$)F?3wJv&i{i-Jcl+w<*LU9;oX%So6>!q;_TSmImJcn$}?jwwJ^?jy=(3o|8&jbx%}3vd;+$lMQ^`X5-cPXV4a`DRqP|o z-OS?V;NJPqd|m|G&xqwLTsI5eJYMWu#&-DnT6zDy+8sI?9Bn-h3l4NR88Ghm@trum zDQIU1Q$hXqE9dXq6jyz|`gi*N>c5}nKL5S??)3S4?dI+lI#at!D}L_u&t*2>KR-LY zEZf~Ue)|bQhQ?ietoeIqFP&~yeM`94_QIW{2tW7p9)}Y|9>%#8L@-Tgu9v!3Tp8th zQikhJ<=KDf_9Tw1b1fRP4?bQa zA>uiqVC$*G`1RjHw`%*$mYOp2REUJdo8^CPyfxqN`~T-l!MoW)le52H%jkM=#chV( zB?~1-#s?DnxHkS|>M;`J?w#nKB*`b>_9oA*Kua|2=<_$?XXaRJi`0B_x4BDL@10@z z8L3JcmK5cjGo0!xW`(fr)Sjxfv}0SHo$lJm9w(-Kxx63B@^Y`n8qd={J2lI-d`D&Q z>$!6kS<3d!Dpyfhxclhdowu*WYAA9mIk1_ESn@r4BJl05%2vMel~Y=q&KSQA%e9C< zs=_beaZKaKjGd*W{JW#mo+nf#S+?38Od(erPX2FYHtb;SA?XY$CRk*oDqTzI|7tfm@e#rw*yf$W4x48UTkaD(n(|6|Q6^h2z z57vpF=nCTYu>9oNB9Y0q+<%(uyp4)%FFkg*X|rp2SVH6moAkj~rSIV;TV=SP=s4`>ve zDHZJYi_2T2?d+Vn9VvHzRo>iojo0tR6PH$BQ-K#R%$zl+i<(Z>p0Puu@ahcTM;kw# zUAT8Ln}edGr|Rd)Vx5`qA0>Z_H<;4tv(;nmA*UlIMfWv792B@U!|23JpR;a)4qH32 zHI-B(vmTyVc1)(Mcgxm$w~wVxFHxGvSEBUgn4H`1RcDsWayoG%HB0nBba!KAQ}t%P z7T08UfwVbS0&ip=|F>Z=Tm0@-MnCJqmAhIb<>vHM3l_OXZ(FA?&_d@qxThw>2m*e&|AJN~E zEuS|PD!zS{mYA9ToY!y5wt^$&?HsD{E9*_M90egwG1xZGKx zP{vy-+Po;-j;db_nb;lG<@$%lwY+ znQLDwxz_z(F8}!dFaLk}|DXPU{Mr1t(fe)pCK{J#UYIvUU{T&#+n100TXml6uLzl^ z|Lm9nARfr;;2&aF7KYt?ZP=#gBjqg8bMWb;nc|6|(Yn*y4E&XztO#9mV%xTNSFX#Yy4~NhdwaLd zDS@6u<5w?xjvZOt#l7|PQQ;5S8Qt;Q3JT_&;S{%GOL%%PFY%A?^1X)ov9oW6ug{I= z7S5aY_Lafgbj$U86?40Gi#}+6-kut1|MyYeTiq3=pZfym#BX3a|5@?hp-uMkGL!k6 z4VO&3@ifnU?YojjAx`C>tc?4MZbs7j z3qh=zjbE#NygbS&`$jN+UA)ZYDaUgY7VO|Lettr!H*>DerJ|;r`fb5~N^{QN)t&X} z^kvr`58vLOU5%Ryv?69^=xCnbU%?W?w6-(j`kdm{ew#%ye_R|)PgrT&wteE)aQzX; z5x=cTXL0SCT6WKScDt?|{LL&z4Ay3!p?Vo?QjbIz1r;zpK<9gse7|Lk`~SR zSp9jLvi7f*SC22syjOJCwIR-5|7GLCUkzuI|9Mxw&|b{YyL}@2`Rh__%a?>QGxd%@Z^tLkO*3chQCPg#FZXV8{iF}uj(3M0yc%-y&F1rQ#y8hZ zIb3@8{L%wjm9=^boM~TvbuO6p@>SITUuWOu$LF5jHv8qTlfBOO_E^sAiw;k1oFV?r zx72!e*7~jgpSa8a|GWSD<@YsTT*BW!_g!1K@Nc5f2I2j`-<>_aEINAr+gIlH{}veC zy?^iDkM#S$KlU^uj^JUw=FMm3Q+m7&zaP3N5v{xDwm(Dh%1x^k zUOnHo$8uk7@gDoFpLaS3IoiHoRkq{x;mW()-U%G|UBK99(e~nZ1k=yPnQgAKO3jla zua#MKx~R>LzW%_-^R8-nR<@qvTrEbao#hRZhaa2|_BFny^*OcinM{La<$4oc_1`&1XiLBWXgj zwJ-g$FRR$D63XWIz`@1q*wsRdo*4!i(x+OE*w`Jr#EE)&{2U9WPh~g7XU{4^El4{NWaFHsgF=pACsqk2h>+Uns=M!Q#5{ z?&RgIDVBM$rt79!-iU4KO`N!d`+J@g`!dOmSE97kk8v0Er7$?ObWgB8|2ZULTB-Hi zX{A$F-(A=7>)H#0#v4~VJD$r5R(>(%*`AlRW%jo-dG}0vSxxucUNl9@M~K0+W5aHt z#97@@J$JGmuw}71E#xQ@DE3RT&6eYEn*M-g$J-1l?;b!3qcRAO-{9r3T6_GO)PkJ&#p6|@tZ1hBFV~WPlQ{1Q0 zQVNeZ2g&7Y+{o-~v(rkypmEM<+7)5Bu8W>Kc1yS3F zWU=%&d1kJ6nZqWfq4JOPvAt*ho?t9WU)Ea`_v=g;Z{8q8j%Z^H4)P3)~x-nE?{Xa1JpReKaMo5L{r4o7=i{boz< z=LWx%*51Ap!mIe1>64&R+DV>k9ovl~0yn2-XID%s^a@hFkk)rx&?!W{aPhTSl{qhD z(q6GlvQ&z!n3u99%kcBMhhi@rp4AIqyl^VE?YYfE$ErVV3)iw1uDf(&t--s>Lz7tE zKTA6!u+X5kJam=Jgp4&y8$7nLUG3(c)UWUKttjz`ql;2gNzMlW%PWUijIx_gq-^i# zJ+W5(Se}TP5QCUEbNh-X8w+>>JOb+{>l$ zW$m%n`KxYJ#b3+YdFoP)L0IF_K!1^U6DHnTb2pKT=|p6TdQ#i&-Jdt*zP_gP$)twm z%8F|eJr5!p8r^cEt@WOl-aK?I^y;kHt7a~~=Hw%iI7Mut;+}1Xn4)F9+fMl}6=*H6 zO1}MCCGXY^4%e3EjM7jgpWjN4mKMF2S|?@})c&ZAP2u%|d%`6h!N+5nWBqf&j+{wM z%#%OAZS_vG*GJ2Y#l^}6s*jj)cX!XZ_V!Cb+_}>q_spH18##OB^g|Ep4O1=|ls z%GiGSQr!NX(P49+@8p=C#PM)#u&&RMGbU~8*^PvMd156S*^Xzkm8zWXQ zS~F#KKYZuC`I=~(l9H21S&d7~j`Gm&`&$3=O|Hlmd#|A9r|Y`AFroI%x>q_3JSUka zCeQMIzwy0g^Ukp5?V$%Z$hoz!E%!{Rx3zq+C+dBd&GJp_mpxn}xM}K!B|KT|3DVVu zt(U##c|L2Did%6|M`+OxML|8EC+}9JPP>~pX=OlSYiEJxqO-qlb*$PMz5TUq{d4K_ z>&h;#zJ2*`p|$DTyN7iJl)qZ@nK+-iZ^6~$zJsNC&u5;H^JRAZ^WGd4&h|-prnI(4 zd_rKIqOMUBBiEr(OCOV?{;CbE?__w#hx2)i?_j-N37&JBHzr#pI+C6Dj) zYz%gfbTM=i4OVOsnKDs@zTsuBX4het1$weXh+Z*T%*` z_D@{pTw9M{Sm_$b&M&Xsa!*Iqghk%pUn|~W!v}G{Sh=9Xr(Bp)a@Or$e(nC|M1@5i z6Ps^8KFfAOlkwC>@1u`9kJsxhe&NUBw_Q>)G%4o%79O7xo$03>9xnDOUH);k&7Aa0 zTU?S)9@}HqX!1zSS9X~nk5HGH?S!o{xp{hzuN}W7+*Dip;K8N_{V(PkuZ}&iV9hD3 zjGCj9yK0flwvR`5$jm#}^HJ;JTlS<)t6x{zpD$nkK3lgqRcKzrR&(`P-%ICxGxuNb zJ#}B{+gr5<@2=W5v7}5}C-?1ke*W$G{XTZ0Hr8+K{ydnQU-QN9{oi+QH|4!;&bRq{ zaQprFU32=L|E=?n$yoeae5qg3S)aGRR^G9hYhU$0YPNlKUGBAa@8{XoZ@d0j_O;Wx z^88=BzFpoaf4#1H|C;Xdit_B)OcR`V%0msNYVD5lP83`fy3C2^_PN))wmi<a&#%+BA8*@j zRnqD_+suS_^6Q^jzpl0G$HkmIKmYAb5f@o;N9h@sGb|IeT9;`BKiygMqT8FXduOIe z*-lM^idh{;JG-V-C{zj^Sn9E1aZpQg=!(uMD?i!zUXDpw71AyI^6mfmtLw8j>3E-G z-gy4*^;^GVls*M*-^VPm$N{@L~K@5S2NY+rl(p6;FP zejOpl61RMxxHwoqlvT&*^i1WM$9or@RA*J3zJr&WF|)Z?aL3W>_g&YzsxT?cyt4IT z(w49Qu1%9979{i<^uL<(Y+CNV=9_EZS5?0|uYYS6-+N_ej(5@1J6et=sqt$#&7Qe2 zB(7^hb-t~_(Ym9*r%!*q)>QZQ@4Fj!HqYojWI0FY%I>YpZg0rjc09zPN$O0JgR$U( zSAKdbE^C$@kx_nLWbfy~{GC~&`smKP&V~(@6Vq#j%%@&H^5P}mqxMAgO*b^2867#W z?#SoHhW1HO7hdQva62(9u)L{xcJma&#f8@*&9bM=TELORF3IuC@N(eQ5Rb-dCAZmx z{n|erou1#<-+ue4*_m5kpQY%Zzb=t^w0pyWkj6*rtQ3yKac!|Q=AMw|a&q$}wp+Zb zIE_{*F$7#q+2T=Q+i>*pbYnI~CJTYtZP}GyBhIPU{V%Hgf9H2E$3mS>zexheoaQU~ z`Mgou6S6Y2Lzm6lLzH9B?Ok23quOQ9vkTtae|!5i#^_f;K8}7|)Tsk95$;NT<#toJ$EnB@OffH zvV`1Z9Zr?WRwi@oVzPV^&v@{j`7hse)jH|*PL@YuXQ$cmHbrXGIK?SWsH!O{b4hfX ze2GaTV%LgTn^14FXnsF0Q5TKNe$w+>1Xf=yijgw9Yo@UCXKDH8#2mBY_Q*4qrR5gw zvbTGR)L17Rj$Zu0l-q*)f`pBY_tWarA{FThMQ`|aXf`VJ<@8UEHs9A?6R0HUA|g4{ zpyiU;d>w(qYda==O`f>Iu9>k@>G;D{D?K@j!xW4fU#JPpl1RB^_U_`(3Z7|Qt2kU% z)-0Y-DImP_(21gN0%~c}XBY2Gi!okml=@9bGHKF+r^jz*bzJH{bWD(gb7f?r%(YLi zKK>}M)A5d-9+c&``&Dg^-LE{B!vSjRx*6&$rUb1hy_*$o8pv6Ng$qs=Z9Wl;3{BtGSn;u?vl~FZvSoiMTt94z5Tg*+Jd?LBJyUr)e z9x>c%{NAr=RqpK@zdN>M%ARvk33Qz-u=94*kGHqm&GXOOmE8Xou=@2WSD)Pb$M=1= z+u}A$uOKER_WG_6^F1-&rk~#SmU+r1(^*Qg%dGt;x2~yNbRx}An^ovdZxwHdzQ@cA zRuerhXODNw&LnSHX7y^pIkKni%tDCwz4nJ-vPCj7K ze&(81UdFP8d%hYt3dJP86XR`JWgePeU@);`4u9!gs|D@OZ+CktHr@VUXkzww-|f$* z>+T*alRol zeTUu0#?H9W>$8&ozS-WGGSk$DLERlw4!I?45Gnd$(Enz&lG4&|x%xG~H{1Vy zdj9{_{Xbvdw^{q#{qnncl?5J2oyJpjew~f{8@NpK?CF;GA3Z9YD$P!M-amKS{8w(1 zq~RS2m%8&t+?MLCaskg$IZano3i8?h*=59hyR3LdpQF#>($H52iflINut^RVYg|{W z(VQi!D0BVSkBW-l4}a{ouc_GgZP}Na-0i;VyZUX`FS^8a%=qt7yVE~BGD@$$JGgSm zGKJPu$NB1;%EjG|>OO9?a9w!dp^($EjJpr@4>a8Yg*1%oAyt1@${GxEIGA+N9WOXn|ChGD}C(T zQogC&ou1`VE-*Wqr=ub1(3gX8=fq`ZsGYd!tSVs;7k6*tYnxL)rwCUavgS-b>Nzbp z?2PL9s&kwBi}xR{oaUjtXz$m^p0v!zi5aKVwDfO!XgmIUF!Sj2Q#UjwpE2HUId9D} z;dht++6(t)_FX=EBVvBUbobBCHk+O8Gwd>Q`n0P-I6AA`=%;y^_bf-}2@;`m+^6kd zK2>F!PhI3TRs*J@MN+O3_s-PJ`BNu0BY4$J)p8TY&w;*C=O&l*@0UB@`&qwXLdxEU zkIi>^i)UJOOf0{Acfo;as_*}B7bYyLRPUeUuvgOWoL_M~+brpC6Blq~-1{@xt26#1 zpUJtoFAn-V{LkNF!tUys^LdZ@r~XbWle?c3?b6*u*Bv<%GQG%VUHfIG%iH)vqQdIF z{`&Lm?dz%thqwc2Z>w(K-~azYp8k6NPdDe+xSjs=^?lusZ$Ix&{J>xLbMyZH$Kz}M z{i?8AH^25r9#-Rn-bPyaT({_E`c|8L7rS5;JmUSGPW_H)3$ zcg^wn4V(Ms@3Y-s_xaiO{r?xvtpEAzs{g)DsLBXB1&Vp@`c;zXr0XIk%StXmXtBgkMjw|HWr$iu^xPlNU{UyG01 z_S}1aOlaqo#JdqQ*rS4rZ@Dj+za%a2#%`&u9kW;ensdG7;T+dl+(%lQiZ}w)O(P1` zc$g=P&zSA;!8WXo!zU(CY|ZM`Om0qchYcf*uBfKmN}E}9VRyFlbnoh2+itHdl~w*{ z{#&oS*j!DaEvH~jeY&HlND|Yr3)i-=A4sdaUHaN9PH3LGmcm=BGp;*$@0PudogEea zT9N;v#A)H8g6APDZ2vNLYBQ$Io1Ap`E~`c643p=4{rhzIuUyGEuRT%Yp>dyNjBp;i z-M6UDZlMF4zaF!xeD;y$K}r+gppes)LNr{eIRKCKUXZa$Lw)N#vv$Ap!= z>zwY)j;-amc(OEh`tkE|2Ve5X|Nr-Q_i|tN>|NKMo+vem?JwODcRlJ{y49Sd8C|P) zmTnL{u~UFIC%n4y;_KGCITCj+^F6)D-NMzqGi+TbpSPHQ;~^vGBfsa|2s!oXXL?Nd z_xHcHP5rTb> zCJH}aE-F^!`-bHR&sB{J$r+ly{jni)=j^#g+;Cy~Zvc_6@s_w6b37JA?KgrIhQD8i#!z5>Q zM%Lh;$||+3nJf%$6U|-TU7VBVD`p?55x@EDIX7bkGv(e#i&s`kGfv*2`0R^Yd&8vJMw+`$UWy&U1Co?sJ8PRS_j~p*QdB|dx%xs1A_tz>U7=69B zw)FL39*)Bg=H`5yDQszywC(ZUqW8PXb7K#eas}UMuUsh5$a&nk^7E^LC~n;%JJ}A; zEZz;}x4#^2KmD|*G`Qd3ebBX~YuGitb-Pa}RqT3OeV)HTWx8{M&;yI$MW@~s^xsVk ze3E@l@H07=nP)e%&D$KeiM?k|r1>X>#azN0WmZL(-MV?L^mf0Nmv?K4+K z9=TkwDM;_o(uyvD$1@s)Id2GD6gl#0m9ks%fyP(+cwS~*T08B;Z9n~*p2ncBukXdj z?UFhbq@2U8v)xzrg>vzHo^^-QRwZA#w{gQ!AMS^LHpuj6uiPUeCZCafCogx#UYq>s zui4yvL=@jS@HB`EhHcG@V$&Afm@&n=BVh&i&AKDaOD8tyN6Wvz7k}SAzS>+lO>lzJoLSEt zQmUmrTwJ=2*k0U~x%pnN0-wbk=jdZ1jdG0(niA7eGJ1XH&YZ4w=-RfsjBH$+b*`Fz zh`(?iW zpLq-Wp(**S9Fq?IoE+Npl>NNVo*mrppT-F3zl`CCX??dm@|dKBfV5>k^C@n-Fzy-k-_=7B77T8)SPnAJ>ydQ zf%LI(>iB`Uv@$7XP$H6PkTc@tS$WX?6(|O%A&bw{V7iA{?_3hm6*fe+c zRUXB|hDmWHIWcBQiyU4trB7t2n6t#-Qe5L3Zl}n!%{p@!YBgLZA2Xb1{O5$`@ zQVC{fZ7kPy6^Z0eY5I6`g2%*T-_ONstXdIyVB#I-!_9dekvMW>to{Qqv{Mca1*o3(v@ zNw`H?NB%2!`7e3v|DQ#BrW>!a*>&$nxQJF82*iAQ!c+-rn#?ES?9F7 z*TRB1igy1E^p34~tnR_(|I}NK=h(zXPs?j(JC)R@InG+*w9nS5?PTP+2i@&50Zhrz4 z`+c8p8yoKX{p|1W@8_@ko}L)57k+yxm$;LyNNat?&1q3`^8O6AvFqx8-({EGC2f2E z*!|kSvA6$TJZ1mm>iPdK#N+Setqu5l_WixNar5P;KNYY4^7H4zANl{^*8hBVw|K3n z;q3mPb7p6}M9upP#1jQ39y!477P~{wmFuIDoQbFIOP!OO9Ri=!*zJ*7mlwjt8pEI1 z&OJH$LA>DeH(QOkr#rumy}$qWyPt={v}-Hsci$dh6ES=iMT+5$*MJt0~jHxwHb3p`Ag z-~PIkr}+EhLRQDCZa+G|u^CG-6-(Dz1?HIa`o;a8kn}Zi;^&8r8`o67U-ha*Xvt!J z=%{_$vK>JbANj^o+MEMMlL zv!ME=6nkOF=67Pu%FSM;n?9_)SN$t9$IC#V?mV-HfT-bIQ?I>|n=3bcSu*eNhBL8e zch6eJe&q8He~$uF*u$=g&h3&DzuTP&vVQ2{HD%MQLmR#*v_G_b$L4RF^2qV$pSv9=m2&5L zy7RToHuw6%8^{zrr7`Q?uCMcEWVEQy)M~uzn9%=_jm`axj7s7CUGJ1HJ$Uf2y;T12 z(h1)fkM9c5O*-r*&)})ZcH6-CY~drjv^kttm(HlnUaYq$SBB43EOFWC-22<-z1+}v zzx`S2xw0Ou(7Q(-=;bZE=agt>>@bs+Z-U>Q1DpwqPW(=vz?41lbLQG?-k=#B0V?md zIJC{VlhfiC;Up}Q=h68)M{3vAJ2@*3#WsKL-*wgYnW=`rHZL)=%Ntx$-F~Xy_Beaz z&m&)nuV-(~nxcvGeC|^S_T@ciZpC@^)syI|e?bGyM5?vN}(^e{+#*a$2bQ z<U61rAeFiX=#PshdNSBAWGlZ5%3tp#h} ztU6a>rOUtkaQk=t#n}lWRxwUDf!op;e*P|)j8LuZI!pS8VuVC&Id z%S*o-GJSR zDf<1PCim>J)8{59_c+F0JaS}$_433IjgEP@es8#D8n!95LhNqz$~Da)y%JegvyKID zFgz3N(pkMwEy$}&+q?#{$BQ-=DZ}A?L}FC+KdM#0&bZ(BXhW;a#^BbLm3tCKEnpPV8zHqzr_f!3Q|326MS{`5f^V#9u z%h%U`{%Zg0s{N0f@_$n#>}_QJ|E~XOU#dLum7CwXJm=iV8Lbg4a$i%IUSZwrx;T&R z6wmVy-pjm;qrS>y*xFjE%(-*IW?SaH7n9xma!v~-Yi)MujlBBovqjOGY{NtQzTXJi zSkw45Q*S@Lp{ZAi;BwjGw^WkTS$fIrB4?AAly6@P-j~jXnzdfA3_Pze!r@Iap zu6SB|f8BMnk|R$x{BiiH)%3_S#J%xQ47X?^L-Gr)FPr7}*ZzL?vAz8K{=eT2Z&fYl zntxw;*2BeD3i;Rr-YzIu)%IsX+T`i% z&U(hPoA}P}T-@ScZg)R6Jh)lXEwI>c3;#sT>20?vY`)*wE@STaa@m4CPd-moz4yMj zl}Yp0EYYP;UmRQ0Xq&kAPYz3wz>T82m3bd8Y+`*TC%WRG_Pi}t% z(}gL~3JvaOzKZ7Y&dx2}6(@AJK-ep9ZhEz#YstC@uh~9FL@&P)nK0?-mNoZhPTAdL zXP17jlaE7VLZi;yqTSDR3+_+e*&g)%bi;&@WlK-(;u6f&|9$wdql3zpD_TuU^_&*H zD(WanjPv_a`S5u7@!S3PR`r!-n|)brp8bD)U5K}>eB~SSg;h4PnG+ZCE&lxY;Td;9 z!Nl_5;JebLT^29)mC7EzQg!*-uPf%4%u0Ih-P#fJ?e?|VwbF`_FX1bxBy% zw4j!j*cOhkB{F@gZmX>)&WexIiw;g)8B}sV&~V-1>qZInf3M%KtEk-(w{0(P`mYZq z((RY#m#01QI=yjE_4dE%e;?lcef!~#eS7vdt^Il~=KI{TRvtW2l}mn{EQozw5@ zfB!Y#|M%b1OWA8{B_d2hZn21MIHs`FfT$&T2r zDMBeV0*mJe-20H2c6f$?en-IcqbDCqs2w*=$oD_ayOV`qEuk@ai`~5VUtf=%DP5bD z^)9*R-tI^iFaJ*W6XCXhpE%e#DZPr#|1H6syhEz3YD)JU#k(giR!&@V=-Tdg%F+&| z=H;bDrR+v~O#S^_qTbxKW>wl=(#=|Z(1(RDFY{G?!^#sKlMM_fF%&;@ZT@-v&*PlP z`B_e9(##HRt(?bk)8u^foyLG!!i>x0EhX5FPI32AP(5vbO1^ykhXVT*kJgnp?QCUT z#h*Cq9cfP%?+#Q!^cI8T2w0xphxAduOMvmkjJ2zd|9ioo0r-HH=9`FfxR_)S08RcbO zX)*nJ|MOGZ%;bs(#GPRmS*GYN_OM^klKwk-t-(8@|08 zZ|bh&|Mc+YgkL4MW;)wGahSZdd$+OqO#ZJ0w_GP?Uao(Vw@l0Q^xEG`KW?0LTB-5V zE?$pG#R@8$UEGG;kO%moA)Cv?T3N=Ip04s~rR1B$f5fR6ec9$-`n$ zVaMduBz51oDt_Jtp&-V_6~}CD>2LQan-L>jIWu*@O+G&^zZMILrePQE$6IBi}Gr4T$h$7^6ln_BBqHy zXDm45ZZ5dF`B8)--vVW>d6nxdu3Y?8aCzy1P|L%u)3VAb* z-q>0mY2~XjhCYwZ#R_ib>z`@Fs3q!Qp6kr0rP_K{jOo~$A9Lnhi@Lt`TVmbof+OT$?TXs3<#N3nB-!E7tO0AXfoA}1SIdjoomE|7A zmwRS2>`GrCYu#}pIflm~IM$;f>eR;)4VmB!XFcX(Y02Mun?m%u%UYLDNqZEy@#v#P z-2H0|CkooIu!#7Gbr}6r+GCd@rS&qZtFLe`uZY^gTH$}@(ruq%X=gw+*yoO)e;MfrM-GmHP^?_?R&nJzxw~bN3Ymk z`(FLDN6Pu+7V}ijy|T=HKF(|TMVH;Pvh+OZ)9A38U2yXP4)L@}T6^@0BD~iwvig=g zTm-fdSuLXriX0`qf@=jbeb^6i{f$N7{7Mqvze%)=oWP|386Vv1ORsJpb z@$PQ%#9;HeneHOB*&&a`oEuIRY& zUR))0m&}Rc0AtBUxBL7(_CF`f|LxxYW3ztzTtEKThXc8K4?F#S>Kr+3{}1~=uWrBp z_hJ3NukohZRtzs@o2Ogk>YuM&aV4qi>jsX(NH2|CSCwBgR=BoQ^ayU%@7|%tDf+Hg zC)2V+_SEKV6@D2h&#qUqC%R`(IvL{S=#i&;Qb=f3XvfVfv3oh@_kWFGZCTrEQ#9k( zhFa;@UQ=Ig(dmEQ%&{#uUQ8#=Cn%ilN73#0dF$=>RPWsS@k52y>7)hs7GbDlx3(eD&*30{^`gQmB>$RmdK6 z&h$)H&Kvz4N^b8;mk^L%F_o-f7aXI?fl}KK0fWY z`~RkUd;RzF_xEf6Z_2-2C06+Vuler0?eqUWSv~*Xn_|7?e{ad`eZT$Q?@iN=f8Jy} z&t&0Uhj)w)96BMb+{L0=JbIVA9!nfvvTJg1YR8eity@?c6%?klU!Hyben91=b$KBy z3Y!v>C3YGXzY!>ZapC*>bzQID*ZuzYawY%rwW|+4PCd%Q9?V?Kc>6=1^VLIPvUj~@ zo=y{F=kRN?u)4-+E7%y2Jyq%VHuf`s-Le&>g16&Ra)2XI^)ciyWbWmPx@A& zt8z5<;_g*~-IE18ci)+}|L?l@Z~wefz{K}rP%+AEZ>k~ zDJ|hPr>-w@&)vv#{kc(JswUP+D$iJER30SvQTOqC4uiHtUOLV;bg-yhi9`b~WY zi^ZIzT>?*ad>@@GIi#p0WPZbD=gG$$LGwNvy4sXwA0L+Df*@BLX*nUc1%KKmGmuZMkoJtG^p)X#JEZ$apcA(djkg z_ubW@O2vXF^0FnjZU`~_Y}fWOVcFp*xw!cW))7w{UzXSj^e$gsch}LOUyfJKq1RjU zOwb}01qGpJ5BTI0w`m6PCzPAKJhN$vm%?X8xA$gl{7x%%zHXTJq<~47mznd#>8cg4 zAGu~k284+_#lB8_5?AV~xZ|W*N7=Duul8yOidfA2;_voR&X((XbyD<(EKMhM_K>}$ zreE!fSeDKdI;1SO>SV@@xssWWc?85gbJ>Ds&Q{W5S88XHlbkhYX3mEvYz`-8=vk<= zpLP>p#`*V_%91kz@2mv7J;l=!ZiuXy`o``~A|L0Z$(xqVxv@Rv|HS>q#plYog3bN! zSigBBcR5ihLR;NFz$MyATT2` z_UaX-kaLbT;$NO7=$zknCh>tp+u~C`j}qq@Iej|1YTo|Em3~RA?@X`ps6G)0xFJ)p zR_=sHh2tkRFaMA$iT^g9DeymH8)t8`CH=`{<(@u;>ydw$6$0N&bl9o~3eRlkJbPEB zRq3ZgsB}#G%1OIrr>)A`R%+Tku|BQ9JT$meaQoc{5&qr6xz+b~ZL@27&Nz9twutd- z6_=`)k2qpl4r$9z&FopUJN?N)*(Xab1|E5@rZD?)samj*!w$wbSK79kDOn{Jz5e*c zskKW$WoDE-r#7E!1rz5Q&F4NpEF(0CZ>6Wa%D1oEZD|fx@%fX7luC zuU`LJ$wkmfp83bG4ZDg?-06Fs8ku_Y>C3~p=E@5L4i_HSyKs)5i_m6U&!6fuTRYC* z5YUvCO!RXTe4r}FVAj2BzfC@06#vz`?$y-Z52U6P~Ocb@^V~v6_c2k(wG# zJJ?_MRNk1teD0aup_u0)N2e{fQ?j0)voLvcVBb4Ftw(;|3IJ$=t>4$??`4;db@iI6v}xTYovEEk&)AGT6N|K$9w|xUIA)OB<+L;`yj^-{&h*j^nJdyc_-JUXz{v|L`?AS?Zrt8~;{TV| z*HqU1d$#*@l}*^U`X9^dw@mqU`+nX3x7+2{Ojxyf%G+zz_rG84ti0bly>un}gchw} z7rRsPmUcxk0*d$hA1MSxC_kT}^7z#=w>O5)W{cuO&dOfwZL3=S^~BbtB7rkyrxmTZ zbh3~8{~!1D`zmU$EWBUy{mb9>({DHJ43jx^==9-_AAWuOP_f2v#ZJ@e%1xh{uN_{< zFCClv;%jPs)y-`SCwS>_885h&wXXX8%?@@~W6$Hi-8r3B3QTwHSatKqhlfF~yRx2i z9$PCt$x7U4`w3sSZ~hOtJ{{;^rlzZu!*JxtB5Rujj$Y}G;4Na$pDvLTHtJrd@W{&O z^*l9q|G;s2qH;-|IuV4+b;ashe7%^eXPnRc7snXeo?;?+> zGc(xkzT0qq(kd58R4EYQ;+ zlWAUA=AtUQU&7ac`{eY7pi5%^pS@#gRi1J_ve)Iqj^8%wm)_T^uS)+XBlO{W$0lcn zu8VI3-`VW)-+g*-QIE4__>5hKmlEdPapK66oc7Z1tM{Js--?%L}cz zU7nou@#5Eq2aaz&^k(6u{<@FH8o$4fiz~6Qk*oW9+WzOy{{4SG)cpLFU-voU&2#(e zuQz9ZzI|S9|F4g?wLaZ^-hV6l{+Yz;%Zcv}y}uXxd)aBF!)Mwi8El?y&3rtxuRV3G z5(A@87?*LigleLMp>>i(_r!u5FE)Kh>a>3M;TO-R=gYfSimJ`etq=IHXxGTT`bRb%c`P&-P?Y9>DxH|(?vo}E+wL8YD>QQsXeVo`Cj(= z_O*_@y6+Kguy@Z?ZO!;F|xa(Nq^zC7F(mqMOpEaD~EH-%D z*s@|>qTuw5g75d%cD!rZv{;5ErDQ_*>)W5V-+y;~+1l8fx8Hwvf3KpGeQ;O9)%bmf zHwkcWT^pPC{(gMk?xq`a3=*FCy-_fgwiS6Kve3~{hhMgJWy7q#dzq148kyG(b7qJ> zw0m$xE-+PcUv8b%rJoy(EbV$;pL5YO*|l@`gyM-yKSXhNuc(Y_f}@a z<3LZhXzjc0x{c;L`V55B&b;DV-XBz6bn1ruxz+a>WUsZA$yzN)>*F!^(N=P7H@zOE zdYI+&t^%e^9?vglW@)r)w(u3|H>v$ObY{cC#`2dkySz4k{NN!!v1N&~o%HU6YX&Dz zdMZqEde-rg=UJG+>luIC-c4)ln{Z(ASzeCI^=DQdHCdpj)$`)Knzl{1vDhPvD;!VO zNoGq2u{JkxPIzf|B0-c%IVGXe^JuOd<6*@sCEF$LakP5)B)0Mv_y1&IurzTlnY4bR z#&u1`FB^WVX-&DLX3EY!-)Divgaw5f$~TWkNEOK|xpw}zt-kolW0M{m=PqG>$;slA z9fZE}&rnH7=#1jdozdoc-IC|enad{}7%c9oZMx7j%Tv&4h0V$b_o8;pYKn>JIKneM z+Spt+Dq=_1tgp+SU0A3S;w5N!XV;?mxNmFuPdhYzadK<6pBZ!5=0cZ`xv7oIL>8|P z#~mKtDfuk1c4~&I2HU?j$=**d-L7o6zO~`n*8U0NM=OdHiv%T=_dZ;$Ss$o84|bn0pyYliu{-ZiS9Q?|}+<-RkAStBDiX5PAI z`*hYjEIAzYKIl}@ill45Z*0HYc=>Q=WK{MOJ)enf=L$|M%}d(1mRHwD&vo~)<|Mze zp3VfR+@%|IyagpVo_{`cZ$)$KlH2=AIXn-1a{3*h8N~FDZEwsvdz-u8@&rE4oY$8l zSUf#-yRS>u5tSnavD1J3I(ztG$oAK9GeTDIZ@IQKgxysoePU4m*9}v?23#+VFjFp_|AiQ!TTmHjTBqCm8*EejfviC7v4DEH?1n1#a^Igb+ZQJg$sv` z77NTi+~LJ2*ni=&?*n${xpRE0wx2GQPnMakwAE^2sr21-x9{Dau#`bizOCTIrVY{` z=h#YKubJSgIboyClf~RZp1SQEpM9iD6&A?|Y?`LBFMad-b<6UWtzx;gecRi!b0cbA z9C&9Ha@RE@c6zF=lFE_xtwm|;XKc7~=wXL(a9gop;-$P*%2qd&S`S{>DDwZPzkT)h zJ>^Cm$vXGH7A^!h*FcCF<8p7u3he*Cu6pHJUA{`$P!cHjSp>wleHzrQZYGBw9Z z>WtfmV+ovv>1=x#Qwp3{8anZ1>mJ|wW$*o2T8$}9IulzDM(~^F-IUwc@WO{_Ux9i; zWS5Be_iJVqmA@-uPS3u)(QfY>mkOJ8>*cQ<4(gk_`p1j8b5>p`?Fouh;bLEv{m`k= zC?+oN$fes7c{-_@OQcdlORkrqE7^Q8$=5$c1<&~(c{KrLmYk&Wpd_~B-&ZWe6 zzKCJVgV^Ua>?~6z71cCY#u`LQD~LOsI8gN3qV=9tS*s#jbk(B}hTtUgcVv3)m}47oK+P^aIx`@59`AvY4;8oW1ihasSboN!nawL{q3MYQ4xc-=cT85W zbYj$8dg%|Jh~jGT&a-|;f(;Hb^gh({+Z>eIwI}}k`cBS=iM;*7hPy4FXL2oTS#Bqo ztNLn|Xo1~yk#mpV8SQ-^Hv34Ji*n_u*vHjIf@x_n318%%s;6xV^kMJ5F|8wp>q+*a z3Nyv?)(#>U;+L&ek}hgLzT{Sn)&kGIdmF3HJKHh-Wtd|5NWfzCzl^lGmv^~Uwy>>! z_4D_!TcR_9`0Ahi=JyEBWC|5p6)2#%a`Kf=f|FNE-Z+yntG3B&hJ)@?x!wM=PO=M> z3HpYv(-xdGk*$bF=hN!+P|;k|$%iqSfMcTx@GB`e|n5~Vs}{iPP(wo^=} z1YTj;bkU;2H$C^<);&KT_3r%pZnnB9tFXx$%kq3awH1;(UxLX_qzLTCJUxW= zXI&m_saLwPB;wVsX-WzYFUFqeZ~ydI|9;8W$C+C%@`c9P>r~v+n%TcGHrjSm+2wb6 z+hnxw#Lc}P|M%1J_2*8T*MC2|`uOAd|9my-*t=`EfcS10$JApe9L z-`;V2nk4JRSK9mZd0^)zO9ta-A71DBtW$m;!>~uBeECJ?dmY^q7TrBoR(mV|cUg9# zV$p4FYv$$7g3q2$|GTMFXp_L_1B+Jm^c*|1FN86n)kSN^s{?PZ?X~s@Ssc9C;!(w~ zeavqRnlr`T%1Kl_dXhGC=|{uG#v8Xc7^=?|Hri6tR&u_&%Ohx(QC$1;e$}FxVjC?s zObiLS7dPX-?ZiV5*e6J|-DKI$_*rJ@Y~MB223Mc4sqa%?am@W(2XYGaA3%+bCT5HN$U<&k3_fnZ_1UlQ{o>fFEb}2~#>{J5<*s?DUfR&oxuyKB)QQT-jMxJ{F|Q&|-7C#6 z+$x_Ha`f7Ev$iW=H|(oh@Hpx01D8_G(_F^VhdEq$R=rG2jGw*p?VjK0rW}evlJ-5`v#nq-{OfSlG z-^}84B`4vm!_Ob5Bexk$ZriHwC-L=wOB(+{$Bx;`cfK3vs|miEaGz6{Cr!iTG&k3u z?hXxS!N;4~yizmeIjqhsN|>eVbLzTo(DR8IwE`I&?W{XzZZtO3FiKu{agBSd$(_yR zd&4hnbf45zrexfDJTf6~$;4&C89thZSuS@U&u;NJdgzROr}G{CxaB4{t(1e`Gwki} zG}w_DQt__txx40LqXSb8t@u-sH^)$e@9`Xq!((6Y6Rf{{M^{PH)A#+Z zd!1{~g+G61s8wF{X_~8^&GU@JHspaK?f7bV?1JH)m0}O)@=Dx2CXuJtdN*c9 zNU8keZC~x~n5e&c)F-lg_r0x3f^80I9KB5|pNHJrQ+wjhq)&V)Jr<`g9(mRjdD6K0 zTwHPJ`>ehFa~3>INYgx%khH3M!^~R-@@xBdq@N98?%+(hrE{!}b+PEzDH~QiF1mTO zZMNv5ry*S)Z?ui?-VXTeq%+n1{nH&ng||b`a$nwL#PC)tTT!h@$2+obYMhzZ`MKxs z>n>a_(eKQcDCTKe{;otVjZZ?Q!KUf3ra`G*>*7e|;78Yz53G4#&0M(F)YLF0MFj!$;!WPx2Li=O>^(|wWXn{$D*Em{1}n7^X{*E zx5~29&dJ=os*x)A=-TaVybL-r8oDyZw;R$H)wB3~$hrOQ9-~U@OT#rbNwUr%9m^g* z^SgD>kl*CV5^=#*t=Ur#7wYOPFlY@}E3~c3A=cLT7U!WwS3<9zed6HrBG+E-wf*n> z|9gIa+W+^gyuj1k&bem~eOh@~an@dk;77r});Co)pq96ncRvd-nSxspPC8)}bd z$}F=ja+!YejD%HAgs9c}f2-?1Y+k>ws;2J0qR#2x+vcCo&Ufy*5@o`&+3wfpZ#Q2b z?zgk=KJj*2tp4=1+dsdouo8*uGL7x;uHVYD%iBmBXVQ>wH{yBpciaasPZd)AYXH?+umyt~U<|1?d?%XInl~ov*%m zX79q+K}QX5mF;|2Yk!UX|EISfzdqje{h`-7sfFu*Z@azV@W!mm+o~VdxVB$TEO~u+ z#|DF&8x&vN{cd(lB4C1Z$1!&fuAMxK*S8se{<&iw-|E>jr9#u6J=_r!wU$lDA-Se~ zrR#Cg6D1yTHqV4rZCG}sS0r)NJe$&@$?b8)Do-O>pvU%h-M(zC&IDl%)g6uL|5%Mm zEjqopR=?akP3iiMooA;`%3yZov0VC6Nrj^@^xoX&;OWmeH&k1Az0KR{6<~O0?!3mt z$%p3td9n9S&nY{(4^IT1d9Z9famZWv@Z7yVvSxwXCT(8FFOc80lWDV0RK_&hpPO}$ z7r8xcVmPDG9(k5=<;pLtn_1GtqQ$f-~OryL^{vgx+t~;$Hq50_~`?M`#S}T)3N(xR@a^jITu$S{|KU}o?%fn>_ z`L*GDYS%o!yh-P1th@Zw?2@pWc>ZU0CS6~*ZNFH(=l$u^x%q3qUu@?sR*d8qb=iAd zN36&pV&)1l#y3^j(`)a4yBNx=rnzr9$AlGI#g>&md|bFv>3a4-?q31==URexcCF!F zuf4uo$F;9L%C*IDDu)JZa>LB{y;k?P?c46Aqw?p=;itRb&zt@5Pe6WdX0CqId3)== zciU_4+)9XIv5-4G`+WcUYhT|!e)v#5f8VcHiI!{D$L~*)Klk>uynW5j&F2rWgt!07 z-ST>0ZZ1!;lHSv@x365DOiihcjeN50<=1VTJEiV?sfanZ{PFDY_N7HVmO_aucE5g6 zdfQxf*{f7hS-q*D2cPZPvE6ZMfJ#r?&J|kn@_bJBqQ%uL4J6vPT0F?o*;<;PEWz^K zFuOBM{oFkF_3kQ;MSo_j5f$9H{F+2d<%i9d6N6{|2~#XP)opaHpvc@jZGxg&k;Q^l zJ`?Y;TCBYFcGve@am{yXp)+poE@Bj1Q!4f>sCx7J{~zAn<(GGpKXc~HZL_W&E9LrA zZP&dHTNaCob=aQ6>``F|=~p7ScW9r1V&sZz7^Ob(ysZz8DCt<%O!99p z<$2`gVpp~0u;ntw4fp1FTys*{v3xs|LLqybF!#jU``(|A_K~^w?Oyw?^B?9%RHn&4 zefTlyFiV!6%8V7B33)pmOpk>~IT^p~n6#SzY{lyZ*A^Acx;8Un+bYXV`saHOET8Ey z*QkcMz{6+5^6Ev=hsp{9c$O#$Y+UJGwb^!2_no_L%ThK;FsZ0diBvy2;p3aY87n;g z6xY1hIpQ?ObmtD0EobNaj9YZ{>>TGew&tzYOwONYI8C{!@a}=t=eU>qo*VvNF(pIc zrqyPjME+un<16j9gy8 z&uUG2aqIJ+hdv*R*%f>mRxf|xpMFxh-}c07i&ma<4@z<(!a~v-pQO2J&&qVoF5@mxEGQ#>{9hYtLQ#Hn%UWc!hIy^M@B%t5|eGW|nL@*qRX6 z(s?09cMjLiZN~THG`$Ku1U7qgC+U67$#0s`HC67$gaRve+(%y9JL0#9v!_MaWh_cuB{%i`(uN&C?SsJW}T7 z5-9ZTh-GW=T@kmuu6w!p3!_;Ww|>~<;WK}8#}a0aEjmiiIFCEuInn7gaYo06t%cIN z-v2GS`~4bk*W|7sJ?YFn(S2wt^^w=3)yR$Iubx@Y5@rw(F zx1Mh5&D;JuE?n=B_r$6-t|yKg9QwIK$G$3-tM+%heBO4q5Fw-8+wZjUuG}F}%VS)m zzjRtux?96GJC1}^f-!8F1E-`Ufj|2=O1^HD|28ChnXH8Uew6AMr5 z{(fHGZjZ#}UF-IKUE902cd1zU^g~CVltjtJ&+X5Cs?^VaeBG~4o9=I`z2C-s{P3?2 z6;abJot<}YZ%q8Ui%Eqi^LkYe1!+8GW0_#ACT{e8@5!L2obT5ilw0MxdeSc0({58e z7?vt{cii#mZuO?zs8bD7*>_nuk! z#_U#rgrWX%=ao}A7iU}OXgpqWlWFsH3vJEW2YwV^7g?2XX{SQhmW?IrEY7D*dM`Zt zlHAj`WtBA%uN|+o%8SXp{r1TxC+>XrCf?7>PR(5+BJfM%`st~OZ{CUAEPQio+SVPf z_nCj5Yrc*rK-t|=zB}OlI;(H?KOgJ=TmS$0|7Sn<|DRv~yIuOJ!-fy#zYK~i+}vic zE~tuldiLjr^4s&Jy(^OT*nO&66TN+olfy&l4vuqc`rV2ieP6_K*zivGY~IIRk6#v8 z$@90j#_&H{y+LYT{FlF&BKPSB!SO zHVBqYb6T|HKD%bXk=k`NJzb&qznfio@ZzrMwaN1X1Ae*MHcmL<>%5_!C*vF2iPNp` zN`JhOWLnGBnQ9_6g-J(I&HT)x`b9h<>37!r{xrF*nQbMn(s$3V{wh4*b#5*AZ^Qp; z3cJfgj`HU|C;LSu_br)oXHuD;gUb!4g2u}AZEN(Vmi?T$_`L`Jy7WrxpR*(1GMPNT zxqO?Bm5x_|_6`M?J4Tx>bE(=MZB{>IvcyWm<^JS1PdU5O+#WOG$fOy?1uiz~ zY8PZqJ64)0*Ry^05cSDxzQMhNx$H@Cs1k29hsnj~o4E=kzHL14`@|wQ?#WI^YCZ%m zwC;HJ>wvno)*pd5r&I4a($|Ze6k|Kq;_>r><_2}Cr8oTdSA2H2|Mlmzet-7U&mVWp z-dFwo)AahE+uz&o(ci!nzA8o~dFNw^4siid!7~l_j(=VCoHf4Y=d;h}MlI@{24_QL|rEmxL?Xu3|*a;;cfW2f)(=G||ND;#}6D@4SW z9o{GxzS2lKbK%PhhPr>RK3sji`rTalSN;2{&K`QT`?i8=@%DSR$9C;BN;R8P79OnS z=68JS9RHx{TuEX(W6IN_wU>mXt@4iaww=E^L`>7=NNXbB<)d108N2WH#9Uq4;xKcU z*6PU{EIfEy4>mSgb8ML++P;Z{vsh4lJy%@Ho|x^^Kfc}mKL5I$x!t?}3mK-z&d8j% zV&}T&e;*f!mGv(8{^IZC|6KN~kGQefq^YiCmSjKUv+USAR-K7Aje1VZG`ynK(cSXW zy`6U}Yl2g1TH4*}`(?&oqL&|1sQR~|{`cG8r&F0Pe%#WrE4Oy#m9o&wn{+mLXvVB= z@!)%KP;cVwY`vyKd-Q57*4}zsCe2pNuXEI*Ps}A@U6fB-VR`$inMWlQ`#DlmlAAC5 zC~|q@%A*ui)>}R6aL&!oljfeypQknFqh{f2rAPHAG?RYX&AU-JOVIZqXFAJoceWFc zFYQrQ6S*`~pv9*%`pOPViMx$A^xu7E57fAwUg10^T;AUBT^I|?f6+U|C0Q~aY%&U( zKE|E%W@hs2klSDJ$FR<2RZ#cWu(Akw9Uig251;<}d-?6I*za*m_SIGQd_0(}@NdJ` zJe>nqc#hhyI6ia961lG{1!b0bl^W_oRV(qCP3L&#H6h{Yqp;7Od;*rj*3u`G{at4qs(8;g z(IhF^s6UU7O}a6YM_90zhj|B|IGfP1lmp$&jb-OQ9en?ziKT7PJ4bP2lf4Wado)*H zTT>joc%JKvBX1Vv@L4JOniupkL@)bs_fgCe2AfB%XHTgHO!F+CWW6%lq-@zjSI7KU zM-N}~IYj0NS#HVNP&fI-?E-VB6y9#*2-n>E^~0RWk4r3i!oPi~$<3|l@p|}Mm(3?d z+0FWB^ph=?XVhJu$V(sG)7sHFvo~_dfx^A-ULR_IoEho$V6V{Q-YITQC*`s#`=b{c zIIMfdoVBVgaoH-fHRZi;61ScS)p0sFxuc`mH`Mg%*QFbF8}FVIZvOtTjEF@06r)}F zxp$&&f4kTIa)Zq-=Ch)^zB_GPqU>R8#ie#-sZRFIxNU!rW=}kR{Bp+MvYT7Kw_jhC zE3&M;y;&q``YyRue8JKuBGuPrE&ILcivGR|(_5Lh&5AFttL^!FE#z!l?yDO)+J{6g zJ-WENcio{@iHr$Ty>(gSy0jFEUhnnzd9nY#UiQzo`TsY(J*Bxv#UQdrT~#Vpn)|cK zF-Ld#R9&AnhgUJQ1aWl>6mH3AkPft!4f$*T|M>d<*XzGuPkvBz_5A&Lua#Kr=kmYa zrLpsHO%zWn*W+qT~Ob+4^-veWU)5C0r!FSVQ-#^lm5)Bo#- zAFsarsj03i&#cu6o#yJt&+Tm~-+$g;|Ga!$)cX$&_br?`XEOVH-;`o*v^f{{J=wQ4 zW7W;OKF%FRKb0$#@%p%cZmE{s$OC?d8O&E+yf4&wVC}l8GnEo1 zJy+XgsCWK6ODtE3#F_qV%YAn9#M)vpwKt2KZ`uER+F$qcdwtN-u7ca!o!5F#Oyyi{;gNCQ ztybgNzb_?kYqx9@f8@GDWN(u8YJIWj9{; z_N9(5Shd|YS9~pKVqUfEFo!_FlVADO?R-pm(e*cfUtVgzcgx<)m0LLW@Bgy()9Yf^ z%bpi!#jo4G{Po+SoBG!cd!`*`s#sZMvu65UZ6Ei(Q0{IyrdhKT&nj-&m$z21bK1)r*W3!c@#T`?-J1(6{t9va}1J9g!BJfb6 zan8oh;Qdprs{ZdNnArF~lf}q%)~Y2D3{smrlA}HDtX$Z_`!PbK=s|;Tkw`|4f_tBr zKTq{3euLjDUp&ufT06t^-SO+P)q2UD8AV$s+RwSQcgpFb!v1gX|DB{de@=wNlSk6W zr4#udd+z&nLj1tr;~~g8 z_s9C>-<2xEo;>1+(w2L3WX6n&A3N+Hg&03hcAd4}@|F8}A8XgjpEb^DsJDZXj<@T+vuSchoUC@(h%Hcb9Yv(dgPu}*}aO&nj@oPa! z!n&8{Ow(E#a6eSJ)G?5|_Up~r@&ESDU*Gb2>ED9gwLfS6d$N3f{m)+;cm4ghyS(|w z?Du;6|NpyowpHR~!R%_Cg)ZzH-c~o(d|SNT{^!l->;C=wx$XPK(4&6}?CSn~d-!mN zL%Z3hLwSqycbA>}bY3Pc`GrKXiEM4p!nM8Eeo5SF<13ZDxHO=cHS$8iM~3M0htBO` z4%j>~Pu*ZehtAeD-D|RAuWLQodTQ6T1sh|x3M>>ku(Uu>@6c8c%}shsML4B&Chc>+ zsxbAGQq{$6=Ecq3d~@Xc=GT9$DyiT1rsD3;&6jsw+xK;LA6GQ@RiP_qY8Q$9Deq!}9HwtqNutC0S_+O@eJZ8${Axg(ROp zIPvYOnY}mWOtd*yX|h^~-_Lz1v)|rqT_*K#sdf72x8GZvd+WAD*7n+*-IH`0wlDJ* zZCJNGjC;k$w`K}LqM5ofeCsFtFDcz&94r{c|2isr`?~C#(%*8or2V#Q`&qk6YC@mv z=?Q<|BsbrlsgoP^H+aiyGyZ87`*Os(J}+7Fdwy__R*CHD) zz7aN!u4#)h7qp9*HLo_ZE|Jy`Kj3@3BC|I8v{u3u=eN7#=C8Y7|9z7=^T*ZKpBC8c zsjAgmI>RHpx^iFL@2~vw^YT|+tUC~Vz-DgoGdDfH-W{w0I-7bl*w!C^pOdwlx9Er0 z?X_D^r`p;yb!KUHGd!ADcUb7hQ=i*PN((rWel;CF<}pLGfy47*lp>RPQp3@+5B<*A zndC{_-u2aS>jxp$h?M;nXF6UgZ%UlYz_IY{Nh>37rdLf z3VIEL9Ve*uPfHRg7hK7wq-vD-rP|Tq$;3dRug)3<#Sa@gnP;BNyQQhNI_OI2vSQ68>K0X|s+@d+pf8@$u`m+h!q$bzUj-A94Tm!DO+4w_xHlt%-rt^x7@9*@ypI=`l(TSA@i?!v2m93 z-KiGAxgpJWPHfdU4f9 z*|T+{xoL2~nRdf)j`s5#*3N%+6ybdV6y)O55bUv4w?5eEox7X#Zn>MNX+o_IemNkYqJZ=zwW&$V10dQ#~k@F<9pBJCa?f?D^xBvN4eERg;`+tA`|FL}k?|)xsUyrZ->E^Ef<6}uxU1t5~*ZKc{ zy?(z$uIFftl+fZiO8kOCcdwdcYJ6`gZ%8tSTlJ-+l> zX!16R&D+k^{QX@2rMv#~^#4D9{*;Yia_Q2ZwXD?KfSrBoviI}X#kO;-ER?^uYunzf z6TNb_{`q<*-AF36Fh{;ypa04EGiUdNnH}ENFMlt7>s2j@tn>P}KQG<;CRsk?aJb%G z-?p+ViziF*E;ak}_ww7nr?;--?)tGV$jMsw`RAh7?Tc=0+gI+&V!eD<`=7X2jzBf$K!ZP1ECTOrD^9bT=-v@sazg6V_a)8~ckmz7(TbUUviav>-pb7^ zn(u`VZ@6)9Qf%ahp1Sq7CarM1=T-Que#@+5C;dGxiA~PxW_w!K>6Seu+*_mkai6z^ z!HP3~Vr#a|2~c?U>EQqJdOP>nl%ygvjhnScjrn;)7EMk3+7+Gs>_u(YXBWkmoCTXQ zI$r7iIXtOqSLGCi4S`;Ax>C01lup09w!HJy#V;LxFBKUthd=CC^KiHFT*fmgPV?{G zvDl>4$?;SAiQ;t8$~~V1il3;?+HgaJUFrR+liQ9Tf6T!9K1|5px^A1PnfBQqBGXQD zXy(t^zjtZyP0ly+$Iqn~_^shP|2+^ll|9L)-gd2ES{q%14M07KXd^3ESpvTm;<-qSr2UHf!)ckOFtC#4z-v-5kVu_~3 z-4oQ5mOBO%%igTBp4s?4um1Pf?aBEJZ*Tvboj>pYv+MO0pMP!PsQvaVa2jizUCgY! zpB*+S=8?wHdFn-K)n9)UMDX3-wta7XMg88`av_nG$5U;?k}lm_!+BM0t;yS0e41xm zR;@Gi$bGRd`}JOaS>I~;z0bc~nXzsPJBy(Bw+jrb59(^A7ISOFMW`IOeCYUAovk|E zGW@BrI}BV{o~+%vt@Lg4L)S%bzbi$AuWViF5$k30Q1OgvV*9}uugEYN|KkhI&hRat ztR3^V#BRsWpIcJ>`2otu_Er{6B zzH^qJUD0E~2k(blyA0kYcQ@`|8yzhDa_1Z)31jwmKdgmKHr#mPFO$}o#1=T^j!Q<+ zru|D_DtB*I^qcx7`_o5uX7NK?c08PL?$I8;%RW=flip~kCHbw(U8G&fYpCdU%a^tE z-krkpZKeJ1MWVzk4X-zDI>-GvzQ$^vQ>kCN#6=rlSz*zZ^P;Jhr(7aaw{{sE2v}U0 zS$A{({_4!!=O^l3J}$d?AR=PhTKoLBhrOls__DW5UH-P{?)`nW6@QPue!64M`Q@Kq zAOC)T-~Y4sYj?l(T6nrhA;Z4A^ZH7*-hW5#mc~t5Xm?J5$4xrw`mOe@xA$czuhiq2 zd4#+0&env^6X$sD^PWsGH+O!>V7WphibbX4qi*4S7A^PhtF8Sw`^}H5ZaUQTC9LO} z&gVdNeNX4(?bDa%*Hu*Bob{_zzWVY)#^0M#o%k4xc-Nbp@o^Sy(5OG5{9vwA`%~5D z=6#G&VrKoE#%oS$+}U0&qbu~{c1QZFpR1Q>>0FCukeZe3f8z3~Q-XiJ*Q7KU3*P5u z;QG9Ocl8eQD@}~&9F9l^GH#yZl9R=!KV#Z0fuK9PGqy{poDIG`_20h}g6W*LA8ZAB zmz~fL*y`cYBXxzxuOZFIs%Mj&k^+y2aQ-==Y0KCQx;-EDH%F&^<#t|C^yXZDs?t*F zq$4wS?&gSoH0OJl*p6boCo}#r&Jwq*KXqNnGj^6bSCG$aP1T>d9lSHyg)h zE_<%DZ|3>?oQ85r)kitzab`YT^Yl6Y41blxoiU;c#mQQ7ixX#_U6}Pd*Cx5#S#-jO zmo+k7werfx;;lnWzee)4dyDpO*>UJd&av&$)m8iMeXC1Xnc*4w*;e>sh?DC=uXoDr zGj9CpDNeL@2`94}YSs<}Qxl<%g zQDM=(_qwZ#(B#qol^%_I{SY%hf`>=NT9o7(87ZL%saL_V)Isls1n?H+6!#BKy~hul3MLTXiO;{guSwyI21d?X|Uy|Gu_& zqMC5Id2hpk8_Cb!x$X#?CeiPF(r9Brqr}EGVP)w483w&?NW#FwuQf3tIw zcM9opIiv3VYq#r)0>MKcx2&jgI8*!L?WVii{(dUDyiVl|i}}=`84I0HM=japz94@^ z@~)tT+w{<*=5_enXa5Pz1cqCBd9GZS_Uz2NGFW!$cUAO$+ zbE@Z3B7e%CH||!7e+thC#n0}x*mo%N#lN4czs~<}zF+9a)2BlV!nnY?%P zO5xX+&mP~98{d5)WADw3w%Z?~!x?O5%s3t8k&^wZK;zYxt%WylUtYRaZR@qHZSRw9 zLrgb4d>tirC9GxL@3s9i9KUh$%l$~3(SP!gXm95l7Blwp9Y=lE%&8aZSJqPX={WLy z(mZb4#5s|_m)yN0`$T5isVUcI-n8WrxqQ~?P@Y_;>`T)H{n{@cU+qW{$mn_}EabGq zTqj_{6^WGKPzp1;oN>v~-1Bl{Va(=#^PbQ;t*-M5d@d+*PmwYghEJu3G5t#saUhb)}Kh`2DZHEnDlY*krKs_R9!=_rkZo{k8_( zwm#DynW*GBmBDajV!qj|ytUi&_O6`SKEt*LgR^TMtVL7Huvf;u6a6`l#Lk3I0ND|O}i z`yXCDl&Cr*vfQDqch{$vdyc$0eZ2i~`h43JE6Y-!DV5lTnXhl<-1mJ)T`%jkxedF{ zcpblc*6p%g2~YAf!!_l~h6f^Uw6z%|MJ}0k=!`-^>W<4SKPsMmU*6K}(4-aPy6$(K ztd`E}g;z==ueI{CKU(>_!&vJ>{pAUahkIO(U4Hv||G&HP`*zPdZTIV1@~)(&!c1nz zQ@%{|y#I0v2u$X9>ZrLnnltJ6>eIVq3IfANvR0g?p|groGBLo%nJ2+oIdMMNd~7C+|C4D;ag?=9}s}OXjeD z-z)Iz$%bCxntAsg+8j{#a#nH?U{V%ktaJ?6^Nq)Ie$jf#{3#n8>O?>9ebaMI^~C(1 zishX5pH3Ifu=-`N@(WAi^X2C+8|Y>HQgQooZ=G<*<$IIe_bC75@SE1gu}pYI)69t* zjosfVbnGns|8M*IvtOQWVr9~DS@tS%T}n~=s;_>sc?G-q(&QJMHgo%aJ$}!m$5mGA zkK6ydSQSzC_jUfg{rd%3EN5xGe~_uQ!2g7b#EK_3TYs1Yx@|S=>iCwpx6?paTkzNd zrG(B)C(@@f?&zN=T)BJZ%oB%}1_*LAvk1OTmy4~sx9T0s;zI$d7W%EB>3pjMC(m|T ze9O?GCT{7OHRrD{&);AD|KXkeaPMhmjl2VUM2-+X6H2HfcpM77g`uy_ZYeG_+ zEzU4@DT;}0U2Uns!Y$({*pRIM;`a_ra_uM^nQl?0I z{uFm5fd$o9@~54j_Bs6h*X)E>lHPAN|M8HMygVtdV*pP3wsL zwO^arTV}aWQBaGtl)t`4SxEBeU)~F{H~S~4=gc#3ljHd~%Tv@R$bBw3@^J`t&aZk@Rhw}C_UF@2%d$`Yvr>7&g@|9Ygf5WQEb_alZnd|t_H?D3+tJ9 zERQdgzekH%g?Z=p9hE*0RUT!%(mUem)+q9ebN0KL2j;hhsr>Ux+?7_me=A?Zf;Vb& z7IuE9IVTiRFB)1^_5IV~-_LKGwWLI98@~)ln-r83!YeH5DCn_psn?fv6MxHZ6jEyH zsV@yU_pzXzP20n8#d&3;Z5t{IC-hIe6k<`MRxMP>!FgrR>kD~@Yi49izw%N^TNjLG*L4Hqy;Y^R zzWsZ6_jCJq{k5fTXUf$CEH@rq$?+)YQLThyL+Z->`2A9^7+RNX;kdq(rDxqSiBpO5 z=lj;Ya8h$Au3m8_!cFFn4v(49t5Tim{{NHo`Fm|+=g&VCG}q;7m2qf;+a1l9vB8@X zxs;t!&A#uQyUdw7;UjWrvP2R?ce^{wJ27@U!S3Q!S$CETS=|%2yQD7vy4U8EfxgbwM#m#e zVy|QKeOGVbC=D()>HXAn%kI!b){N}Mk#Dp7u3d@O``!M!;%mhk7pokJGljQ*Z~LCQ zwtcD4#JxG&@6PNeI?PM@D~ zF%c6?!|du#PZ#n~%z4JimXR*G;jiHhonW)Y3JcdrGR^WlrZZnxhdup~+;&F(8nHJW z8BYDX^yD(9?OQhg!*sLVYkvw|V$SKXlBrY@QhwK>vrxFbr~I(w&6C1cy>%U~+$iLI zdPhT#Q{-&U&dv|6hT=DVUbz#Q_jr%G?L6+EIT>kB=AYHlwTwC?x$$71BIn=8L$0%> zL>DgAkgseOIBXif|Ev%nLsRD2sV7ZDl~&Gk={UCO=-J69IhQF!%<6DY5O-lQ?^Y|Y zV!PBSwQt^UePdS5#siy#dz=@`dp*x6oM|r=Bz*1ji>hQ*r^O;C=go~c6e#_;eDjl; zyLIAn&cx2$pZrAswt;ek!%~Ag)zZO_q_P$NK0A_=w&CZixjV1S2xdNH@ciip$$qmu zGqEOvn;#CXamoDoX^HOQ<%Y~Nji*1KE?r_X=bCx`tB-qT-IRD7uyaChB2Ut!+&5`n zO^zy4n=ed{y7l4t^uODB4RcoX8rEt~xf|ul%E!sw*mm@X((#^kQty;R;zC^dgcpm1 zEIh1q-1X4b0Ik;s4iDvYK1pOfQL>o#DyX%ibz+u;X;b%0?s@wZE%|D`l|Kj6~=@a3<*7nd->lgyL^{w zpU!(#;{D;53{xv4)+KXrx<>LoR|>JXI88I9d(tFs(ZcZCZmWZ4tQ1k6u=>*SmqiS` z&E>gg&sMAqIdb)W?dQMd`|Dqwt9`L=wcEcdPu>^Wb8|e4V^aCN=Urw}>E@rOcny1R z_T}{6J!~M6xiEIRQ}){9hl}bgWcXh{yvmt&ZT359?v2tDW&2aBAM$xjJiP1L;Y;7I zZL?c8`3z6cYMJo3-H&(WI#-)-zZk2MC1kL;!$UFgiqcjwLB;b7B`y=stDI>M<_*b? zoPO=g-E#lrH|cuG6|a*mcJAhIYx$`5;z?nF`u>9JYf_sfKi?OOFlKi&KB(|t<)~ce z?0fomTkPM3IiK&FV-x&CH(y8Tdq7>mKi1jYhiyf@BG+E9_0;6EO>9`e#;m^Efu`n(f}F_^4p%Z)@(q2?b@1e2fWY!R|bbEiY5<-ck0}U&NMF z8Q%I!3oT^bN=4@b<}xr<*(!I zy{cvJEtFOnDA@SVOnmi=$)%XdVo7vht7~23221yArP-_8&TPrg&0ox4KEeG`!n8jj zT-TKplS>z@-kQ57W?Sz4vl_=uEsTQ&{qoXpn7rAMu9m8!w_BV2kseR!_VYDIIlB1H zSYOVv6uNr$Ze#_|;*6=X3@cX~OuTs4`XHO)gh(a-N;qm+R~5w|v)o=NZ|F(#%M3(JniVxSn`&b3(!W zuiLhpu_cJT>I;}6#BO`M;gH0kGtb;+IWeoh2oM%e?3&yqxxgfC=W(OctnY4Y-xeRO z*q$wDH-GvrE*rPW?ybG2QonqB__Av6wxF!3Oy!}$y@5xCT6WH~_SP-+y!|QUKa~} zi&TF98=Sw_qw~_-*2f-eP1mdyT>i+qR@uzNT+lzIXe*=v2%3*MqV}I~EkI+}g8nX^-ujn~UE|>vjt! zWR+^Zj=H{7F8ra>`+NJpOcRVfDCNfPb@O>!E2r@Oo-kpVU76+$7K+>k7Wa}4Wfv|C zcyw-K#*7_dE4K z3`I@RLYk*DSrghW&d$F+|Ie4r|KG*`*}nhxxA=Y4I}0Oyub%06u-X4W?61i;63>Xu zS-a=Cqip)-tau6j?7R8qf55&oRdAhK5=d7_!p zqQ=HKGvziG&UrkuNAvDtx7P9Sdq` z{ciT{8t)Qjx0>v~zuL>9_?`#9_5FTtc3<>sE}5{zV?j%2f1hVK*Ri9^L$K_#K;?2X z&XY3gC#OwM+jA~w<)?EC81#ZVn740ue0EpuwDQ1m7RINN6S!0KR@_^^EkbE!_^%yl z8WR3q4AR0+zWkJ2t!FlIjk>w$(Z4qpcDsJ;7CSTD-FEWJ`|mbpPntQ~-H}biZ{nT1`x(kp z-nR5t+pB&vUUK&R-3XagPY!ZD4&GyNO84A#r{VzTEfGHtEuOz5^LLNj=Xv@z3mv{Y za2|YT$KE>o)spW9jG43cpLTirVPna>)}%E}8MmB8rf0@;%)PPipP!l$^(c zuDX5xagD0h?w@s%xMocFr0L(Pv8mu|e|E8EZ?=;ZAa8eSp}}nNMw=a(>uy%>7){t5dp$3@YE}iKwdv_)h!H zxO7Uyl;fA9j%a^4`ug&wYwznSe*QZ=^;DDv*9?&pNAyCrUSsRoS}tZeTmSGi*S^&v zjWYuoAME89DO_$?63Znly!gtabKBp3dsw;qtz*-ZpTefnN4tx{CvZf&Fh2YAz-EQo z^I1F@XS5Q8J_dPkZM+Z^xk`Ys>2MTBf{?&1yS6C7NN-I`|CBpd8LY0HJ<8R6qvNCa z9OKs^vU;sse@pEBp15qHpZv00g6kdK-_MsCb%W>8bQ$=j}6{|LbG^My}6^ zoTS!Po3`y*+4tgidj%&Jr{r=wIg4bm~pUs_jzVJ=qgI)Iz-A#8o zb8**PzgXY%@AWO8J}$YpPXD{*-nrX8@9xf#-kN*#v`WkLy=-P!4 z_V&4KWv4suyxHqs^!cpOsg-{cgLto!Mi zlbn;d6AwF;oo?=DNfU_Sh)Xna8uSy#vQ>e#|`h#mp0pZuYdpF zr}6?HAF{uHD7ZKF-12L`-+l<<&GJ(hX1&BTF{Gn%k)mE<HE@K-@#|If~k*OaiM6 zn(VHN=4w7|WM6YbF>vPh->0Wv|9#iED%E1KSWnO)*?ITl7#zcqm6 ze7bt)N~@Rew35_51PE>xV{AzKwWDA0Dyxc7B3r<9)95(=bsM>6uAat_825eOrTIa7 zXH-OdI~4h@!dH($`A&A4mjz?t`m@udZiNU1Em`<#k5Yy2(tvYYtrwqKqoDjVdD%9< zdlqjPLVbkm4_!LA(#Obtc^9MZ;*DX}EiHZlkq;}aLMC}0s*U{n?Czffmlm6SQgR4- z!NM{#gHJ`zQ6# zw=hObG=BNT+v?ZFkD*7W_WeDYn|5$5f8oa_=B4{|0vsIAUS1*aG(q+A##6H-=e^Hg z!P7pI?|20Bmc@UVqH_CRUAukFH}qTbJLSCJ8|9Vn3a;6_x<_|aXACEEWcWml=i9^b z--MPtuXdi|%YN9ILAX>P#mXu)<@MdUmgh9)Of(7(3NdZbTBzlcve9|g$)}r^uADH@ zD%>P{)uq{BB)|Lp@ZHI?&x(4Yj+zK_dit&jynBC33TK$q#6Y&JoAaD~ zg;UNe?R8nvV|h3I&Rs^c*55UCc5`=i>i%5H!F=3Mxgu-%Hcf~5oKM`}9bCILQmWBq zwU1cRTz+fwFbl^OoOfTym0X#S8W=jiu3cTWRcZ>IE;ptC_s6HJS zcHy3ld&Pvv;t88(MwaQwy_hy3V;5&l#VdWEuUBqwlz%MY=XUBwi1Hz49oIgG*Uv61 zKX~^pZ&6Z}UHR2?x0=779vL&M3d)_;T4ZRSAlRxDaQED8{)I7Mea_SsovU^nm)H^i_{x{Ve;+a?+dTLpOaxx39auXZMccUFVb8GS{v=Az^o{LL_5R#bdM6egX2O z8yBxxd!z5KnY~So`+T@y%3&wBRF}mn{5OwtESbCZ`?sH;MU_&X zsFX6Ce}8|XWO4DShSLkWJh%7SJ^uCS`~Oer|6kYt;{TWb|LuOm+n*ZZv;RGuzxtek z{dBRNN-k;Bm&{-M??`2^Ys~uU>@NrAeC#ml^65V@`-Y|vH`Bv8>vY@I6L|7{O*O7< z`|R0y?W+5VmAl^`U*fcOv71UPaZd+_=Cbwdr`bJ6?n_5HS+V{zy4 ztFs{?zK4TzLXP!_ByiqONvoI>od3OkuV-YEmCe70-`BKnRer6g-}1P6{muthqNKBw zrZkAe#~0^!hlyP6QF1i;b>e-0l#0BVSj%y-lT)YXZ`L})t3Xw8&)Vu%xs-mdSO-jByX2#9!*Pa zBh?#Tc>S9g<#p1{uIizxr;B6%Rp#f*4t;NMOfz&~oT)T>&B7^DuSKZ~yn4$iRuL}L zbiClw(fn(=&Fo5@U#%A<{W{UJI(_Q84xQ}FKa?dWPmOhXb@)J+_MxK1Pqs!n%r#IK zT_lz@<;m>+`N2*CPFn=t*M#W=dQ2)7oTOT=AS^s*-!*?%_B0dMiyBXlMU|f`nz%Rf zg;89S%IogyTT3nn{QmJ~&Gfb>+0!Pi_%d}tiT1jKS0>%4cp|s z?SO;pGajLL^Nu%4h+Y$6IM!px%y!emD`iViWXH8@T=SFLsfb!7SmhPJv_@8>1^)z{wLD9@6AeQ$2W40$=%nTL!?I+TY%Ml<#-!|6$*a0zZ}iUk6dzjbuk@{2;7-Ww7}vkvnFr{`^q25I<0CdusS=; z_+-DN>CHI}E~Vd9E}n@<&xuWOs6F=Q{So3X|G$mfjGG-QT}2^zqI&Z@QVo{8nKe^RN-pV=@7kM}@)LOO#OE)+z3%+7 zwU$TRS?)f+^JnGUb5lBg%ZVDh3tgL?r~YNiYWKGqu5L;JydQk>Q?GgY86@!L1~b+s z^%sce-r8ltXzJLk^mKt;<(=nq=1h5Gr);4tzS7`;MrrERs56t)n%^ibRy3;8tKK!I zCLke~rG?ANNmR>9wdhVnZ^B6ho#s^kH&5i8leukqrqPR;EziHkF){Lge-q_7OEf&vK4>Es zbK|ma`z(}V)vlV@bG0lmJeMyw7iKDnpB8m+&o0gip7eP}V#wu?E8P+g zA6nM?GIV(g=iUwaD01MfUHrP=Gv0-!bc^UH-OO>5qeN zSBW>yG85durqXP3`SQxI_w=T(@lVj=`BfnQuy|I$?v-7o+~-418f;EWTef!Q%6aGR z?z)?Q+=k7$=9dS5bm-lhJ6~sNK2S_3imYphHs`Qd*|fz$t$xai2_Ca*i^LgCH^@Ac zIeh%fjCqq%v>rd}necu3S)J990r}SpcfV!xxE{p6qR-OxLe%TMrlOmtv6d^O9a(95 zl6_Uv0g2P+XYclP4V|kw`COaG&I5Ncwf4?*KeEKkHd48f_u!1()jt9vvLEiK-|6b| zDRHm%$(O+{H9?`rN@6Fo2W?kZo0MXG=2@SKt_@-($e%n&}`>y$C z{`wx7_Y*CHr)8|l{HJTQ@Z7KOPjf}z9zR$Acm2O#|9{V~`(5?9E=!K(O3$pxtV+5c zdn99@9&W$9`~AJI^XFF{iT~Ta-*Wz&!{z?*bzd`GI*xw%kn#PsfvD-0wCMa;DaGRt zXG*+ijQZ=lMzh)f{rM?7?!IIB{x{)B*{d|8{+EYcHI$y`ZeC{mXGg!nt!<^7UzgU` z@_tvyTD{zht;OcugEdz-^=X&-CvGbZxaQ2;_+{P9d1bev-p>kc(Q@$j3{dL=1T66<9GbjJ=R?kxcYa7{`K9$AOHQ_V#>7E{Ku*NXC_}--tp%L`+MEXp~jkO zoEEGR+djJFZ3^we0f^e^#x6iZTH!o{ruG%&lw)vG3R!F-G_JWx7OtT|04hIPyWA$ z=hy%KciH~`(e?FzU&jBj|98Ls`)zUSxh`8T@CWkW<3E4wxL4z(+JHm{PCiW)ZI+cM zI5nm-ernvMbb9uw38!A)38@YjY*pN|>pxp}2lJHQ9n5OA7ScQAi{z2CAZ&Ie{jI?rny7dzAQ!Sm8R)#>26^MJVICwd`~(Xv1+!?+l?1Y^{(k1*AnN8 zlx5twseW}slm;)OVD7RepJ{OdxmMQR1xvXFY7XDqVZa*lIx?=!=FW6!rS*@4u7^Ee z$eQIiQAvNF>b#V{p#`4nwkLe5IoQtEzoy`g>9>$o8y`MC;`L2?>ED^A^Xk=(m$52` z*X}(p;x;{b`z5Ujk7~uP?aO&L%gHTLTztZkb&EcQasBl;p4++hBzwu!((S6w#nL|bU{m{RUmL<)lS!aZfkyOM3(9} z1S)oFE_zc}`f>X0%`yorLhs^Ey0^w({XJ!S=;Vs+Q;JzM+grrX&Aw@VV!}@bv14=2 z8c6D>eyY+aonshQAK6p-j;Y3fSH{z$XH%V*D4C>hyS8)g9#-Avw=O&OFJ<6cNqIZO7WO?NP~f9s$n&I~I~lTo0T)%j0k+W7Vop z{|-NWd8h8*^Hy*=`A8OPV7t-@D>7E7e}p@UO+UCp3%E)Sn` zFAo|lcAArMmM<}XQ!dZ(r!Uv&PA!?VHTLb1CyvEWGlaSCe)w|svfbld{mH-19D8Z^ z?e@pB{PS*q=&!H(`*`{F+WC9)71VzIzQ4cjPlf%rk5#s9#tiEZm)?D$;Td?3)ATN1 zh_glL!mOF6r>JibQ4vmC@cVP*w&46#Z!fL6`LxJtzTflbYiHZme_j*4{J2`v48ucD z^PbBcX56xNrRmmd`ek?4-4xnaSC@O&VcxcNX=|k=et*r&4a(gkx5RFLbyd}`s@?Tp zon2FQr7K(Zzij`0`tYWR2eH3I&$zf8Hs40yQvEb-d<0Y z-*OI)Ur_ z^mlT}eEcSt4U_J<*E5A~m1LAJK4Z0cj@|c@4ppyzUCVj>LYMc<)9HaLwl*%Wp$?%s3H#`Zy@=cUi~$})j}4Y^h}vN&huG-;UD zcrA_dHd0fG4(|IfM@E=s(d?iUmzwn%jhR-*7xYc=QVUC+;vE?AkL83G$7LS}FQ&XN zYtD3isEJ8@$D*oqZHgJ=%$1UHT+3aad@4HsOU?M%t1|b62Ub+sR0^joS6($WRh2dA zx#M&xlc{t3rtM#S(rgV2quvZRt(;`hzd9kAhSM*Iiik6Ac8_iQa$EJ-jH%hPnqG6d zZ@f0?!*X^Po>#12(n}{Te);1=e5pqw6)KQy1ZpM ztKoB%$23ef7ebbN&7nW!*jEGc!)ft0CEsaeLm{?ML^h*LJO4Ia8}Z z#=Rwf`L^8J+fo9@?TpQJvsmI^v28e2o#HOEYuRRxo|z4cMU41oMEV^SHG1Bh)TSbO z-Xp)sU;ej5vd~mDgC>Tw2X#MAylM@(c-!v%cW0CH@`j-%1qb_j$&uCWr7Bm9LkvEUON9p{Qt(d$u8j zV`9lwCGk+Ew0P^bTwa&=VJDPD7CH1;3bQRe`LpKL-uurLHM0~#x0t>@ z%eC>;3vr=_RFyRz4rhLyUVeT5zuESCV{ZO(w6g1MD(7R z95Jc-9LJ<3_9-7txaWAy@7R{N_Iui`U9&VL*JPGe3Z@)u6uOY6aJcyt$8mvR4wto& z*@xX9mOuGoacs~1?>Y779TwkIQ~}o({p?ob#>1a?-pyxzC9n6q{@?k3cQ{|amH+?reEo;JzyCk} z|8oD&$IqSLx@ZPVo)ny#xk>84uDlY%11~d9?lxr(;Cj{-V5s6gL#WwmjrYIY3Bj8$ z?>sN{cDKt8CVq!UGfIyAY_U9SCT$$I{`b>L>+f|>>+Ub#Rwymk^1MM)fv^32&q7`k|&M zlk=KEu6wxV+AKXKA9mDPRASAc$ga)4(dDjN)P8mMR0VjJ%&55VwR?{0!v!f!m!0#L zo=|tcJS&+oGIjQapKYh6PI$n}GNHt9nN4=lC$ey+t+lHaQ6%;GOSb)`2-ZsnV{OTvv>2PSRM zU%q*Un!wDt;Zk!p7@YBmJGpA#KKX0=pN0!EoSwByBw*2f=2GE1O4)H*&D!VnA1+e} z(c#tm`ZeSXf7k`5OXsg>NxXV08EB!tU{Pm!DpRQ#_sS^>jRI4@R!lpw-ENvrcW~j( z2#zH>J_dW=9?**1V&I!HbAIYh&%$eJm(KV_tG^Vioa8C{x1^}A;egl^iG;jeHQ!bi ztXR96=}N^kb{#p#>|45=`$Iep+||$Dxj$*5vFD;6*M438dC9lsPP7h^NxL9 z`FqLlfQt(_7pQl4NEPl&k$GS>J>V8k%DOc|0@=J%3U_F@7=AM}pRTW4@&EGi>9=zy z2^mRl*f9Ni^N~4rp7WQa2n5XCrWCL?X4aOlCoeZCP0G4a^y$m0NrkTh0u3Mjx!Aw& z=gs@SPrm$l<@Pq)`A538v#Qz5Sh$DDHebl@yJMR?^CFeo*E}ZPi{AXW?o1_XtxVyY z$3HVSFDu?*lG?IA?x@dMjzT8>={qFDEU+ebD1$;bEQgZpR#W9)lY0DnTCA9U; zTJ=O?g~-O#=yD$U!}-;B_~ne>DW@elPmG$R<9%R(Xn?>nwyHzyN*P+G!onR>rtZCT zE37N+qk_jl(`j2ALgh~`-<9C9GC9llpy)|%M;BJX*VCMrs(CE3tMt~BVaw;;%QdIP zfd72W1krm_>m7oR9_3my(X~pq)&8K*ftrArWvhF_1urUbE_wIN>sttCkfvuJtEXZ4 zzI`(5^|!w)eq-01JT0NM>7@hX^hw*?jb|#i>AauK<^1nkxcvVQzo%cHK0D`a)#uBW zC9mJl_p@)5d;EF%^obYmSJtN(Zhx0s=;U-sXxe0lSt+e=l6IL&Cs#RCYctArEXdk? zt)_+JxnXhzpP`4OXsdzqW|8KDv$$SpZ|YK6e&(cQwwd>}t+USZ7KIl2R5^rh*- zaQ~D|-i7mLUOI4T#k23LmhzvL^18b3T$3?7l|D@fU?nN_o zfBkx;DSFWsl?g5`m-sYR2poK)u289?wvv(YRQIOb+b{2U`i0Lg{4itRJ!zIE%kasb zA0?T;^lbiWA(X;3Aw$X1-L&|!OKOEvQvv_U6&5ynnVPRB3n&FPwyk)2g6FgD6Wyj@ zQ}?}#*RV`^b#i5rNc<7^si$=~6_;J#IW69AbJ?w3l5K64XV%Q_^y-@zDwt{cH2C+j z+U%K%V)H7@*3NXeYkMu^RE?IMZPKdDVBf>BE-l9&{`+`2ebV&h#=pwm*d@F1O0WMA zRe5Fm$x`pYHJy`Eq;jPsTNd5&3H9Bwa^}>1ZpBh%Msxk1Z#=JjK4jHmwvQPvcy``B zeBADtPek%p2?0mrsSO;}`Q81i7#c%ZH))txZ3x{E0h&84)b@5T zM{O2+DAzbcFFNw-&P?tEzoK8SU%xwe`C3(enpNM-*C|yd!EO=WR<2i$%v##KW~<18 zXK%VK`fi3@tFrTWy({-w<6n!KA~l_LLUJ=3t*r0f7NW zJX_bY2cETJ`7&YI^Usz0``KRy_;FnD`F$<)lDGAxmicNrOisQ_XGVE@dF!UnaW}pV zIuYq!?5+0l=l7o8x&7RJ@1B_N_y7Fr-~aFI@dYfTKlNm408`hZ?4N)l%;sKD%;HcnA;Lw^N>k^ZOKlc0 z#M-o|e6o05yzP?A?{|w{n!Svcwws>E$|X3}GFj&Gnz!F$^=6;(so`adeQLh{_vQK@ zujAQOoy+do=Gy;$xVtzw^Y8ZhAHQDP*OacBbw%L(DTTwk8nS|-4?UfJIr7B)f4}(m z|G3HTAGu5Q@V-};X{}M~cFyteUgA-8H|||XD8JW&$=7dRG|x_YTUq_RL{Rv4{)wCu zno3D$B?_vnBeRcHUeLHuxVyLT&*uMs^y|L=uK!p6cmIF>?SgObT>d^~deOB*kxQSh zozxw5{p>G}ZjV-7WtNLPdsnWIYd`;i{YmpC&c)@%n?Ko~5wTVhw9<17|98kxO`-T# ziT$^aTXOH${(g7*_1`*q<5kx@xr}6I@iX)_8D*<&o6)q!)M?v>6^BYbZ;E|-s%ept z;)1TtU!^z2)Mv*8FO5>U9(>1&K{LrD{j17~iOCF4bhl`Gtcd!zODuicii#7nD}<7k zabJ!48F_V0OMz;($H!#{MO;#~nfY(6;@*7h#Ol`W|B;o~vtLh)_|;ibJ= z>x4VDK3Q__QIY*})0Iq2*SECCs90uhG@E0^Br;ixO_AR!Mq)t%+vkWgH*%)E^4c*; zuye*!PSw3!3GttKHvgL38nfPS5tCTz!Fquy0ju}9vN?Y~DmT~6!R_VD1HK!#mIMc# zt;)WZ>$c;yg<6#C1Ow*@ZABkCQf3v^DdsQl3i;TuM=W%8N}M!{V6mTrO|OJj|C5c! zZ=Wt;;W)qi-`(x!m;1ik{&@QSKaZ#T-#%ae@o~TY^<2p|M@nzIwoIv z=c>mu{$6r^TG#V1c*^$Q6}L8Mu8k~vp2oC%W|zmab=%V9@5R>rdHh}8{%%}cnWtd9 zf#V;J2)3)LZj-yJCw8J zg141@er(W^vM%w0j%)FxFUCu9w)s4l(rhZ&Kj&?`{m;hQ&mk9*)Rw$iKc{`0@2{Dc zwKtx-GEZOO@r+G7yN(rJUw4To=e+#A-oM|T`fq>3#5eg~wRP^LlsC->EA3s5Zqses za;^Ty<8q~sFCSmOuK(Sz)=JP$?YPW`$tj$((gOreT~6f|x^@0Zq3y97%YPSGq*^_1 zuwJ%2#kI6BXVW@wrA_Y^dUQx|bYyG3kaV1^!n$FSO`>S`)JwuEAFE7wUc@9`ntby1 z&0y0YxwAf5!JmB{S3InoX4{u^anHFO7ROcegOZY7>xiG_VdoI2ocPq=*Z&gp-Dry$ z9;;%*x+fkK>=szHJ1|If%BCeu;uClBRSL2lHfgX-K5p~wuxAb?mkI){p*v_|98{n>%S~6Ke6$dOU0qNUkkOa+3DL0227e| z%FJwhV-{24o5wF}vee|(EqlJa`|GiWS*=}JuhlJ&%}{=kw|DNj=-WEZZ@ye{-7Fm5 zdGs->0AJ{i<1>0r<^;Yf6pfj|qsGwT$g8=@+aZwo-M^x*wer{hem;Kvww-N?m92&B z^>Pl2xsH15@^)hN6SMnFc476?{}~ z8?iDy6r44~Zd1%Eu781|>V+}+%OWQKtc#P*1Tktm zT;Ha~Bcpt$_=3EPs(VGrWS1?^KR7FB3ct=eo45UO+3n8@JWG6-I?wp_7tF{!rm}PS z9Q~VzA|`dM>M+WlJt->6<;h?12*0T+eT#3+uB!1=?!NMJqP0%-wn+|EWr8|07j}i@ zIckbdvNvUpxPG3cqOPS*3#8>G_Qu@fCHU$10CYTxqcs z5nY|=k;OBmYa8>DZ*QDjrtr*H^j)L$=jxeFi&k0+2`Y=)PFW$i*N9#C>xl~|l8<~f z%lrO&&Wz4`tG1;TSIw>N$;nQMovgI!>%Fr+OIGIjMqLihf4&Ctf+DIlwyitd9g^ zyUA7_Hs0*#XYcZVznp13|4gxe=~55ABmaIC-R^%ZadCTCdgwx)NvBr+&UL$Uz~JB> zfBt&e!-xAG$k+dWTD4=i4!pn0yoz5;Hv)hha^yS{(_w(7@BgQ`Q@$2W?*M9Zf z%rfP5wBBCP$VL5^oR!-Ys{*cwT)O*s2D72d#@xRa zYzw|@NJ~3)=BCI(>)Gc_GPW47&fWg{U;h8Q`t_fG_h+dW&3a+(KfV5sxc!fZ?dqXB z|1O^YXZ!!Z^*{Xg|GMM1{NYwsZeF2YpBPs$wUA%&|Bm|qyEy;viSN~~b481|+?oo{ zY4GXAb22UC(9k!1ku0Gh(ZYR<$57evxRUeE+`HwW#>T?ln!AoPbew;=YE{yLFQ-4t zJpT6UXZ`2>zs~==y8q|u{~u2K^8`-(sAd&)gMH%rBd@zwRfvS9y2wqR88|6=fvMoc zz;01dzxkqRR&p%IC$`>UUZ>Q2b_!#;{oE*)WyfWXzkXZr{qL#o{?F&v{N}B1_m6*9 zDj;(9RBIMfY3CY^+k5QR?AW(TIb>$=@>9$QzZ!Ng6}ci36&YR~=MeVox?>=F*lG1y7$p=M6tFc}kmh;qptBx~!UuHyG>fShHZ6!sjH7&0nKW zDwkxnC8xg+)Mf5wUe#>-jYV|rhO~r2? zYyWG+=o+3x_EqF&ywU*k8uG81<&#h9+?-3L!eXdh9H6Yc+?@Y(6|7;6? ztO<4xNKTR4Q6M70o924F>0RHeA>(WbVE6P81{+-u4^St0C(@RrUa=B~p=A4~%v+HO#Pm$-Hv@VAu zpHB0yx^?Yqjpf|)%eR?&9Q~wVyr!fvY|+}OZQ*OT6tyI%I&GUAwC8FX>a0vx+{^p^I=6mr@AT_C&s(r9*Lgf~<;;28?7n}PA@I@j z`w8|}NB+&%Y-$TQGNV#I#cknrj<28og}*)+Wch?;p$d;uzjff|EBb0FhdTs9kFh+i z5jtb|U0iZnYiCRH{l~wi%KhTm7`ItqZh&*yiRr#C7IlRSH739Kx#a!1>C-QZf3hfR zJSDpP^UE(f25+Np$Jh3~crIqwZ@pbTXZGJ8>hJCM?63LxW!L@p+iw@jG|yUP8vgqA z5~m%rXU*LedHwTA6`Ox1_V+ys4Dra*WtL2tV8;1RraSUR*1W@< z&MzK+UD_ues2VG_RM~W)p{k39U(p$Q_h*oT`X|Zk8QgOxu&dn+1kCB zE776v@Zr_xnI1f3IJ0HuF85td9=cI!bL%X-6>2#Jh1yOiIw^h;*sA>J@%+4ZHp}X3 zZyuju`scGEqhl*W>fVVb+Pa=4K3KR)>(%i)c6)C7mF>N^teRzQzT~zdnY!I?wW@sj zl4m*a8ce{!a=}w-#ZuZB= zjt$hDcG@FFvD#JW+V_pCerq_$cNaUiF4y+iVrn~o_KJIXzu&q|v$pD9{UIQ*u>W@M z{LPWZ4a$aJaa}Qb=~S<2JNmaOpNop-w^G(F30U!EW<;h)%=s%Xud}bnGvW?p z_*m=keeE*cl=&rX@`_5iz1!kicPVH!8~1;T@i=tm_}Rs0BFi{9cF14$2~tg;qox#Q zD}5q2TmGK?-ukLnzE@NZxk@^=?yzny_H$EtGTDL0bF(VTDkI~qlNLI##K*6HJY!MS znTe{?xvmtg^_JRbyi}*wZBnqiQOG$H*TmY_Yt6Hh_O6Z+TmJL%p~o{Udz98}m7K>| zqqy>;-xg|}XB5wSojUxqVM6We>#si^_t(E!z^1VF=^wAQc7dd2r#>8? zuB@i}{P3)=%dUlpPCxyvo)oLOzRuxq)2lSz8?;^U#o2A^zW+{`*}P=tikt8Me|Q>R|Gjn@&5nM?JM`?T-dOWG3ouUJ0G{#|33cPaG}{VAGbv_XPF9Ju9dgwc>V72jI@9Q z%6ZjyzWw}Ebzgm=gpbIT2`hCj$A;VpTduORdNxOrl~;b00~gQjwCSIpUG_{{7WcX> zYl(5QLl9GuRsQA2UrXDUt+%Y&{&<`5qmry^zO!fU-F_{9{dPlkjkIa(yHXXyo)^k; zM7nsIt_u+5JZCs*wW;qWtIP{WcCLzc6IvW#_%=7$K;m|0^{zSnzZp4Za~{#D);P;E zH-|OZZ(-2M4#S$;zxwMwJp4XCU#ZCQ`{|S4ZvSQdS2At>|2N0$e{RmN`@4Pr_lzvv zhr+qDPV7r#^mY(2^pE}j=zQI$=k@=Ze}A3D9F;QhVCk#$uag!jRvK4_n9mPNm~dpy zy;-gWJmN~9dGpuro^*RB^POL5(Wh6YMj4)!Fu1210|g{`*s z(`I~?xPJ1~^l4&i*6^pcPF((N&ms9L%Y%otuVxvxy<8QXd)LL_S(jML6)-;u@PnHCOl_7{3l(dup*oLs3hLxENzbNNbF|$Nd$h zntbaY7|x1#@}i~V)#Hu#_O6L)^S0V?C*ji!9__2SS9c4jaR)6`kz4<9$8zQ6^{G>* z@4RcdNg%XmdEDhLvt&t&YriM8?qv?x_;urTevgYBp3ymFvbJAuinC3WeC3yIF@Kg@ z%&wZ>?>^Ps+;n>Gx!O-pt7Hxz=iy-b@W3P2UY$-7~-XTv^X_L(bcongswH76_fmINo$bY%zfEdK6cRSiQeS=bik{G7q4V+%y07wFL*&AD zURF7>lxLE5bVJDDWYffnp6516RJpw{*=yf+TTPycMdi-sI+a70Qcv*|`$}ywxctZK zPO|{3?V&5*Y8OS@e?7mx*#24F2ambc^EPSkv3MY~YSw#e7l9`QCYRr+o#|=1eAMpG z3-{t**Zb!yZM6=1@aXRhp_w)8hL`Wvv_)(Y5v+FGvZScJ=Yfppvx6?T*e>%NW4tW+ zoMlO=iT2CD$*grxk`PDbwC%VXW{J)ZaWrfIG8 zI&FKdbm7wLD_d%1QgizC~TNZDyBcdy?&f8*blm2MBG z@BCJz#bwDDxw!qoxh8!sruGazzSEb?j+itlM7O>W4gA5-w`t*FXZGp3VhT%^3eQS) z|K6}Fm0O+L_59oZ6X!c+9V08?a}nm%qf-k ze3+z`tnYtpeBsEUm2(pM1(r!ZmvFCmGUa=deq>L@mua5<98)X}kKgZH)v2-|`Q+@U zipN>_#HNLnif{7#xV0dwz^!RUcFVdBj+p^T^JC0^zhxiv$bZg)LO6%JUDuoUw+$ng$gG_A#OHtS(cCk& z6~D}md-Uq1XSQy+SFvvu!&JZYGkmrOAEw=2IahCQ`P;Sf?R)ne+1FpNjZH|-F1;^V zAkbX2F!SuEx!R4Q3Mx&@re);c(vuUY$eI*#q{_QEjK#>`bbg&4!^I71%h$gB&9{&% z$?x{L?}z^%|Nk=o-!t?1cRs$h-}CQP{=Xmbf2aTdp>F^Go%#M>hoATBzpwl8aNFi4&oPWIw|d&~dtlRN#E$9pcky5nN7 zY(Z&R$D{FT;s;o5ikWFGx^8a7N(>3|nr~GpgJm!rvv+^@mF(tJ+ zTz6@@dYe5lZFY`8f9AD6mU-8unOD8KeD%$iulHs#=?Z3*Lqmx3&Fy^#1Rc^?%-`hlXYcKE9#h9ej#I zBB|*0-@liS)+!~v{%euOB+NAPvTN7(4+&`-!`Pp8e6ZPS;_f{8%*NT4zZz6~8#im7 zO-Q>o`&(O{1Y@I#=v7^(txG?swr&W>yM0;yU%~HBKh;=*y!@~1*>Yt$%hq?(7Og2N zw71G+ZOY499u!cuZo;dTOP%&HJc-C&^W?%Oo~L2VM_O98E^D$pR(t&P*BO(KKWtuj zs(=3a=hx=nkJpR-eI$0vmcKvWdA(F#eS@Lua^0ql=acn>_lKm1TB$K!%Lqz1IZ?|c z=j9$1(Gty-9jt=(T;d!LRyro`J<%jOfpe{wL#kVXYQDhJxhwM+nK~yqr-^D`b$Pp^Yu&a&rWe?WzA4H#K;;Vsl8>% zt=TRXtv}?psPZp*_x76qlgIr6uposc zra|DL(Y*AJERNc8+W(hlOvrJ1m6cffI@96YX8noktt+nGK6hz)jBkc5-;zGv=o4Rx z&vr0{2{z8+iFvJ3+Zyp=*0t}+QT-;?hu%0fubi(Oc6_$1#}Q@qmM6)1(z~OSx2v7^ zzr9T>mOmiXs{i3{!^_W%(svkiOi5Gxv?WHb-Q9Y_t5;Tgi+*OTF$!}?lhXT{(G~Wa zS95#ewNu)`mc|8b9YJefz83tQzhCY+PrALPo5@tYDtns~)35)&F5c#H%Bh*fqVMIG zwKqTiEV*}UpVRKItnmHzj(hyG_Uxu)p0kT7@gq~ym$}n6 z&Qx7i)98`mUwAC#$hy`%m>3jH|N@*4}YQ zV*B=G-QKwV>DO&HiqxO}eT`?kGuxWf`w~an3+BGwxoAUQ)Kni+?+r`M7V9Y3D~0gJ ztl8Gd^#0uP`Vahdb-xZ;PYJi5d_r@P#r)_dzOfI(=QoASXnaE7%LnU*Y&ONQgojt5O~Gs zQ=BS?USegq>ciC3$y=wozWV1lH)&IbMq_8nqUAy-X8d`yAh=AJYeuF>%cJh5l@+Gy zufLpjJb$xf^|BjzlD97@31msVPKpxc6{$R}x_{%TuCIkN8C^cDSR7_1dN4{*=7G=s ztqE7<8XnzP&a^BoEZpHzcDL1}N9kTGTox|j2~jYZFMRr&#&5$**N!b&5_T~7LBj@> zPi)>yr)OlGm^4-4#ov|lw>^J*r~9Ero5}5S>961J;1yER)o4!^KB4n{#ma4)4Vicp zUn=)abQdhzvy=7A6%k=Wej}IAgbZ8tkkD+dM#ka?cFFsDr%x}mu4%YZd**M)!|Vsm zzoj^5Uw63br{$@7DrJd^rMKH!FJIs5{ZX?l%daIguq-w%T6SdLi)9TiERtGNZ#yvE zJf|im#_>SnUEjlrVcy!F*QDM|knXLlyL!tn`n7XrXHf>@Yoopd&bXk5J}Vne9C`EN zt?#dp2-%{&YpkuiXJ6U8L^ZxeQqjv{QO?@@FPU|dvz96=%-H$=>w6K#JI1dsO6JU5 zIM2L)y0hWR>mhHRJP~}MEZ7!udhNXF_n8Z-c$yPc+tw^v@53_Z;ie1uo@S;8e{cv| zX!P&M7E$(8D`7C`&{El4;{P>EbmGgqQ>HA~!z#SamZed|I-t5FcfH4Iz7B)c*=3Gm zs?QBqYu^g-y;}S1>LWjikg%t!A3Ah?J-1VSR@51`$DFI6XBDfbLz>sU&6X}=cNnf^ zs&hV8e-U?lSSv$dL2l-Lu~7?%cFVv%6hb*g2hi zlAo#7{$9@0#nBadZ>E#WoPbNSOsC!}%~lgKcH3mRw$nxU5UU~cAwKUtnlI$$x$c=M zwTaQSujTuLeZOmaYUKq=vei%QjEptbGR)NS{>z-5rL|VIX}wBt<3gpq(b;Kiucys= zlUggre=qNQzx;lg_>_1AX~la`$*nJIE-@ua5UzzO27yu6HDPaWU%SYWD} z?#+qUqNMyCEWD>ZVs}|=dX;5U>+NfOhx;GCo5&lMJuN%C=jA(w>dp5=4!pMLvt^!g za+Y0$jSwJdba>Rr|@M_PFWUcF`Q>QfSef`^~i-B*6LE%)u6Gg6EZx<@{*e0cZi=jpF`!UN?S&)OJ# zYh26OQt*1?TtE3++Z$rmZ=W))a{<$;6D7wc9(C4raJp05*DSZ{Qq-*-Dc0p1d5kpL zHfK%K$#v|wu~PeN$oz%hZ|Clp*D7EXUBZ2K7FUev-@KD+4flqX z_jdljH|Og_uVmw`LLQU7a_s*^qTeSq zaJ#a_9Ea?a5~rF$ z96BnYdT14+l;r6R3j05?+HY`RNILyFTA=EhQ(OaAH=+)ZU|7O+qi6ehN)^U>vc?R;8!U{bE<^r_isP?(GQS zj7mCQrGCuIW~KhdU5z>wD_+i-_}+5L{e1@nxLhJ4J!4wsazyLHCdoeIdHz0kx{X9J zYfxa$vM}zA0tcqNSjx}Pv~;>iqsZ=%Rl)0i?M`q%9WCIqMQC;M4?C+p`@UVf%A)@C z^Ge(JZI%`Fcke25upfI;=fm&Qva8C#sAZ$pizpWDEn0=HA=(oIU!M&zw4MHwX`f=h zYPeW(WU{JQiC*?h^&d>V3wo|IWVJ8uyZ-v*KF(K9 zuUuFfIFTDixIvwBuZ7_YCLFZ$Vkeuk~moxd}ZWoomzT-yw&H){93H}mcG*Zi%Lcb7T$ z`{B%ZIi@E92W@W5Sh!`OR&h~UCrikxEgchzt+u4tc)h#4{obT)1`3;&Mu*nUdLz*i zB=$3)@s)$vpXJYmncv@^`~LWc1fK1A%Z&2ejqPf0xZHYu+V0ehnc7y5a>YXq9%((L zduRWZmHZO*Z(ZC1lqdcCD7oCX{@3Gt*F)>|FU@kesCzi8>s_v_V1fHB8IGzB2cL~= zo}@T*+&dDY{Ord2_;-Rf@!LLD$zRs|@#SOovr8V~Tkq|byR3Y}uPt_)@0Tkag2pp~ z6r_(jn`d8s{x{)WON*V-pQlwWd+KU!`xazbEZ^<%kv02sc<^%H)Y!VnzXv}_9^x=G zI3ZxXkXy)(nK?;->#w26Re_0Irgmm!?_Ni&GY;tNF#Ws0?0?mrNW;j3t>K^WK!VZGKE}b+a&8ris*}jWbIC^fY>h_G3>UWLDJ`ok==8Er%r4!lC8#&g zPySe~{krduzdk#Dg5653`9p(s66bf0DK~>x8C+&67I>)Pwd2gBtxG!0Cp2(ZI`uB- zQToAU^qGS(l(!~f+3P0^&7Izc9hS)zZ;We{iuEUNaa*^a$%pG4>$O*B=7!EYUXvUe zt@Ks?36~C|s2%f}c>U99EK&QOXSuIkwLVoZ(tL5(sbiYHBNTrQOLbk|kuNm(aa zR@|6dmHzO^cQ)^*k#5tDXnmFvTDB%jOwrL;kli72#tN+&ljbiu81UCoBqUN`;mN~y zJ_ejOII&FEoSDT^crC|1of)i=8X|i)otnv%w{(gu|0z}fCI!cEQSUXWvW%kpCz)gw zeoV=A(O9+W+VQ};!N6l}aV>*Y36r(=d}Onpax zUAKpL3QstCDG$MJUCLt*Z`?-CZOimYfmvtn~*+HPs5xmy=3z2luGmCt$V`C`P_$W{0rvu;Pd&pONU=*Zt0 z$@6cnFsRtgAE2adu)#e0{H--}HNO9zaamcw@euV|+CO*Y5Uhc{L?qONIm*=Xa2drucu!>%@%s*piiiLyZ9;LhnKfro$7Hw+)nqY zhgO_c`{fl%?1c>-GnTw9Zo2sH(l+O_Us5(!_e^~JIm9=LOTCw))X3>Z-Cy(lf9wCA z{(t`T+jVOvE^(fHVWwd6n#hNh^+8%pj4Eea2NZ@$bZ7pNVlU8Sv5Vj=gccn&8Q0DddR=* zU*Lsqrh+R=Pu)5bSgm3C^Qx;?nBo&=pBk6el>(JzPuHF?jd0djvyyFf(Nxz-9x90{ zkv@jrN3y1GGK}A>(DOwrP2=UHv*p`vb@5!9ERr%&HIPwAwEM}^ed=l6XJzGUO~h(u z7;#7ca~HgF$Fjj^$~?J%iCqd#eb!g1hgjBad_UQFcD^{ld?ixw!P zb2LhtEDibAt!@x1aKUKl^*~u-*Q9$7eW3Om3fdEuAZdxnZSQsAB)& z@~y>(XWV%I`9}ZcWe@*6NE^V5g zfZW48UQIh6Z>btaKdy-x%cAf9N_+k}Y{rfjGwYR_XBac9Dt~R5yFK~;-_x%Jmk1{p zwLHHWbRgznapk6~*QWiN-m`7htLbu%nX3+a3T7_|7CCn442REmInMK}=^7Iz3VKKt zeGOD{F!tH^|6uiux4-4zf1h~$*X8!pms5YgyZzkoXLQZ4Uq+rkZfCq;DsHqg4LTNI zcI?v=)n5nZTskQNOj-SBg9Xm}GkM7EyE_dLq)!miL-rh;%U8cRn zruSQyvPPoXJDKFX*wCj{v-PhRK9S)Onvme~q{m8ZW1@hrXufQwqCn=UGwf5Cx+Yr) z`Ck-$op64ayWmVK=@mSmc3pIl+EO!-J6v;pxmVSuUDtTL7%tCMTd}g_LZpuHETz*f zAxs`3hCyGsKdFc(vRn;O_EAZnnWE*D;=EX5E%3^SCT`?bpvMw~7cIOka`c zCs~}Yw#;Jgt&sL}d2al2eF}3v&sbzx8M?r6{-UTzWRmE^tkh+Kj)(p1*v8AJ2L|Wk$r4 zT=A1Pe3?`Wt|hGKSShrcPsHF=`|qBId*tiRNC-M|s`BZv6vUOeQl~`HxK(R%m&AoYI&y-(R?bb$RpOc!w^lOHRDWgq0htrI(V5R9> z*BsjHH}B4gR>9D3{1Y4k7PdxQWm!}-%X3ENRg2aLH$|R=c?yxb&m;w743{lES-#FO z=jzn3i95{7L(3f4YCJMm3I8#gc+G{uIIv^p*0{z5r6gay=e-P%pS@d@vv=Ww#>J*0EE*aAaT7@`ecGw^pw)Ery$q$t`IzLBqE{zx2NvCXT*dS8z%fOo%;59qY{ZxEe7sNod+nR!GnA89&(7{z zm9u#6`M)K0?Z0c~lb7&uuqWm|b-5&7G~QBgEa7+}|_vo6n|`mdgbnUPx=$ z@wrYme&3#F8Z(}se);p~rRv3({oGpk#amYetW0`;Ki(rQ-&u54T=LX{Mcu0m4JFR) zyLtKPpRZqMO?z9jBXno@+lk`yQo@p!6l-VKr#CPgA9B60{o3B`pE)fX7iYPh)Dvb= z{rvA{$gB>tyUsQ*?2^wlTiAb1+cmeU>bCKFo$UO!{r@*G-mk5-{Z^axzQ@8o{?FHM zyYJWj`YO7qThK^^vM-V#-jIKL zWn{3y7Va3?qKcM;*S{WCTJNj=)c>(+zJYg^qI;!*vepW@8{aLz-xR%H_x;_^mn=dD ze;YcUdl|p~Ud=hxa_t&k{s4um&8zQF~CP_};zW2`j ztLIbR1|)A!$@EE?8Trb6{X9d)89jNzsh1}FoW>CSSa;Kxl^PsV+!m~w;nNqOc_vm~ zjy20RtfML6R?RiFOFVP@BQzea{q?}%~Zl_TA$>6=ICqtwy$TdC#V;w+nQMIQ{0W@iXz$ z?P`w}zC67>jK8XJs*v34ep?5&!~-)6`fsfYbPZp=a*~U!{MFB0;pf~HIwyOH?d%R* zx6NdVjcH~1yYti6&fHsLn|Iu%NiI?`ZM9^-c>M=njU)T^IQ?wW;ALVo(#T?|J=c1m ziAOXsu>E!K$zQvQj_8D&m7ILKXpSVqiI(?QQ>qM-Ui)~GGBmcwnazE%JyunysH$#XO+|TKot^ZDkEgpij189^>+qEO-hF9BZb0=e4?s`Bb>UkyWMckgyn1JZkw$2 z?e@O=-_vf*n^zP*WvPPj9Jhc4T5Go!{&-twzu!9d{k+Gi_TMBF-vzVynx3#cY&+q8 z-nm@{6Q#b)h;_NeZ)#ksHR-C!=I*7QECP}#Ehi4E?UY++B&?|;G4ny=(P<)u%vp0S zwUjKMmIem02=+4yDxGkcbmZKp#I!XT2F;&Er)fP%2r1MlEnIR_XY)bf_d$ZXA4~sT z@!Ax;a^o?}8;gpb1@ZjYarK^_rs3KYfVM%TiGIQx5wIp$04 zyu3M~qT6M)vwps~VuOyX=dS91r%!FK)h-gt2yl13qI#}t1s9iqTffBR_3`iT^Sr;d z`IEzi;}7O^>Mn7&ORLD^^8f15vA}e>KjR_E%a-b5(bs$wrBqXbb7hz79u8==i(h|y z`t`^A{L5KhTF!RW*d<@=!!My(ye?-oPsNEu&h8Zx+2`(bie0_D!a>V*>oXr|U6Eqe z4F#d0ksUMaCe2S=IdfI|obPr2LMP0T`)&BXx~IWCHPY?E^zN{$CW}QchbXLg!zj8= zQGOHGGIz0DGp3*Kj5fM62rhP6xG!i*l(x8Dh>^ave(lLmdg_ddkMHf!nfCgylZv}c zTKc?w$&4QT3|z0zYBWWB@LhIRcu|4A-L2<7oxw#?2bWA=IAOxnzZ?qeAKX~>6s2=k zrHD0OyVvm4BjQO*`;*<%cX-L&uX{NC!R%@3@+)ViT83^tw`hV*)@OH>LoJhn#dJa& z1Abmv{7*H!f5V5THXE*aMbAmRc5qYL1}1}G;T4%&>pxFU<(W2XUe)K|`OLYm{hwcc zd8I1f?(XrP4=!a(c^GEhW!mw~+C#|2;1y5UsszFKo}QoIjo$v~ayymE>v-sKc08+iQ~C~U=0QDgI#MTEr~Jq z%vfS>dR(o-rD^i55SFEd&W|E_T#(b79)#*NSS< z+m~O?e7!AqTkcxZ&C{~DMPErM9{T*?sYR-N7ZNZ{+shkpFu4O(Y@&3(Q6w0`~9 zkLCOSD_wi`C1?Gz-K&m#NK5tZT%qG>ba=j&l7OV_k|N9e-w%yueNa0liQ^c*Mrzj zOt~K!D!lppVaL@kTv+bjUDnNYdRM@^4K~M4eo<~e@2s+GtKx^3cFR}H=sLe8Fw9}j z6kFdAlOxfW>t5AZzWe_8N74Q7$;P?z^Va6pfBXLC{r|u7|3Ci!M*rWRp8Vw4}Yc@uJNphD-#raXZ+b-=~2iNLFB$?^>6oZe=E+4kZb8b5F<=}>87kK=ata!SeQNiNhC;7ie>;G++ zum6Al@9QhNU1|C8m(5hKx|e=>{`Ks&r!}u06n)tTkVW)t)8&(HgP z!`wlE_=8(@g$tSWhdqybnI5?S78yuI{rEaZI3&+6908V9G&ociAMY6ZhfjWe6>`L8`3D!FFUf{-}=rE~NY zjP~nYcE51TXfJnEo&H08ZR?2HdaO3!aO#dW^6JyEq{kzmLgt!-KJ z117F;dwkYtlKzv^2cuMFyqRX@dem_)E4umRWzN|Yp1R7t@%iqvBx-hXsQj!?N{nV% z5%lix@u_j^Iv{y8tr%7z}q&3a_E)E>w zJmr$VJ{4^?)hL*f7g6YSyOOOLuS2Ivi{*>S}g=PI3OOxswkrT6sx%GRqRa4IKUf zvWzp0gJ$WznpUZO=dai&k#@RInyNm}RBzWgi~LcaMMl{MCN{ucw6ky}9$|ox5N2 zTSxHr$+-RZ?Eb!dUH833;1b8~2%ZetvaKN#B-umz#qS>o;kIAVD8;bEao+BKkB;B} z`$S#7MrQr>*&Zuqx}LM`{xBo?ND0H*r2?_bs$Z{Vb!cZ_V{FuQgd?qu!7*U5HHjI_(ME2j~%$|={ht&59${Zmb8db{(w24R$lLS2Tj*>4J-F?IHScF?DcmtQ|>Geqsxn?O>wa4+c`ByPs?+< zs?*$sH>c^Vgyzgz(>dej-Ogk~aaA{+o}GThVasejmtB~(mgPx*_x96^f_B=t`Y-wM zc){7zs!#7(+9;ZY7^Mg$Ue3K6`Uf=UMSxe%mHpcbz5YVyJ#iG$b_6 zQ9_`6hkgQIsOk>(>=SNsrU9uHDeL+<=Jo|0Yw0@EHA`&SA4|anB}-FQPC73uutC*- zhsCX|8Jh%x&$6so#cq01c>T-MhIC)>_p3XXyI%k}js zM~WDv9(wrCpLR2VVOD46E{oU6=UyH!oDiL_VA_2UUt^I4(&{6RBbX}#5bDYr#slk%pANggf6A!meG^Vd#HIP-F1;K#}%=Pea8 z-cAwh%iMp;eePz>65jL$6@6*3sy3ao)@iRwd(~sem~eZR!rCCI$=hH5tFrGi4BpDN z(xLBHm2Ze{)AzqO+Lc)rC2}19!lQDIS&`Y{uf?-ix0FROr3#ZiH%WZp@ZS_0am{tT z{nYrs%&X2F*fMA7hKwBPB=&_yX{zU#!#uIhq>j@mf22Qw!i5E?ym9d^4~0OAZQelx{JN^PJifW)xY^kf_*aAXInF!y7#+mU(LT? z+wHt>i!D`YJw9ts@a>h4Ho8vrn|!7_{k7}GE!SMXJ}tYF73q3sRrgXQV-rCyksUMB z3xrK?p8NZE_wvhWj=xI0Z)S4yEH{4oL?Ftz-=c3~^8PAww)NMmTj$26zpmX~61dQL zR_5l)DJN{oXPzO1ARN1(~rq(sg?$71izA za_?|uot5{A-QWH9{=EP1YrW9s_&;xMzuhx;p5FiV|99>8*Z!Tp|98#n=>KQe*Y7X< z^WpF3r_C+9ncfMficC53U)kx3PU~|n=0z>X7G=#_Ri&A&m&G9L^JU^CDMx<4{^TRu z0!7z6a#1pVGU=Vb)U*XhZ`jv-|9Af1z5dYu%Q0;8e!gx!t8L4gDPqqy1k8MYSM%znrIHJ2z45)n_B7=iF;>3fp)4mPIJvGw10`H=Me^I`Zp^>rwCRqtDjt6_VljaX_MY zwiws+jL>^m^WF1Awfc7jb(lX{cB{|zTbQ@g#HohU4dU({nHYC?)x2x1+M$v!UR{hZ z4Q;&K&!;C}_~~SRJeS;}t$!|Tvg!By`t-Q&fgIcZRE9Wfu27w8zbBqLJ$aT_;P!XS zs?ksHJPzKo*V9>3sn{>$?^YI*%^{QS#7Amg3E$FnOG)j~Tj`j>3XgSFmWw~uUfOZb zdDgv+HAmMdJG3}RS#FZmP!Z?e;JQ!NE}(0T$LBS%8@_VgUOtnnGV9aByWig3RogQC z_Mbmr@6DQb{;uo;*$FQfF1l;tpnq$<%c4@xg_lYXublmD?b(CB-&JU{a7*hLxNqbt z>d<1IYCWU&qjcu(Q^iwuyFRIw-a4<3!@}){3a7Zy)@?zm)!!aeis!GTMj4Rf8Jw}_U5=i^Q>nIZw!x1$ek1XT(-CS*fpP!?Pv9TQ%+AbEM>aw z#bP&i+m`>&H@{wXc8jJ+$@h+%Iak+lM!2^uZ@YWVc1FRPUCBK2rH+4DyV~?)j)uoM z1<4PF7JOZ=zU+AaS;Dw|m!fxk<0`weH`tXA{mfuhSaFtZB8UI|LN%L>O6i-DPnWu0 zJ#uI9bqRJYmRZf-m-b3reLT@Lb8a>R$AObB4nmoI0;UaxHGB8f{Ja%X_u=gB(@)oE z`5t`mZ&&@_s@-wV3k@bjwCxe~U3#{{CE!|Yz}@Os23gHdb}r%6Zwr<<`>5Ui&$He6 z_CE?+KawPWbnuYnZBjnOFUSD|35hdWY?LNcGs(&9I zrq};}t{=Z%e}4WAh70`W!MRoY-^MEx_k7-IZyP&rp4rl3KE=WVn+**^v+dj`e1HA- zU)9#)+kUs7`^Ve=fBAafamODlmJjE=^Ssx+^!-kWOMi|r_b)wK<1*`J!6vH+=FRE` z$u5gCsx(U#=B8Gzjxs{e(Q%-Nq6A_%$|K?Wd4WR(zleJQwYD8vj|dR#&OCTnR7&t&OrfOkrLB>-{S3)gqaORF_-5j~oW7}uR z9N%%@-RtDp6l+Nrn`0KoO7i!1Yc<#HKAZeb|NHIJrT2@~Ok7%4{Vn?SVYB@Ad;fow z@BjDfo@kKZTe>Cq&uT{ zO2EFLlTtaprK{qFS#8pFCkDJcTNS?C{cPE35AG=pQ%bk8PIOiG0x zwsL|%7fZ~GV&Cp`y%j$HAM_Xq2AZh2JEh-yo#J$2YF^74gM<@@I{3mPU#<^*?iQ-V z#Q*=EpT|Q{5z97?%}=~TCqJp2d)mNum*B+Nd%k^4ek|1Q=+3#iIdqw)k~j}XnnN%% z1FO8$^E+3yT7#|{)lGRnb>`+((qVe8oYVL9zhj^19OXHUt>fc?eOztc9b7Ff?Q4oP zjFgYEtl9GH=nI9_e~%s(Vm!zBgke9&3P1iS>zEkNNETNZl=01y#}Kj~X%q9`1S>FkiHvKj5g)$_osq+4klgvEeMXh%Vap z(9ot$+_!zwvS-ehKP>q0`)cV#Np8L~5BhSv6>?aYOpRJApsl2Or@f)DL9?-?J#G1` zhc_*^sHshQm@{os_T@FJuavyb{o;Azi;`oL=J&Q)U(%E;eHtX=)-#E|j14^~65+Ls zd*#YqQYyT)CZerBcwU-{_%x>Zx*qE>S+hQ4|MvB|wGPijp+Xr2;==^q++`P!N&>)`o2+iGPTFZ9pMKdQriE01T*zo>}fn}&Dd zTOfw zmUaBY{eRys_ndkc82sI#NoU!+i4PT)y^>>+dT@eqje%e=FMs1Qt17?w#!9KIJS%2h zA$~z zwTQnk>s&37Yzar{#&)Tc~4xt-tBK^+toui>uuM+KHXp6 z{_nR>@&EJxPyc`S|A+kg?;lI&e|mkt&g$FGlKtlm{jc5IdwZ3^>AIOIGgS^=dBAbx zW)$zWElE;AD;6nbb_7&;^tCcco@o_V{9fCnIAQX)mmPP_gAKLW_os&W?XUm!>-GMh zU+ebnocH#M#H2~05yx&^(~)wM*ixDuc0H+X`?aWS&6*1xA0!24a4zGne3zzmS<~VE zo1)Cwrdr1hkN4azy^|I>XVtwlzV72QG($t@3+{dND>S8|rgpFW+^G9iw>Cu`+L?XG zUzGXk`N`)BAN<-SZpW0pxAyZ{xW~n>l?MwCdWrs=>V5X3 z?e*p15>7(BEH0jmYKkkxmZ)Ex!Qhv|JK_I9BjGgO$$^#K4w2%)Iwef|DmGv0Qu{Sw zM)khuIv%T1&gUy%-zs)r`|07P0}T;VlfK$YwyewNk=D2C5S+_pAy+iIPlgrL)es}LQ zgt#s7X2`NK+u*4@WT z68P@*@8nmXp13i}>`obbO3%#2TF(kX4_-1%xjK3Ala$0i3@;kbOyTG_6w>nX?)K^N ze;yr=w~Md;yu1JEQ>~B{PO4KAovJo)DwM2iZ=3mKTI74LsS1|rFP7NP_y0TlEW4}W z_la#iufP6#`MA{nknEK$r^FbhFO5>|Q4CX@csxz__nkwTMLr=*Pt+An(#lxIGr#!V z_vB08ci+#yzHe*U^<|G-ZaF=lleWr%J7;MRv-<+=Ht*mS7i9VQ!~exQC>TEL`1qyf z=Sly1i{tP6lNkiIN-k7Br+&I8d%}kgg$B#+ynlOV^66=Hla>`^u4V6=K7IZ6>95=W zz5Q49_woCGKVF{Boi8@Qa^_~;;B`wyPw)ty{rh8u=c!i{b~#ndOPl54uC#IWHgT1f zsFe*`ubN&8uAHkZH;2>Z&O$Y|gIsTenluhx?DCCk$>uc?KYiG;NY1MG*F5zKd4_9G z4qh$hIMNdLmLrAt@iq7OO&qa|3SrE?az3IBpUMI^rF!4X=4Cr&;KdqlCbsNwagE!d z2c_#LOlaBux$IoBx%{5=ocMVam7m>rqzlg7m1gJDIP>|^%1Om{r}<>%aqeyo?A!aR zcBS_^kLfl+pRE;Do9v!{E#3e3Ve;-d7nu)y`?IJ1>kQ+Av;X{)lt^|mVPL7ce7p3( z%C^Tdj@unwvhv2#nP&6nyi4{ouCA)ORrUS%KKbPR^2zeX?K9YJUz=xNv!mvFY<1Q4 z+8+&t`TKw0wUEj9nY!07vh?Hi#(0&0eU@F3qWP;%bxe_17Ju6Fz|l2pst>4KUaPXI z_}sM%2`6pZ#9usIvhJ4742Bs39}+4W1@_*Y*!cbRJGJ6j-cNXQ1^nl`boDX$1SrHX zoOas$ZU2)M*Fx5*+?$fzQ7rhBUH5sZi+6)^;qFs>m3JmHG(HTxAEWSPjbSMJRE>h<%ut?`{j zDPo!iKC$(GC;pk}q+q#G#$hJE{=$|l?S22xugd(KxVfb1lY;xHv!}i;mvb$QV>>6M zuFqM!V$G{aj)=(>f7VWon)~35mXwPTQ~k#eH*YInzkm3U+e9^G8NZnfnaiFE@b9t~ z@x7`LX1qk^(q-FIC*J&jkZ>+vPC2|P@mQLa_SD0(zOBu@yQG2bLO;=o$f8W8yr(Z28 zP0sGHV$#pN6EgA>SL@DtY7^3sd~A+m*Lvo<9pa@EE|^{q_FVC0VQgb%pM59S<-AtVG|IbbLf!r? zTfQutXfo^JnSdO>_zpMb=Ru*Boi}dZeRH{aru#g$i!23xbI)|_{hRddZqC)?PhYyt z6?$ZR;)><9iu)e|S~Y)_RaNYnb3WST&G8SC3{l~^R&F--`|EywvS};ddT(uhtw?rFSJBOC6P`Q@Usi49vQ}lcph#%w#%;C#YHI8DMVVU# zy)1iwbrYXJs)5lHWAU2zne(pdw5~N5-1)Z7`q&J+^encb&4DawrbgTP)UF)3yr5e` z=RN-(*>~rUzrHPSQO8Z>()z`--`*Ej#Z<85+JrQO^!2};X@ zzjxJrF#P+g>~4MCxx=QN_A4BAd|kH4V~gpY?Rl}fOY0w{vH2*KY6spBIb!s*E%N`w z_t(9hUjB4p?LK>MUGSA7Qr8%{mOe?4I{k9m4Zm9JXLUUr`*n`{N89Jdx*kcm_Q_^T zTKUAZmbM-4oIaWs-;(Qh8hKs!pSjGp`t`MzthB#d-fq7g|NmBVb7YzIxwC8LZkx6_*Em4TMcXdy^(jS%jmuVLr0w0h?`vU? zp=``M3Bg>kDX;BZ9r``zG<;s!f4G`AOVr@VjqPv0nN9uk?B%D+?+%xzx~FK(NZ+`X$iW}dTj-6$_?`@OX3w+QQ%XD6N?x%b88^%g^=u2hF(6!xDie6EA^2whmv?o1xj_;{oiK<(Kvf4U3)^O+E{h+$rXsQP%lep{;J>ApuC(hrX z_kig=OY3CaSv=pB*2r{33W(00ydre3!pi4v3?Wlz@s!+ODS08d)%Zlv{q&2WGDdYP z*`K`X>Izx?c|n((Ky^*5xR@-rkE#Z8{^*yq+r6X*8XsP6TR?o1&?{&Un-_j#% zb&59bSjsBF6&|4-mdN3Fvug9Vgf%?3e^(qX?YOi1oomAN)BElJ)x7u`{8>F&cU$O6 z(fwh2!`H6(<$UJW);PW57kaKHt4dey3V-)2X{UYf@46k|7k>RS`Q^kj>q2YmZsu33 z7>afY{`vIvSH-<5QO#%?GsB&wa-0c z;hne6KjDku-^{ad!gu~%AqtU&%a7aYzxegK(mtSM?T;+S#iuUjF>}<;xD!$&Tf(K41U))au?k=4EfMJ!@%LzV`eK!NOfzg3agi zF;B_QcNQtjD(o@*S@LSFsj;ZA!kB8Y^_Gg#OoVjT0 zmKB?>K3QbNUvsR`r(bizz0U?SRj-!{Sskyau2$SKbCtvFd+Q#*HCy*v#xE;% zSJyvfa{j7UzQ^O;sf@kxjH&`FpD8gNxBI^RZcp+L!@p(H41I?F(fMIjlQ%tLdV2AN z?wp5;cP*S}8OFpYc&aWlcG)z^(`26G+i$z~|2%#A@@4tD|L4!okKfoQbx0x0_xPOr z>mR>qP4~99&*@mX{Oq}OLuD4{q^$Chp(Sc*PkD+!6oRw{`FtJX(sc# zl!~7iZ}|Cc!TR)VewO#Rw@h)qqB_CYos(g$Klx3el;!H-A$=YdLqL(%JHxx<5*0tXZ~Rfk~;@cV@6&cv!6Joag1S2mhSjIW2zg zuREn8;d?UwiW>x4dj38tJ0n|Q;nF*r{Uxq9_ktAh6j-VO_91Gg0( zEIcs}GaC*ZF8&l7w}NxhhIb|c0h=!Ut1Q3kS=zeec>;&$_smrSJKt_!Z*M=}Zq7D; z`HTAB3hupV`cUhhx@e+lpMvidrVF;=0yge$>^FZdxaP0B__fd5qMdW}(kC4^%w81! z(V1&%`|{)Y_20Aq{_x%L>+P%j^E`9>%$}9Rd(7<6NNy6?6@J5IUF4E!+@6k0g)W4A zTDZhVf9ETn8BAGsbiG-*9BeuKvdhAK*3C+Z{bPEP?Pi|)J++siL4i{(IURg=7&!)T ztZd1(31z-m+2Z_t=?OqztZbT*yDMdxVNww6}d@kztV2X>XHeanlb%U zfq8Z)^Q5e4#Tzv||6C|)Ej_)yOg|tc@_Epgc~3*E`tI!gm-28TQ;@IH=5q@=eNz=H z*WY}lzCNL=Y`W3(-?6&oTH+HTo_)5CZ;H5g>WIVSlX>24Q(5;uw`y?6+R~dUCO$z| zL*PTT>lCRg5x=K*?-UWNxM}lp;)wwA;b$5+O=YO$jK|br)y2KOCI(t`p zUt(HwB*Ebo!=w|Erzcw7R$*|N8sHmtSWHf8iU^n5gDETAJC}T_2~#m&`;zVCXX}Xc zN{=-M2`h0+Pj4aIF2oNl;WiSY3={2xg$y;KAbey-e{b~!d}!bKi`e{msw{p$~>>L0kH zIQ61J<)5x+JLiNio#}CAfoI=inZt~w={tUx2v5AX-1?xyk2zVpOgFz(>6-D-@@@3d z=GI!}&+MFD`&R zdHH@{{!O1gE%y0xYt}WFDc2ZQE%5yuGF`j!Okwry{@Zf|C(FIKS)P(P@q5;(AXmkv zYdY#PuaxqeZRYSeC(+olyVN)1+$=_>6{e}Z<{JynC1-g_h1`2N>8Od>L#M5twwxJq$9X>ODU}mEn$oq( z>}s-`@y7=%vlm!@eOvYC%g?88OFLHVp1rbvwuaof*&RQwTl)R2v7GO>_xt7Bw>cW( zoTb!&om+l-+U+}&t}nX3weDx(`vuWYWV%;u5MP+KGn0M?Y()fuky3kr~g&`{qw2x|GUe<=MEa=PO-?peVm_v zd2TlEqCzXvroCT9&OEXe*IHkvxp}MmOP1Lg1;%rB)mB(-{rBbP>DRY!ubZW)FV%O@ z^0~qVAImwKXO;vnneUfnS??UOr2Oai|Nr*?diMMM|A+qZ{~q7}`;UMB|4VCA8v|8K zE3D`G?VVf2EO2mH=Hs@>#qyhV)T?%taOD3!_~2TuwP}Z3auB0%{|xJkIk(@$^*`H~ zzv`r^!{mxct&ceym3OBxO#1!eX%$1!tFyDdtmA+Fc81}-zC)2=V$re36ci3;`(6H5 z^Y`a#ZH~~Inq70Y+11PZez>ia^Ul+^XAXpU96J3#NcbwJY^3GVZ~KpFU+K-PH1goQ z?HYI^%tEALS)1O%l5`KJpEE_nZK94ob5^jtt+H^|7QvNL%09-Q{elk)PBfNToU<*c zdFuUx$Bt^>|IOJvQE*P_%_PCyq7fzSI`39pb@50Nbev;STV5T4x$XNWKs4Lauuo0iO(c-SFZ=P&U(Ai+n|IS)x z&#N0wY?tmRemx_s6w{g>=KV8k)4VU%*H4r$Q29Uc#GcPx^`)BjEL{InPkf5GKfOz2 zO>5TL8Qh+`B7^7oxw&P({Z%G2`7=l6D@V@6BiFY}r+2Jexh&w8&zTJ~zq%{$h%fHz zPPy=7#%Bw)T6Py+0mH3M5{2$(r|<7ay#8`hp~m6lxYeSeMSk(1ZA|6Tolo?YOtrLQ0VyyCySVExadQ$wys zZC0=qm{Mq=*|+1~v$tkfqk?Z*F(n-{`|DNaHhbBsv_lVM=KWp1;$Ga}GMTh*71ndN ztyAM+GY)g8`E}yU`4ejlR5{aqX6$4*tjYB3&hbk=u0GfA&B}c3rBqWTw<>e@`M~8Y zENNev=FgMUoBsL!zvcBmUM_#`G9}by;j*GvzY1>3ozo4yy>^js>*eps_ww9bp4fa7 z6ckQ#%FWk*{QP|WdHwB{%eQ{}P;hJ4)@AQ%D!p|de==!In)F#}^9w!AX%3-x!vCM# zu~~4L)JHjcub@?-sTTR$AD7*Ad0b|j*D5om;s?W;HviE zO_9=KmS_eaeffEBO170%{d_*ZPnuQDC2BISf=bJ>E&;`;%|)%!3T{So)K2bx^78DI z^dpy&C5|ww@SdF9;#OMbdD7(MrZui*sg*37&;7krs=?ajz_KfH!o!%XMez@seVW2b zRG&VtT%a`X$_~k}j7v;+KW#Z(xyGZS?_oLHjMhKl0vSPim6|RoPwbm!UU4~_J8AQY z$)UCB5w9Mt;M;zsqQK3QTlh-kr3bA->(w1TCNM1)WH=NwTk^yoi%IWJYX*E#vpIWx zD$5Lh?d2R-|9?^47sp-8xR_~4$Hu6AGuUGuy?y%jtH1r%&uRf#n@=nEOB-J4nek4p z#adEvmESqrs^B6eEwKZ(3Pzs&A^o39?6%+Qzy0vw%XLk`_t}o+zEg=Z7M1;-7jJjG zqw>wZ`?F4DzTSS@uC3+tjHA3$@^beo+?gqzvCl$BM`L|Mn%5!0J@Sc*mQK~pRpf}` zD|Hp@vHX?9xyGi~lxNnhg87@@+!S2+a@`8W^Dz$pPu-ssnmAF*G*L)FIc7`O(vAX; zllFVBOmP&QE4rfKyKtt?6tM=bTd_h@6-u+D?keAYKV|D5r$b@PlO!9zJZGQKvLt0< z_e%P?X%EDC*00I` z+-jHdXFHc%w`LH7z?O^3tKElwH(s=5_z2p03BtCN5Z`R2z6a=C0SOOG=LwXI@_M z@UpMYeO|@Ou`8M8${l}ryeD~XnC8=u9HKdAx1FuJeDC(t8mGJima>Dh2w^u2CW@m)cB{rz42UP_wS;U3-%S&tvwkKALZ=G!5V2`cxlJF zjq;u8o7TOwaWcv@&UKPp=g{%2#;x&ap^wY4(^l^olPkA8joSR_)}N%_5BJK10)(H> zUFqTDZEUUcaK^8R-lt~${UkB({e5+gJX_0({Jr_Hz6xC%-|zLzFSCkFf2MR;d6|E9 zkyWnlgW|OL*JhOlhMt_XEnoL>&X(&rFRNMC`&uhD8LmDXeR9H%&w-Xc!O{$iKYiL! z`~PqI^}m*C0*~GYZu_F(W6RvH-2Z4#enZcP^f?Q4Z+*RS|68)X4b$0{1wv|$5{(?@ z8;kZiHbvTYYNfTv+%s=JUUw!@^q}H|d%7x@RbAQ`9=xuov&%ca@BW-5&&5Iy&t3a! z*4Ge!VVS}T>IU_b5LrDQ_?6llU#&qI4bK%Tuymh*r6@%Qoev-9NiR>lYfOp+Blo4dnKS3x@^V1dY5Cw{ev z$^M5-_Wk^EBkKRbeKNb%`)txLNH7K2TyRi)}@@YN12-h{fskbFI{$dqI1!r$l2Qi z*;5vD&RAqBn7jA(978e1lP4+*vY5}NWHr4HeV{*ahf2VtjeMdrR=046eq;E~X*yHU zD%bk^Jy-U*lbBQ|R_|$xnrg43 zGvv4BILBDa1y1&SA8e@laABz@(-~&H&F$fLx8(gWIq342(MXAXzX;byzs%E384WFZ z?|*u1ZD!DYXa4-$as3Otk^gr%tk8@)?;IJ?Rr-@PUi14urJHO2m~Gm(OUFa7HD;=r z&#G4^_m}SHd-X5=Z_cW7cP6fww@Eq;sy9SL4Go;s6k9ZkElOeoR)5+tU0rF#o7S#r-3j{)?`(dY48$+&O!~V@H=_4DcQp!BO}rNL zH1A!^PgSlNez|F-+XK=&V_5bd`1C5$W9E9tG?wSr-h5nWZ};^?N$ADoN5@|F%z3)T zcXN>NMadJ6ORh~3ynRjX-1E=Z^{eXk_lFOeRF#}0<-#nA_9~yK-Tk5O zRN_%Vwb)>N75P=EYfn{~?hwBj5k33#&TRz^x7G)Gyso<7{dv-+r&AKSTy|F+Da)$= zyng@h_5WXO@4sDUl^;LPC7@zr`G>b>2SQz@%@l-ntr{l})XB|dn%dcrp+pe{@ zLXbz+@~c_Al6?X}DBxj^Uj?apWYX0MtV z{H>PhPTTh6XT5wAj*C3}dAQlu_UFT8m$tVV@S8hFNp4o2mXdYljFykibf>fk<#yE- zRVf;i@9-bHHFFo6IfJjynh zhpp|(_|Uhr+d%NDm&x>|{Yz%~=@l@iKA5!W&qlYi&sN52ovwOaevZRZ{q4I-|5E>5 ziAxu3v|6{+WaUr)rxmx}^t`&h|Grkx{q-f4D<02kQrh1oRO})AQ7U}*l<(hfGnRh| znh??(raa-ht4?mLkayI#&~@1c`hTz7oMFma5SKr@be=g|>TN&%k3R~kDsB5B?P64( zJ33e>-Og#yyfI1PSkLXR3L1;-lHW9Iy?e8FzP-)2d;QzZKb@|V)lA#<_fO7S-liFO zP0N=XH(s~B_idur;WJ`soiZxt#X}!&%6VEpLF4Dnj+u8a@|@LJuqDE!bk@GEMNZyJ z6_z>q?qoQ#C;0ODrDs$Y+5Gv;@@|#6_qy1Ln^g2RtTBpqTqM*XB);qRfl!aA4vw^? zix|s$uPi$26tanLb+wS(MI#Y=n-CKZ{%b7P%4N8(8NW0PIdaC!dWJm5$zu(S*``(s ztB$PMrT^DA`(E}mozM@Fv8ykv*|VW!c?!#3fvs7!+}qY<>3fS*b%cgU2YudWa5;s2 zgMrLc8J1Y#*AaK#@48USn78Jlfku#c&`R^KmyIl3(w-C)D@8D?F_!D!P+IEdxb}DR z&NbW`m+qAJJP8(hmf*YLT)4Z+CQ;SJr~e*ZU=XxA#$VY!sbQMbu9`A|sXmPA#X*z1 z^mL`e6Ux5wuL^tKen?VuX55d=slkHXCg)mp5*BS=`dj$QfyWLHY-fmebex=Hde}k7 z*5~H8W&VPJCR_i^TF~OOEiLGf@Z5QlR*j*{41;!gG$<~rvX53Y3D~s#%>8*ch36gn z7`jWW zok&~tNbr#A36>WH&wq)Znet_$yTP54(@XClx+qVgP^O9f@@p6jHq?%+wdy=CjV21mW+JYO7k_y?_RZD;wkTkfBd=g83mztD`q#$kztx}`EGiUrOD}+pEsoaeyDHvz3|QAXYNm2 z!Zo^9crr4+{1Ud=Qdxa@SwyMh~| zo5EkNnVl2=pFUEw|ImcL^EfW}T<%a&3v;rp)L$?DdHXCY2CmGIY&X&H6U$bkFZcOj%E6hMt#ndUN;ZDO{%#E zxE@@3@}gtLk`BiuYz3Le))L+^5T5Pzn_YJzWjVT zS3clwe)0Ue9o-rBku3S`>0RsYyK5PIk1O@m$lJD$|H%9PY*C?BMXs4%yicxayTra) z#@pI)rF6#LS{1H(ceTfNkDj)6Qc-%?5M(m-H&cS`I-Llv_D4brYB@27a-6Qd<8}G? zZPn9|HJkU`iuy0!p*zi1wSPg5c&1YH=9UnjR6hCkUvswK76>&K7M7Q3UmY4(ALkRf zF?iLap5$|nbM12Yr%zsaa@p?_4&iPWbnZ%=>C&Fh>}_$rda6bY-&2;Q;q6n}GsNt^ zUk_>6cIW7Z*Qc{}*KV!++`a5kQ`9V#+%Q?A*0i)q2Mm|2>@e6f(=IP|$Ltd~&n;Aqx+}_>q zA-QJq-t9Kq7dV}mQ`ll2+<2#N!Sk0*StqjNi9c^^MjvD&s_OZ<%;dGf}78+98KfJ zM0e$!zNtEq=i%wovpHPPthxG->*chGHDx>JtcmQJ-Y;|L?2Z1Ha_?@;YI`kr&)k;p z&!5k)&&TKIZ%=OPQ4lFUVpkTtw=W<=z*zZ8@%G45c0vMLe{OxTtN(oW!+8@eqr35y zhJ`zMA|Gq)^7+1f``jMGzL4avYd6kFHf=pW#{>@_ z6-h2S^EtEHX8ygto|A^Vervoj@|>8)HgOrtk#xRC2G1S{2u@Nvv`8p*>xA!pI+I@p z`!R+Y#ddUL+S;GJA>Oqon)CAFAZu~K%CM>H725xCy*jyM0z1pYcZ!A2Czu?+aNNgb z@h6s77f#si^Q+O-GFZ8`!QtB$yREA#d_dHZkq^A~K=oc~Rk?QXK4`-2)Ri< zolkD7X5t9^ZYDJEq_mjhuP-(&lb)Y((hO#DI47y#tE;_ePjp~tw5HbQ_+35xuBQYK zZpgXBm@U@SvdmU2>&Tkp6I3d@zPc`1>BG-)X+fBm*PURCl*msLw|SrU*?2@Q_~_=6 z&-=>ao$ONoa4TL6QAwMTc}*!z+fzBw(pAWs>p)A&H-iaMHd}6~hj}bglbi7KnnR;+ zq~U4n*IV-<7}n~})e($zO$*gOYJdOa$(sC0!VzL~HA3UA)mOOi)$V0~xpCGdCn1H? zJwM}Iu39o(VqLxFOxWrfr$b#7MWZe-iE0)am@HYn^!s@YOVKLF_y>!0Kfkudcez<)R6%wks~0>iJV{u~XH=Z6DWiB+O=puX*`UlBo!)mJ?>xV=$TpEIHCtK=#{zm}DPLK+bU z&fi@Zh;E9X<5p+4x@Q&3p-U5*IF?BAbkFoZnDy(EjOf{Y5iO7W<|bY-v~jI*42Jo}XM>^dHo$!@pI&)+@S$u>9lw#)1}=cG?tFYB@2@E5Bd+{jU7_YKxMdg69u!26|dB z*%@C^4O88ANPUV?)Ah$Qk|#yf+G=!gU2tVNqau`<+V}0`Z@J6L#_Y#t$R(|kT)J?T z;5)h7X+~E}t~{~0l&ZGY z;LGj7R;OpJ-7GTUV#vAWat}{(o>H20MQ8iQZBq^g7v0$$$riYM+EM?1(n_cQwU)nE z3{g!N?^+?%^KSF@YqMUR`7OPq=VkJDj$Q2?PO9$re2tWXyE4;~UD`HOJZV(0JM44( z$@KNtm)+=BW(YpL?jn!xo0Mz2RxU`5`u}TE>sN)#ABB3HgnJVjG$*A`Z4C((HWg;w zp0<4R*K23CKL6MU{rGztXF4ydU78iN(l>O)vf>}-_U5n6<#qURYr?fE@g2!> z_v>x?D}R3|_&Iz3pR4lqRf^6>XKl?h@W{?()#+NVHjP`>tLyYqu-$=J$ zS8lrO?4q}PTkhI&OSZFHN+l1wvY47neZRG0Q{B5i(-W*hwKR8@?tXjx>svF~_eV2! ziLfr?^17$_Rb)C7%jymL-agKo5Z7z-?*Dx)-`7W0S~ae)G_5?Tc=+eThfW(Wt-QKc zLTG_V;necziO+-DSxy|4*>`_Jr1}Y?oJl@MM2qs-Prp>SxiUcDjJN%A;b~L!xh1(a z9ql-(CALBQY46nPY(*BMHkH%!gRbd1_|`ctUb=0aU5VXK)d`HBFZiuYxEJ=*b%R`@ znby~&os*UqsU=2foZ_5QuIqBscdco|+Lzb9Tz>rY@!|H%+Zc9*o-k?(^x>w@=@mdgO2=cgG%??T4TH^tb-{`!Dv;Ot0sAD>^JZG3FiXIYfW z>hYs)M|D-Fl6t&qu&&mc@R^0TUOoJLb^iSIw>8}CIoipe7<+=sNU%fjaZDq!# zZCkJ1IzK<&|JD3|zdk;ExpD5>Ju7$o|K~sdyZ-j&$3HL6m+wEH|JzV8>F%=Mw_neQ z+`;klX_eL2YrYp;KE7=~y}f_B|Ma(;w%*SDzCcxT`m`f^&T}(1`|~e%uW*uHX8gy( zP3uLkm+1VNYg_~~(~3WRefsU`Pp{+KOmofHk}LN8zWpvlp>~%Gx`sb{TIcTk<^QUlUSEISzNXH0-Il~Zb~mfc#l)I(MIOjt{M(bte7dqY;H^YQinzC6_b_ehlfVb_t?eH z-@m8h!kV4O3uTmSa_4Fl+pjU-xO9=0=+4#0F1K^5zkQn^v$Of)r`KNDw`MJsJ{#r6 z{;N*9gh}=L_Z88JiA6Dw4*lM^_~zWrGCCb4e&WonCHnA?)r|Flx^SRb3p&ADd-g&t~Z2i89Fs@lYty?q>-CT0(twQT5>lZtk z76|Qf+2h`^Pdt19w@Uk(HLs&TJ(^a-!`;O++av$mhk~r=v(vw9mrmGK`tJJl`SbSI z?d^LhB08C8>fuMOGjuc*GbQCOR%frBsBv&>klMDjwl!5(mKUGVeCM_O%qE_`!?DVn zr~bNf?bhwnZ$Dq3{<_pp-05`KA|+1wr)$y=yxjO`o7Y$0jtt}MYazyk(#vLvgc_xp zF3>Wa?0YG4#@rW8g+=Sb4|qj=F5Z>)>|VDb$9%r4kDs--pBK>W(4Jo;oV-s?cU@>e zb4%^Y6;}8&aW%2G_EjjD)Rh)qQ~Q`vdQZ`FY~l!eVEe~HI;W;(#KC#YR;_5 z>!PM-)}GZeYT)_aGIQCB&CmRG|0yXxXw@&!e3;-d>w1x2#k>N|r=OSp_l|N7JsA+} z60+{Pme=epLi*1Wch9ocY*SB3RowW=B0IZMA%9*B;}zDe9rru~*8ORkI(xBZBZvP4 z@#0+^#+!86~;huhv~3tG}; zr?l%XX=z^b!LQ}KDc5qYgEl#r6ty=!dU&Gi?#v}^X?dOR-K7rK&8 zmMmO!-bT1%a*+6wf;JJ$uF~M(Kttmde9v=#)XlzrI9)-oMDWYnnGcHYomqF z`VZ7u_a(pkZD{-K$sD^ooHJH!b??bAy>7H@w`TO_mm;p_*=MWrBTsBiW2j+!S)B4t z?(@6z{S&v!+OCO|>kQ%CRl!$se2;8={h!Fg_B9r7gXc8=?&&zVq(Y#>nt!L4EZ>t7 zt(M=0*EQ0aRJZGzDET+r2()y_Owyjp>Dkg@=@F#4P~?1_vddMGGPfg8~ZKO??=sg_tKKz(|>u|%X0xgc)a(2 z;1zrmWxqwqnCoSWrPd1o@WEVtrg{-zF|; zmbNM?MCVV!wCj#%1mzU9#G2Rwt>bLnFR$|aep0DGb$7RvH$06`~Uy{wEzFKt=jslj`#1SjWd*eSWn%y zdp1YuMpc#KmlC1uu7>`b{=G`u4UgL`zg(QqC$c|ujf6?`@)nh+b*t~HH$L0S9iTFQ ze~RxBi@ph`UzWVuUMQm+dG+f#R!x^vrL)^!Y1K|*^_2`hbn|4_J=T~Q!K>NIsgY-{ zOby+Bpkq<{rd>)0wT>9S_WkU!RLnJ=>+_jqNz)W}O)|(5Xpz)r?>$j0{WC?vn|-DLUdU)OH$dH4DC>zaLXk3T5fzCEQQIG=y|zPV=eg&+Es`rXg3-lgQnwfy*(Ioea) z)ruI!L?cX{?`69#S#BJ(WY$I#RqwQ!;*)CJD>yZnMKyXHG`LR$uQ{&dZ8h)qyscY8 zSf=u7D_K@7`n5Ib-E@`2rJ|f&2i6~z4*jXRd0Ks(tI@Y*BDrf`vR}1a6jv+Cc7os6 z&Sp;i=ez2ccbHXI?!J4EO~g(@?%J&LGm3W=7nLqKb0PmpgqBy>EzP~lR~?xlc*k~g z`>C{fuB*(}9#FgNVHn>uZDwo834{BFZ&@b4kAC(qHeikW-XmU5v?XSqZgiZwb^m5B zJ@xP>F@dX>ulEVMvpds#%erKKpZrDBH-Ei$?m55wzMorc=YIRk(P2_qz1P-0{&+%m zmhW*>i;KHhE6)_Z3EsW3i+}lpD{p2mznow9`S1L{uY%e4{r&PGz5d(Ve*4 z`Pa_vJy^2C{ey~cB-|_qFTMy2-Y$-X@Ql*S#9TI+y0+T#_1amZZ zbFV5m7wPS%pk&9W{Y)XB!Ej+p$*#^5Z_O53x!3%x+56Vow(0iMOJ{D)*_;f~{)y)qxrtartSe~~0w3@&X8~dEJUteFpc08{Vqp3Nw*K%{{ znLEdRr}Z#B+w?PfIj@uN6f@=5u?n6|XY}J^-#&7jWbZKdU*$25uq5j+n<_!Aa^dPn ztU+uRC$n_Znb%nJ&N95V!f*~#gkfM+f4uh$Ho+iXZq}vR%$eT3(Owh()M&K#uesv% zT_9t}`41&AZZ1jTtB&;qoU95E=Tc12;YnewQvEQK|CY~dF5hrgp~Q|J7VXHByKV+K zzx9z_X7D1)Po8(Gn#yIBDcARTY%Ev$a5(?Ev&8e_^5-_oz8nsDcKhGg&)2VCujM&& z$n4e8rBco=$(9_Rd9&yG?KSO|_?_#pq?~tw`Q>{DI%|*Aow;3DeY3WrqQ}c$Na**v z3$-$zPw*6J9PVcIozmj+i@BrY!wF3-se{*iX0M9Ok7bcFKGo-`z*^s=abD$JX{F`6 zr4P=p>AIxkFo8$IrT@0gu``Or#fz$ZeifdHEZ^;P;mn=nz`B{$*(oc$D!QH*{NE^2 z(bT6M`tO~xCxbfIRnK3=ov}(Tx*gN@-MLh4{BBRiR>_G?F<)PD`Yr8o4n6EFzJaB2 zS*p+Ubobngf+u2*{c4`HLGAVbPLBpI!5546N91QNP1cFC`af;uqLeLRZ{uazQXeH> zz5ji&goE72i7P@~oX&RF#O&AjKQZCSJl%Vyr7|vQuNVB8uu&>gGs@x9+q>2xd&GYi zrAJ?nzqHC=)dAs@6~2q)R)5f4)2*1|@Zg;FiuNpq*Rppj57}_&rw#=EW6+{`_;AR{II|6ovY5xw7OAq-0SL+t2x1T!J0RWCnC7^f`~iMm^RRE6n#%F*2=j$JoBer(>bndd`P?~Fz7E_>}c zQym!Ma(3>mT-&(bte+vL}9Pl!qv^=zE^^pUrC*0lFk z@nZjzJeS1%Jr|sMcW$ga^QUjmw%`8xwo3JLT#(?6ZAb0e{l#~_&2zi|_uDpShv%2u z+w%(Ve&?wB_2t9Ik2Q4y!E??{dR^W()67cbsgPIhGQ*iO16FaJc>Q{9{_=KyS*3u- zB`d1-%sje&-*1D*xpwDQl*s!E_lXNDFh!iMkTx<JnT4~9OR|Nt`zFat}-Ce(u5-^E%H`XxrtoZzZfb2qQ0- z%J}KGE{S+_d8pL3r_` z>dj^(a_Zrw72gFC<1T{^w; zd|}J^;>-KK^7r3<+cEvMA@icJi*l5S7W3#=mRcg%{Icx7w&(phOL z6GNKTtPaz*R!ctr*)49*)F(N=b~%MV>`3bO-W$P@@Na5q#hUaj4Q5)B3pZ?ebXCb= zUY}~|p68pd7Nxq~V-eHQbqUX0W%vB;jrean&l_@{iTZrpr?2C(Y?@@a)5L^jt;cRf za@$UMdS>dUBF)Iei$(k;3ppn&RE?@$x4^{UV8N32t2b1vGjn=pkR>+RX^mm-RmVR< z%uZYx#nWOR-g@0&z#yUgY>(=mtGnz<{{D0R|KUn>_Vw)#AF6NO|Ks1`_&?7cueYle zm}uDd;bWP!{hyk@kEh?}KX3koBWL-_Q=T;!J}(MZo+!8U;paU!kNZ!*U-SLp`TDOf zx9|V^EqwpaZ$*~d)7IzzHay(S*q7{O(At=(_tm3wjxcLR+8Ga*9nA(TuFeh$b4*Uk z?Xb1E@%na6&wHUMdwd< z-b&ej_O`_DwCl6u*IT!iu6X)BZHAPv#Ak!(97*P7EVeNl-R>{sxo3B<&#*>cvwhiw zt#h}na|=qZuC|SvcfYP~AK&p3Q{jpgoihVde8d?;V&2``le02$+Vuna?-C8diuQN7 zEHeB4JAS&f)YX7hQzkpRhAs`2bJ}u^!^HHhW_io13z@o%L7Ul(f5`am-g@VSgYd3m znIyJc375^c%qN;9FpHG5bShjt{>rO5ea8uvj${4z?V9?lEV+-q`SR!K={nnW>vzB0 zS$aV+_HEH3vlW^4ot;N)EbaaJb>^DpSI#*3^v?P8Y~OR!Pd~o=^XJd6Pgiee^L^{$ zG}EuG@9Kwjrwap(UVm`eT706AOUoqJ@!SU&zCF)kA||}sA8`7q=JW#&FSQqBnc5i% zPF|60xn3~xd)?Vjle-qg=W(r>roR5$tD4n!m#uhp*G6sTrFm7mdj6fB*t6nPbeO7M z`LkvZDINW59WqfC#;b z#R@0Oue-6~xBlwaGoJWNGl-vXr@Ft#MbK0@tLMR6vub0(+`TJJH>zDo{vmO?ak{_) zje7@MFLeewxM#n8Z2o-t@y{~H3w_v+Jd}D~eE-~RgNoY6xo2wk*}h+YJ(=g+OyzEE z8@)t}rbTZbCN6$eH+OsTwC%yJ!kX)539#yFt=XD(&1ij1Yo5x{*&E^&J6EyJS^4Di zO7@QWkIOz? zu-40K`xFj3>!|Z)Z8@f;k)3qJYu?50QzO2zz4O=A-nBz~+0mY^HLsF->kIXrbdvTS zoz(b5j_d5rG;Kj6r&pUppE;gVTJn!yDf0vKi7zVpYxUn1ue?@$ZffvqgZqE1j5$Ql z?(pJJk};iF-l{FqIP*ero8~$ZE2G!jH{D@Q5#8!yn;|%p^W3xtANlrjPD_lNcK7k# zZz2qr)+}2s_QU1m^a(d_D=e#ylsTokcL(Rzd#m(3Hfb+k=HX~H@orGzy(OzxbUb~< zaq?%t!Jev2rWK36->dElcw+Hv#^ktpA(PgsW=s)DICz`kuI*-@H~-c#W^Oahj=g=2 zHSwTZ@&%V?2YPxKmo%hJ6%w7Cw$}04l2VgH%mI2aJB*B6TC?Xa%du&do#Hexz&z|w z-=V2*X1hBzUVm!9&zSwHFeR_!N6*Wa1U99N2@(1l;d3+OCU-9p@UG8WDa06Ty!NG- zMk4>a-3sEK49i&i(&KerZdo7Az{Brl9(wujgTk2n-#hO0y)1l{dwbRl*~>e3_s?j2 zY_)G$sDwq^>XX;3Qae8U{8_d8t^J=bRWJV@KK{9Ka{qii{^@JYeQV+myuI`CV)bdR za9vB8jobb%|No``|L6aIw$Hb#{rvvl-FVyD8k^eBCi%zzmF?cQr}o#EmAUf&KRmu~ zxBuO5!G~KlKiz4V61vDV__C#~@VUszWsO&_t+P~RNSL6Ku;)#s$a*#|aGsvhO%lNFiwvz$6~U&Y!mP^08&!-9_T&;^SED(nrq_Il(> zCUEWlEu-k65q$Q{8HtkRD`t6BJXxZ9X4hjICEf{(9YC8MD#;X$5Jzs?9xT6IW8@pSbkil`S=&*)N9?EwbH9X z#`xHW+G{y;EVUz-{rIL+|El(y;FJlq4k0U=uD>?4X)@JfT%ohJ=J-#8*Fo$JJjvek zgC8cH)mf>u?pgiSzpv9C?wzH3W<`c?tcCZyHz{pPXGIjvJiRy2>x|E30mn6ctf{xo zaOlo7Jsb1sQp6LBuuECjekbs{u5g(f5f-AhyEU%W12(8}%kQm4(} zDTCPPam(|AGc{M zlNC#&WL=LOd9WqKLH^>b$_HgFyNy?}1@nI@69{=SWwy*LH{)DiyE*6O<;-0=CJC>7 z`Sj(ZEA_vgpa1{m@O4{vZsFBuytP(8SjnWgdfDk;dYju;D@5{o-kZGjiPyuT>kqQ0 zO1yVFQ*&ED;pve~?yD?*%KAAgmv5REx>6_Ha3-g0YrfiDt*^7WKc9KDwoiJ|rRfSh z4-cIS+dt>N!V;mWY#O)AK1tgD`C)ou`u4{K;#&iCc3(2KS8rOw7%jPD<;z21dV!aO zCarmK_;;JwW7`IqMW^m*-*~ly&udR~)GCq4YMa~ZRv0>N{BSol)$6Cvx~r;Hu^Y}; zpWJcb^Y5S-4I77DyE#HHnA+Le)%{QW{cUCaj|#i5diOb-`IrAozi(Sxb*Jj{^Yiif z>(9=r`CIgNxxL;0ho4_R-@eemC~A9fz}auNZ+w@WH{Ix)@|uGh$7jUvkNZFIaMHhT z=k0QOnf_m0zrV7s?(gsVABGBz71g(=zPMYpJ=wrQ#Nu0J&rH$vT`DJ>r+Xe!)|bu= zI9gaLIAd$Wp0}UhTI5~+t{l4Es?A+;jfR(ugL#(83A;H)K3hwJcg6hPH)%|&Sx^C|FyY+R~rf;vcpL2*5+&Nn_Fd(U=e@r@z1Kee_x;8D4%jo?;uCnW)2orwZs)-3a`)1 zI>Oo2xuPR+=kMaL*m422hdMWx8 z*yU?|=|~H@7CfOuP*t_*q{md|Sl(i{9X`{=M5fMM%gNw%TfkxCRqho@ZWfGos|@$t z-SlwES&ju;^Zz~i-GAS{_TS_4zu$KFtlg3GLVE4O{7dG!=@%Y9P2V+N|Mu|-*S74x zm-m~YU}w(r$+@xm^73-~e;ed&zrOzX_xrYQcH8W~lO}LPg`v%RO;4C&BqRS0;qad; zxtT=|b_HBGkY@If^JHqRmHMFrGi9^y9Q=A`cbK7I<)3LCw?n4PC|rJc(Y@sjJgrt; z8j+hmzWQ96xOveefe9-Oig=<@HYqnR^IGV&!h<2L)V4VEt|J$-Do=mw*3=hIyBw7x zPwivk`E+hd^5$v&?_ud<7 zO=aBLb?J!bJxQNV1<{bDS=PDNtYQ<~LOxd3Rane@I^%QMneEqWdDbT}?7DRA(;dFo zw_g^CP5$`ow;-q4*@J0oOCL+r?UlV=xcBV#?HlEj?G4fc4mERr6DeYK*fQT-RCcDJ zmtgR&=Ijlu+^d`q_*CzAU!1BqRjtP|{nlo#+cPtR7?Z+M-pKNw_O{kKxV1yx>3GNU z?T^cfyIiVXGo&=Q=CY@3K6v6^=(~TMVrN*`JR;)OMEqQDxsHW(ONyF+$M;Dr-5z`b z)3%zwTU^$W!Fhj*pH24J(u>?0t6#I7;+{GEUaYOcthusFjx2ut?F?V&VTFei19z)& z9XJqKELw2?#lsx6hn=OI0iNF@r`$QaX;T`z$D&@PGd9+HA3r_8wdul%-|HJ3K8dDv z?mYK=_xufZ=cJ1HMJ}nhdKo2_to*pM(&p)5PsYGdUc;5Ip4zTotg|X)@AX!PV;ejl zEqgtYH9@Iiv)j6=S&|brmV{RQ5n|f+-(9a#>8z$kgYN68uhas!E&j?P?#CZnUA=Ys z&GbkA@-?({mx`HiOkAKbC*<0L4~yhfE@q$f^4sd*9J`=zrJkl&u^UH`-{SWD`=hVA zoQ(?R$YkJAIvXXq(!=wT`l~O@+Via!hMm8Xn=$Fe%!mngUQ4`v71**leLAo0OM1W8 zbfaZoZJP^M)tc!chr9xPf=#DdzUY}2dB`DuSFUeZ*Tk-Qeo~Dc8E4ym7fK7}#QLhL z=HzaE((Ctp+2yF$6CRgYvrO|8YT~)O;_KY_m}`IiChoo~`udr|s&8u}vPEZ@Or7=O z%{H59XC(R(o{3KnjY>&9rqgnLldd`I3N_KTbz6%!Wr|N+yLIjNmnGL0+-P}z%_`P5 z{_8yx!O$z(s!``1x6fYT@U==dfBVNW+fNVn-ecS8Y|vi4!&-H1XiIg3ap1)ZhRYhKO5oSH@uYp6b zZgt8#^G45Cp4?&U!0(v)cp%>4dIC4V`A^%$!$D*blclc0*4<b^7Iv{jYB)t}3pm+xf?kQz?Tr?%v50A{qJyq1PmT&pX5_WO;iz z&!R)uwv^|dRhbxMbd61P?n5Jva>Ly=bJt(L{WVp|SzP4Z7t8&BzTEuYJ!{)N z#vQx+1??o;9bR1WsR>&0ce?$bFZO@^>+5;)#Ctm)2CHws_UYu4H4mnF`0O-HQ994i z<{X;7OXKpdhm2mYuSK8!ckrQO)xHx(ozMD??a~yE^i!FC;!)7cg#f zz1nr+@3hIY?r1oz^0?d@``p!0w2j%%DA<>ly58 zzd}K#(ezV^V_xZ;s+L!_DPP669^A_p(XU&)F;aQCX~FY954A(`VohFuzN)b7yXDgT zf37#Ru3}re&bWcY^zNr?f_;XeqK9TYeK4o^S?c*+&6ifG-Q-^8H}y#Fnd#SSv)^8B z|D3scPE@c>oLN7=eSPiTx6W6tm5VBg>2P-aUo`LJJDHnhVV*I6FWbiL;Njc4|8drf&l)CVA z)TBLCo0T5MSpChC4K1**{}igTSM6N%?~TD{pqr<`6axJy!N^*{xZ&Hd#H# z^*`>K8)d)!Tk-For(fIMkYux!W+3yr8{E&c!LYt`();_48Vq-871Z_SD`^Eqzk_L}$M-7mA>+t1Uty_2uM zeSLhKvrI^+tlX@ZQk+JSvhgQ_IA#dCO){OwVKeXC+uiwcv#Z{$H!yknbBUwL(WjeY z<<5Ej-hVf5d+o9kKF7OJJK7h1Pg{HC!6lZnQ=)qgaIo>x~hIS6~tcZ=JYb>YO5D?6s|C_P)a)JJXNG%;DxfToR1>Z@IPPE~j*p54@? zGi#BR0>jH~`|jIbEp6inF1f!YhVQP}M|VfAS+8u)-d^Z-BmCAR_ASd^EBt%SOJy54KP1V%P2$Ih1}^!MiE+uj4aj zZLT#d<~bIuPhh)f6WLyOvjktaODIy}zYcz*D@ z^d*CaCe|fw?#@BQx|5vl)<|tsJH|DorTzHd7c7iFm?T&IU<%N?)S4E0%yl1!bzA@I zI_b|dN*ZpmH6JPJfBNCfCk9T(EAgHV3%Pc>%)M@OEuvIOxV*Wet2!mCF1LMBWP^(B zT(PUWJpHbVX0Axy#&G@nZo?$gZ)d{$vlJ@tvvp=%xg>D%Y8XrI9a+7Vn=-ZD>qO^i z@IT{t{vqJR7mtQs$y4el=4PgGdarj@tgH-WRQ54(NHm-k`0;S47?A{aMRhTb>~|ae~N#~tmV$hv3z~N)D!W%E$a$uLp@C$LVbTe*H{^;pJ(|! zd{^G4Zy!FiGBwF{UYR_J)0dn19RH_#t|BwMrqvgI-4+w!_icsCv>A(Be+v5;NCa(m zFLM0-Nd59N-}v(eOY1$l;!IA8=uR&X(wtb`qk4Qb^Xgs9fx6id?~c7%#&u_<;`2&# z=F|;d3R|az&3zZ~Tw;SojesSe>YS%<1&@@NKFpdV$l>Bvsh*lps?znmMSSzx?pcqH z8LG26Zb@5t>GP9BCy#3^$2wS6aDF?>^2m=-S&ccf$9!u|TI^BX{gp~asUl~KQmS%z zZ(mz}{Ozvre!+6Sy<7S+d1H^g{~b6@C`6D$IctmjO!wmKtf<4YS)1A{wS6-C7z}DB zM*Z9vRKw!2XuVVxoBt~X>&>rj9tzHzI9n-d^4gaRl>)in%Oza z)g~QhxOHvY<;-7yK7D<=?R?=6yJv<>4pA>J-)wi;CY1Z|mGI{MUmiHEEPBT0;x{`s z|B~GH?dJC1He6!~$iA&6nB~hEv}mjEf@B^;#i!==-)0}IvwiaV^~dGwf7}20uzW_& z@?5_EyY2t{z5IA-el*9il#pqur%Hv29Rw6R0vr7f1_+DvscJuxo^-fY=+(ImI~TDx z2~J`@8xqA^GHr>V?W3Yi_5bUCtgrul`~IKr|JVP2`2PR(`ehwbFMV3=n$8K8df&~N zpl8YH=Q1lY?iu6DTer43>J|qDZ(HnPT+@;8+SWdO)zUXLx3>9)ZYt|BOlMKvmKz-0 zb|X#3W}V!_Gy~&}kC;_{ztf21c-?d=t7PlKH3EE22_F1Q3=a4#JG(6I*2^!9tF+eZ zZ`Yq6Z@blLUcu(J@b@PiUgthFZ{>P%Cec*wQbSsiwc5#;hg(BhZ>`ySu=4RHA}ae z-Br2FTru_fT62Yv7P&8(yMFyXQ0OC{eEUn8ZQk*g8>^%(+!=xwEK%1si!GlSZ9HFa z$<}3>b>=4}rY7~Lg8d(&U6oYYg9Z&2|( zZ*xGfp(xAqT~V*S^iXX#pkd88sFc0xN7FAJYNot^^=mC!!4OQCT+FjzTO>rY~#C+ zdrCL2Sfi|3=O}vR=e~X3Vz;C7r?0iOwfoVdufKlcq>yDFwB+}#_Tur+t~N_}_i*wu zF&>k^Qx?bkk6ZLTwgBy3+?JR0>zi3zeE;8$b<2!|%ybgWF9)rf$9g~`WCd3Y*QJtO z{~T7CIZxVhSj%&h!Mh(A%M)ZemdTiByFk{ru*FXn8F*kr4HjpFBUm zef#vs4>x@cemwp5W#@kH`tHBS=il2`vv;oF-^Z6N?T+)u=iArqy{op~eMW-ZyPlUe zeEdPYNzaVE-bl>3?mT~6d+_gXk1rqZ=l?8mywKsP|NkFP<^R2We!ceJpRaHG>wg)w zMF$HTZe89UY<^^pceKDgAD`KW`z&&q9(^e2zbC>L+M0Oh*t-U;P~YE%YMk?pv-jB4 zHNEhyzT6|uGyme1!;&-HBeu^Aww*h9-^^oAZhy{|VQ1QYo1P)Ggje z+y8l6|MO4P-;eFjRiqC)2WdHGJ<~L2KKbzWGI{&Bxb@q&PmjIgvQ*oDcHNE~dHMan zpB?U;a((*h{)Nlr?d3qb!`p@WW-{25E+0PXw!&W*ubY|CT4e=BLV3fsJZe zM(QCIGN0dS*UmCC*|_#~&fhx~F-=>Fr?>M?=U!1*YiN3R+w0H&e%06>;}DwkI3m;c z@Wi<|P`a_OvW1N{KwJ}=fwM(cJx3%~b%PpCy|>z+CZ2VpH0q3uDP9OvS5 z>c#pdZ||C=RyxCn{k^+MgN&wkNQy&||5C#R4pGOl3|-?c@kB;W%&2^Evt!Urw{>LS9jmKP)()a(S;8(|qylyhT@R9!}@C-S2v& z$m{6-1CKtv5f^kcxTbR`fPb{xN69ehHoloOu(U2c0-$<0!0ij_33Z$%f7>^^DH6UDFF#luWN|ns;Tdfg_XP zKCk1|0XcT39|Unu@RK{7|NF-B^PXIXCa+&I>*$JtQ!^M1PB%uhUDP^gbi&c(`bxdZ zB^@2rObR+zy{nWuK142!>Ua_Rl)Wgel!@U3#|pNamkv&EEz(sDT=(HwjKaz%44K~- z1~Q2nW;3k_>EPuOKmS*H6U)-q`9iBwIJhhFM8%Zj*p9Kt2C9XLwq|Uev@TU4_sWMI z9UQCH?ralM%-)bw7ke-^NlAyX?qHXu-qPSL6OP}Rr0S^B;Sp9i9F3Ye$5yd{}0jrX1^J@6ei`@~lf9?F$$8(EiE2 zN^#9D-boicqvQ_05f|{-?(|J=lfvcJ7hOxd&RyTRW_9*j{TcI)Z}r)v=v5N;?n++Q zl@il!P50J(omOmiH?woC<;2TH%B$8ZtbHls^R?9R#4!j?DfKWKPo`RrA>ix%BYP?L-mSfaS~xTd^!^!8cTR)3UC z(M(eASa|KmB$I_ETMa@Yb}1Nz$}+8PJfU>S_iRqjnWI;p)}1VH>6qaen5*g9({#D0 z#c6Lz!?IP=#9OYgMNDTG3Ho&F)?*jXeJ1`Ar(NDiN%ArFbYAoLbW}8TSAzLUXGh<) zkv{%w6}ghx99LVnYHe7z{9aXlt#NR!?^&rMb$>p6I_w{xcU&NA+P!x(6DOXSE>zjX zb->bDFXccy(7)=O@`O*p@E@86ot>$A6;-L^D)drPN7q;Fwv{h!0n>woO7 z|MPbK|6jZB*ZklAJOBUMy!!9=|JVO-ytGz2VR9i0lT^{H7rwJ*95-}a5#_i=YiYe& zQ{DSDUbptC&AetebxvGtiJ|zn;_vFLD+5+bSg{_MvFXc76=QuTo@*gj56K2i+bnQO zt(+$>pJJx?M z?~6~lD*ILOQ{ihZkIk89Y!tki-CBj1R!kJPr+#DN#@((}Kjwt)%ACw*U7F1`>25|qpoX-@_S+x-{9*d>v!?RTj{>W?g?A_J z)o#%^@BXQ2l~MEA6!~D^2%SRX$uAk#9?X$cR9F<9@9C)Saq<_RkL#YUAcmdQL5klQ zG#@THRX6d2Tf)!T%^gAQr>|W}J?ELMb>V1;(DQ3DK>=01v%Ea~+_cX09bC}u5v)AX zx9-ZcUGfWpGMw&p?O0uYa#npu{YK}&o`uU@kFr9eWb&*!fHu6oh;Y+fFk(6w*h zYL+0?D0%0N0-H)tE-N=}pC*31kF{&*&cwBjE8kCXX4tgs>7-|C^=GrY#^o~Y`@A!B z&t|oIZbzLQCMdT=2;7F?bfabqOkJloRc(!coL&8&KdJ)#(=XqsowR&y{@s25ziBqC*FWB& zCF;uZUX$zeg((|VH+C&qCH^UM$%D`n0S`Z=Zcup`vmi~>Kx@%C$-?P=A*?|fMytiv zJrDWBBldeysr2bp$Ci4vo>1rW;$60Cn*QGZ-|nSM5qG>67R@T*BEb9cZu{x^f1mx9 zumADs>F2i%ZKeUK;7kuI2doI|vA@_RtJIC}Ui#y{U9- znw@RfG$mK1AK$88&)&LDe!g6F{%^aAeCt5|hkKXns@NnK?2z*fEqN&rzE-nf)1}Dl zy7`^6oCM}c9*x*#?NYJq^`5)mDrJ_R^;tCAHfG!F(*JkA_uv2b>hRZ&=jX56*H+%l ze`6ibCtv*M&(|M6e_C*?kW+3u{^jM>Nsd>A=JcitXU5vu&aL}AoB#Q}z7G4pe@f3K z-}d|eQ~uwV?f*XxANC6C8zeO|NTjpIDu9uf20-gJV03;0s z~0eD(BMSt{4;~x@$>8xA3GT%ey$Yr0+4~c&omJkKs6< zy+e|pp>l&|%S@)^fXUZp%3mxbwFlbuI<*=VTr>W5S=G8)FHPzF zwH$4Zh0~66&y;+B=0(JmTw|R|`;!GCA3LmkmEUX3a9XoR{Hgg=D>Y-At!|&5eX(7c z$zy43a`VuXdR6ly3%Wu!MAfd=+0)7Dxa!33koM9~*PiNmZvWG5a%NfEQIiRl(wnFJ zDVHp=+wJmM>!s5B30|o?c1wvfPuzO)ljgOfo7T1Li8zy>m389cnVAX?&t1N@CI14S zX$y0L&$Ey#XXW zzx=u6BOiY4m^ULPu43w0R)w=KIr>?{BNsV_-r5kr&d(wsz+Y7{ZM}Eglm{`fUp8?q z*4g#xn7|Ud#aecuGv&6|-svm2baKo2)iWJl%)85|-2EtM(En3H2drUuIyG%zSS9eXx#3}pDyWjCNOmI4su{LPwq+4fp z1-y2OaOi2zD9TQq>B|<*@^E6|14G#bD+QnQh~)kFlDC#iQY0hxoL^fPn}}U*Wv`gu zmp=7fyPtJbv0P)>zvlWzri`S(7eDzfS073c;hCLK;550sYPO%2!ofMQ^BSgJ5A)PB zp6?^)Fv~gf^KAD374r<<|c6T>^?!G$DrS-|xn;Me+ z5}hgCnVD@_*-N|44!O+oyguvb6t=58KY98eOFT?eN?Xax+p>Drwb#zsV(+w6OUlYs zCbT3hkyHQ3l71md>-iFeX-vz{pq&zAYF5WH~dBZtQo z$M4kVn z)*Q6m_P+SsZwsAgg%jJ;86_Mx+ZdZ{PqJ_{-&}jdKYri8fBg2<3D%`t%iMpyi@5Ye z<0{)Eao_uAZNIV|k@5b>!(<@JDVQMMKYhpBedZ+A zzB}%o$5s_w+jHg5oULxm`-FCW(pPG7y7=t7V$jcDXRdtt|K0xo-THt1_1{00<*pUq zHtC{GiD=a2;O&<^&rL78_p9vH-pJQgc3V$h)1UtKOF`3tGdV|Rtzs(S+u?qH)=TFJ zzu(?iZ!M|Vk+^8%dt-|$TMo7)UF+Mq+x_&<`F6Ft&U5e!?tQzNeO99N>N}c`wwzAo z)ZckSC~)0lNk0z<)?lMm8<;9y_XOl7`8rF60*@R_FcTCrq za9EPVc=F6!hJJ+;{$45B!LaJaIq8FiZ<6grS_)(mwKx_=W?!52t04E5K=QGb(H8fV z=FOi!d)w)o_5c0t_r7JG)ZD+2X;zBP-K;9p;MIlf-H&Bmx&`JJ`WLQZ^**+SwT{2f zXaA1F-N%2kw#Er8U(d-?IrW}vd}ZeZ7F&%2hDrAqGakxddTXn8AmFUVzJSxkA`L3f z*Gw=B4hoyF((L6jN0y{>K81R*5}pQ~8Vuz&Yb4hEaaMI`O8;|TR_x%WGBvTySCSmG zq66cXcda<;mU1BbVO!@m^+VB_MoLPN+)Fg9^fSbkO)G5;o8_oj8EAA#>%hJ9zrE6Y z&bYR)9!c$v(U4QxzrLkCZQY9C)3+l|Z%|fWO1UPQDO#YQpma840Bit^&YIb9-KpU5w-|eS~!Hh4MOtM>KF0cR1 z^ZaGW&wsny_r2V<_wSddZ)Yq_YBYMnwo{~ih2g3-51HTlgo^T~-qK1koz5^`OV(f_-*p7agr-ooFDtEo$PE z(=S?{KJ?g;QTt+*+WFfjSo_JW}@R^9+Vx zD_!^a@5)&g9iF@Cz0orH_U=RKoBGcNUtaEgeZi`m1$*}L$?GetUtZ7Su&yvyrC6!P zW$NUJwcS^8{X`8L8;Z~597>j~OTL+JY!nf`VN1sn>uI9l?EO1@+E=QrfDPxFZR{^OSwo25<7l!Kfu*;0=4MNW!Hw`?x2sj;%1=U-5> zci-PHhtJFFEx%v)|KrD(f6DIew|Q^B*H7H~+s)rPn9>hj@jXJ;A<>0A}RUd!XZ+A&4e%xL!HFE1lgRSV`kbQQSMbT*`I^^=J`Hzcmr zw5`~(%xTrF#+$Qa{ocBC+*tDdaIshxi|@y~<xvySy_^q+Oc(D!EbWFHfu+B(a+KSi~5vsb?Tx`4x1H*HBnT=Ktn+wcF8 z|F8ew_xBfz{M`)m>;As{v*quP^Yxz!56fISd-&*sMg9Bhe%Sw=|9`vvpNGrs|NJ}t z{Pv$umqp)P^tGIa3^4i=;u-lQlW)e1xQLswb)q^-n|7S!ZbE_ZJU4a%sS5in);$9HC|FXW<>qfWYZd9=o?;h42$-=d_KsdG0?WB$8D zYyXNjzpXEaZ#ncx_>1kt1vSh)D|QA6#x*)Gm7kOr%9Q9i_mTMd-9_=uFN-SA#~rXX zT|Q-vwyIIJRS-<{tBz z?u?%tKX$x4vro#-%(`<{m(2CYRo34Gf6M)zksNlA&vBE~u7WKb4y{b{^+e(s4@^06 z%`9+rQ$NeYo~*OQL6&`zQ$L>mYpZ%1M2OY}%|MTNc#p9YC zEcdx(MdorVsLv2iSlwc`=5VU$;zM2MuPA++o%z1%*0$sA#kY4=%N%F$+|d#KZL`ZK z-3@D!raJ^a5DZIr6D9O@>BNY{+TKe!oL7niS9h3h-E=UmsyAo$x3sfox~3`I4fMM( z>)7p(t633Fk2Jpr2L@fdneywzL7q?@XFq^R_Ds8wkgDnJ(G0WXev{q8Nt9 z5{G?4-&WnWx8Gk^SIPb2+U+@hjCZeZ?5LVE)hpoV>_v}OzrEP=cyD`2|=33D3muv>@ii+EM)(=hFcwAL=AQ%%cPZ}f^i7v$4&XLiVhMnhYb zl85(|0w#a{S;O=0H*ZI7HrKKUgUh$%=KI~R|NroE`|^9Kx~xBV(%Bxht}4qedvz(N z(3>YfGE#G%-(1=Fef##r-GBBjAtTuR%#5}E{Q6>}kLzwT}&SL_R7ln@MUG3VQ^Hpj2>ZJjzJldW}JdL$sX(_w8&8;oq{qlso z=Qg%iX13{UPF<|LD|155rj3pUeDg1V_UOE_f#b@XycPasrsX?ko|2lflJ(t_<3cAB zy_zhGR?Kk{XmGFXv{Y7gTCgZlroD4Z-qh_Y@657^`IWKjeRWIrd6n%F$#1qhmj<_1 zXoa6Tc+sai+vUH0ebvwR{~y0!&%U-)^IurEJoA|=Yf?^WDV+_Qv$9Wck$_{CN3$in ztK^KsnYU(LR5ldhcp);`viac4GxGZm$moelwmM9mmMtof23QWysxAn(eX4ok5}NY1`>j ziJl6t`_^SIt7s$ob&mU#b9@JC4>&*V)-}<1I_JCe>-c|Xv;rqB>yq*+)c^7M_dRXf2e#e3q00Zd zqZa(*@v@nIL+N%>H5WMiq3_myso-u)+=!0 z@Z+DCpFVtf*jeG(45oSKWF0De(izsT-_2oPXJc;{C+GLK{rvjvwQVbywe42etyIuc zx8444TmSXjYyO;aint%j7O`RVop7f*tDpnR(pDKKRF*8^6O_!Dk?cPCea{l(*Rt!% zMV*$2KH2*}YU?b9B~#xmthumyS40`twH~LFcjCe(<^PQeQu)5%$P;sU`R&0qb$6Ga z7jSfWE!(qC^0>%}$B#X)TuKuaJo~1`E_!pN&m=pwgKtX&FIUb^tFn?5d7N|ob>WKE zqBrlJNT^nORVTZADZYKB=EvvLUuQ6Hcr)jk$F#2|Vs-B`pLLj879Qm5pZ>PUvOjrW z%y9|h>3Ii>6-7*@%FLV4@9}vDpVP(SM>To|-(T`gJ>1?^G(Ug;|DWIMe`Rq6F23=# z;&fi6OV3G0xn#fiP7}-A)~!klR?Ly@ZV&$d?egMA`+uL$C-a$pterD^uDt*A_Rmir zrdU63*~ZquWH{5=W6zu8hJT8TOdsCPQ|jm6`}OU^nyl$zGn856CVzRzbW-Dqjl@j}QfM)ly` zId_kJFgz5p#!+BF#QkG-dD|76amG*ahHl2FER<=F<``^!}-@blr z*T!&SVa_U}JFcvZ=RV$kfByf!{eSP@Xg|(Su#aI&``eFIOdOAEc5lmW(<`^TUmQzw+xo-`(C{X7=M;KmY$% z_x~Nuulwt{_V(pgC6VS?XBb;@tL(n&AG!VccESBwHuL&A;fwT7;52qePxjS59HlkA=yFGh<8<3AT1f}A zGJ zbu_$~TmAFl>FMXM>lg*Enar8psq^E@=bQWfUR{3qsm=G-CGV`CFE}qT^Qh9R7WXC2 z2aTV&GZ-%6$*SDzalqtpd64j#4|AsM*mL@Qg16Nfml8L@*qcGBaSJ$%TNel|oy6$% zfiJ|cv7$+~<+5h!OtCYol(N@ppS;!^y8fEv?DuB7n_b^~PMRC&rR`~UySVDMwG(4- za)7IN(@3y3*&{Rs;aE?ZL4 zy|w9*MC@k8)z;YwYr-6v8h1yUTs#zE|2FR3rY)tJWzT*^>wNe1YrJwVI{({`g1QQe z?xb^bxa8*wO5T}qxnReRDg#y>Evd~?RueBZr>+Q?cJ=*YT~FiCMDe$^r-e61o^D=K zpyeUFVul%O>JDyI;Ri>8B)J$x0xn;ha`4OscFA|ImkK`ka`M*0ImNSH&S}k^s5v23 zfai!8XIcNXSu;Dh559b7?6E~p&`_PV#iL@zf~z_VJrlFy=gXDX@9nY(`#;6&mTUjC zCqbw0hPX<w8I(V&Q>y|^U^{X7N7%kRNI^%V5>Y?|A4|4Cv zuitJs`E?}ouMI6KLGJN&k~4Y)*<(WwA3vR2U$-~a-g;5iqmZB{+UKJG&yAV>M{Fg> zwHYz(1q}n?NZFFPPiCUcqm;xa8ZM36 zYYn$E&$&|Lz;|0H`1-kHmge30c60Xs|JuIR-1zE&Yqt+Sep&O9qunK2E$Lvv_uF;{ zXV@JxxNY)&sz`{k%?qV~qcR^q75)A5^Yq(Y(m^j}(m1kM`jdZr=`bqpG83Lu^YfQl z$2}hxC4=_pY!wZ|^kcGJs~%htS|TFq_GoSC;iViL0R}3Wx`9X4ra3B})2J^!Y01cz zfByRO>FG&xU$9m>&Gcn4dRe2I<=I%Q^(x@#HPe`tDW_x3o2mo^f7@|IzxC`Bm83`F z67Gt!N+)tmMNhi88Wojn_0sfGa*%n)P~9A#ze*_i+uD^5Cm!c2?I^u##+o& zc5LzS_d^nwMP+`G6xQ5(`*^>6{JKB>^}pl){hMDW7o+78SiZf7oqV(B^;V~Mj(H~yU6M9Asflw986|Ohrx_nA( z(TeXPwy*Vf$wnsaKPtm0c_CbsXWHs*U5=h-^fs z-v9Gmk>%~@`rFU1e>|=8Tu+Z;aIfB%))#{bQKrk^kve)#ESz_ig6+eQG)Tvtl=IRnF|W+s^tJ=31L) ziv_R0UOT_oC1-7^u<$(j-SWn>V&(kmc9VcyPlqjPg80-Zl@qs+-0a%nN?=FyexTJ-sBzk(%AUVMjTDQ z_c8LHYLK8$?ybj5>vzrBwqRz>uP+At@6~IoY+}#dzWuuN{@<51LHpibzj#i4elUwj z&?JGc3%|%Tb_$#-ov(B)N_=y0{?7^*-X|XpcsZX7D(kC!bNQ~aQgOos`{@!QU^W_}5X_b#GKeK1}rn9iSBx>DGW7wX@&wu;zPH*A)d=uBl zA31#X$>Gb+-p$JtmjCjr&)?hsP%`V!*V6yLcHLL=^nKzO{9tl$aP#tG^?#@Duln(> z@waxA`|TB7w-t{ZZa+T%|BuUcU*GG^y(_Tgxbc)7cUK%}%dh+V@bPx}dG%GlZ~y<} zZ~x~b_rw3Mw(tLUdjHS4xlNXdvkWi&{m7DSna>x)=U|lg_=fwTP^F}4t2?!{rak`C z&|o6knxnf>WJPCF+;J9<+uPdt<)8of^XIFpQ&j%<;Qje`jW$eNz}#A9A>b&ip2X|v6U`=67RDhA#9~tuZz2z&H2+JjJgMHnNGw=q)0RbO5I~|5fCr_ z(vg-IJW*7k`clK0=Be*K2X&?RG>I>{?%;E<_FV6$_)TliA9Q<=v`p{FQn8{JTb??I z6}?GgR6g>>od460+Ovl{^eTcKe<*S(PmdHo^z4j8iS#r9jU7BkCR$DtN~kFDcjWA` zS65e8opLeP{a;oA!{Qz$%c(74Czj82QK+4BNS5U%_q(NGf_j}VFaCWl*d)Qg$iU#~ z;u!My@288(9e;K$eBbbEUowx<;h+mwuNG(pywP8OKL7ml(;aO~w)=T2F1+YwreP-c ze%?I0ecP9F-P-ouE=Y7X>ssryt~@2b0>OnL zns=OT+jiZ1(_||2_EGq*sdZ~EPd#Mp)SJO2^SGwxm%$m+qWYs>qI9!uKN*DwHSCsg zS;g>}>D|(bWX_bhr6!q-@~`f3@Rod*uk5#J+nP zi~XLf`AF&5i9C9E^|ak&Yqf`ZAGN>hJW-NTT6IUW?Gb;T-OcNPhh}-IpHR1NKG=EU z6UUO<7R(CD#og^QW9=EvY;={$b(xuTYP;hebz{q8f^xx;Gc21mQf~a5U-Z}7@T1A) zMJbF5)z>^DmPYOuUv@Z(KYQ&~nd=s!ktbc2grsV+^{g!p`uMy-WykJZ65)FV%Xc1S>ccEj#UUuR473-mkCkeO;D#y6)SwHPfZ7e%qaW7bE-5s*SH$tn--l z>u?qR%ZCMvlm5+f77Hrh9ho@Gdgtz?H(RBhdS@5DZkQPoH%;hO|MvIscK?37`?p1J z^#sOe_Is+|atUmiy=uDBQZXi;b%#x-USFWG`pj7!yMmf)doqd?rbTOurOc@gIU$=Q z?=?3v;m4aM$CsNP9GR1RKw8DCSjO`Fr-jZf56kKw+5dVfKEM87MS0XTSB{#xo%{a& z`}z95t?}ngA3g?TFMWLXVL^nq?(3*ChrJGOHD#=bo!s@{rMkLP-mhPuZhdn+Ccx?C zedg{a#`G`uLbuADlDHAKe(lzKzY}BmUuQ|Euq?~XX7JQZO_Y`B+O)x3{Ay{WgkQ`j zj@^mH7nOw>6N1k><;!h7V%hhl^6$*I*R$_iDHn$to;>jIv*`6{hq#wsQU0yS@5^bu zMuhPYnj~ z)tkX*y?&7*L_S?P-oWqi441>BH~di3=DP#(K$D zW&SG4J-+px{OgYa2bSmViTmv#a(8a$wbY+4*3}g4zb9%hc0^F_v~hFuW0hq&r=KrA zaK!erTHyBA*DTV+9hGK8J$s?Dne|I#xm)*(113ut5FIATCe{m##V?XDK2W|TskGlE4zEu zRy&UyyQVhph_YO>^}{YP*;Q@1?|CGBTLZZokH$t{-^jn?x|7T4d%JeKUpb$#?CuqI z4wc9f7jvQ2=kDB8e!-oW>HIXWK=|0lfN4SR`nC#ud;RR$>J2tJ)t6tt%i>t0^Ywwu z;-qdhwH0eFK9*KoAwJK}K;+t4s}3&X%_4&PYP6n&9|RuGCJM4YNh*HuMZvPneJ@vWVz#^6z;|8GtK7K zh8Y)A)U6KZYVas|20JDEVz@K&$emC}ozp?@-t`47SnNKtbl2+CR9U%W9I=Oc6`3w5 zI9+_oxAb1=`@g%snmL^o^V{rTqEfhOWBt#gm#5qRJn_wVs?(7Tejze_k5vBrxEL#+ zH$lnzcqBLWn(aJ>g z*VbpYoxb)v;m{@>?hSfR1G=X?dbV_0P(;?scGo2VngYkxYA!9|QWb28ys%KN@A$s& zr&FcPHk}q$GV0{)Dm&tLM1-rPnRCX2S0RyHD*_@6HlE>DnH8#(_QFB_!o>C#j)@IH zw>)Ha%uQOc{p|L&@xPxg&3%6Nink`i_InQvw_pCT$jN2uHrweTPI4T1?qzp;R42*i z$;{Hpv|XakdE;cisDiN52ASY9j_Q_z(mR_Nc(?1%yOZy;RjhS>&YIP47CQPFex2j$ zrzNj0*VHMNVD^AhBh5qea*J3n$Nc-Pl06NFJ2H5>ui4gR%z65G`H_GlvI1N(IsdNw zjIK7i75w>#Ql%raPRoW9e*#1jvyLn(#~-;{5o@K=kfv$!zc%@TPJxo*DBB26kHx;y!FG@ zbHX>Aj>^1~Ygs6G_0+sWVMnwsbfmVjaw^|H7{lz+F>P1xz0#tsGaoTL z`C$58v3~1!8CMUyF#P>eqw~|d`CFH!o6D<)YqiUWIoBRM z_CIRU(fsh1lS*gyvJLYJZU;IwRQ}6RKj40%#W3+-Y@N5;#_?^Q(Q{dhQpS*R;3eVp8=l3Z6p!pP)YPQPD zR~~a3xrT5oogBuYx=3bjo3iVp@Up}tF{V;i`MqBkcG;adWNV@Hq=&=KT6w-xSb&c^ z<69}+)lyrRab1s1KK8Id_0K%_(0zqmdz9x06xRq=@i|$!9=qQdd0~&CdPw>A*HKSO z$_3ICHJJqFpRZn7v}=9r$HU*(|1Q-Kl{jN?!Z&v%YuC2-&ZbXx`jm9PeHZ(<%U^Bh z?vr>ef9W;Lc&wDL9XF<1@>@w-zQo6k~KHgj}Xqr+?N5_rQ4@svArf{Wk zEasJ6d_^j4MXM{{qU0IQTsvQF>bP>WEmA)AtNgf~S#PE&LrE3@m#i)fkq)%InDBo@Xw#o4NEF_Q?*?9qUCq<=e^lfbmM#1l&2e}xcY=n6Pohj@Z63KtGDmXmN+Z4YD#MC ztDxg{-)hT0F`SM#l{it~uJ-fE+3)w)mCLP4;5@(~*(Y0VS#(FTKsIk;^U77vuH7}% z`mAJVxp?8NS;w9(d3KET=wUJ6V%hr>mRGW=U6VYvYod#Qu*9mRskzdu&8@@A%1z|Ns%w%CD%X_lF;o9aJZ=lP;|HQmvF z!EN?aSwatXMtwf6zB2Ki$mV%VPa1OUICu8W%RRl@^?zT#zjxmH*yAnAoID$TS84F| z*twY(ubRsJMBz_K#5})tr8{j~*S0TxTp)k9?Q7z)SFhIj{kCg+S+M`j-@n<`SGe4y z-#tlGd3ag!L4n1bzT=03-pR{Nd%teFud9SX^K#vjB@0h@AIX36MWdo8*~3p^6-(bi zyNsp{obgd_-dkF;B`jp_VBMwTbfor$O-NdAmSM_Lo$p2eB?5b1%w^!+J+-5)f2MDb z``yTnD=RJqz1k%boO5>F^=)rs&+@g0&RDgfPjRWhowm2NAEMr0ds<-QB6;;2-@><- zlu}*KTu^Hw{eEZ7h8RO=eY!`CYJ<}2C zl1NhvFK6BOQYVPfT>hDo%aQ8Kr?*Nne0Z_U(oX&Ffp7fpd9+%&Jg$bc@3xbf?*Hz+ zT-S#Sk83T%7ABr{ymjw4!?mZS(z)^)-I8rmD-Wj5;0-=6Sy#5uFCny2v5%%LNZ|LDH-gc;j6#<%rf z+s;w5cvp%;Y)-Xc*@7#ZWWu%P9AC(&`eO34v;_8@v9tRZ=1y>Kh{~RLpfASdPA*Tf z*}G$bva42WdZ$cgTkF3fQNolU%&FyZM8w=GAbQ?Hi@qOdCFegCT?uzKa zHK)^TW(rT)`)!W8Ve7*vsW%MIMD9)OEKX(Bv(hmsGguO-t8x420p3Lh4s-Y&KY9nb z-MLaAJ}uf`n(6a_)03Wy=$lx$c<5XDp01oP;9pW<*mP1-r9seh&Bxu7cUKpdg*yNG zc3_X*r-Bvjt=i0P<*$Ez_-HHs@%rZ8cUg94eia1E?s~trJXI<2&F>vKkBej(H?~gV zewO@W*QvvIZ+)x1zis#L_T9ggPu$w}`oh9{yH_4!s^?tPGE>>wLU3Y`Oy9#*>l~u) zq}leq*f*K^VdreNJ7QB7JN)T5ayRW&`h^Qh5$1W->a$)xw<@Wqi6(#Mi^G5S}En-Lha^>KQc!vCOc?tVe?5-Ys0)d5+W0Gutw_Z~OFH$0MuL z_e=lpymNWUBw=@FkG+QJQzKXGOxk2+H%EB8;4XjZH6FEJe~1c~c3m_M&fWst?1QTC{bMGw^ZZC0wCoa5(>i_1=XrMa?R`35DDRAMf3h~b)X-@^9L4qg=)r^z zkCu4WmFktz4c>wk^Cqt2VrmO66iAflJW_D!?m?E`Cw|VPo-QVfeQ*y>xP(E=nBX8^5w5d*8PXuvum&>NGG)brEhIEz3W@|2eA@O^w zD}RBF+)^>Eq^#dN4GS%&Y!V5I4y*Zi^z!_FC#SdH-~0b=xc!@hi>7{Ay5Pj6pwF51 z_A!x%yck>xu10;>tbgy%r}X%mZ!afj{(rXn`~Lrb%eS8Rd-(6}>96SAbY=PQb8d4)$>xkHmKGm3$TFmQ8L=APF}hmir<`_DVDsxG`_A!O`n#OtQz-kh z=GUFMEkQNH%*S>p8XZh@3iB`(_!1^~kE`I+DV6L(&iu1~vRLF#Z0_it%>SX`V?|Od zpUl_jC9D+)#M)YNsd9yCC6gy+Z}-&!kQ)DlairTs5`7+h*RhtzOdCnDxz8cSneM zTx(mM_};3G-?UZw!rVK5HY?yjSgGvO#jmsT=lL%;-BP}HwupzIp3Gfu z&7@bi+NM+hApc@dt(Ocra`& zid{0LDm5=Qbn7&wRKu;gCd-8OhV$K+<7EEjpt|h2C*BW#w>u{mU49qU<*;#0jn%s4 zhn1RkOVk4WQ%7uVXhF63x* zPkQ9n(jhRtQg~{|BiXd9$*OeB(+*T^6wKQgZ_3P&Bn^j4z zhxdG+$auxZcZC77?<~!m?(HpQ zDHg(r;Z=rYIFDX&!pNd-jlcfh&;P){ds-wshh4Wy~cFHk*SA;*=Jo_YfP`t;tx#C z*IwoBn6;XdBXq&4YWdm~Y^=AvCoVYQEt<%wC22fkXUIcWhlllVErY&UF3eyHeOvqH z?XRM_0{l~5g)W{EV@gyHin+s)Qye_ueqY4nH`y~gR0ntSB550rmDp7`z8zf0`8YS&-CxO=rG+e;!bXGRj=tasjh z0lr5g&-*P^*pVW_oUG{g&)4sVZR*s*ZV9_PQz{SNyI~o7xIxcII>~98Mf4qKBi>cX zI}SPpXOvrKZw~I$KfdSoqDQB=dpjPu9-4Z3LV(88?P>F6{r{XjdAmr#)8C-@PFkmD zwo=RG@RGlbU!Oi;Oze&u3>=d0@iS zwrl5Cp12uT7Hv4XWgdNBNr}WY z!qLXh_p;1i$vA^KkLz-HXjeG-Zin%>8|0Wlja%Iij|stg%l1iT(`6J>|CV+Lz8r?;LHctOg(oQrZ{{` zeXel2cAEqX-+jZRNh^K(KJIK@7jg#$JPGD~00i zA18d0SUmfJ#Wfd;h*{6i@rmEFFp-dn*8b=HZ^NJHc{2CjsNT?7mD>9F85Y zwBEE#Fl*sBV7&Ddb5-ezRn{Ig5*AAn*bcCt5NuZvQEEy&w_@p?H#KhIaRC~qw*Cy{ zwOf3-Xr57F8Ix$5s+qUff};|XEp_yj79G9oGq>gH1I2v>8$9IMK24aiYL@!>5eLFdwg+H1aJl)~{P|!c`VC_eZJu9v$wfg4rv@a05_@~q5Cg(1JsY*&c28_H9 z_cDJdO}w1?<=~;~xks7h9j+ zf4~0!yZe9tt^+SadUZM~OXZ0}v8#!<=6vNkP9m(gdsd^3lm z?(aWuZYE!!Ep_tDGL$+#-cf&3d%#7vv-79)_#8b`u^Xq z=KRZ_zRo{?|6hUHtU1#!m>Y;btj+e;^^O#9k}4 z)%jAj(a_~cMC+517(ae@&7&dJy6Kz$?wS~^>7*(=!CihSmtnslkKFgwHxoFgoH`xV zQE928kdeRlYtkvDd!1a0J|A7vQaK}9xGlUHKihOIy4b{fJ+WYY=(~4*N8VQD#(44Z zYOuE1MS7d)Gd`4f-+rW%ZB3X^r>Dx95RD&~j$Uy&Qd%@sSyEx*Wrej3oh}`$N~w{n zc~jdAUZ2<*($~BwAzf%uspitIrO{Kf-&-wk?(PWJ*V{PBL1VQ?qdAtq*Gt0Xr4P@ z{n>@%3AO^mKeNa3ZkRSKz2J}Z3k?mf=&(aSOu@wxMj zuh_ij!*(e?CE2vJ(2fJ|wrywZpEG%>(X_2$f;@YpPi+)4-yiq=`sp;UuUlSiFx2T# z-2iu$W_@_It@-!w^B!E2`6%GKdU0om@Ae(ho^lC! zqC59Tzw8mP=X!=SBGU`+;p_5zKNHF~aM znoiSe&y=?EGpC z|K6buhAZ>ty=^|&`)K{DY@2&40>9_B6kidk-SApr!IYrZrCqD7Pdu1ob}WSJt}K83 zhoA2De;+NrxXyaZltX@dc~_cPO$E^+(mpJxmIsMmj7 z-EUu4_5a_W+xP#y`}+6myMHC+^*3(sh$(*?H*KoT9w$zhRmWVD{+T=J6=ye{xEniT z%kE9a6K7`g|CW4ZxL@2XzqR|-i`t%hXM8=nL}k+i?cUAQTzYU;;1jEFA6B0D+`0VS zDi6cY+t1&A`jbmZHhKGcyZ?V)J}j-T-5D3Bw_bnx;Y>wm!Fc|n6{i!|7DXh9y>T`^ zZ&K&8#Bb}dtxoObOAl>(z3uIpJqm~21g@PcQ zgHOz2G>U}RtS-HM?)KNBtBLE5DFq$j*}J-fr?Zs?c6OATy32upgYZRYaEcmdUU$0M@ zr?I{A%oN=_wRy~^Gn{M}SShT(!{BwmJeko!t-foS+WAYa44J(i244jx9L-G={PwoP z>g?I8J{>lt6A#8FC~ZpcsC@GL)rmUo2(L~*HWqPP_nO={3;0W8?@XLi>sgb=eke@i zLeEKtuDAnpc~}lTxpuTxbZ+C%Kc80aXS~y6nUyTD^scYi;WIZk8Mdt9xXPs1P*`Pg z?eU|v-*a!D_kGy$#A(yE?}leW&eoQ&C#WPCORwT9(z~$m;!C3~bC%fMk+-i}aQNg5 zS9bBRtqU18?sO}doi(d4TS@fFRVkmdB~L8hPA*S%%si)>m~d`Q=Z3SacW0^J$=Vb7 zz-9mBR@sGT*89rv7cAfi*L?U;|A@D)b8gA$U79)H4L8dsZON&V7Hi*ORIxUTZ$niN z_vYU{Gu>RD_m~cI;XF_Uv>& zc|HzxgW!m>&wTEFmi)CQYctc#2eXt-K3{x2`430l`FKW42?uM|B~Md%Qk%om~E7$^rTVRpv30h6E?SwxIfE&D)_d{bbgl?`|zDqV%*=?)(LTl50AFhhv_UZE^K#EAX6h*7vN=8Q!~RmBq#0oRL$Mm~&CUXU<_m z0nsEiS;yRuIgS=9W$ z`}z9)JryaYY*jB<+>-h>etZ;B(C=qd|9*zinRNzY7Mtb$UvHZ7dFlQ=Ims2bqcgl} z8|Iw5U9h3Zd}~l-R&4*fp4``2ha1*~&A2P-5*Vc@>RDjkpUlnR7&`N$Xlm3X#r)u+ z{X3%-d^Q~3XxX>)M)2jr=4ZZ-7#-N(XrB>Dc~-J|lce6%{m)A;@BjIh|9JDB+VZ_I z?ltp+lAK(<6VrK=S8QY4Wi`<|rQT}ehfAqj6hm*EVbyU8GCA|u%TjLo+fBw7cj;|C z^5GJ5-L7hzJ^Mavb2SV5al@MXm68(64vy=rfwQLvEfo;H?!4ADYwFVoS(kvfvDP&+ zc6T>ilggNK{K&;S?ZZsB_!9UiI~gEv23bR z`S;_GZ=Y80kFEcD^T*ro@9*Uo2ub_o%sa>`qHZyfmwDst>h0~1KdJBk_fvo0j~9>I zO9fqx^^4Yg{a2#py>Z=l?*A{>?=M-Le?Kn%-0#y%U9Y~i?Bs~s{q(v?<4J^VdviIoXcj!ndsOjVyLzc%ktn)!H_nnl`l z50)EK*pEeA&0o2=QnP`{w@*s9|Mil|t@g3gE*LhHl=ENqTcP>a{mYIYtwulf0{8Ez zo9r?>R4vW4FCpsbjJIYbCw6D}Eo7cJM^t2IrQe2UbLZL5$Wy;qv&|>Pj$vlDHP^NS zy@%xr<0K95`Ba>ktS!G_TXN)&cLf(No?qL3N&WQ$k7Z^v7V=IFS~XKJo97;*0WWi# zRu4~uZcy9Jl{(ppidyYe7CNt^qPJUUmT#@Q+gYhmmCvxmL$GYKR*K(YrF-Je?1HRc z1i2P=?l~*meAD*C>`rcL)k5vr7c1YVuXZ)8YZH*YRu%E;V}xtP{W8s+nyj80N#9S-oPAq0{-BQ1;(GzX zij$OnZugS$7x{QQ`tnjK(e7bAvx1yW7c3JC&I!tk^P^;GTJ$|i9-r&6A zTmwUeGlx<>Ty(FpD=Y|H;KwJo@$i{Sr|+&ROa)t{1zV2ZX$_Q|U;F37<@tM7E>W?l zEpk6{i*1Df^S#bf5^CKtFTVV}{hI&z+IGowk!#z3UDNfDT^6>=;>XjUQpqP?FKu`D z`*hdz@6(-PxT>}%vN zfB)XSyF9;c&-=&rf6j*gf44o}e*f+nMVhPApHHf`yf%H8tJK!n)>Arz#AiS4m6UPY z{q4dDu7g*u-rDf($A-F(ljFBs+yC>|?R{I@e=lCOzq91lOeBIl)FE?HWO zi>(WF`19^=TndBAA-A{o%Fvj&)8M+6rjInUPTDfIpvSH` z8g0*RGCgvQku79AaJGc!t>8j#X9HK6wY^J45`%o*D@~KX>sSb7vJ38BwV6GJD=Dd6 zQFxo9!;ZFR?bmK?EfL|BY(7V`LUU^7&$v9Fc@!8(o9zf*$kQdw9Ud*KJS4seD=t|X zG{e*7#zQNs4lhy3L#x`P*N8;qUNd;9-gk4m;8`x+>(^K^)&5CEUFqmkX_7jtUB@FT zcTLqQ$AQL&Q03nWXiv1?wm`SW(~YO7o9g69n%o}EG}R5qQj5t z!kOjjv(r*mX8zr9M^i9j!kL}Bb{~(hEK^^abdyPrKUBM6XG2diZ}o=n4jdLUIWNd* z9cB2eV`$Q}n@#(G;K3}vDhRNj>|Lk>k=Ie%``4^H!<+E%3%BsUiQJ_M zMGrX~_=;cqx!5>8k(eeax2xe=wbU}f)EA;coadEw7^MUja(Mrm#eK(nszYjX)~aWw zo6|dH3LJd!$|Wbywj!lqYrwzR=haepHm~?Pqhmpql8-{Dw(5rq7c$&mKTpI2Q z>b~t|$!&|8U>|o$i8)?kZA{AI>Hosg?zQjQ$u~JMtas*;DIR)!=blQeGGoy3j=Xm0 z%=6dlUb##C6mt4j+rB;b=ge)0`tk8$h1ELmsh2Zt*R-4GzvJV6ej-KQ zQ7z#^+0Fll@7H|Z9{=~l)$Pyiidg#>3SP+&3$VLi70A<_$7^q(Zh~cu=5Lo;i-m4qc;VsJPgNSpJ+=A2 z<6i&zP_aJwi*L5)+^=Of`<^JZHeSx$8@FyTua;7`!ES@A2eQv*t7^77t}Siw)(i?3 zh`p{Vb*;$a%e8H%T{}AWgb6x{eq1QfJiA=Bc0zHa7T0cf2ewvb^GzbX`EEL2o;}{3 zx^n;jXYC($e*W^k$I_!m#Mf(w=3=pG>>vDu<)UoRG}2;!>DumAD+eEql0=f8da_V@Pm_512} z_p&Lk3cafQXwUY4pY`wmdGvh#K1sne0E>kQ<==-x=QLx@nVDR+^l-( z$ER>t{xWb|nz4Bilh6-=lc{3UD<-hEaLQD?dvQwXo!GUaiQg6^H)x3bFjO`u=VbPE z&r;|psmR_N7P)G++1v<0nXGdO%sD$WdmlQU%<;X-!;_n}E-$Xz;Bu;T+{We|w?Nt%A{pAIzH-dTFWHbGp4q1ogy zZwSW`<4NqA-RIIf1RACv3f*B4uJ}4u@paIRLW?Wx&#tx0Wy-vLT3Y|T%JJ5s&AhzE z0ZtOLBJ|$v_`ZC1#w5GE-1XI6>P(g=XX>-AR*3tsN84%l+KDfOQXSqmw{}FFb)I{D z;i@FA*b{5En@#h26T;oMb*;m2%}RMf&5XtT(bo<=XN?t<23k`ohmEWOQau<19mHLv&M z7{{Qm&f9v=C zyUU+uGG}Rsx2@V;CAGY~*FHx$8lBv>w;S6?$LjI+8Ey$ve6;WNE*<`U{xf&Z?Vj~9 z@9P$)%=+9^!J;Cy10G#vy(=g3W=Gf8?%a~A{@t}jZ2R88#HRMY9n9SvQ*R{dc{f@I z}_^XT4(hf_0UST-rVBcfjkcEHkI8Cqm)T4S|p4 zCq{8~F6Zm@xSId%V?qC(9DTdTzRcxp9=vZP@3JkDED>0*sdSF_h@#>b{&SQ3_@-T1 zacrY-t>d-EJg1ra#GX0GF}m9)HD-i&WiGWgyuIPgR#}m61sAtmXxE*S>NJ7V;-y9) z&yh7DE*2z8 z?{p3+Bz8<#$)$h#BSZ7M+Wp)9Uh0f&-!?HwK52@QRYtfp-wyrus$JG|=J_3O7iQml z_Db8k=Vwc<*G_g`c=3Yu{k7X-zn@-r?wP0c#w#lVr-gr%xI43Q#i54}I$~9mO5KY- zU;eFqVe$v2vI&uGlZt)*+)*{?<($e<{NjAa;oDkmA4NnN0~I{hys~|h+4$n?OiQEE zWSP|~`_+!e9O#p*^J0*PWwu+brOfjgS_@yYb|1CrR=;}i(7Ti@#= zs}3`Fo%|Z`KtpH2mbK1C#>)>`E2KB8_#1ggcw1|6Ez}g46qTG7x>!blJ;|!m%0)Bz z=#eO!@P%jltd23SJjf7O^Ti}wnL%mI%6lGLPsq5b^Ds4}Dk(qsviu8=t`}GEx#z|@ zW*1~q!g>0;crw|WU&ssj&U5&t)88;VM9X1ELqhMNc+(G3O$R4fpUxGlx7_S&=#f(H zCgnUO)9K+?>4d5S-9H&mOsw3@x%=F4oAeFxn7y;ur8Y=L++F|sLgIG8DwmI!Y&I2p`t&KQF$T*nb2KQwET`*{W3u94tT&Sz zqxbZnq&Wg=zZT!#S6;r}wIIU5u5H)Nha18U&u%Zhe>^ojxaLdA|EJUQ{f=KfzGJ`r zo&7u4yT-I%vC`|+vaB(wue(|I|Ly1a|8H;S@3)R$cR2FS1IcI}=d`Hfg(j7s7(A{X zlDS+Qs~ncBW3z6}v-Q(!SM)vPL4I2Oij7xR$V){m5g-9;dabD@%JG&YUrMv;Dc)GxoE7TW~HcioAYlcc0?a)4OK; zd|H%vVV53@(dFFx++U+kecU0}|2nN&aMe`)_FXbs+{Tkb7#w9DJ`D&x=#r}G^0Kle zXaz^^y2IP|a!xepxYqD^&fF_&%cZkoBfIOB9z%H+-St9NJC@_^D=NBjUAN1MJ=Ij%%kgMO8E>BS&Z>&N$8R%FbSXZm>3ODd>vLUE zml+N-5*DufX!6!!nau3enf8^QE4ezkYTy0PxZcs3r})0G<(>pD-|~q0?-DFxG<0o} z-_2;|bN^tG@#%={IicxOmSmRHZ0NC=%^P0U=O=PJHtMxotar=G>GRGDaMlPlwjK)* zOB3v07;E+W&ao9@TiMh3g&rSRQgXCat}P?hcYSVP-1O9ysqdYiXH0k&D_oKj+J1Y( zmzZr2pNZ}Kd~nkAQ(XJ=dRJa~9Obn(RO5`E!%`6;*5o(I_k)ezrlplxU5PsNF<|zs zjKjXn{##Z~=yH|LZdqO#Kkr`P62YbhEA74~2~PyMHe67uvAGh}ay9JG!@Sm=4fF2Z zv9+0}b^2$G?7F-P8@cOC_t?%qf1Pnb%ZB-@txGf}%JWV2+*Z4zF5<1rn|1TfyfCR| znPAuZF{F4MgQ@mOA4i4#4@HIcPjr0z-sfc~PYFkC_S#kV+P4}0V%V*pee;&Zs*ll1 zhab<~lEx?V%4tDR>c*;w=}XIs@2~HDu=GRFlZu!tFKh0d>`Y}a*>%j<<&aRGZ(7U_ z{=2sew(ppFs9r5^WAtueXSL#FC(W9u)9(G>^X2%wCk83mE&8(Vy4|d-itkgT9;&Of ziVMDO_KuZ&y|M1ghBvbM>wkaUG(C#X+gA2TfyORr@psF9=l#C7$SiyDuARBbJ6dPw z1FLv|lT5IlJvnvVHYrkwP-~Z-u>Fev)I*moQ z3jOXc`4_oj#_<=u3`tpOsSPc%E-EfB4&RIa=DSv`jqm$8r)7`B>wkQd|NqMSQm*R2mb<~~{z%P0EI=a7q$d-+;kftjmU zNmqt<&*3!=FD?xFys_NkXhr+X9R|~-&phau!MrR*;qb!4ZN5V09WrZsbIXGjpX~|| zy}x@~+A7Tx1vf5a6s?@{cy7aqX8XdJQ@dVNTwJ?;>x2-!!|TuPHuQe)tjnkqa42bG z_2gfIni21&DwKjC`7Rcv6Ua0+w?3b!kuUJqSHRpLyuqSJn1VZKmX~m zn8!b)&cAUidbHxvr42ePnT?h|dfV#`^K)!w?O$fmb26D_^|Z6$Jp7Auc)!&vNV)uE zoUzj2uKcURg{>D-vsbw-D?eTIeTU6G`S<>>U%m`kHNj(lPV$$8j@3~+)IEDW*bJTJ zYv1n`*jrigPkP!J)B~W6SeM5Uo$Zxv1Ph=3F}0wmFdQl__a&;H##Z3aJ#&h zJ=4X}EPnpXW0?!mCYHBMac&j3w^)5bWUI);E8K^dcKAd_nFV=f_Ou^c$SkvJZSR5U zi(N#LT-j98nzB5&n!2aWS@q;K!x1HAWwk{sW?kN_($v5q6+gQss&BP`%&qdK*4U}S z8X*>Pr;gsNm|=b8p~|6F4!gsr)0zyD^^QwC5B$KVWPfbZg(Yb$%6^Zvp4_?3n9!s0 zGIG+zJC`0`c6*TJk$h59{QRcdi4S?zC+=8sM&^E~(oAn%6Paa!kwTNYX2n_sTKHP0 zE|pPtKJeUzH>^kVBwOd3bt`5 zDwkcR8SAHVs#$SH#_ZcCl2bEQ^Q1P+bJacEkA1)UY8KpNaZVY?4DmlU>HSep*rCnh= zs^O%*!D@A*L}>?u%e|9V4sH`!8G0abHFvq8cl^HKoM?+Z+b(?K%&!-PcLh(xK8)*%=z4COoR}2uYVK_zw|eLM+%F;w)rVXe zE=^Qq54#vMtLX-Z#IxERuS6~#cHYJKXZ>VQlmiYNY%#sy0b2uiJ^UTOv zDbydqThMQ0azf3}+vnc>7!}TC$9v~a`*4Bdf3bqkDfM|`o1cb!ICk^7qE_dc0~1ah zT`GHjf{yc@H`5k69!U%M+$!nfY`jqTq5h&%OAW+ZcTb*DRJEh{`@J@g*lCN*w&fbX zcTsp$8XMBQ-`ccPf`KdEgMb@rK z5W8%+E9>=1oj_rB71JMu7j~W9n0n6e=w!@QYke^3$AZ~?dOlk`vR^$@($JAQ!Es60@ots; znKkc%PRuywpn2){hbxDgBd*A-OJxje+sxm}apJU)X?vmOt+Qvc*Y^7_y^?z0+HmS_ zt6Sf`Y^eM9u{px{a{KPD=KFu1od5Ty{{IK!|9}1e6aRPf>Dza&R$o4J=)vBX+k!Qn z`HCXKIKHks9Tah5*R0(uxfbT$y|Dk!qlee+e}DO%f6sRN!Js?K&(Bi-trMAD7`ZH8 zM{Uv3NbvxfsDrPzDolNv+)2IV`w^gTBKvr)5ykX zdj+22GaGlQ-|JemmF}2y1zs{~?nWop+jklH=PsCC$kMH} zpiSrcAufZ}B2QQ+U1>Yea7mk&=hKJJtY>Poy^?fToedAKVs@Kj`%2=R!WT1{3k#JW zm9%!m{4QwZ*&s0EOsvZc4ZqW7$5OMen;q)tWmtJ zXC?cw13Db943m12GOS)dQ%FA-`AEe5K$g;JrPUh_h=1GdTw7&v@9z3rz8&-K&FO2O zI^&hodHwL*ZztVPzf6qWAHA>s_onx;XFGzb6`QoaZqPaG6PkJG%F5`Ix9;CjJi_R4 zrZU}Z{xtXPt2HluKDwBL-Eq?&Kd!hdpLen|3VdB?Rg*tg!bxYUsX+(igUb(jMyLVwF$qTCl+BK(@ecJy1Pu0G8eWyPLM7^%wyidCD zTH1-d+}|$<2pWq&`>`Nfw7AytyVjHM#}j}3OYIJ+a(9z`XSFSN#ZKd?T6_ClmrUD~ zpWK}g;C4fy$s^Qp0?(7cjtR@W18*@-{(iBvMCx~;Vp8SrZ+Gwi;jR5Xd%m6A>!(G0 zHRs#!-hF-fa^Tdc>${A)Hwmwwy5fgj&CUIPs_p;Zum7}TYv8oQ`+u$8|4;n?;r%PW zo--Ei)YLIeFBd+V8@BV^vUhn_-yS>GeSGadU#@T8@0b5RoLpXh`)SU)Eh6UnZ%RxJ zWUg1~$J^BWnOybbX@1>5|NpP+zv=%!x?kLW74z$;>9fim&6?Ip9hyFKxn;j{_}mLT z+1q!W+V=YU{rz@#biea!o114pe|_WI#nLN#=lH28sf2Xt9lv_zgsjxZFNe?U@OZyB zHzKTT>znzUF_)&dv<*t+_W#G=5*_eD#XA zsG#J;l%?y^LLz=^Y~8WY{H<G&PJo2jU@$nZpG_k=St!KVDdYZp{cnfmI{g1lR|3wEEC%H+9yTjJf}oEt4N zO)(;ww|vfA?wO~=Cvj{^f!~>z&Ci+63+vnvO1@JPc=GbbHB21u)XaltS$;jW&Wz`# zXGaKge?djTjnD2+kBS`N`n2o$iVe1J!|oKH6W#7}?&KY21}&k+Mzuo$^XE)0_`d&c z??vP1>osnEZSKgbIX`7()vEAIC-Xi{ka)Ll!<_lIQ{Jguc|1>Q)(Y)Si`yGt_ZJ=J zIJ07@$fvD8)aB>6i?c_Al`cg#915p%SfMZ-uo{7d8BYTbL*ZL1c36;ymYFEx%QYOclF zcece*cQ@;H-Pf!6e0ZkqnW#+*oez|~5?i;x<=rxuGfkEkRVNsvUW?iDTEr~1!Nel- z9h5k(oYs@UnShbMz^B)C=v`UvlZ4;`C6ee!ZO>$Y~v*cnCL&@s1i@N6S zjeQW3Gx4}oefwsok_e0atkzu~SG}gNoMG};(mDHnT5>d32J6S7CR6!sc{7&1+5D#0 zbEjdj#fMKN9`j6e8*YZ?|FJlgI@iA4vd3CoQRma?ruHM3{~A7<@6*;X=^UF*-jpT( z?%fOalNP=!)YX~4hhfRi8#+@uZcd!7u_{~fU~kR*=bQqP%N5Ri^ia|_@VbzaWD_XWMzFCiQ$WW-eI>6$+D{PrtslTxp))+!SZco9T{nYHxR~DJr+Iy?1}UUv_L)*<0u8_iMkO z-dfq>VQ}}xEX$Q2GI$tNt_W2zy3g8omq{;4`iT0OdDn$E^gUHKI(cT!RW;6|jcIvl zaSElJ?~Pf0bnkfYuy*y%-IB*AFs3Zy(`tPk6teY7P}b5C#xg-WnQ1|sE{*b%XJU=A zH1f7Sc(Q!S#nvMS53eary>`fPlJ9~ZPR2h+cPpf^uio8P5Zt?pJ#cnZ&&4ZVoYM<8 z1ROEDv&%zCXyN0i?}x40R%RVK>&V-&*XsJqT)yVat5<(tIO4dH<#jwzs|0%+!=T7`f~H~{(k;tc4z7;_Sww;9<_t3l(qhE zjn%ccd**I0vwNTXBK3CL&DXDQ%(4vcaK2h3B^=ysaC1i1bm{xL%!bW#CtF_LZWle{ zVa_wbRB2nMJvWz32uQLh)bZeqW46AyumANv{@&9J=4x;51h0%#@Q+$=(0Z)7sF2As zp|h{bEN1hR&Ry+lTZHR>_1Ac5{5OhlhKc6WSlaI{yO=X4?L_wNj|W*d zv8%ZYPdL|^$#O90&*T?j^Zq?)+7y=bNGW8eh~2!trQdd4+choAwWZ1@wX<(|GS6qe z_O0u@BfFFnJNL}(@a~+Iv*VY<;fFz7JDnwB`1-&1C-15MFQeWuYxDX9E@ z?o(`(`IvzyJ<2<1Q7vtwsc)GChUWy>OMj;(LJ9g@l= zsbS6iCc0b8(PdicL#HD_(}kw~KmB>9sd>7^j+BHc9*<66ykw!^YGZw{AtJq3Vs+

    ~@u(KfE=+-*eBR_gL)hsgm};-@N=7 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 z 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%0AufmvFY>V#vI2|Ng$Wuls#h*k^J|$M(uQ&u-st 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

    jiJ3?&(Xb_1@T)zMA5@JlL}Q>ng_Twl(X1^|v?o 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 + +Oskiewar — miniature theme prototype + + +

    + diff --git a/xbox/themes/photorealistic/native-verification.json b/xbox/themes/photorealistic/native-verification.json new file mode 100644 index 0000000000..1f9fcd2a7a --- /dev/null +++ b/xbox/themes/photorealistic/native-verification.json @@ -0,0 +1,45 @@ +{ + "nativeReady": true, + "native60FpsVerified": false, + "xbox": { + "package": "1.0.0.43", + "ciBuild": "1.0.461", + "ciJob": "wrlas8rkqjfdsmvg", + "commit": "91dc041e44c0d5cb190ce2d83a0d379a05089d0c", + "packageSha256": "5ffccaef27c014d380f1ddbd5e21284463f184107298d8f5247ff2d8176040b4", + "assetsHashVerified": true, + "installed": true, + "screenshot": "verification-xbox43.png", + "visuallyVerified": [ + "photographic background", + "green fighter head and limbs", + "skateboards", + "projected terrain" + ], + "followup": "Shared game v168 replaces the stretched deep-wall crop and places the photo backdrop behind the complete world depth range. Screenshot records the earlier package43 visual check." + }, + "acos": { + "visuallyVerified": true, + "evidence": "Parent verified actual HDMI readback from the paired AC OS build." + }, + "relay": { + "url": "ws://192.168.1.235:7793/oskiewar-live", + "xboxLocalStateFile": "oskiewar-relay.txt", + "fileReadbackVerified": true + }, + "tests": [ + "Portable native runtime and QuickJS preflight passed", + "Windows GDK and UWP build passed", + "Both packaged RGBA hashes match source variants" + ], + "sharedGame": { + "verifiedBuild": 168, + "xboxReadyBytes": 1161698, + "xboxReadyGeneration": 4, + "cameraRegressionTests": "xbox/live/tests/renderer.test.mjs", + "cameraFixes": [ + "Background depth remains behind distant world geometry", + "AIR DROP framing follows separation beyond the starting room" + ] + } +} diff --git a/xbox/themes/photorealistic/native/manifest.json b/xbox/themes/photorealistic/native/manifest.json new file mode 100644 index 0000000000..5a391987a4 --- /dev/null +++ b/xbox/themes/photorealistic/native/manifest.json @@ -0,0 +1,94 @@ +{ + "format": "RGBA8", + "alpha": "straight", + "sourceCoordinates": "master pixels", + "textureUpload": "once at host initialization", + "assets": [ + { + "id": 0, + "name": "underpass", + "size": [ + 1024, + 576 + ], + "master": [ + 1672, + 941 + ], + "file": "underpass-1024x576.rgba", + "bytes": 2359296, + "sha256": "56d9a4beffcb17a630769db9c68c6b9b877fd3ac37279a349907fabb6d4f90ce", + "masterSha256": "42952663be9942c93befae22a28fe43dcf47c1ae2253552e20704a37225c6cc3" + }, + { + "id": 1, + "name": "props", + "size": [ + 1024, + 512 + ], + "master": [ + 1774, + 887 + ], + "file": "props-1024x512.rgba", + "bytes": 2097152, + "sha256": "d1dc6e39e7ec45f3af47c40e0aff0a6cc2d29d2860b8f01b4f9a51893e2098ed", + "masterSha256": "440397bfb5369377817404545faf24d631302c8034c1492b14da28245d1f1c7c" + }, + { + "id": 2, + "name": "explosions-v1", + "size": [ + 1024, + 512 + ], + "master": [ + 1774, + 887 + ], + "blend": "straight-alpha", + "depthWrite": false, + "file": "explosions-v1-1024x512.rgba", + "bytes": 2097152, + "sha256": "cb6af5f631a173a91b34782addffd87d267ebba14cb7b5d9ad6b9a7df158b292", + "masterSha256": "197426015e878e4b2ec4cbc5e1e30b9c0d5366f9cb6c5bc20b19712c4786e778" + }, + { + "id": 3, + "name": "weapons-v2", + "size": [ + 1024, + 1024 + ], + "master": [ + 1254, + 1254 + ], + "blend": "straight-alpha", + "depthWrite": true, + "file": "weapons-v2-1024x1024.rgba", + "bytes": 4194304, + "sha256": "8892d9d15ddf8ef0c5b401f0361f9cd853b020b192db9bc5cbef96f12fb8ae22", + "masterSha256": "cdc1511046b18b6e0da79644503d7dfb41f1b6fa59b375c917e9daafd833ebd6" + }, + { + "id": 4, + "name": "sky-clouds-v1", + "size": [ + 1024, + 576 + ], + "master": [ + 1672, + 940 + ], + "blend": "opaque", + "depthWrite": true, + "file": "sky-clouds-v1-1024x576.rgba", + "bytes": 2359296, + "sha256": "ff0334805d9c7c5821d2548314a443e49e29e3627d37229ccf1f0c4f877699b5", + "masterSha256": "6ef393e004975b33a5ac7be9045460ac9b9a6365b80ec9df53727e1b3d8c4d03" + } + ] +} diff --git a/xbox/themes/photorealistic/native/prepare.mjs b/xbox/themes/photorealistic/native/prepare.mjs new file mode 100644 index 0000000000..146390d459 --- /dev/null +++ b/xbox/themes/photorealistic/native/prepare.mjs @@ -0,0 +1,25 @@ +// Deterministic format/size conversion of the approved generated masters. +import {spawnSync} from 'node:child_process'; +import {readFile,writeFile} from 'node:fs/promises'; +import {createHash} from 'node:crypto'; +import {fileURLToPath} from 'node:url'; +import path from 'node:path'; +const root=path.dirname(fileURLToPath(import.meta.url)); +const assets=[{id:0,name:'underpass',size:[1024,576],master:[1672,941]}, + {id:1,name:'props',size:[1024,512],master:[1774,887]}, + {id:2,name:'explosions-v1',size:[1024,512],master:[1774,887],blend:'straight-alpha',depthWrite:false}, + {id:3,name:'weapons-v2',size:[1024,1024],master:[1254,1254],blend:'straight-alpha',depthWrite:true}, + {id:4,name:'sky-clouds-v1',size:[1024,576],master:[1672,940],blend:'opaque',depthWrite:true}]; +for(const a of assets){ + const source=path.join(root,'../assets',a.name+'.png'); + a.file=`${a.name}-${a.size[0]}x${a.size[1]}.rgba`; + const result=spawnSync('ffmpeg',['-hide_banner','-loglevel','error','-y','-i',source, + '-vf',`scale=${a.size[0]}:${a.size[1]}`,'-f','rawvideo','-pix_fmt','rgba',path.join(root,a.file)],{stdio:'inherit'}); + if(result.status!==0)throw Error(`ffmpeg failed for ${a.name}`); + const bytes=await readFile(path.join(root,a.file)); + if(bytes.length!==a.size[0]*a.size[1]*4)throw Error('Invalid RGBA byte count'); + a.bytes=bytes.length;a.sha256=createHash('sha256').update(bytes).digest('hex'); + a.masterSha256=createHash('sha256').update(await readFile(source)).digest('hex'); +} +await writeFile(path.join(root,'manifest.json'),JSON.stringify({format:'RGBA8',alpha:'straight', + sourceCoordinates:'master pixels',textureUpload:'once at host initialization',assets},null,2)+'\n'); diff --git a/xbox/themes/photorealistic/preview-flat.png b/xbox/themes/photorealistic/preview-flat.png new file mode 100644 index 0000000000000000000000000000000000000000..f21c0a9bbbcf7e381e0deef4101f7f580ebf0902 GIT binary patch literal 17506 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 A761SM literal 0 HcmV?d00001 diff --git a/xbox/themes/photorealistic/preview-miniature.png b/xbox/themes/photorealistic/preview-miniature.png new file mode 100644 index 0000000000000000000000000000000000000000..00e149062eb61f606029b7b20edb600f73e1e9e5 GIT binary patch literal 1255013 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

    atG2zGwbRab_2TUO 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

    bJR&N=)uMUSR&8b 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

    H^p!gI^UDv)NUliqQGn(hU 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
    h|y6-Fvg$U1Hn!LwNy5*5>OipTV~H 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 b%nb3i+hT7172CnUz`)??>gTe~DWM4fTL9|m literal 0 HcmV?d00001 diff --git a/xbox/themes/photorealistic/preview.mjs b/xbox/themes/photorealistic/preview.mjs new file mode 100644 index 0000000000..9804c46f3e --- /dev/null +++ b/xbox/themes/photorealistic/preview.mjs @@ -0,0 +1,43 @@ +import {manifest,createThemeRenderer,canvasDriver} from './theme.mjs'; +const canvas=document.querySelector('canvas'),ctx=canvas.getContext('2d',{alpha:false}); +const images={}; +await Promise.all(Object.entries(manifest.assets).map(async([key,path])=>{ + const image=new Image();image.src=path;await image.decode();images[key]=image; +})); +const renderer=createThemeRenderer(canvasDriver(ctx,images)); +let paused=false,time=0,previous=performance.now(),samples=[],frames=0; +document.querySelector('select').onchange=e=>renderer.setTheme(e.target.value); +document.querySelector('#motion').onclick=e=>{paused=!paused;e.target.textContent=paused?'Animate':'Pause';}; +function pose(seat,t) { + const facing=seat===0?1:-1,phase=t*3.4+seat*1.8; + const x=(seat===0?360:920)+Math.sin(t*.5+seat)*36; + const y=490+Math.sin(phase)*4,hip=[x,y],neck=[x+facing*5,y-59]; + const shoulder=[x+facing*5,y-47],elbow=[x+facing*29,y-40],hand=[x+facing*53,y-51]; + const kneeA=[x-18+Math.sin(phase)*9,y+34],footA=[x-27+Math.sin(phase)*15,y+74]; + const kneeB=[x+18-Math.sin(phase)*9,y+34],footB=[x+27-Math.sin(phase)*15,y+74]; + return {seat,facing,head:[neck[0],neck[1]-29],radius:33,hand, + segments:[[hip,neck,18],[shoulder,elbow,12],[elbow,hand,12],[hip,kneeA,14], + [kneeA,footA,12],[hip,kneeB,14],[kneeB,footB,12]]}; +} +function render(t) { + renderer.background(1280,720); + renderer.platform(640,590,1120,44); + renderer.platform(220,335,230,29);renderer.platform(1060,335,230,29); + renderer.platform(640,257,250,29); + renderer.prop('skateboard',620+Math.sin(t)*95,563,99,33,Math.sin(t)*.015); + renderer.prop('rocket',640,370+Math.sin(t*1.9)*17,62,39,Math.sin(t)*.1); + renderer.fighter(pose(0,t));renderer.fighter(pose(1,t)); + ctx.font='bold 27px system-ui';ctx.textAlign='left';ctx.fillStyle='#ba99ff';ctx.fillText('AC',50,51); + ctx.textAlign='right';ctx.fillStyle='#a4e773';ctx.fillText('XBOX',1230,51); + ctx.font='18px system-ui';ctx.fillStyle='#ccd6e2';ctx.fillText('UNDERPASS',1230,81); +} +function frame(now) { + if(!paused)time+=Math.min(.05,(now-previous)/1000);previous=now; + const start=performance.now();render(time);samples.push(performance.now()-start);frames++; + if(samples.length>600)samples.shift(); + if(frames%30===0)document.querySelector('output').textContent=`${renderer.theme==='flat'?'Flat':'Miniature'} · ${(samples.reduce((a,b)=>a+b,0)/samples.length).toFixed(2)} ms draw submission`; + requestAnimationFrame(frame); +} +globalThis.themePreview={ready:true,renderer,render,setTime(t){time=t;paused=true;render(t);}, + state:()=>({time,theme:renderer.theme,frames,samples:[...samples]})}; +requestAnimationFrame(frame); diff --git a/xbox/themes/photorealistic/provenance.json b/xbox/themes/photorealistic/provenance.json new file mode 100644 index 0000000000..b76615fc3f --- /dev/null +++ b/xbox/themes/photorealistic/provenance.json @@ -0,0 +1,31 @@ +{ + "tool": "image_gen.imagegen (built-in)", + "backgroundPrompt": "Use case: stylized-concept. Asset type: production game background plate for Oskiewar, a side-on 2D platform battle game, photorealistic miniature skatepark theme. Create a wide 16:9 photograph of a real hand-built miniature underground skatepark at night. Straight-on orthographic side elevation, no perspective tilt. Dark weathered concrete wall, tiny glossy puddles, scuffed concrete floor only along bottom 15 percent; deep blue-black shadows and moody muted violet light on left, muted emerald green light on right. Fine realistic tactile cement, metal, moisture detail; cinematic but understated. Huge clear open playable space in central 75 percent, no major obstacles or foreground occluders. Keep brightness subdued to support brightly colored game characters overlaid later. No characters, no people, no text, no letters, no logos, no HUD, no decorative border. This image must work as an actual seamless-looking backdrop behind an existing game, not a poster. Flat gameplay plane and level horizontal floor at 85 percent down the image, no ramps intruding into gameplay.", + "atlasPrompt": "Use case: product-mockup. Asset type: transparent PNG game sprite atlas for a photorealistic miniature Oskiewar theme. A precisely organized 4-column by 2-row grid of eight separate objects, each centered inside its own equal square cell with generous transparent padding and no shadows outside the object. Front-on orthographic photographs of practical miniature props, black box studio controlled soft upper-left lighting. TOP ROW left to right: (1) a small perfectly round purple painted wooden head with two white circular inset eyes and little black pupils looking right; (2) exactly matching bright leafy green round head, pupils looking left; (3) a vertical slim purple painted metal cylinder with rounded ends, a straight stick-puppet limb; (4) an exactly matching leafy green vertical limb. BOTTOM ROW left to right: (1) a tiny chunky metallic gray sci-fi toy blaster aiming right; (2) a side-view narrow skateboard black grip tape with four small orange wheels; (3) a dark gray rectangular weathered concrete platform slab with a straight flat top and visible chipped front edge; (4) a short orange toy rocket pointing right. Use realistic wood grain, matte brushed metal, chipped enamel, believable tactile materials. Purple matches RGB159,122,232 and green matches RGB120,200,72. Exact 4x2 grid, eight isolated sprites total. The head circles have a friendly abstract stickman face, no bodies or hair. Transparent background, actual alpha outside every object, no checkerboard, no text, no lines, no cell borders, no logos. Square cells aligned edge-to-edge. Objects don't touch their cell edges. Wide 2:1 canvas.", + "assets": [ + { + "path": "assets/underpass.png", + "size": [ + 1672, + 941 + ], + "mode": "RGB", + "bytes": 2107579, + "sha256": "42952663be9942c93befae22a28fe43dcf47c1ae2253552e20704a37225c6cc3" + }, + { + "path": "assets/props.png", + "size": [ + 1774, + 887 + ], + "mode": "RGBA", + "alphaExtrema": [ + 0, + 255 + ], + "bytes": 912828, + "sha256": "440397bfb5369377817404545faf24d631302c8034c1492b14da28245d1f1c7c" + } + ] +} diff --git a/xbox/themes/photorealistic/sky-provenance.json b/xbox/themes/photorealistic/sky-provenance.json new file mode 100644 index 0000000000..2565e7d9bb --- /dev/null +++ b/xbox/themes/photorealistic/sky-provenance.json @@ -0,0 +1,13 @@ +{ + "provider": "built-in image_gen", + "model": "default (identifier not exposed)", + "prompt": "Use case: photorealistic-natural\nAsset type: retained background texture for an airborne fighting game, wide 16:9 landscape.\nPrimary request: A real photographic view suspended high in the sky among immense luminous white cumulus clouds, with no visible ground. The feeling of falling through open air above and between cloud layers.\nComposition: very wide uninterrupted panoramic sky, soft open blue-violet space in the middle for small game characters to remain readable, rich sculptural cloud banks concentrated around lower corners and along the far horizon. The top third is deeper atmospheric blue and subtle violet. Natural depth and atmospheric perspective, realistic wispy edges and sunlit billowing volumes.\nLighting/mood: moody late afternoon high-altitude light, luminous ivory-white clouds with subtle lavender shadows, balanced exposure, restrained colors. Photographic natural clouds, not illustrated or painted. No objects, no buildings, no land, no mountains, no aircraft, no people, no text, no logos, no borders, no stars, no graphic gradients. Opaque image edge to edge.", + "source": "/Users/jas/.codex/generated_images/01a0d55e-d5e9-7f52-a085-445a000521f5/exec-c5b352d9-ebad-41a7-8951-eb985d39ed0b.png", + "file": "assets/sky-clouds-v1.png", + "master": [ + 1672, + 940 + ], + "assetId": 4, + "inspected": true +} diff --git a/xbox/themes/photorealistic/sky-verification.json b/xbox/themes/photorealistic/sky-verification.json new file mode 100644 index 0000000000..529235275d --- /dev/null +++ b/xbox/themes/photorealistic/sky-verification.json @@ -0,0 +1,41 @@ +{ + "build": "1.0.464", + "job": "49922a1fhdrfjfi2", + "status": "success", + "commit": "a981eb2186206d6b38d801a41cea453b3e8315fb", + "packageVersion": "1.0.0.46", + "package": "/tmp/oskiewar-native46-package/NativeBios_1.0.0.46_x64.msix", + "sha256": "b7bd5c3f909c0c5dec05b111cc184cf870eabb87914b4ab8532196cf3a7f362d", + "assets": [ + { + "asset": 0, + "bytes": 2359296, + "sha256": "56d9a4beffcb17a630769db9c68c6b9b877fd3ac37279a349907fabb6d4f90ce" + }, + { + "asset": 1, + "bytes": 2097152, + "sha256": "d1dc6e39e7ec45f3af47c40e0aff0a6cc2d29d2860b8f01b4f9a51893e2098ed" + }, + { + "asset": 2, + "bytes": 2097152, + "sha256": "cb6af5f631a173a91b34782addffd87d267ebba14cb7b5d9ad6b9a7df158b292" + }, + { + "asset": 3, + "bytes": 4194304, + "sha256": "8892d9d15ddf8ef0c5b401f0361f9cd853b020b192db9bc5cbef96f12fb8ae22" + }, + { + "asset": 4, + "bytes": 2359296, + "sha256": "ff0334805d9c7c5821d2548314a443e49e29e3627d37229ccf1f0c4f877699b5" + } + ], + "retainedRgbaBytes": 13107200, + "portableNativeTests": "passed", + "quickJsSkyBounds": "passed", + "deviceInstalled": false, + "native60FpsVerified": false +} diff --git a/xbox/themes/photorealistic/theme.mjs b/xbox/themes/photorealistic/theme.mjs new file mode 100644 index 0000000000..0d34cf6ef1 --- /dev/null +++ b/xbox/themes/photorealistic/theme.mjs @@ -0,0 +1,79 @@ +// Presentation-only prototype. Coordinates come from a host's existing pose. +// Never change authoritative physics or consume its random stream here. +export const manifest = Object.freeze({ + id: 'miniature-night-v1', status: 'prototype', + switchablePrototype: true, nativeReady: true, native60FpsVerified: false, + assets: { background: 'assets/underpass.png', props: 'assets/props.png' }, + backgroundSize: [1672, 941], atlasSize: [1774, 887], + regions: { + acHead: [80, 104, 285, 285], xboxHead: [524, 104, 285, 285], + acLimb: [1058, 48, 104, 372], xboxLimb: [1503, 48, 104, 372], + gun: [51, 543, 365, 253], skateboard: [460, 611, 412, 136], + platform: [900, 606, 418, 162], rocket: [1368, 542, 372, 236], + }, + seats: [{ id: 'ac', color: '#9f7ae8' }, { id: 'xbox', color: '#78c848' }], +}); + +// The same operation contract can target Canvas2D, D3D11 or GLES2. Native +// hosts need a retained texture + UV quad API before they can use this. +export function createThemeRenderer(driver) { + for (const method of ['clear', 'sprite', 'line', 'disc', 'rect']) { + if (typeof driver[method] !== 'function') throw new TypeError(`Missing ${method}`); + } + let theme = 'photorealistic'; + function sprite(region, x, y, width, height, angle = 0, flip = false) { + driver.sprite('props', manifest.regions[region], x, y, width, height, angle, flip); + } + function limb(seat, a, b, width) { + const dx = b[0] - a[0], dy = b[1] - a[1]; + const length = Math.hypot(dx, dy); + if (length < 0.001) return; + if (theme === 'flat') driver.line(a, b, width, manifest.seats[seat].color); + else sprite(seat === 0 ? 'acLimb' : 'xboxLimb', (a[0]+b[0])/2, + (a[1]+b[1])/2, width, length + width*.45, Math.atan2(dy, dx)-Math.PI/2); + } + return { + get theme() { return theme; }, + setTheme(value) { + if (!['flat', 'photorealistic'].includes(value)) throw new RangeError('Unknown theme'); + theme = value; + }, + background(width, height) { + driver.clear('#070b13'); + if (theme === 'photorealistic') driver.sprite('background', [0,0,...manifest.backgroundSize], + width/2, height/2, width, height, 0, false); + }, + platform(x,y,width,height) { + if (theme === 'flat') driver.rect(x-width/2,y-height/2,width,height,'#465365'); + else sprite('platform',x,y,width,height); + }, + prop(kind,x,y,width,height,angle=0,flip=false) { + if (!manifest.regions[kind]) throw new RangeError('Unknown prop'); + if (theme === 'flat') driver.rect(x-width/2,y-height/2,width,height,'#88939e'); + else sprite(kind,x,y,width,height,angle,flip); + }, + fighter(pose) { + const {seat, head, radius, segments, hand, facing} = pose; + if (seat !== 0 && seat !== 1) throw new RangeError('Unknown seat'); + for (const segment of segments) limb(seat, segment[0], segment[1], segment[2]); + if (theme === 'flat') driver.disc(head[0],head[1],radius,manifest.seats[seat].color); + else sprite(seat === 0 ? 'acHead' : 'xboxHead',head[0],head[1],radius*2,radius*2, + pose.headAngle || 0, (seat === 0 ? 1 : -1) !== facing); + this.prop('gun', hand[0]+facing*15,hand[1],48,32,0,facing<0); + }, + }; +} + +export function canvasDriver(context, images) { + return { + clear(color) { context.fillStyle=color;context.fillRect(0,0,context.canvas.width,context.canvas.height); }, + sprite(asset, region, x,y,w,h,angle,flip) { + context.save();context.translate(x,y);context.rotate(angle);context.scale(flip?-1:1,1); + context.drawImage(images[asset],...region,-w/2,-h/2,w,h);context.restore(); + }, + line(a,b,width,color) { context.strokeStyle=color;context.lineWidth=width;context.lineCap='round'; + context.beginPath();context.moveTo(...a);context.lineTo(...b);context.stroke(); }, + disc(x,y,r,color) {context.fillStyle=color;context.beginPath();context.arc(x,y,r,0,Math.PI*2);context.fill();}, + rect(x,y,w,h,color) {context.fillStyle=color;context.fillRect(x,y,w,h);}, + }; +} diff --git a/xbox/themes/photorealistic/theme.test.mjs b/xbox/themes/photorealistic/theme.test.mjs new file mode 100644 index 0000000000..ebb838560b --- /dev/null +++ b/xbox/themes/photorealistic/theme.test.mjs @@ -0,0 +1,25 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import {manifest,createThemeRenderer} from './theme.mjs'; +const probe=()=>{const calls=[];const driver=Object.fromEntries(['clear','sprite','line','disc','rect'].map(k=>[k,(...a)=>calls.push([k,...a])]));return {calls,renderer:createThemeRenderer(driver)};}; +const pose={seat:0,head:[120,120],radius:25,segments:[[[120,150],[120,180],8]],hand:[130,170],facing:1}; +test('theme switching changes only presentation and leaves host pose intact',()=>{ + const {renderer,calls}=probe(),before=structuredClone(pose);renderer.fighter(pose); + assert.ok(calls.some(c=>c[0]==='sprite'));calls.length=0;renderer.setTheme('flat');renderer.fighter(pose); + assert.ok(calls.some(c=>c[0]==='disc'));assert.deepEqual(pose,before); + assert.throws(()=>renderer.setTheme('missing'),RangeError);assert.equal(renderer.theme,'flat'); +}); +test('seat identity and facing stay independent of screen position',()=>{ + const {renderer,calls}=probe();renderer.fighter({...pose,seat:1,head:[20,120],facing:-1}); + assert.ok(calls.some(c=>c[0]==='sprite'&&c[2]===manifest.regions.xboxHead)); + const gun=calls.find(c=>c[0]==='sprite'&&c[2]===manifest.regions.gun);assert.equal(gun.at(-1),true); +}); +test('atlas regions remain inside retained image',()=>{ + for(const [x,y,w,h]of Object.values(manifest.regions)){ + assert.ok(x>=0&&y>=0&&w>0&&h>0&&x+w<=manifest.atlasSize[0]&&y+h<=manifest.atlasSize[1]); + } +}); +test('missing native image capability is rejected explicitly',()=>{ + assert.throws(()=>createThemeRenderer({}),/Missing clear/); + const {renderer}=probe();assert.throws(()=>renderer.fighter({...pose,seat:2}),/Unknown seat/); +}); diff --git a/xbox/themes/photorealistic/verification.json b/xbox/themes/photorealistic/verification.json new file mode 100644 index 0000000000..3d738d503a --- /dev/null +++ b/xbox/themes/photorealistic/verification.json @@ -0,0 +1,17 @@ +{ + "status": "browser prototype verified", + "switchablePrototype": true, + "frames": 153, + "canvas": [ + 1280, + 720 + ], + "drawSubmissionMs": { + "median": 0.09999999962747097, + "p95": 0.19999999925494194 + }, + "measurement": "Local Chromium CPU draw submission only; not native GPU completion or FPS. No device test.", + "pausedThemeSwitchPreservesTime": true, + "errors": [], + "nativeVerification": "see native-verification.json" +} diff --git a/xbox/themes/photorealistic/verify.mjs b/xbox/themes/photorealistic/verify.mjs new file mode 100644 index 0000000000..23564aa54e --- /dev/null +++ b/xbox/themes/photorealistic/verify.mjs @@ -0,0 +1,40 @@ +import {createServer} from 'node:http'; +import {readFile,writeFile} from 'node:fs/promises'; +import {fileURLToPath} from 'node:url'; +import path from 'node:path'; +import assert from 'node:assert/strict'; +import {chromium} from 'playwright'; +const root=path.dirname(fileURLToPath(import.meta.url)); +const server=createServer(async(req,res)=>{ + try{const pathname=new URL(req.url,'http://local').pathname; + const file=path.resolve(root,'.'+(pathname==='/'?'/index.html':pathname)); + if(!file.startsWith(root+path.sep))throw Error('outside'); + const bytes=await readFile(file);res.setHeader('Content-Type',file.endsWith('.mjs')?'text/javascript':file.endsWith('.html')?'text/html':'image/png');res.end(bytes); + }catch{res.statusCode=404;res.end();} +}); +await new Promise(r=>server.listen(0,'127.0.0.1',r)); +const browser=await chromium.launch({headless:true,channel:process.env.CHROME_CHANNEL||'chrome'}); +try{ + const page=await browser.newPage({viewport:{width:1280,height:784},deviceScaleFactor:1}); + const errors=[];page.on('pageerror',e=>errors.push(e.message)); + await page.goto(`http://127.0.0.1:${server.address().port}`); + await page.waitForFunction(()=>globalThis.themePreview?.ready); + await page.evaluate(()=>themePreview.setTime(2)); + await page.locator('canvas').screenshot({path:path.join(root,'preview-miniature.png')}); + const before=await page.evaluate(()=>themePreview.state()); + await page.selectOption('select','flat'); + await page.evaluate(()=>themePreview.render(themePreview.state().time)); + await page.locator('canvas').screenshot({path:path.join(root,'preview-flat.png')}); + const after=await page.evaluate(()=>themePreview.state());assert.equal(after.time,before.time);assert.equal(after.theme,'flat'); + await page.selectOption('select','photorealistic'); + await page.click('#motion'); + await page.waitForTimeout(2200); + const stats=await page.evaluate(()=>themePreview.state()); + assert.ok(stats.time>before.time);assert.deepEqual(errors,[]); + const samples=stats.samples.sort((a,b)=>a-b); + const result={status:'browser prototype verified',switchablePrototype:true,nativeVerification:'see native-verification.json',frames:stats.frames,canvas:[1280,720], + drawSubmissionMs:{median:samples[Math.floor(samples.length*.5)],p95:samples[Math.floor(samples.length*.95)]}, + measurement:'Local Chromium CPU draw submission only; not native GPU completion or FPS. No device test.', + pausedThemeSwitchPreservesTime:true,errors}; + await writeFile(path.join(root,'verification.json'),JSON.stringify(result,null,2)+'\n');console.log(JSON.stringify(result,null,2)); +}finally{await browser.close();server.close();} diff --git a/xbox/tools/live-reload.mjs b/xbox/tools/live-reload.mjs new file mode 100644 index 0000000000..787150c782 --- /dev/null +++ b/xbox/tools/live-reload.mjs @@ -0,0 +1,15 @@ +// Supervisor generations restart with the application; they are not global. +export function latestLiveReady(log) { + const marker = [...String(log).matchAll( + /AC_NATIVE_LIVE_READY bytes=(\d+) generation=(\d+)/g)].at(-1); + return marker ? { bytes: Number(marker[1]), generation: Number(marker[2]) } : null; +} + +export function freshLiveReady(before, current, publishedBytes) { + const previous = latestLiveReady(before); + const ready = latestLiveReady(current); + if (!ready || (publishedBytes !== undefined && ready.bytes !== publishedBytes)) return null; + if (previous && ready.generation === previous.generation && ready.bytes === previous.bytes) + return null; + return ready; +} diff --git a/xbox/tools/live.mjs b/xbox/tools/live.mjs index d0ac1ade32..9998995d49 100644 --- a/xbox/tools/live.mjs +++ b/xbox/tools/live.mjs @@ -10,6 +10,7 @@ import { homedir, tmpdir } from "node:os"; import { basename, dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { compilePublishedKidLisp } from "./kidlisp-native.mjs"; +import { freshLiveReady } from "./live-reload.mjs"; const defaultEnv = resolve(homedir(), "aesthetic-computer/aesthetic-computer-vault/xbox/device-portal.env"); @@ -46,7 +47,8 @@ const auth = `${username}:${password}`; const autoAuth = `auto-${username}:${password}`; function curl(args, { json = false, input } = {}) { - const result = spawnSync("curl", ["-k", "-sS", ...args], { + const result = spawnSync("curl", ["-k", "-sS", "--fail", "--connect-timeout", "5", + "--max-time", "30", ...args], { encoding: "utf8", maxBuffer: 16 * 1024 * 1024, ...(input === undefined ? {} : { input }), }); @@ -154,6 +156,7 @@ function publish(sourcePath) { curl(["-u", autoAuth, "-X", "POST", "-F", `file=@${absolute};filename=live-piece.js`, appFileUrl(item)]); console.log(JSON.stringify({ published: absolute, package: item.PackageFullName })); + return { bytes: Buffer.byteLength(source, "utf8") }; } function publishSource(source, label) { @@ -165,6 +168,7 @@ function publishSource(source, label) { "file=@-;filename=live-piece.js;type=application/javascript", appFileUrl(item)], { input: source }); console.log(JSON.stringify({ published: label, bytes: Buffer.byteLength(source, "utf8"), package: item.PackageFullName })); + return { bytes: Buffer.byteLength(source, "utf8") }; } function publishShader(sourcePath, reset = false) { @@ -215,6 +219,27 @@ function logs(tail = "80") { console.log(content.trimEnd().split(/\r?\n/).slice(-count).join("\n")); } +async function hotDeploy(sourcePath) { + const item = installed(); + const readLog = () => curl(["-u", autoAuth, "-H", "Range: bytes=-1048576", + appFileUrl(item, "ac-native-bios.log")]); + const before = readLog(); + const published = publish(sourcePath); + for (let attempt = 0; attempt < 20; attempt++) { + await new Promise((resolve) => setTimeout(resolve, 500)); + const current = readLog(); + const ready = freshLiveReady(before, current, published?.bytes); + if (ready) { + console.log(`live reload verified: generation ${ready.generation}, bytes ${ready.bytes}; no Xbox restart needed`); + return; + } + const rejection = current.split(/\r?\n/).filter((line) => + line.includes("AC_NATIVE_LIVE_REJECT") && !before.includes(line)).at(-1); + if (rejection) throw new Error(`Live update rejected; previous version retained. ${rejection}`); + } + throw new Error("Upload finished, but live reload was not confirmed. Quit and reopen oskiewar on the Xbox, then check its version; no console reboot is needed."); +} + function frameDump(outputPath = "") { const content = curl(["-u", autoAuth, "-H", "Range: bytes=-8388608", appFileUrl(installed(), "ac-native-bios.log")]); @@ -356,8 +381,9 @@ async function main() { else if (command === "screenshot") screenshot(argument); else if (command === "video") video(argument, rest[0]); else if (command === "deploy") { publish(argument); launch(); logs("20"); } + else if (command === "hot-deploy") await hotDeploy(argument); else if (command === "deploy-kidlisp") await deployKidLisp(argument); - else throw new Error("commands: status | install [deps...] | prune | launch | publish | shader | shader-reset | logs [lines] | frames [output.json] | screenshot [output.png] | video [seconds] [output.mp4] | deploy | deploy-kidlisp <$code>"); + else throw new Error("commands: status | install [deps...] | prune | launch | publish | shader | shader-reset | logs [lines] | frames [output.json] | screenshot [output.png] | video [seconds] [output.mp4] | deploy | hot-deploy | deploy-kidlisp <$code>"); } try { await main(); } catch (error) { console.error(error.message); process.exit(1); } diff --git a/xbox/tools/live.test.mjs b/xbox/tools/live.test.mjs new file mode 100644 index 0000000000..b87d61b9c5 --- /dev/null +++ b/xbox/tools/live.test.mjs @@ -0,0 +1,83 @@ +import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; +import { mkdtempSync, writeFileSync, readFileSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join, delimiter } from "node:path"; +import test from "node:test"; + +function portal(mode, run) { + const dir = mkdtempSync(join(tmpdir(), "xbox-live-test-")); + const state = join(dir, "state.json"); + writeFileSync(state, JSON.stringify({ published: false, calls: [] })); + writeFileSync(join(dir, "diagnostic.js"), "function boot() {}\n"); + writeFileSync(join(dir, "curl"), `#!/usr/bin/env node +const fs = require('node:fs'); +const path = process.env.TEST_PORTAL_STATE; +const state = JSON.parse(fs.readFileSync(path, 'utf8')); +const args = process.argv.slice(2); +const url = args.at(-1); +state.calls.push(args); +if (args.includes('POST')) state.published = true; +fs.writeFileSync(path, JSON.stringify(state)); +if (url.includes('/api/app/packagemanager/packages')) { + process.stdout.write(JSON.stringify({ InstalledPackages: [{ + PackageFamilyName: 'AestheticComputer.NativeBios', + PackageFullName: 'AestheticComputer.NativeBios_1.0.0.41_x64__test', + Version: { Revision: 41 } + }] })); +} else if (url.includes('/api/filesystem/apps/file')) { + if (args.includes('POST')) { + if (process.env.TEST_PORTAL_MODE === 'upload-error') process.exit(22); + } else { + process.stdout.write('AC_NATIVE_LIVE_READY bytes=10 generation=7\\n'); + if (state.published && process.env.TEST_PORTAL_MODE !== 'pending') process.stdout.write(process.env.TEST_PORTAL_MODE === 'reject' + ? 'AC_NATIVE_LIVE_REJECT reason=syntax-error\\n' + : 'AC_NATIVE_LIVE_READY bytes=19 generation=' + (process.env.TEST_PORTAL_MODE === 'reset' ? 2 : 8) + '\\n'); + } +} else process.exit(99); +`, { mode: 0o755 }); + try { + run(() => execFileSync(process.execPath, + [new URL('./live.mjs', import.meta.url).pathname, 'hot-deploy', join(dir, 'diagnostic.js')], { + encoding: 'utf8', stdio: 'pipe', env: { ...process.env, + PATH: dir + delimiter + process.env.PATH, + TEST_PORTAL_STATE: state, TEST_PORTAL_MODE: mode, + XBOX_DEVICE_PORTAL_ENV: join(dir, 'unused.env'), + XBOX_DEVICE_PORTAL_HOST: 'test.invalid', + XBOX_DEVICE_PORTAL_USERNAME: 'test', XBOX_DEVICE_PORTAL_PASSWORD: 'test' }, + }), () => JSON.parse(readFileSync(state, 'utf8'))); + } finally { rmSync(dir, { recursive: true, force: true }); } +} + +test('hot deploy verifies native activation without launching the app', () => { + portal('ready', (deploy, state) => { + assert.match(deploy(), /live reload verified: generation 8, bytes 19; no Xbox restart needed/); + const calls = state().calls; + assert.equal(calls.filter(args => args.includes('POST')).length, 1); + assert.ok(calls.every(args => !args.at(-1).includes('/api/taskmanager/app'))); + }); +}); + +test('hot deploy verifies activation after the application generation resets', () => { + portal('reset', (deploy) => { + assert.match(deploy(), /live reload verified: generation 2, bytes 19/); + }); +}); + +test('hot deploy reports a rejected update instead of claiming it loaded', () => { + portal('reject', (deploy) => { + assert.throws(deploy, error => /Live update rejected.*syntax-error/.test(error.stderr)); + }); +}); + +test('hot deploy fails on an upload error', () => { + portal('upload-error', (deploy) => { + assert.throws(deploy, error => /curl exited 22/.test(error.stderr)); + }); +}); + +test('unconfirmed hot deploy tells the player to reopen the app, not reboot the console', () => { + portal('pending', (deploy) => { + assert.throws(deploy, error => /Quit and reopen oskiewar on the Xbox.*no console reboot is needed/.test(error.stderr)); + }); +}); diff --git a/xbox/tools/oskiewar-lan-test.mjs b/xbox/tools/oskiewar-lan-test.mjs new file mode 100644 index 0000000000..ee3778f311 --- /dev/null +++ b/xbox/tools/oskiewar-lan-test.mjs @@ -0,0 +1,39 @@ +#!/usr/bin/env node +// Today's explicit two-device matchup. The normal deploy removes this override. +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { execFileSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import path from 'node:path'; +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); +const address = process.argv[2]; +if (!address) throw new Error('Usage: node xbox/tools/oskiewar-lan-test.mjs [--hot]'); +const url = new URL(address.includes('://') ? address : 'http://' + address); +if (!/^[a-zA-Z0-9.-]+$/.test(url.hostname)) throw new Error('Invalid AC host'); +const expires = new Date(); expires.setHours(24, 0, 0, 0); +const room = 'ow-lantest924'; +// Preserve a lowered curtain through a paired hot reload. +let curtain = false; +try { + const response = await fetch(url.origin + '/pieces/oskiewar-control.json', {signal:AbortSignal.timeout(2000)}); + if (response.ok) curtain = (await response.json()).curtain === true; +} catch {} +const config = { room, expires: expires.getTime(), seat: 0, curtain, inputSendHz: 30 }; +if (process.argv.includes('--profile-phases')) config.phaseProfile = true; +const inputRateArg = process.argv.find(arg => arg.startsWith('--input-hz=')); +if (inputRateArg) { + const inputSendHz = Number(inputRateArg.split('=')[1]); + if (![20, 30, 60].includes(inputSendHz)) throw new Error('Input rate must be 20, 30 or 60 Hz'); + config.inputSendHz = inputSendHz; +} +const source = await readFile(path.join(root, 'xbox/live/oskiewar.js'), 'utf8'); +const override = await readFile(path.join(root, 'xbox/live/lan-test.js'), 'utf8'); +const out = path.join(root, 'fedac/native/build/oskiewar-lan-test'); +await mkdir(out, {recursive:true}); +const xboxFile = path.join(out, 'oskiewar-lan-test.js'); +await writeFile(xboxFile, '// @bundle-qr\nglobalThis.__oskiewarLanTest = ' + JSON.stringify(config) + ';\n' + source + '\n' + override); +execFileSync('ssh', ['-o', 'BatchMode=yes', '-o', 'ConnectTimeout=5', 'root@' + url.hostname, + 'cat > /tmp/oskiewar-lan-test.json'], {input: JSON.stringify({...config, seat:1})}); +execFileSync('node', ['fedac/native/tools/oskiewar-live.mjs', url.origin], {cwd:root, stdio:'inherit'}); +execFileSync('node', ['xbox/tools/live.mjs', process.argv.includes('--hot') ? 'hot-deploy' : 'deploy', xboxFile], + {cwd:root, stdio:'inherit'}); +console.log('xbox vs ac: ' + room + '; expires ' + expires.toISOString()); diff --git a/xbox/tools/oskiewar-local-relay.mjs b/xbox/tools/oskiewar-local-relay.mjs new file mode 100644 index 0000000000..8b71b4f0c8 --- /dev/null +++ b/xbox/tools/oskiewar-local-relay.mjs @@ -0,0 +1,33 @@ +#!/usr/bin/env node +// Explicit LAN-only development relay. Uses the production protocol and no analytics. +import http from 'node:http'; +import { WebSocketServer } from 'ws'; +import { OskiewarLiveManager } from '../../session-server/oskiewar-live-manager.mjs'; +const options = Object.fromEntries(process.argv.slice(2).map(arg => arg.replace(/^--/, '').split('='))); +const host = options.host || '127.0.0.1'; +const port = Number(options.port || 7793); +if (!/^\d+\.\d+\.\d+\.\d+$/.test(host) || !Number.isInteger(port) || port < 1024 || port > 65535) throw Error('Use --host=LAN_IP --port=PORT'); +const manager = new OskiewarLiveManager({ analytics: { capture() {} } }); +const server = http.createServer((_req, res) => { + res.writeHead(200, { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' }); + res.end(JSON.stringify({ service: 'oskiewar-local-relay', rooms: manager.rooms.size })); +}); +const sockets = new WebSocketServer({ server, maxPayload: 16384, perMessageDeflate: false }); +sockets.on('connection', (ws, req) => { + req.socket.setNoDelay(true); + if (!manager.handleConnection(ws, req)) ws.close(4404, 'Unknown route'); +}); +const heartbeat = setInterval(() => { + for (const ws of sockets.clients) { + if (ws.isAlive === false) ws.terminate(); + else { ws.isAlive = false; ws.ping(); } + } +}, 15000); +server.listen(port, host, () => console.log(`Oskiewar LAN relay ws://${host}:${port}/oskiewar-live`)); +function shutdown() { + clearInterval(heartbeat); + for (const ws of sockets.clients) ws.terminate(); + sockets.close(); server.close(); +} +process.on('SIGTERM', shutdown); +process.on('SIGINT', shutdown); diff --git a/xbox/tools/oskiewar-music-observer.swift b/xbox/tools/oskiewar-music-observer.swift new file mode 100644 index 0000000000..5df49f0038 --- /dev/null +++ b/xbox/tools/oskiewar-music-observer.swift @@ -0,0 +1,18 @@ +// Read Menu Band's existing cue notifications without controlling playback. +import Foundation +let center = DistributedNotificationCenter.default() +var observers: [NSObjectProtocol] = [] +for action in ["play", "stop"] { + observers.append(center.addObserver(forName: Notification.Name("computer.aestheticcomputer.menuband." + action), object: nil, queue: .main) { note in + let info = note.userInfo as? [String: String] ?? [:] + let allowed = ["title", "bpm", "startEpoch", "notes", "notes2", "notes3", "notes4", "preparedId", "lyrics", "face", "captionColor"] + let payload: [String: Any] = ["action": action, "at": Date().timeIntervalSince1970, + "info": info.filter { allowed.contains($0.key) }] + if let data = try? JSONSerialization.data(withJSONObject: payload), + let text = String(data: data, encoding: .utf8) { + print(text) + fflush(stdout) + } + }) +} +RunLoop.main.run() diff --git a/xbox/tools/oskiewar-performance.mjs b/xbox/tools/oskiewar-performance.mjs new file mode 100644 index 0000000000..895aa8742f --- /dev/null +++ b/xbox/tools/oskiewar-performance.mjs @@ -0,0 +1,90 @@ +// Read-only adapters for the concert's two existing transports. +export function menuBandCue({action, at, info = {}}, now = Date.now() / 1000) { + if (action === 'stop') return null; + const bpm = Number(info.bpm) || 132, beat = 60 / Math.max(1, bpm); + const events = []; let duration = 0; + for (const key of ['notes','notes2','notes3','notes4']) { + let t = 0; + for (const token of String(info[key] || '').split(',')) { + const [pitch, beats] = token.split(':'); + const dur = Number(beats) * beat; + if (!(dur > 0) || !Number.isFinite(dur)) continue; + if (/^\d+$/.test(pitch)) events.push({t,dur,note:Number(pitch)}); + t += dur; + } + duration = Math.max(duration, t); + } + if (!duration) return null; + return {title:info.title || 'Menu Band', source:'Macneopolitan Trio', + start:Number(info.startEpoch) || at || now, duration, events, + lyricParts:[lyricPart(info)]}; +} +export function currentMenuBand(cue, now = Date.now() / 1000) { + if (!cue || now > cue.start + cue.duration) return null; + const elapsed = Math.max(0, now - cue.start); + const notes = cue.events.filter(e => elapsed >= e.t && elapsed < e.t + e.dur).map(e=>e.note).slice(0,8); + return {title:cue.title, source:cue.source, elapsed, duration:cue.duration, + playing:now >= cue.start, phase:now < cue.start ? 'countdown':'playing', notes, + intensity:notes.length ? .7 : 0, lyrics:now >= cue.start ? currentLyrics(cue.lyricParts,elapsed) : []}; +} +export function spatialPerformance(status, score = null, plan = null) { + if (!status || !(status.scoreDuration > 0 || status.duration > 0)) return null; + // A conductor may already have prepared the next score. Never animate + // its notes or label against a receiver still running a different one. + if (status.arrangementHash && score?.hash !== status.arrangementHash) score = null; + const position = Number.isFinite(status.scoreTime) ? status.scoreTime : + Number.isFinite(status.origin) && Number.isFinite(status.audioTime) ? status.audioTime - status.origin : null; + const playing = Number.isFinite(position) && position >= 0 && ['playing','score','running'].includes(status.phase); + const elapsed = Math.max(0, position || 0), duration = status.scoreDuration || status.duration || 0; + if (!status.arrangementHash || plan?.arrangementHash !== status.arrangementHash) plan = null; + const lyrics = playing && elapsed < duration ? currentLyrics(plan?.lyricParts,elapsed) : []; + const notes = (playing ? score?.events || [] : []).filter(e => elapsed >= e.t && elapsed < e.t + e.dur && e.hz > 0) + .map(e => 69 + 12 * Math.log2(e.hz / 440)).slice(0,8); + return {title:status.scoreName || status.title || plan?.title || score?.name || 'Spatial composition', + source:status.schema === 'trio-native-status-v1' ? 'Macneopolitan Trio' : 'Notepat Spatial', elapsed:Math.min(elapsed,duration), duration, playing, + phase:status.phase, notes, lyrics, intensity:playing ? Math.min(1, Math.max(0,status.glow || status.outputPeak || .2)) : 0}; +} + +// Each status file has its own liveness clock. An abandoned playing file +// must not mask a different receiver transport that is still advancing. +export function selectNativeStatus(statuses, clocks, now = Date.now()) { + const fresh = statuses.map((status, index) => { + if (!status) return null; + const signature = JSON.stringify([status.audioTime, status.runId, status.phase, status.scoreTime]); + if (clocks[index]?.signature !== signature) clocks[index] = {signature, at:now}; + return now - clocks[index].at <= 2500 ? status : {...status, phase:'stale', lastUpdate:clocks[index].at}; + }).filter(Boolean); + return fresh.find(s => ['playing','countdown','running','score'].includes(s.phase)) || + fresh.find(s => s.phase !== 'stale') || + fresh.filter(s=>Number.isFinite(s.scoreTime)).sort((a,b)=>(b.lastUpdate || 0)-(a.lastUpdate || 0))[0] || fresh[0] || null; +} + +// Lyrics consume sung notes only; rests advance time without consuming a syllable. +export function lyricPart(info, member = info.face || '') { + const beat = 60 / (Number(info.bpm) || 132); + const lines = String(info.lyrics || '').split('/').map(line => ({words:line.trim().split(/\s+/).filter(Boolean).map(word=>({text:word.replaceAll('-',''),count:word.split('-').length}))})).filter(line=>line.words.length); + const syllables=lines.flatMap(line=>line.words.flatMap(word=>Array.from({length:word.count},()=>({line,word})))); + let t=0,index=0; + for(const token of String(info.notes || '').split(',')) { + const [pitch,beats]=token.split(':'),dur=Number(beats)*beat; + if(!(dur>0)||!Number.isFinite(dur))continue; + if(/^\d+$/.test(pitch)) { + const item=syllables[index++]; + if(item){item.word.start??=t;item.word.end=t+dur;item.line.start??=t;item.line.end=t+dur;} + } + t+=dur; + } + // A mismatched lyric payload must not display plausible but wrong words. + if(index!==syllables.length)return {member,lines:[]}; + return {member,color:/^#[a-f0-9]{6}$/i.test(info.captionColor || '') ? info.captionColor : '#8fd13f', + lines:lines.map(line=>({...line,words:line.words.map(({count,...word})=>word)}))}; +} +export function lyricPlan(plan) { + return {...plan,lyricParts:(plan.payloads || []).slice(0,3).map(p=>lyricPart(p.info,p.member))}; +} +export function currentLyrics(parts=[],elapsed) { + return parts.flatMap(part=>{ + const line=part.lines.find(line=>elapsed>=line.start-1.5 && elapsed{ + const cue=menuBandCue({action:'play',at:100,info:{title:'Sophia',bpm:'120',startEpoch:'105',notes:'60:1,r:1,64:2',notes2:'48:6'}},100); + assert.equal(cue.duration,3); + assert.equal(currentMenuBand(cue,104).playing,false); + assert.deepEqual(currentMenuBand(cue,105.25).notes,[60,48]); + assert.deepEqual(currentMenuBand(cue,105.75).notes,[48]); + assert.equal(currentMenuBand(cue,109),null); + assert.equal(menuBandCue({action:'stop'}),null); +}); +test('native transport uses score time, and ready state retains title without pretending to play',()=>{ + const score={name:'Trio',events:[{t:1,dur:1,hz:440}]}; + let p=spatialPerformance({schema:'trio-native-status-v1',phase:'ready',duration:50,scoreTime:null},score); + assert.equal(p.title,'Trio');assert.equal(p.playing,false);assert.equal(p.elapsed,0); + assert.equal(p.source,'Macneopolitan Trio'); + p=spatialPerformance({phase:'playing',scoreName:'Spatial',scoreDuration:60,scoreTime:1.5,glow:.4},score); + assert.equal(p.title,'Spatial');assert.deepEqual(p.notes,[69]);assert.equal(p.intensity,.4); + assert.equal(p.elapsed,1.5);assert.equal(p.source,'Notepat Spatial'); +}); + +test('stale playing file cannot hide an advancing alternate transport',()=>{ + const clocks=[]; + const old={phase:'playing',audioTime:1,scoreTime:1}; + const live={phase:'playing',audioTime:2,scoreTime:2}; + selectNativeStatus([old,live],clocks,0); + assert.equal(selectNativeStatus([old,{...live,audioTime:5}],clocks,3000).audioTime,5); +}); +test('mismatched prepared score never supplies the running title or notes',()=>{ + const p=spatialPerformance({phase:'playing',arrangementHash:'old',duration:10,scoreTime:1}, + {hash:'next',name:'Next composition',events:[{t:0,dur:10,hz:440}]}); + assert.equal(p.title,'Spatial composition');assert.deepEqual(p.notes,[]); +}); + +test('a stopped feed retains the last composition instead of an old trio file',()=>{ + const clocks=[]; + const statuses=[{phase:'ready',audioTime:10,scoreTime:null},{phase:'playing',audioTime:20,scoreTime:278,scoreName:'Current work'}]; + selectNativeStatus(statuses,clocks,0); + const value=selectNativeStatus(statuses,clocks,3000); + assert.equal(value.scoreName,'Current work');assert.equal(value.phase,'stale'); +}); + +test('Trio lyrics follow the audio clock, skip rests, and refuse a different arrangement',async()=>{ + const {lyricPlan}=await import('./oskiewar-performance.mjs'); + const plan=lyricPlan({arrangementHash:'same',title:'Our trio',payloads:[{member:'neo',info:{bpm:60,lyrics:'hel-lo world / sing on',notes:'r:2,60:1,62:1,64:1,r:2,65:1,67:1'}}]}); + const status={schema:'trio-native-status-v1',arrangementHash:'same',phase:'playing',duration:10,audioTime:103.2,origin:100}; + const p=spatialPerformance(status,null,plan); + assert.equal(p.playing,true);assert.ok(Math.abs(p.elapsed-3.2)<1e-8); + assert.equal(p.lyrics[0].words[0].text,'hello'); + assert.deepEqual(p.lyrics[0].words[0],{text:'hello',start:2,end:4}); + assert.equal(spatialPerformance({...status,phase:'ready',origin:null},null,plan).lyrics.length,0); + assert.equal(spatialPerformance({...status,phase:'stale'},null,plan).lyrics.length,0); + assert.equal(spatialPerformance({...status,arrangementHash:'other'},null,plan).lyrics.length,0); + assert.equal(spatialPerformance({...status,audioTime:111},null,plan).lyrics.length,0); +}); +test('late Menu Band notification keeps the shared start and sung-word timing',()=>{ + const cue=menuBandCue({action:'play',info:{bpm:60,startEpoch:100,lyrics:'one two',notes:'60:1,r:1,64:1'}},102); + assert.equal(cue.start,100); + assert.equal(currentMenuBand(cue,102.3).lyrics[0].words[1].start,2); +}); +test('mismatched lyric syllable count is withheld',async()=>{ + const {lyricPart}=await import('./oskiewar-performance.mjs'); + assert.equal(lyricPart({bpm:60,notes:'60:1',lyrics:'too ma-ny'}).lines.length,0); +}); diff --git a/xbox/tools/oskiewar-relay.mjs b/xbox/tools/oskiewar-relay.mjs new file mode 100644 index 0000000000..f66a5933d7 --- /dev/null +++ b/xbox/tools/oskiewar-relay.mjs @@ -0,0 +1,61 @@ +#!/usr/bin/env node +// Set the dev-only Xbox LAN relay; credentials remain in memory, never argv/logs. +import https from 'node:https'; +import {readFileSync,existsSync} from 'node:fs'; +import {homedir} from 'node:os'; +import {resolve} from 'node:path'; +import {spawnSync} from 'node:child_process'; +const supplied=process.argv[2]; +if(!supplied)throw Error('usage: node xbox/tools/oskiewar-relay.mjs '); +const match=supplied.match(/^ws:\/\/((?:\d{1,3}\.){3}\d{1,3}):([1-9]\d{0,4})\/oskiewar-live$/); +if(!['--status','cloud'].includes(supplied)){ + const octets=match?.[1].split('.'); + if(!match||Number(match[2])>65535||octets.some(n=>Number(n)>255||(n.length>1&&n[0]==='0'))|| + !(octets[0]==='10'||(octets[0]==='172'&&+octets[1]>=16&&+octets[1]<=31)|| + (octets[0]==='192'&&octets[1]==='168')))throw Error('Relay must be private IPv4 with explicit port and /oskiewar-live'); +} +const envPath=process.env.XBOX_DEVICE_PORTAL_ENV||resolve(homedir(),'aesthetic-computer/aesthetic-computer-vault/xbox/device-portal.env'); +let source=''; +if(existsSync(envPath))source=readFileSync(envPath,'utf8'); +else if(existsSync(envPath+'.gpg')){ + const result=spawnSync('gpg',['--batch','--quiet','--decrypt',envPath+'.gpg'],{encoding:'utf8'}); + if(result.status!==0)throw Error('Could not decrypt Device Portal credentials');source=result.stdout; +} +const config={}; +for(const line of source.split(/\r?\n/)){ + const pair=line.trim().match(/^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);if(!pair)continue; + let value=pair[2].trim();if((value[0]==='"'&&value.at(-1)==='"')||(value[0]==="'"&&value.at(-1)==="'"))value=value.slice(1,-1); + config[pair[1]]=value; +} +Object.assign(config,process.env); +const host=config.XBOX_DEVICE_PORTAL_HOST,user=config.XBOX_DEVICE_PORTAL_USERNAME,password=config.XBOX_DEVICE_PORTAL_PASSWORD; +if(!host||!user||!password)throw Error('Missing Device Portal configuration'); +function request(path,{method='GET',body,headers={},auto=false}={}){ + return new Promise((done,fail)=>{ + const auth=Buffer.from(`${auto?'auto-':''}${user}:${password}`).toString('base64'); + const req=https.request({hostname:host,port:config.XBOX_DEVICE_PORTAL_PORT||11443,path,method, + rejectUnauthorized:false,headers:{Authorization:`Basic ${auth}`,...headers}},res=>{ + const chunks=[];let size=0; + res.on('data',b=>{size+=b.length;if(size>4*1024*1024)req.destroy(Error('Portal response too large'));else chunks.push(b);}); + res.on('end',()=>res.statusCode>=200&&res.statusCode<300?done(Buffer.concat(chunks).toString()):fail(Object.assign(Error(`Portal HTTP ${res.statusCode}`),{status:res.statusCode}))); + }); + req.setTimeout(15000,()=>req.destroy(Error('Portal timeout')));req.on('error',fail);req.end(body); + }); +} +const packages=JSON.parse(await request('/api/app/packagemanager/packages')).InstalledPackages + .filter(p=>p.PackageFamilyName==='AestheticComputer.NativeBios').sort((a,b)=>b.Version.Revision-a.Version.Revision); +const item=packages[0];if(!item)throw Error('Oskiewar not installed'); +const query=new URLSearchParams({knownfolderid:'LocalAppData',packagefullname:item.PackageFullName,path:'\\LocalState'}); +const base='/api/filesystem/apps/file?'+query; +const file=base+'&filename=oskiewar-relay.txt'; +if(supplied==='--status'){ + try{console.log((await request(file,{auto:true})).trim()||'cloud');} + catch(error){if(error.status===404)console.log('cloud');else throw error;} +} +else{ + const value=supplied==='cloud'?'':supplied+'\n',boundary='oskiewar-relay-'+Date.now(); + const body=`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="oskiewar-relay.txt"\r\nContent-Type: text/plain\r\n\r\n${value}\r\n--${boundary}--\r\n`; + await request(base,{method:'POST',auto:true,body,headers:{'Content-Type':`multipart/form-data; boundary=${boundary}`,'Content-Length':Buffer.byteLength(body)}}); + const actual=await request(file,{auto:true});if(actual!==value)throw Error('Relay readback mismatch'); + console.log(JSON.stringify({package:item.PackageFullName,relay:value.trim()||'cloud',verified:true,applies:'next fresh connection; no restart performed'})); +} diff --git a/xbox/tools/oskiewar-release.mjs b/xbox/tools/oskiewar-release.mjs index 05ec656fd1..accfd02e6b 100644 --- a/xbox/tools/oskiewar-release.mjs +++ b/xbox/tools/oskiewar-release.mjs @@ -316,7 +316,8 @@ async function main() { throw new Error(`Xbox is offline: ${probe.reason}`); } try { - run("node", ["xbox/tools/live.mjs", "deploy", "xbox/live/oskiewar.js"]); + run("node", ["xbox/tools/live.mjs", args.includes("--hot") ? "hot-deploy" : "deploy", + "xbox/live/oskiewar.js"]); mark(receipt, "xbox", "current", "explicit uncommitted Xbox development release"); } catch (error) { mark(receipt, "xbox", "failed", error.message); @@ -334,7 +335,7 @@ async function main() { await reconcile(receipt, { dryRun }); return print(receipt, current); } - throw new Error("commands: status | deploy [--dry-run] | deploy-xbox-dev | reconcile [--dry-run]"); + throw new Error("commands: status | deploy [--dry-run] | deploy-xbox-dev [--hot] | reconcile [--dry-run]"); } if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) diff --git a/xbox/tools/oskiewar-seat-live.mjs b/xbox/tools/oskiewar-seat-live.mjs new file mode 100644 index 0000000000..6e29fe6c14 --- /dev/null +++ b/xbox/tools/oskiewar-seat-live.mjs @@ -0,0 +1,97 @@ +#!/usr/bin/env node +// One live game source for the Xbox and a loopback-connected native Mac. +import { createServer } from 'node:http'; +import { createHash } from 'node:crypto'; +import { readFile, writeFile, rename, mkdir } from 'node:fs/promises'; +import { resolve, join } from 'node:path'; +import { spawn } from 'node:child_process'; + +const sourcePath = resolve(process.argv[2]); +const portalTool = resolve(process.argv[3]); +const stateDir = resolve(process.argv[4]); +const port = Number(process.env.OSKIEWAR_LIVE_PORT || 5273); +await mkdir(stateDir, { recursive: true }); +let accepted = null, pending = false, observed = '', changedAt = 0; +let retryAt = 0; +const status = { source: sourcePath, xbox: null, macos: null, error: null }; +const saveStatus = () => writeFile(join(stateDir, 'status.json'), JSON.stringify(status, null, 2)); +const run = (args) => new Promise((resolveResult, reject) => { + const child = spawn(process.execPath, args, { stdio: ['ignore', 'pipe', 'pipe'] }); + let output = ''; + child.stdout.on('data', data => { output += data; }); + child.stderr.on('data', data => { output += data; }); + const timer = setTimeout(() => child.kill('SIGTERM'), 90000); + child.on('error', reject); + child.on('close', code => { + clearTimeout(timer); + if (code === 0) resolveResult(output.trim()); + else reject(new Error(output.trim() || `child exited ${code}`)); + }); +}); +const server = createServer(async (req, res) => { + res.setHeader('Cache-Control', 'no-store'); + if (req.method === 'GET' && req.url === '/status') { + res.setHeader('Content-Type', 'application/json'); + return res.end(JSON.stringify(status)); + } + if (req.method === 'GET' && req.url === '/game.js') { + if (!accepted) { res.writeHead(503); return res.end('waiting for Xbox'); } + const tag = `"${accepted.revision}"`; + res.setHeader('ETag', tag); + if (req.headers['if-none-match'] === tag) { res.writeHead(304); return res.end(); } + res.setHeader('Content-Type', 'application/javascript'); + return res.end(accepted.payload); + } + if (req.method === 'POST' && req.url === '/ack') { + let data = ''; + for await (const chunk of req) { + data += chunk; + if (data.length > 4096) { res.writeHead(413); return res.end(); } + } + try { + const ack = JSON.parse(data); + if (ack.surface !== 'macos' || ack.revision !== accepted?.revision || typeof ack.ok !== 'boolean') + throw new Error('invalid acknowledgement'); + status.macos = { revision: ack.revision, ok: ack.ok, at: new Date().toISOString(), error: String(ack.error || '').slice(0, 1000) }; + await saveStatus(); + console.log(`macos ${ack.ok ? 'ready' : 'rejected'} ${ack.revision}`); + res.writeHead(204); return res.end(); + } catch { res.writeHead(400); return res.end(); } + } + res.writeHead(404); res.end(); +}); +await new Promise(resolveReady => server.listen(port, '127.0.0.1', resolveReady)); +console.log(`watching ${sourcePath}; loopback :${port}`); +async function tick() { + if (pending || Date.now() < retryAt) return; + pending = true; + try { + const source = await readFile(sourcePath, 'utf8'); + const revision = createHash('sha256').update(source).digest('hex').slice(0, 16); + if (revision !== observed) { observed = revision; changedAt = Date.now(); return; } + if (revision === accepted?.revision || Date.now() - changedAt < 500) return; + const payload = '// @bundle-qr\nglobalThis.__oskiewarOpponent = "freeskate";\n' + + `globalThis.__oskiewarLiveRevision = "${revision}";\n` + source; + const candidate = join(stateDir, 'candidate.js'); + await writeFile(candidate, payload); + await run(['--check', candidate]); + status.error = null; + status.pending = revision; + await saveStatus(); + const receipt = await run([portalTool, 'hot-deploy', candidate]); + accepted = { revision, payload }; + status.xbox = { revision, ok: true, at: new Date().toISOString(), receipt }; + status.pending = null; + await writeFile(join(stateDir, 'accepted.js.tmp'), payload); + await rename(join(stateDir, 'accepted.js.tmp'), join(stateDir, 'accepted.js')); + await saveStatus(); + console.log(`xbox ready ${revision}; serving same revision to macos`); + } catch (error) { + status.error = error.message; + retryAt = Date.now() + 5000; + await saveStatus(); + console.error(error.message); + } finally { pending = false; } +} +setInterval(tick, 250); +await tick(); diff --git a/xbox/tools/oskiewar-stage-mcp.mjs b/xbox/tools/oskiewar-stage-mcp.mjs new file mode 100644 index 0000000000..4326a316de --- /dev/null +++ b/xbox/tools/oskiewar-stage-mcp.mjs @@ -0,0 +1,140 @@ +#!/usr/bin/env node +// Local concert display control. Reads existing music state; never cues audio. +import {readFile, writeFile, mkdir, readdir} from 'node:fs/promises'; +import {homedir} from 'node:os'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {spawn, execFile} from 'node:child_process'; +import {createInterface} from 'node:readline'; +import {serveHttp, serveStdio, httpPort} from '../../toolchain/mcp/http-front.mjs'; +import {menuBandCue,currentMenuBand,spatialPerformance,selectNativeStatus,lyricPlan} from './oskiewar-performance.mjs'; +import {promisify} from 'node:util'; +const execFileAsync=promisify(execFile); +const here=dirname(fileURLToPath(import.meta.url)); +const configPath=process.env.OSKIEWAR_STAGE_CONFIG || join(homedir(),'.ac-os/oskiewar-stage.json'); +const config=JSON.parse(await readFile(configPath,'utf8')); +const ac=new URL(config.ac).origin; +let curtainStyle=config.curtainStyle || 'auto'; +let curtain=config.curtain===true, mode=config.mode || 'auto', cue=null, score=null, scoreAt=0; +const nativeClocks=[], scores=new Map(), lyricPlans=new Map(); +let lyricRefreshAt=0; +async function findLyricPlan(hash) { + if(lyricPlans.has(hash))return lyricPlans.get(hash); + if(Date.now()-lyricRefreshAt<5000)return null; + lyricRefreshAt=Date.now(); + const folder=config.lyricDirectory || join(homedir(),'.ac-os/oskiewar-lyrics'); + const files=await readdir(folder).catch(()=>[]); + const local=await Promise.allSettled(files.filter(f=>f.endsWith('.json')).map(f=>readFile(join(folder,f),'utf8'))); + for(const r of local)if(r.status==='fulfilled')try{const p=JSON.parse(r.value);lyricPlans.set(p.arrangementHash,lyricPlan(p));}catch{} + if(!lyricPlans.has(hash)) { + const remote=await Promise.allSettled((config.lyricSources || []).map(s=>execFileAsync('ssh',['-o','BatchMode=yes','-o','ConnectTimeout=2',s.host,"/bin/cat '"+s.path.replaceAll("'","'\\''")+"'"],{timeout:3000,maxBuffer:1024*1024}))); + for(const r of remote)if(r.status==='fulfilled')try{const p=JSON.parse(r.value.stdout);if(/^[a-f0-9]{64}$/.test(p.arrangementHash)){lyricPlans.set(p.arrangementHash,lyricPlan(p));await mkdir(folder,{recursive:true});await writeFile(join(folder,p.arrangementHash+'.json'),JSON.stringify(p));}}catch{} + } + return lyricPlans.get(hash); +} +let lastError='', lastSent=null, sequence=0, updating=false; +let feedLive=false, lastUpdate=0; +const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function json(url,options={}) { + const r=await fetch(url,{...options,signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('HTTP '+r.status+' from '+new URL(url).pathname); + return r.json(); +} +async function readMusic() { + const sung=currentMenuBand(cue); + // Femrag visual follower: stale/idle feeds yield to the existing music source. + feedLive=false; + if(config.femrag)try { + const r=await fetch(config.femrag,{signal:AbortSignal.timeout(300)}); + const p=r.ok?await r.json():null; + if(p?.playing && ((p.dance==='femrag-round-v1' || p.dance==='trio-round-v1') || p.visual==='notepat-score-v1') && Number.isFinite(p.elapsed)){ + if(p.dance==='trio-round-v1' && (p.lyric?.text||null)!==globalThis.trioLyricLogged){globalThis.trioLyricLogged=p.lyric?.text||null;console.log(new Date().toISOString()+' trio lyric '+JSON.stringify(p.lyric||null)+' next '+JSON.stringify(p.next?.text||null));} + feedLive=true; return p;} + }catch{} + + // A full trio receiver takes precedence when it is playing. Cached status + // files must advance before they can claim ownership of the live display. + const results=await Promise.allSettled([ + json(config.spatial+'/pieces/trio-fleet-status.json'), + json(config.spatial+'/pieces/spatial-rehearsal-status.json'), + ]); + const status=selectNativeStatus(results.map(r=>r.status==='fulfilled'?r.value:null),nativeClocks); + if(status) { + if(config.sub && Date.now()-scoreAt>5000) { + scoreAt=Date.now(); + try {score=await json(config.sub+'/api/score'); + if(score?.hash){scores.set(score.hash,score);if(scores.size>8)scores.delete(scores.keys().next().value);} + }catch{} + } + const performance=spatialPerformance(status,status.arrangementHash ? scores.get(status.arrangementHash) : score, + status.schema==='trio-native-status-v1' ? await findLyricPlan(status.arrangementHash) : null); + return performance?.playing && performance.lyrics?.length ? performance : sung || performance; + } + return sung; +} +async function send(performance) { + const id=Date.now().toString(36)+'-'+(++sequence); + const value={id,curtain,performance:{...(performance || {title:'Waiting for the next composition', + source:'CultureHub',elapsed:0,duration:0,playing:false,notes:[]}), + relayedAt:Date.now(),curtainStyle,active:mode==='performance' || (mode==='auto' && Boolean(performance?.playing || performance?.phase==='countdown'))}}; + const r=await fetch(ac+'/pieces/oskiewar-control.json',{method:'PUT',body:JSON.stringify(value),signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('AC control HTTP '+r.status); + lastSent=value; lastError=''; return value; +} +async function update() { + if(updating)return; + if(!feedLive && Date.now()-lastUpdate<450)return; + lastUpdate=Date.now(); + updating=true; + try {await send(await readMusic());}catch(e){lastError=e.message;} + finally {updating=false;} +} +const observer=spawn(config.observer || join(homedir(),'.local/bin/oskiewar-music-observer'),[],{stdio:['ignore','pipe','pipe']}); +createInterface({input:observer.stdout}).on('line',line=>{ + try {const event=JSON.parse(line);cue=menuBandCue(event);void update();}catch{} +}); +observer.on('error',e=>{lastError='Menu Band observer: '+e.message;}); +const timer=setInterval(update,200);void update(); +const tools=[ + {name:'oskiewar_curtain',description:'Curtain all Oskiewars: immediately darken Xbox and AC OS, silence game sounds and pause the paired match. down:false raises the curtain and resumes. Acknowledges both displays.',inputSchema:{type:'object',properties:{down:{type:'boolean',default:true},style:{type:'string',enum:['auto','directions','singalong'],description:'auto/singalong show timed Trio lyrics when available; directions always shows arrows.'}}}}, + {name:'oskiewar_display',description:'Choose the primary display on Xbox and AC OS: performance shows the composition, progress and ambient heads; game shows Oskiewar; auto follows music only while it plays.',inputSchema:{type:'object',properties:{mode:{type:'string',enum:['performance','game','auto']}},required:['mode']}}, + {name:'oskiewar_performance_status',description:'Read the composition feed, display mode, curtain and device acknowledgment without changing playback.',inputSchema:{type:'object',properties:{}}}, +]; +async function status(){let devices;try{devices=await json(ac+'/pieces/oskiewar-stage-status.json');}catch(e){devices={error:e.message};}return {mode,curtain,curtainStyle,performance:lastSent?.performance,lastError,devices};} +async function call(name,args={}) { + if(name==='oskiewar_performance_status')return status(); + if(name==='oskiewar_curtain'){curtain=args.down!==false;if(['auto','directions','singalong'].includes(args.style))curtainStyle=args.style;} + else if(name==='oskiewar_display' && ['performance','game','auto'].includes(args.mode))mode=args.mode; + else throw Error('Unknown command or mode'); + await writeFile(configPath,JSON.stringify({...config,curtain,curtainStyle,mode},null,2)+'\n'); + // Serialize mutations with the periodic writer, then stop it until this + // command is acknowledged so a newer progress packet cannot hide its id. + while(updating)await sleep(20); + updating=true; + try { + const sent=await send(lastSent?.performance); + const end=Date.now()+3500; + while(Date.now(){clearInterval(timer);observer.kill();process.exit(0);}); +const port=httpPort(process.argv,7792); +if(port)serveHttp({handleMessage,port,banner:'Oskiewar performance display'}); +else serveStdio({handleMessage,banner:'Oskiewar performance display'}); diff --git a/xbox/tools/oskiewar-stage-mcp.mjs.before-notepat-20260924150645 b/xbox/tools/oskiewar-stage-mcp.mjs.before-notepat-20260924150645 new file mode 100644 index 0000000000..ed880c2bbb --- /dev/null +++ b/xbox/tools/oskiewar-stage-mcp.mjs.before-notepat-20260924150645 @@ -0,0 +1,134 @@ +#!/usr/bin/env node +// Local concert display control. Reads existing music state; never cues audio. +import {readFile, writeFile, mkdir, readdir} from 'node:fs/promises'; +import {homedir} from 'node:os'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {spawn, execFile} from 'node:child_process'; +import {createInterface} from 'node:readline'; +import {serveHttp, serveStdio, httpPort} from '../../toolchain/mcp/http-front.mjs'; +import {menuBandCue,currentMenuBand,spatialPerformance,selectNativeStatus,lyricPlan} from './oskiewar-performance.mjs'; +import {promisify} from 'node:util'; +const execFileAsync=promisify(execFile); +const here=dirname(fileURLToPath(import.meta.url)); +const configPath=process.env.OSKIEWAR_STAGE_CONFIG || join(homedir(),'.ac-os/oskiewar-stage.json'); +const config=JSON.parse(await readFile(configPath,'utf8')); +const ac=new URL(config.ac).origin; +let curtainStyle=config.curtainStyle || 'auto'; +let curtain=config.curtain===true, mode=config.mode || 'auto', cue=null, score=null, scoreAt=0; +const nativeClocks=[], scores=new Map(), lyricPlans=new Map(); +let lyricRefreshAt=0; +async function findLyricPlan(hash) { + if(lyricPlans.has(hash))return lyricPlans.get(hash); + if(Date.now()-lyricRefreshAt<5000)return null; + lyricRefreshAt=Date.now(); + const folder=config.lyricDirectory || join(homedir(),'.ac-os/oskiewar-lyrics'); + const files=await readdir(folder).catch(()=>[]); + const local=await Promise.allSettled(files.filter(f=>f.endsWith('.json')).map(f=>readFile(join(folder,f),'utf8'))); + for(const r of local)if(r.status==='fulfilled')try{const p=JSON.parse(r.value);lyricPlans.set(p.arrangementHash,lyricPlan(p));}catch{} + if(!lyricPlans.has(hash)) { + const remote=await Promise.allSettled((config.lyricSources || []).map(s=>execFileAsync('ssh',['-o','BatchMode=yes','-o','ConnectTimeout=2',s.host,"/bin/cat '"+s.path.replaceAll("'","'\\''")+"'"],{timeout:3000,maxBuffer:1024*1024}))); + for(const r of remote)if(r.status==='fulfilled')try{const p=JSON.parse(r.value.stdout);if(/^[a-f0-9]{64}$/.test(p.arrangementHash)){lyricPlans.set(p.arrangementHash,lyricPlan(p));await mkdir(folder,{recursive:true});await writeFile(join(folder,p.arrangementHash+'.json'),JSON.stringify(p));}}catch{} + } + return lyricPlans.get(hash); +} +let lastError='', lastSent=null, sequence=0, updating=false; +const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function json(url,options={}) { + const r=await fetch(url,{...options,signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('HTTP '+r.status+' from '+new URL(url).pathname); + return r.json(); +} +async function readMusic() { + const sung=currentMenuBand(cue); + // Femrag visual follower: stale/idle feeds yield to the existing music source. + if(config.femrag)try { + const r=await fetch(config.femrag,{signal:AbortSignal.timeout(300)}); + const p=r.ok?await r.json():null; + if(p?.playing && p.dance==='femrag-round-v1' && Number.isFinite(p.elapsed))return p; + }catch{} + + // A full trio receiver takes precedence when it is playing. Cached status + // files must advance before they can claim ownership of the live display. + const results=await Promise.allSettled([ + json(config.spatial+'/pieces/trio-fleet-status.json'), + json(config.spatial+'/pieces/spatial-rehearsal-status.json'), + ]); + const status=selectNativeStatus(results.map(r=>r.status==='fulfilled'?r.value:null),nativeClocks); + if(status) { + if(config.sub && Date.now()-scoreAt>5000) { + scoreAt=Date.now(); + try {score=await json(config.sub+'/api/score'); + if(score?.hash){scores.set(score.hash,score);if(scores.size>8)scores.delete(scores.keys().next().value);} + }catch{} + } + const performance=spatialPerformance(status,status.arrangementHash ? scores.get(status.arrangementHash) : score, + status.schema==='trio-native-status-v1' ? await findLyricPlan(status.arrangementHash) : null); + return performance?.playing && performance.lyrics?.length ? performance : sung || performance; + } + return sung; +} +async function send(performance) { + const id=Date.now().toString(36)+'-'+(++sequence); + const value={id,curtain,performance:{...(performance || {title:'Waiting for the next composition', + source:'CultureHub',elapsed:0,duration:0,playing:false,notes:[]}), + curtainStyle,active:mode==='performance' || (mode==='auto' && Boolean(performance?.playing || performance?.phase==='countdown'))}}; + const r=await fetch(ac+'/pieces/oskiewar-control.json',{method:'PUT',body:JSON.stringify(value),signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('AC control HTTP '+r.status); + lastSent=value; lastError=''; return value; +} +async function update() { + if(updating)return; + updating=true; + try {await send(await readMusic());}catch(e){lastError=e.message;} + finally {updating=false;} +} +const observer=spawn(config.observer || join(homedir(),'.local/bin/oskiewar-music-observer'),[],{stdio:['ignore','pipe','pipe']}); +createInterface({input:observer.stdout}).on('line',line=>{ + try {const event=JSON.parse(line);cue=menuBandCue(event);void update();}catch{} +}); +observer.on('error',e=>{lastError='Menu Band observer: '+e.message;}); +const timer=setInterval(update,500);void update(); +const tools=[ + {name:'oskiewar_curtain',description:'Curtain all Oskiewars: immediately darken Xbox and AC OS, silence game sounds and pause the paired match. down:false raises the curtain and resumes. Acknowledges both displays.',inputSchema:{type:'object',properties:{down:{type:'boolean',default:true},style:{type:'string',enum:['auto','directions','singalong'],description:'auto/singalong show timed Trio lyrics when available; directions always shows arrows.'}}}}, + {name:'oskiewar_display',description:'Choose the primary display on Xbox and AC OS: performance shows the composition, progress and ambient heads; game shows Oskiewar; auto follows music only while it plays.',inputSchema:{type:'object',properties:{mode:{type:'string',enum:['performance','game','auto']}},required:['mode']}}, + {name:'oskiewar_performance_status',description:'Read the composition feed, display mode, curtain and device acknowledgment without changing playback.',inputSchema:{type:'object',properties:{}}}, +]; +async function status(){let devices;try{devices=await json(ac+'/pieces/oskiewar-stage-status.json');}catch(e){devices={error:e.message};}return {mode,curtain,curtainStyle,performance:lastSent?.performance,lastError,devices};} +async function call(name,args={}) { + if(name==='oskiewar_performance_status')return status(); + if(name==='oskiewar_curtain'){curtain=args.down!==false;if(['auto','directions','singalong'].includes(args.style))curtainStyle=args.style;} + else if(name==='oskiewar_display' && ['performance','game','auto'].includes(args.mode))mode=args.mode; + else throw Error('Unknown command or mode'); + await writeFile(configPath,JSON.stringify({...config,curtain,curtainStyle,mode},null,2)+'\n'); + // Serialize mutations with the periodic writer, then stop it until this + // command is acknowledged so a newer progress packet cannot hide its id. + while(updating)await sleep(20); + updating=true; + try { + const sent=await send(lastSent?.performance); + const end=Date.now()+3500; + while(Date.now(){clearInterval(timer);observer.kill();process.exit(0);}); +const port=httpPort(process.argv,7792); +if(port)serveHttp({handleMessage,port,banner:'Oskiewar performance display'}); +else serveStdio({handleMessage,banner:'Oskiewar performance display'}); diff --git a/xbox/tools/oskiewar-stage-mcp.mjs.pre-femrag b/xbox/tools/oskiewar-stage-mcp.mjs.pre-femrag new file mode 100644 index 0000000000..8871802c4d --- /dev/null +++ b/xbox/tools/oskiewar-stage-mcp.mjs.pre-femrag @@ -0,0 +1,127 @@ +#!/usr/bin/env node +// Local concert display control. Reads existing music state; never cues audio. +import {readFile, writeFile, mkdir, readdir} from 'node:fs/promises'; +import {homedir} from 'node:os'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {spawn, execFile} from 'node:child_process'; +import {createInterface} from 'node:readline'; +import {serveHttp, serveStdio, httpPort} from '../../toolchain/mcp/http-front.mjs'; +import {menuBandCue,currentMenuBand,spatialPerformance,selectNativeStatus,lyricPlan} from './oskiewar-performance.mjs'; +import {promisify} from 'node:util'; +const execFileAsync=promisify(execFile); +const here=dirname(fileURLToPath(import.meta.url)); +const configPath=process.env.OSKIEWAR_STAGE_CONFIG || join(homedir(),'.ac-os/oskiewar-stage.json'); +const config=JSON.parse(await readFile(configPath,'utf8')); +const ac=new URL(config.ac).origin; +let curtainStyle=config.curtainStyle || 'auto'; +let curtain=config.curtain===true, mode=config.mode || 'auto', cue=null, score=null, scoreAt=0; +const nativeClocks=[], scores=new Map(), lyricPlans=new Map(); +let lyricRefreshAt=0; +async function findLyricPlan(hash) { + if(lyricPlans.has(hash))return lyricPlans.get(hash); + if(Date.now()-lyricRefreshAt<5000)return null; + lyricRefreshAt=Date.now(); + const folder=config.lyricDirectory || join(homedir(),'.ac-os/oskiewar-lyrics'); + const files=await readdir(folder).catch(()=>[]); + const local=await Promise.allSettled(files.filter(f=>f.endsWith('.json')).map(f=>readFile(join(folder,f),'utf8'))); + for(const r of local)if(r.status==='fulfilled')try{const p=JSON.parse(r.value);lyricPlans.set(p.arrangementHash,lyricPlan(p));}catch{} + if(!lyricPlans.has(hash)) { + const remote=await Promise.allSettled((config.lyricSources || []).map(s=>execFileAsync('ssh',['-o','BatchMode=yes','-o','ConnectTimeout=2',s.host,"/bin/cat '"+s.path.replaceAll("'","'\\''")+"'"],{timeout:3000,maxBuffer:1024*1024}))); + for(const r of remote)if(r.status==='fulfilled')try{const p=JSON.parse(r.value.stdout);if(/^[a-f0-9]{64}$/.test(p.arrangementHash)){lyricPlans.set(p.arrangementHash,lyricPlan(p));await mkdir(folder,{recursive:true});await writeFile(join(folder,p.arrangementHash+'.json'),JSON.stringify(p));}}catch{} + } + return lyricPlans.get(hash); +} +let lastError='', lastSent=null, sequence=0, updating=false; +const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function json(url,options={}) { + const r=await fetch(url,{...options,signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('HTTP '+r.status+' from '+new URL(url).pathname); + return r.json(); +} +async function readMusic() { + const sung=currentMenuBand(cue); + // A full trio receiver takes precedence when it is playing. Cached status + // files must advance before they can claim ownership of the live display. + const results=await Promise.allSettled([ + json(config.spatial+'/pieces/trio-fleet-status.json'), + json(config.spatial+'/pieces/spatial-rehearsal-status.json'), + ]); + const status=selectNativeStatus(results.map(r=>r.status==='fulfilled'?r.value:null),nativeClocks); + if(status) { + if(config.sub && Date.now()-scoreAt>5000) { + scoreAt=Date.now(); + try {score=await json(config.sub+'/api/score'); + if(score?.hash){scores.set(score.hash,score);if(scores.size>8)scores.delete(scores.keys().next().value);} + }catch{} + } + const performance=spatialPerformance(status,status.arrangementHash ? scores.get(status.arrangementHash) : score, + status.schema==='trio-native-status-v1' ? await findLyricPlan(status.arrangementHash) : null); + return performance?.playing && performance.lyrics?.length ? performance : sung || performance; + } + return sung; +} +async function send(performance) { + const id=Date.now().toString(36)+'-'+(++sequence); + const value={id,curtain,performance:{...(performance || {title:'Waiting for the next composition', + source:'CultureHub',elapsed:0,duration:0,playing:false,notes:[]}), + curtainStyle,active:mode==='performance' || (mode==='auto' && Boolean(performance?.playing || performance?.phase==='countdown'))}}; + const r=await fetch(ac+'/pieces/oskiewar-control.json',{method:'PUT',body:JSON.stringify(value),signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('AC control HTTP '+r.status); + lastSent=value; lastError=''; return value; +} +async function update() { + if(updating)return; + updating=true; + try {await send(await readMusic());}catch(e){lastError=e.message;} + finally {updating=false;} +} +const observer=spawn(config.observer || join(homedir(),'.local/bin/oskiewar-music-observer'),[],{stdio:['ignore','pipe','pipe']}); +createInterface({input:observer.stdout}).on('line',line=>{ + try {const event=JSON.parse(line);cue=menuBandCue(event);void update();}catch{} +}); +observer.on('error',e=>{lastError='Menu Band observer: '+e.message;}); +const timer=setInterval(update,500);void update(); +const tools=[ + {name:'oskiewar_curtain',description:'Curtain all Oskiewars: immediately darken Xbox and AC OS, silence game sounds and pause the paired match. down:false raises the curtain and resumes. Acknowledges both displays.',inputSchema:{type:'object',properties:{down:{type:'boolean',default:true},style:{type:'string',enum:['auto','directions','singalong'],description:'auto/singalong show timed Trio lyrics when available; directions always shows arrows.'}}}}, + {name:'oskiewar_display',description:'Choose the primary display on Xbox and AC OS: performance shows the composition, progress and ambient heads; game shows Oskiewar; auto follows music only while it plays.',inputSchema:{type:'object',properties:{mode:{type:'string',enum:['performance','game','auto']}},required:['mode']}}, + {name:'oskiewar_performance_status',description:'Read the composition feed, display mode, curtain and device acknowledgment without changing playback.',inputSchema:{type:'object',properties:{}}}, +]; +async function status(){let devices;try{devices=await json(ac+'/pieces/oskiewar-stage-status.json');}catch(e){devices={error:e.message};}return {mode,curtain,curtainStyle,performance:lastSent?.performance,lastError,devices};} +async function call(name,args={}) { + if(name==='oskiewar_performance_status')return status(); + if(name==='oskiewar_curtain'){curtain=args.down!==false;if(['auto','directions','singalong'].includes(args.style))curtainStyle=args.style;} + else if(name==='oskiewar_display' && ['performance','game','auto'].includes(args.mode))mode=args.mode; + else throw Error('Unknown command or mode'); + await writeFile(configPath,JSON.stringify({...config,curtain,curtainStyle,mode},null,2)+'\n'); + // Serialize mutations with the periodic writer, then stop it until this + // command is acknowledged so a newer progress packet cannot hide its id. + while(updating)await sleep(20); + updating=true; + try { + const sent=await send(lastSent?.performance); + const end=Date.now()+3500; + while(Date.now(){clearInterval(timer);observer.kill();process.exit(0);}); +const port=httpPort(process.argv,7792); +if(port)serveHttp({handleMessage,port,banner:'Oskiewar performance display'}); +else serveStdio({handleMessage,banner:'Oskiewar performance display'}); diff --git a/xbox/tools/oskiewar-stage-mcp.mjs.pre-trio b/xbox/tools/oskiewar-stage-mcp.mjs.pre-trio new file mode 100644 index 0000000000..7036658f35 --- /dev/null +++ b/xbox/tools/oskiewar-stage-mcp.mjs.pre-trio @@ -0,0 +1,134 @@ +#!/usr/bin/env node +// Local concert display control. Reads existing music state; never cues audio. +import {readFile, writeFile, mkdir, readdir} from 'node:fs/promises'; +import {homedir} from 'node:os'; +import {join, dirname} from 'node:path'; +import {fileURLToPath} from 'node:url'; +import {spawn, execFile} from 'node:child_process'; +import {createInterface} from 'node:readline'; +import {serveHttp, serveStdio, httpPort} from '../../toolchain/mcp/http-front.mjs'; +import {menuBandCue,currentMenuBand,spatialPerformance,selectNativeStatus,lyricPlan} from './oskiewar-performance.mjs'; +import {promisify} from 'node:util'; +const execFileAsync=promisify(execFile); +const here=dirname(fileURLToPath(import.meta.url)); +const configPath=process.env.OSKIEWAR_STAGE_CONFIG || join(homedir(),'.ac-os/oskiewar-stage.json'); +const config=JSON.parse(await readFile(configPath,'utf8')); +const ac=new URL(config.ac).origin; +let curtainStyle=config.curtainStyle || 'auto'; +let curtain=config.curtain===true, mode=config.mode || 'auto', cue=null, score=null, scoreAt=0; +const nativeClocks=[], scores=new Map(), lyricPlans=new Map(); +let lyricRefreshAt=0; +async function findLyricPlan(hash) { + if(lyricPlans.has(hash))return lyricPlans.get(hash); + if(Date.now()-lyricRefreshAt<5000)return null; + lyricRefreshAt=Date.now(); + const folder=config.lyricDirectory || join(homedir(),'.ac-os/oskiewar-lyrics'); + const files=await readdir(folder).catch(()=>[]); + const local=await Promise.allSettled(files.filter(f=>f.endsWith('.json')).map(f=>readFile(join(folder,f),'utf8'))); + for(const r of local)if(r.status==='fulfilled')try{const p=JSON.parse(r.value);lyricPlans.set(p.arrangementHash,lyricPlan(p));}catch{} + if(!lyricPlans.has(hash)) { + const remote=await Promise.allSettled((config.lyricSources || []).map(s=>execFileAsync('ssh',['-o','BatchMode=yes','-o','ConnectTimeout=2',s.host,"/bin/cat '"+s.path.replaceAll("'","'\\''")+"'"],{timeout:3000,maxBuffer:1024*1024}))); + for(const r of remote)if(r.status==='fulfilled')try{const p=JSON.parse(r.value.stdout);if(/^[a-f0-9]{64}$/.test(p.arrangementHash)){lyricPlans.set(p.arrangementHash,lyricPlan(p));await mkdir(folder,{recursive:true});await writeFile(join(folder,p.arrangementHash+'.json'),JSON.stringify(p));}}catch{} + } + return lyricPlans.get(hash); +} +let lastError='', lastSent=null, sequence=0, updating=false; +const sleep=ms=>new Promise(resolve=>setTimeout(resolve,ms)); +async function json(url,options={}) { + const r=await fetch(url,{...options,signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('HTTP '+r.status+' from '+new URL(url).pathname); + return r.json(); +} +async function readMusic() { + const sung=currentMenuBand(cue); + // Femrag visual follower: stale/idle feeds yield to the existing music source. + if(config.femrag)try { + const r=await fetch(config.femrag,{signal:AbortSignal.timeout(300)}); + const p=r.ok?await r.json():null; + if(p?.playing && (p.dance==='femrag-round-v1' || p.visual==='notepat-score-v1') && Number.isFinite(p.elapsed))return p; + }catch{} + + // A full trio receiver takes precedence when it is playing. Cached status + // files must advance before they can claim ownership of the live display. + const results=await Promise.allSettled([ + json(config.spatial+'/pieces/trio-fleet-status.json'), + json(config.spatial+'/pieces/spatial-rehearsal-status.json'), + ]); + const status=selectNativeStatus(results.map(r=>r.status==='fulfilled'?r.value:null),nativeClocks); + if(status) { + if(config.sub && Date.now()-scoreAt>5000) { + scoreAt=Date.now(); + try {score=await json(config.sub+'/api/score'); + if(score?.hash){scores.set(score.hash,score);if(scores.size>8)scores.delete(scores.keys().next().value);} + }catch{} + } + const performance=spatialPerformance(status,status.arrangementHash ? scores.get(status.arrangementHash) : score, + status.schema==='trio-native-status-v1' ? await findLyricPlan(status.arrangementHash) : null); + return performance?.playing && performance.lyrics?.length ? performance : sung || performance; + } + return sung; +} +async function send(performance) { + const id=Date.now().toString(36)+'-'+(++sequence); + const value={id,curtain,performance:{...(performance || {title:'Waiting for the next composition', + source:'CultureHub',elapsed:0,duration:0,playing:false,notes:[]}), + curtainStyle,active:mode==='performance' || (mode==='auto' && Boolean(performance?.playing || performance?.phase==='countdown'))}}; + const r=await fetch(ac+'/pieces/oskiewar-control.json',{method:'PUT',body:JSON.stringify(value),signal:AbortSignal.timeout(1500)}); + if(!r.ok)throw Error('AC control HTTP '+r.status); + lastSent=value; lastError=''; return value; +} +async function update() { + if(updating)return; + updating=true; + try {await send(await readMusic());}catch(e){lastError=e.message;} + finally {updating=false;} +} +const observer=spawn(config.observer || join(homedir(),'.local/bin/oskiewar-music-observer'),[],{stdio:['ignore','pipe','pipe']}); +createInterface({input:observer.stdout}).on('line',line=>{ + try {const event=JSON.parse(line);cue=menuBandCue(event);void update();}catch{} +}); +observer.on('error',e=>{lastError='Menu Band observer: '+e.message;}); +const timer=setInterval(update,500);void update(); +const tools=[ + {name:'oskiewar_curtain',description:'Curtain all Oskiewars: immediately darken Xbox and AC OS, silence game sounds and pause the paired match. down:false raises the curtain and resumes. Acknowledges both displays.',inputSchema:{type:'object',properties:{down:{type:'boolean',default:true},style:{type:'string',enum:['auto','directions','singalong'],description:'auto/singalong show timed Trio lyrics when available; directions always shows arrows.'}}}}, + {name:'oskiewar_display',description:'Choose the primary display on Xbox and AC OS: performance shows the composition, progress and ambient heads; game shows Oskiewar; auto follows music only while it plays.',inputSchema:{type:'object',properties:{mode:{type:'string',enum:['performance','game','auto']}},required:['mode']}}, + {name:'oskiewar_performance_status',description:'Read the composition feed, display mode, curtain and device acknowledgment without changing playback.',inputSchema:{type:'object',properties:{}}}, +]; +async function status(){let devices;try{devices=await json(ac+'/pieces/oskiewar-stage-status.json');}catch(e){devices={error:e.message};}return {mode,curtain,curtainStyle,performance:lastSent?.performance,lastError,devices};} +async function call(name,args={}) { + if(name==='oskiewar_performance_status')return status(); + if(name==='oskiewar_curtain'){curtain=args.down!==false;if(['auto','directions','singalong'].includes(args.style))curtainStyle=args.style;} + else if(name==='oskiewar_display' && ['performance','game','auto'].includes(args.mode))mode=args.mode; + else throw Error('Unknown command or mode'); + await writeFile(configPath,JSON.stringify({...config,curtain,curtainStyle,mode},null,2)+'\n'); + // Serialize mutations with the periodic writer, then stop it until this + // command is acknowledged so a newer progress packet cannot hide its id. + while(updating)await sleep(20); + updating=true; + try { + const sent=await send(lastSent?.performance); + const end=Date.now()+3500; + while(Date.now(){clearInterval(timer);observer.kill();process.exit(0);}); +const port=httpPort(process.argv,7792); +if(port)serveHttp({handleMessage,port,banner:'Oskiewar performance display'}); +else serveStdio({handleMessage,banner:'Oskiewar performance display'}); diff --git a/xbox/tools/tests/live-reload.test.mjs b/xbox/tools/tests/live-reload.test.mjs new file mode 100644 index 0000000000..75da072525 --- /dev/null +++ b/xbox/tools/tests/live-reload.test.mjs @@ -0,0 +1,27 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { freshLiveReady, latestLiveReady } from "../live-reload.mjs"; + +const ready = (bytes, generation) => `AC_NATIVE_LIVE_READY bytes=${bytes} generation=${generation}\n`; +test("reload acknowledgement follows the latest application lifetime", () => { + const before = ready(900, 37); + const current = before + "AC_NATIVE_BIOS_READY engine=quickjs-ng\n" + ready(1200, 2); + assert.deepEqual(freshLiveReady(before, current, 1200), { bytes: 1200, generation: 2 }); +}); +test("reload acknowledgement requires the uploaded byte count", () => { + assert.equal(freshLiveReady(ready(900, 2), ready(950, 3), 1200), null); + assert.deepEqual(freshLiveReady(ready(900, 2), ready(1200, 3), 1200), + { bytes: 1200, generation: 3 }); +}); +test("old and missing acknowledgements never confirm an upload", () => { + const log = ready(1200, 3); + assert.equal(freshLiveReady(log, log + "a noisy frame\n", 1200), null); + assert.equal(freshLiveReady(log, "a noisy frame\n", 1200), null); + assert.equal(latestLiveReady(""), null); +}); +test("same-sized updates and reset generations with different bytes are recognized", () => { + assert.deepEqual(freshLiveReady(ready(1200, 3), ready(1200, 4), 1200), + { bytes: 1200, generation: 4 }); + assert.deepEqual(freshLiveReady(ready(900, 2), ready(1200, 2), 1200), + { bytes: 1200, generation: 2 }); +});

    ;a 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%0Ax6HeM#kT8~n@8)W zXFaih)wAMTnO$km-RRY6W*;6Z%#@a536uJ@QYR+)pL0gkJ(co(P?krEe%JJM=`FmPCPkc@X0E0>fEpc zm;V0bW}D^vN;bCe*4jYdgRh$AhP&ln+R=SRH}H??aRzPs(- z%SRJBb{xMpyI^Dby6U+Zp8kmw0y5)ow!NRoTeG6~<`tpU_ZJ0p&#Gse^?2>hgH0D) z9)HgKkZjDdRn6n`YgtNU46ZmFi`ew0fp_gKK1QwbXO((uuf1c^uW>w>`D=N(&(GR7 z`5ZN6et$|2FEi#R_(xPNh43m|+y}x6`DssrH*A?Bc-r^( zS{8rR_NJNf=Ppc~p^&>!ZDaeKW10`whnXb4etAOS%_YMb!CzGvTs1W&hQ4~6`u1<_ zCcAC-9F0F&wtAsQ0rSe6L8o;{-dHOP@Q?Sy>l1FuuA54coi zS?wIOtY7TX;Y?e8G&#rStHM@>#Ee{ZMy)kr$zPSU`piWhM|`Og3t#u>+m*G3b$(3+ zCi8#1N@d#^>}~$$`bmvsEv2)AjiCJv&=M%6)?N%`HiOHYs7gY=iBzf-BD| z1iZP=G~Aw5ASPt?F3{=h@}!#+zU+J(!T(QpuV5nERA=`|f7jhHnd-Z!TKL1H+5e7k zo!?oqb!&mv_L)3KkGSn~J^HA@pmE)K`K&Fb%~w+lzxK@7nRcJ&C|6RLz@;N?LA%%= zNoCHTc zx?lhP#HhJh3kNIo7M(`z8`1(!N-hFYp`FY`@%eF2&#>r8< zsCkw{fDT{9D^cHT4g8J0&8o6~?zeCIZo9>oe)wSy)B4Cc@v4hcEF@1>pLFKuBcYpLpT2$ch-+Srfs|Xb#r-EY)mCr1Q+QrqZ&zb$*32sg zy)#s}ekMG0I4o$sfRo=(p{3L1Z-T|40NraMTSDU+&Pnq;t`L~+%DXDdXzrbu7_r+j z>W?S*9%wW%o&COHy;#9r`Kh)=mvq>7@wPkmJd;XTwlsA!cg(`WWve6>F5^wT6e3c3 z;w>BJ^$9!I@04VoWM%*P*ZgjF=Azk63Whh!LPfM0X6~rpc-Gt^iTxVip?;B@$Cll@ zk+FrB-IHs6xYCZM)~30KpBW0?6Fl~rao;m(j?3(sQx5H&>O1YZB&NVFpkmli!_U{Rkiq1zW$m2`vzF&4ueWv@ z{9>Q9CpPav*!J629e19kZM{1!LWD)fo3rs|g@t5Xd@OUkP=9jz?AJ$cPJV7b%cpPu zr>W~3CH_44ZQtO2|GvFO*oq};zZYk9vx+a6t?*@1GLsqChqIq5C+t{!`1kY~!uwiH z{f}SF+Po_=M)a*%nYjJh6C2-e&HkL@E2SmX?^exz_-D})6(Icm~%9(XsOiy2!?#S85k@rR4_}ZHVa=bzj zg;G~v7RGK%NS|ENF)vie)i#v>_L{e@!n<#OsaeAN<(FINsvj*vE3SS2eIrMo`(ksX zw$&=p0JT?MUzTR*)-|5b4@!6!Vq5k)jXA%#`P{-sp)YisSd6E*mdO1q%YMJt_nXR> z$GfISMrI|~KDm9l^PiiJWY+SA#_+}_`!Bhw^Fy<@q(~p~U}qKbFpjZY{Fvo$`-<8P zuY{!^e^fNDy!7{@oKJcPi{vY=N}0n4TRgHhTKw?{6FWW0RO$FU_Y3M?D&29dlfEBg zPg6a&{M{N0v6kYViD}_30!1hN6ddakHL}t)Rz$fat!@mu9MgMNZb|y7){|lPc9FOC3 zzO?-M!g~Gjve@5_~X>owNiOI+=LD9yxHIQ_DfgzzFp#tr>d4e zS)(WM(dbarByW+n*hl>annL%v_bd|<+*)^Hn+@aX-lUjD0pHb~_Omo~19fzY1Ex>E z_u$Kst_hZEy*>BE_o_0soh!8wIlV!6=hQ#S_4h(!Pe0t8wcyKttvhlDj7zij2J2^X z+MQ6YnY(?mmYH14NB^S*o{i1R`9%L*j5ThQD=KTYfBS`1+c9$4yd%bMvR*fJ@TJUr z^+o-1)}-irTDHAc%jWI*U}|?vBHg!NL?k$^m0`2n`>o3AC3Et(Fthojuk>+0J8Pby zz?~J#=Y4M2;i>3uE$w@?sO!Pn49;g$IR10WO+B-~L8T=p?8HmOln+@CH{9IvICarF z$0;vDuhxVue;~2d^<4JpbIvbUJJ~7RGmtdgzU*}LvmY4}9`9>K`Csd5-oD}&Q?n=V zr7YjWUnyKaFSz;e^B-^C&!V;QPr;o~y$grLPM6GEE;pygHKU{pw@uz1zaNjNwNU zj|MXf!;E=RAI-lyXnpj*?2;&ayd!pHxPZ35djtOjGaZGN0{6{@Rx&P`lk%@Ogt1K) zbh9>`A~Q9z(Q@saJ4f72yN+$%nC*N(LO}c3gua6x{R;Lg9#LkTYEp6Y&9hHZPrg5R z@!-e5z020jx34Ps_r!JM$p=O!4cHpk6jK^>IdysGCN@|#i#&h-q)^K7fy|6~BJQ`R z9I4^FZZm_g-><*v*q;B*@{TLSB$yX?H~iP^Ry)LY{Kk|if3!0dSokwU&$bILkB{78 zr{m#m=vrgN^zaS$WR4_tscn~kJb0qVR&puAIZEl~$7x$zj@jM$&-E=yX&>7^X2zl& zYG1{>R{l43H&XUyjDN7f!6#$3^9@y{-U2D3Jsk7cwI}r+Hd!Xt^!2dBq8*7wGCj%; zHx3Kdyviy}-Y9<4!srC=!kfI8MgDV|cgQYpoV#=1o>N7060>7j-YX@pO1vGsL+FE3 zgM#MDXz#9S+tmjmjZ7{6?WGOP6OZs26z9JFdsER)K1h&n#UwWA zGZqsrmI$2dU-VP%L51;b)!;LQd@JU+Xlpd?eD>_L%#J08k7UN`rdtKRRxUG&F8yoq z=cP*JMQIjR<}ACLc9yHQOmxu8HhX$v>w=&;ejDp-DqDqWXRb}3x@gVjOLL48oJD6D zGfi3BFf(9T1k1g?cM-gvC&idA`Zl~zlaDAh-7{OmZ04fS6~}Kb5G?Nh$a0ivTeH8- z-`?fkUU!#${L-KKGl-T9kybtf`nG)YP71(b-u(^<;dx`qI$#k z%{5kHyGvdz3H;EjbnM>lZLgjuTJGHCdG06Q!nRzV*_M~<8-x9vHm_atz`4|SO@R6~ z@yJ{g_rBP)c<+PVIZ$y61P7>TOCr5_$%bq(cLzgri zyXL96K~&e>NU~$@<1m@Ed~Z||r-_)BZQ5NMYMk98wmEZojQ3BUOV6S%v&4w!P1~`p zjn#L7jIj0M84}Lcc}q+}3|B2%yvkm1!*=%R3}K=j+X7}sZN0^GQ~mwdPr5HMTIRUq zuW-A5a$N$i^eYbD!t7|HZ>N4n0xEwWa?P4_=aTf!l{qIQPt0lakX`VB`N~Yu>G$T#KIB)qB3*dLj;Cf} z%jcIOi?+)gK76kDwFYxpj0c;|;nb3@O!j}CUQ+@$oqO}4-7TT(*Y9HX8*B6?BU>I-aYZ5OL$C*Ab;f;Son0dsi^k zDD~WWIP*w}P}cI3R|&3!Y&70U|$;$8*s!( zq5ee4-MiHcGo(xx-ngoIPw27C>hF&=1gA@-pLmdTep*G%njgYJ7b={-Xx4hi z&!Kg)g3Z>KS7v73_`da^$(l*lmw&BY@Nthy=8MTDZBrSVWjuwq#vD$WqgC{WrQMGA zhTxl{3tout(d=5ZfoY4E=*9_`k7sRM>cS^^sDd^1Xpqs(L@Pa|3pw3km!_MDtkMx( z&KyxHF~jxMGRe&?7Ee8XcBV9LeYhcjv(3Axs?zF}OvV=XC{wAdw1b}+Ei88hPHX40 zD6c-GowQh3WU5)fgtns{dzzDsSoRmp_W2gbJZskJAm5X>Wr~)tt2A;Ra!@&Ynb%9; z#m8xrUvy~Zy*?-P@eAX6qZJ3HTJP<=!zC0}Dx^Bc)yZw|^%U-_Aw7DLu^(OZ_;@|? zn)tiEi*_iovmN&ko4Q=#=$_2!UN(|bHGB>>E_rIXyZ7nj#qyh;>8yO96+GLdt40cB@GE zr~6IzSW>>(+!8Sdbr%y|vu6_94ko&8P>=|HQsubiwCVDQ(}_=br>&_d(_JAEZ7b$8 z$Ml+k-?1(65nZ#gdjfCmRJgx2_O6A#9f#1*E4gb!GJIFgiqUUi>)t;1SJi=Q{Dmwp z4Gz{#o3UK=C1=R(GdfSoX6Kv#v}&)2XPkI4_jXFd{OomG57|sQXpwqaB0+Ka+5$E$ zyR>ch!YVB#)HZxo<7&IC$RHrF`{TX1hK1oBXTv_I+~AN*s$I4_vS@{qBC|cmLTlGA!p%}L zUp_VLHfQ2$ExnnREweN`@nv#P|71PJBS}0~(B&_wc_37Sp&f(s%$C5wnx^HVYtQ454zasUE0^7`)>V>mJ zE#ELbwToCYRddzk%k1v#>qU+}JNntZG@5ng-d%Rgi94!)8Qfl@_~AB7Xv^Ul!fAY$ zGDIE;topn6?_zQP`G<}-)i7L9Gi_{FKU(vrW!FQq*>6*m6Zw@kR4+bRVPbeV({$$U ziz-sR%?AyhxTsjHh{&BIUJxTwy3xzk9VNSM1qezr+0Y{DbC4uIiuD zJ0BktH!n7BZhYSL+lLo7FJ9a{`SRq;)yqHJ4KhE<_PomTkik+flYaZUZx?^}&$F%c z`(`cC^XOxV#Z2C5+h3plJbU%&+i$Jz=NRc++?cVUzmNa@-QDHS-@U9bYRnHvUVZ!P zuQKMWEC$10Ewj3|`p$bEeqBI+|IWR!xzn<5Se0y>E8FYFFL$s0!>hlKA1lXfXtvFB zIcTHgp<!Bg5n7e5OwSRCo95 z?$58E7VVCDJYny{3WHe;fs=yNa((8W%vNY$AzSO&CUExFy?<|h{1A|PF0jwP@7QC( zXQJElIGc(pOG_&&>*@;Y3ODZ9t7;P1+rIek&zkyu<FtL)EvC1Y%4mvp~A`u42S?Yxu8M`T(Ka$KG>&)&NJ8_&I( zy%G2B-P3#6aA5rdPj=>GJ$+nv+-j+;(S;alqv>3mY_NP0ndf zPdc$Zc?y%9@|!PZdz+@7+*UbHbc4=Ij=qQ!7OPL3%He&r=)tYzZc&#TuPq+koDkS? z`0ZvPmge^skLJm1_FEqcYUE{*|jZmW)>ssEM@N5hxiF%?UOJ&z)7=JZ`wvr&n@>FmOL*=Ij6r)Pj8)r z%w>@iyPteW`2XTVf{|SD1om~Fngyj2t+&)7FWK!hyqUH&Qs2BFyv=39)s~|r1~PqZ z1v&iveSH0Vj>jZ2lDxeZJbd+xqwmPalNlz3BE>uR?69c*_UF~7rrZ99Z2JQL`Z+wl z-mzUb;_O3-7X3$zoIkhSSY!0#SsC+#k38)T=4y{ma;VhU$QDo9d-RXemcKSr7eABQ zE#~PEm8-MvamTByos6z5=`#GE6=eG!WE{TBD{j8sJbc44ZRfW?(l39UyZd;#Uw@{I z_BE;0+e-IEHvDf^)Tny%L0;H>^WAA5V#Q*9Tx_s7v@>FD7;C|cNXFfqcfM6v9g=cY z+P-186L*7r8Kb}WCt;2&Lf`f|wkF-4l(YMozKQ><&sM8$x&1!v+x3|74zpO!@-M9p z($g2Du9bER;ZJS2sP9;Mn5k&W!Q-K<`QA4~ZBMl1xd`9(aZeITcY4YH<733KsZUKN zGw;vPV!sxBDCy9$gsnU)cobS3x3fLCr|{CP*6mdH>Z4DeK1$oTMDv}c%+=k?kAL^` zPvA}PcT}{k{q^YOWbqF-Vp5r_SoAom%d5Skr-|S3%y?f=R=~rR$+n;UDZhJfty4^o zqFSC&Cetjbsb_O$HK>d7FVc9pLO^H@XHEMTnV(r(|2=5#xBv4X*&rfZe8JN76E^S* zO8Fjhu8`Qk`J}V)nrHAErb$6IrcKP8w*>YbpR746_QsRFCv)E@%K?!S;Z zE|YY$=#Y%5%=S0AA5<1S_V8TrVqdYhQ=gL7=k^1Pbzxy!)6ERSCtp(7d2Gkiu!k1c zOAKZmQsiXL~C*{ro4SGEAwvt9GS!BD>ltO z`ZkI2-O;Me_YT-^+>_nJmhEzXVu=`6;3Mf%6)w5?S(hGv5LwW-Dc7^Bd(NsGEQXI3 z=>DzQdrMFJ_0zXqN%L;Jd?ot9N6v0X_4|7#=U$#XIXHsPid$4JH$bGD^+?DA>3^-2 zyKeiWy-qY%`jBwInf30Z=4TU+B+v3nSlpn&@F>7Q*refdSrNO;W@dv83R^z#e$!Yk zJ8`b;lHh>p8H&eVCh%-JGclJ*^u^|@Yh(^OvvMB!Xdv1?=i&a;wV#EvmX!qR_q!F` zNPPO(X!SwyRo)B3j$b}lBfsadqSdU(jZy3L^$)&_N#<8sbo%?V;1WeOfvJb*9+oo? zI^F$7=nnr2ZGjVQr(zz?wvq{E(hoG4@ujPIp~3u_`-?xU_nwm@#qVVC)S}aPy^|qz_rz>YE@5wQe z^-ovcVSVS^DyE6MV;8(n@$@`=i;vCFMb7br;eM0zuNNIG3QkYxJQghT=cEZ^z^Pp3 zZ?!)j9Bls0|L*lwp82-*AHUrEtbTr;eRbWxH%D1tL}v8~%Dy}A&-Z=#WWgQ2 z8}@wI`QYK2>(Sl8B}rQ5*>m!J?maT#_|WcH|6bP5F}>*;Yv%EVn=Ouu>I%%Um@|QC zOYFfouhTpKuQ{8*>)_qsb0_BRf~q|`lomDaj7<@E7&H09^O7SQ<0FOJ8!mYDeBIe~ zK>p>lhXqzy8~GNoDswA|K0G1urYOt6YDS}+#QF5YCp#i+m<5w7ZUq=|>CQ?~&%M_< zW3p0Q^UKSM8FO_braqNYdHMDHzRHT44^I{^PxqgnI9Vm#p>@&gRNnJuG*O7-Hg9`AJMoY<~FdhBay0oJPkoK1l_yjoId4vN0v}z-`&<- zKA$_^*d8}M;kWL#eNFS*ZkSp69zXn0;*B1M=8R=In_HX>=g&Q({(JjrZif@^g4HWf8Ly}D@aVX>Fd9S3hI_Icdu zKh)B8cbo4-|8LJ0Y&Jiwx?}(RUtiK4HEX_n?0@j#9RK%o=ky=A?E86ZIsf-}OndH5 zIsILJ|J>)@i!c9tlw{d+-2U&^`O^Jq;V+u^Y21Em`C#_z^gxTMr}vg$J}__o+;-s! z#ul-zbC?__-QWNJ*Wv5;T6Q<+{{Q!VKj*H@ZT4)u-S6^J%vOsQop7AcG==5avu8-sORKFNG3KXI9L#i#-S#Y_iApXLEHP;r1FA|aYJHc(a%K@Er z`Nk2k7lLPG^6xsvDR^?DxPigtmlBB!AAhrMYj$Lq$;S})_N;~(+qUJd(HmO%o!T;I ziz>Q5H)$4=*~)0CBy(;>bKN4-^;4b{F+(0fS{%%|hgL%o> z1cnkWUj3~MI&5ET8=b9W6xtp3g|E06(d%I?Wfnd;l8J4_BCovJJZw8AaD04LUCdJX zWJ01@{mD3kOotznmCH=R8g6c%wx83RvEKNO{fxurzr;-5?>p$lX<%Ua!t%$ieFtZ= z$FnD@TLjPM(M-Q|=T0!Qj!_)Pk=ll{Jqa(3WhD627O>P$ec*d!aZ*Q@*#rASeGFN1 z&oe&in{2U)d(FJkJBzR0I>{4f;8nSjx6O;o<=-6LhMDJI3QRL!#$99{etKe$1*3pi zQLRbM^d}daBF=t)kS%}VC&%7nCyfI>`p@5MVa=Y)cfTOgsLU{QW%8nf9B))U@^wzx zIH8_t#|j7L!$o12VPgUPBJ5kMn7YHRFF54mwSs@I@UF&blIJ!#h3D^`y7ODcJ*TWW zLKC~wEZ%c2=bG5o8p>45bYJ(JvqfP# z8EiJiCuW*5dNlONXgyx(@u7UrM&5f8*6o^K)mU1+FRM$bRWVvA9y_t2i*=7f0z=TN zU{*OsR$haPX$EqQXC;_F8qRK->O9l2F6rZwkDHJ8&yS0ZomygMah~bTsgH9PKeldn z$mV&W(|DhE`Qv9*2Y)htXeiK1Pk3PXfOVHbiO`-c9I9-Fd(@V%(weoYUGuKZ+zG!d zAMUqgV=Cv9(>gGF#-{4#1=2mvA14M_?YhNaW42-OgM;led=meB3HerX@VnIF6FncR zo1XBg1qCstdPcVjKiuZA`eH=olQqu^{udYIKh$U}w@Gy)PMA2^f? zNtzrL`_s<;f%kQb%AGWBl`D^)v5CkW58qIFgk}E)c^RGu6F0h_Eb45ReQ@Ke>GPh3 zJI&WQ`0bLOr<#1&T0h7Bz(W2^C4bh56Z;a59=;b9aD}tXi+@KYbJ*Xh5zm7*mzCwd z;I?~tE`e1|dB@V0z4aFowM|%Nd%0|VDi-j;?SL1@mlZ1|-`J}!$=bG#N33nV;-yT@ z6Ph+GHT@SDnccJ*?`3Yi^(eyi(8k3d6Y30F^JlH--aR?@g1~`KhgN^&U2s)%W#cV( zu?8zK^VdheO4Yn*c`KMUnZ2Ou)Skxok~s%29<;0KRj?PXaGEgrzkTTctJybarFJHs z&VApNum4*6d3Ny`!(&I9?w{Tx=zezA zG6U^9!aBh$6K+r6zJ7n*-%n>xpR8zO=v@7#x=k`$?wfRd-EX=3^7rbWG*y_Wk+rPC4&!)z-slQ(moS68Zh=?CR<3<9a5B z_bubmIhKo_}SU>-2vgK1M{J&wSSBsP}Bvo!^p%ijGT#oh5bzSTZME zT>Q>;<;x~%`ESpj{rdHei$7H3=+B3jKOc5)I3Vple-g6@^KqNGDXTB4>aDSwv*xmd zkkz$^hZ)apY3158FD0$R&)@&foA3Po^7apZe?0K_7{}HbkNuJiA2Ds5?!F`SL}b{R zO&0oW<;U*&Ctg_eA!S}$`s#?4{2`KU4Uf7PI(FE0q&++KxbBz4qlNl!a>TX&Cu}v< z63|_GDlBNn{E9O6ttA1ji<+MOxBc*>z<63$pyFejrYXr5$2{Kjo?#9+QF;7m!6zNd z%OV2O8#5T3?>suN^P#!jHc#dwA~PgquY1qy-(kxl_H&DuBM+;X`Yf^2SJ~7R-pSs} zIU!Uxqy56t#|<-syV-kGTi(CeqPX1lDtoWN&3BorTfXG2SQH(zcaMAXyJ zac6mo!fw8I*?a7`vE1&~J6>Np``ClSw`|???(Oa0^Y1-6xUR-vLCRcz_syJ@3u=>c zCG(7@-3r{Z(s-earNGCTNx>m0PlaZ_p6%FT9$Ng$<3;Dm9}^2yw~L1qnNMiT`8&ZPipEQ7Tzp+Vnv4L57|7(`?Im z?Ng@*18(zW#Vj~wpT$L z^j3SEKD&XHJ^8_O%jcRJGw<{S5 z_7?ah9!+YzbgEN+ue5*FkEv(>a(Rj@vRh;}Yc_|fhwQ$ePp?O)?EgRe{l`=H|DMbj zsF-JO`*4rzzJ_H7FCVXV>AcsGcd3hc@8PunHT(ZumH#I+Tk0a)YMGzTkrQ2Gv{R3y z_f1^1ZL`Si6K9jHKD6sgZT#~`-28vsF&>@cub4Mv>{zB~-`hM(aEiy1ROQIeD^GOl z9l7EVUR-1Sf7N~I>ucfzCkCJJny~oTwL6bv=K8O@u{Kq|(dx(7x=y__ci)CLKP=f> zS+(cC$AJYB8^3Pdap>_GX%nsZg?nC}JKO$UzU{E)J<$Nk$zS)~+1AHyvU>fxxR9p_ zb*6uA%m4rLxBWfm@zBRVe@JbY5LM3GnmJA5*v4DOAO9?m|9i3WeBiEG!Ik$m=$G}U zw3yybaH{>apkKGgzcKXG9=p{WX5aEVY`&Z4=DWJ@End?6d!0-uH|*z3Lq%qnt}@kq6PGG1Q_9w!bTp|#H^Po# zgYWT;Qn%Jf`x+kDswk$+qu93ZKMTwAdB;*L{(o!Vu-Eg*#rV4KZ`c2OFn#~O=JsO6c ztU2dCG*yW(7w|<`&;0VycAkK(>%8{l7cV7m-sWR{d)c_@%)NPDl|>fYQiFR!o;;dn$&-B!=x5c3do8;cjy5V<8($c;MuR7ZfTQ=3A`3 z$8@G|Gxy7<)mP;zW^AiCwdunKQ3c`43v=(LI8EWY7_>L?vbBjqr_6)}GviCz&V@8d z-7PzL>2_q`hp3O*pANhV?#_O9K61xerL=+%xA!Z5ljQl@Shdu$eTjfTr+tLj_1I&a zaVA@qonEH-&C})j&xfM(-IuG(O)THI)N@MsMwwjc?0@?ud(O4o`gVwg&uIE|4Su)T zl`3zSY2MU3D!nq}OyHEe^>eql_}*tX-T(9ICHAF?hnE|jo%bf;oAjy;$oAlh{7U$=@>TJ#}SNoGAZ+lx(VG*m7_=c$ycYR@>Bj8au z?_&MkH%~sEh-8_QT$9D6B~i>WS6pAfD(@moaF^xLS4tV1ZY9_!g(vlY&TZs0oSzha z>4kKrAM>&ek&hCtXDXD;oAp+F@+zk-=1d++UQ0c_Kh3yuGUZ>T|M6|SE*v*Jmp8}< zUtjf&&oou`{*L%!_1!vmCwBAO-QAq!bdcFYuvfk&W~&do(f)Tw-*oFg*(q+hWb^%P zyquQO3dbKTknublq<4FDkA=XQpsR&RU7bu{r^I$#R$R(cb+k3*p>^TRta-5|*N>*Z zoI5Sd#QV@pP5+!f>%5ow)+ndsT@Md-nLYEBhsrMorttc5);& zZtY#<(!W07_rfKGUU{bCWpA$+E?d5Ar;5wFf}jTuhc~&n-gpD}gUi9&aH|jd)7|mvx#B6zZvqmWMwLV9S?4Y?~ z&+b;vJF?O9>|>4YJ@tMy1z9q}iV_!?rOH*rIWDbzqbz>8^T|(@fR`>yS}z)R-aDMV zVef{Ix*L3Et-AKP`0aNE)&(11u0HzYTUM3n{23Q}L!KO7u3oeF-Q7%~o?C56JA4A> z^Qdw>->Epwu6!nMNe|!SWgD;BKT31Fv}wlK-<=*#swY(L4CZ0>j)C37XxZ-M8D zbl-1E(oHd1nzn&fA4LuvXMU4>ig{i||E!Z?8`l;ypFS_%-u-h+Zc+N4Ikk4{&-1B0 z-{r0=r`hM)bM(a7OG~BuitLMva;GYY#y#|$lRok1&x|deZj&FzoLHuM^GC7CpO3wF zUM`8KuspnXy61~fnRPMGzpvSI%2sH$w{gXTxsvx=Zhu>2Z!2S=X5Ou3|D;aF;H%Tk z17C%A?0LRod+dwF7poi%`;|g?Z_6e9%dwlQr^fgA#}$?wOUtJjzuN50|6SUk(0g2D zhG2BZp06^weJK*0D@uPgO^=FMY%z1w=a$9G^X%&1=~p|2M8?y4ALO3>$3UG;ULv>^JR`ja_xg)up}bD&%>ZcI4S;-??*e z#!-%++29L{#5Av&m}J9uL^h^r=@b-2)I14>(zow z54Pl+REY0)TBNl5KCkhfvtp;GO7BuxcAKBaeEBRJUlwdU)I4Y5Va@u@ zKQ2%Dmc&t%QMT3S`Vr=*_ZWCC2R+N`Ye-gEp5S^dXeYwh~C!fHFi)q)-G13MS|I9iu*=27Y##;FUBtY%C9 z(%UZl<@K(gp_SF<)gM2x-QckfXXY!vmbq2jcZ;vzGLB;Ri4oyhAMzSQJE9JiP5N5R zC9(xiVW@xnP4Vz*e^QrSnG1Dd1}HNg>3z#$0`kcoC`{0X5Ll3sp9Cr%>Rkc&Ge4h z-oEn>A5XbymcXLwvHH)My)OdRi!z;&xE1iIXk9q{;?_HNFfsbIU= zyeaMUEZzg6P0}Z4y-yX|Z_vn1N%HvLhm%pbiiE*7iC)H(H$+g+BUskmEg}h!i z@eJ>5#g;SdY4e`X`Frlvg#8h>?z$~-d3|W#H?J3y`Z-R!{+_w=$>~pT7JV+aRa2N! z#g#qP^LL2W%@f^wc}**3J?4?9hcn;W-DMrm-)198>)u=Xjf* z^6Dy?HCeZqSGml|dlI7{`|9zY2%Td$UT&J5nWW9Zt@>Zgn|1E_uX=|*{wEsz(n zY|Wl-Mx|c?InR!sZ#6J=nVl-RNA-2r$N<}px)4w-~ASKiyWQma=x4J zJv`}L^}cOo{Nfjn7}cMD{+SfC)`Q{5&tF$hi?5Hnr?_=q&vT81S2^Xn&CVx1_;>j6 zUajZHk3Vl;uD*uf;oswzXQGy$OnK8Kmiy{`{g03N`~M3Hi0<2Hc0}Z@$;XK?(ygxT zdea0KP82A4x$-;I zo?UT4JM^5XVsfU*z7zlU#qLQxqxZX~S1q`w+ja)GO{v@=PbTyBAIsj%XwJR3?UZ(d z%-p$0Z+?v1EOE1g_vq%QuY+b^FT8hj&C3n74(h(yZM)bQ1sXRQn|wBYHa~WU%k7s& zpB6t|R1XgcvtTpSYIEtaU*X*mnknMU)(hFFe=LB0ZV$qwnwdpGnfJlhYYO4Oe(R z=brO)Z|{ql5h@K+15Z9?*S#}iN4l}XlyoPD;}1Vu9_2oM>vDvJsM(&(-34VIX0(a5 zA4=2Q@}je3s%Z70E5FJrjV8)!+1 z-U#jtc)^^!o}c&Wz89;MEFEvQxmUWW&(vj{B(rmBmFtU>OV5gH?tQu>Y031nZ)Z<` z{F7&;-KyF^cFtoD93PjO6zHsc!O5`Y=hYw4>nhHrPRofs^sejwxpy0l*abK4a8dm- zDXL9NGb`q^%ckQu`6Fs-tR`}K?OOEbiRsiEi}NMor+hKV+qEFsM2bOi@1dw0Z>Hr| zPb#d)o8QxPE4;5M=zP@0-AiXI5VGjAI3Ke*>QDK<7xVx4|4;va@txvreg62r2Vd_F z|NOlF{Qdv$j(@D+(s7-X?p4{|+;nN~=a)YVo2}}%-dU7#SnOr5_Zw}i>QaXTeU(=e zLz62NpV|Z)y=x4Te46=FZ0);;8{~R-AN6f*-F{oW@LJ%WnkKbUh1ENx%?@fAMRP|P zKCSd%-7NV;TO@p9XJ=Z~`k=Q3i(;~xV>fJXIcXdzvuf_`#HCCR4zCsYp5K+X;dkqg ze%bpU4Y#xOe$DJxXE`$a_3GQRwM*LGzndU^e&s6mru|d%|CU8hZgVy4`MEJ;vYm~t zJWq)6?98nfZ|KfBeOz~9A6aawZ)!Xwaf9c&IP=Q3 z#qYkWzbv!b6docKy68|_mg_6ahWc9{w6=%XD}H~tR#~5Gs%yT@EB)!&WdT>^j~!n= zNu?m@wQINL*U67pufBQr>z{9F2c6$`G?j4ceE8eW?xLBHWwEYcWwKZEu{~GCxF!nO zO|cg)4!Cx{-T3OAE2ntY=V_Sj-W6vutK##YJ&SbSE-#<`_S*v0)Mry`Pi#5*=z+g; zNYXjyy!j9JoS0;-`1^`XpzyyHe#RenhwV1)YKZ){^y3T>kzTGt#lg!o4fQM*&pA;v z&r!?WTh${~DkjtW(w*hAY-j2ya&P-{b0>$hgUB>7cQrpRv9C$fmp!xK`WQK1s&vWM z?$FYgH(JYm3N&{u5`Vl#V_j!cSiRi8?wdy+UESocO!iSk1mn|XhE1~1`-LaH|NZ%q z`rL>uCmDmzDsNu;gKNpOx4IWowl>c%e;#&?@sDTrt{8K%Bafy1MXhGfUH^Ig6ul7l z^8pOz?dsgy?mfOL*3Bt3TmNE8_17%Jc$p)OG3zHPJ#MH`J6+=b;BAwYtL%@Pzqb|0 zzW8i$bAM_Z&khxflbiRQx&KKsd(VOnBct6vt^{P9QdODY&t4H)bAudy6!-9OC@B zIWl>Af^YkA9bYrQV_8e{S>i4$_~k0E^tfsI@<^|Rki2m#?t+Qw1uFAmpgwLEtd~d%kXrEz|`17{?+m#DdqZ<<(RG;d0 z8ch{A>hss|%fYDg8{Zv@livNiGhXT1q=mORwlJ@n5jeSeiN7YNf=qyZ$%ahZl~K0a z7x5nJ_|bS-50LEzPfJ0MvW~!7C|AB zdkt0fIDZ#*c`B-y}E@a_5(YcVx%scNnDUj1!mPmV0rkXxz#P<5@x#JH2T$9D*CTxlh5 zc=u@^TjQaEtZ8X3v!z2rUFWj!9ouF!-={L}>m?UA_QPg5li$WoJw4-X@dv|=D|R>R zoX?)Ni}IQJ*{gd|%~DQSP^WMrkgSx-KowGVH$?X1IK{S!4G; zk7tEH-g@nOtHAKQ(czpru*l^T!Me3&aHae z#XB$TSpbNqVH|jL=M5q0J*D&p&;}5;{?IK0_5B9y0ExGg9M7`7hQcUl$w;I=^ zKdtz#WpunfZolZ$7x#L8IDebq87RY17j!wIuQ;-3j`EEovNy6XU9d=evCWrXKFjFY zEVfAbMN&e~WI5GOY20AT?y-&ad(izfM||JbU%?LQ8SNpVm*0z5WHq>(U&&ywa@o&q z>$XN^$Tlr}D^C;Qr#nR44cP@%LsrMuKMcBs6YWZjGG{4A-{8#s^+ORaDC;oQk zH0~g4-Sd|Oq;`9I$E{g1Av5juB9oq`(=QrDmi&6mUa-kLB$YWoFmlb6Sb0!9urX$7$#FO3(^XPY?FMe(fShR@O_+}@8mIu5E&X$=}}fjz@^ z&n(@lqXHg0hI4<-F~6Eq_C5Xollw>C{{NSMZ&8AaZ)Y*vb2+=u1yPB{_O>>YkK7mD zbmsOBb@>l_?!Vb~AhPQ4D(=??rMEYyl}+V8{`S$TKhMOs$Jdt!Pn-EP%QkS@#|`st z1jpRFfB$mx%YTd0Qa*}#-dJomy-%7w{-V%1MXxI_1vo_<9XV}(IZgQe_q3*?GV`U& zPp8)Bc{JZq_-pIcKl$wQ&F}a9eziM)zZ|33ieD9{>OY(B|3CZw-+ynY!{q^FX zIgjgHFPb+wQoh_zv@tH<_}u!6rL*F?O#YwE>kM>U`E=M0sb5SNsI*J^KU27B?~J?m^z!nb z{dl8wx6$HFc=n|kwvV^y&o{qvul3i}X;U&7JYRn{j7je{C_i#dIDDShgSY2S$)_Ga zdAZ3*>DBHwbMx-muaAoAG37SB-N~) z^qTNrwWe;tHx+NbJ#N343-k`np4i7K^&nuHUuyD&~a=o@mzY~kOI2!)iM z`sDs<$FX^FQY&Yp^y-H%YVm zS~ZF#l8#v1eBpYX;rN~%EZRM*r|NEVUD=m=Y*kPHgl$1*EUdN5%4FCktZ`Yqru1yc z44#H^dF~s>VmE0XcRW;Q<9pF@s_Bj-9_zajxu@iI7==qs=E{}yK6!rTr!amwUtVh~ z!?VJRmA|r{wamY3e^mO!$!*Ku>L(|PIW5vO%iVO6$NOzTO!@V@FE_CjM|I!+V0lex zc1!yPVRzM!e~QhjxgM^H<*1pG7(6}0bK3E!O)YkFh1C~sWZzwLy4aMVVykoFt8*o- zx2~{VzdYruf!XwZjrRV%&o}r>t8$*+`H;UlrnyDYmT|X@xUHCxP4dpK5xNiebWGXn zGc!Kzf!6LTde3s%G(;ze73YbHn^syWy@=B9+P}T}RHFX6Z!aT4E-u-oBXGTCtKqDk zg7l}euf%Q2ysQ@EcX4;%-l|)I-*bGOXNcxr{#nxWe!Bj*;D3NNPY0_ZSG^%3cna?eRbPhx5=-v>>Sl< z7tUWi<#UGUJdUEX+c$1~et3E&(`GN#yxyxt%vXeNd$D?#m+#)On|XzW>2A@$M-K%( z-W7R&hq{oVxztzE5bp=rq4y>sCcg*!kyti~p^Sr<$8sdm{w|otG3#Da{G_ z$NB!^hPF$(!>etm>eO@OvA1$0( z(ZRI)b)4#Mm!hAaLmz2w_I>{O=@Z$m)thoy)TKCeCI_y|wEc0QLMGbjkNW+@JG|zf zH&0mQGDY)~#QA$Hx|-f;C)UY!bJ!%tPF?mTC|=4SIO#RVqYD>`n%_KYx|$^Ioh{6= z$lLMVl@%VsSD1voKbIEYHVQY)ZvVRB<8Fgef4_IJFC=!ESe%kJp8DEM%YWL}>Ce{0 z%&mMkKWkcLZQ!GhXCFF`aHMxnePy*k%0JjNL(^T^nX6Jx`Rt=t!VU+Rw(?22DqNrc zJVwQ;?P50Q>y_fIRTeVl{O6ya zT`2QCawDTs$^z%_Y!@CD?01^+Tvbt0*6-N*{Xe-RzV4Q!>7c3q@Gz=F@Pzp02QJ zwhiyO6ZvZKnYTZ#pS8}^wp9Y)2U{zU7Bl=e%Za zC{n&D#Wo?fO~k9$LW2K-WHdwDI*SV{4)p&1HamX*&sV#TFK^%fWA*=6hyUJx^vV72 z%kJ0amrwFeczF5Wo*8lX@9nMn^~0sNQ2%~GZOM!Ik4$Vkl`NHiXS98{mVIT&Dn0q` zD!KF8CtrR3m~m-NK$xQMoJaSR4lXQz_^v_D?5&X16u)SheH|aZoY39CV6tGRO4UMx z>nB&p#@5MPIAQQDl)v9Vn(y<&6%+1S1+_EVp1qd6=IF#9y&Bt|b>A$o$T%lC_vFke zkLwBrwk=UulKIwi!>ZmXKFd?G7An4+ra$d{TJ!Z3ecK1RN10rtWaJ(_uh7}P(uq+t zt6OyA_Ze}Yx4gULuQ{PmVVYz7cDqXtE~y!|Tk$J6evs|RIHeJz*;m?;a_3TyRPus` z!#AhI9Av&b|NQE&?;d9U{jnu%;?eBl)2jYE=Q><2cvbYi+tgvb6IatdlUp&iGk=L? z&AV`xdts zz~m^Ex6gbwy?D1HB!gwbXNFW!6BVhKKaW<3u}dx}jg;AIyHzq&Vb$RaF5)Z188Sm# zUhWri3o=l-sqx9`?4hqGMNF4}O-#+``56CN=A*}%TS7;>=665i73K=O^Wf-jxzt+^ zC(SU+pY-4GaiH3j%Bu8oaWH3^tmc?*SxsHP`G$U zsnCKmsvK?C&h6Zt`XZ(``ws6W55DwX&j&YMeD_Igo@w2@wf2O`Dc0>70fj%$J=-z& zkd~Lrs=YVFO{T@E%nylBkVF{KEY6!$Ny>LrRyaoq683dh%6|)!h!ew}}66tK|&H+^ELo ze|?wfoY|2V3k2u!CeNCf@Xh6&!UErlFzqnDX@7Fwu?P7s@cDKrKkPzAkIR=W4>qp* z5OH?mvePDiO&?o&TOrVi=Im~&9;1f z)$XR!>gQ*FWop;7yEuiXhUh+>Z(W-C%Etar=Z}sB<;z7@Hr|Lm;GTN!8@Fc5pCJC3 zqNjSRuZM5mz5D0ew>2h@1bF`(a?7ciwer*}{Z*4<${xDzzAGDk`ft|O?|)x?KXtRl z;<%)V{OPu;O;z{w=5OD9_TJjsFU4fTqq}B-i>339v<=^LmMQW7 zT9;9B&^5D3bqTX~$&q~(vQrx`o<5N9)9Y5geWWzF^L>95&~**ATN+y3e1 z+vJ)Lr`KGc5&!nkdEWHe?=1=|lAd&yEc-BVR^sI|t7;9!NUVMAfE}sdy;-NF< zdjAf6vNQUg(sv_a{p6q$LAMiY=d+v_{8i29mpWnoqeZ?Sr#=Xq*z@VU^81snUICtI zk}~fFW=-8xB(iy>A@k8G8jH$nC(lcoAu~~YX06A%r;FlSu3kHQz{viI&B}_V71A+V z^qlsowan~)8k%S`@40F4@p=4w4zI-DyG_2Ok|gxlGfHAto!7s&Jd4%VI`6VK-|>6P zy$5$Kt^|fGNnXUUs8>(PvG zid$N1*L9l({@AE0(7dpLW$B?~MRO_@?E@pVE--ovGgk=QzI(V?Af*u_AXBrayhNVEn4C}69(_V5%fwjK=imSLb^p(|-Rs}Ag>PSCvG|ll&b<5f4}%v;t@q#Y zHW}Lque^L5FP08Yj4?^8>f8!3GIDKbAx}HGW>(}CwFP<$as;%9;tbNlm4#eSrs=-OXD^^Jg|60 z-l@8i!J9Jto`>dFyy89Q`u>9SgUSV;(j`KQ-|dLWpI@-aZk^t*Q{R-_1J9+$Tew&W zrRJ{}IDY41RopuH&IS2vU!TcrJ2IIu`~BJ1yTkSKJSyh-e>}kuus-a_t?N?zlq~mk zrmcE(gzd;Gw{%X1s{wgpKD@WjRc!884Erh?eJbT#=KHz*Qe6s@%(ki4$$mIrVzg_~ z+3SC}5`KPt^ee58H`k8ecS+|%nbc+XS1_*Fc052hgw6R)|D@0JPrWmq^kVAq>fqwE zR>>#ZW?JTj$}s%D6`;L$>!Yr_^YpUq{oneW*`J{#cz&B=@2mud&+L=lUfg@E*m|u01xn5mArbu6?jp4Mue{r|Pa_6I`&e*sarmSR@H4%4kExuXezFGD3(yxylRX3k? z4ta4i{nqkoPc=!t6_+OoyUjelBs)*bdP~WyQ?pMq?0v50v)pg1TX{NDtwz-r(~F*7 zy0aQP%M?E}oj2p>u{U1UQ0@DZ#i2`auG55Md6R2Sci-svtj(;L80_Nf=JfcvM&9fi zm#reZb{BKP#sc~;#av(oXczsWv zn0-0(i;|*Hw(yp=X5omo`@Ox#ySaT069qIc{%zuwh;31_bUZ0?cXnS@*v#)9)z2nR z{QqSBW?qpSU$zGVbZ$~OQ+_)%{cOE zRiTOZ=IL*h)IO}RWB=U$dg9#nhYd`(o>Kf)*X+K6v@owyK$3HZ8Ke>@R1gYtR2N>9hFj z<;T@mrM#DaX;Jw9NK2qZn`(5OjNYS|$*d1m=lm-YZavg9^}oys#)bOa>c=X%tjnit z&sgRdr*5yi)P1hcj6+{6T&^2UI?8Usf2il3a_f|svaU;WLQJ-NonLa-WzD%Io8>r8 zulljxD`>~@!%ghA|6>a0xy#yDtnxfj;{7<6J%~L+a`U{0xB4TeGhR}0T<^TAXL^gp zTz|guc?MMzBixPT{~ov`tGtctt^l9-qIa7^ZlCi{@+inPi+V7xvB&z{fxL2`-|3C*-w6gRI#(lE5+3$N3|qvGoNAH9q+D)MDoGCP-B2#Rbr^0Rn$ z_05-zt{k1liup!6JAU$Q@eG{rkur6ro$hjpij0~6_msG~&emW}nH}|Lp-+mL;x6mp z^|tDTGE;>(I$s<;ks78XbZEvT-}w)UXRo-u)^*CF>0*!KT1CS|^$d@sn?6d>4rT1W zHG|nnb*)V564yi97Rl7RUv~Bt(%gJ#rTgo(A?$~uJ2KBOUs(~$C0;p`LF94J9{!1k zu2d=YswZgw6Mwkd?PlIXY1h>{3llATO`1N|ymYNB;4gi7sKtY6x%l~mw*1Pw=f3H_ z^TA%;IcrM2VX^ggUC#-xX2w3f_(x;^-(P3V@7H|&_4V}8q{7mz6>;nK{r`AezV64% zmoI<5{3zM5Y|XFAZ{7Ss3w&~Z{blgYy5_^8da(>_7WCZ`3 z{yy%nC!EsyccIoiD)o(n^7^Ev=JdWQmF(*7qr7%!v%dORUE6R->fm3u$0-qKZ~R&H z>2Ka#)0wlhWLI5SCcCU!e!S_U)OKzkd6fxwR%LGtAao{~Wsn|K=;x7Vi3+*m`Lqn_2Uub^B)3 zT3_1JCHK0_EjrR}Qp&Mqb?e&J^6|^e@t4`NY0^!jtfO;`WDSJkB?%EQ7H8M{Gx z+YJ9avCXTGy6mjdyxYOI?bdSAV~^w(v=#VIz+*Prun@=*Pp7##gcWscy5 zAh&IA@)GsAq$j4_*?2M>R2 z#D0TIzhhLVJ@=R!#6SP}FNGTSC-Y=boVjlVG_y$-rKA+33r%GK2}o73i=JnFSd ze{0vBM$aocU$1oC3D&cjZhDcul%H{{oW+_ym&{Mw#jmd@40GSjwEc_7`kvFDdGmel z+Fg&c-4gifj5Sx&v^L2lih5xyIjg!kd2L?(h>3Omux+_t{=c8wp6;9-yLEP2p+`hS zw8Sd&GZTGEYx2*2%@SU!q<}lTyofF!yn#UlDqNVrmw7J z-wr;0)Y-Ct*DpCmFTSSzeaX9f`S+6ye(yLI)oa&q|1bBVIkTNwBjuL)OrBVfbno5# z>wkEJ_%^E~8~ZHFt9-gG>rlXwmr0A)2binP+g2O$LG%pAP2UY0i5!Gr=^70Xa((0(=OXv@2U`+7n@MU6&o}+vTn}5FG^h7v03+XySj? zw~+UaL8W($*L|1HQ+k|}4@dqfoo=(`Rzd#DNosc=vo9ky^2)W#vNE`P%RVo!vL~Noe$LFKDU}`t(#CghXI#?KJ-KuF zn$rRQe%@>gUY;^(f#KI%lh-@m+;AgT`OCCrR}TK%b71)colA3%XMR%nP@QsW(dsy( zLJ{>nTsAw6v#$p-S6ce@Z7yM)S=i~qg6vEpg)7xm_UDK1f07G$Mv zsf&>R5dE03HEs3NZLC7>>Cts14xO8Se)(D0-P@bx9ei}BTKZ>6c0PN3)0sQigw&M0 z_QlHY+HyBDwr!PSu&9^Tv|5+SBcUN)E0s$Xk|Tec9N{SuInE?;v43rXwe0$0vFmNy zXW8C6_hye#UU!0^kYn*>#af z^EY9MqF>t2oavnZ@Mo_Y&z+bc)kF5H3b**i*M2VAeW%@FiQBr%IcCoo`5ouJW*S(Y6}$Q&dms8$-*_BDbcI{(ep)BHM#=REZf zi8}p`ob=m$^T`x5$W)Op z_?>%uqGNLU`qRNVmO1%++gEr^<)6#Ouwh;Cx;1xRPntgE<5G#NsocL8NyV(+^=8dE z>4URPR98IT)+`vX)HKn4)t$h;O?9c}71b*vIHwu!e7$I?hs*l=TW+x0Yx~qENKD=J zXLB@1nb8_k8;vRJTxYg8biR<8))twOY1ONDLb&Te^L6#Lt$ilBepj;H&z)|}aaX;s zbpD6u%y@;hk@LKY{`Na>t~T;{VAGI(Ve{2szOezQC{Vx zN{Qm@PdmSwVz$GMC2Wf7w6m@rFPojpeGYtkelGUgP6@q5vZrFa&QICe9&+Jd@L~v z!gg3?;YFTiW&fPzy56jJx2%}A%FAqB=!DH7k4=j%^4y%w9=f?d-EzA7ywa5tIl8yr zCNa2*_e(D5-<`Dbn8stju)4aeO3fB!5(PFW)LH*63!-__O%$oOv-;aldju zD?dp%61}91o&WV|x#PiCYaExqpY#2+)RHs4vBm6dCLW((PEI;H)o0#qu8qZhk6-sr zm99vg*VccGy?5Je+sV5MK0ZC5p0?=BBz?(UTbHR!iTa~s=B2J2usBw%|9RFz7uKtr z3$>@OD{NFan3e9SfAe%xy!a)Ty^}p2l=wXHd^I(O``DsJnRfNUS?dqamic-k`C-x0 zp8ZB0qAz?_zEEG3Bj#6;_q=?i@5`@3UnI{T`q(l_=joKjDa+P;OS<#qmw~@sqTAns z=~rSttttL@BTg$%EN4sDqm?OMA&Hgg3s*ic$~(JPS2#t0&*fszx!@^!cUU%GnWHd0 z(D>ZTD|0%Wf(!i8o6a_+*_O(#Pt=`sV%3>fr&UT#tHO@Fcpb6wQGJ$0?#dTa+Ie?d zeAt>MaxzPGnG$QDC3mtD^Qpv1%V#Fc>wooG!{g2Lvv~|t?4y2eeDbdT*ow_hUROqH z*6lW9@>#T>^~;x?As?s7UpP2>hTqILy5|GKuGVpNJ;>O}M%u>qkQN)Eg7} zMHDYSxzQ}UnSJ#-&DVDPI(ElRii^D}-_7PzE>Q9MVzWQv?b6?hVslCpZ;NH5tx`>{ zaK0{iwd-GBDU$F-Qv01xIHWKrd~;p>q?T-j176$a8_gXi?tUP+0@xpd{kU= zJ)!m3Z#Hr3N4)PdrQ2Sv(G09R*0IH!RXhCN4p+mSvx2){gcN63g;=PE6)Kr%WN>>s zth;bNsm6KbQe> z{kM2~ME%y zRuMUM9v$@2S@6OT7b|4do4`ceB8rble~|8W2J`B$WB+m^oaJ;-{*AmGAPsjrGxx!ICB?mv9suHoK2r*Y#W1JS3d zEoKZC41@}`7baF53AC2f-;lnsp68$TqkyYnS$}-}w2vyc>nm?v#eZso$(dObbh4*k zEV*-OJwJEt6y>e1s~5<`-M=Gi-s^6aV#2dx<2Sd>&&$)?}E3OoKG(@J0>M^F1Y`juA062!Ap^$%Nuj+m{`^{YrWcG;P|-Aomv-xdbz~1C(e&UjsUd$0$c*5wZ+OaYR7(D3Z?5lV8-wZI3xDive_j3m<`WI6(~dKX?ZZM+CLf!7 z^H}_@``SE9czsJC=%n*`j;LJ5pKj)Xiw;rT2prb)B)F|znKP-Wfm1DZmE>K&o-S)fuSJDkuG3ZLmFe{9 zU2R|6+BeO)$YA}ECuh{QzI^p0Khr{A-)7Y=pUs>4*L6rv+45V@XiuEfnnhZ!G5mp1 zbBxo)FF6)yM`bUcy2Z5g6SF_(B7?pePi8)U`N?-rf%Y=)>_tXdC94*^eX`1_B!G2i zL;NJ??Qf^=@W^AY-hS$3lnIh&AP$m2=q^Vs$Z(goZ^|Z4+ zdVVwJa4gGP&iZKzYrtIXIJGs-Pme!cak25mx}-GoXIkAKx6Rea+_UA?q1V^su1v_a zGM)15c-WLsW%ZXjxw$#lj`j;XWL-H{$#n6~w{kOAutbN>WSCZa*e^z{nv)aTX`HZ8h?&}?~;vCD5+C^5Z z-8wHk=EhBR@9#$Cha>+M&z*hOwJVfG=#keB&rg$BJfDlNu?yRy;$1fTp>$eonPTY7 zCAm_3kEe?Kb9<)mnK0GOR(h`G>0HDAYt+x(cJcjX^dhFIVYS-r39Hli-pP62pEuRG z^3CN2bLp1~9?55RpXPhB>-^rT;?uQy94CDv))jB&uD2_1y^<>UP*Os|T#wsqT4hk+ z*DA+soyT8iD?dLf+hV_IU+w2-S6`d2&wIaaS;#BizBikc9>-^X`d30 z)qXs<+~s2DC$9s=_ul(HyUu-Q)8WMHBJF!#mM*MVDWF@vrPA?0!&tm&T?AG=l*baa#?SQ#lw&%VnN?#x=M0K z9h$izCd)O=@V}C&XO#1sDA%nbU&Tw5?yj(L+RQv(_|cT7Pp3<%ILgg?6r7PIH~HVe z75Niq=UBZP$v}tbB_J7RUW875|@c2(UO@y<^(z z!&j!7-75Ihd+W2x_bo{a(|4*qGFh4v`!>a>Wi`)tiEEj5%@#E(XVbUkrdv5ADy z5?QhLl(0qhqj#qq)@_@CU!2{8N4Yb#p$PMiQk3fTQvpq zG_OzJ@ZrrS8-Fp*GjI0@Eoz^>WO?P9tq)Ahp7pCJxh?E_7a6xcQ(xrdPtT&>LwA=i zIs8WN#f-GnEpxx`*l~H1uz28Vb}upW4Ii&W1}!uGT)XSM)$0}R%sM3kqAMOQx&Oq? zO2%!{Hr2mR7Hip` znEyM6{gWT_Iuov?oaE>mZ}+B8TN(8-1&I%Nq_` zY=5m6t&qg}KIN|3UWUlli^q+pFY(s!Y{-xM_U{z0&Qrh7LTA#$PoJK~8`dUsckVrv zTU~73-)zj6cwW@6kcoVBmhH^hGseq!TaDu{^SOK}UD)WZacSm`++CB^{(V`xbL)gt zPdM6wqi%j}o_{H8PixfE)I;y}wlC-2>*f<<9J!c#g5@**r;bn0>Gek3Z?xh5^wRZA zs*mD!sXaayx1FA4qI5*ZO!{CqW0uS9hApQubrqX~bESgSlf+Y>_w{=4olQBH64`FP zNl5OzNupkQdjG#3R_nt~f0_Eu&-xI>ZT?c{!LD~kQ%*jNF^CcL-rmVjVfnu2<>~zw zpXcZvs<+twGsjk4S!l8MNyYVBa(6uSp0BuE$%utLT2}wAtJzWiEXxB6o^N?z{3t_f zD`(rU^xroZ+Wy&mO zr$H@adFia0hU#tV@7E~$iko^Wys4Set2aq+k5uZbsf+*mesntAShn+8T!F;Zo3A?m z^~UVoS^4+XtE=82&r@$+%t*0uy7B1j(*piEhb*}+?g{r<{`g}~hq&VQ)&{BQDKQK+ zY$ER-R+*g^)e{w{QD0@$_5WGLp-Zbxf6E?KFi^GIvCH|-(n>jH)}MDP7SEH>_#SP> zDShzy8I{nePN_SpN{Q0Kw?vlOPF~~f7HQV@agv(Kl7KZA)*ejw-(CN!{?K!$tIFn^ zHN#e`?b^zGu34`&X!5Uq`;^yvu9k2~N(at9a=G_?%Dk%LvUeB5nxrpEs_whMUFdZ0 zwC`L6k7bS3J68QoJl{0a=`8cY>3R{Xv+}mQi7|M@Q1s&Av!tVazeIzR3R5yJT;F;) zaO%RudHv6}U+0*{Ak4N{uuoyxt*I=@JX|-@Z9kpp{(Sh`-+uf52C`?{_nv&oz+ofb zw|a5P_PJ6XCR-f5=WGpg<36=6@$2n%yK3xbJt@zqU9tf-7EnHU_wJ8pPp=kVpO+th zSMAT4MNM)>PUpQUzkg=0vA<(q)yE;WWXG?{$!s|+%g;Gpc9K4;UvR!rJ=H?q%&25- z?Q!j0(O)?kZ@yp7F~#r8q%&N+Z=3!k9h&pu&4tNdm@bNQH@#MC+qy_T?knquEqMp# z^>3>CI^*8O3Xl4qCwHiqYJcnXi*`%6_Pl!Thet_AFFM>(-|diEv+Yi>q=l^G+&JGa z%MOT6ym@O?_k(NA3eHOe)ijspHa>pxGU)HIw|7)oY*u7#i#<0t{Y%iRw6n&!2XYop zQ9l|XQ_IBa|Bk0!=+g6ze`9y7emb!_Zw^1lyz{vd+B5y4RfHCc@AR!%5t=YV&vtiA z-2a`S1)9s>*yz~I-5(p0^mJ+ein_f=F7X{WCoogdv@gt%a~1EDEd@WPOx&*dWFM#2 z^k&=Opl{5lpEWT?$Q{_yAoJeF$HJm~$@`p;@Q4Sn-Kv=Z`raRMp*l<;U(4_Bn0w zEDP;6PLVES3+S21esO2_v;AeuHg5?i-)UOEO~%&h*uq*t{qaPmnz4i@D!shj>IMn`}%$iv&mYS@&{;}Zo zo<5yv+LwO6l=(cxPH(Nvn%^@-jBImLEKj>xT@|)46xPVdV3P>TyuN<+Ys*V7UZ%M0 zy)e)A@YSl_QF&a8&rJH|y-ef8<10H3wrv-FJ*l%rzHPP6tPsx2nkL8BdHa4=XrA^Aq&y{k3Kynm<3hAj*$lM!FHJ0`2RG;2tbwRx)=*k)y4Fq}Bs@VvfYPusm;QYXKZ?3&T>`{3`& z4?7$$^>yZ|C97p7-4xT#5m@YXuWeT2=ctPF?Lq2oZXyf*v>!|Vl(Ct^Z{_+^%de^I z+qUP$^ebF>ll&CD9Tsk$dyPR=tTOYpW^nJL1?Lxi3O~9okn{~3mot=$$-F{8DeSVF{w}h1Knd)xm zCeKc~wt7vF-^7K!e$VEb?GaePkTP|?u~b}zMw{1NgY7~OjZd%E(2uG2jZ}X+BkA5< zxw9LWKmAm>vuxX>rw?};$n`FJ%-MDPWQob#pu?V)$EwQh=Etr+Ub8ImewMxap0;8c zjaJzR%N&b(U6cNwQ?<}|7GL(Bo1fc^t*effZT;>b z5L4XWoR(1_D$#aHQEu+TE3!YP@SODF$#G6zQgpqm>UzexTPku-jGuBHfBQTB@Av=b zD*{t4uqyk<8#`NUT5+URMDlf-y``VVi3oZHhfB+OySkreASUnE#4tvo>4IT%KkkeN8dwLbcDs5}3<_MiKVYyI3SZz}RI&v>^{Wcrq6Ir7u&?cdwYoppJ^ti5}F zy}Mrjp?&|~)%BmZ{IPg)bGydOuJ5~w8`aMW&DwhN*PVwEH~OC+t+_Y<+=cR^tmPsF zm;dgs`1t5)_w@1~Yvb3=0+5<#_efT60q+t_B;fv^a0o zUV8ELj_pT9Q_OM>&DwNE>E%YR%rhU{HYHtpbx3m0{mD0`?L7I|-=!j63d)BUPf1PFNQDn^w(?BlzjA{ztQ5$*7hCqLi4S8mbPeGUS8Jc z_s}V5&&m&)CZc;fPF?F+zrZgt;@Kvx{=gQ;Z+7k8Dbv zH%<9)vcb`~sA{RN`?;;Qb(i-fP0h9An)F3`nbN~YOSk&HSYlZxE@6B+cAwgEmhOE| zP8V6mm2mEqxqG3{x>zZ2t=k+K>0Kwj%t@SnjJtHjYSU;f@x_zwGvqH;5t-l+d1J5U zXQtK34GHWXu2o0t)S~CNv3=a*6j$l`JgD>7UFpoTSB%zQJFLRxYnEmW{%6SLFpIl^B|FUQF+}6SSH4#DcvVs~@aR_q@MaXOZ#U zDSxaC+y(4MeZ)BzpS8H-cC1_{b{R+P zh6rChk)2vgJ!c-%t~i!Z_mD4W-tox$E;2IBR{WE#&Ba)j@XQyiHdv9f$+hx?;>oWZ zlVjZq*)}UCv|iD-^**eY;lCxQEB3UOmrPUSsY6pYUSwPPLBQJ3^v6uo3r}CXH2Rr- zHdjef>==9P-ajG7W_uau+s?jXbH2lNW^;t#l{LwHdnanls(IIG8T);$6wHqR6XeXNi?rz<<(6e-ey!? zo*w1%HMGj_=F@klWUufYsq|=n;Vr`Vd>&J4hCo?%Wn7zKKlfdujw>O*uiw**b6S}y zt39(u&(;2W`(5|{XEyt;OK9q;3_dS)yy5z{if1}ExYlK9Y1%VCK4tpUW(V`s-v{2h zre`np3@M)_{f0R(!bxn+G_xnY;(j&PD&uTZFO_*{nLZ7@*>G0>+{p@4<4f5QjMFc) zc{)9ATiAP~dsWH*&Az7=IQ1{^$(f>Nc}Dyp$HC`M|9$MZEaP@8a)W-^Y}-{;C5<&) z6RznUXA$1lB&Hbm(Q$Ly8S4Y@`(|$BS#?RTUpMSZAM4wbbBecjewg86r~XaWd^^Yg z&E0l~B0_xvgLXz(*l{c^n$vH2VCnCfhDCe0qJ1~}oU(B9h+Cnobn<_sM(9erfZKKN zmYP4y4|jbTvg*WThkY)m4m`JA^3kKipitz}DMwyIUL&q&VSn7#`7GP4tr0sb^-zmb zn#=BKuNHjy=v3Z)a6-%T9ZW)7-D({!uJ~o>Vrzc($gPz@Y?&rcy+rj3SPtxF?-TvN z&Qt$Si?O?HRq2tUz`#$d+$DE$8m8)HB&1bOHwygrNaFNaw~5u;ewiP)y0kx`Jw_|V ztha2_4BpCakGP$`u9ltFZ~8r(Q_9XW<;ZpQ5VzTP=j|-*G@iP2o@2priF;q4Do7%^|B1}m5y(FZ$D+@XWKZ-R5tLOmV2b5+n3D!_a>ZD>Ha2{ z+Vfa()#9TPmB-$O=kNP{Hec;}u;h+;enPg77!tNAe7g4R^5wFv^K{bwX6?AC^Ktu* zYKuE>Zk>4aq2fwnAY&y{Uipo87c_LQ$Q<%lTCjdv^npn`CLezJVu@o1c6$_g?v~Bx8hYu{VVd5LzyE($|EE4z`VZ5BU?shb$CIjU zW`!JOsLt3N^(c&At@h3DXGf}F-_I$OTIi3zyELV{JLMK zkBf3W2rSlW`+Ks)X#J*tIfm(nt=FHf^LrbAjYmBq>ukoQ=sRD;!hh^s$mm^sK|nri z_1Pj{tN&5|=G;~Fz0R01J9t^M$?uPgo=-cZm-NAQj&OBAv#P&oU8YT^X5}P-&vvZi&f)VUuImL1@HXi(glC}(du*LT_Gji2*#8lGnDjd^tJO-xSJM!hU@*!Aq`NtNh=WF){we ztlZgaWWO|Z_&WP)o1gc(^Vs`*Qz_q^6wB2&CBq^NK0 zaGk0h$v06%MS0GpD0khvI&6IH556=NEbmJeUm(|e(0ca#qi3})n<%StxlS=meYDV2 zO3r!0lsv6f+cfpXS0$w!xwXP(>$04=51mgti|pa4soUYBT7PzOenX+j#+X?qoEKM2 zeZiw*9UB|}Fxx9h;J~bjD;d`Y=+(yOcd}c{72Zwq9-~Q5*5cPg{RJXUX;bQgx$UMYC+_UgD0YrmTIQ*n0R@{yUadU^m5w9 zX^hu>Rd*$Rp8WM?MZce{UBcRP>z5^blwW!OV(l`+*|vH4(#RU7PbL?R z&h=SzjhUO(#;aFF{by{7Ve*Dw(>PH z+7j`6FP~+$@Tu-wBhvdsG3%X;39F-G-l4_%+&4sZ9sAd6U4QrE(}$hP%puC>=5ilX()c?+*Lw0VQ?bZA zf3C@2vr6+yc&DEHAZh!};_)fAYBT43Cb7l+t{0B;Kbzh*v8?k$>;7Fk^wc@5XC!Vk zJ+e0|CG37HpW*pSDdOEzWj67Yt4Ol8@4A_<<1mw@jm70s*~z(6fTh#`R$nYA-UqEU{Mhzu+Dp zxsly>YU)f5$2S+EwrH3g)06SGmfZI8mepylBK7KrOb(96Rqb;R?Y*x)Kl0Ac=jtN8 zJvTNN9(BF_esS;=#wgybq^BR1VyYwJ)px1Z{ofmXJ*+n=R%zP%{cE3zb*Ff{(ac~H~alRudKIkMO?4#rS{S|Xp-)0Rv z^?7-^T(HqiTlqKDw|UiDROZP|f7Nl}i(dKt&M7oLzPzGt54%Ol??+G5{_e4UcWm>;s?Ra=zpZj* zE3&Xqaz0dLGiUpaduKQ|-Al1@d-i!p&5OWaQH;M5SH^8Wd`~CYS?ah?zEzaM)6*J{ zUw)hY_)l7+^}edQSN$1&yYJ`keiXo$^~*l~@s1@6C;7S^PMEu<)G2$`lgcxjQgl;h zE?R4`Imt-+akYu0MPTxcyK*0Dw;A?(6gsNewBGMY)a`t?qU=JNy}SBij!Kn88{bJ+ z3eRo&`7`tDo*2FG+h6PU-+H_IiS#=SwIUhk_@06s$Mq$}EfvyI# z{n9p{40tBIG$+Bry|9`id+O$umwhLtZL(W)szK_s!r@KGM}H3dMZ&j z>Ty)=4xIC7zjwK~TXXKayD5hX zvn$rfnM{>DlQr9;CuaH6b8?Svc81Sxb^UlVtoC_CPek&$bDj*EzYDuQ3&#|^C^=-c z-01t}?m0Sv3evncK1|G?s+axcjj_{G_BoMUYd%chzA`#5^4EkFjQ<};u97jlzC-dG@i=K64cdQ7ux~O=fR5I@EV%PGG zzI#8M(Os}AUajH6lJ8ecbBz11y!)CoXSUizCE@iK+-~Ou2`~F>Gf8Ad(RJ6iuGX?l z!iEyHi92*1tVlVf*hT{rzPnX!HDq(>_D4mzT}+wA7g*0<@qwT*Yi z$>VWu7jIQ~87O^7__M0^S2p`{wHfTGg_;U73BNZ5Esycey>U11yH0&y^NSr@?@T@0 zJN?$q<-6vn+P4d22`L`e`|?{!wXeY8_tC<=)lVd?A6eg-b$hQm)9P*`6pO zaz$5OE%UOgua=JHN3SHCKYyt}BWJAGh16>cue*2XTHaky zaM40w`;IN~GirB!mttEN8#QI;!j$+$LSdrbkr$Ny)WoXCpI9ArxKe!kjsnF8KO3g@ zueIS1S_!iW%3gTzirBQu#>4dZ!wueGA;8BpzpNbzgOQ z56dm4)T{^3!>T`iFJU%)Fqa`Ad(Wm5LN1TRmiEYnK8^e*z#$mCZ*!ZsDPNpzueXEA z=HLWf!8w^5#jSz_Y`an}Ut2nD(a|#}m*2X-%}7jUa`cPU7Qrot+_(H!+nA@%HDAwD za@LIXw?)e0FNJ(IOkcc1a^2qZE*~EhD@QG>{A7EXXWN7inw-0MHYB`LuYEJ~a@4ui zUw;*zlw7d2^Lp&H;BQ?|3UV6d7#=x#eu(XgkqkFAoH;9RU2M_Mg4j7FO|FRxZZga~ z`8Q~5O0DD0&`cMb-3mKXI=OdD+p;%>z1C`;kDK5051#UJ^W@~@!aeqyoLb_s{noK3 zg>y;{-Z^KVZd9UIowY(lIg?cRqb`GRlia$e9z54a%zGI zgXEi!#tMFmrOo6PUjMbH#x1{pMy4ZApJAba#k^S$d0qx={gIaU$y*7y~%-dt_#y2^;dfb9WabisLOIQz9q^mq}$E(d!qlN z_51PhcRc#|rhN6Z zr$1QE-%3{eAhh`9l2gBBC;v0f&N;xpd~fNjw>zi$X1i`zTc}y~^7zK4x}5pJ(>M5h zu)Mg^eRfjxW1CyD`+vO?w>Tdt-lO*Sef=NVU4OQh>$@}WOxdWvH99|R_hYf^A0B;M z9smEJ{Nu-YVcC5frTU7UW;mNnv#HCNyN*3o{>iF%^f!=*a{r&wq{y252@VVkw0OKQ<;A)z$Sh!-j=*G>vDsp>nSa5&?@ zvw*v-hu8LQvSJq4x@J?GS;?%s;?qvtbzOe(rwWhm4Cb7~rt}Rn4=-Ln)j)Z>jyr>; zVK~cHo1Y6K_AED^^gr5)MQv(Adg*Sf6qkcGGMPyA)Gri0AueflPd#Ubbxt*pLU#qN9zdC6FMXcas;T--KECIz&8(T(N4>Y~92OHT=Hvk=%w{Rl}*lq2=zW87Yr1%wya9sWql`-l7~~ z_IbINW<0qg8OYIH6gOi>ZrY79BkRo4Kjq3VH7EEicynBRiThr)?g>|$?))#<@atD` z-_termvrkY4Zr(bSbHc{&0AZSpCR^-=e@5%asL?C@tzF#2`kYm(OI(mufo~S+)ToBD3@6yNX*Im!Io-uCj4*VaasHu(K28rJI*HwNJXe;!RTM)l%20UrHI` z4=d*1idio4b6Ht)P}X|YHF}P6%=(Aca5pT|NZysHViPN7>*8In&-S~lBVk>_>)kdSYj*Ltt$S4b zrf||6tNom8o*$;)P5i86skBr3e(Uo`JH2-n7EXL5`LVQ9F>p(7%_7YVrafM-A8jsC z&7M3#rS`*&jG{`n-u5G94_5|W2;V%}am68N&NE*PdFKDTx>WVm`GXr3db;;sk$97% zIE$T0-uIWy=5qlGT^hPR%XaQL$EO{cwmC`YQ3KcF=HFk<<7@w(y}rGCyYkM|grjyg zHuko5-Q1o{tDc?EGdrR@)&A|cenq<1a#~vzyKLF=W;earYbM?N z-Vtgdo0R$0<*QD=Tyl_avSmZg;X_tuF9c0FqG;pk%&YgcSn$BQz&r1ZlUHq4_TRGP zlU`ubu8dW!)?s^cPS~I2zoaet^21J_Cx$zH^lZ*tUL3RWkVW>)xPnLCH(6FY&3`m! zo&A26MT<&T9D|Jo{CIUKTyPE3?gCNq8zJUDyTewcuY4vKw&W*66?b6n+I8uH>Hnjz zx*oi0G_~VP>DwJYKE&uV%11k;Zdv{HWJt}jLmOEan}6bP*eW)I`SE4>GWP>|tJdvS zyLlk;UqWw{!jwuI{ic}OVxG>v>rNMS#E&yR`P5KzAkkkad;NsXm%J~&&@;Yaw0dvT z?t4eMK1i1~%1=$b^G?q{+_AVz$;0N(p(i%)Z;BUwI2pV)x{WDvY53(`QR^njpL&}3 z>eS&U_F>)Eq&F%o{LvSBsL0#Cx1x6X%4L&T3TCFBG@rdS;{4i)9|{b&9(?HM;ASeo zdTRsIKFej5+m#tza=2yxPCi*;HNW@y=R*BR^@{a#FY_GiZeMh$`_U3ly~-7JCMS>D zDFk)$w|i)OaCJ5cd~10kW%u#NGhgU_+;T$uZcdHBVwFyf)J5_09;;X=tGWry=xMvm znP4T;9@FmeK$Y1pm%oEA{{J)UoH^~k+t-{~QQ_L=a4O$C+UIz8nHZ`02OX zc3pANR)!wq-Ln<{-n3aeU+%s6_wy${i*=v;lT~JM#ozw^`sv^9;&;=28vPOx>>2l3q9 z|EK?dV}CSL>GHOw{*}C1?1hgVJ8PtF9xAXoAg^evwD$j%j7MTq!)JD^sbHxPU(|Wy z%GrN~KRaBR1hzg^P1V?5EO+Ba$?TZTe$!UFH>@%b*H2%pZE~k|V_;0z>U(kl*DjT8 zng0D)v!+mmjbf1X&HJ|$W4_#|nO>~o`EN?j!&U3k%vWUf|K7Dc@G$FNMK;On<=bZ5 zxpyx9(G;0)6R+w{`2E#QM*080yXX1+$ha9ZzHo|4y@w4*+KADeex6_&hGd$Mj<*mP~+t}w%J1>2Dd7-Y~ zmrpE(!t=!TZ@$m%9KJovVv3XOEuEySRgJ7`HVet^s8tVQk>xx8&f|ATw)5iosuBup z*W+E*7|vLg**=MN6XPO?@Efo z4gDwCmRZM%%v7vjxLNI5n?z8ATc%cpbeT;|`x$$-sdE(90HacKb5F&obUHYN2bQQHb<<@y{)>MKV`8-mi3cb!hg* zyZswNLjPNCuE?}=W>}tW$QZTd$nU+~Q}vXZztkD&JBl+sFZT?#{V2LPr^A2NkJS~y z4YRkGUwf|&EeMC zxjJ*s99EC{%oFJmbVb><|L@xm{+gT(JeO@5%O5>n{(F1={l9-cSNmq)NVq-Iq);JQdF`*UMj?aY4;Y*(21PQT6Er|NfeT5CPehY39W467ena9Tt*gdDr_MvSkNY zq{t5nv^3lG4o9N z=ASiYDrzTwoeYahQe2cymv5JUwWfMKuS^lc~`sL4>$Frhr=L9^{ zQ+eeVa7VMlHv7WfOKM*)>~=YE<*Uezl9Xfe_Xu=dz?z zeL_>j8y)K!&3@Q3o@cFp$aJF0B1`N@-#g>?HaC{U&iT_B7Ix#YzuHR1bZ*Ucy*8_p z=d?bHIi=ghA;Y8eta#Q@2Pp6 zpEq!#hT6he*Z7j6F1FNioiCr|IBlVkHTT7hQenv=i=q?f3Hpj%+4WxMsGs>N57~3v zKku+T<}p&ApEvh5f1Oq286{5XveS2Md(P&~v`|`Vy7<_S5-z!TcLn8LW|0ZLj)gls zie{OV9G-DewLB=R{m0E>fv`z3_u4`%pG4m9oS!^pt^xPH7oKHHc$X@r{&=2wzUp3) zyQntrVSQoKlJ6^CeF{Eao9tyEx%Fh%o&QfX^(&<#CxraJ=6Bbr>N58<_h(1*v-yrj zzk4b>Te$L2E3*bq@@EJ6k5<#CZQ^-&XuHh(lYDFBI(I$((&**d#+uP;9y{%*hM^l=+sg_~Jh zWp$tJ|5^U8)yH=FJALb14Zp0*EnN}6=+FK<3zyvQNJD507Cx(`pV zK*ahB2M*>b+-44GdHvi}j(Pi;&S!k0=Uex>RZskN%0%L9gWX?23%!<2F>caUuIaLi z_8W1Xd;f8V+Tp%w5)W1@y|z64|8e~%eL?++i>hKc4<;_r<_VLWYucyL`-#~!iM@ZL z#YLq}PKWKEcQZdfKXLDaWyuibaSt~fnScN8ozSBRn-zb!?%=jBKX+k?>#W*4W|L1cuwQO3m%qK}Wv|wk&f-UE zJKXnPUw_XhZSU{z^FOS7uD`6`|NZ{|5A*l`{q|mWU7mmSm(}LS-|W;iJAAUz?DYC| z>fz>}kACf0{;H;rfo+HQeR=zP^*=tm{QJ8deJt ztw}Q`yr@`xMe(xFyD7^)Dc_E@TR(69#Zc=VT~A;0{FvN#QF3A4KP|hrckh0E`}SVM=9k89C~fbM+p&ExXWGUNEI(nRfHX9s3J6vA#5$ z@6+zJIP<=_B)`VKRLSC^Rr5LzGa5b%ciC0C-lsUPxLiDRF?W4YyKhxSiOF4+e z{7#sg9Iul6_2k^g8(%E=;q$_3^R$t4e##O_%@rm{|Egb7xc@+op77Z{KR+4;+u!7{Zq8s;b9rs-AD{ zd^uv}EyL-?d%4R$7Zmj;SF;W`78W3EDzmpxM9XUm z3;v+0nI3nqRBYDw{jS3hG;2j=7UP#&ALeLGs^TtkeYDwpUa!!c$gHtIr}A7&phex{Sx=(b;XwIEPd0%v+@ij zcI{IR4$rrr%h>O1zB~Vu*{W6F<>l;aYL>+L$z*cb74kisS@iC5t4iMGw5&;?{>ml& zPnoiMoa?k=c10N9vDnMh&86+7yk0B&-W$`3Y1!TFlb?3EUJ350Vz;)QSbi$D(u=j= z((`tnc_~7RV@g-txqD0h$>rc%yZmby=Sx*B*89RL^)RhP>7{7r*OqdTUANR$202&ho^SSKhWtOnAfg<;K47{VR5V_-Wi) zsK3BPhgT~9KwsphX}yujb6=a7SFrywn|tTdbw9b^hHJdkik-h^&Mfl|+i5>X#D_0d zXi?e9xzE{V#|!&QcknRAl-ZqC%RQIrws+#(Vx!tMruz?nU)XU_?%~!ip{N&rXZ76aHOY@e0WivES6r6wMaDq*$qMaLf3l z3hN_Q$%2Di4+T5zICNWoc%>b_xPSA8f2a1&ymC8VpXIihY0=$}Cwu+}E$cWf@!dAC zt<6?F>F?HKVio(=DyH#oIB-j$$78B{YNfB7^xEA&UU7Qp>Mwnr#>~?4?u=YhL7?T_ zCq}w`JpwJON@Tdxne13}rkgo=FE>2O%O4r#b@7?{l|+%Y{Z>u zGkvkTX2lI3MLAzZ*4{6wKU42V=;sz#GyQA*@@`v7(8XZiW!&#}PR?F#ZuQ~n*Q17; z3XL^8XJ4N2eL=AV<6WkGJA#ovi)Z^UjjVr!L05+B@0HEMWg}ekShH z{l~3TEN|cOIQK?I&|9dc>`JdmY~+sO$aCTicFR5D2 zI6b{@G55AixS2H9@=JW%RM=R+i-&vrs`(8&f4>R|cGmXZy=aEgy0ATIC$jiYFR|Qs z)OX3`Cw*<5leClieU>TTd9?L!^NO&;Pv0=83ty4uf0}sfp~4r32i@su%Pv_@H&$m@ z&Sy}bKjEvEq+n33S8V2Ora5klB|VHC_FYw8u3c#TIA>qWeS345j~mt^X{ZU;o?MEQR4<{_TS$ zH?H0MQFbx0-aa=Vg`Hg{ABc^`*4)w(iy$^>6d?&ZFk$}c1<8FgDY8bWy1%> zScla;Ne@@4uPhEuyV`N|Zi3amf3ME!U!VP)pWpuBR`urBH&fzDj6zqpED@S<#=ZGv zP0`h0&Ysprcb~)0_w<|bhh0hAdVf8CipCkW9a3)=oULkq#(qupu11^f7KZEo{vC(Y zKSgM*YgnUOc-rmn&#R^PruOsO*H=|^=PW+=`f%pnDBX`I?(g}<=lJ2{$K}a;-}QgK zxMXI0_?MZ}w4{GZwpR(Rwp(33ccyD<(EOmiPrj~SFm1Y-|2zOHqC*+xp-9*$Pps%aOj`8S!(C4)0Gruhk@I6}~?1{@#khw@NIY zr#@wRewjV*>W}wD>gyf{8qA)NuP9=8!_J8cT=_0+JlmPo9wpweZAwdebz;`oz;?0yyWEil77fbF8R79 zV%?LycijF>p78!!h>3}C=_3Eg64q*JLYxvTBjzyNEaEYZK=kjF|zUN$rtD>KH>rL`gn zISX#d9CP~Xqb4;k=Oka_v+4&XO5fRfy%zrW3XrO9>Cn5&6na+ad;Uq7w-VD0|Dx3|~-{_8(m_qnpt_35Wo)pK4XZ@hge*)rVs z+2NNp9p6;^U(*mu-3b@7v$8x2vfNc|A4#PD{gy z8Og5f2kgA=sM^i?+Lt~1*q$Ga7gNlVgd;3x{jFaybyk4&l+zmp(qDhd{Q76doi*lc zOSyYbuATIH8O<{AE6ToUlZRYkJ}Ims<^&oW4(f4Beh=du6$y+s>t*i@CQ@M!%}Qd`}++%o=*g+{SSj>Y?4 z*4uGx7CU&h+_cdA;3F(zb6+KR;{#{s@Q@23Qg4;YYkMEr$d%7p$XAkMcHCFes`QBV zdeH;7m(=~cQ+-K^fs0cnS4T#7^2}9RUQ~ZlKEk)%)Hd#T(d$XtEi#=*b%sw(Z7W zKNKy<&64+7((WQ`yF>Zf@7O3Osk4_VL?24azF9qc_3GD0MSpK9)^WLc?9Ii_+Nehs zQL?5M-L6iXdO7{&dAD=PmcY?t`YhX-7q?A3knYj6R@z`1q5u z#rIA9Qp(<3*}PQpWs2Dm^Gv2An-)i`ek)&Q)jRX(B5vE-pO2m$Q>mjF5@w^WQpZ>eC{pd2C=_bt2B7Qd+PI)lWYB^_+AVv9ph`0PwvnY-ahf& z_q|GAujnZ5JTb3GFxvE=@6xS2?K6TG7JFPsys}w9w*O61OJ2jiEnQKh?r>D(>D=323%A=zG^Uw5{qICRfzZp^H{Ia}2>mdC}!p8e=MYxab=DLno~FD^=OJz4ZLr_gk^ zzFX79k6WkIGurK)oOzJxPHWaygIBA{7YDDnf871Xn@sT#4dr~Vx6v~n@?Q8jn}_lG zTKV~M_I4BVo#f9R{8DDPcisb+GdHz$8}=kJE}pulrsBxWy%m+Q3pApAvSi#=+j?Dl z{EWlo?a|lM@2;$^sW|lT(!$_iq2j2R^XuQOV+{TObpOBNIb1=XH|>l%xus+M&o6&I zd=q}Bul?_2#GeTrt`QYSW=(u7*z>M1`C*{YJKHDUtf&0`BEWfU&LSQ6ShbrPa|3ug zd)JFZ_KFF5Xo}|TOpOZLI(NBw^@-4Ap-^l;@EckcXhBX%zBa`)& zEECq(UHIL7|L^SO&-?S=?VEL0>~}1)#}X-#`F3>{bGGR$`+V@~msyp$w~LY=_ZYWb8JRyCFQG|ALoR{-tSqz?s$=XUnFzcGQ-qt<;#MZMmHa6XkJ|S zPVh8qx*gx$57`0bn-j85JSbJUE-&5{)8%6~%bWFI><0CQr9PXg)i+B|cGPxunuR>CyH>NkXX}Z;$dBJ?Tl(&tU222u(R{GVM`h z^|d80KO9Z1@Rz=^f8(E&nxL6c(_%b}z8;XA`+W0BrnPSz&u?~O;>`Qv5b-qdGa zDzi(!xA1JY{4e=Or+7xq;wfj^M6`~ak1TSVqQ?uKm7A42xTBUZ=*bzm7jrr`0Z z&J{1EIRxsxPfoD(opm?hM)9U%eI?`mD`k(on65BN^emEi^>X8>YpyLRoxIsEzuH7- z&pv*a;#Gh7%~xjbr@nsfT`?A%=& z9hPz?8S!nsd1FdmjNQ&tF~$+o(kC4;z25Rt&FTRAtq&T>(h(7@Z+A@jCFyD3m-1kZ z=ev2)FSRyJ)_Qp8Kq|kw#(rN1gJ$pI;MTZ}RnPao5qadIo!aM-&0tn=Y}UI3Yb|^4 ztfH396D(xnkCYs#_OG>it=5*~;ivxi_3EQvzsA(cZq;i2+*`=MEoy;p6XTMEceC%RarGuPWMAnb1 ziC2ybZ{S!y=Rnu43lCRqI8(55N328ZzQ502=kNO|Wy_VhQ_X9Z|EH^ue=-RC`}p(c z!YT&f_vWvS|eq>CUo?kbsRQ6wT=7IHZ6xqK#3w+JmTV-c)W&5@wm)HKXGkEKY z{PKQY_@S1^I_=xnvr6I1t{$1f!nFQb;T+F3qGAgSEq7EssQP>~t7SsTp?z7bM;%jyrPQO+y56_n6Omd)=xLvq|{#R z(8~ix7D;pN8qBQTBe%>|UGeGt(oL@oR<6FX1Fq(8*sGrvabdP9+qVV3E4JiKTJ9RB_MYpQwvrb6>Qf&V-D!57!^e`; zprK#6U`_bzuSLB{`OW5q7gpGKG_sgp+q3y(#=$4;!A=ET4>wivtlhv}*7kNz-_7l7 zr&@P1UY79Zcr#CpPp9PRek-MEE|(siDDPHEU-=}&?e-Hd1Nm8u)!r#*8DGx%e}bXE ziFMD~weM>Lv@6v#mvwv;leD|ywb-Y}V9wn_yX-nc%KRry=%(UP{1J83(XL`=HK zd$U03ko2Jmhc6x!KK+mH;eXbfeWxsbaTx5jO(?xI>BZqH8_Vc@JzT~L<=g6?m+4=s zie{g3?#j{r8;8#a&Xo6m7;_+_XI<#?%0-n{2a}$%NXIXG_I71IY%E}7D~q7mj>L4O zgR$#2$nfR-oVI4m`+a*4OK%X2@=`kasr2{f`+K~PIXP^);JjvCTX$#m)pO5|F8A`{%o;U;9huX#;glI{iO<`(vHh~=1lXt&7Qzz zS2o`=B|RzXr0?D1YcF-kUs-5-r^zn5N2PG3V)RpSWeF>pt;?O?9u5-8kgbuDby~c7 z*0*UodLOL+Kf3>azlr*m3y~(wTh>oWlkJbN{Tcu7LwX4i8)CD zcWsr|9z0o8`<3Y=|Est^VqLTQ{#luT)JFfzI>;2k+)53miYOffAac1u|`~&z5c!ldkK%9M!bDZMf;ph@#p@XwEyMa zeDKY`zn{LHeH8!y|G%qsTlenXU0o5QEPeR1&6`>4>wfYU?Oe{^-@W>1_xkvU)AHoL zb?-j8{@=sZpUb}gsOz1^)&5w9Z}oHLwSSg3|1JCbtzG`xS-A(>+;o(ab1ipN&tP_z zTG$&_utQ^!l9yh>`vb}M|Ni-VUcRo{Vx5Wk(m7|>#qX&yeKGy~YW~w#fA6|^UAC@N zS$o>#9lv^|rUv?JNwA%CZ^{w7dZlpX+VFsT4=(vVQ|fX{ar*|hc4>!8?^ti2j9{Kw2OzoZO0_Qp#dR-eQuUQbB9J67%u_R-+Q!PCFV

    Z7CxT68C80Vqq3YeosX)hELZA3 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

    uvg}*gO{wpZN848MO1$n|TVOQ* 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%0D`tGjH9h=(Tqn$}%R; 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

    Vyl*7VNWc+i$$Toc* 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%0AsPkFDzrZ*qVz8dl7mtN(5m9$kU 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 z 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±X;Q(yP@G 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�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 z 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%0Di_wtdqVUwrYJU*`WQ$eerlrC&#n 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

    y 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⁡G-Py$9#n{X!<0Ub7PDFQu%F<7B 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%0DZiPt>gk#jF;|}+O1L=jZrf6m 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 literal 0 HcmV?d00001 diff --git a/xbox/themes/photorealistic/assets/props.png b/xbox/themes/photorealistic/assets/props.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7ffa052a1ec4a086fa4c18478b24216fd5c0d9 GIT binary patch literal 912828 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 z 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�N-{s;q+^TqY_qKt&w*A-Z`_G*HI`8-T`HD$DK8eR)`Z`a|Bxe7e#JNx3ed{P? zTw%o@*|R!ptz-A4wN)52(x&ntm)qop?A*wh)`wSc4c+<7t@rMal36< z6e?Q#mH&aw+4}U)@4nbrf@U=T{|a=Fvv<2!``xhg&*`w(QZLbTo~%s3xon<)?Wf5#FJEcby!;&hq}PA{(Z%fi znM)j#PdA@#uleyN{fWhytg}gX=PzSgwd7$aU-|uR?J#%UqK)6AwkGu$Ebn}2;jJlo zTPaiH$c!UqPVC`otjrJ@bu zt3obh^(?VW-0gNc=0LR5?FBa<&X&8cwEK2r;;gN!CKWq+ixw`}nz8n*=KJ4Aj?V%O zW;7gC`yBhkR=5e-@IF?RvEA19vE;Xjf3MCv{MKV-=Z4J8J;|FR zmDj4S(Y_{mk!x#8hF0C<%vgmjjL|Gx3aV=lzk4aTcG~Cb=PrIa^=i|htlh^<`z}Pa z9X?VrhqKl>;_H;cldBF!hO|l;f0l^Mjg~6hlG~mym1nmr=}vFSYSFu?{wF&Vr-!Ug z5;z!DWaKR;Blad~{!X8V&K%QBRC(Cm%YK%ad7Ptkqr2fXBe`^eg&D_gExox-)ZoxMP0AthB};p@5Yeg?2R*2DCY?eK6-}l=C{#*Rp2p&teMw zHr%@`<(ax%4rWtL! z_unb^)a3ggPX9l8|Ev7J<^S(J|MxQgHrr2|&o8%BJvwr{W54m{*V(?i%jHjBHlKG( zeg9+kOY%R8_kX(l{rvg*_2tjP-yCzE=UrqLQFv_Cm99d@^f|kDq_2Bq%Pw)c9(ik@ zB44YGI-j8+`wQvgS{1X-T`rf~$ku##8>8uiJ*rQAPGxTF67%04nYh}$s{g%Ik?XMWCK6{h|0-A~itY>&cAt5=I_9D04b zc&|-#r+7Q(p>H)u3+EcF6L{`(PWYUr?~VtL-YAM5pO7D6-dH*3q;tw`9cO9Z`vu!_ zJr7R|5nd!}ICYWed+T58RF59{dY8BTu;^ox#JS2A{vUXchQ!6y&wH-Vz1B46y6!^W zDhaob_bzRBGCZ^@J5bx|*a;IKCEuklZI^~Unqb+d{B?#Q)9QOohAj#+)Eb;a9E}rt z{VX{%1LuY-AK7T&`m|!s#@?fn{ejLIT89mVpSyhPd~8xMBVl)L=1ixa7>_f znV;+9DNmoh^RvExX?=K7Z~0@BWkJv4H|@IdPrv@`{|CYQAKO=cTDt$+x&Ea4zjeB0 z4|Mix|JoeqKj(*=v;F4}#`V8H&*hRl8x^`V*7Vl8)gefd&@ZjUAW9^opF=vn@w^n1B+HqVe+qk)ppqKv#kApaRXUle!1L@;`yIi*VjzF z`%W^5ec#u!`Aa>XzPx(Az&PgR>FN3zH4Af@W_OD!73{ET&{`e3Tu+*b^`=>*jsz%~V=n=tPOUmTkHilrTdmOgqFoS@`wmzR>z}?+O-gJhx<)>zPe0og7UGJu7CE zL|yl*Sp%B-I~W)eAW#|f{{{cQpYLN$@9vl5KYX<2MCRVT=~p5+51uNKI2k-O?eWUc z6P&ZQElpXW!ntpouzk^E-7aPyjNypIDs3=`)pUFQ1td8~r}%o#@I`sFhOZp5rvnVE7=ej0OM z$TE|K8v`bLc};B!@@k8k@l7f)US z{u6^*&mQGUPL$)C#l23Hr`057Q&`M~CzU5XjSfyIPLohp)9K9lEb&phec7ph1_3Hb zzo%_}E4eVYa9`p)rO>HSyv3^|(ogO*@NZqlJte~9aF2w?&PSn|hC<1UUPc!&K5L4Y z@w}&$ExqNV!Nk*x?szAsoe_M_YpMV6mG6JATtnBM!qfMywUcl03-p7hL#Z7*%K=r@w#e-d?+!|J@? zTtRskL2XO*kF_g~DLgjtxBF4QC_cabNAL0f(ns4#Z z@W_Jx{}+;(XSnbG8~AhK*Yf-I1!X_~KKk;z?6c!@ncUZN-p+QD(w9;7)i)vo4HUXyGlSc&ue@+cr)K9^cDG{!XD0ri}N^Tb8lL zZaSJQGvg6QS>U9%{MBoiD^t(f^a-Xjt<6-qvEcB-SqtT6oO0wnVZyg#;baB=%Fh?e zJ#ODkFR$=?u4NKu|Kq{xM=a;ewE4_8zxn1mmp^A)pZMhy(d+jfefmu>zVe&uv4@{K zwobWN`2G*mY^L_)NnKZW-!-k7u_XW8%@)33UA^)(Rp%|<8YXe>HF(EY^Ye84!%z3r zcigzAewWAQcS8HZO?lFBd-kX;^(tTA>^bweZSvfi$2i5MY9fkv+9~g7JN%_5{rB@D zA3KbB&o$iW;*@+J#c?Wc`{5|(ONUB4HuVczscpO6SNBwcpE-G5(w@WS)1&b1;-PgLfoqAUtvoJh2!FyS$SaU$o(G?e}o9(ktT25}$SeGAa z;OfWc8gpd@<{y^~_{1Pna-Cvv}#} zMorhEH68jA*@9OqNAF>i-XqHl+O5L-(3H%{$3^f?|aqDpWQv)Fn{eDYtbwIHJcUYSO2qQykRDN z%wmJQy0QP!Bc2)WD{q}U-90@pKhM4LZOoVMw>qDD?%cL2)r#0G7JB&Mj16lSzpvIf zwYfiTQqVKu`@h(HA6NYR(s%gnfv2x+Lt8(yM~giC*>3(O@BIhI9lPxwG^cOP{PHeu zO5Nq68~sayQZ~OWowryf@BJ04{;x_0%}?>13%8YHcjP%1wTAb~FR!%*y=OjlgsDdK z2YK#Hnw1)mY{7FSXi2V(SK_QL34JS{NRh>%EZ3vFf=)?zZvONp>--#{)%%jAxDOiy zda1g!i-|g}a1FIxlUv};o2KiDWWg0C+2;#- zCde%OJR|5v{8^UuYqrbk&zJkDxlbkk|D*Zq_2+9OvjF0d}mzjlXL z`1oUo?S&JjZYvky{=J*CeF0PZYR306?a#}z=0+ABYD>*l(2j|*T3cuxZJM%Zun{4g8E17{~ncZ zS^ccv`>Oe}zcT0F#YWvPy~6QPqV$IEC6l{JnHK7|t||Lz8hUT%TBUl@Le?;-^LS6L zP5Srh9>&`eTW^Oo<)73n+;h8lhpiC5SNXn&pB_pY_6hZGerBn(H@R|_);hs!>9Tee z*P{8i744DzaVp&I!K<61ntfkp&pYit|G_Q#SjQ{~?|ckj;2tUuDVTw>wfLvm@k%8ShfDl66lI5Av=VrGzt4y`7?Ei%{q>Tuy7Ob+8Lkrz{R3TGW(!X-t=+@`|tOj z-`RUsy}nrIX}pK3>CQ8EZm)TxwPls%wIt~b9(OKm^Yv}&$Izd6tG<`o-D(x2~o7rv=~yVbJgG4e9AKYUKvUFDl! z9+_lSw9oQz`-0b{`h};SWC~r6xVvu7oxAs5o|aa0S2WRGzxSI|`R{&%M-{Kn`gi(B z+eUX@Qmgx<{-102U(s_M{P*_wpKM)yci!%Y4n4*TzsKZVYk4s9(Zt)2gXQMzJ$mz} z<@wVSqo(e=UG#pFtLqBW;yLMknJF{az1FV3*1;9AXX~CF)oxSIJYCG*p|z;n^^;9% zh{$W3yFaHL(~Q!(XT7H4-8W?`{|nnvf=`C55bd36<65K@5!+U+wc%D-j?`fTl^ju7 zRlTywq8byHFEP~KSL&h3bA6_z_z?-S+YbAqu02}zIm&CH%TmtnAb*1|x7)5+zgp6x z8CZPKYQ?dFD>HMr)m8+AbZa>W&YJX5Q191)TM^IJq%_`)TK8$YurSF+!)=JJPshrf#|Tx%8<6ucOvZROWG%eHrW&*o2G zmRZ{aHCDM2eC%1ex4zqU9WD2}c&b2W%A~?;t9W}G zmWF9;o%F~-&%LE*YuU*|p{m!t9^YBLva6}|P}<{@M<)dRi7H#|XDQ4-bxq%_63Gds zPJs*Kx0)OixO~J!-DS$(#A|jIoQfA%jvLKVTCN7#66yD6jKoK#%bnW?q=Vb|-~+GXF^ zgspa!o<5p-{O;#$zVdRO%M)#+UNI~*zH?X3AY#|H$(3D4EEk4|YCqbWA+stZFte$Z z>+pn?qFc{(ePr{M)OY$YEu`gfuF!4Exj`v1(`w$=iDpFgPguDt!X}(mu-W+Zt({A* za-NH-`B0&AP-2-y!PfmxZ@%U3)J)1=y{wBv=~!162UnDrRb=YC9}&e_cWRkG|M-~9 z{Neb&ssCRjJv}79(siG)Z|bY<&##$A2X|kpTK#+XVhM4THBxiiG{gjEPh^^1nlMjI zvQ02u@n{ckBo@vM#+V(Cbu3V3_#YmUH^N z`>(A!`k-0WccOUwzSQz!_j$^iq1)17IOT;0~quKmn;nOcDQl_-mRS?Put%RM%m?#m|F7koQrD_8euQvb3} z0jXPGyXJ^npINv4h+*-Lc^a$MoHPG2SN&aj*4ZhOX0|`p?siL+Qm?tZ@g`f*nkP{i z*LW{Wtkk&uSuVY$^!>~v6+hN=Syjdl5S`@m&;&y;{qD{}0AP1gY zX%EfjwJpbjMFW;z>)Ot?_LRvvi|mDZTJDcqLazq~yJaix%j%f6=*5;N++AO%OmW~2 zoqqIcDW9MOpYowes#7*Qx=g!2vvlJJovEu>AM=)-6pPC7b`7{}bhcOKx$NCl%VVoM zx0m}o_E_tbVY4%BrSYr12d%xkTBmTIlbql*hbvfS$IjZ5t8N$6750^%{*t+tHQ%;D zBzVh`tVcErOs{NvpF1n~oaOFiy#GIK|9hzZ&&&P)>uW!$@B6)5e)n-3GyjUBs2l!s ze(dZ~TEE7Kwe`5owB`1nuGD<{U9a+YqW%BZ_bxuDKOS+(cCBG-+1&Wu3P)W0T$6kr z?YX#)cS_KX*-D4!oQTq3I}$Y~pCeH-H#2CCRoJ@4eWGVu%`A?^XfAEgT#}e@S8G|? zyKnA%mm8OD&RA(-lfL?Tp!yV}%incPxhq@tMQ;8iU2{2UPSKtB7JTk2E%fASyu$Ck zo|LZKep@^2wduny*BM$G z_8DjKEtnW3lFch63W0G73 zepBoA@~ocV*!1XVQjBYeK~Q5?m8xIoq$v-2SBaclIVni7JL`o^hoWES?LsAKc8+CQ zZY<{Ezm8qbw_2C<=$D0J$24dM9ryl{)S*NBQLhm#wR|u2{u!?9rNwlQ#Ptc6q_H^~{w?1qY4#JA+uC z^Td9zNVe!%tkhw+>WPx7drzpS>815eeU`${4<*_!$SSxu`B{&|@tc+IUZPtb>`m?K zlvo^-6P~s9@Cw0f*{H6G(f_~h+Y8#oQpi;CiRJIx|L+`U>6a}#m2f#^$xCS;LCL;} z%Y+59P25v0+{|vXEuL0##^mm#wRZ2=a^_cjIoTd#fA{0T`&FmZ_Zb)bJjS}&?Pkop zmD@T?=5VZ@wl31JxApaO=FD|(-W#cH`LoBre%2QGA0JM~KRS4{_S`RS&I6al(?cCa%q53l8Zr7M>3QQH$LClufF`)U2~0od3&?@mH&;I-hccv`L+F%!@sU~83x~u+>3?NuyJIuY zZI;M?dCp2yWG(Asmis!w4Ua!^tSYHhSnjevH!{AgWcGooy9RIEf4(|jvtqlxy5Y8? zGaN2g-%@)Z?cbw(ta4ZA;a_ijHi-4ETAHG$_51e3mj;uHTEZ=}p7Xy;*0~bZ5&Y!U z;psE3DLl&f#plAg_QC9FbF?(mo63(AKKu1lcKZ7GPY?c0yZg0omQu0Lk|keei!ME6 z6P6n$m%OIOoPENPz1#IpRt8S}=~m!-u(fI9%!gG6EFCqDL}Z*}eqHLXJJXWyO5+jZaG+O)sVr`>vsThE%4$*y|@s=RgixE&Iu(mvVfOV;)twdi;pv}FmG;d!3p zjDZV7Hm~@f<+v)zXKAeIloh8%(xTQ_^sN;0-g z^;+8@ylY*ukM2qtj?fK9FSPK@o_tQzd!BICtNVE=S?jtRyEm=~nX~!JYq{w>Nvv6E zHt#rn+xe$Oxq6>v$v-+PjL$ODb>{Mp29w_M%X5-MVoPH`AO8R6d+qLIo9nwQRtx_L8;6|Z`+&Jx&gEHPxmv84E?-F6Z4KmK|)=Wjv6 z45ee%W~&`mv4(OVeKdFJw4+YH{vG`mdZ7Hl+0*&ySJ(b{@NBuoJNKAEiOo&NHb=$^ z#60*`;5*Mv%WHF7rcKI8O>fT7_qlQ#KYnk0)^S?b@cs&Z{-wD+JfHopznyuc+y6pd zPha_Vqv?_T&XX#&f?$bpwZnkgwc#0Q2@p)`hezVF!SgMD^mHEacrht&in7i< z)Fz|7dpGl6t4{8u$0keDcK_Yy{_dar&-;JV{p&tV&pFXAuYa^@{qykOM>>Vo>&(v2 zw-;xa`pET&R#MG}CKcOropW5O)0bv4mluaDoj%F-b30Shl8Az9E56_3Xp@>OwsOrm z>z`BVCx2-@G`;Q_Gf&&+)1v!|&lF$1ecN$a@};+Xr>?oCoz*g3zV?WL{LP%|wSFqH z?!Kyz_bm6iHb?ld#f5G2Cb=fB%sF5EEc4Rtzm9WS=WMP@=Va8hOxBiA@80cuGT`l` z+PKwL$(c=sebYIQRPLQg8m4`*I#DljbgruKu#XB3YuHGh5ep_Y?W2K^e6R z;!RKM@3vi_wCb3LP4}m){L)7t@9jHxr^e!x>sK?0{JHuT*(bLeE%(^|t>s)`cR;pl z_afEg)WD$CQCli{JZ-9qk4l|>o9AwGPqFf-&DmKd$uS4oy!OA$tZ`rKbyD=U*^_%0 z)?Z%}mR|Ga(X6|l=lE5^-{id_;E{uYaOscs^pg%-e3Q?v2JBrc;6hl`GzVc(n1_ z#N?$Z9m|w_mqxSJ$V)swVenRU8P6u2Qi;P#yJqjdxBdH(&Uy{dk`V)uspazfwLj>+ z|D*BM|KElGKijX>{*OLA>0WC1^K4^2 z?z)Jz%#RI~UI{4g`SU_bUZ+=hUVXv#Ii7P;XDKVP9IKsDxn)c4;eR*#4*xr_yzXIi zOX&I2%gtrhf8){TmpR>d`uh9L_o}{yAD(pdIcvItJok0|^%in`73q<=*Oo+hKHjo| zNjD$rFQMSux%xG8n~$&8_O~C-C11MqWznG;pOoG!Q5&yau5$0} zOkA<%d~{R1n!A%hx9!Wk0}+fY8@*0?&6>`$J8F8SaPl+xQn$SHs=@}knzu)}Y!Hs)rW>+iJGLs#?!(}c|$Y=&i-8qZ=roXfbp=0?}lj};dxeY$;n zi!(w4xmIdrq;8G$RLqvy{PCXPuLVgx()`Y|LgVwL{vY1|^ZK9D@^(M{=l!{Vulo1i z1HX@~KX3lyNT+bU`2VH5-o1bHad$uKgWmZ6S8D#J*Q@;d@c-HGe=8Gi*Xve%=3YHz zr{Tff5oZl#p03INnsj;g?8g&VE!w)mN0akh(vgQ*$Evzdc5Q82m;EuRqj=fJX=~p{ zSe{?QX3TB3C4nh(*2Zg_Y@;7#%N(ZubMy;rWx!maXQGua906vGRB0^Yi<3LY|)8e(y=eiX)lR@_#;2|9bOl@iHOR zmfmHCr+@zKeb&G3>(kB4AI%Bgd}`017h<U%+9PysNUyP ztajCD*237eFL(cb5;7xOb?L;P7K^f0TuaDh&hl_pE8)A(_Q+uI(x4+7?w{TD&c;{Z zBG~P09KHuDRFzI4CM#Tj6}U za*nagyEM&}0#eGeKZ|Y+se842{~4RJF*Z9Aq|(d6*`3~7)^A9yuTI%9b3^Zk2VZ|n z@cjPkaC!R_8OeTSH{;I{;tR_z3m;$Naj-gNp0R2A5s4(9B`Ys{=SvQ`G{;bFb8P9A zWYwiQ8&~udPx%~rdav*5ol<=59ez`*pKGt-&~!awa%F~LZ{l6nUF(i^rrP_S(G(2f zycVs;=qTS@`RTjeYQOXAg+T{5x%V@D`eFFVPGG~bYZ?cwlr;>`aVWXDELB+4WIoMA zOr&|`)S3tvp0`!Lvsyl8J$m$JjsVa0cJ0caOP`-wrs$P&M(};>-LD?|xk^?WZ~Hs# z?$vppKkM$k>;3Om{LlKJzUyc{;lgOob3BV=}3^r(t>Tg zIp^o71*<$ebM~}TpVsFkXSQpdamu(@*;V8dd9}(jcv_IqR<3JOAyZ_ukLjel=z3p^ z_3A404$GORb+7uDZ};YTQ9O^Q7@l)9l$aAXHI>)ow9&GyAukv!{(Z{~d3xmdzvf`YSojN(ye(%Z>i>= zGi$rRWvN!=^<$ah+15;-Ez;+I{^h+UnP)%e$EWG@i^^+{S8cv(ZvT1E4zMP{K$FsJkmHuORubX>+ zLXhIQiDgee#-2axUjAmjyhWU>rm5hrY3%tii-IaYerbD{m$LQaoY-}l*K`k0*zxa` zW2*L#x{aJGcN+9gGz$M_&iqU-ac=7G1y4V0O5HQtKw{Rm)I4J;nQMn1K5g7xxF93x zZhqw4uPx__e5_Us^ytXj}zTk9!ad+S+p(o^0r2c)R^oUWy+yE zXVntkOj`PU)zQukQR`>4FD-m=*yyHFzu;PL!Sz#mvUOJ^&QemWSQ8skrgS=Fd2yT8 zArqA~A2mAXC|QPP{&MqtnLS_mh+gwdr8Xg6&D0*#i2T4%FF&8d4qG;fXa@>7XGpzT zEu(z@M{19;v!-OSxaxBm;mW=(x)sk?Yz^2lLCNBIWPaF+&~LkCReN9U?cnYUVtKA> z>6+!V*7T9nfr#$S^D5=0fA`8f*>ys2GubKY-Va;RbsXYPVbYw^c6Kd#lg zzqs@MXL|j|{GT;HejX05OZ~3>xBt(P{w3?5fBy;UlXL&IHoN_v>HVX9|EK@+_)}Z| zEBxQA-1~oCzxMrnU&E?@*5<7W_qwEnRaT^0ocsDs&uhx5tlO)uYeg-1Eqh5ntX)%V z&h{_8?pGehHm__uJfpzp$eNgS<|eOAn>B9gM$TvRJ~uVSanps}zxVvSrOr`z`s!Wr z9a8&Ugqdc){h5?GmCMFuh3j8a`WZ4HP;^=HSWv2u$uFkzFfuQ zhv{2h%XfucO}ugXa=QK5)8g@=rTGH(f0XWjdzSv?;@|C0W~~2Guw&xicU^@ck7O+5 zq%37GvE|mMFU(iiPruGLyJNTi>e?)a^C3ainm%F?{&ovPdT+H zPwb(CYj4nrihK^;8wxEK792}XcehcSb?)*uK3fe#(NA-x>*ah|acI~34bhE3f|EUk zW-jY2T(u(eL*fys(6H zqOrSE99~FEyUZ5b<`^3ej4~`6Ohc+kxmU8XMJ`nzwP!nwuz<7Gk(n%=}28 z{>So;7;wOLSz3ZB*ud}%;%+hr)D^4;tSsR_iY|tV6ORYgmQ#9z@7T;z;jrDpT zuYdkG540}a+>)vL_fhM9Mt+gSmaaV=Su1y}Q#9dwFMKI-Pe|5Elh^~I+N(=fFPdkf z`Yic@>&?QCZ@>RMve*3uyK8rI8TVJ41?9?$5}UMwXJxv6yeG8$Ov#?ByZ;9NeDO2< zOVQPnPu0(Fv`($Jy}-6QEBwqP)9#M%O;OEi3w>5CQ;O0q4&ifFRbBd0#!ZJqB727R zru9>ESnlhkFN)%kSfRC|sY6F|&9MbcvskBgZB5wAIOUX*h{mcjpS8D(W*45zx?QnM zB}g;0C-x8%W5&KbP`mDbeL>cp+A}|+HowaTZPVeNZ}|V``@hBei#FGOaM5~x{I#L^ z>T}ZB5_##It3{U;?r>Y`*O@rOAn3!vfZ|1Bj%$>cY3y8JXVH|ea{k4;tOw7Y`ki|7 z|>F~ zZ{BR%+%ElT%1OhMr0!?B>+65Tyjp!U|Bm}7!@{4(Br~%(e4S5u?S3U@`E8Z!=0qE{pt+g5rp-}O zRbwgG_w>ypA!(^&hdneUv!!D;OnG!--Q<=mlXZ+b$6G{b-8 z9+y$SVpVfFSoE3V!`pmkQ#T%%Gj)wa+^jX0;cJBF6!si zX>&jJS&DhdeN=p~H$KcWbVXp&xmO#Un56eq2|mko;Yd(Rn$x*iKvQ5;u}Mw2J%Qf2w)^${-|oF1oc{iK?fk9R{_lJDdRN=rC51;K)RmmhiGJi& zTrnkR=JTGyY0KUh^iH=pcSPcB7Hr)4yN8|Ns5IpY^{cudh9y{mb_LXWMt&@jsmE{#~@noj1?o^6zW;YNefDPau-E^rlV-IiO69)pja@sps>MnvsAoxFX{vPO*1lP( zo#J5`N0Z-NvQ*<@^qwpB{PHsX6>c{@RS)Ov ze!1e1%H_MVhd%@q&*HH2@HCdM`WjqR`8CmZ<0*^OV;>bt<#tBZ&iNgE{BV2xLW!rJ zl1~4AU)!k}7BY3;PWAM=%(c(Gxds0m)}M=8mad)|mXoh?{X|~< zl8LT5R`aAsygsj;r(mNv}V|T;r2NgXFrp`&2C8XsQ ztn217>)0z9VG&Vr9T!zG*B%|)^`VAt8O?#sj^3gRy96DxRV}(DnvVu$DV}RR`poRo zcV6F!U9VhPLP`q%Ry!xN_O@=z|IoY8uAfi#n2%%OH6@2rqFIL|1>SpT8uJ=o(vJOb z=6Flz)U&C_x$nJx_q^=Wi@S@z?S1^Il`sE5#KLJ_^OTQSY!TU0F48zjYh{?{S(!{@U}`_CNjq{OkXJh5zLFeP8dCZm-$l_vi4V>2~HdZ?7+Z-YKm9 z&(83ehu5pDvreMVJXIr31W%LES}3R)7+D$}`87Qtign47u4x{c3{IL_T3w}a?ROR4 z@BQA>|7TbDjWyBp_SL(0&AfWE%Sim&b@pS4Db@Ryr93@3+5OViFzNe+<=c}j+RWE*mcRokAL^XE(KqOUgK#!rUt#N8~s*vW$)RcrO-Hq+p_P{ z`UlMVYc3iIAGuh){<2}vnxp17jN?3ER%I9BqU4Bg+;rG`;dv2dGNA|gWJQl=shn;o)+;UNbGRqQH4~?<ReEcnb`8Vsc-+lc*%lMn}XMy6|U)J5v(=1k9Q?=_X*Gkc5q2fdB zO{SvPBc3f*%F=K>XqEfRVgE~y)QmpkIszp@0mD9Xsd`*L5cSHUyIcH zI9*>{<6YDip>%E2j-_3S(>n|WuC*Q8wj;sP`u?P6r`~;(J$_p@({F{-?z|f@YhIe^ z9@U?gd7o{Lp-HSm;4x>F^Q_k;@2py!cG$$-=efbP3D14@bDe2FQ6QrkDe(NouW2tc zR*IgBkC_;pT5fwG*W5zdGkM_@F9W_S0bC{G(LJRpT!x}udViVUE@NiSVma%rvUDrg z(IkN)zbP@1xz=j}AFVN2?QolYjrfs>Sr;aFFAOud7ZAK?%F(qq@~!xOGhWxp+x58c zfVGCmDV-w`nbQ0re=aR|@RFR`k{>=LD1b#=X2A&_*Vb*HJEDqCZt-H{Gj)sg!>2H zBxavB3;6&pt%*TOlXMPNUMk*rE<%7giXrk*Xm8<)z#zRVK?WMvSa)5x@P&8L#2HHG z^Vrsi#AG<~_}=!Klb)oL<+LzgO1s$CGVFELclQ53&;Pl&|L-yWy&voUok_R5{6T7} z`HKBQ^FIo!*ZF?t{{5y-@Kknw-MRfAf8Xo*e`^2t`#+zoiv6n{`*^?g+0Q0NJl7(ZW$fzj+ovy*RMAjwy<51X>%p1_J(Gf#mh)a?^U`~g^Wqxs!C$GJj=bx{ zq?j|7^|W678MfN|%_9fF4aZg)_w9=pzC2NX?{~T1KRVK$W*+u3iY%7eaIT<7_!!IH zT{~2EEU;86mMOV>fBEF;GcJqX&Rcv{!b`T)DsFMw6N@velyc0Y_14RscxSQsw(QP7 zCuY6Az5VOn+4`rwzwh_l_w(?7iS;?(ePj;A2OHbe{R(x_@x8s$^Tg4gGv)fLJvi^@ zZG9eY1;-&-}soboqbyv^kiK%m#TRjipY7p_*GH#t-G{mq1r&#r%e zKHL7E?f)z7|I|NBy_>yWarwU8@nUr=1InxV{pbAn?ZUGxX-$VLExA*VLKE0bRciEgV`QfLfrq?9$ z9j84 zt5KhduH{DiWON*#IYld%A$0XQ>ou#UsA#Emn1&uz)ASTw`AB-brD|k;Q{J|v_dd{<63v$(C1TvR$YnVIH#i-b}VplYPrUpJ>@Rxr&rIfX-vCY^z~DF#h=aP zd%i#E^RIp7yylwpy~>*y|P( zafiZt0o+Go1X(KcPOK2!64tXhYxPne(XUe<$i6!>vFTBdx`ltnnpF|2R{2;qhHll; zI;P`XtbEI4dEai~`#0va?9O-C_iWSe*1X-<aFGSDsov@92%Jb;QtGYHeCdz}(WAEA2QRo_ZH-BeUB5Tx!-h-^i zx16@Aen0E*VrzjH=d7J>7nE&PT3z%#MPUu|?9=lepB2p3+4ud9&E3Gz7uy>Der=qi zJ$tq3T>cib2Xmf3+wu6Ob@`Uw^sQMlJ>JOs`ji{*baN8Fala>HZ9w9k^jV?(AE##8 z8^04iCS7yeNLF}TXw2h6yAAj9I)am|{7kg{ubcavPu`NWE@HWb;gSf0YeMZkn-5jp zzRYsEz&dDY0`C-)=0jDFH6w5KGw=S}=(|7Z#`y-LckD$zGX3ROCapAWZWZCaSGg(e z*Vito*PBw45^YojykAHyI~?bwH|tS@#PK{S0p`Ma4|f`fJGF0?eOkG{Ut(eO`uX=8 z($^G6Y~K;+6tKx{S)xnU(j}knuuh!kzR{*UVw%b-&*WJg3zbd6)_lFSF6@Wdgi8}G z_?}F%u-^TsphM=n`4NlBi$ovKRhn>oreNyc*vlr~?5;hYpG3A^)A5x*QoTO+e!uW-@Z==)`LYhKh&sQ>!C?!5euPxU{X|DTKh**O1i z<1_z{%O9=W`S(a?JY!vB#rIpU*PoPLzkgl*$ItV(&ENn3$r77Q-9Y_HyQ~3!TP| zl{3En{oxXS7T ze8u~d!td72pOn4iZp?*}>|=#0ST}s-N9b;y zw^O+MG$JpoI#b-ZDra|Fe_g@py`TGzpJ(g)?b+sh$!TfsU7_&a#bFCWRG;@aPPf<= zv~-Er$DjcXYQVjjr#gG{rtQ9|EHq!Kjzn;-o9W}#~)iORe#U{DX&j2Z`7X< zwDsBw-g~EQ(t^%hikA|6zQbDT%9bA&y!({erAoJQCLPH-#hT2!ROH%ihwZPvzI!?M zPR#vNPn)%EZ?ButH!+9#cJAq#o*fB0s~+}LYS`5M=!p`#y_(lh?cUEz)=D9^*7r~R zd$-^!NBZ|Lp6%{^y9HnC9E)yC7Q7#^_2A^?g4bDgh3-C*Ih{x6WBg8?*p;RWi%%)_ z9yN7)_R(REdfVS4(^DR`{+3-9_A;t}D;u{*W7^}Bt7P~*H?NZDS$FRGC6%K)7reLM zJxxn#Wk}EGpw(ArZSD|Us?=0-Hh1}-r0w7ZopXNt+8EP3-#s;Ib&&XaDZ}YmbG+7u z_DJOROkEUNye6qP*-CBRUUAn+D<)69V<-9bXn#!L^E2)CAGMC(macn~Upq7Z=QaON zjp6mOa`g+c~_iL9vQJLJpa@fXwnW1o#Ypvs&prt{JlIAe9 z%@JMe?Qbq-qUkD{<+|D-a-UvB`?NDV>@Tgg+BNlf*m08v3FX&cy}lo}J#4|*6qRk5 zwPnGot}Czn5APAae*sia1h8CO&sn~H|F>Ox{(M*{lUKL9nD_sp(qFqxmup;#yq)hd zOH5Yj+#ws8lb0K^RC2ifdM&+n;$hzT9q}8h9x{Kq%^Q^%Zyiu9npxrFJ#8ICP2uiz2}LK z?|JhF;j*{c)938nqULA3N>u&Ou9qKt9eOtHjhX1~DquEyUZ$V7yU*(au4~*&Rr>tZ zk2xnnjXlaJMz70nkSKW!=bx%PZ? zR+CKnoY*A!{uwS$No|)#l zwn3!LS*=9ud26K~&tuubc{_G+eEB;|L|7@*%WszVQlE)lN=8X*7UxPY;ksvPp)In# zqik(H$J%76^i^qV@~?87(QFni@|qQND5BetEyQ8UB;`Uop~phHVHb`%2XZHA?>zIw zV)7@K$NeU?n^TI-&HFTK@LA{nrBp^LPC^@N573xi#wroq8;-n|GJ*ySOd0^7l*L>%SfMeZ3l9`LO12 zokh`JYlCM!oPB32{V$$*d)9HeiPwG8OXj_O4%r7JRF9vS!nHShM~3yDl(OVQtDipl z(_^jGUKmt3t?p{3m(!A0bCj+~1}=9DPbymMsM}_GOuA=F%U8+O-zLqHO;SE*HtXqu z#9h}4=iT`7ed+7a{O|o5mXlsLY&~@I=TfsrH@#D5^_OIKhaNxt{r=U%Kc|NZ-4phdzpNHVWHor z$?;X)fyPRQ9^a1U``jZw<9TDI%tpC2tjYx&-+ruX-O76{gsRC09XpF-&W_!i z_RAW&-q^yJZG2cyIQWTyOs16cW82674m?~Tb9`pq?GxVm`B$wb-hRFK$duCEoGi*) zdR0YLy%nb)lHm?hc1k0{>%7m_3 zV48mCv&QL=sk;-GZJ$@V{h3-HPx7M7>ADv!rZ4UPTIsS}(D{DVv#1pu$2gBKkvY~_ zsZdJnnhc)N#<}{m$SiLB>hEj}(?2D%pL#RJe5SE8U`L z<-7NaKdcX%<^Sh|bpD?+{d>QPwas5|XZ4YP=Ko#i`IbNL72ebP^*D##xGTG3xAmj7i50&Mub%j(S>`m)=&_A+=&WPPLX1mOmWW(oU4J!gX7ZKC8z#?5OEUWP!_0VjV|VG% zuEf3Hew;Ht?y*x_WUb6|C99R!vOHdu%Bby`>lqxH&hp$Q_WhD)K3<(sT523!uXatj ztneAMwy17u!N(1ke>HWjkl1Xoc;zB3rA3>*?7OP8XqS#dR%u1^yuF*2imb1krD^(V zay$Rc*|O=gjpy0!eD?m&lk=Z^?|<>M`?0Y9VU#ncwVeH}$&b5!-|qi-@b~-&`TveQ z|G81VwtF>u<7)Bkziyl_Dt*82nYDI@>sbAd$ zNxM$pc$7IiF8sA_So4(`0-9ZGJs4l}n2H~X=rKHXvY`Bt^qk2B-+52zi@c4i|6BU^ z;QRlM6$k9sy8S!8O=9k`q_FSRzl`-~<*oS4wN?2GM=Cg*MHe$R@Cdbjrr z=d7!$*FxIv_RT(Ser9Ds<$t@}>qatt5y70k3&gs!rf%ElbA00Cw;c;4v`cEe{Y3BU z_nAA+M>5dd%;9*sllDzp6yff_SWnbJY6N7VaB-1D6U^(eEH|m ztqWa-0nd6kGJJiGH?ERQPObD0Ry=-2M*W6(R?rcRtp^Hww&W`Kwss{J7y6a9U0`b} zU2#Z8_?~3YxeQI7$3B-UbJj`l+>;E^3SOmg$|U-h@8M_rj#v7xZ0!~Om3X#bhjNK_ zmZ3M#bn&_E%BJdT;_q-|o)gik{M53~y&mwDCi{ylm9?DPDpgnK{k%>L-V=VyQIuFOC3Ms9KQ zl0ADj{=0Y8&HVM&%9`pc>F4?G+@ACC)YZ1XKc=W}S8iV+@jkM&&(iIg(Z<>ANxipr zIGD9QG}tW98+$!T%RuzzocvPZIX1g%SItyP57#eT-RfR>A!Fh-^DN)?pe6UqqPCu} zVfj_6e{G$CX+dFrcd_nHiCt;B_e!qxgz)>e&p1{nGrwp~-jz0`!m4BY?gV*XbDC)3 zFLfyDl87kxs*bH;zqcLlOcjk1T(@O!m8bdhy*AZF348Aq6z^6p5oka1_HAFxwKZY3 z+x_PWUhBKM?fT}gS%PNwtKIg;ZsxP)m%n%7?%Ozd+q&+TQv>(^oxRWZS;V&~rOHMo{jkzsmSdHdpWu65iSrdbXO;%-Iauv}s`GX7B3-fBvX>`xBs+F5=vDf3=cc6g zJx(_fU*U6=M;uPF9-Yu_@LqYA+pTMxGo|*vv3l1oI%}$-3!iGCIq#D#FY??Lq`2lR zz2w)N|ImBHR;`V*IhO_((k>Y{!{h8nbY_EKl}gn;q>#r-}wn%{Qu!6yXYf7 zrhA?7%{5X#nAQ~@@$~JBJd!d??5=!zmW!G6`pYUoE+2Y5=5e>*UR1=kuCV38g**9@ z#~Rh&+diGjzehoTU&+yTWfykOZeDk7ZclsXGSfNtqm5;auD{pU)cYQ{Yr(Qp|9&0# zJ3T(hiqEF=y6XJ{6=`@l~YntokT7yE^*VVISeBB`cp88oxWXv^jN+h_6NZ#z&dqj5;2g zC9B(3v1X}$>8rb~C^DsMRl=%+Y~C3%fx?RpJxe-!R69HCT!O6cW6pcUH~4L8e@k+# zdH;P^y_Ltj?pw!Bi6}cVUz04-d$RLU^WiA}?OStZiCt$a^Dn>gpz^~<-gb5OXNt+O zs!titHAX9WT#3p$o1qsW{-IW(uTZdV)ulDkCgEo?1UCM-mMkMvep<_YciD^;Ys?yF z?0>c`de_fYTIckg0-ZK~t2`bn@F|8P*87C)=R%dElGiI{oqOoi%-<%%y|1|Cfu$VV zvBxK-XfM5XblP=OpUYcjg!ZV5Zx-1f<=jK)%U)ia?A13jhAZ!G!0J=) zzO9U^GMlcSl&Mj9tX%hs+{bC_vS;=`7V4b2@b;RH&qpdOCKbDwE{f>cdS%I(RX&$B zRNYr`{H=1`|I)DRsEumTteMZ5l_plsTN!$QYqhWcJY`eA4BsoON?x1(-L-g0&$AOU z>OnIn1btjL@od^+FIE4_o0~SW89LpLekQSWN>{_Pkd1FYe^1lvS^6UD=~_dxzRNnk z^8bF`|FhBm-wpnMANc>t*FAV_f1##PUnlVnXeHjS52n}W9{T=w-v9Qe=l{O@b8G*1 z+x1qD|7|!}6TQ|dTCjXyR)lHeXKU8Orp+xeZQbq2NM zh|IZU(f^w1v7uma(CsS8qGjgOrt6zmU8~A#%f5SEdEx%!y@tOs>b1)?FSdro3V!>2 zV%O^{(#H*4XDwU)+AM(SocW@g6HfW)bzNLke7D=!F?+31-(tR(4V&lve!kx0c3z3y zstE30{iMHZg3Y~dSIG8H&Fl(VogsWpCV%x0g{s1z4)Iy>N%c39H$8p2n%&|#C%>7@ zqN3`GW0RMkx3IrmR9LuhtBU7O$=$mW+>d$nJBZr^pj zS9vFE`@K&W`RhFj{Bi{^PU0|oar9Zw6ruNae&y{zZ=BlbbXoy#WE#NXvd z&g{D@QBkwkV%hP>^OiMUhFP(Jk#EeB(f;=qB9Wz^`$D*)Se2bRS=HN?ecq9CanYpgF!i`u*H%h8nqFoD+DgnlWXyH@YN`~JuCcmK~n)ZaVj z$fEigf13C8|MCVM#$$TqIb%R+s7mHq2h&#`$D&%71%B>@Jd1cZDNg6AYs?Tqj?-{)4t#k;>4c~IEOeU`E4>9X68n$qk4PMI@ZBcyVBA+e&X^|KaWZtUQlJB z;&sZzceS{*^Y*;2zn*ERrV1L)Dh}Ov{{3bz+y7Jld;_mq>Wn|)t-tnb;;gGDfOXoPR#OWD6-EEn zDO{^W1y*se9kjWxsHwx<>ozU*RN}b|w$)QBXBk@Xuod>z-BpZumaHYMI@~-jkj?euwrg`ebwGgZR;8yZ_GjCYW3N-j`o}G4i|q z-QC|GL|-a2=PTsVuYJJk`&f8${g2RH2^-FGZI9b*_j*P9@*P&*r>2(uWqQpnul{`A z>ZB}u`}=AB(rKAGJFW@rxtwX= zS#cw7%a_@07HacsZv}Q=$dmfBOHo#MJAc1~y2)&Z@_Ru^i(c}+-IZEz{P{(;NYt~+E zlY~^oW%;aK_8)q-X8E!+COlVyKK821au@Dde9h_lHjXx%ed91hDF22?1 zrA&Lxv!+RR$jP+}e zOF#WwpO;%#eZ4O4YTNyZ;*BoXVv{vO^XA><47<67?|#&~WwzT73nuH_K6csSX~m7l zb98K%6d&n2+LgSgmnHv3+?v#LGcA19oIA%ccjEGwGxzPT_qiUcly~;*JB{`kR~{V^ z=`IutU2S^sokeGmb9rnPPUymgsM(wc=b>OCvY91irJBY9lwvdP9*Ou5N7c&mLb zCzi18VwYTzDwJ;2{hQ@ZD7XH!>cQHB-iMDIc~^1Z ztZ?k*1qTY|XjCqH(zSJ-h2I&@UuqYmPCpEgSboGnv)DGFJi+y4)$thqj*T5Bgj(ks zE!Dawb?ZXMqJSxf^HREIX0B;C7}>s^ZLZM?A>Wz(-Y(0z+ty5tO1XLK$b>G(tw#La z64y-n7H!x+Z^O0AZ2la&mFKip)^-vOEnplh^VexBYt|z31EWhrR1y6w&v6*!&E=lnj=>{R-Jz2cG*(-Fg)s8wPqQneZ95&6%S9{*KV)BW1UX@5rafrAy^+ z)bPKz^I2N?>0R$PUJDK^I@xl~sNeXSL{g8#fgOE83!kurED;NF$X0!>qv@})h_!h$ z+hVViUcx-bA|uz^))w?U)>#%db61*t!W#NE?$)p zDfS^tPef3M?WEHh!TZr`OoiM-1(g*g?7nQQwyFExHox}u>N~bKvtOTovi;BG{~iC9 ztwNpV}3na1ywXdvM!8om$ z({0+TIa9bSL$iWJm_^%?kKCN5X3=;2%!cz3tEHL_S4^DLz3x|^$$L-3$34zntL&z8 z&bDOu@FUv7)n)#VwkIlgYMDQnZhZIt>8|RxTmK)py1eH7(Wgh>e+*mxUCwrk{=QF( zZWz6~`t1qWrOUaOoTq{ex+sylwIWS{mk#%B-3x)#1t(DrfFR^~_0{GZ#bFk0I4wJ%D0rPw7CXVa3`eakX4Vwxj7nC>of z*PLQC=~1JFdJp%HYfXZt=M;~@fA#>ip+rcr`=kM z>(R?FS*3*D*hdG04*q15*V&Mgus!zl(Y@?vil0>6Fka50Ws&^ym#NyhB~!ju$he-- zSsi-u+&7b4=c{K-e3w`Ty*A>x8s%B6c1$C8!>#qUhPrbFYp?J6XmR$~to*}U>fd~? zc`pAadHUn0o9+L|*5CO5;QpV3M>b&vK;44G`V)9%!QggMD~&32rd)Twed;`vFHO<}X_E?D%hb$YzuN{hsexEzjq zAMYhDH@~c_CHwjv<4snT^w^ai9CP!`(-*m#9M`(XR-?UT^|V!SuONnH2>enQru~_2QWJ(ZcB7%97P_*Z+3OXutj(cX-$2qTd}Z$10kyb{+G& zyk>{Z{*+s`(bKe#d93X#y??R#`0w-c442Fd5$f7>-}lNK&U+VG{pTnJhnzbXm1D5u z*ruH?G>@N}V)S^%K?fbl=UiqwwJX^UZk;wu%T;^!*5eVIb#}RM^d|1!Xp#Ohs{f)_ zXXeiTX{ob}EW>(Cdyb!(!?jbRBj6NIh(^;!r*jV?Se!O``OZu}b0&G(q;9M9mBmlZ zG~1I^)K%BmScb<$-1*#F%A&6z&@Z{Tt7GXgud^4voZigfHe+#6(lM#U3NsS6+UMW6 zd)8+6%oS@F-mkbcL1SssnuNIlpNdM(dR|-;ksh+fqi5>jhZ(akJh^86ea`m(r~kj3 z{_pSpuZKU}TmR+xzx}L#nysGs`Rx|oKP}Lq?$z=-FGiWZ&dAk^>=fjGzF=!xWdHeT zrGglM`=#?mD|ea4^m zSRJx*?h{NF4W6pw#ld#3T4l6+m)c9@qD_r6LaA_5y4dwUV&kIAOCCi zD-A0=mT}$e*AJ^tPj0R#)GMiVKHGXb-FnStlirLo0V^NPU7M7!ar^8`{C_otKwEs& z>!vPDIKts=P+$A*kw%2}l@NjbIvb)NTii+8DEf8Z!n-9!3whhsjWYw*-QW4_YX80y z>;Hetf2jYrb^pP|$MZkGy#M9yuOD}_>t5*pIsVJofB&hnr$2P}f1UmH+rzbg&iL zRoKD3Xx4<7X{laYlGYx!^w#axbaYw3)s*lyh&N!B*UD9T6+ICpdLe-ZqT)PeU1BSh zB0Mc$N2s0qC3icbru0VAezD1#tC}Q=tLE8#>H5 zuT`()Z}|RCms7Xq=5kzlT`upS>?D-x>27e@>a1t~i}B-PTw7 zM5u=78uK&G$8M^&|0pomy_-6_Z(S@~+17?G#bZ71qi>yC%ymeqZq50qTjw@bR~>(M zbKcdTv(7f_hU@2R1V6la*!tUU*?Xlq`qsaE6Xet`O|iTu7W2H~!zoeyJxPvhf1F#K zl9PVJR@yR7{-&+0fO^X{;VOU4sfW)Vd9~^JLH2W!{1c^GpDkKgpV(^A9kOEOhCJ(E z7e0Nt$?Jb_f7;dDk82m-)u}CB#2Pa5xM$4!D?40cUYj*qoRfL4lqpqY=z4zbavlHhiz2aG2>Te?_ zv5Zl9p4t|l!yVuIW{7`J*#3@#H^zQ%qJ>@gk+s`@Y*XJN_dG2`kyn^4<4|$nY9-b1 z&?(DGeU96nE8F6z;cBogb!$}Pt)=JJ&vekfY_Z_HaymniR(JLija6)~S$R5MO)89? zGN)x(^keDne5*CzGeoB_&1yVk(syM~33um54Ze-ts~_%=FU(uHcM;b*&eIOTtj`a0 zObsy#D3w$9@>z3Td(QSLQ#y;6OfW3fJn^+x)irUB(9|wLWz)1b+a|`%vf)Yo*mA$R z^5Wkg()M4D?f-Z4e4Sa%x5e|f=I{HN_Vejpra2ZLvnBrSzFlzt^R4d|@9fvj|7#xi zcAeQ<`^BOAZI@1&lGL*z;`P$Zxo2jj+MhcU3V3GihyE&6homV}hmI9t%#r29^+>;CZUY1Yax23$2Rmdu*KdT)pP!-u*|pZ})#* zxH|uFQgN#Z{{+KRzx(TF-M)K1!Dqos>%frc+nt$A&u8lvid~z1;NK6qe!2RYW^)|l zf)@!qpP6`1_<7{}`SmW>YW1&|Z?>x~QP15UxS7kQ;zF@`?B{=rtuHRxb$8CnT$#gX z8|OHzx%4&6{H@olbr+K@KfHLkS#_3?_G5{e@6^n0_etr-iFoook9xHy*}mt?U9pw( zq;ywbwN#az*=M{|%lES2wF$|I^=GbVbgl@ zFs=8(DuMQ%s%GP+g8|uzvnCzc`Do8^OLfDrx$P>ffw!wfPKZ8J+<5!^npe!WvzecwKg zKe5MSORsiGJZ24jzT<{MZvNBs{Xt7Yx>tF1O*A^+6!E9(>z?HzHLqV>o7?kyW_x^X zeEr?^|66L_%(h$be$QW)fS12gnfD)YIVUNu^ET^c=KJlkm0ovj?iJd|9J#UdR^mM6 zeWgzpO-jBLGF55BH zN-T8arbyFWE@@%1Y1*2hvgx799{V>{82Y4IZol&;y|PHUw5xSptl{~IhbKt39qHCz zH{-dAq2ycZ^+}TgM3!=S?EGBL_2Jn4-%|Cv-pvPXf4km!J-*)efo@Ewql<|0CW{L$ z-p4GxH6??)rAnQ`avo>QJt)~+Z2LHOQT+Of8kEa{tRo|4%F5|Le7>{n7F8rS%=VeQD+{H*@qulC+O+%(y-G^sZ>- zV&~hMOXX6fzOM<-{&lXP^8Q2fzKC?MwU6drG)xm^_Dv3$GKG7o*4BoJu2m~aJ)eC# zxL~DT_aBa>dOO3;ak=fevL>qg(l+nC2Tam}%sQeh_rG~L>%iH?jzyYQHyKwuZQ$$9 z(CW5j5M{C4`Nps2aIw(4eT@}=w_bnx)jaO{`n~^N-~TS3Q}{0a?wtI(yM^V(!AD~5 zSx?`cZXUJu;hTS}C6t#`vfSPnwKj6@Ru{FMyJvfD4i&bFTzjZ^`*cNr&SagfA+Pov zalIB}D0XeO=qjgk!pjP`#Cl7m1+>3sVpE;n6K#FX*L(LTpW}jy+g7uSuUUU>O4P-m z8EuVsH(NVh|8z-RPQh_!Wl4LNP?WoH)GpuVDX9i!pTDd)9GKB8_j~iySqU@yji-3cH2SS>y{s}#PVHUD#<+R>`r6yJ zZ}IJxV0N3Lm9%!MM0%Fy6p`tl+6oR=uYHYeWe$?RjwwF{=X%n{ZT zcT-+-O*>n4*_@#JEzkJ>G}b@r|5yKiuKE8j^Z%box4X^|&ywLC25McLr zrT;IK?s7nYr>UN}MsmTu zOJ;sqrcynZA29jp?tbiXwey(7u2TOG^QN?}5WTeq<8IwaX@Fg`D5;RIXa{Tl?DG69;Y5B)*4yDw=Cz;L9A!eXmlhRsDMW z)3iTY@wLAm*L-NrKf3ckUEPtq3i1BsxxDeU|BwIp^gDi1Y4y>kH*4dnJ~IB^eZqfl z_1Wq7|9NJeta+aQM?G@=cAL8Ir{A>6Zfmr1x7>ZB=vwZ~M}3BBrg|sqc3eDZA$z%_ z*!zFZb*qC`Q@1Hj?U;0P-qt4%PfT|2pLscM#fx3m%il|%;q!{L@>=`y#u}?R8(oxB zbUT7`3~mSsv>sF8;%sW-Zg}96I4kXu-lcE4xgVZrZuU0bRvgh-snrp9O}lyPrX5>0 z3p`f3m$~-Eq}-h{|1P9*E^Fdt;`m&cCZjeq}Sh1XWFmW7#$M+Wg4y!k#+Gt^~D4DWBn z#Ro6%SUP>{wWpCMs#3dJ3wx$a`k3hH>XEWW>eju$u2&JOT6(XBh;XqOMooNfXv!w8 zlX>n(LSd4LlxXO}%(YfLpJ({`Oy0ZqT1DmiPxU`8-TZMq@ZaC(^N&rg0Bz=4uN_}} z=cUNni&3*f7yn*)>h9e&;rd%HnY^g8_rCA?EX0IG+r#0_rEtB{Lf3Y+jL;ORNq21a zUKNkuGo||bIg{y4(|EEr)DX{aSGPyzhDn7v_LaMrwJ*QpYu;m3yk^>l zLW{L`-m2$x{Ajp!FOc1pW#+RrJ4JdL3|Cnwhw-TD6+3PGWaARI@mf%%m>TOrYwxpD zRl05+of=-W?AG&>1;(dhB-%6_WnOGw?<>fUXhZ~VXG@0<7WrFZRR`<-{~-MjgD`13n9wl8dy!@tM7-08A7 zUy{pzY~!spJ9pcidT5|^)bsM1BR4kW)GucOt>p|;^b?e~iBc%hO*0G)^g774@V40w z0S?AbQzY93?^oP9-S&AkgJt3OCz9>2m3{9|47qV%?#22rnfFtIl)l^7^b1(UBs&~?tBJP1uE9I?ym|Ku z{{EBQDzU(6R$%C(x?`F>$xq(@c_F@Y*ZzkGwZC)R+qiq5Dqo*X`W7`2|2dmY*uLI7 zQ8QykTT8xeXvlKIpd`f=6PBHMmUZ~2x3r1&b*;o8cfdmT=voIGE5VEFY-v{ zVvOMKoJBsDdn|6mtua)(bLWnpxxs-7cg+dGQEQ%FTfkc2b#CGuuD7px*2Pa0J`yo4 zZhL0o?NHWcM(rsPGnX|Lx=G#6&`nsYDAE32`p@V2y%y?8Y{|NFzxO=$(GpFzF%3`h zi+Fy}p-c2J@42W)bEePFY_$+Q!kK%0!ZMFJ{6{L4_yk|eUgOT};t)N;(59+s5*#F$ zJa^r8?UkmlZO%!&KCx5ibq~Lobkws=zS17~tlb~j>;HfMvrxW&_U`uewckwt zADf+jBz~Xv!A{}*Y?1S>f6ab$_y0Tg{rCU2cKc7g{;yxZ_R5S8>_<;)2Yb19?>H9W zGO==2>MWtGkg&PouN9wpb_s?|yWx_}s(fgU!ZW3NrMFD9k3H_2{nyd__EeLk@{8EdT~MfUj;jsJr+UpIzD^oUikj}$)p{X-=^%YY@g_LeVxHlr?Xe0K9=0s zy~|&Go5WF(RelKbOG zdp);!y8grsd%hl>|M=Ip=M~Q%p8xc1ao^#(LtC7lSM7T_HGjEjc*fZTp<=0(#cDJ7 zLXYn#|FLW88#UcjwI9qAy|!{GGViwJ zZ!fC+C=|vtcXzT8dtbTxwp#yW>n$4X4;>5_9NlzZHex;Nnt~m-4dvLS-oJD@zoq|7 z>C0Kxx3{!BSiv^$t@;wRYuVm@trqHQP8fBFsQR}WYCe)V7+tjHv~lx^OXjl`r@J1$ z8o5$qsorQo3dq99amjg&(zyKNp|xU z)u>|t3?Cz)knxa0*)54RNyylJKQb<~Rb>H_D zV%0llzqdlS2>3xwt1SP@CD*Px#{E@d=CRC`Tp#)>yF#?iNnU8W z)>J<2r$J!QvC88z{27u*cFC=LVbWuC-gWmr<+HBe+ESYCmY$pJeK6wTw>+22 zF89kPt-g9!aq=^-sYlj)*w`QQAm{0~%(Oec5iEjF4SIT#quv#VYG^&Z_v@9&)Jo6} z=KWk1e@j{7nEweo^k%g_PumzIyz$JHm>b{bl}cB9iF^3B-MDnyBkQL}!>ec6eYiLM z{fBjmo)1s{F0c8qSl^)Ez3x}~x~KP6&)v6W*MpDN{GG=GlF{oZ!j{X5gUudc57 zY+md0eqH{P{6AOaFIH}!EYM>ospix1W_kMzU&nyFWz4~n-bPX|}1c2Y{F%!$@jO@iDvRM+-+d3Jl>J#>El!!2P?ezxr^?K-A){BDQl zqJxrq-lp!2dY!jp>Rpr0u7utRla-V>qK;e5Ke8LTok1b)d1>wEv*u5E@2&X%YyXFI zyHw}T$7>$HefLbS{X$an#FuGFn=21Iy{f7zzDpotEze`aqQ5Wt5<9Xsl)Uzf zQG-Jt^HT2k8@+Q&I%%@HLE`Y{_VS8+0iN{l=RdBVH|fbv@4N*WiM9J4{ac;BB;w~Q z|9z*=|2Y!AbGPk>N80>5stV3+ZZ|)&^2OED;YT7Q-%YA|FDQ6cvpZjA*~VGlLc?Mg zTcvx=TcOplRVJUk?QUbDxn|M|rh5@ZT~8Ku7_MkE5#Li>aXrIyYT4B$J?7-s(<9E! zel5Ms@Y4O=F-lQMEQKa()vvbXOSSFp4AEW}eQ~|*vcib`neERFldcIIa#2lQn`oo9 z=d+2g!|H~LwNVCP)7LExF?clH!az$=M{va~?W-wE!ZZ^87@a*Wnxz@>Tw~{i=RJ;s z$`;QxH1+-1ck@_Xwh-o5-s*D1rhJ_Rqt?38jFnSj3j73;PkM?PZpjTeE2$lJVU6nf z1Y1q#lij!73@VbRzuYe-dS54S-l8Q_R_?r%9~QCv%;$M`KTb20d)Y62EAMdCW}(Xx zypASEC39D8d3{c+=A^qdpr;q+HMT?1V{MeMw#OSLTwe3&cE3gG?s{AGz&Nz?QA; zsZEY7@UvGs>Yrc?9% zrmu&l7#IH$`2LIk)W3qox1^%p&-~78D!*fI_4M50W%s|nu3xPpyW{R%rAa5VpT2q} z_x)V_v!~Va&t7h3er&MF^Tn*bMapcc+jl=}{%+rrFZFHn#P4$TuCqgxzOe1jD!mcf zsVO{1ad~9l=L7Ey0$e-QUf10+Uc$IX`2H5DKT&&1?%4YusXSiT)_u0NYWt(SsxyXi z6SghlSgH1|&-}=g9kT3?rX0w75qRsG@v$R?Jtg-HWYYQqJ1vuYH_02VHNLYyB6xMd z3^uLGi&a~d8cM}NCT14icsTvg=ULpj1rhHhp84o1+|$$hs2S+`B5a;fdSCJpwu5ZV zUaH-T!d6Ny3n>UI*cRZesH&j3y7&6kWlsw_jGiuOF#erY~2_Jei`w_V}WV zcIKHiVU3@sI?sJtX6`I3(dMJODruDjqwcDmVLgGj_Jw9knfqS0@w;q(TjBqs_y6|2 z|B<}@|AYH;EIP|T>)WO-V6+W-K4;ZNzxi*csK*K>&)E_i@O;i9W4ARD+EXfT25l*e zR9X|%xpjqU_wR~1ll%JfZmg*?OP9_GXgmC9MzN#7vXJgpKSsRivt=w;gwmn>t&>@-S=zO`$ zbj4P!(1nv$tkMcAI5@ez$y6+TF5k*e=N3ouwpuoGiyci^yYR`Wk~u4u3hipkJo9Ad zi$W`}Q&Xe35B^TNdhWy1_?PeBb%IXLV~DGl{d?#6J)`jXECC^+*}cy!y^WN!xUNZ^ zSk>+>?7z?C^ka8}z84brC!2^iabDrb-T&z3;YNM?+Wy1u`i_;o$q!k+YvIj^XS*ks zecpFY?wLx>o5k{%!mr6sxEAwie*MS%&&KxOiuZguSUn?j;%#;76U;kjM&#PIGyQ%& zu~0~^=1bGF9bYoL4XpIL98 z$*i2ZuGC|t%y;GX!)I(Xud&|>bzjNm*;UAv+!DoYscxd5dMl~LB>hO_ob6ZESiCPd zXn3!;Lwr`~f+s!ib^b04zv2uo|W?-lS_v_rlulBSn$&^oCup+xh!{GesXOBKwy^2|Ur~d1l%6XN)zL~Dx zEUI7gLC%$X_GgBpAKyIGRjb&Q*Bfzoar^d`We=zJ?{%pctN6eAe1mk{uM@SabT&VZ zQJCKKaa!f6D>8!FCQG$U(_dciUAD4d$4n2yN7eqb+}_FYKY6ZaA}_US;`6;#qW7&e zx=PDBrRH)Q`bNB#Xm6RsPC zYje=_4v)LddSF75;uh^^nMoMznPxq$Fn@iin*H+>0mDZ!{?F$c1mC zvNW$mMXWvlabctS`wh3>&Uij?5_h3oL~iw-uRkty1YPYY^jmVyd0$4;-GtZmYe{r@KvE()JpYwzL@qU9{PCxfe-+%w#w)@}Qe#QTdue)7-W9#48 zq}14=nYS-UEIwf&<15}$t?j?Hb*I`*f6m)cPV&=Y{!ZasxbS`TnlhH;l)K*}URTsq z>sp5X+NYj=A?iiAoT*#VIhCu=&+T7oz2NPh0Itt-4wlc!Js-JM`rGctbMXb+Y||gd z9m!0ny%(76K2J5T;I*V-)#9k z>)f=wNad;N*W;gFe0#p2`uCL5{Zn)6`&a+Ie`*f*F{x7_FK10V{O`owJe8-M$vWxJ zr(bz_qWb+_cVQdz-Pv)q4-f3JRW^~oR=CEfXt}DKp)2QF_6h6Ck0h#{o%;1>+Z16< z|Dafh6IrnnKEGXh=5SA@t#9`9|7H?;=glKJ-@Kb=aE86<`wEGWDTfn}v^@QtGxxE@ zITrhZ_c^YHr}E}YbU*4jyuHy#_u_@sQy;d9>qS@}-|b&6^UPyytC_^Dd%>Fwue196tZC-YxazylsVi=d4gv` zW-jwt=hY*yCa`GI+nMRr`=0$ud+;q%$=9{Vb#nQgcgnsQM_5;fMgGd!`}ohAhe?+& z?>?}%cXFoA9UtRk2YgcJToT%!se7(!jd@03(Yc7^&ZQHAkC{x1nmT7ew#;*WsheeC z#ivxX?nyq2*?2DCvr)h{H-VKAf{F)Qv&TreZ@(c9L1>>P};~o?zEAZ|e@t(A_5GDY^CFBG-eug(sr83%yS7+-lgf zTW9B?n~@i;Ra(lq6YP*!O5JVY?r@bp>!wO(4Gt0H1JW_|KG<+{dL zLi8rT=V~#RDVbe6j@jEcONKmr`PL^x%eC~SRd1Kzj=j>JnnF4XZF7vbt}2Ob?sVn* zt#eW&bHmTT>who3{;6MR4OzarUR~+ximuSmAgv@Otz$D}gjw2G_sYn-pZmrAhdpZF zm!;YBZ0-aeJJMX8z9i?xdG2$K!mHoce)Q9OFTHJg`V^HrwzDgKI!8p7)&Z0!X0 zJi0zFs!waz8Qa*PxIG-Nnoqp-O_7)qbU-PACD<`^Wz>qDO2?GX1#qv5TDr_>gIlpy zgnG$Zb-%8#gOP^|&Ap$?_+HL9!*wsfG3XqZn9CBq<3BIgzCB`Y1F9Z4|A#KR`+AQa z|NbAFDnFXnAIQ1#=i9oE_p`G)AK%Tm^);-S*C_nqo1(KfBb!$=9oqbw`S@cO(`oBs zlh+)z@YnTLS;(Jv^R;w$Na!p*osF%aiyt`|lVuJU98w?R;3K zwtQwt`n&yAp7mwtzAZI=G~+_lbl$FAF=o%5<9?krYfLl`C}NHLms7njt@fs&T>7%V zXFk5`;GAaZ9>VIo>&xueZ3TKW3_K-?9~x+<~WT41^AwV>0Fu0+q@y5_v~ zvBN!^+hV3Dx`o{~)vs4Ecz)>e@#-TMx7H@!@b55f3Eg~TrO1Z0f-6^9g&w=znP|R1 zwB~Zcnu8Vxqx!ctmfcNSlQ=_Y-^N)hgSIZe>|d zb%kL^NLH9jtA(#j(84aIq!mjAk{$0{nlF&d@=D0EE#Oqpg}jTZkBVOINSr0?#&s-g zm6ocypkbCvW!#|#rpGqPE(gi)la#mWT}(ZmdEi9R44<1TiWl8u7g+2z?V$2Dg=5Kk z7G67L<2LJBb_UO93qv{Mg&!X|JD*+Tny~fmC$Aq0x%JL#S(_&;bCFT&>@mq*{I{(2 z^W2iv$NCS882-|I9s1k;hkO0w^twOR$KUVydG7kY%lkealm0pV=cj^4N9uor_Pgv? zkP~j+_wDffviw+^75_i||F>JuS-ful)=y^_O$s?0r5&`o%dlYM$B5vkAHO!n3dTJD zu=aRV^Tn?1)2>zK7%rJnVD}(q=`_x4qt~Gea%~L#OzsKHNj(u*Zun@;^33K*s{*tZ zxhBs#a^vVi@tkH+|LY}d!nL=(wdJ!uy7tc{?^(vH(+)4QO`oOSW1*)n_uy>XvAmN} znNi)@OwV?%Fgf2EaWE-BG;8CUTfCR|J&-=Wt9s%J;iTwo>FF7nmU2@LD{i)Yz4e*O zajBU>PQlBjoJy0uvF_Z&x<}t`dR%79+PLTYm*pBKi~c`SjjQ=!)PCpFhlkTO4L$v4 zPI2kB@>yZxJF)DpVeiDhE#Kx&6o`_Umv=QwlKtk<#qW+sOTOYckhh01urIUSE7nXk zR3p@2*~0hC+kDSBU-?@%WyQqD84~T8JD*EBzle7FV6iyk>lVij!;fDqKEKIRSSfVt zz@|MrIigI%o>?lERj%^d_^3zG#L2Vup+x7_2Q?1eizIs{FU@B3_F15mp!+yvrf=%G zsUcd|UVT=~V_j<@n4`QT($Xig*Lu@6w`*$`&(SOniB*bH(EDEzx_ifm#{z+|Ew@Ww zZ|MnKm!IZq*!{gteBCvfqGxVw4)ebsO-`ozy{~Ipo04*lS{)Y=zAAA|dwuPO zq8qxdl8PLK>t;>jlGx}LQd)Q{T0cW{+4ETM=*@lk0!4|9`*k z)#>$n+bSRTPA&jVGsK70O{@rENfw9}y}Tvt-Q4X{?&`YwY(40$+r{r@a_wo(YNxYa zeW!yKe4i&U=Ni{it$n3ymR`@ClWNh^A+=3hdyVk2$3dG5cHCZgK9=?TF=?*OvZp0- z${ihoR~MbGbqF;Go4fWSnHI6)*n`=w zyEdG=v{Q~Ra`~i;TT@G3PjwUjS|M?gwP^v976+T*wKZqfKiU5ENaz1$pffNS;_Ba) zR{nf=`djM0=H)Nb?Gs~v|Mk5bm)TgYKiB(()!g@dF*#A|%o>l01%=4%-~T+%UNNcg zUhvT-uFSS&UoG-i>RczvQ7)4Sucf1d}r27?rGb-UpEn`!F& z@(*(yuUyEL3VW`*&QvCEzEHn)&2^z$)8w!OXD zHHE8R?p>z!>1O^IfyJNxg|F)@PAT4)bd|gP_RC8BJDb+toVz~bm%~isN}m-Lr3Ve) z8@KO1{K(~vO`_<$@|~$ytauJti1cWS=th`YdKmb$ zcWj;(G&L*XB+u$c&7q+hmWesXBDrU+EbY7#!?Lwy>x9c^OnfDl`<(AiFQ9sY^~jxMZMwOz6vY}sAk51v7t&5bl0FijrfGF9je;5t(X4rl2R_#TNS!NZ$XsgcjHGo)5WLv9Nx31T|3o6CQ#_J ziD#Gb^YG~r9+^>SQOV^tauocFndv zbc+A~lm5G3hu_mG5i!KmN}0{J$pi>?uiQ_jXO`^09p6_^tSgg! zJh-^(hSHi}eCgUo>7JiC9?keX@%ZJfRrep={lqZE`;dgUW`VU@m*}3&Oi%wGzc>Hi zt658**WP#^ciDK)VYzc5$>IK4lkP5BGGW#W4@FjQE>`X4MN@KaIORNN?q&Fy=|0`)AWZ?QRu|P)+1@G223~F8Z5eIYLqSMxOn5}!r6CYV;|4_cJKWcp6p$pAKvsm zxrt3#=&J9}zl`k97o4-)dj8(~-PfzG?RximmxZj`*KJp?b=}!hp?5s-_+<9{OJ%%= zH%@qSBu)5)r>Ewn_0>*`_w1>3D`>3y%%D6i^tq)Rmy+(eZ#{=ybcA!$CEKF&zHi^+ zdpfQ7Z1dM?vv=E`f9IC0&lTz|N3!Lduf;{3epXKl$nZ{ZVkYKfuWCVQSUs?A*HyRDDB5OR%_Db(rUUh|7r zQgv?HCJ7$DTMrB@jh8TrzLUMndFD~u>uB%y*2@YXy-Pc9AQB|HhkHw|gLj(6nV6V0 zl^+%)*KbbVFK^I${FbWIZ-~sU>P^)bzv|QH(1k*o%E@Y9>cWyG!$Eay#p- zkXWgz)O2l8(%g$dQx=IP>ne8iEcg7rdvQ$8cD?5|otyvPS-STBulfHj?|)qX_1*6J z;)?IFE>HGcpKDqCY(C#Ti}1kkZm-)al}~SdeDq?6bk~}7tx=mK7?TzHB=58JY@QUP z*5`TBE#PY1)z0FuKEYyS#^Ic-ao4qAH!1vGChTj}A^nxvh?6uS1uw#0ed zZXr&|7pJJ6<%~@WztX9?TqkSQB<-Xrt9uuhdYx(g8tUEU&3ozUHzxJA!a0GB>psf( zP28!q`dV;u+`RrZ2cx20zq}X!T3;4A-?I4G8UBv-bzfKiI{DGMBY1I#2A8Pj#-uqH z%(W%$yq8E%y?nSS@!3ah=}i5eeHCJ^F%PcF?>!K4{Nqg*1Kru|x(Pcg?E+IDBt{7H zZ z>HGE3oTW=t!dP5G<|r;bQ!ytpcl(=se-Weg`+o-X>GR1f^SQh#MYL3}W3y-RsufK~ zI}DSS6(7Gl^Zuhbt-Iy9{{73_U4FkZ{NCSRyMJx{zF%$6-?G2g^#AQV9kBiX;bqbP z=WTnbwMx%KcAe=O)eGxwmK@47FESVDYhLsy^HOb z5uEtql<`!LRb_?wEXONm%xse^>{bX(QuH%keOm6d&ho=8jwduHE}OaGW5=Nl z-VrkAs$HjlbW5MslNLI)?(XW+HWM`;cFnX$OKx0Sz;sRj`_0Fi7r&k@nzLzI-qmCt zpU)1VM=cJTwpr-UpS>VtrNsZg5?55YRtHU7m7#Ye9znv=Fp>sfTfQtxl+ zRRxZvVMiRgCdP<8^edV9Pe=4oCX3eV*WP~Z(m`4=F)@bc3k9z_9q5W>@km}#toGF7 zvc;>~oSB>JEK8Oj?R~lDp!CF5p=X04TO=0eUN<;bx$(+EG(hW+uocy?rFNhIJETcEQ0*>ljW>k+GC5yL0zmLQmq>yEh(M zq=d+OJpQ-U{wMptrT^bN|9|QH|EKeRpPc{M{=c_Z4CuRE7pQ#lVMs_|uk$7+8$7q$5whE=I!tI6aUm2wp_>>Qqu%9cwvG>8^<@cA~ z|B`cwdD*WC>F4J+ciQawr?l@iC*QFh>V*nF_*^B+s^9UI|9VmAefvOO{qo(19rg6q ze^}+Qb%}-I!KA&4>fOe+2U#!0tW^E{W2&y{TnjmVj=0$mQp>H2J|?WqP2N#yml2X$ zee?9kkPz=<5uwlbR&ZwZczA8Two2&EwC)W~yAEaAO!QW?IG(k2VVJ~n$GPD*x7il1 zJ9EtNUHOBAy{|l$bNVcd-fEz-s$Hw~vO!?-p`ETZ#rHOC>Jv*ecj^1xnWt*9SJA@x zJ@Xe^P1R*g&+akW9cy}Fw55gPoQ_`WB&F}{$xWiywB7wq&EY!6X{q(7MS!PB|Bhw; z#B0Vqt+O_jC03?&Emoa&#vpx5S6jl%=xz&d&(jO7`KCsN%q@SkSN(WbX;`ng=B5%J ze^C?hS28EJGI+1qY3g)NH2LhN<@d{<1#xMnt@#|0F4%b3V6w~Wsob0HpS{C7Gwrg# zEr+vHmxQ`bqy|&5~E3xiAw}cGkRNNM3cp)Z{6{9kAqOqoRu51);Vo|dBs{e z)5|4)Ywn(sx$dr#{l=Fql8=0NGSz*Jo_SUI_Q@Bb^&($xkoJh$61#SV>PwrmOJ;<2W3*2^iaW7%Lh!=9FIGmG`b+k#+UVBn z@zZhtw)AszEI-E=*Bws$_ip#;^L)|WE4V~gFWRd0c}~gR(p&4TleCKNq{{L|y0}k? zTrXewY^PSx%k?t898(Mvk3O{W-kufkph9NmbC>e1SO2D0``-7uQ}ac3=ifJNhwpZp z->*1x_v}RR$H9G@l7FXND0rwc(W6rGi*We#D-!uHuk-Fq+t_<`lI@b2;`)7e-cIUU z{OM-5hrmH|-Q>1PjWe7@fpenYN%ls5+qLv|>C11%p{%A^b0dY^LN>;&i0a%pVbZ4g z{V{99Zk6d?lAIZ0a=dBdA_mr+9`3*H#L6U|7@Io@e;;{#K4>J9wk$D4O8K(krF`jY*LC&n?-~2f zJiI;sh2E^xt{VA3Zt?5cze20+T^W;F9xE=~d8vf=v&G}vUYoNl@A>%r77pcE#~EXj zVR?7Xk2g;zZp-HAO_p;nirv*c>)6KH8qay!kLyxy$R3P{$)5RbV%4gM{LJmLW)eN? ze{lAdyRQnYc`wN9cDCqZ`Th3bqN$ZLu0#pGZf-l4eJ%3ToX}I3zK0v_IJQXiS=5Kv z1*;z2c0JHNIVsBd|^$lh#u_*Oz2aWucA6qwbvEnQr1NFUv}|wUAIegF29AL$lBBWt9**5S!mbZPpn;ktfOr2^ck*6VPDrR z&fUK2+w>%z96h-Wudc7zl|3u%=+UJ{%V++rbK4_yx-VV7Y)kC%7`GI!m}%Kbk`~=r7Vrz`;4Wp$_oA*As`ptWZ)rW)Z`_HB8+b3>*SMl?U@q(upkLEvaPTzmX zeBa;t!-79L?|(dgV~yOx@;1G5Q|4H{b6b`2spd&qxr%#5!QTnHYmZ5uKdi2Otn%6A zra~B%L;6LQ_j3{=l$1n+Os(0X0*+GykmL(`W<)d zp8S0KUE=Y)x6is(zZEW8AL5qs(I}|P=sfFHw)d;2%(0YZuiBrwd*^|zeSbGBo+5dl zJxk|^;^N4cyB)$-1Uqh4W?afwvH1I37ugxYzdw4cWnDeh=IkAr)+nKaT*n{#gdMzh zd~&5>MBp6ZXTeGPXCKsXoVLUGdX*G&ZuZVSIWvMEm8?kMz2a(-b7<50XPy_8mc(pS zeO&U=Nk!*lTDx=7UB~@=5!zF-Rw+yDFY{a&5)=X=#U z{Byyj>+FuCH6ELiHup4NUalWy*u871rPjH~vxjxu9QI5oJ{Gxs&F-CgFXhe^-{P(K z*z&+5*lE+H{OK0YEYjCxzueUprM+GMn^B)K+hS9(nQfVZCzHgqWZw5>%@I|O^X{A? zGV?iy#I1ct6J{*$C}azD{d_4mueZZ+YE-vXwx^-cyKIeRmb!W$c6~YbJE1k|O7+rw zE3ZJWb3VzBKEBqTIxAIX(wSt&^c#D9N>;OJU--)VIOJWmudZfTX`ITmpukv}7b|4! z$_4KIuikej{rcURpqlUUGjkT3WS94>Ix8g#7Ue!Zy2yZI?zSV3`~Gb@9&cXrIo!_e z+l95(HQAN_ZtC{S#c!^>VEA6#{PwF|N2?v@i5{C{A;+HODAf3P!INEc7S7%N>Cw^R zt^6(DHcj8Rammk)A3poHE=g{UiYT2I#kG64a^%`sN;%=(7n8Qn7f8;qR+hLp!9z=LhtrpIPQOb?%njd>>{yubqD?|4(s`T?|<;8tLy7RZ>QV; zYs;wE{Wd&*=|c}G_sw+|F3xa~^xt!*-{kJJNNbeWV2fT%VnEx zt=qCcqvFRYXU^KwHcx(M9((!Q&)DmXOuzT`yP4t(!}R8_src*NZ+LA|a_ZK&d$ZbS z3*L@+G^es^hjZiEX3^F6jAfK>ziwNtt{o$6ad%F|uakVqyz6WKb$zrDJbvP6^Sr}) zN`5zD*4(hS4Jbmztlo3e47dy03X%H0!Ax5uUrtQs*gM z<2Yyi%ur~TgDz{ZmhbBm#f&MI4QD4t@wgfU)({+HJo9J~0H_n5?`Ib!bd1`>u5$sVdgQUTjbn2)ZgxUUyD zW%GsJ#wQhvan!mCs+^-Oky4JjCzE zwgQ`Z5|$4ATizdx-1Y`*Vf_ZiVM z%N}$0|7Qrlt-G)Oh)oYm{mH|xvp@dIwX^)g^WkUujgo9 z_UJj?XdvdgR9=q_JceR~B_rj2A2PXxo9zS~W z`QJ^~&jmXjU9@vjK-U#jM+b*FivFzC@?US3e6wq+5qz{}dxXxSsVm*$c1C=3-Tbt9 zIr}r`q-wz}9TTHMy;nxOHV6sws(8LJ$-{DTkx}mTofbz^*8W^9{r>+Y`TvjYfA0U? z8vkSI$9=or@3{{edNS|a-uPYMV8}{8(}hwqp2aosN-#$)ICUxY`JBZ}nWt{tYiwF2 zaP95in?gmdYa1L3df7#nDPAh$lV)0VYQy}_;APRJM+}vdzJ8SMw~%%B(wdbtF^cPT z?((f6%WijAEPczgi19hEs`?QfJ;t?D*F+wP;yw7%;@!;W$^l2LcDu+eZz>miKG7nz zNK;}{)RcY2HWfRbK0Q0{?i>rhLk|T~-x~F=t2UL3%#AMF-kBL@S6y}}f-(KXP9Z7w zs`>eAx&&9VITnRJjkdoK{^Ja&!q8cC_xk?6eV_S)e8PHMOC+}l3(mU79qhPDxus1i z{?pC!cVCR+4bHn=no{{`$HK_yyzk1p6O-<)&yZge_?buf_bpJpXw{u5 z+y3{2N!YA&3sr@^BZC}!600RWgrmHdDNKnHdwe2^<9Nhr8SajtRL=`hb;&nZdj&1k zN}6sW8@Qr4b;ZQ5%N{;jq;B43Bra*Xc)4)kR2|mWI&r+3x^FABxI!lB`0e?+`gzrC z`3XEMZB|IhyPE&QT?{<^)hKK#zT{jcZbQMvei9J$Fat~c^MeRtF0 z6z??ME!ivN*0u(*-efYDJWB5+HH(}o|%COvP-W=Xd>$9dVp^Q`OYRT^%$a}`+p zJ6Z2XUeTGGs>boEOX~g7+c{5uP0fzY4Xd)^J90a5CQHBTr5T=vj}HZDSiMcVG~>hC zg^{K$-}Wh;(G#3;_u8Xs#j|ZT>2kGstzYMvh?DDaOOF@YdWNwRP?p(~I5* zJ=`EIz;*VNp?o^u@rhjt(hFB8EqwY=JGy7H&+^WX76HO7b^^(2OAoEeWmxF5%F?av zZbOudu~mwEus!dA*(WU!M07KYm#neLgd@UgY$q5Aktz|srOa2uf{d2jmDAUa-M;Xv z^slnhHa#mMZY^`~G4f?U;^cRsJzGy-&Twg?Ms*DL@7>e)?D);1+jL^u?CJ8CzF)Vg z`(UXjANx6b|DWv@C12HQcRYHR_vqE9&wtL{|7rZ^Yy3aefAi~~{y(*Sz1@oQz+{)-T%X%OA^~NN_BU zoAbCZvRHikoJr44yc3zob$vD8b1A9Ilbnv97O(zfb8)?t*=#m_F&E9F3Vxki3#`Iylz3^Jc@dwT7+LMA8u3Gf{^1@KX z3h(Reugo^c8y_}2Ws<^sEkSxiUf{W`z!Rr8^c9OG-n2j3yp{KG-GirhC%&#bdbsp- zp^n9?M}CC{=d?7_bFVkbaIX~WF;zPHsz4%B{_C-y32l#0Zp;0wf7@$%o^gdE}(|wJ2O!kLd|9RR=&m=Wn&78ARv-^A4_s2fB&6h+how8z` zp-(Vd?4xhT3y)cS_*WOP^_pv6i#=>NId(qo%(fk z+U~m(O>I}Nb*_18&}UOq+q`kw^!c(LhQ)t>OsbjV5uEsS!{zq%xrIxo=Kou}WLy5z z)A9e9_WxbJ&*y7-kL9V&hv$ZMhA3UO3r;^8W{`CAi|ks%6^#)_$1k^JF|JKok>#TD zbj>-=bCyLq7Rnvb@BG(_t_jRqcY1+3+uE*YTIV7duI}Qov(m26K6AN4@Zhh$&>ITt zjQE%}ML&o==5bv(WtAIiPjt-t(AMIBXV94ojsFQ3^B&q(d>8-n!@e$m_r4GR@1EUN zZLp^z&h}!SUU-&Q(kzkW>n3lRGxTOA9qdZzJ=*1%(s?bw^h;u)ZQ{G?xGf2D6M7a% zrCRjNT2ZoEtXsK6_wKR9qFY>Ql4m|^ve;3z<=R_kf62|$)<`^0?TdUo=ZJ{&S_j=N zbHlUuwp_cs*7lr)TJne9rTgE#2%k4)s`&hQJ1XspGI?&lW(#C}J)`Z6O;3lQ({st= z9yX~{*lr)HnDf!s`<&==o4;BGzu)xD;p)G?>%fAV@6+dR-W7K-L{-jh8^86b)140u zF0&n9W4!(RcbT|(3&MIt&8BBBt4xzfz-2&~LR@*tkc0OuO>N#x2)-$2Vt$R|E(lak<8?9${ z??MDuo76U!o^DO*niwm&;htmYoX;)WRIfM9sE+=rl@PG(G7Hv zeEr;C>Hpq*aW@OU>+iYYnF-(5th+ncZRIIv|M}3S@2!Ty-Vmd101_7zrbtyQ{acIV9eiI$tjPNYI*=rv(^kE`yD!^#Nn6b>>RL8q{g15wH*V+Gf4yGu{;zQQ!*^$98t*@uaq>}* z;W4R@&_Ge`(^BnPdKRYVJmzw{u_W)bf2~(LS5xg)>2{UuB~68Vp)-!nyioOPU1Fd2 zr}cvEU#CrK-94N6vWWq2vrIn!t=y`x+tV&s>YD1yE>1GIrdPe)bkPbu=f7>Mz90R# z%Da5siYJx*6IJf63VqCMsM-_iWN@TX?O4_Ql~Ns<`^vQ(`dly1St53{vYlnI{qSzepVp1#A{bxpXBQI^h>CEvBTHHDnr`s!iveBpcb|Khky z&#dpN2yx-|nj^ffc*>%ZgAcD1{{C|0-P6wS`X{Hi)b<;z>&3tP@!__ z-aM|JH}9^{FJ4R6YvHot>(^dLZ~bW|ynN#Ox(|%{`?o)yz5f@Zzg*7GxBI{A&QZHN z-_J?h(&m0*@Y0Qqg(trF9xu?EvS-FM9`CN(bBuzfF5CDd^2Evj!Jfx;5iA#$s(DTd zO50n0R{BEMJ@xp7U7N*@=zK5wey;NQ^jGt|66dJBdFgWhOE+s<>W9nK?xHh-*;vwb zT(x$FX=VIz+_xnC+#lfwI(Pm~`1H>D#P$1sTe}YY|5bnM|Gf*}>}MZ8VlmH2-lcc- z6w8yD=^5tzGhVLTs25x0R}iLQIr*~Em94Svz1^Qrv7g`4eS-diYRVdd})6nfizCdR~4LD4em&EykcjV%gjQoi=#yS-!DFZ9hJCmbjka{Rw@o7NO5r8c< zvteHhbDNOxEWO+Hu5&t+b(QZt_9oiu8(aWEd*z!GF_RO8hmD{f{53ui2S1o zqAgL=eEnU-zDMgmk(kMLRN{2j)}%ScTf>~L3*Bna7ENY8T<8?KQ7>W6^F=RDRzBKs zdvdVTp2(s#tBvOO9g&%CpFO?*smKwDU1kY7OFU<&=>09<+GQ&6e8ozapgDrfs?UGF zls!EsZDziE)8~rkOH{7TnX>G?p__#a-w_LaKZnw8Z^vnRJyGxY-_Lv6v@b*}VeN4# z0mG8L&0UtVZM*K}#l^>#)qm>$(`Wy;+rU5n^S0Xl@8??Ir=R6y>AcA|KeLwb1InUUew|fcMB(Nt9bjjOEG=tT(u-2Q*D*(w0YdexYlwf zt#w>#G<{}_kR~TvdwE^w=}V_(a4(bE_LnvGM$qQiJ4aj(vg`_Njy}W|xt%RNOrkU< zNAA)LhdIW%w=e%NU1ssdEV$I^d0X9It?BFc9i5OrOIkyE805}u6%fMkoBIG z*UBX^KQC@y_j2#^$+Po6y_uZ<@ySKzw#APRPBzboJ$>B#e#(rz${lsB^MAzFH)PIm zu)VuW^{nyzpD$|neN)!m|7-95qx$uq*I&v{uu8qA?Y#Zf&G%Z5Z0vtMy?^xUGt+<1 z^#8lQ$bnMVS*C}VSx(#04z1!Pz zY-3z0&t;#rUYqkQ)i`<=JQ7>XHm!f;vehW znhRPa#kNVsU+?)Xl@~@9iF2;5+7%=5jW^S4Nn+>2{S_sR+CK1sbUObKu9V>-VNF-_MdU)oIx*CDqwk(%GJiB3EaKa<#QEzb*a!!0VFD z#=BoSgrBWEAX9kGV4mAI>xZva9gjMmS-vRp@Ke|Gd+a}aIx6dLKWoeWJrBN~-+QRQ zV&%;49l6i)|F6w|$$tND4?Dm9hHDqY5Bf~BuzHsGsKAPIZI%hwwk9Rjg-JbOp!u$<7xxeyfrMb&k01s{Zq@a=!KF=*gQ4zB50O-Cp(~M{`D@xNu41h% zu?w=6K4~#Gko!J|&-%=&r^WW4)Q++B`MUE~mrRnl@ zD*E=7Zo=EXOz(Fslt}h8T&%jf-0jv>^`knErex~097~?t9;8v6c$HmfYN5RN^6L?r z!Ad(E=4lgMhbMKzTHM1<{`jxDncKZB&uajP(iRW6cNw?iS^75Oi-^UKoBi2p~?`;l?tTa7bt24(!;LIZ}lh!%Y&%BgS-YQnq6>?UgZIY1| z+x^N%1xn}DpJlRa-VsyeXYoF=e7c7BoMrrs*G;GF+VeSf#hkwFM=URG)x9R=rFlA4 z!)sPrPvp6Yy~aMpu2Sw9QfD>)9ZQ>6e2~?>piI!)J7u1FucqF_o38>Ir)VcJ-~H9( zHk~;~Z>G)J5Z1>`_aeT;X^1i}`RysEy=2D9;HzcADObyjYGXf8DqA`fU&O3&h@?oAY!1sofmw4_4Q|+WRT}-`)BDhE9eE8B9+d#h`4h)*bIo#2~eB9hNtuJ)L>9ozoJw|gt&)@c_sW7l=O zyzwoZ<+9P)N=uQ7Zf@O!-!o#QwDrTKyZpD@ofTTmdNHBefBP%X#ZH3P#C6**&)u`9 z((Tm5_S@z!FEP(s-hYxS_W6cosoU+7oR2X_MQ0U7WJb1|@*RDwQM^#)_|spXS#~d+ z!noKyFW>IT$8Vqa{Cs-<>}K)(Zc=4?KD`n*a233~N#6d!=IQ%SRb>nC+U%^EtY7o* zc&78wELFdG`u|?MKeWa8|IhgU{T$f`^QFrC%QwZvYpVtQIq~!=*GK8F*}9(tB>C94 zO&9-k>acmKOy18Y&#rUyE}iVYBCPND#H(5lju=k$h~vwCvd1T&OWR6@EpY#d*mLYJ zZ%?cA5h@PVH7-6AvGR| z>^Pp;3HjMb=&P(gGAFY)FxmCeoD&>pk0m-YyUjS}(&s&8jl{vI!y@UKF&nl{i&|Y5 zy610m{{GM3%fj4iEiGwC?tz%ZO00|iKo8L%{>giS`*b#lc`5<7|&)h=eqhO)fY%@yxRPSttwc4NoMgxU6m257E@agbh;=%O#6t*=O-sskFQVR zYo91zTjE)J;loLF`KHp2(7buRCAUqlMXf3I*?1wY#6Y^OImznidYz40B~CZk?p6IY z)iam2`~4)W?u)wo>lDA5@6+Q?bf*VaUoNQKx$LcV+uh=n^#!MXVMys^EL|sll@^EjN5y58m_tAp*O&cdp(o%BU8+|FcNHakD@3NT zmv`}l`|}yg>xA#@+I;n@?DC%q$80X9RVx;oexIA%=DH%l>rBSlEw3Fornwyb?cgQ) zyd{hK@WT@(cQ);d`uwcFrm^e8N%r|CN~#?;zj%7s+bd4(uJr7k`?#*W?DM~0f9$ls zU6|MLXIrl?xg94EoGK?Iag@EA`2J zT$-{nR4`qz^oPQidj@aH?!3+W=zH{Ac28u^Z`IdIGOL1uVt-BFa$Y|D$Kyeq8>u<+p3y$2+Cv&(7TMf2!vd_+)PR{fXcAf1CIF{=UE7 znV0__)L*mfYW;bO;=R^#X&aRc)85Q^I(6OU)mtZTbg397-hVhtAg-T32og ztiDvy9+qg8+QTwu;}wyN!>Y62I-D`L+57d&S<~44%dRN5KR#~p+|$&ENBvmx!-wBK z+uYgLwYG2fZtEuYe5ttluev?2ckbGEDD3Ichr!P-&tsn+|LD^r_nEhZ-+y4HHTe}Zv)e;HjpuRW-MoZz!Yk)x z{GE07=(Gz}%O3koJYy)=`BUT3^t6vNgd08Ay3D-nvQlf^*C&=iUT&(Fts0{|Kl@zP z6FjQv`tF@t57)l!JnbGcr%W~7a$WZoulaI8*Mh9h;Fw2Y0=qU?tjb<>W~I`d?-FTC zmpBD3?b12<^i@EMrI<>3Q7ntOi;L2iz00Fnz5LE>oDh-c`bYy%(f+tA|^jE>i;96eH@^Qh@^!rmEKrCUE;YFl;v-f0_` zwM!oy?F`)VeO`CB-!jdYQ;a!e%8XZkz2uwI^PqOYw56-fdL`v`R<)UkuQ3k_Qarw7 zUuHn)t!s-zm!uh-%hJ4R(tF)R^>OWnr6KAw>wkXOoBvP!!0-2anB)Kd;;#w>4fWWs zmRP)XO4QooM?U@2R$Yq_TyQROjqxhi&f^-(HqJQraO0i28t(!}`F)=P9?f`a!T0M$ zQLkX4+$58^$JzX62_L^Lm^|G@IHl9o&(PRMIPdC)$b8SoE?pDX<$G*3kn@{V9Q1ze zDv4!=mrUdWox51GdCo;8%{jQrVwzN^S%rzdslZmTm=78T{WG_%UNGU9%PGm^ze3FO zM6R>U?B8s*cKQ?{)o|W}UV$FPfytq5m)FSGPuj67V)Z5-op*VQ<6>D>X)V=SbfRb_ z*Y@~5qIECL_g#4&ebzYr+?=0`!K=BBNgVY!EBU(D@Vn&2$8VSL-{SsxO5E=F{U6Vc zM@XmM-dYpZ`uFXTqmSE8ch6gW+;+Radf)LL3;&*JuiuKE)0{j{ta&e=vA$&Sz5j5o@WswbiK|j8m@3yb zB)BYSa%Jg$7GijBLXv9Vgzkh>L8%Mce&0A<{jNSXOV$18g3~t(P6P$BUXW0(eP3uM z@LcDSZtUwXCgpSXUn-v8f~|367s0 z9#!!PUHMv%^A2>LxO#Qzymx#x?`QkZZ0~gM-|nTnsPIxn*Oi?HbB*GdOy}KEor+GyDDey3@f;Iah=pj&4pVZNjZ0Q&tRW=`QeE~`w3pE+E%iYV{Bp`%1NtO zd^0!RJze;imKoPJQI_tk)UCM|Z;h{62dxaz^)?B4ed71b${CW!Pt?iZj9XXvq2l!A z_qNYBzu))d(kz% z+CI)I=?A+La-NnHE1C4w-9DYR`C6g5(Q)C!i3%+Z9jzR>+mBd8z31qCULqx!_%pv( zv4mGMec9!C7QRoo6t_g=U)U7$Ei!+`b00yDw?e&D)MVmiE?F-~LARyuI1qxi0_8&ah*J z=THA&yeRW>wyDz0%OB=g%C8KK{F=QccZ1!9t+s_;XHwbNmlek3&inA?Xy4->O!{pJ zN~@oR%Gv$U+8Ji|^UM0lpW^m^`SpHs``>7r+MjbmT3^4F&WfG5dv^4`FVFmiN{%j< z-+#o6cj4}1+xzls|9Jno_5Gibok-5=UH_l>ZJV7P!WAqj`J6L*b;HG&X`cSCrSJMz z$K9(_+WlB}8Rr?*X!LGz8vj*JVTRLX5QUL%?Bfzw|kY}Rk&At!}qk^ zY@>H|pSFmpF7FCE%GUic%%`!td)i}zjr&iZkt_@g5sdi|@qEL%z+)Bq3|5^xqu%Fi zQTor@`PBc<>i@6&>wn)ZuP^*(C9$s#v}9_&=kK4>bI ztZo31c5T;tlhD9mMb*49t)U8ih{pPiX$Z11q|V{iJUDOx8x3Xgf1DTwuG zL}_geIjOlRcYQ^{)zi!G|DJKWsx#!v#l>-P{|~A9rdNL5I`6&3;qCj34Xz#9;9v8S zdwNX1&heYV*^fSa@$hY3ef`=K=Y{iD)xFI24=64A?wM3Eacki5)%@}wPhA!LcvN=2 zt+&l@6C++u@l7^aRbTfCm-anbb!1NHkqcXRGd-@XSrI0}>gc`lic(N_V^U$*g{bMT zLX|rVI}D%1s7~(+SzT4XKc{!%i31*W2v!@{}!{&k%ud+KmKWcUsP=@a4Syldi0vLODrZ8iTSp^ zn%d3IYnQT#ZCiib#X_-_>y*U~W~%y&zMfXtIY-Eh<6hJ<%T4=uzSN$sk?0ZCxqM;>*NIxI;=mQ%%x78|!j5*W z2y$J$D&oa22fxlaN_VrmcWy9R-Xs!wd+VhcZpRB3WgJ_-$3oC!W@i190t*kXz`6We z?sg?g6og6i2`?=Dkud!g6Z1XJ%N7&8k3BnKdXkr9+Adrfp}ykA z)0YiQS{RxZ{4;R|2Ei&%sd+F-WpW$vPZ;OS5!H4 zuKAo}f$fhKR=<_fJu>6d^INCC-roPecl-a(_s#1}|FZr&WNG*2%*=Y0`TM@f-@0x8 z`{04=U2_)6+d1WDn{7-c(MM&-S_`e&1Q#J zetDrSQMkrznx?pqF{k^E9XlQr%*gavaQ{n5_Tlc`={EQ450u;eRGrfs@w)O~k^1a^ zg5k5h+cN#9O-@h?(Q%e3ye70~xzVRb&%&131iil0Zst4lXWpc@%ND=b!7)Gc$TR51s&Bhr<8HRbi6f7MmrhK4q#^7IC$mGR@BIeD@>!j;nZv z?p?bjY{^?DRke-hR<6y;TI46(Q~cSG;Puh-==eLd}}e`y|TD%U-1A@ICOLCPt?Z=#5DIKLUkyh57? zdlo+N^75=n&W!e7$$HgGuj|@U>*|*R;XTIQtIHW}f=2HuxV zqP&*nN6jssGAnehsYUjQrCB?-^GxGe)O75~(bR}tm#5EadKz$Q(Y@H(-(G>DVuJ7Y zv_VF;+TO1}xFUDW%A*m@9vhlMyiNvbznT@+x171`>Iv=jv7hF?x4U}R;$-vrwH05x zqwoF6)$S{Izqa@3tIp)=?3?zzOA4GW2VOh7^jz@MZ_gS$7Dls{>9hUno_2Ps`aD06 zl3CAvAm`PXoLp3N~I$#mQKbv4@h@BCgxxxa4NDYhhJ>ph{P3BAJao2*_hY+QL} zNl?kkOO7E2qjvAOn7vTyihg6%l_dd@?<8Ffk~Bh(Shfo~>o&bylcl$0$(Gj*9qn2b zyLYfp*NSXT*m!M0*F~Ot(kFkeU^u_;S9x3e`8hw=9*NxXJMnRB%l3u4t8y<_+}n1| zR^!kelWRwBNAs%9KJA{rAn&LMYhe3EzK{;Xpiey=M=keHsa(dRu~SV%@#>LptCklQ zRP1EG8QA^sqqO*%^?IGfi(ZDx+6pcmOpZ@e?MJ-dHG!hGmBN5-{iTUGPn@i>iXcK zQ~lMXp2%Id%9MXUXTB;mYn`I|jALgq%?aNuC-OsPz|372Sl=J^j zIDeWmvwz}gc5SEhna3ram!=$KYc6biX`<-o$QyNV#?f=Vd$$W;J5@4Afc@I(+VZ}o z(WV*e=I|*eEx2uRMeB^=!m`3cfr;~!4c&^)h;(fz*^)WSC{k2E?73Ai&z4;8{e^Sl z-gGWs^u;TKXJO>yJ?t#^S$Z@sTP&C~^H`_emm6*cVbfQfj#|0&5?lY>oEPTV%Xa>A zdsn)aYpK9-pREt}Djs#2lXh!gteRP{>zPZ6&zlqHr4`qHC027Ss)C2BaX z@Z76jrT1?8`{N6yMP)=aXDJ<(6l~t={k!Re(Mx@$D-km~pGbIWCiOb5ZqoZWRkia< zS6747<|EBr2dmw6C)%8Ec~E#PF!baqtV? z3s6rwx?;1_+Q_W6Cg(Q2tNyhvu-EmG%|u>_?9P>!zRT|0+Vl8Goy`L#3u%wkv@Ywc zxzqh-%_{8>zFa6)*!IBYT)D*C6`GfK^k%rtR(r7K#oM=muL?GoWUFbfzS_30(&e~n z)Pu5L9oMSl^7oz6iYc(RdHnL-Z4tgF8G+?dk^dE^? zO?6k9UALwMtq}<{IFxl+OLXS4mal%XuO?#(7X(E zitDB+G1IR{wq~^~`?{l=@$EYUqx0Q?w~{J0yt`@Td{_TaxIUXa&$@DnwOT87ob&AC zJj-gF7PdCHTyROq4CSP?OG6J@PZSZolF=pFli;#MZ1KV9n_qO(bShq7iJDq>`L&#~ z{(HY&^@g6pOs{&PnL%(0|OZb?3_|+nIE&1B-&TWrRe5>-- zoVqJIi)EG8V}pra$9_9pHtRWl!X$0a_KuaOCB0eKYFX;V?vikxdh~Ak9L2tgQQcDQ zK9-FlO%C^~cICB(J~a`yoik~RV}`W;LFv#?-K~?nMB6jEW-jA>wD)SzyYqUXk>!n* zdP2o(mue}w^+>D|vD__i4m82j&b?5|FsWza@01BWSGraSUYD4AN@t@>&E*8qEKQc= zr|&K^-&UU)QPFQ*LQXcc?M5lFXZMT`_ z_x~5Xt5s07@A=no`Oi<+*G%lb+V=PJ^EYkErJ*~2U2==7er z+~wxXVbmX492%szfV8|3?$|%jdvs>zeJ#-Rh|#^Lv7hbU zzxMxW|MfP@?{==BUHcaDY@hN`Lp*%?t8j56mF}?RZfh)FcLb-*OE-An+-%AwawK|> za8cJ06Tw}lR_A|}iNCXPfAzVmS7)7l+`fYQN5a=CQI!%WU(Ux|wa+I82t>tK=S7q(;hb86D^Gu{60cl>?Av94&3^a>Ft`2eGZycum% zjO*f-8Pq(VvApwcx9YRUPnVaUIesELzGe@Hn_95x8)wT2`|#SA@Jea1|h|B%B#FCHmP--yi~@! zGEJcSyI9ZS5RIhxa3AyJKbeH6PA0_1!PCAp2xS?48m>MLVr{g*z4{ zod^}wl56Iw$e+1PNA%*=vTojKg%%F;G&FX)J+qv6C3((eHH($1${oi-PF8jv_pXeS z(^~Q1o%6PQLbgN#10w^2r;B6A zk5+|${oJ4a|J%8Ge(*iZ<7LzgDp=yyms+lG(Ill}offT68Qr@%LZ&>Y!BxHt!0q zEp+S1bm?J^-xwxwTsp74ab4`@Nc)uAd6_e21|O2RBDL_0a{I#tx2#^)l*_-ocp__W zssw+}<<4cCK96O$E9LACzfpF*=W+43-Tsv~YFq36PFP-k|8aQzU;D$m4~gIZp>-^0 z=k2*S?(@dj?@*fIBFWSK@W|0$vo1uwd&d9c+w%Jf<$q>e%d7nRRljg|^})LjnQzXY zrrXV#XWqH7f{R&aA57u$>S66Z_@E$6G2+|riR#zqKmTgJ?}YpOe_iL63;W*ox*hvs zSFMiX7Av{$72DHSDPIeHbIoA6hGA;%FSf-iRvEaeS~y=eQ%cL!3(wbZzNXdnv4OEU z<1%Yo;k3*%QLl`qT25c$)-p#>P}x`75?$=qiX}kA@`W-&8L3%<;MCslsHpy#NSZH6K za2=Za?u)yfwfy)1Hg zj#633tZM;FPML_E4Yi!-R}$O5*)1e=uCV0ti`L0q8^8IR^oRc!7u;96|Gw`1kLjTE zJ^D{p{awYxl3Aqdd@ZU)YgW;Otm~G z^R3!Md-Yqc>l}siIMo!+>BQc=mT0rajJHza=RNoNLd!e5&rX{&?V~0)>FA{kE-svxx@gjS)_qfiH@Gxi+iFlyCfC| zt=cL3f6@o(vvtq6{s!$Ttg~2=ady?Llf_G3>V#=ko?EjmE@zDuUtrkluxG2Tta#JM z{A=yZyvd!DjrwHYE>^d>SrWi~`0SEYbMINof2+J@T2^`OHo8+&b@=7vi5BOM^a~w~ zx>xhJwDR@V@Go2BPnsF;nD|X}`Rdc{pKi_OpP_6J<@ZhH_~iwjqWxYIyr!NpIlJP7 zkabf+^Tnv?>potv-o6gA&er<%>R^4Jubi+QKo(_)^P)P-Dx~KT{WH zS{Fq*Ei7K8bb3PF*_{uX!XHoDeJ*hBPsaT#($D=#E);uL*HQ6(Zu!%{-|t_)zqRgn zl+O?4i2t(+6(?`*JnXmYocHbc$(vofk6ZOmd-`Bv5X)K#=?@1TSDt2Zdz>MCdc{m5 z_gh<4-{w{Py10I0tfkz(e-4Kaw>_MYX{~)u?3B&wFj46!uaYy7lJ9s9$1W3bzie{j zT+r)BSBwrmvO3718h-2Crb^}nRz1tNIYOdedC`UZuqSgQ zzA2xJoTZm=#X!#Ok&W`QNnHz9DVFp_i6o0FUN)b%jQh!qnaM{gojJrdCH01;>nuID zXz40WrE5`J!U~VQ`jMo5QS10!&iiF0(;F+#OgVK)IYZa?vf)%7B@^H7RYezBTpm`) zyy!h%&h%MnRj+1n@v&(~YbP8{+Oznz%yOH@dt42lY%00kY8J3q@15J)GnbFl)gOMj zVe#AQU(1%COYPjV=Y6Nw#tT0kbUWuvYtGD`I)%$p|IpIU6OtC4VLrPm@{wNi;%6sJ zT$dFdl5%y~cu!BZbESbl=N6@5?z9=udGZxZ)mlf|N&JSBM4B0{*gUQ>OfCVuPKquCCAg0Ee|Ud#1# zO`Oy8{ceHG{}20rwEuIj|8_Mz{_nZ-f7|WT>*vk4=PpnG_xiMb%C5Jo?^oQe`};b+ z|NpiB59j}Xdv@2)&dk2v;;1-|B*5+J0dglv+RjJ z=RZAvyQM>}<=i%ZdNthc_}w3h$1i{X@#NBN z?X6gKPh^eZoNv}`mt8Wfva}L}F54)`ZAp7(lI^8cD}F^xBXlF*lBO$bl%{3+>^QdZ z)|NSa?tRNUqqxpR?1}#7f7a{u9<#NRg@ms)uF7H*5DZS$v~llPI-w}YaY?qV8!xLs zwnnC8gl3dx)XT8O3tQ)Wn`q(k?Qx6w1P1S=vFwus{T5FuYBgN6eCgz^{N0CUEYteA z#N^lmfoHXk%+h}yn=m{1!zx7 zx)w4uM$9}ZL#Js%^1&4!9_&iLz5R@4u|(RV2@~8hn-9)X4NaJ5{MPD1h5KCNZGutB zg$E0NCply%R$uKd7E9h_k#BOW#WOHOdtrX&EQP~`ChEt2KKk@Xd!Oe1+1r2ey$^cd zy8AQhhndFd|2h+OO_v9)SoM8t&Z?~*8~j$4b}8stYzpyOxx`Xvxz^idhZkD)dLEI| zGnc+JXXdlcKECHVrKip~FNtNHvsxzaTgS?r`D;2d4|PrKKCNwVs;2r-Rr^-9WSw)r zmKt9XDe607size8-X;5zh1eW%!?2TE7ah}Mo}<~Qvv-$>YKhl%sUDGBss77OYfcrO z>e;;M)1m42ccqkDoK)9OFKg#y^*U$LdpzmI?q~ZRuUob9PPkFZu64_&ohj^CwY1CB zE&Jq>ppdN4ecwzUNPj4oyL#^Rckn{sgbUyA*RSc{|HZJ&=sdGfz;jkz&!g5WRlTK~ z%(j@k_Wrab-Q0JI%+87}X)y&#Tphgo)3a{ha;MjLN@T+rR96J~{pT%-h1Hi-WSRE`0Oj!%v4<(;aU{rauch zz?qdWCtbFfjZt1k^HuF7jwc}k+wV+YcP($_I?2h)B92ORZ|;*ym7HYQ6e6naB$_%$ zJ-0^r-gYB@x8Ob*{_334lGS3?>VAiJeA$&|Iwh)j-o>CJD*_+iN?rWhzkY-MrJd_vy-?x%ZwmE5r-G{@?NST;+2WUUz4|FVn+U?K3U>)WNIJ7c`yO`I=Wo zbWdc_FV=%m2csJone-+^bsJCg-~Tz+^RnOlKe_V{ujjqyI%jU@@kWiA-K$Nt{KKnT1<#T$}XVYvR)9dcB<43#T2a@#-+Kc)qiu^z_@!!aLKF z*6gq>`kUgqQZ!j4Fww%r%dX&Tt&QU8=a<$oZ9mWd!ZYJHTd2fwm+G5>?Pp9}w)J1% z@nGY*i!)Wr3Z;ab4CJ}CpD#ai`AF7nh0w1z%jchZd$#VS(gMAv2dVCtt2V7Xvz&9H zSB8$6g@8nv`m)O|S6d>QR~+5(d&bnDh$N3Gv$!qQidIE%Yv~+a=~v*lB1(m2`BuI5 z^-5izC$x7?;!fgueOh%Yk)s1N4o<@XlOv$w7F%=CTHZA@4CBYYnt(` z{`Q^9y*?)o^~y{<_qF=YrO4{}TffOA_kFCr|Ngz~64l9z87~*Oome{QQBN^r_QGXe zdYw|@URDKr>>EubI4#~Ah^^UZvauspJ*}u^+0+Y?MS41gfl?9aE?bk9PMS6|LM^NN z#o}8*0&@&g7GDWVowYbB#PtBv&NYvJ?LKWQF74mNEu-U|(_t8~;F+n<_AOl}etnhD z_6mM3yLOGM-z+banGbxA&RpN!^8Z@9eBF=zKd#3A3thch;Xw_DUGXz@jYI4l_x~I{ z#_sVw`|teombFVWvbJ?@iQ38G)_(AWVrty;GfHV!4W7GfP`VfG6I>YQu{P6d=EBcO z*2^`+lj793t}TpE=9oI^@~rTewwanGddYiLQ*V@1^L+UA)&0&+=HLHVf8Q0gOby`3 z>vulsxzX=qqV6~Ocj+JRt=bwFbv8%8EJAoi>Jth7khMI!dHFxP@33y3b?AKUM}EPW z;~x{%Zn4{af0O;j{QQMGAKpsI+f4V@v+!GAS^S$nBe3HA-1tTJV?Vy^k6$SClKt?G zkiEO-w$>cHUUz@}hp+m76yxk``YY!dYUOORUHfrzlVJPri9!7p{QB{Kb^DH2@7?>? z#p=zVy}dft0kOD_4p z8BY>3W8SYRnH_2y7ZrTnGAnfEGN*#Jog#g~3%TR=8Yity?qX%{SS2C)>)s{F!-oq4 z6GL}#vON!*T|Q@%OR~vSw?5t;<)>|4M^f~&q=jT{{K0mYc zU$yP2i1$Y$5>Z%PITy_b=c6KVNH?eFQwhw*2sW z8~f>(cn)?%EMKeA=Ib7(w#m)xcJ{k^o74B+|770(Bed;z_>J4=CG>2{!XqXX*fi<1 zrN4ixu}UR$+g$ccouwJuU$4-;{9czo`SHUY7c7~V7S@{=&QRBxyCZS+@sAxmo8`VX zhA*#9oBiZp!THy>TmL>dXt8YRL$>W^|GTp^T}49X#Lj-ZcG21(ZHfHrw)vV)uHB|v zZn%_gowl~TA|WNTVG&!l?OL-UZzDZr>Fh1!X zx=*w%<2##s^>X(?%k9saZL_RHrk=Cz;keeYna$i}jqSpA_S#>Mn$Gq*-Gx=_D)i$XzM;T@-cqXsAS)?cWC$ zcYCLB?JKrO4pmdWd+wrFvXx5gF;4@f-{KX zOQ`5$o#U35A~s*S*6Sh|x+N@RYTfgUvqt?h6YpOxnQQW<%7106jJ8{t==4&iS1Xtd z#dh7hu*6eWz>0mVXUr-o!N}%^Yhq&Jgv}aFRCno3_*|7S_nrTe87F;TM!ULbdN+n` zJUD5&>5n_@q3;W^EKoC? zuND*~(0Dhm{k_dr&B{!R?R}EZVl*^^vyWExTP!`MwN%Yj>YiibC(wW)LbOmuV17@O0*1Ua*hrFXWzt?S+{%g?`9?pV0d(dxdJQn%Tf z?r)Mdli=~zj7ToHHZgnJoK0GNl~Ecyi+-jYm~rgzVco5wzvhOfv-N#1|FlhX+imqb zHa`#B+`0GZLxDS|@=hCr`BrTITb7H@cX!=cUweECUre6<&qJHnUs&?|-`f+D|H_%O z)O|UbKEbu_pLhM7@^$;x*xfl{bN^+({aFj0V)p~m6dusnW+<&`q-EvcJai-!L zPpzpB%s;(()m>Hm*~RO1=gw1U${yygc{bgDU${11GJV<06DD()Ok1|z{(ja{^rfo04cji8 z6iW$TV=ddwo9fvgmDU{Sv9!oa$K+&`H(SV>?Fl{G!ZNM~6knaTDW^)^WT8%AulZ`V z%~HAwOU>piYBu-T*=ZiObn~V;T5C-N(@Sr#EipT0m?)jqbktJ&QrO`cpT*SUl2--I zezY=&c~39znhReUrDe8>o0z{`do`)2r+rJ=WGTmhOr?b09SMeuW{IbCPL{cE-TmVk=gWG=3MtN!;LoePuZO$a{gujmo@_zVLJ%7eAkNx*oNw|c3Xim4(Wsrz8{nhV1H^aI4 z`;P<<_oKJec6%@X-aa#|G`D3%XVla3e|t^YQeumPHMgjBge`lb;riiPlW$3EvQ+;f zCbwBrX5B1hOqVI?yR2APAN9el;@6Vp7YgnL2dB>CI+{LbtHkcKYUzzyU4d&X<@!JM zUwJL(eBgZc4{$$+`-%Lzo%a$0n)pL5Z<*HCA^5uGLU~P1`RUUylmA_qU)u3nVtMC= z+XC`JN7c*1Z6!{>4EZqo)H}}z-AwPLPkN-8f^-UFB;LENY3yDu`&eE1`0vhgyZ>|I zf7}YMsIx36|6y3T<8i<{iOU|-mP}O(ovjwKE5T&N!E!OrMV9WIaV6P0?Z*!aCG)yU zXZ=eQ?&fC`3hK_%T^+OQnb&1Ef%U$t*ElP&8ECC)cxZ86>)Ph~xkq*{V9i)+;H!MF zG$eFQX+@Kn?*);^HO5*|&o@PF*vDD(JpRM->St%{+0V7^p08v-^GINb-4B6Q{wG2I z4xE?X{kN^_O}3Vq?#z9kE7E<>g>Jod^?P(g^U_k?Tak|!X!?qzzfE3vu)(Y*KVa>V z!X^7x?)f}*`4fxNFaOOG>s}Rc^IciYotWb9MNi(9Ejp%a7o%L(zQds==1uSB)ma}f7?@tyly{^pqV)<4@y_u7Y?wV~Vo%eLg0^tyw%ZU#ws+EpAW%t^wToz%# zb~C18i?Cdt`%AXvdJ#9@vd<~3s<7q^lh}1&_W5_7hMV@^OWK=kb!JP9=hj72O~w7L z_w0O|dZ1kPob(p0OwWkdFTRTfI%_KA={~Sz-x{)#)zzh!!!q<@o6@PGD3QRORdubL zWx1w?PP3Fao~(MZWtCy^DT$V-Q&G*6xVY{)XE$9l?anKU)Hsg4r_aF zv25gf%ycX&hU3V}gcydvL)RYlEZ)-gU2dXJb%>kTNsYGD9G%adKTG^YkM7ppDi*ai zf-&Prp-T?4;F?&`4czIqwF>z?59iMw})`z-H_ntjV%R_&5Y&zk%CscYAET4?*W zPFtna6~&x;_UPw*hb0=>vhLn`8Z3P+;;VDJ#_QKs2g|3;;yQl##0t)Qox5q>pBraf zU$kN?pYDPvP2Wr|yEW{0=7_#;J)3serr+nWirp8U-TSVtsV^uO{HH7U@7C}8Kh*C3 zJXe0M{ef|M-68f9yZ4u<%b&WR@&5m<{Xg%E8P*@^o>b&^WYf(rXJ$Rk^EnghnsU`( z{jTar>nqo%+031GVv>;7)EQHkIeqZkzHst`?JS!kmpATqnIn8zWao|YH+tqvt{AvU zY?Ceu+#x+)D^i)swt!+S)bgXj@OA(`6^m zshM#c&8|xq3vMWDHm!^G-<14#-Ua)+m$w+n`^_nOa4fU9q`o`|p=L@&K{<&8EZ*JV(zp-AHAD*1#HH~~0$WeFv=ux?zhbH%n zYo=yO-N>8&@y*HU4lK#)@7}+=k-Jtecv_*{&iZ2hXl-YKW0&{N>tpAX4otUQ>-%KO ziw$?1jF(Kg8B=lLn9$-3*X2u{m`uBj`+p~&xiza}W7`z%wQhI$ntweA)ZF#D{Pn&i zy%DPv+?qE|S&<=F^?0TC(>gmL@1>?oGOq^B$}#iv6`o}l82ZdGuy|?M#bvzdJuLcH zqDtp=SzJ$aS`fH$X_83O)-U&h1dg?9X-GARzIJIY-;sB9acJSASxJU#Zf_UpNvufv zaCE}4Q~h=`EqizuA3Az1ajk)!N>8}x<0EFNyT4vxySzhAr}_JtjT4d+w||u2_C7N! z_@J3`{`ARG*+;FGFN@bNjc!iuyb_ify0v-_PhQeB?}X&YXHIJmU0C~jreLJ{QO4K2 zJ59Yb8#dhKFR683yk;ANx{~iziKErd=XxvW-F&y_U3v5D=c-(v)@^)v|KHTx^Z%d! z|NhUn?0v0IZ)f}81edg%7rCwxToQTVmc}kN-`{#0wkaIiB+_>7p_RX8m#Ff(&snUw zTRr7%X6N!RO~_T?k^O9P(em)WD(~%glaE~5^669i{DO)ZJ8FKl2w0tpF}xR;eALo= zZLdf;?+l5^>t6X8Hzx!ymY%Ts^x9{8PCT4p_-Mse#UzL8pJ!B`adBrolA!t`Gvzxu7QgF`mROH&|)m?qbxDuhZIh&(w=Hi*347aJHy&^YI&Aj+MW^HApPv@0%oj z_u9t)pR8*>a?hVW|M#Wh+TS<%D^G0y^y*93(&&&~URI%VtbW~Xo1|r^HFv9r@EXS> zQl*PBf}4bSy24zW6rZ}S?kaX{+TNADsb}W4K2L>X9oO7+TdxHquUT`DJ)wE24%gaA zMM}r|&i<>q`#WpVl2bv#$1Dqvz1-rXrIppYC2IB7bK%p^TJC#x=6x2Z%3!o(_{s2P zuYdi{`WLU(S7g?^?AbAEmN?`6N=3DTx=^D<*~{-Q<~nRA_Uam+gX0=i3xUQ-TuH1Y zDb-6$qSY@=nUuzIdc*Av_5WHbO{&UoKdJb1fYt2HjXQTP~Xt#V>A(2{a*|61Wu2^QnTbY!lk_Yo` zP8%wR-H7GQXx$>RWnH`S$JZeV^QQV7u5v%!8l|*q<}}%D!W-R6ZB%j>NnBsDBrP?~bhd~^9_!p9lPR*Nyx(ejk4JFElsOkekFP4!lVG2_{fS!E zoP{Y%#g4MN%gdOW2X$p=XSnrpTw~X?Tz@NYd52UF$D;+C#O|%xSQ6_VV^kb7<=oF7-JN+~`cLxmw{@uiTT1TY4fdE-y6Cm+!H8v=i=!lR7)+N;+pzVd$=m>69`V=Lljm?q z_scs(KQ7sS;_K6S>f+NSOnrin21wrVGoL*#Q!lA!Laf@e=3^z3?*41Kd$jGrwmns! z+aA9>GP(TT(c1@Ro6n!%{rKcn{leOhskVOXKkxm$KfV9me{Wu+)7|OsAGFEN|M#P8 zF57D!!}Bu!?8{1y+&DE^T|YwY_$2YOKNZTq%WDQn7~I+WGvxlgyIotSzxp2C^HE8z zXS>uk*|i$pezQaa*IM26YYHw6W0BGn-<9hyNAVo*er}8Wla_(AIwY=ibx4FREsSzY z`j!#cBkHwkla6Qf>YVMex29yC;n|z|LiTcm#PXK+I^w$>pGRn1cJi4TC8`_hyn!Xz za+((Zawq4~+w5=mc9|@FT|MXPqdkX3zI^DaFNa;EuLnF0t@Xq%UrGA8>~_Y zP3r2{`09w4bHuZzt`isR{r)W9nlN3;g886!mPnAZ%aUbHRjbcMPvmjC_J%z+Skgp1 zC34o5Jz59Moz?fgzQz-_+UIf8RrmkfI8?)mR#v>0D6?JEE5m(mo%o@p5j;($)Ap>n zyXG24>~qFg>E@t=5zX(Jk68$uj#1WHwbP_YxF$k>Yq8FgJst(J4Z5n{_e=jTi@Orf zeD6c|^V)Z3W*YzhBha0_(khu}(bOoHUHdNAUFP=Paztq@$J@Z)+PqRtFXu$0oA`R2 za@{U2y^uqzH}U@G58n=)7RDfiX4|UFJ>K;*xzQ?!5U_pc6r+|Et4zJjM)>?Dt(^1 zHiStp73-2(6U)mOd?rG@L!|8QfeN1--94Z8Ob?kdU0+;xMTToO+a8C_8O|&r*~UtX zu0=4vjadSz9}Jgdt=+bDo7}Rak?mV|wKZ2ieRh}o=ab+3QJ2nKz06ydJ~Qgk(WM(I zFMWPBd1jb)YNknShF;;~*6qjcnA}}X*aq%ZYggP-OIrQ?TX}Kt!%B_^XLc5R-`uFM;Q!}$_P>gyq1kHzp<@G>dAjyZyMjJ7LBTS=)nuCW+u(hn&&rScq7=KEmB_YmU(K!>lytM z_lWdF^jLh_#8z3IzQN7np8KaMQ?3;pG@2`R>@w4_pzgrr1^aoXw4bukKhj~gF=xG% zY`^mI!yfykON5!ickk`eI4$&YTjLyVA>-e(88eosu8W=L*;%-3ThFvpZ}QGM2AAM4ku!oPaAR++86;deB8@uiSx{?B^~Dr)^#iYB*K zWVJjnJa=h}*SgTXn^!c<+UgM9dx7<|h3^s7q?`q>|GZjlH0_&3ZM(zD)>~4)EGnNj zEq%h8EUNw5CH}>)(p9V-m-oDKT)R~Imub&k$*9#4<{S2NJm4`^FEjUA*|mLIkk}EE ztSH`ziMwA#?Vb_ntFv4H8}%Pi6}CElfj8&ZJd3kB8@;k0>pBPN%@y#-H44@ zbZx>kH@}&yvKjqT{zk4bwn(3#wneGsLZ-(|8}&{-qnzzWBK|w9zdQfmhr|5;4}ahP zao_I`*7E-j+kg9ftom7e+CM|r-KDqkrtSYYeShr#z5oC2|2Dl?Z@V3 zU9OoBC3Y;Q&@N-<>L0hV)7hGCZr}}nb4T@F#jkbgFSH)5*&_K#r{rDJ>DPO&MLl`< z!BBqhAKpjqGsXSu=BbD4XNdgLl@OnKnfd!;{*}6)r|N+i`=UK(O-J&MC^O;#qk|=3JF@@0xiby6kpum-!j**lHE;r6+Eg z80~Nf7EQk}rzN%TjHTkPx?{JbG}j(u$i8q*D@@0E1J6ArjZp1_k!-hD9#uB^=vLwx zy2-IQy7c@at!hTXw{yf+BfrH^wH>zt8Vp7 zmbt!OI{S)*w%6igJYgB3nxPhRj1E?)TzR1TxOT(tlxo9V`Zhe{3zL(LlDXT)0bt;|#ySzU*$5)#4{tUTXia;#ixS=v32c&FM|kLL23({Qag*<6f$Hj^mznh^v>@EB5}6 z*LpASV0pj)5!-k1|6l*VlmGSZ|I5Si@(;^rg@R`U=1;l$@&r3WM2~Nh&)U^__oMiI zuNf~Y{jsk(YsJooO+sw`+N<^zOT1P&-}yMvZS99YH&vswFWiWKJHuc3d%63xDH%&2 z&3Sn9`TR{cd8%q=EZKJE>SWo+nt{oSo_+n3Fjw)Y)-|cME2e~m8YsD$>h@kfyvNMf z%(3Zk)ONpj)y?0hMQz#^CExyG%C!R$i*IS|OxqHW}Yz_Qo-V^(FJ$j3@ z!M4LW<~mos?Iqq;KP;(uaQ3g@+TO$$D>q*J+SeU>{%}8E&6khf@ABRE?zvM?{BTF* zrED#Cxuk<;i*KJ>B(lV$D*fQ%$8%1ueKaTZh>h7_(Ob!r_nflQeLu&sM}6rk&9F6E z&D$+*Z`rzQUiz*DZjK=z#RQX0^t6_S86I2td0tQ{@5+@EQ$?n2yzq5z)aw&V7n<}0 zMump-%qm^1dv(70yK{fuJ&W1#`(?6S%QyQU-Tzmwd-`j6Zu-9tW3}Z=E#&7^*axig z+I~ABM$zuh$&YzUZri4AzTYkQQ}(ahTHfS?D~x=V%}n(4c(>XmyqS2f^4ss;yxr+V z|34jA?e7*>Z}iHfTFQUv`+2KAM?31Mx;>i0!OY|AUN88qy={2psx zFNw*XqQ%j*^}|;CAF9iCJ}{g2SaY-S>P?%MojE*PIWzJ@Y(o9!gO%?ODqJNo}b*j_s)LXPan#byq?4H;>U+sm*4JfS$DX#@u#A2 zzi`u~Bf`HLH@qx3xNiEC(nOmxC5i!ZVnuZi-hE5m?4a zTHBNTp!$QHFRN~E+oDOHmg^-w7e*Ji)j0Hs8fHH|AaO8ip?p=%edo1Drfdw`;I|_4 zEFaI`s5LUng)Lo!<`m}5El9}~KUCE%tP#p6`Z_?j_l`nNi`|!=;}e4>No-!p@t*V3 z+5Fna(f>I&>^cAYlcM}Q?y~ec|4;wePqfP~xc}qX@3#D)e|O`5f1CW^(E1}GKkXe~h^C2cKMre8K?sn@fX46s+hA2K=_DEE|X9}yVzxuZ6{x@>U?#zoTs;@Zw zZEoY<+XZu`yiL0h9b+T8!@kz1OT9;bN5Tsy&|Lhq*3+xA%l`U>7$4(HI(y*Rqn%yf zioQN^JAS$G{Jom_x7+&#H@{;&Z5Wglc3<+MTE^z0uTMJL5|%D$5j0^@?sW@1YSFP$ zAUM_jOOE+8De20S6S{a3&uVpfA7T+q-WwG;+y0ql(JZ0eZx1Xh-l4W6!hk!++*a(k zP1;5iw)9L_!RH2SD_5>6ZQ}P^r?r#@gR4CKpS9hN(3 zSsUX*vtN!&-s|4t(UVxSRmiISn$k{F4yXQwXSfb7hvNQeF1Jh{$O@9R>BP;}5B`3)7x?$g{3oA$ zkoK{TfJD=67XH1yEQxb%g|{YcXu6^_gKy9FDVo8mE4Rk2*}Cb7Q}Drr4$b1y&FS?Q z4f~BHZp6HQxocjK(DK4GIpu|~uUJeC+qBATi{>%OsCE6U+ugEX$1b?^;hur4^6@(! zJC&{lYJIt9XI8%Mx%8GrQH76Ycul<)Ag;4BEQ>McsFcUb!u=v&E>G;ue_gW6IAXcd z(t@8k+B-w|mYjb!LGNHRph$_e|q{IuY3gRYNgjL6Y%=`IJ7DE z#NxC~<`UTlOf+|9T$fz;&9?pe`me8!ZrxK+*Q(e0`}a&o-rwobYXtS;-&|bx{M~W( zxH_4avQPH73GA&XJX;gqvHaL>@##F?SNreToj82=NcZ{riS~ck_qSbU?|mk0dG~JO zq+|ox+q^!@C(3XuRzzi%oZa|xSLkhdQC;3s$u526S7J1`KCo_gF$0*X^_lyq23E1Z-T5-Oct(HGgg za*Js4A*;X-=Jj3j@9k}$TOToge(0|M?C+KH`F~E(f1|%H`|^O@4vpKBD3`Hzh5(Rw!L3*KWE95WnmNaN-C}ghFHo9uZ^0vc+K2ztjF3XE|XN; zxc}a!o$p?n^~D$^7F^Jp{aQENx!vOU$G1MGT7RFHi+HF0X;Mbe%Bu-;9zQyEF`tR+ z3RmcL&R0QNNmDlzX7g_seO8!e zaJFoHv5M=M$+E|sOE>gzcP!Gn5$4Ey%~DTKf5(m;PYS*tc=*lKRBuaEhqsGBk<~^1 z*{0p^w`l3{E|?{7x@zHyX}7pS6_2wl3%t#=Hqh%>xvggC5iyr3=cJdUeliM5YM!?7 zT0pj=&%x>$e#VyW8^pxhw$4afc%NmB*|d)K@nHt)`a`MHrUN4cTz;ar-=x?#N|3f2@1$ zrBlCU=ilo;ME`xOuld!ld;jlA?zxtqt0(90`^WovVa@J8{{Oeve>=Y|yKaAlk9JVs zagDtumA^`ww-$KKjMDD6tM@q_!{1k)zi#EN3RAm+4$j`(vrHcj1!+fKNb0G0Z5noP zmcm_w1mAw+zJiVKriXZ6&#nA-XL7XKQ7>V~B^@Vb$tQFtM!Ky!_oT)%+o|t+QGLZq z=N(sS>lsaAp6{qyF}(o-LpJ;^y3CD+FuXS09V{n9|$d%6balO=5x~x)7@KAo5MJ+CcT`nG;z|W`K(?Y6k2g* ztBZ#p=e_i&*>*ixF!gJL?fRcP&P8TrE3g%|t-9b98-Lk4E7WUk2V=8p z3E!%uJ*p)Km#dz;_iO$1YyaNp|9_?bfA9N$SKp_d3oZwpb+!DN^Mlz85ep;@vrn#V zTy##lFl>qG(omNpe}+0HM{c5Bbuvw3-% z>hvxpnfUWlq9paqC2Y3q=a)`5RvdDQEF4{2Z`q+7*|^HA)ig+uJPG zMy{$AFIYEmx`$rikr0tcX09_*q7zTA^3z-O`lbg3N$} z*z`s6E&4hWcPGv=dcSw~am$Lo&ls<|f88IeZ?Kh7>6lsayl2ZnL&Bg-5_uGlhJ9V- zCc0)tS622}i+oegB8#~d6%`j^blzY2Uh!$oavkfsKPO!_x81%iEPj1j;hx1m`#%2j zi`Q>GSCKa_&Va@JY_{L)r*;17%xiu2{J8V{NBF;~_KV~H-qJrQe((0@o6G-O*1vyW zdnoUQqO^PMj^j((3}smrb$Nqzt#1ogxlcZ{rRPZ)=Uip6rCYW(q|afkl;II@e3PZV za&01ygtpE~rK<~kuX!w)vUN&Z0;BT>C+$qr8rH*`&P4Fs&h?L*RKb6cJNQgPg6@+T z*5@Ivvo?OLVK0AHZVIYXX6`=~pUY5G`&U)?jQrMR+NNjqO2neB+4!Hhdf?$(>B=3| z-iHhSzFGNYH+N6u)!I|DzNhj|QN0+&CS>aBw|)B@zWa}#9{+x4U#%j4zRpzctq)hm z*i<^6-peyxTtQaLNlN?L>Tk3C$__8MEOYdSsr%Yzo3fOOmtOPOU*57I^?Qo*{*N7k zD$Vb03VZ&%kl*7Hx}&PB)o{a{w5-VP%wy4QuN&VUomO}G;hKX{GoGLMA#nYi5R0MM z;{+N0BdQB;U09>zy}0w~tCt7T?yukXI9bK*=+}9v=Z@?Vi%L4Pf>l`N@r;8KJ>PxW zcb!WsQR4ru-nU*p!1v4ad12`;vurAVwd{B+XnLkya+~e-{U7vh*Etk7-um)ybM?uc z8P7vPv`x=Rtc|hR`|Q`v1wsCwUiQ~Z&lL)i4&(k<@kjRRqjx8H@0KOh%-Hbjz@CuY z&;uH4o02~4RiECpxh+EIT(woYhULY8KN}RE9(if;a5wMWyzX=r!r*6M}nO}BQZ)(hn;u!TGcaqgt zYOGy1Kk|BXkj@grM{UPng$3{Obw78i#wI9Q^-Dl;B>&_!;vK5#MW>EPysTzE8nEf0 zb+ZR!+LnVG?rz$9Bg;>#Ythz8$(Kaji)=D=Lwh!R#Yhx>an`?Qxi;d6)yHeuniHQ+ zaXb*QyDhU~_rKh$J)5VgIq7i?)=)<(eHNO|NG8Af1zdZv*l;D@B6F!`Q_cM`~LqkpY!tY{Cwa0h1a$Tt-e`t z_;Rm0hmB6>Z_Cb-vb&dyj^6ItJTG`oMXgoAe4(oxiWWyWwrc8C?0Rrvn^sxoybZUN zq%@AMh}y8sL$5bkj&rYTN-p2UG}D&2Uj_!pPl(L!s_^o$xwC)a=IL+Ds_*SH+Ee#c zFkD=J$DO^0D>_z~?z;ay$xGp6oUk$f_wQ$x??3$Ys~8__i^9ZS9$u! zHfdy?bA0Vcmr&?Y{;cTie2n zRo!BP*cKaoX*3i2v}eJ_jk%5LiQU#^Dw$Uno_zgt$t&A?R+_4-zdo4jnCyH+Xj5Xg ztmwm%85^UUKejzySzw{N<6IYSHk*sz)GZ=={(JH{9kl2cWPCHLdcrKez3wtfJ2Urx z-BqY`Op3QwT}0)qq@&>GZFw?&6YqqjmYF#ju(^8f476GimvUM1E`L~4vCwjtGrhj8 zwfPZ#2KuMEPwVEi-2UA;N$VW<^yuSXpH^Af-wR#2^W?ijndiLxR_U7lDP6BW@6Aqo zRlltPycyBH+@aTPY+s*A{;*s1%d~@*@1h@DsO>uU;(Yy2*)R_goxynR13?r%vL zcuM~Cfp+;t_kSF_&vGp$D_O?X__NXD2>qW$LNVJft}AwO^>SVt7!{})^`cxh&7mmt zXxEmIm8!{e4z?b6x#htxLG5U-yeVN0^5WaljzszUc`hpq$`xR9KQ&cCd!6y>zlWoG z;=f1g_NGP|9K4uow5jy^}n~f{SV>z_gtgWb9r$6=RZ-W zCV8A*@;F<)@LbHB`73X~N!fjO@+5|)jy0_8tp2^QX7kXh$#Q`>f1&T!kOZ7Il&{ti!;4)HtdEC^ z3z$l@>^66Q=A2^8V^dk@IE!o6lFPzYk{Os*&Wv7K#dOlB^)EYJM-KR+#b_UhYdivwpiJEu`tJ7(_ zmln4jeqH@8es7|jc+CBWZ5y=Y4!6}6AN`Qj|Ng#>X~^A1vNq&)jpiFHhn_l7XA#apA&KOC&rO2L|rf~@`|vcur=Gi{N~jR%{qO+vVp8_f_v<c?(S-T$^ZazNAJ1IsigypqWo8p?e4rym&je-PqmWl*LnkF6Nx)n0r zQn;$U<7n0Kr<1*ly3(S8_U*V4$Nc}8{Qt-GAMJm9+g|^%z3uHoU4@D#)bs`AnwWLo0W2rpG3eiVk+H2-~s4psKL4IU`}F z@$9n=J6A1Ho%qW3nAA4$>9a0RyuNoo-VrPMcpG+Trg4nzG{ZAD4Ex9Q1i+fq>LH6TE z_dP$mT>t06@B5EmPLF@`>m_$z`}8^Q`V*#R#@u*k_T{#B%?p9j1-zxMM03wrMKbG~+I?{)79 z@^)P_F^p%`iW#Mcq>?q(X07$g-^;SKYs0FeAzxmdoOU5{<;Kj<9k;CvdM(7C-MR6l zEr$23w2P>AcG()Qw8&LH%a5fc-~8GY>U=*kDX{Ock2hb^GM%Y!?LIt7a-Y<9+j-$s zr`J6RT7T2#M&w+bbj)S{_7h7w1n*UEd$>Bj&b{t6`+CbgRvGt8o7PO0`aG$l*rl=V z!y7Zk%TgBZKC+)fTtaWe=atSAUb*&sU+w#oD;Ml~c5Cah5Y~vz8X?kL5wBgc8C|l1 zW0TT27_~dLhRyx%7kzrwJO5>q_Vev|WD{ElT0?B~Z~wCWQ?90eRm{kJ#G=b9dbC1W zcjdAWiI{_1SGiqJ{}9D(8v4suz;MI;%A6M~ZmtlY8YZ>;_sqQOjc+@aA9)?T@OH$S z%~xUy_9m7aJDAQn##z|4omq)#SAxuw85h-JV&XbFK74rACoy?PsIJa6sX0+wOm?kv zK5Ep*y-k$mMh>&3rmFeeC36ftJL*+ceit<-+tV}9HIRrXvtd7n%C#rUr7Idw#N^ALfCnMYhBOW=NodR z&fOQ5eso3GwR0Xj?rqq6^JS);XQgq`->cqw`c?(ZN0mQ2U%dO3FM8tc+mWo^*DJHm znXC<%qVOO$)ytE)uV~hjugC2tY@c7Z%>K{C`_C5l?_XXvW6Av}6D>z;11CAxrUmEn zGm<)U(;~%+;;v3TXFbboj(I@XgNhbzW%v7>eH%k{L`Wwc{;XdL~oTn zCUL}B)9bnJy~t@xiwwU=q+8g`*|Fos!@bW7BqFCqx;Y$;5S-|4e9K>t@7$c9v8Q$x zd=GYs^w*rfJ+Tb%5GENJMyV?Dp%KQ7QYJU8Chq}hUSFdl~U(>j8Z_n|_)m%bzUW9CU<~GOZ?zY2h z&QV4IN2M1|Z8A|^zO{J$?TWJNvWM>lP51DfT6yM2)JJRgnc~NGcfQ@W{C@t8xVI}@ zZ`!;J3{47Y3Uq0;NOSsNAwD5Apta-Ex5wLSK0OZK^XmuSd#k#C{IwI`x+*L`^YZPQ z$Ax0A=Um(5mv(gNMoG4wh^R0QueoY*^}h`H%h}sr+rBg@{Qs=4B5K8|DYsPgSsybj zUNCc+R*=*+>DXs#pJOJnC^6sm?lx}x_?UU(lH=j?PrQ7muuPsKQTcMB+83|-y@$OL zB#kT21TA{}>E(3Jzil$o9>?FMovw(VA+P4cF(Yipjqf_i$>lrUT`lC)1di@-)9wxX zWL0{-x@LonKewv;w|`Q(tFN7^ zqmIMp_{16FZMpr%a)SIxo`uUY5@qGpSt!Zmf< z+_YVt^F23qt`OLBG{D0*W7VTM2}iw7&9reBRW@1sMqls4!pXOPM;rTf-~Vz~{?DOj zN9BL}|NQX((@XvTtDf(E{_mRc{_Pe2nV*=~F;_l6Db6am_5W`B|Ld9e2W-jonwfrZ zv!PO>r8uzb?fF8)z+Sz!&md`S#p+kOkVky#KVXGuHxNy z%jU4Pe=Lvq@A92@>K)g$eb-p}^6J^^OP8^@$*C_?p1g*n8yT zfroWZUj1aP)40_)*`hFJZ-tZYsoRGclWo_gypywg`0{LV-T&+VHEQ2WxZjA6S4#Tw z)B60;Uw;1l+==25$695i_wif2HaYIh}9WJx~9A6Mg(g>T1sx1=ZBEpAW?t zb(|`DQ6ibHTReH~dxfw!OIEl}YxjuM+J3zG&fWP}-dIU)3tT?!Ye7ZAJmuf7x##6q zt($e!P1PKDn^@g}yjXU{D8$)*432bYtj4`;j&^K~f7t3b9K9j)-b|2uT!pBs{0!fg*uxOIBY>^@Zz&cT=^ zHp^^_)T2q2zm}wL54NqT5_!L7ny`_q(czm##v5xtRb0u*n6-MwwJm1Ntj}gx z&T(6o8X|i1t5`bg)V9|x7NI?+8LO8}S-H_mvs+8akLR95Na(cG#7@a{*EP9OrE|Y+ zIM-l$<;n)JsOb6rN7qfRJvQU3!J6I}BQRstag9zMZdc*Q&PN9^nQ8O|6hGV z!n*27Iue2|)?R1MJZ1?hs8#=5sCG^u+D+8z{fW09bHc6}eoHhk$+q+jOmb~MH+h=V za~qT6n|z*3F+6tZh|r#+-pM|z%PvP9wamCRWAUWvC#>IB>FHP7Rqp=qP2%R;L#s^n zIJF<7SIoDr;PsopST)B3u+J!BhUQ^prMBmHq6j`;tMY?^z;Ig75 zOSN6QOJ~>o%Q^q>%8bn$sy7L5e|h1{tcz#1%-AU_>_7j_O_TFKvRrbf8bohh`04fk zo8>>h{Qt{;Wroh(qfUmK@7!kU_+_lzY#6TjuH zX%4+lE36s>_4KaKP%%_kbSo-Uuvy7>cA)(Zwhw=PR_?d{yn8Ze^JBw>(*5=pztv6q zy`}g+ottjY9@JT!R9~og_o#4I)2eA<(&wUnox5~v)hQ9?pzzxdz8$-`yUo-1{hsel zsh?KtO!@!BjrV#_c|!Y&q|{Qj)q$^VEJaO2*p_p2eP7+QW=WIjqNOT^VU@pHb#K=$ zn94IrBPw9Q)FVb>XI7UA73`81WX{qpoK<0=rxV;CaY8+oyMOOdi|#91XRACv^zdQh z4xgG|d&6r!U5s9~^TU&u!a?VDtSj0fZ+PtDPsi=Ebq`axO+Ok#OfW#*9kjbU%6&!P?qu+x9#E05w}yU&hF}w)a|`c zt>fjnc-djc6T*-G%GT|^__sT|@KJ$AlGN!v4|cQy^LSi_NnODxZWp z4L4T*Vo`3>)SCTQtVdCQ;=;`-xj*vG=5(AjcvJS{++*1@_mpPqX6aa_MloCSB|MQlZ1|OZyuirxjb#`~lE=?2FIw$FC=(X0hcRNdZr>3_Sr=ijc1=k~z%kQRf zhiOJ>t~8vVcI;=zwvPOHc3&*6D`s7|rLi%wXQ|mzv4au)rJ_;M-1GMt@-)seD)bEU zz8d!6(JQX}xwW5Pi7QMx%*i8dG;s9`?vr2!2Bir|1tgB=huCI zy8rw2x~I3QzNbeeix;1CG?;$7ROpw9>MYUR6dz|Cm`r=lDx>$NOFN>jL!Mf?W^$Vx(-dp$U6MN0Km)}o> zvv2!5Z~FQ;L%H`En#OWzSJvFDILOwtc~+*XqIzlA%xYV-3~zhrf6ljl_a zzS!^aRrL5r)wi3Ed`erk>(mtW4V`b_O}hI{QqN-A3`eHe^iJa^mn5v*pIa|8e6(9P z{{Jieg4(ZB{O$fS9;;fnKEL4FV$+Ns*EPbvh0CVwked~yIMpZ0&8u_K+RXRXYc!8o zY|`PreQ;t?*wTwdZLJh4o@*Cf99*rJ>-77| z?+o(_Tw`95Uf8j0T8Cls9>ws*^Y8V2X};WDtA0=7nc*aF*Pf)gv8HLJj?C#&Zr6Mk z-D0_Jxxqn1G z%NmAF+o`}dNA%=QjiigqIyO(a^5NjR|B{Tc)?rs8ni;dS5<;>sn|fcHrRHYR@%PyE zeLMbsujjCTRNKOT{x|5B`G5Z(ssCN`|3tWV@Djz>yP|@fj(AAyxwdA}){f7-&%;`$ z@itvs+#Q_w!sdLa$JTX{ z2X7pIF1!8R$yF@vT8nnB6W^os?2bnT_!#}>4%gnO3)}9UEDej!4RSrH=Nw-lA)iug zsxj&5+4SuzJ{H}Ly!$PBZ)LgmR>xB>&Rz|hXTSf-#}o;F!F-vyTWh}Ut)3Ki?{>WB zbC+0eE7^Oe&IYePCeG!_x7_piw3OnV3%R3wO=Jujg#*yI@@u zdp3Mw`IS2-f>n-fwMe&iV9{Nm)gcsQ^ogfS-(UVZe`2Xky|RZ#<1j^V(DIf z3A5MxW@z6KsMsMdD9Pche|ihU>)+S1!jk6{9y3|?a`~T?^DIA~KL+aII5gDvfA3Xz zyT0b}-+Sht&z`%T+mpR}kEwwi-=mxW@ox*{41EI@PCeeb!qjWsmQ`P5pIj3O|9MBe z`NXFM+wCQO9$bIl=$Y*g>5a?6v!z!lMXlLYr|b7bb^Tmkww~N4A*L+t?|Bwj$!}T_ znzOt_+TA>2f=8F2%S`@>VPQ*WK08$tC81}%&A++?VUoZsKhFI%3^uP|-H$L#4<1xqwffBeeHxhVYn`WNQ1 zg(sK1Jn*sNc!gAIB-bL}>>dSC(G!}UQAX3R`=4;ja9ybx`LJDxmx)g{60v~atvYG{pmhoR18pDw}YvQEsR zSwSJvmc2TkTX<)OzI>@uIkS_0;=`owEr(tfxTNeAc+-^JHFKJj9f#Z0%P$*u=x7*w zDLw1FA(qs;Vujvkovc|LtHhQ}={hwlF}+v)s=ws&&b#lNei>x=`HCveXebFY3GXcy zl;=5ThrJag=?hi_urk6_O!&x@D!)AoU&a0UY^5kb^GI3uA6oWJ(qQx zI>Tt`w$iMN5rqc>gHmS-{Wb8uUitCfbydCS=WX?0_y0Rx|MK(xZ`u35J>IWVf3s$G z{`L9yUKKw(v)|(0e} zC0-$_SKC6p{W!0hdZ+Dv{j%r4W9ItM)@|>a4@Nq@(Dc42(=EY&i)*FUEtx3Sp08S2 zPaft8EstCuA5&Dn{l)Ct=9kt!$knjxocfPtA7?Il%C&UU-Lf;sPZ@E4yX2ke zmT%u{bYCrZv!K53^yJBxrf6lWy%I8hdDiEofLUD3^)KJ1oSe;hdDaxquT|TZ`b}-W z?rx$`{<(=~(eK*hM(Vd>3h%Ds%Xhfg<(Yd{N9Z8OmQ^~ckLL>K3N&3#yzV(uy1nqC zX85JQKF@X71kTT@)N-1wwN&#;Xza~gozin#ZW&w?V!E+*Y3K^cwqDlfGklhbJbh>| z$$Qem?NhWi?R>SPu<`PorPG}5M@QwA+?IRZvm`)-$Ix`nMvGYfjoYeR5@rf-jSPt0 z{8HeTorAMe`p0d@+0{Rx@v%m1}&Blq#~X zo$0*7aZq_%pth0(OQ@hgvyOMt3+7`I(Luh~ZrTehs+0U7D8HblA}-+z$ z{xtW!!`i6cg`FJ=TA6+lueaW=IH)DD{G4^>Qo-dacaJ4@y{MU=`oHGF*{7_RHG?-P ziACk~@EePtFN;w3`OaNekdx0QHTCxN{K~H%vz_i2|NY|hNyfAC5QCk?oE=*ezb?=a zExd4hUaF^w=_biF%Q6>D?K+sX*&|yrn>j&{*)lz9bwqY&@uK}VnnPAbnLIzSK~^Jb zX0S>{`!=sNyi0|e)ZLz5eS7BZ;X^x2Hndd++EtdGw+P!KuJgKNhvA~FX)zlvxokCQ zXfsWVoqoOa7if;>+#eo;+iGG4$2`>+UF)<+p3t?*L^JB5+^Lukixy1FJo6-I<+X)+ zCyV(DH`RQ5rjR7#KX31YXH^fLtt|R}QMTJOXIGzZu}q%2lk}5kcjxY!CVAYmNKTN& z%XN0*4a=3wPu1M7u#lPI_3Y^G^A+EUuM54EJ}Y9t`n zw0f(H=*PBcQd`4jNgTPgmGjfbd%gl&Or69(T$>ntIG5?1#57GM=j7^*>3QlQQxlpm z^_T=7=`hR?P8R5yG0Tdv;_IvZiyU8^nR%ae4tKddtCW^}&12@n_qpLSw?Cm^Xkt9zu&(;zwXa$ zozD)J8aM1+_+C$=b*sbkUa7#MGuhK-7)$&-dDC5Eqrk4dtsadL>`C1}d{h62Slqdn zc=lH2yJqzqo3)Xj=6qy2yjgblYPqPRrG3le}jbzyKa`o#J&0Pgnj+b-}SHC-+Zs0SNm?(4B_v0JGW>Yf2^}*P2s$g8x@XS zdTTZ3+m8zmza4sJclCdF$e* z&e5}onjE@1h#~pfZKJIcyT$fK34fb@J>vT165g=wNu9+@wsMvIjg8n{E%o_h$5+|B z4_^)z?}?T0S3Z2S?eAC9tzpwHGhcq_z#)5j$1@+^+kBV5E}4;$Vxs=cq`17^Np({3 zl51|$x@I|@5%!MqFwG8LI%SbXth)4?(EL3X@2{}1uQfVa{mi0JDt{|Cv-AF`>u#@< za9_!qE14X+RnygRjbr1aYj*R3PAzu6EfCZG@}PwGsm?7bMY<;X6>FD-Y&iDF%6)BV z=p?DbdDjE8E?cMzGGB{$`>jz(TXn6~<-1Sg9&O6-`PzMb_v`%%O8;l)|9!MwXaB*S z1?A7a^SrNb_;6OA*?vmm^}m5f_GvG>R{Q?u*S=jUn;JVd`Lw37tmYM5`kpy9U1H5a zjw##BI?4}joZ@v>^kY}X((i6+o6c!I>Jg3jY~G%juveetp4{KJCP z%WqHjNluD#i#*n8BC5MNq4)4M?kyZUwN$k&?Vr8b(zek_UM98i@!dn2(L48W>bzX? zJ)b|ucK3z6cQ4vyw|#%|txf*lhsN3pt=(s5X_^@$ns7 z_Jg-dCWddym@of5v)bJLNQCqL&^i2PHcrf5Cf(I@dd2a>Du1`B-{8AnxuR=h-yEU8 zY0IZiH@~zqEM~}$a=o(ZJKx#1 zpxMh}G(>$_S02qcogt@tO=?njUT)G2%e!Bgts*5Rf7)R7;)Yz=zQd`B1#Ry<{V#jz zWb54(G4|F>IAFiZ$a~$S)j?iiS%)n>ysw>$+_{5eQr6{|FjsAkdt6&huW%&3F7Q3M zQOPZ0l9JyG_Wl%SZPr}gSqGyQnk`LTdOxaYorJhRpr2+F$MHKH(#s7^B^NK^-E}bg zWTa0qOY(+$f_onH9KK|dqf@50%KO<5ftkxTrJZ3~s}Vb$2oH1=l=DLU;i+s(MNj&{&6A$^dynfAlN$8ryn%6J3%jQ3i zE($BHZNG7BPm18;mVL_CdyegqO6$2`xq9u&E7z{DwHw#jwks^z5*7F70jE`h&Y6vC z($^>!SlI*=FS?(*@tm>0yWxV^4@V+A4A*BpQdn~9$BVBM_wn;IFARD3c4a|*%z5+M z_a3ahlogyDe%dg@*sZ`XWKE#x)pf7WWq$@Qir~3;(Z@82<)BsfcelAK5)Mc#oZ7>= z;VsjONsAxk99Z$}7Z5(lu|)rN3>vZl2#~ z#M|k$P{Xij%J}@g3!mRz&#!o{ecs@&=km*)s(wG_9;{BB zr=*qLc&@s8)r8=K3rglL_TvrQaP5^Pcf7bD+?27jb9kQKX z$Sl>7xDDDx`B?EG*QVQizYO%FvY0a$t=cfp6*Q4^7SzpoG=1LxNlcprzyEeJ*dLIz z?$VmC_q_W!vzgqQS4h=7Uvi|WkS$wLpEZQ@;Kb#pjMUj?FIheL-wX5qVvkooe>7L$ zsO0AEOzP3w99LSo;RhP zfA@(infLCp!x86o!~_pN{W|Y%s(+kO;_E=hg&XgjUvQyxUfqWu3JFikugIU{)(u~x zxirk~_m9T^*Z)5@k34o{^Lg9kS!r_b`kt&x;8hJjHO19Mvdl4uW3|?$%0B`pRK5LP z82KB?iF+Epe);c2QP&Q=fLTG(TZ}#zR2;p#di#+*0dJ1TxJRAVSgpP@WAUXErk*;U z#X21p4ihs9*QF=3`GmDCTx{yGoTq%l+v=vbGf%boZdcyHTld@~$I5cwyw06PpOa3% z{Cc9q;^NzN5k-leyeltcv0Y}^{OVx{XRNzDkBO;7x`WWMHFrO)U85x_9afu`_h9cq z31@qr7QG2UO4Cbst-HGQLdqV+^)kB)Tf&2HToeA?aJEX30Li z)^~G`^tq}#2^-IKmowk$iPF~Stvttb*lMj~@HESXK`*QOJ0`A+kG*SX_Hxg`%8Qd` zCCqMn;N!QfA;$Xkzf0!(zV!ZoaCLL|)7pFH@}C|?1{Obyud@5Y@b}vG{i*BfUsr#< z|1-Ysu~Ey1x7*S;mtF|Db!*%9EJOKZrMYWf z$Ln=g3VvJY9_5^Uw4!}G-yCO`6W+%<3yQb0>g3y1pMCgNR&}1moxVM_rjv_Xt|;c}Dp~D+*7nuhy|yJ}y3oEB4}}G9Z~SUrGTVEd z{=A7%3ueyz|LOhT`9G`ef9TcT|GahmpG3X?_HX`Xu34A4>puJ6b=6h#p3l9u<@l}L z%htVG^=g%s?fm5JZy(zg${fF;=%JR|(ov$r#_Uwc;k1Bb;k$pw#O)LWl-vXwS-kEr zDmFcK$az!t=Ek{?GpjA`#@;o3Te<$_+<7nM^z3X_TiYGs<5Q}=)Bbg}{?_o7)2>zB z|9kIyG4KEX|6l0U+Nc{l^u4()wtQaFl#TKkzvo?jD7fTATDg}`V4pwVm0ezKim%J= zp3Di{B3riQtshqte^^`D6%#kFz9&I9a;q}MicMV2e#W6_IKl}-9q}W=5BlL zY4+UuTYBfl@F4w)VCB7mSG;^q8GQMYn6e*=ORs`wufn-5spghjtG4Q1 zi+Z-&VY2{_*WCjf-rqPc%x*6Gb>YJ9*2LK-S)V1ky%oA^V9=*!=zs0hJ|mu7vB$bI z)+C!N9DLX`TSqJSn5ANfm~LyGM@Q-9XPNWfon7N4BYgGDqqVB4hxc`R=$(1Sr+(^! zIv4Bnd%fmWK#IiXXGV9!*`_`XTv+yZ`y@vF(z3dl9JTP1*vGt0-|zJY8HMzU-_^Wp zuuAj9qXU`2?3X5JST1H0Y+RGDC7{(S$DrhOoKaxVxummatg`=w)UN(#-uS-usrCu; zeIKhUIR54ouJzmV?En3r{Wnvsyw0s!I;Bahd39IDnM?VikDEibCeAT>ek8(KM)YaYksEvhCba=(Tb14+cV3RpPx6MvLS2D?HOg_Ro4Xoigx#iS%~&bEc5=s&XHKWQ`d9^zKY3@En)5uyL08FbO~l+s z)pH`AzdUdLrF4CZWUaNw<_M$t=Pje>Yc)tYbWd62=T*IS%kF3CvtA#(>o4irx?U;% z=dJKl`#;_PJ^$La%l^9`OkbwfR&ZJBvB`25)7iug>%Q)k{M2T8ZN z^L04A-QV~x-CfaBUj6C8idB-YnCilm^$bc_p9>%34A@aqbZP^40N2OPO_sMeN59|b z_rXqJ_o2!C^EU3hvuW2>7WEwc=wo+1PR@LKRx)jN<%j0+@Mdt#~4 z;oV&uPiLH(lOHwd&_S(+(kU?|8##o;`o4Y+J1;j^=<$N~?az-WZmRn=(Bj9>x-NbD@>}e&&MRXz@uGam z<4!BI)@t9{=A1@Y-XIe4@ZaA-F?c+XT*vx zSxibgVj;kM&Chv%$RiVykkznD?CK1o+}njaGb8h( z^~$o(T{}Os)slU+vRI;LpK|T}jrDsbAHK?KYiTLAdaIbOf|9D3=-gQwm8LD4Y!orH1cY4T(n= zjHk%W4p0u$%GcBs{@k(E>&@?%HFv)6U<$o@;d|%Vo3l=TwtZ{1F`8NGLeh>KDthwy zOK!VtJ((43dS{Nj*XF1fi{=HIiiWXV^^xRGmbCu}}zJnQD9$%l7WY=6=kouB-EUu(zl-CR8j-(R=+ z^Wu7C$uHe=dUi>6@gFb!HMiVZd}#6V_l3XSB=1_7zH`RoxdACpK0Y>G-OMJhv-;|s zNp5X79_|f(t+j3Tl2Xx#b#spGNwwb+{46I-Pyc#Ws#=`O_S@cFZpSuG__W~e&!r;5 zH~Xz+zbQwy{>*W!7X11%^Zd6(%fBQfIR~4jocyxeXS-}>dA00sonsMO^$gaB>-1$s zni#J-^?1$Ugbi*NIDc8Zkf<*EZF~2|=RY6$R4$&e?RK5PmScB0mTNP!#L^2>&s;of zxqe@baCG|5A15W#pRaY(t}yqV=hHmRsCCKjTMH+hRGoY&q@qi6i3RVGoB|%_h4*7q z_gh)(o?7sO$#sGM%shs!0F&TqwcB3FlEDi(-fW-j?PU9X3ePqF^C=8pS2-z57;dtd zk-cwI|5mP4ok^~xXCfb0c8fY+t$1}R$b7Ppb5CLzyHmle<0^I*oAi&&ko?tQ*mr@Y zC@9AE=I(8~8x!SU?#`Tf)N0`ppB36yxOR7ki6)lDB+p5F<6bl`CwtAzcPC?vwthEQ zz2!CAOsj*IRmt|5I{8fZ{~x=(f3;x!U5T{#eMEsu`kZu#j93dU2^GNTVKu8kIC!T z9GRoJg7uVZ%%Mz;kFE3cYZdga++1or0HdN zZOX)?Ux^bk64GSdLRB^7602`r&gW%6{riT_oAc#Sp?+ENFW8%PWHxQc5s%!y@$tp} zc`qhLZYr5~Nu5vZxJ)?vuKu}C-iD3w*yCyZ0 zPdxoMY2EA4w+$Uh+RNVx9F;g|^z@>?;A+M}Ze1a|dWBNZk(~u= zckPB%OpaglYu(Szcl}bo>Hqz^BKr3H*E(M*C^>e8n{;d}UbDJHqB~^j@ygYz?k89J zoK+WXQ#49@_@hkVuFa!AkD8*_|7A2hEpEDvRrX+|y5_33gabZhjcq3%XE05cE`q7Jy)23Itm5<$<)aLR|{b|$(wxDN! zeo7X;kht9!#FHE^kZiH5^2prldB)p1)!)zGWOvu^lzRS2*&MxS2g%zV$DFp`D}KLp zwhsUFIrcY|>@J^S-hH~UTRr<$t$(e>;#r{;_J4KGP83b%N|(34`uVtj>KkjHf?fM! zHs9W^!nQ^~$8Y|}2aD5fD*hPGek-{x@YT|*BJ5=wm)_2oYzq?#>VkJ0Zu%XO8K!N! zuRh#FO78Cq!S8Li0|JFrcyEe8JN_4J#&~!Ay`+EP8M3vY5 zYeNo3wSQ(i>va43mEL3-wk?0$uT4}{{}tOkf48Tp0JoHItB>*K$-TGonvI=2JMX^K zG!t16u*iucWOLiP_b+!f21MqtCg0k0bMD3Ewsj9BjvaY=UNi1#o{_Y&Nl{{b(gbz!bCFoILR4ayv{e2{ z%~u9uYsxK*pXT-!1_k?uN!f=zSyi(0`aP9AoxYhrRd2^0U-$k*&-1k7p_dKHZ1y>!|VB^qVB-${JT%TPLH4VTYt|2_2b9aOw(?f|1g$e zCfm>C=`W8rp8m>ue!l(FgOBB3PJSzVvu?w(y)TyTQ$53{bx7x8@7gzV^)9>fGiTj@ zP*U$V|GUnrhGNmxhj;7zjrH@3J8+W8V@|&OWj_C%H|l#q&6o1Z)`%#2D-*_g3KeqQ0W zo6cdc)Hb|T4NRNS8N)KOgH}l_ZvDTmTZIRx& z2)$=V>^4{5+8F)*r1PSc&-c_k=VR}7wzaWJ*%?!~VbZY_X(~{ji#$nGscjeg|JaaPT_L^swVc22l`ufSgD3d@6i>iUj?uJnVfEv&yvnl7N&UY(l+MGpmyV9^GsBZDGIY6 zy(;#a$4cyq$gEY<6kYDld#}2D$=ReVh3>6S43&?0YOboa4`}6*-@|jb!}Qux!)41> z@oy@gzpwuPzy04IWXpfAap$?eV_V0*XS1^Z6${&Ns1XJIzSqZK>73h_C&4T4duGKSk-c*ehqOY3S7$4aQx1W$;Uv;Xm zBDvAfsa#U>_mP~d3%Fv%Pg({gsT}Vq4L)nYqddh$(^VrlZI7wbIj>W$H3kuZzt*{{ zEYwtT)zrLHs%xk2C3m%}!_d=|H^`;rijJnM>~Xp3skTu`2cw=AJhQAzY%HGl{Cs(e z?v<-srrhK|HG@SpL(MB}p^NTPkxtjm9bHf6^lr5eyYn)9|G&_mR`L78?#33MHNF1l z-UngRh?81L7p53>diY7MofGxCr?AVjt6XVkN*Qy_ySwL4+`YQ---GRSvEP217TZ66 z;dgZNSH4A8n-?$LaJq{zo%{81@g-Xyi|_lwcKX!kv-f|>UQ0j!=$rh}J)Ryjj2^TnI`k&VdTd-0ab#6MrMsN6rFf6nFGJ;H4>mlB z`EbwR%ge05;;w}f?Pn}BqFB_Mo;d|Na#!RRDkgL*E?ZKmvuM$*Ag7I2N|*jF_2=~3 zJLlyM*TCrpX+@reNga_(rxdN-w))R z9Tv|W_Oxhegk&@d+%b_k6o=gN3)H`;Mt zU9)Ib_>_u-*=Q*L@HJZs#%Z|b_+O(%C*aon-CdGsUY z=*N$Or_)X*-7}bP9ujIBtB~Ztz3!8QVDHB1WtT7ZPyCyAK5u_=?arq+Cwtpk+du#L zEJoj~-y-TxN~FHw&eU2#%ll%r|8kVg-`#)w!A&7YX!>1_WdWgmGg=-k+jUav!W2cd zo~b7%1#utV=e#E1ysew=6ta4fKt;Z+jbqDZ>42)r?(`m%7ud)3)g*^dbzOUQt#a<_AOH{Nx2$v zJy~S&-r&)PV;5LXODMaFzFywWuG_^uPiCs3c5m?+@#1T{O=rJtYd$=?!=Xp=`I#-P z(UT;UBNN}v`Tc16{y$H5WzPE2s$X;P@2mCyUOiDSIBU9pzJSPFt_kbK&OF{Pae4n2 z``?qN?)brd?soH(&1t%Bf?g-jyoyTy?8US}R{62Pg`1g^?JArX8XU=dArN}d_ga9V zx@@r0vqc??6^xd6T-Di8SmJQsHAHrv!|uILZ0ysfD?dNaRyNzCtIK1-U9IQ+`WMCC z&As!?cz%_;{qJ|TKfUtSKb2J1V0<-YXQr)4cbD+SMM@6y-psq$bZp|;XH(Rd%fGIc z|Ko74`h%^U?XQNs{nMYGJ-O+~S*F`1%VvL#nxk;`8&{d1lYks(5#|rcwO;{fFmzqh;jh8_bsv z2rqV8!7(*FyV)W=)a6LkVoNbc5ywy#FRkFRIU-)?cnTA)=U4oBVklqt!%)8V$HqDH z=3jnmE$epp;l}j3h>f*(KHvSO_;q4JmgYZrblk;2Upk&vISD{j~ zx${n~GoEZ)6xeK`n4D408ImC;rree%Y^W5{doYTh%WcY8*Q7IE*VFe%JaZTQdM9)D z%cB(w`Q|NKw_``l<#o}8=N`^ce#gG`+=O7oqf3%>R&}h(TCt2(JoJK1>bAbS9w(io z7HnxsyAa!-k|EXqS?u{icJII!--3l1bSuP{DO66`*d0>JtMx=8a&20U^t|9$($x=NDv!UcJebnInQ5UwaM+basuMS@DxEeZv{+N?Sd4yf47lzRZi*{y zStOF&tF<$sH&ndmj8m(rtMi5#CYD7qYqPG2JDI12GO0?oh0T=r+32$H^A^L0E;~v; zHzZ0(-jdUvw*7upc-)@9MU{VE*n0A`v?lMp?cHNt`|l0YCtG?Gs_^vw^b|R^%08~zh$pQ3BERQ7tQ9? zx)57_XWdW9=T!yYgIxr!u3uHtyZ+@f?e`(<`>KvxmHTh)$tc`6>$O4J$}D9iBil9c zk=9Ek)K5DbM;fOtzGJbnz-GexKgY~VZ(KL}e?;2q$buss<@3%=X$-nLPsn(t=9Mc_ z-u8Si1XeaBr8gM{zM2_W+IiFK$)AsH-Td=6?y5Y{d;Q*%PiG2$)wyrAP$>7>%+$U# zFUz3qZl(X7Z6TXy9evf1W|>}>eC%_3c3FCL+3mi!Rs0;ApU#n)T4$aRlVJGSl%3xXixYJIB8E#E!g~y6+!7H@=pxd(UE)mBF&rjA{>>7?V4k z4^3!r@ncn8eA9q$;*@3gc5?HbooUg;J9*Pt24~MHF*9V(Nqqks(lD(_;!2m-$=06- zWek-nVgw%R7B2f_dd<@5ZRV`5fU6p9yXNKWTyr8NaVA&f@?~%9u3!2pyV|1Y^O6t0 zUh99_xqSJbzxV&h?)$yCzv4&A`Ll~}%jkqXx$*hWAIZZrp8R+*VUg>n2#Mc;H5_Ns z;<%lB64nYesivmNxObV((A>)OnkB@;(0Sto(X*#Eygm_UVKM9SleXB~!Cz%dXDoK} z+!#>VpXA%MQKC5_`<~T2`?yT32;eOtiy%g#%0)lnbC>o3B z;dtV@A{ifzww^grw|}8*nUVDxiL%L8PDe{zE|#;YIbt^7m`D21 zp-XG6f91MgFPme3`{mQej+ex?CaZc|Pk(1rShiE0xApMRN!#z$wN8((?3^sU-NMc$ z@t)3#=f$h4+&Flnbk0StF%2nQAfkFygY96b+hq$csY#1gtux}et6|u;OQCQ=|IX^y zcJ|+oo&Wgf&&;|H50vXZ{FVRoZ((j8{B$Mwj5JTda+w@iGY?t)&`~>nyrVb6|YR@s=txGg<;)< zq=l9oGH0?~xE;G(xNF5b-}dd+mn$r>c>MG8v~9jotb)(yh-vfW3hKJfWfojqc}6Jt zqE^Km(<@VjwKMt^k~;iewkhq7UClc2fy~_*7xRw%Z23O<>Nbg^;eC@tq-9i}YqB`C z{@wNX!?8)bINzNAZWJAoHK(K4E%{8xT&Ksqeq3MfxF?;uvaq8x?6?`{u?azX=YC$_ zJ6*i7f1a)LjHO`%b#}#9#rZv6y{?-$JQ2ms3SnWqR4E=%*67I&mYw!RDPD&E|b9f zH;-lUj|54pgRKslm8ZB(eGbmQmau2(6dT?TG8`Iis!M%>4ptqE@Ya%xj}}qwV~%v_ zS>9v&cfwIqzh+;ajR`tG9te~K#Yi8pI9EP1{{J~)sq~%I*+;qc=YDwdW=gkjd!d~C zg_unN0SB8b7Os%mxJcDM?#h9+52w|9&Hf*-^{(l4P(}Cu=4bh8z7jWA!(&zkk9xLd za3rOKc>Z4DIPn3`!m>*ozvTb)?mwCTqgAH0E4n=Ig1YN^WPb zU;SiyE}MHjX)kkV+1n=!X>$&DObA-^#Pcm*>lC*&pL-Th@^YIIv%1Hjll4l#Bqx!k z*}qm=rn>0HsqH?qqrWG0&O66wjmlU1mBLKbx;%}d&uoqV{$>~N*-egtbBd!Td7b1; zcXeGazis``o8TJH>Ee77uAg52RsWBC_>5oO`!&^{w#-LxI2jO@fDXqvnC+BCnjux<0Z93c6;&cV|cK^lJU`Js*#~o-;4@!$o%f9|z0t zKYuvc*iU}m>xZwzj+<*8``7gEW$?E1W;LIT)n)F^3cNJ$ShPvHQ|iri?p1e=Gaw`b6%MX3SL zTkiBKMd${qd=Ff_&1kn_^7i{hmD?8Pe_zp;qjz5N^gOdN4d&XI%YEXnoF@9;*?(3& zZs+N@(%O4Uf2^AK>HjotC)>l}VZ3guRxO%$UE;N;=f|mzn}vRNaJB_aIl3?XjrF(P zw!dq=^(Ol7+xFn!+vrc{j`M$g|L^bn7w!D>yw50``{%7J3_Et^Wu2_b&Nasx4gG33 zg58z`hlKJhTGV9P#kO#X(>YG@Wea|08oxNTY*~Y0+p?LHy%)((N!zBNz2nE#5b zUmK?zx|JS$cyzI%*8sT$FRfETl0v7VN&7c>q{g8AM0|u%)L0tXi4VI zqmkUICk_TKHGEs~G zk1vx7XMa=UXP}+bBM_B$-@>u`!WDH3sc*YakUn%82>r+tb{j#W}Wp`DILav>6 z-&Hzki+PLD^gZQk^x5B~QL`>}#K+-Jh4<+4ouL{hqIq zwN<}nys!Jd`wytD`}49-SUBQN+@)#rE-%+zEiGCa_)E`F?6d^;qqj?}!Y|I@vgoc@ zcsKQ>_aTd;*PT9ump5vk5o1hmNtA!Nt7+@BQ5BH0%spDu}T7d&b%@M_l4GlIMM z7}8q}SN5$uarEiDWB$|Tb#?HDeSht^$@S!-bAHawbJv)ex-adWxN6%H!&ToWXXS5P z(czr9SKf5FiYsfn`qV@jH?P27wMSUGi`gc6I^Nr^ydY%r0(N)fm%rEC?w+gDFTTrS zj<-4A4S_2X&Rvq>ktWQYn)>H|znrP7c}|iuG~tE&?7BtI%vVpIer!to&=PsH=wiZAgB*94gDl=&GbOmMRezFD zpI^R2Bkd$#pX z)~UHGRw!LQpeOFSMqm%SVNP{wd*bDhvgbr_1Pv%Z~exXt>Y)8rft`8&uV4mkB3or|V}r^y)4nmWh9Wo3G!(A0IZ zTk_IOHZyQuwYz8{`nvRV+1}K;#mB@K8>X&dT(UsvsC#go|Gm4QzP8}?=H2s!npQ0O zl)nFSI_rYYcl%a8eSUK1l0t)hRue*aj-?gtI;GUzH_0Kyz^L+BHXC=(TgmDE``tg7 zSNyzt{^GGV#V9YY0RO}DB!sVNq=ppDGkV)*_i)a^pC_vfMMb6ed^_ABn7Uv3MyRXT zrjXCce_pjD#w5f(_z`z_GynFM2NGt{5#Nv0xrBBa2A$^-KmUCR(cp!Aw;i#YZ@#&iZ{;#2@wTybj=+?%>r8DID&}l1xyzvyvNe4phf>zdZ?d0V z1LS$c{q=X&6fOJxSK-mxpiNI~F1$VW^`^W0$;s~gH6f&G(U^?@3>L%?Y8OjbmiRr2hAo(o?Mx{@5`rS+4>)jz5Z_6A((CZwdUNz zkAm#0ou8eyT-CIGPepp6UB`F7wO^<3Xf}>v;=TbL>mn8g*%#?%TZn z$OyaNE6poko|FAK_5L5(zq|MUla;fr)zH6FGtq0$k{KNLy0^~zS<|+)ai6qHk0Q%* zRna!ZE?%+x-epQpm<-kSe7AV*Q8>YHm6>m^l)a`-ml2QhHOW~U7HIF?vhjEbUvf*G z%o3rC%eajCb}k9(n=?cI&i?=Gv$y5`{4{-k&i(XryeeUXRE$~|5<(i*XuuX-~Y9@{QJTuti1Zz6{BKqyWhw3i;_QD?LHef z&!(Z zwt5<~|61PuI;-mChp9$A%I8>DMJ{+B^(bOT>FbtlyA_@ZPHx?`PE$40K27pkpm)%= z=gQOjmCaa}Z10(Uq`*udXM+F!&tmUuUghS^zcaD=w1KS##rkm&rZDjB97N3BO*W zWTb19+8StBw#nmN`OF~BbwWOZzwS<%JHh>e;F_%~x}HoiWc_$`$vwS|2?jlX4?Hzk zwAA1mXS(d^Q02dR8}IYQ9C3QO*5q?TVcWrlOEr9jk91vJ*xjP_;84nHvEw~TZ@vpY zp0e%ir0y))J!Vsv?kaBh8uxv6V4Fo!LBoVzCAVd&+Sak=QCzGYwL*nlT}K3Ke?6GA z_%Z9%JDcxsndB2FZ!=5%I-9FzlO8*^o)yiLDeDJO@; zY?zX$^1SJDpGjJhSH`&%-5pi}M+|s$H|{UmwUI45Q9}4wgQL21hUlKs04_<5qe4y! zH`>nT^=_Sf+WS6lNAf8h)5%r$Iv&hDD8YX8LyfGbm1W0~!W5UI?Co9`=kR(lg%r81 zoon=#^z@f7xktFp_|Mt%=N)g8 zSv%hJJ>whnI`sC^DrI+9SyjEVH9zI_owXtw|)P~mp7yA%KwM1eC2iiyq?7OnN3N1m#^e$ zomVS<(skp#2YVB5^GO7+*ps~1HzNIFQR?RyBg?p_?cyue1Q-c<2ZkKAUOkJ&SL>S8 z)I}bSCeyW_TVAwLnI!gVmEzXUm?;|yLJnptWuEffqHwHBsc31(!XM1#vCT1`jn964 z@NRj-BBhRhH`o7({M?&gqg?+~JAUKVulDJ4YBk^e+IatKTH)uuTM0XB{!FR6YiPg6 zwMY4wiHUEoptq*iRSOgMTXj!J8$NR(zmIcv1iKn>5CH6RC`VT+GV{d+Z1ti4IiIIl;J%uj}JQ-eqYwz zeL9iryIPLYSmP|PCSr-9M6$#$MqSD5wL4B__SKzo<1($iowRrI zD!yCqzLn&jUpw3VPiOrr@g1evN8^7-?>~3E-|o@Bv)3)GA`~<=ySK5Oy}ti%*{}EeKYiZ5 z=GAM7rVcT6iF}=2pYn|kM{qW`k$-*&FTL-QBxMa zpLsUi;=Q0wlFh<-zV&9o(`I%YjOsSLJonw4;E5}h1X!Mn==O;ym&Pt!)f3x4?a0Mf zeD!ah|L4AAvF~X7|F!kA+57kR&plgF_pjmpue1BlE{_YJGqbqnF`NFqDpB=$@^(MX zjt?}zSO?lhDdUt=!xp`@ls$rjPmQwn2@h3J3 zdzF8%E>_dZ4r~$P&b==jbN1jLv)|i}-n2Yuno-u{+%4E&T=1*p{4az5e9IkG`?8GA|!KH1yrPWS*|Uu}3kj8z;MNKhfWA=h`cHQgh<* z4sO$9QXdZ*@`xq#gvKV$T{=C`>r~4vp{7YiVadyOACg+WIn8Z%{>}H>o-C?)bT4~P z!DrQdU+?CBeEY zuYEz0A}6N=dCU!RxyTXvG_+^pja1%)o=@k#+rGFba{ZNxU^bzolaHq?5Ajm$6MWtK zEAs4)x1M6R6gTmhcBi`P3DjIT#$6@wp>)Cheu?)tbJ+qM)220D+O~L`f7ug5?-g^d z^s0=N^q%IHjp$#rio5eLP#^?pUur`bO-~&*}TQ?*Fm1oU(4` zvsv>U>psQEY}o0Yd}>yqS%!?!ft1>%lF4(qlvGn|Om(%E=q);EWIspnx62!MzIQqj zyH4yl|HRPvowA4q>m|K~)~WkeoILFChW**rLRmsPq`URV}`%OLBbw53b|+846&jYwb6npn`De8v&p7_f3#-%|_nN1!BE8Nk%Y8g2uDg5jeRav! zMN#WKc0M?qGIt8YoP&}(KM9wWywy0HwY2ncW_fjv$EPRl={>k)K!-uBCEu8&Q7l^;u}mPQ6^R#j|&_`%}CpT)9^T5s#mNmz4v;rq&8 zUo`LkKUZE^^v~gq%-y4VZK{5C_-?=2eAvzI`@860OZ97~iN{xU9(^bnYI}HR*Uut7 zJD-io3un#RI*au=Pld_!re{h?JyDHw++BFi?Oe$jC6dhhB$N5lt&{gQO0-uroASNp zS!%Lnwrv!T`TIK)ufB4KuY0Rn_uIVwK=u9lGl$!4jq90vqgBdua(hdIw;lTVl9i=@ z#p1iX3EXxmZQGQkz4y+D{i`G3~+uR=H_uX6gHHujFg4`DmPPIREUA^8dHif4F#AKB?#VwTrny zdQ0jSu!*s6eWJ7Fx5tOc{uO#oeXJLiLZ6-pN|D)I_1NIrgknYYfYk}D65O-czx~!V ztBBN@#v(1zCYY>qtcxc$CE!esnSMr~?jDQyGj@Mp++??pS{rugNk_q1Q~TdBwJr5F zd#vs1?|!oXUv=vLZ2M1XsZWKStt}p>%#hAbn|j%VM=j7~HP^jGuA0Hl-d9#kTcUJr z;v}PKKGQOPB=@@RRbOrs87cW;q1tyZ_72So?##JQ-yHTkFXyt$cGBjn-R!#G^Y*cb#3+0ygWj&Q>7ZBE~OxA^mi33ZFt=vS{2$f!Abb8?@dT4KvLn@yD# zUa!_pn|rlr;tWsS^?Sc*<=1?Qt$jH)eCbNDs+!MY?Z?$0?OB?a_G-@jkdm}blE!6K zwch6{@&%Xu2`KH_&BeDoCNfaETf+NXn?P3A*~`Wg0#$s&w5~~gj0^pk6uV%a>8|^E z5%KE`k9}(YcR>ExJ8u0C_5WAb&-`Bh+mCj5dduO6I;%-G!{wRDy2Qi->_1CLEou~;waR>LUE+7_Q@*mwr`+OvoGJSY*RZY8$K>bdzgK;}<|WoG)gzQP?@DSDdoI^qJHKnw&vmJ>W-oiXL@C7B-@t2s zuhEvpS%p^)8mlebaZ-uhC~wtv#saQFkCtUZ$vlQ>7bkUp{ifUb(DcFH==(G8JgqB= z0!>(5|C9V+jeb;@)6P%J1%iSU)w#MpGrqTpnli=cnuM38mX^WM^M+;2cUzZ6nuHv0 zv=KR$o3f4T#xa5RGZ#dU**)5m(3Dueaq$$Vt1K}yif**)Epp|&clo__QC~;!o{v1S z-n(yJ{%*ZYNL5+mu|YtnXlcQgT$h>iQiHrMUs&&>)DS8AA<5$Yn}boi^j>}B*;#ty zLyoP1n?aq_o|&t2f{8sws1>-gud(yHR1A!lM5V7Kz3` zwR-(-7HFOS_pbG|ygzSU518z_SwmBOZI-@UPgHsj&%}NGS-FDmr*!8{`MmFPsiuy2 zGA z(qEPdni}xUe4yjkY9z9(a@NHuYD?#?NIKeKXmz)kX;#;gpc%T%N^N&EYv*6gSt-?j z%;}Z;o2<5tPOn&B%kEU!S;VH9e1=Iu?5yh4Q{mUY-!`?s9K-*vZkI^IYTJU%p2=+vEPRIJcbA3esUv<5*bqM4tb{k;B?w-aO+I^m9Ht+XWlw;f$3UyaJY_NSdxZ>jPvc+H~NE4 z9r$=x`Ri7}eAal&vfFX(3y)uS+&kCj$6C`{A#TwxU9P-%Kb1ZQua zwzq!;f6jL1#5A?jI;B6Jb{)Pd__^6q)$QBuGAR`{|ISkuZ#0vaIK7hk#Z81 zpU+0``E!XgDZ9q_@w2z$UtT+?gbsd|s>`3eCq}!G5 z=U!@gJ1v=FB)a;Xr|JB_uB5esk7bhYpN^Sca?R*lwcXcW-4WS8xBr)~pUyA0&)q=O zeYJDX>>{OKe>*I=MUvRsOj>U|&-|5ec8jjaoY{49BFQ>dx}X2;Fg#$8#*ox?WD>`@ zwnfB58vN5NB+KW1%KC{ zJD)b}TxqB-J6TWLpTSC0cJd-W4#gE~dn1er-)9CebLKiRZ`(P#E1RExJRUu-_R6cz?45bcmaMhkHa!3L(fiNo|8MsnnEvm9{>HfY zN6rhf(k^!{W)ru$$1Y&aJJn!v>LNyi@K?LFyAK+zTsdd9NK&E9#xTR)2|+F`^KXc? z?^-zJj0Ercdw+HQ|B)~HV_k3m`N5}ZnLF}3a_rT-PCsQ&ulev{d*u6b8$uu6`};d% z>(jmRd;2%e+_lc~HfR5QyQe>&CC{5{ufEj7fVb*7TkUjcx^t0tblJZ-bPZlS@2s!MK9cSOCqJ-@>F ze%x|^5IyR%QX`>5B!S4oD)t<;Z6nO^JaxR}6ekee8ly__LVa87yfK~d#% zmMljjyRVss8wWbYI-V?vJ#X=)<-x_I6SGWrbj{gpC3DPY=ZbTcX0v(4my7SI`7ipf zwf^7!Bk}*r{~O)^_rjdBThn_x5A#AXU$+}`__r+HkUv!?qu%n7;1ZFZ@S+VVi;wV_ z`SkjCbrrj5x_Y>Z`8H2Ev`qHHJ)xeN?@W#E9eMfv!=V{QpIhDMC@x)6JN?3nGp`Ti zh)D!5yzT09ZiUnno8*%mlWRZEV8|}Gw&8xcMfNhD6~|uuS)t~3qvPs2`HCMOEq#Tz ztee}S<`A~0IOS}>7j>&4+6JGAPRjtW% zNyw6nK-Qphuhs|~dRUiK8qSuF%#Yjs`}|$r|JU|^-SPC6*e}pLl)vZw_gi)q89E*e zcRZ45XesR+@HqS9)cMm=LN#5FR&_Iag{7UIW#gu&zfB~t&yR27Ekiy*Q&xGIuV;ew zxt-%*?3yPdypZq8XRc(O-KEEWKJA;seR*@k0woo$g{um#3A9hkyFR(=(cA~l3*J_L z+bz3!jwA03?d=S@GgjXzQ5Tz$wP*?Jnh8mXrr&G+1)JY^Z+-5Y?des^_@>R7x}@#z z1P#MXJ+04L2KiZgR(n*Qx>tNJDWtT+t>~pZe?n-7gi3=YI?8LuS{#-xy{h zy?BwEw`SH{$KXKiq*V`0dTq0~EJb{SB#M*XD{po_99ijc=iQ2@GkR@O?#?gRS$phZ z;?bnUieDc%S5}{S`Hu5Ft3iU%{etEddWjetmU#Ed6YAR?+m0r_^|F@o^?! z2sDlgc%IXlxntX@JP^Q7*xl>%Abo)g@T>g#UXG-YMxlJdBHnzh$Yf9^jYD$pZ1@g-~0i>jAqYo9F% zl0RdTeq;XkD1Db%p%)5eLU||c3cTL0ms-5>vP`Ji>$P@upXMy@w||uLyXE4W8}IZh z>i+Re)yc1UwC>*{`JZd{{C>B)s-VD`&o9p?UN^LRYQXuWGp{m87%rLQ@z{eyu4mFZ zwt|jH$-h2s;1E&1GceKHT2_)$aDT}GldgwOjE(){O?O|s`2J<3c>3gh|6b|F)jw5xWP4C|=hs8E@Ag!Lzp65g zJeqN^WB;bv!luVM4Baj`X?B?M30^c&+jwq4kVo>w6_UEa6Qe`ti7by_?LxpRN=3Z(}AVY{|?nZj(^nu_hNmNzy9^0tHx_rd4;$NG=G;fyj;Mi zGea}_+wu86$;)!Ky`10F(Nx+|I$3C+#xcLs43*2L*t8aK^A)l#=F{iX?VSF;W|sZW z*7#@lfAas|zGl8nYTWu6_qlp%kL{SZIP~zrlU?hwcUJ6K$a!2RTy*;F<2E+6CoVtt z?|gi~W{t(pQlAaRHK{Lew|u-%&b%UVV}w%Vi!w=hp1*YpQ|BpeZMjwa`dIF&$ivP3 z_9-u_*i3n1rwAF(KHGQPKIZcL=CkuQ`4v6j`+4T}`xEK+{xY3zzAbZq*V&IJ4Ubti zaR;53TD3|^{b+=8s@4e?mQzy<4N_%OSOx3$a3~vTUfJq%%I5r%q$@!lg+aHb%JXmT z@k!dtxb+-|Sg*5?vY5D*>A9pm$@_0_+PNdaGWz54|2OS*-`x-2_xE4^3ehL${?2;4 zEY;SfELX8KVUOz`q1_sM5xP2R9KX#BpY+5=HEl1MZBpsJdg?}9s~%4;b5_pfAxFad zR+(*i+ptYioF$p}?zY1b{h!-vrk00u*=u^F_o}<5K3nr(ZJvJhF}q7THcbkam#;J? z&e$|ngVkmE`^UOgYK7-spX{C4v-H~CZI^?%VyBy=PQ9sQ(4%~63yWD<=Om+Z)*_-; zo4BXlc(yuy_DMhAz@T$q{xNLW^}WHblkM zFsAiSeSHwL81Qrd;rCX`K|WWE)eC)E=UfTXl32as;C16dJC8or#T;$|<~O6KD+-@( zuw7%hW9NdGRo`wmZdRAhyJMeNYLtAVzvT9bM+cHblFTpVD=*}nb7x+1fZn{dFUzcp zWIQ=H`B^SDvq<|o$I$JV$s*N(y(m7N|{q)qH+KckGdzQ%Cy0e?!J1F74OC2z1Y)H-Jr7}CD$g#Vl%jlTKvTZ_ZR+zfE z8EK~HBuDBpz1_C_G;>JP6TZnzp;K>c>;HMK{m^FjNJ`%XLKQ%p?W3ooZR3(j56XItaIG0nuH?6ufN zCqFMKb$6q)27Jo1j8}OXT&VEa>vU4WerM*+%#8MDN(ECFuMIXnSmoR|v(`MJcHzwH zCcTSqt347Zyl4DPSuOIFYwO_&SG5#W(*rKfG4ApxXnMOmy*qmQy4Mr3>&$k_-T6D^ z$E)!DTJisXT|XWEe`kGe+sFCh$$cS3RuQ_cyy9S7w>Zst9kyaIOp*(YiezjosjcFuX>YP*=yN-A7hsJtdKrpv2D7wz~7DA zH$3q^02F1g?PWX+UQ!XlzNpPSvjO`mJ``-Ri&rRn=`ZoL0?%kAv4^clQ)Xik@(FQuxi<{INp>UpQe;0EkCx%Z_~T^ zKWtVCyvoXYHf^=rx}C40S0}7V=t(X5AGF5FjdSYp8(mESTMjdwO>*@URPGDEzagae z>Gt}+$z^6nUu5t9z1HSm`^q(MjgF;LebC1jAEk009<45qxZ0SzJ$e7VMHe5;brg7Y zD!E{ZMbeS@rv?&*iays2otG<~Ir7tCMV70M>dPtDpWEJDr~Fm-^lZ_}`$F5Tf1RFo zxqEp`o}5r=e@jQ{;(h-vZQS$om2T7eg0nrh%j2G1yZc+_o`uWjsZqzIk4X3$dV6|s z#5rDU>fq2!^9n1xxA4%Cc^~FU96wp*x2)i{=gdZ_nQtQ7*DarSb;iL7MN4L0&xpMA z)w=H8+36Cy&-{P7{*RWt-LDSwxT?unVg55ClAU}HRxISo3-X@ipcG|w?BGI?p3()u z4|X%CPWR+}wCwwhUkw#hOLp^Vkb3M7N7g|;N9Aivg7>6pWlCI zeZBWgcHOs&|F^T9zklG*{Q8xr@BhF5|MGET?ebf-`C_d}v8`t(>n7mgq|4QhhJX(nIGfO z{p#xSt1-Iq76Qh1kB2&_n<{+e36haG-tk>-X@Jp>2NxbmT0gwHd;UZI`d9Yn<9}b< ze=u$D(wX@?z8?x2OYk#*Y=ljJ8)3f$gi?};v`sqoO^ z^PPAtZqwc!DcAXAbj03Vmpy3B7jB%B8WG>)aBSy+gRj^QUa9%=qkYS7?qfHyyIg)v)dE(OHqPFXewb*YhZTJb1Hu*X)%yW~%plHb+=mtqCzT z&PXYJQTkH$nnJDTk{KJ-1kyxRQ%mj{o5@GC)7hTuWS+RJbVkR=`Er0n@}izd zk&738tp1)f=bn3@OY0=Xqc79lTzdjd%YNCgog@@NxAAh4)W%gY5@4n@E zVKR4PF6LI1O}CxJeUS6vHJ*bTtlz)b-T3vW>SKYGuedyCzS}f6q{_Foc-q&eZLzll zjasVQe3T7c(@Kxd;CVbl{j2Td(2^B8u2buJIwXE2E|{<(Zl$*Sb@x{R6BoVuZg<0I zTHAxHZMS`%Pkn1~X?cgnnbmID`6?{lGQwd@iZfoGIoG;qvUbCYz-$q59z(aS$8Ii~ zakZ$hRxKVh$@NG0!1aA?T?_tStrsonQVu_}0X1=+oK%fT8yyR#8XQjyPLtsJ zXK~?*G1JUtVS44uZ7P3tSgWh+q-p2fuWZz>``ABu@~6G>{~FS#^H=`($9{&7i=F*Y zzU>b|`#%rATkI=6@OFB?#cqqoHMM?XGvu#M;aE4%NTqDLa`NnxCw)r0#0)w=pKbVc zs6e#$!MdXNzcwl;g&1=mePEolH$zTz>nh81FEPXL(uE5m%v106FIG|$iaDDUc=>I0 zTi$|gd>5Uhgs-tC%`Z5Z6&t?gcH@+;FvlE6#n)erPC-Wmxi}WpzqGDD$?&7v-TmB+ z`R60|a<5zO!`Xkoe*VVtJCz^pob?vnTpi_Xn(yIyGUb#(>IzHyo6^08hCQ|c0#oKp z2y#g`KE31p%kRvIFC*5Z^%!ov|4l+Z!%3mPa~0>02cCwR8BEFcJ~LytH9R}n=QTM) zY?bTL9sX~2Pkh?zpy_qLcShih^=htyVNajjNkr(ys^h*WZRZkdm-gUpDJg(}g{%yYIbd?w{|w z|GLE2$NY9lcjsR|t$JS1{#j9NTlt4?v-Llo|MSsaC%^7h?p)oxf{LQH@!KsM=dCK@F>I0$bzF5SaE>$g5|umq$|slEewv$a+bqDLeY{%UPHD$(mW>&& z3XBRW_B?ubm-W2dyyBhm8;?DDc2(uf70;s+k`Gn27azLdUNmdltF;_0Gk+wMyjU#J z|L%KpM4)MyqN|C&n9=2@kp?Pe)1Sx0*(};2W*_{m@WHXOlJhIxif#TWlXLXs+vz)g z-_j1L>r48$^>7q>R6tim^1+T((=`7Co)P(wx86=aP3qR)3XkQHf#$rckIz`4-Q6J= z+PwSJF0Zf^YaG8Z`E6tmb_ptAwf8xJyeUVR$x#{|!wTFJrue@9LdH-+o_VfSN@B6cB zeyF~QufZkWrLxs4d)2Q@`>3T~z5|<9on-wrV}*{FOPA@akfl7#p|VH1 z7QVOkO`c+srnyw3c3HkMzx}PxAKPV}^IvY8_-)hk^MAYR`|Ll*{}E5Qo~N-iBh)lQ z??h$O(519wMo6&@nANa;KCRE*RS#J z+xBGA#W@@ADOx@MDqi2%KfkU&-~RvYIk$_CT+?}_+?T)Sz}x8c8>8+Wm#Fygf_=^Q z{(zU3mb(t0(LS5gn6~gX-ypFv|~=-`Rr@{ZZ)ZrzXYROw!ICIj*Nfv zGF{Rm=bHGI-?~wfJ1h1qz3-koUudFf-Vl^-4d0TQ{zrSh5 znpww{qC&LQjY=vvnQU)cwBh!1ZE=Z(OPXf>TbEhz?3JXC`s>X)U+#8Ha|-o6Wh1VW z8FFH#g-Vy!HLD^$p2r=uN z-D;t}#L)l#NuScSM!Nb>*H~Da)^}?-+b8ro7ay~5mf_Y4T)k?Nq4bN&k-o!t?%hJp3iAp^H_a``v5GJid@(I#f& z?e86?A*Bm$m-9IL8?QE0Rc5UTP1gNV>wiWte~O5(V#tb!q}z%St4AF%^C%rN9aq0`9LK#D~3B@x-xR(YL9b|QX zW4u&lW%K2e4}=}Mb)WqYK3f<&IR;!wr5}GUrBeGgyF=^G^?hu!cvRH|OO==^H5PIE zzfzud=#9bxwTpe750*=v^qhHTg;nadRUAnX@2&La**p){-+ylH;p#tY^Z)6_{eEI> z_kX7T=bz_mIzOLIzq0lDrr(OydX~BJnz- z6s11hf3`#T2Xriyl9T2zO_XvAJc`GqdX5jXCd4zI5K4>y~7=>S!0YW3Z0IMx}_^uLBw8 z+3pUT9RGRqNzf|8BjNi#in4P2t=N3#Z+7Y1pj_RzMuvJcY@Nk^Nj)&s{mq&aa=tUPn5ciM^IxJ$Y6L*FL_MpcAUWp_j!TCOuqt zB~c(tUsJ90T)^46KTat~?%LM8M(Ua4k%$=G2*WM61+O|qghoVP%yTb$J#W{?8@ra} zThHO25@_INc&;JBD{QX5cH3Kz>)(Ey+H5oLvDV^sMiGTob^B5at6kq_pPOfM-Nfd> zqm#@%dyjNZPuqG$hTYcsb!Sk)=L4VB&)?*o?s22I^4Em3--NP-=U4re`+r9Mzw5oq z=bLr<@;2F6UD!3RQ^I|7PKKDb7n`8--H?*E^Gw`UE!#P%(0^6KoX=BLr#dw1gxBge zP7+!b;5E<8Nkm|--h$QN->P4>6M6r4ie-hW|HgBV)&_@8O-acL+U5E7=y$7?_N|9xa_Q}boU`?~kPb;8;2 z?5vdE&7$pef2+;z3MaKkvAv&p7p^?vpw(sCw?eScNlS1&n>-VnVubzP_j#L~PfM=N znm9)|tS8Fw!5S6aq@INxYN27*c1^$E-~LH-pVIvY(&1`F*JD2aW}coW@x@l z4|F#l^^u*IAgjm!=fmFPHnmopZfm&eo|m8h$=m*a`_HHKAI}TMTqs!y}F1Fe8!!CCJg9h<>JKxwnyM6z+saMCX_j;*YV+x8& zq&J=ox#{ZfQ=OC*sheL|Q{(Xcjq)7xGqWsn!y|OWIVQIA%U$4?y`6jf&4#w5m3vZU zs(WS@m0c6xTXtLJ@zPVj3Y#tl3Z2>X{I36hnfH5sTjt%{bvmomWyN!yF!wuqYT3hC zZ*5yTEA+>%LsIRZXWsaJ#N_E_#b3K~4u+iee-}PcGd@>_&9_iM{>@a?XJ3A4vsHgx zlC{=x&+o!-I$vnk^+v#*!A}~E9Sj0QfIQXE{BB^6@7pXQnaBW?`@YoJc z%~c6qT^yTTo$s6GTr=PiUgD(Zps^$*`R18@`K2<-5=&p^yiL}5ur^UjI5P3n%%srs z{_I8T%2TVePk!1EdOt#At%ytcYsaLJS?8L!Y8~^KA*3nVm3CxC?f-<*9bLLxdR6-* z1&@|bn`Er1k?Ma@YO#^;L`{xsRmp38S3O&H{##~UsbisP(9T1m>pt9Xi7&S+IhLij zaK#%|fmyF>CU7ka%!z)!USgTl!-d=C8Ctu}SvYrVz?9AG(J`+x_ckwTF(~}E;KCQV z>k&PHmnK;5FF$9(ddW`dzLftZspb5w7H>K(yPPpS7JtRywe=)5h0CRFno?ztTQ+aA z+Twk1SJnUh+PwiwpB#C$BK4Xn&*38mejFWJw^jY_o#4u0*{B)HqEhfWVOe{(+oS`P zhAj$RqJqiyM57~CO9akop41v6G(~D&=cEvmHT8wMzn+IY4Gyn9qaE{*EBuGPo$$?GbL?)| zwdd0>>4iT^^WG*t`N&%i~1r@ z!;q~`CwvSSKN1ja`?}8UPi3Nc-()XfR~EZaT;I zMrZNbGyQ2rk5>wRtXsG&_SDzg*9}y=H6z!>TOZp!&p<_PPvxn_+w~1D8ND@n?tjj6 z*VB(LrE|=ecev!;w|TVN?xXdOU-`c@PCt%b!{`6v7psEB`PtGXndxiaJ1l^6W(&`(yK?$i^x=^A%f_oU#28*e3+DJ*S> z(0)8cqMX@~wJf#0hrJYz>p>Zx!H}Gi0;(IsCJ$HHSh!o^m zdL?JA$l@sis}867SA-QwIe2(#UTLaavg+UKw(1=D zx<{??yU*-7B)ad{hxpEuAqiV|s4?_DxAlnRy*y*9;KX~Ils9TSs(H3}-7(0ImI~|> zo43<^$|MP=X|ZP_UN3nq_42ovpz>o8)oEuWCdJI_S5i8&XQGH(WySxd%k0eOw#~7- zRZzR}iTr=}e+uR6?moP@m;KS+>E*|k#Asi9NhHEZryo&TY?wSP){~kQwY4LwjN$tZ2KRP}iZ!LTqA+u(JTH(IRGa}_%_C5Xhk~wbw zZ??-88}F*h+1|SJW7=o+={9wLW=ObATPYW!Gy=Jw_EP1n>=G`qWQwe%rx73=3ALdW_cKf zUH=vLGHBDa<6#co%citE<52ZHH}UMRphG5`{=X`(=G!u*d_KSKgJ}PYhfMq=v;zb- zm*1M`dLUu0@bf(pA0=#jZ*R7VczC3EkJZD+_kZYqx^mID=>JvO>HM1|OpEFaPwxG# z9K1=RZ(IHge(SagoR$xtv#A)r6-sS7SLNln{q_L^pGiSVEw8$oeK-XlbA4_-Z0_{< zV0oK}(atLw7bJ{ViX@#nGRJYjd)vQj6n(rp3|teppY3r@n`IPyLP&YbzQa++^Q=EU z`PgRgHn!pPOdT=X)ytbGw=FN*{La1a#{NRx zzOwXsET~M+KQ6wnAeu3#(@)bccyIP$2@k`B*sc24Ence>8hc5oZIoLR;rX~OZgZE3 z*v7txMnxYpQf~A_L@WOibnHpoGb4cO?WORE%eL$ETNRy|urR*F=k~-z>kC_WYwtH( zIIYXuYp}F@?rFm%uY?4GwRJ`IluI;vgt$ZTGiFRPkfcDplkb^%*d{s~RtV;<+c zcuMnp3?H(D8S7t@cr?X;W0jUF_ccz->vtQ?mwn@Y>U3)2gr*h=jinwJlR~!Cq|Sc` zshQ+W|7G9f|82!Bsra;IqZqT#?GDqe{B<(HYvlwMwm5aNa_>+&vuoZ>1-KR@1goyPnBX8do)zZd8Kx%}(p{NJ4KY=0O9&+}liOp~*% zIdlKt&iF@L_3x+7$>N&6QS!Dpm*91-V2+&g?0o#w?o|Ea$mH2=xIkmGE3+G?;iFkz zk5(!fiXMqvvhhJn*|iH__NlG)D1DWBHOh1W+v~Yk*6rSPdCqz3AfGw5I~h)X*&KFF zeDRv=%y*O2yb^ElWeA>B^uDMPaHMOZ-uLj&$3^$8Dtx-*w{M%muao|Dmug-G&)4cY zwg2kB2fFEZYi_;SwB)4eX34W}7;cvzIX(B;-M+06V(#rb%KW;z(gc!EsD?ka7bsJ{ z;k5mWm)Y<2g(cqZ62i9&pFH_B>8GRq<$y15lqPyDjMUIfyLB#ckLzZk^2L6SH7rx_ z#wcw*+H^Fr+th8Vieb>)h;xx%t0lO5%_|Ihrc3vP{t9JIx#oYZN4)K4mRezO_5HNt zvb&F`|9Ry9kN4KP5A&ACrQG0|5zHNAQC+YybIy^f^(VP3yV_pH{F<6-X@Ahm$*j?Y zb9T32==q#`lStb!XQ**?2a?wo@gWu1|hHx4-lhvrA6$mL)o>V!kW&w0OHJ+P|_b zS>VZQ8;NR+b%;aPAUxF}xojnYHvep*2Vc}pT+Di?EdEmsi{9I{#Ti;zy{l_0ey0}uo;ZDJ zwx74&J&E$!ZQtha{`lzI^4HpLvKsas`mgYT|Nr3`%lE(E_;2U?!~c9AYGyC>o#kcb zw&|-=x`)~1q$O`{dN+5xNuGMzvG?i}u1CCzDYDH*_f-lX zAGuvF|N8KD{lJYrnwxja{B-|6vA!e!_qqEgtGHxh_pj`}Dx*FxrbV;O%V25C=Y3tl zTvJ1Wk48Cb&YTmpS3UH@+S~4_O$VFyC>shGgcQ0NR-2dEzV2O_#Qd6d_0%8XBAfgB za(1i6|DKoskURfB)9cU1zwC-PSS4ONU&x!$B4bneW@p)Fj*kYe(^C z+Z}qJUTNzazuP7wEC1oim!56&7piUcZYL-myC)_FXXG4CdKTd8qbLyMxZSI7=8UOA3%>FxFA6&t(f(OOwOdfdZ{i#y-}fKf zOpYn-E6-SExNyd+CVkIBH;tPDla1!_E^xXZso`|nYLSMe%9`y*6uk=_hwIXF$M$XflIzSf^KG8OG^g9!U3`zsap010 z{Jih7$@Tfss-IsZU0JsAQkk*qq>{DkAI@UB)+8F5?Gm84G(ui3^y9G!-AQXZR!s}t zysOAQ{vlWRjzi&W`_C1Af5%?DF3s9OXH}Fz#M|^Zsc`GVzRVj%l7fyXom(80b;w&v znEfr2+tT>0Hl@!a?^V1Gwfn3+Ke4pN+5VsH{$Rhj$XCzf{)sl-{P5$Xa8&+Q+lDu? z!DoV;(qu%fi>>CpJ5rTec4<fuKT9B`sG*vjjKK-5lyNsb6gE`xS!}4vIKcCu`0Js5`CQ&6Xp5BI&gXA zDUq`dQ&(Br_$D7cr?~9E4&x_JI(n1Sr{r?!@JHSI{V!S0zH;*E&&GXWeT6(T9##Ij zrWzw&6SLUp3+NratZQVds1Q?=9b1`dI2ZUwF;+^rkF2aPgaE6Ek!diYT$A zw3nej@N7F#mqk)BxUmc%g381_O>f)R^F?7-MQzz?fIAg|M35N zEOWPJ{T#ch=Qe zl66+i;n~*360&;n&1;EjPklU1l`dL&d$O+hIL9)(G-l?jF8!SaZ(ms2Rs5d)W9Iq4 z5|*S_InuJlkRyW>=q8JXsZW`mOZ#ui5keZ>agVb^qG_c>gu)*6*mC(voDT zxKUc^+lI2`eu~$ZFvl-GSETdin8xN~ug+9Eq=tp5>tcmpSg)3p<4s>9rk z<@SDU$V;=>S2y?V(IW+dFT|!zVJhsIGUtW3?W(rK-G^s1J(0S7^H=TsH5(tuBuZ#h zyVsw&8k&0~p|;nqFF9d~%WIZwox5k6rOL#alNR1Q-rYLody%X2W1dLk-61L>hb7z! zw=JB%y(d_eeXgmAU&^dyt2ox!?oo;i-Lv#aPg90$kzvxmb*CSLJ5f6h^Q{19uI<6uyR0W~>9u;x_G@wWiKPP9J7=5c71Vue zVgG*rQE~h)9d~oS4R0H3UM!Zs*!`6`=k>|A8q;s{PVX--Io*11SEW+-(XOP)dlci- zdZf*k3s2(huJpft_TtPUqxr^p&3pcS=v|BU22PzI(Gwb7JsZ&m$bcS}Ua1 zbnzIj6m4FSrRn6DqFEL?45BEYB9SAYqwRuAFk$1n(uhBG#l~vgGoOxZg#hy}^>-rjD1{{SllGm7L zuehaG^{m@ctL?7d!?i~1%1xJPx~(ZcGtGOA!)47VqsL)}>p~y*-niy=nM3>c=KR3hU$GWHIzGg=RYq(k3 zy}03XN>3{7Guvw!RtaaPHLA-RBAU0dW$VssdbZ1F?K<{mL$T+)N;3;@bRG-b9(=@C zx$a@0>_%UgWj-9j?5F1~pTAFyy`5bv>r1Wtuc~?V4_`0I?2(JHR`TV16PL;SHQec7 z!9DVaY2m1e7)IV&m zo3cCK#({CaxwjuzZSs!~?RE#s>rT7>oR(kJc>k~U{$}%gzXI>s?LBUMeowmy_wCb+ z_bqN!#@`QcSsGvR;-286n%ccbA`E(k)7Pw$I&xK`dDH*i_j|6E?_Qs^Q}LM9)N>t~ zF`Sn*&T*~H_dhZ-UF7c_?)eptKVIHn_4y@N_>Z$k{cFu@zAu(motHcR^IB_7Hx0I_ z$7a3=DWBxx8fn7!TF27$WqNPkF@>Yt&OR&5J2r|K@+`Ww>z1W>(6Oq;XYX99Q170( z)cs5E_OdPqX%K@9ra0 zEG_LGKED6!Y|VT7AHRQo%l|L?Wi#vJ4bCUGnxCEZ>$f)BbJ=5+J>OTnv-bWTIQ?kI zrGK&^z44)Ur^giR+f~q79&`Ar>H^Ejni7GV(t51!mH$?*dDlBXxwi0_bou@Rc@i_W zZm)Q@*I)Sak-hEtA5Lkc<39`De8V*V=gIlcisOIStl#tJ zsaHu~WAkCr@^$y0DBu5~8297W`lpBGe`=J^s}xh7dHSuCuGs5YwIONCZe3gb;Y7&s zFZ+)BX6F@#m0{C&|G9PJOl``hw;8|t5_hM{xWzo)I=l2y^yrf>3M%+|@fe>3Xt zY|}tRv7=HBo6UL;TZ*d7WgACmL|%znI3ZFenk(dDpw1Mgw`*M0oM%i*3AL@=k+v~s zYv$e`_p)b&95Z~ef!8A0kn5b)wAGg9ESK#|Hh-sK_;`-$@tzyMey2-&&k|8?OM6$) zdvyoz8@=);F&WkUnjx3g8$Jo~=`!q`@qO01YN;QtcAPb@Ry}{m6~5!ped!|!Crq1m zWv8!V)vcVgZo8IUXUAnFt+H+Xx4mXAdwU?_io^CVPi9D7WB&Y<=Q`K1rfi$!jyZSU zRo<`8|8z{d{O8H}e?0yA_<#Od|67AIao?*fmb4xTeVyB`Z+G|26v=wpA{cyBD)@*g zuc~U&n$Ob(6?+9IR>`m6IH#r3|5?{p`-w{Z^(` zwr;S7h~bT6%Eul_JI^SZ8@-0v@I{@(#)uGsvnw`-2^ev?|D7ndcJJfx9fw5M6|}CG zcry2Yl=iI6V$WSdyPm~#C>GoK$jDlkT6$_syrXbWO4adP>A6ogH{@8|w2gaxvgX*L z&pgM99v^Gm)jC-~ui~k9_T2dV8@|GMhL69s=e@3~IP>(b;A@%gt3G{wd^_s?T1|hw zRW8A}`_q*4O9s>98zLqpu zEtRhs$)KF9^JL|feb(t&XZ;Lk1*xqSJ{{U$?A7V{`{nclt>#~HHj!_{8xNAJuT_g~9p{~)9FTkUFd&FKc)A(4$y zN51V9W4~K;tW3P{+~sXeCp%+4#r=K1C4P$$k8l*%=B110Zp{$9Rr&Ud)b&OYqqBD| zov}4kD@#t(YTeN5b2}i}CMm5fM%l-SM}8H)K_La_n4_jQ{XV+pjrjV<8jJ)H9?i56uCn?3v0ld{CQ2Avx(YT{-Z#wK z_D6jFf1Ucb>2+=Mf1dwu2I{!X{>rMVCUt*flwRfe&;FkeKA-q)8ji^p?1*`EWup1S^n1l~f2S*p=daOBQgCrPwPTrLOGna&Ugf@-HmpYi z=4P)wDtUf`^eelqxf`-154YqVj8@LQ{z^jGuup_*rHfbKyF2^NoqetDA=tP6{uKWD zFUc`Bl}Ak0Itt!5i`ukk)=^7uuSg$R9@C>L*CcxK8B~w982(x}TlHv@h2ruiiDtt# z8D&>)-{8fsjwLR6Z`D@#;QrtGf1dmPv)9kr_Vv!b%02I=HpRSBsx|ie^G3hE@&6~| z_$S}@eOvqI-1~oK``*ruf0Azhm+Slcy=UjXzW%cM{D$rh{v%3LQUtV@O!}UZq;^b) z&G}Hq<)};6eXj2rM7u67TgkU4#z>;zoIuhctM%uif_r?G)S6!(nSGnV{-{4=c=s9Y zny-&1>nnaZvFFF5-aprm-pSlEXGPl8rig5n=PNW_r3BM_*)6*>995JS9f=WGrS0j` z5v;(Hx>4ZSU!OxOtauz}U0ZSS&<P&Ia?Y~c!eb9} zy-zgGV7Y&0roQa#&$7WjJN6y6IxV4`=%tfZoYrlb>ti9l!{WBln{xt-eO@>2;hr)# z{f9R8F1|A_su_doaUpPqev{l_O4m5(K+Y>Qx+@ZDw3)F96bLBFeeSN8{M zYAKakYM$6Fc=fl-+48&9`wS!ApIj)gtaFmE@9hcRX|on}t?JM?7a1tn8+^=C+xK?X zImzTXTVjuIkWDq4{rSq*^e>;++g;l1?zql&Yryi(%EuhjC+G{S13- zTfO#QavrY~dYdyjQsOtTNhQxL<+XG*OIBK29uZ%y=C$tp?EKih@xhMEl@wi;g{7eLv~{^(i|))wys>QC+vjdiBM*F7dFpap?|D!S@h>jns)wGE6t_uM$ZOk+ z=R$ir-{@^#l3=)5Oy)@Jp&LrR?>Q77eNUSBwrauLY8l?kdIt894thIMEb42HiSPfS z>c`h#@iE)3DZ>ATUqpP?QN|!)i*JIrE?Z1WayXJOM|rtN7iY}g-9f8rmmlNsy`H#a zgREOkwr8RekMQ3;j!QO38(rgmoVVmjOxJGR>YZ+EsI__K;;k!k1?OzI z%QJ;#WrUZW*0Ga$L0Ny-bp%aL=n=hC_wDgq|5#sHkT2GKxXrl#+|Qhltt(bM(Q)Gn z<9*bcXx?ekSeAK2>S%?tj_aq0DT{VlSxtH#_Wt5!ecLH_f9}-VrTpx4^qJevmbG63 z!cQN0b*!=E_}qDWH#Yi71WypSud-H$u7mwc0tyUCwlwn^wA(zF%^hHN8h6qi3toLXow`iECD> z%q=%5c9%#n@8iilWYK>_XO-*inZnsZx8H`fTX+dxt+Sl`Fp1kSb5__gLoN}+j=4!@ z@duxO=L-Mv9$e2!Hm#`h`n>#yh>NYmsm6d!8}A*9*)o57QqRQ=(nn2s_ibFFdGRZ+ z9m*sB=Gd#Cx_neMwgIw?1<`wM698S*sxye;Zv7Iw}>e0ad zj!iZh9EpoEp8Po1^E2zhZ0WMu9QPjV4*PYqXUD8S zmB-fJ9L+&)UV^2^3TtwYo?I*HmiFnD`28#Td;b_6b=lx`=k1SK{5D6A@B5i7BY!__ zU(AErYNc)-ZCxdvF{q!f+)rEL>jJ;E_^Hm#+8%Sny1BGZfA617e_q;uPXF0m|55+rhZ5h%viGd^WKUS8 znD+GT@$@}a{{`#6UfzG=Apf^N|K9&JtNZ`{C(Hd0yxV_f*Z(b*v#acW-ECt@d+hR`|d3s)!3`mlESduxU*DMe;GjwLVY$doy@ zVu?ZK#S>G6AGHW6xf;8-8_%o##0f+y^#C_e_FEnS+@NbrtAK4pI*FC+@61L zNoMt$+>gcmEl2XCCE9vEPg~R}p!7)RSXg=HDarRbQLCH-SVaYsydn&LPj?GUUSpBn zdD+E2J}W9fJ39&=XO)1bzgAAa;J=S${@#B9Z<34m78)I2RduFLMbjdh zvuWLDldv0np22=It~Ib0sXgs5lS`hGBec*(YSFHlu7aVOJi!X-9Mc=!zw6K3*2-S) z9%X*n{tNs6z`A#r>%IT4tbf*T?D}-?`@M@d-xQh{wd`(raoBm?$TC~|KhE}CSwG_c zYX8^jUM$@9RZ`P+j`@yb3tcZNb*!~5Gp*h+&vTL2$%&H=*)dsMk;s1h;q1IQUK3-C z)HDs*f_gMqlUFQajh=gdZFc3qbJsuaJU(A>nalH*8D?wr^-u16AbtMp>+2cT$6qey ztt`2-ubBNgPcp{}msv9}c=X=Lnqw53CUw8)?JrXoA@S$WbIhZiZY1^^`~)jM{4&OQG}zDcoa*ZRvXly!FZ&1rr6SoWB6 zU+at3!WDB1)|y^2QQBPj)+2Xw!k*-vUs~1}Nb)3XU2yGz%M9J9v(ASecP#AKxZ>m0 z%H@rXC*Czna#3w*Dh^diIkIS_f~vB@zKva1O5Wc!V>p#`v+HZv;S|#zPF=U8 zkh6-9tlEp&Tt4(3jZEBrZ`0lV^&5^&N?w@4q4;3$+PMcJS7!&c7^HfgTHtlRe99En zp1`%6BhX)Qp!V0}{|`?7xorO@<*awO(^SwnU46bsQ)A8%r<0L$op&Ac zklALm)Uns{$k)wQs~6r__wCFwP80QGo{>6MQO_l|E7v~$cu$eb_jTp(uho0LeVTUk z(S-b;vhR;aoEH)D%@T;VeYjKPh*eRCP2GL@%?-Y2476m)CvZoOkZ zeVt2Y&Jng!d1N9O(u%O`v|7gUsJ&f}xGAS!EWgTxtY^<@VvSoxw32b)h* z3Dxsa5liK1d|ITp;LSGXrU$#_vSnwnoOSIL)M)CssI$uczi3_F`U22YAJ>8Pif@xN z+2Jd@o#_44K8(l>LiTlqOIHRQP+ z=%i)Qc-lSskY4hUOJ~#0@ICXvLOiSxCSNz=_O7H4~KVDLgpY;CsmG6=vr_|$rEz$h`sXAG2^`uP}uUQKp z%zYB0v2?b(B(A@Ohf5?qW^Gt|v_i2@_<6qlBk%dYjk=GT?t04k`t+e+ zI-6rmo+zd09*MmqVsuPoru;dRWl>z_ITzooJ(D)KE9%pe6N(={d=ZSV`I&m{vgI~W zy>jN>;+iL~?apj|UoU_65kq!0vqs5O9Rc zP^D*cN8lrsh~$h}dG~Jy-z`hhc1(Y>-mQYu%Wvi!p=(k>98ZE~l=8NoiT~qWKlA_R z|4;8fd>S7A{6oRfV*k5q;>CqERhP{;;CS2eS)|9(4btlWuJHd=iU0E{_TPo?|Mce7 zpJ$x^`;X;qlY+u`kvdr>S1a}{-FhfbDV+t~BEqtxqS)Vg_(T{@Tzb2(F^fB!f6c;>5f-}<#3!IQ483QvCUZuR=YipMi5 zuXAoalp)_7=F%M~I5jBi&(rm8XEm=~`!PF4D^Xo(%A|!NHM`$8tU9CoVRiTW9kSyvDfCr_{1RaG``Nw`Xyv@J*|f z=ya8(4m>NpqPsPhswiIzS}(1%FnZdX+V?vUPoxOnvr*g70hY{%l^p_|>Uy z)7aZjgF=o;u=2!OAAX>Ee1)@2ik4??vLN@$D|+6B+uX#gPpn#F?);XWyY=hMX_^{u zSu$mJ>^PHSc51IV`@akJU#csLwmtj*q5fC>#O@FCp63PMeXFeKwnZc}_W0Y`{x6U3 zdpi5+k6Whi_Wd%l|M7hPeESdm|Alwt9jmBp>{|M9-z#pfgSVt^c7z$W3u|T0H+Ieb zv$X5cp5vDN7S0lGMQfJCohd!=>72l_Thi0K4_Z3UG_pK&_Uh)EvuoEs-oN9!`OE1u zm(SbFxcJgJsj$t{F0(K1d41sPV{4t~$5%8o3`*pt`clZC6pJ4y( z_&Ge5C&W*ZI%a|NoMIaQ~0_ zztVpv?f>`}SJs{U^=VS&<5dpIE+PkaIwc>h`n~SA-^wL(7yOQMI4F_IwbG8=jpK0( zQ|$W=J7>cg$BgFYFPY+G9X%l_O=3|*`ioy}7OtGZDEtD@?JzDF!RN(l5Rn1QWkN;HL z5Gg*(ZHE3DwRG1FPMWjKnXj2N37by(aIdh^@*{33ld@>9x)<2s2 zK+2snbmpxse!hlAtt+-l2i#M2Zf&}#)7|W+Dt)B$NPs|dPx6r&J^40n-d7bQ4_dol zuB=&;H&sOV+I!h&LCU_oO`n_Qm;3Dg@$UDGMB9s7I`(V7 z7e9J+4m^n#-(D`Bqk56!k>SxNQ;seSP`eqk&h(|zwCh$Phj*No(7$v>XPE?V@`SX! zm$SC16)bU@!?gQc;oD=TZKo$bdGO?$;=Q|T{PH?uY;Gm=ES?ids#SGVY)-l)?0_Risk2uHhQIP=iU_R_NgcLYSNY+E;qB9%hg1D8m%cD5 zsIW;+lX~=6mdzqkx5HoPwz_a^dgc;= z<-+M3jy~Ay>ZRD;Vd(U_bxQWtz!}SG*~`_QoXFWZA@cfatsK3wMY)Nym{hNIF}Z$I zthgKg>*n4=qW`KNf>wnb@t$Ah8UO2vH(TJ3^!@d0zZknCC6!r^{yL_#Gvj1eg-egX zu>(09aWo)lqo_+2UnyN8z zv9xWW507(FvEiyGKE}lgFAfIwKUp+;b8*@1i4TKRrn||{&Hei3kIa2;XDQCzy7CqO zjraU`biJsgXl~xlBfrCny@EEaDqZn8?%qq4rd#`!j!g(olG=X6;_A6MN>3(z>ndC6 z$9+;EYI-+=SE=`kYfqE(7=FK4;d3!&u88KOpat{K&RjO}{}2EFlKLed;hn*|MxBb`G*S6E2f{Dh0Xl0 z`J^kK-j^OM<>UP}BPgR*mH+m=$8%N&PEa-OwQdr-^i$JP-AQXrAKwPCAfA@Y zjQ3JpZX1}!Yk2IJLbuTI&KM&@^#ut>4O%BIJ}mrh-$%9jPyYWcmrbbrw{!WcVn@{D0Oby`q%faASFhMStKIdvoQkPY;j)&6cUBg%W%FygsvHfOb*RE6fD>jO>P7q@AR$jMjqgUD-uFNwLxs}g;?AjLm?5cZw+6}dH z=iKt_t`@yLCTRbK+5X(^{QJ*s-`9%yPAGQaos_ibWADBnhuWVC-~Vg-X`%T3HvYP^ z*FSulo&RZi{S)?|Gxz_R|EY8T`}gWR)?Qs1ncrp0e&2EXcI47O0pXS3IXSsl4?di| z?c4liQu(=SQswV@^aV(0YF&v?{erRt){KT$Dn#xdEs-=8dMiFIK< z!l~z{JU!iWz5Ly2)%k08*5{wCDLin!{_pkA$N!oCS9)LhO|tG?{$HEhXIallEHm67 zU8cY)=z3&Q(xNGcjL+L0{Z(|<{{Q+v?=5YkKOg`9V}ILL-orcAs$8^-TJzTG)n0~O z@6A|`My*_DrJWHLwBiu2AzSE%b60oYh)C<6C!v1GB5_UV)S76+JZb~j+49~=U zn=4jl1YQkOnX+iN@1#n0b?xH@eRJ$*b=-V3_i#W#l*IPQ+vcX1Zdh^j&06J()vE5( zPWJ`0+)Y#J5$tUX+0?Q1mKC$-k?(P#s}FE=ADg5poV3*~rOVJn*GOwt(%ab?Y18V` zE~-d8H#s|HPFDwOvdmJAjT(y0#!VYH?VtU5_r_d_SMM8*GsL{KrXDeCE4${T_v6?^ zZ^v$-HV( zLa|Gi!SMcuz)BTb!-F>G^OJ%-qp5|1l zVlMYcM6$gz(b|w#Fx_@@Xnb@>%y<$iWvi zmdkTQZZAmc%?La;V`fs?we2QxS1k=Jx-`y7CizX_iGBR>*u*OzzP&v0@zM(E@}Mh> z)80OvcGu!jOzF<(=*vuA3$5gRdOh{nHZp`y+YRb;hW~im5HCM9)4|XuDk8tU;`%B< z{m=IjuTBVZ)6vq%?8>TXmhj#_p9 z#|OrI`yWQP?+VAtSocKb1W!1b;ngTYCCxgwaDO@W zP~%13@sEk#a*3PeEK7`M-Mc80^2g@Wi<8qVQfrc5+6E+KH_XYHbKJB|!Bx6_f!A7N zjS6)O!Ana-&UReec{AEM@PwseMD8xJ<-Hb$SyAqtok>$X5@p<6c+PRT@vI7ZR<>)F z^|}wC;2}qm`sJ+OkDlMVqUpu|k8jSGWWKxi`qn!0q~j)O7ekh;@al5)O*Z6M$+1-B zQeM*TeJ-c_?v{BkJZP@HCVGRckfB!4fl@Z@wh2t@N_(C+?>OpHKHd7-@_vuPM^CPC zo<1sbd+VC(Tj#HPtF!y;i7k?<&sO}6v9x=6gQqp`+N0Z+Hzm?G_dWe6lRRaep$k{P z{Mx6VE=s+3`CX~JOt4dNA?K{6Q**TTocwH4>h{|gsvjQKuj{ZrZ_~V4 z_gvLS-^Ec=40t89P4dEiN32-V_l!q%;<8SQYv;@joj6KA-q=z)GqmVnl=HdPNg`95 zCKxJhH7I>Ah7#GqS}Cm*#WlOT;d4{24x96-nLmpT&S_irT5xh{dE|nZ8`dRD$z~}( zPCK1;!^p?_*UZ$NFF2DE4C4zc9`D#CXszBP5PUGIyJLZ5z)^`{VT0F)U9^6$Unq37 zRP(jQ&Iw6uBCmN@h6r8Bk~KMOl3-wR?Zf-O?e$&L<7?;I|8oB)>DM>?&+_`8>OcNG zk54u3(`XAiE9K#9pt{sY^Fpa@d%OFb`F0PBY8xj@zW(ZbukN*;OkDEjdy4lIuT5}P zYiY@Mb?I#jFyOtky|*o*L$O2f;OqKTP2QexK0Qq#S) zE<|li%Kw#-U;8R}zSVELedp`!@Bfc3@``=PwSVD-cv%y>k9X%A{JBy-z2>?4`tA2@ zm!^KwR5=(G)RVOJ!dBiwYonpiEoNJpGW&+#*txL#CJ(LH&wv`t09^zCy0xn`ebUHx>Tj{mfb8z+7h9oW83 zk3%zKolE#`A+zsXs!V?I;wMvX zti3*El7W)R=4m2beX~7dlCxS$^`w%gY>@sq_o_tKlqsP-3tX>8D4#Q{Fur{4{F9o$ zE|)V}fA(Cy+`-!?Z9dILiv3>Qj*AMBX30nNd42gSPfZf?@l^HgT(*cR&5*ufE@5l|A z_IvT8Q@Q1!0lfFTO^yajul##GDYQr+?eo+gtIKz-y1q}VdnYKm%<%F#8{g*==8bO+ zE}f~$vnihYZ_o3G(fpRx6$gLYf3jJ1YBKxut<14JikkZ}3-4{RlmZEAb$AyZ!8 z#}e(0O`C4_sTi$$tD!kDS*5k1^i8_2YFkUzx{22gcWiFEW@)l;*5)ZQO0)udID8*# za0Q=I(#*VH-m_ab(m3|^B=40?Cs9LhKSa((_@%jE8q%sr;7k2YGp_n9$??d%erq=J%O zg+)BKeKrW!-oCVZ+DezW+CP@hR=52-*R}QTM}yj#>iYaT`h6+k*KXLI{+P9NndYY# z_f$V79jMq*_IAdyT+8VEo!>tw7WQn4`j*q)`S$6wQ1j!~r+-eCJ-fm~$0K0ZwZ}cv z7pE@2U2!r`Mm5#sSc|aoQRz_K485&N9z4N)K}BJOVy+kFys+xlbh;rDa!6sg&=zk*fP6lZ9Fq;Zq-P)ppOm9`E<# z*rF&8O$E1XnUnjvPfBe_YUs&wJ933@_neJxSzbvicTNbkTQ@=2&~4YcrAv;~e~|yf z`R}m(&-9A_?fck559bxfDVuu7GHG{xpC%!!@#9#~r+bCzJhk^X$E*ure6I8QEbITH zr{k4W&vU=8ZOr~F=*BW9abH&Dhih$_5)m@GGj*%I&Pka~{;@7Nr?h`XicYJ9-V%|; z%eGGPN{q<&OgyyX*8TLJM6bpP?8|l}pHg=J%pCLBfJt3lo6nDLgNeq9LM5d|N=nDB ztngP3>)HBb%DrB(RR0CfR@^uy+$MOU#KKY_4+;MZdUD9=gfs`#AplG^pYuQ&82wr9yPcZD@wjO?j={$D?N z7F$D}S+KBh=c08f%F|-JG_TD{HNSlO!1MSYN4O99*SGR5*N%B;&LRKnk(=GumHtQV zzrC;fv*GJIH?77*sgifmb0S)270wSzk|~SezbC!MRI0m6baC9C9Xr*fS9PfNm@1vR z`hv$fY`a{=<8Zs>>+61c+w3VnX`$hJ|5V!U#62^v+?=;9)6?>;a`kHO6WixWo97kQ zl(^iE5c@2b%<|fH`}|#pE$sI>_St8# z-cui6sj*+rTeW!l-I7zY`{R;#-`p4#_xM+@@G*nLwTU~ek~T&NEaN`qdd#G4+gr(N z(rZdBo=dhZP;~Xw+#ILA*P_=bk89D|d$o@@N))bA_`kXS#rK!)_TPH%)c)k1sUO8R zjnCC%p@Q4XXS%@~JU03`AE@5{zQWh%@sXsf#%-+se|gV;@_PTz**|X_-#2yp{XO1Z zlCPtSF1>np%BxTC`7E!NXHI^cXD0@69ot=Qzg(qfCHDyv-XobyrZ`>SUh!VjvLm-A z$;Hb{$oWEy(Ya{NrMuqtm`=KMuhW0Arp2?(ZtG&LAN)I-d`@ot$Fg-dO)OU1Sjhf( zbW`%Xp8B5FpN+1;7cCTyNy$2i+>R29<==a?{k2Ax%k7!sulI=f9(iQK>zb3?nLO>Q z)yuNktMcs^Uy~5~EO)=6NXsJsV{d5Bq&XMgR<-CPMK8BhJ803h=*@0MSJy7Buqh%_ zO;qP>H(5J<5|5_nw&~Wpc3xjsC=`6{?NJ58g9fg1EN0!i{B54a5w8i$cr1RUa%&1N z3t4>U$OSXG*RQng{1%pd&OG=qTf9iKMIf^}zB9|Y@Sg7RDg5_;>ONYX;IIp{ZhvaK z@R=o%8&(}_ObIn~I}%YEwPdzsfU_s-bKZT76QvAwCuxdz?vUo(-FP(7zwfwB<(^|T z@AS^sJrGMuESJpKv-Gv>v8#L+^4?8cDX{F79ADHu(W++>8_&IUoz|MkkyEbR`~6F? z_nC=Xq%}Pwl6J7(Cx5&M2an2P9&-EqrBQly&27}I5T-(^rblO~&ceRE{K zyRy#XG8OV%*x=W3lCJZ^EXit`?b-za@jZ6Xq`bD7LY6iqhtrJx{-~#Xoq; zKL7E#;O#Hxeez+Eo4fZ+^!l_k_VzvRe|}%NVxlMegbt5m*8bN!*KHU7^lWy%(4`|E z&x(pamtLgy&Zf4*x9#iWg>9LUhtq^FuGq9;QLs-`QQ~a&Yl)X4gwFnXBR-XZk%7U} z#WCcPQ1V4ZRh4GJ?j5`C3k&uLN+um#^>5VFPhY0D2dg(+wzR0pP zr0L*RUQO;qov9WY7fOu7%=0hn^+mi_dOlq^SR>;7g%}R!CG*Qoa=Wu-B$O??el1Jh zXpywhX36WSw(b+n=6X9Swj5qH_3%-rdH*j2e>x~We{%Hs*vVHD1@*`=>9TU(a{_TZ*WsrEs!XvhBXNDo>Rj=eeJ1 z6jAf)(`c1gzRPCo)D_;E%~y6Do3kp|Q6Q*iN=(3(Z%;hmTA#8MPF|F;lCNjV_pDQ?g4?m>1*5ZM%fHpG?x2Rk6HT-B0qh&5AeNnTmdr%4{oS zZCw?YdSxt|QuydbuKAx2{eMOEwh5oNDej*C@8$f5?En7s7nkjPdTi}%nfWr0_pHyH z&7ssb=lk5Mso}0iE|}zoZadaFgI&&U&+)Q3Up^e;)Kc1=>)@~^RMYdIL}t3K<@?>! zxg-p4EMuIK=<|EU_E%F(?yZ`5OV=iTZA#&WRV-;?N4lo0(K>Y~Vkhf|;6GRLzcH4! zYX4dG_}j(LOadYPdp5SWWb6@<3G)f6x*f1gN9AawdhgeY%p)%D=X;v}1&Gx->f6r! zS`nI~C%|PV&A0Y>$F#G5fB$)O|DVbFx}T-zu1~xhz_40Th&~6_n_&wjaDslOEb1bT)ueQx$Seu ztDf|EKdbWQ)l8UtmAA6wpW6JNfAket?Y{h5|M=Y6^q0FNch5D-(>eW zrM=(ZoKx33pFQXL2Je^{pG6lZvQ0dFS!a6xB(HBpzX}rWq;e^l=iPa@`2L@@LPaT3 zT({qPoM?Po_2|*ZJb7WQ(x20LSFt&l@=lwfv2(+1-x&MIPbsoLw*Nm{-`(A=q5la&9x$0Zj z3}5S*`=u2D z=l2=B5z-XdlfU8Gqg!l81)P+Y^kl`#-B@OHd-v&$T!)j?T4PvkHqMySy{Jg(SRC^{ zF1N*?p}GCB0$V#eCeG>R)Vx^IqRi_@=b}2ClWw`rs`TETq1xVZ^Z1wLnNR-Q z)12_%W(0=2XmZRRJc_&_pSbX-XhIcg3H6RVdYEJV-ZP#U0PzN zEm#hTEYMiA?3|M1GR?_dL7NPE1PkX0Ouak7QEJ0lg>7}b9h+s9<}FfMm2|Gn_~-5q zCE@B{z;k7P!kk|1{C#q|Ky-*kmdA`at1D`y*n+yg?%g5!^_*cI*W+amHpu8cGl{$r zlV>Qq;=HF*4;S4u&S9(kQ*id@V%^VIWv+9GKbM|2XYOf% zZD+!#O^!ak>2&Amw@3EOzHD*&SCY40sM-v#j>nd0uu{=aM>RZ|M9l({y8l<+_s#k> zVT_ZW-&iddA$Zo!=bYw~MTDjLlvi&t9-oF+)<1#1wQ{LeOy$HFO!{?>9Xm~0d z_1OL*BkHt?SkJ~cP7LW0I@Y`Hy{P!+a_nsDGJ}(^c3eH(?YL&5*N*^BwYfr$7oI+3 z?9SFM`qp6~aCi=1a*K@c;RRpzUZ2r*MC7$dgQ(_&WiDKjn-X}p6!+&>C#{<}Sutfz z>6tL&Ioo$!%f7tbRZ$3p^$lG`?Q~nmKL5UDqV2gJm33z>8xOpWS(oc zYxl?0K5?noKHF<++^%C1TN)w`Ms$DX%T`#{Vi@JT*Spv6^u}FEf~wDs94tC1UjMYa z=3DprO&Qj5HZ@1Y>z;=1`2WCghP6#y&9Sl>8_rGkTH__>)%!zhYxAm18%s5*?1*(~ zJ%_EmzfDwXHko@}Z~LsEL@9OOz>l%Ln%X;`)$;w`f4S0qNy5@q)y_Q`fdNOamM3%x zt8nkj%x=Fgl2sF@yeesy(z6%aUo?O=Mi+nZJ3e>8_kVxGMGu&M^H`I)cI&F7lN$}@ ze?3#RywE(*WU^Q9kAh=a+h441UYlZc%EE8WVLn~X^+9)&*re7}txk&a=hIDBGfM4X z4Ovy}cgnhUDQh;1qsjDJ2d|dtt}6^u`TXIda$Mb4)1Iw+eqLkV_uN+#sp)^;&a_{WeF<+d{ZBRd20R^btN+Dx)KHcP@X?%%;9(FDcyz5%b?) zNQ%(o|6=>TdOxTDA9TB&oa0Wd3sFG&pwTUD1`Q`P_dOh5BkGO<7kgk=`LJv0uE+viWrDvaj!#eQr4$ z(0+THy&ZM`roVR0=3K zrx2DY<$c4CKOCD>DC4R4c+TPNZ4ZmQ=c&yxKU3xJb!zf) zWyLnD!xG)oq>OWaMm=0UT9!fkF#7r)-6#Zr_oS7E86ccKLIiWO4I z_bjh^dRksGsgplDQ^HvxbK(2nS}I%Hw&e=6$cPlqT=!m}HoeYd$FawAmOuC~d8tU~ z^)01!p;MXq#P?r1{|;O;#WcoW&tD$o(!wO!p_)8rf#UUhZ?^n*+PY-nf?$=ceNXo! zU-FS*i@CpOpTRQ5iw?_WubHgL`zCQeAnCz_iaw9SkH5~gsj2X~y~QN=@Y6i!?Q;sh z{fId#Ij{D=?y}R3?BCCMBtQA}v1?r>=jE2KeMe6{bS<5sG_&V5*DcYhJx2^zl{Re; zk}daBIqH+Gn|ptQW>;Ix_hz@wjn^E%u06a$QB-xAlMd%*|3{}>Gk39V5<0|j^RbU} zZGXb6I}feAPO8lAv|K5;I=pYU_Mhz!w(re&*|p<0Z|jObQlH)(J-=6De(l3uHTS>o z)o|JwW}+X&qjk(%uWNH#B3H@jsTRo|!76P%?`>x(`YA6tP_Xad%)XV;3AxO!AJ(qD zYuUPsVQX9Fs=uY@8qYe+N~x`z-+g@fCaYbJXToOv6uNK9v)g0BnO6%If9*T_w9nA# zZ2YMs3oq!Woe7&a$LMgGl6&Y?o!jlwv2vzGm9xGcoSm-2@7kkQ_S$%zZS|Q)zxHTx z{hqdG_Ku1@s&AA&Kc4nkT{=Ye@2aU!A2!arSFQB=GPfzqv9n=qlRnNpXr{ZaV~&h` z;on=6uJ8Mz`fgv9cz&ygim&y&%J;c;KN_FUIQ#5L(#L&*-`2Iy$yz^Au=(RWnblSC zr}q^z9JEwy>6CDaofo7$&p{*QLhWWK*W@#X#x z6D8gMfA)XS|McSC?LSxI|E`XiGxzcq-DHW?-TC(yFK0C<{q4KZZFA?O;@CMy1vVya z49lo#j_~#pE}y^W=e|4Z@R0Jwomm~kJ#~=jVenUHF;(%Q}y-YnE3OMVRqEVYlVNW=~lk~ z9iJdx_UXyJ+wb?i$`0>SeI7HnJ!rB0+~O%A8awrF9Q7)-RPsq?Vm>MroQ}&bdXhbl_Np)c_4&wz6PC)avMo1o z^phQkDu#NY0X)o%LCVF9+A1>t9((! zN$*L3!M=mliMQBFrl*El?K)?C^uPy&O|nU)L8%9KNV(43G^tofTTJk(iQkGVb{kH2 zdz;-h)tb5g>*o4y{knJDHZ`ASY=5`U@BY_4pFXYr^XL3unft%b6d#c=xb}F@bJ;`7 zpE!B$oOd^>{yt;Ts^)eH@4kr=Zb3cOU+3?uo<8I6&vq|c_ajL?%EwyrZ3<;xyzSXp zC1+dNeg4?~gLyJLBi2{`Tlu{5ezE+d&znv8=gm1K!M1B(`ZKF7Dsr)V&Q|?qS?Crz z-}c_6^1JhX%qf0c<d7k~+a_eKK1-%bfiEquAw(sqZ&tGIep8LF1f6uX+Z4Z9@ zVvPTH==Pnx<^E=~O?MX_H{soLSvg!@c*Y?YpNS$$xz{HItGyL!Z|9b?+xdij|NrwJ z*UJAdTO+uvFg)IP={?>};qKFdvYr_H*0?muBiOXYG2Gvze0V5l{_Cda8_hz zt-oY;t?qE^(-#ZGZ%5sY?UTrkD3Q~Q)IV3gNp8}yl_&frPg@`rlxCN|W#*h5Kla#o zzlhQuZZ2L2cS><;Eju=GT2g1Qs^Q+^iu4(6oIOilN*lCgnkya)oV>qS_5B)y_$^a3 z-yXGSos_*q-ScGX{iPW^yT9_8UNLEkG2l(R!?W}Ku5;1V&u{O0`|?|Q{kOA?)7QNN zuX6bRc0$9!j<>Va_ycdgT~v7QlKED5Js-}V2haU>?Nn|*bMvL}uXU-Fdlne-9xi+G z>CGf*|GNiFZJ(zfw)48Y=`L$p;h~7&)jT3IM4n4eQ)k;hx1jg&ryA#u#QF?Q!z&#% zf*j6Ea;-n@P<-lgc}3LYCnsO3zD_(6>26)Dz`5F~r*#H*;;a)p)tXjFh_1DLz?v~j z%3s#Y!PRhEqP1U)b=-qBiayT1<`=DQFDpFsb616{ZZJng;1(7|)zV(Um5YLpu8ugF zwl}W(M5xU(aJ^OIy0PB;&&uf+?Ema{_6nRFs?wrkCHB_Z@Z8T?7D6FynIY|yXTF!X zCM;h0;K7FFZ*_K`?(m$pNYcK1%U_w~^cf|*vU}#(N4!qDTKIND`gA>u`cE@{79IO| zQ8BoqXS(oVtK^>P+3s`scFQh*KK)40j@r)x;XLC0WhG~xe27|KHa&IEjihBKvM#<{ z$u`gC=A>B1rBNz8N=r4)IdZhl;i|lU`EJJo&Bc}TEtWmdnX)7!Xo;Si=E@1a2RkM? zFZjkTZ3hX<1fktg6#|_P^S2FEB{Sb!n#5 znoI+w7Q+QvJ&#?uW-1w2zuHjw=-=yngB-byQMz9r+-j7#Ju$mxfs}HRi^MhNn}>5U zkCyf&8egpFm)X*y@kUSW*0om;Px_pgDdG0am-*)FoQD>BDi`d&yK@W2G0oZC-m|v3 z+3>wS@TbxfoS_%s6}WW*G0ZMQv-^W}lCH{^AxR|NffkhU-I% zr(NIwL#lj#$@IwE8>cp^-{Z?KhOq zUi;T#eRckw6DK-qj83W;t4PHmyubVn?i3y_xPRu4I?swb8+gBK zMQ;l%ILtfIj3;ta#H7emDw9+8DH$0ny?eap+r8I@^2s|4ukT&rvQxp?N6q<$yuc22 zi^BJI>1+2sk16i?SZnWZ9grHa{Kwq2G7|3vu0Il5&t_I1C{Z9gWLw%YmPjlAtX%O}?V`@R4C`v1SoE8qWp{zv|Q`Ty#FH|_uK zEwxHj@)dT~&Jukuqqfb8Nviv7(d-Oyh2<`~k~ewYJ}=p4Ix*{EV%3AmyZe8>-v7zh zulU(y`?{kWIa1|1ozHJRpZn6Ry2NIoTX&e?(Q-a@x97^4r+8+2bR3Gw(G8IHQ@-8p zts{Quji8~~?7qZ|byM#iWnK81Gd1phKjZV+i`UI{h!zYh?aiMm79O0P{JZkGhxgH} zW0nT$7R-CL?6Az0Q8jg4W0{`iTl3?h|IFhvSF1}`+Q^;MOjKBY*+o~hut`dreUs=F zR!5m9b0Wm}lRCDZzh%Iq+*Car2 zmb6S^SoYLOn>twn^~+=?ifU}oU4oolb>WxVeH-n;$j=Hq7~ybi`lZ#j|q@Z-m6 z)Ai#gTo%1o9k;jU;LcfmSI|I*7tN*0Hf0jrAG^& zHLXetsrj%v`OJ!)Yi~0o_7+{an))qlliA-TvU*P9XS38=G-|geU$=jny7Te3k5hY- zr>?L48UE(_zF(!1&z1Gx+nF)z>3=WUdcW94_UDhw{SwQSf1j4S|6QW%4O4jd^aV}D z1-teq#|bUJeDT<2pR)=VPtKXtSzK0Ht9bkGu^y$?nfCu4+dq8uRdxQqKce>ke=gs% zZ*Qt6_eSn1cW$H!DYgH0f0laCr!#hm?8U5T`_)A|yZ_v;`~Lsj|3B*Xk6y?BFOAz@ z!O2d0=e%d@F*IOUwvTUPj_aHiwg7>*|6 z&Wq8yUK_Ox+oo=fD#&^wAh|8N`%%U7m%`t~o0skkczI!is{hQ_+~;qwR?iWd{X)0< zWX&lS{Wp5nHSL+JF0m(G*5*^Knw)p}rp?NpG%;rZ=2eNWY$^`V5oq_ArS*BzOJ@bX zq@8Io*XQZK<5U0g(Zwt6!AtXtzZ56=ce|vg1-)=eKR+-2#FXy4^;Qe7eS2LeomwLk zm~p;_FNtTz4Yue@K^?aj7K&$gGxWz6Kdii-bcT0v+S3w=m%mPI(Q$bEe^x$kSYht@ z?*}*E+@^Vbjz_ixo=kp8H=J2sQz28~4Eq$K$@7cVE1uXW>n;|b8l~`@M zfK6eC#6^~FqLQPQr^H!BHQU)~ z>9!-nQpXgRZtI`5YHPYmw7SdxJ4^rhh^#wj^?J?bf3lZmmwtcSC8KnuWs8Wqp{qf0 zoAVLp$SWr1->R>>nn>MM@Hu{{PU1!kOVKHwaOT3xlhqfyJeJ=7$#>hwowdJSx*NT2 z{`+P5`U;u)V|llWD=QB_G?+MT=J~zVt$`I4H5;zmSD!4*+0nk-Ur+T{#%aUN)kSBo zZ9Bs06;*KS_V4raPu!6G`SSJko|PWgE4c$B{H9Lnsq205JslRaZK3kz5qMp{)?dY&ED`aiOeJQzZI#Wyn z&)kT$OWeI*MZEp6aB{*dA;WEKXFh(_typ-w?8Ow1e(os0DL?yWua=%y_wVx(nZk|6 zvt2($sC<*to|<{?iIxD@#Rwb9d^hRPxw=Eqwf?DrsFO z|GrOl^M60G-t+H^sQurI?mpZ3Kb?DSe>|__j!pHUFBRwiK0c#4_r`nneP6EXZ{EF2 zEqw87=B-+GX6`YXsb@pYrbR`oES3!8<$P=KdD#xBrfAvHm3Pewr`~X9$sb>L!bWa`)}1=5!oLT1 zf3ldLV#3zX@IddiEpjN5ol&lKlX?p|~FP~xPYaEe!(aB3!=xp~z z*M5E{`!7?b{5;A3Pe8E4a9!~7O-{GJuH|Os5q4a?_WEXCGtizu0oxxEGcO-9+TQP` z$0``h-FEiwvpwlj>2^P#Ouf=J=W)rL3Ss}*MUFA2A7s^ZeEXH<7OKqBziKU?_>5zm z>bw^3ogaj_^?g2h?B|KRYTfDK;oFvUUVb?-tLgAY9Z5lzFBbzOlH50*Dv{BQEL`YV zEa-S;jmlDKCG+d&18goEUCOT#5k51!lPC0bvBmbc=YI8gZ@B+2S7!gt?Z4&!SN}eE zdUH&$h|3;+GyRiSR)uT|DLisx##s9QDj?pS83Hv-zBw}1 z#y%|pW;>QsLAUNbv3d1$Z8YZ^!}L%?;W-K`x9N4fP!RuJo@>8<+U3HD<>u4NO!p}B z>&sc5Vdu8%IC5@H1z$V!_V(~8dkTsx9k=(|+?!u;Zu9-^Z1)a7oVcj-@LSu@7PtN$ z)-mnmOiEohNo?v3*WEkzrN{|?4w&)!(5F|^=GS~Nyj=9;-&NV;g^OM@r@8rwuAMq7 zy(sd;N`+?~wFxtex=RC7J-N-zum5?XKL11f|M30CukZi&`nBBN2fxqGchhdW*0Xvk zugi^B8Q%@poxQ-dD!2c{%t_iCvjbCCU5k0`x^n5qoZn{^R=LgMy4Stsd&`2YypzAo zo_E-}+gjF4w!dFJ=|w^4jDBwM^YaxojpVCbCcb=^u#dmVeA*me9?5NUcP2cs>`Z)? zG^PFc(xd5o6I0I__0R0`yzVM+JTph;$lZ0yGZrhT^cZTd44GyWB)UQ?u_J6%m&L|? z?>lby{akV-WXbIk3w4?I;+>AUH~6+q?DM_uEU;|%L>s*awsMo-)*ViJ5ni{Z$SUQ- zygA$}!`4XXSxuYr(ITm&MbBWq(6r$01uLgcdS%t1oKcul#+;Pv|31e3h4mJZqLpVp zA3Ex)-?3Tj{ITbyH*y+&$6pI7y%w2XyKRaG%X=@+$RN?XZ@!%qD}J1rvbn#g@Mf~u z(sM_jWjgLUP+(}#FZ}qU%L^s*aOOw^~~ovSGn(5?&)Zl+}-_l_KM;kJic@1gFN-uda3yh&IX>`yx4+A zt*aKfZdAC!5;Qkw(ebXp>1UpX`oHO!V%ruF(rM_#x?XmrMP$UAbp85M>-T(Tt^0fZ zpI-mv^H1j2{gdU8mjOOpUlC)wEqu0SrTM|VMM=W!ZQ92!S zZ(0A;uX}Qi3YZ=e&|EqpIPu1}D@RXoKGF-AER>|ca@DgH*zb__}$3)nRBJf_dC>nm%cwK|MS~l```TEE_kO{J~`x7&(sC3xtGf)WiMMcGu6y& zH%F31&nAhj8QHgDZCnqDsW)vt_KtJo(c&v6iZOu{Px(`eBBRQfuYt^qV zam}dk*UWk((3`Y3^kbkz|JoD9-#;)cef(_ZhTVdDxW6>tC_3}$(P8Vh+y~FRrp+)JN?|=SvIlAuu{D1Wpvf{rlt^cQW`)_Z6+ppM1@6_#;r}vbfx~x8Z z&-b0_UuNqHwLe=Yl+&9dqOQB+N~iJ~X|`og?##%%D>YNYeUHt>!K|K-|l@?Q@tbN(w18{xgRkZ zvSoR$E!h33e~yL7jOkb2MP__ov(7d8`E2b=ucWp-X-9Ju1EF z;y2%~3t0VR3WwsOy%9YZmkZrveDeGEce~)Qx0}!Xnx1mv`@ZH6pLXt@Z+G{^fvK}t zpYOGL@3M5#wMX__Djr(;AMw4Pl>J@YNLS(D?3EnLzSKHc<-5+&DK>n+*MfW5P7it4 zj!)D0Z^`Uydw(nazQL+#TQ#p+EZnlpdZ&n--1`aQXML+{zfL(@r|^yM|1HDkozwN> z3uOFb?5ejNiz|)D<&HSnHM#4(^_>2Wtv?bOoj7J}b!0x>c1?`=O?2|Qwe5ZelaI|? z*%i4pX!DHDRtc3K^XgtzR(+guxFC0aec8$9>-MR+Y|gYhaZGdJ`<%`9i>!RVy}GL1 z_gUw9c=hU4pI&`y+!T`Z!RK>ljJn@tmZqSuynY5@SA;~j?v#n+o&2kU&JbP4c9q;BN&n|^M57&#m-Td$9 z`}*ns-_%cf@w?AP|4P&~jw#RdE>9}-o3)uw@tbT%fa$?qdDpW#I5u)SNLPJ4xZd&U zgFVaRA3OGXy=e;7HOjGCGwbYUm91jaN`->Y&RBNj<(3C?Hry@q5ZJYE@ok=%J;oni z8P0Yo2-Ll*byqDREo_rw+?ib-k*l7x%&a(=_`Us>lBM`m0}tbi-4APj|I7|sxh$+G z`El5_>Jw9Uj1T)*C6st}A3KjFPlYRXcf zUDH?^7_?e0Y`kl|MkFLuPfzd6&W5PH_xP^;|0K3*^Es>6n-@JlzkjYtQ;^hShK^e<0wpdBgOWxc49K8PDwthzjxxJz8V^bV-Qop2gfvHDQWj7O&TAKKDy|*(<}9 z59TJY%`I08bLDoqe(n9f*GqJ`!cJx?l}xM?U$Hk?PitfGHomn*r5{;>kAJWKQ2pui zbp1Ei_x-rucy!mj8^^rs{yp^mbyxNNpWgcmvYxWr|IvGKXma}dOT5u}@iLb8Y@@E1 z@?4h=^0MhOzH`XnTh5y8&)?rWkv!|ilYi&39NJz8ZOgK~P%B5NSKg3=?{nPNW;o{`rN<>wG(siKi-=> ztLx7Ev|WC09v(e%^lWQMEx%Yr#nul`{xW`asyZQJDydgivA$?$u$=t6x9s&_I&1!& zet&y|?3)tvh35=o+?>qb*;{UWQa$h9oe%%4-=F^XY}WMocMk3;sF+bvVbP#(v3k$% zCzD>ketm3Jx1jMty~rb$PHz}AG|kf*h1X2muBR`!qNKMpUH8|fYsc0zM|SVMv`95O zJ1aC>P(|;@_R0UxS!d~;`FtnIXLV5a!;1Ru(5LS{PVA5S6C8B*iR;YcovHH*&s|t_ zR`UVN*`v0am<)K_4tJ#kDW(@CD*PHcUG`|_^;yh+rPH{C5O-cu5S9g=g$+? z<-eIr>mApzMsm-~)Z=K}(OXjMlHHvp9O~tJC1^#6mtKd+v!@3t_AFh}x{kl(;`)i% z69pE(DX(sO>t~X^yDxO5((2oJYlFNWKjgR+BfRuNCHt*)I~Ohq3D9m4V7$NR(yE|f z*O=eCLZWxNZ*p7K*flZ8P*Cu>)Z>Ge*Jl-F7hb=(Vscj7HL-~==PDmNktVTY-_8eL zPge)UO{hwm>AtM;&>7CCv#yTb#jk$qO?Y<1NbP{fWtWbPvCbdQYOYqOJ6mMDCgt$f z70ut?izt8N6BRagJ+sd4$Aj%{&(H6lUdMU*N@V)q)>qQ|zw%oDeQtkeQIV?Oo>?aC zIiZ@a;cPNKpIf9`9+xbbC1ka6b)ELUawGZRZq0Yfu{=UehjaG^XdSPd_NA&Z_1RS$ zL;bhLp;r%78y?PD8!*#qLUGBGk zSYc6E{{Mu9UvGFg_foU=lCv}SsGN~u7A@_Y^!(W~*T`qAYiC9kcSo+<^iFkVjP|3L z$Lq{~s9CB%s}wS5JF9SdPrxOm*cXy-x~e#ee(pSf^Y{DO=IQI}j&1^$M*jiAAdZOwmos3^1hHG+fDaBd6pnJ;Z#jM zBDvH-)6Kl%OpA%Q(~A#^M!w$3tAkpl1g$&Si?(W`*zK+VaSbqs+r(zMg zcYZnFI*+GLX}^5(O69VZleX|Kn$q)N!{rdwk{J)q?B3?SqeF*tO$g`3$49+qPQ4>_ zMu{()uX9JQ(R{9>2G?wJ=V>X1CB4@??$cq?{y!!_>t1EyA~V|+5hB_vFTQqFxX#0G zY{w=jm=)T#@A1pCtsPpQ6(8?*C|Ik|AhqnlqQf(jM9qHpy}dB`xtC`y*R^ZU=k9p< zAue*-GoHrMc(MLz+xE|r60&tRH(18J{P5z~n3%4W0a?4snoAh=^Va;HzB^`a>9xrE z)~}C_c88^`UT}^@P-XU$$fH&6msGq@g~_EG-rRKao`<;2X_Lo`)Lq&&uLMDA-tZMQx4-#0ibTq}PwHg?1Adj@j;I>E;R zUjI^9e)!Hg$vBn%nKw9Ownm~V#;fu7b-5;lFpr+`Fw5EwJnn)k6hUke$b~^YuUP` zKL0D{vU8jV4XV{~3SHM=k2-q9$HjF`(hA{)i&h=kci7t9^O{s5Er(Y4X3-MEB~Dn{+u^aG3K*${7<&bc|RA=|I;YD zy!nlj!NzH2Q#X4RR2Lsy;v?K&?tbFfwlCXW+uAnYk>~&O;iIzLn=5V4S1YP5$bEl} z=c47G2NrX+c5bWn%kq{A4h>LcbL7rg>%ns+=17*bQK6jK?Y=D`pQc3m8UM{=h)VMI zn>j^jXPW2frm!Wo`j@{ye6!8^wekO&Vo=SJGNb18@BPUP-PXr)%S#oNe2$+yWpsMm zeNUc)IvkgSB(_OAL{2+Wci-`O$6eM{vRS&T?{x;mF6|cFJZ+OC?0uvQt z_7x}gw>Ljgy_|2ob5G`h_ivxJ@$dU57iPSpYklkU_`OFe^B>Piy}=t}w|86lvE@2j zXT6rWy5(cDA9w7RBMK3rYd8$w85Hi>Rom;8xcy^Ih0TOqqhe2<$0sjKe+#!ha@^c7 zv)3VAD{ZT3{*eIfHOUX&3M^h~>K*>Q#lkW4_Opkv)=v_i%$d2IbG6s~a@}>Wb%h?B zRSUlE^K{!!md+BzC@;@rCLjO*JN|#h(vV%gD%ZU(a`71lf4rBtO#3$9l`y#&X5ls3 z-oJk?_&BjBS$pQ^xHkSYE+s z?3!`Z%hY&P=l64SCU5^PcW;O4_1n*8T~^<5AkFx~S3z-^h1qishNuVbpAl(hELwQz z;fDre#UBoOoCgnNW*4nGoLS6awf*0_rCn=lY$N9%$Xc5%wmrHsf@xKmh0UU{w*4Qq zV`?8;->>)>{byQD`};pj*Z8N;{VJ|?aNkG%|NClY=fC`a>i=}<=XcX`7e%kST6!_^ zx@+e~+r!^y_dVirOP!hCeei(D+AO)rFOC+4u3Ypa$grz)-}JiM#h-U_KYKiJ{+}l& z6h%euZBXSE6xkfoHA8cTxew<;-uR4@z3$Gc>ZuoJew^%H_sz3AU`^EQ}}#P;kk z``Wkmw~MrufYxV|MYrs3>$x=L_wJ1<$}X{py#8KHIA_aOJ3i?vJ*iTWmv|&<_bVQA zIJcVnthH5V3tyUbfz7^STRuFQtG(LpLq*M#x~kOTx`gVh6Q5taw58zllg>S#|5&bS zJzV2m)+(V?_~N!fOKOPmIqtg;G!}P?7;38(J~mjba4V_NccS&d>i+k)6nri^Y3|&} zw#sl`-;y~|&S6h<&5z&vkPw>L!zN)iF}!@fk-z%7b?YsdJc`R_Z(A97Z^tet_d7hg zU7NSrUix`Vpmfta(_2cbrEm9%Da+orTDz)5`!nC1Tzxi%$Sg6|Jqa88JsR?E7r)ed z7_no|zGpXg`&V2M6xW)1CS=o1wSc1A#hzE61qKQRhhJRtEIH){OU?6-a??V1m;c!J zu|Mg(fqIeEvTGS%{9;O$MEM#D3aV^*rW~}S;pL@xriIQ0)O$4@*OR(b&fa zTqD@$$lT6Vm~OV?iFN;bn_YJ6rv%-%IKNiDYFcVyl$d1Fdb?x3bHBXVVGWwCIGd`m z;E_wLh_L>)GiuBDO!FTsxwh@{F1Z*p6Y))50xh}QmriL7*MC>>?`L_zIb%D$H|xuC z*0*g_E1&p%-!DFXeg8ZAb}YVMF|YPx+ugd;hhH;4wuqKkWMTMB^I|U3y5>2?wfbRO zghJN7w|RW$noAhpu17Mk#?F)|wT{*L#m;LAG@Za|vA6<(~ zpIdq@-FI2`f$RTw&3bsH(op>9l`CB{OE%hmFXt1=(yJ2G?`Te$IjdEIMSgGV1COp5 zBC}63pZ`_gTy@vm#w>%ZlAe0OHnqH!TZ+@B^3INbbl3Lv`Ubnt=S`m?!fdL2imerBrc{o1urIJEyq!dA1e*)xT9@!4dodopLm>88((7v6Tvp7*w_ zedXg1GhY1Kca?Yb#xq)vT8kuJRwb6-?3{69OUN@z#d{m~-ZAR$Jp5Ns|A3yyefF#{ zzkcPr*ShaWueYn|oW}iadUSw?W?`kVLC*Fwk3D)0mCTv&V(I;ogsiKpa@Lt&dwRr1 z?AYfqhs@_uSfe9-fk#VoOmOGEd8^j(>^PQ@ z9dGTG+j}c2`bg)@t=X=>W4%_|$n?8(7Ja{5t=4i@Eh+kZ#hevOO~rhr_p7-j+Ucsy z=GYtm@aa-TzNX1RlQMnH`pPFAJG$iiqchD-+>K=kJWc&qxK7Ve{UWR67HO0rYMMDU zF#C++cE3wkE-5)>hZX2fx~zHj;R~6{d9K-8gM=P!ah(|U_wxB**7Ub4cAoLpRx?vy zGGj~jw!F)4t-2Om>pJFlyFin+A_dI;)={9H0NkN+wOV&1I zIlYiM=lX(u(ff{A|C3!>EiVeLuE=_HbxlNZ;j=ZX&&ID z|NN%D|7`yJ>yPWJ_s(4L>rDQ+`I?fSKGxTX{0mM${r}nh`+02JMHicLtXg>RV)epj ztVe{c{k_s6jSnhsy>jdlPvD~0H+cFU%$~eX=UB`tmH8FB?tkjl|F5-uyZ+C;{dSKk zW*P3WP!HS0b#OY_aE2Q`A;PWSlWw+r{1cbZp&Di*zL8{^5L|d5#oXyuZa}L zEqTAF@~g-5>mAoT&Z;dFZTt4^w725pxz1^k&|U6x_0}Yx zvt^fFvmW@q?|a$Wy4fM;D(~98Ub8vOw*KFqwd|}MO=~ABuA6nGC)don@Lq~ls@Y*V z^~R5hg7>Q(boAYBupKfJDn4&?R;Isy&*yX25v_*}3qLMd?l;rq?3dpioNwmET|C;b z!cbm)nqgw;Q7wr{lO9!X?EdT5*RO7EE2FC0y^*sb^6?gPN3X2&N}-~~9meh_r>g2+ z3A!D*DaB{?l^EZn92=FFFHMv(5Io|waz*G%_I8ir((ZCGnV_q0D!e3gcUi4J>@$73 zwU=MXLSDYJr&~H_EPPO1xw(EGXoh6&*KiNES4TrKSyhEsdcHIlT;8VUI%o1h_G3$Z zx6W{gnzEzw$BUVhyZDvimZ zKVe<|QDIW=`ThU(?Cbv)zvEM%`CO9iglS<_#e~Yr2PHK}#9p-Xo(X;DSKf2^#F4-| z4>|)quWA%8eeYT$?h(95M0Muju$*%n-bM=fET1{&mDP@jl~)V&9?VU)3cVt8j^+8n zCt8mWpLzG}(znBH-FeNa6*V)SeEM~&t?t3QhknzxDBSC0j(*lNx$R=W*3aw8ucb#l zclxOBaET+n@BUBU2e)I|R;$OokxZ)GEPW!j|CffuvanWx7rz{&o=@|SH~xIs=fyU$ z?aYc*SGfI{G{qNH1nIq)#OVH_`dh8Pymc1abEzp;R!!{Mms)A5?sK`Nym7bq;>yg6 zVH-a`Sa60_-bQ@-y-PDv>{8Tv&YBtJFeggii2r_usr|O_^20v+B@3R-;QJmES9<2L z#|vA-s!Nm3uJKyyHEXh^;H6C+&N)(7vs%w?TYlf|wD;35J0^s7-sXF+6xAb8b*X02 zEg$jTjcL35Zp7!j{3UmAq4xdvYpeMVTUSRj3SFPWuq>aeR`=f~%Qqs=9k-f@PtWe% zyzl*swqpvXb_Q%+*DiB?hwJN-%7~w7a@S`CMa`VHa^r_R6S~*+YGz(f@j4=r;l9ay zomKm0v5y_53iH3O6FoR#d#ls?XvSNXk;>0og0zEYzHG~AKi(>3rI)`h(ktChzcAU}qrWh>6Boh#5Q{{KTb?r!3Y z^c_+&E}uNIy-`H?;a>fki|e+X|MAk@{=wtj@(-FOpFW-aE7qN(Y3Zq>W!=v@b*6@J zhZ=tLld4|pDzI8&X_`|`-^*03kiH(zkC(m)9+^1Z@DpaY4>LRW@g3=t0hfuQ_7fPj=2x|6$DcZ0h3lEUhHBQ>Sln z%CA>TS12!MQp#xUGR(1Bw@xo{rHHo3*|i5X=k3csujqGcUswLb^J`>mv`^WniiPW( z?>@3lxy7TSuj$cI;kJecu5%2dv4i+EwXY~G5qb7MDe*ngwo^F7t$zm?_x{|Mgq>FfGWPnwt8+>@8s z#_W9mDw_Pdz>Bx68ME*`bSkOXm2rKAYBm zC{KEZ*0aUa6Ou9w15Jx^Em%w^JYbBKeSS4bJRmz=MSWh@+cg;>TSA(|+w6j_`Yi64 z^Hs?}&7YnLv*&H60cRT52 z70QXThHlO}wn- z9okNAuan;Q^Xz?-I`K)*P9OY!kW;N=^-7PAQy)2JE3kCzRe$E7*A~SMGwEO4quY$ zvLxX2kvxI2+q`bc{YMvmyd^WE*l$bfvNbjfpUpDJofw_A_T=)k9aEc^-AcM}Wfrs3 zTvNY>i%iR}zgiprc;}}}FIFWv`AM>PY5fS8xUY8YuA-}JCIvap2{hf_5%63y)G))Z zZR^UVTTS;ltjNk=tl%B$lruY0Q&c|c+v1f$Ua52X=E(UkdX-zh_4!qPxr#mZkG9FZ zmwlXgFksrwplJ>-WafVNNzS_bceQrf?z^-3l~(m7noDdnnj3fGF=IhnhUyW9R|X$f zm~Br=zMi^8OYw-9qSbP-<;!{}Ki<2=;=(G9Q=87L5Svr6=R3=D4->U1-vtG{&RM)K zOw&=_D9hx0Kbb9R)@n8BW-POegTtnG&J4Kz`$ zR*Iauj(bW_%*;!24<4_t*Li;IZsh#P+Rw8Od>6QQP}{d;Mj$`J9gYw+PZ3H zXQ#>cvhM39M>?m*9EhrTw<+b2*&`Vp?1dc)psp4gO z64zE9xL0)d7DMyGWvdUaceUK+-0{e1K~!=3O38cftE4njx2S!xS-jeL=aejOuSG|F zt{CU6bKRX0>9))&Q1x>Bfsb`b6TIie*gX9AZh6h0SMxht`qa(e3!B?so}|GQ`@%u% z`*-(u`SKfA@zhRuy6^9~Wo%rPnZ6qyFemk`>sGj?WTcuL<=Gv$)-3I{(c?W^B%TFu z-kUu6;gX{Ux1!eE`SR^rW5!$7+i}lsPjFqCDqELvp-|k&)b~khp5FJXz1OSOYegBQ ziJqPLV2h=UQ}(T;k%EDHnx||PwYzw1(OSv(d!K}yb#QvG+UtJ0^2xt5G-7B$?-$NivcgfDTtJfJHnNWF>Ey-_c>bfT3&kCoftXTOdbV5=@ zrr^aHlb$zusIVNYoVXf48264+`Q-=C>Bshu;;+xg?z-7>8wAu|>g{QbkZFRsws{?p6z@lN75-?8V_ zm-TbcTV4J=r@im@ZRX{N1-Ev2^iO0xJZ+_y#GJQfwpqtsU;lpR?!B#>dsm)$obo<~ z_s0v#crg+8>yGt{vuaw;t}NZmvmZDDd9t5c@6xc5Gk$0!Q0=bOw(J<6{??^OrUV%<&0gKN z&aCC^>)ZViue|>(m(|pMU;oiN=H8tTFWv1QsoVdS*dMxc&%O=qHB+8iT;`wns-!pJ z-HBjTS+}NskMt77M@gwOgN%)HmKWMXaq&+4{$=k~ zu{(jj69jk*BMgM6L`~KyHoC9<$jakG9A{m!(KG4&#hnWGW@(>4 zI43B&Vf(zq+cys>J@9c#u5MKf;C&?UqTQo&?Ze5>SfAU7zkg$({>6FG6(?WT_q}gh zx3A;>^x;#+%a{@$zKIN?6cI3s3{?41I57Eop-3^r^*HW<@@$WZm)Yh(JJYL;m}Fv(&>5d3R@sTs?NH zueO7%G_8)YziIf) zCsJ(M;}*^wJu{2WC8~yUZZ1y6$4l?Eb$cHx6nP$fdBc>R1v92i6@Kn=WGx^6hkM36 zjJmB$MfMc`u$xitcfu=5$d7wR!k>;B)g?yHxQcFsB8S$|rP$8d{v zsBFgUS(X3($eKC32<(#3z1kFJYOHZ8cBJOB!-YC|_lsS^hb#Hd-KxKIXXd$!cPiPo zifH@s$~=0`d!YJ${d*bVvTNyK_p3j*dfvZP%C>05td&g_&bu0dTNwa8X&ogvtw7vS`C23O*XoA1}(c8bMxXkEX>*~BC;2IU*&4D zc)xP%x_d@ZW=l4#JMMOF>KyL8)&qBJc0M{eS^Cte{A%IE7tYc1y-vOTFY35v-PxsP zUsv4vCi*{pU!LBE(z^yx;Vu!$b8g@JG;Qas+fpo7_bA+bcWK|ZqyG<-{VxCU@~!;G zi>KdDe8xWQuwd8YPjl0I+FQft*Li%oxGsO*=DjyO6qPj>9<}H(4ii3Y@>oS^PvSIz z;u+fx@@D8I`phNwd%_4D0^&V;QIe%&>nUaEilP;h)vYmo82;vWeu$HER&9=|%-cDd!p ziZcSU4xV@ME&Rc?Ds3Tug?dxR(cI!=o&quvFPgsGP6(SgDQeBD4R0e1cTQOvl$Aa2 z*NX}3Y_*@LD*8!mlRes5x~Qo*EOvKtqOi-Vh=CWRgpPWSJ$Lny0(1PR3*u&PV2n8OZa3f zs=GN>c$;?jon0oLe{A*qJx?BGonQZFtNy2osEV&Iv-OtSW@??CsiwQ>*HQQFQ=)cO zY|5Q@fV-Dd?#!ByW0_kD=UB+d`HCKRC?LIUUb?xU_@cdb8pYo-R{ePJ;nB?HJ>Q%9 zW2GA=OgnWcUnxy=v(mD(!)8Le4phv#xOBtaa+9(+r!$+M_;Addqixuc7;5&nZBCbH z=oXc4*R2bhqK+Pwi#OV8AzawO*>u=v%KLxb(|^TWu>mh&O7&XsD`%gT>zN~+toI-N zENn9F-#*R7NKLhkfh$f%F=SV)b$Eo~vrM-w$4liF3mj@Fw>>|9zjsgH@9W=7ZlC!3 zSUc~%eX7*^9aXzh{oLQ#S2JyJshc;YYoF&Z&>dMJHu(o5SyYo zbInvcr#G^C&eKjARAh+;<)wePt0z$2H$`aLm$x?q76o(*F3w)Jmut3f!bz`lQ}d)d zYd0*4d=~TM(aGMQO9k5ZT`f))2x9L_A zw@Fs$&j_0~ zCG48t<4+9PXTr5FO^aEfx_`a|Y*rjEzWs6_fK~yS2gMXFb=N7Q9u+ z+>&uN==u%Q?fdGw_vG{}ZHWGvvvu7aYjxc+p-lT=%_WmOEg!F5Y;o|oU*3Cvv(Ux2 z`HYsIl(XBn_!^g-)AfbVj(Ba0S(US0+PF3Gvf*5}zONdmYn+M?Ryv!U+B4@wnTvO> zYk9&i}G~IdL4VLQ53ZMLX)udnhkvk^lO=X3JklEfTU7h8+yEbo0TD!`0-U4%d`{WifD6Rc5ck6>a zYxG!`cE?>2(QQjoTG1-;;o`*0I{TXXE7Jd}9{4`5{`_B6{ow!WUY+;jo!@=9-t*U; z?WgLbkNlR+yWG82?{2D0 z<(%|i=M1eM-hI0@rvB-vx?jKImK~qo;d0nhI`6=RAm8w`x!ns5*RGzmL#)`wSNZl` zzCtH2&gZ|L%{$fU;37KDrt;9$y7PZOdb|m1OV!0tO^;$}D<&!BZMGRM`tu}mZa^L%nevbUQon7w>&TRkk zb5gqb{$uR#|FKQBo$xArN7?-54w-j+9Z!y#%r(lDJGii0Iby-GBNZ{p9$HtDmh4=x zH6bGTk7cS0S zD{=Ryq=i$C9pJtf7|fVy(>BFOH9U!DN=}F5!hB!d3&(nL|5#01`e1Rw$qyGVm(KgR zVGXYVzlr$P&rNBMKR(p(zjt@T{r7L5s`KBue}D1TP5W<6>=(W~BXZiA5+9x5wECT? zv#Q_4*%WBC8fvRL_M9`D?eSdk`Lhk?#aHfplb!Yc0^ji#;idf(Z@8aaIm1FdcR%-( zJpq#@PD+ZX{x9+5%B)?7w>h6tS>E(HE~-Xq%FZop3oCYMOna^*wxMKISkS^HTCs1= za0mH??h>ddyE@O;u5zkpFl*tr4^>n6+AUINrUhJQ%gK2ERUsg@c;)Y@vC&1#YS%?A z@qNx59&XLouYN4kt-UYAwMIQ`_Se0xn}clA{+idlmVUT>-`BmL-o~GUY_FIW;_#=6 z;qtehUg79V8kdctKAbYhnWKGbLvHir$}>lD^^Z<@T=*nu|Kj(`+soJAw7>bOcmK!N ze?IuzJ(?`P@6oGgU1wd-A6~8eXv$f;M|ZFNd5~(;qqE#+>ZNma!AVxCCrxMe2bLY2 zX?t$UmJ44!qPp(h?=zaWYUce2=?fuUQ_a>L_~oOJJ88>n<)tBp!QHhC#XA^G`=693 zSsb2ec$V8zTQl?Vx^7S18N~*2qU-za<~^v8kbdr`eUJ6kuKm9yHm=FY%`|D7ReVMK z{_kT|uJ^yaIk#>%s9szXzvr+KTgcqRH2~0^nTeC!->zGI%Gu>=XpE3PVt$=t>~by;5c)+Pi&8b(o&|Vo4GaK zJEerxyxz!Y1q69->Qq!XI>Wzn-+Kn<;z@dZVWONz1Fk$%z4+aFV^W!g%!iFLh4wJ7 zz4~cVKz_@Etlpib@9LgUF9|+x_4sk@&xi01pPx@?g1 z!ERAkY3z}#NvZQL%$lGOA<3EOJh6d)UhexP5@{>DW^A~btD*6+#AVOKOFjHavG+IJ z&D6URqv_4GT4$%w*5?aEIXb@UtURjgrhY}$^W~hUNsB`KmP_gvRMfJlFNvJ#KQC3Q zBsQViaKrvPH`B~JW)I>&%YZk_9iXHLOur|dBacV7ELPvFSKuX_{K`oH)4eD1vaZIP_V z_3BHd^QLIc5S*jlazRPkd(pKpmYj3@jYtw9{BM%#wjDce1_fB#?c26Iy!kdivv=O>R4r~zQSY#$u8A*{0uRi* zWV!HuS<31Z^^R;F=}z0?z`oCdJ8O>RZBO2OcgAhjPiuo1BV#v4M1P)ZzNfrxMnlJ{ zTet2QThC3|E&HO)AxcQ?SlV_)U*p+!pQf(=rhvfd~RE}WR{+PwJ0}x z>&(5qcU__`pW0G**T8YB!j>7&p52?LsroSEb>E(oD~(uJE(>!}z5L#4_NPw!UnlJi zIsf;(VAuQR|Kr#Cf7^flv5rr*ubFqf-~Q?3`F}YNKbV+zIK)kQTig-Jl{0u_&p*r3 zPh$<&`t12q->Ey_EOYntEk7OxX({e{#`n$SUhMV8&lbyDUO2AZDeU^HD@ESoC8dS>ehKj9_9&yv-qN?tB&h+(-i z9_h(4_#%7m;;b|!i9?xl92a&A9+|wnr$gXq^b6(FhO?LX#I0I7 zY2!_mZwG(f*emH^B-npiY5Kn7A(HLAy~~x3=A_D}A6{kg-X});*0rk--|xB5>e22X z@M(?7w@0%A9vqp{RebDeox5-DkE|Q4bMikf&vMI|uXr%4{#M^}#i^k3^uC88i%+!6 z62^VpVsnDF80_derBoc7)6wf18!T4X)RHx~;+Rg*i92ufPJB16|I}{(;N@=rpP$0- zr`xHu#UB4xq%haWGBruQ&~6JOD`ThA66NVS73qo3^c6w#w$7?TrnAElRh~9_w1wow&o>`_wUM@R!?s{P2AG9UHbLx$+9o<)A3jCrNx+EpClzy6Ln)+Cpzk!UA zd1*YjGACHPR(ei(->PGO?;d)Yx{R;j>(6s~+ofmrc}+caHEqF$3G&@OmXV=~-x?c^ zyDzM2TwqiCZOR-O{_WeJ)F}Np@LS$y`I95(>%K6od@jBJ+xDl;>G2!->%JZT^jKVe zRz%`v?n%qKKF_E;Vw0m^%`{KxLCoMa*|7z`cmnEm@Y zM|;-onak6TW=X4+TFep8HZ)WFyeC2JS(CW<+#L#S7k)hRGYpn)JF!P+iOpl?ALoLX zX{o8Hb!F*g&Hi5qq??5;708G zm%C3K?zVncSEoIVHN2_OYhG6;_mZUoHO-yJ*4^ANy;9M)^MRsA16QwZdaq!*uGH$C zAC?Ff?NR?C+Yyk}ty6O2_MNe_I=LtnUBUy-$)2=Oh>K?m#u5ecTBGD{QpW}iXPu0wt@qFUK z`vIXZ&859GmBKVq7xqWDz3sb`WaxX3XS!8;#N!`RLo#YsbX~iaaXIS#re~{~vbs0r z=y5-M`0&8x<^E5zd z^V?BiMWpYNr#aaxXB?iR9Xrp?C+ zs}0}%zHQs6Yt3n~$>o{B;-wCug^nD7D>iTHnJO@Qb%m8!TkQD<$`$8h)Sf+UynWc) zdS0K+yh&43o-Ez@@>bY2i)Hz33TsxZ(b4q^b(Dz;os{atcVw!o7F%qI%{{-E*qBe! z_kUzJOqhP8Y;*3#qiGe_@5SZsC|7zdwT+LvVNGYl+0NBlch>se-nD#dK(<=1x*Y%a zBR4kQetX^2P?^ugpM~A;L~z}1bIbijDWL{;Ug_mb)U%Who%&$!l%)=>_kZ-pr*FSqXf;6+McB23lUW&}mv7BjbalZtwzrA%7*rp4dM}&eV_y=oR_C)* zhto!{S?OM}Pky|#H7uDDb;L6HhRe?V^$N>fmxNuOa?`Ed&)x3t3*k8Xd)p5^e-(5; z$0{IsrdPEzOZw?cZCOn}%HHlV7J8&CR?>A96pscH=$0ZjrTVqBEyAl}Ef+7L$$YnWa@Lt}h4 z%2urq{uu2(cXf(x$!vwR2a5xlQsus&;HYM z&|8;PcSc2K;KjHTD^GNMdUsiRPW$0Rw;GpXwdYP})0!4v`__}X>eW&G{hya#WBzGe zKX3m0^WZ%ao}cbTdaby6HDLNAAHLvKF?P3=jz(s#%bv!b{b#4*#%iG_4=1cmnRwax!7n}X^cVFtP%I`Oy|G4ygU&oB+?DDn# zcE7&#S4hYo?NolCGuv}r=o$y{rkzSk&k9^6R4(w&>sFus<{R_UIX|9!oM@A#;q_%+ zs!oaGqq)geTHV_kD^_>S3fTNG!}pYGXs4aP9!J(rLG`3cy%P^4x7miAC|1kstus!@ znpCpPVoje~+?>$oVdwU&j^%y6;>>2d%U0&^{yC-QFTc9)=iYp&n)bqR77bB7t4=RJS|3zhJF#XnI^CA!%lN`|mW9^VcdTUg(tN7d8zKnX@xjC2-|4 z#>r=oUYHdn@yJ;2e94^1UtT=t+I&;$w>s`guCciJGVw^I;uk(~<#RpL?dyE6vfg*+ zc0T|1wfio+8}E`Bo=eJmb=TdgXc7)u+p+$O^TDM~J&h9PKLl1jlG?a*=dvRQX5H58 z*kN|^Ut6krn#KDS`FG0BJ)Yx!mP7H8lf#~9?v2~r(zc~VzW6=WbJ>+WCg106d6v*4 zTYLZEoNU9Gb(WfI#O~Gpx83*eYy8vxx*z&vXYNf z-e2bKa$)OBmAD1#)^W_rKGU@?*TeN=Ok8~7=Rca|^JU)h|NFpiDeJ#&_pJb)L(2{q zX>)vY_Lr~r>sPLv>Dbdf`?Z*_X6rur1zJvzUzRinr81ujo;1ljF)A%6@6C2q-8XG@ zrSmnHij@7X-M#PDB17j7PN7A5ufObHtg};eTX?!#$H!cm6+6PFtXaBf>m#Rx&9^6- z8qf2ysVzHv|JUpI=l?(U|I_r=dh_VQoie|FTRimE3dk-}56{iv`q=9cBKk33g1`4} zvP7WGLH4Hi9~T~GJ-^}Q$x?=?ZW}%@J{MenE{a*ANHhCPy2}v{%jA}{tNN^~S&Op_ zEjC6uh=^}IreJjDO8MM=hIsqB*t+TW|DKLs_wVkdo0;Feuc^O}-NK?R{%ey=C~tChj?2Z7mL87&lJKzh9lYSa5UeBKI1G zq^)bZDimGZOVBD*Xy?OoXrAzR)kG9tKd7g@qX!*sT*e&Kbjr?TdMwZ z{vXp*lV$}+D?D%MIK2K$NLK9K;%&R0Tw8IbRQ}qnb8K$KYTnX(Im-=JpY?o^+!r+5t=hi*Y{A*j>GOhZi+)%5ukEb=rvGn#&97hSHgn{5+=~75Q@`dw z!OcJ~q4!t)+9yuZ{+*kj)j4NV@8dIvUt3R1*|wXfWV&GGMg>O}{%O(zHW%&`9juOd z&UsIHq2`1}^bF^gL-e<*0YS--CE;N)!SE)7q|RZHgFUeLmsso5Lvevq@|@P#`cB@8Rp zYJ$-bu%GMC6=LRNq^En@gykxunqwieg{n-y}PS1$E)N<|Eh3<=w3zp3Kc<^F= z)GvqUNy)cnE!0frT9;C z8rac%{A+H-6?YGBQ*oKY`;^bOM!ky8TP1GXDJQ>oW@R70vFJtv7lZsot#ut{{gHF> z(}j-Q$WvP5+&+6@`W$huNF6>Uf4#D4mzr+`-H7?p@%>4b*pbGH)wjNdF6L#KDY=k4 z|FX*}Ek(8(al=fXx8@VCmfD(2U+_zdn)mt6zOQTZITy^41=o_1`*}DM?*9t=Z5$py z_ez(OCqMmZK2GVAX=3ln$l$z1UDLy4no}+fd z4%zxV`+pyffBNu4Q*`NT>(!!~+MD*g zXVMh^7`Ni+8a>Z#wTETy?6>EvrR@%4vC->yPJK693e_8&I`)=HqM~YfX-CtDfzS*;*Sz>SD(XwmO?|+8`|h;57dtDfJg-|``gq{uQ^r*v-u*tm zv+g_FWWLhIm{n&UpP7`V)%ww*XovNN9_1|dMb;Z+-f5(&vG89FoZO{#<5WYpAxA}E z?prI}woun=<>j6`kEX5-?1_rX*8k$1%`)xSGee%$x=g3qFZ}D7mnv8J^%Lu9qs!l! z5C3b*+q_gHS#tWbT`Q(WO}YH?NM7;5`@j4D@tLMSvwV1D;`E-GkM@{|N1mDz6g_9r z=Pk0Q61hrqPpy=S$QH0H)LnG(-_w6C@3-eXHZ|3>|Nqi|={2o`-+$bY>3SK`dDvmQ zG!y>3?*|S47rhNhP zinY7MI5y_rx8CYza81HO>FmZy!N=D7tO)YbX6TBpe_kfw>mAwM;>0m=$K3}iOnrwR z9x>nllXu^rrTh~9##^=WWAwJU^-m4Dc71YKLCE51UMtr=SaIuJ`O2wNgdA3rMf%#=HFqi8 z(^$zBv{H3pluMMc;lG=$PsBG`%`LsAAC)gresHH=NB7(cw$62ZURFL%fuAB$Y*PC8 zxi3d7+`_p#N>=gPn{C!jITvI;yxRCkgZoLa8# zb4}7WDW!dhb-&Jf=D=@-X;b$+DeccV`|ojKl8o{GZ?EH@ua5sM>ep^PXHVk%eVuhN zx#tcBW@q*;FJ*98(yI1+%Ee2Mn6{dUMQd*T7e!{-^- ze#E=ai;jtqUY6lIW81RrwyVOFOC~;$t-ZhSmPF+_Yo`L1=Mv8k)&KeaFS+iicKpK+ zA3Quc4OP!_tLi>^dgShE|5O{97u%yn&Tld)kMuM?Z8PZ^>*}ddT$z4H>UuS=K8ul% zfBsCaWRshf_@yZohv)lV?oo(|i7PBDb>(5UtH{zb>fapVEyK6?&VB!i{Zp5l&wso+ z{-@ObZ(s8Z{(hOYsO#FPua_HF&u)BRn{{Z4R%X~MsgFrFQ!LZGR`tHON_}=bGApd) zgFLPs7jWT+gqsdpYZ1^%5z))gEDAB3h5$ z*b$dfa^<*}{=D4l!mFk~op3buA@}+GiuX57y-nZAtA7ewD(t^TZkpD#DZX!Rwm4jO zFL2Ua%Q46MsY%+jkbvgQRZs53EGyMqmeui@OuM4QS6Q}oV{CrWj#^KH zCnvA6=}z4uvZucy^8AilA6U0AI$gZQ=5@5^@xvpVRI)UAVqK1`pL1hdyY>EgjRm={ zSbu!mzW;0bdD-X2C&1hH^u5`Fwnmwn8k}9q+gEkur>=Cr5p{&kdpXe}@Mbfh## zOmU7<_+3%E>Q~HPV$auIe|$DjTz&5QnJ|EF(h)D!GRD~U0GX`a)X7dbKic2^v5487HLj?-ozQxCd={Tf#$u( z<;=0+Yo|Efci+RmLSy&x=@}LgbB+18tCxv4?QppB#e-*uf>@HM$B}@w-&=pAIKMFO znZ5U_)|4$1g0`+suRghQ!ty&xuIp^Q9)$3&n6~Ul-gV=cikjz^wkm!7+@JRdEPnj# zue6^2_8H|8!s#ow7F0=`)C_(td;PD=8@?si`+2v>%5Lm_VsvZH zvS|(5+@gOykUo5dGwCen!mX~eP2=X8h9@zvRJ``cmBH)e*^dFz_jT9km^5tCc``*n zCT;2@;V@AbPj79NZO<|nJah6gURM3@-2K1(Kc=p)ohe`U!%%+Df4g(sOEn%_Y?~p{ znCf>{_t|Xj2~#tl3kXD;&pr03aNWk*RZUTmf6F(>uiLS!irt*!{*UkbkG+g|BmZ~* zKaalSt#vPWBn_@B-96K@?!9N>k${?#v}HMEw)3)FUE5;ay*htdOq!;gYPoif!@?;p zUffH!IVXxs&px@v^6?)2jJ2;#D=yc>%$NHj-`}y6oLS5$E)Ol39;Qklgb2+nkwOej%mTU`CxM1qH zS=ejd&3D@?UhatYJLCQI(I+lr9D1@s*BF!m62;`lQA+_B2MW{G`A1!iBImCm#-zWOQC@yDDl63aVRzvljT zFaMwVkGkV8pW83(mfafCmfIe-IAiIx(hJU_F{c^%78;%m;g0A&|K;3P!EaLqyBa=k zvN|BEXB9E)wf9M#;A54_%Uf?BkB*bISLKntma8eoDS1rb#4L@Fc{a8EXP*fzk9+q{ z-X}Y4_uYv1+{=@@r-!w^=AUPDZ|<7=EWhk-6nR|no_zXwvuu95Y;HRvf)`Z|xRO?yz z9kX(+;ESKgbC+{>UAuFZ^*(Es z=&h0!&Q~XPO$u5#`P9Dq%IAvfPxx$}$aYvPYO?(x_8K#Bh8I6Zu9~TSVCH>-epNZ(FNi$BLSaw_CT>E+Z`G3C)?E5@7{*(}C6I|`J zCv!VPi&rVdo!#;()2RISgr|=V-JHDI@12~o#qqN33yY^(s@I4guoM>DHl2B%L!k5S zgxd?^sU+&?dA*8X~$GL1M)o*v zUT{k+>)K(i$2Qy4oIac>KC*5p(RP5zUmc9F6wCO3e}L&ZL!hVqzvFtCY{Ij0rGa*m10I z;*_G_A8cK>iC6o*|0>a95gHTzaqi;++lNeR-tmTnCiO&wF1zbkc6m+vT@Q}Ab8L4k zHx0Mc3A?_WvDY(CZ~ays?%C{phqo0KZJNZj>wZ|)8l$)A4w@?$%6e<6oc(cb(|*aF zH|}kSi>?W9lHZWEGAS~NJ;oq}oZ(knKB($sH>pZXAW2?lr-Ije{^YL!Y z`|tnq{=N18XZdZn?Y83l5uHf#Q8|Ga*vGMV`hepLGdC!N5 zI_@Yh>JPoKA#U!c2S1JNKF|Lvk-zVw$J#Fz`vsF%A8QU;a%pYVvA<3y*&Z`b_y7Ls z!OY*gEMLyLxh-T`rs8?!oo9|@9&8s)EIqWP_JoP=lv$G7-9HO1UD6ZAv2gFX$9euf z!nOOEW?5=R-Tr_2W7Ey5hqvZW4$AUAD)W0vR&HyEWoS?19PP}`1)?jRW*J|$`7B-k zcl*ch{|=u2uzCN7(|0z91zfE0*}g#Q^d=LTd0MLCTdytPS{c$KEOI)}`qQ7y&*zjd zPZzhY;RxWpX3-<^$V9kJZmWkEZ+ql47cK7gk5O4#w@Pj2+*7USH{{cZNWPiB{Re{@ zOVF%-@t0dW8Vl`%J}(O8owPY{Bj1J9t5CyOXVYvBtv|>v4jRvpeRG!*?&9(8x|4W{|V?Mn1EN9-z z8!;C5*W7qJ>51W@*yYzER<3LiG(DEp6**^n%ek%ZJaa9MR`&3kKINV6zwOVq`+uZ= z%>Dl;KfU~Gi%jrgcILuPcb4UfM_Z=F-;7zV`*?EFvE61TP8&XQ%9!!6BXTb|D{ zJ+gFC(Gm93H62GRl|)SRblRo2{pQ|wIjk)H*2~A;$M4j?+gI{>YuhIm+kOE)Ol17E$tA>7=!B@3P{gbKI7yS-L#V?Voi|?z!z(^S=Id z`G?&5zp`(}-k%V>?Dm%@S9ZN!ldtjY;TxIv)!%M2pWEg-Gj-l9$*P!3D+}I;gqWzs ze7Le`NyLjP=gyxUM{{0o5Rf^&Cm`u?`_(AVVyCUDGQ~dmvzt!OnK5nVB;#^3^-15Y z|K1U=pQ69-C%4Qr=7TFF9KY}G*v?z|PS@gbfZ#DhuQQRm6K+;0&stb@aq?G%u8DuI z`pAd}94u+uGGE|%#9C(6@HHB%t!)dlRvt=B{UADT@BV{jedcoSW(FTEZHzb={=#~B z;d-OKK<5vS_FOES%`&;v^Olcm@{U{YO6nt){BZD@s6M^g>U~7@;!01U#S>=yw|SHKQBMgqVimcbHLfNdra7-G;McUd;Hn2B`mMEh+N!hwq<3) zo2$OnVKsjq-?4zv8v#s|@RuoT5otau~vEnd!{in!u*TVKbpJv{T5y8r(T+@?{zIx=Vae_8P$>~I%CYO(0zF2iMYv;6NbI-FMus(ZATZ~yIT|8=F=f6tpM)`lp{B{QBXjAQ#N zutaC#tu`6jEyD*|u6=i3!Gzw_whB-iP8 zI07Tiy}$GP-{{*@e!l~g z^rWusowBE(v~uz7wOz9orFw3XT62uEcj<&=!TXl36Mq`WzKmYG|0-t$OK4{K;^d=& z^SG}$Y=3o8Yb}@O#4RE!3(PpS{^7c|Uu@~KDw+9QtF~6;=RMEf{%h5>wT0hTFRM4n z{eH2(&dp_?`~NTRe{!#w7oF|0hdYY-*cG!auYWNV6(=Umv4DOV#8 z&)FoEUKqFKHS;owK($!bqmk#|6*(;}{Nmbc^?r%{#v_)BSsEKBJwH@otnBt-Zu(61 zXQ>BWyU&U0`kkLwukiYE@j5wK3)_!2zu#zXjM!VTW2(iuCqj~8wm;MQryYB=|MQty z3;3)f%N|AAe&*5Nk^Xe+?CDotoL*vCR9oxZ)%o?~p4Cea39h|yDfi`!rWL&WNl$Kg zhInpFi1ijZQt6moXPvnGR@KKZYb#81n=b_>X2rT3i*U*DW+-cX{7Ti%Lg4VGGgEGS z)c@Oe|6KfU?f?4!{`uFpiO;L%GZm=vmouK)cCe;TVjYl0L_)<16f6e-<`-zWmRf{Qoec5q|SNc#@GjG#P?Z3>G%TV{ATnqK_cx4N4dB?X?7^=uMkm>nsYk6! zTl1Osxn=rRu{~cSq-PYFFqH2rc>ay~=-Pc+UpxJkrkCHopKZD?i`8&f)Yq)ltI8dN zeUuC@@iJa@;+0j^%sjUvp}_HEX^Q>Z70GNo3tvZ;Yx}${&?>oP<-T_Fny`6aZv~!z z_@Ut0OzZD6T)zJLq_Fy|*KR!zJ=dO%QGI)ts)qImI$c*(dSWQVcKqv8-g5t{egCWX zPp>||??CqcKSHtMx02c~6->Cc<%rzzma89U-VHh~`aJ4Uo)rHPi_L}4&o)>o&2a5I z`FPUCZ#yL8wKRS_(A;X2tG-F^gjV7EH}kF?^}aOG-9PSf9@hhzbERv}n>|`H>C>XW z7XnQ)6O*FUvP^UQ!q!|**GYC-bJRS)v-*43oVmFt&Y!LMw%qRcuX(Dfs=AWD54E-D zzlrv&&}&g#5W3RzaWi}7i@@gW|M%krAD`5m7_?-Hmlx-IS#@>oBNB49HK%@hKIs4V z{l7r1_>P_X7QL^YQ#eIA>0-xG_Jz;RSi~!9xfI*{XDEL2?qZpA_T8nL!P!fv`RHC) zUzMeK=5tT!+c}pPJ=qiB?QFFDi>XDn$INRhxp?o+5lNm}X!oG~K)c5>M(7)oVcJk`&#z;;I2*UC+mWpBkCT?IqDPFY=Z64&{=YWeiGU4APc-YW3>mAB$t)XG&w&*%SBeigQT*VXWq zJ%&zalX{k>9qd?eugIw4?Q4gXY>)Tk_?a82Eq`2h?CZ^v)qQnWtya$!^?5E}`HfdZ zb=fM%=u`Vcj;^!VX46v+odTz5>6jFIIeMOK5KIncI|6Ro}ChwHTAaj@wK2@ z=dZEaYZuk6T{9$v58)REbs2_ z?B?lP?!V2+Y|n=Wk=N`B{yv!$JIBJ_cKP>d%k$%md9vgF9I(D2t5<4&-@`xQj{01F z<6o6Zaw!~EcJt1a8$?T6&tm#Drly^Wjnl~OsZJaCsc4j$Fy5oy?;)< z6bgN`@b1Z9iVHkXO3JdSC#(=Xu%ghfr=!a>!cZybYE`pnrg4bWpL3P|IuoNppH{rk zeqnLzw(hFT3VOu1Udk%W#+9sb|ktMig(lT31U8^}cDSKW8yfko& zSmvY4CeL(PapMGodqG9Zj(J6}Ptz2d&J(Dzrg_?oTlL#Tew{tA;nhp|I~Ro}ukmlb zw&=}zW2LF<@|#cYIP<3bdW>!DnL7JZKlherYwhjY+?%;ZDe>_Mtq`u4Cq9|4=98E4 z?(Mnl;VJyS>OHfcfAzX~Z#u7@w$NO~-ebPvfYI3}9Ugvbt}`ZEha}Y7dWT-TD(k*s z>fg&Qx2(JB8O`^22ic}a#6CDQ>u*HGrze``;pTJh@2vOPw3WSdX;6@~&ecgLER*ME z&(>P1^enu`Zmr~1A6?Px+`~;%lV4_D4J&yiqxm#h>HI_I?pE_RQHsZUJe&(8pP$fV zYU}Qnmb3XS^Z(iYukJsm|3AQAR9Jd)?&r&G??t+c*XkdXD1M{8;_Lxu>2EDKm1}0A zUh5RGrs4?s6Du$I>=0Y)ovL`f$5dA`a?8vKPTtlpHhQ}+c^J=iD`1J~!|Lub|51p@D zXOq`*Z5&MB|NN2HPG=y`I>kn|pEb zlcvp1QBkja3^LZbx2z9Ja@288DfA9^e*KxJIemY(&c=kbi89|)W~#0+|26OVymb56 zmy^5OgFK~T7Q7CV`6hTjvh?8OPkwpp^h(Z5exkYZy^WhqrCvrDXY=K^SL1q2Z}IyT z`%KC@X5qYlV~KR?N#pmGA0w;8D}GM(UbFO}|CZbj$7gKV_Gs_&X-?-@Uq^+nyjJCN z)KQ%2^<>d|)p>c}jzs(@u76g4jNSf&qul-)KDn2$w&Gv`(f_cOCSyee5zxqY?l;jGq;Vy|tZrv9AJ*z% zPE@q$-rOc6sx0fKbBz1*jHsYE0o|}#j#q2VGd*J%KX5+0JpY%M%_2|{UMspXE9-ad zt!es?CS5IU-CV4mEnTu-w76DQv+Rwsh0D;@SebPr!|4ULJzR5 zF4PQ4T56s7{d4zgY0En@8c`b-)qFUt|LKnPyU&~LKXPxn|L(>bvnxvZ_fO_LKN)OO z)*$A)(n~M&>Z*v_cI-z&`c|ZKZw)GHjo5H6x%Wh({igfe_!d zgR+yYy^eTjMtb=)HTv~*WR@~qHECM%QuOhZ*~{7E_E%`UulpGLW$A?ZX@2LfPpN$P zG26fLovrpe`yJ=ISN{$P%$j8wcG9Zw{XtDbRXsU-SM4?D*4}%g_w?gp^QRkbXI^S5 zR8m##El!G9-%AB9Xz@=VV zuGxWWqE>nq+}q~0peAR+%Fqd29UQJ(b$P-rg)EJ)z8Yk@{8T~G#!DF%Ne84Bx-1nt z5}|CU=E#yB@H|hreEY9gpk7ew)PlQryR&WIxGd>dCAw1L`IJ>bCRv_ZS31h$LTp!W z7Ijn5?-VebqGh36vHD15V(mReQ8BKhsQsRy3%d@sG?enKoLXrfSdvn_Nl15!z3=)=XP3&v@VLrF-Rms&e~$TG%D(>Yvc=0Zf^L7?y;Uq(ME692 z-G$krS_MBdo-D6>_1rNnuI6KH&5LaNWlD43lnb}7mc1@+?Id4dQF_huy7k(n9z zoc_$mNAfYtYgzaE+}ZtibCROB&y@+BvPxs>oP!;EdVj6D)wZYO!5U^kFW>y{5<=a!&B_# z^SLoq&a*P{X8)572`p<$cj#@IH(&YKnOWDaYpjiCT#=ix?rW~gyjLHOZ{4PQW!029 zj^4)KvT}Js7`I&Fm%V;{x=qD1yZ!I?f8PD&<74liGtbw?U9X*R&eHM1D$$F{vjSc2 z9qP|oEAvcJ@Zs*dyVnc<-)p-bUw!J>{e`d3TUzcuoyKe~?s-&V*E(TWk6>d#=jWV> z7v^lv2;6$Dv%*_*+uwaw-*luNe~7&vug8YNif3qQU!JYZ z9e-k_WTvU8-2TFY?|-b_-)aBxeNEHhlEXDOF7Yz2kehgN?d5eLxzWFmUAnMy-Pfy6 zdkmfQbR9*1$(8>p*G%m(?Xa|ao>gmIIsN`2zJ0Cv>(;(b+b3CB^jGA))xFRAzQ2mx zcY1@}<)rc>Qc*F8 zmm<{6&R2XZ4lK_~HNX4f{r`RUb^kBl|7HG%Td&0>vS0q%ryDHu@v`R8$2V_II;wg+ zEre^$HSMO)E&Cq-`ZTM%Tlyb+{g?QM`~U8)7r#9_dzFK{nZ)CR+Q+zSDpV|`F;1jvwQxg&f6_Lqxbp8EevjQlH*O#+m67T3fi4jnc-yQz_aSwM` z^LC+NvDd9ie#M?jVK1xNLsIvvEDPCj$M4Q-GbyJDhT?m7%{&q{vGm2uUR6znQ_a=s zbL?JtntuLrR(nf%$=;A6 zX$$wf2RdKZeqSC@lfLzt@lKS#Wd{&ex?udqk&rcDCRo6J{n&u+=fu1wf_!b-w) zX@E+%eAThPOMc%C=3E$_{5>dlSyyPbfXakPGTLl9>)waPcqc|@Z+)g?8Xe^KB|Xmn zy}k0|uZOnSZ`f`3;nnH&A3vN`uPUl?6L*TZ>L2}Py4(SDAsV5`5HA|8{u5)%> zIV<}3?!qN=IAf0|Ms2ueTGg;p=y^zQ?pAKywF;m7D_-V<2jRlv`B(S&glm!S?^nm| zd42Ppx>sBT@4O3&Fwf0QZ?PGnD`m+CLa2#Jcwf|n&r8}=y2ZQE+ z9OwTyqJBI0sc`+J50~b=R+F7{o)Vr zUZw^S2NrN%v9R3vdCtAv-(`ZuYWAni(>Bv<+I%Zidy?>Uf4(JCEG%ypRMk6&9DZn} zbnL|3>hE6<{xz1fw|e??y8Y>I&m3loZIqp&Dztp&%d{nPG+$r#+qPTMSUKbN3%QA)sD zQ&ji(yInyWw&m8#l(DZd{Bz*_f4R8&FKYj1|GyjW;+?uRF7Zgf%H#3zeH>elacw=m zBvwzy+73M`%?9)Tk{M4ABgL_8&kCOvY+Zhz=Shr2x%ISEZ%^)}BD=nJEmiT6 zI^q5FS=wonyN^GeG<}}_J#rUkJk#N{0}}3jqDwEdu3P%TD|hA53Ln0GS6lTKY@Lvu zdD7zgq)N-BZDw1Wrg`;wW`}M(xJgFIqx$}yk9$78lD<=05MTF!zlQ(+z5gHo>)HRk zslP?U_xVwY+jd{}(HjQ%a5bf~c9x zTu&)QYzzwOzF$-EKk=tx-HUIBkF4FNRr>vtD67U&v8h^-#+gw&Hp>;3|c`}kKhrk-l4bA5iDSAK0{j8LKHk~ylfd{x2gD;~}*-?`at;_B|^ zd;9l4^qT8Jn|vzI_s| zyS)Ct*uOXP{~F(^E|~AWzJ~F+tjy(|hH6J7Y6_;rMCGq3Z&(;|@0kAdIsFlyFWMR> zX=!eKIxFgw;OB_jk$KX)_lq69vCZT2wP_E|CLYh*x9C^fx0=siuP>4JE7=>jStRk! z`z=p=)@rSEyW3wKxopKk`-us2kIhh-zGfBM^-3=@Gb0@^*={)c$>y|HJriZT;i;)bhPg4bH8(o*m$oOvdTw)1mwF%A{M&F?Y^l7DcX>#v)bneKF;lmwtobToT5>NqYigyRPH>pH#HATg^QUY% zAF|TKr0hf7Nu{MpT^@hix5ee3-wm4S|39_r&yS4^Dr=QGE(ZDbEjoPbvGc=ECskG} zdaex3*W2u~(rdrvMfUGps|_~G=p6|)*rets_uP6-@ucZJ+>R@iLb;Qsu2#REwD-fp z^|kF^_C8mye`37n=dITnp{23v=kM(HKk9jP)oCHawz6~jlHxL5M!ww@{ZZMj-d8PE zgYr^DlcgU;_AH*lu`FTrq+&P29KZ9HGV5k87tDG6;-oiQV2|xO-BpXWa;?(hFjPBM z`0U-!S*e{q#VR>gLFcyk$$vN}lzwo<3d680&09X!rpNCcxE=Qvsl zJ7T3)SJ(Ei6RxW=%N3g^PMRX4yt>!p1vfYM`WX8qJn0?o+pbr?ohMsS@SL^s=~exY z8vE6vgjPSCBB8zfx%4B6oBO_raQ031J)d}MMeLHy#<&jGoAPNj`JUdh7e9;Y@D2?1@K!2mG}1QIK317!mgK|j)uC~Z z`%<4}QRtQx5~8aD=Li~xYItAuO59qsXyvQKJA%IylJ=Zy*Ll?2)wLu-RP;iZ;KkLe zA9L4m|K4#md}UtmZvAGvuPgmu9k>6NdDXwZzwX!LD7)qLnN!wuZ{GIVam%z%X8TTB z2pV*-UgzDk*NkVc_sdirnlxBKk2eJru@9n0(~|CT7~Gd?SP@}%Z$ z)#gc+Ql`FBzh?UTMLthGXyL5ew(kAy_3IV(t>WzB_sjNK(E5P)?yAcs>NoA~YFTdpe4{_WjQT?Dvm$zpw9`eOgz%fBTtax8B8{=Ux6SZRDjj z(JN@J>z+`N!~b?vu3PrVyirK^bjZPluS@%V182JLy0Fn|=i#sKy!ZTimF;ucW4~O$ z*#_r;6|74VU9&hMF27UNtzq@pt#frw^rQwi`)$V(=eExA&=g)?A;Z^H{B4Fra8Kq+ z!@vSRjio}tIe(e*muhF-j@W-QE^zCoKEW^AudU(h+UkYVwi{@z z)nBPS~6+w-_;(f6OlyRLfWuiK_%m}y_~Wp!WS{^eJ;ZOwGP?{y)Z zxpd#brF;_))JWXS+kU1nX_mU#*D2>Ldx}ktr9bw|Ub}Yw#^R`Av1A!9OEvNS+BzoJ zsa;85!zZf){64q+a#2DztegsDzO^eWZP3lwb9Ha#nuC_^o-b#J@5|J?W5_wOHW*su8POxE74m##}xIkT2t>3T1-sNnCHNm1JB>C!CC zoDZ5*^*DPnPyX00aA{ioipgPx>v(;q7ap;6Y(Cz0;N(xs(|Zigb1VHS6JMCMFe`KA z`B{!yzcbIT=8sRU-S(_m{-?t7<)@yhY_gdpk$fdaw=(EpcU1OKYsJi~6&g=MBG&gL z^~StcGTg>euPd7FYu(-xP|TRywnn7=GoSJy8@(wv3^wjHoN{T>a|YIng;51@AMSac zI?H4CZfU}vqx^CqAy-ajy`7>l>G+!0*4aCYw>|rn_2gyV`KK0%ivq=ae(;&4Gtd5f z;G0!o+S3AwujjH<&sqB9TfWtO`pRMLzqi+|zQ}bgeCGASX4~c~r= z#k|yKhdW-|{9WaI(&sbd*{?VBqbDe@w0~YwqYxGnTFVik{X`;gvB=qyScU6ct6oXT ztx^5u!g(;D>ww_Z-UY`xGR)kMovshP0~z?s`#N=kaAA@_p;&aQ0M9*cPi{SlBP(yk zxVlPSW4kTBhU0f;(0kj3(XWGAQ&!phep4OlrM~`coa(bPcS9e%sq_CJyZh0H=7c>7 zbCvdnYHnM)XX~UzL6eKh_FYrtc@Y%($YWh+3|IS=RnoAO32iHTg-B(^RK2%7Rr zCQ&uwLeSI@ZqM7Hhokh}Sf1zQy%&Qnbx6H*ywShu!^Qo|@4VMdiz?F6I%vJctteA| z$Jc);>Mqj#{ZdQS6g%P z0^(p*!fa;KdaSwkG;-30t%AcuLIS zqNO2%nKzE5&SO-}So&<*o7Fp$<~-W7^qE)Z+w7Rw7=ts$_CMVJG06X(#s4Y&|DX5= z;`={XT~jlgz3`#C?`wvTzQ49nCwIzhzh+#^QS;oqM)v;a*!}ZnFSm}X{L7jC{QcAH zegCp|R6I7+|9>g_iN>1uc_~ujpQaclZLyD>95iW%%G_x>s}lqAb=y}je^X}MTnf6q zO!o4obV+xvg1YB=J2lL&Td&bRVz~I~#Aj#De(fuix*7l0Vt4U$J=JB+25YQXRGzy` zY%-j-D`lfnM0(`38Xs|~qEl0tE-kxzB%-gw^MvL0JPpBJdJb#f zuErV0{qnYtzI>T;|9|cN+4;ZP`ahcg`*#27((`qVcc%of1U`ND@__rj-*Wpt-`+Q~ zzxIvo6qC<0&+k2R^{Uf*e+%24=kHdZcRuB_TUXal{mQK>p0yiW_D$aYYwDa*h9*Oe z&`&`M6)scvoY7#tytZ&%DYH`3!cBYkxz!k}Znf}on?C1p_$$lO)zN>mR(DLB)E)KO z^~jaKiTP~i863>PGgbY#uZk^c5IHPhRn(ekDNsBm?}dR-#56CV!&VhNfon`#CJP&S zr{3(nvhl;c@;#H|fBkuWGgtlPwQ2IdXUb0t-}gi4{{Qy>8sFdDeR%%Q`hPn1A2-im zXeoPk$K_Rfe!MIH*j)dE|5Nq;|LhwMe*W-qbxCad=4ngTo;Q)N4pa-LLhoxKt?tI*vzdqvmxw`)$m%y=XpxL0Y}Ot+o78b?$odZ*4aUMaKVrhQuCq_a0= zOIJ5)`c3-0;`eObZLe?S>^bwh+3)hSyWbiPUii-Z*eub-FzcgUz~X})$+l}=G^Nfn z3gy+*I$frJ*=|*#Ut8VM!Woj+Ci5(BR5v&Ob65Vq{*QO}zubSK|L3Ru@%kV2|GfXi z|6lx{eZAeDq}_LgY)WF;lQdQac_q#iFA9{qBl%x~ zmDWiLY?0xKW^G)y=}f1{W5LL%$YZUQkt<9mema!Be*ekC?%_2*r1wpmT=(Fm zbbQk8+Nt63^>bgpRY~Kh;GXF+THGv5pLgBp47Wgr#12JrM#er8)7f4`ZD+E zDh|G;?Lx_kd-)!%O`MZ9^Yfxstz%Mcm;JWg=6vib>3*@@>qC>PrTy!a+D&PDBt9?KbhB;8&mfO81OhBmvH|y>EmiS-7V+sO_N;~YMq|MaZh^f)+;f` zm(LEc|M$`VwJKc6w~&6C~pB8YV(oA+G4$sUnQ-d~WpI>m6( z=G5Bl&)>Z3D%^k7%WU=5N#2KcG;BS-Ia=!;>&2Xx=CV>X~)+rP+k~KDP-nRt-BM zc_f0z_1-RT-^*t%NPFpe>C+s%7#DnC7$)L-*q_6L6UxcX0Qx9gteNu1Ei zF-zZZZjdITo{;c5nq9lxQz*+oQ5b zYk7LQ)7B?Dv(8Q}^ix_jBda4=&@{9-(nB+_dzHqbTYWnP-hd|LAgd{Sew}f*UpL?B zt8o4E_XmDwix%FDSRM6s$4b7HTIZx=1gBZ9dStP)IKJoo46#Iu=!wf)55H?WSZ$V` z?In1v{G3KeZ3Onngdq2(Dc8ygdHETAPRGx^`=y&${~g*=+usZ`XTzFOd%`S=~_F z_x5O5?eplQgKS~1MMD=vOSAMBw`T57{r#jZ@oM5+%WuCW*06f=wq~&S&@sB02)U$$@E_wQHso`0uK@A#Z;cfhE zPiCyUdot&f9TV^Wy0s?z{p4v~hN7=|G^X6yw@;zs{felD?Lp$Xn>W?Y?NVr2mpn6l z+2IrGe}Bt={Qtwn{tw~*U&TMS|EFEwe188QwWV6u8U%0m+=Cz`FNry_VpXZ%5ed_49SoMHHOu4#7i`s`Y>UO2%p^u-;Aw~3y{UzdHD$iHVkf9-?XJs)2vuHW}- z!VIO=R}XwXf9LVLmzLf=cVg}fOrLo@es{|LvpLt!e|T_k_m1lSktJ1=C5~U~Ud@{* zY~{X|_vEv^2P@qz7ujFj_V$;U(fZJs6y20nX`7PSqNXOuygv6ZwspgYgugcDZFU@geSLkwr-ZZm_J36W9zFkm&Ys^t z%U_rOz4rc@bp2cN)A4^-*H4xIxv~Dhx2p5S=l37jUVD4{2kE-M<)01}pD!w|J^b*( z1=(v6Uf0^fWWzR&MO@dm9-Xkm zrRIHsso-*#i%da+t7Xc}d+r$6Y`!%6ZtzU~#d+`6Xa>IU+qG@W0?*}l`wmw$moHoT zfGZ=nw&Y%v(|eDX9h0V9yDe3l7||y|*o4M$n=438iW=aq>TY>eu!0 z@Bid_&b<6*`2P#?kIMgUd;e_x|F!$i^8fwN|LNxW+Ih3z&I=K3-tf*g{`*G$k8AJ$ z(*5JT|MBjh7pm_&>vS&fmrFcyp|wx1VoTZ)mMKnNk{Qm&=VV!Tx9uwxjp&zJ5j8=n zB3+`~dYgIpm(`;C-k-2^)ZDUtSz_`8uUXn@l zyu$Z?_#Vl&ubx@`{oSR~Q&*4jZhev*zpj}l(`&}P1X-TheInes^-D{=I%KBLYjT|A z*ejFBw93mc=}l6OTzuWLr(ZtBFROE!@Ly=-v$D1tQ1LGx+9&Z^J9Jf6;6|;DZfxvs zYmNn3?A|Yyb3E;F#k-l+kGfyHQ}g!q5}&eez0S@_(_NE7{+!C-P%o;gYudOx8R%p$0&rHR0#!Fq6itGuOWNQ{) z8qa$qRq-r$aZHr^-u(Hz$L=-?86VzosQp5RzGdRv;~gAP2c=9ey_<2*Ixuu( z6O+U=7KMs7ulnxfrF%Di%c5m+?+>}p>Q-RYxufp!GapZk1%zx3_s zO>WaFm;5?aSI)`g$-PqV%U`}X1IrHv!;1XjyXvlDK+^;Lk zp9;_a!K1(Ti{al}E^FevbwhhY4u*IZA6yz1uy(1!wZsiZ@F)gv z_wOalndI#dv*3)=Oe3=jjV|t{uU>cFuiV`!lWwLiU9@F~-iF;40$Vp&+1g8`y5C9O zVv)aLp@Wu>d9+u2$L?mEs;8lE{obGAeqT9p&Xn%!dLQl{`1PeHeec6(Cs_-%PIPX# zFSkKVGHjY^n(t<>Sjk@Rg(6SC1^xxQcvv3;!fxT<^W zyjGw4rB@bBI_Bv;=joG@#r|?-FOn>7-oanda}}*QppQ8t|6^?5sF*% zc8T0Sv~*_uis=g;?Y=hgn%UpzqW2GH=PPmC|Gc|i{r*?!eRJjiZ=C;3z3$cWpO3`j zpFK))_u@QSSX6e-dVc-1{6D|Gf8HuzVcxvert159Uk&{L!5`< zG;+i(YGsC34q2e-{ zZfAFPe7;oGE3iuL^0GolgO+cfS1g_2o!RjXJsy1CU&&F zVPl(!xR>6WB@w?1*^T{sS+6zx(j# zCUafX{u9sgj!%x?^GLn^+wm{b`yWQ9R_{!`%362-{cpy7|G(GRYr3s@zu{idjkgt_ zA0AfTbStTE$MGq~=cFH*1h2lt@4VY&NpjXT4okgU1~sQX$>KL>FW;I}TIsn~Ka{8I zQIo1}XOPh~>r<0%pU*#2yG%3a)sd@TU&~xFO*@%%jWxZ?rtVKbt$2oL-qgEagO^pR zotwCiUne;wVy$Ild4%9J)l++1*6v&ovMkk6C!%G8MBcV)&CF{SxGD6b-a8olIh5``ulAwkzo+s)-hX7?|NZ-?7mqagRfK}c=+rQr>gj_#H)7OMRMPJ>fU&K!cgD1FwWrIVztGmon+LXeQfZ0eROv6k|`}& z%dQ>SA#JHseXruvl2jN6wgBzdkhIwvX3b8qXC#J=9Vgf$M8+`lvXf`b*OAKH`Rw85gs zr&wvJm!{S=vyx{;Gov=`mC#&zfw$4byr@A?F+6pa^5!(lx8Ws<9xK|?-_P5+{=dbh z`O2#|#}x%l3e(dsTk~gDb-MbT{C5FfYS(8jRasW()*WE7KQ~MM+r(9EpLa`FrSGiU zt zjsDx0ZYAkvp4xFvVbP?ZucpN?vPRaKai0wOH3khFyc%ggQZl%Nt zuFUzWu1jAxcT~MH{BYr&&n=8AMRw}EXOCh9vU@)K@T_i>UiLq1`>$1(*A{+Hy|n!2j=DdpPcF~@H}BKe`Vaq$ zCMMhY7|y(Wd7Z~bExwP<%KqG2Q_R%Wjr3U0PPNgqcwTTYc=v(5;`0{1yMI9HMN_)h zS%XblYk!}Ss@V{+ddW&7d9|#Wl?8R-e)DZp>q`?N)^}JI{e3d&>@$)5FAHmr@0hzn za*N)RN++L#m4}m7x9vObdH&l;zrE&05yyATFE}V1)_8Vr@waex7oNja3daxGxVgCQ z*=q5A1y`KR<+8+!oe9kRaW(3esbWt34X-I)@>y@8x~4oLz9aa`9PudYl?DH2 z?mkiGc6@H0e%#Z|^MCT_*MF3@++E&PI&G5i)-5VA-k(EN!jIfAGtiSv)?qj%)#Grg zb4y4~y1_Y_-EaD$rB>xjyMF7qe1!ebszkx(hZp9~h;EMPp4Mft;aYI9;;|En2HrV8i_ud@nP@cWnJI<&RK3!xi(u=%_3yA)b;L_uFT77_wRhP zM*Rlg)gErybCHw!EnaJw2751hU!B8ndwoHB>(fU~t5-{ZYqw25-B>y2#V&=_z1P#Y zrhmJ4{gjRGlPh)o$5_`C-*~V=;#g|Ro%b)C{68EPY`hldoz3(4;Q=FAi`e-_Ic7eO z8*6l`*00>wC$HVGa96VZ!V70ErRK>qWz_l@E>r%tZV|`&y+5b4_m|I^XLEY<_j?Cl zKI4mJpC$U*_88xlM^X1DS?pSnp}AyEl=#B@{q{~7w*HpSrk!A!lfQquZ|;jdvy7MO zNEp7_<=3;-=Xdk9DI4#pzCQd;`_qJ7SJ&2wmX@XqHMGQ4zFM=Dt^A9*)g!rOR(zfD>6NXjnes`#X_KPg z&yh%+nYPAshrt4kYg_6rM~Noqco$s$Fn8-Vk(ry<&Oc+(Y`RwX>ddrzTa6Dr+^f!9 zct-c5tZ|dj<;JA4FVAH+hkOf08m{5UO?6z68nk>J)0+p_KZ<3I0=J4{z_X{vvz(3389F_7oAdM#V`;Y!fV z76O^3g)TdJTP!TtAEpwW{Wlfqu3 zFMRK1U3;GG^wK?*cKPw{1)u9C>Ugc?&8;jeXT7SRvZAf9Ye`Ii>5Y5Ah7sy_V%P87 z9T~hrBzuE+xJux=IqM~+pRiHSJEnX0Tw&3!hZ|<^ymP-`hS-6G=7kKOjfAV#uR5{C zqnmkAKn2Szph}OBEuhxp|?mEBHj`hd9{^TFW17~hub{90s zRsY6PVZk{|D{+q4s~-y%PgOb{G@)VLHQVHvGgq%B%hi6IB5bT2_0pVgqwCe4IqN1? zf47#iZ<~GEHqhwl*4EX_r{CFIf6OMW<~^tSyg6NZ#ZxNdZrqo#*tt7t|Lh(6_NW|X zeQy(cUp8A@s%>}ImhZQAFr1!Y7*?~k}31tFjb4KJnf_G6{*5ykD9Z~H$@rj z6&0W3raR?IS{7gX$EmAdDsDVCXZ~CT&SQr?_P^VpSRlba<)*<}+jJlya`B_lqzkkLp=N3l9&YwHMcWT7( zYdgbTmumUtEMCZX{b6ORdi=}pKf|{F`X32eY3N!1^YMM<`IUbH89R0^NzgcFIrI3p z#9NjA2f5A}zu%U0T+mcbTB<1jcgpEkeGl6B(vuy37<|(vpX~APUPh2E?%8ye>%)EetcPWnX$xl zjbuk}m8*ve>e_do&o7wdS*#K&v0gkdbnf#uku`yx?oXB!x25(>iQ>G=m6Wid{Kg!+ z)7kM=k@3G)&Y%9h_QBp8#r#Jf{Br2woVIP{%eks&H}XzhvPJj9zT@oPG1Jm^Rg{~Q zNxkw6Ji?(mz3tr=CqL1pGaI57UOQvczhujUC5zuP?Ywj;JZk1K+s8ZdTUT8(xYr|* z9Wj?@NyG_5!#?4{z69I!=j9hCyF`giD@@sb-&lWQp_h-KoZY+~dpzdk+&fu)?`Pe# z*_;p19=p`1H!nM~$$r8#r}Aw~p?vLv>AXqN z{S!(joIYga8^UGi{>wLEf4qQY;#J!RuTIX6vD^9R++FLO_1o8&XZvby?wMG}p*vSh zc&gTvMJw1hMr@Se+39lZZ{Noa`4)O!#&@Spi#wwA*}}Z|obrXCi*q}P~*p+ot zQ!`h32s(Rl7wvf`{n}vBk~x8lkE6H_bUb|a?7;K=AFMRB&hL9IJ7>+iOFJDrCw6yd zC$V)c+REELUDf>042dHaM>vah-kKVBWf*%0pX>1QzPg0z63+>X^SP_9SzJ^JIjO}K z99np7$(&OhAO1Z1dHeL|wfnM4pRZbIwE0EYR7sa-l?#jI-n%|3JNDqn&IW}eOD8Qg zs(6^TE3tEOOX&L9b;^D^C({f>pL1&k1gp9&ea-&sp5Zjx`PE;!ZT|PIf6n~=M^xR* z&;KR=R-V`2^Y8Pg&-;G_|B~MSa<`{t*JiO~-NMcelRfPUXWAu`W&b{yd7L%$D7*jd z+X6*i60b9*S$SWtc2`N$JYIazgj=8G`Z+Gf*EX4cyz^&sTc*}LFT7_S64oVg{nGKz zQ#5Do+*NVL#DC3u`vc{E-jynDU2D#1|9(1)NhtVI)YJ#nD>m$(S-{t`Qs!A}jM2G> z9^*+#j@q}r`fc5|w(jL#iS#SC{FdEaqZ!urmCac+@zBrKhkdCvJoXUU!`nHE^}@Br z^wxdf-^xTzDctWdhs&=;NPCvp#zkM$9Uo2M+^g;<`C8}hgUDq)VXgvgp$}5-27fo0 z^JPj<<)4i6S$CDapWT})ylmFaJ9oFJN@~j-n;5=)ra^_*nUvg&TUU1}_vXI1!{3fsdoDA#{7Ohiu~Tg-2Xp1BB%Y`sZyT%oo?ewJHU0jdXnwry{yR`t z!d|a(_hY|RQLjtqZQijj+4hT%xA7q_9i>}|F@n*X-|6N5X#Km@X1mb4JNp;^I~S#Q zPv&M{^)=^*UuurtWtZL)S$IRsji+*5jJ>4g&h2XAse8IC#8p_%o5*d^FnZ@UEj8@D z?6Jr{7dG#{7o2^xG_FVR>&_srYt!RvwJb$N7q^@<im;<_m$?f%!3h*J&86t zKh6a$nv}FGp7p}E50j_&%($ghwXpQ+)I~~KNj=Au8B?xS&V8=2GT8QJPD=TVt>5?_ z@7{KzDf6_-(z`1Kf;U}Z3RtPcYg-JioVNd3zPi35&^5m5rE2lFiAmjE7Z)9iaQ0hJ zEXv8}t?p{9sqHD6v%B9SIxu@{h5Jm#P{V7F%(XWj%{b+`t@8G?prb`qMW^bljgHFx z&Fal~J@Is=+S%?&)p9xWE3Ps3s3a_+ z>(!Pmvov1oXst37o9O3~u_MEfW7U%>8_(A*z4s{k?yGQjaLqLT=a=}fy2t9Q2QvJw zeZ6TJ?(G$#t{a%%1TT^wX?MfxGkM9}wp4xPO)6VV3 zB%1lx7TlId^qe_IIMIM*`$dV+D_wHy+$}AwLwQ14f1kgfUS4^)LSkhK4{Ns0>dTD= zCMwrA+!VNc=v9vI+G%@4O6Ll5%B=|wUHDAva-!n$E_s{ww^szF&UIay`|�y7v+D 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