anchor.diff:          moveSub = elt.onMouseMove.listen(drag);
         }
       });
  -    
  -    elt.onMouseUp.listen((e) => stopDragging());   
  -    elt.onMouseOut.listen((e) => stopDragging());      
  +
  +    elt.onMouseUp.listen((e) => stopDragging());
  +    elt.onMouseOut.listen((e) => stopDragging());
       query("body").onMouseUp.listen((e) => stopDragging());
  +
  +    elt.onTouchStart.listen((TouchEvent e) {
  +      print("onTouchStart");
  +      e.preventDefault();
  +      if (touchId != null) {
  +        return; // ignore touches after the first
  +      }
  +      Touch t = e.changedTouches[0];
  +      player.playing = false;
  +      player.velocity = 0;
  +      if (touchMoveSub == null) {
  +        touchId = t.identifier;
  +        lastTouchTime = window.performance.now() / 1000.0;
  +        lastTouchY = t.page.y;
  +        print("lastTouchY: ${lastTouchY}");
  +        touchMoveSub = elt.onTouchMove.listen(touchDrag);
  +      }
  +    });
  +
  +    elt.onTouchEnd.listen((TouchEvent e) {
  +      if (e.touches.isEmpty) {
  +        print("onTouchEnd empty");
  +        stopDragging();
  +      }
  +    });
     }
   
     void drag(MouseEvent e) {
  
positive.code:     elt.width = WIDTH * size.pixelsize;
      elt.height = HEIGHT * size.pixelsize;
    }
    
    void render(num moviePosition) { 
      var frame = movie.frames[moviePosition ~/ 1];      
      frame.render(elt.context2D, size, ALL);
    }
  }
  
negative.code:       var peakDist = (frameY - currentFrameY).abs() / elt.height;
        c.globalAlpha = 0.6 - peakDist / 2;
        movie.frames[frame].renderAt(c, size, SPACER, frameY);
  
        frame = (frame + 1) % movie.frames.length;
        frameY += height;
      }
  