| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | "use strict";const MIMEType = require("whatwg-mimetype");const { parseURL, serializeURL } = require("whatwg-url");const {  stripLeadingAndTrailingASCIIWhitespace,  stringPercentDecode,  isomorphicDecode,  forgivingBase64Decode} = require("./utils.js");module.exports = stringInput => {  const urlRecord = parseURL(stringInput);  if (urlRecord === null) {    return null;  }  return module.exports.fromURLRecord(urlRecord);};module.exports.fromURLRecord = urlRecord => {  if (urlRecord.scheme !== "data") {    return null;  }  const input = serializeURL(urlRecord, true).substring("data:".length);  let position = 0;  let mimeType = "";  while (position < input.length && input[position] !== ",") {    mimeType += input[position];    ++position;  }  mimeType = stripLeadingAndTrailingASCIIWhitespace(mimeType);  if (position === input.length) {    return null;  }  ++position;  const encodedBody = input.substring(position);  let body = stringPercentDecode(encodedBody);  // Can't use /i regexp flag because it isn't restricted to ASCII.  const mimeTypeBase64MatchResult = /(.*); *[Bb][Aa][Ss][Ee]64$/.exec(mimeType);  if (mimeTypeBase64MatchResult) {    const stringBody = isomorphicDecode(body);    body = forgivingBase64Decode(stringBody);    if (body === null) {      return null;    }    mimeType = mimeTypeBase64MatchResult[1];  }  if (mimeType.startsWith(";")) {    mimeType = "text/plain" + mimeType;  }  let mimeTypeRecord;  try {    mimeTypeRecord = new MIMEType(mimeType);  } catch (e) {    mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII");  }  return {    mimeType: mimeTypeRecord,    body  };};
 |