anchor.diff:    ];
   }
   
  -const int kIons = 10000;
  -
   String DumpVec(VM.Vector3 v) {
     return "${v.x} ${v.y} ${v.z}";
   }
  
positive.code:     _lastTimeMs = timeMs;
      orbit.azimuth += 0.001;
  
      /*
      int n = 0;
      for (Ion ion in ions) {
        if (elapsed == 0.0) continue;
        ion.Update(srcPoles, dstPoles, rng, elapsed / 1000.0);
        vertices[n + 0] = ion.Pos().x;
        vertices[n + 1] = ion.Pos().y;
        vertices[n + 2] = ion.Pos().z;
        n += 3;
      }
      md.ChangeVertices(vertices);
      */
  
      orbit.animate(elapsed);
  
      phase.draw([perspective]);
  
      HTML.window.animationFrame.then(animate);
      fps.UpdateFrameCount(timeMs);
      chronosGL.copyBufferSubData(
          GL_TRANSFORM_FEEDBACK_BUFFER, GL_ARRAY_BUFFER, 0, 0, kIons * 3);
    }
  
    animate(0.0);
  
negative.code: 
  const double kMaxDistance = 100.1;
  const double kMinDistance = 0.2;
  const int kIons = 10000;
  
  List<ShaderObject> createFireWorksShader() {
    return [
  