anchor.diff:        // Skip over the equals sign
         offset = nextEquals + 1;
   
  -      // Subtract one for trailing newline
  +      // Subtract one for trailing newline for value
         final endOfValue = endOfEntry - 1;
  -      final value = utf8.decoder.convert(data, offset, endOfValue);
  -
  -      if (!_isValidPaxRecord(key, value)) {
  +
  +      if (!_isValidPaxKey(key)) {
           error();
         }
   
         // If we're seeing weird PAX Version 0.0 sparse keys, expect alternating
         // GNU.sparse.offset and GNU.sparse.numbytes headers.
         if (key == paxGNUSparseNumBytes || key == paxGNUSparseOffset) {
  -        if ((sparseMap.length.isEven && key != paxGNUSparseOffset) ||
  +        final value = utf8.decoder.convert(data, offset, endOfValue);
  +
  +        if (!_isValidPaxRecord(key, value) ||
  +            (sparseMap.length.isEven && key != paxGNUSparseOffset) ||
               (sparseMap.length.isOdd && key != paxGNUSparseNumBytes) ||
               value.contains(',')) {
             error();
  
positive.code:       case paxGname:
          return !value.codeUnits.contains(0);
        default:
          return !key.codeUnits.contains(0);
      }
    }
  }
  
negative.code:       } else if (!ignoreUnknown || supportedPaxHeaders.contains(key)) {
          // Ignore unrecognized headers to avoid unbounded growth of the global
          // header map.
          final value = unsafeUtf8Decoder.convert(data, offset, endOfValue);
  
          if (!_isValidPaxRecord(key, value)) {
            error();
          }
  
          map[key] = value;
        }
  
  