docs: public static DataNode load(InputStream in, ChecksumValidation checksumValidation, ProgressListener progressListener,
              boolean ignoreMissingMarshallers, AbstractDataMarshaller<?>... marshallers) throws IOException {
          final Map<String, AbstractDataMarshaller<?>> marshallerMap = generateMarshallerMap(false, Arrays.asList(marshallers));
          marshallerMap.putAll(generateMarshallerMap(false, DEFAULT_MARSHALLERS));
  
          final GZIPInputStream gzipInputStream = new GZIPInputStream(in);
  
          try {
              InputStream inputStream = gzipInputStream;
              MessageDigestInputStream messageDigestInputStream = null;
              if (checksumValidation != ChecksumValidation.NONE) {
                  messageDigestInputStream = new MessageDigestInputStream(inputStream, CHECKSUM_ALGORITHM);
                  inputStream = messageDigestInputStream;
              }
              CountingDataInputStream dIn = new CountingDataInputStream(inputStream);
              checkHeader(dIn);
  
              final DataNode firstDataNode = deSerialize(dIn, marshallerMap,
                      ignoreMissingMarshallers, progressListener);
  
              byte[] checksumCalcualted = null;
              if (checksumValidation != ChecksumValidation.NONE) {
                  checksumCalcualted = messageDigestInputStream.getDigest();
              }
              final int checksumAvailable = dIn.read();
              if (checksumValidation == ChecksumValidation.VALIDATE_IF_AVAILABLE
                      || checksumValidation == ChecksumValidation.VALIDATE_OR_THROW_EXCEPTION) {
                  byte[] checksumValue = new byte[CHECKSUM_ALGORITHM_LENGTH];
                  int readBytes = dIn.read(checksumValue);
  
                  if (checksumValidation == ChecksumValidation.VALIDATE_IF_AVAILABLE
                          && readBytes == CHECKSUM_ALGORITHM_LENGTH) {
                      if (!Arrays.equals(checksumValue, checksumCalcualted)) {
                          throw new IOException("Checksum is invalid.");
                      }
                  } else
                      if (checksumValidation == ChecksumValidation.VALIDATE_OR_THROW_EXCEPTION) {
                          if (checksumAvailable == -1 || readBytes != CHECKSUM_ALGORITHM_LENGTH) {
                              throw new IOException("File contains no embedded checksum");
                          }
                          if (!Arrays.equals(checksumValue, checksumCalcualted)) {
                              throw new IOException("Checksum is invalid.");
                          }
                      }
  
              }
  
              return firstDataNode;
          } catch (NoSuchAlgorithmException ex) {
              throw new IOException("Checksum algorithm not available", ex);
          } finally {
              gzipInputStream.close();
          }
      }