anchor.diff:    }
   }
   
  -class _BindingToken {
  -  final String value;
  -  final bool isBinding;
  -
  -  _BindingToken(this.value, {this.isBinding: false});
  -
  -  bool get isText => !isBinding;
  -}
   
   class _TemplateIterator {
     final Element _templateElement;
  
positive.code:   }
  }
  
  void _addAttributeBindings(Element element, model, delegate) {
    var attrs = new LinkedHashMap.from(element.attributes);
    if (element.isTemplate) {
      // Accept 'naked' bind & repeat.
      if (attrs['bind'] == '') attrs['bind'] = '{{}}';
      if (attrs['repeat'] == '') attrs['repeat'] = '{{}}';
  
      // Treat <template if="{{expr}}"> as <template bind if="{{expr}}">
      if (attrs.containsKey('if') &&
          !attrs.containsKey('bind') &&
          !attrs.containsKey('repeat')) {
        attrs['bind'] = '{{}}';
      }
    }
  
    attrs.forEach((name, value) {
      _parseAndBind(element, name, value, model, delegate);
    });
  }
  
  void _parseAndBind(Node node, String name, String text, model,
      BindingDelegate delegate) {
  
    var tokens = _parseMustacheTokens(text);
    if (tokens.length == 0 || (tokens.length == 1 && tokens[0].isText)) {
      return;
    }
  
    // If this is a custom element, give the .xtag a change to bind.
    node = _nodeOrCustom(node);
  
    if (tokens.length == 1 && tokens[0].isBinding) {
      _bindOrDelegate(node, name, model, tokens[0].value, delegate);
      return;
    }
  
    var replacementBinding = new CompoundBinding();
    for (var i = 0; i < tokens.length; i++) {
      var token = tokens[i];
      if (token.isBinding) {
        _bindOrDelegate(replacementBinding, i, model, token.value, delegate);
      }
    }
  
    replacementBinding.combinator = (values) {
      var newValue = new StringBuffer();
  
      for (var i = 0; i < tokens.length; i++) {
        var token = tokens[i];
        if (token.isText) {
          newValue.write(token.value);
        } else {
          var value = values[i];
          if (value != null) {
  
negative.code: }
  
  void _addBindings(Node node, model, [BindingDelegate delegate]) {
    List bindings = null;
    if (node is Element) {
      bindings = _parseAttributeBindings(node);
    } else if (node is Text) {
      var tokens = _parseMustacheTokens(node.text);
      if (tokens != null) bindings = ['text', tokens];
    }
  
    if (bindings != null) {
      _processBindings(bindings, node, model, delegate);
    }
  
    for (var c = node.firstChild; c != null; c = c.nextNode) {
  