anchor.diff:      var length = newRowOrder.length = collection.length;
       for (var index = 0; index < length; index++) {
         var value = collection[index];
  -      trackById = trackByIdFn(index, value, index);
  -      if (rows.containsKey(trackById)) {
  -        var row = rows[trackById];
  -        rows.remove(trackById);
  +      trackById = _trackByIdFn(index, value, index);
  +      if (_rows.containsKey(trackById)) {
  +        var row = _rows[trackById];
  +        _rows.remove(trackById);
           newRows[trackById] = row;
           newRowOrder[index] = row;
         } else if (newRows.containsKey(trackById)) {
           // restore lastBlockMap
           newRowOrder.forEach((row) {
             if (row != null && row.startNode != null) {
  -            rows[row.id] = row;
  +            _rows[row.id] = row;
             }
           });
           // This is a duplicate and we need to throw an error
  
positive.code:         previousNode = row.endNode;
        } else {
          // new item which we don't know about
          childScope = scope.$new();
        }
  
        childScope[valueIdentifier] = value;
        childScope[r'$index'] = index;
        childScope[r'$first'] = (index == 0);
        childScope[r'$last'] = (index == (collection.length - 1));
  
negative.code:       childScope[r'$even'] = index & 1 == 0;
  
        if (row.startNode == null) {
          _rows[row.id] = row;
          var block = _boundBlockFactory(childScope);
          row.block = block;
          row.scope = childScope;
          row.elements = block.elements;
  