{
  "version": 3,
  "sources": ["../src/index.ts", "../src/zip-loader.ts", "../src/zip-writer.ts", "../src/lib/tar/utils.ts", "../src/lib/tar/header.ts", "../src/lib/tar/tar.ts", "../src/tar-builder.ts", "../src/parse-zip/cd-file-header.ts", "../src/parse-zip/end-of-central-directory.ts", "../src/parse-zip/readable-file-utils.ts", "../src/parse-zip/search-from-the-end.ts", "../src/parse-zip/zip64-info-generation.ts", "../src/parse-zip/local-file-header.ts", "../src/parse-zip/zip-composition.ts", "../src/filesystems/zip-filesystem.ts", "../src/filesystems/IndexedArchive.ts", "../src/hash-file-utility.ts"],
  "sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {TarBuilder} from './tar-builder';\n\nexport {\n  parseZipCDFileHeader,\n  makeZipCDHeaderIterator,\n  signature as CD_HEADER_SIGNATURE,\n  generateCDHeader\n} from './parse-zip/cd-file-header';\nexport {\n  parseZipLocalFileHeader,\n  signature as localHeaderSignature,\n  generateLocalHeader\n} from './parse-zip/local-file-header';\nexport {parseEoCDRecord} from './parse-zip/end-of-central-directory';\nexport {searchFromTheEnd} from './parse-zip/search-from-the-end';\nexport {\n  readRange,\n  getReadableFileSize,\n  DataViewReadableFile\n} from './parse-zip/readable-file-utils';\nexport {addOneFile, createZip} from './parse-zip/zip-composition';\n\n// export type {HashElement} from './hash-file-utility';\nexport {IndexedArchive} from './filesystems/IndexedArchive';\nexport {parseHashTable, makeHashTableFromZipHeaders, composeHashFile} from './hash-file-utility';\n\nexport {ZipFileSystem, ZIP_COMPRESSION_HANDLERS} from './filesystems/zip-filesystem';\nexport type {CompressionHandler} from './filesystems/zip-filesystem';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport JSZip from 'jszip';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\ntype FileMap = Record<string, ArrayBuffer>;\n\nexport const ZipLoader = {\n  dataType: null as unknown as FileMap,\n  batchType: null as unknown as never,\n\n  id: 'zip',\n  module: 'zip',\n  name: 'Zip Archive',\n  version: VERSION,\n  extensions: ['zip'],\n  mimeTypes: ['application/zip'],\n  category: 'archive',\n  tests: ['PK'],\n  options: {},\n  parse: parseZipAsync\n} as const satisfies LoaderWithParser<FileMap, never, LoaderOptions>;\n\n// TODO - Could return a map of promises, perhaps as an option...\nasync function parseZipAsync(data: any, options = {}): Promise<FileMap> {\n  const promises: Promise<any>[] = [];\n  const fileMap: Record<string, ArrayBuffer> = {};\n\n  try {\n    const jsZip = new JSZip();\n\n    const zip = await jsZip.loadAsync(data, options);\n\n    // start to load each file in this zip\n    zip.forEach((relativePath, zipEntry) => {\n      if (zipEntry.dir) {\n        return;\n      }\n\n      const subFilename = zipEntry.name;\n\n      const promise = loadZipEntry(jsZip, subFilename, options).then((arrayBufferOrError) => {\n        fileMap[relativePath] = arrayBufferOrError;\n      });\n\n      // Ensure Promise.all doesn't ignore rejected promises.\n      promises.push(promise);\n    });\n\n    await Promise.all(promises);\n    return fileMap;\n  } catch (error) {\n    // @ts-ignore\n    options.log.error(`Unable to read zip archive: ${error}`);\n    throw error;\n  }\n}\n\nasync function loadZipEntry(jsZip: any, subFilename: string, options: any = {}) {\n  // jszip supports both arraybuffer and text, the main loaders.gl types\n  // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n  try {\n    const arrayBuffer = await jsZip.file(subFilename).async(options.dataType || 'arraybuffer');\n    return arrayBuffer;\n  } catch (error) {\n    options.log.error(`Unable to read ${subFilename} from zip archive: ${error}`);\n    // Store error in place of data in map\n    return error;\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {WriterWithEncoder, WriterOptions} from '@loaders.gl/loader-utils';\nimport JSZip, {JSZipFileOptions, JSZipGeneratorOptions} from 'jszip';\n\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type ZipWriterOptions = WriterOptions & {\n  zip?: {\n    onUpdate?: (metadata: {percent: number}) => void;\n    /** When enabled, parent directory entries are created for nested file keys. */\n    createFolders?: boolean;\n  };\n  /** Passthrough options to jszip. Note that jszip maybe replaced in future versions of loaders.gl */\n  jszip?: JSZipGeneratorOptions & JSZipFileOptions;\n};\n\n/**\n * Zip exporter\n */\nexport const ZipWriter = {\n  name: 'Zip Archive',\n  id: 'zip',\n  module: 'zip',\n  version: VERSION,\n  extensions: ['zip'],\n  category: 'archive',\n  mimeTypes: ['application/zip'],\n  options: {\n    zip: {\n      onUpdate: () => {},\n      createFolders: false\n    },\n    jszip: {}\n  },\n  encode: encodeZipAsync\n} as const satisfies WriterWithEncoder<Record<string, ArrayBuffer>, never, ZipWriterOptions>;\n\nasync function encodeZipAsync(\n  fileMap: Record<string, ArrayBuffer>,\n  options: ZipWriterOptions = {}\n): Promise<ArrayBuffer> {\n  const jsZip = new JSZip();\n  const directoryEntries = new Set<string>();\n  const zipOptions = {...ZipWriter.options.zip, ...options?.zip};\n  const jszipOptions = {...ZipWriter.options?.jszip, ...options.jszip};\n  const jszipFileOptions: JSZipFileOptions = {\n    createFolders: false,\n    ...jszipOptions\n  };\n\n  // add files to the zip\n  for (const subFileName in fileMap) {\n    const subFileData = fileMap[subFileName];\n    const isDirectoryEntry = subFileName.endsWith('/');\n\n    if (isDirectoryEntry || zipOptions.createFolders) {\n      addParentDirectoryEntries(jsZip, subFileName, options, directoryEntries);\n    }\n\n    // jszip supports both arraybuffer and string data (the main loaders.gl types)\n    // https://stuk.github.io/jszip/documentation/api_zipobject/async.html\n    if (isDirectoryEntry) {\n      jsZip.file(subFileName, null, {...jszipFileOptions, dir: true});\n    } else {\n      jsZip.file(subFileName, subFileData, jszipFileOptions);\n    }\n  }\n\n  const jszipGeneratorOptions: JSZipGeneratorOptions = jszipOptions;\n\n  try {\n    return await jsZip.generateAsync(\n      {...jszipGeneratorOptions, type: 'arraybuffer'}, // generate an arraybuffer\n      zipOptions.onUpdate\n    );\n  } catch (error) {\n    options.core?.log?.error(`Unable to encode zip archive: ${error}`);\n    throw error;\n  }\n}\n\nfunction addParentDirectoryEntries(\n  jsZip: JSZip,\n  subFileName: string,\n  options: ZipWriterOptions,\n  directoryEntries: Set<string>\n): void {\n  const subPathParts = subFileName.split('/').filter((part) => part.length > 0);\n  const subPathPartCount = subFileName.endsWith('/')\n    ? subPathParts.length\n    : subPathParts.length - 1;\n\n  let parentDirectoryPath = '';\n\n  for (let index = 0; index < subPathPartCount; index++) {\n    parentDirectoryPath = `${parentDirectoryPath}${subPathParts[index]}/`;\n\n    if (directoryEntries.has(parentDirectoryPath)) {\n      continue;\n    }\n\n    jsZip.file(parentDirectoryPath, null, {\n      createFolders: false,\n      ...options?.jszip,\n      dir: true\n    });\n    directoryEntries.add(parentDirectoryPath);\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the tar-js code base under MIT license\n// See https://github.com/beatgammit/tar-js/blob/master/LICENSE\n/*\n * tar-js\n * MIT (c) 2011 T. Jameson Little\n */\n/**\n * Returns the memory area specified by length\n * @param length\n * @returns {Uint8Array}\n */\nexport function clean(length: number): Uint8Array {\n  let i: number;\n  const buffer = new Uint8Array(length);\n  for (i = 0; i < length; i += 1) {\n    buffer[i] = 0;\n  }\n  return buffer;\n}\n/**\n * Converting data to a string\n * @param num\n * @param bytes\n * @param base\n * @returns string\n */\nexport function pad(num: number, bytes: number, base?: number): string {\n  const numStr = num.toString(base || 8);\n  return '000000000000'.substr(numStr.length + 12 - bytes) + numStr;\n}\n/**\n * Converting input to binary data\n * @param input\n * @param out\n * @param offset\n * @returns {Uint8Array}\n */\nexport function stringToUint8(input: string, out?: Uint8Array, offset?: number): Uint8Array {\n  let i: number;\n  let length: number;\n\n  out = out || clean(input.length);\n\n  offset = offset || 0;\n  for (i = 0, length = input.length; i < length; i += 1) {\n    out[offset] = input.charCodeAt(i);\n    offset += 1;\n  }\n\n  return out;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the tar-js code base under MIT license\n// See https://github.com/beatgammit/tar-js/blob/master/LICENSE\n/*\n * tar-js\n * MIT (c) 2011 T. Jameson Little\n */\n/* eslint-disable */\nimport * as utils from './utils';\nimport type {TarStructure, TarData} from './types';\n/*\nstruct posix_header {             // byte offset\n\tchar name[100];               //   0\n\tchar mode[8];                 // 100\n\tchar uid[8];                  // 108\n\tchar gid[8];                  // 116\n\tchar size[12];                // 124\n\tchar mtime[12];               // 136\n\tchar chksum[8];               // 148\n\tchar typeflag;                // 156\n\tchar linkname[100];           // 157\n\tchar magic[6];                // 257\n\tchar version[2];              // 263\n\tchar uname[32];               // 265\n\tchar gname[32];               // 297\n\tchar devmajor[8];             // 329\n\tchar devminor[8];             // 337\n\tchar prefix[155];             // 345\n                                  // 500\n};\n*/\n\nconst structure: TarStructure = {\n  fileName: 100,\n  fileMode: 8,\n  uid: 8,\n  gid: 8,\n  fileSize: 12,\n  mtime: 12,\n  checksum: 8,\n  type: 1,\n  linkName: 100,\n  ustar: 8,\n  owner: 32,\n  group: 32,\n  majorNumber: 8,\n  minorNumber: 8,\n  filenamePrefix: 155,\n  padding: 12\n};\n/**\n * Getting the header\n * @param data\n * @param [cb]\n * @returns {Uint8Array} | Array\n */\nexport function format(data: TarData, cb?: any): [string, number][] | Uint8Array {\n  const buffer = utils.clean(512);\n  let offset = 0;\n\n  Object.entries(structure).forEach(([field, length]) => {\n    const str = data[field] || '';\n    let i: number;\n    let fieldLength: number;\n\n    for (i = 0, fieldLength = str.length; i < fieldLength; i += 1) {\n      buffer[offset] = str.charCodeAt(i);\n      offset += 1;\n    }\n\n    // space it out with nulls\n    offset += length - i;\n  });\n\n  if (typeof cb === 'function') {\n    return cb(buffer, offset);\n  }\n  return buffer;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the tar-js code base under MIT license\n// See https://github.com/beatgammit/tar-js/blob/master/LICENSE\n/*\n * tar-js\n * MIT (c) 2011 T. Jameson Little\n */\n\nimport {clean, pad, stringToUint8} from './utils';\nimport {format} from './header';\nimport type {TarBlocks, TarOptions, TarChunks, TarChunk} from './types';\n\nlet blockSize: number;\nlet headerLength: number;\nlet inputLength: number;\n\nconst recordSize = 512;\n\nclass Tar {\n  written: number;\n  out: Uint8Array;\n  blocks: TarBlocks = [];\n  length: number;\n\n  /**\n   * @param [recordsPerBlock]\n   */\n  constructor(recordsPerBlock: number | undefined) {\n    this.written = 0;\n    blockSize = (recordsPerBlock || 20) * recordSize;\n    this.out = clean(blockSize);\n\n    this.blocks = [];\n    this.length = 0;\n    this.save = this.save.bind(this);\n    this.clear = this.clear.bind(this);\n    this.append = this.append.bind(this);\n  }\n\n  /**\n   * Append a file to the tar archive\n   * @param filepath\n   * @param input\n   * @param [opts]\n   */\n  // eslint-disable-next-line complexity\n  append(filepath: string, input: string | Uint8Array, opts?: TarOptions | undefined) {\n    let checksum: string | any;\n\n    if (typeof input === 'string') {\n      input = stringToUint8(input);\n    } else if (input.constructor && input.constructor !== Uint8Array.prototype.constructor) {\n      // @ts-ignore\n      const errorInputMatch = /function\\s*([$A-Za-z_][0-9A-Za-z_]*)\\s*\\(/.exec(\n        input.constructor.toString()\n      );\n      const errorInput = errorInputMatch && errorInputMatch[1];\n      const errorMessage = `Invalid input type. You gave me: ${errorInput}`;\n      throw errorMessage;\n    }\n\n    opts = opts || {};\n\n    const mode = opts.mode || parseInt('777', 8) & 0xfff;\n    const mtime = opts.mtime || Math.floor(Number(new Date()) / 1000);\n    const uid = opts.uid || 0;\n    const gid = opts.gid || 0;\n\n    const data: Record<string, string> = {\n      fileName: filepath,\n      fileMode: pad(mode, 7),\n      uid: pad(uid, 7),\n      gid: pad(gid, 7),\n      fileSize: pad(input.length, 11),\n      mtime: pad(mtime, 11),\n      checksum: '        ',\n      // 0 = just a file\n      type: '0',\n      ustar: 'ustar  ',\n      owner: opts.owner || '',\n      group: opts.group || ''\n    };\n\n    // calculate the checksum\n    checksum = 0;\n    Object.keys(data).forEach((key) => {\n      let i: number;\n      const value = data[key];\n      let length: number;\n\n      for (i = 0, length = value.length; i < length; i += 1) {\n        checksum += value.charCodeAt(i);\n      }\n    });\n\n    data.checksum = `${pad(checksum, 6)}\\u0000 `;\n\n    const headerArr = format(data);\n\n    headerLength = Math.ceil(headerArr.length / recordSize) * recordSize;\n    inputLength = Math.ceil(input.length / recordSize) * recordSize;\n\n    this.blocks.push({\n      header: headerArr,\n      input,\n      headerLength,\n      inputLength\n    });\n  }\n  /**\n   * Compiling data to a Blob object\n   * @returns {Blob}\n   */\n  save(): Blob {\n    const buffers: any = [];\n    const chunks = new Array<TarChunks>();\n    let length = 0;\n    const max = Math.pow(2, 20);\n\n    let chunk = new Array<TarChunk>();\n    this.blocks.forEach((b: any = []) => {\n      if (length + b.headerLength + b.inputLength > max) {\n        chunks.push({blocks: chunk, length});\n        chunk = [];\n        length = 0;\n      }\n      chunk.push(b);\n      length += b.headerLength + b.inputLength;\n    });\n    chunks.push({blocks: chunk, length});\n\n    chunks.forEach((c: any = []) => {\n      const buffer = new Uint8Array(c.length);\n      let written = 0;\n      c.blocks.forEach((b: any = []) => {\n        buffer.set(b.header, written);\n        written += b.headerLength;\n        buffer.set(b.input, written);\n        written += b.inputLength;\n      });\n      buffers.push(buffer);\n    });\n\n    buffers.push(new Uint8Array(2 * recordSize));\n\n    return new Blob(buffers, {type: 'octet/stream'});\n  }\n  /**\n   * Clear the data by its blocksize\n   */\n  clear() {\n    this.written = 0;\n    this.out = clean(blockSize);\n  }\n}\n\nexport default Tar;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport Tar from './lib/tar/tar';\n\nconst TAR_BUILDER_OPTIONS = {\n  recordsPerBlock: 20\n};\n\ntype TarBuilderOptions = {\n  recordsPerBlock?: number;\n};\n\n/**\n * Build a tar file by adding files\n */\nexport class TarBuilder {\n  static get properties() {\n    return {\n      id: 'tar',\n      name: 'TAR',\n      extensions: ['tar'],\n      mimeTypes: ['application/x-tar'],\n      builder: TarBuilder,\n      options: TAR_BUILDER_OPTIONS\n    };\n  }\n\n  options: TarBuilderOptions;\n  tape: Tar;\n  count: number = 0;\n\n  constructor(options?: Partial<TarBuilderOptions>) {\n    this.options = {...TAR_BUILDER_OPTIONS, ...options};\n    this.tape = new Tar(this.options.recordsPerBlock);\n  }\n  /** Adds a file to the archive. */\n  addFile(filename: string, buffer: ArrayBuffer) {\n    this.tape.append(filename, new Uint8Array(buffer));\n    this.count++;\n  }\n\n  async build(): Promise<ArrayBuffer> {\n    return new Response(this.tape.save()).arrayBuffer();\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {parseEoCDRecord} from './end-of-central-directory';\nimport {ZipSignature} from './search-from-the-end';\nimport {createZip64Info, setFieldToNumber} from './zip64-info-generation';\nimport {\n  DataViewReadableFile,\n  getReadableFileSize,\n  readDataView,\n  readRange\n} from './readable-file-utils';\n\n/**\n * zip central directory file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipCDFileHeader = {\n  /** Compressed size */\n  compressedSize: bigint;\n  /** Uncompressed size */\n  uncompressedSize: bigint;\n  /** Extra field size */\n  extraFieldLength: number;\n  /** File name length */\n  fileNameLength: number;\n  /** File name */\n  fileName: string;\n  /** Extra field offset */\n  extraOffset: bigint;\n  /** Relative offset of local file header */\n  localHeaderOffset: bigint;\n};\n\n/**\n * Data that might be in Zip64 notation inside extra data\n */\ntype Zip64Data = {\n  /** Uncompressed size */\n  uncompressedSize: bigint;\n  /** Compressed size */\n  compressedSize: bigint;\n  /** Relative offset of local file header */\n  localHeaderOffset: bigint;\n  /** Start disk */\n  startDisk: bigint;\n};\n\n// offsets accroding to https://en.wikipedia.org/wiki/ZIP_(file_format)\nconst CD_COMPRESSED_SIZE_OFFSET = 20;\nconst CD_UNCOMPRESSED_SIZE_OFFSET = 24;\nconst CD_FILE_NAME_LENGTH_OFFSET = 28;\nconst CD_EXTRA_FIELD_LENGTH_OFFSET = 30;\nconst CD_START_DISK_OFFSET = 32;\nconst CD_LOCAL_HEADER_OFFSET_OFFSET = 42;\nconst CD_FILE_NAME_OFFSET = 46n;\n\nexport const signature: ZipSignature = new Uint8Array([0x50, 0x4b, 0x01, 0x02]);\n\n/**\n * Parses central directory file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipCDFileHeader = async (\n  headerOffset: bigint,\n  file: ReadableFile\n): Promise<ZipCDFileHeader | null> => {\n  const fileLength = await getReadableFileSize(file);\n  if (headerOffset >= fileLength) {\n    return null;\n  }\n  const mainHeader = await readDataView(file, headerOffset, headerOffset + CD_FILE_NAME_OFFSET);\n\n  const magicBytes = mainHeader.buffer.slice(0, 4);\n  if (!compareArrayBuffers(magicBytes, signature.buffer)) {\n    return null;\n  }\n\n  const compressedSize = BigInt(mainHeader.getUint32(CD_COMPRESSED_SIZE_OFFSET, true));\n  const uncompressedSize = BigInt(mainHeader.getUint32(CD_UNCOMPRESSED_SIZE_OFFSET, true));\n  const extraFieldLength = mainHeader.getUint16(CD_EXTRA_FIELD_LENGTH_OFFSET, true);\n  const startDisk = BigInt(mainHeader.getUint16(CD_START_DISK_OFFSET, true));\n  const fileNameLength = mainHeader.getUint16(CD_FILE_NAME_LENGTH_OFFSET, true);\n\n  const additionalHeader = await readRange(\n    file,\n    headerOffset + CD_FILE_NAME_OFFSET,\n    headerOffset + CD_FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength)\n  );\n\n  const filenameBytes = additionalHeader.slice(0, fileNameLength);\n  const fileName = new TextDecoder().decode(filenameBytes);\n\n  const extraOffset = headerOffset + CD_FILE_NAME_OFFSET + BigInt(fileNameLength);\n  const oldFormatOffset = mainHeader.getUint32(CD_LOCAL_HEADER_OFFSET_OFFSET, true);\n\n  const localHeaderOffset = BigInt(oldFormatOffset);\n  const extraField = new DataView(\n    additionalHeader.slice(fileNameLength, additionalHeader.byteLength)\n  );\n  // looking for info that might be also be in zip64 extra field\n\n  const zip64data: Zip64Data = {\n    uncompressedSize,\n    compressedSize,\n    localHeaderOffset,\n    startDisk\n  };\n\n  const res = findZip64DataInExtra(zip64data, extraField);\n\n  return {\n    ...zip64data,\n    ...res,\n    extraFieldLength,\n    fileNameLength,\n    fileName,\n    extraOffset\n  };\n};\n\n/**\n * Create iterator over files of zip archive\n * @param fileProvider - readable file that provides random access to the file\n */\nexport async function* makeZipCDHeaderIterator(\n  fileProvider: ReadableFile\n): AsyncIterable<ZipCDFileHeader> {\n  const {cdStartOffset, cdByteSize} = await parseEoCDRecord(fileProvider);\n  const centralDirectory = new DataViewReadableFile(\n    new DataView(await readRange(fileProvider, cdStartOffset, cdStartOffset + cdByteSize))\n  );\n  let cdHeader = await parseZipCDFileHeader(0n, centralDirectory);\n  while (cdHeader) {\n    yield cdHeader;\n    cdHeader = await parseZipCDFileHeader(\n      cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength),\n      centralDirectory\n    );\n  }\n}\n/**\n * returns the number written in the provided bytes\n * @param bytes two bytes containing the number\n * @returns the number written in the provided bytes\n */\nconst getUint16 = (...bytes: [number, number]) => {\n  return bytes[0] + bytes[1] * 16;\n};\n\n/**\n * reads all nesessary data from zip64 record in the extra data\n * @param zip64data values that might be in zip64 record\n * @param extraField full extra data\n * @returns data read from zip64\n */\n\nconst findZip64DataInExtra = (zip64data: Zip64Data, extraField: DataView): Partial<Zip64Data> => {\n  const zip64dataList = findExpectedData(zip64data);\n\n  const zip64DataRes: Partial<Zip64Data> = {};\n  if (zip64dataList.length > 0) {\n    // total length of data in zip64 notation in bytes\n    const zip64chunkSize = zip64dataList.reduce((sum, curr) => sum + curr.length, 0);\n    // we're looking for the zip64 nontation header (0x0001)\n    // and a size field with a correct value next to it\n    const offsetInExtraData = new Uint8Array(extraField.buffer).findIndex(\n      (_val, i, arr) =>\n        getUint16(arr[i], arr[i + 1]) === 0x0001 &&\n        getUint16(arr[i + 2], arr[i + 3]) === zip64chunkSize\n    );\n    // then we read all the nesessary fields from the zip64 data\n    let bytesRead = 0;\n    for (const note of zip64dataList) {\n      const offset = bytesRead;\n      zip64DataRes[note.name] = extraField.getBigUint64(offsetInExtraData + 4 + offset, true);\n      bytesRead = offset + note.length;\n    }\n  }\n\n  return zip64DataRes;\n};\n\n/**\n * frind data that's expected to be in zip64\n * @param zip64data values that might be in zip64 record\n * @returns zip64 data description\n */\n\nconst findExpectedData = (zip64data: Zip64Data): {length: number; name: string}[] => {\n  // We define fields that should be in zip64 data\n  const zip64dataList: {length: number; name: string}[] = [];\n  if (zip64data.uncompressedSize === BigInt(0xffffffff)) {\n    zip64dataList.push({name: 'uncompressedSize', length: 8});\n  }\n  if (zip64data.compressedSize === BigInt(0xffffffff)) {\n    zip64dataList.push({name: 'compressedSize', length: 8});\n  }\n  if (zip64data.localHeaderOffset === BigInt(0xffffffff)) {\n    zip64dataList.push({name: 'localHeaderOffset', length: 8});\n  }\n  if (zip64data.startDisk === BigInt(0xffffffff)) {\n    zip64dataList.push({name: 'startDisk', length: 4});\n  }\n\n  return zip64dataList;\n};\n\n/** info that can be placed into cd header */\ntype GenerateCDOptions = {\n  /** CRC-32 of uncompressed data */\n  crc32: number;\n  /** File name */\n  fileName: string;\n  /** File size */\n  length: number;\n  /** Relative offset of local file header */\n  offset: bigint;\n};\n\n/**\n * generates cd header for the file\n * @param options info that can be placed into cd header\n * @returns buffer with header\n */\nexport function generateCDHeader(options: GenerateCDOptions): ArrayBuffer {\n  const optionsToUse = {\n    ...options,\n    fnlength: options.fileName.length,\n    extraLength: 0\n  };\n\n  let zip64header: ArrayBuffer = new ArrayBuffer(0);\n\n  const optionsToZip64: any = {};\n  if (optionsToUse.offset >= 0xffffffff) {\n    optionsToZip64.offset = optionsToUse.offset;\n    optionsToUse.offset = BigInt(0xffffffff);\n  }\n  if (optionsToUse.length >= 0xffffffff) {\n    optionsToZip64.size = optionsToUse.length;\n    optionsToUse.length = 0xffffffff;\n  }\n\n  if (Object.keys(optionsToZip64).length) {\n    zip64header = createZip64Info(optionsToZip64);\n    optionsToUse.extraLength = zip64header.byteLength;\n  }\n  const header = new DataView(new ArrayBuffer(Number(CD_FILE_NAME_OFFSET)));\n\n  for (const field of ZIP_HEADER_FIELDS) {\n    setFieldToNumber(\n      header,\n      field.size,\n      field.offset,\n      optionsToUse[field.name ?? ''] ?? field.default ?? 0\n    );\n  }\n\n  const encodedName = new TextEncoder().encode(optionsToUse.fileName);\n\n  const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);\n\n  return resHeader;\n}\n\n/** Fields map */\nconst ZIP_HEADER_FIELDS = [\n  // Central directory file header signature = 0x02014b50\n  {\n    offset: 0,\n    size: 4,\n    default: new DataView(signature.buffer).getUint32(0, true)\n  },\n\n  // Version made by\n  {\n    offset: 4,\n    size: 2,\n    default: 45\n  },\n\n  // Version needed to extract (minimum)\n  {\n    offset: 6,\n    size: 2,\n    default: 45\n  },\n\n  // General purpose bit flag\n  {\n    offset: 8,\n    size: 2,\n    default: 0\n  },\n\n  // Compression method\n  {\n    offset: 10,\n    size: 2,\n    default: 0\n  },\n\n  // File last modification time\n  {\n    offset: 12,\n    size: 2,\n    default: 0\n  },\n\n  // File last modification date\n  {\n    offset: 14,\n    size: 2,\n    default: 0\n  },\n\n  // CRC-32 of uncompressed data\n  {\n    offset: 16,\n    size: 4,\n    name: 'crc32'\n  },\n\n  // Compressed size (or 0xffffffff for ZIP64)\n  {\n    offset: 20,\n    size: 4,\n    name: 'length'\n  },\n\n  // Uncompressed size (or 0xffffffff for ZIP64)\n  {\n    offset: 24,\n    size: 4,\n    name: 'length'\n  },\n\n  // File name length (n)\n  {\n    offset: 28,\n    size: 2,\n    name: 'fnlength'\n  },\n\n  // Extra field length (m)\n  {\n    offset: 30,\n    size: 2,\n    default: 0,\n    name: 'extraLength'\n  },\n\n  // File comment length (k)\n  {\n    offset: 32,\n    size: 2,\n    default: 0\n  },\n\n  // Disk number where file starts (or 0xffff for ZIP64)\n  {\n    offset: 34,\n    size: 2,\n    default: 0\n  },\n\n  // Internal file attributes\n  {\n    offset: 36,\n    size: 2,\n    default: 0\n  },\n\n  // External file attributes\n  {\n    offset: 38,\n    size: 4,\n    default: 0\n  },\n\n  // Relative offset of local file header\n  {\n    offset: 42,\n    size: 4,\n    name: 'offset'\n  }\n];\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {ZipSignature, searchFromTheEnd} from './search-from-the-end';\nimport {readBigUint64, readUint16, readUint32, readRange} from './readable-file-utils';\nimport {setFieldToNumber} from './zip64-info-generation';\n\n/**\n * End of central directory info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecord = {\n  /** Relative offset of cd start */\n  cdStartOffset: bigint;\n  /** Total number of central directory records */\n  cdRecordsNumber: bigint;\n  /** Size of central directory */\n  cdByteSize: bigint;\n  offsets: ZipEoCDRecordOffsets;\n};\n\n/**\n * End of central directory offsets\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDRecordOffsets = {\n  zipEoCDOffset: bigint;\n\n  zip64EoCDOffset?: bigint;\n  zip64EoCDLocatorOffset?: bigint;\n};\n\n/**\n * Data to generate End of central directory record\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipEoCDGenerationOptions = {\n  recordsNumber: number;\n  cdSize: number;\n  cdOffset: bigint;\n  eoCDStart: bigint;\n};\n\nconst eoCDSignature: ZipSignature = new Uint8Array([0x50, 0x4b, 0x05, 0x06]);\nconst zip64EoCDLocatorSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x07]);\nconst zip64EoCDSignature = new Uint8Array([0x50, 0x4b, 0x06, 0x06]);\n\n// offsets accroding to https://en.wikipedia.org/wiki/ZIP_(file_format)\nconst CD_RECORDS_NUMBER_OFFSET = 8n;\nconst CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;\nconst CD_CD_BYTE_SIZE_OFFSET = 12n;\nconst CD_START_OFFSET_OFFSET = 16n;\nconst CD_COMMENT_OFFSET = 22n;\nconst ZIP64_EOCD_START_OFFSET_OFFSET = 8n;\nconst ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;\nconst ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;\nconst ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;\nconst ZIP64_CD_START_OFFSET_OFFSET = 48n;\nconst ZIP64_COMMENT_OFFSET = 56n;\n\n/**\n * Parses end of central directory record of zip file\n * @param file - ReadableFile instance\n * @returns Info from the header\n */\nexport const parseEoCDRecord = async (file: ReadableFile): Promise<ZipEoCDRecord> => {\n  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);\n\n  let cdRecordsNumber = BigInt(await readUint16(file, zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));\n  let cdByteSize = BigInt(await readUint32(file, zipEoCDOffset + CD_CD_BYTE_SIZE_OFFSET));\n  let cdStartOffset = BigInt(await readUint32(file, zipEoCDOffset + CD_START_OFFSET_OFFSET));\n\n  let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;\n  let zip64EoCDOffset = 0n;\n\n  const magicBytes = await readRange(file, zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);\n  if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature.buffer)) {\n    zip64EoCDOffset = await readBigUint64(\n      file,\n      zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET\n    );\n\n    const endOfCDMagicBytes = await readRange(file, zip64EoCDOffset, zip64EoCDOffset + 4n);\n    if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {\n      throw new Error('zip64 EoCD not found');\n    }\n\n    cdRecordsNumber = await readBigUint64(file, zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);\n    cdByteSize = await readBigUint64(file, zip64EoCDOffset + ZIP64_CD_CD_BYTE_SIZE_OFFSET);\n    cdStartOffset = await readBigUint64(file, zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);\n  } else {\n    zip64EoCDLocatorOffset = 0n;\n  }\n\n  return {\n    cdRecordsNumber,\n    cdStartOffset,\n    cdByteSize,\n    offsets: {\n      zip64EoCDOffset,\n      zip64EoCDLocatorOffset,\n      zipEoCDOffset\n    }\n  };\n};\n\n/**\n * updates EoCD record to add more files to the archieve\n * @param eocdBody buffer containing header\n * @param oldEoCDOffsets info read from EoCD record befor updating\n * @param newCDStartOffset CD start offset to be updated\n * @param eocdStartOffset EoCD start offset to be updated\n * @returns new EoCD header\n */\nexport function updateEoCD(\n  eocdBody: ArrayBuffer,\n  oldEoCDOffsets: ZipEoCDRecordOffsets,\n  newCDStartOffset: bigint,\n  eocdStartOffset: bigint,\n  newCDRecordsNumber: bigint\n): Uint8Array {\n  const eocd = new DataView(eocdBody);\n\n  const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset\n    ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset\n    : 0n;\n\n  // updating classic EoCD record with new CD records number in general and on disc\n  if (Number(newCDRecordsNumber) <= 0xffff) {\n    setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n    setFieldToNumber(\n      eocd,\n      2,\n      classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET,\n      newCDRecordsNumber\n    );\n  }\n\n  // updating zip64 EoCD record with new size of CD\n  if (eocdStartOffset - newCDStartOffset <= 0xffffffff) {\n    setFieldToNumber(\n      eocd,\n      4,\n      classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET,\n      eocdStartOffset - newCDStartOffset\n    );\n  }\n\n  // updating classic EoCD record with new CD start offset\n  if (newCDStartOffset < 0xffffffff) {\n    setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);\n  }\n\n  // updating zip64 EoCD locator and record with new EoCD record start offset and cd records number\n  if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {\n    // updating zip64 EoCD locator with new EoCD record start offset\n    const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;\n    setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);\n\n    // updating zip64 EoCD record with new cd start offset\n    setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);\n\n    // updating zip64 EoCD record with new cd records number\n    setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);\n    setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);\n\n    // updating zip64 EoCD record with new size of CD\n    setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);\n  }\n\n  return new Uint8Array(eocd.buffer);\n}\n\n/**\n * generates EoCD record\n * @param options data to generate EoCD record\n * @returns ArrayBuffer with EoCD record\n */\nexport function generateEoCD(options: ZipEoCDGenerationOptions): ArrayBuffer {\n  const header = new DataView(new ArrayBuffer(Number(CD_COMMENT_OFFSET)));\n\n  for (const field of EOCD_FIELDS) {\n    setFieldToNumber(\n      header,\n      field.size,\n      field.offset,\n      options[field.name ?? ''] ?? field.default ?? 0\n    );\n  }\n  const locator = generateZip64InfoLocator(options);\n\n  const zip64Record = generateZip64Info(options);\n\n  return concatenateArrayBuffers(zip64Record, locator, header.buffer);\n}\n\n/** standart EoCD fields */\nconst EOCD_FIELDS = [\n  // End of central directory signature = 0x06054b50\n  {\n    offset: 0,\n    size: 4,\n    default: new DataView(eoCDSignature.buffer).getUint32(0, true)\n  },\n\n  // Number of this disk (or 0xffff for ZIP64)\n  {\n    offset: 4,\n    size: 2,\n    default: 0\n  },\n\n  // Disk where central directory starts (or 0xffff for ZIP64)\n  {\n    offset: 6,\n    size: 2,\n    default: 0\n  },\n\n  // Number of central directory records on this disk (or 0xffff for ZIP64)\n  {\n    offset: 8,\n    size: 2,\n    name: 'recordsNumber'\n  },\n\n  // Total number of central directory records (or 0xffff for ZIP64)\n  {\n    offset: 10,\n    size: 2,\n    name: 'recordsNumber'\n  },\n\n  // Size of central directory (bytes) (or 0xffffffff for ZIP64)\n  {\n    offset: 12,\n    size: 4,\n    name: 'cdSize'\n  },\n\n  // Offset of start of central directory, relative to start of archive (or 0xffffffff for ZIP64)\n  {\n    offset: 16,\n    size: 4,\n    name: 'cdOffset'\n  },\n\n  // Comment length (n)\n  {\n    offset: 20,\n    size: 2,\n    default: 0\n  }\n];\n\n/**\n * generates eocd zip64 record\n * @param options data to generate eocd zip64 record\n * @returns buffer with eocd zip64 record\n */\nfunction generateZip64Info(options: ZipEoCDGenerationOptions): ArrayBuffer {\n  const record = new DataView(new ArrayBuffer(Number(ZIP64_COMMENT_OFFSET)));\n  for (const field of ZIP64_EOCD_FIELDS) {\n    setFieldToNumber(\n      record,\n      field.size,\n      field.offset,\n      options[field.name ?? ''] ?? field.default ?? 0\n    );\n  }\n\n  return record.buffer;\n}\n\n/**\n * generates eocd zip64 record locator\n * @param options data to generate eocd zip64 record\n * @returns buffer with eocd zip64 record\n */\nfunction generateZip64InfoLocator(options: ZipEoCDGenerationOptions): ArrayBuffer {\n  const locator = new DataView(new ArrayBuffer(Number(20)));\n\n  for (const field of ZIP64_EOCD_LOCATOR_FIELDS) {\n    setFieldToNumber(\n      locator,\n      field.size,\n      field.offset,\n      options[field.name ?? ''] ?? field.default ?? 0\n    );\n  }\n\n  return locator.buffer;\n}\n\n/** zip64 EoCD record locater fields */\nconst ZIP64_EOCD_LOCATOR_FIELDS = [\n  // zip64 end of central dir locator signature\n  {\n    offset: 0,\n    size: 4,\n    default: new DataView(zip64EoCDLocatorSignature.buffer).getUint32(0, true)\n  },\n\n  // number of the disk with the start of the zip64 end of\n  {\n    offset: 4,\n    size: 4,\n    default: 0\n  },\n\n  // start of the zip64 end of central directory\n  {\n    offset: 8,\n    size: 8,\n    name: 'eoCDStart'\n  },\n\n  // total number of disks\n  {\n    offset: 16,\n    size: 4,\n    default: 1\n  }\n];\n\n/** zip64 EoCD recodrd fields */\nconst ZIP64_EOCD_FIELDS = [\n  // End of central directory signature = 0x06064b50\n  {\n    offset: 0,\n    size: 4,\n    default: new DataView(zip64EoCDSignature.buffer).getUint32(0, true)\n  },\n\n  // Size of the EOCD64 minus 12\n  {\n    offset: 4,\n    size: 8,\n    default: 44\n  },\n\n  // Version made by\n  {\n    offset: 12,\n    size: 2,\n    default: 45\n  },\n\n  // Version needed to extract (minimum)\n  {\n    offset: 14,\n    size: 2,\n    default: 45\n  },\n\n  // Number of this disk\n  {\n    offset: 16,\n    size: 4,\n    default: 0\n  },\n\n  // Disk where central directory starts\n  {\n    offset: 20,\n    size: 4,\n    default: 0\n  },\n\n  // Number of central directory records on this disk\n  {\n    offset: 24,\n    size: 8,\n    name: 'recordsNumber'\n  },\n\n  // Total number of central directory records\n  {\n    offset: 32,\n    size: 8,\n    name: 'recordsNumber'\n  },\n\n  // Size of central directory (bytes)\n  {\n    offset: 40,\n    size: 8,\n    name: 'cdSize'\n  },\n\n  // Offset of start of central directory, relative to start of archive\n  {\n    offset: 48,\n    size: 8,\n    name: 'cdOffset'\n  }\n];\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {copyToArrayBuffer, type ReadableFile, type Stat} from '@loaders.gl/loader-utils';\n\nfunction toBigInt(value: number | bigint): bigint {\n  return typeof value === 'bigint' ? value : BigInt(value);\n}\n\nfunction toNumber(value: number | bigint): number {\n  const numberValue = Number(value);\n  if (!Number.isFinite(numberValue)) {\n    throw new Error('Offset is out of bounds');\n  }\n  return numberValue;\n}\n\nfunction normalizeOffset(offset: number, size: number): number {\n  if (offset < 0) {\n    return Math.max(size + offset, 0);\n  }\n  return Math.min(offset, size);\n}\n\n/**\n * Read a byte range from a readable file.\n * @param file readable file handle\n * @param start inclusive start offset\n * @param end exclusive end offset\n * @returns requested slice\n */\nexport async function readRange(\n  file: ReadableFile,\n  start: number | bigint,\n  end: number | bigint\n): Promise<ArrayBuffer> {\n  const startOffset = toBigInt(start);\n  const endOffset = toBigInt(end);\n  const length = endOffset - startOffset;\n  if (length < 0) {\n    throw new Error('Invalid range requested');\n  }\n  return await file.read(startOffset, toNumber(length));\n}\n\nexport async function readDataView(\n  file: ReadableFile,\n  start: number | bigint,\n  end: number | bigint\n): Promise<DataView> {\n  const arrayBuffer = await readRange(file, start, end);\n  return new DataView(arrayBuffer);\n}\n\nexport async function readUint8(file: ReadableFile, offset: number | bigint): Promise<number> {\n  const dataView = await readDataView(file, offset, toBigInt(offset) + 1n);\n  return dataView.getUint8(0);\n}\n\nexport async function readUint16(file: ReadableFile, offset: number | bigint): Promise<number> {\n  const dataView = await readDataView(file, offset, toBigInt(offset) + 2n);\n  return dataView.getUint16(0, true);\n}\n\nexport async function readUint32(file: ReadableFile, offset: number | bigint): Promise<number> {\n  const dataView = await readDataView(file, offset, toBigInt(offset) + 4n);\n  return dataView.getUint32(0, true);\n}\n\nexport async function readBigUint64(file: ReadableFile, offset: number | bigint): Promise<bigint> {\n  const dataView = await readDataView(file, offset, toBigInt(offset) + 8n);\n  return dataView.getBigUint64(0, true);\n}\n\n/**\n * Resolve the size of a readable file.\n * @param file readable file handle\n * @returns file size as bigint\n */\nexport async function getReadableFileSize(file: ReadableFile): Promise<bigint> {\n  if (file.bigsize > 0n) {\n    return file.bigsize;\n  }\n  if (file.size > 0) {\n    return BigInt(file.size);\n  }\n  if (file.stat) {\n    const stats: Stat = await file.stat();\n    if (stats?.bigsize !== undefined) {\n      return stats.bigsize;\n    }\n    if (stats?.size !== undefined) {\n      return BigInt(stats.size);\n    }\n  }\n  return 0n;\n}\n\n/**\n * Minimal readable file backed by a DataView.\n */\nexport class DataViewReadableFile implements ReadableFile {\n  readonly handle: DataView;\n  readonly size: number;\n  readonly bigsize: bigint;\n  readonly url: string;\n\n  constructor(dataView: DataView, url: string = '') {\n    this.handle = dataView;\n    this.size = dataView.byteLength;\n    this.bigsize = BigInt(dataView.byteLength);\n    this.url = url;\n  }\n\n  async close(): Promise<void> {}\n\n  async stat(): Promise<Stat> {\n    return {size: this.size, bigsize: this.bigsize, isDirectory: false};\n  }\n\n  async read(start: number | bigint = 0, length?: number): Promise<ArrayBuffer> {\n    const offset = toNumber(start);\n    const end = length ? offset + length : this.size;\n    const normalizedStart = normalizeOffset(offset, this.size);\n    const normalizedEnd = normalizeOffset(end, this.size);\n    const clampedEnd = Math.max(normalizedEnd, normalizedStart);\n    const lengthToRead = clampedEnd - normalizedStart;\n    if (lengthToRead <= 0) {\n      return new ArrayBuffer(0);\n    }\n    return copyToArrayBuffer(this.handle.buffer, normalizedStart, lengthToRead);\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {getReadableFileSize, readRange} from './readable-file-utils';\n\n/** Description of zip signature type */\nexport type ZipSignature = Uint8Array;\n\nconst buffLength = 1024;\n\n/**\n * looking for the last occurrence of the provided\n * @param file\n * @param target\n * @returns\n */\nexport const searchFromTheEnd = async (\n  file: ReadableFile,\n  target: ZipSignature\n): Promise<bigint> => {\n  const fileLength = await getReadableFileSize(file);\n  const lastBytes = new Uint8Array(await readRange(file, fileLength - 3n, fileLength + 1n));\n  const searchWindow = [lastBytes[3], lastBytes[2], lastBytes[1], undefined];\n\n  let targetOffset = -1;\n\n  // looking for the last record in the central directory\n  let point = fileLength - 4n;\n  do {\n    const prevPoint = point;\n    point -= BigInt(buffLength);\n    point = point >= 0n ? point : 0n;\n    const buff = new Uint8Array(await readRange(file, point, prevPoint));\n    for (let i = buff.length - 1; i > -1; i--) {\n      searchWindow[3] = searchWindow[2];\n      searchWindow[2] = searchWindow[1];\n      searchWindow[1] = searchWindow[0];\n      searchWindow[0] = buff[i];\n      if (searchWindow.every((val, index) => val === target[index])) {\n        targetOffset = i;\n        break;\n      }\n    }\n  } while (targetOffset === -1 && point > 0n);\n\n  return point + BigInt(targetOffset);\n};\n", "import {concatenateArrayBuffers} from '@loaders.gl/loader-utils';\n\nexport const signature = new Uint8Array([0x01, 0x00]);\n\n/** info that can be placed into zip64 field, doc: https://en.wikipedia.org/wiki/ZIP_(file_format)#ZIP64 */\ntype Zip64Options = {\n  /** Original uncompressed file size and Size of compressed data */\n  size?: number;\n  /** Offset of local header record */\n  offset?: number;\n};\n\n/**\n * creates zip64 extra field\n * @param options info that can be placed into zip64 field\n * @returns buffer with field\n */\nexport function createZip64Info(options: Zip64Options): ArrayBuffer {\n  const optionsToUse = {\n    ...options,\n    zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16\n  };\n\n  const arraysToConcat: ArrayBuffer[] = [];\n\n  for (const field of ZIP64_FIELDS) {\n    if (!optionsToUse[field.name ?? ''] && !field.default) {\n      continue; // eslint-disable-line no-continue\n    }\n    const newValue = new DataView(new ArrayBuffer(field.size));\n    NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ''] ?? field.default);\n    arraysToConcat.push(newValue.buffer);\n  }\n\n  return concatenateArrayBuffers(...arraysToConcat);\n}\n\n/**\n * Function to write values into buffer\n * @param header buffer where to write a value\n * @param offset offset of the writing start\n * @param value value to be written\n */\ntype NumberSetter = (header: DataView, offset: number, value: number | bigint) => void;\n\n/**\n * Writes values into buffer according to the bytes amount\n * @param header header where to write the data\n * @param fieldSize size of the field in bytes\n * @param fieldOffset offset of the field\n * @param value value to be written\n */\nexport function setFieldToNumber(\n  header: DataView,\n  fieldSize: number,\n  fieldOffset: number | bigint,\n  value: number | bigint\n): void {\n  NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);\n}\n\n/** functions to write values into buffer according to the bytes amount */\nconst NUMBER_SETTERS: {[key: number]: NumberSetter} = {\n  2: (header, offset, value) => {\n    header.setUint16(offset, Number(value > 0xffff ? 0xffff : value), true);\n  },\n  4: (header, offset, value) => {\n    header.setUint32(offset, Number(value > 0xffffffff ? 0xffffffff : value), true);\n  },\n  8: (header, offset, value) => {\n    header.setBigUint64(offset, BigInt(value), true);\n  }\n};\n\n/** zip64 info fields description, we need it as a pattern to build a zip64 info */\nconst ZIP64_FIELDS = [\n  // Header ID 0x0001\n  {\n    size: 2,\n    default: new DataView(signature.buffer).getUint16(0, true)\n  },\n\n  // Size of the extra field chunk (8, 16, 24 or 28)\n  {\n    size: 2,\n    name: 'zip64Length'\n  },\n\n  // Original uncompressed file size\n  {\n    size: 8,\n    name: 'size'\n  },\n\n  // Size of compressed data\n  {\n    size: 8,\n    name: 'size'\n  },\n\n  // Offset of local header record\n  {\n    size: 8,\n    name: 'offset'\n  }\n];\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {compareArrayBuffers, concatenateArrayBuffers} from '@loaders.gl/loader-utils';\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {ZipSignature} from './search-from-the-end';\nimport {createZip64Info, setFieldToNumber} from './zip64-info-generation';\nimport {readDataView, readRange} from './readable-file-utils';\n\n/**\n * zip local file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipLocalFileHeader = {\n  /** File name length */\n  fileNameLength: number;\n  /** File name */\n  fileName: string;\n  /** Extra field length */\n  extraFieldLength: number;\n  /** Offset of the file data */\n  fileDataOffset: bigint;\n  /** Compressed size */\n  compressedSize: bigint;\n  /** Compression method */\n  compressionMethod: number;\n};\n\n// offsets accroding to https://en.wikipedia.org/wiki/ZIP_(file_format)\nconst COMPRESSION_METHOD_OFFSET = 8;\nconst COMPRESSED_SIZE_OFFSET = 18;\nconst UNCOMPRESSED_SIZE_OFFSET = 22;\nconst FILE_NAME_LENGTH_OFFSET = 26;\nconst EXTRA_FIELD_LENGTH_OFFSET = 28;\nconst FILE_NAME_OFFSET = 30n;\n\nexport const signature: ZipSignature = new Uint8Array([0x50, 0x4b, 0x03, 0x04]);\n\n/**\n * Parses local file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipLocalFileHeader = async (\n  headerOffset: bigint,\n  file: ReadableFile\n): Promise<ZipLocalFileHeader | null> => {\n  const mainHeader = await readDataView(file, headerOffset, headerOffset + FILE_NAME_OFFSET);\n\n  const magicBytes = mainHeader.buffer.slice(0, 4);\n  if (!compareArrayBuffers(magicBytes, signature.buffer)) {\n    return null;\n  }\n\n  const fileNameLength = mainHeader.getUint16(FILE_NAME_LENGTH_OFFSET, true);\n\n  const extraFieldLength = mainHeader.getUint16(EXTRA_FIELD_LENGTH_OFFSET, true);\n\n  const additionalHeader = await readRange(\n    file,\n    headerOffset + FILE_NAME_OFFSET,\n    headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength)\n  );\n\n  const fileNameBuffer = additionalHeader.slice(0, fileNameLength);\n\n  const extraDataBuffer = new DataView(\n    additionalHeader.slice(fileNameLength, additionalHeader.byteLength)\n  );\n\n  const fileName = new TextDecoder().decode(fileNameBuffer).split('\\\\').join('/');\n\n  let fileDataOffset = headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength);\n\n  const compressionMethod = mainHeader.getUint16(COMPRESSION_METHOD_OFFSET, true);\n\n  let compressedSize = BigInt(mainHeader.getUint32(COMPRESSED_SIZE_OFFSET, true)); // add zip 64 logic\n\n  let uncompressedSize = BigInt(mainHeader.getUint32(UNCOMPRESSED_SIZE_OFFSET, true)); // add zip 64 logic\n\n  let offsetInZip64Data = 4;\n  // looking for info that might be also be in zip64 extra field\n  if (uncompressedSize === BigInt(0xffffffff)) {\n    uncompressedSize = extraDataBuffer.getBigUint64(offsetInZip64Data, true);\n    offsetInZip64Data += 8;\n  }\n  if (compressedSize === BigInt(0xffffffff)) {\n    compressedSize = extraDataBuffer.getBigUint64(offsetInZip64Data, true);\n    offsetInZip64Data += 8;\n  }\n  if (fileDataOffset === BigInt(0xffffffff)) {\n    fileDataOffset = extraDataBuffer.getBigUint64(offsetInZip64Data, true); // setting it to the one from zip64\n  }\n\n  return {\n    fileNameLength,\n    fileName,\n    extraFieldLength,\n    fileDataOffset,\n    compressedSize,\n    compressionMethod\n  };\n};\n\n/** info that can be placed into cd header */\ntype GenerateLocalOptions = {\n  /** CRC-32 of uncompressed data */\n  crc32: number;\n  /** File name */\n  fileName: string;\n  /** File size */\n  length: number;\n};\n\n/**\n * generates local header for the file\n * @param options info that can be placed into local header\n * @returns buffer with header\n */\nexport function generateLocalHeader(options: GenerateLocalOptions): ArrayBuffer {\n  const optionsToUse = {\n    ...options,\n    extraLength: 0,\n    fnlength: options.fileName.length\n  };\n\n  let zip64header: ArrayBuffer = new ArrayBuffer(0);\n\n  const optionsToZip64: any = {};\n  if (optionsToUse.length >= 0xffffffff) {\n    optionsToZip64.size = optionsToUse.length;\n    optionsToUse.length = 0xffffffff;\n  }\n\n  if (Object.keys(optionsToZip64).length) {\n    zip64header = createZip64Info(optionsToZip64);\n    optionsToUse.extraLength = zip64header.byteLength;\n  }\n\n  // base length without file name and extra info is static\n  const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));\n\n  for (const field of ZIP_HEADER_FIELDS) {\n    setFieldToNumber(\n      header,\n      field.size,\n      field.offset,\n      optionsToUse[field.name ?? ''] ?? field.default ?? 0\n    );\n  }\n\n  const encodedName = new TextEncoder().encode(optionsToUse.fileName);\n\n  const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);\n\n  return resHeader;\n}\n\nconst ZIP_HEADER_FIELDS = [\n  // Local file header signature = 0x04034b50\n  {\n    offset: 0,\n    size: 4,\n    default: new DataView(signature.buffer).getUint32(0, true)\n  },\n  // Version needed to extract (minimum)\n  {\n    offset: 4,\n    size: 2,\n    default: 45\n  },\n  // General purpose bit flag\n  {\n    offset: 6,\n    size: 2,\n    default: 0\n  },\n  // Compression method\n  {\n    offset: 8,\n    size: 2,\n    default: 0\n  },\n  // File last modification time\n  {\n    offset: 10,\n    size: 2,\n    default: 0\n  },\n  // File last modification date\n  {\n    offset: 12,\n    size: 2,\n    default: 0\n  },\n  // CRC-32 of uncompressed data\n  {\n    offset: 14,\n    size: 4,\n    name: 'crc32'\n  },\n  // Compressed size (or 0xffffffff for ZIP64)\n  {\n    offset: 18,\n    size: 4,\n    name: 'length'\n  },\n  // Uncompressed size (or 0xffffffff for ZIP64)\n  {\n    offset: 22,\n    size: 4,\n    name: 'length'\n  },\n  // File name length (n)\n  {\n    offset: 26,\n    size: 2,\n    name: 'fnlength'\n  },\n  // Extra field length (m)\n  {\n    offset: 28,\n    size: 2,\n    default: 0,\n    name: 'extraLength'\n  }\n];\n", "import {\n  concatenateArrayBuffers,\n  path,\n  NodeFilesystem,\n  NodeFile,\n  toArrayBuffer\n} from '@loaders.gl/loader-utils';\nimport {ZipEoCDRecord, generateEoCD, parseEoCDRecord, updateEoCD} from './end-of-central-directory';\nimport {CRC32Hash} from '@loaders.gl/crypto';\nimport {generateLocalHeader} from './local-file-header';\nimport {generateCDHeader} from './cd-file-header';\nimport {fetchFile} from '@loaders.gl/core';\nimport {readRange} from './readable-file-utils';\n\n/**\n * cut off CD and EoCD records from zip file\n * @param provider zip file\n * @returns tuple with three values: CD, EoCD record, EoCD information\n */\nasync function cutTheTailOff(\n  provider: NodeFile\n): Promise<[ArrayBuffer, ArrayBuffer, ZipEoCDRecord]> {\n  // define where the body ends\n  const oldEoCDinfo = await parseEoCDRecord(provider);\n  const oldCDStartOffset = oldEoCDinfo.cdStartOffset;\n  const providerSize = (await provider.stat()).bigsize;\n\n  // define cd length\n  const oldCDLength = Number(\n    oldEoCDinfo.offsets.zip64EoCDOffset\n      ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset\n      : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset\n  );\n\n  // cut off everything except of archieve body\n  const zipEnding = await readRange(provider, oldCDStartOffset, providerSize);\n  await provider.truncate(Number(oldCDStartOffset));\n\n  // divide cd body and eocd record\n  const oldCDBody = zipEnding.slice(0, oldCDLength);\n  const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);\n\n  return [oldCDBody, eocdBody, oldEoCDinfo];\n}\n\n/**\n * generates CD and local headers for the file\n * @param fileName name of the file\n * @param fileToAdd buffer with the file\n * @param localFileHeaderOffset offset of the file local header\n * @returns tuple with two values: local header and file body, cd header\n */\nasync function generateFileHeaders(\n  fileName: string,\n  fileToAdd: ArrayBuffer,\n  localFileHeaderOffset: bigint\n): Promise<[Uint8Array, Uint8Array]> {\n  // generating CRC32 of the content\n  const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, 'hex'), 16);\n\n  // generate local header for the file\n  const newFileLocalHeader = generateLocalHeader({\n    crc32: newFileCRC322,\n    fileName,\n    length: fileToAdd.byteLength\n  });\n\n  // generate hash file cd header\n  const newFileCDHeader = generateCDHeader({\n    crc32: newFileCRC322,\n    fileName,\n    offset: localFileHeaderOffset,\n    length: fileToAdd.byteLength\n  });\n  return [\n    new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)),\n    new Uint8Array(newFileCDHeader)\n  ];\n}\n\n/**\n * adds one file in the end of the archieve\n * @param zipUrl path to the file\n * @param fileToAdd new file body\n * @param fileName new file name\n */\nexport async function addOneFile(zipUrl: string, fileToAdd: ArrayBuffer, fileName: string) {\n  // init file handler\n  const provider = new NodeFile(zipUrl, 'a+');\n\n  const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);\n\n  let currentOffset = (await provider.stat()).bigsize;\n\n  // remember the new file local header start offset\n  const newFileOffset = currentOffset;\n\n  const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);\n\n  // write down the file local header\n  await provider.append(localPart);\n  currentOffset += BigInt(localPart.byteLength);\n\n  // add the file CD header to the CD\n  const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);\n\n  // remember the CD start offset\n  const newCDStartOffset = currentOffset;\n\n  // write down new CD\n  await provider.append(new Uint8Array(newCDBody));\n  currentOffset += BigInt(newCDBody.byteLength);\n\n  // remember where eocd starts\n  const eocdOffset = currentOffset;\n\n  const updatedEoCD = updateEoCD(\n    eocdBody,\n    oldEoCDinfo.offsets,\n    newCDStartOffset,\n    eocdOffset,\n    oldEoCDinfo.cdRecordsNumber + 1n\n  );\n\n  await provider.append(updatedEoCD);\n  currentOffset += BigInt(updatedEoCD.byteLength);\n}\n\n/**\n * creates zip archive with no compression\n * @note This is a node specific function that works on files\n * @param inputPath path where files for the achive are stored\n * @param outputPath path where zip archive will be placed\n */\nexport async function createZip(\n  inputPath: string,\n  outputPath: string,\n  createAdditionalData?: (\n    fileList: {fileName: string; localHeaderOffset: bigint}[]\n  ) => Promise<{path: string; file: ArrayBuffer}>\n) {\n  const fileIterator = getFileIterator(inputPath);\n\n  const resFile = new NodeFile(outputPath, 'w');\n  const fileList: {fileName: string; localHeaderOffset: bigint}[] = [];\n\n  const cdArray: ArrayBuffer[] = [];\n  for await (const file of fileIterator) {\n    await addFile(file, resFile, cdArray, fileList);\n  }\n  if (createAdditionalData) {\n    const additionaldata = await createAdditionalData(fileList);\n    await addFile(additionaldata, resFile, cdArray);\n  }\n  const cdOffset = (await resFile.stat()).bigsize;\n  const cd = concatenateArrayBuffers(...cdArray);\n  await resFile.append(new Uint8Array(cd));\n  const eoCDStart = (await resFile.stat()).bigsize;\n  await resFile.append(\n    new Uint8Array(\n      generateEoCD({recordsNumber: cdArray.length, cdSize: cd.byteLength, cdOffset, eoCDStart})\n    )\n  );\n}\n\n/**\n * Adds file to zip parts\n * @param file file to add\n * @param resFile zip file body\n * @param cdArray zip file central directory\n * @param fileList list of file offsets\n */\nasync function addFile(\n  file: {path: string; file: ArrayBuffer},\n  resFile: NodeFile,\n  cdArray: ArrayBuffer[],\n  fileList?: {fileName: string; localHeaderOffset: bigint}[]\n) {\n  const size = (await resFile.stat()).bigsize;\n  fileList?.push({fileName: file.path, localHeaderOffset: size});\n  const [localPart, cdHeaderPart] = await generateFileHeaders(file.path, file.file, size);\n  await resFile.append(localPart);\n  cdArray.push(toArrayBuffer(cdHeaderPart));\n}\n\n/**\n * creates iterator providing buffer with file content and path to every file in the input folder\n * @param inputPath path to the input folder\n * @returns iterator\n */\nexport function getFileIterator(\n  inputPath: string\n): AsyncIterable<{path: string; file: ArrayBuffer}> {\n  async function* iterable() {\n    const fileList = await getAllFiles(inputPath);\n    for (const filePath of fileList) {\n      const file = await (await fetchFile(path.join(inputPath, filePath))).arrayBuffer();\n      yield {path: filePath, file};\n    }\n  }\n  return iterable();\n}\n\n/**\n * creates a list of relative paths to all files in the provided folder\n * @param basePath path of the root folder\n * @param subfolder relative path from the root folder.\n * @returns list of paths\n */\nexport async function getAllFiles(\n  basePath: string,\n  subfolder: string = '',\n  fsPassed?: NodeFilesystem\n): Promise<string[]> {\n  const fs = fsPassed ? fsPassed : new NodeFilesystem({});\n  const files = await fs.readdir(pathJoin(basePath, subfolder));\n\n  const arrayOfFiles: string[] = [];\n\n  for (const file of files) {\n    const fullPath = pathJoin(basePath, subfolder, file);\n    if ((await fs.stat(fullPath)).isDirectory) {\n      const files = await getAllFiles(basePath, pathJoin(subfolder, file));\n      arrayOfFiles.push(...files);\n    } else {\n      arrayOfFiles.push(pathJoin(subfolder, file));\n    }\n  }\n\n  return arrayOfFiles;\n}\n\n/**\n * removes empty parts from path array and joins it\n * @param paths paths to join\n * @returns joined path\n */\nfunction pathJoin(...paths: string[]): string {\n  const resPaths: string[] = paths.filter((val) => val.length);\n  return path.join(...resPaths);\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {FileSystem, isBrowser, BlobFile, NodeFile} from '@loaders.gl/loader-utils';\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from '../parse-zip/cd-file-header';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {DeflateCompression} from '@loaders.gl/compression';\nimport {IndexedArchive} from './IndexedArchive';\nimport {readRange} from '../parse-zip/readable-file-utils';\n\nexport type CompressionHandler = (compressedFile: ArrayBuffer) => Promise<ArrayBuffer>;\n/** Handling different compression types in zip */\nexport const ZIP_COMPRESSION_HANDLERS: {[key: number]: CompressionHandler} = {\n  /** No compression */\n  0: async (compressedFile) => compressedFile,\n  /** Deflation */\n  8: async (compressedFile) => {\n    const compression = new DeflateCompression({raw: true});\n    const decompressedData = await compression.decompress(compressedFile);\n    return decompressedData;\n  }\n};\n\n/**\n * FileSystem adapter for a ZIP file\n * Holds a ReadableFile object that provides random access to archived files\n */\nexport class ZipFileSystem implements FileSystem {\n  /** File instance */\n  public file: ReadableFile | null = null;\n  public fileName?: string;\n  public archive: IndexedArchive | null = null;\n\n  /**\n   * Constructor\n   * @param file - instance of ReadableFile or file path string\n   */\n  constructor(file: ReadableFile | IndexedArchive | string | Blob | ArrayBuffer) {\n    // Try to open file in NodeJS\n    if (typeof file === 'string') {\n      this.fileName = file;\n      if (isBrowser) {\n        throw new Error('ZipFileSystem cannot open file paths in browser environments');\n      }\n      this.file = new NodeFile(file);\n    } else if (file instanceof Blob || file instanceof ArrayBuffer) {\n      this.file = new BlobFile(file);\n    } else if (file instanceof IndexedArchive) {\n      this.file = file.file;\n      this.archive = file;\n      this.fileName = file.fileName;\n    } else {\n      this.file = file;\n    }\n  }\n\n  /** Clean up resources */\n  async destroy() {\n    if (this.file) {\n      await this.file.close();\n    }\n  }\n\n  /**\n   * Get file names list from zip archive\n   * @returns array of file names\n   */\n  async readdir(): Promise<string[]> {\n    if (!this.file) {\n      throw new Error('No data detected in the zip archive');\n    }\n    const fileNames: string[] = [];\n    const zipCDIterator = makeZipCDHeaderIterator(this.file);\n    for await (const cdHeader of zipCDIterator) {\n      fileNames.push(cdHeader.fileName);\n    }\n    return fileNames;\n  }\n\n  /**\n   * Get file metadata\n   * @param filename - name of a file\n   * @returns central directory data\n   */\n  async stat(filename: string): Promise<ZipCDFileHeader & {size: number}> {\n    const cdFileHeader = await this.getCDFileHeader(filename);\n    return {...cdFileHeader, size: Number(cdFileHeader.uncompressedSize)};\n  }\n\n  /**\n   * Implementation of fetch against this file system\n   * @param filename - name of a file\n   * @returns - Response with file data\n   */\n  async fetch(filename: string): Promise<Response> {\n    if (this.fileName && filename.indexOf(this.fileName) === 0) {\n      filename = filename.substring(this.fileName.length + 1);\n    }\n\n    let uncompressedFile: ArrayBuffer;\n    if (this.archive) {\n      uncompressedFile = await this.archive.getFile(filename, 'http');\n    } else {\n      if (!this.file) {\n        throw new Error('No data detected in the zip archive');\n      }\n      const cdFileHeader = await this.getCDFileHeader(filename);\n      const localFileHeader = await parseZipLocalFileHeader(\n        cdFileHeader.localHeaderOffset,\n        this.file\n      );\n      if (!localFileHeader) {\n        throw new Error('Local file header has not been found in the zip archive`');\n      }\n\n      const compressionHandler =\n        ZIP_COMPRESSION_HANDLERS[localFileHeader.compressionMethod.toString()];\n      if (!compressionHandler) {\n        throw Error('Only Deflation compression is supported');\n      }\n\n      const compressedFile = await readRange(\n        this.file,\n        localFileHeader.fileDataOffset,\n        localFileHeader.fileDataOffset + localFileHeader.compressedSize\n      );\n\n      uncompressedFile = await compressionHandler(compressedFile);\n    }\n\n    const response = new Response(uncompressedFile);\n    Object.defineProperty(response, 'url', {\n      value: filename ? `${this.fileName || ''}/${filename}` : this.fileName || ''\n    });\n    return response;\n  }\n\n  /**\n   * Get central directory file header\n   * @param filename - name of a file\n   * @returns central directory file header\n   */\n  private async getCDFileHeader(filename: string): Promise<ZipCDFileHeader> {\n    if (!this.file) {\n      throw new Error('No data detected in the zip archive');\n    }\n    const zipCDIterator = makeZipCDHeaderIterator(this.file);\n    let result: ZipCDFileHeader | null = null;\n    for await (const cdHeader of zipCDIterator) {\n      if (cdHeader.fileName === filename) {\n        result = cdHeader;\n        break;\n      }\n    }\n    if (!result) {\n      throw new Error('File has not been found in the zip archive');\n    }\n    return result;\n  }\n}\n", "import type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {ZipFileSystem} from './zip-filesystem';\n\n/**\n * Abstract class for fetching indexed archive formats (SLPK, 3TZ). Those types of zip archive has\n * a hash file inside that allows to increase reading speed\n */\nexport abstract class IndexedArchive {\n  public file: ReadableFile;\n  public fileName?: string;\n\n  /**\n   * Constructor\n   * @param fileProvider - readable file instance for random access\n   * @param hashTable - pre-loaded hashTable. If presented, getFile will skip reading the hash file\n   * @param fileName - name of the archive. It is used to add to an URL of a loader context\n   */\n  constructor(file: ReadableFile, hashTable?: Record<string, bigint>, fileName?: string) {\n    this.file = file;\n    this.fileName = fileName;\n  }\n\n  /**\n   * Get internal file from the archive\n   * @param path - path to the file\n   * @param mode - path mode - the logic is implemented in subclasses\n   */\n  abstract getFile(path: string, mode?: string): Promise<ArrayBuffer>;\n\n  /**\n   * Get file as from order ZIP arhive without using the hash file\n   * @param filename - path to the internal file\n   * @returns\n   */\n  protected async getFileWithoutHash(filename: string): Promise<ArrayBuffer> {\n    const zipFS = new ZipFileSystem(this.file);\n    const response = await zipFS.fetch(filename);\n    return await response.arrayBuffer();\n  }\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {concatenateArrayBuffers, concatenateArrayBuffersFromArray} from '@loaders.gl/loader-utils';\nimport type {ReadableFile} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n  const dataView = new DataView(arrayBuffer);\n\n  const hashMap: Record<string, bigint> = {};\n\n  for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n    const offset = dataView.getBigUint64(i + 16, true);\n    const hash = bufferToHex(arrayBuffer, i, 16);\n    hashMap[hash] = offset;\n  }\n\n  return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n  // buffer is an ArrayBuffer\n  return [...new Uint8Array(buffer, start, length)]\n    .map((x) => x.toString(16).padStart(2, '0'))\n    .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - readable archive source\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n  fileProvider: ReadableFile\n): Promise<Record<string, bigint>> {\n  const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n  return getHashTable(zipCDIterator);\n}\n\n/**\n * creates hash table from file offset iterator\n * @param zipCDIterator iterator to use\n * @returns hash table\n */\nexport async function getHashTable(\n  zipCDIterator: AsyncIterable<ZipCDFileHeader>\n): Promise<Record<string, bigint>> {\n  const md5Hash = new MD5Hash();\n  const textEncoder = new TextEncoder();\n\n  const hashTable: Record<string, bigint> = {};\n\n  for await (const cdHeader of zipCDIterator) {\n    const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n    const arrayBuffer = textEncoder.encode(filename).buffer;\n    const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n    hashTable[md5] = cdHeader.localHeaderOffset;\n  }\n\n  return hashTable;\n}\n\n/** item of the file offset list */\ntype FileListItem = {\n  fileName: string;\n  localHeaderOffset: bigint;\n};\n\n/**\n * creates hash file that later can be added to the SLPK archive\n * @param zipCDIterator iterator to use\n * @returns ArrayBuffer containing hash file\n */\nexport async function composeHashFile(\n  zipCDIterator: AsyncIterable<FileListItem> | Iterable<FileListItem>\n): Promise<ArrayBuffer> {\n  const md5Hash = new MD5Hash();\n  const textEncoder = new TextEncoder();\n\n  const hashArray: ArrayBuffer[] = [];\n\n  for await (const cdHeader of zipCDIterator) {\n    let filename = cdHeader.fileName.split('\\\\').join('/');\n    // I3S edge case. All files should be lower case by spec. However, ArcGIS\n    // and official i3s_converter https://github.com/Esri/i3s-spec/blob/master/i3s_converter/i3s_converter_ReadMe.md\n    // expect `3dSceneLayer.json.gz` in camel case\n    if (filename !== '3dSceneLayer.json.gz') {\n      filename = filename.toLocaleLowerCase();\n    }\n    const arrayBuffer = textEncoder.encode(filename).buffer;\n    const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n    hashArray.push(\n      concatenateArrayBuffers(hexStringToBuffer(md5), bigintToBuffer(cdHeader.localHeaderOffset))\n    );\n  }\n\n  const bufferArray = hashArray.sort(compareHashes);\n\n  return concatenateArrayBuffersFromArray(bufferArray);\n}\n\n/**\n * Function to compare md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md\n * @param arrA first hash to compare\n * @param arrB second hash to compare\n * @returns 0 if equal, negative number if a<b, pozitive if a>b\n */\nfunction compareHashes(arrA: ArrayBuffer, arrB: ArrayBuffer): number {\n  const a = new BigUint64Array(arrA);\n  const b = new BigUint64Array(arrB);\n\n  return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);\n}\n\n/**\n * converts hex string to buffer\n * @param str hex string to convert\n * @returns conversion result\n */\nfunction hexStringToBuffer(str: string): ArrayBuffer {\n  const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));\n  return new Uint8Array(byteArray ?? new Array(16)).buffer;\n}\n\n/**\n * converts bigint to buffer\n * @param n bigint to convert\n * @returns convertion result\n */\nfunction bigintToBuffer(n: bigint): ArrayBuffer {\n  return new BigUint64Array([n]).buffer;\n}\n"],
  "mappings": "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",
  "names": ["signature", "JSZip", "import_jszip", "VERSION", "JSZip", "import_loader_utils", "import_loader_utils", "import_loader_utils", "signature", "import_loader_utils", "signature", "ZIP_HEADER_FIELDS", "import_loader_utils", "files", "import_loader_utils", "import_crypto", "import_loader_utils"]
}
