<!-- RUBY · part 20 -->
;

			} );
			pending.push( accessor );

		}

		assignExtrasToUserData( geometry, primitiveDef );
		computeBounds( geometry, primitiveDef, parser );
		return Promise.all( pending ).then( function () {

			return primitiveDef.targets !== undefined ? addMorphTargets( geometry, primitiveDef.targets, parser ) : geometry;

		} );

	}
	/**
 * @param {BufferGeometry} geometry
 * @param {Number} drawMode
 * @return {BufferGeometry}
 */


	function toTrianglesDrawMode( geometry, drawMode ) {

		let index = geometry.getIndex(); // generate index if not present

		if ( index === null ) {

			const indices = [];
			const position = geometry.getAttribute( 'position' );

			if ( position !== undefined ) {

				for ( let i = 0; i < position.count; i ++ ) {

					indices.push( i );

				}

				geometry.setIndex( indices );
				index = geometry.getIndex();

			} else {

				console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );
				return geometry;

			}

		} //


		const numberOfTriangles = index.count - 2;
		const newIndices = [];

		if ( drawMode === THREE.TriangleFanDrawMode ) {

			// gl.TRIANGLE_FAN
			for ( let i = 1; i <= numberOfTriangles; i ++ ) {

				newIndices.push( index.getX( 0 ) );
				newIndices.push( index.getX( i ) );
				newIndices.push( index.getX( i + 1 ) );

			}

		} else {

			// gl.TRIANGLE_STRIP
			for ( let i = 0; i < numberOfTriangles; i ++ ) {

				if ( i % 2 === 0 ) {

					newIndices.push( index.getX( i ) );
					newIndices.push( index.getX( i + 1 ) );
					newIndices.push( index.getX( i + 2 ) );

				} else {

					newIndices.push( index.getX( i + 2 ) );
					newIndices.push( index.getX( i + 1 ) );
					newIndices.push( index.getX( i ) );

				}

			}

		}

		if ( newIndices.length / 3 !== numberOfTriangles ) {

			console.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );

		} // build final geometry


		const newGeometry = geometry.clone();
		newGeometry.setIndex( newIndices );
		return newGeometry;

	}

	THREE.GLTFLoader = GLTFLoader;

} )();


===== FILE: public/ruby/index.html =====
<!DOCTYPE html>
<html><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Ruby</title>
<style>
html,body{margin:0;padding:0;overflow:hidden;background:#000;height:100%;font-family:sans-serif}
#hud{position:fixed;left:10px;bottom:10px;color:#0f0;font:12px monospace;z-index:10;
background:rgba(0,0,0,.55);padding:8px 10px;border:1px solid #0f0;border-radius:6px;white-space:pre}
#hud .latlon{color:#ff0;font-size:18px;font-weight:bold}

</style></head><body>

<div id="hud"><span class="latlon" id="latlon">LAT -- LON --</span><span id="info"></span></div>
<script src="/ruby/three.min.js?v=1"></script>
<script src="/ruby/GLTFLoader.js?v=1"></script>
<script src="/ruby/newmap.js?v=7"></script>


</body></html>


===== FILE: public/ruby/newmap.js =====
// Ruby — the map. EVERYTHING from the King's pictures.
// Dense golden city, full road network, plaza, mountains, forests,
// blimps, aurora sky, horizon glow, scattered markers, floating rocks.
(function(){
'use strict';
var renderer = new THREE.WebGLRenderer({antialias:true});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio||1, 2));
document.body.appendChild(renderer.domElement);
var scene = new THREE.Scene();
scene.fog = new THREE.FogExp2(0x0a1030, 0.0009);
window.scene = scene;
var camera = new THREE.PerspectiveCamera(62, window.innerWidth/window.innerHeight, 0.5, 30000);
camera.position.set(500, 300, 950);
camera.lookAt(500, 0, 500);
window.camera = camera;
scene.add(new THREE.AmbientLight(0x445588, 1.1));
var moonLight = new THREE.DirectionalLight(0x99bbff, 0.9);
moonLight.position.set(200, 800, 100); scene.add(moonLight);
var cityGlow = new THREE.PointLight(0xffc44d, 1.6, 3000);
cityGlow.position.set(500, 150, 500); scene.add(cityGlow);


// ============================================================================
// THE NEW REGIME CHANGE — the one code fits all. 2026-10-05.
// Loading core, same logic and reason as /saga, stripped to its bare core:
// everything the regime needs registers into window._rq and drains across
// frames with a time budget, behind a real progress overlay. Heavy things go
// to window._iq and stream in when idle. Nothing here knows WHAT it loads —
// builders register themselves. Runs the same on startup and every refresh.
// ============================================================================
window._rq = window._rq || [];
window._iq = window._iq || [];
(function(){
  var ov = document.createElement('div');
  ov.id = 'regimeloader';
  ov.style.cssText = 'position:fixed;inset:0;z-index:9999;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#050505;';
  var t = document.createElement('div');
  t.textCon