anchor.diff:          blockquote,
           para
         ]);
  -
  -  Parser<List<Block>> get listTightBlock => choice([
  +    }
  +    return _lazyLineBlockCache;
  +  }
  +
  +  Parser<List<Block>> _listTightBlockCache;
  +  Parser<List<Block>> get listTightBlock {
  +    if (_listTightBlockCache == null) {
  +      _listTightBlockCache = choice([
           hrule,
           codeBlockIndented,
           codeBlockFenced,
  
positive.code:       r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}"
        r"[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$");
  
    static final Parser<List<Inline>> autolink =
        new Parser<List<Inline>>((String s, Position pos) {
      ParseResult res = (char('<') >
          pred((String char) =>
                  char.codeUnitAt(0) > 0x20 && char != "<" && char != ">")
              .manyUntil(char('>'))).run(s, pos);
      if (!res.isSuccess) {
        return res;
      }
  
negative.code:   // Link reference
    //
  
    static final Parser linkReference = new Parser((String s, Position pos) {
      var labelRes = ((skipNonindentChars > linkLabel) < char(':')).run(s, pos);
      if (!labelRes.isSuccess) {
        return labelRes;
      }
      var destinationRes = ((blankline.maybe > skipSpaces) > linkBlockDestination)
          .run(s, labelRes.position);
      if (!destinationRes.isSuccess) {
        return destinationRes;
      }
      ParseResult<Option> blanklineRes =
          blankline.maybe.run(s, destinationRes.position);
      assert(blanklineRes.isSuccess);
      var titleRes =
          ((skipSpaces > linkTitle) < blankline).run(s, blanklineRes.position);
  
      var value;
      ParseResult res;
      if (!titleRes.isSuccess) {
        if (blanklineRes.value.isDefined) {
          value = new _LinkReference(
              labelRes.value, new Target(destinationRes.value, null));
          res = blanklineRes;
        } else {
          return fail.run(s, pos);
        }
      } else {
        value = new _LinkReference(
            labelRes.value, new Target(destinationRes.value, titleRes.value));
        res = titleRes;
      }
  
      // Reference couldn't be empty
      if (value.reference.contains(new RegExp(r"^\s*$"))) {
        return fail.run(s, pos);
      }
      return res.copy(value: value);
    });
  
    //
    // Paragraph
  