function extractPartialTiming(networkRecord) {
  const {
    // In seconds.
    requestTime: requestTimeS,
    // Other values are relative to requestTime.
    ...relativeTimes
  } = networkRecord.timing ?? {};
  const relativeValues = Object.values(relativeTimes).filter(timeDefined);
  const relativeTimingMax = relativeValues.length ? Math.max(...relativeValues) : 0;

  const {
    rendererStartTime,
    networkRequestTime,
    responseHeadersEndTime,
    networkEndTime,
    redirectResponseTimestamp, // Generated timestamp added in addRedirectResponseIfNeeded; only used as backup start time.
    responseTimestamp, // Time of response event from CDP, not from the netstack.
  } = networkRecord;

  const requestTime = timeDefined(requestTimeS) ? requestTimeS * 1000 : undefined;
  const absoluteTimes = {rendererStartTime, networkRequestTime, requestTime, responseHeadersEndTime,
    networkEndTime};
  assertTimingIncreases(absoluteTimes);

  // `requestTime` and `networkRequestTime` must be equal if both are defined.
  if (timeDefined(networkRequestTime) && timeDefined(requestTime)) {
    assert.equal(networkRequestTime, requestTime, `'networkRequestTime' (${networkRequestTime}) is not equal to 'timing.requestTime' (${requestTimeS} seconds) in test network record`); // eslint-disable-line max-len
  }

  // Start of request + relative timing must be <= responseHeadersEndTime and networkEndTime.
  const startTimes = [rendererStartTime, networkRequestTime, requestTime];
  let maxStart = Math.max(...startTimes.filter(timeDefined));
  maxStart = Number.isFinite(maxStart) ? maxStart : redirectResponseTimestamp; // Use redirectResponseTimestamp only as fallback.
  if (timeDefined(maxStart)) {
    if (timeDefined(responseHeadersEndTime)) {
      assert(maxStart + relativeTimingMax <= responseHeadersEndTime, `request start (${maxStart}) plus relative 'timing' value (${relativeTimingMax}) exceeds 'responseHeadersEndTime' (${responseHeadersEndTime}) in test network record`); // eslint-disable-line max-len
    }
    if (timeDefined(networkEndTime)) {
      assert(maxStart + relativeTimingMax <= networkEndTime, `request start (${maxStart}) plus relative 'timing' value (${relativeTimingMax}) exceeds 'networkEndTime' (${networkEndTime}) in test network record`); // eslint-disable-line max-len
    }
  }

  // If all are defined, requestTime + receiveHeadersEnd === responseHeadersEndTime.
  const {receiveHeadersEnd} = networkRecord.timing ?? {};
  const start = timeDefined(networkRequestTime) ? networkRequestTime : requestTime;
  if (timeDefined(start) && timeDefined(receiveHeadersEnd) && timeDefined(responseHeadersEndTime)) {
    assert.equal(start + receiveHeadersEnd, responseHeadersEndTime, `request start (${start}) plus 'receiveHeadersEnd' (${receiveHeadersEnd}) does not equal 'responseHeadersEndTime' (${responseHeadersEndTime}) in test network record`); // eslint-disable-line max-len
  }

  return {
    redirectResponseTimestamp,
    responseTimestamp,
    rendererStartTime,
    networkRequestTime,
    requestTime,
    receiveHeadersEnd,
    responseHeadersEndTime,
    networkEndTime,
    relativeTimingMax,
  };
}
Extract any timings found in `networkRecord` and assert that they're
consistent with each other.
@param {Partial<NetworkRequest>} networkRecord