anchor.diff:          .separatedBy(ref('whitespace'))
           .flatten())
         .seq(ref('whitespace').optional())
  -      .seq(char('>'))
  +      .seq(char(CLOSE_DOCTYPE))
         .pick(2));
       def('document', ref('processing').optional()
         .seq(ref('misc'))
  
positive.code:           }
          }
        }));
      def('processing', string('<?')
        .seq(ref('nameToken'))
        .seq(ref('whitespace')
          .seq(string('?>').neg().star().flatten())
          .pick(1).optional(''))
        .seq(string('?>'))
        .permute([1, 2]));
      def('qualified', ref('nameToken'));
  
      def('characterData', char('<').neg().plus().flatten().map(_decodeXml));
      def('misc', ref('whitespace')
        .or(ref('comment'))
        .or(ref('processing'))
  
negative.code:       .or(ref('comment'))
        .or(ref('cdata'))
        .star());
      def('doctype', string(OPEN_DOCTYPE)
        .seq(ref('whitespace'))
        .seq(ref('nameToken')
          .or(ref('attributeValue'))
  