summaryrefslogtreecommitdiffstats
path: root/third_party/rust/mime_guess
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 09:22:09 +0000
commit43a97878ce14b72f0981164f87f2e35e14151312 (patch)
tree620249daf56c0258faa40cbdcf9cfba06de2a846 /third_party/rust/mime_guess
parentInitial commit. (diff)
downloadfirefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz
firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/mime_guess')
-rw-r--r--third_party/rust/mime_guess/.cargo-checksum.json1
-rw-r--r--third_party/rust/mime_guess/Cargo.lock622
-rw-r--r--third_party/rust/mime_guess/Cargo.toml42
-rw-r--r--third_party/rust/mime_guess/LICENSE22
-rw-r--r--third_party/rust/mime_guess/README.md86
-rw-r--r--third_party/rust/mime_guess/benches/benchmark.rs31
-rw-r--r--third_party/rust/mime_guess/build.rs191
-rw-r--r--third_party/rust/mime_guess/examples/rev_map.rs14
-rw-r--r--third_party/rust/mime_guess/src/impl_bin_search.rs41
-rw-r--r--third_party/rust/mime_guess/src/impl_phf.rs40
-rw-r--r--third_party/rust/mime_guess/src/lib.rs534
-rw-r--r--third_party/rust/mime_guess/src/mime_types.rs1499
12 files changed, 3123 insertions, 0 deletions
diff --git a/third_party/rust/mime_guess/.cargo-checksum.json b/third_party/rust/mime_guess/.cargo-checksum.json
new file mode 100644
index 0000000000..a1d0edbcf3
--- /dev/null
+++ b/third_party/rust/mime_guess/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.lock":"1be3b2e0b56466b1a4ab94c35176df5a41846677caa7bd2d5603cfdb19d9eef3","Cargo.toml":"c367dbd734e16d3dc6333fc072021372baee73170ec1c9b19606bb52f1772d9a","LICENSE":"6919f1acec82afc721be2d9907b993267f433a44d25d8aedf1003b5f59ebfd46","README.md":"417338ebb9da8e8bdfad3c3da81248ab5f023652f3468ec5dcb2fdf43ea40b32","benches/benchmark.rs":"2287c7233cf78a9af98b2b53cd20e221e4a785209bd70a87030f1ade34a02507","build.rs":"8e47254c0a927eeb243058cfc0da413f34a958226707c941e8634e4514562f04","examples/rev_map.rs":"0bab6cc20b9eace741c6cc4a8c67ebfa124df1bf213038c5e34976081ffd2ebc","src/impl_bin_search.rs":"32a89409690d57f074f11eb93a9d6e422f73788af63fc29f980e13d1c2d2fa6f","src/impl_phf.rs":"321028cc657364c6f7c5b5f538b0033bcfd6f3b5ef711304d806c0644466a964","src/lib.rs":"bb190bcbbf4139c410af20564f0376a99a83474ca12b7e8c6860228e0caff7da","src/mime_types.rs":"57ee8db84eb0fc4f06a3eac0da8c730a334cb99a7e81e60413f5febd886d91f4"},"package":"4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"} \ No newline at end of file
diff --git a/third_party/rust/mime_guess/Cargo.lock b/third_party/rust/mime_guess/Cargo.lock
new file mode 100644
index 0000000000..18dfe39b8c
--- /dev/null
+++ b/third_party/rust/mime_guess/Cargo.lock
@@ -0,0 +1,622 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "atty"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "bstr"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631"
+
+[[package]]
+name = "cast"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c24dab4283a142afa2fdca129b80ad2c6284e073930f964c3a1293c225ee39a"
+dependencies = [
+ "rustc_version",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clap"
+version = "2.33.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
+dependencies = [
+ "bitflags",
+ "textwrap",
+ "unicode-width",
+]
+
+[[package]]
+name = "criterion"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1604dafd25fba2fe2d5895a9da139f8dc9b319a5fe5354ca137cbbce4e178d10"
+dependencies = [
+ "atty",
+ "cast",
+ "clap",
+ "criterion-plot",
+ "csv",
+ "itertools",
+ "lazy_static",
+ "num-traits",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_cbor",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d00996de9f2f7559f7f4dc286073197f83e92256a59ed395f9aac01fe717da57"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "csv"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
+dependencies = [
+ "bstr",
+ "csv-core",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "csv-core"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "half"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62aca2aba2d62b4a7f5b33f3712cb1b0692779a56fb510499d5c0aa594daeaf3"
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
+
+[[package]]
+name = "js-sys"
+version = "0.3.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce791b7ca6638aae45be056e068fc756d871eb3b3b10b8efa62d1c9cec616752"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
+
+[[package]]
+name = "log"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "memchr"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
+
+[[package]]
+name = "memoffset"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+dependencies = [
+ "criterion",
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "oorandom"
+version = "11.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
+
+[[package]]
+name = "plotters"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a3fd9ec30b9749ce28cd91f255d569591cdf937fe280c312143e3c4bad6f2a"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d88417318da0eaf0fdcdb51a0ee6c3bed624333bff8f946733049380be67ac1c"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "521fa9638fa597e1dc53e9412a4f9cefb01187ee1f7413076f9e6749e2885ba9"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rayon"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "lazy_static",
+ "num_cpus",
+]
+
+[[package]]
+name = "regex"
+version = "1.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+dependencies = [
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "semver"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012"
+
+[[package]]
+name = "serde"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8"
+
+[[package]]
+name = "serde_cbor"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622"
+dependencies = [
+ "half",
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.127"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.74"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "textwrap"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-width"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
+
+[[package]]
+name = "version_check"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
+
+[[package]]
+name = "walkdir"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+dependencies = [
+ "same-file",
+ "winapi",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b608ecc8f4198fe8680e2ed18eccab5f0cd4caaf3d83516fa5fb2e927fda2586"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "580aa3a91a63d23aac5b6b267e2d13cb4f363e31dce6c352fca4752ae12e479f"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "171ebf0ed9e1458810dfcb31f2e766ad6b3a89dbda42d8901f2b268277e5f09c"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c2657dd393f03aa2a659c25c6ae18a13a4048cebd220e147933ea837efc589f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.75"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e0c4a743a309662d45f4ede961d7afa4ba4131a59a639f29b0069c3798bbcc2"
+
+[[package]]
+name = "web-sys"
+version = "0.3.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01c70a82d842c9979078c772d4a1344685045f1a5628f677c2b2eab4dd7d2696"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/third_party/rust/mime_guess/Cargo.toml b/third_party/rust/mime_guess/Cargo.toml
new file mode 100644
index 0000000000..fc6f68d2a7
--- /dev/null
+++ b/third_party/rust/mime_guess/Cargo.toml
@@ -0,0 +1,42 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+name = "mime_guess"
+version = "2.0.4"
+authors = ["Austin Bonander <austin.bonander@gmail.com>"]
+description = "A simple crate for detection of a file's MIME type by its extension."
+documentation = "https://docs.rs/mime_guess/"
+readme = "README.md"
+keywords = ["mime", "filesystem", "extension"]
+license = "MIT"
+repository = "https://github.com/abonander/mime_guess"
+
+[[example]]
+name = "rev_map"
+required-features = ["rev-mappings"]
+
+[[bench]]
+name = "benchmark"
+harness = false
+[dependencies.mime]
+version = "0.3"
+
+[dependencies.unicase]
+version = "2.4.0"
+[dev-dependencies.criterion]
+version = "0.3"
+[build-dependencies.unicase]
+version = "2.4.0"
+
+[features]
+default = ["rev-mappings"]
+rev-mappings = []
diff --git a/third_party/rust/mime_guess/LICENSE b/third_party/rust/mime_guess/LICENSE
new file mode 100644
index 0000000000..e3a1862857
--- /dev/null
+++ b/third_party/rust/mime_guess/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Austin Bonander
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/third_party/rust/mime_guess/README.md b/third_party/rust/mime_guess/README.md
new file mode 100644
index 0000000000..6e774503a4
--- /dev/null
+++ b/third_party/rust/mime_guess/README.md
@@ -0,0 +1,86 @@
+# mime_guess ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/abonander/mime_guess/Rust) [![Crates.io](https://img.shields.io/crates/v/mime_guess.svg)](https://crates.io/crates/mime_guess)
+
+MIME/MediaType guessing by file extension.
+Uses a static map of known file extension -> MIME type mappings.
+
+**Returning Contributors: New Requirements for Submissions Below**
+
+##### Required Rust Version: 1.33
+
+#### [Documentation](https://docs.rs/mime_guess/)
+
+### Versioning
+
+Due to a mistaken premature release, `mime_guess` currently publicly depends on a pre-1.0 `mime`,
+which means `mime` upgrades are breaking changes and necessitate a major version bump.
+Refer to the following table to find a version of `mime_guess` which matches your version of `mime`:
+
+| `mime` version | `mime_guess` version |
+|----------------|----------------------|
+| `0.1.x, 0.2.x` | `1.x.y` |
+| `0.3.x` | `2.x.y` |
+
+#### Note: MIME Types Returned Are Not Stable/Guaranteed
+The media types returned for a given extension are not considered to be part of the crate's
+ stable API and are often updated in patch (`x.y.z + 1`) releases to be as correct as possible. MIME
+ changes are backported to previous major releases on a best-effort basis.
+
+Note that only the extensions of paths/filenames are inspected in order to guess the MIME type. The
+file that may or may not reside at that path may or may not be a valid file of the returned MIME type.
+Be wary of unsafe or un-validated assumptions about file structure or length.
+
+An extension may also have multiple applicable MIME types. When more than one is returned, the first
+is considered to be the most "correct"--see below for elaboration.
+
+Contributing
+-----------
+
+#### Adding or correcting MIME types for extensions
+
+Is the MIME type for a file extension wrong or missing? Great!
+Well, not great for us, but great for you if you'd like to open a pull request!
+
+The file extension -> MIME type mappings are listed in `src/mime_types.rs`.
+**The list is sorted lexicographically by file extension, and all extensions are lowercase (where applicable).**
+The former is necessary to support fallback to binary search when the
+`phf-map` feature is turned off, and for the maintainers' sanity.
+The latter is only for consistency's sake; the search is case-insensitive.
+
+Simply add or update the appropriate string pair(s) to make the correction(s) needed.
+Run `cargo test` to make sure the library continues to work correctly.
+
+#### Important! Citing the corrected MIME type
+
+When opening a pull request, please include a link to an official document or RFC noting
+the correct MIME type for the file type in question **in the commit message** so
+that the commit history can be used as an audit trail.
+
+Though we're only guessing here, we like to be as correct as we can.
+It makes it much easier to vet your contribution if we don't have to search for corroborating material.
+
+#### Multiple MIME types per extension
+As of `2.0.0`, multiple MIME types per extension are supported. The first MIME type in the list for
+a given extension should be the most "correct" so users who only care about getting a single MIME
+type can use the `first*()` methods.
+
+The definition of "correct" is open to debate, however. In the author's opinion this should be
+whatever is defined by the latest IETF RFC for the given file format, or otherwise explicitly
+supercedes all others.
+
+If an official IANA registration replaces an older "experimental" style media type, please
+place the new type before the old type in the list, but keep the old type for reference:
+
+```
+- ("md", &["text/x-markdown"]),
++ ("md", &["text/markdown", "text/x-markdown"]),
+```
+
+#### Changes to the API or operation of the crate
+
+We're open to changes to the crate's API or its inner workings, breaking or not, if it improves the overall operation, efficiency, or ergonomics of the crate. However, it would be a good idea to open an issue on the repository so we can discuss your proposed changes and decide how best to approach them.
+
+
+License
+-------
+
+MIT (See the `LICENSE` file in this repository for more information.)
diff --git a/third_party/rust/mime_guess/benches/benchmark.rs b/third_party/rust/mime_guess/benches/benchmark.rs
new file mode 100644
index 0000000000..4a7af2e584
--- /dev/null
+++ b/third_party/rust/mime_guess/benches/benchmark.rs
@@ -0,0 +1,31 @@
+#[macro_use]
+extern crate criterion;
+extern crate mime_guess;
+
+use self::criterion::Criterion;
+
+use mime_guess::from_ext;
+
+include!("../src/mime_types.rs");
+
+/// WARNING: this may take a while!
+fn bench_mime_str(c: &mut Criterion) {
+ c.bench_function("from_ext", |b| {
+ for (mime_ext, _) in MIME_TYPES {
+ b.iter(|| from_ext(mime_ext).first_raw());
+ }
+ });
+}
+
+fn bench_mime_str_uppercase(c: &mut Criterion) {
+ c.bench_function("from_ext uppercased", |b| {
+ let uppercased = MIME_TYPES.into_iter().map(|(s, _)| s.to_uppercase());
+
+ for mime_ext in uppercased {
+ b.iter(|| from_ext(&mime_ext).first_raw());
+ }
+ });
+}
+
+criterion_group!(benches, bench_mime_str, bench_mime_str_uppercase);
+criterion_main!(benches);
diff --git a/third_party/rust/mime_guess/build.rs b/third_party/rust/mime_guess/build.rs
new file mode 100644
index 0000000000..ff4ea764ef
--- /dev/null
+++ b/third_party/rust/mime_guess/build.rs
@@ -0,0 +1,191 @@
+#[cfg(feature = "phf")]
+extern crate phf_codegen;
+extern crate unicase;
+
+use unicase::UniCase;
+
+use std::env;
+use std::fs::File;
+use std::io::prelude::*;
+use std::io::BufWriter;
+use std::path::Path;
+
+use std::collections::BTreeMap;
+
+use mime_types::MIME_TYPES;
+
+#[path = "src/mime_types.rs"]
+mod mime_types;
+
+#[cfg(feature = "phf")]
+const PHF_PATH: &str = "::impl_::phf";
+
+fn main() {
+ let out_dir = env::var("OUT_DIR").unwrap();
+ let dest_path = Path::new(&out_dir).join("mime_types_generated.rs");
+ let mut outfile = BufWriter::new(File::create(dest_path).unwrap());
+
+ #[cfg(feature = "phf")]
+ build_forward_map(&mut outfile);
+
+ #[cfg(feature = "rev-mappings")]
+ build_rev_map(&mut outfile);
+}
+
+// Build forward mappings (ext -> mime type)
+#[cfg(feature = "phf")]
+fn build_forward_map<W: Write>(out: &mut W) {
+ use phf_codegen::Map as PhfMap;
+
+ let mut forward_map = PhfMap::new();
+ forward_map.phf_path(PHF_PATH);
+
+ let mut map_entries: Vec<(&str, Vec<&str>)> = Vec::new();
+
+ for &(key, types) in MIME_TYPES {
+ if let Some(&mut (key_, ref mut values)) = map_entries.last_mut() {
+ // deduplicate extensions
+ if key == key_ {
+ values.extend_from_slice(types);
+ continue;
+ }
+ }
+
+ map_entries.push((key, types.into()));
+ }
+
+ for (key, values) in map_entries {
+ forward_map.entry(
+ UniCase::new(key),
+ &format!("&{:?}", values),
+ );
+ }
+
+ writeln!(
+ out,
+ "static MIME_TYPES: phf::Map<UniCase<&'static str>, &'static [&'static str]> = \n{};",
+ forward_map.build()
+ )
+ .unwrap();
+}
+
+// Build reverse mappings (mime type -> ext)
+#[cfg(all(feature = "phf", feature = "rev-mappings"))]
+fn build_rev_map<W: Write>(out: &mut W) {
+ use phf_codegen::Map as PhfMap;
+
+ let dyn_map = get_rev_mappings();
+
+ let mut rev_map = PhfMap::new();
+ rev_map.phf_path(PHF_PATH);
+
+ let mut exts = Vec::new();
+
+ for (top, subs) in dyn_map {
+ let top_start = exts.len();
+
+ let mut sub_map = PhfMap::new();
+ sub_map.phf_path(PHF_PATH);
+
+ for (sub, sub_exts) in subs {
+ let sub_start = exts.len();
+ exts.extend(sub_exts);
+ let sub_end = exts.len();
+
+ sub_map.entry(sub, &format!("({}, {})", sub_start, sub_end));
+ }
+
+ let top_end = exts.len();
+
+ rev_map.entry(
+ top,
+ &format!(
+ "TopLevelExts {{ start: {}, end: {}, subs: {} }}",
+ top_start, top_end, sub_map.build()
+ ),
+ );
+ }
+
+ writeln!(
+ out,
+ "static REV_MAPPINGS: phf::Map<UniCase<&'static str>, TopLevelExts> = \n{};",
+ rev_map.build()
+ ).unwrap();
+
+ writeln!(out, "const EXTS: &'static [&'static str] = &{:?};", exts).unwrap();
+}
+
+#[cfg(all(not(feature = "phf"), feature = "rev-mappings"))]
+fn build_rev_map<W: Write>(out: &mut W) {
+ use std::fmt::Write as _;
+
+ macro_rules! unicase_const {
+ ($s:expr) => ({
+ format_args!("{}({:?})", (if $s.is_ascii() {
+ "UniCase::ascii"
+ } else {
+ "UniCase::unicode"
+ }), $s)
+ })
+ }
+
+ let dyn_map = get_rev_mappings();
+
+ write!(out, "static REV_MAPPINGS: &'static [(UniCase<&'static str>, TopLevelExts)] = &[").unwrap();
+
+ let mut exts = Vec::new();
+
+ for (top, subs) in dyn_map {
+ let top_start = exts.len();
+
+ let mut sub_map = String::new();
+
+ for (sub, sub_exts) in subs {
+ let sub_start = exts.len();
+ exts.extend(sub_exts);
+ let sub_end = exts.len();
+
+ write!(
+ sub_map,
+ "({}, ({}, {})),",
+ unicase_const!(sub), sub_start, sub_end
+ ).unwrap();
+ }
+
+ let top_end = exts.len();
+
+ write!(
+ out,
+ "({}, TopLevelExts {{ start: {}, end: {}, subs: &[{}] }}),",
+ unicase_const!(top), top_start, top_end, sub_map
+ ).unwrap();
+ }
+
+ writeln!(out, "];").unwrap();
+
+ writeln!(out, "const EXTS: &'static [&'static str] = &{:?};", exts).unwrap();
+}
+
+#[cfg(feature = "rev-mappings")]
+fn get_rev_mappings(
+) -> BTreeMap<UniCase<&'static str>, BTreeMap<UniCase<&'static str>, Vec<&'static str>>> {
+ // First, collect all the mime type -> ext mappings)
+ let mut dyn_map = BTreeMap::new();
+ for &(key, types) in MIME_TYPES {
+ for val in types {
+ let (top, sub) = split_mime(val);
+ dyn_map
+ .entry(UniCase::new(top))
+ .or_insert_with(BTreeMap::new)
+ .entry(UniCase::new(sub))
+ .or_insert_with(Vec::new)
+ .push(key);
+ }
+ }
+ dyn_map
+}
+
+fn split_mime(mime: &str) -> (&str, &str) {
+ let split_idx = mime.find('/').unwrap();
+ (&mime[..split_idx], &mime[split_idx + 1..])
+}
diff --git a/third_party/rust/mime_guess/examples/rev_map.rs b/third_party/rust/mime_guess/examples/rev_map.rs
new file mode 100644
index 0000000000..f6f2fdeaf9
--- /dev/null
+++ b/third_party/rust/mime_guess/examples/rev_map.rs
@@ -0,0 +1,14 @@
+extern crate mime_guess;
+
+fn main() {
+ print_exts("video/*");
+ print_exts("video/x-matroska");
+}
+
+fn print_exts(mime_type: &str) {
+ println!(
+ "Exts for {:?}: {:?}",
+ mime_type,
+ mime_guess::get_mime_extensions_str(mime_type)
+ );
+}
diff --git a/third_party/rust/mime_guess/src/impl_bin_search.rs b/third_party/rust/mime_guess/src/impl_bin_search.rs
new file mode 100644
index 0000000000..2653714505
--- /dev/null
+++ b/third_party/rust/mime_guess/src/impl_bin_search.rs
@@ -0,0 +1,41 @@
+use unicase::UniCase;
+
+include!("mime_types.rs");
+include!(concat!(env!("OUT_DIR"), "/mime_types_generated.rs"));
+
+#[cfg(feature = "rev-mappings")]
+#[derive(Copy, Clone)]
+struct TopLevelExts {
+ start: usize,
+ end: usize,
+ subs: &'static [(UniCase<&'static str>, (usize, usize))],
+}
+
+pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> {
+ let ext = UniCase::new(ext);
+
+ map_lookup(MIME_TYPES, &ext)
+}
+
+#[cfg(feature = "rev-mappings")]
+pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> {
+ if toplevel == "*" {
+ return Some(EXTS);
+ }
+
+ let top = map_lookup(REV_MAPPINGS, toplevel)?;
+
+ if sublevel == "*" {
+ return Some(&EXTS[top.start..top.end]);
+ }
+
+ let sub = map_lookup(&top.subs, sublevel)?;
+ Some(&EXTS[sub.0..sub.1])
+}
+
+fn map_lookup<K, V>(map: &'static [(K, V)], key: &str) -> Option<V>
+ where K: Copy + Into<UniCase<&'static str>>, V: Copy {
+ map.binary_search_by_key(&UniCase::new(key), |(k, _)| (*k).into())
+ .ok()
+ .map(|i| map[i].1)
+}
diff --git a/third_party/rust/mime_guess/src/impl_phf.rs b/third_party/rust/mime_guess/src/impl_phf.rs
new file mode 100644
index 0000000000..980c31f369
--- /dev/null
+++ b/third_party/rust/mime_guess/src/impl_phf.rs
@@ -0,0 +1,40 @@
+extern crate phf;
+
+use unicase::UniCase;
+
+include!(concat!(env!("OUT_DIR"), "/mime_types_generated.rs"));
+
+#[cfg(feature = "rev-mappings")]
+struct TopLevelExts {
+ start: usize,
+ end: usize,
+ subs: phf::Map<UniCase<&'static str>, (usize, usize)>,
+}
+
+pub fn get_mime_types(ext: &str) -> Option<&'static [&'static str]> {
+ map_lookup(&MIME_TYPES, ext).cloned()
+}
+
+pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> {
+ if toplevel == "*" {
+ return Some(EXTS);
+ }
+
+ let top = map_lookup(&REV_MAPPINGS, toplevel)?;
+
+ if sublevel == "*" {
+ return Some(&EXTS[top.start..top.end]);
+ }
+
+ let sub = map_lookup(&top.subs, sublevel)?;
+ Some(&EXTS[sub.0..sub.1])
+}
+
+fn map_lookup<'key, 'map: 'key, V>(
+ map: &'map phf::Map<UniCase<&'static str>, V>,
+ key: &'key str,
+) -> Option<&'map V> {
+ // FIXME: this doesn't compile unless we transmute `key` to `UniCase<&'static str>`
+ // https://github.com/sfackler/rust-phf/issues/169
+ map.get(&UniCase::new(key))
+}
diff --git a/third_party/rust/mime_guess/src/lib.rs b/third_party/rust/mime_guess/src/lib.rs
new file mode 100644
index 0000000000..e2563f495a
--- /dev/null
+++ b/third_party/rust/mime_guess/src/lib.rs
@@ -0,0 +1,534 @@
+//! Guessing of MIME types by file extension.
+//!
+//! Uses a static list of file-extension : MIME type mappings.
+//!
+//! ```
+//! # extern crate mime;
+//! // the file doesn't have to exist, it just looks at the path
+//! let guess = mime_guess::from_path("some_file.gif");
+//! assert_eq!(guess.first(), Some(mime::IMAGE_GIF));
+//!
+//! ```
+//!
+//! #### Note: MIME Types Returned Are Not Stable/Guaranteed
+//! The media types returned for a given extension are not considered to be part of the crate's
+//! stable API and are often updated in patch <br /> (`x.y.[z + 1]`) releases to be as correct as
+//! possible.
+//!
+//! Additionally, only the extensions of paths/filenames are inspected in order to guess the MIME
+//! type. The file that may or may not reside at that path may or may not be a valid file of the
+//! returned MIME type. Be wary of unsafe or un-validated assumptions about file structure or
+//! length.
+pub extern crate mime;
+extern crate unicase;
+
+pub use mime::Mime;
+
+use std::ffi::OsStr;
+use std::iter::FusedIterator;
+use std::path::Path;
+use std::{iter, slice};
+
+#[cfg(feature = "phf")]
+#[path = "impl_phf.rs"]
+mod impl_;
+
+#[cfg(not(feature = "phf"))]
+#[path = "impl_bin_search.rs"]
+mod impl_;
+
+/// A "guess" of the MIME/Media Type(s) of an extension or path as one or more
+/// [`Mime`](struct.Mime.html) instances.
+///
+/// ### Note: Ordering
+/// A given file format may have one or more applicable Media Types; in this case
+/// the first Media Type returned is whatever is declared in the latest IETF RFC for the
+/// presumed file format or the one that explicitly supercedes all others.
+/// Ordering of additional Media Types is arbitrary.
+///
+/// ### Note: Values Not Stable
+/// The exact Media Types returned in any given guess are not considered to be stable and are often
+/// updated in patch releases in order to reflect the most up-to-date information possible.
+#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+// FIXME: change repr when `mime` gains macro/const fn constructor
+pub struct MimeGuess(&'static [&'static str]);
+
+impl MimeGuess {
+ /// Guess the MIME type of a file (real or otherwise) with the given extension.
+ ///
+ /// The search is case-insensitive.
+ ///
+ /// If `ext` is empty or has no (currently) known MIME type mapping, then an empty guess is
+ /// returned.
+ pub fn from_ext(ext: &str) -> MimeGuess {
+ if ext.is_empty() {
+ return MimeGuess(&[]);
+ }
+
+ impl_::get_mime_types(ext).map_or(MimeGuess(&[]), |v| MimeGuess(v))
+ }
+
+ /// Guess the MIME type of `path` by its extension (as defined by
+ /// [`Path::extension()`]). **No disk access is performed.**
+ ///
+ /// If `path` has no extension, the extension cannot be converted to `str`, or has
+ /// no known MIME type mapping, then an empty guess is returned.
+ ///
+ /// The search is case-insensitive.
+ ///
+ /// ## Note
+ /// **Guess** is the operative word here, as there are no guarantees that the contents of the
+ /// file that `path` points to match the MIME type associated with the path's extension.
+ ///
+ /// Take care when processing files with assumptions based on the return value of this function.
+ ///
+ /// [`Path::extension()`]: https://doc.rust-lang.org/std/path/struct.Path.html#method.extension
+ pub fn from_path<P: AsRef<Path>>(path: P) -> MimeGuess {
+ path.as_ref()
+ .extension()
+ .and_then(OsStr::to_str)
+ .map_or(MimeGuess(&[]), Self::from_ext)
+ }
+
+ /// `true` if the guess did not return any known mappings for the given path or extension.
+ pub fn is_empty(&self) -> bool {
+ self.0.is_empty()
+ }
+
+ /// Get the number of MIME types in the current guess.
+ pub fn count(&self) -> usize {
+ self.0.len()
+ }
+
+ /// Get the first guessed `Mime`, if applicable.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn first(&self) -> Option<Mime> {
+ self.first_raw().map(expect_mime)
+ }
+
+ /// Get the first guessed Media Type as a string, if applicable.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn first_raw(&self) -> Option<&'static str> {
+ self.0.get(0).cloned()
+ }
+
+ /// Get the first guessed `Mime`, or if the guess is empty, return
+ /// [`application/octet-stream`] instead.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ ///
+ /// ### Note: HTTP Applications
+ /// For HTTP request and response bodies if a value for the `Content-Type` header
+ /// cannot be determined it might be preferable to not send one at all instead of defaulting to
+ /// `application/octet-stream` as the recipient will expect to infer the format directly from
+ /// the content instead. ([RFC 7231, Section 3.1.1.5][rfc7231])
+ ///
+ /// On the contrary, for `multipart/form-data` bodies, the `Content-Type` of a form-data part is
+ /// assumed to be `text/plain` unless specified so a default of `application/octet-stream`
+ /// for non-text parts is safer. ([RFC 7578, Section 4.4][rfc7578])
+ ///
+ /// [`application/octet-stream`]: https://docs.rs/mime/0.3/mime/constant.APPLICATION_OCTET_STREAM.html
+ /// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+ /// [rfc7578]: https://tools.ietf.org/html/rfc7578#section-4.4
+ pub fn first_or_octet_stream(&self) -> Mime {
+ self.first_or(mime::APPLICATION_OCTET_STREAM)
+ }
+
+ /// Get the first guessed `Mime`, or if the guess is empty, return
+ /// [`text/plain`](::mime::TEXT_PLAIN) instead.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn first_or_text_plain(&self) -> Mime {
+ self.first_or(mime::TEXT_PLAIN)
+ }
+
+ /// Get the first guessed `Mime`, or if the guess is empty, return the given `Mime` instead.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn first_or(&self, default: Mime) -> Mime {
+ self.first().unwrap_or(default)
+ }
+
+ /// Get the first guessed `Mime`, or if the guess is empty, execute the closure and return its
+ /// result.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn first_or_else<F>(&self, default_fn: F) -> Mime
+ where
+ F: FnOnce() -> Mime,
+ {
+ self.first().unwrap_or_else(default_fn)
+ }
+
+ /// Get an iterator over the `Mime` values contained in this guess.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn iter(&self) -> Iter {
+ Iter(self.iter_raw().map(expect_mime))
+ }
+
+ /// Get an iterator over the raw media-type strings in this guess.
+ ///
+ /// See [Note: Ordering](#note-ordering) above.
+ pub fn iter_raw(&self) -> IterRaw {
+ IterRaw(self.0.iter().cloned())
+ }
+}
+
+impl IntoIterator for MimeGuess {
+ type Item = Mime;
+ type IntoIter = Iter;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+impl<'a> IntoIterator for &'a MimeGuess {
+ type Item = Mime;
+ type IntoIter = Iter;
+
+ fn into_iter(self) -> Self::IntoIter {
+ self.iter()
+ }
+}
+
+/// An iterator over the `Mime` types of a `MimeGuess`.
+///
+/// See [Note: Ordering on `MimeGuess`](struct.MimeGuess.html#note-ordering).
+#[derive(Clone, Debug)]
+pub struct Iter(iter::Map<IterRaw, fn(&'static str) -> Mime>);
+
+impl Iterator for Iter {
+ type Item = Mime;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.0.next()
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.0.size_hint()
+ }
+}
+
+impl DoubleEndedIterator for Iter {
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.0.next_back()
+ }
+}
+
+impl FusedIterator for Iter {}
+
+impl ExactSizeIterator for Iter {
+ fn len(&self) -> usize {
+ self.0.len()
+ }
+}
+
+/// An iterator over the raw media type strings of a `MimeGuess`.
+///
+/// See [Note: Ordering on `MimeGuess`](struct.MimeGuess.html#note-ordering).
+#[derive(Clone, Debug)]
+pub struct IterRaw(iter::Cloned<slice::Iter<'static, &'static str>>);
+
+impl Iterator for IterRaw {
+ type Item = &'static str;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ self.0.next()
+ }
+
+ fn size_hint(&self) -> (usize, Option<usize>) {
+ self.0.size_hint()
+ }
+}
+
+impl DoubleEndedIterator for IterRaw {
+ fn next_back(&mut self) -> Option<Self::Item> {
+ self.0.next_back()
+ }
+}
+
+impl FusedIterator for IterRaw {}
+
+impl ExactSizeIterator for IterRaw {
+ fn len(&self) -> usize {
+ self.0.len()
+ }
+}
+
+fn expect_mime(s: &str) -> Mime {
+ // `.parse()` should be checked at compile time to never fail
+ s.parse()
+ .unwrap_or_else(|e| panic!("failed to parse media-type {:?}: {}", s, e))
+}
+
+/// Wrapper of [`MimeGuess::from_ext()`](struct.MimeGuess.html#method.from_ext).
+pub fn from_ext(ext: &str) -> MimeGuess {
+ MimeGuess::from_ext(ext)
+}
+
+/// Wrapper of [`MimeGuess::from_path()`](struct.MimeGuess.html#method.from_path).
+pub fn from_path<P: AsRef<Path>>(path: P) -> MimeGuess {
+ MimeGuess::from_path(path)
+}
+
+/// Guess the MIME type of `path` by its extension (as defined by `Path::extension()`).
+///
+/// If `path` has no extension, or its extension has no known MIME type mapping,
+/// then the MIME type is assumed to be `application/octet-stream`.
+///
+/// ## Note
+/// **Guess** is the operative word here, as there are no guarantees that the contents of the file
+/// that `path` points to match the MIME type associated with the path's extension.
+///
+/// Take care when processing files with assumptions based on the return value of this function.
+///
+/// In HTTP applications, it might be [preferable][rfc7231] to not send a `Content-Type`
+/// header at all instead of defaulting to `application/octet-stream`.
+///
+/// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+#[deprecated(
+ since = "2.0.0",
+ note = "Use `from_path(path).first_or_octet_stream()` instead"
+)]
+pub fn guess_mime_type<P: AsRef<Path>>(path: P) -> Mime {
+ from_path(path).first_or_octet_stream()
+}
+
+/// Guess the MIME type of `path` by its extension (as defined by `Path::extension()`).
+///
+/// If `path` has no extension, or its extension has no known MIME type mapping,
+/// then `None` is returned.
+///
+#[deprecated(since = "2.0.0", note = "Use `from_path(path).first()` instead")]
+pub fn guess_mime_type_opt<P: AsRef<Path>>(path: P) -> Option<Mime> {
+ from_path(path).first()
+}
+
+/// Guess the MIME type string of `path` by its extension (as defined by `Path::extension()`).
+///
+/// If `path` has no extension, or its extension has no known MIME type mapping,
+/// then `None` is returned.
+///
+/// ## Note
+/// **Guess** is the operative word here, as there are no guarantees that the contents of the file
+/// that `path` points to match the MIME type associated with the path's extension.
+///
+/// Take care when processing files with assumptions based on the return value of this function.
+#[deprecated(since = "2.0.0", note = "Use `from_path(path).first_raw()` instead")]
+pub fn mime_str_for_path_ext<P: AsRef<Path>>(path: P) -> Option<&'static str> {
+ from_path(path).first_raw()
+}
+
+/// Get the MIME type associated with a file extension.
+///
+/// If there is no association for the extension, or `ext` is empty,
+/// `application/octet-stream` is returned.
+///
+/// ## Note
+/// In HTTP applications, it might be [preferable][rfc7231] to not send a `Content-Type`
+/// header at all instead of defaulting to `application/octet-stream`.
+///
+/// [rfc7231]: https://tools.ietf.org/html/rfc7231#section-3.1.1.5
+#[deprecated(
+ since = "2.0.0",
+ note = "use `from_ext(search_ext).first_or_octet_stream()` instead"
+)]
+pub fn get_mime_type(search_ext: &str) -> Mime {
+ from_ext(search_ext).first_or_octet_stream()
+}
+
+/// Get the MIME type associated with a file extension.
+///
+/// If there is no association for the extension, or `ext` is empty,
+/// `None` is returned.
+#[deprecated(since = "2.0.0", note = "use `from_ext(search_ext).first()` instead")]
+pub fn get_mime_type_opt(search_ext: &str) -> Option<Mime> {
+ from_ext(search_ext).first()
+}
+
+/// Get the MIME type string associated with a file extension. Case-insensitive.
+///
+/// If `search_ext` is not already lowercase,
+/// it will be converted to lowercase to facilitate the search.
+///
+/// Returns `None` if `search_ext` is empty or an associated extension was not found.
+#[deprecated(
+ since = "2.0.0",
+ note = "use `from_ext(search_ext).first_raw()` instead"
+)]
+pub fn get_mime_type_str(search_ext: &str) -> Option<&'static str> {
+ from_ext(search_ext).first_raw()
+}
+
+/// Get a list of known extensions for a given `Mime`.
+///
+/// Ignores parameters (only searches with `<main type>/<subtype>`). Case-insensitive (for extension types).
+///
+/// Returns `None` if the MIME type is unknown.
+///
+/// ### Wildcards
+/// If the top-level of the MIME type is a wildcard (`*`), returns all extensions.
+///
+/// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level.
+#[cfg(feature = "rev-mappings")]
+pub fn get_mime_extensions(mime: &Mime) -> Option<&'static [&'static str]> {
+ get_extensions(mime.type_().as_ref(), mime.subtype().as_ref())
+}
+
+/// Get a list of known extensions for a MIME type string.
+///
+/// Ignores parameters (only searches `<main type>/<subtype>`). Case-insensitive.
+///
+/// Returns `None` if the MIME type is unknown.
+///
+/// ### Wildcards
+/// If the top-level of the MIME type is a wildcard (`*`), returns all extensions.
+///
+/// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level.
+///
+/// ### Panics
+/// If `mime_str` is not a valid MIME type specifier (naive).
+#[cfg(feature = "rev-mappings")]
+pub fn get_mime_extensions_str(mut mime_str: &str) -> Option<&'static [&'static str]> {
+ mime_str = mime_str.trim();
+
+ if let Some(sep_idx) = mime_str.find(';') {
+ mime_str = &mime_str[..sep_idx];
+ }
+
+ let (top, sub) = {
+ let split_idx = mime_str.find('/')?;
+ (&mime_str[..split_idx], &mime_str[split_idx + 1..])
+ };
+
+ get_extensions(top, sub)
+}
+
+/// Get the extensions for a given top-level and sub-level of a MIME type
+/// (`{toplevel}/{sublevel}`).
+///
+/// Returns `None` if `toplevel` or `sublevel` are unknown.
+///
+/// ### Wildcards
+/// If the top-level of the MIME type is a wildcard (`*`), returns all extensions.
+///
+/// If the sub-level of the MIME type is a wildcard, returns all extensions for the top-level.
+#[cfg(feature = "rev-mappings")]
+pub fn get_extensions(toplevel: &str, sublevel: &str) -> Option<&'static [&'static str]> {
+ impl_::get_extensions(toplevel, sublevel)
+}
+
+/// Get the MIME type for `application/octet-stream` (generic binary stream)
+#[deprecated(since = "2.0.0", note = "use `mime::APPLICATION_OCTET_STREAM` instead")]
+pub fn octet_stream() -> Mime {
+ "application/octet-stream".parse().unwrap()
+}
+
+#[cfg(test)]
+mod tests {
+ include!("mime_types.rs");
+
+ use super::{expect_mime, from_ext, from_path, get_mime_extensions_str};
+ #[allow(deprecated, unused_imports)]
+ use std::ascii::AsciiExt;
+
+ use std::fmt::Debug;
+ use std::path::Path;
+
+ #[test]
+ fn check_type_bounds() {
+ fn assert_type_bounds<T: Clone + Debug + Send + Sync + 'static>() {}
+
+ assert_type_bounds::<super::MimeGuess>();
+ assert_type_bounds::<super::Iter>();
+ assert_type_bounds::<super::IterRaw>();
+ }
+
+ #[test]
+ fn test_mime_type_guessing() {
+ assert_eq!(
+ from_ext("gif").first_or_octet_stream().to_string(),
+ "image/gif".to_string()
+ );
+ assert_eq!(
+ from_ext("TXT").first_or_octet_stream().to_string(),
+ "text/plain".to_string()
+ );
+ assert_eq!(
+ from_ext("blahblah").first_or_octet_stream().to_string(),
+ "application/octet-stream".to_string()
+ );
+
+ assert_eq!(
+ from_path(Path::new("/path/to/file.gif"))
+ .first_or_octet_stream()
+ .to_string(),
+ "image/gif".to_string()
+ );
+ assert_eq!(
+ from_path("/path/to/file.gif")
+ .first_or_octet_stream()
+ .to_string(),
+ "image/gif".to_string()
+ );
+ }
+
+ #[test]
+ fn test_mime_type_guessing_opt() {
+ assert_eq!(
+ from_ext("gif").first().unwrap().to_string(),
+ "image/gif".to_string()
+ );
+ assert_eq!(
+ from_ext("TXT").first().unwrap().to_string(),
+ "text/plain".to_string()
+ );
+ assert_eq!(from_ext("blahblah").first(), None);
+
+ assert_eq!(
+ from_path("/path/to/file.gif").first().unwrap().to_string(),
+ "image/gif".to_string()
+ );
+ assert_eq!(from_path("/path/to/file").first(), None);
+ }
+
+ #[test]
+ fn test_are_mime_types_parseable() {
+ for (_, mimes) in MIME_TYPES {
+ mimes.iter().for_each(|s| {
+ expect_mime(s);
+ });
+ }
+ }
+
+ // RFC: Is this test necessary anymore? --@cybergeek94, 2/1/2016
+ #[test]
+ fn test_are_extensions_ascii() {
+ for (ext, _) in MIME_TYPES {
+ assert!(ext.is_ascii(), "Extension not ASCII: {:?}", ext);
+ }
+ }
+
+ #[test]
+ fn test_are_extensions_sorted() {
+ // simultaneously checks the requirement that duplicate extension entries are adjacent
+ for (&(ext, _), &(n_ext, _)) in MIME_TYPES.iter().zip(MIME_TYPES.iter().skip(1)) {
+ assert!(
+ ext <= n_ext,
+ "Extensions in src/mime_types should be sorted lexicographically
+ in ascending order. Failed assert: {:?} <= {:?}",
+ ext,
+ n_ext
+ );
+ }
+ }
+
+ #[test]
+ fn test_get_mime_extensions_str_no_panic_if_bad_mime() {
+ assert_eq!(get_mime_extensions_str(""), None);
+ }
+}
diff --git a/third_party/rust/mime_guess/src/mime_types.rs b/third_party/rust/mime_guess/src/mime_types.rs
new file mode 100644
index 0000000000..13c91b7bee
--- /dev/null
+++ b/third_party/rust/mime_guess/src/mime_types.rs
@@ -0,0 +1,1499 @@
+/// A mapping of known file extensions and their MIME types.
+///
+/// Required to be sorted lexicographically by extension for ease of maintenance.
+///
+/// Multiple MIME types per extension are supported; the order is arbitrary but the first should be
+/// the most prevalent by most recent RFC declaration or explicit succession of other media types.
+///
+/// NOTE: when adding or modifying entries, please include a citation in the commit message.
+/// If a media type for an extension changed by official IETF RFC, please keep the old entry but add
+/// the new one before it in the slice literal, e.g.:
+///
+/// ```ignore
+/// - ("md", &["text/x-markdown"]),
+/// + ("md", &["text/markdown", "text/x-markdown"]),
+/// ```
+///
+/// Sourced from:
+/// https://github.com/samuelneff/MimeTypeMap/blob/master/src/MimeTypes/MimeTypeMap.cs
+/// https://github.com/jshttp/mime-db extracted with https://gist.github.com/soyuka/b7e29d359b2c14c21bdead923c01cc81
+pub static MIME_TYPES: &[(&str, &[&str])] = &[
+ ("123", &["application/vnd.lotus-1-2-3"]),
+ ("323", &["text/h323"]),
+ ("3dml", &["text/vnd.in3d.3dml"]),
+ ("3ds", &["image/x-3ds"]),
+ ("3g2", &["video/3gpp2"]),
+ ("3gp", &["video/3gpp"]),
+ ("3gp2", &["video/3gpp2"]),
+ ("3gpp", &["video/3gpp"]),
+ ("7z", &["application/x-7z-compressed"]),
+ ("aa", &["audio/audible"]),
+ ("aab", &["application/x-authorware-bin"]),
+ ("aac", &["audio/aac"]),
+ ("aaf", &["application/octet-stream"]),
+ ("aam", &["application/x-authorware-map"]),
+ ("aas", &["application/x-authorware-seg"]),
+ ("aax", &["audio/vnd.audible.aax"]),
+ ("abw", &["application/x-abiword"]),
+ ("ac", &["application/pkix-attr-cert"]),
+ ("ac3", &["audio/ac3"]),
+ ("aca", &["application/octet-stream"]),
+ ("acc", &["application/vnd.americandynamics.acc"]),
+ ("accda", &["application/msaccess.addin"]),
+ ("accdb", &["application/msaccess"]),
+ ("accdc", &["application/msaccess.cab"]),
+ ("accde", &["application/msaccess"]),
+ ("accdr", &["application/msaccess.runtime"]),
+ ("accdt", &["application/msaccess"]),
+ ("accdw", &["application/msaccess.webapplication"]),
+ ("accft", &["application/msaccess.ftemplate"]),
+ ("ace", &["application/x-ace-compressed"]),
+ ("acu", &["application/vnd.acucobol"]),
+ ("acutc", &["application/vnd.acucorp"]),
+ ("acx", &["application/internet-property-stream"]),
+ ("addin", &["text/xml"]),
+ ("ade", &["application/msaccess"]),
+ ("adobebridge", &["application/x-bridge-url"]),
+ ("adp", &["application/msaccess"]),
+ ("adt", &["audio/vnd.dlna.adts"]),
+ ("adts", &["audio/aac"]),
+ ("aep", &["application/vnd.audiograph"]),
+ ("afm", &["application/octet-stream"]),
+ ("afp", &["application/vnd.ibm.modcap"]),
+ ("ahead", &["application/vnd.ahead.space"]),
+ ("ai", &["application/postscript"]),
+ ("aif", &["audio/aiff"]),
+ ("aifc", &["audio/aiff"]),
+ ("aiff", &["audio/aiff"]),
+ (
+ "air",
+ &["application/vnd.adobe.air-application-installer-package+zip"],
+ ),
+ ("ait", &["application/vnd.dvb.ait"]),
+ ("amc", &["application/mpeg"]),
+ ("ami", &["application/vnd.amiga.ami"]),
+ ("anx", &["application/annodex"]),
+ ("apk", &["application/vnd.android.package-archive"]),
+ ("apng", &["image/apng"]),
+ ("appcache", &["text/cache-manifest"]),
+ ("application", &["application/x-ms-application"]),
+ ("apr", &["application/vnd.lotus-approach"]),
+ ("arc", &["application/x-freearc"]),
+ ("arj", &["application/x-arj"]),
+ ("art", &["image/x-jg"]),
+ ("asa", &["application/xml"]),
+ ("asax", &["application/xml"]),
+ ("asc", &["application/pgp-signature"]),
+ ("ascx", &["application/xml"]),
+ ("asd", &["application/octet-stream"]),
+ ("asf", &["video/x-ms-asf"]),
+ ("ashx", &["application/xml"]),
+ ("asi", &["application/octet-stream"]),
+ ("asm", &["text/plain"]),
+ ("asmx", &["application/xml"]),
+ ("aso", &["application/vnd.accpac.simply.aso"]),
+ ("aspx", &["application/xml"]),
+ ("asr", &["video/x-ms-asf"]),
+ ("asx", &["video/x-ms-asf"]),
+ ("atc", &["application/vnd.acucorp"]),
+ ("atom", &["application/atom+xml"]),
+ ("atomcat", &["application/atomcat+xml"]),
+ ("atomsvc", &["application/atomsvc+xml"]),
+ ("atx", &["application/vnd.antix.game-component"]),
+ ("au", &["audio/basic"]),
+ ("avi", &["video/x-msvideo"]),
+ ("avif", &["image/avif"]),
+ ("aw", &["application/applixware"]),
+ ("axa", &["audio/annodex"]),
+ ("axs", &["application/olescript"]),
+ ("axv", &["video/annodex"]),
+ ("azf", &["application/vnd.airzip.filesecure.azf"]),
+ ("azs", &["application/vnd.airzip.filesecure.azs"]),
+ ("azw", &["application/vnd.amazon.ebook"]),
+ ("bas", &["text/plain"]),
+ ("bat", &["application/x-msdownload"]),
+ ("bcpio", &["application/x-bcpio"]),
+ ("bdf", &["application/x-font-bdf"]),
+ ("bdm", &["application/vnd.syncml.dm+wbxml"]),
+ ("bdoc", &["application/bdoc"]),
+ ("bed", &["application/vnd.realvnc.bed"]),
+ ("bh2", &["application/vnd.fujitsu.oasysprs"]),
+ ("bin", &["application/octet-stream"]),
+ ("blb", &["application/x-blorb"]),
+ ("blorb", &["application/x-blorb"]),
+ ("bmi", &["application/vnd.bmi"]),
+ ("bmp", &["image/bmp"]),
+ ("book", &["application/vnd.framemaker"]),
+ ("box", &["application/vnd.previewsystems.box"]),
+ ("boz", &["application/x-bzip2"]),
+ ("bpk", &["application/octet-stream"]),
+ ("btif", &["image/prs.btif"]),
+ ("buffer", &["application/octet-stream"]),
+ ("bz", &["application/x-bzip"]),
+ ("bz2", &["application/x-bzip2"]),
+ ("c", &["text/plain"]),
+ ("c11amc", &["application/vnd.cluetrust.cartomobile-config"]),
+ (
+ "c11amz",
+ &["application/vnd.cluetrust.cartomobile-config-pkg"],
+ ),
+ ("c4d", &["application/vnd.clonk.c4group"]),
+ ("c4f", &["application/vnd.clonk.c4group"]),
+ ("c4g", &["application/vnd.clonk.c4group"]),
+ ("c4p", &["application/vnd.clonk.c4group"]),
+ ("c4u", &["application/vnd.clonk.c4group"]),
+ ("cab", &["application/octet-stream"]),
+ ("caf", &["audio/x-caf"]),
+ ("calx", &["application/vnd.ms-office.calx"]),
+ ("cap", &["application/vnd.tcpdump.pcap"]),
+ ("car", &["application/vnd.curl.car"]),
+ ("cat", &["application/vnd.ms-pki.seccat"]),
+ ("cb7", &["application/x-cbr"]),
+ ("cba", &["application/x-cbr"]),
+ ("cbr", &["application/x-cbr"]),
+ ("cbt", &["application/x-cbr"]),
+ ("cbz", &["application/x-cbr"]),
+ ("cc", &["text/plain"]),
+ ("cco", &["application/x-cocoa"]),
+ ("cct", &["application/x-director"]),
+ ("ccxml", &["application/ccxml+xml"]),
+ ("cd", &["text/plain"]),
+ ("cdbcmsg", &["application/vnd.contact.cmsg"]),
+ ("cdda", &["audio/aiff"]),
+ ("cdf", &["application/x-cdf"]),
+ ("cdkey", &["application/vnd.mediastation.cdkey"]),
+ ("cdmia", &["application/cdmi-capability"]),
+ ("cdmic", &["application/cdmi-container"]),
+ ("cdmid", &["application/cdmi-domain"]),
+ ("cdmio", &["application/cdmi-object"]),
+ ("cdmiq", &["application/cdmi-queue"]),
+ ("cdx", &["chemical/x-cdx"]),
+ ("cdxml", &["application/vnd.chemdraw+xml"]),
+ ("cdy", &["application/vnd.cinderella"]),
+ ("cer", &["application/x-x509-ca-cert"]),
+ ("cfg", &["text/plain"]),
+ ("cfs", &["application/x-cfs-compressed"]),
+ ("cgm", &["image/cgm"]),
+ ("chat", &["application/x-chat"]),
+ ("chm", &["application/vnd.ms-htmlhelp"]),
+ ("chrt", &["application/vnd.kde.kchart"]),
+ ("cif", &["chemical/x-cif"]),
+ (
+ "cii",
+ &["application/vnd.anser-web-certificate-issue-initiation"],
+ ),
+ ("cil", &["application/vnd.ms-artgalry"]),
+ ("cla", &["application/vnd.claymore"]),
+ ("class", &["application/x-java-applet"]),
+ ("clkk", &["application/vnd.crick.clicker.keyboard"]),
+ ("clkp", &["application/vnd.crick.clicker.palette"]),
+ ("clkt", &["application/vnd.crick.clicker.template"]),
+ ("clkw", &["application/vnd.crick.clicker.wordbank"]),
+ ("clkx", &["application/vnd.crick.clicker"]),
+ ("clp", &["application/x-msclip"]),
+ ("cmc", &["application/vnd.cosmocaller"]),
+ ("cmd", &["text/plain"]),
+ ("cmdf", &["chemical/x-cmdf"]),
+ ("cml", &["chemical/x-cml"]),
+ ("cmp", &["application/vnd.yellowriver-custom-menu"]),
+ ("cmx", &["image/x-cmx"]),
+ ("cnf", &["text/plain"]),
+ ("cod", &["image/cis-cod"]),
+ ("coffee", &["text/coffeescript"]),
+ ("com", &["application/x-msdownload"]),
+ ("conf", &["text/plain"]),
+ ("config", &["application/xml"]),
+ ("contact", &["text/x-ms-contact"]),
+ ("coverage", &["application/xml"]),
+ ("cpio", &["application/x-cpio"]),
+ ("cpp", &["text/plain"]),
+ ("cpt", &["application/mac-compactpro"]),
+ ("crd", &["application/x-mscardfile"]),
+ ("crl", &["application/pkix-crl"]),
+ ("crt", &["application/x-x509-ca-cert"]),
+ ("crx", &["application/x-chrome-extension"]),
+ ("cryptonote", &["application/vnd.rig.cryptonote"]),
+ ("cs", &["text/plain"]),
+ ("csdproj", &["text/plain"]),
+ ("csh", &["application/x-csh"]),
+ ("csl", &["application/vnd.citationstyles.style+xml"]),
+ ("csml", &["chemical/x-csml"]),
+ ("csp", &["application/vnd.commonspace"]),
+ ("csproj", &["text/plain"]),
+ ("css", &["text/css"]),
+ ("cst", &["application/x-director"]),
+ ("csv", &["text/csv"]),
+ ("cu", &["application/cu-seeme"]),
+ ("cur", &["application/octet-stream"]),
+ ("curl", &["text/vnd.curl"]),
+ ("cww", &["application/prs.cww"]),
+ ("cxt", &["application/x-director"]),
+ ("cxx", &["text/plain"]),
+ ("dae", &["model/vnd.collada+xml"]),
+ ("daf", &["application/vnd.mobius.daf"]),
+ ("dart", &["application/vnd.dart"]),
+ ("dat", &["application/octet-stream"]),
+ ("dataless", &["application/vnd.fdsn.seed"]),
+ ("datasource", &["application/xml"]),
+ ("davmount", &["application/davmount+xml"]),
+ ("dbk", &["application/docbook+xml"]),
+ ("dbproj", &["text/plain"]),
+ ("dcr", &["application/x-director"]),
+ ("dcurl", &["text/vnd.curl.dcurl"]),
+ ("dd2", &["application/vnd.oma.dd2+xml"]),
+ ("ddd", &["application/vnd.fujixerox.ddd"]),
+ ("deb", &["application/octet-stream"]),
+ ("def", &["text/plain"]),
+ ("deploy", &["application/octet-stream"]),
+ ("der", &["application/x-x509-ca-cert"]),
+ ("dfac", &["application/vnd.dreamfactory"]),
+ ("dgc", &["application/x-dgc-compressed"]),
+ ("dgml", &["application/xml"]),
+ ("dib", &["image/bmp"]),
+ ("dic", &["text/x-c"]),
+ ("dif", &["video/x-dv"]),
+ ("dir", &["application/x-director"]),
+ ("dis", &["application/vnd.mobius.dis"]),
+ ("disco", &["text/xml"]),
+ (
+ "disposition-notification",
+ &["message/disposition-notification"],
+ ),
+ ("dist", &["application/octet-stream"]),
+ ("distz", &["application/octet-stream"]),
+ ("divx", &["video/divx"]),
+ ("djv", &["image/vnd.djvu"]),
+ ("djvu", &["image/vnd.djvu"]),
+ ("dll", &["application/x-msdownload"]),
+ ("dll.config", &["text/xml"]),
+ ("dlm", &["text/dlm"]),
+ ("dmg", &["application/octet-stream"]),
+ ("dmp", &["application/vnd.tcpdump.pcap"]),
+ ("dms", &["application/octet-stream"]),
+ ("dna", &["application/vnd.dna"]),
+ ("doc", &["application/msword"]),
+ (
+ "docm",
+ &["application/vnd.ms-word.document.macroEnabled.12"],
+ ),
+ (
+ "docx",
+ &["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
+ ),
+ ("dot", &["application/msword"]),
+ (
+ "dotm",
+ &["application/vnd.ms-word.template.macroEnabled.12"],
+ ),
+ (
+ "dotx",
+ &["application/vnd.openxmlformats-officedocument.wordprocessingml.template"],
+ ),
+ ("dp", &["application/vnd.osgi.dp"]),
+ ("dpg", &["application/vnd.dpgraph"]),
+ ("dra", &["audio/vnd.dra"]),
+ ("dsc", &["text/prs.lines.tag"]),
+ ("dsp", &["application/octet-stream"]),
+ ("dssc", &["application/dssc+der"]),
+ ("dsw", &["text/plain"]),
+ ("dtb", &["application/x-dtbook+xml"]),
+ ("dtd", &["text/xml"]),
+ ("dts", &["audio/vnd.dts"]),
+ ("dtsconfig", &["text/xml"]),
+ ("dtshd", &["audio/vnd.dts.hd"]),
+ ("dump", &["application/octet-stream"]),
+ ("dv", &["video/x-dv"]),
+ ("dvb", &["video/vnd.dvb.file"]),
+ ("dvi", &["application/x-dvi"]),
+ ("dwf", &["drawing/x-dwf"]),
+ ("dwg", &["application/acad"]),
+ ("dwp", &["application/octet-stream"]),
+ ("dxf", &["application/x-dxf"]),
+ ("dxp", &["application/vnd.spotfire.dxp"]),
+ ("dxr", &["application/x-director"]),
+ ("ear", &["application/java-archive"]),
+ ("ecelp4800", &["audio/vnd.nuera.ecelp4800"]),
+ ("ecelp7470", &["audio/vnd.nuera.ecelp7470"]),
+ ("ecelp9600", &["audio/vnd.nuera.ecelp9600"]),
+ ("ecma", &["application/ecmascript"]),
+ ("edm", &["application/vnd.novadigm.edm"]),
+ ("edx", &["application/vnd.novadigm.edx"]),
+ ("efif", &["application/vnd.picsel"]),
+ ("ei6", &["application/vnd.pg.osasli"]),
+ ("elc", &["application/octet-stream"]),
+ ("emf", &["application/x-msmetafile"]),
+ ("eml", &["message/rfc822"]),
+ ("emma", &["application/emma+xml"]),
+ ("emz", &["application/octet-stream"]),
+ ("eol", &["audio/vnd.digital-winds"]),
+ ("eot", &["application/vnd.ms-fontobject"]),
+ ("eps", &["application/postscript"]),
+ ("epub", &["application/epub+zip"]),
+ ("es", &["application/ecmascript"]),
+ ("es3", &["application/vnd.eszigno3+xml"]),
+ ("esa", &["application/vnd.osgi.subsystem"]),
+ ("esf", &["application/vnd.epson.esf"]),
+ ("et3", &["application/vnd.eszigno3+xml"]),
+ ("etl", &["application/etl"]),
+ ("etx", &["text/x-setext"]),
+ ("eva", &["application/x-eva"]),
+ ("evy", &["application/envoy"]),
+ ("exe", &["application/octet-stream"]),
+ ("exe.config", &["text/xml"]),
+ ("exi", &["application/exi"]),
+ ("ext", &["application/vnd.novadigm.ext"]),
+ ("ez", &["application/andrew-inset"]),
+ ("ez2", &["application/vnd.ezpix-album"]),
+ ("ez3", &["application/vnd.ezpix-package"]),
+ ("f", &["text/x-fortran"]),
+ ("f4v", &["video/x-f4v"]),
+ ("f77", &["text/x-fortran"]),
+ ("f90", &["text/x-fortran"]),
+ ("fbs", &["image/vnd.fastbidsheet"]),
+ ("fcdt", &["application/vnd.adobe.formscentral.fcdt"]),
+ ("fcs", &["application/vnd.isac.fcs"]),
+ ("fdf", &["application/vnd.fdf"]),
+ ("fe_launch", &["application/vnd.denovo.fcselayout-link"]),
+ ("feature", &["text/x-gherkin"]),
+ ("fg5", &["application/vnd.fujitsu.oasysgp"]),
+ ("fgd", &["application/x-director"]),
+ ("fh", &["image/x-freehand"]),
+ ("fh4", &["image/x-freehand"]),
+ ("fh5", &["image/x-freehand"]),
+ ("fh7", &["image/x-freehand"]),
+ ("fhc", &["image/x-freehand"]),
+ ("fif", &["application/fractals"]),
+ ("fig", &["application/x-xfig"]),
+ ("filters", &["application/xml"]),
+ ("fla", &["application/octet-stream"]),
+ ("flac", &["audio/flac"]),
+ ("fli", &["video/x-fli"]),
+ ("flo", &["application/vnd.micrografx.flo"]),
+ ("flr", &["x-world/x-vrml"]),
+ ("flv", &["video/x-flv"]),
+ ("flw", &["application/vnd.kde.kivio"]),
+ ("flx", &["text/vnd.fmi.flexstor"]),
+ ("fly", &["text/vnd.fly"]),
+ ("fm", &["application/vnd.framemaker"]),
+ ("fnc", &["application/vnd.frogans.fnc"]),
+ ("for", &["text/x-fortran"]),
+ ("fpx", &["image/vnd.fpx"]),
+ ("frame", &["application/vnd.framemaker"]),
+ ("fsc", &["application/vnd.fsc.weblaunch"]),
+ ("fsscript", &["application/fsharp-script"]),
+ ("fst", &["image/vnd.fst"]),
+ ("fsx", &["application/fsharp-script"]),
+ ("ftc", &["application/vnd.fluxtime.clip"]),
+ (
+ "fti",
+ &["application/vnd.anser-web-funds-transfer-initiation"],
+ ),
+ ("fvt", &["video/vnd.fvt"]),
+ ("fxp", &["application/vnd.adobe.fxp"]),
+ ("fxpl", &["application/vnd.adobe.fxp"]),
+ ("fzs", &["application/vnd.fuzzysheet"]),
+ ("g2w", &["application/vnd.geoplan"]),
+ ("g3", &["image/g3fax"]),
+ ("g3w", &["application/vnd.geospace"]),
+ ("gac", &["application/vnd.groove-account"]),
+ ("gam", &["application/x-tads"]),
+ ("gbr", &["application/rpki-ghostbusters"]),
+ ("gca", &["application/x-gca-compressed"]),
+ ("gdl", &["model/vnd.gdl"]),
+ ("gdoc", &["application/vnd.google-apps.document"]),
+ ("gemini", &["text/gemini"]),
+ ("generictest", &["application/xml"]),
+ ("geo", &["application/vnd.dynageo"]),
+ ("geojson", &["application/geo+json"]),
+ ("gex", &["application/vnd.geometry-explorer"]),
+ ("ggb", &["application/vnd.geogebra.file"]),
+ ("ggt", &["application/vnd.geogebra.tool"]),
+ ("ghf", &["application/vnd.groove-help"]),
+ ("gif", &["image/gif"]),
+ ("gim", &["application/vnd.groove-identity-message"]),
+ ("glb", &["model/gltf-binary"]),
+ ("gltf", &["model/gltf+json"]),
+ ("gmi", &["text/gemini"]),
+ ("gml", &["application/gml+xml"]),
+ ("gmx", &["application/vnd.gmx"]),
+ ("gnumeric", &["application/x-gnumeric"]),
+ ("gph", &["application/vnd.flographit"]),
+ ("gpx", &["application/gpx+xml"]),
+ ("gqf", &["application/vnd.grafeq"]),
+ ("gqs", &["application/vnd.grafeq"]),
+ ("gram", &["application/srgs"]),
+ ("gramps", &["application/x-gramps-xml"]),
+ ("gre", &["application/vnd.geometry-explorer"]),
+ ("group", &["text/x-ms-group"]),
+ ("grv", &["application/vnd.groove-injector"]),
+ ("grxml", &["application/srgs+xml"]),
+ ("gsf", &["application/x-font-ghostscript"]),
+ ("gsheet", &["application/vnd.google-apps.spreadsheet"]),
+ ("gslides", &["application/vnd.google-apps.presentation"]),
+ ("gsm", &["audio/x-gsm"]),
+ ("gtar", &["application/x-gtar"]),
+ ("gtm", &["application/vnd.groove-tool-message"]),
+ ("gtw", &["model/vnd.gtw"]),
+ ("gv", &["text/vnd.graphviz"]),
+ ("gxf", &["application/gxf"]),
+ ("gxt", &["application/vnd.geonext"]),
+ ("gz", &["application/gzip"]),
+ ("h", &["text/plain"]),
+ ("h261", &["video/h261"]),
+ ("h263", &["video/h263"]),
+ ("h264", &["video/h264"]),
+ ("hal", &["application/vnd.hal+xml"]),
+ ("hbci", &["application/vnd.hbci"]),
+ ("hbs", &["text/x-handlebars-template"]),
+ ("hdd", &["application/x-virtualbox-hdd"]),
+ ("hdf", &["application/x-hdf"]),
+ ("hdml", &["text/x-hdml"]),
+ ("hdr", &["image/vnd.radiance"]),
+ ("hh", &["text/plain"]),
+ ("hhc", &["application/x-oleobject"]),
+ ("hhk", &["application/octet-stream"]),
+ ("hhp", &["application/octet-stream"]),
+ ("hjson", &["application/hjson"]),
+ ("hlp", &["application/winhlp"]),
+ ("hpgl", &["application/vnd.hp-hpgl"]),
+ ("hpid", &["application/vnd.hp-hpid"]),
+ ("hpp", &["text/plain"]),
+ ("hps", &["application/vnd.hp-hps"]),
+ ("hqx", &["application/mac-binhex40"]),
+ ("hta", &["application/hta"]),
+ ("htc", &["text/x-component"]),
+ ("htke", &["application/vnd.kenameaapp"]),
+ ("htm", &["text/html"]),
+ ("html", &["text/html"]),
+ ("htt", &["text/webviewhtml"]),
+ ("hvd", &["application/vnd.yamaha.hv-dic"]),
+ ("hvp", &["application/vnd.yamaha.hv-voice"]),
+ ("hvs", &["application/vnd.yamaha.hv-script"]),
+ ("hxa", &["application/xml"]),
+ ("hxc", &["application/xml"]),
+ ("hxd", &["application/octet-stream"]),
+ ("hxe", &["application/xml"]),
+ ("hxf", &["application/xml"]),
+ ("hxh", &["application/octet-stream"]),
+ ("hxi", &["application/octet-stream"]),
+ ("hxk", &["application/xml"]),
+ ("hxq", &["application/octet-stream"]),
+ ("hxr", &["application/octet-stream"]),
+ ("hxs", &["application/octet-stream"]),
+ ("hxt", &["text/html"]),
+ ("hxv", &["application/xml"]),
+ ("hxw", &["application/octet-stream"]),
+ ("hxx", &["text/plain"]),
+ ("i", &["text/plain"]),
+ ("i2g", &["application/vnd.intergeo"]),
+ ("icc", &["application/vnd.iccprofile"]),
+ ("ice", &["x-conference/x-cooltalk"]),
+ ("icm", &["application/vnd.iccprofile"]),
+ ("ico", &["image/x-icon"]),
+ ("ics", &["application/octet-stream"]),
+ ("idl", &["text/plain"]),
+ ("ief", &["image/ief"]),
+ ("ifb", &["text/calendar"]),
+ ("ifm", &["application/vnd.shana.informed.formdata"]),
+ ("iges", &["model/iges"]),
+ ("igl", &["application/vnd.igloader"]),
+ ("igm", &["application/vnd.insors.igm"]),
+ ("igs", &["model/iges"]),
+ ("igx", &["application/vnd.micrografx.igx"]),
+ ("iif", &["application/vnd.shana.informed.interchange"]),
+ ("iii", &["application/x-iphone"]),
+ ("img", &["application/octet-stream"]),
+ ("imp", &["application/vnd.accpac.simply.imp"]),
+ ("ims", &["application/vnd.ms-ims"]),
+ ("in", &["text/plain"]),
+ ("inc", &["text/plain"]),
+ ("inf", &["application/octet-stream"]),
+ ("ini", &["text/plain"]),
+ ("ink", &["application/inkml+xml"]),
+ ("inkml", &["application/inkml+xml"]),
+ ("inl", &["text/plain"]),
+ ("ins", &["application/x-internet-signup"]),
+ ("install", &["application/x-install-instructions"]),
+ ("iota", &["application/vnd.astraea-software.iota"]),
+ ("ipa", &["application/x-itunes-ipa"]),
+ ("ipfix", &["application/ipfix"]),
+ ("ipg", &["application/x-itunes-ipg"]),
+ ("ipk", &["application/vnd.shana.informed.package"]),
+ ("ipproj", &["text/plain"]),
+ ("ipsw", &["application/x-itunes-ipsw"]),
+ ("iqy", &["text/x-ms-iqy"]),
+ ("irm", &["application/vnd.ibm.rights-management"]),
+ ("irp", &["application/vnd.irepository.package+xml"]),
+ ("iso", &["application/octet-stream"]),
+ ("isp", &["application/x-internet-signup"]),
+ ("ite", &["application/x-itunes-ite"]),
+ ("itlp", &["application/x-itunes-itlp"]),
+ ("itms", &["application/x-itunes-itms"]),
+ ("itp", &["application/vnd.shana.informed.formtemplate"]),
+ ("itpc", &["application/x-itunes-itpc"]),
+ ("ivf", &["video/x-ivf"]),
+ ("ivp", &["application/vnd.immervision-ivp"]),
+ ("ivu", &["application/vnd.immervision-ivu"]),
+ ("jad", &["text/vnd.sun.j2me.app-descriptor"]),
+ ("jade", &["text/jade"]),
+ ("jam", &["application/vnd.jam"]),
+ ("jar", &["application/java-archive"]),
+ ("jardiff", &["application/x-java-archive-diff"]),
+ ("java", &["application/octet-stream"]),
+ ("jck", &["application/liquidmotion"]),
+ ("jcz", &["application/liquidmotion"]),
+ ("jfif", &["image/pjpeg"]),
+ ("jisp", &["application/vnd.jisp"]),
+ ("jlt", &["application/vnd.hp-jlyt"]),
+ ("jng", &["image/x-jng"]),
+ ("jnlp", &["application/x-java-jnlp-file"]),
+ ("joda", &["application/vnd.joost.joda-archive"]),
+ ("jp2", &["image/jp2"]),
+ ("jpb", &["application/octet-stream"]),
+ ("jpe", &["image/jpeg"]),
+ ("jpeg", &["image/jpeg"]),
+ ("jpf", &["image/jpx"]),
+ ("jpg", &["image/jpeg"]),
+ ("jpg2", &["image/jp2"]),
+ ("jpgm", &["video/jpm"]),
+ ("jpgv", &["video/jpeg"]),
+ ("jpm", &["image/jpm"]),
+ ("jpx", &["image/jpx"]),
+ ("js", &["application/javascript"]),
+ ("jsm", &["application/javascript"]),
+ ("json", &["application/json"]),
+ ("json5", &["application/json5"]),
+ ("jsonld", &["application/ld+json"]),
+ ("jsonml", &["application/jsonml+json"]),
+ ("jsx", &["text/jscript"]),
+ ("jsxbin", &["text/plain"]),
+ ("kar", &["audio/midi"]),
+ ("karbon", &["application/vnd.kde.karbon"]),
+ ("kfo", &["application/vnd.kde.kformula"]),
+ ("kia", &["application/vnd.kidspiration"]),
+ ("kml", &["application/vnd.google-earth.kml+xml"]),
+ ("kmz", &["application/vnd.google-earth.kmz"]),
+ ("kne", &["application/vnd.kinar"]),
+ ("knp", &["application/vnd.kinar"]),
+ ("kon", &["application/vnd.kde.kontour"]),
+ ("kpr", &["application/vnd.kde.kpresenter"]),
+ ("kpt", &["application/vnd.kde.kpresenter"]),
+ ("kpxx", &["application/vnd.ds-keypoint"]),
+ ("ksp", &["application/vnd.kde.kspread"]),
+ ("ktr", &["application/vnd.kahootz"]),
+ ("ktx", &["image/ktx"]),
+ ("ktz", &["application/vnd.kahootz"]),
+ ("kwd", &["application/vnd.kde.kword"]),
+ ("kwt", &["application/vnd.kde.kword"]),
+ ("lasxml", &["application/vnd.las.las+xml"]),
+ ("latex", &["application/x-latex"]),
+ (
+ "lbd",
+ &["application/vnd.llamagraphics.life-balance.desktop"],
+ ),
+ (
+ "lbe",
+ &["application/vnd.llamagraphics.life-balance.exchange+xml"],
+ ),
+ ("les", &["application/vnd.hhe.lesson-player"]),
+ ("less", &["text/less"]),
+ ("lha", &["application/x-lzh-compressed"]),
+ ("library-ms", &["application/windows-library+xml"]),
+ ("link66", &["application/vnd.route66.link66+xml"]),
+ ("list", &["text/plain"]),
+ ("list3820", &["application/vnd.ibm.modcap"]),
+ ("listafp", &["application/vnd.ibm.modcap"]),
+ ("lit", &["application/x-ms-reader"]),
+ ("litcoffee", &["text/coffeescript"]),
+ ("lnk", &["application/x-ms-shortcut"]),
+ ("loadtest", &["application/xml"]),
+ ("log", &["text/plain"]),
+ ("lostxml", &["application/lost+xml"]),
+ ("lpk", &["application/octet-stream"]),
+ ("lrf", &["application/octet-stream"]),
+ ("lrm", &["application/vnd.ms-lrm"]),
+ ("lsf", &["video/x-la-asf"]),
+ ("lst", &["text/plain"]),
+ ("lsx", &["video/x-la-asf"]),
+ ("ltf", &["application/vnd.frogans.ltf"]),
+ ("lua", &["text/x-lua"]),
+ ("luac", &["application/x-lua-bytecode"]),
+ ("lvp", &["audio/vnd.lucent.voice"]),
+ ("lwp", &["application/vnd.lotus-wordpro"]),
+ ("lzh", &["application/octet-stream"]),
+ ("m13", &["application/x-msmediaview"]),
+ ("m14", &["application/x-msmediaview"]),
+ ("m1v", &["video/mpeg"]),
+ ("m21", &["application/mp21"]),
+ ("m2a", &["audio/mpeg"]),
+ ("m2t", &["video/vnd.dlna.mpeg-tts"]),
+ ("m2ts", &["video/vnd.dlna.mpeg-tts"]),
+ ("m2v", &["video/mpeg"]),
+ ("m3a", &["audio/mpeg"]),
+ ("m3u", &["audio/x-mpegurl"]),
+ ("m3u8", &["audio/x-mpegurl"]),
+ ("m4a", &["audio/m4a"]),
+ ("m4b", &["audio/m4b"]),
+ ("m4p", &["audio/m4p"]),
+ ("m4r", &["audio/x-m4r"]),
+ ("m4u", &["video/vnd.mpegurl"]),
+ ("m4v", &["video/x-m4v"]),
+ ("ma", &["application/mathematica"]),
+ ("mac", &["image/x-macpaint"]),
+ ("mads", &["application/mads+xml"]),
+ ("mag", &["application/vnd.ecowin.chart"]),
+ ("mak", &["text/plain"]),
+ ("maker", &["application/vnd.framemaker"]),
+ ("man", &["application/x-troff-man"]),
+ ("manifest", &["application/x-ms-manifest"]),
+ ("map", &["text/plain"]),
+ ("mar", &["application/octet-stream"]),
+ ("markdown", &["text/markdown"]),
+ ("master", &["application/xml"]),
+ ("mathml", &["application/mathml+xml"]),
+ ("mb", &["application/mathematica"]),
+ ("mbk", &["application/vnd.mobius.mbk"]),
+ ("mbox", &["application/mbox"]),
+ ("mc1", &["application/vnd.medcalcdata"]),
+ ("mcd", &["application/vnd.mcd"]),
+ ("mcurl", &["text/vnd.curl.mcurl"]),
+ ("md", &["text/markdown", "text/x-markdown"]),
+ ("mda", &["application/msaccess"]),
+ ("mdb", &["application/x-msaccess"]),
+ ("mde", &["application/msaccess"]),
+ ("mdi", &["image/vnd.ms-modi"]),
+ ("mdp", &["application/octet-stream"]),
+ ("me", &["application/x-troff-me"]),
+ ("mesh", &["model/mesh"]),
+ ("meta4", &["application/metalink4+xml"]),
+ ("metalink", &["application/metalink+xml"]),
+ ("mets", &["application/mets+xml"]),
+ ("mfm", &["application/vnd.mfmp"]),
+ ("mfp", &["application/x-shockwave-flash"]),
+ ("mft", &["application/rpki-manifest"]),
+ ("mgp", &["application/vnd.osgeo.mapguide.package"]),
+ ("mgz", &["application/vnd.proteus.magazine"]),
+ ("mht", &["message/rfc822"]),
+ ("mhtml", &["message/rfc822"]),
+ ("mid", &["audio/mid"]),
+ ("midi", &["audio/mid"]),
+ ("mie", &["application/x-mie"]),
+ ("mif", &["application/vnd.mif"]),
+ ("mime", &["message/rfc822"]),
+ ("mix", &["application/octet-stream"]),
+ ("mj2", &["video/mj2"]),
+ ("mjp2", &["video/mj2"]),
+ ("mjs", &["application/javascript"]),
+ ("mk", &["text/plain"]),
+ ("mk3d", &["video/x-matroska"]),
+ ("mka", &["audio/x-matroska"]),
+ ("mkd", &["text/x-markdown"]),
+ ("mks", &["video/x-matroska"]),
+ ("mkv", &["video/x-matroska"]),
+ ("mlp", &["application/vnd.dolby.mlp"]),
+ ("mmd", &["application/vnd.chipnuts.karaoke-mmd"]),
+ ("mmf", &["application/x-smaf"]),
+ ("mml", &["text/mathml"]),
+ ("mmr", &["image/vnd.fujixerox.edmics-mmr"]),
+ ("mng", &["video/x-mng"]),
+ ("mno", &["text/xml"]),
+ ("mny", &["application/x-msmoney"]),
+ ("mobi", &["application/x-mobipocket-ebook"]),
+ ("mod", &["video/mpeg"]),
+ ("mods", &["application/mods+xml"]),
+ ("mov", &["video/quicktime"]),
+ ("movie", &["video/x-sgi-movie"]),
+ ("mp2", &["audio/mpeg", "video/mpeg"]),
+ ("mp21", &["application/mp21"]),
+ ("mp2a", &["audio/mpeg"]),
+ ("mp2v", &["video/mpeg"]),
+ ("mp3", &["audio/mpeg"]),
+ ("mp4", &["video/mp4"]),
+ ("mp4a", &["audio/mp4"]),
+ ("mp4s", &["application/mp4"]),
+ ("mp4v", &["video/mp4"]),
+ ("mpa", &["video/mpeg"]),
+ ("mpc", &["application/vnd.mophun.certificate"]),
+ ("mpd", &["application/dash+xml"]),
+ ("mpe", &["video/mpeg"]),
+ ("mpeg", &["video/mpeg"]),
+ ("mpf", &["application/vnd.ms-mediapackage"]),
+ ("mpg", &["video/mpeg"]),
+ ("mpg4", &["video/mp4"]),
+ ("mpga", &["audio/mpeg"]),
+ ("mpkg", &["application/vnd.apple.installer+xml"]),
+ ("mpm", &["application/vnd.blueice.multipass"]),
+ ("mpn", &["application/vnd.mophun.application"]),
+ ("mpp", &["application/vnd.ms-project"]),
+ ("mpt", &["application/vnd.ms-project"]),
+ ("mpv2", &["video/mpeg"]),
+ ("mpy", &["application/vnd.ibm.minipay"]),
+ ("mqv", &["video/quicktime"]),
+ ("mqy", &["application/vnd.mobius.mqy"]),
+ ("mrc", &["application/marc"]),
+ ("mrcx", &["application/marcxml+xml"]),
+ ("ms", &["application/x-troff-ms"]),
+ ("mscml", &["application/mediaservercontrol+xml"]),
+ ("mseed", &["application/vnd.fdsn.mseed"]),
+ ("mseq", &["application/vnd.mseq"]),
+ ("msf", &["application/vnd.epson.msf"]),
+ ("msg", &["application/vnd.ms-outlook"]),
+ ("msh", &["model/mesh"]),
+ ("msi", &["application/octet-stream"]),
+ ("msl", &["application/vnd.mobius.msl"]),
+ ("msm", &["application/octet-stream"]),
+ ("mso", &["application/octet-stream"]),
+ ("msp", &["application/octet-stream"]),
+ ("msty", &["application/vnd.muvee.style"]),
+ ("mts", &["video/vnd.dlna.mpeg-tts"]),
+ ("mtx", &["application/xml"]),
+ ("mus", &["application/vnd.musician"]),
+ ("musicxml", &["application/vnd.recordare.musicxml+xml"]),
+ ("mvb", &["application/x-msmediaview"]),
+ ("mvc", &["application/x-miva-compiled"]),
+ ("mwf", &["application/vnd.mfer"]),
+ ("mxf", &["application/mxf"]),
+ ("mxl", &["application/vnd.recordare.musicxml"]),
+ ("mxml", &["application/xv+xml"]),
+ ("mxp", &["application/x-mmxp"]),
+ ("mxs", &["application/vnd.triscape.mxs"]),
+ ("mxu", &["video/vnd.mpegurl"]),
+ ("n-gage", &["application/vnd.nokia.n-gage.symbian.install"]),
+ ("n3", &["text/n3"]),
+ ("nb", &["application/mathematica"]),
+ ("nbp", &["application/vnd.wolfram.player"]),
+ ("nc", &["application/x-netcdf"]),
+ ("ncx", &["application/x-dtbncx+xml"]),
+ ("nfo", &["text/x-nfo"]),
+ ("ngdat", &["application/vnd.nokia.n-gage.data"]),
+ ("nitf", &["application/vnd.nitf"]),
+ ("nlu", &["application/vnd.neurolanguage.nlu"]),
+ ("nml", &["application/vnd.enliven"]),
+ ("nnd", &["application/vnd.noblenet-directory"]),
+ ("nns", &["application/vnd.noblenet-sealer"]),
+ ("nnw", &["application/vnd.noblenet-web"]),
+ ("npx", &["image/vnd.net-fpx"]),
+ ("nq", &["application/n-quads"]),
+ ("nsc", &["video/x-ms-asf"]),
+ ("nsf", &["application/vnd.lotus-notes"]),
+ ("nt", &["application/n-triples"]),
+ ("ntf", &["application/vnd.nitf"]),
+ ("nws", &["message/rfc822"]),
+ ("nzb", &["application/x-nzb"]),
+ ("oa2", &["application/vnd.fujitsu.oasys2"]),
+ ("oa3", &["application/vnd.fujitsu.oasys3"]),
+ ("oas", &["application/vnd.fujitsu.oasys"]),
+ ("obd", &["application/x-msbinder"]),
+ ("obj", &["application/x-tgif"]),
+ ("ocx", &["application/octet-stream"]),
+ ("oda", &["application/oda"]),
+ ("odb", &["application/vnd.oasis.opendocument.database"]),
+ ("odc", &["application/vnd.oasis.opendocument.chart"]),
+ ("odf", &["application/vnd.oasis.opendocument.formula"]),
+ (
+ "odft",
+ &["application/vnd.oasis.opendocument.formula-template"],
+ ),
+ ("odg", &["application/vnd.oasis.opendocument.graphics"]),
+ ("odh", &["text/plain"]),
+ ("odi", &["application/vnd.oasis.opendocument.image"]),
+ ("odl", &["text/plain"]),
+ ("odm", &["application/vnd.oasis.opendocument.text-master"]),
+ ("odp", &["application/vnd.oasis.opendocument.presentation"]),
+ ("ods", &["application/vnd.oasis.opendocument.spreadsheet"]),
+ ("odt", &["application/vnd.oasis.opendocument.text"]),
+ ("oga", &["audio/ogg"]),
+ ("ogg", &["audio/ogg"]),
+ ("ogv", &["video/ogg"]),
+ ("ogx", &["application/ogg"]),
+ ("omdoc", &["application/omdoc+xml"]),
+ ("one", &["application/onenote"]),
+ ("onea", &["application/onenote"]),
+ ("onepkg", &["application/onenote"]),
+ ("onetmp", &["application/onenote"]),
+ ("onetoc", &["application/onenote"]),
+ ("onetoc2", &["application/onenote"]),
+ ("opf", &["application/oebps-package+xml"]),
+ ("opml", &["text/x-opml"]),
+ ("oprc", &["application/vnd.palm"]),
+ ("opus", &["audio/ogg"]),
+ ("orderedtest", &["application/xml"]),
+ ("org", &["application/vnd.lotus-organizer"]),
+ ("osdx", &["application/opensearchdescription+xml"]),
+ ("osf", &["application/vnd.yamaha.openscoreformat"]),
+ (
+ "osfpvg",
+ &["application/vnd.yamaha.openscoreformat.osfpvg+xml"],
+ ),
+ (
+ "otc",
+ &["application/vnd.oasis.opendocument.chart-template"],
+ ),
+ ("otf", &["application/font-sfnt"]),
+ (
+ "otg",
+ &["application/vnd.oasis.opendocument.graphics-template"],
+ ),
+ ("oth", &["application/vnd.oasis.opendocument.text-web"]),
+ (
+ "oti",
+ &["application/vnd.oasis.opendocument.image-template"],
+ ),
+ (
+ "otp",
+ &["application/vnd.oasis.opendocument.presentation-template"],
+ ),
+ (
+ "ots",
+ &["application/vnd.oasis.opendocument.spreadsheet-template"],
+ ),
+ ("ott", &["application/vnd.oasis.opendocument.text-template"]),
+ ("ova", &["application/x-virtualbox-ova"]),
+ ("ovf", &["application/x-virtualbox-ovf"]),
+ ("oxps", &["application/oxps"]),
+ ("oxt", &["application/vnd.openofficeorg.extension"]),
+ ("p", &["text/x-pascal"]),
+ ("p10", &["application/pkcs10"]),
+ ("p12", &["application/x-pkcs12"]),
+ ("p7b", &["application/x-pkcs7-certificates"]),
+ ("p7c", &["application/pkcs7-mime"]),
+ ("p7m", &["application/pkcs7-mime"]),
+ ("p7r", &["application/x-pkcs7-certreqresp"]),
+ ("p7s", &["application/pkcs7-signature"]),
+ ("p8", &["application/pkcs8"]),
+ ("pac", &["application/x-ns-proxy-autoconfig"]),
+ ("pas", &["text/x-pascal"]),
+ ("paw", &["application/vnd.pawaafile"]),
+ ("pbd", &["application/vnd.powerbuilder6"]),
+ ("pbm", &["image/x-portable-bitmap"]),
+ ("pcap", &["application/vnd.tcpdump.pcap"]),
+ ("pcast", &["application/x-podcast"]),
+ ("pcf", &["application/x-font-pcf"]),
+ ("pcl", &["application/vnd.hp-pcl"]),
+ ("pclxl", &["application/vnd.hp-pclxl"]),
+ ("pct", &["image/pict"]),
+ ("pcurl", &["application/vnd.curl.pcurl"]),
+ ("pcx", &["application/octet-stream"]),
+ ("pcz", &["application/octet-stream"]),
+ ("pdb", &["application/vnd.palm"]),
+ ("pde", &["text/x-processing"]),
+ ("pdf", &["application/pdf"]),
+ ("pem", &["application/x-x509-ca-cert"]),
+ ("pfa", &["application/x-font-type1"]),
+ ("pfb", &["application/octet-stream"]),
+ ("pfm", &["application/octet-stream"]),
+ ("pfr", &["application/font-tdpfr"]),
+ ("pfx", &["application/x-pkcs12"]),
+ ("pgm", &["image/x-portable-graymap"]),
+ ("pgn", &["application/x-chess-pgn"]),
+ ("pgp", &["application/pgp-encrypted"]),
+ ("php", &["application/x-httpd-php"]),
+ ("pic", &["image/pict"]),
+ ("pict", &["image/pict"]),
+ ("pkg", &["application/octet-stream"]),
+ ("pkgdef", &["text/plain"]),
+ ("pkgundef", &["text/plain"]),
+ ("pki", &["application/pkixcmp"]),
+ ("pkipath", &["application/pkix-pkipath"]),
+ ("pko", &["application/vnd.ms-pki.pko"]),
+ ("pkpass", &["application/vnd.apple.pkpass"]),
+ ("pl", &["application/x-perl"]),
+ ("plb", &["application/vnd.3gpp.pic-bw-large"]),
+ ("plc", &["application/vnd.mobius.plc"]),
+ ("plf", &["application/vnd.pocketlearn"]),
+ ("pls", &["audio/scpls"]),
+ ("pm", &["application/x-perl"]),
+ ("pma", &["application/x-perfmon"]),
+ ("pmc", &["application/x-perfmon"]),
+ ("pml", &["application/x-perfmon"]),
+ ("pmr", &["application/x-perfmon"]),
+ ("pmw", &["application/x-perfmon"]),
+ ("png", &["image/png"]),
+ ("pnm", &["image/x-portable-anymap"]),
+ ("pnt", &["image/x-macpaint"]),
+ ("pntg", &["image/x-macpaint"]),
+ ("pnz", &["image/png"]),
+ ("portpkg", &["application/vnd.macports.portpkg"]),
+ ("pot", &["application/vnd.ms-powerpoint"]),
+ (
+ "potm",
+ &["application/vnd.ms-powerpoint.template.macroEnabled.12"],
+ ),
+ (
+ "potx",
+ &["application/vnd.openxmlformats-officedocument.presentationml.template"],
+ ),
+ ("ppa", &["application/vnd.ms-powerpoint"]),
+ (
+ "ppam",
+ &["application/vnd.ms-powerpoint.addin.macroEnabled.12"],
+ ),
+ ("ppd", &["application/vnd.cups-ppd"]),
+ ("ppm", &["image/x-portable-pixmap"]),
+ ("pps", &["application/vnd.ms-powerpoint"]),
+ (
+ "ppsm",
+ &["application/vnd.ms-powerpoint.slideshow.macroEnabled.12"],
+ ),
+ (
+ "ppsx",
+ &["application/vnd.openxmlformats-officedocument.presentationml.slideshow"],
+ ),
+ ("ppt", &["application/vnd.ms-powerpoint"]),
+ (
+ "pptm",
+ &["application/vnd.ms-powerpoint.presentation.macroEnabled.12"],
+ ),
+ (
+ "pptx",
+ &["application/vnd.openxmlformats-officedocument.presentationml.presentation"],
+ ),
+ ("pqa", &["application/vnd.palm"]),
+ ("prc", &["application/x-mobipocket-ebook"]),
+ ("pre", &["application/vnd.lotus-freelance"]),
+ ("prf", &["application/pics-rules"]),
+ ("prm", &["application/octet-stream"]),
+ ("prx", &["application/octet-stream"]),
+ ("ps", &["application/postscript"]),
+ ("psb", &["application/vnd.3gpp.pic-bw-small"]),
+ ("psc1", &["application/PowerShell"]),
+ ("psd", &["application/octet-stream"]),
+ ("psess", &["application/xml"]),
+ ("psf", &["application/x-font-linux-psf"]),
+ ("pskcxml", &["application/pskc+xml"]),
+ ("psm", &["application/octet-stream"]),
+ ("psp", &["application/octet-stream"]),
+ ("pst", &["application/vnd.ms-outlook"]),
+ ("ptid", &["application/vnd.pvi.ptid1"]),
+ ("pub", &["application/x-mspublisher"]),
+ ("pvb", &["application/vnd.3gpp.pic-bw-var"]),
+ ("pwn", &["application/vnd.3m.post-it-notes"]),
+ ("pwz", &["application/vnd.ms-powerpoint"]),
+ ("py", &["text/plain"]),
+ ("pya", &["audio/vnd.ms-playready.media.pya"]),
+ ("pyv", &["video/vnd.ms-playready.media.pyv"]),
+ ("qam", &["application/vnd.epson.quickanime"]),
+ ("qbo", &["application/vnd.intu.qbo"]),
+ ("qfx", &["application/vnd.intu.qfx"]),
+ ("qht", &["text/x-html-insertion"]),
+ ("qhtm", &["text/x-html-insertion"]),
+ ("qps", &["application/vnd.publishare-delta-tree"]),
+ ("qt", &["video/quicktime"]),
+ ("qti", &["image/x-quicktime"]),
+ ("qtif", &["image/x-quicktime"]),
+ ("qtl", &["application/x-quicktimeplayer"]),
+ ("qwd", &["application/vnd.quark.quarkxpress"]),
+ ("qwt", &["application/vnd.quark.quarkxpress"]),
+ ("qxb", &["application/vnd.quark.quarkxpress"]),
+ ("qxd", &["application/octet-stream"]),
+ ("qxl", &["application/vnd.quark.quarkxpress"]),
+ ("qxt", &["application/vnd.quark.quarkxpress"]),
+ ("ra", &["audio/x-pn-realaudio"]),
+ ("ram", &["audio/x-pn-realaudio"]),
+ ("raml", &["application/raml+yaml"]),
+ ("rar", &["application/x-rar-compressed"]),
+ ("ras", &["image/x-cmu-raster"]),
+ ("rat", &["application/rat-file"]),
+ ("rc", &["text/plain"]),
+ ("rc2", &["text/plain"]),
+ ("rcprofile", &["application/vnd.ipunplugged.rcprofile"]),
+ ("rct", &["text/plain"]),
+ ("rdf", &["application/rdf+xml"]),
+ ("rdlc", &["application/xml"]),
+ ("rdz", &["application/vnd.data-vision.rdz"]),
+ ("reg", &["text/plain"]),
+ ("rep", &["application/vnd.businessobjects"]),
+ ("res", &["application/x-dtbresource+xml"]),
+ ("resx", &["application/xml"]),
+ ("rf", &["image/vnd.rn-realflash"]),
+ ("rgb", &["image/x-rgb"]),
+ ("rgs", &["text/plain"]),
+ ("rif", &["application/reginfo+xml"]),
+ ("rip", &["audio/vnd.rip"]),
+ ("ris", &["application/x-research-info-systems"]),
+ ("rl", &["application/resource-lists+xml"]),
+ ("rlc", &["image/vnd.fujixerox.edmics-rlc"]),
+ ("rld", &["application/resource-lists-diff+xml"]),
+ ("rm", &["application/vnd.rn-realmedia"]),
+ ("rmi", &["audio/mid"]),
+ ("rmp", &["application/vnd.rn-rn_music_package"]),
+ ("rms", &["application/vnd.jcp.javame.midlet-rms"]),
+ ("rmvb", &["application/vnd.rn-realmedia-vbr"]),
+ ("rnc", &["application/relax-ng-compact-syntax"]),
+ ("rng", &["application/xml"]),
+ ("roa", &["application/rpki-roa"]),
+ ("roff", &["application/x-troff"]),
+ ("rp9", &["application/vnd.cloanto.rp9"]),
+ ("rpm", &["audio/x-pn-realaudio-plugin"]),
+ ("rpss", &["application/vnd.nokia.radio-presets"]),
+ ("rpst", &["application/vnd.nokia.radio-preset"]),
+ ("rq", &["application/sparql-query"]),
+ ("rqy", &["text/x-ms-rqy"]),
+ ("rs", &["text/x-rust"]),
+ ("rsd", &["application/rsd+xml"]),
+ ("rss", &["application/rss+xml"]),
+ ("rtf", &["application/rtf"]),
+ ("rtx", &["text/richtext"]),
+ ("ruleset", &["application/xml"]),
+ ("run", &["application/x-makeself"]),
+ ("rvt", &["application/octet-stream"]),
+ ("s", &["text/plain"]),
+ ("s3m", &["audio/s3m"]),
+ ("saf", &["application/vnd.yamaha.smaf-audio"]),
+ ("safariextz", &["application/x-safari-safariextz"]),
+ ("sass", &["text/x-sass"]),
+ ("sbml", &["application/sbml+xml"]),
+ ("sc", &["application/vnd.ibm.secure-container"]),
+ ("scd", &["application/x-msschedule"]),
+ ("scm", &["application/vnd.lotus-screencam"]),
+ ("scq", &["application/scvp-cv-request"]),
+ ("scr", &["text/plain"]),
+ ("scs", &["application/scvp-cv-response"]),
+ ("scss", &["text/x-scss"]),
+ ("sct", &["text/scriptlet"]),
+ ("scurl", &["text/vnd.curl.scurl"]),
+ ("sd2", &["audio/x-sd2"]),
+ ("sda", &["application/vnd.stardivision.draw"]),
+ ("sdc", &["application/vnd.stardivision.calc"]),
+ ("sdd", &["application/vnd.stardivision.impress"]),
+ ("sdkd", &["application/vnd.solent.sdkm+xml"]),
+ ("sdkm", &["application/vnd.solent.sdkm+xml"]),
+ ("sdp", &["application/sdp"]),
+ ("sdw", &["application/vnd.stardivision.writer"]),
+ ("sea", &["application/octet-stream"]),
+ (
+ "searchconnector-ms",
+ &["application/windows-search-connector+xml"],
+ ),
+ ("see", &["application/vnd.seemail"]),
+ ("seed", &["application/vnd.fdsn.seed"]),
+ ("sema", &["application/vnd.sema"]),
+ ("semd", &["application/vnd.semd"]),
+ ("semf", &["application/vnd.semf"]),
+ ("ser", &["application/java-serialized-object"]),
+ ("setpay", &["application/set-payment-initiation"]),
+ ("setreg", &["application/set-registration-initiation"]),
+ ("settings", &["application/xml"]),
+ ("sfd-hdstx", &["application/vnd.hydrostatix.sof-data"]),
+ ("sfs", &["application/vnd.spotfire.sfs"]),
+ ("sfv", &["text/x-sfv"]),
+ ("sgi", &["image/sgi"]),
+ ("sgimb", &["application/x-sgimb"]),
+ ("sgl", &["application/vnd.stardivision.writer-global"]),
+ ("sgm", &["text/sgml"]),
+ ("sgml", &["text/sgml"]),
+ ("sh", &["application/x-sh"]),
+ ("shar", &["application/x-shar"]),
+ ("shex", &["text/shex"]),
+ ("shf", &["application/shf+xml"]),
+ ("shtml", &["text/html"]),
+ ("sid", &["image/x-mrsid-image"]),
+ ("sig", &["application/pgp-signature"]),
+ ("sil", &["audio/silk"]),
+ ("silo", &["model/mesh"]),
+ ("sis", &["application/vnd.symbian.install"]),
+ ("sisx", &["application/vnd.symbian.install"]),
+ ("sit", &["application/x-stuffit"]),
+ ("sitemap", &["application/xml"]),
+ ("sitx", &["application/x-stuffitx"]),
+ ("skd", &["application/vnd.koan"]),
+ ("skin", &["application/xml"]),
+ ("skm", &["application/vnd.koan"]),
+ ("skp", &["application/x-koan"]),
+ ("skt", &["application/vnd.koan"]),
+ (
+ "sldm",
+ &["application/vnd.ms-powerpoint.slide.macroEnabled.12"],
+ ),
+ (
+ "sldx",
+ &["application/vnd.openxmlformats-officedocument.presentationml.slide"],
+ ),
+ ("slim", &["text/slim"]),
+ ("slk", &["application/vnd.ms-excel"]),
+ ("slm", &["text/slim"]),
+ ("sln", &["text/plain"]),
+ ("slt", &["application/vnd.epson.salt"]),
+ ("slupkg-ms", &["application/x-ms-license"]),
+ ("sm", &["application/vnd.stepmania.stepchart"]),
+ ("smd", &["audio/x-smd"]),
+ ("smf", &["application/vnd.stardivision.math"]),
+ ("smi", &["application/octet-stream"]),
+ ("smil", &["application/smil+xml"]),
+ ("smv", &["video/x-smv"]),
+ ("smx", &["audio/x-smd"]),
+ ("smz", &["audio/x-smd"]),
+ ("smzip", &["application/vnd.stepmania.package"]),
+ ("snd", &["audio/basic"]),
+ ("snf", &["application/x-font-snf"]),
+ ("snippet", &["application/xml"]),
+ ("snp", &["application/octet-stream"]),
+ ("so", &["application/octet-stream"]),
+ ("sol", &["text/plain"]),
+ ("sor", &["text/plain"]),
+ ("spc", &["application/x-pkcs7-certificates"]),
+ ("spf", &["application/vnd.yamaha.smaf-phrase"]),
+ ("spl", &["application/futuresplash"]),
+ ("spot", &["text/vnd.in3d.spot"]),
+ ("spp", &["application/scvp-vp-response"]),
+ ("spq", &["application/scvp-vp-request"]),
+ ("spx", &["audio/ogg"]),
+ ("sql", &["application/x-sql"]),
+ ("src", &["application/x-wais-source"]),
+ ("srf", &["text/plain"]),
+ ("srt", &["application/x-subrip"]),
+ ("sru", &["application/sru+xml"]),
+ ("srx", &["application/sparql-results+xml"]),
+ ("ssdl", &["application/ssdl+xml"]),
+ ("sse", &["application/vnd.kodak-descriptor"]),
+ ("ssf", &["application/vnd.epson.ssf"]),
+ ("ssisdeploymentmanifest", &["text/xml"]),
+ ("ssm", &["application/streamingmedia"]),
+ ("ssml", &["application/ssml+xml"]),
+ ("sst", &["application/vnd.ms-pki.certstore"]),
+ ("st", &["application/vnd.sailingtracker.track"]),
+ ("stc", &["application/vnd.sun.xml.calc.template"]),
+ ("std", &["application/vnd.sun.xml.draw.template"]),
+ ("step", &["application/step"]),
+ ("stf", &["application/vnd.wt.stf"]),
+ ("sti", &["application/vnd.sun.xml.impress.template"]),
+ ("stk", &["application/hyperstudio"]),
+ ("stl", &["application/vnd.ms-pki.stl"]),
+ ("stp", &["application/step"]),
+ ("str", &["application/vnd.pg.format"]),
+ ("stw", &["application/vnd.sun.xml.writer.template"]),
+ ("styl", &["text/stylus"]),
+ ("stylus", &["text/stylus"]),
+ ("sub", &["text/vnd.dvb.subtitle"]),
+ ("sus", &["application/vnd.sus-calendar"]),
+ ("susp", &["application/vnd.sus-calendar"]),
+ ("sv4cpio", &["application/x-sv4cpio"]),
+ ("sv4crc", &["application/x-sv4crc"]),
+ ("svc", &["application/xml"]),
+ ("svd", &["application/vnd.svd"]),
+ ("svg", &["image/svg+xml"]),
+ ("svgz", &["image/svg+xml"]),
+ ("swa", &["application/x-director"]),
+ ("swf", &["application/x-shockwave-flash"]),
+ ("swi", &["application/vnd.aristanetworks.swi"]),
+ ("sxc", &["application/vnd.sun.xml.calc"]),
+ ("sxd", &["application/vnd.sun.xml.draw"]),
+ ("sxg", &["application/vnd.sun.xml.writer.global"]),
+ ("sxi", &["application/vnd.sun.xml.impress"]),
+ ("sxm", &["application/vnd.sun.xml.math"]),
+ ("sxw", &["application/vnd.sun.xml.writer"]),
+ ("t", &["application/x-troff"]),
+ ("t3", &["application/x-t3vm-image"]),
+ ("taglet", &["application/vnd.mynfc"]),
+ ("tao", &["application/vnd.tao.intent-module-archive"]),
+ ("tar", &["application/x-tar"]),
+ ("tcap", &["application/vnd.3gpp2.tcap"]),
+ ("tcl", &["application/x-tcl"]),
+ ("teacher", &["application/vnd.smart.teacher"]),
+ ("tei", &["application/tei+xml"]),
+ ("teicorpus", &["application/tei+xml"]),
+ ("testrunconfig", &["application/xml"]),
+ ("testsettings", &["application/xml"]),
+ ("tex", &["application/x-tex"]),
+ ("texi", &["application/x-texinfo"]),
+ ("texinfo", &["application/x-texinfo"]),
+ ("text", &["text/plain"]),
+ ("tfi", &["application/thraud+xml"]),
+ ("tfm", &["application/x-tex-tfm"]),
+ ("tga", &["image/x-tga"]),
+ ("tgz", &["application/x-compressed"]),
+ ("thmx", &["application/vnd.ms-officetheme"]),
+ ("thn", &["application/octet-stream"]),
+ ("tif", &["image/tiff"]),
+ ("tiff", &["image/tiff"]),
+ ("tk", &["application/x-tcl"]),
+ ("tlh", &["text/plain"]),
+ ("tli", &["text/plain"]),
+ ("tmo", &["application/vnd.tmobile-livetv"]),
+ ("toc", &["application/octet-stream"]),
+ ("toml", &["text/x-toml"]),
+ ("torrent", &["application/x-bittorrent"]),
+ ("tpl", &["application/vnd.groove-tool-template"]),
+ ("tpt", &["application/vnd.trid.tpt"]),
+ ("tr", &["application/x-troff"]),
+ ("tra", &["application/vnd.trueapp"]),
+ ("trig", &["application/trig"]),
+ ("trm", &["application/x-msterminal"]),
+ ("trx", &["application/xml"]),
+ ("ts", &["video/vnd.dlna.mpeg-tts"]),
+ ("tsd", &["application/timestamped-data"]),
+ ("tsv", &["text/tab-separated-values"]),
+ ("ttc", &["font/collection"]),
+ ("ttf", &["font/ttf", "application/x-font-ttf", "application/font-sfnt"]),
+ ("ttl", &["text/turtle"]),
+ ("tts", &["video/vnd.dlna.mpeg-tts"]),
+ ("twd", &["application/vnd.simtech-mindmapper"]),
+ ("twds", &["application/vnd.simtech-mindmapper"]),
+ ("txd", &["application/vnd.genomatix.tuxedo"]),
+ ("txf", &["application/vnd.mobius.txf"]),
+ ("txt", &["text/plain"]),
+ ("u32", &["application/octet-stream"]),
+ ("u8dsn", &["message/global-delivery-status"]),
+ ("u8hdr", &["message/global-headers"]),
+ ("u8mdn", &["message/global-disposition-notification"]),
+ ("u8msg", &["message/global"]),
+ ("udeb", &["application/x-debian-package"]),
+ ("ufd", &["application/vnd.ufdl"]),
+ ("ufdl", &["application/vnd.ufdl"]),
+ ("uls", &["text/iuls"]),
+ ("ulx", &["application/x-glulx"]),
+ ("umj", &["application/vnd.umajin"]),
+ ("unityweb", &["application/vnd.unity"]),
+ ("uoml", &["application/vnd.uoml+xml"]),
+ ("uri", &["text/uri-list"]),
+ ("uris", &["text/uri-list"]),
+ ("urls", &["text/uri-list"]),
+ ("user", &["text/plain"]),
+ ("ustar", &["application/x-ustar"]),
+ ("utz", &["application/vnd.uiq.theme"]),
+ ("uu", &["text/x-uuencode"]),
+ ("uva", &["audio/vnd.dece.audio"]),
+ ("uvd", &["application/vnd.dece.data"]),
+ ("uvf", &["application/vnd.dece.data"]),
+ ("uvg", &["image/vnd.dece.graphic"]),
+ ("uvh", &["video/vnd.dece.hd"]),
+ ("uvi", &["image/vnd.dece.graphic"]),
+ ("uvm", &["video/vnd.dece.mobile"]),
+ ("uvp", &["video/vnd.dece.pd"]),
+ ("uvs", &["video/vnd.dece.sd"]),
+ ("uvt", &["application/vnd.dece.ttml+xml"]),
+ ("uvu", &["video/vnd.uvvu.mp4"]),
+ ("uvv", &["video/vnd.dece.video"]),
+ ("uvva", &["audio/vnd.dece.audio"]),
+ ("uvvd", &["application/vnd.dece.data"]),
+ ("uvvf", &["application/vnd.dece.data"]),
+ ("uvvg", &["image/vnd.dece.graphic"]),
+ ("uvvh", &["video/vnd.dece.hd"]),
+ ("uvvi", &["image/vnd.dece.graphic"]),
+ ("uvvm", &["video/vnd.dece.mobile"]),
+ ("uvvp", &["video/vnd.dece.pd"]),
+ ("uvvs", &["video/vnd.dece.sd"]),
+ ("uvvt", &["application/vnd.dece.ttml+xml"]),
+ ("uvvu", &["video/vnd.uvvu.mp4"]),
+ ("uvvv", &["video/vnd.dece.video"]),
+ ("uvvx", &["application/vnd.dece.unspecified"]),
+ ("uvvz", &["application/vnd.dece.zip"]),
+ ("uvx", &["application/vnd.dece.unspecified"]),
+ ("uvz", &["application/vnd.dece.zip"]),
+ ("vb", &["text/plain"]),
+ ("vbdproj", &["text/plain"]),
+ ("vbk", &["video/mpeg"]),
+ ("vbox", &["application/x-virtualbox-vbox"]),
+ ("vbox-extpack", &["application/x-virtualbox-vbox-extpack"]),
+ ("vbproj", &["text/plain"]),
+ ("vbs", &["text/vbscript"]),
+ ("vcard", &["text/vcard"]),
+ ("vcd", &["application/x-cdlink"]),
+ ("vcf", &["text/x-vcard"]),
+ ("vcg", &["application/vnd.groove-vcard"]),
+ ("vcproj", &["application/xml"]),
+ ("vcs", &["text/plain"]),
+ ("vcx", &["application/vnd.vcx"]),
+ ("vcxproj", &["application/xml"]),
+ ("vddproj", &["text/plain"]),
+ ("vdi", &["application/x-virtualbox-vdi"]),
+ ("vdp", &["text/plain"]),
+ ("vdproj", &["text/plain"]),
+ ("vdx", &["application/vnd.ms-visio.viewer"]),
+ ("vhd", &["application/x-virtualbox-vhd"]),
+ ("vis", &["application/vnd.visionary"]),
+ ("viv", &["video/vnd.vivo"]),
+ ("vmdk", &["application/x-virtualbox-vmdk"]),
+ ("vml", &["text/xml"]),
+ ("vob", &["video/x-ms-vob"]),
+ ("vor", &["application/vnd.stardivision.writer"]),
+ ("vox", &["application/x-authorware-bin"]),
+ ("vrml", &["model/vrml"]),
+ ("vscontent", &["application/xml"]),
+ ("vsct", &["text/xml"]),
+ ("vsd", &["application/vnd.visio"]),
+ ("vsf", &["application/vnd.vsf"]),
+ ("vsi", &["application/ms-vsi"]),
+ ("vsix", &["application/vsix"]),
+ ("vsixlangpack", &["text/xml"]),
+ ("vsixmanifest", &["text/xml"]),
+ ("vsmdi", &["application/xml"]),
+ ("vspscc", &["text/plain"]),
+ ("vss", &["application/vnd.visio"]),
+ ("vsscc", &["text/plain"]),
+ ("vssettings", &["text/xml"]),
+ ("vssscc", &["text/plain"]),
+ ("vst", &["application/vnd.visio"]),
+ ("vstemplate", &["text/xml"]),
+ ("vsto", &["application/x-ms-vsto"]),
+ ("vsw", &["application/vnd.visio"]),
+ ("vsx", &["application/vnd.visio"]),
+ ("vtt", &["text/vtt"]),
+ ("vtu", &["model/vnd.vtu"]),
+ ("vtx", &["application/vnd.visio"]),
+ ("vxml", &["application/voicexml+xml"]),
+ ("w3d", &["application/x-director"]),
+ ("wad", &["application/x-doom"]),
+ ("wadl", &["application/vnd.sun.wadl+xml"]),
+ ("war", &["application/java-archive"]),
+ ("wasm", &["application/wasm"]),
+ ("wav", &["audio/wav"]),
+ ("wave", &["audio/wav"]),
+ ("wax", &["audio/x-ms-wax"]),
+ ("wbk", &["application/msword"]),
+ ("wbmp", &["image/vnd.wap.wbmp"]),
+ ("wbs", &["application/vnd.criticaltools.wbs+xml"]),
+ ("wbxml", &["application/vnd.wap.wbxml"]),
+ ("wcm", &["application/vnd.ms-works"]),
+ ("wdb", &["application/vnd.ms-works"]),
+ ("wdp", &["image/vnd.ms-photo"]),
+ ("weba", &["audio/webm"]),
+ ("webapp", &["application/x-web-app-manifest+json"]),
+ ("webarchive", &["application/x-safari-webarchive"]),
+ ("webm", &["video/webm"]),
+ ("webmanifest", &["application/manifest+json"]),
+ ("webp", &["image/webp"]),
+ ("webtest", &["application/xml"]),
+ ("wg", &["application/vnd.pmi.widget"]),
+ ("wgt", &["application/widget"]),
+ ("wiq", &["application/xml"]),
+ ("wiz", &["application/msword"]),
+ ("wks", &["application/vnd.ms-works"]),
+ ("wlmp", &["application/wlmoviemaker"]),
+ ("wlpginstall", &["application/x-wlpg-detect"]),
+ ("wlpginstall3", &["application/x-wlpg3-detect"]),
+ ("wm", &["video/x-ms-wm"]),
+ ("wma", &["audio/x-ms-wma"]),
+ ("wmd", &["application/x-ms-wmd"]),
+ ("wmf", &["application/x-msmetafile"]),
+ ("wml", &["text/vnd.wap.wml"]),
+ ("wmlc", &["application/vnd.wap.wmlc"]),
+ ("wmls", &["text/vnd.wap.wmlscript"]),
+ ("wmlsc", &["application/vnd.wap.wmlscriptc"]),
+ ("wmp", &["video/x-ms-wmp"]),
+ ("wmv", &["video/x-ms-wmv"]),
+ ("wmx", &["video/x-ms-wmx"]),
+ ("wmz", &["application/x-ms-wmz"]),
+ ("woff", &["application/font-woff"]),
+ ("woff2", &["font/woff2"]),
+ ("wpd", &["application/vnd.wordperfect"]),
+ ("wpl", &["application/vnd.ms-wpl"]),
+ ("wps", &["application/vnd.ms-works"]),
+ ("wqd", &["application/vnd.wqd"]),
+ ("wri", &["application/x-mswrite"]),
+ ("wrl", &["x-world/x-vrml"]),
+ ("wrz", &["x-world/x-vrml"]),
+ ("wsc", &["text/scriptlet"]),
+ ("wsdl", &["text/xml"]),
+ ("wspolicy", &["application/wspolicy+xml"]),
+ ("wtb", &["application/vnd.webturbo"]),
+ ("wvx", &["video/x-ms-wvx"]),
+ ("x", &["application/directx"]),
+ ("x32", &["application/x-authorware-bin"]),
+ ("x3d", &["model/x3d+xml"]),
+ ("x3db", &["model/x3d+binary"]),
+ ("x3dbz", &["model/x3d+binary"]),
+ ("x3dv", &["model/x3d+vrml"]),
+ ("x3dvz", &["model/x3d+vrml"]),
+ ("x3dz", &["model/x3d+xml"]),
+ ("xaf", &["x-world/x-vrml"]),
+ ("xaml", &["application/xaml+xml"]),
+ ("xap", &["application/x-silverlight-app"]),
+ ("xar", &["application/vnd.xara"]),
+ ("xbap", &["application/x-ms-xbap"]),
+ ("xbd", &["application/vnd.fujixerox.docuworks.binder"]),
+ ("xbm", &["image/x-xbitmap"]),
+ ("xdf", &["application/xcap-diff+xml"]),
+ ("xdm", &["application/vnd.syncml.dm+xml"]),
+ ("xdp", &["application/vnd.adobe.xdp+xml"]),
+ ("xdr", &["text/plain"]),
+ ("xdssc", &["application/dssc+xml"]),
+ ("xdw", &["application/vnd.fujixerox.docuworks"]),
+ ("xenc", &["application/xenc+xml"]),
+ ("xer", &["application/patch-ops-error+xml"]),
+ ("xfdf", &["application/vnd.adobe.xfdf"]),
+ ("xfdl", &["application/vnd.xfdl"]),
+ ("xht", &["application/xhtml+xml"]),
+ ("xhtml", &["application/xhtml+xml"]),
+ ("xhvml", &["application/xv+xml"]),
+ ("xif", &["image/vnd.xiff"]),
+ ("xla", &["application/vnd.ms-excel"]),
+ ("xlam", &["application/vnd.ms-excel.addin.macroEnabled.12"]),
+ ("xlc", &["application/vnd.ms-excel"]),
+ ("xld", &["application/vnd.ms-excel"]),
+ ("xlf", &["application/x-xliff+xml"]),
+ ("xlk", &["application/vnd.ms-excel"]),
+ ("xll", &["application/vnd.ms-excel"]),
+ ("xlm", &["application/vnd.ms-excel"]),
+ ("xls", &["application/vnd.ms-excel"]),
+ (
+ "xlsb",
+ &["application/vnd.ms-excel.sheet.binary.macroEnabled.12"],
+ ),
+ ("xlsm", &["application/vnd.ms-excel.sheet.macroEnabled.12"]),
+ (
+ "xlsx",
+ &["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
+ ),
+ ("xlt", &["application/vnd.ms-excel"]),
+ (
+ "xltm",
+ &["application/vnd.ms-excel.template.macroEnabled.12"],
+ ),
+ (
+ "xltx",
+ &["application/vnd.openxmlformats-officedocument.spreadsheetml.template"],
+ ),
+ ("xlw", &["application/vnd.ms-excel"]),
+ ("xm", &["audio/xm"]),
+ ("xml", &["text/xml"]),
+ ("xmp", &["application/octet-stream"]),
+ ("xmta", &["application/xml"]),
+ ("xo", &["application/vnd.olpc-sugar"]),
+ ("xof", &["x-world/x-vrml"]),
+ ("xoml", &["text/plain"]),
+ ("xop", &["application/xop+xml"]),
+ ("xpi", &["application/x-xpinstall"]),
+ ("xpl", &["application/xproc+xml"]),
+ ("xpm", &["image/x-xpixmap"]),
+ ("xpr", &["application/vnd.is-xpr"]),
+ ("xps", &["application/vnd.ms-xpsdocument"]),
+ ("xpw", &["application/vnd.intercon.formnet"]),
+ ("xpx", &["application/vnd.intercon.formnet"]),
+ ("xrm-ms", &["text/xml"]),
+ ("xsc", &["application/xml"]),
+ ("xsd", &["text/xml"]),
+ ("xsf", &["text/xml"]),
+ ("xsl", &["text/xml"]),
+ ("xslt", &["text/xml"]),
+ ("xsm", &["application/vnd.syncml+xml"]),
+ ("xsn", &["application/octet-stream"]),
+ ("xspf", &["application/xspf+xml"]),
+ ("xss", &["application/xml"]),
+ ("xtp", &["application/octet-stream"]),
+ ("xul", &["application/vnd.mozilla.xul+xml"]),
+ ("xvm", &["application/xv+xml"]),
+ ("xvml", &["application/xv+xml"]),
+ ("xwd", &["image/x-xwindowdump"]),
+ ("xyz", &["chemical/x-xyz"]),
+ ("xz", &["application/x-xz"]),
+ ("yaml", &["text/x-yaml"]),
+ ("yang", &["application/yang"]),
+ ("yin", &["application/yin+xml"]),
+ ("yml", &["text/x-yaml"]),
+ ("ymp", &["text/x-suse-ymp"]),
+ ("z", &["application/x-compress"]),
+ ("z1", &["application/x-zmachine"]),
+ ("z2", &["application/x-zmachine"]),
+ ("z3", &["application/x-zmachine"]),
+ ("z4", &["application/x-zmachine"]),
+ ("z5", &["application/x-zmachine"]),
+ ("z6", &["application/x-zmachine"]),
+ ("z7", &["application/x-zmachine"]),
+ ("z8", &["application/x-zmachine"]),
+ ("zaz", &["application/vnd.zzazz.deck+xml"]),
+ ("zip", &["application/zip"]),
+ ("zir", &["application/vnd.zul"]),
+ ("zirz", &["application/vnd.zul"]),
+ ("zmm", &["application/vnd.handheld-entertainment+xml"]),
+];