{"version":3,"file":"file_form.min.js","sources":["../../../frontend/src/auto_init_file_forms.ts","../../../frontend/node_modules/mime/dist/types/standard.js","../../../frontend/node_modules/mime/dist/src/Mime.js","../../../frontend/node_modules/mime/dist/src/index_lite.js","../../../frontend/node_modules/picomatch/lib/constants.js","../../../frontend/node_modules/picomatch/lib/utils.js","../../../frontend/node_modules/picomatch/lib/scan.js","../../../frontend/node_modules/picomatch/lib/parse.js","../../../frontend/node_modules/picomatch/lib/picomatch.js","../../../frontend/node_modules/picomatch/posix.js","../../../frontend/src/accepted_file_types.ts","../../../frontend/src/drop_area.ts","../../../frontend/node_modules/escape-html/index.js","../../../frontend/src/util.ts","../../../frontend/src/render_upload_file.ts","../../../frontend/src/uploads/base_upload.ts","../../../frontend/node_modules/url-join/lib/url-join.js","../../../frontend/src/uploads/s3_utils.ts","../../../frontend/src/uploads/s3_upload.ts","../../../frontend/node_modules/tus-js-client/lib/error.js","../../../frontend/node_modules/js-base64/base64.mjs","../../../frontend/node_modules/url-parse/index.js","../../../frontend/node_modules/requires-port/index.js","../../../frontend/node_modules/querystringify/index.js","../../../frontend/node_modules/tus-js-client/lib/upload.js","../../../frontend/node_modules/tus-js-client/lib/uuid.js","../../../frontend/node_modules/tus-js-client/lib/browser/isReactNative.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/FileSource.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/isCordova.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/readAsByteArray.js","../../../frontend/node_modules/tus-js-client/lib/browser/sources/StreamSource.js","../../../frontend/node_modules/tus-js-client/lib/browser/httpStack.js","../../../frontend/node_modules/tus-js-client/lib/browser/urlStorage.js","../../../frontend/node_modules/tus-js-client/lib/browser/index.js","../../../frontend/node_modules/tus-js-client/lib/browser/fileReader.js","../../../frontend/node_modules/tus-js-client/lib/browser/uriToBlob.js","../../../frontend/node_modules/tus-js-client/lib/noopUrlStorage.js","../../../frontend/node_modules/tus-js-client/lib/browser/fileSignature.js","../../../frontend/src/uploads/tus_utils.ts","../../../frontend/src/uploads/tus_upload.ts","../../../frontend/src/uploads/uploaded_file.ts","../../../frontend/src/file_field.ts","../../../frontend/src/init_upload_fields.ts","../../../frontend/src/file_form.ts","../../../frontend/src/init_form_set.ts"],"sourcesContent":["const findForm = (element: Element): HTMLElement | null => {\n  const parent = element.parentElement;\n\n  if (!parent) {\n    return null;\n  }\n\n  if (parent.tagName === \"FORM\") {\n    return parent;\n  }\n\n  return findForm(parent);\n};\n\nconst unique = (values: unknown[]): unknown[] =>\n  Array.from(new Set(values).values());\n\ndeclare const window: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nconst autoInitFileForms = (): void => {\n  const initUploadFields = window.initUploadFields as () => void; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\n\n  const forms = unique(\n    Array.from(document.querySelectorAll(\".dff-uploader\")).map(findForm)\n  );\n  forms.forEach(initUploadFields);\n};\n\nexport default autoInitFileForms;\n","const types = {\n    'application/andrew-inset': ['ez'],\n    'application/appinstaller': ['appinstaller'],\n    'application/applixware': ['aw'],\n    'application/appx': ['appx'],\n    'application/appxbundle': ['appxbundle'],\n    'application/atom+xml': ['atom'],\n    'application/atomcat+xml': ['atomcat'],\n    'application/atomdeleted+xml': ['atomdeleted'],\n    'application/atomsvc+xml': ['atomsvc'],\n    'application/atsc-dwd+xml': ['dwd'],\n    'application/atsc-held+xml': ['held'],\n    'application/atsc-rsat+xml': ['rsat'],\n    'application/automationml-aml+xml': ['aml'],\n    'application/automationml-amlx+zip': ['amlx'],\n    'application/bdoc': ['bdoc'],\n    'application/calendar+xml': ['xcs'],\n    'application/ccxml+xml': ['ccxml'],\n    'application/cdfx+xml': ['cdfx'],\n    'application/cdmi-capability': ['cdmia'],\n    'application/cdmi-container': ['cdmic'],\n    'application/cdmi-domain': ['cdmid'],\n    'application/cdmi-object': ['cdmio'],\n    'application/cdmi-queue': ['cdmiq'],\n    'application/cpl+xml': ['cpl'],\n    'application/cu-seeme': ['cu'],\n    'application/cwl': ['cwl'],\n    'application/dash+xml': ['mpd'],\n    'application/dash-patch+xml': ['mpp'],\n    'application/davmount+xml': ['davmount'],\n    'application/dicom': ['dcm'],\n    'application/docbook+xml': ['dbk'],\n    'application/dssc+der': ['dssc'],\n    'application/dssc+xml': ['xdssc'],\n    'application/ecmascript': ['ecma'],\n    'application/emma+xml': ['emma'],\n    'application/emotionml+xml': ['emotionml'],\n    'application/epub+zip': ['epub'],\n    'application/exi': ['exi'],\n    'application/express': ['exp'],\n    'application/fdf': ['fdf'],\n    'application/fdt+xml': ['fdt'],\n    'application/font-tdpfr': ['pfr'],\n    'application/geo+json': ['geojson'],\n    'application/gml+xml': ['gml'],\n    'application/gpx+xml': ['gpx'],\n    'application/gxf': ['gxf'],\n    'application/gzip': ['gz'],\n    'application/hjson': ['hjson'],\n    'application/hyperstudio': ['stk'],\n    'application/inkml+xml': ['ink', 'inkml'],\n    'application/ipfix': ['ipfix'],\n    'application/its+xml': ['its'],\n    'application/java-archive': ['jar', 'war', 'ear'],\n    'application/java-serialized-object': ['ser'],\n    'application/java-vm': ['class'],\n    'application/javascript': ['*js'],\n    'application/json': ['json', 'map'],\n    'application/json5': ['json5'],\n    'application/jsonml+json': ['jsonml'],\n    'application/ld+json': ['jsonld'],\n    'application/lgr+xml': ['lgr'],\n    'application/lost+xml': ['lostxml'],\n    'application/mac-binhex40': ['hqx'],\n    'application/mac-compactpro': ['cpt'],\n    'application/mads+xml': ['mads'],\n    'application/manifest+json': ['webmanifest'],\n    'application/marc': ['mrc'],\n    'application/marcxml+xml': ['mrcx'],\n    'application/mathematica': ['ma', 'nb', 'mb'],\n    'application/mathml+xml': ['mathml'],\n    'application/mbox': ['mbox'],\n    'application/media-policy-dataset+xml': ['mpf'],\n    'application/mediaservercontrol+xml': ['mscml'],\n    'application/metalink+xml': ['metalink'],\n    'application/metalink4+xml': ['meta4'],\n    'application/mets+xml': ['mets'],\n    'application/mmt-aei+xml': ['maei'],\n    'application/mmt-usd+xml': ['musd'],\n    'application/mods+xml': ['mods'],\n    'application/mp21': ['m21', 'mp21'],\n    'application/mp4': ['*mp4', '*mpg4', 'mp4s', 'm4p'],\n    'application/msix': ['msix'],\n    'application/msixbundle': ['msixbundle'],\n    'application/msword': ['doc', 'dot'],\n    'application/mxf': ['mxf'],\n    'application/n-quads': ['nq'],\n    'application/n-triples': ['nt'],\n    'application/node': ['cjs'],\n    'application/octet-stream': [\n        'bin',\n        'dms',\n        'lrf',\n        'mar',\n        'so',\n        'dist',\n        'distz',\n        'pkg',\n        'bpk',\n        'dump',\n        'elc',\n        'deploy',\n        'exe',\n        'dll',\n        'deb',\n        'dmg',\n        'iso',\n        'img',\n        'msi',\n        'msp',\n        'msm',\n        'buffer',\n    ],\n    'application/oda': ['oda'],\n    'application/oebps-package+xml': ['opf'],\n    'application/ogg': ['ogx'],\n    'application/omdoc+xml': ['omdoc'],\n    'application/onenote': [\n        'onetoc',\n        'onetoc2',\n        'onetmp',\n        'onepkg',\n        'one',\n        'onea',\n    ],\n    'application/oxps': ['oxps'],\n    'application/p2p-overlay+xml': ['relo'],\n    'application/patch-ops-error+xml': ['xer'],\n    'application/pdf': ['pdf'],\n    'application/pgp-encrypted': ['pgp'],\n    'application/pgp-keys': ['asc'],\n    'application/pgp-signature': ['sig', '*asc'],\n    'application/pics-rules': ['prf'],\n    'application/pkcs10': ['p10'],\n    'application/pkcs7-mime': ['p7m', 'p7c'],\n    'application/pkcs7-signature': ['p7s'],\n    'application/pkcs8': ['p8'],\n    'application/pkix-attr-cert': ['ac'],\n    'application/pkix-cert': ['cer'],\n    'application/pkix-crl': ['crl'],\n    'application/pkix-pkipath': ['pkipath'],\n    'application/pkixcmp': ['pki'],\n    'application/pls+xml': ['pls'],\n    'application/postscript': ['ai', 'eps', 'ps'],\n    'application/provenance+xml': ['provx'],\n    'application/pskc+xml': ['pskcxml'],\n    'application/raml+yaml': ['raml'],\n    'application/rdf+xml': ['rdf', 'owl'],\n    'application/reginfo+xml': ['rif'],\n    'application/relax-ng-compact-syntax': ['rnc'],\n    'application/resource-lists+xml': ['rl'],\n    'application/resource-lists-diff+xml': ['rld'],\n    'application/rls-services+xml': ['rs'],\n    'application/route-apd+xml': ['rapd'],\n    'application/route-s-tsid+xml': ['sls'],\n    'application/route-usd+xml': ['rusd'],\n    'application/rpki-ghostbusters': ['gbr'],\n    'application/rpki-manifest': ['mft'],\n    'application/rpki-roa': ['roa'],\n    'application/rsd+xml': ['rsd'],\n    'application/rss+xml': ['rss'],\n    'application/rtf': ['rtf'],\n    'application/sbml+xml': ['sbml'],\n    'application/scvp-cv-request': ['scq'],\n    'application/scvp-cv-response': ['scs'],\n    'application/scvp-vp-request': ['spq'],\n    'application/scvp-vp-response': ['spp'],\n    'application/sdp': ['sdp'],\n    'application/senml+xml': ['senmlx'],\n    'application/sensml+xml': ['sensmlx'],\n    'application/set-payment-initiation': ['setpay'],\n    'application/set-registration-initiation': ['setreg'],\n    'application/shf+xml': ['shf'],\n    'application/sieve': ['siv', 'sieve'],\n    'application/smil+xml': ['smi', 'smil'],\n    'application/sparql-query': ['rq'],\n    'application/sparql-results+xml': ['srx'],\n    'application/sql': ['sql'],\n    'application/srgs': ['gram'],\n    'application/srgs+xml': ['grxml'],\n    'application/sru+xml': ['sru'],\n    'application/ssdl+xml': ['ssdl'],\n    'application/ssml+xml': ['ssml'],\n    'application/swid+xml': ['swidtag'],\n    'application/tei+xml': ['tei', 'teicorpus'],\n    'application/thraud+xml': ['tfi'],\n    'application/timestamped-data': ['tsd'],\n    'application/toml': ['toml'],\n    'application/trig': ['trig'],\n    'application/ttml+xml': ['ttml'],\n    'application/ubjson': ['ubj'],\n    'application/urc-ressheet+xml': ['rsheet'],\n    'application/urc-targetdesc+xml': ['td'],\n    'application/voicexml+xml': ['vxml'],\n    'application/wasm': ['wasm'],\n    'application/watcherinfo+xml': ['wif'],\n    'application/widget': ['wgt'],\n    'application/winhlp': ['hlp'],\n    'application/wsdl+xml': ['wsdl'],\n    'application/wspolicy+xml': ['wspolicy'],\n    'application/xaml+xml': ['xaml'],\n    'application/xcap-att+xml': ['xav'],\n    'application/xcap-caps+xml': ['xca'],\n    'application/xcap-diff+xml': ['xdf'],\n    'application/xcap-el+xml': ['xel'],\n    'application/xcap-ns+xml': ['xns'],\n    'application/xenc+xml': ['xenc'],\n    'application/xfdf': ['xfdf'],\n    'application/xhtml+xml': ['xhtml', 'xht'],\n    'application/xliff+xml': ['xlf'],\n    'application/xml': ['xml', 'xsl', 'xsd', 'rng'],\n    'application/xml-dtd': ['dtd'],\n    'application/xop+xml': ['xop'],\n    'application/xproc+xml': ['xpl'],\n    'application/xslt+xml': ['*xsl', 'xslt'],\n    'application/xspf+xml': ['xspf'],\n    'application/xv+xml': ['mxml', 'xhvml', 'xvml', 'xvm'],\n    'application/yang': ['yang'],\n    'application/yin+xml': ['yin'],\n    'application/zip': ['zip'],\n    'application/zip+dotlottie': ['lottie'],\n    'audio/3gpp': ['*3gpp'],\n    'audio/aac': ['adts', 'aac'],\n    'audio/adpcm': ['adp'],\n    'audio/amr': ['amr'],\n    'audio/basic': ['au', 'snd'],\n    'audio/midi': ['mid', 'midi', 'kar', 'rmi'],\n    'audio/mobile-xmf': ['mxmf'],\n    'audio/mp3': ['*mp3'],\n    'audio/mp4': ['m4a', 'mp4a', 'm4b'],\n    'audio/mpeg': ['mpga', 'mp2', 'mp2a', 'mp3', 'm2a', 'm3a'],\n    'audio/ogg': ['oga', 'ogg', 'spx', 'opus'],\n    'audio/s3m': ['s3m'],\n    'audio/silk': ['sil'],\n    'audio/wav': ['wav'],\n    'audio/wave': ['*wav'],\n    'audio/webm': ['weba'],\n    'audio/xm': ['xm'],\n    'font/collection': ['ttc'],\n    'font/otf': ['otf'],\n    'font/ttf': ['ttf'],\n    'font/woff': ['woff'],\n    'font/woff2': ['woff2'],\n    'image/aces': ['exr'],\n    'image/apng': ['apng'],\n    'image/avci': ['avci'],\n    'image/avcs': ['avcs'],\n    'image/avif': ['avif'],\n    'image/bmp': ['bmp', 'dib'],\n    'image/cgm': ['cgm'],\n    'image/dicom-rle': ['drle'],\n    'image/dpx': ['dpx'],\n    'image/emf': ['emf'],\n    'image/fits': ['fits'],\n    'image/g3fax': ['g3'],\n    'image/gif': ['gif'],\n    'image/heic': ['heic'],\n    'image/heic-sequence': ['heics'],\n    'image/heif': ['heif'],\n    'image/heif-sequence': ['heifs'],\n    'image/hej2k': ['hej2'],\n    'image/ief': ['ief'],\n    'image/jaii': ['jaii'],\n    'image/jais': ['jais'],\n    'image/jls': ['jls'],\n    'image/jp2': ['jp2', 'jpg2'],\n    'image/jpeg': ['jpg', 'jpeg', 'jpe'],\n    'image/jph': ['jph'],\n    'image/jphc': ['jhc'],\n    'image/jpm': ['jpm', 'jpgm'],\n    'image/jpx': ['jpx', 'jpf'],\n    'image/jxl': ['jxl'],\n    'image/jxr': ['jxr'],\n    'image/jxra': ['jxra'],\n    'image/jxrs': ['jxrs'],\n    'image/jxs': ['jxs'],\n    'image/jxsc': ['jxsc'],\n    'image/jxsi': ['jxsi'],\n    'image/jxss': ['jxss'],\n    'image/ktx': ['ktx'],\n    'image/ktx2': ['ktx2'],\n    'image/pjpeg': ['jfif'],\n    'image/png': ['png'],\n    'image/sgi': ['sgi'],\n    'image/svg+xml': ['svg', 'svgz'],\n    'image/t38': ['t38'],\n    'image/tiff': ['tif', 'tiff'],\n    'image/tiff-fx': ['tfx'],\n    'image/webp': ['webp'],\n    'image/wmf': ['wmf'],\n    'message/disposition-notification': ['disposition-notification'],\n    'message/global': ['u8msg'],\n    'message/global-delivery-status': ['u8dsn'],\n    'message/global-disposition-notification': ['u8mdn'],\n    'message/global-headers': ['u8hdr'],\n    'message/rfc822': ['eml', 'mime', 'mht', 'mhtml'],\n    'model/3mf': ['3mf'],\n    'model/gltf+json': ['gltf'],\n    'model/gltf-binary': ['glb'],\n    'model/iges': ['igs', 'iges'],\n    'model/jt': ['jt'],\n    'model/mesh': ['msh', 'mesh', 'silo'],\n    'model/mtl': ['mtl'],\n    'model/obj': ['obj'],\n    'model/prc': ['prc'],\n    'model/step': ['step', 'stp', 'stpnc', 'p21', '210'],\n    'model/step+xml': ['stpx'],\n    'model/step+zip': ['stpz'],\n    'model/step-xml+zip': ['stpxz'],\n    'model/stl': ['stl'],\n    'model/u3d': ['u3d'],\n    'model/vrml': ['wrl', 'vrml'],\n    'model/x3d+binary': ['*x3db', 'x3dbz'],\n    'model/x3d+fastinfoset': ['x3db'],\n    'model/x3d+vrml': ['*x3dv', 'x3dvz'],\n    'model/x3d+xml': ['x3d', 'x3dz'],\n    'model/x3d-vrml': ['x3dv'],\n    'text/cache-manifest': ['appcache', 'manifest'],\n    'text/calendar': ['ics', 'ifb'],\n    'text/coffeescript': ['coffee', 'litcoffee'],\n    'text/css': ['css'],\n    'text/csv': ['csv'],\n    'text/html': ['html', 'htm', 'shtml'],\n    'text/jade': ['jade'],\n    'text/javascript': ['js', 'mjs'],\n    'text/jsx': ['jsx'],\n    'text/less': ['less'],\n    'text/markdown': ['md', 'markdown'],\n    'text/mathml': ['mml'],\n    'text/mdx': ['mdx'],\n    'text/n3': ['n3'],\n    'text/plain': ['txt', 'text', 'conf', 'def', 'list', 'log', 'in', 'ini'],\n    'text/richtext': ['rtx'],\n    'text/rtf': ['*rtf'],\n    'text/sgml': ['sgml', 'sgm'],\n    'text/shex': ['shex'],\n    'text/slim': ['slim', 'slm'],\n    'text/spdx': ['spdx'],\n    'text/stylus': ['stylus', 'styl'],\n    'text/tab-separated-values': ['tsv'],\n    'text/troff': ['t', 'tr', 'roff', 'man', 'me', 'ms'],\n    'text/turtle': ['ttl'],\n    'text/uri-list': ['uri', 'uris', 'urls'],\n    'text/vcard': ['vcard'],\n    'text/vtt': ['vtt'],\n    'text/wgsl': ['wgsl'],\n    'text/xml': ['*xml'],\n    'text/yaml': ['yaml', 'yml'],\n    'video/3gpp': ['3gp', '3gpp'],\n    'video/3gpp2': ['3g2'],\n    'video/h261': ['h261'],\n    'video/h263': ['h263'],\n    'video/h264': ['h264'],\n    'video/iso.segment': ['m4s'],\n    'video/jpeg': ['jpgv'],\n    'video/jpm': ['*jpm', '*jpgm'],\n    'video/mj2': ['mj2', 'mjp2'],\n    'video/mp2t': ['ts', 'm2t', 'm2ts', 'mts'],\n    'video/mp4': ['mp4', 'mp4v', 'mpg4'],\n    'video/mpeg': ['mpeg', 'mpg', 'mpe', 'm1v', 'm2v'],\n    'video/ogg': ['ogv'],\n    'video/quicktime': ['qt', 'mov'],\n    'video/webm': ['webm'],\n};\nObject.freeze(types);\nexport default types;\n","var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n};\nvar _Mime_extensionToType, _Mime_typeToExtension, _Mime_typeToExtensions;\nclass Mime {\n    constructor(...args) {\n        _Mime_extensionToType.set(this, new Map());\n        _Mime_typeToExtension.set(this, new Map());\n        _Mime_typeToExtensions.set(this, new Map());\n        for (const arg of args) {\n            this.define(arg);\n        }\n    }\n    define(typeMap, force = false) {\n        for (let [type, extensions] of Object.entries(typeMap)) {\n            type = type.toLowerCase();\n            extensions = extensions.map((ext) => ext.toLowerCase());\n            if (!__classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").has(type)) {\n                __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").set(type, new Set());\n            }\n            const allExtensions = __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type);\n            let first = true;\n            for (let extension of extensions) {\n                const starred = extension.startsWith('*');\n                extension = starred ? extension.slice(1) : extension;\n                allExtensions?.add(extension);\n                if (first) {\n                    __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").set(type, extension);\n                }\n                first = false;\n                if (starred)\n                    continue;\n                const currentType = __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(extension);\n                if (currentType && currentType != type && !force) {\n                    throw new Error(`\"${type} -> ${extension}\" conflicts with \"${currentType} -> ${extension}\". Pass \\`force=true\\` to override this definition.`);\n                }\n                __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").set(extension, type);\n            }\n        }\n        return this;\n    }\n    getType(path) {\n        if (typeof path !== 'string')\n            return null;\n        const last = path.replace(/^.*[/\\\\]/s, '').toLowerCase();\n        const ext = last.replace(/^.*\\./s, '').toLowerCase();\n        const hasPath = last.length < path.length;\n        const hasDot = ext.length < last.length - 1;\n        if (!hasDot && hasPath)\n            return null;\n        return __classPrivateFieldGet(this, _Mime_extensionToType, \"f\").get(ext) ?? null;\n    }\n    getExtension(type) {\n        if (typeof type !== 'string')\n            return null;\n        type = type?.split?.(';')[0];\n        return ((type && __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\").get(type.trim().toLowerCase())) ?? null);\n    }\n    getAllExtensions(type) {\n        if (typeof type !== 'string')\n            return null;\n        return __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").get(type.toLowerCase()) ?? null;\n    }\n    _freeze() {\n        this.define = () => {\n            throw new Error('define() not allowed for built-in Mime objects. See https://github.com/broofa/mime/blob/main/README.md#custom-mime-instances');\n        };\n        Object.freeze(this);\n        for (const extensions of __classPrivateFieldGet(this, _Mime_typeToExtensions, \"f\").values()) {\n            Object.freeze(extensions);\n        }\n        return this;\n    }\n    _getTestState() {\n        return {\n            types: __classPrivateFieldGet(this, _Mime_extensionToType, \"f\"),\n            extensions: __classPrivateFieldGet(this, _Mime_typeToExtension, \"f\"),\n        };\n    }\n}\n_Mime_extensionToType = new WeakMap(), _Mime_typeToExtension = new WeakMap(), _Mime_typeToExtensions = new WeakMap();\nexport default Mime;\n","import standardTypes from '../types/standard.js';\nimport Mime from './Mime.js';\nexport { default as Mime } from './Mime.js';\nexport default new Mime(standardTypes)._freeze();\n","'use strict';\n\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\nconst SEP = '/';\n\nconst POSIX_CHARS = {\n  DOT_LITERAL,\n  PLUS_LITERAL,\n  QMARK_LITERAL,\n  SLASH_LITERAL,\n  ONE_CHAR,\n  QMARK,\n  END_ANCHOR,\n  DOTS_SLASH,\n  NO_DOT,\n  NO_DOTS,\n  NO_DOT_SLASH,\n  NO_DOTS_SLASH,\n  QMARK_NO_DOT,\n  STAR,\n  START_ANCHOR,\n  SEP\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n  ...POSIX_CHARS,\n\n  SLASH_LITERAL: `[${WIN_SLASH}]`,\n  QMARK: WIN_NO_SLASH,\n  STAR: `${WIN_NO_SLASH}*?`,\n  DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n  NO_DOT: `(?!${DOT_LITERAL})`,\n  NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n  NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n  NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n  QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n  START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n  END_ANCHOR: `(?:[${WIN_SLASH}]|$)`,\n  SEP: '\\\\'\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n  alnum: 'a-zA-Z0-9',\n  alpha: 'a-zA-Z',\n  ascii: '\\\\x00-\\\\x7F',\n  blank: ' \\\\t',\n  cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n  digit: '0-9',\n  graph: '\\\\x21-\\\\x7E',\n  lower: 'a-z',\n  print: '\\\\x20-\\\\x7E ',\n  punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n  space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n  upper: 'A-Z',\n  word: 'A-Za-z0-9_',\n  xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n  MAX_LENGTH: 1024 * 64,\n  POSIX_REGEX_SOURCE,\n\n  // regular expressions\n  REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n  REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n  REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n  REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n  REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n  REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n  // Replace globs with equivalent patterns to reduce parsing time.\n  REPLACEMENTS: {\n    __proto__: null,\n    '***': '*',\n    '**/**': '**',\n    '**/**/**': '**'\n  },\n\n  // Digits\n  CHAR_0: 48, /* 0 */\n  CHAR_9: 57, /* 9 */\n\n  // Alphabet chars.\n  CHAR_UPPERCASE_A: 65, /* A */\n  CHAR_LOWERCASE_A: 97, /* a */\n  CHAR_UPPERCASE_Z: 90, /* Z */\n  CHAR_LOWERCASE_Z: 122, /* z */\n\n  CHAR_LEFT_PARENTHESES: 40, /* ( */\n  CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n  CHAR_ASTERISK: 42, /* * */\n\n  // Non-alphabetic chars.\n  CHAR_AMPERSAND: 38, /* & */\n  CHAR_AT: 64, /* @ */\n  CHAR_BACKWARD_SLASH: 92, /* \\ */\n  CHAR_CARRIAGE_RETURN: 13, /* \\r */\n  CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n  CHAR_COLON: 58, /* : */\n  CHAR_COMMA: 44, /* , */\n  CHAR_DOT: 46, /* . */\n  CHAR_DOUBLE_QUOTE: 34, /* \" */\n  CHAR_EQUAL: 61, /* = */\n  CHAR_EXCLAMATION_MARK: 33, /* ! */\n  CHAR_FORM_FEED: 12, /* \\f */\n  CHAR_FORWARD_SLASH: 47, /* / */\n  CHAR_GRAVE_ACCENT: 96, /* ` */\n  CHAR_HASH: 35, /* # */\n  CHAR_HYPHEN_MINUS: 45, /* - */\n  CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n  CHAR_LEFT_CURLY_BRACE: 123, /* { */\n  CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n  CHAR_LINE_FEED: 10, /* \\n */\n  CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n  CHAR_PERCENT: 37, /* % */\n  CHAR_PLUS: 43, /* + */\n  CHAR_QUESTION_MARK: 63, /* ? */\n  CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n  CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n  CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n  CHAR_SEMICOLON: 59, /* ; */\n  CHAR_SINGLE_QUOTE: 39, /* ' */\n  CHAR_SPACE: 32, /*   */\n  CHAR_TAB: 9, /* \\t */\n  CHAR_UNDERSCORE: 95, /* _ */\n  CHAR_VERTICAL_LINE: 124, /* | */\n  CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n  /**\n   * Create EXTGLOB_CHARS\n   */\n\n  extglobChars(chars) {\n    return {\n      '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n      '?': { type: 'qmark', open: '(?:', close: ')?' },\n      '+': { type: 'plus', open: '(?:', close: ')+' },\n      '*': { type: 'star', open: '(?:', close: ')*' },\n      '@': { type: 'at', open: '(?:', close: ')' }\n    };\n  },\n\n  /**\n   * Create GLOB_CHARS\n   */\n\n  globChars(win32) {\n    return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n  }\n};\n","/*global navigator*/\n'use strict';\n\nconst {\n  REGEX_BACKSLASH,\n  REGEX_REMOVE_BACKSLASH,\n  REGEX_SPECIAL_CHARS,\n  REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.isWindows = () => {\n  if (typeof navigator !== 'undefined' && navigator.platform) {\n    const platform = navigator.platform.toLowerCase();\n    return platform === 'win32' || platform === 'windows';\n  }\n\n  if (typeof process !== 'undefined' && process.platform) {\n    return process.platform === 'win32';\n  }\n\n  return false;\n};\n\nexports.removeBackslashes = str => {\n  return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n    return match === '\\\\' ? '' : match;\n  });\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n  const idx = input.lastIndexOf(char, lastIdx);\n  if (idx === -1) return input;\n  if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n  return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n  let output = input;\n  if (output.startsWith('./')) {\n    output = output.slice(2);\n    state.prefix = './';\n  }\n  return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n  const prepend = options.contains ? '' : '^';\n  const append = options.contains ? '' : '$';\n\n  let output = `${prepend}(?:${input})${append}`;\n  if (state.negated === true) {\n    output = `(?:^(?!${output}).*$)`;\n  }\n  return output;\n};\n\nexports.basename = (path, { windows } = {}) => {\n  const segs = path.split(windows ? /[\\\\/]/ : '/');\n  const last = segs[segs.length - 1];\n\n  if (last === '') {\n    return segs[segs.length - 2];\n  }\n\n  return last;\n};\n","'use strict';\n\nconst utils = require('./utils');\nconst {\n  CHAR_ASTERISK,             /* * */\n  CHAR_AT,                   /* @ */\n  CHAR_BACKWARD_SLASH,       /* \\ */\n  CHAR_COMMA,                /* , */\n  CHAR_DOT,                  /* . */\n  CHAR_EXCLAMATION_MARK,     /* ! */\n  CHAR_FORWARD_SLASH,        /* / */\n  CHAR_LEFT_CURLY_BRACE,     /* { */\n  CHAR_LEFT_PARENTHESES,     /* ( */\n  CHAR_LEFT_SQUARE_BRACKET,  /* [ */\n  CHAR_PLUS,                 /* + */\n  CHAR_QUESTION_MARK,        /* ? */\n  CHAR_RIGHT_CURLY_BRACE,    /* } */\n  CHAR_RIGHT_PARENTHESES,    /* ) */\n  CHAR_RIGHT_SQUARE_BRACKET  /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n  return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n  if (token.isPrefix !== true) {\n    token.depth = token.isGlobstar ? Infinity : 1;\n  }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n  const opts = options || {};\n\n  const length = input.length - 1;\n  const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n  const slashes = [];\n  const tokens = [];\n  const parts = [];\n\n  let str = input;\n  let index = -1;\n  let start = 0;\n  let lastIndex = 0;\n  let isBrace = false;\n  let isBracket = false;\n  let isGlob = false;\n  let isExtglob = false;\n  let isGlobstar = false;\n  let braceEscaped = false;\n  let backslashes = false;\n  let negated = false;\n  let negatedExtglob = false;\n  let finished = false;\n  let braces = 0;\n  let prev;\n  let code;\n  let token = { value: '', depth: 0, isGlob: false };\n\n  const eos = () => index >= length;\n  const peek = () => str.charCodeAt(index + 1);\n  const advance = () => {\n    prev = code;\n    return str.charCodeAt(++index);\n  };\n\n  while (index < length) {\n    code = advance();\n    let next;\n\n    if (code === CHAR_BACKWARD_SLASH) {\n      backslashes = token.backslashes = true;\n      code = advance();\n\n      if (code === CHAR_LEFT_CURLY_BRACE) {\n        braceEscaped = true;\n      }\n      continue;\n    }\n\n    if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n      braces++;\n\n      while (eos() !== true && (code = advance())) {\n        if (code === CHAR_BACKWARD_SLASH) {\n          backslashes = token.backslashes = true;\n          advance();\n          continue;\n        }\n\n        if (code === CHAR_LEFT_CURLY_BRACE) {\n          braces++;\n          continue;\n        }\n\n        if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n          isBrace = token.isBrace = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n\n          if (scanToEnd === true) {\n            continue;\n          }\n\n          break;\n        }\n\n        if (braceEscaped !== true && code === CHAR_COMMA) {\n          isBrace = token.isBrace = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n\n          if (scanToEnd === true) {\n            continue;\n          }\n\n          break;\n        }\n\n        if (code === CHAR_RIGHT_CURLY_BRACE) {\n          braces--;\n\n          if (braces === 0) {\n            braceEscaped = false;\n            isBrace = token.isBrace = true;\n            finished = true;\n            break;\n          }\n        }\n      }\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n\n    if (code === CHAR_FORWARD_SLASH) {\n      slashes.push(index);\n      tokens.push(token);\n      token = { value: '', depth: 0, isGlob: false };\n\n      if (finished === true) continue;\n      if (prev === CHAR_DOT && index === (start + 1)) {\n        start += 2;\n        continue;\n      }\n\n      lastIndex = index + 1;\n      continue;\n    }\n\n    if (opts.noext !== true) {\n      const isExtglobChar = code === CHAR_PLUS\n        || code === CHAR_AT\n        || code === CHAR_ASTERISK\n        || code === CHAR_QUESTION_MARK\n        || code === CHAR_EXCLAMATION_MARK;\n\n      if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n        isGlob = token.isGlob = true;\n        isExtglob = token.isExtglob = true;\n        finished = true;\n        if (code === CHAR_EXCLAMATION_MARK && index === start) {\n          negatedExtglob = true;\n        }\n\n        if (scanToEnd === true) {\n          while (eos() !== true && (code = advance())) {\n            if (code === CHAR_BACKWARD_SLASH) {\n              backslashes = token.backslashes = true;\n              code = advance();\n              continue;\n            }\n\n            if (code === CHAR_RIGHT_PARENTHESES) {\n              isGlob = token.isGlob = true;\n              finished = true;\n              break;\n            }\n          }\n          continue;\n        }\n        break;\n      }\n    }\n\n    if (code === CHAR_ASTERISK) {\n      if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n      isGlob = token.isGlob = true;\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n      break;\n    }\n\n    if (code === CHAR_QUESTION_MARK) {\n      isGlob = token.isGlob = true;\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n      break;\n    }\n\n    if (code === CHAR_LEFT_SQUARE_BRACKET) {\n      while (eos() !== true && (next = advance())) {\n        if (next === CHAR_BACKWARD_SLASH) {\n          backslashes = token.backslashes = true;\n          advance();\n          continue;\n        }\n\n        if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n          isBracket = token.isBracket = true;\n          isGlob = token.isGlob = true;\n          finished = true;\n          break;\n        }\n      }\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n\n    if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n      negated = token.negated = true;\n      start++;\n      continue;\n    }\n\n    if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n      isGlob = token.isGlob = true;\n\n      if (scanToEnd === true) {\n        while (eos() !== true && (code = advance())) {\n          if (code === CHAR_LEFT_PARENTHESES) {\n            backslashes = token.backslashes = true;\n            code = advance();\n            continue;\n          }\n\n          if (code === CHAR_RIGHT_PARENTHESES) {\n            finished = true;\n            break;\n          }\n        }\n        continue;\n      }\n      break;\n    }\n\n    if (isGlob === true) {\n      finished = true;\n\n      if (scanToEnd === true) {\n        continue;\n      }\n\n      break;\n    }\n  }\n\n  if (opts.noext === true) {\n    isExtglob = false;\n    isGlob = false;\n  }\n\n  let base = str;\n  let prefix = '';\n  let glob = '';\n\n  if (start > 0) {\n    prefix = str.slice(0, start);\n    str = str.slice(start);\n    lastIndex -= start;\n  }\n\n  if (base && isGlob === true && lastIndex > 0) {\n    base = str.slice(0, lastIndex);\n    glob = str.slice(lastIndex);\n  } else if (isGlob === true) {\n    base = '';\n    glob = str;\n  } else {\n    base = str;\n  }\n\n  if (base && base !== '' && base !== '/' && base !== str) {\n    if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n      base = base.slice(0, -1);\n    }\n  }\n\n  if (opts.unescape === true) {\n    if (glob) glob = utils.removeBackslashes(glob);\n\n    if (base && backslashes === true) {\n      base = utils.removeBackslashes(base);\n    }\n  }\n\n  const state = {\n    prefix,\n    input,\n    start,\n    base,\n    glob,\n    isBrace,\n    isBracket,\n    isGlob,\n    isExtglob,\n    isGlobstar,\n    negated,\n    negatedExtglob\n  };\n\n  if (opts.tokens === true) {\n    state.maxDepth = 0;\n    if (!isPathSeparator(code)) {\n      tokens.push(token);\n    }\n    state.tokens = tokens;\n  }\n\n  if (opts.parts === true || opts.tokens === true) {\n    let prevIndex;\n\n    for (let idx = 0; idx < slashes.length; idx++) {\n      const n = prevIndex ? prevIndex + 1 : start;\n      const i = slashes[idx];\n      const value = input.slice(n, i);\n      if (opts.tokens) {\n        if (idx === 0 && start !== 0) {\n          tokens[idx].isPrefix = true;\n          tokens[idx].value = prefix;\n        } else {\n          tokens[idx].value = value;\n        }\n        depth(tokens[idx]);\n        state.maxDepth += tokens[idx].depth;\n      }\n      if (idx !== 0 || value !== '') {\n        parts.push(value);\n      }\n      prevIndex = i;\n    }\n\n    if (prevIndex && prevIndex + 1 < input.length) {\n      const value = input.slice(prevIndex + 1);\n      parts.push(value);\n\n      if (opts.tokens) {\n        tokens[tokens.length - 1].value = value;\n        depth(tokens[tokens.length - 1]);\n        state.maxDepth += tokens[tokens.length - 1].depth;\n      }\n    }\n\n    state.slashes = slashes;\n    state.parts = parts;\n  }\n\n  return state;\n};\n\nmodule.exports = scan;\n","'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n  MAX_LENGTH,\n  POSIX_REGEX_SOURCE,\n  REGEX_NON_SPECIAL_CHARS,\n  REGEX_SPECIAL_CHARS_BACKREF,\n  REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n  if (typeof options.expandRange === 'function') {\n    return options.expandRange(...args, options);\n  }\n\n  args.sort();\n  const value = `[${args.join('-')}]`;\n\n  try {\n    /* eslint-disable-next-line no-new */\n    new RegExp(value);\n  } catch (ex) {\n    return args.map(v => utils.escapeRegex(v)).join('..');\n  }\n\n  return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n  return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n  if (typeof input !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n\n  input = REPLACEMENTS[input] || input;\n\n  const opts = { ...options };\n  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n  let len = input.length;\n  if (len > max) {\n    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n  }\n\n  const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n  const tokens = [bos];\n\n  const capture = opts.capture ? '' : '?:';\n\n  // create constants based on platform, for windows or posix\n  const PLATFORM_CHARS = constants.globChars(opts.windows);\n  const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n  const {\n    DOT_LITERAL,\n    PLUS_LITERAL,\n    SLASH_LITERAL,\n    ONE_CHAR,\n    DOTS_SLASH,\n    NO_DOT,\n    NO_DOT_SLASH,\n    NO_DOTS_SLASH,\n    QMARK,\n    QMARK_NO_DOT,\n    STAR,\n    START_ANCHOR\n  } = PLATFORM_CHARS;\n\n  const globstar = opts => {\n    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n  };\n\n  const nodot = opts.dot ? '' : NO_DOT;\n  const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n  let star = opts.bash === true ? globstar(opts) : STAR;\n\n  if (opts.capture) {\n    star = `(${star})`;\n  }\n\n  // minimatch options support\n  if (typeof opts.noext === 'boolean') {\n    opts.noextglob = opts.noext;\n  }\n\n  const state = {\n    input,\n    index: -1,\n    start: 0,\n    dot: opts.dot === true,\n    consumed: '',\n    output: '',\n    prefix: '',\n    backtrack: false,\n    negated: false,\n    brackets: 0,\n    braces: 0,\n    parens: 0,\n    quotes: 0,\n    globstar: false,\n    tokens\n  };\n\n  input = utils.removePrefix(input, state);\n  len = input.length;\n\n  const extglobs = [];\n  const braces = [];\n  const stack = [];\n  let prev = bos;\n  let value;\n\n  /**\n   * Tokenizing helpers\n   */\n\n  const eos = () => state.index === len - 1;\n  const peek = state.peek = (n = 1) => input[state.index + n];\n  const advance = state.advance = () => input[++state.index] || '';\n  const remaining = () => input.slice(state.index + 1);\n  const consume = (value = '', num = 0) => {\n    state.consumed += value;\n    state.index += num;\n  };\n\n  const append = token => {\n    state.output += token.output != null ? token.output : token.value;\n    consume(token.value);\n  };\n\n  const negate = () => {\n    let count = 1;\n\n    while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n      advance();\n      state.start++;\n      count++;\n    }\n\n    if (count % 2 === 0) {\n      return false;\n    }\n\n    state.negated = true;\n    state.start++;\n    return true;\n  };\n\n  const increment = type => {\n    state[type]++;\n    stack.push(type);\n  };\n\n  const decrement = type => {\n    state[type]--;\n    stack.pop();\n  };\n\n  /**\n   * Push tokens onto the tokens array. This helper speeds up\n   * tokenizing by 1) helping us avoid backtracking as much as possible,\n   * and 2) helping us avoid creating extra tokens when consecutive\n   * characters are plain text. This improves performance and simplifies\n   * lookbehinds.\n   */\n\n  const push = tok => {\n    if (prev.type === 'globstar') {\n      const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n      const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n      if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n        state.output = state.output.slice(0, -prev.output.length);\n        prev.type = 'star';\n        prev.value = '*';\n        prev.output = star;\n        state.output += prev.output;\n      }\n    }\n\n    if (extglobs.length && tok.type !== 'paren') {\n      extglobs[extglobs.length - 1].inner += tok.value;\n    }\n\n    if (tok.value || tok.output) append(tok);\n    if (prev && prev.type === 'text' && tok.type === 'text') {\n      prev.output = (prev.output || prev.value) + tok.value;\n      prev.value += tok.value;\n      return;\n    }\n\n    tok.prev = prev;\n    tokens.push(tok);\n    prev = tok;\n  };\n\n  const extglobOpen = (type, value) => {\n    const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n    token.prev = prev;\n    token.parens = state.parens;\n    token.output = state.output;\n    const output = (opts.capture ? '(' : '') + token.open;\n\n    increment('parens');\n    push({ type, value, output: state.output ? '' : ONE_CHAR });\n    push({ type: 'paren', extglob: true, value: advance(), output });\n    extglobs.push(token);\n  };\n\n  const extglobClose = token => {\n    let output = token.close + (opts.capture ? ')' : '');\n    let rest;\n\n    if (token.type === 'negate') {\n      let extglobStar = star;\n\n      if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n        extglobStar = globstar(opts);\n      }\n\n      if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n        output = token.close = `)$))${extglobStar}`;\n      }\n\n      if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n        // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n        // In this case, we need to parse the string and use it in the output of the original pattern.\n        // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n        //\n        // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n        const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n        output = token.close = `)${expression})${extglobStar})`;\n      }\n\n      if (token.prev.type === 'bos') {\n        state.negatedExtglob = true;\n      }\n    }\n\n    push({ type: 'paren', extglob: true, value, output });\n    decrement('parens');\n  };\n\n  /**\n   * Fast paths\n   */\n\n  if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n    let backslashes = false;\n\n    let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n      if (first === '\\\\') {\n        backslashes = true;\n        return m;\n      }\n\n      if (first === '?') {\n        if (esc) {\n          return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n        }\n        if (index === 0) {\n          return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n        }\n        return QMARK.repeat(chars.length);\n      }\n\n      if (first === '.') {\n        return DOT_LITERAL.repeat(chars.length);\n      }\n\n      if (first === '*') {\n        if (esc) {\n          return esc + first + (rest ? star : '');\n        }\n        return star;\n      }\n      return esc ? m : `\\\\${m}`;\n    });\n\n    if (backslashes === true) {\n      if (opts.unescape === true) {\n        output = output.replace(/\\\\/g, '');\n      } else {\n        output = output.replace(/\\\\+/g, m => {\n          return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n        });\n      }\n    }\n\n    if (output === input && opts.contains === true) {\n      state.output = input;\n      return state;\n    }\n\n    state.output = utils.wrapOutput(output, state, options);\n    return state;\n  }\n\n  /**\n   * Tokenize input until we reach end-of-string\n   */\n\n  while (!eos()) {\n    value = advance();\n\n    if (value === '\\u0000') {\n      continue;\n    }\n\n    /**\n     * Escaped characters\n     */\n\n    if (value === '\\\\') {\n      const next = peek();\n\n      if (next === '/' && opts.bash !== true) {\n        continue;\n      }\n\n      if (next === '.' || next === ';') {\n        continue;\n      }\n\n      if (!next) {\n        value += '\\\\';\n        push({ type: 'text', value });\n        continue;\n      }\n\n      // collapse slashes to reduce potential for exploits\n      const match = /^\\\\+/.exec(remaining());\n      let slashes = 0;\n\n      if (match && match[0].length > 2) {\n        slashes = match[0].length;\n        state.index += slashes;\n        if (slashes % 2 !== 0) {\n          value += '\\\\';\n        }\n      }\n\n      if (opts.unescape === true) {\n        value = advance();\n      } else {\n        value += advance();\n      }\n\n      if (state.brackets === 0) {\n        push({ type: 'text', value });\n        continue;\n      }\n    }\n\n    /**\n     * If we're inside a regex character class, continue\n     * until we reach the closing bracket.\n     */\n\n    if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n      if (opts.posix !== false && value === ':') {\n        const inner = prev.value.slice(1);\n        if (inner.includes('[')) {\n          prev.posix = true;\n\n          if (inner.includes(':')) {\n            const idx = prev.value.lastIndexOf('[');\n            const pre = prev.value.slice(0, idx);\n            const rest = prev.value.slice(idx + 2);\n            const posix = POSIX_REGEX_SOURCE[rest];\n            if (posix) {\n              prev.value = pre + posix;\n              state.backtrack = true;\n              advance();\n\n              if (!bos.output && tokens.indexOf(prev) === 1) {\n                bos.output = ONE_CHAR;\n              }\n              continue;\n            }\n          }\n        }\n      }\n\n      if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n        value = `\\\\${value}`;\n      }\n\n      if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n        value = `\\\\${value}`;\n      }\n\n      if (opts.posix === true && value === '!' && prev.value === '[') {\n        value = '^';\n      }\n\n      prev.value += value;\n      append({ value });\n      continue;\n    }\n\n    /**\n     * If we're inside a quoted string, continue\n     * until we reach the closing double quote.\n     */\n\n    if (state.quotes === 1 && value !== '\"') {\n      value = utils.escapeRegex(value);\n      prev.value += value;\n      append({ value });\n      continue;\n    }\n\n    /**\n     * Double quotes\n     */\n\n    if (value === '\"') {\n      state.quotes = state.quotes === 1 ? 0 : 1;\n      if (opts.keepQuotes === true) {\n        push({ type: 'text', value });\n      }\n      continue;\n    }\n\n    /**\n     * Parentheses\n     */\n\n    if (value === '(') {\n      increment('parens');\n      push({ type: 'paren', value });\n      continue;\n    }\n\n    if (value === ')') {\n      if (state.parens === 0 && opts.strictBrackets === true) {\n        throw new SyntaxError(syntaxError('opening', '('));\n      }\n\n      const extglob = extglobs[extglobs.length - 1];\n      if (extglob && state.parens === extglob.parens + 1) {\n        extglobClose(extglobs.pop());\n        continue;\n      }\n\n      push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n      decrement('parens');\n      continue;\n    }\n\n    /**\n     * Square brackets\n     */\n\n    if (value === '[') {\n      if (opts.nobracket === true || !remaining().includes(']')) {\n        if (opts.nobracket !== true && opts.strictBrackets === true) {\n          throw new SyntaxError(syntaxError('closing', ']'));\n        }\n\n        value = `\\\\${value}`;\n      } else {\n        increment('brackets');\n      }\n\n      push({ type: 'bracket', value });\n      continue;\n    }\n\n    if (value === ']') {\n      if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n        push({ type: 'text', value, output: `\\\\${value}` });\n        continue;\n      }\n\n      if (state.brackets === 0) {\n        if (opts.strictBrackets === true) {\n          throw new SyntaxError(syntaxError('opening', '['));\n        }\n\n        push({ type: 'text', value, output: `\\\\${value}` });\n        continue;\n      }\n\n      decrement('brackets');\n\n      const prevValue = prev.value.slice(1);\n      if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n        value = `/${value}`;\n      }\n\n      prev.value += value;\n      append({ value });\n\n      // when literal brackets are explicitly disabled\n      // assume we should match with a regex character class\n      if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n        continue;\n      }\n\n      const escaped = utils.escapeRegex(prev.value);\n      state.output = state.output.slice(0, -prev.value.length);\n\n      // when literal brackets are explicitly enabled\n      // assume we should escape the brackets to match literal characters\n      if (opts.literalBrackets === true) {\n        state.output += escaped;\n        prev.value = escaped;\n        continue;\n      }\n\n      // when the user specifies nothing, try to match both\n      prev.value = `(${capture}${escaped}|${prev.value})`;\n      state.output += prev.value;\n      continue;\n    }\n\n    /**\n     * Braces\n     */\n\n    if (value === '{' && opts.nobrace !== true) {\n      increment('braces');\n\n      const open = {\n        type: 'brace',\n        value,\n        output: '(',\n        outputIndex: state.output.length,\n        tokensIndex: state.tokens.length\n      };\n\n      braces.push(open);\n      push(open);\n      continue;\n    }\n\n    if (value === '}') {\n      const brace = braces[braces.length - 1];\n\n      if (opts.nobrace === true || !brace) {\n        push({ type: 'text', value, output: value });\n        continue;\n      }\n\n      let output = ')';\n\n      if (brace.dots === true) {\n        const arr = tokens.slice();\n        const range = [];\n\n        for (let i = arr.length - 1; i >= 0; i--) {\n          tokens.pop();\n          if (arr[i].type === 'brace') {\n            break;\n          }\n          if (arr[i].type !== 'dots') {\n            range.unshift(arr[i].value);\n          }\n        }\n\n        output = expandRange(range, opts);\n        state.backtrack = true;\n      }\n\n      if (brace.comma !== true && brace.dots !== true) {\n        const out = state.output.slice(0, brace.outputIndex);\n        const toks = state.tokens.slice(brace.tokensIndex);\n        brace.value = brace.output = '\\\\{';\n        value = output = '\\\\}';\n        state.output = out;\n        for (const t of toks) {\n          state.output += (t.output || t.value);\n        }\n      }\n\n      push({ type: 'brace', value, output });\n      decrement('braces');\n      braces.pop();\n      continue;\n    }\n\n    /**\n     * Pipes\n     */\n\n    if (value === '|') {\n      if (extglobs.length > 0) {\n        extglobs[extglobs.length - 1].conditions++;\n      }\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Commas\n     */\n\n    if (value === ',') {\n      let output = value;\n\n      const brace = braces[braces.length - 1];\n      if (brace && stack[stack.length - 1] === 'braces') {\n        brace.comma = true;\n        output = '|';\n      }\n\n      push({ type: 'comma', value, output });\n      continue;\n    }\n\n    /**\n     * Slashes\n     */\n\n    if (value === '/') {\n      // if the beginning of the glob is \"./\", advance the start\n      // to the current index, and don't add the \"./\" characters\n      // to the state. This greatly simplifies lookbehinds when\n      // checking for BOS characters like \"!\" and \".\" (not \"./\")\n      if (prev.type === 'dot' && state.index === state.start + 1) {\n        state.start = state.index + 1;\n        state.consumed = '';\n        state.output = '';\n        tokens.pop();\n        prev = bos; // reset \"prev\" to the first token\n        continue;\n      }\n\n      push({ type: 'slash', value, output: SLASH_LITERAL });\n      continue;\n    }\n\n    /**\n     * Dots\n     */\n\n    if (value === '.') {\n      if (state.braces > 0 && prev.type === 'dot') {\n        if (prev.value === '.') prev.output = DOT_LITERAL;\n        const brace = braces[braces.length - 1];\n        prev.type = 'dots';\n        prev.output += value;\n        prev.value += value;\n        brace.dots = true;\n        continue;\n      }\n\n      if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n        push({ type: 'text', value, output: DOT_LITERAL });\n        continue;\n      }\n\n      push({ type: 'dot', value, output: DOT_LITERAL });\n      continue;\n    }\n\n    /**\n     * Question marks\n     */\n\n    if (value === '?') {\n      const isGroup = prev && prev.value === '(';\n      if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        extglobOpen('qmark', value);\n        continue;\n      }\n\n      if (prev && prev.type === 'paren') {\n        const next = peek();\n        let output = value;\n\n        if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n          output = `\\\\${value}`;\n        }\n\n        push({ type: 'text', value, output });\n        continue;\n      }\n\n      if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n        push({ type: 'qmark', value, output: QMARK_NO_DOT });\n        continue;\n      }\n\n      push({ type: 'qmark', value, output: QMARK });\n      continue;\n    }\n\n    /**\n     * Exclamation\n     */\n\n    if (value === '!') {\n      if (opts.noextglob !== true && peek() === '(') {\n        if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n          extglobOpen('negate', value);\n          continue;\n        }\n      }\n\n      if (opts.nonegate !== true && state.index === 0) {\n        negate();\n        continue;\n      }\n    }\n\n    /**\n     * Plus\n     */\n\n    if (value === '+') {\n      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        extglobOpen('plus', value);\n        continue;\n      }\n\n      if ((prev && prev.value === '(') || opts.regex === false) {\n        push({ type: 'plus', value, output: PLUS_LITERAL });\n        continue;\n      }\n\n      if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n        push({ type: 'plus', value });\n        continue;\n      }\n\n      push({ type: 'plus', value: PLUS_LITERAL });\n      continue;\n    }\n\n    /**\n     * Plain text\n     */\n\n    if (value === '@') {\n      if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n        push({ type: 'at', extglob: true, value, output: '' });\n        continue;\n      }\n\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Plain text\n     */\n\n    if (value !== '*') {\n      if (value === '$' || value === '^') {\n        value = `\\\\${value}`;\n      }\n\n      const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n      if (match) {\n        value += match[0];\n        state.index += match[0].length;\n      }\n\n      push({ type: 'text', value });\n      continue;\n    }\n\n    /**\n     * Stars\n     */\n\n    if (prev && (prev.type === 'globstar' || prev.star === true)) {\n      prev.type = 'star';\n      prev.star = true;\n      prev.value += value;\n      prev.output = star;\n      state.backtrack = true;\n      state.globstar = true;\n      consume(value);\n      continue;\n    }\n\n    let rest = remaining();\n    if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n      extglobOpen('star', value);\n      continue;\n    }\n\n    if (prev.type === 'star') {\n      if (opts.noglobstar === true) {\n        consume(value);\n        continue;\n      }\n\n      const prior = prev.prev;\n      const before = prior.prev;\n      const isStart = prior.type === 'slash' || prior.type === 'bos';\n      const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n      if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n        push({ type: 'star', value, output: '' });\n        continue;\n      }\n\n      const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n      const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n      if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n        push({ type: 'star', value, output: '' });\n        continue;\n      }\n\n      // strip consecutive `/**/`\n      while (rest.slice(0, 3) === '/**') {\n        const after = input[state.index + 4];\n        if (after && after !== '/') {\n          break;\n        }\n        rest = rest.slice(3);\n        consume('/**', 3);\n      }\n\n      if (prior.type === 'bos' && eos()) {\n        prev.type = 'globstar';\n        prev.value += value;\n        prev.output = globstar(opts);\n        state.output = prev.output;\n        state.globstar = true;\n        consume(value);\n        continue;\n      }\n\n      if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n        state.output = state.output.slice(0, -(prior.output + prev.output).length);\n        prior.output = `(?:${prior.output}`;\n\n        prev.type = 'globstar';\n        prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n        prev.value += value;\n        state.globstar = true;\n        state.output += prior.output + prev.output;\n        consume(value);\n        continue;\n      }\n\n      if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n        const end = rest[1] !== void 0 ? '|$' : '';\n\n        state.output = state.output.slice(0, -(prior.output + prev.output).length);\n        prior.output = `(?:${prior.output}`;\n\n        prev.type = 'globstar';\n        prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n        prev.value += value;\n\n        state.output += prior.output + prev.output;\n        state.globstar = true;\n\n        consume(value + advance());\n\n        push({ type: 'slash', value: '/', output: '' });\n        continue;\n      }\n\n      if (prior.type === 'bos' && rest[0] === '/') {\n        prev.type = 'globstar';\n        prev.value += value;\n        prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n        state.output = prev.output;\n        state.globstar = true;\n        consume(value + advance());\n        push({ type: 'slash', value: '/', output: '' });\n        continue;\n      }\n\n      // remove single star from output\n      state.output = state.output.slice(0, -prev.output.length);\n\n      // reset previous token to globstar\n      prev.type = 'globstar';\n      prev.output = globstar(opts);\n      prev.value += value;\n\n      // reset output with globstar\n      state.output += prev.output;\n      state.globstar = true;\n      consume(value);\n      continue;\n    }\n\n    const token = { type: 'star', value, output: star };\n\n    if (opts.bash === true) {\n      token.output = '.*?';\n      if (prev.type === 'bos' || prev.type === 'slash') {\n        token.output = nodot + token.output;\n      }\n      push(token);\n      continue;\n    }\n\n    if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n      token.output = value;\n      push(token);\n      continue;\n    }\n\n    if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n      if (prev.type === 'dot') {\n        state.output += NO_DOT_SLASH;\n        prev.output += NO_DOT_SLASH;\n\n      } else if (opts.dot === true) {\n        state.output += NO_DOTS_SLASH;\n        prev.output += NO_DOTS_SLASH;\n\n      } else {\n        state.output += nodot;\n        prev.output += nodot;\n      }\n\n      if (peek() !== '*') {\n        state.output += ONE_CHAR;\n        prev.output += ONE_CHAR;\n      }\n    }\n\n    push(token);\n  }\n\n  while (state.brackets > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n    state.output = utils.escapeLast(state.output, '[');\n    decrement('brackets');\n  }\n\n  while (state.parens > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n    state.output = utils.escapeLast(state.output, '(');\n    decrement('parens');\n  }\n\n  while (state.braces > 0) {\n    if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n    state.output = utils.escapeLast(state.output, '{');\n    decrement('braces');\n  }\n\n  if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n    push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n  }\n\n  // rebuild the output if we had to backtrack at any point\n  if (state.backtrack === true) {\n    state.output = '';\n\n    for (const token of state.tokens) {\n      state.output += token.output != null ? token.output : token.value;\n\n      if (token.suffix) {\n        state.output += token.suffix;\n      }\n    }\n  }\n\n  return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n  const opts = { ...options };\n  const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n  const len = input.length;\n  if (len > max) {\n    throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n  }\n\n  input = REPLACEMENTS[input] || input;\n\n  // create constants based on platform, for windows or posix\n  const {\n    DOT_LITERAL,\n    SLASH_LITERAL,\n    ONE_CHAR,\n    DOTS_SLASH,\n    NO_DOT,\n    NO_DOTS,\n    NO_DOTS_SLASH,\n    STAR,\n    START_ANCHOR\n  } = constants.globChars(opts.windows);\n\n  const nodot = opts.dot ? NO_DOTS : NO_DOT;\n  const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n  const capture = opts.capture ? '' : '?:';\n  const state = { negated: false, prefix: '' };\n  let star = opts.bash === true ? '.*?' : STAR;\n\n  if (opts.capture) {\n    star = `(${star})`;\n  }\n\n  const globstar = opts => {\n    if (opts.noglobstar === true) return star;\n    return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n  };\n\n  const create = str => {\n    switch (str) {\n      case '*':\n        return `${nodot}${ONE_CHAR}${star}`;\n\n      case '.*':\n        return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '*.*':\n        return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '*/*':\n        return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n      case '**':\n        return nodot + globstar(opts);\n\n      case '**/*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n      case '**/*.*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      case '**/.*':\n        return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n      default: {\n        const match = /^(.*?)\\.(\\w+)$/.exec(str);\n        if (!match) return;\n\n        const source = create(match[1]);\n        if (!source) return;\n\n        return source + DOT_LITERAL + match[2];\n      }\n    }\n  };\n\n  const output = utils.removePrefix(input, state);\n  let source = create(output);\n\n  if (source && opts.strictSlashes !== true) {\n    source += `${SLASH_LITERAL}?`;\n  }\n\n  return source;\n};\n\nmodule.exports = parse;\n","'use strict';\n\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n  if (Array.isArray(glob)) {\n    const fns = glob.map(input => picomatch(input, options, returnState));\n    const arrayMatcher = str => {\n      for (const isMatch of fns) {\n        const state = isMatch(str);\n        if (state) return state;\n      }\n      return false;\n    };\n    return arrayMatcher;\n  }\n\n  const isState = isObject(glob) && glob.tokens && glob.input;\n\n  if (glob === '' || (typeof glob !== 'string' && !isState)) {\n    throw new TypeError('Expected pattern to be a non-empty string');\n  }\n\n  const opts = options || {};\n  const posix = opts.windows;\n  const regex = isState\n    ? picomatch.compileRe(glob, options)\n    : picomatch.makeRe(glob, options, false, true);\n\n  const state = regex.state;\n  delete regex.state;\n\n  let isIgnored = () => false;\n  if (opts.ignore) {\n    const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n    isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n  }\n\n  const matcher = (input, returnObject = false) => {\n    const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n    const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n    if (typeof opts.onResult === 'function') {\n      opts.onResult(result);\n    }\n\n    if (isMatch === false) {\n      result.isMatch = false;\n      return returnObject ? result : false;\n    }\n\n    if (isIgnored(input)) {\n      if (typeof opts.onIgnore === 'function') {\n        opts.onIgnore(result);\n      }\n      result.isMatch = false;\n      return returnObject ? result : false;\n    }\n\n    if (typeof opts.onMatch === 'function') {\n      opts.onMatch(result);\n    }\n    return returnObject ? result : true;\n  };\n\n  if (returnState) {\n    matcher.state = state;\n  }\n\n  return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n  if (typeof input !== 'string') {\n    throw new TypeError('Expected input to be a string');\n  }\n\n  if (input === '') {\n    return { isMatch: false, output: '' };\n  }\n\n  const opts = options || {};\n  const format = opts.format || (posix ? utils.toPosixSlashes : null);\n  let match = input === glob;\n  let output = (match && format) ? format(input) : input;\n\n  if (match === false) {\n    output = format ? format(input) : input;\n    match = output === glob;\n  }\n\n  if (match === false || opts.capture === true) {\n    if (opts.matchBase === true || opts.basename === true) {\n      match = picomatch.matchBase(input, regex, options, posix);\n    } else {\n      match = regex.exec(output);\n    }\n  }\n\n  return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options) => {\n  const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n  return regex.test(utils.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n  if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n  return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n *   input: '!./foo/*.js',\n *   start: 3,\n *   base: 'foo',\n *   glob: '*.js',\n *   isBrace: false,\n *   isBracket: false,\n *   isGlob: true,\n *   isExtglob: false,\n *   isGlobstar: false,\n *   negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n  if (returnOutput === true) {\n    return state.output;\n  }\n\n  const opts = options || {};\n  const prepend = opts.contains ? '' : '^';\n  const append = opts.contains ? '' : '$';\n\n  let source = `${prepend}(?:${state.output})${append}`;\n  if (state && state.negated === true) {\n    source = `^(?!${source}).*$`;\n  }\n\n  const regex = picomatch.toRegex(source, options);\n  if (returnState === true) {\n    regex.state = state;\n  }\n\n  return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n  if (!input || typeof input !== 'string') {\n    throw new TypeError('Expected a non-empty string');\n  }\n\n  let parsed = { negated: false, fastpaths: true };\n\n  if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n    parsed.output = parse.fastpaths(input, options);\n  }\n\n  if (!parsed.output) {\n    parsed = parse(input, options);\n  }\n\n  return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n  try {\n    const opts = options || {};\n    return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n  } catch (err) {\n    if (options && options.debug === true) throw err;\n    return /$^/;\n  }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n","'use strict';\n\nmodule.exports = require('./lib/picomatch');\n","import mime from \"mime/lite\";\nimport picomatch from \"picomatch/posix\";\n\nconst parseInputAccept = (inputAccept: string): [string[], string[]] => {\n  const extensions: string[] = [];\n  const mimeTypes: string[] = [];\n\n  inputAccept\n    .split(\",\")\n    .map(mimeType => mimeType.trim())\n    .filter(Boolean)\n    .forEach(fileType => {\n      if (fileType.startsWith(\".\")) {\n        extensions.push(`*${fileType}`);\n      } else {\n        mimeTypes.push(fileType);\n      }\n    });\n\n  return [extensions, mimeTypes];\n};\n\nclass AcceptedFileTypes {\n  private extensions: string[];\n  private mimeTypes: string[];\n\n  constructor(inputAccept: string) {\n    const [extensions, mimeTypes] = parseInputAccept(inputAccept);\n\n    this.extensions = extensions;\n    this.mimeTypes = mimeTypes;\n  }\n\n  public isAccepted(fileName: string): boolean {\n    if (this.extensions.length === 0 && this.mimeTypes.length === 0) {\n      return true;\n    }\n    return (\n      this.isMimeTypeAccepted(mime.getType(fileName)) ||\n      this.isExtensionAccepted(fileName)\n    );\n  }\n\n  private isExtensionAccepted(fileName: string): boolean {\n    if (this.extensions.length === 0) {\n      return false;\n    }\n\n    return picomatch.isMatch(fileName, this.extensions, { nocase: true });\n  }\n\n  private isMimeTypeAccepted(mimeType: null | string): boolean {\n    if (!mimeType || this.mimeTypes.length === 0) {\n      return false;\n    }\n\n    return picomatch.isMatch(mimeType, this.mimeTypes);\n  }\n}\n\nexport default AcceptedFileTypes;\n","import AcceptedFileTypes from \"./accepted_file_types.ts\";\nimport RenderUploadFile from \"./render_upload_file.ts\";\n\nconst getEntriesFromDirectory = async (\n  directoryEntry: FileSystemDirectoryEntry\n): Promise<FileSystemEntry[]> =>\n  new Promise((resolve, reject) => {\n    directoryEntry.createReader().readEntries(resolve, reject);\n  });\n\nconst getFileFromFileSystemFileEntry = async (\n  fileEntry: FileSystemFileEntry\n): Promise<File> =>\n  new Promise((resolve, reject) => {\n    fileEntry.file(resolve, reject);\n  });\n\nconst getFilesFromFileSystemEntries = async (\n  entries: FileSystemEntry[]\n): Promise<File[]> => {\n  const result: File[] = [];\n\n  for (const entry of entries) {\n    const filesFromEntry = await getFilesFromFileSystemEntry(entry);\n    filesFromEntry.forEach(file => result.push(file));\n  }\n\n  return result;\n};\n\nconst getFilesFromFileSystemEntry = async (\n  entry: FileSystemEntry\n): Promise<File[]> => {\n  const result: File[] = [];\n\n  if (entry.isFile) {\n    const file = await getFileFromFileSystemFileEntry(\n      entry as FileSystemFileEntry\n    );\n    result.push(file);\n  } else if (entry.isDirectory) {\n    const entriesFromDirectory = await getEntriesFromDirectory(\n      entry as FileSystemDirectoryEntry\n    );\n    const files = await getFilesFromFileSystemEntries(entriesFromDirectory);\n    files.forEach(file => result.push(file));\n  }\n\n  return result;\n};\n\nconst getFilesFromDataTransfer = async (\n  dataTransfer: DataTransfer\n): Promise<File[]> => {\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n  if (dataTransfer.items) {\n    const files: File[] = [];\n\n    for (const item of dataTransfer.items) {\n      const fileSystemEntry = item.webkitGetAsEntry();\n      if (fileSystemEntry) {\n        const filesFromEntry = await getFilesFromFileSystemEntry(\n          fileSystemEntry\n        );\n        filesFromEntry.forEach(file => files.push(file));\n      } else {\n        const file = item.getAsFile();\n\n        if (file) {\n          files.push(file);\n        }\n      }\n    }\n\n    return files;\n  } else {\n    // backwards compatibility\n    return [...dataTransfer.files];\n  }\n};\n\nclass DropArea {\n  acceptedFileTypes: AcceptedFileTypes;\n  container: Element;\n  onUploadFiles: (files: File[]) => Promise<void>;\n  renderer: RenderUploadFile;\n\n  constructor({\n    container,\n    inputAccept,\n    onUploadFiles,\n    renderer\n  }: {\n    container: Element;\n    inputAccept: string;\n    onUploadFiles: (files: File[]) => Promise<void>;\n    renderer: RenderUploadFile;\n  }) {\n    this.container = container;\n    this.onUploadFiles = onUploadFiles;\n    this.acceptedFileTypes = new AcceptedFileTypes(inputAccept);\n    this.renderer = renderer;\n\n    container.addEventListener(\"dragenter\", () => {\n      container.classList.add(\"dff-dropping\");\n    });\n    container.addEventListener(\"dragleave\", () => {\n      container.classList.remove(\"dff-dropping\");\n    });\n    container.addEventListener(\"dragover\", e => {\n      container.classList.add(\"dff-dropping\");\n      e.preventDefault();\n    });\n    container.addEventListener(\"drop\", this.onDrop);\n  }\n\n  onDrop = (e: Event): void => {\n    const dragEvent = e as DragEvent;\n    this.container.classList.remove(\"dff-dropping\");\n    dragEvent.preventDefault();\n    dragEvent.stopPropagation();\n\n    const uploadFiles = async (): Promise<void> => {\n      try {\n        if (dragEvent.dataTransfer) {\n          const files = await getFilesFromDataTransfer(dragEvent.dataTransfer);\n          const acceptedFiles: File[] = [];\n          const invalidFiles: File[] = [];\n\n          for (const file of files) {\n            if (this.acceptedFileTypes.isAccepted(file.name)) {\n              acceptedFiles.push(file);\n            } else {\n              invalidFiles.push(file);\n            }\n          }\n\n          this.renderer.setErrorInvalidFiles(invalidFiles);\n          void this.onUploadFiles(acceptedFiles);\n        }\n      } catch (error) {\n        console.error(error);\n      }\n    };\n\n    void uploadFiles();\n  };\n}\n\nexport default DropArea;\n","/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param  {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n  var str = '' + string;\n  var match = matchHtmlRegExp.exec(str);\n\n  if (!match) {\n    return str;\n  }\n\n  var escape;\n  var html = '';\n  var index = 0;\n  var lastIndex = 0;\n\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34: // \"\n        escape = '&quot;';\n        break;\n      case 38: // &\n        escape = '&amp;';\n        break;\n      case 39: // '\n        escape = '&#39;';\n        break;\n      case 60: // <\n        escape = '&lt;';\n        break;\n      case 62: // >\n        escape = '&gt;';\n        break;\n      default:\n        continue;\n    }\n\n    if (lastIndex !== index) {\n      html += str.substring(lastIndex, index);\n    }\n\n    lastIndex = index + 1;\n    html += escape;\n  }\n\n  return lastIndex !== index\n    ? html + str.substring(lastIndex, index)\n    : html;\n}\n","export const formatBytes = (bytes: number, decimals: number): string => {\n  if (bytes === 0) {\n    return \"0 Bytes\";\n  }\n\n  const k = 1024;\n  const dm = decimals <= 0 ? 0 : decimals || 2;\n  const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  const n = parseFloat((bytes / k ** i).toFixed(dm));\n  const size = sizes[i];\n\n  if (size == null) {\n    return \"\";\n  } else {\n    return `${n.toString()} ${size}`;\n  }\n};\n\nexport const getInputNameWithPrefix = (\n  fieldName: string,\n  prefix: null | string\n): string => (prefix ? `${prefix}-${fieldName}` : fieldName);\n\nconst getInputNameWithoutPrefix = (\n  fieldName: string,\n  prefix: null | string\n): string => (prefix ? fieldName.slice(prefix.length + 1) : fieldName);\n\nexport const findInput = (\n  form: Element,\n  fieldName: string,\n  prefix: null | string\n): HTMLInputElement | null => {\n  const inputNameWithPrefix = getInputNameWithPrefix(fieldName, prefix);\n  const input = form.querySelector(`[name=\"${inputNameWithPrefix}\"]`);\n\n  if (!input) {\n    return null;\n  }\n\n  return input as HTMLInputElement;\n};\n\nexport const getUploadsFieldName = (\n  fieldName: string,\n  prefix: null | string\n): string => `${getInputNameWithoutPrefix(fieldName, prefix)}-uploads`;\n\nexport const getInputValueForFormAndPrefix = (\n  form: Element,\n  fieldName: string,\n  prefix: null | string\n): string | undefined => findInput(form, fieldName, prefix)?.value;\n\nexport const getMetadataFieldName = (\n  fieldName: string,\n  prefix: null | string\n): string => `${getInputNameWithoutPrefix(fieldName, prefix)}-metadata`;\n","import escape from \"escape-html\";\n\nimport { formatBytes } from \"./util.ts\";\n\nclass RenderUploadFile {\n  container: Element;\n  errors: Element;\n  input: HTMLInputElement;\n  translations: Record<string, string>;\n\n  constructor({\n    input,\n    parent,\n    skipRequired,\n    translations\n  }: {\n    input: HTMLInputElement;\n    parent: Element;\n    skipRequired: boolean;\n    translations: Record<string, string>;\n  }) {\n    this.container = this.createFilesContainer(parent);\n    this.errors = this.createErrorContainer(parent);\n    this.input = input;\n    this.translations = translations;\n\n    if (skipRequired) {\n      this.input.required = false;\n    }\n  }\n\n  public addNewUpload(filename: string, uploadIndex: number): HTMLElement {\n    const div = this.addFile(filename, uploadIndex);\n\n    const progressSpan = document.createElement(\"span\");\n    progressSpan.className = \"dff-progress\";\n\n    const innerSpan = document.createElement(\"span\");\n    innerSpan.className = \"dff-progress-inner\";\n\n    progressSpan.appendChild(innerSpan);\n    div.appendChild(progressSpan);\n\n    const cancelLink = document.createElement(\"a\");\n    cancelLink.className = \"dff-cancel\";\n\n    this.setTextContent(cancelLink, this.getTranslation(\"Cancel\"));\n    cancelLink.setAttribute(\"data-index\", uploadIndex.toString());\n    cancelLink.href = \"#\";\n    div.appendChild(cancelLink);\n\n    return div;\n  }\n\n  public addUploadedFile(\n    filename: string,\n    uploadIndex: number,\n    filesize?: number\n  ): HTMLElement {\n    const element = this.addFile(filename, uploadIndex);\n    this.setSuccess(uploadIndex, filesize);\n    return element;\n  }\n\n  public clearInput(): void {\n    const { input } = this;\n\n    input.value = \"\";\n  }\n\n  public deleteFile(index: number): void {\n    const div = this.findFileDiv(index);\n\n    if (div) {\n      div.remove();\n    }\n  }\n\n  public disableCancel(index: number): void {\n    const cancelSpan = this.findCancelSpan(index);\n\n    if (cancelSpan) {\n      cancelSpan.classList.add(\"dff-disabled\");\n    }\n  }\n\n  public disableDelete(index: number): void {\n    const deleteLink = this.findDeleteLink(index);\n\n    if (deleteLink) {\n      deleteLink.classList.add(\"dff-disabled\");\n    }\n  }\n\n  public findFileDiv(index: number): HTMLElement | null {\n    return this.container.querySelector(`.dff-file-id-${index.toString()}`);\n  }\n\n  public removeDropHint(): void {\n    const dropHint = this.container.querySelector(\".dff-drop-hint\");\n\n    if (dropHint) {\n      dropHint.remove();\n    }\n  }\n\n  public renderDropHint(): void {\n    if (this.container.querySelector(\".dff-drop-hint\")) {\n      return;\n    }\n\n    const dropHint = document.createElement(\"div\");\n    dropHint.className = \"dff-drop-hint\";\n    this.setTextContent(dropHint, this.getTranslation(\"Drop your files here\"));\n\n    this.container.appendChild(dropHint);\n  }\n\n  public setDeleteFailed(index: number): void {\n    this.setErrorMessage(index, this.getTranslation(\"Delete failed\"));\n\n    this.enableDelete(index);\n  }\n\n  public setError(index: number): void {\n    this.setErrorMessage(index, this.getTranslation(\"Upload failed\"));\n\n    const el = this.findFileDiv(index);\n    if (el) {\n      el.classList.add(\"dff-upload-fail\");\n    }\n\n    this.removeProgress(index);\n    this.removeCancel(index);\n  }\n\n  public setErrorInvalidFiles(files: File[]): void {\n    const errorsMessages = document.createElement(\"ul\");\n\n    for (const file of files) {\n      const msg = document.createElement(\"li\");\n      const invalidFileTypeMessage = this.getTranslation(\"Invalid file type\");\n      this.setTextContent(msg, `${file.name}: ${invalidFileTypeMessage}`);\n      msg.className = \"dff-error\";\n      errorsMessages.appendChild(msg);\n    }\n\n    this.errors.replaceChildren(errorsMessages);\n    this.clearInput();\n  }\n\n  public setSuccess(index: number, size?: number): void {\n    const el = this.findFileDiv(index);\n    if (el) {\n      el.classList.add(\"dff-upload-success\");\n\n      if (size != null) {\n        const fileSizeInfo = document.createElement(\"span\");\n        this.setTextContent(fileSizeInfo, formatBytes(size, 2));\n        fileSizeInfo.className = \"dff-filesize\";\n\n        el.appendChild(fileSizeInfo);\n      }\n\n      const deleteLink = document.createElement(\"a\");\n      this.setTextContent(deleteLink, this.getTranslation(\"Delete\"));\n      deleteLink.className = \"dff-delete\";\n      deleteLink.setAttribute(\"data-index\", index.toString());\n      deleteLink.href = \"#\";\n\n      el.appendChild(deleteLink);\n    }\n\n    this.removeProgress(index);\n    this.removeCancel(index);\n  }\n\n  public updateProgress(index: number, percentage: string): void {\n    const el = this.container.querySelector(`.dff-file-id-${index.toString()}`);\n    if (el) {\n      const innerProgressSpan = el.querySelector(\".dff-progress-inner\");\n\n      if (innerProgressSpan) {\n        (innerProgressSpan as HTMLElement).style.width = `${percentage}%`;\n      }\n    }\n  }\n\n  private addFile(filename: string, uploadIndex: number): HTMLElement {\n    const div = document.createElement(\"div\");\n    div.className = `dff-file dff-file-id-${uploadIndex.toString()}`;\n\n    const nameSpan = document.createElement(\"span\");\n    nameSpan.innerHTML = escape(filename);\n    nameSpan.className = \"dff-filename\";\n    nameSpan.setAttribute(\"data-index\", uploadIndex.toString());\n\n    div.appendChild(nameSpan);\n    this.container.appendChild(div);\n\n    this.input.required = false;\n    return div;\n  }\n\n  private createErrorContainer = (parent: Element): Element => {\n    const div = document.createElement(\"div\");\n    div.className = \"dff-invalid-files\";\n    parent.appendChild(div);\n    return div;\n  };\n\n  private createFilesContainer = (parent: Element): Element => {\n    const div = document.createElement(\"div\");\n    div.className = \"dff-files\";\n    parent.appendChild(div);\n\n    return div;\n  };\n\n  private enableDelete(index: number): void {\n    const deleteLink = this.findDeleteLink(index);\n\n    if (deleteLink) {\n      deleteLink.classList.remove(\"dff-disabled\");\n    }\n  }\n\n  private findCancelSpan(index: number): HTMLElement | null {\n    const el = this.findFileDiv(index);\n\n    if (!el) {\n      return null;\n    }\n\n    return el.querySelector<HTMLElement>(\".dff-cancel\");\n  }\n\n  private findDeleteLink(index: number): HTMLElement | null {\n    const div = this.findFileDiv(index);\n    if (!div) {\n      return div;\n    }\n\n    return div.querySelector(\".dff-delete\");\n  }\n\n  private getTranslation(key: string) {\n    return this.translations[key] ?? key;\n  }\n\n  private removeCancel(index: number): void {\n    const cancelSpan = this.findCancelSpan(index);\n\n    if (cancelSpan) {\n      cancelSpan.remove();\n    }\n  }\n\n  private removeProgress(index: number): void {\n    const el = this.findFileDiv(index);\n\n    if (el) {\n      const progressSpan = el.querySelector(\".dff-progress\");\n\n      if (progressSpan) {\n        progressSpan.remove();\n      }\n    }\n  }\n\n  private setErrorMessage(index: number, message: string): void {\n    const el = this.findFileDiv(index);\n    if (!el) {\n      return;\n    }\n\n    const originalMessageSpan = el.querySelector(\".dff-error\");\n    if (originalMessageSpan) {\n      originalMessageSpan.remove();\n    }\n\n    const span = document.createElement(\"span\");\n    span.classList.add(\"dff-error\");\n    this.setTextContent(span, message);\n\n    el.appendChild(span);\n  }\n\n  private setTextContent(element: HTMLElement, text: string) {\n    element.append(document.createTextNode(text));\n  }\n}\n\nexport default RenderUploadFile;\n","export interface InitialExistingFile {\n  name: string;\n  size: number;\n  type: \"existing\";\n}\nexport type InitialFile =\n  | InitialExistingFile\n  | InitialPlaceholderFile\n  | InitialS3File\n  | InitialTusFile;\n\nexport interface InitialPlaceholderFile {\n  id: string;\n  name: string;\n  size: number;\n  type: \"placeholder\";\n}\n\nexport interface InitialS3File {\n  id: string;\n  name: string;\n  original_name: string;\n  size: number;\n  type: \"s3\";\n}\n\nexport interface InitialTusFile {\n  id: string;\n  name: string;\n  size: number;\n  type: \"tus\";\n  url: string;\n}\n\nexport type UploadType =\n  | \"existing\"\n  | \"placeholder\"\n  | \"s3\"\n  | \"tus\"\n  | \"uploadedS3\"\n  | \"uploadedTus\";\n\ninterface UploadParameters {\n  name: string;\n  status: UploadStatus;\n  type: UploadType;\n  uploadIndex: number;\n}\n\ntype UploadStatus = \"done\" | \"error\" | \"uploading\";\n\nabstract class BaseUpload {\n  name: string;\n  status: UploadStatus;\n  type: UploadType;\n  uploadIndex: number;\n\n  constructor({ name, status, type, uploadIndex }: UploadParameters) {\n    this.name = name;\n    this.status = status;\n    this.type = type;\n    this.uploadIndex = uploadIndex;\n  }\n\n  public async abort(): Promise<void> {\n    //\n  }\n  public async delete(): Promise<void> {\n    //\n  }\n\n  public abstract getId(): string | undefined;\n  public abstract getInitialFile(): InitialFile;\n  public abstract getSize(): number | undefined;\n}\n\nexport default BaseUpload;\n","function normalize (strArray) {\n  var resultArray = [];\n  if (strArray.length === 0) { return ''; }\n\n  if (typeof strArray[0] !== 'string') {\n    throw new TypeError('Url must be a string. Received ' + strArray[0]);\n  }\n\n  // If the first part is a plain protocol, we combine it with the next part.\n  if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n    var first = strArray.shift();\n    strArray[0] = first + strArray[0];\n  }\n\n  // There must be two or three slashes in the file protocol, two slashes in anything else.\n  if (strArray[0].match(/^file:\\/\\/\\//)) {\n    strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1:///');\n  } else {\n    strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1://');\n  }\n\n  for (var i = 0; i < strArray.length; i++) {\n    var component = strArray[i];\n\n    if (typeof component !== 'string') {\n      throw new TypeError('Url must be a string. Received ' + component);\n    }\n\n    if (component === '') { continue; }\n\n    if (i > 0) {\n      // Removing the starting slashes for each component but the first.\n      component = component.replace(/^[\\/]+/, '');\n    }\n    if (i < strArray.length - 1) {\n      // Removing the ending slashes for each component but the last.\n      component = component.replace(/[\\/]+$/, '');\n    } else {\n      // For the last component we will combine multiple slashes to a single one.\n      component = component.replace(/[\\/]+$/, '/');\n    }\n\n    resultArray.push(component);\n\n  }\n\n  var str = resultArray.join('/');\n  // Each input component is now separated by a single slash except the possible first plain protocol part.\n\n  // remove trailing slash before parameters or hash\n  str = str.replace(/\\/(\\?|&|#[^!])/g, '$1');\n\n  // replace ? in parameters with &\n  var parts = str.split('?');\n  str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');\n\n  return str;\n}\n\nexport default function urlJoin() {\n  var input;\n\n  if (typeof arguments[0] === 'object') {\n    input = arguments[0];\n  } else {\n    input = [].slice.call(arguments);\n  }\n\n  return normalize(input);\n}\n","import urljoin from \"url-join\";\n\nexport interface LocationInfo {\n  location: string;\n}\n\nexport interface MultipartUpload {\n  endpoint: string;\n  key: string;\n  uploadId: string;\n}\n\nexport interface Part {\n  ETag: string;\n  PartNumber: number;\n}\n\nexport interface UrlInfo {\n  url: string;\n}\n\nexport const MB = 1024 * 1024;\n\ninterface AbortMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  uploadId: string;\n}\n\nexport const abortMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  key,\n  uploadId\n}: AbortMultipartUploadParameters): Promise<unknown> => {\n  const filename = encodeURIComponent(key);\n  const uploadIdEnc = encodeURIComponent(uploadId);\n  const headers = new Headers({\n    \"X-CSRFToken\": csrfToken\n  });\n  const url = urljoin(endpoint, uploadIdEnc, `?key=${filename}`);\n  return fetch(url, {\n    headers: headers,\n    method: \"delete\"\n  }).then(response => {\n    return response.json();\n  });\n};\n\ninterface CompleteMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  parts: Part[];\n  uploadId: string;\n}\n\nexport const completeMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  key,\n  parts,\n  uploadId\n}: CompleteMultipartUploadParameters): Promise<LocationInfo> => {\n  const filename = encodeURIComponent(key);\n  const uploadIdEnc = encodeURIComponent(uploadId);\n  const headers = new Headers({\n    \"X-CSRFToken\": csrfToken\n  });\n  const url = urljoin(endpoint, uploadIdEnc, \"complete\", `?key=${filename}`);\n  return fetch(url, {\n    body: JSON.stringify({\n      parts: parts\n    }),\n    headers: headers,\n    method: \"post\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as LocationInfo;\n    });\n};\n\ninterface CreateMultipartUploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  file: File;\n  s3UploadDir: string;\n}\n\nexport const createMultipartUpload = ({\n  csrfToken,\n  endpoint,\n  file,\n  s3UploadDir\n}: CreateMultipartUploadParameters): Promise<MultipartUpload> => {\n  const headers = new Headers({\n    accept: \"application/json\",\n    \"content-type\": \"application/json\",\n    \"X-CSRFToken\": csrfToken\n  });\n  return fetch(endpoint, {\n    body: JSON.stringify({\n      contentType: file.type,\n      filename: file.name,\n      s3UploadDir: s3UploadDir\n    }),\n    headers: headers,\n    method: \"post\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as MultipartUpload;\n    });\n};\n\nexport const getChunkSize = (file: File): number =>\n  Math.ceil(file.size / 10000);\n\ninterface PrepareUploadPartParameters {\n  csrfToken: string;\n  endpoint: string;\n  key: string;\n  number: number;\n  uploadId: string;\n}\n\nexport const prepareUploadPart = ({\n  csrfToken,\n  endpoint,\n  key,\n  number,\n  uploadId\n}: PrepareUploadPartParameters): Promise<UrlInfo> => {\n  const filename = encodeURIComponent(key);\n  const headers = new Headers({ \"X-CSRFToken\": csrfToken });\n  const url = urljoin(\n    endpoint,\n    uploadId,\n    number.toString(),\n    `?key=${filename}`\n  );\n  return fetch(url, {\n    headers: headers,\n    method: \"get\"\n  })\n    .then(response => {\n      return response.json();\n    })\n    .then(data => {\n      return data as UrlInfo;\n    });\n};\n\nexport const remove = (arr: unknown[], el: unknown): void => {\n  const i = arr.indexOf(el);\n  if (i !== -1) {\n    arr.splice(i, 1);\n  }\n};\n","// The following code is adapted from https://github.com/transloadit/uppy/blob/master/packages/%40uppy/aws-s3-multipart/src/MultipartUploader.js\n// which is released under a MIT License (https://github.com/transloadit/uppy/blob/master/LICENSE)\n\nimport BaseUpload, { InitialFile } from \"./base_upload.ts\";\nimport {\n  abortMultipartUpload,\n  completeMultipartUpload,\n  createMultipartUpload,\n  getChunkSize,\n  MB,\n  MultipartUpload,\n  Part,\n  prepareUploadPart,\n  remove,\n  UrlInfo\n} from \"./s3_utils.ts\";\n\ninterface ChunkState {\n  busy: boolean;\n  done: boolean;\n  etag?: string;\n  uploaded: number;\n}\n\ninterface S3UploadParameters {\n  csrfToken: string;\n  endpoint: string;\n  file: File;\n  s3UploadDir: string;\n  uploadIndex: number;\n}\n\nclass S3Upload extends BaseUpload {\n  public onError?: (error: unknown) => void;\n  public onProgress?: (bytesUploaded: number, bytesTotal: number) => void;\n  public onSuccess?: () => void;\n\n  private chunks: Blob[];\n  private chunkState: ChunkState[];\n  private createdPromise: Promise<MultipartUpload>;\n  private csrfToken: string;\n  private endpoint: string;\n  private file: File;\n  private key: null | string;\n  private parts: Part[];\n  private s3UploadDir: string;\n  private uploadId: null | string;\n  private uploading: XMLHttpRequest[];\n\n  constructor({\n    csrfToken,\n    endpoint,\n    file,\n    s3UploadDir,\n    uploadIndex\n  }: S3UploadParameters) {\n    super({ name: file.name, status: \"uploading\", type: \"s3\", uploadIndex });\n\n    this.csrfToken = csrfToken;\n    this.endpoint = endpoint;\n    this.file = file;\n    this.s3UploadDir = s3UploadDir;\n\n    this.key = null;\n    this.uploadId = null;\n    this.parts = [];\n\n    // Do `this.createdPromise.then(OP)` to execute an operation `OP` _only_ if the\n    // upload was created already. That also ensures that the sequencing is right\n    // (so the `OP` definitely happens if the upload is created).\n    //\n    // This mostly exists to make `abortUpload` work well: only sending the abort request if\n    // the upload was already created, and if the createMultipartUpload request is still in flight,\n    // aborting it immediately after it finishes.\n    this.createdPromise = Promise.reject(new Error());\n    this.chunks = [];\n    this.chunkState = [];\n    this.uploading = [];\n    this.onError = undefined;\n    this.onProgress = undefined;\n    this.onSuccess = undefined;\n\n    this.initChunks();\n\n    this.createdPromise.catch(() => ({})); // silence uncaught rejection warning\n  }\n\n  public async abort(): Promise<void> {\n    this.uploading.slice().forEach(xhr => {\n      xhr.abort();\n    });\n    this.uploading = [];\n\n    await this.createdPromise;\n\n    if (this.key && this.uploadId) {\n      await abortMultipartUpload({\n        csrfToken: this.csrfToken,\n        endpoint: this.endpoint,\n        key: this.key,\n        uploadId: this.uploadId\n      });\n    }\n  }\n\n  public async delete(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public getId(): string | undefined {\n    return this.uploadId ?? undefined;\n  }\n\n  public getInitialFile(): InitialFile {\n    return {\n      id: this.uploadId ?? \"\",\n      name: this.key ?? \"\",\n      original_name: this.file.name,\n      size: this.file.size,\n      type: \"s3\"\n    };\n  }\n\n  public getSize(): number {\n    return this.file.size;\n  }\n\n  public start(): void {\n    void this.createUpload();\n  }\n\n  private completeUpload(): Promise<void> {\n    // Parts may not have completed uploading in sorted order, if limit > 1.\n    this.parts.sort((a, b) => a.PartNumber - b.PartNumber);\n\n    if (!this.uploadId || !this.key) {\n      return Promise.resolve();\n    }\n\n    return completeMultipartUpload({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      key: this.key,\n      parts: this.parts,\n      uploadId: this.uploadId\n    }).then(\n      () => {\n        if (this.onSuccess) {\n          this.onSuccess();\n        }\n      },\n      (err: unknown) => {\n        this.handleError(err as Error);\n      }\n    );\n  }\n\n  private createUpload(): Promise<void> {\n    this.createdPromise = createMultipartUpload({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      file: this.file,\n      s3UploadDir: this.s3UploadDir\n    });\n    return this.createdPromise\n      .then((result: MultipartUpload | null) => {\n        const valid =\n          typeof result === \"object\" &&\n          result &&\n          typeof result.uploadId === \"string\" &&\n          typeof result.key === \"string\";\n        if (!valid) {\n          throw new TypeError(\n            \"AwsS3/Multipart: Got incorrect result from `createMultipartUpload()`, expected an object `{ uploadId, key }`.\"\n          );\n        }\n\n        this.key = result.key;\n        this.uploadId = result.uploadId;\n\n        this.uploadParts();\n      })\n      .catch((err: unknown) => {\n        this.handleError(err);\n      });\n  }\n\n  private handleError(error: unknown): void {\n    if (this.onError) {\n      this.onError(error);\n    } else {\n      throw error;\n    }\n  }\n\n  private initChunks(): void {\n    const chunks: Blob[] = [];\n    const desiredChunkSize = getChunkSize(this.file);\n    // at least 5MB per request, at most 10k requests\n    const minChunkSize = Math.max(5 * MB, Math.ceil(this.file.size / 10000));\n    const chunkSize = Math.max(desiredChunkSize, minChunkSize);\n\n    for (let i = 0; i < this.file.size; i += chunkSize) {\n      const end = Math.min(this.file.size, i + chunkSize);\n      chunks.push(this.file.slice(i, end));\n    }\n\n    this.chunks = chunks;\n    this.chunkState = chunks.map(() => ({\n      busy: false,\n      done: false,\n      uploaded: 0\n    }));\n  }\n\n  private onPartComplete(index: number, etag: string): void {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.etag = etag;\n      state.done = true;\n    }\n\n    const part = {\n      ETag: etag,\n      PartNumber: index + 1\n    };\n    this.parts.push(part);\n\n    this.uploadParts();\n  }\n\n  private onPartProgress(index: number, sent: number): void {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.uploaded = sent;\n    }\n\n    if (this.onProgress) {\n      const totalUploaded = this.chunkState.reduce((n, c) => n + c.uploaded, 0);\n      this.onProgress(totalUploaded, this.file.size);\n    }\n  }\n\n  private uploadPart(index: number): Promise<void> {\n    const state = this.chunkState[index];\n\n    if (state) {\n      state.busy = true;\n    }\n\n    if (!this.key || !this.uploadId) {\n      return Promise.resolve();\n    }\n\n    return prepareUploadPart({\n      csrfToken: this.csrfToken,\n      endpoint: this.endpoint,\n      key: this.key,\n      number: index + 1,\n      uploadId: this.uploadId\n    })\n      .then(result => {\n        const valid =\n          typeof result === \"object\" && typeof result.url === \"string\";\n        if (!valid) {\n          throw new TypeError(\n            \"AwsS3/Multipart: Got incorrect result from `prepareUploadPart()`, expected an object `{ url }`.\"\n          );\n        }\n        return result;\n      })\n      .then(\n        ({ url }: UrlInfo) => {\n          this.uploadPartBytes(index, url);\n        },\n        (err: unknown) => {\n          this.handleError(err);\n        }\n      );\n  }\n\n  private uploadPartBytes(index: number, url: string): void {\n    const body = this.chunks[index];\n    const xhr = new XMLHttpRequest();\n    xhr.open(\"PUT\", url, true);\n    xhr.responseType = \"text\";\n\n    this.uploading.push(xhr);\n\n    xhr.upload.addEventListener(\"progress\", ev => {\n      if (!ev.lengthComputable) {\n        return;\n      }\n\n      this.onPartProgress(index, ev.loaded);\n    });\n\n    xhr.addEventListener(\"abort\", () => {\n      remove(this.uploading, xhr);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n    });\n\n    xhr.addEventListener(\"load\", () => {\n      remove(this.uploading, xhr);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n\n      if (xhr.status < 200 || xhr.status >= 300) {\n        this.handleError(new Error(\"Non 2xx\"));\n        return;\n      }\n\n      this.onPartProgress(index, body?.size ?? 0);\n\n      // NOTE This must be allowed by CORS.\n      const etag = xhr.getResponseHeader(\"ETag\");\n      if (etag === null) {\n        this.handleError(\n          new Error(\n            \"AwsS3/Multipart: Could not read the ETag header. This likely means CORS is not configured correctly on the S3 Bucket. See https://uppy.io/docs/aws-s3-multipart#S3-Bucket-Configuration for instructions.\"\n          )\n        );\n        return;\n      }\n\n      this.onPartComplete(index, etag);\n    });\n\n    xhr.addEventListener(\"error\", () => {\n      remove(this.uploading, xhr);\n\n      const state = this.chunkState[index];\n\n      if (state) {\n        state.busy = false;\n      }\n\n      const error = new Error(\"Unknown error\");\n      this.handleError(error);\n    });\n    xhr.send(body);\n  }\n\n  private uploadParts(): void {\n    const need = 1 - this.uploading.length;\n    if (need === 0) {\n      return;\n    }\n\n    // All parts are uploaded.\n    if (this.chunkState.every(state => state.done)) {\n      void this.completeUpload();\n      return;\n    }\n\n    const candidates = [];\n    for (let i = 0; i < this.chunkState.length; i++) {\n      const state = this.chunkState[i];\n\n      if (!state || state.done || state.busy) {\n        continue;\n      }\n\n      candidates.push(i);\n      if (candidates.length >= need) {\n        break;\n      }\n    }\n\n    candidates.forEach(index => {\n      void this.uploadPart(index);\n    });\n  }\n}\n\nexport default S3Upload;\n","class DetailedError extends Error {\n  constructor(message, causingErr = null, req = null, res = null) {\n    super(message)\n\n    this.originalRequest = req\n    this.originalResponse = res\n    this.causingError = causingErr\n\n    if (causingErr != null) {\n      message += `, caused by ${causingErr.toString()}`\n    }\n\n    if (req != null) {\n      const requestId = req.getHeader('X-Request-ID') || 'n/a'\n      const method = req.getMethod()\n      const url = req.getURL()\n      const status = res ? res.getStatus() : 'n/a'\n      const body = res ? res.getBody() || '' : 'n/a'\n      message += `, originated from request (method: ${method}, url: ${url}, response code: ${status}, response text: ${body}, request id: ${requestId})`\n    }\n    this.message = message\n  }\n}\n\nexport default DetailedError\n","/**\n *  base64.ts\n *\n *  Licensed under the BSD 3-Clause License.\n *    http://opensource.org/licenses/BSD-3-Clause\n *\n *  References:\n *    http://en.wikipedia.org/wiki/Base64\n *\n * @author Dan Kogai (https://github.com/dankogai)\n */\nconst version = '3.7.8';\n/**\n * @deprecated use lowercase `version`.\n */\nconst VERSION = version;\nconst _hasBuffer = typeof Buffer === 'function';\nconst _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;\nconst _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;\nconst b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nconst b64chs = Array.prototype.slice.call(b64ch);\nconst b64tab = ((a) => {\n    let tab = {};\n    a.forEach((c, i) => tab[c] = i);\n    return tab;\n})(b64chs);\nconst b64re = /^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/;\nconst _fromCC = String.fromCharCode.bind(String);\nconst _U8Afrom = typeof Uint8Array.from === 'function'\n    ? Uint8Array.from.bind(Uint8Array)\n    : (it) => new Uint8Array(Array.prototype.slice.call(it, 0));\nconst _mkUriSafe = (src) => src\n    .replace(/=/g, '').replace(/[+\\/]/g, (m0) => m0 == '+' ? '-' : '_');\nconst _tidyB64 = (s) => s.replace(/[^A-Za-z0-9\\+\\/]/g, '');\n/**\n * polyfill version of `btoa`\n */\nconst btoaPolyfill = (bin) => {\n    // console.log('polyfilled');\n    let u32, c0, c1, c2, asc = '';\n    const pad = bin.length % 3;\n    for (let i = 0; i < bin.length;) {\n        if ((c0 = bin.charCodeAt(i++)) > 255 ||\n            (c1 = bin.charCodeAt(i++)) > 255 ||\n            (c2 = bin.charCodeAt(i++)) > 255)\n            throw new TypeError('invalid character found');\n        u32 = (c0 << 16) | (c1 << 8) | c2;\n        asc += b64chs[u32 >> 18 & 63]\n            + b64chs[u32 >> 12 & 63]\n            + b64chs[u32 >> 6 & 63]\n            + b64chs[u32 & 63];\n    }\n    return pad ? asc.slice(0, pad - 3) + \"===\".substring(pad) : asc;\n};\n/**\n * does what `window.btoa` of web browsers do.\n * @param {String} bin binary string\n * @returns {string} Base64-encoded string\n */\nconst _btoa = typeof btoa === 'function' ? (bin) => btoa(bin)\n    : _hasBuffer ? (bin) => Buffer.from(bin, 'binary').toString('base64')\n        : btoaPolyfill;\nconst _fromUint8Array = _hasBuffer\n    ? (u8a) => Buffer.from(u8a).toString('base64')\n    : (u8a) => {\n        // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326\n        const maxargs = 0x1000;\n        let strs = [];\n        for (let i = 0, l = u8a.length; i < l; i += maxargs) {\n            strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));\n        }\n        return _btoa(strs.join(''));\n    };\n/**\n * converts a Uint8Array to a Base64 string.\n * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5\n * @returns {string} Base64 string\n */\nconst fromUint8Array = (u8a, urlsafe = false) => urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const utob = (src: string) => unescape(encodeURIComponent(src));\n// reverting good old fationed regexp\nconst cb_utob = (c) => {\n    if (c.length < 2) {\n        var cc = c.charCodeAt(0);\n        return cc < 0x80 ? c\n            : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))\n                + _fromCC(0x80 | (cc & 0x3f)))\n                : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))\n                    + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n                    + _fromCC(0x80 | (cc & 0x3f)));\n    }\n    else {\n        var cc = 0x10000\n            + (c.charCodeAt(0) - 0xD800) * 0x400\n            + (c.charCodeAt(1) - 0xDC00);\n        return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))\n            + _fromCC(0x80 | ((cc >>> 12) & 0x3f))\n            + _fromCC(0x80 | ((cc >>> 6) & 0x3f))\n            + _fromCC(0x80 | (cc & 0x3f)));\n    }\n};\nconst re_utob = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g;\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-8 string\n * @returns {string} UTF-16 string\n */\nconst utob = (u) => u.replace(re_utob, cb_utob);\n//\nconst _encode = _hasBuffer\n    ? (s) => Buffer.from(s, 'utf8').toString('base64')\n    : _TE\n        ? (s) => _fromUint8Array(_TE.encode(s))\n        : (s) => _btoa(utob(s));\n/**\n * converts a UTF-8-encoded string to a Base64 string.\n * @param {boolean} [urlsafe] if `true` make the result URL-safe\n * @returns {string} Base64 string\n */\nconst encode = (src, urlsafe = false) => urlsafe\n    ? _mkUriSafe(_encode(src))\n    : _encode(src);\n/**\n * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5.\n * @returns {string} Base64 string\n */\nconst encodeURI = (src) => encode(src, true);\n// This trick is found broken https://github.com/dankogai/js-base64/issues/130\n// const btou = (src: string) => decodeURIComponent(escape(src));\n// reverting good old fationed regexp\nconst re_btou = /[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g;\nconst cb_btou = (cccc) => {\n    switch (cccc.length) {\n        case 4:\n            var cp = ((0x07 & cccc.charCodeAt(0)) << 18)\n                | ((0x3f & cccc.charCodeAt(1)) << 12)\n                | ((0x3f & cccc.charCodeAt(2)) << 6)\n                | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;\n            return (_fromCC((offset >>> 10) + 0xD800)\n                + _fromCC((offset & 0x3FF) + 0xDC00));\n        case 3:\n            return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)\n                | ((0x3f & cccc.charCodeAt(1)) << 6)\n                | (0x3f & cccc.charCodeAt(2)));\n        default:\n            return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)\n                | (0x3f & cccc.charCodeAt(1)));\n    }\n};\n/**\n * @deprecated should have been internal use only.\n * @param {string} src UTF-16 string\n * @returns {string} UTF-8 string\n */\nconst btou = (b) => b.replace(re_btou, cb_btou);\n/**\n * polyfill version of `atob`\n */\nconst atobPolyfill = (asc) => {\n    // console.log('polyfilled');\n    asc = asc.replace(/\\s+/g, '');\n    if (!b64re.test(asc))\n        throw new TypeError('malformed base64.');\n    asc += '=='.slice(2 - (asc.length & 3));\n    let u24, r1, r2;\n    let binArray = []; // use array to avoid minor gc in loop\n    for (let i = 0; i < asc.length;) {\n        u24 = b64tab[asc.charAt(i++)] << 18\n            | b64tab[asc.charAt(i++)] << 12\n            | (r1 = b64tab[asc.charAt(i++)]) << 6\n            | (r2 = b64tab[asc.charAt(i++)]);\n        if (r1 === 64) {\n            binArray.push(_fromCC(u24 >> 16 & 255));\n        }\n        else if (r2 === 64) {\n            binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255));\n        }\n        else {\n            binArray.push(_fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255));\n        }\n    }\n    return binArray.join('');\n};\n/**\n * does what `window.atob` of web browsers do.\n * @param {String} asc Base64-encoded string\n * @returns {string} binary string\n */\nconst _atob = typeof atob === 'function' ? (asc) => atob(_tidyB64(asc))\n    : _hasBuffer ? (asc) => Buffer.from(asc, 'base64').toString('binary')\n        : atobPolyfill;\n//\nconst _toUint8Array = _hasBuffer\n    ? (a) => _U8Afrom(Buffer.from(a, 'base64'))\n    : (a) => _U8Afrom(_atob(a).split('').map(c => c.charCodeAt(0)));\n/**\n * converts a Base64 string to a Uint8Array.\n */\nconst toUint8Array = (a) => _toUint8Array(_unURI(a));\n//\nconst _decode = _hasBuffer\n    ? (a) => Buffer.from(a, 'base64').toString('utf8')\n    : _TD\n        ? (a) => _TD.decode(_toUint8Array(a))\n        : (a) => btou(_atob(a));\nconst _unURI = (a) => _tidyB64(a.replace(/[-_]/g, (m0) => m0 == '-' ? '+' : '/'));\n/**\n * converts a Base64 string to a UTF-8 string.\n * @param {String} src Base64 string.  Both normal and URL-safe are supported\n * @returns {string} UTF-8 string\n */\nconst decode = (src) => _decode(_unURI(src));\n/**\n * check if a value is a valid Base64 string\n * @param {String} src a value to check\n  */\nconst isValid = (src) => {\n    if (typeof src !== 'string')\n        return false;\n    const s = src.replace(/\\s+/g, '').replace(/={0,2}$/, '');\n    return !/[^\\s0-9a-zA-Z\\+/]/.test(s) || !/[^\\s0-9a-zA-Z\\-_]/.test(s);\n};\n//\nconst _noEnum = (v) => {\n    return {\n        value: v, enumerable: false, writable: true, configurable: true\n    };\n};\n/**\n * extend String.prototype with relevant methods\n */\nconst extendString = function () {\n    const _add = (name, body) => Object.defineProperty(String.prototype, name, _noEnum(body));\n    _add('fromBase64', function () { return decode(this); });\n    _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });\n    _add('toBase64URI', function () { return encode(this, true); });\n    _add('toBase64URL', function () { return encode(this, true); });\n    _add('toUint8Array', function () { return toUint8Array(this); });\n};\n/**\n * extend Uint8Array.prototype with relevant methods\n */\nconst extendUint8Array = function () {\n    const _add = (name, body) => Object.defineProperty(Uint8Array.prototype, name, _noEnum(body));\n    _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });\n    _add('toBase64URI', function () { return fromUint8Array(this, true); });\n    _add('toBase64URL', function () { return fromUint8Array(this, true); });\n};\n/**\n * extend Builtin prototypes with relevant methods\n */\nconst extendBuiltins = () => {\n    extendString();\n    extendUint8Array();\n};\nconst gBase64 = {\n    version: version,\n    VERSION: VERSION,\n    atob: _atob,\n    atobPolyfill: atobPolyfill,\n    btoa: _btoa,\n    btoaPolyfill: btoaPolyfill,\n    fromBase64: decode,\n    toBase64: encode,\n    encode: encode,\n    encodeURI: encodeURI,\n    encodeURL: encodeURI,\n    utob: utob,\n    btou: btou,\n    decode: decode,\n    isValid: isValid,\n    fromUint8Array: fromUint8Array,\n    toUint8Array: toUint8Array,\n    extendString: extendString,\n    extendUint8Array: extendUint8Array,\n    extendBuiltins: extendBuiltins\n};\n// makecjs:CUT //\nexport { version };\nexport { VERSION };\nexport { _atob as atob };\nexport { atobPolyfill };\nexport { _btoa as btoa };\nexport { btoaPolyfill };\nexport { decode as fromBase64 };\nexport { encode as toBase64 };\nexport { utob };\nexport { encode };\nexport { encodeURI };\nexport { encodeURI as encodeURL };\nexport { btou };\nexport { decode };\nexport { isValid };\nexport { fromUint8Array };\nexport { toUint8Array };\nexport { extendString };\nexport { extendUint8Array };\nexport { extendBuiltins };\n// and finally,\nexport { gBase64 as Base64 };\n","'use strict';\n\nvar required = require('requires-port')\n  , qs = require('querystringify')\n  , controlOrWhitespace = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/\n  , CRHTLF = /[\\n\\r\\t]/g\n  , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n  , port = /:\\d+$/\n  , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n  , windowsDriveLetter = /^[a-zA-Z]:/;\n\n/**\n * Remove control characters and whitespace from the beginning of a string.\n *\n * @param {Object|String} str String to trim.\n * @returns {String} A new string representing `str` stripped of control\n *     characters and whitespace from its beginning.\n * @public\n */\nfunction trimLeft(str) {\n  return (str ? str : '').toString().replace(controlOrWhitespace, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n *    indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n *    the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n  ['#', 'hash'],                        // Extract from the back.\n  ['?', 'query'],                       // Extract from the back.\n  function sanitize(address, url) {     // Sanitize what is left of the address\n    return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n  },\n  ['/', 'pathname'],                    // Extract from the back.\n  ['@', 'auth', 1],                     // Extract from the front.\n  [NaN, 'host', undefined, 1, 1],       // Set left over value.\n  [/:(\\d*)$/, 'port', undefined, 1],    // RegExp the back.\n  [NaN, 'hostname', undefined, 1, 1]    // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n  var globalVar;\n\n  if (typeof window !== 'undefined') globalVar = window;\n  else if (typeof global !== 'undefined') globalVar = global;\n  else if (typeof self !== 'undefined') globalVar = self;\n  else globalVar = {};\n\n  var location = globalVar.location || {};\n  loc = loc || location;\n\n  var finaldestination = {}\n    , type = typeof loc\n    , key;\n\n  if ('blob:' === loc.protocol) {\n    finaldestination = new Url(unescape(loc.pathname), {});\n  } else if ('string' === type) {\n    finaldestination = new Url(loc, {});\n    for (key in ignore) delete finaldestination[key];\n  } else if ('object' === type) {\n    for (key in loc) {\n      if (key in ignore) continue;\n      finaldestination[key] = loc[key];\n    }\n\n    if (finaldestination.slashes === undefined) {\n      finaldestination.slashes = slashes.test(loc.href);\n    }\n  }\n\n  return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n  return (\n    scheme === 'file:' ||\n    scheme === 'ftp:' ||\n    scheme === 'http:' ||\n    scheme === 'https:' ||\n    scheme === 'ws:' ||\n    scheme === 'wss:'\n  );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n  location = location || {};\n\n  var match = protocolre.exec(address);\n  var protocol = match[1] ? match[1].toLowerCase() : '';\n  var forwardSlashes = !!match[2];\n  var otherSlashes = !!match[3];\n  var slashesCount = 0;\n  var rest;\n\n  if (forwardSlashes) {\n    if (otherSlashes) {\n      rest = match[2] + match[3] + match[4];\n      slashesCount = match[2].length + match[3].length;\n    } else {\n      rest = match[2] + match[4];\n      slashesCount = match[2].length;\n    }\n  } else {\n    if (otherSlashes) {\n      rest = match[3] + match[4];\n      slashesCount = match[3].length;\n    } else {\n      rest = match[4]\n    }\n  }\n\n  if (protocol === 'file:') {\n    if (slashesCount >= 2) {\n      rest = rest.slice(2);\n    }\n  } else if (isSpecial(protocol)) {\n    rest = match[4];\n  } else if (protocol) {\n    if (forwardSlashes) {\n      rest = rest.slice(2);\n    }\n  } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n    rest = match[4];\n  }\n\n  return {\n    protocol: protocol,\n    slashes: forwardSlashes || isSpecial(protocol),\n    slashesCount: slashesCount,\n    rest: rest\n  };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n  if (relative === '') return base;\n\n  var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n    , i = path.length\n    , last = path[i - 1]\n    , unshift = false\n    , up = 0;\n\n  while (i--) {\n    if (path[i] === '.') {\n      path.splice(i, 1);\n    } else if (path[i] === '..') {\n      path.splice(i, 1);\n      up++;\n    } else if (up) {\n      if (i === 0) unshift = true;\n      path.splice(i, 1);\n      up--;\n    }\n  }\n\n  if (unshift) path.unshift('');\n  if (last === '.' || last === '..') path.push('');\n\n  return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n  address = trimLeft(address);\n  address = address.replace(CRHTLF, '');\n\n  if (!(this instanceof Url)) {\n    return new Url(address, location, parser);\n  }\n\n  var relative, extracted, parse, instruction, index, key\n    , instructions = rules.slice()\n    , type = typeof location\n    , url = this\n    , i = 0;\n\n  //\n  // The following if statements allows this module two have compatibility with\n  // 2 different API:\n  //\n  // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n  //    where the boolean indicates that the query string should also be parsed.\n  //\n  // 2. The `URL` interface of the browser which accepts a URL, object as\n  //    arguments. The supplied object will be used as default values / fall-back\n  //    for relative paths.\n  //\n  if ('object' !== type && 'string' !== type) {\n    parser = location;\n    location = null;\n  }\n\n  if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n  location = lolcation(location);\n\n  //\n  // Extract protocol information before running the instructions.\n  //\n  extracted = extractProtocol(address || '', location);\n  relative = !extracted.protocol && !extracted.slashes;\n  url.slashes = extracted.slashes || relative && location.slashes;\n  url.protocol = extracted.protocol || location.protocol || '';\n  address = extracted.rest;\n\n  //\n  // When the authority component is absent the URL starts with a path\n  // component.\n  //\n  if (\n    extracted.protocol === 'file:' && (\n      extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n    (!extracted.slashes &&\n      (extracted.protocol ||\n        extracted.slashesCount < 2 ||\n        !isSpecial(url.protocol)))\n  ) {\n    instructions[3] = [/(.*)/, 'pathname'];\n  }\n\n  for (; i < instructions.length; i++) {\n    instruction = instructions[i];\n\n    if (typeof instruction === 'function') {\n      address = instruction(address, url);\n      continue;\n    }\n\n    parse = instruction[0];\n    key = instruction[1];\n\n    if (parse !== parse) {\n      url[key] = address;\n    } else if ('string' === typeof parse) {\n      index = parse === '@'\n        ? address.lastIndexOf(parse)\n        : address.indexOf(parse);\n\n      if (~index) {\n        if ('number' === typeof instruction[2]) {\n          url[key] = address.slice(0, index);\n          address = address.slice(index + instruction[2]);\n        } else {\n          url[key] = address.slice(index);\n          address = address.slice(0, index);\n        }\n      }\n    } else if ((index = parse.exec(address))) {\n      url[key] = index[1];\n      address = address.slice(0, index.index);\n    }\n\n    url[key] = url[key] || (\n      relative && instruction[3] ? location[key] || '' : ''\n    );\n\n    //\n    // Hostname, host and protocol should be lowercased so they can be used to\n    // create a proper `origin`.\n    //\n    if (instruction[4]) url[key] = url[key].toLowerCase();\n  }\n\n  //\n  // Also parse the supplied query string in to an object. If we're supplied\n  // with a custom parser as function use that instead of the default build-in\n  // parser.\n  //\n  if (parser) url.query = parser(url.query);\n\n  //\n  // If the URL is relative, resolve the pathname against the base URL.\n  //\n  if (\n      relative\n    && location.slashes\n    && url.pathname.charAt(0) !== '/'\n    && (url.pathname !== '' || location.pathname !== '')\n  ) {\n    url.pathname = resolve(url.pathname, location.pathname);\n  }\n\n  //\n  // Default to a / for pathname if none exists. This normalizes the URL\n  // to always have a /\n  //\n  if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n    url.pathname = '/' + url.pathname;\n  }\n\n  //\n  // We should not add port numbers if they are already the default port number\n  // for a given protocol. As the host also contains the port number we're going\n  // override it with the hostname which contains no port number.\n  //\n  if (!required(url.port, url.protocol)) {\n    url.host = url.hostname;\n    url.port = '';\n  }\n\n  //\n  // Parse down the `auth` for the username and password.\n  //\n  url.username = url.password = '';\n\n  if (url.auth) {\n    index = url.auth.indexOf(':');\n\n    if (~index) {\n      url.username = url.auth.slice(0, index);\n      url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n      url.password = url.auth.slice(index + 1);\n      url.password = encodeURIComponent(decodeURIComponent(url.password))\n    } else {\n      url.username = encodeURIComponent(decodeURIComponent(url.auth));\n    }\n\n    url.auth = url.password ? url.username +':'+ url.password : url.username;\n  }\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  //\n  // The href is just the compiled result.\n  //\n  url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part          Property we need to adjust.\n * @param {Mixed} value          The newly assigned value.\n * @param {Boolean|Function} fn  When setting the query, it will be the function\n *                               used to parse the query.\n *                               When setting the protocol, double slash will be\n *                               removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n  var url = this;\n\n  switch (part) {\n    case 'query':\n      if ('string' === typeof value && value.length) {\n        value = (fn || qs.parse)(value);\n      }\n\n      url[part] = value;\n      break;\n\n    case 'port':\n      url[part] = value;\n\n      if (!required(value, url.protocol)) {\n        url.host = url.hostname;\n        url[part] = '';\n      } else if (value) {\n        url.host = url.hostname +':'+ value;\n      }\n\n      break;\n\n    case 'hostname':\n      url[part] = value;\n\n      if (url.port) value += ':'+ url.port;\n      url.host = value;\n      break;\n\n    case 'host':\n      url[part] = value;\n\n      if (port.test(value)) {\n        value = value.split(':');\n        url.port = value.pop();\n        url.hostname = value.join(':');\n      } else {\n        url.hostname = value;\n        url.port = '';\n      }\n\n      break;\n\n    case 'protocol':\n      url.protocol = value.toLowerCase();\n      url.slashes = !fn;\n      break;\n\n    case 'pathname':\n    case 'hash':\n      if (value) {\n        var char = part === 'pathname' ? '/' : '#';\n        url[part] = value.charAt(0) !== char ? char + value : value;\n      } else {\n        url[part] = value;\n      }\n      break;\n\n    case 'username':\n    case 'password':\n      url[part] = encodeURIComponent(value);\n      break;\n\n    case 'auth':\n      var index = value.indexOf(':');\n\n      if (~index) {\n        url.username = value.slice(0, index);\n        url.username = encodeURIComponent(decodeURIComponent(url.username));\n\n        url.password = value.slice(index + 1);\n        url.password = encodeURIComponent(decodeURIComponent(url.password));\n      } else {\n        url.username = encodeURIComponent(decodeURIComponent(value));\n      }\n  }\n\n  for (var i = 0; i < rules.length; i++) {\n    var ins = rules[i];\n\n    if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n  }\n\n  url.auth = url.password ? url.username +':'+ url.password : url.username;\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  url.href = url.toString();\n\n  return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n  if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n  var query\n    , url = this\n    , host = url.host\n    , protocol = url.protocol;\n\n  if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n  var result =\n    protocol +\n    ((url.protocol && url.slashes) || isSpecial(url.protocol) ? '//' : '');\n\n  if (url.username) {\n    result += url.username;\n    if (url.password) result += ':'+ url.password;\n    result += '@';\n  } else if (url.password) {\n    result += ':'+ url.password;\n    result += '@';\n  } else if (\n    url.protocol !== 'file:' &&\n    isSpecial(url.protocol) &&\n    !host &&\n    url.pathname !== '/'\n  ) {\n    //\n    // Add back the empty userinfo, otherwise the original invalid URL\n    // might be transformed into a valid one with `url.pathname` as host.\n    //\n    result += '@';\n  }\n\n  //\n  // Trailing colon is removed from `url.host` when it is parsed. If it still\n  // ends with a colon, then add back the trailing colon that was removed. This\n  // prevents an invalid URL from being transformed into a valid one.\n  //\n  if (host[host.length - 1] === ':' || (port.test(url.hostname) && !url.port)) {\n    host += ':';\n  }\n\n  result += host + url.pathname;\n\n  query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n  if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n  if (url.hash) result += url.hash;\n\n  return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = qs;\n\nmodule.exports = Url;\n","'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n  protocol = protocol.split(':')[0];\n  port = +port;\n\n  if (!port) return false;\n\n  switch (protocol) {\n    case 'http':\n    case 'ws':\n    return port !== 80;\n\n    case 'https':\n    case 'wss':\n    return port !== 443;\n\n    case 'ftp':\n    return port !== 21;\n\n    case 'gopher':\n    return port !== 70;\n\n    case 'file':\n    return false;\n  }\n\n  return port !== 0;\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n  try {\n    return decodeURIComponent(input.replace(/\\+/g, ' '));\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n  try {\n    return encodeURIComponent(input);\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n  var parser = /([^=?#&]+)=?([^&]*)/g\n    , result = {}\n    , part;\n\n  while (part = parser.exec(query)) {\n    var key = decode(part[1])\n      , value = decode(part[2]);\n\n    //\n    // Prevent overriding of existing properties. This ensures that build-in\n    // methods like `toString` or __proto__ are not overriden by malicious\n    // querystrings.\n    //\n    // In the case if failed decoding, we want to omit the key/value pairs\n    // from the result.\n    //\n    if (key === null || value === null || key in result) continue;\n    result[key] = value;\n  }\n\n  return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n  prefix = prefix || '';\n\n  var pairs = []\n    , value\n    , key;\n\n  //\n  // Optionally prefix with a '?' if needed\n  //\n  if ('string' !== typeof prefix) prefix = '?';\n\n  for (key in obj) {\n    if (has.call(obj, key)) {\n      value = obj[key];\n\n      //\n      // Edge cases where we actually want to encode the value to an empty\n      // string instead of the stringified value.\n      //\n      if (!value && (value === null || value === undef || isNaN(value))) {\n        value = '';\n      }\n\n      key = encode(key);\n      value = encode(value);\n\n      //\n      // If we failed to encode the strings, we should bail out as we don't\n      // want to add invalid strings to the query.\n      //\n      if (key === null || value === null) continue;\n      pairs.push(key +'='+ value);\n    }\n  }\n\n  return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n","import { Base64 } from 'js-base64'\nimport URL from 'url-parse'\nimport DetailedError from './error.js'\nimport { log } from './logger.js'\nimport uuid from './uuid.js'\n\nconst PROTOCOL_TUS_V1 = 'tus-v1'\nconst PROTOCOL_IETF_DRAFT_03 = 'ietf-draft-03'\nconst PROTOCOL_IETF_DRAFT_05 = 'ietf-draft-05'\n\nconst defaultOptions = {\n  endpoint: null,\n\n  uploadUrl: null,\n  metadata: {},\n  metadataForPartialUploads: {},\n  fingerprint: null,\n  uploadSize: null,\n\n  onProgress: null,\n  onChunkComplete: null,\n  onSuccess: null,\n  onError: null,\n  onUploadUrlAvailable: null,\n\n  overridePatchMethod: false,\n  headers: {},\n  addRequestId: false,\n  onBeforeRequest: null,\n  onAfterResponse: null,\n  onShouldRetry: defaultOnShouldRetry,\n\n  chunkSize: Number.POSITIVE_INFINITY,\n  retryDelays: [0, 1000, 3000, 5000],\n  parallelUploads: 1,\n  parallelUploadBoundaries: null,\n  storeFingerprintForResuming: true,\n  removeFingerprintOnSuccess: false,\n  uploadLengthDeferred: false,\n  uploadDataDuringCreation: false,\n\n  urlStorage: null,\n  fileReader: null,\n  httpStack: null,\n\n  protocol: PROTOCOL_TUS_V1,\n}\n\nclass BaseUpload {\n  constructor(file, options) {\n    // Warn about removed options from previous versions\n    if ('resume' in options) {\n      console.log(\n        'tus: The `resume` option has been removed in tus-js-client v2. Please use the URL storage API instead.',\n      )\n    }\n\n    // The default options will already be added from the wrapper classes.\n    this.options = options\n\n    // Cast chunkSize to integer\n    this.options.chunkSize = Number(this.options.chunkSize)\n\n    // The storage module used to store URLs\n    this._urlStorage = this.options.urlStorage\n\n    // The underlying File/Blob object\n    this.file = file\n\n    // The URL against which the file will be uploaded\n    this.url = null\n\n    // The underlying request object for the current PATCH request\n    this._req = null\n\n    // The fingerpinrt for the current file (set after start())\n    this._fingerprint = null\n\n    // The key that the URL storage returned when saving an URL with a fingerprint,\n    this._urlStorageKey = null\n\n    // The offset used in the current PATCH request\n    this._offset = null\n\n    // True if the current PATCH request has been aborted\n    this._aborted = false\n\n    // The file's size in bytes\n    this._size = null\n\n    // The Source object which will wrap around the given file and provides us\n    // with a unified interface for getting its size and slice chunks from its\n    // content allowing us to easily handle Files, Blobs, Buffers and Streams.\n    this._source = null\n\n    // The current count of attempts which have been made. Zero indicates none.\n    this._retryAttempt = 0\n\n    // The timeout's ID which is used to delay the next retry\n    this._retryTimeout = null\n\n    // The offset of the remote upload before the latest attempt was started.\n    this._offsetBeforeRetry = 0\n\n    // An array of BaseUpload instances which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploads = null\n\n    // An array of upload URLs which are used for uploading the different\n    // parts, if the parallelUploads option is used.\n    this._parallelUploadUrls = null\n  }\n\n  /**\n   * Use the Termination extension to delete an upload from the server by sending a DELETE\n   * request to the specified upload URL. This is only possible if the server supports the\n   * Termination extension. If the `options.retryDelays` property is set, the method will\n   * also retry if an error ocurrs.\n   *\n   * @param {String} url The upload's URL which will be terminated.\n   * @param {object} options Optional options for influencing HTTP requests.\n   * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n   */\n  static terminate(url, options = {}) {\n    const req = openRequest('DELETE', url, options)\n\n    return sendRequest(req, null, options)\n      .then((res) => {\n        // A 204 response indicates a successfull request\n        if (res.getStatus() === 204) {\n          return\n        }\n\n        throw new DetailedError('tus: unexpected response while terminating upload', null, req, res)\n      })\n      .catch((err) => {\n        if (!(err instanceof DetailedError)) {\n          err = new DetailedError('tus: failed to terminate upload', err, req, null)\n        }\n\n        if (!shouldRetry(err, 0, options)) {\n          throw err\n        }\n\n        // Instead of keeping track of the retry attempts, we remove the first element from the delays\n        // array. If the array is empty, all retry attempts are used up and we will bubble up the error.\n        // We recursively call the terminate function will removing elements from the retryDelays array.\n        const delay = options.retryDelays[0]\n        const remainingDelays = options.retryDelays.slice(1)\n        const newOptions = {\n          ...options,\n          retryDelays: remainingDelays,\n        }\n        return new Promise((resolve) => setTimeout(resolve, delay)).then(() =>\n          BaseUpload.terminate(url, newOptions),\n        )\n      })\n  }\n\n  findPreviousUploads() {\n    return this.options\n      .fingerprint(this.file, this.options)\n      .then((fingerprint) => this._urlStorage.findUploadsByFingerprint(fingerprint))\n  }\n\n  resumeFromPreviousUpload(previousUpload) {\n    this.url = previousUpload.uploadUrl || null\n    this._parallelUploadUrls = previousUpload.parallelUploadUrls || null\n    this._urlStorageKey = previousUpload.urlStorageKey\n  }\n\n  start() {\n    const { file } = this\n\n    if (!file) {\n      this._emitError(new Error('tus: no file or stream to upload provided'))\n      return\n    }\n\n    if (\n      ![PROTOCOL_TUS_V1, PROTOCOL_IETF_DRAFT_03, PROTOCOL_IETF_DRAFT_05].includes(\n        this.options.protocol,\n      )\n    ) {\n      this._emitError(new Error(`tus: unsupported protocol ${this.options.protocol}`))\n      return\n    }\n\n    if (!this.options.endpoint && !this.options.uploadUrl && !this.url) {\n      this._emitError(new Error('tus: neither an endpoint or an upload URL is provided'))\n      return\n    }\n\n    const { retryDelays } = this.options\n    if (retryDelays != null && Object.prototype.toString.call(retryDelays) !== '[object Array]') {\n      this._emitError(new Error('tus: the `retryDelays` option must either be an array or null'))\n      return\n    }\n\n    if (this.options.parallelUploads > 1) {\n      // Test which options are incompatible with parallel uploads.\n      for (const optionName of ['uploadUrl', 'uploadSize', 'uploadLengthDeferred']) {\n        if (this.options[optionName]) {\n          this._emitError(\n            new Error(`tus: cannot use the ${optionName} option when parallelUploads is enabled`),\n          )\n          return\n        }\n      }\n    }\n\n    if (this.options.parallelUploadBoundaries) {\n      if (this.options.parallelUploads <= 1) {\n        this._emitError(\n          new Error(\n            'tus: cannot use the `parallelUploadBoundaries` option when `parallelUploads` is disabled',\n          ),\n        )\n        return\n      }\n      if (this.options.parallelUploads !== this.options.parallelUploadBoundaries.length) {\n        this._emitError(\n          new Error(\n            'tus: the `parallelUploadBoundaries` must have the same length as the value of `parallelUploads`',\n          ),\n        )\n        return\n      }\n    }\n\n    this.options\n      .fingerprint(file, this.options)\n      .then((fingerprint) => {\n        if (fingerprint == null) {\n          log(\n            'No fingerprint was calculated meaning that the upload cannot be stored in the URL storage.',\n          )\n        } else {\n          log(`Calculated fingerprint: ${fingerprint}`)\n        }\n\n        this._fingerprint = fingerprint\n\n        if (this._source) {\n          return this._source\n        }\n        return this.options.fileReader.openFile(file, this.options.chunkSize)\n      })\n      .then((source) => {\n        this._source = source\n\n        // First, we look at the uploadLengthDeferred option.\n        // Next, we check if the caller has supplied a manual upload size.\n        // Finally, we try to use the calculated size from the source object.\n        if (this.options.uploadLengthDeferred) {\n          this._size = null\n        } else if (this.options.uploadSize != null) {\n          this._size = Number(this.options.uploadSize)\n          if (Number.isNaN(this._size)) {\n            this._emitError(new Error('tus: cannot convert `uploadSize` option into a number'))\n            return\n          }\n        } else {\n          this._size = this._source.size\n          if (this._size == null) {\n            this._emitError(\n              new Error(\n                \"tus: cannot automatically derive upload's size from input. Specify it manually using the `uploadSize` option or use the `uploadLengthDeferred` option\",\n              ),\n            )\n            return\n          }\n        }\n\n        // If the upload was configured to use multiple requests or if we resume from\n        // an upload which used multiple requests, we start a parallel upload.\n        if (this.options.parallelUploads > 1 || this._parallelUploadUrls != null) {\n          this._startParallelUpload()\n        } else {\n          this._startSingleUpload()\n        }\n      })\n      .catch((err) => {\n        this._emitError(err)\n      })\n  }\n\n  /**\n   * Initiate the uploading procedure for a parallelized upload, where one file is split into\n   * multiple request which are run in parallel.\n   *\n   * @api private\n   */\n  _startParallelUpload() {\n    const totalSize = this._size\n    let totalProgress = 0\n    this._parallelUploads = []\n\n    const partCount =\n      this._parallelUploadUrls != null\n        ? this._parallelUploadUrls.length\n        : this.options.parallelUploads\n\n    // The input file will be split into multiple slices which are uploaded in separate\n    // requests. Here we get the start and end position for the slices.\n    const parts =\n      this.options.parallelUploadBoundaries ?? splitSizeIntoParts(this._source.size, partCount)\n\n    // Attach URLs from previous uploads, if available.\n    if (this._parallelUploadUrls) {\n      parts.forEach((part, index) => {\n        part.uploadUrl = this._parallelUploadUrls[index] || null\n      })\n    }\n\n    // Create an empty list for storing the upload URLs\n    this._parallelUploadUrls = new Array(parts.length)\n\n    // Generate a promise for each slice that will be resolve if the respective\n    // upload is completed.\n    const uploads = parts.map((part, index) => {\n      let lastPartProgress = 0\n\n      return this._source.slice(part.start, part.end).then(\n        ({ value }) =>\n          new Promise((resolve, reject) => {\n            // Merge with the user supplied options but overwrite some values.\n            const options = {\n              ...this.options,\n              // If available, the partial upload should be resumed from a previous URL.\n              uploadUrl: part.uploadUrl || null,\n              // We take manually care of resuming for partial uploads, so they should\n              // not be stored in the URL storage.\n              storeFingerprintForResuming: false,\n              removeFingerprintOnSuccess: false,\n              // Reset the parallelUploads option to not cause recursion.\n              parallelUploads: 1,\n              // Reset this option as we are not doing a parallel upload.\n              parallelUploadBoundaries: null,\n              metadata: this.options.metadataForPartialUploads,\n              // Add the header to indicate the this is a partial upload.\n              headers: {\n                ...this.options.headers,\n                'Upload-Concat': 'partial',\n              },\n              // Reject or resolve the promise if the upload errors or completes.\n              onSuccess: resolve,\n              onError: reject,\n              // Based in the progress for this partial upload, calculate the progress\n              // for the entire final upload.\n              onProgress: (newPartProgress) => {\n                totalProgress = totalProgress - lastPartProgress + newPartProgress\n                lastPartProgress = newPartProgress\n                this._emitProgress(totalProgress, totalSize)\n              },\n              // Wait until every partial upload has an upload URL, so we can add\n              // them to the URL storage.\n              onUploadUrlAvailable: () => {\n                this._parallelUploadUrls[index] = upload.url\n                // Test if all uploads have received an URL\n                if (this._parallelUploadUrls.filter((u) => Boolean(u)).length === parts.length) {\n                  this._saveUploadInUrlStorage()\n                }\n              },\n            }\n\n            const upload = new BaseUpload(value, options)\n            upload.start()\n\n            // Store the upload in an array, so we can later abort them if necessary.\n            this._parallelUploads.push(upload)\n          }),\n      )\n    })\n\n    let req\n    // Wait until all partial uploads are finished and we can send the POST request for\n    // creating the final upload.\n    Promise.all(uploads)\n      .then(() => {\n        req = this._openRequest('POST', this.options.endpoint)\n        req.setHeader('Upload-Concat', `final;${this._parallelUploadUrls.join(' ')}`)\n\n        // Add metadata if values have been added\n        const metadata = encodeMetadata(this.options.metadata)\n        if (metadata !== '') {\n          req.setHeader('Upload-Metadata', metadata)\n        }\n\n        return this._sendRequest(req, null)\n      })\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while creating upload')\n          return\n        }\n\n        const location = res.getHeader('Location')\n        if (location == null) {\n          this._emitHttpError(req, res, 'tus: invalid or missing Location header')\n          return\n        }\n\n        this.url = resolveUrl(this.options.endpoint, location)\n        log(`Created upload at ${this.url}`)\n\n        this._emitSuccess(res)\n      })\n      .catch((err) => {\n        this._emitError(err)\n      })\n  }\n\n  /**\n   * Initiate the uploading procedure for a non-parallel upload. Here the entire file is\n   * uploaded in a sequential matter.\n   *\n   * @api private\n   */\n  _startSingleUpload() {\n    // Reset the aborted flag when the upload is started or else the\n    // _performUpload will stop before sending a request if the upload has been\n    // aborted previously.\n    this._aborted = false\n\n    // The upload had been started previously and we should reuse this URL.\n    if (this.url != null) {\n      log(`Resuming upload from previous URL: ${this.url}`)\n      this._resumeUpload()\n      return\n    }\n\n    // A URL has manually been specified, so we try to resume\n    if (this.options.uploadUrl != null) {\n      log(`Resuming upload from provided URL: ${this.options.uploadUrl}`)\n      this.url = this.options.uploadUrl\n      this._resumeUpload()\n      return\n    }\n\n    // An upload has not started for the file yet, so we start a new one\n    log('Creating a new upload')\n    this._createUpload()\n  }\n\n  /**\n   * Abort any running request and stop the current upload. After abort is called, no event\n   * handler will be invoked anymore. You can use the `start` method to resume the upload\n   * again.\n   * If `shouldTerminate` is true, the `terminate` function will be called to remove the\n   * current upload from the server.\n   *\n   * @param {boolean} shouldTerminate True if the upload should be deleted from the server.\n   * @return {Promise} The Promise will be resolved/rejected when the requests finish.\n   */\n  abort(shouldTerminate) {\n    // Stop any parallel partial uploads, that have been started in _startParallelUploads.\n    if (this._parallelUploads != null) {\n      for (const upload of this._parallelUploads) {\n        upload.abort(shouldTerminate)\n      }\n    }\n\n    // Stop any current running request.\n    if (this._req !== null) {\n      this._req.abort()\n      // Note: We do not close the file source here, so the user can resume in the future.\n    }\n    this._aborted = true\n\n    // Stop any timeout used for initiating a retry.\n    if (this._retryTimeout != null) {\n      clearTimeout(this._retryTimeout)\n      this._retryTimeout = null\n    }\n\n    if (!shouldTerminate || this.url == null) {\n      return Promise.resolve()\n    }\n\n    return (\n      BaseUpload.terminate(this.url, this.options)\n        // Remove entry from the URL storage since the upload URL is no longer valid.\n        .then(() => this._removeFromUrlStorage())\n    )\n  }\n\n  _emitHttpError(req, res, message, causingErr) {\n    this._emitError(new DetailedError(message, causingErr, req, res))\n  }\n\n  _emitError(err) {\n    // Do not emit errors, e.g. from aborted HTTP requests, if the upload has been stopped.\n    if (this._aborted) return\n\n    // Check if we should retry, when enabled, before sending the error to the user.\n    if (this.options.retryDelays != null) {\n      // We will reset the attempt counter if\n      // - we were already able to connect to the server (offset != null) and\n      // - we were able to upload a small chunk of data to the server\n      const shouldResetDelays = this._offset != null && this._offset > this._offsetBeforeRetry\n      if (shouldResetDelays) {\n        this._retryAttempt = 0\n      }\n\n      if (shouldRetry(err, this._retryAttempt, this.options)) {\n        const delay = this.options.retryDelays[this._retryAttempt++]\n\n        this._offsetBeforeRetry = this._offset\n\n        this._retryTimeout = setTimeout(() => {\n          this.start()\n        }, delay)\n        return\n      }\n    }\n\n    if (typeof this.options.onError === 'function') {\n      this.options.onError(err)\n    } else {\n      throw err\n    }\n  }\n\n  /**\n   * Publishes notification if the upload has been successfully completed.\n   *\n   * @param {object} lastResponse Last HTTP response.\n   * @api private\n   */\n  _emitSuccess(lastResponse) {\n    if (this.options.removeFingerprintOnSuccess) {\n      // Remove stored fingerprint and corresponding endpoint. This causes\n      // new uploads of the same file to be treated as a different file.\n      this._removeFromUrlStorage()\n    }\n\n    if (typeof this.options.onSuccess === 'function') {\n      this.options.onSuccess({ lastResponse })\n    }\n  }\n\n  /**\n   * Publishes notification when data has been sent to the server. This\n   * data may not have been accepted by the server yet.\n   *\n   * @param {number} bytesSent  Number of bytes sent to the server.\n   * @param {number} bytesTotal Total number of bytes to be sent to the server.\n   * @api private\n   */\n  _emitProgress(bytesSent, bytesTotal) {\n    if (typeof this.options.onProgress === 'function') {\n      this.options.onProgress(bytesSent, bytesTotal)\n    }\n  }\n\n  /**\n   * Publishes notification when a chunk of data has been sent to the server\n   * and accepted by the server.\n   * @param {number} chunkSize  Size of the chunk that was accepted by the server.\n   * @param {number} bytesAccepted Total number of bytes that have been\n   *                                accepted by the server.\n   * @param {number} bytesTotal Total number of bytes to be sent to the server.\n   * @api private\n   */\n  _emitChunkComplete(chunkSize, bytesAccepted, bytesTotal) {\n    if (typeof this.options.onChunkComplete === 'function') {\n      this.options.onChunkComplete(chunkSize, bytesAccepted, bytesTotal)\n    }\n  }\n\n  /**\n   * Create a new upload using the creation extension by sending a POST\n   * request to the endpoint. After successful creation the file will be\n   * uploaded\n   *\n   * @api private\n   */\n  _createUpload() {\n    if (!this.options.endpoint) {\n      this._emitError(new Error('tus: unable to create upload because no endpoint is provided'))\n      return\n    }\n\n    const req = this._openRequest('POST', this.options.endpoint)\n\n    if (this.options.uploadLengthDeferred) {\n      req.setHeader('Upload-Defer-Length', '1')\n    } else {\n      req.setHeader('Upload-Length', `${this._size}`)\n    }\n\n    // Add metadata if values have been added\n    const metadata = encodeMetadata(this.options.metadata)\n    if (metadata !== '') {\n      req.setHeader('Upload-Metadata', metadata)\n    }\n\n    let promise\n    if (this.options.uploadDataDuringCreation && !this.options.uploadLengthDeferred) {\n      this._offset = 0\n      promise = this._addChunkToRequest(req)\n    } else {\n      if (\n        this.options.protocol === PROTOCOL_IETF_DRAFT_03 ||\n        this.options.protocol === PROTOCOL_IETF_DRAFT_05\n      ) {\n        req.setHeader('Upload-Complete', '?0')\n      }\n      promise = this._sendRequest(req, null)\n    }\n\n    promise\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while creating upload')\n          return\n        }\n\n        const location = res.getHeader('Location')\n        if (location == null) {\n          this._emitHttpError(req, res, 'tus: invalid or missing Location header')\n          return\n        }\n\n        this.url = resolveUrl(this.options.endpoint, location)\n        log(`Created upload at ${this.url}`)\n\n        if (typeof this.options.onUploadUrlAvailable === 'function') {\n          this.options.onUploadUrlAvailable()\n        }\n\n        if (this._size === 0) {\n          // Nothing to upload and file was successfully created\n          this._emitSuccess(res)\n          this._source.close()\n          return\n        }\n\n        this._saveUploadInUrlStorage().then(() => {\n          if (this.options.uploadDataDuringCreation) {\n            this._handleUploadResponse(req, res)\n          } else {\n            this._offset = 0\n            this._performUpload()\n          }\n        })\n      })\n      .catch((err) => {\n        this._emitHttpError(req, null, 'tus: failed to create upload', err)\n      })\n  }\n\n  /*\n   * Try to resume an existing upload. First a HEAD request will be sent\n   * to retrieve the offset. If the request fails a new upload will be\n   * created. In the case of a successful response the file will be uploaded.\n   *\n   * @api private\n   */\n  _resumeUpload() {\n    const req = this._openRequest('HEAD', this.url)\n    const promise = this._sendRequest(req, null)\n\n    promise\n      .then((res) => {\n        const status = res.getStatus()\n        if (!inStatusCategory(status, 200)) {\n          // If the upload is locked (indicated by the 423 Locked status code), we\n          // emit an error instead of directly starting a new upload. This way the\n          // retry logic can catch the error and will retry the upload. An upload\n          // is usually locked for a short period of time and will be available\n          // afterwards.\n          if (status === 423) {\n            this._emitHttpError(req, res, 'tus: upload is currently locked; retry later')\n            return\n          }\n\n          if (inStatusCategory(status, 400)) {\n            // Remove stored fingerprint and corresponding endpoint,\n            // on client errors since the file can not be found\n            this._removeFromUrlStorage()\n          }\n\n          if (!this.options.endpoint) {\n            // Don't attempt to create a new upload if no endpoint is provided.\n            this._emitHttpError(\n              req,\n              res,\n              'tus: unable to resume upload (new upload cannot be created without an endpoint)',\n            )\n            return\n          }\n\n          // Try to create a new upload\n          this.url = null\n          this._createUpload()\n          return\n        }\n\n        const offset = Number.parseInt(res.getHeader('Upload-Offset'), 10)\n        if (Number.isNaN(offset)) {\n          this._emitHttpError(req, res, 'tus: invalid or missing offset value')\n          return\n        }\n\n        const length = Number.parseInt(res.getHeader('Upload-Length'), 10)\n        if (\n          Number.isNaN(length) &&\n          !this.options.uploadLengthDeferred &&\n          this.options.protocol === PROTOCOL_TUS_V1\n        ) {\n          this._emitHttpError(req, res, 'tus: invalid or missing length value')\n          return\n        }\n\n        if (typeof this.options.onUploadUrlAvailable === 'function') {\n          this.options.onUploadUrlAvailable()\n        }\n\n        this._saveUploadInUrlStorage().then(() => {\n          // Upload has already been completed and we do not need to send additional\n          // data to the server\n          if (offset === length) {\n            this._emitProgress(length, length)\n            this._emitSuccess(res)\n            return\n          }\n\n          this._offset = offset\n          this._performUpload()\n        })\n      })\n      .catch((err) => {\n        this._emitHttpError(req, null, 'tus: failed to resume upload', err)\n      })\n  }\n\n  /**\n   * Start uploading the file using PATCH requests. The file will be divided\n   * into chunks as specified in the chunkSize option. During the upload\n   * the onProgress event handler may be invoked multiple times.\n   *\n   * @api private\n   */\n  _performUpload() {\n    // If the upload has been aborted, we will not send the next PATCH request.\n    // This is important if the abort method was called during a callback, such\n    // as onChunkComplete or onProgress.\n    if (this._aborted) {\n      return\n    }\n\n    let req\n\n    // Some browser and servers may not support the PATCH method. For those\n    // cases, you can tell tus-js-client to use a POST request with the\n    // X-HTTP-Method-Override header for simulating a PATCH request.\n    if (this.options.overridePatchMethod) {\n      req = this._openRequest('POST', this.url)\n      req.setHeader('X-HTTP-Method-Override', 'PATCH')\n    } else {\n      req = this._openRequest('PATCH', this.url)\n    }\n\n    req.setHeader('Upload-Offset', `${this._offset}`)\n    const promise = this._addChunkToRequest(req)\n\n    promise\n      .then((res) => {\n        if (!inStatusCategory(res.getStatus(), 200)) {\n          this._emitHttpError(req, res, 'tus: unexpected response while uploading chunk')\n          return\n        }\n\n        this._handleUploadResponse(req, res)\n      })\n      .catch((err) => {\n        // Don't emit an error if the upload was aborted manually\n        if (this._aborted) {\n          return\n        }\n\n        this._emitHttpError(req, null, `tus: failed to upload chunk at offset ${this._offset}`, err)\n      })\n  }\n\n  /**\n   * _addChunktoRequest reads a chunk from the source and sends it using the\n   * supplied request object. It will not handle the response.\n   *\n   * @api private\n   */\n  _addChunkToRequest(req) {\n    const start = this._offset\n    let end = this._offset + this.options.chunkSize\n\n    req.setProgressHandler((bytesSent) => {\n      this._emitProgress(start + bytesSent, this._size)\n    })\n\n    if (this.options.protocol === PROTOCOL_TUS_V1) {\n      req.setHeader('Content-Type', 'application/offset+octet-stream')\n    } else if (this.options.protocol === PROTOCOL_IETF_DRAFT_05) {\n      req.setHeader('Content-Type', 'application/partial-upload')\n    }\n\n    // The specified chunkSize may be Infinity or the calcluated end position\n    // may exceed the file's size. In both cases, we limit the end position to\n    // the input's total size for simpler calculations and correctness.\n    if (\n      (end === Number.POSITIVE_INFINITY || end > this._size) &&\n      !this.options.uploadLengthDeferred\n    ) {\n      end = this._size\n    }\n\n    return this._source.slice(start, end).then(({ value, done }) => {\n      const valueSize = value?.size ? value.size : 0\n\n      // If the upload length is deferred, the upload size was not specified during\n      // upload creation. So, if the file reader is done reading, we know the total\n      // upload size and can tell the tus server.\n      if (this.options.uploadLengthDeferred && done) {\n        this._size = this._offset + valueSize\n        req.setHeader('Upload-Length', `${this._size}`)\n      }\n\n      // The specified uploadSize might not match the actual amount of data that a source\n      // provides. In these cases, we cannot successfully complete the upload, so we\n      // rather error out and let the user know. If not, tus-js-client will be stuck\n      // in a loop of repeating empty PATCH requests.\n      // See https://community.transloadit.com/t/how-to-abort-hanging-companion-uploads/16488/13\n      const newSize = this._offset + valueSize\n      if (!this.options.uploadLengthDeferred && done && newSize !== this._size) {\n        return Promise.reject(\n          new Error(\n            `upload was configured with a size of ${this._size} bytes, but the source is done after ${newSize} bytes`,\n          ),\n        )\n      }\n\n      if (value === null) {\n        return this._sendRequest(req)\n      }\n\n      if (\n        this.options.protocol === PROTOCOL_IETF_DRAFT_03 ||\n        this.options.protocol === PROTOCOL_IETF_DRAFT_05\n      ) {\n        req.setHeader('Upload-Complete', done ? '?1' : '?0')\n      }\n      this._emitProgress(this._offset, this._size)\n      return this._sendRequest(req, value)\n    })\n  }\n\n  /**\n   * _handleUploadResponse is used by requests that haven been sent using _addChunkToRequest\n   * and already have received a response.\n   *\n   * @api private\n   */\n  _handleUploadResponse(req, res) {\n    const offset = Number.parseInt(res.getHeader('Upload-Offset'), 10)\n    if (Number.isNaN(offset)) {\n      this._emitHttpError(req, res, 'tus: invalid or missing offset value')\n      return\n    }\n\n    this._emitProgress(offset, this._size)\n    this._emitChunkComplete(offset - this._offset, offset, this._size)\n\n    this._offset = offset\n\n    if (offset === this._size) {\n      // Yay, finally done :)\n      this._emitSuccess(res)\n      this._source.close()\n      return\n    }\n\n    this._performUpload()\n  }\n\n  /**\n   * Create a new HTTP request object with the given method and URL.\n   *\n   * @api private\n   */\n  _openRequest(method, url) {\n    const req = openRequest(method, url, this.options)\n    this._req = req\n    return req\n  }\n\n  /**\n   * Remove the entry in the URL storage, if it has been saved before.\n   *\n   * @api private\n   */\n  _removeFromUrlStorage() {\n    if (!this._urlStorageKey) return\n\n    this._urlStorage.removeUpload(this._urlStorageKey).catch((err) => {\n      this._emitError(err)\n    })\n    this._urlStorageKey = null\n  }\n\n  /**\n   * Add the upload URL to the URL storage, if possible.\n   *\n   * @api private\n   */\n  _saveUploadInUrlStorage() {\n    // We do not store the upload URL\n    // - if it was disabled in the option, or\n    // - if no fingerprint was calculated for the input (i.e. a stream), or\n    // - if the URL is already stored (i.e. key is set alread).\n    if (\n      !this.options.storeFingerprintForResuming ||\n      !this._fingerprint ||\n      this._urlStorageKey !== null\n    ) {\n      return Promise.resolve()\n    }\n\n    const storedUpload = {\n      size: this._size,\n      metadata: this.options.metadata,\n      creationTime: new Date().toString(),\n    }\n\n    if (this._parallelUploads) {\n      // Save multiple URLs if the parallelUploads option is used ...\n      storedUpload.parallelUploadUrls = this._parallelUploadUrls\n    } else {\n      // ... otherwise we just save the one available URL.\n      storedUpload.uploadUrl = this.url\n    }\n\n    return this._urlStorage.addUpload(this._fingerprint, storedUpload).then((urlStorageKey) => {\n      this._urlStorageKey = urlStorageKey\n    })\n  }\n\n  /**\n   * Send a request with the provided body.\n   *\n   * @api private\n   */\n  _sendRequest(req, body = null) {\n    return sendRequest(req, body, this.options)\n  }\n}\n\nfunction encodeMetadata(metadata) {\n  return Object.entries(metadata)\n    .map(([key, value]) => `${key} ${Base64.encode(String(value))}`)\n    .join(',')\n}\n\n/**\n * Checks whether a given status is in the range of the expected category.\n * For example, only a status between 200 and 299 will satisfy the category 200.\n *\n * @api private\n */\nfunction inStatusCategory(status, category) {\n  return status >= category && status < category + 100\n}\n\n/**\n * Create a new HTTP request with the specified method and URL.\n * The necessary headers that are included in every request\n * will be added, including the request ID.\n *\n * @api private\n */\nfunction openRequest(method, url, options) {\n  const req = options.httpStack.createRequest(method, url)\n\n  if (options.protocol === PROTOCOL_IETF_DRAFT_03) {\n    req.setHeader('Upload-Draft-Interop-Version', '5')\n  } else if (options.protocol === PROTOCOL_IETF_DRAFT_05) {\n    req.setHeader('Upload-Draft-Interop-Version', '6')\n  } else {\n    req.setHeader('Tus-Resumable', '1.0.0')\n  }\n  const headers = options.headers || {}\n\n  for (const [name, value] of Object.entries(headers)) {\n    req.setHeader(name, value)\n  }\n\n  if (options.addRequestId) {\n    const requestId = uuid()\n    req.setHeader('X-Request-ID', requestId)\n  }\n\n  return req\n}\n\n/**\n * Send a request with the provided body while invoking the onBeforeRequest\n * and onAfterResponse callbacks.\n *\n * @api private\n */\nasync function sendRequest(req, body, options) {\n  if (typeof options.onBeforeRequest === 'function') {\n    await options.onBeforeRequest(req)\n  }\n\n  const res = await req.send(body)\n\n  if (typeof options.onAfterResponse === 'function') {\n    await options.onAfterResponse(req, res)\n  }\n\n  return res\n}\n\n/**\n * Checks whether the browser running this code has internet access.\n * This function will always return true in the node.js environment\n *\n * @api private\n */\nfunction isOnline() {\n  let online = true\n  // Note: We don't reference `window` here because the navigator object also exists\n  // in a Web Worker's context.\n  if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n    online = false\n  }\n\n  return online\n}\n\n/**\n * Checks whether or not it is ok to retry a request.\n * @param {Error|DetailedError} err the error returned from the last request\n * @param {number} retryAttempt the number of times the request has already been retried\n * @param {object} options tus Upload options\n *\n * @api private\n */\nfunction shouldRetry(err, retryAttempt, options) {\n  // We only attempt a retry if\n  // - retryDelays option is set\n  // - we didn't exceed the maxium number of retries, yet, and\n  // - this error was caused by a request or it's response and\n  // - the error is server error (i.e. not a status 4xx except a 409 or 423) or\n  // a onShouldRetry is specified and returns true\n  // - the browser does not indicate that we are offline\n  if (\n    options.retryDelays == null ||\n    retryAttempt >= options.retryDelays.length ||\n    err.originalRequest == null\n  ) {\n    return false\n  }\n\n  if (options && typeof options.onShouldRetry === 'function') {\n    return options.onShouldRetry(err, retryAttempt, options)\n  }\n\n  return defaultOnShouldRetry(err)\n}\n\n/**\n * determines if the request should be retried. Will only retry if not a status 4xx except a 409 or 423\n * @param {DetailedError} err\n * @returns {boolean}\n */\nfunction defaultOnShouldRetry(err) {\n  const status = err.originalResponse ? err.originalResponse.getStatus() : 0\n  return (!inStatusCategory(status, 400) || status === 409 || status === 423) && isOnline()\n}\n\n/**\n * Resolve a relative link given the origin as source. For example,\n * if a HTTP request to http://example.com/files/ returns a Location\n * header with the value /upload/abc, the resolved URL will be:\n * http://example.com/upload/abc\n */\nfunction resolveUrl(origin, link) {\n  return new URL(link, origin).toString()\n}\n\n/**\n * Calculate the start and end positions for the parts if an upload\n * is split into multiple parallel requests.\n *\n * @param {number} totalSize The byte size of the upload, which will be split.\n * @param {number} partCount The number in how many parts the upload will be split.\n * @return {object[]}\n * @api private\n */\nfunction splitSizeIntoParts(totalSize, partCount) {\n  const partSize = Math.floor(totalSize / partCount)\n  const parts = []\n\n  for (let i = 0; i < partCount; i++) {\n    parts.push({\n      start: partSize * i,\n      end: partSize * (i + 1),\n    })\n  }\n\n  parts[partCount - 1].end = totalSize\n\n  return parts\n}\n\nBaseUpload.defaultOptions = defaultOptions\n\nexport default BaseUpload\n","/**\n * Generate a UUID v4 based on random numbers. We intentioanlly use the less\n * secure Math.random function here since the more secure crypto.getRandomNumbers\n * is not available on all platforms.\n * This is not a problem for us since we use the UUID only for generating a\n * request ID, so we can correlate server logs to client errors.\n *\n * This function is taken from following site:\n * https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript\n *\n * @return {string} The generate UUID\n */\nexport default function uuid() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n    const r = (Math.random() * 16) | 0\n    const v = c === 'x' ? r : (r & 0x3) | 0x8\n    return v.toString(16)\n  })\n}\n","const isReactNative = () =>\n  typeof navigator !== 'undefined' &&\n  typeof navigator.product === 'string' &&\n  navigator.product.toLowerCase() === 'reactnative'\n\nexport default isReactNative\n","import isCordova from './isCordova.js'\nimport readAsByteArray from './readAsByteArray.js'\n\nexport default class FileSource {\n  // Make this.size a method\n  constructor(file) {\n    this._file = file\n    this.size = file.size\n  }\n\n  slice(start, end) {\n    // In Apache Cordova applications, a File must be resolved using\n    // FileReader instances, see\n    // https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-file/index.html#read-a-file\n    if (isCordova()) {\n      return readAsByteArray(this._file.slice(start, end))\n    }\n\n    const value = this._file.slice(start, end)\n    const done = end >= this.size\n    return Promise.resolve({ value, done })\n  }\n\n  close() {\n    // Nothing to do here since we don't need to release any resources.\n  }\n}\n","const isCordova = () =>\n  typeof window !== 'undefined' &&\n  (typeof window.PhoneGap !== 'undefined' ||\n    typeof window.Cordova !== 'undefined' ||\n    typeof window.cordova !== 'undefined')\n\nexport default isCordova\n","/**\n * readAsByteArray converts a File object to a Uint8Array.\n * This function is only used on the Apache Cordova platform.\n * See https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/index.html#read-a-file\n */\nexport default function readAsByteArray(chunk) {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader()\n    reader.onload = () => {\n      const value = new Uint8Array(reader.result)\n      resolve({ value })\n    }\n    reader.onerror = (err) => {\n      reject(err)\n    }\n    reader.readAsArrayBuffer(chunk)\n  })\n}\n","function len(blobOrArray) {\n  if (blobOrArray === undefined) return 0\n  if (blobOrArray.size !== undefined) return blobOrArray.size\n  return blobOrArray.length\n}\n\n/*\n  Typed arrays and blobs don't have a concat method.\n  This function helps StreamSource accumulate data to reach chunkSize.\n*/\nfunction concat(a, b) {\n  if (a.concat) {\n    // Is `a` an Array?\n    return a.concat(b)\n  }\n  if (a instanceof Blob) {\n    return new Blob([a, b], { type: a.type })\n  }\n  if (a.set) {\n    // Is `a` a typed array?\n    const c = new a.constructor(a.length + b.length)\n    c.set(a)\n    c.set(b, a.length)\n    return c\n  }\n  throw new Error('Unknown data type')\n}\n\nexport default class StreamSource {\n  constructor(reader) {\n    this._buffer = undefined\n    this._bufferOffset = 0\n    this._reader = reader\n    this._done = false\n  }\n\n  slice(start, end) {\n    if (start < this._bufferOffset) {\n      return Promise.reject(new Error(\"Requested data is before the reader's current offset\"))\n    }\n\n    return this._readUntilEnoughDataOrDone(start, end)\n  }\n\n  _readUntilEnoughDataOrDone(start, end) {\n    const hasEnoughData = end <= this._bufferOffset + len(this._buffer)\n    if (this._done || hasEnoughData) {\n      const value = this._getDataFromBuffer(start, end)\n      const done = value == null ? this._done : false\n      return Promise.resolve({ value, done })\n    }\n\n    return this._reader.read().then(({ value, done }) => {\n      if (done) {\n        this._done = true\n      } else if (this._buffer === undefined) {\n        this._buffer = value\n      } else {\n        this._buffer = concat(this._buffer, value)\n      }\n\n      return this._readUntilEnoughDataOrDone(start, end)\n    })\n  }\n\n  _getDataFromBuffer(start, end) {\n    // Remove data from buffer before `start`.\n    // Data might be reread from the buffer if an upload fails, so we can only\n    // safely delete data when it comes *before* what is currently being read.\n    if (start > this._bufferOffset) {\n      this._buffer = this._buffer.slice(start - this._bufferOffset)\n      this._bufferOffset = start\n    }\n    // If the buffer is empty after removing old data, all data has been read.\n    const hasAllDataBeenRead = len(this._buffer) === 0\n    if (this._done && hasAllDataBeenRead) {\n      return null\n    }\n    // We already removed data before `start`, so we just return the first\n    // chunk from the buffer.\n    return this._buffer.slice(0, end - start)\n  }\n\n  close() {\n    if (this._reader.cancel) {\n      this._reader.cancel()\n    }\n  }\n}\n","export default class XHRHttpStack {\n  createRequest(method, url) {\n    return new Request(method, url)\n  }\n\n  getName() {\n    return 'XHRHttpStack'\n  }\n}\n\nclass Request {\n  constructor(method, url) {\n    this._xhr = new XMLHttpRequest()\n    this._xhr.open(method, url, true)\n\n    this._method = method\n    this._url = url\n    this._headers = {}\n  }\n\n  getMethod() {\n    return this._method\n  }\n\n  getURL() {\n    return this._url\n  }\n\n  setHeader(header, value) {\n    this._xhr.setRequestHeader(header, value)\n    this._headers[header] = value\n  }\n\n  getHeader(header) {\n    return this._headers[header]\n  }\n\n  setProgressHandler(progressHandler) {\n    // Test support for progress events before attaching an event listener\n    if (!('upload' in this._xhr)) {\n      return\n    }\n\n    this._xhr.upload.onprogress = (e) => {\n      if (!e.lengthComputable) {\n        return\n      }\n\n      progressHandler(e.loaded)\n    }\n  }\n\n  send(body = null) {\n    return new Promise((resolve, reject) => {\n      this._xhr.onload = () => {\n        resolve(new Response(this._xhr))\n      }\n\n      this._xhr.onerror = (err) => {\n        reject(err)\n      }\n\n      this._xhr.send(body)\n    })\n  }\n\n  abort() {\n    this._xhr.abort()\n    return Promise.resolve()\n  }\n\n  getUnderlyingObject() {\n    return this._xhr\n  }\n}\n\nclass Response {\n  constructor(xhr) {\n    this._xhr = xhr\n  }\n\n  getStatus() {\n    return this._xhr.status\n  }\n\n  getHeader(header) {\n    return this._xhr.getResponseHeader(header)\n  }\n\n  getBody() {\n    return this._xhr.responseText\n  }\n\n  getUnderlyingObject() {\n    return this._xhr\n  }\n}\n","let hasStorage = false\ntry {\n  // Note: localStorage does not exist in the Web Worker's context, so we must use window here.\n  hasStorage = 'localStorage' in window\n\n  // Attempt to store and read entries from the local storage to detect Private\n  // Mode on Safari on iOS (see #49)\n  // If the key was not used before, we remove it from local storage again to\n  // not cause confusion where the entry came from.\n  const key = 'tusSupport'\n  const originalValue = localStorage.getItem(key)\n  localStorage.setItem(key, originalValue)\n  if (originalValue === null) localStorage.removeItem(key)\n} catch (e) {\n  // If we try to access localStorage inside a sandboxed iframe, a SecurityError\n  // is thrown. When in private mode on iOS Safari, a QuotaExceededError is\n  // thrown (see #49)\n  if (e.code === e.SECURITY_ERR || e.code === e.QUOTA_EXCEEDED_ERR) {\n    hasStorage = false\n  } else {\n    throw e\n  }\n}\n\nexport const canStoreURLs = hasStorage\n\nexport class WebStorageUrlStorage {\n  findAllUploads() {\n    const results = this._findEntries('tus::')\n    return Promise.resolve(results)\n  }\n\n  findUploadsByFingerprint(fingerprint) {\n    const results = this._findEntries(`tus::${fingerprint}::`)\n    return Promise.resolve(results)\n  }\n\n  removeUpload(urlStorageKey) {\n    localStorage.removeItem(urlStorageKey)\n    return Promise.resolve()\n  }\n\n  addUpload(fingerprint, upload) {\n    const id = Math.round(Math.random() * 1e12)\n    const key = `tus::${fingerprint}::${id}`\n\n    localStorage.setItem(key, JSON.stringify(upload))\n    return Promise.resolve(key)\n  }\n\n  _findEntries(prefix) {\n    const results = []\n\n    for (let i = 0; i < localStorage.length; i++) {\n      const key = localStorage.key(i)\n      if (key.indexOf(prefix) !== 0) continue\n\n      try {\n        const upload = JSON.parse(localStorage.getItem(key))\n        upload.urlStorageKey = key\n\n        results.push(upload)\n      } catch (_e) {\n        // The JSON parse error is intentionally ignored here, so a malformed\n        // entry in the storage cannot prevent an upload.\n      }\n    }\n\n    return results\n  }\n}\n","import DetailedError from '../error.js'\nimport { enableDebugLog } from '../logger.js'\nimport NoopUrlStorage from '../noopUrlStorage.js'\nimport BaseUpload from '../upload.js'\n\nimport FileReader from './fileReader.js'\nimport fingerprint from './fileSignature.js'\nimport DefaultHttpStack from './httpStack.js'\nimport { WebStorageUrlStorage, canStoreURLs } from './urlStorage.js'\n\nconst defaultOptions = {\n  ...BaseUpload.defaultOptions,\n  httpStack: new DefaultHttpStack(),\n  fileReader: new FileReader(),\n  urlStorage: canStoreURLs ? new WebStorageUrlStorage() : new NoopUrlStorage(),\n  fingerprint,\n}\n\nclass Upload extends BaseUpload {\n  constructor(file = null, options = {}) {\n    options = { ...defaultOptions, ...options }\n    super(file, options)\n  }\n\n  static terminate(url, options = {}) {\n    options = { ...defaultOptions, ...options }\n    return BaseUpload.terminate(url, options)\n  }\n}\n\n// Note: We don't reference `window` here because these classes also exist in a Web Worker's context.\nconst isSupported =\n  typeof XMLHttpRequest === 'function' &&\n  typeof Blob === 'function' &&\n  typeof Blob.prototype.slice === 'function'\n\nexport {\n  Upload,\n  canStoreURLs,\n  defaultOptions,\n  isSupported,\n  enableDebugLog,\n  DefaultHttpStack,\n  DetailedError,\n}\n","import isReactNative from './isReactNative.js'\nimport uriToBlob from './uriToBlob.js'\n\nimport FileSource from './sources/FileSource.js'\nimport StreamSource from './sources/StreamSource.js'\n\nexport default class FileReader {\n  async openFile(input, chunkSize) {\n    // In React Native, when user selects a file, instead of a File or Blob,\n    // you usually get a file object {} with a uri property that contains\n    // a local path to the file. We use XMLHttpRequest to fetch\n    // the file blob, before uploading with tus.\n    if (isReactNative() && input && typeof input.uri !== 'undefined') {\n      try {\n        const blob = await uriToBlob(input.uri)\n        return new FileSource(blob)\n      } catch (err) {\n        throw new Error(\n          `tus: cannot fetch \\`file.uri\\` as Blob, make sure the uri is correct and accessible. ${err}`,\n        )\n      }\n    }\n\n    // Since we emulate the Blob type in our tests (not all target browsers\n    // support it), we cannot use `instanceof` for testing whether the input value\n    // can be handled. Instead, we simply check is the slice() function and the\n    // size property are available.\n    if (typeof input.slice === 'function' && typeof input.size !== 'undefined') {\n      return Promise.resolve(new FileSource(input))\n    }\n\n    if (typeof input.read === 'function') {\n      chunkSize = Number(chunkSize)\n      if (!Number.isFinite(chunkSize)) {\n        return Promise.reject(\n          new Error(\n            'cannot create source for stream without a finite value for the `chunkSize` option',\n          ),\n        )\n      }\n\n      return Promise.resolve(new StreamSource(input, chunkSize))\n    }\n\n    return Promise.reject(\n      new Error(\n        'source object may only be an instance of File, Blob, or Reader in this environment',\n      ),\n    )\n  }\n}\n","/**\n * uriToBlob resolves a URI to a Blob object. This is used for\n * React Native to retrieve a file (identified by a file://\n * URI) as a blob.\n */\nexport default function uriToBlob(uri) {\n  return new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest()\n    xhr.responseType = 'blob'\n    xhr.onload = () => {\n      const blob = xhr.response\n      resolve(blob)\n    }\n    xhr.onerror = (err) => {\n      reject(err)\n    }\n    xhr.open('GET', uri)\n    xhr.send()\n  })\n}\n","export default class NoopUrlStorage {\n  listAllUploads() {\n    return Promise.resolve([])\n  }\n\n  findUploadsByFingerprint(_fingerprint) {\n    return Promise.resolve([])\n  }\n\n  removeUpload(_urlStorageKey) {\n    return Promise.resolve()\n  }\n\n  addUpload(_fingerprint, _upload) {\n    return Promise.resolve(null)\n  }\n}\n","import isReactNative from './isReactNative.js'\n\n// TODO: Differenciate between input types\n\n/**\n * Generate a fingerprint for a file which will be used the store the endpoint\n *\n * @param {File} file\n * @param {Object} options\n * @param {Function} callback\n */\nexport default function fingerprint(file, options) {\n  if (isReactNative()) {\n    return Promise.resolve(reactNativeFingerprint(file, options))\n  }\n\n  return Promise.resolve(\n    ['tus-br', file.name, file.type, file.size, file.lastModified, options.endpoint].join('-'),\n  )\n}\n\nfunction reactNativeFingerprint(file, options) {\n  const exifHash = file.exif ? hashCode(JSON.stringify(file.exif)) : 'noexif'\n  return ['tus-rn', file.name || 'noname', file.size || 'nosize', exifHash, options.endpoint].join(\n    '/',\n  )\n}\n\nfunction hashCode(str) {\n  // from https://stackoverflow.com/a/8831937/151666\n  let hash = 0\n  if (str.length === 0) {\n    return hash\n  }\n  for (let i = 0; i < str.length; i++) {\n    const char = str.charCodeAt(i)\n    hash = (hash << 5) - hash + char\n    hash &= hash // Convert to 32bit integer\n  }\n  return hash\n}\n","export const deleteUpload = async (\n  url: string,\n  csrfToken: string\n): Promise<void> =>\n  new Promise((resolve, reject) => {\n    const xhr = new XMLHttpRequest();\n    xhr.open(\"DELETE\", url);\n\n    xhr.onload = (): void => {\n      if (xhr.status === 204) {\n        resolve();\n      } else {\n        reject(new Error());\n      }\n    };\n    xhr.setRequestHeader(\"Tus-Resumable\", \"1.0.0\");\n    xhr.setRequestHeader(\"X-CSRFToken\", csrfToken);\n    xhr.send(null);\n  });\n","import { HttpRequest, HttpResponse, Upload } from \"tus-js-client\";\n\nimport BaseUpload, { InitialFile } from \"./base_upload.ts\";\nimport { deleteUpload } from \"./tus_utils.ts\";\n\ninterface Parameters {\n  chunkSize: number;\n  csrfToken: string;\n  fieldName: string;\n  file: File;\n  formId: string;\n  retryDelays: null | number[];\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\nexport default class TusUpload extends BaseUpload {\n  public onError?: (error: Error) => void;\n  public onProgress?: (bytesUploaded: number, bytesTotal: number) => void;\n  public onSuccess?: () => void;\n  private csrfToken: string;\n  private id: string;\n  private upload: Upload;\n\n  constructor({\n    chunkSize,\n    csrfToken,\n    fieldName,\n    file,\n    formId,\n    retryDelays,\n    uploadIndex,\n    uploadUrl\n  }: Parameters) {\n    super({ name: file.name, status: \"uploading\", type: \"tus\", uploadIndex });\n\n    this.csrfToken = csrfToken;\n\n    this.upload = new Upload(file, {\n      chunkSize,\n      endpoint: uploadUrl,\n      metadata: {\n        fieldName: fieldName,\n        filename: file.name,\n        formId: formId\n      },\n      onAfterResponse: this.handleAfterReponse,\n      onBeforeRequest: this.addCsrTokenToRequest,\n      onError: this.handleError,\n      onProgress: this.handleProgress,\n      onSuccess: this.handleSucces,\n      retryDelays: retryDelays ?? [0, 1000, 3000, 5000]\n    });\n\n    this.onError = undefined;\n    this.onProgress = undefined;\n    this.onSuccess = undefined;\n  }\n\n  public async abort(): Promise<void> {\n    await this.upload.abort(true);\n  }\n\n  public async delete(): Promise<void> {\n    if (!this.upload.url) {\n      return Promise.resolve();\n    }\n\n    await deleteUpload(this.upload.url, this.csrfToken);\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.getSize(),\n      type: \"tus\",\n      url: \"\"\n    };\n  }\n\n  public getSize(): number {\n    return (this.upload.file as File).size;\n  }\n\n  public start(): void {\n    this.upload.start();\n  }\n\n  private addCsrTokenToRequest = (request: HttpRequest) => {\n    request.setHeader(\"X-CSRFToken\", this.csrfToken);\n  };\n\n  private handleAfterReponse = (\n    _request: HttpRequest,\n    response: HttpResponse\n  ) => {\n    const resourceId = response.getHeader(\"ResourceId\");\n\n    if (resourceId) {\n      this.id = resourceId;\n    }\n  };\n\n  private handleError = (error: Error) => {\n    if (this.onError) {\n      this.onError(error);\n    } else {\n      throw error;\n    }\n  };\n\n  private handleProgress = (bytesUploaded: number, bytesTotal: number) => {\n    if (this.onProgress) {\n      this.onProgress(bytesUploaded, bytesTotal);\n    }\n  };\n\n  private handleSucces = () => {\n    if (this.onSuccess) {\n      this.onSuccess();\n    }\n  };\n}\n","import BaseUpload, {\n  InitialExistingFile,\n  InitialFile,\n  InitialPlaceholderFile,\n  InitialS3File,\n  InitialTusFile,\n  UploadType\n} from \"./base_upload.ts\";\nimport { deleteUpload } from \"./tus_utils.ts\";\n\ninterface BaseUploadedFileParameters {\n  name: string;\n  size: number;\n  type: UploadType;\n  uploadIndex: number;\n}\n\ninterface UploadedFileParameters {\n  csrfToken: string;\n  initialFile: InitialFile;\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\ninterface UploadedTusFileParameters {\n  csrfToken: string;\n  initialFile: InitialTusFile;\n  uploadIndex: number;\n  uploadUrl: string;\n}\n\nexport abstract class BaseUploadedFile extends BaseUpload {\n  size: number;\n\n  constructor({ name, size, type, uploadIndex }: BaseUploadedFileParameters) {\n    super({ name, status: \"done\", type, uploadIndex });\n\n    this.size = size;\n  }\n\n  public async abort(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public async delete(): Promise<void> {\n    return Promise.resolve();\n  }\n\n  public getSize(): number | undefined {\n    return this.size;\n  }\n}\n\nclass PlaceholderFile extends BaseUploadedFile {\n  id: string;\n\n  constructor(initialFile: InitialPlaceholderFile, uploadIndex: number) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"placeholder\",\n      uploadIndex\n    });\n\n    this.id = initialFile.id;\n  }\n\n  public getId(): string | undefined {\n    return undefined;\n  }\n\n  public getInitialFile(): InitialPlaceholderFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.size,\n      type: \"placeholder\"\n    };\n  }\n}\n\nexport class ExistingFile extends BaseUploadedFile {\n  constructor(initialFile: InitialExistingFile, uploadIndex: number) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"existing\",\n      uploadIndex\n    });\n  }\n\n  public getId(): string | undefined {\n    return undefined;\n  }\n\n  public getInitialFile(): InitialExistingFile {\n    return {\n      name: this.name,\n      size: this.size,\n      type: \"existing\"\n    };\n  }\n}\n\nexport class UploadedS3File extends BaseUploadedFile {\n  id: string;\n  key: string;\n\n  constructor(initialFile: InitialS3File, uploadIndex: number) {\n    super({\n      name: initialFile.original_name || initialFile.name,\n      size: initialFile.size,\n      type: \"uploadedS3\",\n      uploadIndex\n    });\n\n    this.id = initialFile.id;\n    this.key = initialFile.name;\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialS3File {\n    return {\n      id: this.id,\n      name: this.key,\n      original_name: this.name,\n      size: this.size,\n      type: \"s3\"\n    };\n  }\n}\n\nexport class UploadedTusFile extends BaseUploadedFile {\n  csrfToken: string;\n  id: string;\n  url: string;\n\n  constructor({\n    csrfToken,\n    initialFile,\n    uploadIndex,\n    uploadUrl\n  }: UploadedTusFileParameters) {\n    super({\n      name: initialFile.name,\n      size: initialFile.size,\n      type: \"uploadedTus\",\n      uploadIndex\n    });\n\n    this.csrfToken = csrfToken;\n    this.id = initialFile.id;\n    this.url = `${uploadUrl}${initialFile.id}`;\n  }\n\n  public async delete(): Promise<void> {\n    await deleteUpload(this.url, this.csrfToken);\n  }\n\n  public getId(): string | undefined {\n    return this.id;\n  }\n\n  getInitialFile(): InitialTusFile {\n    return {\n      id: this.id,\n      name: this.name,\n      size: this.size,\n      type: \"tus\",\n      url: \"\"\n    };\n  }\n}\n\nexport const createUploadedFile = ({\n  csrfToken,\n  initialFile,\n  uploadIndex,\n  uploadUrl\n}: UploadedFileParameters): BaseUploadedFile => {\n  switch (initialFile.type) {\n    case \"existing\":\n      return new ExistingFile(initialFile, uploadIndex);\n\n    case \"placeholder\":\n      return new PlaceholderFile(initialFile, uploadIndex);\n\n    case \"s3\":\n      return new UploadedS3File(initialFile, uploadIndex);\n\n    case \"tus\":\n      return new UploadedTusFile({\n        csrfToken,\n        initialFile,\n        uploadIndex,\n        uploadUrl\n      });\n  }\n};\n","import { EventEmitter } from \"eventemitter3\";\n\nimport AcceptedFileTypes from \"./accepted_file_types.ts\";\nimport DropArea from \"./drop_area.ts\";\nimport RenderUploadFile from \"./render_upload_file.ts\";\nimport BaseUpload, { InitialFile, UploadType } from \"./uploads/base_upload.ts\";\nimport S3Upload from \"./uploads/s3_upload.ts\";\nimport TusUpload from \"./uploads/tus_upload.ts\";\nimport { createUploadedFile } from \"./uploads/uploaded_file.ts\";\nimport {\n  findInput,\n  getMetadataFieldName,\n  getUploadsFieldName\n} from \"./util.ts\";\n\nexport interface Callbacks {\n  onClick?: ({ fieldName, fileName, type }: ClickEvent) => void;\n  onDelete?: (upload: BaseUpload) => void;\n  onError?: (error: unknown, upload: BaseUpload) => void;\n  onProgress?: (\n    bytesUploaded: number,\n    bytesTotal: number,\n    upload: BaseUpload\n  ) => void;\n  onSuccess?: (upload: BaseUpload) => void;\n}\n\nexport type Translations = Record<string, string>;\n\ninterface ClickEvent {\n  fieldName: string;\n  fileName: string;\n  id?: string;\n  type: UploadType;\n}\n\ninterface ConstructorParams {\n  callbacks: Callbacks;\n  chunkSize: number;\n  csrfToken: string;\n  eventEmitter?: EventEmitter;\n  fieldName: string;\n  form: Element;\n  formId: string;\n  initial: InitialFile[];\n  input: HTMLInputElement;\n  multiple: boolean;\n  parent: Element;\n  prefix: null | string;\n  retryDelays: null | number[];\n  s3UploadDir: null | string;\n  skipRequired: boolean;\n  supportDropArea: boolean;\n  translations: Translations;\n  uploadUrl: string;\n}\n\nclass FileField {\n  acceptedFileTypes: AcceptedFileTypes;\n  callbacks: Callbacks;\n  chunkSize: number;\n  csrfToken: string;\n  eventEmitter?: EventEmitter;\n  fieldName: string;\n  form: Element;\n  formId: string;\n  multiple: boolean;\n  nextUploadIndex: number;\n  prefix: null | string;\n  renderer: RenderUploadFile;\n  retryDelays: null | number[];\n  s3UploadDir: null | string;\n  supportDropArea: boolean;\n  uploads: BaseUpload[];\n  uploadUrl: string;\n\n  constructor({\n    callbacks,\n    chunkSize,\n    csrfToken,\n    eventEmitter,\n    fieldName,\n    form,\n    formId,\n    initial,\n    input,\n    multiple,\n    parent,\n    prefix,\n    retryDelays,\n    s3UploadDir,\n    skipRequired,\n    supportDropArea,\n    translations,\n    uploadUrl\n  }: ConstructorParams) {\n    this.callbacks = callbacks;\n    this.chunkSize = chunkSize;\n    this.csrfToken = csrfToken;\n    this.eventEmitter = eventEmitter;\n    this.fieldName = fieldName;\n    this.form = form;\n    this.formId = formId;\n    this.multiple = multiple;\n    this.prefix = prefix;\n    this.retryDelays = retryDelays;\n    this.s3UploadDir = s3UploadDir;\n    this.supportDropArea = supportDropArea && !input.disabled;\n    this.uploadUrl = uploadUrl;\n    this.acceptedFileTypes = new AcceptedFileTypes(input.accept);\n\n    this.uploads = [];\n    this.nextUploadIndex = 0;\n\n    this.renderer = new RenderUploadFile({\n      input,\n      parent,\n      skipRequired,\n      translations\n    });\n    const filesContainer = this.renderer.container;\n\n    if (supportDropArea) {\n      this.initDropArea(filesContainer, input.accept);\n    }\n\n    this.addInitialFiles(initial);\n\n    this.checkDropHint();\n\n    input.addEventListener(\"change\", this.onChange);\n    filesContainer.addEventListener(\"click\", this.handleClick);\n  }\n\n  addInitialFiles(initialFiles: InitialFile[]): void {\n    if (initialFiles.length === 0) {\n      return;\n    }\n\n    const { multiple, renderer } = this;\n\n    const addInitialFile = (initialFile: InitialFile): void => {\n      const { size } = initialFile;\n      const name =\n        initialFile.type === \"s3\" && initialFile.original_name\n          ? initialFile.original_name\n          : initialFile.name;\n\n      const element = renderer.addUploadedFile(\n        name,\n        this.nextUploadIndex,\n        size\n      );\n\n      const upload = createUploadedFile({\n        csrfToken: this.csrfToken,\n        initialFile,\n        uploadIndex: this.nextUploadIndex,\n        uploadUrl: this.uploadUrl\n      });\n      this.uploads.push(upload);\n\n      this.emitEvent(\"addUpload\", element, upload);\n    };\n\n    if (multiple) {\n      initialFiles.forEach((file: InitialFile): void => {\n        addInitialFile(file);\n        this.nextUploadIndex += 1;\n      });\n    } else {\n      const initialFile = initialFiles[0];\n\n      if (initialFile) {\n        addInitialFile(initialFile);\n      }\n    }\n  }\n\n  checkDropHint(): void {\n    if (!this.supportDropArea) {\n      return;\n    }\n\n    const nonEmptyUploads = this.uploads.filter(e => Boolean(e));\n\n    if (nonEmptyUploads.length === 0) {\n      this.renderer.renderDropHint();\n    } else {\n      this.renderer.removeDropHint();\n    }\n  }\n\n  emitEvent(eventName: string, element: HTMLElement, upload: BaseUpload): void {\n    if (this.eventEmitter) {\n      this.eventEmitter.emit(eventName, {\n        element,\n        fieldName: this.fieldName,\n        fileName: upload.name,\n        metaDataField: this.getMetaDataField(),\n        upload\n      });\n    }\n  }\n\n  findUploadByName(fileName: string): BaseUpload | undefined {\n    return this.uploads.find(upload => upload.name === fileName);\n  }\n\n  getMetaDataField(): HTMLElement | null {\n    return findInput(\n      this.form,\n      getMetadataFieldName(this.fieldName, this.prefix),\n      this.prefix\n    );\n  }\n\n  getUploadByIndex(uploadIndex: number): BaseUpload | undefined {\n    return this.uploads.find(upload => upload.uploadIndex === uploadIndex);\n  }\n\n  async handleCancel(upload: BaseUpload): Promise<void> {\n    this.renderer.disableCancel(upload.uploadIndex);\n    await upload.abort();\n    this.removeUploadFromList(upload);\n  }\n\n  handleClick = (e: Event): void => {\n    const target = e.target as HTMLElement;\n\n    const getUpload = (): BaseUpload | undefined => {\n      const dataIndex = target.getAttribute(\"data-index\");\n\n      if (!dataIndex) {\n        return undefined;\n      }\n\n      const uploadIndex = parseInt(dataIndex, 10);\n      return this.getUploadByIndex(uploadIndex);\n    };\n\n    if (\n      target.classList.contains(\"dff-delete\") &&\n      !target.classList.contains(\"dff-disabled\")\n    ) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload) {\n        void this.removeExistingUpload(upload);\n      }\n    } else if (target.classList.contains(\"dff-cancel\")) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload) {\n        void this.handleCancel(upload);\n      }\n    } else if (target.classList.contains(\"dff-filename\")) {\n      e.preventDefault();\n\n      const upload = getUpload();\n\n      if (upload?.status === \"done\" && this.callbacks.onClick) {\n        this.callbacks.onClick({\n          fieldName: this.fieldName,\n          fileName: upload.name,\n          id: upload.getId(),\n          type: upload.type\n        });\n      }\n    }\n  };\n\n  handleError = (upload: BaseUpload, error: unknown): void => {\n    this.renderer.setError(upload.uploadIndex);\n    upload.status = \"error\";\n\n    const { onError } = this.callbacks;\n\n    if (onError) {\n      if (upload instanceof TusUpload) {\n        onError(error, upload);\n      }\n    }\n  };\n\n  handleInvalidFiles = (files: File[]): void => {\n    this.renderer.setErrorInvalidFiles(files);\n  };\n\n  handleProgress = (\n    upload: BaseUpload,\n    bytesUploaded: number,\n    bytesTotal: number\n  ): void => {\n    const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2);\n\n    this.renderer.updateProgress(upload.uploadIndex, percentage);\n\n    const { onProgress } = this.callbacks;\n\n    if (onProgress) {\n      if (upload instanceof TusUpload) {\n        onProgress(bytesUploaded, bytesTotal, upload);\n      }\n    }\n  };\n\n  handleSuccess = (upload: BaseUpload): void => {\n    const { renderer } = this;\n\n    this.updatePlaceholderInput();\n\n    renderer.clearInput();\n    renderer.setSuccess(upload.uploadIndex, upload.getSize());\n    upload.status = \"done\";\n\n    const { onSuccess } = this.callbacks;\n\n    const element = this.renderer.findFileDiv(upload.uploadIndex);\n\n    if (element) {\n      this.emitEvent(\"uploadComplete\", element, upload);\n    }\n\n    if (onSuccess && upload.type === \"tus\") {\n      onSuccess(upload);\n    }\n  };\n\n  initDropArea(container: Element, inputAccept: string): void {\n    new DropArea({\n      container,\n      inputAccept,\n      onUploadFiles: this.uploadFiles,\n      renderer: this.renderer\n    });\n  }\n\n  onChange = (e: Event): void => {\n    const files = (e.target as HTMLInputElement).files ?? ([] as File[]);\n    const acceptedFiles: File[] = [];\n    const invalidFiles: File[] = [];\n\n    for (const file of files) {\n      if (this.acceptedFileTypes.isAccepted(file.name)) {\n        acceptedFiles.push(file);\n      } else {\n        invalidFiles.push(file);\n      }\n    }\n\n    this.handleInvalidFiles([...invalidFiles]);\n    void this.uploadFiles([...acceptedFiles]);\n\n    this.renderer.clearInput();\n  };\n\n  async removeExistingUpload(upload: BaseUpload): Promise<void> {\n    const element = this.renderer.findFileDiv(upload.uploadIndex);\n\n    if (element) {\n      this.emitEvent(\"removeUpload\", element, upload);\n    }\n\n    if (upload.status === \"uploading\") {\n      this.renderer.disableCancel(upload.uploadIndex);\n      await upload.abort();\n    } else if (upload.status === \"done\") {\n      this.renderer.disableDelete(upload.uploadIndex);\n\n      try {\n        await upload.delete();\n      } catch {\n        this.renderer.setDeleteFailed(upload.uploadIndex);\n        return;\n      }\n    }\n\n    this.removeUploadFromList(upload);\n    this.updatePlaceholderInput();\n  }\n\n  removeUploadFromList(upload: BaseUpload): void {\n    this.renderer.deleteFile(upload.uploadIndex);\n\n    const index = this.uploads.indexOf(upload);\n\n    if (index >= 0) {\n      this.uploads.splice(index, 1);\n    }\n\n    this.checkDropHint();\n\n    const { onDelete } = this.callbacks;\n\n    if (onDelete) {\n      onDelete(upload);\n    }\n  }\n\n  updatePlaceholderInput(): void {\n    const input = findInput(\n      this.form,\n      getUploadsFieldName(this.fieldName, this.prefix),\n      this.prefix\n    );\n    if (!input) {\n      return;\n    }\n\n    const placeholdersInfo: InitialFile[] = this.uploads.map(upload =>\n      upload.getInitialFile()\n    );\n\n    input.value = JSON.stringify(placeholdersInfo);\n  }\n\n  async uploadFile(file: File): Promise<void> {\n    const createUpload = (): S3Upload | TusUpload => {\n      const { csrfToken, s3UploadDir } = this;\n\n      if (s3UploadDir != null) {\n        return new S3Upload({\n          csrfToken,\n          endpoint: uploadUrl,\n          file,\n          s3UploadDir,\n          uploadIndex: newUploadIndex\n        });\n      } else {\n        return new TusUpload({\n          chunkSize: this.chunkSize,\n          csrfToken: this.csrfToken,\n          fieldName,\n          file,\n          formId,\n          retryDelays: this.retryDelays,\n          uploadIndex: newUploadIndex,\n          uploadUrl\n        });\n      }\n    };\n\n    const { fieldName, formId, renderer, uploadUrl } = this;\n    const fileName = file.name;\n    const existingUpload = this.findUploadByName(fileName);\n    const newUploadIndex = existingUpload\n      ? existingUpload.uploadIndex\n      : this.nextUploadIndex;\n\n    if (!existingUpload) {\n      this.nextUploadIndex += 1;\n    }\n\n    if (existingUpload) {\n      await this.removeExistingUpload(existingUpload);\n    }\n\n    const upload = createUpload();\n\n    upload.onError = (error: unknown) => {\n      this.handleError(upload, error);\n    };\n    upload.onProgress = (bytesUploaded, bytesTotal) => {\n      this.handleProgress(upload, bytesUploaded, bytesTotal);\n    };\n    upload.onSuccess = () => {\n      this.handleSuccess(upload);\n    };\n    upload.start();\n\n    this.uploads.push(upload);\n\n    const element = renderer.addNewUpload(fileName, newUploadIndex);\n    this.emitEvent(\"addUpload\", element, upload);\n  }\n\n  uploadFiles = async (files: File[]): Promise<void> => {\n    if (files.length === 0) {\n      return;\n    }\n\n    if (!this.multiple) {\n      for (const upload of this.uploads) {\n        this.renderer.deleteFile(upload.uploadIndex);\n      }\n\n      this.uploads = [];\n      const file = files[0];\n\n      if (file) {\n        await this.uploadFile(file);\n      }\n    } else {\n      for (const file of files) {\n        await this.uploadFile(file);\n      }\n    }\n\n    this.checkDropHint();\n  };\n}\n\nexport default FileField;\n","import { EventEmitter } from \"eventemitter3\";\n\nimport FileField, { Callbacks, Translations } from \"./file_field.ts\";\nimport { InitialFile } from \"./uploads/base_upload.ts\";\nimport {\n  findInput,\n  getInputValueForFormAndPrefix,\n  getUploadsFieldName\n} from \"./util.ts\";\n\nexport interface Options {\n  callbacks?: Callbacks;\n  chunkSize?: number;\n  eventEmitter?: EventEmitter;\n  prefix?: string;\n  retryDelays?: number[];\n  skipRequired?: boolean;\n  supportDropArea?: boolean;\n}\n\nconst initUploadFields = (form: Element, options: Options = {}): void => {\n  const matchesPrefix = (fieldName: string): boolean => {\n    if (!options.prefix) {\n      return true;\n    }\n\n    return fieldName.startsWith(`${options.prefix}-`);\n  };\n\n  const getPrefix = (): null | string => options.prefix ?? null;\n\n  const getInputValue = (fieldName: string): string | undefined =>\n    getInputValueForFormAndPrefix(form, fieldName, getPrefix());\n\n  const getInitialFiles = (fieldName: string): InitialFile[] => {\n    const data = getInputValue(getUploadsFieldName(fieldName, getPrefix()));\n\n    if (!data) {\n      return [];\n    }\n\n    return (JSON.parse(data) as Record<string, unknown>[]).filter(\n      file => file.type\n    ) as unknown as InitialFile[];\n  };\n\n  const uploadUrl = getInputValue(\"upload_url\");\n  const formId = getInputValue(\"form_id\");\n  const s3UploadDir = getInputValue(\"s3_upload_dir\");\n  const skipRequired = options.skipRequired ?? false;\n  const prefix = getPrefix();\n  const csrfToken = findInput(form, \"csrfmiddlewaretoken\", null)?.value;\n\n  if (!csrfToken) {\n    throw Error(\"Csrf token not found\");\n  }\n\n  if (!formId || !uploadUrl) {\n    return;\n  }\n\n  form.querySelectorAll(\".dff-uploader\").forEach(uploaderDiv => {\n    const container = uploaderDiv.querySelector(\".dff-container\");\n\n    if (!container) {\n      return;\n    }\n\n    const input = container.querySelector<HTMLInputElement>(\"input[type=file]\");\n\n    if (!(input && matchesPrefix(input.name))) {\n      return;\n    }\n\n    const fieldName = input.name;\n    const { multiple } = input;\n    const initial = getInitialFiles(fieldName);\n    const dataTranslations = container.getAttribute(\"data-translations\");\n    const translations: Translations = dataTranslations\n      ? (JSON.parse(dataTranslations) as Translations)\n      : {};\n    const supportDropArea = !(options.supportDropArea === false);\n\n    new FileField({\n      callbacks: options.callbacks ?? {},\n      chunkSize: options.chunkSize ?? 2621440,\n      csrfToken,\n      eventEmitter: options.eventEmitter,\n      fieldName,\n      form,\n      formId,\n      initial,\n      input,\n      multiple,\n      parent: container,\n      prefix,\n      retryDelays: options.retryDelays ?? null,\n      s3UploadDir: s3UploadDir ?? null,\n      skipRequired,\n      supportDropArea,\n      translations,\n      uploadUrl\n    });\n  });\n};\n\nexport default initUploadFields;\n","import autoInitFileForms from \"./auto_init_file_forms.ts\";\nimport initFormSet from \"./init_form_set.ts\";\nimport initUploadFields from \"./init_upload_fields.ts\";\n\ndeclare const window: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nwindow.autoInitFileForms = autoInitFileForms; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\nwindow.initFormSet = initFormSet; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\nwindow.initUploadFields = initUploadFields; // eslint-disable-line  @typescript-eslint/no-unsafe-member-access\n","import initUploadFields, { Options } from \"./init_upload_fields.ts\";\nimport {\n  getInputNameWithPrefix,\n  getInputValueForFormAndPrefix\n} from \"./util.ts\";\n\nconst initFormSet = (\n  form: HTMLFormElement,\n  optionsParam: Options | string\n): void => {\n  let options: Options;\n\n  if (typeof optionsParam === \"string\") {\n    options = { prefix: optionsParam };\n  } else {\n    options = optionsParam;\n  }\n\n  const prefix = options.prefix ?? \"form\";\n\n  const totalFormsValue = getInputValueForFormAndPrefix(\n    form,\n    \"TOTAL_FORMS\",\n    prefix\n  );\n\n  if (!totalFormsValue) {\n    return;\n  }\n\n  const formCount = parseInt(totalFormsValue, 10);\n\n  for (let i = 0; i < formCount; i += 1) {\n    const subFormPrefix = getInputNameWithPrefix(i.toString(), null);\n    initUploadFields(form, {\n      ...options,\n      prefix: `${prefix}-${subFormPrefix}`\n    });\n  }\n};\n\nexport default initFormSet;\n"],"names":["findForm","element","parent","parentElement","tagName","types","Object","freeze","_Mime_extensionToType","_Mime_typeToExtension","_Mime_typeToExtensions","__classPrivateFieldGet","this","receiver","state","kind","f","TypeError","has","call","value","get","WeakMap","mime","constructor","args","set","Map","arg","define","typeMap","force","type","extensions","entries","toLowerCase","map","ext","Set","allExtensions","first","extension","starred","startsWith","slice","add","currentType","Error","getType","path","last","replace","hasPath","length","getExtension","split","trim","getAllExtensions","_freeze","values","_getTestState","standardTypes","WIN_SLASH","WIN_NO_SLASH","DOT_LITERAL","SLASH_LITERAL","QMARK","END_ANCHOR","START_ANCHOR","DOTS_SLASH","POSIX_CHARS","PLUS_LITERAL","QMARK_LITERAL","ONE_CHAR","NO_DOT","NO_DOTS","NO_DOT_SLASH","NO_DOTS_SLASH","QMARK_NO_DOT","STAR","SEP","WINDOWS_CHARS","constants","MAX_LENGTH","POSIX_REGEX_SOURCE","alnum","alpha","ascii","blank","cntrl","digit","graph","lower","print","punct","space","upper","word","xdigit","REGEX_BACKSLASH","REGEX_NON_SPECIAL_CHARS","REGEX_SPECIAL_CHARS","REGEX_SPECIAL_CHARS_BACKREF","REGEX_SPECIAL_CHARS_GLOBAL","REGEX_REMOVE_BACKSLASH","REPLACEMENTS","__proto__","CHAR_0","CHAR_9","CHAR_UPPERCASE_A","CHAR_LOWERCASE_A","CHAR_UPPERCASE_Z","CHAR_LOWERCASE_Z","CHAR_LEFT_PARENTHESES","CHAR_RIGHT_PARENTHESES","CHAR_ASTERISK","CHAR_AMPERSAND","CHAR_AT","CHAR_BACKWARD_SLASH","CHAR_CARRIAGE_RETURN","CHAR_CIRCUMFLEX_ACCENT","CHAR_COLON","CHAR_COMMA","CHAR_DOT","CHAR_DOUBLE_QUOTE","CHAR_EQUAL","CHAR_EXCLAMATION_MARK","CHAR_FORM_FEED","CHAR_FORWARD_SLASH","CHAR_GRAVE_ACCENT","CHAR_HASH","CHAR_HYPHEN_MINUS","CHAR_LEFT_ANGLE_BRACKET","CHAR_LEFT_CURLY_BRACE","CHAR_LEFT_SQUARE_BRACKET","CHAR_LINE_FEED","CHAR_NO_BREAK_SPACE","CHAR_PERCENT","CHAR_PLUS","CHAR_QUESTION_MARK","CHAR_RIGHT_ANGLE_BRACKET","CHAR_RIGHT_CURLY_BRACE","CHAR_RIGHT_SQUARE_BRACKET","CHAR_SEMICOLON","CHAR_SINGLE_QUOTE","CHAR_SPACE","CHAR_TAB","CHAR_UNDERSCORE","CHAR_VERTICAL_LINE","CHAR_ZERO_WIDTH_NOBREAK_SPACE","extglobChars","chars","open","close","globChars","win32","require$$0","exports","isObject","val","Array","isArray","hasRegexChars","str","test","isRegexChar","escapeRegex","toPosixSlashes","isWindows","navigator","platform","process","removeBackslashes","match","escapeLast","input","char","lastIdx","idx","lastIndexOf","removePrefix","output","prefix","wrapOutput","options","contains","negated","basename","windows","segs","utils","require$$1","isPathSeparator","code","depth","token","isPrefix","isGlobstar","Infinity","scan_1","opts","scanToEnd","parts","slashes","tokens","prev","index","start","lastIndex","isBrace","isBracket","isGlob","isExtglob","braceEscaped","backslashes","negatedExtglob","finished","braces","eos","peek","charCodeAt","advance","next","noext","nonegate","noparen","push","base","glob","unescape","maxDepth","prevIndex","n","i","expandRange","sort","join","RegExp","ex","v","syntaxError","parse","max","maxLength","Math","min","len","SyntaxError","bos","prepend","capture","PLATFORM_CHARS","EXTGLOB_CHARS","globstar","dot","nodot","qmarkNoDot","star","bash","noextglob","consumed","backtrack","brackets","parens","quotes","extglobs","stack","remaining","consume","num","append","negate","count","increment","decrement","pop","tok","extglob","inner","extglobOpen","conditions","extglobClose","rest","extglobStar","includes","expression","fastpaths","m","esc","repeat","exec","posix","pre","indexOf","keepQuotes","strictBrackets","nobracket","prevValue","literalBrackets","escaped","nobrace","outputIndex","tokensIndex","brace","dots","arr","range","unshift","comma","out","toks","t","regex","noglobstar","prior","before","isStart","afterStar","after","strictSlashes","end","suffix","slashDot","create","source","parse_1","scan","require$$2","require$$3","picomatch","returnState","fns","arrayMatcher","isMatch","isState","compileRe","makeRe","isIgnored","ignore","ignoreOpts","onMatch","onResult","matcher","returnObject","result","onIgnore","format","matchBase","Boolean","patterns","pattern","p","returnOutput","toRegex","parsed","flags","nocase","err","debug","picomatch_1","AcceptedFileTypes","inputAccept","mimeTypes","mimeType","filter","forEach","fileType","parseInputAccept","isAccepted","fileName","isMimeTypeAccepted","isExtensionAccepted","getFilesFromFileSystemEntry","async","entry","isFile","file","Promise","resolve","reject","fileEntry","getFileFromFileSystemFileEntry","isDirectory","entriesFromDirectory","directoryEntry","createReader","readEntries","getEntriesFromDirectory","files","getFilesFromFileSystemEntries","DropArea","container","onUploadFiles","renderer","acceptedFileTypes","addEventListener","classList","remove","e","preventDefault","onDrop","dragEvent","stopPropagation","dataTransfer","items","item","fileSystemEntry","webkitGetAsEntry","getAsFile","getFilesFromDataTransfer","acceptedFiles","invalidFiles","name","setErrorInvalidFiles","error","console","uploadFiles","matchHtmlRegExp","escapeHtml_1","string","escape","html","substring","getInputNameWithPrefix","fieldName","getInputNameWithoutPrefix","findInput","form","inputNameWithPrefix","querySelector","getUploadsFieldName","getInputValueForFormAndPrefix","RenderUploadFile","skipRequired","translations","createFilesContainer","errors","createErrorContainer","required","addNewUpload","filename","uploadIndex","div","addFile","progressSpan","document","createElement","className","innerSpan","appendChild","cancelLink","setTextContent","getTranslation","setAttribute","toString","href","addUploadedFile","filesize","setSuccess","clearInput","deleteFile","findFileDiv","disableCancel","cancelSpan","findCancelSpan","disableDelete","deleteLink","findDeleteLink","removeDropHint","dropHint","renderDropHint","setDeleteFailed","setErrorMessage","enableDelete","setError","el","removeProgress","removeCancel","errorsMessages","msg","invalidFileTypeMessage","replaceChildren","size","fileSizeInfo","formatBytes","bytes","decimals","dm","floor","log","parseFloat","toFixed","updateProgress","percentage","innerProgressSpan","style","width","nameSpan","innerHTML","key","message","originalMessageSpan","span","text","createTextNode","BaseUpload$1","status","abort","delete","urlJoin","strArray","resultArray","shift","component","normalize","arguments","splice","S3Upload","BaseUpload","csrfToken","endpoint","s3UploadDir","super","uploadId","createdPromise","chunks","chunkState","uploading","onError","undefined","onProgress","onSuccess","initChunks","catch","xhr","abortMultipartUpload","encodeURIComponent","uploadIdEnc","headers","Headers","url","urljoin","fetch","method","then","response","json","getId","getInitialFile","id","original_name","getSize","createUpload","completeUpload","a","b","PartNumber","completeMultipartUpload","body","JSON","stringify","data","handleError","createMultipartUpload","accept","contentType","uploadParts","desiredChunkSize","ceil","minChunkSize","chunkSize","busy","done","uploaded","onPartComplete","etag","part","ETag","onPartProgress","sent","totalUploaded","reduce","c","uploadPart","prepareUploadPart","number","uploadPartBytes","XMLHttpRequest","responseType","upload","ev","lengthComputable","loaded","getResponseHeader","send","need","every","candidates","DetailedError","causingErr","req","res","originalRequest","originalResponse","causingError","requestId","getHeader","getMethod","getURL","getStatus","getBody","_hasBuffer","Buffer","_TE","TextDecoder","TextEncoder","b64chs","prototype","b64tab","tab","b64re","_fromCC","String","fromCharCode","bind","_mkUriSafe","Uint8Array","from","src","m0","_tidyB64","s","btoaPolyfill","bin","u32","c0","c1","c2","asc","pad","_btoa","btoa","_fromUint8Array","u8a","strs","l","apply","subarray","cb_utob","cc","re_utob","utob","u","_encode","encode","urlsafe","atobPolyfill","u24","r1","r2","binArray","charAt","gBase64","requiresPort","port","protocol","qs","hasOwnProperty","decode","decodeURIComponent","querystringify_1","obj","pairs","isNaN","query","parser","controlOrWhitespace","CRHTLF","protocolre","windowsDriveLetter","trimLeft","rules","address","isSpecial","NaN","hash","lolcation","loc","location","window","global","self","finaldestination","Url","pathname","scheme","extractProtocol","forwardSlashes","otherSlashes","slashesCount","relative","extracted","instruction","instructions","concat","up","host","hostname","username","password","auth","origin","fn","ins","urlParse","PROTOCOL_TUS_V1","PROTOCOL_IETF_DRAFT_03","PROTOCOL_IETF_DRAFT_05","defaultOptions","uploadUrl","metadata","metadataForPartialUploads","fingerprint","uploadSize","onChunkComplete","onUploadUrlAvailable","overridePatchMethod","addRequestId","onBeforeRequest","onAfterResponse","onShouldRetry","defaultOnShouldRetry","Number","POSITIVE_INFINITY","retryDelays","parallelUploads","parallelUploadBoundaries","storeFingerprintForResuming","removeFingerprintOnSuccess","uploadLengthDeferred","uploadDataDuringCreation","urlStorage","fileReader","httpStack","_urlStorage","_req","_fingerprint","_urlStorageKey","_offset","_aborted","_size","_source","_retryAttempt","_retryTimeout","_offsetBeforeRetry","_parallelUploads","_parallelUploadUrls","terminate","openRequest","sendRequest","shouldRetry","delay","remainingDelays","newOptions","setTimeout","findPreviousUploads","findUploadsByFingerprint","resumeFromPreviousUpload","previousUpload","parallelUploadUrls","urlStorageKey","_emitError","optionName","openFile","_startParallelUpload","_startSingleUpload","totalSize","totalProgress","partCount","partSize","splitSizeIntoParts","uploads","lastPartProgress","newPartProgress","_emitProgress","_saveUploadInUrlStorage","all","_openRequest","setHeader","encodeMetadata","_sendRequest","inStatusCategory","_emitHttpError","resolveUrl","_emitSuccess","_resumeUpload","_createUpload","shouldTerminate","clearTimeout","_removeFromUrlStorage","lastResponse","bytesSent","bytesTotal","_emitChunkComplete","bytesAccepted","promise","_addChunkToRequest","_handleUploadResponse","_performUpload","offset","parseInt","setProgressHandler","valueSize","newSize","removeUpload","storedUpload","creationTime","Date","addUpload","Base64","category","createRequest","r","random","retryAttempt","online","onLine","isOnline","link","URL","isReactNative","product","FileSource","_file","PhoneGap","Cordova","cordova","chunk","reader","FileReader","onload","onerror","readAsArrayBuffer","blobOrArray","StreamSource","_buffer","_bufferOffset","_reader","_done","_readUntilEnoughDataOrDone","hasEnoughData","_getDataFromBuffer","read","Blob","hasAllDataBeenRead","cancel","Request","_xhr","_method","_url","_headers","header","setRequestHeader","progressHandler","onprogress","Response","getUnderlyingObject","responseText","hasStorage","originalValue","localStorage","getItem","setItem","removeItem","SECURITY_ERR","QUOTA_EXCEEDED_ERR","canStoreURLs","getName","uri","blob","isFinite","findAllUploads","results","_findEntries","round","_e","listAllUploads","_upload","exifHash","exif","hashCode","reactNativeFingerprint","lastModified","Upload","deleteUpload","TusUpload","formId","handleAfterReponse","addCsrTokenToRequest","handleProgress","handleSucces","request","_request","resourceId","bytesUploaded","BaseUploadedFile","PlaceholderFile","initialFile","ExistingFile","UploadedS3File","UploadedTusFile","FileField","callbacks","eventEmitter","initial","multiple","supportDropArea","disabled","nextUploadIndex","filesContainer","initDropArea","addInitialFiles","checkDropHint","onChange","handleClick","initialFiles","addInitialFile","createUploadedFile","emitEvent","eventName","emit","metaDataField","getMetaDataField","findUploadByName","find","getMetadataFieldName","getUploadByIndex","handleCancel","removeUploadFromList","target","getUpload","dataIndex","getAttribute","removeExistingUpload","onClick","handleInvalidFiles","handleSuccess","updatePlaceholderInput","onDelete","placeholdersInfo","uploadFile","existingUpload","newUploadIndex","initUploadFields","getPrefix","getInputValue","querySelectorAll","uploaderDiv","matchesPrefix","getInitialFiles","dataTranslations","autoInitFileForms","initFormSet","optionsParam","totalFormsValue","formCount","subFormPrefix"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,12,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]}