<!-- RUBY-BACKUP · part 375 -->
S!=='undefined' && RUBY_HANDLES) targets.push(RUBY_HANDLES);
        var hits = ray.intersectObjects(targets, true);
        if(hits.length > 0){
          var obj = hits[0].object;
          /* ruby handle clicked — anchor/unanchor */
          if(obj.userData && obj.userData.isRubyHandle){
            if(typeof toggleRubyAnchor!=='undefined') toggleRubyAnchor(obj);
            return;
          }
          /* tap carried block to set it down */
          if(typeof CARRIED_BLOCK!=='undefined' && CARRIED_BLOCK && obj === CARRIED_BLOCK){
            if(typeof dropCarriedBlock==='function') dropCarriedBlock();
            return;
          }
          /* engage with PROVOLTA — you must come to her, she knows you */
          try{
            var isHer = false;
            var p = obj;
            while(p){
              if(p === PROVOLTA_MODEL){ isHer = true; break; }
              p = p.parent;
            }
            if(isHer){
              if(typeof markMetProvolta==='function') markMetProvolta();
              /* she knows you */
              var pname = 'traveler';
              try{
                var un = localStorage.getItem('ruby-player-name');
                if(un) pname = un;
              }catch(e){}
              /* only if you linger — she doesn't perform */
              try{
                setTimeout(function(){
                  try{ codeStatus('PROVOLTA: "I knew you would come."'); }catch(e){}
                }, 2000);
              }catch(e){}
              if(typeof playfulSpin==='function'){
                try{
                  var her = PROVOLTA_MODEL;
                  playfulSpin(her, 800);
                }catch(e){}
              }
              if(typeof playfulSparkle==='function'){
                try{ playfulSparkle(PROVOLTA_MODEL.position.clone().add(new THREE.Vector3(0,2,0)), 0x00ffff); }catch(e){}
              }
              return;
            }
          }catch(e){}
          /* walk up to find the named mesh */
          while(obj && !obj.isMesh) obj = obj.parent;
          if(obj && obj.isMesh){
            if(obj.userData.isReference){
              codeStatus('that one is the reference — untouched, for comparison');
            } else if(DISSECT_GROUP && isDescendantOf(obj, DISSECT_GROUP)){
              selectPart(obj);
            } else {
              /* level 1: must carry big blocks */
              if(typeof tryCarryBlock==='function' && tryCarryBlock(obj)){
                if(typeof playfulBounce==='function') playfulBounce(obj, 1.2);
                if(typeof playfulSparkle==='function'){
                  try{ playfulSparkle(obj.position.clone(), 0xffd700); }catch(e){}
                }
                return;
              }
              if(typeof playfulBounce==='function') playfulBounce(obj, 0.6);
              /* tap a block — HIGHLIGHT the whole group, then suggest */
              try{
                // clear previous highlight
                if(window._highlighted){
                  window._highlighted.traverse(function(m){
                    if(m.isMesh && m.userData._origEmissive !== undefined){
                      m.material.emissive.setHex(m.userData._origEmissive);
                      m.material.emissiveIntensity = m.userData._origIntensity || 1;
                    }
                  });
                  window._highlighted = null;
                }
                // find the group root (for primitives) or use obj
                var root = obj;
                while(root.parent && root.parent !== scene && !root.userData.isPrimitive){
                  // walk up to find primitive group
                  if(root.parent.userData && root.parent.userData.isPrimitive){ root = root.parent; break; }
                  root = root.parent;
                  if(root === scene) break;
                }
                window._selectedBlock = root;
                window._highlighted = root;
                // gold highlight on all meshes in the group
                root.traverse(function(m){
                  if(m.isMesh && m.material && m.material.emissive){
                    if(m.userData._origEmissive === undefined){
                      m.userData._origEmissive = m.material.emissive.getHex();
                      m.userData._origIntensity = m.material.emissiveIntensity;
                    }
                    // clone material so we don't affect shared mats
                    if(!m.userData._matCloned){
                      m.material = m.material.clone();
                      m.userData._matCloned = true;
                    }
                    m.material.emissive.setHex(0xffd700);
                    m.material.emissiveIntensity = 0.8;
                  }
                });
                // gold pulse — fade in and out
                var origEmissive = obj.material && obj.material.emissive ? obj.material.emissive.getHex() : 0;
                var origEmissive = obj.material && obj.