diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index a605fbc1..7613edd6 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -60,5 +60,6 @@ "generate-timeline", "update-time-on-edit", "timelines-revamped", - "mehrmaid" + "mehrmaid", + "onlyoffice" ] \ No newline at end of file diff --git a/.obsidian/plugins/OnlyOffice/._.DS_Store b/.obsidian/plugins/OnlyOffice/._.DS_Store new file mode 100644 index 00000000..28c42fb2 Binary files /dev/null and b/.obsidian/plugins/OnlyOffice/._.DS_Store differ diff --git a/.obsidian/plugins/OnlyOffice/._manifest.json b/.obsidian/plugins/OnlyOffice/._manifest.json new file mode 100644 index 00000000..66219da1 Binary files /dev/null and b/.obsidian/plugins/OnlyOffice/._manifest.json differ diff --git a/.obsidian/plugins/OnlyOffice/assets/Start.docx b/.obsidian/plugins/OnlyOffice/assets/Start.docx new file mode 100644 index 00000000..4c0241a3 Binary files /dev/null and b/.obsidian/plugins/OnlyOffice/assets/Start.docx differ diff --git a/.obsidian/plugins/OnlyOffice/assets/Start.pptx b/.obsidian/plugins/OnlyOffice/assets/Start.pptx new file mode 100644 index 00000000..a2f4c71f Binary files /dev/null and b/.obsidian/plugins/OnlyOffice/assets/Start.pptx differ diff --git a/.obsidian/plugins/OnlyOffice/assets/Start.xlsx b/.obsidian/plugins/OnlyOffice/assets/Start.xlsx new file mode 100644 index 00000000..8d896833 Binary files /dev/null and b/.obsidian/plugins/OnlyOffice/assets/Start.xlsx differ diff --git a/.obsidian/plugins/OnlyOffice/data.json b/.obsidian/plugins/OnlyOffice/data.json new file mode 100644 index 00000000..8034db4b --- /dev/null +++ b/.obsidian/plugins/OnlyOffice/data.json @@ -0,0 +1,12 @@ +{ + "onlyOfficeServerPort": 3480, + "jwtSecret": "sIQDBApCLBgr2yZQsHJve07bHi4iZDv7", + "localServerAddress": "192.168.1.181", + "htmlServerPort": 0, + "callbackServerPort": 0, + "useRequestToken": true, + "useSystemSaveAs": false, + "hideDownloadAs": true, + "promptNameOnCreate": true, + "restrictToLocalhost": false +} \ No newline at end of file diff --git a/.obsidian/plugins/OnlyOffice/embedded-editor.html b/.obsidian/plugins/OnlyOffice/embedded-editor.html new file mode 100644 index 00000000..c553f014 --- /dev/null +++ b/.obsidian/plugins/OnlyOffice/embedded-editor.html @@ -0,0 +1,59 @@ + + + + + OnlyOffice Embedded Editor + + + +
+ + + diff --git a/.obsidian/plugins/OnlyOffice/main.js b/.obsidian/plugins/OnlyOffice/main.js new file mode 100644 index 00000000..1958c8e6 --- /dev/null +++ b/.obsidian/plugins/OnlyOffice/main.js @@ -0,0 +1,12295 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ + +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); +var __publicField = (obj, key, value) => { + __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); + return value; +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateAdd = (obj, member, value) => { + if (member.has(obj)) + throw TypeError("Cannot add the same private member more than once"); + member instanceof WeakSet ? member.add(obj) : member.set(obj, value); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// node_modules/mime-db/db.json +var require_db = __commonJS({ + "node_modules/mime-db/db.json"(exports2, module2) { + module2.exports = { + "application/1d-interleaved-parityfec": { + source: "iana" + }, + "application/3gpdash-qoe-report+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/3gpp-ims+xml": { + source: "iana", + compressible: true + }, + "application/3gpphal+json": { + source: "iana", + compressible: true + }, + "application/3gpphalforms+json": { + source: "iana", + compressible: true + }, + "application/a2l": { + source: "iana" + }, + "application/ace+cbor": { + source: "iana" + }, + "application/ace+json": { + source: "iana", + compressible: true + }, + "application/ace-groupcomm+cbor": { + source: "iana" + }, + "application/ace-trl+cbor": { + source: "iana" + }, + "application/activemessage": { + source: "iana" + }, + "application/activity+json": { + source: "iana", + compressible: true + }, + "application/aif+cbor": { + source: "iana" + }, + "application/aif+json": { + source: "iana", + compressible: true + }, + "application/alto-cdni+json": { + source: "iana", + compressible: true + }, + "application/alto-cdnifilter+json": { + source: "iana", + compressible: true + }, + "application/alto-costmap+json": { + source: "iana", + compressible: true + }, + "application/alto-costmapfilter+json": { + source: "iana", + compressible: true + }, + "application/alto-directory+json": { + source: "iana", + compressible: true + }, + "application/alto-endpointcost+json": { + source: "iana", + compressible: true + }, + "application/alto-endpointcostparams+json": { + source: "iana", + compressible: true + }, + "application/alto-endpointprop+json": { + source: "iana", + compressible: true + }, + "application/alto-endpointpropparams+json": { + source: "iana", + compressible: true + }, + "application/alto-error+json": { + source: "iana", + compressible: true + }, + "application/alto-networkmap+json": { + source: "iana", + compressible: true + }, + "application/alto-networkmapfilter+json": { + source: "iana", + compressible: true + }, + "application/alto-propmap+json": { + source: "iana", + compressible: true + }, + "application/alto-propmapparams+json": { + source: "iana", + compressible: true + }, + "application/alto-tips+json": { + source: "iana", + compressible: true + }, + "application/alto-tipsparams+json": { + source: "iana", + compressible: true + }, + "application/alto-updatestreamcontrol+json": { + source: "iana", + compressible: true + }, + "application/alto-updatestreamparams+json": { + source: "iana", + compressible: true + }, + "application/aml": { + source: "iana" + }, + "application/andrew-inset": { + source: "iana", + extensions: ["ez"] + }, + "application/appinstaller": { + compressible: false, + extensions: ["appinstaller"] + }, + "application/applefile": { + source: "iana" + }, + "application/applixware": { + source: "apache", + extensions: ["aw"] + }, + "application/appx": { + compressible: false, + extensions: ["appx"] + }, + "application/appxbundle": { + compressible: false, + extensions: ["appxbundle"] + }, + "application/at+jwt": { + source: "iana" + }, + "application/atf": { + source: "iana" + }, + "application/atfx": { + source: "iana" + }, + "application/atom+xml": { + source: "iana", + compressible: true, + extensions: ["atom"] + }, + "application/atomcat+xml": { + source: "iana", + compressible: true, + extensions: ["atomcat"] + }, + "application/atomdeleted+xml": { + source: "iana", + compressible: true, + extensions: ["atomdeleted"] + }, + "application/atomicmail": { + source: "iana" + }, + "application/atomsvc+xml": { + source: "iana", + compressible: true, + extensions: ["atomsvc"] + }, + "application/atsc-dwd+xml": { + source: "iana", + compressible: true, + extensions: ["dwd"] + }, + "application/atsc-dynamic-event-message": { + source: "iana" + }, + "application/atsc-held+xml": { + source: "iana", + compressible: true, + extensions: ["held"] + }, + "application/atsc-rdt+json": { + source: "iana", + compressible: true + }, + "application/atsc-rsat+xml": { + source: "iana", + compressible: true, + extensions: ["rsat"] + }, + "application/atxml": { + source: "iana" + }, + "application/auth-policy+xml": { + source: "iana", + compressible: true + }, + "application/automationml-aml+xml": { + source: "iana", + compressible: true, + extensions: ["aml"] + }, + "application/automationml-amlx+zip": { + source: "iana", + compressible: false, + extensions: ["amlx"] + }, + "application/bacnet-xdd+zip": { + source: "iana", + compressible: false + }, + "application/batch-smtp": { + source: "iana" + }, + "application/bdoc": { + compressible: false, + extensions: ["bdoc"] + }, + "application/beep+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/bufr": { + source: "iana" + }, + "application/c2pa": { + source: "iana" + }, + "application/calendar+json": { + source: "iana", + compressible: true + }, + "application/calendar+xml": { + source: "iana", + compressible: true, + extensions: ["xcs"] + }, + "application/call-completion": { + source: "iana" + }, + "application/cals-1840": { + source: "iana" + }, + "application/captive+json": { + source: "iana", + compressible: true + }, + "application/cbor": { + source: "iana" + }, + "application/cbor-seq": { + source: "iana" + }, + "application/cccex": { + source: "iana" + }, + "application/ccmp+xml": { + source: "iana", + compressible: true + }, + "application/ccxml+xml": { + source: "iana", + compressible: true, + extensions: ["ccxml"] + }, + "application/cda+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/cdfx+xml": { + source: "iana", + compressible: true, + extensions: ["cdfx"] + }, + "application/cdmi-capability": { + source: "iana", + extensions: ["cdmia"] + }, + "application/cdmi-container": { + source: "iana", + extensions: ["cdmic"] + }, + "application/cdmi-domain": { + source: "iana", + extensions: ["cdmid"] + }, + "application/cdmi-object": { + source: "iana", + extensions: ["cdmio"] + }, + "application/cdmi-queue": { + source: "iana", + extensions: ["cdmiq"] + }, + "application/cdni": { + source: "iana" + }, + "application/ce+cbor": { + source: "iana" + }, + "application/cea": { + source: "iana" + }, + "application/cea-2018+xml": { + source: "iana", + compressible: true + }, + "application/cellml+xml": { + source: "iana", + compressible: true + }, + "application/cfw": { + source: "iana" + }, + "application/cid-edhoc+cbor-seq": { + source: "iana" + }, + "application/city+json": { + source: "iana", + compressible: true + }, + "application/city+json-seq": { + source: "iana" + }, + "application/clr": { + source: "iana" + }, + "application/clue+xml": { + source: "iana", + compressible: true + }, + "application/clue_info+xml": { + source: "iana", + compressible: true + }, + "application/cms": { + source: "iana" + }, + "application/cnrp+xml": { + source: "iana", + compressible: true + }, + "application/coap-eap": { + source: "iana" + }, + "application/coap-group+json": { + source: "iana", + compressible: true + }, + "application/coap-payload": { + source: "iana" + }, + "application/commonground": { + source: "iana" + }, + "application/concise-problem-details+cbor": { + source: "iana" + }, + "application/conference-info+xml": { + source: "iana", + compressible: true + }, + "application/cose": { + source: "iana" + }, + "application/cose-key": { + source: "iana" + }, + "application/cose-key-set": { + source: "iana" + }, + "application/cose-x509": { + source: "iana" + }, + "application/cpl+xml": { + source: "iana", + compressible: true, + extensions: ["cpl"] + }, + "application/csrattrs": { + source: "iana" + }, + "application/csta+xml": { + source: "iana", + compressible: true + }, + "application/cstadata+xml": { + source: "iana", + compressible: true + }, + "application/csvm+json": { + source: "iana", + compressible: true + }, + "application/cu-seeme": { + source: "apache", + extensions: ["cu"] + }, + "application/cwl": { + source: "iana", + extensions: ["cwl"] + }, + "application/cwl+json": { + source: "iana", + compressible: true + }, + "application/cwl+yaml": { + source: "iana" + }, + "application/cwt": { + source: "iana" + }, + "application/cybercash": { + source: "iana" + }, + "application/dart": { + compressible: true + }, + "application/dash+xml": { + source: "iana", + compressible: true, + extensions: ["mpd"] + }, + "application/dash-patch+xml": { + source: "iana", + compressible: true, + extensions: ["mpp"] + }, + "application/dashdelta": { + source: "iana" + }, + "application/davmount+xml": { + source: "iana", + compressible: true, + extensions: ["davmount"] + }, + "application/dca-rft": { + source: "iana" + }, + "application/dcd": { + source: "iana" + }, + "application/dec-dx": { + source: "iana" + }, + "application/dialog-info+xml": { + source: "iana", + compressible: true + }, + "application/dicom": { + source: "iana", + extensions: ["dcm"] + }, + "application/dicom+json": { + source: "iana", + compressible: true + }, + "application/dicom+xml": { + source: "iana", + compressible: true + }, + "application/dii": { + source: "iana" + }, + "application/dit": { + source: "iana" + }, + "application/dns": { + source: "iana" + }, + "application/dns+json": { + source: "iana", + compressible: true + }, + "application/dns-message": { + source: "iana" + }, + "application/docbook+xml": { + source: "apache", + compressible: true, + extensions: ["dbk"] + }, + "application/dots+cbor": { + source: "iana" + }, + "application/dpop+jwt": { + source: "iana" + }, + "application/dskpp+xml": { + source: "iana", + compressible: true + }, + "application/dssc+der": { + source: "iana", + extensions: ["dssc"] + }, + "application/dssc+xml": { + source: "iana", + compressible: true, + extensions: ["xdssc"] + }, + "application/dvcs": { + source: "iana" + }, + "application/eat+cwt": { + source: "iana" + }, + "application/eat+jwt": { + source: "iana" + }, + "application/eat-bun+cbor": { + source: "iana" + }, + "application/eat-bun+json": { + source: "iana", + compressible: true + }, + "application/eat-ucs+cbor": { + source: "iana" + }, + "application/eat-ucs+json": { + source: "iana", + compressible: true + }, + "application/ecmascript": { + source: "apache", + compressible: true, + extensions: ["ecma"] + }, + "application/edhoc+cbor-seq": { + source: "iana" + }, + "application/edi-consent": { + source: "iana" + }, + "application/edi-x12": { + source: "iana", + compressible: false + }, + "application/edifact": { + source: "iana", + compressible: false + }, + "application/efi": { + source: "iana" + }, + "application/elm+json": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/elm+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.cap+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/emergencycalldata.comment+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.control+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.deviceinfo+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.ecall.msd": { + source: "iana" + }, + "application/emergencycalldata.legacyesn+json": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.providerinfo+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.serviceinfo+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.subscriberinfo+xml": { + source: "iana", + compressible: true + }, + "application/emergencycalldata.veds+xml": { + source: "iana", + compressible: true + }, + "application/emma+xml": { + source: "iana", + compressible: true, + extensions: ["emma"] + }, + "application/emotionml+xml": { + source: "iana", + compressible: true, + extensions: ["emotionml"] + }, + "application/encaprtp": { + source: "iana" + }, + "application/entity-statement+jwt": { + source: "iana" + }, + "application/epp+xml": { + source: "iana", + compressible: true + }, + "application/epub+zip": { + source: "iana", + compressible: false, + extensions: ["epub"] + }, + "application/eshop": { + source: "iana" + }, + "application/exi": { + source: "iana", + extensions: ["exi"] + }, + "application/expect-ct-report+json": { + source: "iana", + compressible: true + }, + "application/express": { + source: "iana", + extensions: ["exp"] + }, + "application/fastinfoset": { + source: "iana" + }, + "application/fastsoap": { + source: "iana" + }, + "application/fdf": { + source: "iana", + extensions: ["fdf"] + }, + "application/fdt+xml": { + source: "iana", + compressible: true, + extensions: ["fdt"] + }, + "application/fhir+json": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/fhir+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/fido.trusted-apps+json": { + compressible: true + }, + "application/fits": { + source: "iana" + }, + "application/flexfec": { + source: "iana" + }, + "application/font-sfnt": { + source: "iana" + }, + "application/font-tdpfr": { + source: "iana", + extensions: ["pfr"] + }, + "application/font-woff": { + source: "iana", + compressible: false + }, + "application/framework-attributes+xml": { + source: "iana", + compressible: true + }, + "application/geo+json": { + source: "iana", + compressible: true, + extensions: ["geojson"] + }, + "application/geo+json-seq": { + source: "iana" + }, + "application/geopackage+sqlite3": { + source: "iana" + }, + "application/geopose+json": { + source: "iana", + compressible: true + }, + "application/geoxacml+json": { + source: "iana", + compressible: true + }, + "application/geoxacml+xml": { + source: "iana", + compressible: true + }, + "application/gltf-buffer": { + source: "iana" + }, + "application/gml+xml": { + source: "iana", + compressible: true, + extensions: ["gml"] + }, + "application/gnap-binding-jws": { + source: "iana" + }, + "application/gnap-binding-jwsd": { + source: "iana" + }, + "application/gnap-binding-rotation-jws": { + source: "iana" + }, + "application/gnap-binding-rotation-jwsd": { + source: "iana" + }, + "application/gpx+xml": { + source: "apache", + compressible: true, + extensions: ["gpx"] + }, + "application/grib": { + source: "iana" + }, + "application/gxf": { + source: "apache", + extensions: ["gxf"] + }, + "application/gzip": { + source: "iana", + compressible: false, + extensions: ["gz"] + }, + "application/h224": { + source: "iana" + }, + "application/held+xml": { + source: "iana", + compressible: true + }, + "application/hjson": { + extensions: ["hjson"] + }, + "application/hl7v2+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/http": { + source: "iana" + }, + "application/hyperstudio": { + source: "iana", + extensions: ["stk"] + }, + "application/ibe-key-request+xml": { + source: "iana", + compressible: true + }, + "application/ibe-pkg-reply+xml": { + source: "iana", + compressible: true + }, + "application/ibe-pp-data": { + source: "iana" + }, + "application/iges": { + source: "iana" + }, + "application/im-iscomposing+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/index": { + source: "iana" + }, + "application/index.cmd": { + source: "iana" + }, + "application/index.obj": { + source: "iana" + }, + "application/index.response": { + source: "iana" + }, + "application/index.vnd": { + source: "iana" + }, + "application/inkml+xml": { + source: "iana", + compressible: true, + extensions: ["ink", "inkml"] + }, + "application/iotp": { + source: "iana" + }, + "application/ipfix": { + source: "iana", + extensions: ["ipfix"] + }, + "application/ipp": { + source: "iana" + }, + "application/isup": { + source: "iana" + }, + "application/its+xml": { + source: "iana", + compressible: true, + extensions: ["its"] + }, + "application/java-archive": { + source: "iana", + compressible: false, + extensions: ["jar", "war", "ear"] + }, + "application/java-serialized-object": { + source: "apache", + compressible: false, + extensions: ["ser"] + }, + "application/java-vm": { + source: "apache", + compressible: false, + extensions: ["class"] + }, + "application/javascript": { + source: "apache", + charset: "UTF-8", + compressible: true, + extensions: ["js"] + }, + "application/jf2feed+json": { + source: "iana", + compressible: true + }, + "application/jose": { + source: "iana" + }, + "application/jose+json": { + source: "iana", + compressible: true + }, + "application/jrd+json": { + source: "iana", + compressible: true + }, + "application/jscalendar+json": { + source: "iana", + compressible: true + }, + "application/jscontact+json": { + source: "iana", + compressible: true + }, + "application/json": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["json", "map"] + }, + "application/json-patch+json": { + source: "iana", + compressible: true + }, + "application/json-seq": { + source: "iana" + }, + "application/json5": { + extensions: ["json5"] + }, + "application/jsonml+json": { + source: "apache", + compressible: true, + extensions: ["jsonml"] + }, + "application/jsonpath": { + source: "iana" + }, + "application/jwk+json": { + source: "iana", + compressible: true + }, + "application/jwk-set+json": { + source: "iana", + compressible: true + }, + "application/jwk-set+jwt": { + source: "iana" + }, + "application/jwt": { + source: "iana" + }, + "application/kpml-request+xml": { + source: "iana", + compressible: true + }, + "application/kpml-response+xml": { + source: "iana", + compressible: true + }, + "application/ld+json": { + source: "iana", + compressible: true, + extensions: ["jsonld"] + }, + "application/lgr+xml": { + source: "iana", + compressible: true, + extensions: ["lgr"] + }, + "application/link-format": { + source: "iana" + }, + "application/linkset": { + source: "iana" + }, + "application/linkset+json": { + source: "iana", + compressible: true + }, + "application/load-control+xml": { + source: "iana", + compressible: true + }, + "application/logout+jwt": { + source: "iana" + }, + "application/lost+xml": { + source: "iana", + compressible: true, + extensions: ["lostxml"] + }, + "application/lostsync+xml": { + source: "iana", + compressible: true + }, + "application/lpf+zip": { + source: "iana", + compressible: false + }, + "application/lxf": { + source: "iana" + }, + "application/mac-binhex40": { + source: "iana", + extensions: ["hqx"] + }, + "application/mac-compactpro": { + source: "apache", + extensions: ["cpt"] + }, + "application/macwriteii": { + source: "iana" + }, + "application/mads+xml": { + source: "iana", + compressible: true, + extensions: ["mads"] + }, + "application/manifest+json": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["webmanifest"] + }, + "application/marc": { + source: "iana", + extensions: ["mrc"] + }, + "application/marcxml+xml": { + source: "iana", + compressible: true, + extensions: ["mrcx"] + }, + "application/mathematica": { + source: "iana", + extensions: ["ma", "nb", "mb"] + }, + "application/mathml+xml": { + source: "iana", + compressible: true, + extensions: ["mathml"] + }, + "application/mathml-content+xml": { + source: "iana", + compressible: true + }, + "application/mathml-presentation+xml": { + source: "iana", + compressible: true + }, + "application/mbms-associated-procedure-description+xml": { + source: "iana", + compressible: true + }, + "application/mbms-deregister+xml": { + source: "iana", + compressible: true + }, + "application/mbms-envelope+xml": { + source: "iana", + compressible: true + }, + "application/mbms-msk+xml": { + source: "iana", + compressible: true + }, + "application/mbms-msk-response+xml": { + source: "iana", + compressible: true + }, + "application/mbms-protection-description+xml": { + source: "iana", + compressible: true + }, + "application/mbms-reception-report+xml": { + source: "iana", + compressible: true + }, + "application/mbms-register+xml": { + source: "iana", + compressible: true + }, + "application/mbms-register-response+xml": { + source: "iana", + compressible: true + }, + "application/mbms-schedule+xml": { + source: "iana", + compressible: true + }, + "application/mbms-user-service-description+xml": { + source: "iana", + compressible: true + }, + "application/mbox": { + source: "iana", + extensions: ["mbox"] + }, + "application/media-policy-dataset+xml": { + source: "iana", + compressible: true, + extensions: ["mpf"] + }, + "application/media_control+xml": { + source: "iana", + compressible: true + }, + "application/mediaservercontrol+xml": { + source: "iana", + compressible: true, + extensions: ["mscml"] + }, + "application/merge-patch+json": { + source: "iana", + compressible: true + }, + "application/metalink+xml": { + source: "apache", + compressible: true, + extensions: ["metalink"] + }, + "application/metalink4+xml": { + source: "iana", + compressible: true, + extensions: ["meta4"] + }, + "application/mets+xml": { + source: "iana", + compressible: true, + extensions: ["mets"] + }, + "application/mf4": { + source: "iana" + }, + "application/mikey": { + source: "iana" + }, + "application/mipc": { + source: "iana" + }, + "application/missing-blocks+cbor-seq": { + source: "iana" + }, + "application/mmt-aei+xml": { + source: "iana", + compressible: true, + extensions: ["maei"] + }, + "application/mmt-usd+xml": { + source: "iana", + compressible: true, + extensions: ["musd"] + }, + "application/mods+xml": { + source: "iana", + compressible: true, + extensions: ["mods"] + }, + "application/moss-keys": { + source: "iana" + }, + "application/moss-signature": { + source: "iana" + }, + "application/mosskey-data": { + source: "iana" + }, + "application/mosskey-request": { + source: "iana" + }, + "application/mp21": { + source: "iana", + extensions: ["m21", "mp21"] + }, + "application/mp4": { + source: "iana", + extensions: ["mp4", "mpg4", "mp4s", "m4p"] + }, + "application/mpeg4-generic": { + source: "iana" + }, + "application/mpeg4-iod": { + source: "iana" + }, + "application/mpeg4-iod-xmt": { + source: "iana" + }, + "application/mrb-consumer+xml": { + source: "iana", + compressible: true + }, + "application/mrb-publish+xml": { + source: "iana", + compressible: true + }, + "application/msc-ivr+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/msc-mixer+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/msix": { + compressible: false, + extensions: ["msix"] + }, + "application/msixbundle": { + compressible: false, + extensions: ["msixbundle"] + }, + "application/msword": { + source: "iana", + compressible: false, + extensions: ["doc", "dot"] + }, + "application/mud+json": { + source: "iana", + compressible: true + }, + "application/multipart-core": { + source: "iana" + }, + "application/mxf": { + source: "iana", + extensions: ["mxf"] + }, + "application/n-quads": { + source: "iana", + extensions: ["nq"] + }, + "application/n-triples": { + source: "iana", + extensions: ["nt"] + }, + "application/nasdata": { + source: "iana" + }, + "application/news-checkgroups": { + source: "iana", + charset: "US-ASCII" + }, + "application/news-groupinfo": { + source: "iana", + charset: "US-ASCII" + }, + "application/news-transmission": { + source: "iana" + }, + "application/nlsml+xml": { + source: "iana", + compressible: true + }, + "application/node": { + source: "iana", + extensions: ["cjs"] + }, + "application/nss": { + source: "iana" + }, + "application/oauth-authz-req+jwt": { + source: "iana" + }, + "application/oblivious-dns-message": { + source: "iana" + }, + "application/ocsp-request": { + source: "iana" + }, + "application/ocsp-response": { + source: "iana" + }, + "application/octet-stream": { + source: "iana", + compressible: true, + extensions: ["bin", "dms", "lrf", "mar", "so", "dist", "distz", "pkg", "bpk", "dump", "elc", "deploy", "exe", "dll", "deb", "dmg", "iso", "img", "msi", "msp", "msm", "buffer"] + }, + "application/oda": { + source: "iana", + extensions: ["oda"] + }, + "application/odm+xml": { + source: "iana", + compressible: true + }, + "application/odx": { + source: "iana" + }, + "application/oebps-package+xml": { + source: "iana", + compressible: true, + extensions: ["opf"] + }, + "application/ogg": { + source: "iana", + compressible: false, + extensions: ["ogx"] + }, + "application/ohttp-keys": { + source: "iana" + }, + "application/omdoc+xml": { + source: "apache", + compressible: true, + extensions: ["omdoc"] + }, + "application/onenote": { + source: "apache", + extensions: ["onetoc", "onetoc2", "onetmp", "onepkg", "one", "onea"] + }, + "application/opc-nodeset+xml": { + source: "iana", + compressible: true + }, + "application/oscore": { + source: "iana" + }, + "application/oxps": { + source: "iana", + extensions: ["oxps"] + }, + "application/p21": { + source: "iana" + }, + "application/p21+zip": { + source: "iana", + compressible: false + }, + "application/p2p-overlay+xml": { + source: "iana", + compressible: true, + extensions: ["relo"] + }, + "application/parityfec": { + source: "iana" + }, + "application/passport": { + source: "iana" + }, + "application/patch-ops-error+xml": { + source: "iana", + compressible: true, + extensions: ["xer"] + }, + "application/pdf": { + source: "iana", + compressible: false, + extensions: ["pdf"] + }, + "application/pdx": { + source: "iana" + }, + "application/pem-certificate-chain": { + source: "iana" + }, + "application/pgp-encrypted": { + source: "iana", + compressible: false, + extensions: ["pgp"] + }, + "application/pgp-keys": { + source: "iana", + extensions: ["asc"] + }, + "application/pgp-signature": { + source: "iana", + extensions: ["sig", "asc"] + }, + "application/pics-rules": { + source: "apache", + extensions: ["prf"] + }, + "application/pidf+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/pidf-diff+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/pkcs10": { + source: "iana", + extensions: ["p10"] + }, + "application/pkcs12": { + source: "iana" + }, + "application/pkcs7-mime": { + source: "iana", + extensions: ["p7m", "p7c"] + }, + "application/pkcs7-signature": { + source: "iana", + extensions: ["p7s"] + }, + "application/pkcs8": { + source: "iana", + extensions: ["p8"] + }, + "application/pkcs8-encrypted": { + source: "iana" + }, + "application/pkix-attr-cert": { + source: "iana", + extensions: ["ac"] + }, + "application/pkix-cert": { + source: "iana", + extensions: ["cer"] + }, + "application/pkix-crl": { + source: "iana", + extensions: ["crl"] + }, + "application/pkix-pkipath": { + source: "iana", + extensions: ["pkipath"] + }, + "application/pkixcmp": { + source: "iana", + extensions: ["pki"] + }, + "application/pls+xml": { + source: "iana", + compressible: true, + extensions: ["pls"] + }, + "application/poc-settings+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/postscript": { + source: "iana", + compressible: true, + extensions: ["ai", "eps", "ps"] + }, + "application/ppsp-tracker+json": { + source: "iana", + compressible: true + }, + "application/private-token-issuer-directory": { + source: "iana" + }, + "application/private-token-request": { + source: "iana" + }, + "application/private-token-response": { + source: "iana" + }, + "application/problem+json": { + source: "iana", + compressible: true + }, + "application/problem+xml": { + source: "iana", + compressible: true + }, + "application/provenance+xml": { + source: "iana", + compressible: true, + extensions: ["provx"] + }, + "application/provided-claims+jwt": { + source: "iana" + }, + "application/prs.alvestrand.titrax-sheet": { + source: "iana" + }, + "application/prs.cww": { + source: "iana", + extensions: ["cww"] + }, + "application/prs.cyn": { + source: "iana", + charset: "7-BIT" + }, + "application/prs.hpub+zip": { + source: "iana", + compressible: false + }, + "application/prs.implied-document+xml": { + source: "iana", + compressible: true + }, + "application/prs.implied-executable": { + source: "iana" + }, + "application/prs.implied-object+json": { + source: "iana", + compressible: true + }, + "application/prs.implied-object+json-seq": { + source: "iana" + }, + "application/prs.implied-object+yaml": { + source: "iana" + }, + "application/prs.implied-structure": { + source: "iana" + }, + "application/prs.mayfile": { + source: "iana" + }, + "application/prs.nprend": { + source: "iana" + }, + "application/prs.plucker": { + source: "iana" + }, + "application/prs.rdf-xml-crypt": { + source: "iana" + }, + "application/prs.vcfbzip2": { + source: "iana" + }, + "application/prs.xsf+xml": { + source: "iana", + compressible: true, + extensions: ["xsf"] + }, + "application/pskc+xml": { + source: "iana", + compressible: true, + extensions: ["pskcxml"] + }, + "application/pvd+json": { + source: "iana", + compressible: true + }, + "application/qsig": { + source: "iana" + }, + "application/raml+yaml": { + compressible: true, + extensions: ["raml"] + }, + "application/raptorfec": { + source: "iana" + }, + "application/rdap+json": { + source: "iana", + compressible: true + }, + "application/rdf+xml": { + source: "iana", + compressible: true, + extensions: ["rdf", "owl"] + }, + "application/reginfo+xml": { + source: "iana", + compressible: true, + extensions: ["rif"] + }, + "application/relax-ng-compact-syntax": { + source: "iana", + extensions: ["rnc"] + }, + "application/remote-printing": { + source: "apache" + }, + "application/reputon+json": { + source: "iana", + compressible: true + }, + "application/resolve-response+jwt": { + source: "iana" + }, + "application/resource-lists+xml": { + source: "iana", + compressible: true, + extensions: ["rl"] + }, + "application/resource-lists-diff+xml": { + source: "iana", + compressible: true, + extensions: ["rld"] + }, + "application/rfc+xml": { + source: "iana", + compressible: true + }, + "application/riscos": { + source: "iana" + }, + "application/rlmi+xml": { + source: "iana", + compressible: true + }, + "application/rls-services+xml": { + source: "iana", + compressible: true, + extensions: ["rs"] + }, + "application/route-apd+xml": { + source: "iana", + compressible: true, + extensions: ["rapd"] + }, + "application/route-s-tsid+xml": { + source: "iana", + compressible: true, + extensions: ["sls"] + }, + "application/route-usd+xml": { + source: "iana", + compressible: true, + extensions: ["rusd"] + }, + "application/rpki-checklist": { + source: "iana" + }, + "application/rpki-ghostbusters": { + source: "iana", + extensions: ["gbr"] + }, + "application/rpki-manifest": { + source: "iana", + extensions: ["mft"] + }, + "application/rpki-publication": { + source: "iana" + }, + "application/rpki-roa": { + source: "iana", + extensions: ["roa"] + }, + "application/rpki-signed-tal": { + source: "iana" + }, + "application/rpki-updown": { + source: "iana" + }, + "application/rsd+xml": { + source: "apache", + compressible: true, + extensions: ["rsd"] + }, + "application/rss+xml": { + source: "apache", + compressible: true, + extensions: ["rss"] + }, + "application/rtf": { + source: "iana", + compressible: true, + extensions: ["rtf"] + }, + "application/rtploopback": { + source: "iana" + }, + "application/rtx": { + source: "iana" + }, + "application/samlassertion+xml": { + source: "iana", + compressible: true + }, + "application/samlmetadata+xml": { + source: "iana", + compressible: true + }, + "application/sarif+json": { + source: "iana", + compressible: true + }, + "application/sarif-external-properties+json": { + source: "iana", + compressible: true + }, + "application/sbe": { + source: "iana" + }, + "application/sbml+xml": { + source: "iana", + compressible: true, + extensions: ["sbml"] + }, + "application/scaip+xml": { + source: "iana", + compressible: true + }, + "application/scim+json": { + source: "iana", + compressible: true + }, + "application/scvp-cv-request": { + source: "iana", + extensions: ["scq"] + }, + "application/scvp-cv-response": { + source: "iana", + extensions: ["scs"] + }, + "application/scvp-vp-request": { + source: "iana", + extensions: ["spq"] + }, + "application/scvp-vp-response": { + source: "iana", + extensions: ["spp"] + }, + "application/sdp": { + source: "iana", + extensions: ["sdp"] + }, + "application/secevent+jwt": { + source: "iana" + }, + "application/senml+cbor": { + source: "iana" + }, + "application/senml+json": { + source: "iana", + compressible: true + }, + "application/senml+xml": { + source: "iana", + compressible: true, + extensions: ["senmlx"] + }, + "application/senml-etch+cbor": { + source: "iana" + }, + "application/senml-etch+json": { + source: "iana", + compressible: true + }, + "application/senml-exi": { + source: "iana" + }, + "application/sensml+cbor": { + source: "iana" + }, + "application/sensml+json": { + source: "iana", + compressible: true + }, + "application/sensml+xml": { + source: "iana", + compressible: true, + extensions: ["sensmlx"] + }, + "application/sensml-exi": { + source: "iana" + }, + "application/sep+xml": { + source: "iana", + compressible: true + }, + "application/sep-exi": { + source: "iana" + }, + "application/session-info": { + source: "iana" + }, + "application/set-payment": { + source: "iana" + }, + "application/set-payment-initiation": { + source: "iana", + extensions: ["setpay"] + }, + "application/set-registration": { + source: "iana" + }, + "application/set-registration-initiation": { + source: "iana", + extensions: ["setreg"] + }, + "application/sgml": { + source: "iana" + }, + "application/sgml-open-catalog": { + source: "iana" + }, + "application/shf+xml": { + source: "iana", + compressible: true, + extensions: ["shf"] + }, + "application/sieve": { + source: "iana", + extensions: ["siv", "sieve"] + }, + "application/simple-filter+xml": { + source: "iana", + compressible: true + }, + "application/simple-message-summary": { + source: "iana" + }, + "application/simplesymbolcontainer": { + source: "iana" + }, + "application/sipc": { + source: "iana" + }, + "application/slate": { + source: "iana" + }, + "application/smil": { + source: "apache" + }, + "application/smil+xml": { + source: "iana", + compressible: true, + extensions: ["smi", "smil"] + }, + "application/smpte336m": { + source: "iana" + }, + "application/soap+fastinfoset": { + source: "iana" + }, + "application/soap+xml": { + source: "iana", + compressible: true + }, + "application/sparql-query": { + source: "iana", + extensions: ["rq"] + }, + "application/sparql-results+xml": { + source: "iana", + compressible: true, + extensions: ["srx"] + }, + "application/spdx+json": { + source: "iana", + compressible: true + }, + "application/spirits-event+xml": { + source: "iana", + compressible: true + }, + "application/sql": { + source: "iana", + extensions: ["sql"] + }, + "application/srgs": { + source: "iana", + extensions: ["gram"] + }, + "application/srgs+xml": { + source: "iana", + compressible: true, + extensions: ["grxml"] + }, + "application/sru+xml": { + source: "iana", + compressible: true, + extensions: ["sru"] + }, + "application/ssdl+xml": { + source: "apache", + compressible: true, + extensions: ["ssdl"] + }, + "application/sslkeylogfile": { + source: "iana" + }, + "application/ssml+xml": { + source: "iana", + compressible: true, + extensions: ["ssml"] + }, + "application/st2110-41": { + source: "iana" + }, + "application/stix+json": { + source: "iana", + compressible: true + }, + "application/stratum": { + source: "iana" + }, + "application/swid+cbor": { + source: "iana" + }, + "application/swid+xml": { + source: "iana", + compressible: true, + extensions: ["swidtag"] + }, + "application/tamp-apex-update": { + source: "iana" + }, + "application/tamp-apex-update-confirm": { + source: "iana" + }, + "application/tamp-community-update": { + source: "iana" + }, + "application/tamp-community-update-confirm": { + source: "iana" + }, + "application/tamp-error": { + source: "iana" + }, + "application/tamp-sequence-adjust": { + source: "iana" + }, + "application/tamp-sequence-adjust-confirm": { + source: "iana" + }, + "application/tamp-status-query": { + source: "iana" + }, + "application/tamp-status-response": { + source: "iana" + }, + "application/tamp-update": { + source: "iana" + }, + "application/tamp-update-confirm": { + source: "iana" + }, + "application/tar": { + compressible: true + }, + "application/taxii+json": { + source: "iana", + compressible: true + }, + "application/td+json": { + source: "iana", + compressible: true + }, + "application/tei+xml": { + source: "iana", + compressible: true, + extensions: ["tei", "teicorpus"] + }, + "application/tetra_isi": { + source: "iana" + }, + "application/thraud+xml": { + source: "iana", + compressible: true, + extensions: ["tfi"] + }, + "application/timestamp-query": { + source: "iana" + }, + "application/timestamp-reply": { + source: "iana" + }, + "application/timestamped-data": { + source: "iana", + extensions: ["tsd"] + }, + "application/tlsrpt+gzip": { + source: "iana" + }, + "application/tlsrpt+json": { + source: "iana", + compressible: true + }, + "application/tm+json": { + source: "iana", + compressible: true + }, + "application/tnauthlist": { + source: "iana" + }, + "application/toc+cbor": { + source: "iana" + }, + "application/token-introspection+jwt": { + source: "iana" + }, + "application/toml": { + source: "iana", + compressible: true, + extensions: ["toml"] + }, + "application/trickle-ice-sdpfrag": { + source: "iana" + }, + "application/trig": { + source: "iana", + extensions: ["trig"] + }, + "application/trust-chain+json": { + source: "iana", + compressible: true + }, + "application/trust-mark+jwt": { + source: "iana" + }, + "application/trust-mark-delegation+jwt": { + source: "iana" + }, + "application/ttml+xml": { + source: "iana", + compressible: true, + extensions: ["ttml"] + }, + "application/tve-trigger": { + source: "iana" + }, + "application/tzif": { + source: "iana" + }, + "application/tzif-leap": { + source: "iana" + }, + "application/ubjson": { + compressible: false, + extensions: ["ubj"] + }, + "application/uccs+cbor": { + source: "iana" + }, + "application/ujcs+json": { + source: "iana", + compressible: true + }, + "application/ulpfec": { + source: "iana" + }, + "application/urc-grpsheet+xml": { + source: "iana", + compressible: true + }, + "application/urc-ressheet+xml": { + source: "iana", + compressible: true, + extensions: ["rsheet"] + }, + "application/urc-targetdesc+xml": { + source: "iana", + compressible: true, + extensions: ["td"] + }, + "application/urc-uisocketdesc+xml": { + source: "iana", + compressible: true + }, + "application/vc": { + source: "iana" + }, + "application/vc+cose": { + source: "iana" + }, + "application/vc+jwt": { + source: "iana" + }, + "application/vcard+json": { + source: "iana", + compressible: true + }, + "application/vcard+xml": { + source: "iana", + compressible: true + }, + "application/vemmi": { + source: "iana" + }, + "application/vividence.scriptfile": { + source: "apache" + }, + "application/vnd.1000minds.decision-model+xml": { + source: "iana", + compressible: true, + extensions: ["1km"] + }, + "application/vnd.1ob": { + source: "iana" + }, + "application/vnd.3gpp-prose+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp-prose-pc3a+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp-prose-pc3ach+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp-prose-pc3ch+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp-prose-pc8+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp-v2x-local-service-information": { + source: "iana" + }, + "application/vnd.3gpp.5gnas": { + source: "iana" + }, + "application/vnd.3gpp.5gsa2x": { + source: "iana" + }, + "application/vnd.3gpp.5gsa2x-local-service-information": { + source: "iana" + }, + "application/vnd.3gpp.5gsv2x": { + source: "iana" + }, + "application/vnd.3gpp.5gsv2x-local-service-information": { + source: "iana" + }, + "application/vnd.3gpp.access-transfer-events+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.bsf+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.crs+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.current-location-discovery+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.gmop+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.gtpc": { + source: "iana" + }, + "application/vnd.3gpp.interworking-data": { + source: "iana" + }, + "application/vnd.3gpp.lpp": { + source: "iana" + }, + "application/vnd.3gpp.mc-signalling-ear": { + source: "iana" + }, + "application/vnd.3gpp.mcdata-affiliation-command+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-payload": { + source: "iana" + }, + "application/vnd.3gpp.mcdata-regroup+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-service-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-signalling": { + source: "iana" + }, + "application/vnd.3gpp.mcdata-ue-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcdata-user-profile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-affiliation-command+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-floor-request+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-location-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-regroup+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-service-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-signed+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-ue-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-ue-init-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcptt-user-profile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-affiliation-command+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-location-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-mbms-usage-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-regroup+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-service-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-transmission-request+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-ue-config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mcvideo-user-profile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.mid-call+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.ngap": { + source: "iana" + }, + "application/vnd.3gpp.pfcp": { + source: "iana" + }, + "application/vnd.3gpp.pic-bw-large": { + source: "iana", + extensions: ["plb"] + }, + "application/vnd.3gpp.pic-bw-small": { + source: "iana", + extensions: ["psb"] + }, + "application/vnd.3gpp.pic-bw-var": { + source: "iana", + extensions: ["pvb"] + }, + "application/vnd.3gpp.pinapp-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.s1ap": { + source: "iana" + }, + "application/vnd.3gpp.seal-group-doc+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-location-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-mbms-usage-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-network-qos-management-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-ue-config-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-unicast-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.seal-user-profile-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.sms": { + source: "iana" + }, + "application/vnd.3gpp.sms+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.srvcc-ext+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.srvcc-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.state-and-event-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.ussd+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp.v2x": { + source: "iana" + }, + "application/vnd.3gpp.vae-info+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp2.bcmcsinfo+xml": { + source: "iana", + compressible: true + }, + "application/vnd.3gpp2.sms": { + source: "iana" + }, + "application/vnd.3gpp2.tcap": { + source: "iana", + extensions: ["tcap"] + }, + "application/vnd.3lightssoftware.imagescal": { + source: "iana" + }, + "application/vnd.3m.post-it-notes": { + source: "iana", + extensions: ["pwn"] + }, + "application/vnd.accpac.simply.aso": { + source: "iana", + extensions: ["aso"] + }, + "application/vnd.accpac.simply.imp": { + source: "iana", + extensions: ["imp"] + }, + "application/vnd.acm.addressxfer+json": { + source: "iana", + compressible: true + }, + "application/vnd.acm.chatbot+json": { + source: "iana", + compressible: true + }, + "application/vnd.acucobol": { + source: "iana", + extensions: ["acu"] + }, + "application/vnd.acucorp": { + source: "iana", + extensions: ["atc", "acutc"] + }, + "application/vnd.adobe.air-application-installer-package+zip": { + source: "apache", + compressible: false, + extensions: ["air"] + }, + "application/vnd.adobe.flash.movie": { + source: "iana" + }, + "application/vnd.adobe.formscentral.fcdt": { + source: "iana", + extensions: ["fcdt"] + }, + "application/vnd.adobe.fxp": { + source: "iana", + extensions: ["fxp", "fxpl"] + }, + "application/vnd.adobe.partial-upload": { + source: "iana" + }, + "application/vnd.adobe.xdp+xml": { + source: "iana", + compressible: true, + extensions: ["xdp"] + }, + "application/vnd.adobe.xfdf": { + source: "apache", + extensions: ["xfdf"] + }, + "application/vnd.aether.imp": { + source: "iana" + }, + "application/vnd.afpc.afplinedata": { + source: "iana" + }, + "application/vnd.afpc.afplinedata-pagedef": { + source: "iana" + }, + "application/vnd.afpc.cmoca-cmresource": { + source: "iana" + }, + "application/vnd.afpc.foca-charset": { + source: "iana" + }, + "application/vnd.afpc.foca-codedfont": { + source: "iana" + }, + "application/vnd.afpc.foca-codepage": { + source: "iana" + }, + "application/vnd.afpc.modca": { + source: "iana" + }, + "application/vnd.afpc.modca-cmtable": { + source: "iana" + }, + "application/vnd.afpc.modca-formdef": { + source: "iana" + }, + "application/vnd.afpc.modca-mediummap": { + source: "iana" + }, + "application/vnd.afpc.modca-objectcontainer": { + source: "iana" + }, + "application/vnd.afpc.modca-overlay": { + source: "iana" + }, + "application/vnd.afpc.modca-pagesegment": { + source: "iana" + }, + "application/vnd.age": { + source: "iana", + extensions: ["age"] + }, + "application/vnd.ah-barcode": { + source: "apache" + }, + "application/vnd.ahead.space": { + source: "iana", + extensions: ["ahead"] + }, + "application/vnd.airzip.filesecure.azf": { + source: "iana", + extensions: ["azf"] + }, + "application/vnd.airzip.filesecure.azs": { + source: "iana", + extensions: ["azs"] + }, + "application/vnd.amadeus+json": { + source: "iana", + compressible: true + }, + "application/vnd.amazon.ebook": { + source: "apache", + extensions: ["azw"] + }, + "application/vnd.amazon.mobi8-ebook": { + source: "iana" + }, + "application/vnd.americandynamics.acc": { + source: "iana", + extensions: ["acc"] + }, + "application/vnd.amiga.ami": { + source: "iana", + extensions: ["ami"] + }, + "application/vnd.amundsen.maze+xml": { + source: "iana", + compressible: true + }, + "application/vnd.android.ota": { + source: "iana" + }, + "application/vnd.android.package-archive": { + source: "apache", + compressible: false, + extensions: ["apk"] + }, + "application/vnd.anki": { + source: "iana" + }, + "application/vnd.anser-web-certificate-issue-initiation": { + source: "iana", + extensions: ["cii"] + }, + "application/vnd.anser-web-funds-transfer-initiation": { + source: "apache", + extensions: ["fti"] + }, + "application/vnd.antix.game-component": { + source: "iana", + extensions: ["atx"] + }, + "application/vnd.apache.arrow.file": { + source: "iana" + }, + "application/vnd.apache.arrow.stream": { + source: "iana" + }, + "application/vnd.apache.parquet": { + source: "iana" + }, + "application/vnd.apache.thrift.binary": { + source: "iana" + }, + "application/vnd.apache.thrift.compact": { + source: "iana" + }, + "application/vnd.apache.thrift.json": { + source: "iana" + }, + "application/vnd.apexlang": { + source: "iana" + }, + "application/vnd.api+json": { + source: "iana", + compressible: true + }, + "application/vnd.aplextor.warrp+json": { + source: "iana", + compressible: true + }, + "application/vnd.apothekende.reservation+json": { + source: "iana", + compressible: true + }, + "application/vnd.apple.installer+xml": { + source: "iana", + compressible: true, + extensions: ["mpkg"] + }, + "application/vnd.apple.keynote": { + source: "iana", + extensions: ["key"] + }, + "application/vnd.apple.mpegurl": { + source: "iana", + extensions: ["m3u8"] + }, + "application/vnd.apple.numbers": { + source: "iana", + extensions: ["numbers"] + }, + "application/vnd.apple.pages": { + source: "iana", + extensions: ["pages"] + }, + "application/vnd.apple.pkpass": { + compressible: false, + extensions: ["pkpass"] + }, + "application/vnd.arastra.swi": { + source: "apache" + }, + "application/vnd.aristanetworks.swi": { + source: "iana", + extensions: ["swi"] + }, + "application/vnd.artisan+json": { + source: "iana", + compressible: true + }, + "application/vnd.artsquare": { + source: "iana" + }, + "application/vnd.astraea-software.iota": { + source: "iana", + extensions: ["iota"] + }, + "application/vnd.audiograph": { + source: "iana", + extensions: ["aep"] + }, + "application/vnd.autodesk.fbx": { + extensions: ["fbx"] + }, + "application/vnd.autopackage": { + source: "iana" + }, + "application/vnd.avalon+json": { + source: "iana", + compressible: true + }, + "application/vnd.avistar+xml": { + source: "iana", + compressible: true + }, + "application/vnd.balsamiq.bmml+xml": { + source: "iana", + compressible: true, + extensions: ["bmml"] + }, + "application/vnd.balsamiq.bmpr": { + source: "iana" + }, + "application/vnd.banana-accounting": { + source: "iana" + }, + "application/vnd.bbf.usp.error": { + source: "iana" + }, + "application/vnd.bbf.usp.msg": { + source: "iana" + }, + "application/vnd.bbf.usp.msg+json": { + source: "iana", + compressible: true + }, + "application/vnd.bekitzur-stech+json": { + source: "iana", + compressible: true + }, + "application/vnd.belightsoft.lhzd+zip": { + source: "iana", + compressible: false + }, + "application/vnd.belightsoft.lhzl+zip": { + source: "iana", + compressible: false + }, + "application/vnd.bint.med-content": { + source: "iana" + }, + "application/vnd.biopax.rdf+xml": { + source: "iana", + compressible: true + }, + "application/vnd.blink-idb-value-wrapper": { + source: "iana" + }, + "application/vnd.blueice.multipass": { + source: "iana", + extensions: ["mpm"] + }, + "application/vnd.bluetooth.ep.oob": { + source: "iana" + }, + "application/vnd.bluetooth.le.oob": { + source: "iana" + }, + "application/vnd.bmi": { + source: "iana", + extensions: ["bmi"] + }, + "application/vnd.bpf": { + source: "iana" + }, + "application/vnd.bpf3": { + source: "iana" + }, + "application/vnd.businessobjects": { + source: "iana", + extensions: ["rep"] + }, + "application/vnd.byu.uapi+json": { + source: "iana", + compressible: true + }, + "application/vnd.bzip3": { + source: "iana" + }, + "application/vnd.c3voc.schedule+xml": { + source: "iana", + compressible: true + }, + "application/vnd.cab-jscript": { + source: "iana" + }, + "application/vnd.canon-cpdl": { + source: "iana" + }, + "application/vnd.canon-lips": { + source: "iana" + }, + "application/vnd.capasystems-pg+json": { + source: "iana", + compressible: true + }, + "application/vnd.cendio.thinlinc.clientconf": { + source: "iana" + }, + "application/vnd.century-systems.tcp_stream": { + source: "iana" + }, + "application/vnd.chemdraw+xml": { + source: "iana", + compressible: true, + extensions: ["cdxml"] + }, + "application/vnd.chess-pgn": { + source: "iana" + }, + "application/vnd.chipnuts.karaoke-mmd": { + source: "iana", + extensions: ["mmd"] + }, + "application/vnd.ciedi": { + source: "iana" + }, + "application/vnd.cinderella": { + source: "iana", + extensions: ["cdy"] + }, + "application/vnd.cirpack.isdn-ext": { + source: "iana" + }, + "application/vnd.citationstyles.style+xml": { + source: "iana", + compressible: true, + extensions: ["csl"] + }, + "application/vnd.claymore": { + source: "iana", + extensions: ["cla"] + }, + "application/vnd.cloanto.rp9": { + source: "iana", + extensions: ["rp9"] + }, + "application/vnd.clonk.c4group": { + source: "iana", + extensions: ["c4g", "c4d", "c4f", "c4p", "c4u"] + }, + "application/vnd.cluetrust.cartomobile-config": { + source: "iana", + extensions: ["c11amc"] + }, + "application/vnd.cluetrust.cartomobile-config-pkg": { + source: "iana", + extensions: ["c11amz"] + }, + "application/vnd.cncf.helm.chart.content.v1.tar+gzip": { + source: "iana" + }, + "application/vnd.cncf.helm.chart.provenance.v1.prov": { + source: "iana" + }, + "application/vnd.cncf.helm.config.v1+json": { + source: "iana", + compressible: true + }, + "application/vnd.coffeescript": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.document": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.document-template": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.presentation": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.presentation-template": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.spreadsheet": { + source: "iana" + }, + "application/vnd.collabio.xodocuments.spreadsheet-template": { + source: "iana" + }, + "application/vnd.collection+json": { + source: "iana", + compressible: true + }, + "application/vnd.collection.doc+json": { + source: "iana", + compressible: true + }, + "application/vnd.collection.next+json": { + source: "iana", + compressible: true + }, + "application/vnd.comicbook+zip": { + source: "iana", + compressible: false + }, + "application/vnd.comicbook-rar": { + source: "iana" + }, + "application/vnd.commerce-battelle": { + source: "iana" + }, + "application/vnd.commonspace": { + source: "iana", + extensions: ["csp"] + }, + "application/vnd.contact.cmsg": { + source: "iana", + extensions: ["cdbcmsg"] + }, + "application/vnd.coreos.ignition+json": { + source: "iana", + compressible: true + }, + "application/vnd.cosmocaller": { + source: "iana", + extensions: ["cmc"] + }, + "application/vnd.crick.clicker": { + source: "iana", + extensions: ["clkx"] + }, + "application/vnd.crick.clicker.keyboard": { + source: "iana", + extensions: ["clkk"] + }, + "application/vnd.crick.clicker.palette": { + source: "iana", + extensions: ["clkp"] + }, + "application/vnd.crick.clicker.template": { + source: "iana", + extensions: ["clkt"] + }, + "application/vnd.crick.clicker.wordbank": { + source: "iana", + extensions: ["clkw"] + }, + "application/vnd.criticaltools.wbs+xml": { + source: "iana", + compressible: true, + extensions: ["wbs"] + }, + "application/vnd.cryptii.pipe+json": { + source: "iana", + compressible: true + }, + "application/vnd.crypto-shade-file": { + source: "iana" + }, + "application/vnd.cryptomator.encrypted": { + source: "iana" + }, + "application/vnd.cryptomator.vault": { + source: "iana" + }, + "application/vnd.ctc-posml": { + source: "iana", + extensions: ["pml"] + }, + "application/vnd.ctct.ws+xml": { + source: "iana", + compressible: true + }, + "application/vnd.cups-pdf": { + source: "iana" + }, + "application/vnd.cups-postscript": { + source: "iana" + }, + "application/vnd.cups-ppd": { + source: "iana", + extensions: ["ppd"] + }, + "application/vnd.cups-raster": { + source: "iana" + }, + "application/vnd.cups-raw": { + source: "iana" + }, + "application/vnd.curl": { + source: "iana" + }, + "application/vnd.curl.car": { + source: "apache", + extensions: ["car"] + }, + "application/vnd.curl.pcurl": { + source: "apache", + extensions: ["pcurl"] + }, + "application/vnd.cyan.dean.root+xml": { + source: "iana", + compressible: true + }, + "application/vnd.cybank": { + source: "iana" + }, + "application/vnd.cyclonedx+json": { + source: "iana", + compressible: true + }, + "application/vnd.cyclonedx+xml": { + source: "iana", + compressible: true + }, + "application/vnd.d2l.coursepackage1p0+zip": { + source: "iana", + compressible: false + }, + "application/vnd.d3m-dataset": { + source: "iana" + }, + "application/vnd.d3m-problem": { + source: "iana" + }, + "application/vnd.dart": { + source: "iana", + compressible: true, + extensions: ["dart"] + }, + "application/vnd.data-vision.rdz": { + source: "iana", + extensions: ["rdz"] + }, + "application/vnd.datalog": { + source: "iana" + }, + "application/vnd.datapackage+json": { + source: "iana", + compressible: true + }, + "application/vnd.dataresource+json": { + source: "iana", + compressible: true + }, + "application/vnd.dbf": { + source: "iana", + extensions: ["dbf"] + }, + "application/vnd.dcmp+xml": { + source: "iana", + compressible: true, + extensions: ["dcmp"] + }, + "application/vnd.debian.binary-package": { + source: "iana" + }, + "application/vnd.dece.data": { + source: "iana", + extensions: ["uvf", "uvvf", "uvd", "uvvd"] + }, + "application/vnd.dece.ttml+xml": { + source: "iana", + compressible: true, + extensions: ["uvt", "uvvt"] + }, + "application/vnd.dece.unspecified": { + source: "iana", + extensions: ["uvx", "uvvx"] + }, + "application/vnd.dece.zip": { + source: "iana", + extensions: ["uvz", "uvvz"] + }, + "application/vnd.denovo.fcselayout-link": { + source: "iana", + extensions: ["fe_launch"] + }, + "application/vnd.desmume.movie": { + source: "iana" + }, + "application/vnd.dir-bi.plate-dl-nosuffix": { + source: "iana" + }, + "application/vnd.dm.delegation+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dna": { + source: "iana", + extensions: ["dna"] + }, + "application/vnd.document+json": { + source: "iana", + compressible: true + }, + "application/vnd.dolby.mlp": { + source: "apache", + extensions: ["mlp"] + }, + "application/vnd.dolby.mobile.1": { + source: "iana" + }, + "application/vnd.dolby.mobile.2": { + source: "iana" + }, + "application/vnd.doremir.scorecloud-binary-document": { + source: "iana" + }, + "application/vnd.dpgraph": { + source: "iana", + extensions: ["dpg"] + }, + "application/vnd.dreamfactory": { + source: "iana", + extensions: ["dfac"] + }, + "application/vnd.drive+json": { + source: "iana", + compressible: true + }, + "application/vnd.ds-keypoint": { + source: "apache", + extensions: ["kpxx"] + }, + "application/vnd.dtg.local": { + source: "iana" + }, + "application/vnd.dtg.local.flash": { + source: "iana" + }, + "application/vnd.dtg.local.html": { + source: "iana" + }, + "application/vnd.dvb.ait": { + source: "iana", + extensions: ["ait"] + }, + "application/vnd.dvb.dvbisl+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.dvbj": { + source: "iana" + }, + "application/vnd.dvb.esgcontainer": { + source: "iana" + }, + "application/vnd.dvb.ipdcdftnotifaccess": { + source: "iana" + }, + "application/vnd.dvb.ipdcesgaccess": { + source: "iana" + }, + "application/vnd.dvb.ipdcesgaccess2": { + source: "iana" + }, + "application/vnd.dvb.ipdcesgpdd": { + source: "iana" + }, + "application/vnd.dvb.ipdcroaming": { + source: "iana" + }, + "application/vnd.dvb.iptv.alfec-base": { + source: "iana" + }, + "application/vnd.dvb.iptv.alfec-enhancement": { + source: "iana" + }, + "application/vnd.dvb.notif-aggregate-root+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-container+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-generic+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-ia-msglist+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-ia-registration-request+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-ia-registration-response+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.notif-init+xml": { + source: "iana", + compressible: true + }, + "application/vnd.dvb.pfr": { + source: "iana" + }, + "application/vnd.dvb.service": { + source: "iana", + extensions: ["svc"] + }, + "application/vnd.dxr": { + source: "iana" + }, + "application/vnd.dynageo": { + source: "iana", + extensions: ["geo"] + }, + "application/vnd.dzr": { + source: "iana" + }, + "application/vnd.easykaraoke.cdgdownload": { + source: "iana" + }, + "application/vnd.ecdis-update": { + source: "iana" + }, + "application/vnd.ecip.rlp": { + source: "iana" + }, + "application/vnd.eclipse.ditto+json": { + source: "iana", + compressible: true + }, + "application/vnd.ecowin.chart": { + source: "iana", + extensions: ["mag"] + }, + "application/vnd.ecowin.filerequest": { + source: "iana" + }, + "application/vnd.ecowin.fileupdate": { + source: "iana" + }, + "application/vnd.ecowin.series": { + source: "iana" + }, + "application/vnd.ecowin.seriesrequest": { + source: "iana" + }, + "application/vnd.ecowin.seriesupdate": { + source: "iana" + }, + "application/vnd.efi.img": { + source: "iana" + }, + "application/vnd.efi.iso": { + source: "iana" + }, + "application/vnd.eln+zip": { + source: "iana", + compressible: false + }, + "application/vnd.emclient.accessrequest+xml": { + source: "iana", + compressible: true + }, + "application/vnd.enliven": { + source: "iana", + extensions: ["nml"] + }, + "application/vnd.enphase.envoy": { + source: "iana" + }, + "application/vnd.eprints.data+xml": { + source: "iana", + compressible: true + }, + "application/vnd.epson.esf": { + source: "iana", + extensions: ["esf"] + }, + "application/vnd.epson.msf": { + source: "iana", + extensions: ["msf"] + }, + "application/vnd.epson.quickanime": { + source: "iana", + extensions: ["qam"] + }, + "application/vnd.epson.salt": { + source: "iana", + extensions: ["slt"] + }, + "application/vnd.epson.ssf": { + source: "iana", + extensions: ["ssf"] + }, + "application/vnd.ericsson.quickcall": { + source: "iana" + }, + "application/vnd.erofs": { + source: "iana" + }, + "application/vnd.espass-espass+zip": { + source: "iana", + compressible: false + }, + "application/vnd.eszigno3+xml": { + source: "iana", + compressible: true, + extensions: ["es3", "et3"] + }, + "application/vnd.etsi.aoc+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.asic-e+zip": { + source: "iana", + compressible: false + }, + "application/vnd.etsi.asic-s+zip": { + source: "iana", + compressible: false + }, + "application/vnd.etsi.cug+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvcommand+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvdiscovery+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvprofile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvsad-bc+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvsad-cod+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvsad-npvr+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvservice+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvsync+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.iptvueprofile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.mcid+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.mheg5": { + source: "iana" + }, + "application/vnd.etsi.overload-control-policy-dataset+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.pstn+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.sci+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.simservs+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.timestamp-token": { + source: "iana" + }, + "application/vnd.etsi.tsl+xml": { + source: "iana", + compressible: true + }, + "application/vnd.etsi.tsl.der": { + source: "iana" + }, + "application/vnd.eu.kasparian.car+json": { + source: "iana", + compressible: true + }, + "application/vnd.eudora.data": { + source: "iana" + }, + "application/vnd.evolv.ecig.profile": { + source: "iana" + }, + "application/vnd.evolv.ecig.settings": { + source: "iana" + }, + "application/vnd.evolv.ecig.theme": { + source: "iana" + }, + "application/vnd.exstream-empower+zip": { + source: "iana", + compressible: false + }, + "application/vnd.exstream-package": { + source: "iana" + }, + "application/vnd.ezpix-album": { + source: "iana", + extensions: ["ez2"] + }, + "application/vnd.ezpix-package": { + source: "iana", + extensions: ["ez3"] + }, + "application/vnd.f-secure.mobile": { + source: "iana" + }, + "application/vnd.familysearch.gedcom+zip": { + source: "iana", + compressible: false + }, + "application/vnd.fastcopy-disk-image": { + source: "iana" + }, + "application/vnd.fdf": { + source: "apache", + extensions: ["fdf"] + }, + "application/vnd.fdsn.mseed": { + source: "iana", + extensions: ["mseed"] + }, + "application/vnd.fdsn.seed": { + source: "iana", + extensions: ["seed", "dataless"] + }, + "application/vnd.fdsn.stationxml+xml": { + source: "iana", + charset: "XML-BASED", + compressible: true + }, + "application/vnd.ffsns": { + source: "iana" + }, + "application/vnd.ficlab.flb+zip": { + source: "iana", + compressible: false + }, + "application/vnd.filmit.zfc": { + source: "iana" + }, + "application/vnd.fints": { + source: "iana" + }, + "application/vnd.firemonkeys.cloudcell": { + source: "iana" + }, + "application/vnd.flographit": { + source: "iana", + extensions: ["gph"] + }, + "application/vnd.fluxtime.clip": { + source: "iana", + extensions: ["ftc"] + }, + "application/vnd.font-fontforge-sfd": { + source: "iana" + }, + "application/vnd.framemaker": { + source: "iana", + extensions: ["fm", "frame", "maker", "book"] + }, + "application/vnd.freelog.comic": { + source: "iana" + }, + "application/vnd.frogans.fnc": { + source: "apache", + extensions: ["fnc"] + }, + "application/vnd.frogans.ltf": { + source: "apache", + extensions: ["ltf"] + }, + "application/vnd.fsc.weblaunch": { + source: "iana", + extensions: ["fsc"] + }, + "application/vnd.fujifilm.fb.docuworks": { + source: "iana" + }, + "application/vnd.fujifilm.fb.docuworks.binder": { + source: "iana" + }, + "application/vnd.fujifilm.fb.docuworks.container": { + source: "iana" + }, + "application/vnd.fujifilm.fb.jfi+xml": { + source: "iana", + compressible: true + }, + "application/vnd.fujitsu.oasys": { + source: "iana", + extensions: ["oas"] + }, + "application/vnd.fujitsu.oasys2": { + source: "iana", + extensions: ["oa2"] + }, + "application/vnd.fujitsu.oasys3": { + source: "iana", + extensions: ["oa3"] + }, + "application/vnd.fujitsu.oasysgp": { + source: "iana", + extensions: ["fg5"] + }, + "application/vnd.fujitsu.oasysprs": { + source: "iana", + extensions: ["bh2"] + }, + "application/vnd.fujixerox.art-ex": { + source: "iana" + }, + "application/vnd.fujixerox.art4": { + source: "iana" + }, + "application/vnd.fujixerox.ddd": { + source: "iana", + extensions: ["ddd"] + }, + "application/vnd.fujixerox.docuworks": { + source: "iana", + extensions: ["xdw"] + }, + "application/vnd.fujixerox.docuworks.binder": { + source: "iana", + extensions: ["xbd"] + }, + "application/vnd.fujixerox.docuworks.container": { + source: "iana" + }, + "application/vnd.fujixerox.hbpl": { + source: "iana" + }, + "application/vnd.fut-misnet": { + source: "iana" + }, + "application/vnd.futoin+cbor": { + source: "iana" + }, + "application/vnd.futoin+json": { + source: "iana", + compressible: true + }, + "application/vnd.fuzzysheet": { + source: "iana", + extensions: ["fzs"] + }, + "application/vnd.ga4gh.passport+jwt": { + source: "iana" + }, + "application/vnd.genomatix.tuxedo": { + source: "iana", + extensions: ["txd"] + }, + "application/vnd.genozip": { + source: "iana" + }, + "application/vnd.gentics.grd+json": { + source: "iana", + compressible: true + }, + "application/vnd.gentoo.catmetadata+xml": { + source: "iana", + compressible: true + }, + "application/vnd.gentoo.ebuild": { + source: "iana" + }, + "application/vnd.gentoo.eclass": { + source: "iana" + }, + "application/vnd.gentoo.gpkg": { + source: "iana" + }, + "application/vnd.gentoo.manifest": { + source: "iana" + }, + "application/vnd.gentoo.pkgmetadata+xml": { + source: "iana", + compressible: true + }, + "application/vnd.gentoo.xpak": { + source: "iana" + }, + "application/vnd.geo+json": { + source: "apache", + compressible: true + }, + "application/vnd.geocube+xml": { + source: "apache", + compressible: true + }, + "application/vnd.geogebra.file": { + source: "iana", + extensions: ["ggb"] + }, + "application/vnd.geogebra.pinboard": { + source: "iana" + }, + "application/vnd.geogebra.slides": { + source: "iana", + extensions: ["ggs"] + }, + "application/vnd.geogebra.tool": { + source: "iana", + extensions: ["ggt"] + }, + "application/vnd.geometry-explorer": { + source: "iana", + extensions: ["gex", "gre"] + }, + "application/vnd.geonext": { + source: "iana", + extensions: ["gxt"] + }, + "application/vnd.geoplan": { + source: "iana", + extensions: ["g2w"] + }, + "application/vnd.geospace": { + source: "iana", + extensions: ["g3w"] + }, + "application/vnd.gerber": { + source: "iana" + }, + "application/vnd.globalplatform.card-content-mgt": { + source: "iana" + }, + "application/vnd.globalplatform.card-content-mgt-response": { + source: "iana" + }, + "application/vnd.gmx": { + source: "iana", + extensions: ["gmx"] + }, + "application/vnd.gnu.taler.exchange+json": { + source: "iana", + compressible: true + }, + "application/vnd.gnu.taler.merchant+json": { + source: "iana", + compressible: true + }, + "application/vnd.google-apps.audio": {}, + "application/vnd.google-apps.document": { + compressible: false, + extensions: ["gdoc"] + }, + "application/vnd.google-apps.drawing": { + compressible: false, + extensions: ["gdraw"] + }, + "application/vnd.google-apps.drive-sdk": { + compressible: false + }, + "application/vnd.google-apps.file": {}, + "application/vnd.google-apps.folder": { + compressible: false + }, + "application/vnd.google-apps.form": { + compressible: false, + extensions: ["gform"] + }, + "application/vnd.google-apps.fusiontable": {}, + "application/vnd.google-apps.jam": { + compressible: false, + extensions: ["gjam"] + }, + "application/vnd.google-apps.mail-layout": {}, + "application/vnd.google-apps.map": { + compressible: false, + extensions: ["gmap"] + }, + "application/vnd.google-apps.photo": {}, + "application/vnd.google-apps.presentation": { + compressible: false, + extensions: ["gslides"] + }, + "application/vnd.google-apps.script": { + compressible: false, + extensions: ["gscript"] + }, + "application/vnd.google-apps.shortcut": {}, + "application/vnd.google-apps.site": { + compressible: false, + extensions: ["gsite"] + }, + "application/vnd.google-apps.spreadsheet": { + compressible: false, + extensions: ["gsheet"] + }, + "application/vnd.google-apps.unknown": {}, + "application/vnd.google-apps.video": {}, + "application/vnd.google-earth.kml+xml": { + source: "iana", + compressible: true, + extensions: ["kml"] + }, + "application/vnd.google-earth.kmz": { + source: "iana", + compressible: false, + extensions: ["kmz"] + }, + "application/vnd.gov.sk.e-form+xml": { + source: "apache", + compressible: true + }, + "application/vnd.gov.sk.e-form+zip": { + source: "iana", + compressible: false + }, + "application/vnd.gov.sk.xmldatacontainer+xml": { + source: "iana", + compressible: true, + extensions: ["xdcf"] + }, + "application/vnd.gpxsee.map+xml": { + source: "iana", + compressible: true + }, + "application/vnd.grafeq": { + source: "iana", + extensions: ["gqf", "gqs"] + }, + "application/vnd.gridmp": { + source: "iana" + }, + "application/vnd.groove-account": { + source: "iana", + extensions: ["gac"] + }, + "application/vnd.groove-help": { + source: "iana", + extensions: ["ghf"] + }, + "application/vnd.groove-identity-message": { + source: "iana", + extensions: ["gim"] + }, + "application/vnd.groove-injector": { + source: "iana", + extensions: ["grv"] + }, + "application/vnd.groove-tool-message": { + source: "iana", + extensions: ["gtm"] + }, + "application/vnd.groove-tool-template": { + source: "iana", + extensions: ["tpl"] + }, + "application/vnd.groove-vcard": { + source: "iana", + extensions: ["vcg"] + }, + "application/vnd.hal+json": { + source: "iana", + compressible: true + }, + "application/vnd.hal+xml": { + source: "iana", + compressible: true, + extensions: ["hal"] + }, + "application/vnd.handheld-entertainment+xml": { + source: "iana", + compressible: true, + extensions: ["zmm"] + }, + "application/vnd.hbci": { + source: "iana", + extensions: ["hbci"] + }, + "application/vnd.hc+json": { + source: "iana", + compressible: true + }, + "application/vnd.hcl-bireports": { + source: "iana" + }, + "application/vnd.hdt": { + source: "iana" + }, + "application/vnd.heroku+json": { + source: "iana", + compressible: true + }, + "application/vnd.hhe.lesson-player": { + source: "iana", + extensions: ["les"] + }, + "application/vnd.hp-hpgl": { + source: "iana", + extensions: ["hpgl"] + }, + "application/vnd.hp-hpid": { + source: "iana", + extensions: ["hpid"] + }, + "application/vnd.hp-hps": { + source: "iana", + extensions: ["hps"] + }, + "application/vnd.hp-jlyt": { + source: "iana", + extensions: ["jlt"] + }, + "application/vnd.hp-pcl": { + source: "iana", + extensions: ["pcl"] + }, + "application/vnd.hp-pclxl": { + source: "iana", + extensions: ["pclxl"] + }, + "application/vnd.hsl": { + source: "iana" + }, + "application/vnd.httphone": { + source: "iana" + }, + "application/vnd.hydrostatix.sof-data": { + source: "iana", + extensions: ["sfd-hdstx"] + }, + "application/vnd.hyper+json": { + source: "iana", + compressible: true + }, + "application/vnd.hyper-item+json": { + source: "iana", + compressible: true + }, + "application/vnd.hyperdrive+json": { + source: "iana", + compressible: true + }, + "application/vnd.hzn-3d-crossword": { + source: "iana" + }, + "application/vnd.ibm.afplinedata": { + source: "apache" + }, + "application/vnd.ibm.electronic-media": { + source: "iana" + }, + "application/vnd.ibm.minipay": { + source: "iana", + extensions: ["mpy"] + }, + "application/vnd.ibm.modcap": { + source: "apache", + extensions: ["afp", "listafp", "list3820"] + }, + "application/vnd.ibm.rights-management": { + source: "iana", + extensions: ["irm"] + }, + "application/vnd.ibm.secure-container": { + source: "iana", + extensions: ["sc"] + }, + "application/vnd.iccprofile": { + source: "iana", + extensions: ["icc", "icm"] + }, + "application/vnd.ieee.1905": { + source: "iana" + }, + "application/vnd.igloader": { + source: "iana", + extensions: ["igl"] + }, + "application/vnd.imagemeter.folder+zip": { + source: "iana", + compressible: false + }, + "application/vnd.imagemeter.image+zip": { + source: "iana", + compressible: false + }, + "application/vnd.immervision-ivp": { + source: "iana", + extensions: ["ivp"] + }, + "application/vnd.immervision-ivu": { + source: "iana", + extensions: ["ivu"] + }, + "application/vnd.ims.imsccv1p1": { + source: "iana" + }, + "application/vnd.ims.imsccv1p2": { + source: "iana" + }, + "application/vnd.ims.imsccv1p3": { + source: "iana" + }, + "application/vnd.ims.lis.v2.result+json": { + source: "iana", + compressible: true + }, + "application/vnd.ims.lti.v2.toolconsumerprofile+json": { + source: "iana", + compressible: true + }, + "application/vnd.ims.lti.v2.toolproxy+json": { + source: "iana", + compressible: true + }, + "application/vnd.ims.lti.v2.toolproxy.id+json": { + source: "iana", + compressible: true + }, + "application/vnd.ims.lti.v2.toolsettings+json": { + source: "iana", + compressible: true + }, + "application/vnd.ims.lti.v2.toolsettings.simple+json": { + source: "iana", + compressible: true + }, + "application/vnd.informedcontrol.rms+xml": { + source: "iana", + compressible: true + }, + "application/vnd.informix-visionary": { + source: "apache" + }, + "application/vnd.infotech.project": { + source: "iana" + }, + "application/vnd.infotech.project+xml": { + source: "iana", + compressible: true + }, + "application/vnd.innopath.wamp.notification": { + source: "iana" + }, + "application/vnd.insors.igm": { + source: "iana", + extensions: ["igm"] + }, + "application/vnd.intercon.formnet": { + source: "iana", + extensions: ["xpw", "xpx"] + }, + "application/vnd.intergeo": { + source: "iana", + extensions: ["i2g"] + }, + "application/vnd.intertrust.digibox": { + source: "iana" + }, + "application/vnd.intertrust.nncp": { + source: "iana" + }, + "application/vnd.intu.qbo": { + source: "iana", + extensions: ["qbo"] + }, + "application/vnd.intu.qfx": { + source: "iana", + extensions: ["qfx"] + }, + "application/vnd.ipfs.ipns-record": { + source: "iana" + }, + "application/vnd.ipld.car": { + source: "iana" + }, + "application/vnd.ipld.dag-cbor": { + source: "iana" + }, + "application/vnd.ipld.dag-json": { + source: "iana" + }, + "application/vnd.ipld.raw": { + source: "iana" + }, + "application/vnd.iptc.g2.catalogitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.conceptitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.knowledgeitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.newsitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.newsmessage+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.packageitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.iptc.g2.planningitem+xml": { + source: "iana", + compressible: true + }, + "application/vnd.ipunplugged.rcprofile": { + source: "iana", + extensions: ["rcprofile"] + }, + "application/vnd.irepository.package+xml": { + source: "iana", + compressible: true, + extensions: ["irp"] + }, + "application/vnd.is-xpr": { + source: "iana", + extensions: ["xpr"] + }, + "application/vnd.isac.fcs": { + source: "iana", + extensions: ["fcs"] + }, + "application/vnd.iso11783-10+zip": { + source: "iana", + compressible: false + }, + "application/vnd.jam": { + source: "iana", + extensions: ["jam"] + }, + "application/vnd.japannet-directory-service": { + source: "iana" + }, + "application/vnd.japannet-jpnstore-wakeup": { + source: "iana" + }, + "application/vnd.japannet-payment-wakeup": { + source: "iana" + }, + "application/vnd.japannet-registration": { + source: "iana" + }, + "application/vnd.japannet-registration-wakeup": { + source: "iana" + }, + "application/vnd.japannet-setstore-wakeup": { + source: "iana" + }, + "application/vnd.japannet-verification": { + source: "iana" + }, + "application/vnd.japannet-verification-wakeup": { + source: "iana" + }, + "application/vnd.jcp.javame.midlet-rms": { + source: "iana", + extensions: ["rms"] + }, + "application/vnd.jisp": { + source: "iana", + extensions: ["jisp"] + }, + "application/vnd.joost.joda-archive": { + source: "iana", + extensions: ["joda"] + }, + "application/vnd.jsk.isdn-ngn": { + source: "iana" + }, + "application/vnd.kahootz": { + source: "iana", + extensions: ["ktz", "ktr"] + }, + "application/vnd.kde.karbon": { + source: "iana", + extensions: ["karbon"] + }, + "application/vnd.kde.kchart": { + source: "iana", + extensions: ["chrt"] + }, + "application/vnd.kde.kformula": { + source: "iana", + extensions: ["kfo"] + }, + "application/vnd.kde.kivio": { + source: "iana", + extensions: ["flw"] + }, + "application/vnd.kde.kontour": { + source: "iana", + extensions: ["kon"] + }, + "application/vnd.kde.kpresenter": { + source: "iana", + extensions: ["kpr", "kpt"] + }, + "application/vnd.kde.kspread": { + source: "iana", + extensions: ["ksp"] + }, + "application/vnd.kde.kword": { + source: "iana", + extensions: ["kwd", "kwt"] + }, + "application/vnd.kdl": { + source: "iana" + }, + "application/vnd.kenameaapp": { + source: "iana", + extensions: ["htke"] + }, + "application/vnd.keyman.kmp+zip": { + source: "iana", + compressible: false + }, + "application/vnd.keyman.kmx": { + source: "iana" + }, + "application/vnd.kidspiration": { + source: "iana", + extensions: ["kia"] + }, + "application/vnd.kinar": { + source: "iana", + extensions: ["kne", "knp"] + }, + "application/vnd.koan": { + source: "iana", + extensions: ["skp", "skd", "skt", "skm"] + }, + "application/vnd.kodak-descriptor": { + source: "iana", + extensions: ["sse"] + }, + "application/vnd.las": { + source: "iana" + }, + "application/vnd.las.las+json": { + source: "iana", + compressible: true + }, + "application/vnd.las.las+xml": { + source: "iana", + compressible: true, + extensions: ["lasxml"] + }, + "application/vnd.laszip": { + source: "iana" + }, + "application/vnd.ldev.productlicensing": { + source: "iana" + }, + "application/vnd.leap+json": { + source: "iana", + compressible: true + }, + "application/vnd.liberty-request+xml": { + source: "iana", + compressible: true + }, + "application/vnd.llamagraphics.life-balance.desktop": { + source: "iana", + extensions: ["lbd"] + }, + "application/vnd.llamagraphics.life-balance.exchange+xml": { + source: "iana", + compressible: true, + extensions: ["lbe"] + }, + "application/vnd.logipipe.circuit+zip": { + source: "iana", + compressible: false + }, + "application/vnd.loom": { + source: "iana" + }, + "application/vnd.lotus-1-2-3": { + source: "iana", + extensions: ["123"] + }, + "application/vnd.lotus-approach": { + source: "iana", + extensions: ["apr"] + }, + "application/vnd.lotus-freelance": { + source: "iana", + extensions: ["pre"] + }, + "application/vnd.lotus-notes": { + source: "iana", + extensions: ["nsf"] + }, + "application/vnd.lotus-organizer": { + source: "iana", + extensions: ["org"] + }, + "application/vnd.lotus-screencam": { + source: "iana", + extensions: ["scm"] + }, + "application/vnd.lotus-wordpro": { + source: "iana", + extensions: ["lwp"] + }, + "application/vnd.macports.portpkg": { + source: "iana", + extensions: ["portpkg"] + }, + "application/vnd.mapbox-vector-tile": { + source: "iana", + extensions: ["mvt"] + }, + "application/vnd.marlin.drm.actiontoken+xml": { + source: "iana", + compressible: true + }, + "application/vnd.marlin.drm.conftoken+xml": { + source: "iana", + compressible: true + }, + "application/vnd.marlin.drm.license+xml": { + source: "iana", + compressible: true + }, + "application/vnd.marlin.drm.mdcf": { + source: "iana" + }, + "application/vnd.mason+json": { + source: "iana", + compressible: true + }, + "application/vnd.maxar.archive.3tz+zip": { + source: "iana", + compressible: false + }, + "application/vnd.maxmind.maxmind-db": { + source: "iana" + }, + "application/vnd.mcd": { + source: "iana", + extensions: ["mcd"] + }, + "application/vnd.mdl": { + source: "iana" + }, + "application/vnd.mdl-mbsdf": { + source: "iana" + }, + "application/vnd.medcalcdata": { + source: "iana", + extensions: ["mc1"] + }, + "application/vnd.mediastation.cdkey": { + source: "iana", + extensions: ["cdkey"] + }, + "application/vnd.medicalholodeck.recordxr": { + source: "iana" + }, + "application/vnd.meridian-slingshot": { + source: "iana" + }, + "application/vnd.mermaid": { + source: "iana" + }, + "application/vnd.mfer": { + source: "iana", + extensions: ["mwf"] + }, + "application/vnd.mfmp": { + source: "iana", + extensions: ["mfm"] + }, + "application/vnd.micro+json": { + source: "iana", + compressible: true + }, + "application/vnd.micrografx.flo": { + source: "iana", + extensions: ["flo"] + }, + "application/vnd.micrografx.igx": { + source: "iana", + extensions: ["igx"] + }, + "application/vnd.microsoft.portable-executable": { + source: "iana" + }, + "application/vnd.microsoft.windows.thumbnail-cache": { + source: "iana" + }, + "application/vnd.miele+json": { + source: "iana", + compressible: true + }, + "application/vnd.mif": { + source: "iana", + extensions: ["mif"] + }, + "application/vnd.minisoft-hp3000-save": { + source: "iana" + }, + "application/vnd.mitsubishi.misty-guard.trustweb": { + source: "iana" + }, + "application/vnd.mobius.daf": { + source: "iana", + extensions: ["daf"] + }, + "application/vnd.mobius.dis": { + source: "iana", + extensions: ["dis"] + }, + "application/vnd.mobius.mbk": { + source: "iana", + extensions: ["mbk"] + }, + "application/vnd.mobius.mqy": { + source: "iana", + extensions: ["mqy"] + }, + "application/vnd.mobius.msl": { + source: "iana", + extensions: ["msl"] + }, + "application/vnd.mobius.plc": { + source: "iana", + extensions: ["plc"] + }, + "application/vnd.mobius.txf": { + source: "iana", + extensions: ["txf"] + }, + "application/vnd.modl": { + source: "iana" + }, + "application/vnd.mophun.application": { + source: "iana", + extensions: ["mpn"] + }, + "application/vnd.mophun.certificate": { + source: "iana", + extensions: ["mpc"] + }, + "application/vnd.motorola.flexsuite": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.adsi": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.fis": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.gotap": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.kmr": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.ttc": { + source: "iana" + }, + "application/vnd.motorola.flexsuite.wem": { + source: "iana" + }, + "application/vnd.motorola.iprm": { + source: "iana" + }, + "application/vnd.mozilla.xul+xml": { + source: "iana", + compressible: true, + extensions: ["xul"] + }, + "application/vnd.ms-3mfdocument": { + source: "iana" + }, + "application/vnd.ms-artgalry": { + source: "iana", + extensions: ["cil"] + }, + "application/vnd.ms-asf": { + source: "iana" + }, + "application/vnd.ms-cab-compressed": { + source: "iana", + extensions: ["cab"] + }, + "application/vnd.ms-color.iccprofile": { + source: "apache" + }, + "application/vnd.ms-excel": { + source: "iana", + compressible: false, + extensions: ["xls", "xlm", "xla", "xlc", "xlt", "xlw"] + }, + "application/vnd.ms-excel.addin.macroenabled.12": { + source: "iana", + extensions: ["xlam"] + }, + "application/vnd.ms-excel.sheet.binary.macroenabled.12": { + source: "iana", + extensions: ["xlsb"] + }, + "application/vnd.ms-excel.sheet.macroenabled.12": { + source: "iana", + extensions: ["xlsm"] + }, + "application/vnd.ms-excel.template.macroenabled.12": { + source: "iana", + extensions: ["xltm"] + }, + "application/vnd.ms-fontobject": { + source: "iana", + compressible: true, + extensions: ["eot"] + }, + "application/vnd.ms-htmlhelp": { + source: "iana", + extensions: ["chm"] + }, + "application/vnd.ms-ims": { + source: "iana", + extensions: ["ims"] + }, + "application/vnd.ms-lrm": { + source: "iana", + extensions: ["lrm"] + }, + "application/vnd.ms-office.activex+xml": { + source: "iana", + compressible: true + }, + "application/vnd.ms-officetheme": { + source: "iana", + extensions: ["thmx"] + }, + "application/vnd.ms-opentype": { + source: "apache", + compressible: true + }, + "application/vnd.ms-outlook": { + compressible: false, + extensions: ["msg"] + }, + "application/vnd.ms-package.obfuscated-opentype": { + source: "apache" + }, + "application/vnd.ms-pki.seccat": { + source: "apache", + extensions: ["cat"] + }, + "application/vnd.ms-pki.stl": { + source: "apache", + extensions: ["stl"] + }, + "application/vnd.ms-playready.initiator+xml": { + source: "iana", + compressible: true + }, + "application/vnd.ms-powerpoint": { + source: "iana", + compressible: false, + extensions: ["ppt", "pps", "pot"] + }, + "application/vnd.ms-powerpoint.addin.macroenabled.12": { + source: "iana", + extensions: ["ppam"] + }, + "application/vnd.ms-powerpoint.presentation.macroenabled.12": { + source: "iana", + extensions: ["pptm"] + }, + "application/vnd.ms-powerpoint.slide.macroenabled.12": { + source: "iana", + extensions: ["sldm"] + }, + "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { + source: "iana", + extensions: ["ppsm"] + }, + "application/vnd.ms-powerpoint.template.macroenabled.12": { + source: "iana", + extensions: ["potm"] + }, + "application/vnd.ms-printdevicecapabilities+xml": { + source: "iana", + compressible: true + }, + "application/vnd.ms-printing.printticket+xml": { + source: "apache", + compressible: true + }, + "application/vnd.ms-printschematicket+xml": { + source: "iana", + compressible: true + }, + "application/vnd.ms-project": { + source: "iana", + extensions: ["mpp", "mpt"] + }, + "application/vnd.ms-tnef": { + source: "iana" + }, + "application/vnd.ms-visio.viewer": { + extensions: ["vdx"] + }, + "application/vnd.ms-windows.devicepairing": { + source: "iana" + }, + "application/vnd.ms-windows.nwprinting.oob": { + source: "iana" + }, + "application/vnd.ms-windows.printerpairing": { + source: "iana" + }, + "application/vnd.ms-windows.wsd.oob": { + source: "iana" + }, + "application/vnd.ms-wmdrm.lic-chlg-req": { + source: "iana" + }, + "application/vnd.ms-wmdrm.lic-resp": { + source: "iana" + }, + "application/vnd.ms-wmdrm.meter-chlg-req": { + source: "iana" + }, + "application/vnd.ms-wmdrm.meter-resp": { + source: "iana" + }, + "application/vnd.ms-word.document.macroenabled.12": { + source: "iana", + extensions: ["docm"] + }, + "application/vnd.ms-word.template.macroenabled.12": { + source: "iana", + extensions: ["dotm"] + }, + "application/vnd.ms-works": { + source: "iana", + extensions: ["wps", "wks", "wcm", "wdb"] + }, + "application/vnd.ms-wpl": { + source: "iana", + extensions: ["wpl"] + }, + "application/vnd.ms-xpsdocument": { + source: "iana", + compressible: false, + extensions: ["xps"] + }, + "application/vnd.msa-disk-image": { + source: "iana" + }, + "application/vnd.mseq": { + source: "iana", + extensions: ["mseq"] + }, + "application/vnd.msgpack": { + source: "iana" + }, + "application/vnd.msign": { + source: "iana" + }, + "application/vnd.multiad.creator": { + source: "iana" + }, + "application/vnd.multiad.creator.cif": { + source: "iana" + }, + "application/vnd.music-niff": { + source: "iana" + }, + "application/vnd.musician": { + source: "iana", + extensions: ["mus"] + }, + "application/vnd.muvee.style": { + source: "iana", + extensions: ["msty"] + }, + "application/vnd.mynfc": { + source: "iana", + extensions: ["taglet"] + }, + "application/vnd.nacamar.ybrid+json": { + source: "iana", + compressible: true + }, + "application/vnd.nato.bindingdataobject+cbor": { + source: "iana" + }, + "application/vnd.nato.bindingdataobject+json": { + source: "iana", + compressible: true + }, + "application/vnd.nato.bindingdataobject+xml": { + source: "iana", + compressible: true, + extensions: ["bdo"] + }, + "application/vnd.nato.openxmlformats-package.iepd+zip": { + source: "iana", + compressible: false + }, + "application/vnd.ncd.control": { + source: "iana" + }, + "application/vnd.ncd.reference": { + source: "iana" + }, + "application/vnd.nearst.inv+json": { + source: "iana", + compressible: true + }, + "application/vnd.nebumind.line": { + source: "iana" + }, + "application/vnd.nervana": { + source: "iana" + }, + "application/vnd.netfpx": { + source: "iana" + }, + "application/vnd.neurolanguage.nlu": { + source: "iana", + extensions: ["nlu"] + }, + "application/vnd.nimn": { + source: "iana" + }, + "application/vnd.nintendo.nitro.rom": { + source: "iana" + }, + "application/vnd.nintendo.snes.rom": { + source: "iana" + }, + "application/vnd.nitf": { + source: "iana", + extensions: ["ntf", "nitf"] + }, + "application/vnd.noblenet-directory": { + source: "iana", + extensions: ["nnd"] + }, + "application/vnd.noblenet-sealer": { + source: "iana", + extensions: ["nns"] + }, + "application/vnd.noblenet-web": { + source: "iana", + extensions: ["nnw"] + }, + "application/vnd.nokia.catalogs": { + source: "iana" + }, + "application/vnd.nokia.conml+wbxml": { + source: "iana" + }, + "application/vnd.nokia.conml+xml": { + source: "iana", + compressible: true + }, + "application/vnd.nokia.iptv.config+xml": { + source: "iana", + compressible: true + }, + "application/vnd.nokia.isds-radio-presets": { + source: "iana" + }, + "application/vnd.nokia.landmark+wbxml": { + source: "iana" + }, + "application/vnd.nokia.landmark+xml": { + source: "iana", + compressible: true + }, + "application/vnd.nokia.landmarkcollection+xml": { + source: "iana", + compressible: true + }, + "application/vnd.nokia.n-gage.ac+xml": { + source: "iana", + compressible: true, + extensions: ["ac"] + }, + "application/vnd.nokia.n-gage.data": { + source: "iana", + extensions: ["ngdat"] + }, + "application/vnd.nokia.n-gage.symbian.install": { + source: "apache", + extensions: ["n-gage"] + }, + "application/vnd.nokia.ncd": { + source: "iana" + }, + "application/vnd.nokia.pcd+wbxml": { + source: "iana" + }, + "application/vnd.nokia.pcd+xml": { + source: "iana", + compressible: true + }, + "application/vnd.nokia.radio-preset": { + source: "iana", + extensions: ["rpst"] + }, + "application/vnd.nokia.radio-presets": { + source: "iana", + extensions: ["rpss"] + }, + "application/vnd.novadigm.edm": { + source: "iana", + extensions: ["edm"] + }, + "application/vnd.novadigm.edx": { + source: "iana", + extensions: ["edx"] + }, + "application/vnd.novadigm.ext": { + source: "iana", + extensions: ["ext"] + }, + "application/vnd.ntt-local.content-share": { + source: "iana" + }, + "application/vnd.ntt-local.file-transfer": { + source: "iana" + }, + "application/vnd.ntt-local.ogw_remote-access": { + source: "iana" + }, + "application/vnd.ntt-local.sip-ta_remote": { + source: "iana" + }, + "application/vnd.ntt-local.sip-ta_tcp_stream": { + source: "iana" + }, + "application/vnd.oai.workflows": { + source: "iana" + }, + "application/vnd.oai.workflows+json": { + source: "iana", + compressible: true + }, + "application/vnd.oai.workflows+yaml": { + source: "iana" + }, + "application/vnd.oasis.opendocument.base": { + source: "iana" + }, + "application/vnd.oasis.opendocument.chart": { + source: "iana", + extensions: ["odc"] + }, + "application/vnd.oasis.opendocument.chart-template": { + source: "iana", + extensions: ["otc"] + }, + "application/vnd.oasis.opendocument.database": { + source: "apache", + extensions: ["odb"] + }, + "application/vnd.oasis.opendocument.formula": { + source: "iana", + extensions: ["odf"] + }, + "application/vnd.oasis.opendocument.formula-template": { + source: "iana", + extensions: ["odft"] + }, + "application/vnd.oasis.opendocument.graphics": { + source: "iana", + compressible: false, + extensions: ["odg"] + }, + "application/vnd.oasis.opendocument.graphics-template": { + source: "iana", + extensions: ["otg"] + }, + "application/vnd.oasis.opendocument.image": { + source: "iana", + extensions: ["odi"] + }, + "application/vnd.oasis.opendocument.image-template": { + source: "iana", + extensions: ["oti"] + }, + "application/vnd.oasis.opendocument.presentation": { + source: "iana", + compressible: false, + extensions: ["odp"] + }, + "application/vnd.oasis.opendocument.presentation-template": { + source: "iana", + extensions: ["otp"] + }, + "application/vnd.oasis.opendocument.spreadsheet": { + source: "iana", + compressible: false, + extensions: ["ods"] + }, + "application/vnd.oasis.opendocument.spreadsheet-template": { + source: "iana", + extensions: ["ots"] + }, + "application/vnd.oasis.opendocument.text": { + source: "iana", + compressible: false, + extensions: ["odt"] + }, + "application/vnd.oasis.opendocument.text-master": { + source: "iana", + extensions: ["odm"] + }, + "application/vnd.oasis.opendocument.text-master-template": { + source: "iana" + }, + "application/vnd.oasis.opendocument.text-template": { + source: "iana", + extensions: ["ott"] + }, + "application/vnd.oasis.opendocument.text-web": { + source: "iana", + extensions: ["oth"] + }, + "application/vnd.obn": { + source: "iana" + }, + "application/vnd.ocf+cbor": { + source: "iana" + }, + "application/vnd.oci.image.manifest.v1+json": { + source: "iana", + compressible: true + }, + "application/vnd.oftn.l10n+json": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.contentaccessdownload+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.contentaccessstreaming+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.cspg-hexbinary": { + source: "iana" + }, + "application/vnd.oipf.dae.svg+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.dae.xhtml+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.mippvcontrolmessage+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.pae.gem": { + source: "iana" + }, + "application/vnd.oipf.spdiscovery+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.spdlist+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.ueprofile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oipf.userprofile+xml": { + source: "iana", + compressible: true + }, + "application/vnd.olpc-sugar": { + source: "iana", + extensions: ["xo"] + }, + "application/vnd.oma-scws-config": { + source: "iana" + }, + "application/vnd.oma-scws-http-request": { + source: "iana" + }, + "application/vnd.oma-scws-http-response": { + source: "iana" + }, + "application/vnd.oma.bcast.associated-procedure-parameter+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.bcast.drm-trigger+xml": { + source: "apache", + compressible: true + }, + "application/vnd.oma.bcast.imd+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.bcast.ltkm": { + source: "iana" + }, + "application/vnd.oma.bcast.notification+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.bcast.provisioningtrigger": { + source: "iana" + }, + "application/vnd.oma.bcast.sgboot": { + source: "iana" + }, + "application/vnd.oma.bcast.sgdd+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.bcast.sgdu": { + source: "iana" + }, + "application/vnd.oma.bcast.simple-symbol-container": { + source: "iana" + }, + "application/vnd.oma.bcast.smartcard-trigger+xml": { + source: "apache", + compressible: true + }, + "application/vnd.oma.bcast.sprov+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.bcast.stkm": { + source: "iana" + }, + "application/vnd.oma.cab-address-book+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.cab-feature-handler+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.cab-pcc+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.cab-subs-invite+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.cab-user-prefs+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.dcd": { + source: "iana" + }, + "application/vnd.oma.dcdc": { + source: "iana" + }, + "application/vnd.oma.dd2+xml": { + source: "iana", + compressible: true, + extensions: ["dd2"] + }, + "application/vnd.oma.drm.risd+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.group-usage-list+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.lwm2m+cbor": { + source: "iana" + }, + "application/vnd.oma.lwm2m+json": { + source: "iana", + compressible: true + }, + "application/vnd.oma.lwm2m+tlv": { + source: "iana" + }, + "application/vnd.oma.pal+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.poc.detailed-progress-report+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.poc.final-report+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.poc.groups+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.poc.invocation-descriptor+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.poc.optimized-progress-report+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.push": { + source: "iana" + }, + "application/vnd.oma.scidm.messages+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oma.xcap-directory+xml": { + source: "iana", + compressible: true + }, + "application/vnd.omads-email+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/vnd.omads-file+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/vnd.omads-folder+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/vnd.omaloc-supl-init": { + source: "iana" + }, + "application/vnd.onepager": { + source: "iana" + }, + "application/vnd.onepagertamp": { + source: "iana" + }, + "application/vnd.onepagertamx": { + source: "iana" + }, + "application/vnd.onepagertat": { + source: "iana" + }, + "application/vnd.onepagertatp": { + source: "iana" + }, + "application/vnd.onepagertatx": { + source: "iana" + }, + "application/vnd.onvif.metadata": { + source: "iana" + }, + "application/vnd.openblox.game+xml": { + source: "iana", + compressible: true, + extensions: ["obgx"] + }, + "application/vnd.openblox.game-binary": { + source: "iana" + }, + "application/vnd.openeye.oeb": { + source: "iana" + }, + "application/vnd.openofficeorg.extension": { + source: "apache", + extensions: ["oxt"] + }, + "application/vnd.openstreetmap.data+xml": { + source: "iana", + compressible: true, + extensions: ["osm"] + }, + "application/vnd.opentimestamps.ots": { + source: "iana" + }, + "application/vnd.openvpi.dspx+json": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.custom-properties+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawing+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.extended-properties+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.presentation": { + source: "iana", + compressible: false, + extensions: ["pptx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slide": { + source: "iana", + extensions: ["sldx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { + source: "iana", + extensions: ["ppsx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.template": { + source: "iana", + extensions: ["potx"] + }, + "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { + source: "iana", + compressible: false, + extensions: ["xlsx"] + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { + source: "iana", + extensions: ["xltx"] + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.theme+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.themeoverride+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.vmldrawing": { + source: "iana" + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { + source: "iana", + compressible: false, + extensions: ["docx"] + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { + source: "iana", + extensions: ["dotx"] + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-package.core-properties+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { + source: "iana", + compressible: true + }, + "application/vnd.openxmlformats-package.relationships+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oracle.resource+json": { + source: "iana", + compressible: true + }, + "application/vnd.orange.indata": { + source: "iana" + }, + "application/vnd.osa.netdeploy": { + source: "iana" + }, + "application/vnd.osgeo.mapguide.package": { + source: "iana", + extensions: ["mgp"] + }, + "application/vnd.osgi.bundle": { + source: "iana" + }, + "application/vnd.osgi.dp": { + source: "iana", + extensions: ["dp"] + }, + "application/vnd.osgi.subsystem": { + source: "iana", + extensions: ["esa"] + }, + "application/vnd.otps.ct-kip+xml": { + source: "iana", + compressible: true + }, + "application/vnd.oxli.countgraph": { + source: "iana" + }, + "application/vnd.pagerduty+json": { + source: "iana", + compressible: true + }, + "application/vnd.palm": { + source: "iana", + extensions: ["pdb", "pqa", "oprc"] + }, + "application/vnd.panoply": { + source: "iana" + }, + "application/vnd.paos.xml": { + source: "iana" + }, + "application/vnd.patentdive": { + source: "iana" + }, + "application/vnd.patientecommsdoc": { + source: "iana" + }, + "application/vnd.pawaafile": { + source: "iana", + extensions: ["paw"] + }, + "application/vnd.pcos": { + source: "iana" + }, + "application/vnd.pg.format": { + source: "iana", + extensions: ["str"] + }, + "application/vnd.pg.osasli": { + source: "iana", + extensions: ["ei6"] + }, + "application/vnd.piaccess.application-licence": { + source: "iana" + }, + "application/vnd.picsel": { + source: "iana", + extensions: ["efif"] + }, + "application/vnd.pmi.widget": { + source: "iana", + extensions: ["wg"] + }, + "application/vnd.poc.group-advertisement+xml": { + source: "iana", + compressible: true + }, + "application/vnd.pocketlearn": { + source: "iana", + extensions: ["plf"] + }, + "application/vnd.powerbuilder6": { + source: "iana", + extensions: ["pbd"] + }, + "application/vnd.powerbuilder6-s": { + source: "iana" + }, + "application/vnd.powerbuilder7": { + source: "iana" + }, + "application/vnd.powerbuilder7-s": { + source: "iana" + }, + "application/vnd.powerbuilder75": { + source: "iana" + }, + "application/vnd.powerbuilder75-s": { + source: "iana" + }, + "application/vnd.preminet": { + source: "iana" + }, + "application/vnd.previewsystems.box": { + source: "iana", + extensions: ["box"] + }, + "application/vnd.procrate.brushset": { + extensions: ["brushset"] + }, + "application/vnd.procreate.brush": { + extensions: ["brush"] + }, + "application/vnd.procreate.dream": { + extensions: ["drm"] + }, + "application/vnd.proteus.magazine": { + source: "iana", + extensions: ["mgz"] + }, + "application/vnd.psfs": { + source: "iana" + }, + "application/vnd.pt.mundusmundi": { + source: "iana" + }, + "application/vnd.publishare-delta-tree": { + source: "iana", + extensions: ["qps"] + }, + "application/vnd.pvi.ptid1": { + source: "iana", + extensions: ["ptid"] + }, + "application/vnd.pwg-multiplexed": { + source: "iana" + }, + "application/vnd.pwg-xhtml-print+xml": { + source: "iana", + compressible: true, + extensions: ["xhtm"] + }, + "application/vnd.qualcomm.brew-app-res": { + source: "iana" + }, + "application/vnd.quarantainenet": { + source: "iana" + }, + "application/vnd.quark.quarkxpress": { + source: "iana", + extensions: ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"] + }, + "application/vnd.quobject-quoxdocument": { + source: "iana" + }, + "application/vnd.radisys.moml+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-audit+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-audit-conf+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-audit-conn+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-audit-dialog+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-audit-stream+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-conf+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-base+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-fax-detect+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-group+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-speech+xml": { + source: "iana", + compressible: true + }, + "application/vnd.radisys.msml-dialog-transform+xml": { + source: "iana", + compressible: true + }, + "application/vnd.rainstor.data": { + source: "iana" + }, + "application/vnd.rapid": { + source: "iana" + }, + "application/vnd.rar": { + source: "iana", + extensions: ["rar"] + }, + "application/vnd.realvnc.bed": { + source: "iana", + extensions: ["bed"] + }, + "application/vnd.recordare.musicxml": { + source: "iana", + extensions: ["mxl"] + }, + "application/vnd.recordare.musicxml+xml": { + source: "iana", + compressible: true, + extensions: ["musicxml"] + }, + "application/vnd.relpipe": { + source: "iana" + }, + "application/vnd.renlearn.rlprint": { + source: "iana" + }, + "application/vnd.resilient.logic": { + source: "iana" + }, + "application/vnd.restful+json": { + source: "iana", + compressible: true + }, + "application/vnd.rig.cryptonote": { + source: "iana", + extensions: ["cryptonote"] + }, + "application/vnd.rim.cod": { + source: "apache", + extensions: ["cod"] + }, + "application/vnd.rn-realmedia": { + source: "apache", + extensions: ["rm"] + }, + "application/vnd.rn-realmedia-vbr": { + source: "apache", + extensions: ["rmvb"] + }, + "application/vnd.route66.link66+xml": { + source: "iana", + compressible: true, + extensions: ["link66"] + }, + "application/vnd.rs-274x": { + source: "iana" + }, + "application/vnd.ruckus.download": { + source: "iana" + }, + "application/vnd.s3sms": { + source: "iana" + }, + "application/vnd.sailingtracker.track": { + source: "iana", + extensions: ["st"] + }, + "application/vnd.sar": { + source: "iana" + }, + "application/vnd.sbm.cid": { + source: "iana" + }, + "application/vnd.sbm.mid2": { + source: "iana" + }, + "application/vnd.scribus": { + source: "iana" + }, + "application/vnd.sealed.3df": { + source: "iana" + }, + "application/vnd.sealed.csf": { + source: "iana" + }, + "application/vnd.sealed.doc": { + source: "iana" + }, + "application/vnd.sealed.eml": { + source: "iana" + }, + "application/vnd.sealed.mht": { + source: "iana" + }, + "application/vnd.sealed.net": { + source: "iana" + }, + "application/vnd.sealed.ppt": { + source: "iana" + }, + "application/vnd.sealed.tiff": { + source: "iana" + }, + "application/vnd.sealed.xls": { + source: "iana" + }, + "application/vnd.sealedmedia.softseal.html": { + source: "iana" + }, + "application/vnd.sealedmedia.softseal.pdf": { + source: "iana" + }, + "application/vnd.seemail": { + source: "iana", + extensions: ["see"] + }, + "application/vnd.seis+json": { + source: "iana", + compressible: true + }, + "application/vnd.sema": { + source: "iana", + extensions: ["sema"] + }, + "application/vnd.semd": { + source: "iana", + extensions: ["semd"] + }, + "application/vnd.semf": { + source: "iana", + extensions: ["semf"] + }, + "application/vnd.shade-save-file": { + source: "iana" + }, + "application/vnd.shana.informed.formdata": { + source: "iana", + extensions: ["ifm"] + }, + "application/vnd.shana.informed.formtemplate": { + source: "iana", + extensions: ["itp"] + }, + "application/vnd.shana.informed.interchange": { + source: "iana", + extensions: ["iif"] + }, + "application/vnd.shana.informed.package": { + source: "iana", + extensions: ["ipk"] + }, + "application/vnd.shootproof+json": { + source: "iana", + compressible: true + }, + "application/vnd.shopkick+json": { + source: "iana", + compressible: true + }, + "application/vnd.shp": { + source: "iana" + }, + "application/vnd.shx": { + source: "iana" + }, + "application/vnd.sigrok.session": { + source: "iana" + }, + "application/vnd.simtech-mindmapper": { + source: "iana", + extensions: ["twd", "twds"] + }, + "application/vnd.siren+json": { + source: "iana", + compressible: true + }, + "application/vnd.sketchometry": { + source: "iana" + }, + "application/vnd.smaf": { + source: "iana", + extensions: ["mmf"] + }, + "application/vnd.smart.notebook": { + source: "iana" + }, + "application/vnd.smart.teacher": { + source: "iana", + extensions: ["teacher"] + }, + "application/vnd.smintio.portals.archive": { + source: "iana" + }, + "application/vnd.snesdev-page-table": { + source: "iana" + }, + "application/vnd.software602.filler.form+xml": { + source: "iana", + compressible: true, + extensions: ["fo"] + }, + "application/vnd.software602.filler.form-xml-zip": { + source: "iana" + }, + "application/vnd.solent.sdkm+xml": { + source: "iana", + compressible: true, + extensions: ["sdkm", "sdkd"] + }, + "application/vnd.spotfire.dxp": { + source: "iana", + extensions: ["dxp"] + }, + "application/vnd.spotfire.sfs": { + source: "iana", + extensions: ["sfs"] + }, + "application/vnd.sqlite3": { + source: "iana" + }, + "application/vnd.sss-cod": { + source: "iana" + }, + "application/vnd.sss-dtf": { + source: "iana" + }, + "application/vnd.sss-ntf": { + source: "iana" + }, + "application/vnd.stardivision.calc": { + source: "apache", + extensions: ["sdc"] + }, + "application/vnd.stardivision.draw": { + source: "apache", + extensions: ["sda"] + }, + "application/vnd.stardivision.impress": { + source: "apache", + extensions: ["sdd"] + }, + "application/vnd.stardivision.math": { + source: "apache", + extensions: ["smf"] + }, + "application/vnd.stardivision.writer": { + source: "apache", + extensions: ["sdw", "vor"] + }, + "application/vnd.stardivision.writer-global": { + source: "apache", + extensions: ["sgl"] + }, + "application/vnd.stepmania.package": { + source: "iana", + extensions: ["smzip"] + }, + "application/vnd.stepmania.stepchart": { + source: "iana", + extensions: ["sm"] + }, + "application/vnd.street-stream": { + source: "iana" + }, + "application/vnd.sun.wadl+xml": { + source: "iana", + compressible: true, + extensions: ["wadl"] + }, + "application/vnd.sun.xml.calc": { + source: "apache", + extensions: ["sxc"] + }, + "application/vnd.sun.xml.calc.template": { + source: "apache", + extensions: ["stc"] + }, + "application/vnd.sun.xml.draw": { + source: "apache", + extensions: ["sxd"] + }, + "application/vnd.sun.xml.draw.template": { + source: "apache", + extensions: ["std"] + }, + "application/vnd.sun.xml.impress": { + source: "apache", + extensions: ["sxi"] + }, + "application/vnd.sun.xml.impress.template": { + source: "apache", + extensions: ["sti"] + }, + "application/vnd.sun.xml.math": { + source: "apache", + extensions: ["sxm"] + }, + "application/vnd.sun.xml.writer": { + source: "apache", + extensions: ["sxw"] + }, + "application/vnd.sun.xml.writer.global": { + source: "apache", + extensions: ["sxg"] + }, + "application/vnd.sun.xml.writer.template": { + source: "apache", + extensions: ["stw"] + }, + "application/vnd.sus-calendar": { + source: "iana", + extensions: ["sus", "susp"] + }, + "application/vnd.svd": { + source: "iana", + extensions: ["svd"] + }, + "application/vnd.swiftview-ics": { + source: "iana" + }, + "application/vnd.sybyl.mol2": { + source: "iana" + }, + "application/vnd.sycle+xml": { + source: "iana", + compressible: true + }, + "application/vnd.syft+json": { + source: "iana", + compressible: true + }, + "application/vnd.symbian.install": { + source: "apache", + extensions: ["sis", "sisx"] + }, + "application/vnd.syncml+xml": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["xsm"] + }, + "application/vnd.syncml.dm+wbxml": { + source: "iana", + charset: "UTF-8", + extensions: ["bdm"] + }, + "application/vnd.syncml.dm+xml": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["xdm"] + }, + "application/vnd.syncml.dm.notification": { + source: "iana" + }, + "application/vnd.syncml.dmddf+wbxml": { + source: "iana" + }, + "application/vnd.syncml.dmddf+xml": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["ddf"] + }, + "application/vnd.syncml.dmtnds+wbxml": { + source: "iana" + }, + "application/vnd.syncml.dmtnds+xml": { + source: "iana", + charset: "UTF-8", + compressible: true + }, + "application/vnd.syncml.ds.notification": { + source: "iana" + }, + "application/vnd.tableschema+json": { + source: "iana", + compressible: true + }, + "application/vnd.tao.intent-module-archive": { + source: "iana", + extensions: ["tao"] + }, + "application/vnd.tcpdump.pcap": { + source: "iana", + extensions: ["pcap", "cap", "dmp"] + }, + "application/vnd.think-cell.ppttc+json": { + source: "iana", + compressible: true + }, + "application/vnd.tmd.mediaflex.api+xml": { + source: "iana", + compressible: true + }, + "application/vnd.tml": { + source: "iana" + }, + "application/vnd.tmobile-livetv": { + source: "iana", + extensions: ["tmo"] + }, + "application/vnd.tri.onesource": { + source: "iana" + }, + "application/vnd.trid.tpt": { + source: "iana", + extensions: ["tpt"] + }, + "application/vnd.triscape.mxs": { + source: "iana", + extensions: ["mxs"] + }, + "application/vnd.trueapp": { + source: "iana", + extensions: ["tra"] + }, + "application/vnd.truedoc": { + source: "iana" + }, + "application/vnd.ubisoft.webplayer": { + source: "iana" + }, + "application/vnd.ufdl": { + source: "iana", + extensions: ["ufd", "ufdl"] + }, + "application/vnd.uic.osdm+json": { + source: "iana", + compressible: true + }, + "application/vnd.uiq.theme": { + source: "iana", + extensions: ["utz"] + }, + "application/vnd.umajin": { + source: "iana", + extensions: ["umj"] + }, + "application/vnd.unity": { + source: "iana", + extensions: ["unityweb"] + }, + "application/vnd.uoml+xml": { + source: "iana", + compressible: true, + extensions: ["uoml", "uo"] + }, + "application/vnd.uplanet.alert": { + source: "iana" + }, + "application/vnd.uplanet.alert-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.bearer-choice": { + source: "iana" + }, + "application/vnd.uplanet.bearer-choice-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.cacheop": { + source: "iana" + }, + "application/vnd.uplanet.cacheop-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.channel": { + source: "iana" + }, + "application/vnd.uplanet.channel-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.list": { + source: "iana" + }, + "application/vnd.uplanet.list-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.listcmd": { + source: "iana" + }, + "application/vnd.uplanet.listcmd-wbxml": { + source: "iana" + }, + "application/vnd.uplanet.signal": { + source: "iana" + }, + "application/vnd.uri-map": { + source: "iana" + }, + "application/vnd.valve.source.material": { + source: "iana" + }, + "application/vnd.vcx": { + source: "iana", + extensions: ["vcx"] + }, + "application/vnd.vd-study": { + source: "iana" + }, + "application/vnd.vectorworks": { + source: "iana" + }, + "application/vnd.vel+json": { + source: "iana", + compressible: true + }, + "application/vnd.veraison.tsm-report+cbor": { + source: "iana" + }, + "application/vnd.veraison.tsm-report+json": { + source: "iana", + compressible: true + }, + "application/vnd.verimatrix.vcas": { + source: "iana" + }, + "application/vnd.veritone.aion+json": { + source: "iana", + compressible: true + }, + "application/vnd.veryant.thin": { + source: "iana" + }, + "application/vnd.ves.encrypted": { + source: "iana" + }, + "application/vnd.vidsoft.vidconference": { + source: "iana" + }, + "application/vnd.visio": { + source: "iana", + extensions: ["vsd", "vst", "vss", "vsw", "vsdx", "vtx"] + }, + "application/vnd.visionary": { + source: "iana", + extensions: ["vis"] + }, + "application/vnd.vividence.scriptfile": { + source: "iana" + }, + "application/vnd.vocalshaper.vsp4": { + source: "iana" + }, + "application/vnd.vsf": { + source: "iana", + extensions: ["vsf"] + }, + "application/vnd.wap.sic": { + source: "iana" + }, + "application/vnd.wap.slc": { + source: "iana" + }, + "application/vnd.wap.wbxml": { + source: "iana", + charset: "UTF-8", + extensions: ["wbxml"] + }, + "application/vnd.wap.wmlc": { + source: "iana", + extensions: ["wmlc"] + }, + "application/vnd.wap.wmlscriptc": { + source: "iana", + extensions: ["wmlsc"] + }, + "application/vnd.wasmflow.wafl": { + source: "iana" + }, + "application/vnd.webturbo": { + source: "iana", + extensions: ["wtb"] + }, + "application/vnd.wfa.dpp": { + source: "iana" + }, + "application/vnd.wfa.p2p": { + source: "iana" + }, + "application/vnd.wfa.wsc": { + source: "iana" + }, + "application/vnd.windows.devicepairing": { + source: "iana" + }, + "application/vnd.wmc": { + source: "iana" + }, + "application/vnd.wmf.bootstrap": { + source: "iana" + }, + "application/vnd.wolfram.mathematica": { + source: "iana" + }, + "application/vnd.wolfram.mathematica.package": { + source: "iana" + }, + "application/vnd.wolfram.player": { + source: "iana", + extensions: ["nbp"] + }, + "application/vnd.wordlift": { + source: "iana" + }, + "application/vnd.wordperfect": { + source: "iana", + extensions: ["wpd"] + }, + "application/vnd.wqd": { + source: "iana", + extensions: ["wqd"] + }, + "application/vnd.wrq-hp3000-labelled": { + source: "iana" + }, + "application/vnd.wt.stf": { + source: "iana", + extensions: ["stf"] + }, + "application/vnd.wv.csp+wbxml": { + source: "iana" + }, + "application/vnd.wv.csp+xml": { + source: "iana", + compressible: true + }, + "application/vnd.wv.ssp+xml": { + source: "iana", + compressible: true + }, + "application/vnd.xacml+json": { + source: "iana", + compressible: true + }, + "application/vnd.xara": { + source: "iana", + extensions: ["xar"] + }, + "application/vnd.xarin.cpj": { + source: "iana" + }, + "application/vnd.xecrets-encrypted": { + source: "iana" + }, + "application/vnd.xfdl": { + source: "iana", + extensions: ["xfdl"] + }, + "application/vnd.xfdl.webform": { + source: "iana" + }, + "application/vnd.xmi+xml": { + source: "iana", + compressible: true + }, + "application/vnd.xmpie.cpkg": { + source: "iana" + }, + "application/vnd.xmpie.dpkg": { + source: "iana" + }, + "application/vnd.xmpie.plan": { + source: "iana" + }, + "application/vnd.xmpie.ppkg": { + source: "iana" + }, + "application/vnd.xmpie.xlim": { + source: "iana" + }, + "application/vnd.yamaha.hv-dic": { + source: "iana", + extensions: ["hvd"] + }, + "application/vnd.yamaha.hv-script": { + source: "iana", + extensions: ["hvs"] + }, + "application/vnd.yamaha.hv-voice": { + source: "iana", + extensions: ["hvp"] + }, + "application/vnd.yamaha.openscoreformat": { + source: "iana", + extensions: ["osf"] + }, + "application/vnd.yamaha.openscoreformat.osfpvg+xml": { + source: "iana", + compressible: true, + extensions: ["osfpvg"] + }, + "application/vnd.yamaha.remote-setup": { + source: "iana" + }, + "application/vnd.yamaha.smaf-audio": { + source: "iana", + extensions: ["saf"] + }, + "application/vnd.yamaha.smaf-phrase": { + source: "iana", + extensions: ["spf"] + }, + "application/vnd.yamaha.through-ngn": { + source: "iana" + }, + "application/vnd.yamaha.tunnel-udpencap": { + source: "iana" + }, + "application/vnd.yaoweme": { + source: "iana" + }, + "application/vnd.yellowriver-custom-menu": { + source: "iana", + extensions: ["cmp"] + }, + "application/vnd.zul": { + source: "iana", + extensions: ["zir", "zirz"] + }, + "application/vnd.zzazz.deck+xml": { + source: "iana", + compressible: true, + extensions: ["zaz"] + }, + "application/voicexml+xml": { + source: "iana", + compressible: true, + extensions: ["vxml"] + }, + "application/voucher-cms+json": { + source: "iana", + compressible: true + }, + "application/voucher-jws+json": { + source: "iana", + compressible: true + }, + "application/vp": { + source: "iana" + }, + "application/vp+cose": { + source: "iana" + }, + "application/vp+jwt": { + source: "iana" + }, + "application/vq-rtcpxr": { + source: "iana" + }, + "application/wasm": { + source: "iana", + compressible: true, + extensions: ["wasm"] + }, + "application/watcherinfo+xml": { + source: "iana", + compressible: true, + extensions: ["wif"] + }, + "application/webpush-options+json": { + source: "iana", + compressible: true + }, + "application/whoispp-query": { + source: "iana" + }, + "application/whoispp-response": { + source: "iana" + }, + "application/widget": { + source: "iana", + extensions: ["wgt"] + }, + "application/winhlp": { + source: "apache", + extensions: ["hlp"] + }, + "application/wita": { + source: "iana" + }, + "application/wordperfect5.1": { + source: "iana" + }, + "application/wsdl+xml": { + source: "iana", + compressible: true, + extensions: ["wsdl"] + }, + "application/wspolicy+xml": { + source: "iana", + compressible: true, + extensions: ["wspolicy"] + }, + "application/x-7z-compressed": { + source: "apache", + compressible: false, + extensions: ["7z"] + }, + "application/x-abiword": { + source: "apache", + extensions: ["abw"] + }, + "application/x-ace-compressed": { + source: "apache", + extensions: ["ace"] + }, + "application/x-amf": { + source: "apache" + }, + "application/x-apple-diskimage": { + source: "apache", + extensions: ["dmg"] + }, + "application/x-arj": { + compressible: false, + extensions: ["arj"] + }, + "application/x-authorware-bin": { + source: "apache", + extensions: ["aab", "x32", "u32", "vox"] + }, + "application/x-authorware-map": { + source: "apache", + extensions: ["aam"] + }, + "application/x-authorware-seg": { + source: "apache", + extensions: ["aas"] + }, + "application/x-bcpio": { + source: "apache", + extensions: ["bcpio"] + }, + "application/x-bdoc": { + compressible: false, + extensions: ["bdoc"] + }, + "application/x-bittorrent": { + source: "apache", + extensions: ["torrent"] + }, + "application/x-blender": { + extensions: ["blend"] + }, + "application/x-blorb": { + source: "apache", + extensions: ["blb", "blorb"] + }, + "application/x-bzip": { + source: "apache", + compressible: false, + extensions: ["bz"] + }, + "application/x-bzip2": { + source: "apache", + compressible: false, + extensions: ["bz2", "boz"] + }, + "application/x-cbr": { + source: "apache", + extensions: ["cbr", "cba", "cbt", "cbz", "cb7"] + }, + "application/x-cdlink": { + source: "apache", + extensions: ["vcd"] + }, + "application/x-cfs-compressed": { + source: "apache", + extensions: ["cfs"] + }, + "application/x-chat": { + source: "apache", + extensions: ["chat"] + }, + "application/x-chess-pgn": { + source: "apache", + extensions: ["pgn"] + }, + "application/x-chrome-extension": { + extensions: ["crx"] + }, + "application/x-cocoa": { + source: "nginx", + extensions: ["cco"] + }, + "application/x-compress": { + source: "apache" + }, + "application/x-compressed": { + extensions: ["rar"] + }, + "application/x-conference": { + source: "apache", + extensions: ["nsc"] + }, + "application/x-cpio": { + source: "apache", + extensions: ["cpio"] + }, + "application/x-csh": { + source: "apache", + extensions: ["csh"] + }, + "application/x-deb": { + compressible: false + }, + "application/x-debian-package": { + source: "apache", + extensions: ["deb", "udeb"] + }, + "application/x-dgc-compressed": { + source: "apache", + extensions: ["dgc"] + }, + "application/x-director": { + source: "apache", + extensions: ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"] + }, + "application/x-doom": { + source: "apache", + extensions: ["wad"] + }, + "application/x-dtbncx+xml": { + source: "apache", + compressible: true, + extensions: ["ncx"] + }, + "application/x-dtbook+xml": { + source: "apache", + compressible: true, + extensions: ["dtb"] + }, + "application/x-dtbresource+xml": { + source: "apache", + compressible: true, + extensions: ["res"] + }, + "application/x-dvi": { + source: "apache", + compressible: false, + extensions: ["dvi"] + }, + "application/x-envoy": { + source: "apache", + extensions: ["evy"] + }, + "application/x-eva": { + source: "apache", + extensions: ["eva"] + }, + "application/x-font-bdf": { + source: "apache", + extensions: ["bdf"] + }, + "application/x-font-dos": { + source: "apache" + }, + "application/x-font-framemaker": { + source: "apache" + }, + "application/x-font-ghostscript": { + source: "apache", + extensions: ["gsf"] + }, + "application/x-font-libgrx": { + source: "apache" + }, + "application/x-font-linux-psf": { + source: "apache", + extensions: ["psf"] + }, + "application/x-font-pcf": { + source: "apache", + extensions: ["pcf"] + }, + "application/x-font-snf": { + source: "apache", + extensions: ["snf"] + }, + "application/x-font-speedo": { + source: "apache" + }, + "application/x-font-sunos-news": { + source: "apache" + }, + "application/x-font-type1": { + source: "apache", + extensions: ["pfa", "pfb", "pfm", "afm"] + }, + "application/x-font-vfont": { + source: "apache" + }, + "application/x-freearc": { + source: "apache", + extensions: ["arc"] + }, + "application/x-futuresplash": { + source: "apache", + extensions: ["spl"] + }, + "application/x-gca-compressed": { + source: "apache", + extensions: ["gca"] + }, + "application/x-glulx": { + source: "apache", + extensions: ["ulx"] + }, + "application/x-gnumeric": { + source: "apache", + extensions: ["gnumeric"] + }, + "application/x-gramps-xml": { + source: "apache", + extensions: ["gramps"] + }, + "application/x-gtar": { + source: "apache", + extensions: ["gtar"] + }, + "application/x-gzip": { + source: "apache" + }, + "application/x-hdf": { + source: "apache", + extensions: ["hdf"] + }, + "application/x-httpd-php": { + compressible: true, + extensions: ["php"] + }, + "application/x-install-instructions": { + source: "apache", + extensions: ["install"] + }, + "application/x-ipynb+json": { + compressible: true, + extensions: ["ipynb"] + }, + "application/x-iso9660-image": { + source: "apache", + extensions: ["iso"] + }, + "application/x-iwork-keynote-sffkey": { + extensions: ["key"] + }, + "application/x-iwork-numbers-sffnumbers": { + extensions: ["numbers"] + }, + "application/x-iwork-pages-sffpages": { + extensions: ["pages"] + }, + "application/x-java-archive-diff": { + source: "nginx", + extensions: ["jardiff"] + }, + "application/x-java-jnlp-file": { + source: "apache", + compressible: false, + extensions: ["jnlp"] + }, + "application/x-javascript": { + compressible: true + }, + "application/x-keepass2": { + extensions: ["kdbx"] + }, + "application/x-latex": { + source: "apache", + compressible: false, + extensions: ["latex"] + }, + "application/x-lua-bytecode": { + extensions: ["luac"] + }, + "application/x-lzh-compressed": { + source: "apache", + extensions: ["lzh", "lha"] + }, + "application/x-makeself": { + source: "nginx", + extensions: ["run"] + }, + "application/x-mie": { + source: "apache", + extensions: ["mie"] + }, + "application/x-mobipocket-ebook": { + source: "apache", + extensions: ["prc", "mobi"] + }, + "application/x-mpegurl": { + compressible: false + }, + "application/x-ms-application": { + source: "apache", + extensions: ["application"] + }, + "application/x-ms-shortcut": { + source: "apache", + extensions: ["lnk"] + }, + "application/x-ms-wmd": { + source: "apache", + extensions: ["wmd"] + }, + "application/x-ms-wmz": { + source: "apache", + extensions: ["wmz"] + }, + "application/x-ms-xbap": { + source: "apache", + extensions: ["xbap"] + }, + "application/x-msaccess": { + source: "apache", + extensions: ["mdb"] + }, + "application/x-msbinder": { + source: "apache", + extensions: ["obd"] + }, + "application/x-mscardfile": { + source: "apache", + extensions: ["crd"] + }, + "application/x-msclip": { + source: "apache", + extensions: ["clp"] + }, + "application/x-msdos-program": { + extensions: ["exe"] + }, + "application/x-msdownload": { + source: "apache", + extensions: ["exe", "dll", "com", "bat", "msi"] + }, + "application/x-msmediaview": { + source: "apache", + extensions: ["mvb", "m13", "m14"] + }, + "application/x-msmetafile": { + source: "apache", + extensions: ["wmf", "wmz", "emf", "emz"] + }, + "application/x-msmoney": { + source: "apache", + extensions: ["mny"] + }, + "application/x-mspublisher": { + source: "apache", + extensions: ["pub"] + }, + "application/x-msschedule": { + source: "apache", + extensions: ["scd"] + }, + "application/x-msterminal": { + source: "apache", + extensions: ["trm"] + }, + "application/x-mswrite": { + source: "apache", + extensions: ["wri"] + }, + "application/x-netcdf": { + source: "apache", + extensions: ["nc", "cdf"] + }, + "application/x-ns-proxy-autoconfig": { + compressible: true, + extensions: ["pac"] + }, + "application/x-nzb": { + source: "apache", + extensions: ["nzb"] + }, + "application/x-perl": { + source: "nginx", + extensions: ["pl", "pm"] + }, + "application/x-pilot": { + source: "nginx", + extensions: ["prc", "pdb"] + }, + "application/x-pkcs12": { + source: "apache", + compressible: false, + extensions: ["p12", "pfx"] + }, + "application/x-pkcs7-certificates": { + source: "apache", + extensions: ["p7b", "spc"] + }, + "application/x-pkcs7-certreqresp": { + source: "apache", + extensions: ["p7r"] + }, + "application/x-pki-message": { + source: "iana" + }, + "application/x-rar-compressed": { + source: "apache", + compressible: false, + extensions: ["rar"] + }, + "application/x-redhat-package-manager": { + source: "nginx", + extensions: ["rpm"] + }, + "application/x-research-info-systems": { + source: "apache", + extensions: ["ris"] + }, + "application/x-sea": { + source: "nginx", + extensions: ["sea"] + }, + "application/x-sh": { + source: "apache", + compressible: true, + extensions: ["sh"] + }, + "application/x-shar": { + source: "apache", + extensions: ["shar"] + }, + "application/x-shockwave-flash": { + source: "apache", + compressible: false, + extensions: ["swf"] + }, + "application/x-silverlight-app": { + source: "apache", + extensions: ["xap"] + }, + "application/x-sql": { + source: "apache", + extensions: ["sql"] + }, + "application/x-stuffit": { + source: "apache", + compressible: false, + extensions: ["sit"] + }, + "application/x-stuffitx": { + source: "apache", + extensions: ["sitx"] + }, + "application/x-subrip": { + source: "apache", + extensions: ["srt"] + }, + "application/x-sv4cpio": { + source: "apache", + extensions: ["sv4cpio"] + }, + "application/x-sv4crc": { + source: "apache", + extensions: ["sv4crc"] + }, + "application/x-t3vm-image": { + source: "apache", + extensions: ["t3"] + }, + "application/x-tads": { + source: "apache", + extensions: ["gam"] + }, + "application/x-tar": { + source: "apache", + compressible: true, + extensions: ["tar"] + }, + "application/x-tcl": { + source: "apache", + extensions: ["tcl", "tk"] + }, + "application/x-tex": { + source: "apache", + extensions: ["tex"] + }, + "application/x-tex-tfm": { + source: "apache", + extensions: ["tfm"] + }, + "application/x-texinfo": { + source: "apache", + extensions: ["texinfo", "texi"] + }, + "application/x-tgif": { + source: "apache", + extensions: ["obj"] + }, + "application/x-ustar": { + source: "apache", + extensions: ["ustar"] + }, + "application/x-virtualbox-hdd": { + compressible: true, + extensions: ["hdd"] + }, + "application/x-virtualbox-ova": { + compressible: true, + extensions: ["ova"] + }, + "application/x-virtualbox-ovf": { + compressible: true, + extensions: ["ovf"] + }, + "application/x-virtualbox-vbox": { + compressible: true, + extensions: ["vbox"] + }, + "application/x-virtualbox-vbox-extpack": { + compressible: false, + extensions: ["vbox-extpack"] + }, + "application/x-virtualbox-vdi": { + compressible: true, + extensions: ["vdi"] + }, + "application/x-virtualbox-vhd": { + compressible: true, + extensions: ["vhd"] + }, + "application/x-virtualbox-vmdk": { + compressible: true, + extensions: ["vmdk"] + }, + "application/x-wais-source": { + source: "apache", + extensions: ["src"] + }, + "application/x-web-app-manifest+json": { + compressible: true, + extensions: ["webapp"] + }, + "application/x-www-form-urlencoded": { + source: "iana", + compressible: true + }, + "application/x-x509-ca-cert": { + source: "iana", + extensions: ["der", "crt", "pem"] + }, + "application/x-x509-ca-ra-cert": { + source: "iana" + }, + "application/x-x509-next-ca-cert": { + source: "iana" + }, + "application/x-xfig": { + source: "apache", + extensions: ["fig"] + }, + "application/x-xliff+xml": { + source: "apache", + compressible: true, + extensions: ["xlf"] + }, + "application/x-xpinstall": { + source: "apache", + compressible: false, + extensions: ["xpi"] + }, + "application/x-xz": { + source: "apache", + extensions: ["xz"] + }, + "application/x-zip-compressed": { + extensions: ["zip"] + }, + "application/x-zmachine": { + source: "apache", + extensions: ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"] + }, + "application/x400-bp": { + source: "iana" + }, + "application/xacml+xml": { + source: "iana", + compressible: true + }, + "application/xaml+xml": { + source: "apache", + compressible: true, + extensions: ["xaml"] + }, + "application/xcap-att+xml": { + source: "iana", + compressible: true, + extensions: ["xav"] + }, + "application/xcap-caps+xml": { + source: "iana", + compressible: true, + extensions: ["xca"] + }, + "application/xcap-diff+xml": { + source: "iana", + compressible: true, + extensions: ["xdf"] + }, + "application/xcap-el+xml": { + source: "iana", + compressible: true, + extensions: ["xel"] + }, + "application/xcap-error+xml": { + source: "iana", + compressible: true + }, + "application/xcap-ns+xml": { + source: "iana", + compressible: true, + extensions: ["xns"] + }, + "application/xcon-conference-info+xml": { + source: "iana", + compressible: true + }, + "application/xcon-conference-info-diff+xml": { + source: "iana", + compressible: true + }, + "application/xenc+xml": { + source: "iana", + compressible: true, + extensions: ["xenc"] + }, + "application/xfdf": { + source: "iana", + extensions: ["xfdf"] + }, + "application/xhtml+xml": { + source: "iana", + compressible: true, + extensions: ["xhtml", "xht"] + }, + "application/xhtml-voice+xml": { + source: "apache", + compressible: true + }, + "application/xliff+xml": { + source: "iana", + compressible: true, + extensions: ["xlf"] + }, + "application/xml": { + source: "iana", + compressible: true, + extensions: ["xml", "xsl", "xsd", "rng"] + }, + "application/xml-dtd": { + source: "iana", + compressible: true, + extensions: ["dtd"] + }, + "application/xml-external-parsed-entity": { + source: "iana" + }, + "application/xml-patch+xml": { + source: "iana", + compressible: true + }, + "application/xmpp+xml": { + source: "iana", + compressible: true + }, + "application/xop+xml": { + source: "iana", + compressible: true, + extensions: ["xop"] + }, + "application/xproc+xml": { + source: "apache", + compressible: true, + extensions: ["xpl"] + }, + "application/xslt+xml": { + source: "iana", + compressible: true, + extensions: ["xsl", "xslt"] + }, + "application/xspf+xml": { + source: "apache", + compressible: true, + extensions: ["xspf"] + }, + "application/xv+xml": { + source: "iana", + compressible: true, + extensions: ["mxml", "xhvml", "xvml", "xvm"] + }, + "application/yaml": { + source: "iana" + }, + "application/yang": { + source: "iana", + extensions: ["yang"] + }, + "application/yang-data+cbor": { + source: "iana" + }, + "application/yang-data+json": { + source: "iana", + compressible: true + }, + "application/yang-data+xml": { + source: "iana", + compressible: true + }, + "application/yang-patch+json": { + source: "iana", + compressible: true + }, + "application/yang-patch+xml": { + source: "iana", + compressible: true + }, + "application/yang-sid+json": { + source: "iana", + compressible: true + }, + "application/yin+xml": { + source: "iana", + compressible: true, + extensions: ["yin"] + }, + "application/zip": { + source: "iana", + compressible: false, + extensions: ["zip"] + }, + "application/zip+dotlottie": { + extensions: ["lottie"] + }, + "application/zlib": { + source: "iana" + }, + "application/zstd": { + source: "iana" + }, + "audio/1d-interleaved-parityfec": { + source: "iana" + }, + "audio/32kadpcm": { + source: "iana" + }, + "audio/3gpp": { + source: "iana", + compressible: false, + extensions: ["3gpp"] + }, + "audio/3gpp2": { + source: "iana" + }, + "audio/aac": { + source: "iana", + extensions: ["adts", "aac"] + }, + "audio/ac3": { + source: "iana" + }, + "audio/adpcm": { + source: "apache", + extensions: ["adp"] + }, + "audio/amr": { + source: "iana", + extensions: ["amr"] + }, + "audio/amr-wb": { + source: "iana" + }, + "audio/amr-wb+": { + source: "iana" + }, + "audio/aptx": { + source: "iana" + }, + "audio/asc": { + source: "iana" + }, + "audio/atrac-advanced-lossless": { + source: "iana" + }, + "audio/atrac-x": { + source: "iana" + }, + "audio/atrac3": { + source: "iana" + }, + "audio/basic": { + source: "iana", + compressible: false, + extensions: ["au", "snd"] + }, + "audio/bv16": { + source: "iana" + }, + "audio/bv32": { + source: "iana" + }, + "audio/clearmode": { + source: "iana" + }, + "audio/cn": { + source: "iana" + }, + "audio/dat12": { + source: "iana" + }, + "audio/dls": { + source: "iana" + }, + "audio/dsr-es201108": { + source: "iana" + }, + "audio/dsr-es202050": { + source: "iana" + }, + "audio/dsr-es202211": { + source: "iana" + }, + "audio/dsr-es202212": { + source: "iana" + }, + "audio/dv": { + source: "iana" + }, + "audio/dvi4": { + source: "iana" + }, + "audio/eac3": { + source: "iana" + }, + "audio/encaprtp": { + source: "iana" + }, + "audio/evrc": { + source: "iana" + }, + "audio/evrc-qcp": { + source: "iana" + }, + "audio/evrc0": { + source: "iana" + }, + "audio/evrc1": { + source: "iana" + }, + "audio/evrcb": { + source: "iana" + }, + "audio/evrcb0": { + source: "iana" + }, + "audio/evrcb1": { + source: "iana" + }, + "audio/evrcnw": { + source: "iana" + }, + "audio/evrcnw0": { + source: "iana" + }, + "audio/evrcnw1": { + source: "iana" + }, + "audio/evrcwb": { + source: "iana" + }, + "audio/evrcwb0": { + source: "iana" + }, + "audio/evrcwb1": { + source: "iana" + }, + "audio/evs": { + source: "iana" + }, + "audio/flac": { + source: "iana" + }, + "audio/flexfec": { + source: "iana" + }, + "audio/fwdred": { + source: "iana" + }, + "audio/g711-0": { + source: "iana" + }, + "audio/g719": { + source: "iana" + }, + "audio/g722": { + source: "iana" + }, + "audio/g7221": { + source: "iana" + }, + "audio/g723": { + source: "iana" + }, + "audio/g726-16": { + source: "iana" + }, + "audio/g726-24": { + source: "iana" + }, + "audio/g726-32": { + source: "iana" + }, + "audio/g726-40": { + source: "iana" + }, + "audio/g728": { + source: "iana" + }, + "audio/g729": { + source: "iana" + }, + "audio/g7291": { + source: "iana" + }, + "audio/g729d": { + source: "iana" + }, + "audio/g729e": { + source: "iana" + }, + "audio/gsm": { + source: "iana" + }, + "audio/gsm-efr": { + source: "iana" + }, + "audio/gsm-hr-08": { + source: "iana" + }, + "audio/ilbc": { + source: "iana" + }, + "audio/ip-mr_v2.5": { + source: "iana" + }, + "audio/isac": { + source: "apache" + }, + "audio/l16": { + source: "iana" + }, + "audio/l20": { + source: "iana" + }, + "audio/l24": { + source: "iana", + compressible: false + }, + "audio/l8": { + source: "iana" + }, + "audio/lpc": { + source: "iana" + }, + "audio/matroska": { + source: "iana" + }, + "audio/melp": { + source: "iana" + }, + "audio/melp1200": { + source: "iana" + }, + "audio/melp2400": { + source: "iana" + }, + "audio/melp600": { + source: "iana" + }, + "audio/mhas": { + source: "iana" + }, + "audio/midi": { + source: "apache", + extensions: ["mid", "midi", "kar", "rmi"] + }, + "audio/midi-clip": { + source: "iana" + }, + "audio/mobile-xmf": { + source: "iana", + extensions: ["mxmf"] + }, + "audio/mp3": { + compressible: false, + extensions: ["mp3"] + }, + "audio/mp4": { + source: "iana", + compressible: false, + extensions: ["m4a", "mp4a", "m4b"] + }, + "audio/mp4a-latm": { + source: "iana" + }, + "audio/mpa": { + source: "iana" + }, + "audio/mpa-robust": { + source: "iana" + }, + "audio/mpeg": { + source: "iana", + compressible: false, + extensions: ["mpga", "mp2", "mp2a", "mp3", "m2a", "m3a"] + }, + "audio/mpeg4-generic": { + source: "iana" + }, + "audio/musepack": { + source: "apache" + }, + "audio/ogg": { + source: "iana", + compressible: false, + extensions: ["oga", "ogg", "spx", "opus"] + }, + "audio/opus": { + source: "iana" + }, + "audio/parityfec": { + source: "iana" + }, + "audio/pcma": { + source: "iana" + }, + "audio/pcma-wb": { + source: "iana" + }, + "audio/pcmu": { + source: "iana" + }, + "audio/pcmu-wb": { + source: "iana" + }, + "audio/prs.sid": { + source: "iana" + }, + "audio/qcelp": { + source: "iana" + }, + "audio/raptorfec": { + source: "iana" + }, + "audio/red": { + source: "iana" + }, + "audio/rtp-enc-aescm128": { + source: "iana" + }, + "audio/rtp-midi": { + source: "iana" + }, + "audio/rtploopback": { + source: "iana" + }, + "audio/rtx": { + source: "iana" + }, + "audio/s3m": { + source: "apache", + extensions: ["s3m"] + }, + "audio/scip": { + source: "iana" + }, + "audio/silk": { + source: "apache", + extensions: ["sil"] + }, + "audio/smv": { + source: "iana" + }, + "audio/smv-qcp": { + source: "iana" + }, + "audio/smv0": { + source: "iana" + }, + "audio/sofa": { + source: "iana" + }, + "audio/sp-midi": { + source: "iana" + }, + "audio/speex": { + source: "iana" + }, + "audio/t140c": { + source: "iana" + }, + "audio/t38": { + source: "iana" + }, + "audio/telephone-event": { + source: "iana" + }, + "audio/tetra_acelp": { + source: "iana" + }, + "audio/tetra_acelp_bb": { + source: "iana" + }, + "audio/tone": { + source: "iana" + }, + "audio/tsvcis": { + source: "iana" + }, + "audio/uemclip": { + source: "iana" + }, + "audio/ulpfec": { + source: "iana" + }, + "audio/usac": { + source: "iana" + }, + "audio/vdvi": { + source: "iana" + }, + "audio/vmr-wb": { + source: "iana" + }, + "audio/vnd.3gpp.iufp": { + source: "iana" + }, + "audio/vnd.4sb": { + source: "iana" + }, + "audio/vnd.audiokoz": { + source: "iana" + }, + "audio/vnd.celp": { + source: "iana" + }, + "audio/vnd.cisco.nse": { + source: "iana" + }, + "audio/vnd.cmles.radio-events": { + source: "iana" + }, + "audio/vnd.cns.anp1": { + source: "iana" + }, + "audio/vnd.cns.inf1": { + source: "iana" + }, + "audio/vnd.dece.audio": { + source: "iana", + extensions: ["uva", "uvva"] + }, + "audio/vnd.digital-winds": { + source: "iana", + extensions: ["eol"] + }, + "audio/vnd.dlna.adts": { + source: "iana" + }, + "audio/vnd.dolby.heaac.1": { + source: "iana" + }, + "audio/vnd.dolby.heaac.2": { + source: "iana" + }, + "audio/vnd.dolby.mlp": { + source: "iana" + }, + "audio/vnd.dolby.mps": { + source: "iana" + }, + "audio/vnd.dolby.pl2": { + source: "iana" + }, + "audio/vnd.dolby.pl2x": { + source: "iana" + }, + "audio/vnd.dolby.pl2z": { + source: "iana" + }, + "audio/vnd.dolby.pulse.1": { + source: "iana" + }, + "audio/vnd.dra": { + source: "iana", + extensions: ["dra"] + }, + "audio/vnd.dts": { + source: "iana", + extensions: ["dts"] + }, + "audio/vnd.dts.hd": { + source: "iana", + extensions: ["dtshd"] + }, + "audio/vnd.dts.uhd": { + source: "iana" + }, + "audio/vnd.dvb.file": { + source: "iana" + }, + "audio/vnd.everad.plj": { + source: "iana" + }, + "audio/vnd.hns.audio": { + source: "iana" + }, + "audio/vnd.lucent.voice": { + source: "iana", + extensions: ["lvp"] + }, + "audio/vnd.ms-playready.media.pya": { + source: "iana", + extensions: ["pya"] + }, + "audio/vnd.nokia.mobile-xmf": { + source: "iana" + }, + "audio/vnd.nortel.vbk": { + source: "iana" + }, + "audio/vnd.nuera.ecelp4800": { + source: "iana", + extensions: ["ecelp4800"] + }, + "audio/vnd.nuera.ecelp7470": { + source: "iana", + extensions: ["ecelp7470"] + }, + "audio/vnd.nuera.ecelp9600": { + source: "iana", + extensions: ["ecelp9600"] + }, + "audio/vnd.octel.sbc": { + source: "iana" + }, + "audio/vnd.presonus.multitrack": { + source: "iana" + }, + "audio/vnd.qcelp": { + source: "apache" + }, + "audio/vnd.rhetorex.32kadpcm": { + source: "iana" + }, + "audio/vnd.rip": { + source: "iana", + extensions: ["rip"] + }, + "audio/vnd.rn-realaudio": { + compressible: false + }, + "audio/vnd.sealedmedia.softseal.mpeg": { + source: "iana" + }, + "audio/vnd.vmx.cvsd": { + source: "iana" + }, + "audio/vnd.wave": { + compressible: false + }, + "audio/vorbis": { + source: "iana", + compressible: false + }, + "audio/vorbis-config": { + source: "iana" + }, + "audio/wav": { + compressible: false, + extensions: ["wav"] + }, + "audio/wave": { + compressible: false, + extensions: ["wav"] + }, + "audio/webm": { + source: "apache", + compressible: false, + extensions: ["weba"] + }, + "audio/x-aac": { + source: "apache", + compressible: false, + extensions: ["aac"] + }, + "audio/x-aiff": { + source: "apache", + extensions: ["aif", "aiff", "aifc"] + }, + "audio/x-caf": { + source: "apache", + compressible: false, + extensions: ["caf"] + }, + "audio/x-flac": { + source: "apache", + extensions: ["flac"] + }, + "audio/x-m4a": { + source: "nginx", + extensions: ["m4a"] + }, + "audio/x-matroska": { + source: "apache", + extensions: ["mka"] + }, + "audio/x-mpegurl": { + source: "apache", + extensions: ["m3u"] + }, + "audio/x-ms-wax": { + source: "apache", + extensions: ["wax"] + }, + "audio/x-ms-wma": { + source: "apache", + extensions: ["wma"] + }, + "audio/x-pn-realaudio": { + source: "apache", + extensions: ["ram", "ra"] + }, + "audio/x-pn-realaudio-plugin": { + source: "apache", + extensions: ["rmp"] + }, + "audio/x-realaudio": { + source: "nginx", + extensions: ["ra"] + }, + "audio/x-tta": { + source: "apache" + }, + "audio/x-wav": { + source: "apache", + extensions: ["wav"] + }, + "audio/xm": { + source: "apache", + extensions: ["xm"] + }, + "chemical/x-cdx": { + source: "apache", + extensions: ["cdx"] + }, + "chemical/x-cif": { + source: "apache", + extensions: ["cif"] + }, + "chemical/x-cmdf": { + source: "apache", + extensions: ["cmdf"] + }, + "chemical/x-cml": { + source: "apache", + extensions: ["cml"] + }, + "chemical/x-csml": { + source: "apache", + extensions: ["csml"] + }, + "chemical/x-pdb": { + source: "apache" + }, + "chemical/x-xyz": { + source: "apache", + extensions: ["xyz"] + }, + "font/collection": { + source: "iana", + extensions: ["ttc"] + }, + "font/otf": { + source: "iana", + compressible: true, + extensions: ["otf"] + }, + "font/sfnt": { + source: "iana" + }, + "font/ttf": { + source: "iana", + compressible: true, + extensions: ["ttf"] + }, + "font/woff": { + source: "iana", + extensions: ["woff"] + }, + "font/woff2": { + source: "iana", + extensions: ["woff2"] + }, + "image/aces": { + source: "iana", + extensions: ["exr"] + }, + "image/apng": { + source: "iana", + compressible: false, + extensions: ["apng"] + }, + "image/avci": { + source: "iana", + extensions: ["avci"] + }, + "image/avcs": { + source: "iana", + extensions: ["avcs"] + }, + "image/avif": { + source: "iana", + compressible: false, + extensions: ["avif"] + }, + "image/bmp": { + source: "iana", + compressible: true, + extensions: ["bmp", "dib"] + }, + "image/cgm": { + source: "iana", + extensions: ["cgm"] + }, + "image/dicom-rle": { + source: "iana", + extensions: ["drle"] + }, + "image/dpx": { + source: "iana", + extensions: ["dpx"] + }, + "image/emf": { + source: "iana", + extensions: ["emf"] + }, + "image/fits": { + source: "iana", + extensions: ["fits"] + }, + "image/g3fax": { + source: "iana", + extensions: ["g3"] + }, + "image/gif": { + source: "iana", + compressible: false, + extensions: ["gif"] + }, + "image/heic": { + source: "iana", + extensions: ["heic"] + }, + "image/heic-sequence": { + source: "iana", + extensions: ["heics"] + }, + "image/heif": { + source: "iana", + extensions: ["heif"] + }, + "image/heif-sequence": { + source: "iana", + extensions: ["heifs"] + }, + "image/hej2k": { + source: "iana", + extensions: ["hej2"] + }, + "image/ief": { + source: "iana", + extensions: ["ief"] + }, + "image/j2c": { + source: "iana" + }, + "image/jaii": { + source: "iana", + extensions: ["jaii"] + }, + "image/jais": { + source: "iana", + extensions: ["jais"] + }, + "image/jls": { + source: "iana", + extensions: ["jls"] + }, + "image/jp2": { + source: "iana", + compressible: false, + extensions: ["jp2", "jpg2"] + }, + "image/jpeg": { + source: "iana", + compressible: false, + extensions: ["jpg", "jpeg", "jpe"] + }, + "image/jph": { + source: "iana", + extensions: ["jph"] + }, + "image/jphc": { + source: "iana", + extensions: ["jhc"] + }, + "image/jpm": { + source: "iana", + compressible: false, + extensions: ["jpm", "jpgm"] + }, + "image/jpx": { + source: "iana", + compressible: false, + extensions: ["jpx", "jpf"] + }, + "image/jxl": { + source: "iana", + extensions: ["jxl"] + }, + "image/jxr": { + source: "iana", + extensions: ["jxr"] + }, + "image/jxra": { + source: "iana", + extensions: ["jxra"] + }, + "image/jxrs": { + source: "iana", + extensions: ["jxrs"] + }, + "image/jxs": { + source: "iana", + extensions: ["jxs"] + }, + "image/jxsc": { + source: "iana", + extensions: ["jxsc"] + }, + "image/jxsi": { + source: "iana", + extensions: ["jxsi"] + }, + "image/jxss": { + source: "iana", + extensions: ["jxss"] + }, + "image/ktx": { + source: "iana", + extensions: ["ktx"] + }, + "image/ktx2": { + source: "iana", + extensions: ["ktx2"] + }, + "image/naplps": { + source: "iana" + }, + "image/pjpeg": { + compressible: false, + extensions: ["jfif"] + }, + "image/png": { + source: "iana", + compressible: false, + extensions: ["png"] + }, + "image/prs.btif": { + source: "iana", + extensions: ["btif", "btf"] + }, + "image/prs.pti": { + source: "iana", + extensions: ["pti"] + }, + "image/pwg-raster": { + source: "iana" + }, + "image/sgi": { + source: "apache", + extensions: ["sgi"] + }, + "image/svg+xml": { + source: "iana", + compressible: true, + extensions: ["svg", "svgz"] + }, + "image/t38": { + source: "iana", + extensions: ["t38"] + }, + "image/tiff": { + source: "iana", + compressible: false, + extensions: ["tif", "tiff"] + }, + "image/tiff-fx": { + source: "iana", + extensions: ["tfx"] + }, + "image/vnd.adobe.photoshop": { + source: "iana", + compressible: true, + extensions: ["psd"] + }, + "image/vnd.airzip.accelerator.azv": { + source: "iana", + extensions: ["azv"] + }, + "image/vnd.clip": { + source: "iana" + }, + "image/vnd.cns.inf2": { + source: "iana" + }, + "image/vnd.dece.graphic": { + source: "iana", + extensions: ["uvi", "uvvi", "uvg", "uvvg"] + }, + "image/vnd.djvu": { + source: "iana", + extensions: ["djvu", "djv"] + }, + "image/vnd.dvb.subtitle": { + source: "iana", + extensions: ["sub"] + }, + "image/vnd.dwg": { + source: "iana", + extensions: ["dwg"] + }, + "image/vnd.dxf": { + source: "iana", + extensions: ["dxf"] + }, + "image/vnd.fastbidsheet": { + source: "iana", + extensions: ["fbs"] + }, + "image/vnd.fpx": { + source: "iana", + extensions: ["fpx"] + }, + "image/vnd.fst": { + source: "iana", + extensions: ["fst"] + }, + "image/vnd.fujixerox.edmics-mmr": { + source: "iana", + extensions: ["mmr"] + }, + "image/vnd.fujixerox.edmics-rlc": { + source: "iana", + extensions: ["rlc"] + }, + "image/vnd.globalgraphics.pgb": { + source: "iana" + }, + "image/vnd.microsoft.icon": { + source: "iana", + compressible: true, + extensions: ["ico"] + }, + "image/vnd.mix": { + source: "iana" + }, + "image/vnd.mozilla.apng": { + source: "iana" + }, + "image/vnd.ms-dds": { + compressible: true, + extensions: ["dds"] + }, + "image/vnd.ms-modi": { + source: "iana", + extensions: ["mdi"] + }, + "image/vnd.ms-photo": { + source: "apache", + extensions: ["wdp"] + }, + "image/vnd.net-fpx": { + source: "iana", + extensions: ["npx"] + }, + "image/vnd.pco.b16": { + source: "iana", + extensions: ["b16"] + }, + "image/vnd.radiance": { + source: "iana" + }, + "image/vnd.sealed.png": { + source: "iana" + }, + "image/vnd.sealedmedia.softseal.gif": { + source: "iana" + }, + "image/vnd.sealedmedia.softseal.jpg": { + source: "iana" + }, + "image/vnd.svf": { + source: "iana" + }, + "image/vnd.tencent.tap": { + source: "iana", + extensions: ["tap"] + }, + "image/vnd.valve.source.texture": { + source: "iana", + extensions: ["vtf"] + }, + "image/vnd.wap.wbmp": { + source: "iana", + extensions: ["wbmp"] + }, + "image/vnd.xiff": { + source: "iana", + extensions: ["xif"] + }, + "image/vnd.zbrush.pcx": { + source: "iana", + extensions: ["pcx"] + }, + "image/webp": { + source: "iana", + extensions: ["webp"] + }, + "image/wmf": { + source: "iana", + extensions: ["wmf"] + }, + "image/x-3ds": { + source: "apache", + extensions: ["3ds"] + }, + "image/x-adobe-dng": { + extensions: ["dng"] + }, + "image/x-cmu-raster": { + source: "apache", + extensions: ["ras"] + }, + "image/x-cmx": { + source: "apache", + extensions: ["cmx"] + }, + "image/x-emf": { + source: "iana" + }, + "image/x-freehand": { + source: "apache", + extensions: ["fh", "fhc", "fh4", "fh5", "fh7"] + }, + "image/x-icon": { + source: "apache", + compressible: true, + extensions: ["ico"] + }, + "image/x-jng": { + source: "nginx", + extensions: ["jng"] + }, + "image/x-mrsid-image": { + source: "apache", + extensions: ["sid"] + }, + "image/x-ms-bmp": { + source: "nginx", + compressible: true, + extensions: ["bmp"] + }, + "image/x-pcx": { + source: "apache", + extensions: ["pcx"] + }, + "image/x-pict": { + source: "apache", + extensions: ["pic", "pct"] + }, + "image/x-portable-anymap": { + source: "apache", + extensions: ["pnm"] + }, + "image/x-portable-bitmap": { + source: "apache", + extensions: ["pbm"] + }, + "image/x-portable-graymap": { + source: "apache", + extensions: ["pgm"] + }, + "image/x-portable-pixmap": { + source: "apache", + extensions: ["ppm"] + }, + "image/x-rgb": { + source: "apache", + extensions: ["rgb"] + }, + "image/x-tga": { + source: "apache", + extensions: ["tga"] + }, + "image/x-wmf": { + source: "iana" + }, + "image/x-xbitmap": { + source: "apache", + extensions: ["xbm"] + }, + "image/x-xcf": { + compressible: false + }, + "image/x-xpixmap": { + source: "apache", + extensions: ["xpm"] + }, + "image/x-xwindowdump": { + source: "apache", + extensions: ["xwd"] + }, + "message/bhttp": { + source: "iana" + }, + "message/cpim": { + source: "iana" + }, + "message/delivery-status": { + source: "iana" + }, + "message/disposition-notification": { + source: "iana", + extensions: [ + "disposition-notification" + ] + }, + "message/external-body": { + source: "iana" + }, + "message/feedback-report": { + source: "iana" + }, + "message/global": { + source: "iana", + extensions: ["u8msg"] + }, + "message/global-delivery-status": { + source: "iana", + extensions: ["u8dsn"] + }, + "message/global-disposition-notification": { + source: "iana", + extensions: ["u8mdn"] + }, + "message/global-headers": { + source: "iana", + extensions: ["u8hdr"] + }, + "message/http": { + source: "iana", + compressible: false + }, + "message/imdn+xml": { + source: "iana", + compressible: true + }, + "message/mls": { + source: "iana" + }, + "message/news": { + source: "apache" + }, + "message/ohttp-req": { + source: "iana" + }, + "message/ohttp-res": { + source: "iana" + }, + "message/partial": { + source: "iana", + compressible: false + }, + "message/rfc822": { + source: "iana", + compressible: true, + extensions: ["eml", "mime", "mht", "mhtml"] + }, + "message/s-http": { + source: "apache" + }, + "message/sip": { + source: "iana" + }, + "message/sipfrag": { + source: "iana" + }, + "message/tracking-status": { + source: "iana" + }, + "message/vnd.si.simp": { + source: "apache" + }, + "message/vnd.wfa.wsc": { + source: "iana", + extensions: ["wsc"] + }, + "model/3mf": { + source: "iana", + extensions: ["3mf"] + }, + "model/e57": { + source: "iana" + }, + "model/gltf+json": { + source: "iana", + compressible: true, + extensions: ["gltf"] + }, + "model/gltf-binary": { + source: "iana", + compressible: true, + extensions: ["glb"] + }, + "model/iges": { + source: "iana", + compressible: false, + extensions: ["igs", "iges"] + }, + "model/jt": { + source: "iana", + extensions: ["jt"] + }, + "model/mesh": { + source: "iana", + compressible: false, + extensions: ["msh", "mesh", "silo"] + }, + "model/mtl": { + source: "iana", + extensions: ["mtl"] + }, + "model/obj": { + source: "iana", + extensions: ["obj"] + }, + "model/prc": { + source: "iana", + extensions: ["prc"] + }, + "model/step": { + source: "iana", + extensions: ["step", "stp", "stpnc", "p21", "210"] + }, + "model/step+xml": { + source: "iana", + compressible: true, + extensions: ["stpx"] + }, + "model/step+zip": { + source: "iana", + compressible: false, + extensions: ["stpz"] + }, + "model/step-xml+zip": { + source: "iana", + compressible: false, + extensions: ["stpxz"] + }, + "model/stl": { + source: "iana", + extensions: ["stl"] + }, + "model/u3d": { + source: "iana", + extensions: ["u3d"] + }, + "model/vnd.bary": { + source: "iana", + extensions: ["bary"] + }, + "model/vnd.cld": { + source: "iana", + extensions: ["cld"] + }, + "model/vnd.collada+xml": { + source: "iana", + compressible: true, + extensions: ["dae"] + }, + "model/vnd.dwf": { + source: "iana", + extensions: ["dwf"] + }, + "model/vnd.flatland.3dml": { + source: "iana" + }, + "model/vnd.gdl": { + source: "iana", + extensions: ["gdl"] + }, + "model/vnd.gs-gdl": { + source: "apache" + }, + "model/vnd.gs.gdl": { + source: "iana" + }, + "model/vnd.gtw": { + source: "iana", + extensions: ["gtw"] + }, + "model/vnd.moml+xml": { + source: "iana", + compressible: true + }, + "model/vnd.mts": { + source: "iana", + extensions: ["mts"] + }, + "model/vnd.opengex": { + source: "iana", + extensions: ["ogex"] + }, + "model/vnd.parasolid.transmit.binary": { + source: "iana", + extensions: ["x_b"] + }, + "model/vnd.parasolid.transmit.text": { + source: "iana", + extensions: ["x_t"] + }, + "model/vnd.pytha.pyox": { + source: "iana", + extensions: ["pyo", "pyox"] + }, + "model/vnd.rosette.annotated-data-model": { + source: "iana" + }, + "model/vnd.sap.vds": { + source: "iana", + extensions: ["vds"] + }, + "model/vnd.usda": { + source: "iana", + extensions: ["usda"] + }, + "model/vnd.usdz+zip": { + source: "iana", + compressible: false, + extensions: ["usdz"] + }, + "model/vnd.valve.source.compiled-map": { + source: "iana", + extensions: ["bsp"] + }, + "model/vnd.vtu": { + source: "iana", + extensions: ["vtu"] + }, + "model/vrml": { + source: "iana", + compressible: false, + extensions: ["wrl", "vrml"] + }, + "model/x3d+binary": { + source: "apache", + compressible: false, + extensions: ["x3db", "x3dbz"] + }, + "model/x3d+fastinfoset": { + source: "iana", + extensions: ["x3db"] + }, + "model/x3d+vrml": { + source: "apache", + compressible: false, + extensions: ["x3dv", "x3dvz"] + }, + "model/x3d+xml": { + source: "iana", + compressible: true, + extensions: ["x3d", "x3dz"] + }, + "model/x3d-vrml": { + source: "iana", + extensions: ["x3dv"] + }, + "multipart/alternative": { + source: "iana", + compressible: false + }, + "multipart/appledouble": { + source: "iana" + }, + "multipart/byteranges": { + source: "iana" + }, + "multipart/digest": { + source: "iana" + }, + "multipart/encrypted": { + source: "iana", + compressible: false + }, + "multipart/form-data": { + source: "iana", + compressible: false + }, + "multipart/header-set": { + source: "iana" + }, + "multipart/mixed": { + source: "iana" + }, + "multipart/multilingual": { + source: "iana" + }, + "multipart/parallel": { + source: "iana" + }, + "multipart/related": { + source: "iana", + compressible: false + }, + "multipart/report": { + source: "iana" + }, + "multipart/signed": { + source: "iana", + compressible: false + }, + "multipart/vnd.bint.med-plus": { + source: "iana" + }, + "multipart/voice-message": { + source: "iana" + }, + "multipart/x-mixed-replace": { + source: "iana" + }, + "text/1d-interleaved-parityfec": { + source: "iana" + }, + "text/cache-manifest": { + source: "iana", + compressible: true, + extensions: ["appcache", "manifest"] + }, + "text/calendar": { + source: "iana", + extensions: ["ics", "ifb"] + }, + "text/calender": { + compressible: true + }, + "text/cmd": { + compressible: true + }, + "text/coffeescript": { + extensions: ["coffee", "litcoffee"] + }, + "text/cql": { + source: "iana" + }, + "text/cql-expression": { + source: "iana" + }, + "text/cql-identifier": { + source: "iana" + }, + "text/css": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["css"] + }, + "text/csv": { + source: "iana", + compressible: true, + extensions: ["csv"] + }, + "text/csv-schema": { + source: "iana" + }, + "text/directory": { + source: "iana" + }, + "text/dns": { + source: "iana" + }, + "text/ecmascript": { + source: "apache" + }, + "text/encaprtp": { + source: "iana" + }, + "text/enriched": { + source: "iana" + }, + "text/fhirpath": { + source: "iana" + }, + "text/flexfec": { + source: "iana" + }, + "text/fwdred": { + source: "iana" + }, + "text/gff3": { + source: "iana" + }, + "text/grammar-ref-list": { + source: "iana" + }, + "text/hl7v2": { + source: "iana" + }, + "text/html": { + source: "iana", + compressible: true, + extensions: ["html", "htm", "shtml"] + }, + "text/jade": { + extensions: ["jade"] + }, + "text/javascript": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["js", "mjs"] + }, + "text/jcr-cnd": { + source: "iana" + }, + "text/jsx": { + compressible: true, + extensions: ["jsx"] + }, + "text/less": { + compressible: true, + extensions: ["less"] + }, + "text/markdown": { + source: "iana", + compressible: true, + extensions: ["md", "markdown"] + }, + "text/mathml": { + source: "nginx", + extensions: ["mml"] + }, + "text/mdx": { + compressible: true, + extensions: ["mdx"] + }, + "text/mizar": { + source: "iana" + }, + "text/n3": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["n3"] + }, + "text/parameters": { + source: "iana", + charset: "UTF-8" + }, + "text/parityfec": { + source: "iana" + }, + "text/plain": { + source: "iana", + compressible: true, + extensions: ["txt", "text", "conf", "def", "list", "log", "in", "ini"] + }, + "text/provenance-notation": { + source: "iana", + charset: "UTF-8" + }, + "text/prs.fallenstein.rst": { + source: "iana" + }, + "text/prs.lines.tag": { + source: "iana", + extensions: ["dsc"] + }, + "text/prs.prop.logic": { + source: "iana" + }, + "text/prs.texi": { + source: "iana" + }, + "text/raptorfec": { + source: "iana" + }, + "text/red": { + source: "iana" + }, + "text/rfc822-headers": { + source: "iana" + }, + "text/richtext": { + source: "iana", + compressible: true, + extensions: ["rtx"] + }, + "text/rtf": { + source: "iana", + compressible: true, + extensions: ["rtf"] + }, + "text/rtp-enc-aescm128": { + source: "iana" + }, + "text/rtploopback": { + source: "iana" + }, + "text/rtx": { + source: "iana" + }, + "text/sgml": { + source: "iana", + extensions: ["sgml", "sgm"] + }, + "text/shaclc": { + source: "iana" + }, + "text/shex": { + source: "iana", + extensions: ["shex"] + }, + "text/slim": { + extensions: ["slim", "slm"] + }, + "text/spdx": { + source: "iana", + extensions: ["spdx"] + }, + "text/strings": { + source: "iana" + }, + "text/stylus": { + extensions: ["stylus", "styl"] + }, + "text/t140": { + source: "iana" + }, + "text/tab-separated-values": { + source: "iana", + compressible: true, + extensions: ["tsv"] + }, + "text/troff": { + source: "iana", + extensions: ["t", "tr", "roff", "man", "me", "ms"] + }, + "text/turtle": { + source: "iana", + charset: "UTF-8", + extensions: ["ttl"] + }, + "text/ulpfec": { + source: "iana" + }, + "text/uri-list": { + source: "iana", + compressible: true, + extensions: ["uri", "uris", "urls"] + }, + "text/vcard": { + source: "iana", + compressible: true, + extensions: ["vcard"] + }, + "text/vnd.a": { + source: "iana" + }, + "text/vnd.abc": { + source: "iana" + }, + "text/vnd.ascii-art": { + source: "iana" + }, + "text/vnd.curl": { + source: "iana", + extensions: ["curl"] + }, + "text/vnd.curl.dcurl": { + source: "apache", + extensions: ["dcurl"] + }, + "text/vnd.curl.mcurl": { + source: "apache", + extensions: ["mcurl"] + }, + "text/vnd.curl.scurl": { + source: "apache", + extensions: ["scurl"] + }, + "text/vnd.debian.copyright": { + source: "iana", + charset: "UTF-8" + }, + "text/vnd.dmclientscript": { + source: "iana" + }, + "text/vnd.dvb.subtitle": { + source: "iana", + extensions: ["sub"] + }, + "text/vnd.esmertec.theme-descriptor": { + source: "iana", + charset: "UTF-8" + }, + "text/vnd.exchangeable": { + source: "iana" + }, + "text/vnd.familysearch.gedcom": { + source: "iana", + extensions: ["ged"] + }, + "text/vnd.ficlab.flt": { + source: "iana" + }, + "text/vnd.fly": { + source: "iana", + extensions: ["fly"] + }, + "text/vnd.fmi.flexstor": { + source: "iana", + extensions: ["flx"] + }, + "text/vnd.gml": { + source: "iana" + }, + "text/vnd.graphviz": { + source: "iana", + extensions: ["gv"] + }, + "text/vnd.hans": { + source: "iana" + }, + "text/vnd.hgl": { + source: "iana" + }, + "text/vnd.in3d.3dml": { + source: "iana", + extensions: ["3dml"] + }, + "text/vnd.in3d.spot": { + source: "iana", + extensions: ["spot"] + }, + "text/vnd.iptc.newsml": { + source: "iana" + }, + "text/vnd.iptc.nitf": { + source: "iana" + }, + "text/vnd.latex-z": { + source: "iana" + }, + "text/vnd.motorola.reflex": { + source: "iana" + }, + "text/vnd.ms-mediapackage": { + source: "iana" + }, + "text/vnd.net2phone.commcenter.command": { + source: "iana" + }, + "text/vnd.radisys.msml-basic-layout": { + source: "iana" + }, + "text/vnd.senx.warpscript": { + source: "iana" + }, + "text/vnd.si.uricatalogue": { + source: "apache" + }, + "text/vnd.sosi": { + source: "iana" + }, + "text/vnd.sun.j2me.app-descriptor": { + source: "iana", + charset: "UTF-8", + extensions: ["jad"] + }, + "text/vnd.trolltech.linguist": { + source: "iana", + charset: "UTF-8" + }, + "text/vnd.vcf": { + source: "iana" + }, + "text/vnd.wap.si": { + source: "iana" + }, + "text/vnd.wap.sl": { + source: "iana" + }, + "text/vnd.wap.wml": { + source: "iana", + extensions: ["wml"] + }, + "text/vnd.wap.wmlscript": { + source: "iana", + extensions: ["wmls"] + }, + "text/vnd.zoo.kcl": { + source: "iana" + }, + "text/vtt": { + source: "iana", + charset: "UTF-8", + compressible: true, + extensions: ["vtt"] + }, + "text/wgsl": { + source: "iana", + extensions: ["wgsl"] + }, + "text/x-asm": { + source: "apache", + extensions: ["s", "asm"] + }, + "text/x-c": { + source: "apache", + extensions: ["c", "cc", "cxx", "cpp", "h", "hh", "dic"] + }, + "text/x-component": { + source: "nginx", + extensions: ["htc"] + }, + "text/x-fortran": { + source: "apache", + extensions: ["f", "for", "f77", "f90"] + }, + "text/x-gwt-rpc": { + compressible: true + }, + "text/x-handlebars-template": { + extensions: ["hbs"] + }, + "text/x-java-source": { + source: "apache", + extensions: ["java"] + }, + "text/x-jquery-tmpl": { + compressible: true + }, + "text/x-lua": { + extensions: ["lua"] + }, + "text/x-markdown": { + compressible: true, + extensions: ["mkd"] + }, + "text/x-nfo": { + source: "apache", + extensions: ["nfo"] + }, + "text/x-opml": { + source: "apache", + extensions: ["opml"] + }, + "text/x-org": { + compressible: true, + extensions: ["org"] + }, + "text/x-pascal": { + source: "apache", + extensions: ["p", "pas"] + }, + "text/x-processing": { + compressible: true, + extensions: ["pde"] + }, + "text/x-sass": { + extensions: ["sass"] + }, + "text/x-scss": { + extensions: ["scss"] + }, + "text/x-setext": { + source: "apache", + extensions: ["etx"] + }, + "text/x-sfv": { + source: "apache", + extensions: ["sfv"] + }, + "text/x-suse-ymp": { + compressible: true, + extensions: ["ymp"] + }, + "text/x-uuencode": { + source: "apache", + extensions: ["uu"] + }, + "text/x-vcalendar": { + source: "apache", + extensions: ["vcs"] + }, + "text/x-vcard": { + source: "apache", + extensions: ["vcf"] + }, + "text/xml": { + source: "iana", + compressible: true, + extensions: ["xml"] + }, + "text/xml-external-parsed-entity": { + source: "iana" + }, + "text/yaml": { + compressible: true, + extensions: ["yaml", "yml"] + }, + "video/1d-interleaved-parityfec": { + source: "iana" + }, + "video/3gpp": { + source: "iana", + extensions: ["3gp", "3gpp"] + }, + "video/3gpp-tt": { + source: "iana" + }, + "video/3gpp2": { + source: "iana", + extensions: ["3g2"] + }, + "video/av1": { + source: "iana" + }, + "video/bmpeg": { + source: "iana" + }, + "video/bt656": { + source: "iana" + }, + "video/celb": { + source: "iana" + }, + "video/dv": { + source: "iana" + }, + "video/encaprtp": { + source: "iana" + }, + "video/evc": { + source: "iana" + }, + "video/ffv1": { + source: "iana" + }, + "video/flexfec": { + source: "iana" + }, + "video/h261": { + source: "iana", + extensions: ["h261"] + }, + "video/h263": { + source: "iana", + extensions: ["h263"] + }, + "video/h263-1998": { + source: "iana" + }, + "video/h263-2000": { + source: "iana" + }, + "video/h264": { + source: "iana", + extensions: ["h264"] + }, + "video/h264-rcdo": { + source: "iana" + }, + "video/h264-svc": { + source: "iana" + }, + "video/h265": { + source: "iana" + }, + "video/h266": { + source: "iana" + }, + "video/iso.segment": { + source: "iana", + extensions: ["m4s"] + }, + "video/jpeg": { + source: "iana", + extensions: ["jpgv"] + }, + "video/jpeg2000": { + source: "iana" + }, + "video/jpm": { + source: "apache", + extensions: ["jpm", "jpgm"] + }, + "video/jxsv": { + source: "iana" + }, + "video/lottie+json": { + source: "iana", + compressible: true + }, + "video/matroska": { + source: "iana" + }, + "video/matroska-3d": { + source: "iana" + }, + "video/mj2": { + source: "iana", + extensions: ["mj2", "mjp2"] + }, + "video/mp1s": { + source: "iana" + }, + "video/mp2p": { + source: "iana" + }, + "video/mp2t": { + source: "iana", + extensions: ["ts", "m2t", "m2ts", "mts"] + }, + "video/mp4": { + source: "iana", + compressible: false, + extensions: ["mp4", "mp4v", "mpg4"] + }, + "video/mp4v-es": { + source: "iana" + }, + "video/mpeg": { + source: "iana", + compressible: false, + extensions: ["mpeg", "mpg", "mpe", "m1v", "m2v"] + }, + "video/mpeg4-generic": { + source: "iana" + }, + "video/mpv": { + source: "iana" + }, + "video/nv": { + source: "iana" + }, + "video/ogg": { + source: "iana", + compressible: false, + extensions: ["ogv"] + }, + "video/parityfec": { + source: "iana" + }, + "video/pointer": { + source: "iana" + }, + "video/quicktime": { + source: "iana", + compressible: false, + extensions: ["qt", "mov"] + }, + "video/raptorfec": { + source: "iana" + }, + "video/raw": { + source: "iana" + }, + "video/rtp-enc-aescm128": { + source: "iana" + }, + "video/rtploopback": { + source: "iana" + }, + "video/rtx": { + source: "iana" + }, + "video/scip": { + source: "iana" + }, + "video/smpte291": { + source: "iana" + }, + "video/smpte292m": { + source: "iana" + }, + "video/ulpfec": { + source: "iana" + }, + "video/vc1": { + source: "iana" + }, + "video/vc2": { + source: "iana" + }, + "video/vnd.cctv": { + source: "iana" + }, + "video/vnd.dece.hd": { + source: "iana", + extensions: ["uvh", "uvvh"] + }, + "video/vnd.dece.mobile": { + source: "iana", + extensions: ["uvm", "uvvm"] + }, + "video/vnd.dece.mp4": { + source: "iana" + }, + "video/vnd.dece.pd": { + source: "iana", + extensions: ["uvp", "uvvp"] + }, + "video/vnd.dece.sd": { + source: "iana", + extensions: ["uvs", "uvvs"] + }, + "video/vnd.dece.video": { + source: "iana", + extensions: ["uvv", "uvvv"] + }, + "video/vnd.directv.mpeg": { + source: "iana" + }, + "video/vnd.directv.mpeg-tts": { + source: "iana" + }, + "video/vnd.dlna.mpeg-tts": { + source: "iana" + }, + "video/vnd.dvb.file": { + source: "iana", + extensions: ["dvb"] + }, + "video/vnd.fvt": { + source: "iana", + extensions: ["fvt"] + }, + "video/vnd.hns.video": { + source: "iana" + }, + "video/vnd.iptvforum.1dparityfec-1010": { + source: "iana" + }, + "video/vnd.iptvforum.1dparityfec-2005": { + source: "iana" + }, + "video/vnd.iptvforum.2dparityfec-1010": { + source: "iana" + }, + "video/vnd.iptvforum.2dparityfec-2005": { + source: "iana" + }, + "video/vnd.iptvforum.ttsavc": { + source: "iana" + }, + "video/vnd.iptvforum.ttsmpeg2": { + source: "iana" + }, + "video/vnd.motorola.video": { + source: "iana" + }, + "video/vnd.motorola.videop": { + source: "iana" + }, + "video/vnd.mpegurl": { + source: "iana", + extensions: ["mxu", "m4u"] + }, + "video/vnd.ms-playready.media.pyv": { + source: "iana", + extensions: ["pyv"] + }, + "video/vnd.nokia.interleaved-multimedia": { + source: "iana" + }, + "video/vnd.nokia.mp4vr": { + source: "iana" + }, + "video/vnd.nokia.videovoip": { + source: "iana" + }, + "video/vnd.objectvideo": { + source: "iana" + }, + "video/vnd.planar": { + source: "iana" + }, + "video/vnd.radgamettools.bink": { + source: "iana" + }, + "video/vnd.radgamettools.smacker": { + source: "apache" + }, + "video/vnd.sealed.mpeg1": { + source: "iana" + }, + "video/vnd.sealed.mpeg4": { + source: "iana" + }, + "video/vnd.sealed.swf": { + source: "iana" + }, + "video/vnd.sealedmedia.softseal.mov": { + source: "iana" + }, + "video/vnd.uvvu.mp4": { + source: "iana", + extensions: ["uvu", "uvvu"] + }, + "video/vnd.vivo": { + source: "iana", + extensions: ["viv"] + }, + "video/vnd.youtube.yt": { + source: "iana" + }, + "video/vp8": { + source: "iana" + }, + "video/vp9": { + source: "iana" + }, + "video/webm": { + source: "apache", + compressible: false, + extensions: ["webm"] + }, + "video/x-f4v": { + source: "apache", + extensions: ["f4v"] + }, + "video/x-fli": { + source: "apache", + extensions: ["fli"] + }, + "video/x-flv": { + source: "apache", + compressible: false, + extensions: ["flv"] + }, + "video/x-m4v": { + source: "apache", + extensions: ["m4v"] + }, + "video/x-matroska": { + source: "apache", + compressible: false, + extensions: ["mkv", "mk3d", "mks"] + }, + "video/x-mng": { + source: "apache", + extensions: ["mng"] + }, + "video/x-ms-asf": { + source: "apache", + extensions: ["asf", "asx"] + }, + "video/x-ms-vob": { + source: "apache", + extensions: ["vob"] + }, + "video/x-ms-wm": { + source: "apache", + extensions: ["wm"] + }, + "video/x-ms-wmv": { + source: "apache", + compressible: false, + extensions: ["wmv"] + }, + "video/x-ms-wmx": { + source: "apache", + extensions: ["wmx"] + }, + "video/x-ms-wvx": { + source: "apache", + extensions: ["wvx"] + }, + "video/x-msvideo": { + source: "apache", + extensions: ["avi"] + }, + "video/x-sgi-movie": { + source: "apache", + extensions: ["movie"] + }, + "video/x-smv": { + source: "apache", + extensions: ["smv"] + }, + "x-conference/x-cooltalk": { + source: "apache", + extensions: ["ice"] + }, + "x-shader/x-fragment": { + compressible: true + }, + "x-shader/x-vertex": { + compressible: true + } + }; + } +}); + +// node_modules/mime-db/index.js +var require_mime_db = __commonJS({ + "node_modules/mime-db/index.js"(exports2, module2) { + module2.exports = require_db(); + } +}); + +// node_modules/mime-types/mimeScore.js +var require_mimeScore = __commonJS({ + "node_modules/mime-types/mimeScore.js"(exports2, module2) { + var FACET_SCORES = { + "prs.": 100, + "x-": 200, + "x.": 300, + "vnd.": 400, + default: 900 + }; + var SOURCE_SCORES = { + nginx: 10, + apache: 20, + iana: 40, + default: 30 + // definitions added by `jshttp/mime-db` project? + }; + var TYPE_SCORES = { + // prefer application/xml over text/xml + // prefer application/rtf over text/rtf + application: 1, + // prefer font/woff over application/font-woff + font: 2, + default: 0 + }; + module2.exports = function mimeScore(mimeType, source = "default") { + if (mimeType === "application/octet-stream") { + return 0; + } + const [type, subtype] = mimeType.split("/"); + const facet = subtype.replace(/(\.|x-).*/, "$1"); + const facetScore = FACET_SCORES[facet] || FACET_SCORES.default; + const sourceScore = SOURCE_SCORES[source] || SOURCE_SCORES.default; + const typeScore = TYPE_SCORES[type] || TYPE_SCORES.default; + const lengthScore = 1 - mimeType.length / 100; + return facetScore + sourceScore + typeScore + lengthScore; + }; + } +}); + +// node_modules/mime-types/index.js +var require_mime_types = __commonJS({ + "node_modules/mime-types/index.js"(exports2) { + "use strict"; + var db = require_mime_db(); + var extname = require("path").extname; + var mimeScore = require_mimeScore(); + var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/; + var TEXT_TYPE_REGEXP = /^text\//i; + exports2.charset = charset; + exports2.charsets = { lookup: charset }; + exports2.contentType = contentType; + exports2.extension = extension; + exports2.extensions = /* @__PURE__ */ Object.create(null); + exports2.lookup = lookup2; + exports2.types = /* @__PURE__ */ Object.create(null); + exports2._extensionConflicts = []; + populateMaps(exports2.extensions, exports2.types); + function charset(type) { + if (!type || typeof type !== "string") { + return false; + } + var match = EXTRACT_TYPE_REGEXP.exec(type); + var mime2 = match && db[match[1].toLowerCase()]; + if (mime2 && mime2.charset) { + return mime2.charset; + } + if (match && TEXT_TYPE_REGEXP.test(match[1])) { + return "UTF-8"; + } + return false; + } + function contentType(str) { + if (!str || typeof str !== "string") { + return false; + } + var mime2 = str.indexOf("/") === -1 ? exports2.lookup(str) : str; + if (!mime2) { + return false; + } + if (mime2.indexOf("charset") === -1) { + var charset2 = exports2.charset(mime2); + if (charset2) + mime2 += "; charset=" + charset2.toLowerCase(); + } + return mime2; + } + function extension(type) { + if (!type || typeof type !== "string") { + return false; + } + var match = EXTRACT_TYPE_REGEXP.exec(type); + var exts = match && exports2.extensions[match[1].toLowerCase()]; + if (!exts || !exts.length) { + return false; + } + return exts[0]; + } + function lookup2(path2) { + if (!path2 || typeof path2 !== "string") { + return false; + } + var extension2 = extname("x." + path2).toLowerCase().slice(1); + if (!extension2) { + return false; + } + return exports2.types[extension2] || false; + } + function populateMaps(extensions, types) { + Object.keys(db).forEach(function forEachMimeType(type) { + var mime2 = db[type]; + var exts = mime2.extensions; + if (!exts || !exts.length) { + return; + } + extensions[type] = exts; + for (var i = 0; i < exts.length; i++) { + var extension2 = exts[i]; + types[extension2] = _preferredType(extension2, types[extension2], type); + const legacyType = _preferredTypeLegacy( + extension2, + types[extension2], + type + ); + if (legacyType !== types[extension2]) { + exports2._extensionConflicts.push([extension2, legacyType, types[extension2]]); + } + } + }); + } + function _preferredType(ext, type0, type1) { + var score0 = type0 ? mimeScore(type0, db[type0].source) : 0; + var score1 = type1 ? mimeScore(type1, db[type1].source) : 0; + return score0 > score1 ? type0 : type1; + } + function _preferredTypeLegacy(ext, type0, type1) { + var _a; + var SOURCE_RANK = ["nginx", "apache", void 0, "iana"]; + var score0 = type0 ? SOURCE_RANK.indexOf(db[type0].source) : 0; + var score1 = type1 ? SOURCE_RANK.indexOf(db[type1].source) : 0; + if (exports2.types[extension] !== "application/octet-stream" && (score0 > score1 || score0 === score1 && ((_a = exports2.types[extension]) == null ? void 0 : _a.slice(0, 12)) === "application/")) { + return type0; + } + return score0 > score1 ? type0 : type1; + } + } +}); + +// main.ts +var main_exports = {}; +__export(main_exports, { + default: () => OnlyOfficePlugin +}); +module.exports = __toCommonJS(main_exports); +var import_obsidian = require("obsidian"); +var path = __toESM(require("path")); +var fs = __toESM(require("fs")); + +// node_modules/jose/dist/webapi/lib/buffer_utils.js +var encoder = new TextEncoder(); +var decoder = new TextDecoder(); +var MAX_INT32 = 2 ** 32; +function concat(...buffers) { + const size = buffers.reduce((acc, { length }) => acc + length, 0); + const buf = new Uint8Array(size); + let i = 0; + for (const buffer of buffers) { + buf.set(buffer, i); + i += buffer.length; + } + return buf; +} + +// node_modules/jose/dist/webapi/lib/base64.js +function encodeBase64(input) { + if (Uint8Array.prototype.toBase64) { + return input.toBase64(); + } + const CHUNK_SIZE = 32768; + const arr = []; + for (let i = 0; i < input.length; i += CHUNK_SIZE) { + arr.push(String.fromCharCode.apply(null, input.subarray(i, i + CHUNK_SIZE))); + } + return btoa(arr.join("")); +} +function decodeBase64(encoded) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(encoded); + } + const binary = atob(encoded); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; +} + +// node_modules/jose/dist/webapi/util/base64url.js +function decode(input) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(typeof input === "string" ? input : decoder.decode(input), { + alphabet: "base64url" + }); + } + let encoded = input; + if (encoded instanceof Uint8Array) { + encoded = decoder.decode(encoded); + } + encoded = encoded.replace(/-/g, "+").replace(/_/g, "/").replace(/\s/g, ""); + try { + return decodeBase64(encoded); + } catch (e) { + throw new TypeError("The input to be decoded is not correctly encoded."); + } +} +function encode(input) { + let unencoded = input; + if (typeof unencoded === "string") { + unencoded = encoder.encode(unencoded); + } + if (Uint8Array.prototype.toBase64) { + return unencoded.toBase64({ alphabet: "base64url", omitPadding: true }); + } + return encodeBase64(unencoded).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); +} + +// node_modules/jose/dist/webapi/util/errors.js +var JOSEError = class extends Error { + constructor(message2, options) { + var _a; + super(message2, options); + __publicField(this, "code", "ERR_JOSE_GENERIC"); + this.name = this.constructor.name; + (_a = Error.captureStackTrace) == null ? void 0 : _a.call(Error, this, this.constructor); + } +}; +__publicField(JOSEError, "code", "ERR_JOSE_GENERIC"); +var JOSENotSupported = class extends JOSEError { + constructor() { + super(...arguments); + __publicField(this, "code", "ERR_JOSE_NOT_SUPPORTED"); + } +}; +__publicField(JOSENotSupported, "code", "ERR_JOSE_NOT_SUPPORTED"); +var JWSInvalid = class extends JOSEError { + constructor() { + super(...arguments); + __publicField(this, "code", "ERR_JWS_INVALID"); + } +}; +__publicField(JWSInvalid, "code", "ERR_JWS_INVALID"); +var JWTInvalid = class extends JOSEError { + constructor() { + super(...arguments); + __publicField(this, "code", "ERR_JWT_INVALID"); + } +}; +__publicField(JWTInvalid, "code", "ERR_JWT_INVALID"); + +// node_modules/jose/dist/webapi/lib/crypto_key.js +function unusable(name, prop = "algorithm.name") { + return new TypeError(`CryptoKey does not support this operation, its ${prop} must be ${name}`); +} +function isAlgorithm(algorithm, name) { + return algorithm.name === name; +} +function getHashLength(hash) { + return parseInt(hash.name.slice(4), 10); +} +function getNamedCurve(alg) { + switch (alg) { + case "ES256": + return "P-256"; + case "ES384": + return "P-384"; + case "ES512": + return "P-521"; + default: + throw new Error("unreachable"); + } +} +function checkUsage(key, usage) { + if (usage && !key.usages.includes(usage)) { + throw new TypeError(`CryptoKey does not support this operation, its usages must include ${usage}.`); + } +} +function checkSigCryptoKey(key, alg, usage) { + switch (alg) { + case "HS256": + case "HS384": + case "HS512": { + if (!isAlgorithm(key.algorithm, "HMAC")) + throw unusable("HMAC"); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, "algorithm.hash"); + break; + } + case "RS256": + case "RS384": + case "RS512": { + if (!isAlgorithm(key.algorithm, "RSASSA-PKCS1-v1_5")) + throw unusable("RSASSA-PKCS1-v1_5"); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, "algorithm.hash"); + break; + } + case "PS256": + case "PS384": + case "PS512": { + if (!isAlgorithm(key.algorithm, "RSA-PSS")) + throw unusable("RSA-PSS"); + const expected = parseInt(alg.slice(2), 10); + const actual = getHashLength(key.algorithm.hash); + if (actual !== expected) + throw unusable(`SHA-${expected}`, "algorithm.hash"); + break; + } + case "Ed25519": + case "EdDSA": { + if (!isAlgorithm(key.algorithm, "Ed25519")) + throw unusable("Ed25519"); + break; + } + case "ES256": + case "ES384": + case "ES512": { + if (!isAlgorithm(key.algorithm, "ECDSA")) + throw unusable("ECDSA"); + const expected = getNamedCurve(alg); + const actual = key.algorithm.namedCurve; + if (actual !== expected) + throw unusable(expected, "algorithm.namedCurve"); + break; + } + default: + throw new TypeError("CryptoKey does not support this operation"); + } + checkUsage(key, usage); +} + +// node_modules/jose/dist/webapi/lib/invalid_key_input.js +function message(msg, actual, ...types) { + var _a; + types = types.filter(Boolean); + if (types.length > 2) { + const last = types.pop(); + msg += `one of type ${types.join(", ")}, or ${last}.`; + } else if (types.length === 2) { + msg += `one of type ${types[0]} or ${types[1]}.`; + } else { + msg += `of type ${types[0]}.`; + } + if (actual == null) { + msg += ` Received ${actual}`; + } else if (typeof actual === "function" && actual.name) { + msg += ` Received function ${actual.name}`; + } else if (typeof actual === "object" && actual != null) { + if ((_a = actual.constructor) == null ? void 0 : _a.name) { + msg += ` Received an instance of ${actual.constructor.name}`; + } + } + return msg; +} +var invalid_key_input_default = (actual, ...types) => { + return message("Key must be ", actual, ...types); +}; +function withAlg(alg, actual, ...types) { + return message(`Key for the ${alg} algorithm must be `, actual, ...types); +} + +// node_modules/jose/dist/webapi/lib/is_key_like.js +function isCryptoKey(key) { + return (key == null ? void 0 : key[Symbol.toStringTag]) === "CryptoKey"; +} +function isKeyObject(key) { + return (key == null ? void 0 : key[Symbol.toStringTag]) === "KeyObject"; +} +var is_key_like_default = (key) => { + return isCryptoKey(key) || isKeyObject(key); +}; + +// node_modules/jose/dist/webapi/lib/is_disjoint.js +var is_disjoint_default = (...headers) => { + const sources = headers.filter(Boolean); + if (sources.length === 0 || sources.length === 1) { + return true; + } + let acc; + for (const header of sources) { + const parameters = Object.keys(header); + if (!acc || acc.size === 0) { + acc = new Set(parameters); + continue; + } + for (const parameter of parameters) { + if (acc.has(parameter)) { + return false; + } + acc.add(parameter); + } + } + return true; +}; + +// node_modules/jose/dist/webapi/lib/is_object.js +function isObjectLike(value) { + return typeof value === "object" && value !== null; +} +var is_object_default = (input) => { + if (!isObjectLike(input) || Object.prototype.toString.call(input) !== "[object Object]") { + return false; + } + if (Object.getPrototypeOf(input) === null) { + return true; + } + let proto = input; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + return Object.getPrototypeOf(input) === proto; +}; + +// node_modules/jose/dist/webapi/lib/check_key_length.js +var check_key_length_default = (alg, key) => { + if (alg.startsWith("RS") || alg.startsWith("PS")) { + const { modulusLength } = key.algorithm; + if (typeof modulusLength !== "number" || modulusLength < 2048) { + throw new TypeError(`${alg} requires key modulusLength to be 2048 bits or larger`); + } + } +}; + +// node_modules/jose/dist/webapi/lib/jwk_to_key.js +function subtleMapping(jwk) { + let algorithm; + let keyUsages; + switch (jwk.kty) { + case "RSA": { + switch (jwk.alg) { + case "PS256": + case "PS384": + case "PS512": + algorithm = { name: "RSA-PSS", hash: `SHA-${jwk.alg.slice(-3)}` }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "RS256": + case "RS384": + case "RS512": + algorithm = { name: "RSASSA-PKCS1-v1_5", hash: `SHA-${jwk.alg.slice(-3)}` }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "RSA-OAEP": + case "RSA-OAEP-256": + case "RSA-OAEP-384": + case "RSA-OAEP-512": + algorithm = { + name: "RSA-OAEP", + hash: `SHA-${parseInt(jwk.alg.slice(-3), 10) || 1}` + }; + keyUsages = jwk.d ? ["decrypt", "unwrapKey"] : ["encrypt", "wrapKey"]; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + case "EC": { + switch (jwk.alg) { + case "ES256": + algorithm = { name: "ECDSA", namedCurve: "P-256" }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "ES384": + algorithm = { name: "ECDSA", namedCurve: "P-384" }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "ES512": + algorithm = { name: "ECDSA", namedCurve: "P-521" }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "ECDH-ES": + case "ECDH-ES+A128KW": + case "ECDH-ES+A192KW": + case "ECDH-ES+A256KW": + algorithm = { name: "ECDH", namedCurve: jwk.crv }; + keyUsages = jwk.d ? ["deriveBits"] : []; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + case "OKP": { + switch (jwk.alg) { + case "Ed25519": + case "EdDSA": + algorithm = { name: "Ed25519" }; + keyUsages = jwk.d ? ["sign"] : ["verify"]; + break; + case "ECDH-ES": + case "ECDH-ES+A128KW": + case "ECDH-ES+A192KW": + case "ECDH-ES+A256KW": + algorithm = { name: jwk.crv }; + keyUsages = jwk.d ? ["deriveBits"] : []; + break; + default: + throw new JOSENotSupported('Invalid or unsupported JWK "alg" (Algorithm) Parameter value'); + } + break; + } + default: + throw new JOSENotSupported('Invalid or unsupported JWK "kty" (Key Type) Parameter value'); + } + return { algorithm, keyUsages }; +} +var jwk_to_key_default = async (jwk) => { + var _a, _b; + if (!jwk.alg) { + throw new TypeError('"alg" argument is required when "jwk.alg" is not present'); + } + const { algorithm, keyUsages } = subtleMapping(jwk); + const keyData = { ...jwk }; + delete keyData.alg; + delete keyData.use; + return crypto.subtle.importKey("jwk", keyData, algorithm, (_a = jwk.ext) != null ? _a : jwk.d ? false : true, (_b = jwk.key_ops) != null ? _b : keyUsages); +}; + +// node_modules/jose/dist/webapi/lib/validate_crit.js +var validate_crit_default = (Err, recognizedDefault, recognizedOption, protectedHeader, joseHeader) => { + if (joseHeader.crit !== void 0 && (protectedHeader == null ? void 0 : protectedHeader.crit) === void 0) { + throw new Err('"crit" (Critical) Header Parameter MUST be integrity protected'); + } + if (!protectedHeader || protectedHeader.crit === void 0) { + return /* @__PURE__ */ new Set(); + } + if (!Array.isArray(protectedHeader.crit) || protectedHeader.crit.length === 0 || protectedHeader.crit.some((input) => typeof input !== "string" || input.length === 0)) { + throw new Err('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present'); + } + let recognized; + if (recognizedOption !== void 0) { + recognized = new Map([...Object.entries(recognizedOption), ...recognizedDefault.entries()]); + } else { + recognized = recognizedDefault; + } + for (const parameter of protectedHeader.crit) { + if (!recognized.has(parameter)) { + throw new JOSENotSupported(`Extension Header Parameter "${parameter}" is not recognized`); + } + if (joseHeader[parameter] === void 0) { + throw new Err(`Extension Header Parameter "${parameter}" is missing`); + } + if (recognized.get(parameter) && protectedHeader[parameter] === void 0) { + throw new Err(`Extension Header Parameter "${parameter}" MUST be integrity protected`); + } + } + return new Set(protectedHeader.crit); +}; + +// node_modules/jose/dist/webapi/lib/is_jwk.js +function isJWK(key) { + return is_object_default(key) && typeof key.kty === "string"; +} +function isPrivateJWK(key) { + return key.kty !== "oct" && typeof key.d === "string"; +} +function isPublicJWK(key) { + return key.kty !== "oct" && typeof key.d === "undefined"; +} +function isSecretJWK(key) { + return key.kty === "oct" && typeof key.k === "string"; +} + +// node_modules/jose/dist/webapi/lib/normalize_key.js +var cache; +var handleJWK = async (key, jwk, alg, freeze = false) => { + cache || (cache = /* @__PURE__ */ new WeakMap()); + let cached = cache.get(key); + if (cached == null ? void 0 : cached[alg]) { + return cached[alg]; + } + const cryptoKey = await jwk_to_key_default({ ...jwk, alg }); + if (freeze) + Object.freeze(key); + if (!cached) { + cache.set(key, { [alg]: cryptoKey }); + } else { + cached[alg] = cryptoKey; + } + return cryptoKey; +}; +var handleKeyObject = (keyObject, alg) => { + var _a; + cache || (cache = /* @__PURE__ */ new WeakMap()); + let cached = cache.get(keyObject); + if (cached == null ? void 0 : cached[alg]) { + return cached[alg]; + } + const isPublic = keyObject.type === "public"; + const extractable = isPublic ? true : false; + let cryptoKey; + if (keyObject.asymmetricKeyType === "x25519") { + switch (alg) { + case "ECDH-ES": + case "ECDH-ES+A128KW": + case "ECDH-ES+A192KW": + case "ECDH-ES+A256KW": + break; + default: + throw new TypeError("given KeyObject instance cannot be used for this algorithm"); + } + cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, isPublic ? [] : ["deriveBits"]); + } + if (keyObject.asymmetricKeyType === "ed25519") { + if (alg !== "EdDSA" && alg !== "Ed25519") { + throw new TypeError("given KeyObject instance cannot be used for this algorithm"); + } + cryptoKey = keyObject.toCryptoKey(keyObject.asymmetricKeyType, extractable, [ + isPublic ? "verify" : "sign" + ]); + } + if (keyObject.asymmetricKeyType === "rsa") { + let hash; + switch (alg) { + case "RSA-OAEP": + hash = "SHA-1"; + break; + case "RS256": + case "PS256": + case "RSA-OAEP-256": + hash = "SHA-256"; + break; + case "RS384": + case "PS384": + case "RSA-OAEP-384": + hash = "SHA-384"; + break; + case "RS512": + case "PS512": + case "RSA-OAEP-512": + hash = "SHA-512"; + break; + default: + throw new TypeError("given KeyObject instance cannot be used for this algorithm"); + } + if (alg.startsWith("RSA-OAEP")) { + return keyObject.toCryptoKey({ + name: "RSA-OAEP", + hash + }, extractable, isPublic ? ["encrypt"] : ["decrypt"]); + } + cryptoKey = keyObject.toCryptoKey({ + name: alg.startsWith("PS") ? "RSA-PSS" : "RSASSA-PKCS1-v1_5", + hash + }, extractable, [isPublic ? "verify" : "sign"]); + } + if (keyObject.asymmetricKeyType === "ec") { + const nist = /* @__PURE__ */ new Map([ + ["prime256v1", "P-256"], + ["secp384r1", "P-384"], + ["secp521r1", "P-521"] + ]); + const namedCurve = nist.get((_a = keyObject.asymmetricKeyDetails) == null ? void 0 : _a.namedCurve); + if (!namedCurve) { + throw new TypeError("given KeyObject instance cannot be used for this algorithm"); + } + if (alg === "ES256" && namedCurve === "P-256") { + cryptoKey = keyObject.toCryptoKey({ + name: "ECDSA", + namedCurve + }, extractable, [isPublic ? "verify" : "sign"]); + } + if (alg === "ES384" && namedCurve === "P-384") { + cryptoKey = keyObject.toCryptoKey({ + name: "ECDSA", + namedCurve + }, extractable, [isPublic ? "verify" : "sign"]); + } + if (alg === "ES512" && namedCurve === "P-521") { + cryptoKey = keyObject.toCryptoKey({ + name: "ECDSA", + namedCurve + }, extractable, [isPublic ? "verify" : "sign"]); + } + if (alg.startsWith("ECDH-ES")) { + cryptoKey = keyObject.toCryptoKey({ + name: "ECDH", + namedCurve + }, extractable, isPublic ? [] : ["deriveBits"]); + } + } + if (!cryptoKey) { + throw new TypeError("given KeyObject instance cannot be used for this algorithm"); + } + if (!cached) { + cache.set(keyObject, { [alg]: cryptoKey }); + } else { + cached[alg] = cryptoKey; + } + return cryptoKey; +}; +var normalize_key_default = async (key, alg) => { + if (key instanceof Uint8Array) { + return key; + } + if (isCryptoKey(key)) { + return key; + } + if (isKeyObject(key)) { + if (key.type === "secret") { + return key.export(); + } + if ("toCryptoKey" in key && typeof key.toCryptoKey === "function") { + try { + return handleKeyObject(key, alg); + } catch (err) { + if (err instanceof TypeError) { + throw err; + } + } + } + let jwk = key.export({ format: "jwk" }); + return handleJWK(key, jwk, alg); + } + if (isJWK(key)) { + if (key.k) { + return decode(key.k); + } + return handleJWK(key, key, alg, true); + } + throw new Error("unreachable"); +}; + +// node_modules/jose/dist/webapi/lib/check_key_type.js +var tag = (key) => key == null ? void 0 : key[Symbol.toStringTag]; +var jwkMatchesOp = (alg, key, usage) => { + var _a, _b; + if (key.use !== void 0) { + let expected; + switch (usage) { + case "sign": + case "verify": + expected = "sig"; + break; + case "encrypt": + case "decrypt": + expected = "enc"; + break; + } + if (key.use !== expected) { + throw new TypeError(`Invalid key for this operation, its "use" must be "${expected}" when present`); + } + } + if (key.alg !== void 0 && key.alg !== alg) { + throw new TypeError(`Invalid key for this operation, its "alg" must be "${alg}" when present`); + } + if (Array.isArray(key.key_ops)) { + let expectedKeyOp; + switch (true) { + case (usage === "sign" || usage === "verify"): + case alg === "dir": + case alg.includes("CBC-HS"): + expectedKeyOp = usage; + break; + case alg.startsWith("PBES2"): + expectedKeyOp = "deriveBits"; + break; + case /^A\d{3}(?:GCM)?(?:KW)?$/.test(alg): + if (!alg.includes("GCM") && alg.endsWith("KW")) { + expectedKeyOp = usage === "encrypt" ? "wrapKey" : "unwrapKey"; + } else { + expectedKeyOp = usage; + } + break; + case (usage === "encrypt" && alg.startsWith("RSA")): + expectedKeyOp = "wrapKey"; + break; + case usage === "decrypt": + expectedKeyOp = alg.startsWith("RSA") ? "unwrapKey" : "deriveBits"; + break; + } + if (expectedKeyOp && ((_b = (_a = key.key_ops) == null ? void 0 : _a.includes) == null ? void 0 : _b.call(_a, expectedKeyOp)) === false) { + throw new TypeError(`Invalid key for this operation, its "key_ops" must include "${expectedKeyOp}" when present`); + } + } + return true; +}; +var symmetricTypeCheck = (alg, key, usage) => { + if (key instanceof Uint8Array) + return; + if (isJWK(key)) { + if (isSecretJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present`); + } + if (!is_key_like_default(key)) { + throw new TypeError(withAlg(alg, key, "CryptoKey", "KeyObject", "JSON Web Key", "Uint8Array")); + } + if (key.type !== "secret") { + throw new TypeError(`${tag(key)} instances for symmetric algorithms must be of type "secret"`); + } +}; +var asymmetricTypeCheck = (alg, key, usage) => { + if (isJWK(key)) { + switch (usage) { + case "decrypt": + case "sign": + if (isPrivateJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for this operation be a private JWK`); + case "encrypt": + case "verify": + if (isPublicJWK(key) && jwkMatchesOp(alg, key, usage)) + return; + throw new TypeError(`JSON Web Key for this operation be a public JWK`); + } + } + if (!is_key_like_default(key)) { + throw new TypeError(withAlg(alg, key, "CryptoKey", "KeyObject", "JSON Web Key")); + } + if (key.type === "secret") { + throw new TypeError(`${tag(key)} instances for asymmetric algorithms must not be of type "secret"`); + } + if (key.type === "public") { + switch (usage) { + case "sign": + throw new TypeError(`${tag(key)} instances for asymmetric algorithm signing must be of type "private"`); + case "decrypt": + throw new TypeError(`${tag(key)} instances for asymmetric algorithm decryption must be of type "private"`); + default: + break; + } + } + if (key.type === "private") { + switch (usage) { + case "verify": + throw new TypeError(`${tag(key)} instances for asymmetric algorithm verifying must be of type "public"`); + case "encrypt": + throw new TypeError(`${tag(key)} instances for asymmetric algorithm encryption must be of type "public"`); + default: + break; + } + } +}; +var check_key_type_default = (alg, key, usage) => { + const symmetric = alg.startsWith("HS") || alg === "dir" || alg.startsWith("PBES2") || /^A(?:128|192|256)(?:GCM)?(?:KW)?$/.test(alg) || /^A(?:128|192|256)CBC-HS(?:256|384|512)$/.test(alg); + if (symmetric) { + symmetricTypeCheck(alg, key, usage); + } else { + asymmetricTypeCheck(alg, key, usage); + } +}; + +// node_modules/jose/dist/webapi/lib/subtle_dsa.js +var subtle_dsa_default = (alg, algorithm) => { + const hash = `SHA-${alg.slice(-3)}`; + switch (alg) { + case "HS256": + case "HS384": + case "HS512": + return { hash, name: "HMAC" }; + case "PS256": + case "PS384": + case "PS512": + return { hash, name: "RSA-PSS", saltLength: parseInt(alg.slice(-3), 10) >> 3 }; + case "RS256": + case "RS384": + case "RS512": + return { hash, name: "RSASSA-PKCS1-v1_5" }; + case "ES256": + case "ES384": + case "ES512": + return { hash, name: "ECDSA", namedCurve: algorithm.namedCurve }; + case "Ed25519": + case "EdDSA": + return { name: "Ed25519" }; + default: + throw new JOSENotSupported(`alg ${alg} is not supported either by JOSE or your javascript runtime`); + } +}; + +// node_modules/jose/dist/webapi/lib/get_sign_verify_key.js +var get_sign_verify_key_default = async (alg, key, usage) => { + if (key instanceof Uint8Array) { + if (!alg.startsWith("HS")) { + throw new TypeError(invalid_key_input_default(key, "CryptoKey", "KeyObject", "JSON Web Key")); + } + return crypto.subtle.importKey("raw", key, { hash: `SHA-${alg.slice(-3)}`, name: "HMAC" }, false, [usage]); + } + checkSigCryptoKey(key, alg, usage); + return key; +}; + +// node_modules/jose/dist/webapi/lib/epoch.js +var epoch_default = (date) => Math.floor(date.getTime() / 1e3); + +// node_modules/jose/dist/webapi/lib/secs.js +var minute = 60; +var hour = minute * 60; +var day = hour * 24; +var week = day * 7; +var year = day * 365.25; +var REGEX = /^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i; +var secs_default = (str) => { + const matched = REGEX.exec(str); + if (!matched || matched[4] && matched[1]) { + throw new TypeError("Invalid time period format"); + } + const value = parseFloat(matched[2]); + const unit = matched[3].toLowerCase(); + let numericDate; + switch (unit) { + case "sec": + case "secs": + case "second": + case "seconds": + case "s": + numericDate = Math.round(value); + break; + case "minute": + case "minutes": + case "min": + case "mins": + case "m": + numericDate = Math.round(value * minute); + break; + case "hour": + case "hours": + case "hr": + case "hrs": + case "h": + numericDate = Math.round(value * hour); + break; + case "day": + case "days": + case "d": + numericDate = Math.round(value * day); + break; + case "week": + case "weeks": + case "w": + numericDate = Math.round(value * week); + break; + default: + numericDate = Math.round(value * year); + break; + } + if (matched[1] === "-" || matched[4] === "ago") { + return -numericDate; + } + return numericDate; +}; + +// node_modules/jose/dist/webapi/lib/jwt_claims_set.js +function validateInput(label, input) { + if (!Number.isFinite(input)) { + throw new TypeError(`Invalid ${label} input`); + } + return input; +} +var _payload; +var JWTClaimsBuilder = class { + constructor(payload) { + __privateAdd(this, _payload, void 0); + if (!is_object_default(payload)) { + throw new TypeError("JWT Claims Set MUST be an object"); + } + __privateSet(this, _payload, structuredClone(payload)); + } + data() { + return encoder.encode(JSON.stringify(__privateGet(this, _payload))); + } + get iss() { + return __privateGet(this, _payload).iss; + } + set iss(value) { + __privateGet(this, _payload).iss = value; + } + get sub() { + return __privateGet(this, _payload).sub; + } + set sub(value) { + __privateGet(this, _payload).sub = value; + } + get aud() { + return __privateGet(this, _payload).aud; + } + set aud(value) { + __privateGet(this, _payload).aud = value; + } + set jti(value) { + __privateGet(this, _payload).jti = value; + } + set nbf(value) { + if (typeof value === "number") { + __privateGet(this, _payload).nbf = validateInput("setNotBefore", value); + } else if (value instanceof Date) { + __privateGet(this, _payload).nbf = validateInput("setNotBefore", epoch_default(value)); + } else { + __privateGet(this, _payload).nbf = epoch_default(/* @__PURE__ */ new Date()) + secs_default(value); + } + } + set exp(value) { + if (typeof value === "number") { + __privateGet(this, _payload).exp = validateInput("setExpirationTime", value); + } else if (value instanceof Date) { + __privateGet(this, _payload).exp = validateInput("setExpirationTime", epoch_default(value)); + } else { + __privateGet(this, _payload).exp = epoch_default(/* @__PURE__ */ new Date()) + secs_default(value); + } + } + set iat(value) { + if (typeof value === "undefined") { + __privateGet(this, _payload).iat = epoch_default(/* @__PURE__ */ new Date()); + } else if (value instanceof Date) { + __privateGet(this, _payload).iat = validateInput("setIssuedAt", epoch_default(value)); + } else if (typeof value === "string") { + __privateGet(this, _payload).iat = validateInput("setIssuedAt", epoch_default(/* @__PURE__ */ new Date()) + secs_default(value)); + } else { + __privateGet(this, _payload).iat = validateInput("setIssuedAt", value); + } + } +}; +_payload = new WeakMap(); + +// node_modules/jose/dist/webapi/lib/sign.js +var sign_default = async (alg, key, data) => { + const cryptoKey = await get_sign_verify_key_default(alg, key, "sign"); + check_key_length_default(alg, cryptoKey); + const signature = await crypto.subtle.sign(subtle_dsa_default(alg, cryptoKey.algorithm), cryptoKey, data); + return new Uint8Array(signature); +}; + +// node_modules/jose/dist/webapi/jws/flattened/sign.js +var _payload2, _protectedHeader, _unprotectedHeader; +var FlattenedSign = class { + constructor(payload) { + __privateAdd(this, _payload2, void 0); + __privateAdd(this, _protectedHeader, void 0); + __privateAdd(this, _unprotectedHeader, void 0); + if (!(payload instanceof Uint8Array)) { + throw new TypeError("payload must be an instance of Uint8Array"); + } + __privateSet(this, _payload2, payload); + } + setProtectedHeader(protectedHeader) { + if (__privateGet(this, _protectedHeader)) { + throw new TypeError("setProtectedHeader can only be called once"); + } + __privateSet(this, _protectedHeader, protectedHeader); + return this; + } + setUnprotectedHeader(unprotectedHeader) { + if (__privateGet(this, _unprotectedHeader)) { + throw new TypeError("setUnprotectedHeader can only be called once"); + } + __privateSet(this, _unprotectedHeader, unprotectedHeader); + return this; + } + async sign(key, options) { + if (!__privateGet(this, _protectedHeader) && !__privateGet(this, _unprotectedHeader)) { + throw new JWSInvalid("either setProtectedHeader or setUnprotectedHeader must be called before #sign()"); + } + if (!is_disjoint_default(__privateGet(this, _protectedHeader), __privateGet(this, _unprotectedHeader))) { + throw new JWSInvalid("JWS Protected and JWS Unprotected Header Parameter names must be disjoint"); + } + const joseHeader = { + ...__privateGet(this, _protectedHeader), + ...__privateGet(this, _unprotectedHeader) + }; + const extensions = validate_crit_default(JWSInvalid, /* @__PURE__ */ new Map([["b64", true]]), options == null ? void 0 : options.crit, __privateGet(this, _protectedHeader), joseHeader); + let b64 = true; + if (extensions.has("b64")) { + b64 = __privateGet(this, _protectedHeader).b64; + if (typeof b64 !== "boolean") { + throw new JWSInvalid('The "b64" (base64url-encode payload) Header Parameter must be a boolean'); + } + } + const { alg } = joseHeader; + if (typeof alg !== "string" || !alg) { + throw new JWSInvalid('JWS "alg" (Algorithm) Header Parameter missing or invalid'); + } + check_key_type_default(alg, key, "sign"); + let payload = __privateGet(this, _payload2); + if (b64) { + payload = encoder.encode(encode(payload)); + } + let protectedHeader; + if (__privateGet(this, _protectedHeader)) { + protectedHeader = encoder.encode(encode(JSON.stringify(__privateGet(this, _protectedHeader)))); + } else { + protectedHeader = encoder.encode(""); + } + const data = concat(protectedHeader, encoder.encode("."), payload); + const k = await normalize_key_default(key, alg); + const signature = await sign_default(alg, k, data); + const jws = { + signature: encode(signature), + payload: "" + }; + if (b64) { + jws.payload = decoder.decode(payload); + } + if (__privateGet(this, _unprotectedHeader)) { + jws.header = __privateGet(this, _unprotectedHeader); + } + if (__privateGet(this, _protectedHeader)) { + jws.protected = decoder.decode(protectedHeader); + } + return jws; + } +}; +_payload2 = new WeakMap(); +_protectedHeader = new WeakMap(); +_unprotectedHeader = new WeakMap(); + +// node_modules/jose/dist/webapi/jws/compact/sign.js +var _flattened; +var CompactSign = class { + constructor(payload) { + __privateAdd(this, _flattened, void 0); + __privateSet(this, _flattened, new FlattenedSign(payload)); + } + setProtectedHeader(protectedHeader) { + __privateGet(this, _flattened).setProtectedHeader(protectedHeader); + return this; + } + async sign(key, options) { + const jws = await __privateGet(this, _flattened).sign(key, options); + if (jws.payload === void 0) { + throw new TypeError("use the flattened module for creating JWS with b64: false"); + } + return `${jws.protected}.${jws.payload}.${jws.signature}`; + } +}; +_flattened = new WeakMap(); + +// node_modules/jose/dist/webapi/jwt/sign.js +var _protectedHeader2, _jwt; +var SignJWT = class { + constructor(payload = {}) { + __privateAdd(this, _protectedHeader2, void 0); + __privateAdd(this, _jwt, void 0); + __privateSet(this, _jwt, new JWTClaimsBuilder(payload)); + } + setIssuer(issuer) { + __privateGet(this, _jwt).iss = issuer; + return this; + } + setSubject(subject) { + __privateGet(this, _jwt).sub = subject; + return this; + } + setAudience(audience) { + __privateGet(this, _jwt).aud = audience; + return this; + } + setJti(jwtId) { + __privateGet(this, _jwt).jti = jwtId; + return this; + } + setNotBefore(input) { + __privateGet(this, _jwt).nbf = input; + return this; + } + setExpirationTime(input) { + __privateGet(this, _jwt).exp = input; + return this; + } + setIssuedAt(input) { + __privateGet(this, _jwt).iat = input; + return this; + } + setProtectedHeader(protectedHeader) { + __privateSet(this, _protectedHeader2, protectedHeader); + return this; + } + async sign(key, options) { + var _a; + const sig = new CompactSign(__privateGet(this, _jwt).data()); + sig.setProtectedHeader(__privateGet(this, _protectedHeader2)); + if (Array.isArray((_a = __privateGet(this, _protectedHeader2)) == null ? void 0 : _a.crit) && __privateGet(this, _protectedHeader2).crit.includes("b64") && __privateGet(this, _protectedHeader2).b64 === false) { + throw new JWTInvalid("JWTs MUST NOT use unencoded payload"); + } + return sig.sign(key, options); + } +}; +_protectedHeader2 = new WeakMap(); +_jwt = new WeakMap(); + +// main.ts +var http = __toESM(require("http")); +var mime = __toESM(require_mime_types()); +var DEFAULT_SETTINGS = { + onlyOfficeServerPort: 8080, + jwtSecret: "your-secret-key-please-change", + localServerAddress: "host.docker.internal", + htmlServerPort: 0, + // 0 = dynamic starting at 8081 + callbackServerPort: 0, + // 0 = dynamic starting at 8082 + useRequestToken: true, + useSystemSaveAs: false, + hideDownloadAs: true, + promptNameOnCreate: true, + restrictToLocalhost: false +}; +var VIEW_TYPE_ONLYOFFICE = "onlyoffice-docx"; +var OnlyOfficeDocumentView = class _OnlyOfficeDocumentView extends import_obsidian.FileView { + constructor(leaf, plugin) { + super(leaf); + // The `file` property is now inherited from ItemView and managed by Obsidian's core. + // We no longer need to declare it here. + this.webview = null; + this.iframe = null; + // Make viewId public and stable + this.boundMessageHandler = null; + this.fallbackEditor = null; + this.isDirty = false; + // Add a dirty flag + this.pendingSaveAsName = null; + // store name chosen before download phase + this.saveButton = null; + this.saveAsButton = null; + this.dirtyCheckInterval = null; + // For polling dirty state + this.systemSaveAsRetryPending = false; + // guard for new-doc system Save As + this.performingSystemSaveAsFallback = false; + // prevent concurrent fallback injections + this.currentExt = "docx"; + // track active document extension + // Add these properties for event listeners + this._didFinishLoadListener = null; + this._didFailLoadListener = null; + this.plugin = plugin; + this.viewId = Math.random().toString(36).substring(2, 15); + } + // Return the type for this view + getViewType() { + return VIEW_TYPE_ONLYOFFICE; + } + // Return the display text for this view (the file name) + getDisplayText() { + var _a; + return ((_a = this.file) == null ? void 0 : _a.name) || "Document"; + } + // Get the icon for this view + getIcon() { + return "file-text"; + } + // The custom setState method is removed. The default implementation is sufficient when using `openFile`. + // This method is called by Obsidian when a file is loaded into the view. + async onLoadFile(file) { + var _a, _b; + try { + const state = (_a = this.leaf) == null ? void 0 : _a.getViewState(); + const isTemplate = false; + const container = this.contentEl; + if (!container) { + console.error("OnlyOffice: Could not find view content container. Aborting onLoadFile."); + return; + } + if (!file && !isTemplate) { + container.empty(); + const errorDiv = container.createEl("div", { cls: "onlyoffice-error" }); + errorDiv.createEl("h2", { text: "File Error" }); + errorDiv.createEl("p", { text: "Could not open document: file not found or view was opened without a file." }); + return; + } + if (file) { + this.file = file; + } + if (this.leaf && file) { + const state2 = this.leaf.getViewState(); + if (!state2.state || state2.state.file !== file.path) { + await this.leaf.setViewState({ + ...state2, + state: { ...state2.state || {}, file: file.path } + }); + return; + } + } + if (this.webview) { + if (this._didFinishLoadListener) { + this.webview.removeEventListener("did-finish-load", this._didFinishLoadListener); + this._didFinishLoadListener = null; + } + if (this._didFailLoadListener) { + this.webview.removeEventListener("did-fail-load", this._didFailLoadListener); + this._didFailLoadListener = null; + } + this.webview.remove(); + this.webview = null; + } + this.isDirty = false; + if (this.dirtyCheckInterval) { + clearInterval(this.dirtyCheckInterval); + this.dirtyCheckInterval = null; + } + if (this.plugin.internalServerReady) { + try { + await this.plugin.internalServerReady; + } catch (e) { + } + } + const localHostBaseUrl = `http://127.0.0.1:${this.plugin.localServerPort}`; + const dockerHostBaseUrl = `http://${this.plugin.settings.localServerAddress || "host.docker.internal"}:${this.plugin.localServerPort}`; + const _editorUrl = `${localHostBaseUrl}/embedded-editor.html`; + let htmlOk = false; + let waited = 0; + const maxWait = 5e3; + const checkInterval = 250; + while (waited < maxWait && !htmlOk) { + try { + await (0, import_obsidian.requestUrl)({ + url: _editorUrl, + method: "HEAD", + headers: { "Cache-Control": "no-cache" } + }); + htmlOk = true; + } catch (e) { + await new Promise((res) => setTimeout(res, checkInterval)); + waited += checkInterval; + } + } + if (!htmlOk) { + const error = "OnlyOffice: editor.html is not available from the internal server."; + console.error(error); + new import_obsidian.Notice(error); + this.showEditorError(container, "Could not connect to the local server. Please check that the server is running."); + return; + } + let effectiveFile = file; + if (file) { + const relPathWait = file.path.replace(/\\/g, "/").split("/").map(encodeURIComponent).join("/"); + const docxUrl = `${localHostBaseUrl}/${relPathWait}`; + let docxOk = false; + waited = 0; + while (waited < maxWait && !docxOk) { + try { + await (0, import_obsidian.requestUrl)({ + url: docxUrl, + method: "HEAD", + headers: { "Cache-Control": "no-cache" } + }); + docxOk = true; + } catch (e) { + await new Promise((res) => setTimeout(res, checkInterval)); + waited += checkInterval; + } + } + if (!docxOk) { + const error = `OnlyOffice: The selected DOCX file '${file.name}' is not available from the internal server.`; + console.error(error); + new import_obsidian.Notice(error); + this.showEditorError(container, `File '${file.name}' could not be accessed by the server. Please try again or check the file permissions.`); + return; + } + } + container.empty(); + const randomId = Math.random().toString(36).slice(2, 10); + const mtimeOrNow = ((_b = effectiveFile.stat) == null ? void 0 : _b.mtime) || Date.now(); + const baseForKey = effectiveFile.path + "|" + mtimeOrNow + "|" + randomId; + let hash = 0; + for (let i = 0; i < baseForKey.length; i++) { + hash = hash * 31 + baseForKey.charCodeAt(i) >>> 0; + } + const uniqueKey = "oo_" + hash.toString(36) + "_" + randomId; + if (!this.plugin.keyFileMap) + this.plugin.keyFileMap = {}; + this.plugin.keyFileMap[uniqueKey] = effectiveFile.path; + const relPath2Eff = effectiveFile.path.replace(/\\/g, "/").split("/").map(encodeURIComponent).join("/"); + const hostFileUrlEff = `${localHostBaseUrl}/${relPath2Eff}`; + const dockerFileUrlEff = `${dockerHostBaseUrl}/${relPath2Eff}`; + const callbackUrlEff = `http://${this.plugin.settings.localServerAddress || "host.docker.internal"}:${this.plugin.callbackServerPort}/callback`; + const isStartDocx = false; + const ext = ((effectiveFile == null ? void 0 : effectiveFile.extension) || "").toLowerCase(); + this.currentExt = ext || "docx"; + const supported = ["docx", "xlsx", "pptx", "pdf"]; + if (!supported.includes(ext)) { + this.showEditorError(container, `Unsupported file type .${ext}. Supported: ${supported.join(", ")}`); + return; + } + await this.loadDirectOnlyOfficeInterface( + container, + hostFileUrlEff, + dockerFileUrlEff, + dockerHostBaseUrl, + callbackUrlEff, + effectiveFile, + isStartDocx, + uniqueKey + ); + } catch (error) { + console.error("OnlyOffice: Error in onLoadFile:", error); + new import_obsidian.Notice(`OnlyOffice: Failed to load document - ${error.message || "Unknown error"}`); + try { + const container = this.contentEl; + if (container) { + this.showEditorError(container, `An error occurred while loading the document: ${error.message || "Unknown error"}`); + } + } catch (e) { + console.error("OnlyOffice: Failed to show error in container:", e); + } + } + } + // This method is called by Obsidian when the file is about to be closed. + async onUnloadFile(file) { + var _a; + if (this.isDirty) { + console.log("OnlyOffice: onUnloadFile triggered for dirty file, attempting to save."); + try { + (_a = this.webview) == null ? void 0 : _a.executeJavaScript(`window.docEditor?.serviceCommand("c:forcesave", "");`); + new import_obsidian.Notice("Saving document on close..."); + } catch (error) { + console.error("OnlyOffice: Failed to trigger save on close.", error); + } + } else { + console.log("OnlyOffice: onUnloadFile triggered for clean file, no save needed."); + } + if (this.boundMessageHandler) { + window.removeEventListener("message", this.boundMessageHandler); + this.boundMessageHandler = null; + } + if (this.dirtyCheckInterval) { + clearInterval(this.dirtyCheckInterval); + this.dirtyCheckInterval = null; + } + if (this.webview) { + this.webview.remove(); + this.webview = null; + } + this.contentEl.empty(); + } + // Load the OnlyOffice editor directly in the interface + async loadDirectOnlyOfficeInterface(container, hostFileUrl, dockerFileUrl, dockerBaseUrl, callbackUrl, file, isStartDocx, uniqueKey) { + console.log("Loading OnlyOffice editor interface"); + console.log("OnlyOffice debug: hostFileUrl", hostFileUrl, "dockerFileUrl", dockerFileUrl, "callbackUrl", callbackUrl); + container.empty(); + container.style.cssText = "height: 100%; width: 100%; display: flex; flex-direction: column;"; + const webviewContainer = container.createEl("div", { + attr: { style: "flex-grow: 1; position: relative; width: 100%; height: 100%;" } + }); + const loadingDiv = container.createEl("div", { + attr: { style: "position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10; background: rgba(255,255,255,0.9); padding: 24px 40px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); font-size: 1.2em; color: #333;" } + }); + loadingDiv.textContent = "Loading OnlyOffice editor..."; + this._didFinishLoadListener = null; + this._didFailLoadListener = null; + if (this.boundMessageHandler) { + window.removeEventListener("message", this.boundMessageHandler); + this.boundMessageHandler = null; + } + const webview = document.createElement("webview"); + this.webview = webview; + webview.setAttribute("webpreferences", "contextIsolation=false, nodeIntegration=true"); + webview.setAttribute("partition", "persist:onlyoffice"); + webview.setAttribute("allowpopups", "true"); + webview.style.cssText = "width: 100%; height: 100%; border: none;"; + webview.src = `http://127.0.0.1:${this.plugin.localServerPort}/embedded-editor.html`; + webviewContainer.appendChild(webview); + const documentUrl = isStartDocx ? `${dockerBaseUrl}/assets/Start.docx` : dockerFileUrl; + const ext = ((file == null ? void 0 : file.extension) || "docx").toLowerCase(); + const documentType = ext === "xlsx" ? "cell" : ext === "pptx" ? "slide" : ext === "pdf" ? "word" : "word"; + const baseConfig = { + documentType, + document: { + fileType: ext || "docx", + key: uniqueKey, + title: file ? file.name : documentUrl.split("/").pop() || "Document.docx", + url: documentUrl, + permissions: { + edit: true, + download: true, + print: true, + chat: false, + comment: true, + copy: true, + fillForms: true, + modifyContent: true, + modifyFilter: true, + review: true, + rename: true + } + }, + editorConfig: { + mode: "edit", + lang: "en", + user: { + id: "obsidian-static-user", + name: "Obsidian User" + }, + customization: { + autosave: false, + toolbarNoTabs: false, + plugins: true, + comments: false, + compactChat: false, + forcesave: true + }, + callbackUrl, + // Keep these fallbacks as part of signed payload to avoid post-sign changes + createUrl: `http://127.0.0.1:${this.plugin.localServerPort}/api/createNew?fileType=${documentType}`, + saveAsUrl: `http://127.0.0.1:${this.plugin.localServerPort}/api/saveAs`, + coEditing: { + mode: "strict", + change: false, + fastCoAuthoring: false + } + }, + width: "100%", + height: "100%" + }; + let signedToken = null; + if (this.plugin.settings.jwtSecret && this.plugin.settings.jwtSecret.trim() !== "") { + try { + const secret = new TextEncoder().encode(this.plugin.settings.jwtSecret); + let requestToken = null; + if (this.plugin.settings.useRequestToken !== false) { + requestToken = await new SignJWT({ key: uniqueKey, ts: Math.floor(Date.now() / 1e3) }).setProtectedHeader({ alg: "HS256", typ: "JWT" }).sign(secret); + const append = (u) => u + (u.includes("?") ? "&" : "?") + "token=" + encodeURIComponent(requestToken); + baseConfig.document.url = append(baseConfig.document.url); + baseConfig.editorConfig.callbackUrl = append(baseConfig.editorConfig.callbackUrl); + baseConfig.editorConfig.createUrl = append(baseConfig.editorConfig.createUrl); + baseConfig.editorConfig.saveAsUrl = append(baseConfig.editorConfig.saveAsUrl); + console.log("OnlyOffice: appended request token to URLs"); + } else { + console.log("OnlyOffice: request token appending disabled"); + } + const payload = { + document: baseConfig.document, + editorConfig: { ...baseConfig.editorConfig }, + iat: Math.floor(Date.now() / 1e3) + }; + signedToken = await new SignJWT(payload).setProtectedHeader({ alg: "HS256", typ: "JWT" }).sign(secret); + } catch (err) { + this.showEditorError(container, `Failed to initialize editor: ${err.message}`); + return; + } + } + webview.addEventListener("did-finish-load", () => { + console.log("OnlyOffice webview did-finish-load, injecting init script"); + const apiScriptUrl = `http://${this.plugin.settings.localServerAddress || "host.docker.internal"}:${this.plugin.settings.onlyOfficeServerPort}/web-apps/apps/api/documents/api.js`; + console.log("OnlyOffice DEBUG: apiScriptUrl:", apiScriptUrl); + const initScript = ` + window.localServerPort = ${this.plugin.localServerPort}; + const __BASE64 = '${Buffer.from(JSON.stringify(baseConfig)).toString("base64")}'; + const __SIGNED_TOKEN = ${signedToken ? `'${signedToken}'` : "null"}; + + // Load the API script dynamically + const script = document.createElement('script'); + script.src = '${apiScriptUrl}'; + script.onload = function() { + console.log('API script loaded'); + try { + const { ipcRenderer } = (typeof require === 'function' ? require('electron') : { ipcRenderer: null }); + const __sendToHost = (channel, data) => { + try { + if (ipcRenderer && typeof ipcRenderer.sendToHost === 'function') { + ipcRenderer.sendToHost(channel, data); + return; + } + } catch (e) {} + try { + console.log('OO-EVT:' + JSON.stringify({ channel, data })); + } catch (e) {} + }; + // Parse base config and set token without mutating signed fields + const config = JSON.parse(atob(__BASE64)); + if (__SIGNED_TOKEN) config.token = __SIGNED_TOKEN; + + // Add event handlers as functions (per OnlyOffice API: use root-level config.events) + config.events = { + onDocumentStateChange: function(event) { + window.isOnlyOfficeDirty = event.data; + __sendToHost('onlyoffice-dirty-state', { isDirty: !!event.data }); + }, + onDocumentContentChanged: function(event) { + window.isOnlyOfficeDirty = true; + __sendToHost('onlyoffice-dirty-state', { isDirty: true }); + }, + onDownloadAs: function(event) { + // Fallback: when downloadAs is used, forward to host as Save As + try { __sendToHost('onlyoffice-save-as', event && event.data ? event.data : {}); } catch(_) {} + }, + onError: function(event) { + try { + console.log('OnlyOffice onError raw event', JSON.stringify(event)); + __sendToHost('onlyoffice-error', event && event.data ? event.data : {}); + // If the error suggests unsaved changes or callback failure, attempt a silent forcesave + try { + if (window.docEditor && event && event.data && (event.data.errorCode === 6 || event.data.errorCode === 7)) { + console.log('OnlyOffice: attempting silent forcesave after errorCode', event.data.errorCode); + window.docEditor.serviceCommand && window.docEditor.serviceCommand('c:forcesave', ''); + } + } catch(e) { console.warn('OnlyOffice: silent forcesave retry failed', e); } + } catch(_) {} + }, + onAppReady: function(event) { + console.log("OnlyOffice App is ready"); + try { window.docEditor.serviceCommand('TrackRevisions:Change', false); } catch(e) {} + try { window.docEditor.serviceCommand("Mode:Edit", true); } catch(e) {} + try { __sendToHost('onlyoffice-app-ready', {}); } catch(e) {} + }, + onRequestCreateNew: function(event) { + console.log('OnlyOffice onRequestCreateNew'); + __sendToHost('onlyoffice-create-new', { fileType: (event && event.data && event.data['fileType']) || 'docx' }); + }, + onRequestSaveAs: function(event) { + console.log('OnlyOffice onRequestSaveAs', event); + __sendToHost('onlyoffice-save-as', event && event.data ? event.data : {}); + } + }; + + // Also mirror events under editorConfig.events for compatibility with older builds + config.editorConfig.events = config.events; + + console.log('OnlyOffice: events wired', Object.keys(config.events||{})); + + // Initialize the editor with the constructed config + window.docEditor = new window.DocsAPI.DocEditor("placeholder", config); + console.log("OnlyOffice editor initialized with dynamic config"); + // Force-hide any 'Download' / 'Download as' / 'Download copy' menu entries (no user setting) + (function hideDownloadMenu(){ + // Extend labels and include ones with spacing/case variants + const LABELS = new Set([ + 'download','download as','download copy','download a copy','save copy','save copy as','download as..','download as...' + ]); + const matchText = (t) => { + if (!t) return false; const s = t.trim().toLowerCase().replace(/s+/g,' '); + if (LABELS.has(s)) return true; + // Partial heuristics + return /^download as/.test(s) || /^download copy/.test(s); + }; + const hide = () => { + try { + const els = Array.from(document.querySelectorAll('span,div,button,a,li')); + els.forEach(el => { + if (el.getAttribute('data-oo-hidden')==='download') return; + const txt = (el.textContent||''); + if (matchText(txt)) { + const container = el.closest('li,div,button') || el; + container.style.display='none'; + container.setAttribute('data-oo-hidden','download'); + } + }); + } catch(e){ console.warn('OnlyOffice: hideDownloadMenu scan error', e); } + }; + // Monkey patch downloadAs to no-op (prevent keyboard / programmatic) + try { + const guardProp = '__ooDownloadDisabled'; + const patch = () => { + try { + if (window.docEditor && !window.docEditor[guardProp] && window.docEditor.downloadAs) { + const orig = window.docEditor.downloadAs.bind(window.docEditor); + window.docEditor.downloadAs = function(){ console.log('OnlyOffice: downloadAs blocked'); return null; }; + window.docEditor[guardProp] = true; + } + } catch(e){} + }; + patch(); + setInterval(patch, 1500); // ensure after internal reloads + } catch(e){ console.warn('OnlyOffice: failed to patch downloadAs', e); } + hide(); + const obs = new MutationObserver(hide); + try { obs.observe(document.body,{childList:true,subtree:true}); } catch(_){} + // Timed passes; stop observer later + [400,800,1600,3000,5000,8000,12000].forEach(t=> setTimeout(hide, t)); + setTimeout(()=>{ try { obs.disconnect(); } catch(_){} }, 18000); + })(); + + // Bridge messages coming from /api/createNew and /api/saveAs HTML pages + window.addEventListener('message', function(ev) { + try { + if (!ev || !ev.data || !ev.data.type) return; + if (ev.data.type === 'onlyoffice-save-as') { + __sendToHost('onlyoffice-save-as', ev.data.data || {}); + } else if (ev.data.type === 'onlyoffice-create-new') { + __sendToHost('onlyoffice-create-new', ev.data); + } + } catch (_) {} + }); + + // (Removed legacy attachEvent attempts to reduce errors) + } catch (e) { + console.error("Error initializing editor with dynamic config:", e); + document.getElementById('placeholder').innerHTML = '
Failed to initialize editor: ' + e.message + '
'; + } + }; + document.head.appendChild(script); + `; + webview.executeJavaScript(initScript).then(() => { + loadingDiv.remove(); + }).catch((err) => { + this.showEditorError(container, `Failed to initialize editor: ${err.message}`); + loadingDiv.remove(); + }); + }); + webview.addEventListener("did-fail-load", (error) => { + this.showEditorError(container, `Failed to load editor view: ${error.errorDescription}`); + }); + webview.addEventListener("console-message", (event) => { + const msg = event.message || ""; + if (typeof msg === "string" && msg.startsWith("OO-EVT:")) { + try { + const payload = JSON.parse(msg.substring("OO-EVT:".length)); + const channel = payload.channel; + const data = payload.data; + if (channel === "onlyoffice-save-as") { + if (data && data.url) { + this.systemSaveAsRetryPending = false; + this.performingSystemSaveAsFallback = false; + this.saveAsDocument(false, data); + } else { + if (this.plugin.settings.useSystemSaveAs) { + if (!this.performingSystemSaveAsFallback) { + this.performingSystemSaveAsFallback = true; + this.fallbackSystemSaveAsFromVault(); + } + } else { + this.saveAsDocument(true); + } + } + } else if (channel === "onlyoffice-create-new") { + this.plugin.openNewDocument(); + } else if (channel === "onlyoffice-dirty-state") { + this.isDirty = !!(data && data.isDirty); + } + } catch (e) { + console.log("[OnlyOffice webview]", event.message); + } + } else { + console.log("[OnlyOffice webview]", event.message); + } + }); + webview.addEventListener("ipc-message", (event) => { + try { + if (!event) + return; + const channel = event.channel; + const arg = event.args && event.args[0] || {}; + if (channel === "onlyoffice-save-as") { + new import_obsidian.Notice("OnlyOffice: Save As event received"); + this.saveAsDocument(this.plugin.settings.useSystemSaveAs ? false : true, arg); + } else if (channel === "onlyoffice-create-new") { + new import_obsidian.Notice("OnlyOffice: Create New event received"); + const leaf = this.leaf; + if (leaf) { + leaf.setViewState({ type: VIEW_TYPE_ONLYOFFICE, state: { onlyOfficeTemplate: true } }); + } else { + this.plugin.openNewDocument(); + } + } else if (channel === "onlyoffice-app-ready") { + new import_obsidian.Notice("OnlyOffice: App Ready"); + } else if (channel === "onlyoffice-dirty-state") { + this.isDirty = !!arg.isDirty; + } else if (channel === "onlyoffice-error") { + const msg = arg && (arg.message || arg.code) ? `${arg.code || ""} ${arg.message || ""}`.trim() : "Unknown error"; + console.warn("OnlyOffice error:", arg); + new import_obsidian.Notice("OnlyOffice error: " + msg); + } + } catch (e) { + console.error("OnlyOffice: ipc-message handler error", e); + } + }); + } + onSaveComplete() { + this.isDirty = false; + if (this.saveButton) + this.saveButton.disabled = true; + if (this.saveAsButton) + this.saveAsButton.disabled = true; + } + // Load OnlyOffice API script + async loadOnlyOfficeAPI() { + return new Promise((resolve2, reject) => { + if (window.DocsAPI) { + resolve2(); + return; + } + const apiScriptUrl = `http://localhost:8080/web-apps/apps/api/documents/api.js`; + console.log("Loading OnlyOffice API script from:", apiScriptUrl); + const script = document.createElement("script"); + script.src = apiScriptUrl; + script.onload = () => resolve2(); + script.onerror = (e) => { + console.error("Failed to load OnlyOffice API:", e); + reject(new Error("Failed to load OnlyOffice API")); + }; + document.head.appendChild(script); + }); + } + // Show error message in the editor container + showEditorError(container, message2) { + container.empty(); + const errorDiv = container.createEl("div", { cls: "onlyoffice-error" }); + errorDiv.createEl("h2", { text: "OnlyOffice Editor Error" }); + errorDiv.createEl("p", { text: message2 }); + const fallbackButton = errorDiv.createEl("button", { + text: "Use Fallback Editor", + attr: { style: "margin-top: 10px; padding: 8px 16px; background: #007ACC; color: white; border: none; border-radius: 4px; cursor: pointer;" } + }); + fallbackButton.addEventListener("click", () => { + this.loadFallbackEditor(container); + }); + } + // Load a simple fallback editor + loadFallbackEditor(container) { + container.empty(); + const editorDiv = container.createEl("div", { + attr: { + style: "width: 100%; height: 100%; display: flex; flex-direction: column; background: white;" + } + }); + const toolbar = editorDiv.createEl("div", { + attr: { + style: "padding: 8px; border-bottom: 1px solid #ccc; background: #f5f5f5; display: flex; gap: 8px; flex-shrink: 0;" + } + }); + this.addToolbarButton(toolbar, "Bold", () => document.execCommand("bold")); + this.addToolbarButton(toolbar, "Italic", () => document.execCommand("italic")); + this.addToolbarButton(toolbar, "Underline", () => document.execCommand("underline")); + const saveButton = toolbar.createEl("button", { + text: "Save to Obsidian", + attr: { + style: "margin-left: auto; padding: 4px 12px; background: #007ACC; color: white; border: none; border-radius: 4px; cursor: pointer;" + } + }); + saveButton.addEventListener("click", () => this.saveFallbackToObsidian()); + this.fallbackEditor = editorDiv.createEl("div", { + attr: { + contenteditable: "true", + style: "flex: 1; padding: 20px; font-family: Arial, sans-serif; font-size: 14px; line-height: 1.5; overflow-y: auto; background: white;" + } + }); + this.fallbackEditor.innerHTML = "

Start typing your document here...

"; + this.fallbackEditor.focus(); + } + // Add toolbar button helper + addToolbarButton(toolbar, text, action) { + const button = toolbar.createEl("button", { + text, + attr: { + style: "padding: 4px 8px; border: 1px solid #ccc; background: white; cursor: pointer; border-radius: 3px;" + } + }); + button.addEventListener("click", action); + } + // Save fallback editor content to Obsidian + async saveFallbackToObsidian() { + if (!this.fallbackEditor) { + new import_obsidian.Notice("No content to save"); + return; + } + try { + const htmlContent = this.fallbackEditor.innerHTML; + const markdownContent = _OnlyOfficeDocumentView.htmlToMarkdown(htmlContent); + const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-"); + const fileName = `OnlyOffice Document ${timestamp}.md`; + await this.app.vault.create(fileName, markdownContent); + new import_obsidian.Notice(`Document saved as: ${fileName}`); + const file = this.app.vault.getAbstractFileByPath(fileName); + if (file instanceof import_obsidian.TFile) { + await this.app.workspace.openLinkText(fileName, ""); + } + } catch (error) { + console.error("Error saving to Obsidian:", error); + new import_obsidian.Notice("Error saving document: " + error.message); + } + } + // Static HTML to Markdown converter for fallback editor + static htmlToMarkdown(html) { + let markdown = html.replace(/]*>(.*?)<\/strong>/gi, "**$1**").replace(/]*>(.*?)<\/b>/gi, "**$1**").replace(/]*>(.*?)<\/em>/gi, "*$1*").replace(/]*>(.*?)<\/i>/gi, "*$1*").replace(/]*>(.*?)<\/u>/gi, "$1").replace(/]*>(.*?)<\/p>/gi, "$1\n\n").replace(/]*>/gi, "\n").replace(/]*>(.*?)<\/div>/gi, "$1\n").replace(/<[^>]*>/g, "").replace(/ /g, " ").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\n\s*\n\s*\n/g, "\n\n").trim(); + return markdown || "Empty document"; + } + // Add a manual save method as fallback + async manualSaveFromEditor() { + if (!this.file) { + console.log("Cannot save: No file is open."); + return; + } + try { + const arrayBuffer = await this.getEditorContent(); + if (arrayBuffer) { + await this.app.vault.modifyBinary(this.file, arrayBuffer); + new import_obsidian.Notice("Document saved successfully"); + } else { + if (this.leaf.view) { + new import_obsidian.Notice("Could not get document from editor. Save failed."); + } + } + } catch (error) { + console.error("Error in manual save:", error); + if (this.leaf.view) { + new import_obsidian.Notice("Save failed. " + (error instanceof Error ? error.message : "Please check the console for details.")); + } + } + } + // Add the missing saveAsDocument method with improved functionality + async saveAsDocument(forceSaveAs = false, saveAsData) { + var _a, _b, _c; + if (this.fallbackEditor) { + await this.saveFallbackToObsidian(); + return; + } + try { + const activeExt = this.currentExt || ((_b = (_a = this.file) == null ? void 0 : _a.extension) == null ? void 0 : _b.toLowerCase()) || "docx"; + if (saveAsData && saveAsData.url) { + if (this.plugin.settings.useSystemSaveAs) { + let fileName2 = this.pendingSaveAsName || saveAsData.title || `Document.${activeExt}`; + this.pendingSaveAsName = null; + if (!fileName2.toLowerCase().endsWith("." + activeExt)) + fileName2 += "." + activeExt; + const js = `(() => { try { + const url = ${JSON.stringify(saveAsData.url)}; + const name = ${JSON.stringify(fileName2)}; + // Create hidden anchor to force download + const a = document.createElement('a'); + a.href = url; + a.download = name; + a.style.display='none'; + document.body.appendChild(a); + a.click(); + setTimeout(()=>{ try { a.remove(); } catch(_){} }, 4000); +} catch(e){ console.error('System Save As injection failed', e); } })();`; + (_c = this.webview) == null ? void 0 : _c.executeJavaScript(js).catch((e) => console.error("executeJavaScript download inject failed", e)); + new import_obsidian.Notice("Opening system Save dialog..."); + return; + } + new import_obsidian.Notice("Downloading document..."); + const response = await (0, import_obsidian.requestUrl)({ url: saveAsData.url, method: "GET" }); + if (response.status !== 200 || !response.arrayBuffer) + throw new Error(`Failed to download file: ${response.status}`); + let fileName = this.pendingSaveAsName || saveAsData.title || ""; + this.pendingSaveAsName = null; + if (!fileName) + fileName = await this.promptForFileName() || ""; + if (!fileName) { + new import_obsidian.Notice("Save As cancelled"); + return; + } + if (!fileName.toLowerCase().endsWith("." + activeExt)) + fileName += "." + activeExt; + let attempt = 0; + const originalBase = fileName.replace(new RegExp(`.${activeExt}$`, "i"), ""); + while (this.app.vault.getAbstractFileByPath(fileName)) { + attempt++; + const alt = `${originalBase} (${attempt}).${activeExt}`; + if (attempt === 1) { + const retry = await this.promptForFileName(); + if (retry) { + fileName = retry.toLowerCase().endsWith("." + activeExt) ? retry : retry + "." + activeExt; + continue; + } + } + fileName = alt; + } + const newFile = await this.app.vault.createBinary(fileName, response.arrayBuffer); + new import_obsidian.Notice(`Document saved as: ${fileName}`); + await this.plugin.openOnlyOfficeFile(newFile); + return; + } + if (this.webview) { + if (!this.plugin.settings.useSystemSaveAs) { + if (forceSaveAs) { + const chosen = await this.promptForFileName(); + if (!chosen) { + new import_obsidian.Notice("Save As cancelled"); + return; + } + this.pendingSaveAsName = chosen; + } + new import_obsidian.Notice("Requesting document data..."); + } else { + new import_obsidian.Notice("Preparing system download..."); + } + const format = activeExt === "pdf" ? "docx" : activeExt; + this.webview.executeJavaScript(`try { window.docEditor && window.docEditor.downloadAs && window.docEditor.downloadAs('${format}'); } catch(e){ console.error('downloadAs failed', e); }`); + } else { + new import_obsidian.Notice("Save As not available (editor not ready)"); + } + } catch (error) { + console.error("Error during 'Save As':", error); + new import_obsidian.Notice(`Save As failed: ${error.message}`); + } + } + // Fallback path for system Save As when OnlyOffice doesn't return a URL (new unsaved doc) + async fallbackSystemSaveAsFromVault() { + var _a; + try { + if (!this.file) { + new import_obsidian.Notice("No file to save"); + this.performingSystemSaveAsFallback = false; + return; + } + const bin = await this.app.vault.readBinary(this.file); + const base = this.file.basename || "Document"; + const ext = this.currentExt || this.file.extension || "docx"; + const name = base.toLowerCase().endsWith("." + ext) ? base : base + "." + ext; + const outName = name.endsWith("." + ext) ? name : name + "." + ext; + const b64 = Buffer.from(bin).toString("base64"); + const js = `(() => { try { + const b64='${b64}'; + const byteChars = atob(b64); + const len = byteChars.length; + const bytes = new Uint8Array(len); + for (let i=0;i{ try { URL.revokeObjectURL(a.href); a.remove(); } catch(_){} },4000); + } catch(e){ console.error('fallbackSystemSaveAsFromVault failed', e); } })();`; + (_a = this.webview) == null ? void 0 : _a.executeJavaScript(js).catch((e) => console.error("fallback executeJavaScript failed", e)); + new import_obsidian.Notice("Opening system Save dialog (fallback)"); + } catch (e) { + console.error("OnlyOffice: fallbackSystemSaveAsFromVault error", e); + new import_obsidian.Notice("System Save As fallback failed"); + } finally { + this.performingSystemSaveAsFallback = false; + } + } + // New helper method to get content from the editor + getEditorContent(forceContentRetrieval = false) { + return Promise.resolve(null); + } + // Helper to prompt for a new file name + async promptForFileName() { + return new Promise((resolve2) => { + new SaveAsModal(this.app, (result) => { + resolve2(result); + }).open(); + }); + } + // Clean up when view is closed + async onClose() { + if (this.boundMessageHandler) { + window.removeEventListener("message", this.boundMessageHandler); + this.boundMessageHandler = null; + } + if (this.dirtyCheckInterval) { + clearInterval(this.dirtyCheckInterval); + this.dirtyCheckInterval = null; + } + } +}; +var SaveAsModal = class extends import_obsidian.Modal { + constructor(app, onSubmit) { + super(app); + this.submitted = false; + this.onSubmit = onSubmit; + } + onOpen() { + const { contentEl } = this; + contentEl.createEl("h2", { text: "Save As" }); + contentEl.createEl("p", { text: "Enter the new file name:" }); + this.input = contentEl.createEl("input", { type: "text", placeholder: "NewDocument.docx" }); + const saveButton = contentEl.createEl("button", { text: "Save" }); + saveButton.addEventListener("click", () => { + const value = this.input.value.trim(); + if (value) { + this.submitted = true; + this.onSubmit(value); + this.close(); + } + }); + const cancelButton = contentEl.createEl("button", { text: "Cancel" }); + cancelButton.style.marginLeft = "10px"; + cancelButton.addEventListener("click", () => { + this.close(); + }); + } + onClose() { + if (!this.submitted) { + this.onSubmit(null); + } + this.contentEl.empty(); + } +}; +var OnlyOfficePlugin = class extends import_obsidian.Plugin { + constructor() { + super(...arguments); + this.httpServer = null; + this.callbackServer = null; + this.localServerPort = 0; + this.callbackServerPort = 0; + this.internalServerReady = null; + this._resolveInternalServerReady = null; + this._rejectInternalServerReady = null; + this.keyFileMap = {}; + this.saveAsPromise = null; + } + async onload() { + await this.loadSettings(); + await this.startInternalServer(); + await this.startCallbackServer(); + this.addRibbonIcon("file-plus", "New OnlyOffice Document", () => { + this.openNewDocument(); + }); + this.registerView( + VIEW_TYPE_ONLYOFFICE, + (leaf) => new OnlyOfficeDocumentView(leaf, this) + ); + const officeExts = ["docx", "xlsx", "pptx", "pdf"]; + const failed = []; + for (const ext of officeExts) { + try { + this.registerExtensions([ext], VIEW_TYPE_ONLYOFFICE); + console.log(`OnlyOffice: registered extension .${ext}`); + } catch (e) { + failed.push(ext); + console.warn(`OnlyOffice: failed to register .${ext}:`, (e == null ? void 0 : e.message) || e); + } + } + if (failed.length) { + console.log("OnlyOffice: installing context menu fallback for", failed.join(",")); + this.registerEvent( + this.app.workspace.on("file-menu", (menu, file) => { + if (file instanceof import_obsidian.TFile && officeExts.includes(file.extension)) { + menu.addItem((item) => { + item.setTitle("Open with OnlyOffice").setIcon("file-text").onClick(() => { + this.openOnlyOfficeFile(file); + }); + }); + } + }) + ); + } + this.addCommands(); + this.addSettingTab(new OnlyOfficeSettingTab(this.app, this)); + } + // Add commands to the command palette + addCommands() { + this.addCommand({ + id: "open-docx-in-onlyoffice", + name: "Open DOCX in OnlyOffice", + checkCallback: (checking) => { + const file = this.app.workspace.getActiveFile(); + if (file && file.extension === "docx") { + if (!checking) { + this.openDocxFile(file); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "open-xlsx-in-onlyoffice", + name: "Open XLSX in OnlyOffice", + checkCallback: (checking) => { + const file = this.app.workspace.getActiveFile(); + if (file && file.extension === "xlsx") { + if (!checking) { + this.openOnlyOfficeFile(file); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "open-pptx-in-onlyoffice", + name: "Open PPTX in OnlyOffice", + checkCallback: (checking) => { + const file = this.app.workspace.getActiveFile(); + if (file && file.extension === "pptx") { + if (!checking) { + this.openOnlyOfficeFile(file); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "open-pdf-in-onlyoffice", + name: "Open PDF in OnlyOffice (viewer)", + checkCallback: (checking) => { + const file = this.app.workspace.getActiveFile(); + if (file && file.extension === "pdf") { + if (!checking) { + this.openOnlyOfficeFile(file); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "onlyoffice-list-office-files", + name: "OnlyOffice: List Office Files (debug)", + callback: async () => { + try { + const vaultFiles = this.app.vault.getFiles().filter((f) => ["docx", "xlsx", "pptx", "pdf"].includes(f.extension)); + console.log("OnlyOffice DEBUG: vault reports", vaultFiles.length, "office files"); + vaultFiles.forEach((f) => console.log(" VAULT:", f.path)); + if (!(this.app.vault.adapter instanceof import_obsidian.FileSystemAdapter)) { + console.log("OnlyOffice DEBUG: not FS adapter, cannot disk-scan"); + return; + } + const root = this.app.vault.adapter.getBasePath(); + const found = []; + const exts = /* @__PURE__ */ new Set([".docx", ".xlsx", ".pptx", ".pdf"]); + const walk = (dir) => { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + for (const e of entries) { + if (e.name.startsWith(".")) + continue; + const full = path.join(dir, e.name); + if (e.isDirectory()) { + walk(full); + } else { + const lower = e.name.toLowerCase(); + for (const x of exts) { + if (lower.endsWith(x)) { + found.push(full); + break; + } + } + } + } + }; + walk(root); + console.log("OnlyOffice DEBUG: disk scan found", found.length, "office files"); + const rel = (p) => p.replace(/\\/g, "/").substring(root.replace(/\\/g, "/").length + 1); + const vaultSet = new Set(vaultFiles.map((f) => f.path)); + const missingInVault = found.map(rel).filter((p) => !vaultSet.has(p)); + if (missingInVault.length === 0) + console.log("OnlyOffice DEBUG: no discrepancies"); + else { + console.warn("OnlyOffice DEBUG: files on disk NOT in vault index:", missingInVault); + } + new import_obsidian.Notice("OnlyOffice: debug listing complete (see console)"); + } catch (e) { + console.error("OnlyOffice DEBUG: listing failed", e); + new import_obsidian.Notice("OnlyOffice: listing failed (see console)"); + } + } + }); + this.addCommand({ + id: "open-xlsx-in-onlyoffice", + name: "Open XLSX in OnlyOffice", + checkCallback: (checking) => { + const file = this.app.workspace.getActiveFile(); + if (file && file.extension === "xlsx") { + if (!checking) { + this.openOnlyOfficeFile(file); + } + return true; + } + return false; + } + }); + this.addCommand({ + id: "create-new-onlyoffice-document", + name: "Create New OnlyOffice Document", + callback: () => { + this.openNewDocument(); + } + }); + } + // Open a new blank document in the OnlyOffice view + async openNewDocument() { + var _a; + try { + let requestedName = null; + let chosenType = "docx"; + if (((_a = this.settings) == null ? void 0 : _a.promptNameOnCreate) !== false) { + requestedName = await new Promise((resolve2) => { + const modal = new class extends import_obsidian.Modal { + constructor() { + super(...arguments); + this.submitted = false; + } + onOpen() { + const radius = "10px"; + const fieldHeight = "40px"; + const { contentEl } = this; + contentEl.empty(); + contentEl.style.padding = "26px 32px 22px"; + contentEl.style.minWidth = "600px"; + contentEl.style.maxWidth = "600px"; + contentEl.style.boxSizing = "border-box"; + contentEl.style.overflow = "hidden"; + contentEl.style.overflowX = "hidden"; + if (contentEl.parentElement) { + contentEl.parentElement.style.overflowX = "hidden"; + } + contentEl.createEl("h2", { text: "New OnlyOffice Document", attr: { style: "margin:0 0 16px 0; font-weight:600; font-size:22px; letter-spacing:.4px;" } }); + this.wrapper = contentEl.createEl("div", { attr: { style: "display:flex; flex-direction:column; gap:16px;" } }); + const formGap = 18; + const col1 = 320; + const col2 = 118; + const formWidth = col1 + col2 + formGap; + const row = this.wrapper.createEl("div", { attr: { style: `display:grid; grid-template-columns: ${col1}px ${col2}px; gap:${formGap}px; align-items:end; width:${formWidth}px;` } }); + const nameCol = row.createEl("div", { attr: { style: "display:flex; flex-direction:column; gap:6px; min-width:0;" } }); + nameCol.createEl("label", { text: "Filename", attr: { style: "font-size:11px; font-weight:600; letter-spacing:.5px; text-transform:uppercase; color:var(--text-muted);" } }); + this.input = nameCol.createEl("input", { type: "text", placeholder: "MyDocument", attr: { style: `padding:8px 12px; font-size:14px; line-height:20px; height:${fieldHeight}; border:1px solid var(--background-modifier-border); border-radius:${radius}; width:100%; max-width:${col1}px; box-sizing:border-box;` } }); + const typeCol = row.createEl("div", { attr: { style: "display:flex; flex-direction:column; gap:6px;" } }); + typeCol.createEl("label", { text: "Type", attr: { style: "font-size:11px; font-weight:600; letter-spacing:.5px; text-transform:uppercase; color:var(--text-muted);" } }); + this.select = typeCol.createEl("select", { attr: { style: `padding:8px 12px; font-size:14px; line-height:20px; height:${fieldHeight}; border:1px solid var(--background-modifier-border); border-radius:${radius}; background:var(--background-primary); box-sizing:border-box; width:${col2}px;` } }); + ["docx", "xlsx", "pptx"].forEach((t) => { + const o = document.createElement("option"); + o.value = t; + o.textContent = t.toUpperCase(); + this.select.appendChild(o); + }); + const btnRow = this.wrapper.createEl("div", { attr: { style: `display:flex; justify-content:flex-end; gap:10px; margin-top:6px; width:${formWidth}px;` } }); + const baseBtn = `padding:8px 20px; font-size:14px; font-weight:500; border:none; border-radius:${radius}; cursor:pointer; line-height:20px;`; + const cancelBtn = btnRow.createEl("button", { text: "Cancel", attr: { style: baseBtn + "background:var(--background-modifier-border); color:var(--text-normal);" } }); + this.okBtn = btnRow.createEl("button", { text: "Create", attr: { style: baseBtn + "background:var(--interactive-accent); color:var(--text-on-accent,#fff);" } }); + this.okBtn.addEventListener("click", () => { + const v = this.input.value.trim(); + if (v) { + chosenType = this.select.value; + this.submitted = true; + this.close(); + resolve2(v); + } + }); + cancelBtn.addEventListener("click", () => { + this.close(); + resolve2(null); + }); + this.input.addEventListener("keydown", (e) => { + if (e.key === "Enter") { + e.preventDefault(); + this.okBtn.click(); + } + }); + this.input.focus(); + } + onClose() { + if (!this.submitted) + resolve2(null); + this.contentEl.empty(); + } + }(this.app); + modal.open(); + }); + if (requestedName === null) { + new import_obsidian.Notice("Creation cancelled"); + return; + } + requestedName = requestedName.replace(/[\\/:*?"<>|]/g, "").trim(); + if (!requestedName) { + new import_obsidian.Notice("Invalid name"); + return; + } + const extRegex = new RegExp(`.${chosenType}$`, "i"); + if (!extRegex.test(requestedName)) + requestedName += `.${chosenType}`; + if (this.app.vault.getAbstractFileByPath(requestedName)) { + let base2 = requestedName.replace(new RegExp(`.${chosenType}$`, "i"), ""); + let i = 1; + let candidate = `${base2} (${i}).${chosenType}`; + while (this.app.vault.getAbstractFileByPath(candidate)) { + i++; + candidate = `${base2} (${i}).${chosenType}`; + } + requestedName = candidate; + } + } + let templateData; + const adapter = this.app.vault.adapter; + const base = adapter.getBasePath(); + const pluginDir = this.manifest.dir && path.isAbsolute(this.manifest.dir) ? this.manifest.dir : path.join(base, this.manifest.dir || ""); + const wantedExt = chosenType; + const candidateNames = wantedExt === "docx" ? ["Start.docx", "Start.dotx"] : wantedExt === "xlsx" ? ["Start.xlsx"] : ["Start.pptx"]; + const candidatePaths = []; + for (const nm of candidateNames) { + candidatePaths.push(path.join(pluginDir, "assets", nm)); + candidatePaths.push(path.join(base, nm)); + } + for (const p of candidatePaths) { + if (fs.existsSync(p)) { + const buf = await fs.promises.readFile(p); + const slice = buf.subarray(0); + const copy = new Uint8Array(slice.length); + copy.set(slice); + templateData = copy.buffer; + console.log("OnlyOffice: using template", p, "for new", wantedExt); + break; + } + } + if (!templateData && wantedExt === "docx") { + try { + const minimalB64 = "UEsDBBQABgAIAAAAIQAAAAAAAAAAAAAAAAAJAAAAd29yZC9VVAkAA0oJZ2ZKCWdzdXgLAAEE9QEAAAQUAAAAAABQSwMEFAAIAAgAAAAhAAAAAAAAAAAAAAAAABwAAAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzVVQJAAOSAmdmkgJndXgLAAEE9QEAAAQUAAAAAABQSwMEFAAIAAgAAAAhAAAAAAAAAAAAAAAAADwAAAB3b3JkL2RvY3VtZW50LnhtbFVUCQADjQJnZ40CZ3V4CwABBPUBAAAQFAAAAAA8eG1sIHZlcnNpb249IjEuMCI+PHc6d29yZGRvYyB4bWxucz13PSJodHRwOi8vc2NoZW1hcy5vcGVub3hwb3J5Lm9yZy93b3JkcHJvYy8yMDA2L21haW4iPjx3OnNlY3Rpb24geG1sbnM6dyA9ICJodHRwOi8vc2NoZW1hcy5vcGVub3hwb3J5Lm9yZy93b3JkcHJvYy8yMDA2L21haW4iPjx3OnA+PC93OnA+PC93OnNlY3Rpb24+PC93OndvcmRkb2M+"; + const buf = Buffer.from(minimalB64, "base64"); + const copy = new Uint8Array(buf.length); + copy.set(buf); + templateData = copy.buffer; + console.log("OnlyOffice: using embedded minimal DOCX fallback (no template found)"); + } catch (e) { + console.error("OnlyOffice: failed to build minimal DOCX fallback, creating empty file", e); + templateData = new ArrayBuffer(0); + } + } else if (!templateData) { + new import_obsidian.Notice(`No template found for ${wantedExt.toUpperCase()} (place Start.${wantedExt} in plugin assets). Creation cancelled.`); + return; + } + let finalName; + if (requestedName) { + finalName = requestedName; + } else { + let baseName = "Untitled Document"; + let idx = 1; + finalName = `${baseName}.${wantedExt}`; + while (this.app.vault.getAbstractFileByPath(finalName)) { + idx++; + finalName = `${baseName} ${idx}.${wantedExt}`; + } + } + const file = await this.app.vault.createBinary(finalName, templateData); + console.log("OnlyOffice: created new document", finalName, "size", templateData.byteLength, "prompted?", !!requestedName); + await this.openOnlyOfficeFile(file); + } catch (e) { + console.error("OnlyOffice: failed to create new document", e); + new import_obsidian.Notice("OnlyOffice: Failed to create new document"); + } + } + // Start an internal HTTP server to serve vault files and editor.html + async startInternalServer() { + var _a, _b, _c; + if (!(this.app.vault.adapter instanceof import_obsidian.FileSystemAdapter)) { + new import_obsidian.Notice("OnlyOffice plugin requires a file system adapter to run the local server."); + return; + } + this.internalServerReady = new Promise((resolve2, reject) => { + this._resolveInternalServerReady = resolve2; + this._rejectInternalServerReady = reject; + }); + const vaultPath = this.app.vault.adapter.getBasePath(); + let pluginPath = this.manifest.dir; + if (pluginPath && !path.isAbsolute(pluginPath)) { + pluginPath = path.resolve(vaultPath, pluginPath); + } + const resolvedPluginPath = pluginPath && path.isAbsolute(pluginPath) ? pluginPath : __dirname; + const editorHtmlPath = path.join(resolvedPluginPath, "editor.html"); + console.log("Vault path:", vaultPath); + console.log("Plugin path:", pluginPath); + console.log("Resolved plugin path:", resolvedPluginPath); + console.log("Editor HTML path:", editorHtmlPath); + console.log("Editor HTML exists:", fs.existsSync(editorHtmlPath)); + const explicitPort = this.settings.htmlServerPort && this.settings.htmlServerPort > 0 ? this.settings.htmlServerPort : 0; + const hashVault = (s) => { + let h = 0; + for (let i = 0; i < s.length; i++) + h = Math.imul(31, h) + s.charCodeAt(i) >>> 0; + return h; + }; + let candidatePorts = []; + if (explicitPort) { + candidatePorts.push(explicitPort); + } else { + const base = 28100 + hashVault(vaultPath) % 700; + for (let i = 0; i < 12; i++) + candidatePorts.push(base + i); + candidatePorts.push(0); + } + let serverStarted = false; + let port = 0; + for (const tryPort of candidatePorts) { + if (serverStarted) + break; + port = tryPort; + try { + this.httpServer = http.createServer((req, res) => { + var _a2; + console.log("[HTTP] Request URL:", req.url); + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + if (req.method === "OPTIONS") { + res.writeHead(200); + res.end(); + return; + } + try { + let reqPath = decodeURIComponent(((_a2 = req.url) == null ? void 0 : _a2.split("?")[0]) || "/"); + if (reqPath === "/api/createNew") { + console.log("[HTTP] Create New document request"); + res.writeHead(200, { "Content-Type": "text/html" }); + res.end(`Creating new document...`); + return; + } + if (reqPath === "/api/saveAs") { + console.log("[HTTP] Save As request"); + const urlObj = new URL(req.url || "", `http://${req.headers.host || "localhost"}`); + const url = urlObj.searchParams.get("url") || ""; + const title = urlObj.searchParams.get("title") || ""; + res.writeHead(200, { "Content-Type": "text/html" }); + res.end(`Saving document as...`); + return; + } + if (reqPath === "/" || reqPath === "/embedded-editor.html") { + const embeddedPath = path.join(resolvedPluginPath, "embedded-editor.html"); + if (!fs.existsSync(embeddedPath)) { + res.writeHead(404, { "Content-Type": "text/plain" }); + res.end("embedded-editor.html not found"); + return; + } + fs.readFile(embeddedPath, (err, data) => { + if (err) { + res.writeHead(500, { "Content-Type": "text/plain" }); + res.end("Error reading embedded-editor.html"); + return; + } + res.writeHead(200, { "Content-Type": "text/html; charset=UTF-8", "Cache-Control": "no-store" }); + res.end(data); + }); + } else { + const filePath = path.join(vaultPath, reqPath.replace(/^\//, "")); + console.log("Attempting to serve file:", filePath); + console.log("File exists:", fs.existsSync(filePath)); + if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) { + const mimeType = mime.lookup(filePath) || "application/octet-stream"; + res.writeHead(200, { + "Content-Type": String(mimeType), + "Access-Control-Allow-Origin": "*", + "Cache-Control": "no-cache" + }); + fs.createReadStream(filePath).pipe(res); + } else { + const pluginFilePath = path.join(resolvedPluginPath, reqPath.replace(/^\//, "")); + if (fs.existsSync(pluginFilePath) && fs.statSync(pluginFilePath).isFile()) { + const mimeType = mime.lookup(pluginFilePath) || "application/octet-stream"; + res.writeHead(200, { + "Content-Type": String(mimeType), + "Access-Control-Allow-Origin": "*", + "Cache-Control": "no-cache" + }); + fs.createReadStream(pluginFilePath).pipe(res); + } else { + res.writeHead(404, { "Content-Type": "text/plain" }); + res.end(`File not found: ${filePath}`); + } + } + } + } catch (e) { + console.error("Server error:", e); + res.writeHead(500, { "Content-Type": "text/plain" }); + res.end("Internal server error: " + e.message); + } + }); + await new Promise((resolve2, reject) => { + this.httpServer.once("error", (err) => reject(err)); + const bindHost = this.settings.restrictToLocalhost ? "127.0.0.1" : "0.0.0.0"; + this.httpServer.listen(port, bindHost, () => resolve2()); + }); + if (port === 0) { + const addr = this.httpServer.address(); + if (addr && typeof addr === "object") + port = addr.port; + } + this.localServerPort = port; + serverStarted = true; + const os = require("os"); + const interfaces = os.networkInterfaces(); + let lanIps = []; + for (const name of Object.keys(interfaces)) { + for (const iface of interfaces[name]) { + if (iface.family === "IPv4" && !iface.internal) { + lanIps.push(iface.address); + } + } + } + console.log(`OnlyOffice internal HTML server running at:`); + console.log(` Local: http://127.0.0.1:${port}/embedded-editor.html`); + if (!this.settings.restrictToLocalhost) { + lanIps.forEach((ip) => console.log(` LAN: http://${ip}:${port}/`)); + } else { + console.log(" LAN: (disabled by restrictToLocalhost setting)"); + } + try { + const testResponse = await (0, import_obsidian.requestUrl)({ + url: `http://127.0.0.1:${port}/embedded-editor.html`, + method: "HEAD", + headers: { "Cache-Control": "no-cache" } + }); + console.log("Server test result:", testResponse.status); + } catch (err) { + console.error("Server test failed:", err); + } + } catch (err) { + console.warn(`OnlyOffice internal server: port ${port} failed (${(err == null ? void 0 : err.message) || err}).`); + try { + (_a = this.httpServer) == null ? void 0 : _a.close(); + } catch (e) { + } + } + } + if (!serverStarted) { + new import_obsidian.Notice("OnlyOffice: failed to start internal server (no free port)"); + (_b = this._rejectInternalServerReady) == null ? void 0 : _b.call(this, new Error("failed to start")); + } else { + (_c = this._resolveInternalServerReady) == null ? void 0 : _c.call(this); + } + } + // Start an internal OnlyOffice callback server + async startCallbackServer() { + var _a, _b; + if (!(this.app.vault.adapter instanceof import_obsidian.FileSystemAdapter)) { + console.warn("OnlyOffice callback server requires a file system adapter."); + this.callbackServerPort = 0; + return; + } + const vaultPath = this.app.vault.adapter.getBasePath(); + const explicitPort = this.settings.callbackServerPort && this.settings.callbackServerPort > 0 ? this.settings.callbackServerPort : 0; + const hashVault = (s) => { + let h = 0; + for (let i = 0; i < s.length; i++) + h = Math.imul(31, h) + s.charCodeAt(i) >>> 0; + return h; + }; + let candidatePorts = []; + if (explicitPort) { + candidatePorts.push(explicitPort); + } else { + const base = 28800 + hashVault(vaultPath) % 700; + for (let i = 0; i < 12; i++) + candidatePorts.push(base + i); + candidatePorts.push(0); + } + let serverStarted = false; + let chosenPort = 0; + for (const tryPort of candidatePorts) { + if (serverStarted) + break; + try { + this.callbackServer = http.createServer(async (req, res) => { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + if (req.method === "OPTIONS") { + res.writeHead(200); + res.end(); + return; + } + console.log(`[Callback] ${req.method} ${req.url}`); + const rawUrl = req.url || "/"; + const pathOnly = rawUrl.split("?")[0]; + if (req.method === "POST" && pathOnly === "/callback") { + let body = ""; + req.on("data", (c) => { + body += c; + }); + req.on("end", async () => { + var _a2; + try { + console.log("[Callback] Received data:", body); + let data; + try { + data = JSON.parse(body); + } catch (e) { + console.error("[Callback] JSON parse failed, attempting form:", e); + if (body.includes("=") && body.includes("&")) { + const params = new URLSearchParams(body); + data = Object.fromEntries(params); + } else { + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: 0 })); + return; + } + } + const status = parseInt(data == null ? void 0 : data.status) || 0; + if (data && (status === 2 || status === 6 || status === 0) && data.url) { + console.log("[Callback] Processing save with URL:", data.url); + let key = data.key; + if (!key && data.url) { + try { + const u = new URL(data.url); + key = u.searchParams.get("key"); + } catch (e) { + console.error("[Callback] URL parse error:", e); + } + } + if (key) { + let filePath = null; + if ((_a2 = this.keyFileMap) == null ? void 0 : _a2[key]) + filePath = this.keyFileMap[key]; + else { + const m = /^obsidian_(.+?)_\d+_[a-z0-9]+$/.exec(key); + if (m) + filePath = decodeURIComponent(m[1]); + } + if (filePath) { + const file = this.app.vault.getAbstractFileByPath(filePath); + if (file instanceof import_obsidian.TFile) { + try { + const response = await (0, import_obsidian.requestUrl)({ url: data.url, method: "GET", headers: { "Cache-Control": "no-cache" } }); + if (response.status === 200 && response.arrayBuffer) { + await this.app.vault.modifyBinary(file, response.arrayBuffer); + new import_obsidian.Notice("OnlyOffice: Document saved (callback)"); + console.log("[Callback] Saved successfully"); + } else { + console.error("[Callback] Download failed status:", response.status); + } + } catch (err) { + console.error("[Callback] Download error:", err); + } + } else + console.error("[Callback] File not found in vault:", filePath); + } else + console.error("[Callback] Could not resolve file path for key:", key); + } else + console.error("[Callback] No key in callback payload"); + } else { + console.log("[Callback] Ignored status / missing URL:", data); + } + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: 0 })); + } catch (err) { + console.error("[Callback] Handler error:", err); + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: 0 })); + } + }); + } else { + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: 0, info: "OnlyOffice callback server running" })); + } + }); + await new Promise((resolve2, reject) => { + const timeoutId = setTimeout(() => reject(new Error("Callback server start timeout")), 3e3); + this.callbackServer.once("error", (err) => { + clearTimeout(timeoutId); + reject(err); + }); + const bindHost = this.settings.restrictToLocalhost ? "127.0.0.1" : "0.0.0.0"; + this.callbackServer.listen(tryPort, bindHost, () => { + clearTimeout(timeoutId); + resolve2(); + }); + }); + const actual = ((_a = this.callbackServer.address()) == null ? void 0 : _a.port) || tryPort; + chosenPort = actual; + this.callbackServerPort = actual; + serverStarted = true; + console.log(`OnlyOffice callback server running at http://127.0.0.1:${actual}/ (candidate requested ${tryPort})`); + try { + const test = await (0, import_obsidian.requestUrl)({ url: `http://127.0.0.1:${actual}/`, method: "HEAD", headers: { "Cache-Control": "no-cache" } }); + console.log("Callback server test status:", test.status); + } catch (e) { + console.warn("Callback server test failed:", e.message); + } + } catch (err) { + console.warn(`Callback server port ${tryPort} failed:`, err.message); + try { + (_b = this.callbackServer) == null ? void 0 : _b.close(); + } catch (e) { + } + this.callbackServer = null; + } + } + if (!serverStarted) { + new import_obsidian.Notice("OnlyOffice: failed to start callback server (no free port)"); + this.callbackServerPort = 0; + } + } + // Load settings from disk + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + // Save settings to disk + async saveSettings() { + await this.saveData(this.settings); + } + // Clean up when the plugin is unloaded + async onunload() { + if (this.httpServer) { + this.httpServer.close(); + this.httpServer = null; + } + if (this.callbackServer) { + this.callbackServer.close(); + this.callbackServer = null; + } + } + // Open a DOCX file in the OnlyOffice view + async openDocxFile(file) { + const leaf = this.app.workspace.getLeaf(true); + await leaf.setViewState({ + type: VIEW_TYPE_ONLYOFFICE, + state: { file: file.path } + }); + this.app.workspace.setActiveLeaf(leaf, { focus: true }); + } + // Generic opener for any supported OnlyOffice extension + async openOnlyOfficeFile(file) { + return this.openDocxFile(file); + } +}; +var OnlyOfficeSettingTab = class extends import_obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + const { containerEl } = this; + containerEl.empty(); + new import_obsidian.Setting(containerEl).setName("OnlyOffice Server Port").setDesc("The port where your OnlyOffice Document Server is running.").addText((text) => text.setPlaceholder("8080").setValue(this.plugin.settings.onlyOfficeServerPort.toString()).onChange(async (value) => { + this.plugin.settings.onlyOfficeServerPort = Number(value) || 8080; + await this.plugin.saveSettings(); + })); + new import_obsidian.Setting(containerEl).setName("JWT Secret").setDesc("The secret key for JWT token generation (leave empty to disable).").addText((text) => text.setPlaceholder("your-secret-key").setValue(this.plugin.settings.jwtSecret || "").onChange(async (value) => { + this.plugin.settings.jwtSecret = value; + await this.plugin.saveSettings(); + })); + new import_obsidian.Setting(containerEl).setName("Local Server Address for Docker").setDesc("The address of your machine that the OnlyOffice Docker container can reach (e.g., host.docker.internal, or your LAN IP).").addText((text) => text.setPlaceholder("host.docker.internal").setValue(this.plugin.settings.localServerAddress || "").onChange(async (value) => { + this.plugin.settings.localServerAddress = value; + await this.plugin.saveSettings(); + })); + const advHeader = containerEl.createEl("h4", { text: "Advanced (normally leave defaults)" }); + advHeader.style.marginTop = "1.5em"; + new import_obsidian.Setting(containerEl).setName("Override HTML server port").setDesc("0 = automatic per-vault dynamic. Set only if you need a fixed port.").addText((text) => { + var _a; + return text.setPlaceholder("0 (auto)").setValue(String((_a = this.plugin.settings.htmlServerPort) != null ? _a : 0)).onChange(async (value) => { + const v = Number(value) || 0; + this.plugin.settings.htmlServerPort = v; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian.Setting(containerEl).setName("Override callback server port").setDesc("0 = automatic per-vault dynamic. Set only for special routing needs.").addText((text) => { + var _a; + return text.setPlaceholder("0 (auto)").setValue(String((_a = this.plugin.settings.callbackServerPort) != null ? _a : 0)).onChange(async (value) => { + const v = Number(value) || 0; + this.plugin.settings.callbackServerPort = v; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian.Setting(containerEl).setName("Restrict internal servers to localhost").setDesc("If ON, bind to 127.0.0.1 only (hide LAN URLs). Leave OFF if Docker/another host must reach them.").addToggle((toggle) => { + var _a; + return toggle.setValue((_a = this.plugin.settings.restrictToLocalhost) != null ? _a : false).onChange(async (value) => { + this.plugin.settings.restrictToLocalhost = value; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian.Setting(containerEl).setName("Append request token to URLs").setDesc("Toggle adding ?token=... to document and callback URLs (disable if your server does not use request verification).").addToggle((toggle) => { + var _a; + return toggle.setValue((_a = this.plugin.settings.useRequestToken) != null ? _a : true).onChange(async (value) => { + this.plugin.settings.useRequestToken = value; + await this.plugin.saveSettings(); + }); + }); + new import_obsidian.Setting(containerEl).setName("Use system Save As UI").setDesc("Open the document copy in your default browser (download UI) instead of Obsidian modal when using Save As / Download Copy.").addToggle((toggle) => { + var _a; + return toggle.setValue((_a = this.plugin.settings.useSystemSaveAs) != null ? _a : false).onChange(async (value) => { + this.plugin.settings.useSystemSaveAs = value; + await this.plugin.saveSettings(); + }); + }); + } +}; +/*! Bundled license information: + +mime-db/index.js: + (*! + * mime-db + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015-2022 Douglas Christopher Wilson + * MIT Licensed + *) + +mime-types/index.js: + (*! + * mime-types + * Copyright(c) 2014 Jonathan Ong + * Copyright(c) 2015 Douglas Christopher Wilson + * MIT Licensed + *) +*/ diff --git a/.obsidian/plugins/OnlyOffice/manifest.json b/.obsidian/plugins/OnlyOffice/manifest.json new file mode 100644 index 00000000..2c808284 --- /dev/null +++ b/.obsidian/plugins/OnlyOffice/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "onlyoffice", + "name": "OnlyOffice", + "version": "1.0.0", + "minAppVersion": "0.15.0", + "description": "Edit DOCX files using OnlyOffice Document Server", + "author": "Jan Sansdtröm", + "authorUrl": "https://github.com/yourusername", + "isDesktopOnly": true +} \ No newline at end of file diff --git a/.obsidian/plugins/cubox-sync/data.json b/.obsidian/plugins/cubox-sync/data.json index 6098d9d6..3a7f50d1 100644 --- a/.obsidian/plugins/cubox-sync/data.json +++ b/.obsidian/plugins/cubox-sync/data.json @@ -34,7 +34,7 @@ "contentTemplate": "# {{{title}}}\n\n{{{description}}}\n\n{{{article_title}}} //文章内容标题\n{{{content}}} //文章正文\n\n\n[Read in Cubox]({{{cubox_url}}}) \n[Read Original]({{{url}}}) \n\n---\n\n{{#highlights.length}}\n## Annotations \n\n{{#highlights}}\n> {{{text}}} \n\n{{#note}}\n{{{note}}}\n{{/note}}\n[Link️]({{{cubox_url}}}) \n\n{{/highlights}}\n{{/highlights.length}}", "highlightInContent": true, "dateFormat": "yyyy-MM-dd", - "lastSyncTime": 1756217339834, + "lastSyncTime": 1756219139631, "lastSyncCardId": "7358083230366436785", "lastCardUpdateTime": "2025-08-21T13:52:28.950+0800", "syncing": false diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index 62e3a744..4bf4b02f 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -4,10 +4,18 @@ "basename": "2025-08-26", "path": "01-工作日记/2025-08-26.md" }, + { + "basename": "Start", + "path": "08-Inbox/Office/Start.pptx" + }, { "basename": "数据备份方案", "path": "03-学习笔记/数据备份方案.md" }, + { + "basename": "Start", + "path": "08-Inbox/Office/Start.docx" + }, { "basename": "2025-08-25", "path": "01-工作日记/2025-08-25.md" @@ -191,14 +199,6 @@ { "basename": "软件下载安装", "path": "90-学习教程/99-黑曜石玩家指南/1-obsidian入门/软件下载安装.md" - }, - { - "basename": "每周定期汇总小结", - "path": "90-学习教程/99-黑曜石玩家指南/1-obsidian入门/每周定期汇总小结.md" - }, - { - "basename": "开箱写日志", - "path": "90-学习教程/99-黑曜石玩家指南/1-obsidian入门/开箱写日志.md" } ], "omittedPaths": [], diff --git a/.obsidian/plugins/update-time-on-edit/data.json b/.obsidian/plugins/update-time-on-edit/data.json index 05c0e789..0c7ebcb7 100644 --- a/.obsidian/plugins/update-time-on-edit/data.json +++ b/.obsidian/plugins/update-time-on-edit/data.json @@ -18,6 +18,6 @@ "01-工作日记/2025-08-24.md": "b82a4f49459f0b3dd8f8b4b2411fc2c682fea28f69b72d5c2cdf28ecac49cfd4", "01-工作日记/2025-08-25.md": "2c6441d63702944db046c5637e0db95a969a26abc661ebd500662acfbf1e3a22", "60-Imports/63-WuCai/2025/08/Plex重大变更:无论使用自己还是别人的媒体服务器远程播放都必须付费 – 蓝点网.md": "7a61c7330f970a8283cc70a0511e8b43bd6a160fc65e42fb2bee5f46668c752f", - "01-工作日记/2025-08-26.md": "21a60c32fb116a5e9fa4ce0c36735214b885c22c661a0a1130f67692d847d272" + "01-工作日记/2025-08-26.md": "95ef1aaf127c499d538809bb85054c191268e360119c7c716505a73dc5a6c51b" } } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 54a8174f..cf35f12d 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,45 +4,21 @@ "type": "split", "children": [ { - "id": "68ba61e199a3006a", + "id": "cf20749da23c30a8", "type": "tabs", "children": [ { - "id": "210f6e255abf09ac", + "id": "88ed9de744392085", "type": "leaf", "state": { "type": "markdown", "state": { "file": "01-工作日记/2025-08-26.md", "mode": "source", - "source": false, - "backlinks": true, - "backlinkOpts": { - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": true, - "unlinkedCollapsed": true - } - }, - "icon": "lucide-file", - "title": "2025-08-26" - } - }, - { - "id": "79999341f21ff9a9", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "03-学习笔记/数据备份方案.md", - "mode": "source", "source": false }, "icon": "lucide-file", - "title": "数据备份方案" + "title": "2025-08-26" } } ] @@ -321,7 +297,6 @@ "obsidian-importer:Open Importer": false, "copilot:Open Copilot Chat": false, "DEVONlink-obsidian:DEVONlink": false, - "periodic-notes:Open today": false, "memos-ai-sync:Sync Memos": false, "translate:Open translation view": false, "obsidian-calibre-plugin:Calibre": false, @@ -330,20 +305,26 @@ "diary-ics:日记日历订阅": false, "cubox-sync:Cubox": false, "file-tree-alternative:File Tree Alternative Plugin": true, - "hidden-folder-obsidian:隐藏文件夹": false, "password-protection:开启密码保护": false, "soundscapes:Soundscapes: My Music": false, "sheet-plus:创建 Excel 文件": false, "wucai-highlights-official:Start WuCai syncing": false, "note-to-mp:复制到公众号": false, "timelines-revamped:Insert Timeline Event": false, - "timelines-revamped:Insert Timeline Event (Frontmatter)": false + "timelines-revamped:Insert Timeline Event (Frontmatter)": false, + "periodic-notes:Open today": false, + "onlyoffice:New OnlyOffice Document": false } }, - "active": "210f6e255abf09ac", + "active": "88ed9de744392085", "lastOpenFiles": [ + "08-Inbox/Office/Start.pptx", "03-学习笔记/数据备份方案.md", + "08-Inbox/Office/Start.docx", "01-工作日记/2025-08-26.md", + "08-Inbox/Office/Start.xlsx", + "08-Inbox/Office", + "08-Inbox/未命名文件夹", "01-工作日记/2025-08-25.md", "50-Memos/2025/08/党员组织看山河为证2个多小时 晚上在最大的杨裕兴面馆吃面 (2025-08-25 19-25).md", "60-Imports/63-WuCai/2025/08/Plex重大变更:无论使用自己还是别人的媒体服务器远程播放都必须付费 – 蓝点网.md", @@ -367,7 +348,6 @@ "10-WebClipper/扩展无限可能:Obsidian Web Viewer插件解析.md", "10-WebClipper/Pocket.md", "02-技术评测/AI专题/免费使用Gemini 2.5 Pro的完整教程.md", - "02-技术评测/AI专题/AI使用评测.md", "50-Memos/2025/08/resources/npLDiAioDzxYNMCxDndP3Q_A0FB7954-FD46-4F7F-A39E-E5284AAD9223.jpg", "08-Inbox/B99016FB-F1A3-433A-BF44-75086CF8B7F6.txt", "08-Inbox/assets/68691ee74ca1b.png", @@ -375,11 +355,6 @@ "70-SimpRead/output/Obsidian 和 Logseq 对比 - 拾月/assets", "70-SimpRead/output/Obsidian 和 Logseq 对比 - 拾月", "70-SimpRead/output/本地快照系统.pdf", - "70-SimpRead/output/assets", - "70-SimpRead/Inbox/assets", - "70-SimpRead/output/tmp-本地快照系统.html", - "70-SimpRead/simpread_config.json", - "simpread_config.json", "50-Memos/2025/08/resources/JghbgqDFVMTm2ZbzCdqT3T_22902977-BC80-405E-8D23-996AFB1B7939.jpg", "50-Memos/2025/08/resources/QxEtttRT6WPdBi6WWzSgMj_E6DB1120-D906-409D-99DE-374ADE4B4E7E.jpg", "50-Memos/2025/08/resources/iBGNVYtLw8a8HuefAMGv6L_FD566CF2-5ECB-479D-844E-36A3977F3EE3.jpg", diff --git a/01-工作日记/2025-08-26.md b/01-工作日记/2025-08-26.md index fed97795..9778dd1a 100644 --- a/01-工作日记/2025-08-26.md +++ b/01-工作日记/2025-08-26.md @@ -6,7 +6,7 @@ tags: rating: ⭐️ excerpt: created: 2025-08-26T10:08 -updated: 2025-08-26T17:43 +updated: 2025-08-26T23:01 --- ## 1TODO - [x] 多喝水,避免久坐不动 ✅ 2025-08-26 @@ -128,6 +128,7 @@ nextcloud也需要域名信任,修改config.php文件!ssh->root权限! - fnOS-T:更新下载镜像到90%后失败? ## 3 Tips +- 偶然发现:OB有onlyoffice插件,实现office文件联动 ## 4 Questions diff --git a/08-Inbox/Office/Start.docx b/08-Inbox/Office/Start.docx new file mode 100644 index 00000000..4c0241a3 Binary files /dev/null and b/08-Inbox/Office/Start.docx differ diff --git a/08-Inbox/Office/Start.pptx b/08-Inbox/Office/Start.pptx new file mode 100644 index 00000000..a2f4c71f Binary files /dev/null and b/08-Inbox/Office/Start.pptx differ diff --git a/08-Inbox/Office/Start.xlsx b/08-Inbox/Office/Start.xlsx new file mode 100644 index 00000000..8d896833 Binary files /dev/null and b/08-Inbox/Office/Start.xlsx differ