plezi 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/CHANGELOG.md +450 -0
  4. data/Gemfile +4 -0
  5. data/KNOWN_ISSUES.md +13 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +341 -0
  8. data/Rakefile +2 -0
  9. data/TODO.md +19 -0
  10. data/bin/plezi +301 -0
  11. data/lib/plezi.rb +125 -0
  12. data/lib/plezi/base/cache.rb +77 -0
  13. data/lib/plezi/base/connections.rb +33 -0
  14. data/lib/plezi/base/dsl.rb +177 -0
  15. data/lib/plezi/base/engine.rb +85 -0
  16. data/lib/plezi/base/events.rb +84 -0
  17. data/lib/plezi/base/io_reactor.rb +41 -0
  18. data/lib/plezi/base/logging.rb +62 -0
  19. data/lib/plezi/base/rack_app.rb +89 -0
  20. data/lib/plezi/base/services.rb +57 -0
  21. data/lib/plezi/base/timers.rb +71 -0
  22. data/lib/plezi/handlers/controller_magic.rb +383 -0
  23. data/lib/plezi/handlers/http_echo.rb +27 -0
  24. data/lib/plezi/handlers/http_host.rb +215 -0
  25. data/lib/plezi/handlers/http_router.rb +69 -0
  26. data/lib/plezi/handlers/magic_helpers.rb +43 -0
  27. data/lib/plezi/handlers/route.rb +272 -0
  28. data/lib/plezi/handlers/stubs.rb +143 -0
  29. data/lib/plezi/server/README.md +33 -0
  30. data/lib/plezi/server/helpers/http.rb +169 -0
  31. data/lib/plezi/server/helpers/mime_types.rb +999 -0
  32. data/lib/plezi/server/protocols/http_protocol.rb +318 -0
  33. data/lib/plezi/server/protocols/http_request.rb +133 -0
  34. data/lib/plezi/server/protocols/http_response.rb +294 -0
  35. data/lib/plezi/server/protocols/websocket.rb +208 -0
  36. data/lib/plezi/server/protocols/ws_response.rb +92 -0
  37. data/lib/plezi/server/services/basic_service.rb +224 -0
  38. data/lib/plezi/server/services/no_service.rb +196 -0
  39. data/lib/plezi/server/services/ssl_service.rb +193 -0
  40. data/lib/plezi/version.rb +3 -0
  41. data/plezi.gemspec +26 -0
  42. data/resources/404.erb +68 -0
  43. data/resources/404.haml +64 -0
  44. data/resources/404.html +67 -0
  45. data/resources/404.slim +63 -0
  46. data/resources/500.erb +68 -0
  47. data/resources/500.haml +63 -0
  48. data/resources/500.html +67 -0
  49. data/resources/500.slim +63 -0
  50. data/resources/Gemfile +85 -0
  51. data/resources/anorexic_gray.png +0 -0
  52. data/resources/anorexic_websockets.html +47 -0
  53. data/resources/code.rb +8 -0
  54. data/resources/config.ru +39 -0
  55. data/resources/controller.rb +139 -0
  56. data/resources/db_ac_config.rb +58 -0
  57. data/resources/db_dm_config.rb +51 -0
  58. data/resources/db_sequel_config.rb +42 -0
  59. data/resources/en.yml +204 -0
  60. data/resources/environment.rb +41 -0
  61. data/resources/haml_config.rb +6 -0
  62. data/resources/i18n_config.rb +14 -0
  63. data/resources/rakefile.rb +22 -0
  64. data/resources/redis_config.rb +35 -0
  65. data/resources/routes.rb +26 -0
  66. data/resources/welcome_page.html +72 -0
  67. data/websocket chatroom.md +639 -0
  68. metadata +141 -0
@@ -0,0 +1,143 @@
1
+ module Plezi
2
+
3
+ ####
4
+ # a skeleton for a RESTful controller class
5
+ #
6
+ # you dont have to inherit this or use this, this is stub code.
7
+ #
8
+ # it can also be used for non RESTful requests by utilizing only the
9
+ # index method or adding public methods that aren't RESTful reserved (and don't start with '_').
10
+ #
11
+ # if a method returns false, a 404 error (not found) is assumed. and routes continue to search.
12
+ #
13
+ # otherwise, the method's return value is added to the response body. Normally, the method will return a String object.
14
+ #
15
+ # methods should return the response's body string as their last value, unless
16
+ # they have correctly edited the response (in which case they should return `true`).
17
+ #
18
+ class StubRESTCtrl
19
+
20
+ # every request that routes to this controller will create a new instance
21
+ def initialize
22
+ end
23
+
24
+ # called when request is GET and params\[:id] isn't defined
25
+ def index
26
+ "Hello World!"
27
+ end
28
+
29
+ # called when request is GET and params\[:id] exists
30
+ def show
31
+ "nothing to show for id - #{params[:id]} - with parameters: #{params.to_s}"
32
+ end
33
+
34
+ # called when request is GET and params\[:id] == "new" (used for the "create new object" form).
35
+ def new
36
+ "Should we make something new?"
37
+ end
38
+
39
+ # called when request is POST or PUT and params\[:id] isn't defined params\[:id] == "new"
40
+ def save
41
+ "save called - creating a new object."
42
+ end
43
+
44
+ # called when request is POST or PUT and params\[:id] exists and isn't "new"
45
+ def update
46
+ "update called - updating #{params[:id]}"
47
+ end
48
+
49
+ # called when request is DELETE (or params["_method"] == 'delete') and request.params\[:id] exists
50
+ def delete
51
+ "delete called - deleting object #{params[:id]}"
52
+ end
53
+
54
+ # called before request is called
55
+ #
56
+ # if method returns false (not nil), controller exists
57
+ # and routes continue searching
58
+ def before
59
+ true
60
+ end
61
+ # called after request is completed
62
+ #
63
+ # if method returns false (not nil), the request body is cleared,
64
+ # the controller exists and routes continue searching
65
+ def after
66
+ true
67
+ end
68
+ end
69
+
70
+ ####
71
+ # a skeleton for a WebSocket controller class which uses REST to emulate long XHR pulling
72
+ #
73
+ # you dont have to inherit this or use this, this is example/stub code.
74
+ #
75
+ # WebSockets Controllers and RESTful Controllers can be the same class
76
+ # (the same route can handle both a regular request and a WebSocket request).
77
+ #
78
+ # if the pre_connect method returns false, the WebSockets connection will be refused and the remaining routes will be attempted.
79
+ #
80
+ class StubWSCtrl
81
+
82
+ # every request that routes to this controller will create a new instance
83
+ def initialize
84
+ end
85
+
86
+ # called before the protocol is swithed from HTTP to WebSockets.
87
+ #
88
+ # this allows setting headers, cookies and other data (such as authentication)
89
+ # prior to opening a WebSocket.
90
+ #
91
+ # if the method returns false, the connection will be refused and the remaining routes will be attempted.
92
+ def pre_connect
93
+ true
94
+ end
95
+
96
+ # called immediately after a WebSocket connection has been established.
97
+ def on_connect
98
+ true
99
+ end
100
+
101
+ # called when new data is recieved
102
+ #
103
+ # data is a string that contains binary or UTF8 (message dependent) data.
104
+ def on_message data
105
+ broadcast :_push, data
106
+ end
107
+
108
+ # called when a disconnect packet has been recieved or the connection has been cut
109
+ # (ISN'T called after a disconnect message has been sent).
110
+ def on_disconnect
111
+ end
112
+
113
+ # a demo event method that recieves a broadcast from instance siblings.
114
+ #
115
+ # methods that are protected and methods that start with an underscore are hidden from the router
116
+ # BUT, broadcasted methods must be public (or the broadcast will quietly fail)... so we have to use
117
+ # the _underscore for this method.
118
+ def _push data
119
+ response << data
120
+ end
121
+
122
+ #####
123
+ ## It is possible to use RESTful methods to help emulate long XHR pulling.
124
+ ## a RESTful controller can also be a WebSockets controller (these are not exclusive qualities).
125
+
126
+ # called when request is GET and params\[:id] isn't defined
127
+ def index
128
+ {message: 'index', data: {id: nil, token: nil}}.to_json
129
+ end
130
+
131
+ # called when request is GET and params\[:id] exists (unless params\[:id] == "new").
132
+ def show
133
+ {message: 'read_chat', data: {id: params[:id], token: cookies['example_token'], example_data: 'we missed you.'}}.to_json
134
+ end
135
+ # called when request is POST / PUT and params\[:id] exists
136
+ def update
137
+ # assumes body is JSON - more handling could be done using the params (which hold parsed JSON data).
138
+ broadcast :_push, request[:body]
139
+ {message: 'write_chat', data: {id: params[:id], token: cookies['example_token'], example_data: 'message sent.'}}.to_json
140
+ end
141
+
142
+ end
143
+ end
@@ -0,0 +1,33 @@
1
+ # server object\file structure
2
+
3
+ - services
4
+
5
+ this folder holds the modules and classes regarding the core-services classes (normal TCP/IP service and SSL service should be here).
6
+
7
+ services have one protocol that parses incoming requests and one handler that takes the parsed request and responds to it.
8
+
9
+ both protocols and handlers can be changed mid-stream, allowing a service to switch protocols (such as from HTTP to WebSockets, HTTP/1.1 to SPDY etc') or a handler.
10
+
11
+ - protocols
12
+
13
+ this folder holds the different protocols that could be run over the each socket-service (HTTP / WebSockets etc' should be here).
14
+
15
+ the protocols are devided into two different classes/object types:
16
+
17
+ 1. parsing input.
18
+ 2. formatting output.
19
+
20
+ - handlers
21
+
22
+ this folder holds the classes and modules used to actually handle the requests parsed by the protocol layer.
23
+
24
+ these are the classes and modules the Plezi framework users (developers) connect with when writing their web apps.
25
+
26
+ ## servers, services and protocols ... what?
27
+
28
+ services are the part of the server that recieves and sends data - services run specific protocols that together make up the whole of a server.
29
+
30
+ this division allows the user to change protocols mid-stream when allowed (such as switching from HTTP to WebSockets).
31
+
32
+ this abstraction to the sockets layer allows support for future or custom protocols without any changes to the abstraction layer.
33
+
@@ -0,0 +1,169 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+
5
+ module Plezi
6
+
7
+ # includes general helper methods for HTTP protocol and related (url encoding etc')
8
+ module HTTP
9
+ module_function
10
+ # decode html form data stream
11
+ # def decode_form_data encoded
12
+ # scanner = StringScanner.new encoded.gsub('+', '%20')
13
+ # decoded = ''
14
+ # until scanner.eos? do
15
+ # decoded << scanner.scan(/[^%]+/)
16
+ # if scanner.scan(/\%[0-9a-fA-F][0-9a-fA-F]/)
17
+ # decoded << scanner.matched[1,2].to_i(16).chr
18
+ # elsif !scanner.eos?
19
+ # decoded << scanner.scan(/./)
20
+ # end
21
+ # end
22
+ # decoded
23
+ # end
24
+ # # encode html form data stream
25
+ # def encode_form_data exposed
26
+ # scanner = StringScanner.new exposed
27
+ # encoded = ''
28
+
29
+ # # HTML form encoding
30
+ # until scanner.eos? do
31
+ # encoded << scanner.scan(/[a-zA-Z0-9\*\.\_\-]+/)
32
+ # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/./)
33
+ # end
34
+
35
+ # # HTTP encoding
36
+ # # until scanner.eos? do
37
+ # # encoded << scanner.scan(/[^\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+/)
38
+ # # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/./)
39
+ # # end
40
+ # encoded
41
+ # end
42
+ # # decode HTTP URI data stream
43
+ # def decode_uri encoded
44
+ # scanner = StringScanner.new encoded.gsub('+', '%20') #? is this true here?
45
+ # decoded = ''
46
+ # until scanner.eos? do
47
+ # decoded << scanner.scan(/[^%]+/)
48
+ # if scanner.scan(/\%[0-9a-fA-F][0-9a-fA-F]/)
49
+ # decoded << scanner.matched[1,2].to_i(16).chr
50
+ # elsif !scanner.eos?
51
+ # decoded << scanner.scan(/./)
52
+ # end
53
+ # end
54
+ # decoded
55
+ # end
56
+ # # encode HTTP URI data stream
57
+ # def encode_uri_data exposed
58
+ # scanner = StringScanner.new exposed
59
+ # encoded = ''
60
+ # until scanner.eos? do
61
+ # encoded << scanner.scan(/[^\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=]+/)
62
+ # encoded << "%#{scanner.matched.ord <= 16 ? "0" : ""} #{ scanner.matched.ord.to_s(16) }" if scanner.scan(/.|[\s]/)
63
+ # end
64
+ # encoded
65
+ # end
66
+
67
+ # Based on the WEBRick source code, escapes &, ", > and < in a String object
68
+ def escape(string)
69
+ string.gsub(/&/n, '&amp;')
70
+ .gsub(/\"/n, '&quot;')
71
+ .gsub(/>/n, '&gt;')
72
+ .gsub(/</n, '&lt;')
73
+ end
74
+ def add_param_to_hash param_name, param_value, target_hash
75
+ begin
76
+ a = target_hash
77
+ p = param_name.gsub(']',' ').split(/\[/)
78
+ p.each_index { |i| n = p[i].strip.to_sym; p[i+1] ? [ ( a[n] ||= ( p[i+1] == ' ' ? [] : {} ) ), ( a = a[n]) ] : (a.is_a?(Hash) ? [(a[n]? (a[n].is_a?(String)? (a[n] = [a[n]]) : true) : a[n]=''), (a=a[n])] : [(a << ''), (a = a.last)]) }
79
+ a << param_value
80
+ rescue Exception => e
81
+ Plezi.error e
82
+ Plezi.error "(Silent): paramaters parse error for #{param_name} ... maybe conflicts with a different set?"
83
+ target_hash[param_name] = make_utf8! param_value
84
+ end
85
+ end
86
+
87
+ def decode object, decode_method = :form
88
+ if object.is_a?(Hash)
89
+ object.values.each {|v| decode v, decode_method}
90
+ elsif object.is_a?(Array)
91
+ object.each {|v| decode v, decode_method}
92
+ elsif object.is_a?(String)
93
+ case decode_method
94
+ when :form
95
+ object.gsub!('+', '%20')
96
+ object.gsub!(/\%[0-9a-fA-F][0-9a-fA-F]/) {|m| m[1..2].to_i(16).chr}
97
+ when :uri, :url
98
+ object.gsub!(/\%[0-9a-fA-F][0-9a-fA-F]/) {|m| m[1..2].to_i(16).chr}
99
+ when :html
100
+ object.gsub!(/&amp;/i, '&')
101
+ object.gsub!(/&quot;/i, '"')
102
+ object.gsub!(/&gt;/i, ">")
103
+ object.gsub!(/&lt;/i, "<")
104
+ when :utf8
105
+
106
+ else
107
+
108
+ end
109
+ object.gsub!(/&#([0-9a-fA-F]{2});/) {|m| m.match(/[0-9a-fA-F]{2}/)[0].hex.chr}
110
+ object.gsub!(/&#([0-9]{4});/) {|m| [m.match(/[0-9]+/)[0].to_i].pack 'U'}
111
+ make_utf8! object
112
+ return object
113
+ elsif object.is_a?(Symbol)
114
+ str = object.to_str
115
+ decode str, decode_method
116
+ return str.to_sym
117
+ else
118
+ raise "Plezi Raising Hell (don't misuse us)!"
119
+ end
120
+ end
121
+ def encode object, decode_method = :form
122
+ if object.is_a?(Hash)
123
+ object.values.each {|v| encode v, decode_method}
124
+ elsif object.is_a?(Array)
125
+ object.each {|v| encode v, decode_method}
126
+ elsif object.is_a?(String)
127
+ case decode_method
128
+ when :uri, :url, :form
129
+ object.gsub!(/[^a-zA-Z0-9\*\.\_\-]/) {|m| m.ord <= 16 ? "%0#{m.ord.to_s(16)}" : "%#{m.ord.to_s(16)}"}
130
+ when :html
131
+ object.gsub!('&', "&amp;")
132
+ object.gsub!('"', "&quot;")
133
+ object.gsub!(">", "&gt;")
134
+ object.gsub!("<", "&lt;")
135
+ object.gsub!(/[^\sa-zA-Z\d\&\;]/) {|m| "&#%04d;" % m.unpack('U')[0] }
136
+ # object.gsub!(/[^\s]/) {|m| "&#%04d;" % m.unpack('U')[0] }
137
+ when :utf8
138
+ object.gsub!(/[^\sa-zA-Z\d]/) {|m| "&#%04d;" % m.unpack('U')[0] }
139
+ else
140
+
141
+ end
142
+ return object
143
+ elsif object.is_a?(Symbol)
144
+ str = object.to_str
145
+ encode str, decode_method
146
+ return str.to_sym
147
+ else
148
+ raise "Plezi Raising Hell (don't misuse us)!"
149
+ end
150
+ end
151
+ # extracts parameters from the query
152
+ def extract_data data, target_hash, decode = :form
153
+ data.each do |set|
154
+ list = set.split('=')
155
+ list.each {|s| HTTP.decode s, decode if s}
156
+ add_param_to_hash list.shift, list.join('='), target_hash
157
+ end
158
+ end
159
+
160
+ # re-encodes a string into UTF-8
161
+ def make_utf8!(string, encoding= 'utf-8')
162
+ return false unless string
163
+ string.force_encoding("binary").encode!(encoding, "binary", invalid: :replace, undef: :replace, replace: '') unless string.force_encoding(encoding).valid_encoding?
164
+ string
165
+ end
166
+
167
+
168
+ end
169
+ end
@@ -0,0 +1,999 @@
1
+ module Plezi
2
+ # This module holds the mime dictionary.
3
+ module MimeTypeHelper
4
+ # thank you Apache group (and many more), for compiling mime-type list for me to search through.
5
+ MIME_DICTIONARY = {"123"=>"application/vnd.lotus-1-2-3",
6
+ "3dml"=>"text/vnd.in3d.3dml",
7
+ "3ds"=>"image/x-3ds",
8
+ "3g2"=>"video/3gpp2",
9
+ "3gp"=>"video/3gpp",
10
+ "7z"=>"application/x-7z-compressed",
11
+ "aab"=>"application/x-authorware-bin",
12
+ "aac"=>"audio/x-aac",
13
+ "aam"=>"application/x-authorware-map",
14
+ "aas"=>"application/x-authorware-seg",
15
+ "abw"=>"application/x-abiword",
16
+ "ac"=>"application/pkix-attr-cert",
17
+ "acc"=>"application/vnd.americandynamics.acc",
18
+ "ace"=>"application/x-ace-compressed",
19
+ "acu"=>"application/vnd.acucobol",
20
+ "acutc"=>"application/vnd.acucorp",
21
+ "adp"=>"audio/adpcm",
22
+ "aep"=>"application/vnd.audiograph",
23
+ "afm"=>"application/x-font-type1",
24
+ "afp"=>"application/vnd.ibm.modcap",
25
+ "ahead"=>"application/vnd.ahead.space",
26
+ "ai"=>"application/postscript",
27
+ "aif"=>"audio/x-aiff",
28
+ "aifc"=>"audio/x-aiff",
29
+ "aiff"=>"audio/x-aiff",
30
+ "air"=>"application/vnd.adobe.air-application-installer-package+zip",
31
+ "ait"=>"application/vnd.dvb.ait",
32
+ "ami"=>"application/vnd.amiga.ami",
33
+ "apk"=>"application/vnd.android.package-archive",
34
+ "appcache"=>"text/cache-manifest",
35
+ "application"=>"application/x-ms-application",
36
+ "apr"=>"application/vnd.lotus-approach",
37
+ "arc"=>"application/x-freearc",
38
+ "asc"=>"application/pgp-signature",
39
+ "asf"=>"video/x-ms-asf",
40
+ "asm"=>"text/x-asm",
41
+ "aso"=>"application/vnd.accpac.simply.aso",
42
+ "asx"=>"video/x-ms-asf",
43
+ "atc"=>"application/vnd.acucorp",
44
+ "atom"=>"application/atom+xml",
45
+ "atomcat"=>"application/atomcat+xml",
46
+ "atomsvc"=>"application/atomsvc+xml",
47
+ "atx"=>"application/vnd.antix.game-component",
48
+ "au"=>"audio/basic",
49
+ "avi"=>"video/x-msvideo",
50
+ "aw"=>"application/applixware",
51
+ "azf"=>"application/vnd.airzip.filesecure.azf",
52
+ "azs"=>"application/vnd.airzip.filesecure.azs",
53
+ "azw"=>"application/vnd.amazon.ebook",
54
+ "bat"=>"application/x-msdownload",
55
+ "bcpio"=>"application/x-bcpio",
56
+ "bdf"=>"application/x-font-bdf",
57
+ "bdm"=>"application/vnd.syncml.dm+wbxml",
58
+ "bed"=>"application/vnd.realvnc.bed",
59
+ "bh2"=>"application/vnd.fujitsu.oasysprs",
60
+ "bin"=>"application/octet-stream",
61
+ "blb"=>"application/x-blorb",
62
+ "blorb"=>"application/x-blorb",
63
+ "bmi"=>"application/vnd.bmi",
64
+ "bmp"=>"image/bmp",
65
+ "book"=>"application/vnd.framemaker",
66
+ "box"=>"application/vnd.previewsystems.box",
67
+ "boz"=>"application/x-bzip2",
68
+ "bpk"=>"application/octet-stream",
69
+ "btif"=>"image/prs.btif",
70
+ "bz"=>"application/x-bzip",
71
+ "bz2"=>"application/x-bzip2",
72
+ "c"=>"text/x-c",
73
+ "c11amc"=>"application/vnd.cluetrust.cartomobile-config",
74
+ "c11amz"=>"application/vnd.cluetrust.cartomobile-config-pkg",
75
+ "c4d"=>"application/vnd.clonk.c4group",
76
+ "c4f"=>"application/vnd.clonk.c4group",
77
+ "c4g"=>"application/vnd.clonk.c4group",
78
+ "c4p"=>"application/vnd.clonk.c4group",
79
+ "c4u"=>"application/vnd.clonk.c4group",
80
+ "cab"=>"application/vnd.ms-cab-compressed",
81
+ "caf"=>"audio/x-caf",
82
+ "cap"=>"application/vnd.tcpdump.pcap",
83
+ "car"=>"application/vnd.curl.car",
84
+ "cat"=>"application/vnd.ms-pki.seccat",
85
+ "cb7"=>"application/x-cbr",
86
+ "cba"=>"application/x-cbr",
87
+ "cbr"=>"application/x-cbr",
88
+ "cbt"=>"application/x-cbr",
89
+ "cbz"=>"application/x-cbr",
90
+ "cc"=>"text/x-c",
91
+ "cct"=>"application/x-director",
92
+ "ccxml"=>"application/ccxml+xml",
93
+ "cdbcmsg"=>"application/vnd.contact.cmsg",
94
+ "cdf"=>"application/x-netcdf",
95
+ "cdkey"=>"application/vnd.mediastation.cdkey",
96
+ "cdmia"=>"application/cdmi-capability",
97
+ "cdmic"=>"application/cdmi-container",
98
+ "cdmid"=>"application/cdmi-domain",
99
+ "cdmio"=>"application/cdmi-object",
100
+ "cdmiq"=>"application/cdmi-queue",
101
+ "cdx"=>"chemical/x-cdx",
102
+ "cdxml"=>"application/vnd.chemdraw+xml",
103
+ "cdy"=>"application/vnd.cinderella",
104
+ "cer"=>"application/pkix-cert",
105
+ "cfs"=>"application/x-cfs-compressed",
106
+ "cgm"=>"image/cgm",
107
+ "chat"=>"application/x-chat",
108
+ "chm"=>"application/vnd.ms-htmlhelp",
109
+ "chrt"=>"application/vnd.kde.kchart",
110
+ "cif"=>"chemical/x-cif",
111
+ "cii"=>"application/vnd.anser-web-certificate-issue-initiation",
112
+ "cil"=>"application/vnd.ms-artgalry",
113
+ "cla"=>"application/vnd.claymore",
114
+ "class"=>"application/java-vm",
115
+ "clkk"=>"application/vnd.crick.clicker.keyboard",
116
+ "clkp"=>"application/vnd.crick.clicker.palette",
117
+ "clkt"=>"application/vnd.crick.clicker.template",
118
+ "clkw"=>"application/vnd.crick.clicker.wordbank",
119
+ "clkx"=>"application/vnd.crick.clicker",
120
+ "clp"=>"application/x-msclip",
121
+ "cmc"=>"application/vnd.cosmocaller",
122
+ "cmdf"=>"chemical/x-cmdf",
123
+ "cml"=>"chemical/x-cml",
124
+ "cmp"=>"application/vnd.yellowriver-custom-menu",
125
+ "cmx"=>"image/x-cmx",
126
+ "cod"=>"application/vnd.rim.cod",
127
+ "com"=>"application/x-msdownload",
128
+ "conf"=>"text/plain",
129
+ "cpio"=>"application/x-cpio",
130
+ "cpp"=>"text/x-c",
131
+ "cpt"=>"application/mac-compactpro",
132
+ "crd"=>"application/x-mscardfile",
133
+ "crl"=>"application/pkix-crl",
134
+ "crt"=>"application/x-x509-ca-cert",
135
+ "cryptonote"=>"application/vnd.rig.cryptonote",
136
+ "csh"=>"application/x-csh",
137
+ "csml"=>"chemical/x-csml",
138
+ "csp"=>"application/vnd.commonspace",
139
+ "css"=>"text/css",
140
+ "cst"=>"application/x-director",
141
+ "csv"=>"text/csv",
142
+ "cu"=>"application/cu-seeme",
143
+ "curl"=>"text/vnd.curl",
144
+ "cww"=>"application/prs.cww",
145
+ "cxt"=>"application/x-director",
146
+ "cxx"=>"text/x-c",
147
+ "dae"=>"model/vnd.collada+xml",
148
+ "daf"=>"application/vnd.mobius.daf",
149
+ "dart"=>"application/vnd.dart",
150
+ "dataless"=>"application/vnd.fdsn.seed",
151
+ "davmount"=>"application/davmount+xml",
152
+ "dbk"=>"application/docbook+xml",
153
+ "dcr"=>"application/x-director",
154
+ "dcurl"=>"text/vnd.curl.dcurl",
155
+ "dd2"=>"application/vnd.oma.dd2+xml",
156
+ "ddd"=>"application/vnd.fujixerox.ddd",
157
+ "deb"=>"application/x-debian-package",
158
+ "def"=>"text/plain",
159
+ "deploy"=>"application/octet-stream",
160
+ "der"=>"application/x-x509-ca-cert",
161
+ "dfac"=>"application/vnd.dreamfactory",
162
+ "dgc"=>"application/x-dgc-compressed",
163
+ "dic"=>"text/x-c",
164
+ "dif"=>"video/x-dv",
165
+ "dir"=>"application/x-director",
166
+ "dis"=>"application/vnd.mobius.dis",
167
+ "dist"=>"application/octet-stream",
168
+ "distz"=>"application/octet-stream",
169
+ "djv"=>"image/vnd.djvu",
170
+ "djvu"=>"image/vnd.djvu",
171
+ "dll"=>"application/x-msdownload",
172
+ "dmg"=>"application/x-apple-diskimage",
173
+ "dmp"=>"application/vnd.tcpdump.pcap",
174
+ "dms"=>"application/octet-stream",
175
+ "dna"=>"application/vnd.dna",
176
+ "doc"=>"application/msword",
177
+ "docm"=>"application/vnd.ms-word.document.macroenabled.12",
178
+ "docx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
179
+ "dot"=>"application/msword",
180
+ "dotm"=>"application/vnd.ms-word.template.macroenabled.12",
181
+ "dotx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
182
+ "dp"=>"application/vnd.osgi.dp",
183
+ "dpg"=>"application/vnd.dpgraph",
184
+ "dra"=>"audio/vnd.dra",
185
+ "dsc"=>"text/prs.lines.tag",
186
+ "dssc"=>"application/dssc+der",
187
+ "dtb"=>"application/x-dtbook+xml",
188
+ "dtd"=>"application/xml-dtd",
189
+ "dts"=>"audio/vnd.dts",
190
+ "dtshd"=>"audio/vnd.dts.hd",
191
+ "dump"=>"application/octet-stream",
192
+ "dv"=>"video/x-dv",
193
+ "dvb"=>"video/vnd.dvb.file",
194
+ "dvi"=>"application/x-dvi",
195
+ "dwf"=>"model/vnd.dwf",
196
+ "dwg"=>"image/vnd.dwg",
197
+ "dxf"=>"image/vnd.dxf",
198
+ "dxp"=>"application/vnd.spotfire.dxp",
199
+ "dxr"=>"application/x-director",
200
+ "ecelp4800"=>"audio/vnd.nuera.ecelp4800",
201
+ "ecelp7470"=>"audio/vnd.nuera.ecelp7470",
202
+ "ecelp9600"=>"audio/vnd.nuera.ecelp9600",
203
+ "ecma"=>"application/ecmascript",
204
+ "edm"=>"application/vnd.novadigm.edm",
205
+ "edx"=>"application/vnd.novadigm.edx",
206
+ "efif"=>"application/vnd.picsel",
207
+ "ei6"=>"application/vnd.pg.osasli",
208
+ "elc"=>"application/octet-stream",
209
+ "emf"=>"application/x-msmetafile",
210
+ "eml"=>"message/rfc822",
211
+ "emma"=>"application/emma+xml",
212
+ "emz"=>"application/x-msmetafile",
213
+ "eol"=>"audio/vnd.digital-winds",
214
+ "eot"=>"application/vnd.ms-fontobject",
215
+ "eps"=>"application/postscript",
216
+ "epub"=>"application/epub+zip",
217
+ "es3"=>"application/vnd.eszigno3+xml",
218
+ "esa"=>"application/vnd.osgi.subsystem",
219
+ "esf"=>"application/vnd.epson.esf",
220
+ "et3"=>"application/vnd.eszigno3+xml",
221
+ "etx"=>"text/x-setext",
222
+ "eva"=>"application/x-eva",
223
+ "evy"=>"application/x-envoy",
224
+ "exe"=>"application/x-msdownload",
225
+ "exi"=>"application/exi",
226
+ "ext"=>"application/vnd.novadigm.ext",
227
+ "ez"=>"application/andrew-inset",
228
+ "ez2"=>"application/vnd.ezpix-album",
229
+ "ez3"=>"application/vnd.ezpix-package",
230
+ "f"=>"text/x-fortran",
231
+ "f4v"=>"video/x-f4v",
232
+ "f77"=>"text/x-fortran",
233
+ "f90"=>"text/x-fortran",
234
+ "fbs"=>"image/vnd.fastbidsheet",
235
+ "fcdt"=>"application/vnd.adobe.formscentral.fcdt",
236
+ "fcs"=>"application/vnd.isac.fcs",
237
+ "fdf"=>"application/vnd.fdf",
238
+ "fe_launch"=>"application/vnd.denovo.fcselayout-link",
239
+ "fg5"=>"application/vnd.fujitsu.oasysgp",
240
+ "fgd"=>"application/x-director",
241
+ "fh"=>"image/x-freehand",
242
+ "fh4"=>"image/x-freehand",
243
+ "fh5"=>"image/x-freehand",
244
+ "fh7"=>"image/x-freehand",
245
+ "fhc"=>"image/x-freehand",
246
+ "fig"=>"application/x-xfig",
247
+ "flac"=>"audio/x-flac",
248
+ "fli"=>"video/x-fli",
249
+ "flo"=>"application/vnd.micrografx.flo",
250
+ "flv"=>"video/x-flv",
251
+ "flw"=>"application/vnd.kde.kivio",
252
+ "flx"=>"text/vnd.fmi.flexstor",
253
+ "fly"=>"text/vnd.fly",
254
+ "fm"=>"application/vnd.framemaker",
255
+ "fnc"=>"application/vnd.frogans.fnc",
256
+ "for"=>"text/x-fortran",
257
+ "fpx"=>"image/vnd.fpx",
258
+ "frame"=>"application/vnd.framemaker",
259
+ "fsc"=>"application/vnd.fsc.weblaunch",
260
+ "fst"=>"image/vnd.fst",
261
+ "ftc"=>"application/vnd.fluxtime.clip",
262
+ "fti"=>"application/vnd.anser-web-funds-transfer-initiation",
263
+ "fvt"=>"video/vnd.fvt",
264
+ "fxp"=>"application/vnd.adobe.fxp",
265
+ "fxpl"=>"application/vnd.adobe.fxp",
266
+ "fzs"=>"application/vnd.fuzzysheet",
267
+ "g2w"=>"application/vnd.geoplan",
268
+ "g3"=>"image/g3fax",
269
+ "g3w"=>"application/vnd.geospace",
270
+ "gac"=>"application/vnd.groove-account",
271
+ "gam"=>"application/x-tads",
272
+ "gbr"=>"application/rpki-ghostbusters",
273
+ "gca"=>"application/x-gca-compressed",
274
+ "gdl"=>"model/vnd.gdl",
275
+ "geo"=>"application/vnd.dynageo",
276
+ "gex"=>"application/vnd.geometry-explorer",
277
+ "ggb"=>"application/vnd.geogebra.file",
278
+ "ggt"=>"application/vnd.geogebra.tool",
279
+ "ghf"=>"application/vnd.groove-help",
280
+ "gif"=>"image/gif",
281
+ "gim"=>"application/vnd.groove-identity-message",
282
+ "gml"=>"application/gml+xml",
283
+ "gmx"=>"application/vnd.gmx",
284
+ "gnumeric"=>"application/x-gnumeric",
285
+ "gph"=>"application/vnd.flographit",
286
+ "gpx"=>"application/gpx+xml",
287
+ "gqf"=>"application/vnd.grafeq",
288
+ "gqs"=>"application/vnd.grafeq",
289
+ "gram"=>"application/srgs",
290
+ "gramps"=>"application/x-gramps-xml",
291
+ "gre"=>"application/vnd.geometry-explorer",
292
+ "grv"=>"application/vnd.groove-injector",
293
+ "grxml"=>"application/srgs+xml",
294
+ "gsf"=>"application/x-font-ghostscript",
295
+ "gtar"=>"application/x-gtar",
296
+ "gtm"=>"application/vnd.groove-tool-message",
297
+ "gtw"=>"model/vnd.gtw",
298
+ "gv"=>"text/vnd.graphviz",
299
+ "gxf"=>"application/gxf",
300
+ "gxt"=>"application/vnd.geonext",
301
+ "h"=>"text/x-c",
302
+ "h261"=>"video/h261",
303
+ "h263"=>"video/h263",
304
+ "h264"=>"video/h264",
305
+ "hal"=>"application/vnd.hal+xml",
306
+ "hbci"=>"application/vnd.hbci",
307
+ "hdf"=>"application/x-hdf",
308
+ "hh"=>"text/x-c",
309
+ "hlp"=>"application/winhlp",
310
+ "hpgl"=>"application/vnd.hp-hpgl",
311
+ "hpid"=>"application/vnd.hp-hpid",
312
+ "hps"=>"application/vnd.hp-hps",
313
+ "hqx"=>"application/mac-binhex40",
314
+ "htke"=>"application/vnd.kenameaapp",
315
+ "htm"=>"text/html",
316
+ "html"=>"text/html",
317
+ "hvd"=>"application/vnd.yamaha.hv-dic",
318
+ "hvp"=>"application/vnd.yamaha.hv-voice",
319
+ "hvs"=>"application/vnd.yamaha.hv-script",
320
+ "i2g"=>"application/vnd.intergeo",
321
+ "icc"=>"application/vnd.iccprofile",
322
+ "ice"=>"x-conference/x-cooltalk",
323
+ "icm"=>"application/vnd.iccprofile",
324
+ "ico"=>"image/x-icon",
325
+ "ics"=>"text/calendar",
326
+ "ief"=>"image/ief",
327
+ "ifb"=>"text/calendar",
328
+ "ifm"=>"application/vnd.shana.informed.formdata",
329
+ "iges"=>"model/iges",
330
+ "igl"=>"application/vnd.igloader",
331
+ "igm"=>"application/vnd.insors.igm",
332
+ "igs"=>"model/iges",
333
+ "igx"=>"application/vnd.micrografx.igx",
334
+ "iif"=>"application/vnd.shana.informed.interchange",
335
+ "imp"=>"application/vnd.accpac.simply.imp",
336
+ "ims"=>"application/vnd.ms-ims",
337
+ "in"=>"text/plain",
338
+ "ink"=>"application/inkml+xml",
339
+ "inkml"=>"application/inkml+xml",
340
+ "install"=>"application/x-install-instructions",
341
+ "iota"=>"application/vnd.astraea-software.iota",
342
+ "ipfix"=>"application/ipfix",
343
+ "ipk"=>"application/vnd.shana.informed.package",
344
+ "irm"=>"application/vnd.ibm.rights-management",
345
+ "irp"=>"application/vnd.irepository.package+xml",
346
+ "iso"=>"application/x-iso9660-image",
347
+ "itp"=>"application/vnd.shana.informed.formtemplate",
348
+ "ivp"=>"application/vnd.immervision-ivp",
349
+ "ivu"=>"application/vnd.immervision-ivu",
350
+ "jad"=>"text/vnd.sun.j2me.app-descriptor",
351
+ "jam"=>"application/vnd.jam",
352
+ "jar"=>"application/java-archive",
353
+ "java"=>"text/x-java-source",
354
+ "jisp"=>"application/vnd.jisp",
355
+ "jlt"=>"application/vnd.hp-jlyt",
356
+ "jnlp"=>"application/x-java-jnlp-file",
357
+ "joda"=>"application/vnd.joost.joda-archive",
358
+ "jp2"=>"image/jp2",
359
+ "jpe"=>"image/jpeg",
360
+ "jpeg"=>"image/jpeg",
361
+ "jpg"=>"image/jpeg",
362
+ "jpgm"=>"video/jpm",
363
+ "jpgv"=>"video/jpeg",
364
+ "jpm"=>"video/jpm",
365
+ "js"=>"application/javascript",
366
+ "json"=>"application/json",
367
+ "jsonml"=>"application/jsonml+json",
368
+ "kar"=>"audio/midi",
369
+ "karbon"=>"application/vnd.kde.karbon",
370
+ "kfo"=>"application/vnd.kde.kformula",
371
+ "kia"=>"application/vnd.kidspiration",
372
+ "kml"=>"application/vnd.google-earth.kml+xml",
373
+ "kmz"=>"application/vnd.google-earth.kmz",
374
+ "kne"=>"application/vnd.kinar",
375
+ "knp"=>"application/vnd.kinar",
376
+ "kon"=>"application/vnd.kde.kontour",
377
+ "kpr"=>"application/vnd.kde.kpresenter",
378
+ "kpt"=>"application/vnd.kde.kpresenter",
379
+ "kpxx"=>"application/vnd.ds-keypoint",
380
+ "ksp"=>"application/vnd.kde.kspread",
381
+ "ktr"=>"application/vnd.kahootz",
382
+ "ktx"=>"image/ktx",
383
+ "ktz"=>"application/vnd.kahootz",
384
+ "kwd"=>"application/vnd.kde.kword",
385
+ "kwt"=>"application/vnd.kde.kword",
386
+ "lasxml"=>"application/vnd.las.las+xml",
387
+ "latex"=>"application/x-latex",
388
+ "lbd"=>"application/vnd.llamagraphics.life-balance.desktop",
389
+ "lbe"=>"application/vnd.llamagraphics.life-balance.exchange+xml",
390
+ "les"=>"application/vnd.hhe.lesson-player",
391
+ "lha"=>"application/octet-stream",
392
+ "link66"=>"application/vnd.route66.link66+xml",
393
+ "list"=>"text/plain",
394
+ "list3820"=>"application/vnd.ibm.modcap",
395
+ "listafp"=>"application/vnd.ibm.modcap",
396
+ "lnk"=>"application/x-ms-shortcut",
397
+ "log"=>"text/plain",
398
+ "lostxml"=>"application/lost+xml",
399
+ "lrf"=>"application/octet-stream",
400
+ "lrm"=>"application/vnd.ms-lrm",
401
+ "ltf"=>"application/vnd.frogans.ltf",
402
+ "lvp"=>"audio/vnd.lucent.voice",
403
+ "lwp"=>"application/vnd.lotus-wordpro",
404
+ "lzh"=>"application/octet-stream",
405
+ "m13"=>"application/x-msmediaview",
406
+ "m14"=>"application/x-msmediaview",
407
+ "m1v"=>"video/mpeg",
408
+ "m21"=>"application/mp21",
409
+ "m2a"=>"audio/mpeg",
410
+ "m2v"=>"video/mpeg",
411
+ "m3a"=>"audio/mpeg",
412
+ "m3u"=>"audio/x-mpegurl",
413
+ "m3u8"=>"application/vnd.apple.mpegurl",
414
+ "m4a"=>"audio/mp4a-latm",
415
+ "m4b"=>"audio/mp4a-latm",
416
+ "m4p"=>"audio/mp4a-latm",
417
+ "m4u"=>"video/vnd.mpegurl",
418
+ "m4v"=>"video/x-m4v",
419
+ "ma"=>"application/mathematica",
420
+ "mac"=>"image/x-macpaint",
421
+ "mads"=>"application/mads+xml",
422
+ "mag"=>"application/vnd.ecowin.chart",
423
+ "maker"=>"application/vnd.framemaker",
424
+ "man"=>"application/x-troff-man",
425
+ "mar"=>"application/octet-stream",
426
+ "mathml"=>"application/mathml+xml",
427
+ "mb"=>"application/mathematica",
428
+ "mbk"=>"application/vnd.mobius.mbk",
429
+ "mbox"=>"application/mbox",
430
+ "mc1"=>"application/vnd.medcalcdata",
431
+ "mcd"=>"application/vnd.mcd",
432
+ "mcurl"=>"text/vnd.curl.mcurl",
433
+ "mdb"=>"application/x-msaccess",
434
+ "mdi"=>"image/vnd.ms-modi",
435
+ "me"=>"text/troff",
436
+ "mesh"=>"model/mesh",
437
+ "meta4"=>"application/metalink4+xml",
438
+ "metalink"=>"application/metalink+xml",
439
+ "mets"=>"application/mets+xml",
440
+ "mfm"=>"application/vnd.mfmp",
441
+ "mft"=>"application/rpki-manifest",
442
+ "mgp"=>"application/vnd.osgeo.mapguide.package",
443
+ "mgz"=>"application/vnd.proteus.magazine",
444
+ "mid"=>"audio/midi",
445
+ "midi"=>"audio/midi",
446
+ "mie"=>"application/x-mie",
447
+ "mif"=>"application/vnd.mif",
448
+ "mime"=>"message/rfc822",
449
+ "mj2"=>"video/mj2",
450
+ "mjp2"=>"video/mj2",
451
+ "mk3d"=>"video/x-matroska",
452
+ "mka"=>"audio/x-matroska",
453
+ "mks"=>"video/x-matroska",
454
+ "mkv"=>"video/x-matroska",
455
+ "mlp"=>"application/vnd.dolby.mlp",
456
+ "mmd"=>"application/vnd.chipnuts.karaoke-mmd",
457
+ "mmf"=>"application/vnd.smaf",
458
+ "mmr"=>"image/vnd.fujixerox.edmics-mmr",
459
+ "mng"=>"video/x-mng",
460
+ "mny"=>"application/x-msmoney",
461
+ "mobi"=>"application/x-mobipocket-ebook",
462
+ "mods"=>"application/mods+xml",
463
+ "mov"=>"video/quicktime",
464
+ "movie"=>"video/x-sgi-movie",
465
+ "mp2"=>"audio/mpeg",
466
+ "mp21"=>"application/mp21",
467
+ "mp2a"=>"audio/mpeg",
468
+ "mp3"=>"audio/mpeg",
469
+ "mp4"=>"video/mp4",
470
+ "mp4a"=>"audio/mp4",
471
+ "mp4s"=>"application/mp4",
472
+ "mp4v"=>"video/mp4",
473
+ "mpc"=>"application/vnd.mophun.certificate",
474
+ "mpe"=>"video/mpeg",
475
+ "mpeg"=>"video/mpeg",
476
+ "mpg"=>"video/mpeg",
477
+ "mpg4"=>"video/mp4",
478
+ "mpga"=>"audio/mpeg",
479
+ "mpkg"=>"application/vnd.apple.installer+xml",
480
+ "mpm"=>"application/vnd.blueice.multipass",
481
+ "mpn"=>"application/vnd.mophun.application",
482
+ "mpp"=>"application/vnd.ms-project",
483
+ "mpt"=>"application/vnd.ms-project",
484
+ "mpy"=>"application/vnd.ibm.minipay",
485
+ "mqy"=>"application/vnd.mobius.mqy",
486
+ "mrc"=>"application/marc",
487
+ "mrcx"=>"application/marcxml+xml",
488
+ "ms"=>"application/x-troff-ms",
489
+ "mscml"=>"application/mediaservercontrol+xml",
490
+ "mseed"=>"application/vnd.fdsn.mseed",
491
+ "mseq"=>"application/vnd.mseq",
492
+ "msf"=>"application/vnd.epson.msf",
493
+ "msh"=>"model/mesh",
494
+ "msi"=>"application/x-msdownload",
495
+ "msl"=>"application/vnd.mobius.msl",
496
+ "msty"=>"application/vnd.muvee.style",
497
+ "mts"=>"model/vnd.mts",
498
+ "mus"=>"application/vnd.musician",
499
+ "musicxml"=>"application/vnd.recordare.musicxml+xml",
500
+ "mvb"=>"application/x-msmediaview",
501
+ "mwf"=>"application/vnd.mfer",
502
+ "mxf"=>"application/mxf",
503
+ "mxl"=>"application/vnd.recordare.musicxml",
504
+ "mxml"=>"application/xv+xml",
505
+ "mxs"=>"application/vnd.triscape.mxs",
506
+ "mxu"=>"video/vnd.mpegurl",
507
+ "n-gage"=>"application/vnd.nokia.n-gage.symbian.install",
508
+ "n3"=>"text/n3",
509
+ "nb"=>"application/mathematica",
510
+ "nbp"=>"application/vnd.wolfram.player",
511
+ "nc"=>"application/x-netcdf",
512
+ "ncx"=>"application/x-dtbncx+xml",
513
+ "nfo"=>"text/x-nfo",
514
+ "ngdat"=>"application/vnd.nokia.n-gage.data",
515
+ "nitf"=>"application/vnd.nitf",
516
+ "nlu"=>"application/vnd.neurolanguage.nlu",
517
+ "nml"=>"application/vnd.enliven",
518
+ "nnd"=>"application/vnd.noblenet-directory",
519
+ "nns"=>"application/vnd.noblenet-sealer",
520
+ "nnw"=>"application/vnd.noblenet-web",
521
+ "npx"=>"image/vnd.net-fpx",
522
+ "nsc"=>"application/x-conference",
523
+ "nsf"=>"application/vnd.lotus-notes",
524
+ "ntf"=>"application/vnd.nitf",
525
+ "nzb"=>"application/x-nzb",
526
+ "oa2"=>"application/vnd.fujitsu.oasys2",
527
+ "oa3"=>"application/vnd.fujitsu.oasys3",
528
+ "oas"=>"application/vnd.fujitsu.oasys",
529
+ "obd"=>"application/x-msbinder",
530
+ "obj"=>"application/x-tgif",
531
+ "oda"=>"application/oda",
532
+ "odb"=>"application/vnd.oasis.opendocument.database",
533
+ "odc"=>"application/vnd.oasis.opendocument.chart",
534
+ "odf"=>"application/vnd.oasis.opendocument.formula",
535
+ "odft"=>"application/vnd.oasis.opendocument.formula-template",
536
+ "odg"=>"application/vnd.oasis.opendocument.graphics",
537
+ "odi"=>"application/vnd.oasis.opendocument.image",
538
+ "odm"=>"application/vnd.oasis.opendocument.text-master",
539
+ "odp"=>"application/vnd.oasis.opendocument.presentation",
540
+ "ods"=>"application/vnd.oasis.opendocument.spreadsheet",
541
+ "odt"=>"application/vnd.oasis.opendocument.text",
542
+ "oga"=>"audio/ogg",
543
+ "ogg"=>"audio/ogg",
544
+ "ogv"=>"video/ogg",
545
+ "ogx"=>"application/ogg",
546
+ "omdoc"=>"application/omdoc+xml",
547
+ "onepkg"=>"application/onenote",
548
+ "onetmp"=>"application/onenote",
549
+ "onetoc"=>"application/onenote",
550
+ "onetoc2"=>"application/onenote",
551
+ "opf"=>"application/oebps-package+xml",
552
+ "opml"=>"text/x-opml",
553
+ "oprc"=>"application/vnd.palm",
554
+ "org"=>"application/vnd.lotus-organizer",
555
+ "osf"=>"application/vnd.yamaha.openscoreformat",
556
+ "osfpvg"=>"application/vnd.yamaha.openscoreformat.osfpvg+xml",
557
+ "otc"=>"application/vnd.oasis.opendocument.chart-template",
558
+ "otf"=>"application/x-font-otf",
559
+ "otg"=>"application/vnd.oasis.opendocument.graphics-template",
560
+ "oth"=>"application/vnd.oasis.opendocument.text-web",
561
+ "oti"=>"application/vnd.oasis.opendocument.image-template",
562
+ "otp"=>"application/vnd.oasis.opendocument.presentation-template",
563
+ "ots"=>"application/vnd.oasis.opendocument.spreadsheet-template",
564
+ "ott"=>"application/vnd.oasis.opendocument.text-template",
565
+ "oxps"=>"application/oxps",
566
+ "oxt"=>"application/vnd.openofficeorg.extension",
567
+ "p"=>"text/x-pascal",
568
+ "p10"=>"application/pkcs10",
569
+ "p12"=>"application/x-pkcs12",
570
+ "p7b"=>"application/x-pkcs7-certificates",
571
+ "p7c"=>"application/pkcs7-mime",
572
+ "p7m"=>"application/pkcs7-mime",
573
+ "p7r"=>"application/x-pkcs7-certreqresp",
574
+ "p7s"=>"application/pkcs7-signature",
575
+ "p8"=>"application/pkcs8",
576
+ "pas"=>"text/x-pascal",
577
+ "paw"=>"application/vnd.pawaafile",
578
+ "pbd"=>"application/vnd.powerbuilder6",
579
+ "pbm"=>"image/x-portable-bitmap",
580
+ "pcap"=>"application/vnd.tcpdump.pcap",
581
+ "pcf"=>"application/x-font-pcf",
582
+ "pcl"=>"application/vnd.hp-pcl",
583
+ "pclxl"=>"application/vnd.hp-pclxl",
584
+ "pct"=>"image/x-pict",
585
+ "pcurl"=>"application/vnd.curl.pcurl",
586
+ "pcx"=>"image/x-pcx",
587
+ "pdb"=>"application/vnd.palm",
588
+ "pdf"=>"application/pdf",
589
+ "pfa"=>"application/x-font-type1",
590
+ "pfb"=>"application/x-font-type1",
591
+ "pfm"=>"application/x-font-type1",
592
+ "pfr"=>"application/font-tdpfr",
593
+ "pfx"=>"application/x-pkcs12",
594
+ "pgm"=>"image/x-portable-graymap",
595
+ "pgn"=>"application/x-chess-pgn",
596
+ "pgp"=>"application/pgp-encrypted",
597
+ "pic"=>"image/pict",
598
+ "pict"=>"image/pict",
599
+ "pkg"=>"application/octet-stream",
600
+ "pki"=>"application/pkixcmp",
601
+ "pkipath"=>"application/pkix-pkipath",
602
+ "plb"=>"application/vnd.3gpp.pic-bw-large",
603
+ "plc"=>"application/vnd.mobius.plc",
604
+ "plf"=>"application/vnd.pocketlearn",
605
+ "pls"=>"application/pls+xml",
606
+ "pml"=>"application/vnd.ctc-posml",
607
+ "png"=>"image/png",
608
+ "pnm"=>"image/x-portable-anymap",
609
+ "pnt"=>"image/x-macpaint",
610
+ "pntg"=>"image/x-macpaint",
611
+ "portpkg"=>"application/vnd.macports.portpkg",
612
+ "pot"=>"application/vnd.ms-powerpoint",
613
+ "potm"=>"application/vnd.ms-powerpoint.template.macroenabled.12",
614
+ "potx"=>"application/vnd.openxmlformats-officedocument.presentationml.template",
615
+ "ppam"=>"application/vnd.ms-powerpoint.addin.macroenabled.12",
616
+ "ppd"=>"application/vnd.cups-ppd",
617
+ "ppm"=>"image/x-portable-pixmap",
618
+ "pps"=>"application/vnd.ms-powerpoint",
619
+ "ppsm"=>"application/vnd.ms-powerpoint.slideshow.macroenabled.12",
620
+ "ppsx"=>"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
621
+ "ppt"=>"application/vnd.ms-powerpoint",
622
+ "pptm"=>"application/vnd.ms-powerpoint.presentation.macroenabled.12",
623
+ "pptx"=>"application/vnd.openxmlformats-officedocument.presentationml.presentation",
624
+ "pqa"=>"application/vnd.palm",
625
+ "prc"=>"application/x-mobipocket-ebook",
626
+ "pre"=>"application/vnd.lotus-freelance",
627
+ "prf"=>"application/pics-rules",
628
+ "ps"=>"application/postscript",
629
+ "psb"=>"application/vnd.3gpp.pic-bw-small",
630
+ "psd"=>"image/vnd.adobe.photoshop",
631
+ "psf"=>"application/x-font-linux-psf",
632
+ "pskcxml"=>"application/pskc+xml",
633
+ "ptid"=>"application/vnd.pvi.ptid1",
634
+ "pub"=>"application/x-mspublisher",
635
+ "pvb"=>"application/vnd.3gpp.pic-bw-var",
636
+ "pwn"=>"application/vnd.3m.post-it-notes",
637
+ "pya"=>"audio/vnd.ms-playready.media.pya",
638
+ "pyv"=>"video/vnd.ms-playready.media.pyv",
639
+ "qam"=>"application/vnd.epson.quickanime",
640
+ "qbo"=>"application/vnd.intu.qbo",
641
+ "qfx"=>"application/vnd.intu.qfx",
642
+ "qps"=>"application/vnd.publishare-delta-tree",
643
+ "qt"=>"video/quicktime",
644
+ "qti"=>"image/x-quicktime",
645
+ "qtif"=>"image/x-quicktime",
646
+ "qwd"=>"application/vnd.quark.quarkxpress",
647
+ "qwt"=>"application/vnd.quark.quarkxpress",
648
+ "qxb"=>"application/vnd.quark.quarkxpress",
649
+ "qxd"=>"application/vnd.quark.quarkxpress",
650
+ "qxl"=>"application/vnd.quark.quarkxpress",
651
+ "qxt"=>"application/vnd.quark.quarkxpress",
652
+ "ra"=>"audio/x-pn-realaudio",
653
+ "ram"=>"audio/x-pn-realaudio",
654
+ "rar"=>"application/x-rar-compressed",
655
+ "ras"=>"image/x-cmu-raster",
656
+ "rcprofile"=>"application/vnd.ipunplugged.rcprofile",
657
+ "rdf"=>"application/rdf+xml",
658
+ "rdz"=>"application/vnd.data-vision.rdz",
659
+ "rep"=>"application/vnd.businessobjects",
660
+ "res"=>"application/x-dtbresource+xml",
661
+ "rgb"=>"image/x-rgb",
662
+ "rif"=>"application/reginfo+xml",
663
+ "rip"=>"audio/vnd.rip",
664
+ "ris"=>"application/x-research-info-systems",
665
+ "rl"=>"application/resource-lists+xml",
666
+ "rlc"=>"image/vnd.fujixerox.edmics-rlc",
667
+ "rld"=>"application/resource-lists-diff+xml",
668
+ "rm"=>"application/vnd.rn-realmedia",
669
+ "rmi"=>"audio/midi",
670
+ "rmp"=>"audio/x-pn-realaudio-plugin",
671
+ "rms"=>"application/vnd.jcp.javame.midlet-rms",
672
+ "rmvb"=>"application/vnd.rn-realmedia-vbr",
673
+ "rnc"=>"application/relax-ng-compact-syntax",
674
+ "roa"=>"application/rpki-roa",
675
+ "roff"=>"application/x-troff",
676
+ "rp9"=>"application/vnd.cloanto.rp9",
677
+ "rpss"=>"application/vnd.nokia.radio-presets",
678
+ "rpst"=>"application/vnd.nokia.radio-preset",
679
+ "rq"=>"application/sparql-query",
680
+ "rs"=>"application/rls-services+xml",
681
+ "rsd"=>"application/rsd+xml",
682
+ "rss"=>"application/rss+xml",
683
+ "rtf"=>"application/rtf",
684
+ "rtx"=>"text/richtext",
685
+ "s"=>"text/x-asm",
686
+ "s3m"=>"audio/s3m",
687
+ "saf"=>"application/vnd.yamaha.smaf-audio",
688
+ "sbml"=>"application/sbml+xml",
689
+ "sc"=>"application/vnd.ibm.secure-container",
690
+ "scd"=>"application/x-msschedule",
691
+ "scm"=>"application/vnd.lotus-screencam",
692
+ "scq"=>"application/scvp-cv-request",
693
+ "scs"=>"application/scvp-cv-response",
694
+ "scurl"=>"text/vnd.curl.scurl",
695
+ "sda"=>"application/vnd.stardivision.draw",
696
+ "sdc"=>"application/vnd.stardivision.calc",
697
+ "sdd"=>"application/vnd.stardivision.impress",
698
+ "sdkd"=>"application/vnd.solent.sdkm+xml",
699
+ "sdkm"=>"application/vnd.solent.sdkm+xml",
700
+ "sdp"=>"application/sdp",
701
+ "sdw"=>"application/vnd.stardivision.writer",
702
+ "see"=>"application/vnd.seemail",
703
+ "seed"=>"application/vnd.fdsn.seed",
704
+ "sema"=>"application/vnd.sema",
705
+ "semd"=>"application/vnd.semd",
706
+ "semf"=>"application/vnd.semf",
707
+ "ser"=>"application/java-serialized-object",
708
+ "setpay"=>"application/set-payment-initiation",
709
+ "setreg"=>"application/set-registration-initiation",
710
+ "sfd-hdstx"=>"application/vnd.hydrostatix.sof-data",
711
+ "sfs"=>"application/vnd.spotfire.sfs",
712
+ "sfv"=>"text/x-sfv",
713
+ "sgi"=>"image/sgi",
714
+ "sgl"=>"application/vnd.stardivision.writer-global",
715
+ "sgm"=>"text/sgml",
716
+ "sgml"=>"text/sgml",
717
+ "sh"=>"application/x-sh",
718
+ "shar"=>"application/x-shar",
719
+ "shf"=>"application/shf+xml",
720
+ "sid"=>"image/x-mrsid-image",
721
+ "sig"=>"application/pgp-signature",
722
+ "sil"=>"audio/silk",
723
+ "silo"=>"model/mesh",
724
+ "sis"=>"application/vnd.symbian.install",
725
+ "sisx"=>"application/vnd.symbian.install",
726
+ "sit"=>"application/x-stuffit",
727
+ "sitx"=>"application/x-stuffitx",
728
+ "skd"=>"application/x-koan",
729
+ "skm"=>"application/vnd.koan",
730
+ "skp"=>"application/x-koan",
731
+ "skt"=>"application/vnd.koan",
732
+ "sldm"=>"application/vnd.ms-powerpoint.slide.macroenabled.12",
733
+ "sldx"=>"application/vnd.openxmlformats-officedocument.presentationml.slide",
734
+ "slt"=>"application/vnd.epson.salt",
735
+ "sm"=>"application/vnd.stepmania.stepchart",
736
+ "smf"=>"application/vnd.stardivision.math",
737
+ "smi"=>"application/smil",
738
+ "smil"=>"application/smil+xml",
739
+ "smv"=>"video/x-smv",
740
+ "smzip"=>"application/vnd.stepmania.package",
741
+ "snd"=>"audio/basic",
742
+ "snf"=>"application/x-font-snf",
743
+ "so"=>"application/octet-stream",
744
+ "spc"=>"application/x-pkcs7-certificates",
745
+ "spf"=>"application/vnd.yamaha.smaf-phrase",
746
+ "spl"=>"application/x-futuresplash",
747
+ "spot"=>"text/vnd.in3d.spot",
748
+ "spp"=>"application/scvp-vp-response",
749
+ "spq"=>"application/scvp-vp-request",
750
+ "spx"=>"audio/ogg",
751
+ "sql"=>"application/x-sql",
752
+ "src"=>"application/x-wais-source",
753
+ "srt"=>"application/x-subrip",
754
+ "sru"=>"application/sru+xml",
755
+ "srx"=>"application/sparql-results+xml",
756
+ "ssdl"=>"application/ssdl+xml",
757
+ "sse"=>"application/vnd.kodak-descriptor",
758
+ "ssf"=>"application/vnd.epson.ssf",
759
+ "ssml"=>"application/ssml+xml",
760
+ "st"=>"application/vnd.sailingtracker.track",
761
+ "stc"=>"application/vnd.sun.xml.calc.template",
762
+ "std"=>"application/vnd.sun.xml.draw.template",
763
+ "stf"=>"application/vnd.wt.stf",
764
+ "sti"=>"application/vnd.sun.xml.impress.template",
765
+ "stk"=>"application/hyperstudio",
766
+ "stl"=>"application/vnd.ms-pki.stl",
767
+ "str"=>"application/vnd.pg.format",
768
+ "stw"=>"application/vnd.sun.xml.writer.template",
769
+ "sub"=>"text/vnd.dvb.subtitle",
770
+ "sus"=>"application/vnd.sus-calendar",
771
+ "susp"=>"application/vnd.sus-calendar",
772
+ "sv4cpio"=>"application/x-sv4cpio",
773
+ "sv4crc"=>"application/x-sv4crc",
774
+ "svc"=>"application/vnd.dvb.service",
775
+ "svd"=>"application/vnd.svd",
776
+ "svg"=>"image/svg+xml",
777
+ "svgz"=>"image/svg+xml",
778
+ "swf"=>"application/x-shockwave-flash",
779
+ "swi"=>"application/vnd.aristanetworks.swi",
780
+ "sxc"=>"application/vnd.sun.xml.calc",
781
+ "sxd"=>"application/vnd.sun.xml.draw",
782
+ "sxg"=>"application/vnd.sun.xml.writer.global",
783
+ "sxi"=>"application/vnd.sun.xml.impress",
784
+ "sxm"=>"application/vnd.sun.xml.math",
785
+ "sxw"=>"application/vnd.sun.xml.writer",
786
+ "t"=>"text/troff",
787
+ "t3"=>"application/x-t3vm-image",
788
+ "taglet"=>"application/vnd.mynfc",
789
+ "tao"=>"application/vnd.tao.intent-module-archive",
790
+ "tar"=>"application/x-tar",
791
+ "tcap"=>"application/vnd.3gpp2.tcap",
792
+ "tcl"=>"application/x-tcl",
793
+ "teacher"=>"application/vnd.smart.teacher",
794
+ "tei"=>"application/tei+xml",
795
+ "teicorpus"=>"application/tei+xml",
796
+ "tex"=>"application/x-tex",
797
+ "texi"=>"application/x-texinfo",
798
+ "texinfo"=>"application/x-texinfo",
799
+ "text"=>"text/plain",
800
+ "tfi"=>"application/thraud+xml",
801
+ "tfm"=>"application/x-tex-tfm",
802
+ "tga"=>"image/x-tga",
803
+ "thmx"=>"application/vnd.ms-officetheme",
804
+ "tif"=>"image/tiff",
805
+ "tiff"=>"image/tiff",
806
+ "tmo"=>"application/vnd.tmobile-livetv",
807
+ "torrent"=>"application/x-bittorrent",
808
+ "tpl"=>"application/vnd.groove-tool-template",
809
+ "tpt"=>"application/vnd.trid.tpt",
810
+ "tr"=>"text/troff",
811
+ "tra"=>"application/vnd.trueapp",
812
+ "trm"=>"application/x-msterminal",
813
+ "tsd"=>"application/timestamped-data",
814
+ "tsv"=>"text/tab-separated-values",
815
+ "ttc"=>"application/x-font-ttf",
816
+ "ttf"=>"application/x-font-ttf",
817
+ "ttl"=>"text/turtle",
818
+ "twd"=>"application/vnd.simtech-mindmapper",
819
+ "twds"=>"application/vnd.simtech-mindmapper",
820
+ "txd"=>"application/vnd.genomatix.tuxedo",
821
+ "txf"=>"application/vnd.mobius.txf",
822
+ "txt"=>"text/plain",
823
+ "u32"=>"application/x-authorware-bin",
824
+ "udeb"=>"application/x-debian-package",
825
+ "ufd"=>"application/vnd.ufdl",
826
+ "ufdl"=>"application/vnd.ufdl",
827
+ "ulx"=>"application/x-glulx",
828
+ "umj"=>"application/vnd.umajin",
829
+ "unityweb"=>"application/vnd.unity",
830
+ "uoml"=>"application/vnd.uoml+xml",
831
+ "uri"=>"text/uri-list",
832
+ "uris"=>"text/uri-list",
833
+ "urls"=>"text/uri-list",
834
+ "ustar"=>"application/x-ustar",
835
+ "utz"=>"application/vnd.uiq.theme",
836
+ "uu"=>"text/x-uuencode",
837
+ "uva"=>"audio/vnd.dece.audio",
838
+ "uvd"=>"application/vnd.dece.data",
839
+ "uvf"=>"application/vnd.dece.data",
840
+ "uvg"=>"image/vnd.dece.graphic",
841
+ "uvh"=>"video/vnd.dece.hd",
842
+ "uvi"=>"image/vnd.dece.graphic",
843
+ "uvm"=>"video/vnd.dece.mobile",
844
+ "uvp"=>"video/vnd.dece.pd",
845
+ "uvs"=>"video/vnd.dece.sd",
846
+ "uvt"=>"application/vnd.dece.ttml+xml",
847
+ "uvu"=>"video/vnd.uvvu.mp4",
848
+ "uvv"=>"video/vnd.dece.video",
849
+ "uvva"=>"audio/vnd.dece.audio",
850
+ "uvvd"=>"application/vnd.dece.data",
851
+ "uvvf"=>"application/vnd.dece.data",
852
+ "uvvg"=>"image/vnd.dece.graphic",
853
+ "uvvh"=>"video/vnd.dece.hd",
854
+ "uvvi"=>"image/vnd.dece.graphic",
855
+ "uvvm"=>"video/vnd.dece.mobile",
856
+ "uvvp"=>"video/vnd.dece.pd",
857
+ "uvvs"=>"video/vnd.dece.sd",
858
+ "uvvt"=>"application/vnd.dece.ttml+xml",
859
+ "uvvu"=>"video/vnd.uvvu.mp4",
860
+ "uvvv"=>"video/vnd.dece.video",
861
+ "uvvx"=>"application/vnd.dece.unspecified",
862
+ "uvvz"=>"application/vnd.dece.zip",
863
+ "uvx"=>"application/vnd.dece.unspecified",
864
+ "uvz"=>"application/vnd.dece.zip",
865
+ "vcard"=>"text/vcard",
866
+ "vcd"=>"application/x-cdlink",
867
+ "vcf"=>"text/x-vcard",
868
+ "vcg"=>"application/vnd.groove-vcard",
869
+ "vcs"=>"text/x-vcalendar",
870
+ "vcx"=>"application/vnd.vcx",
871
+ "vis"=>"application/vnd.visionary",
872
+ "viv"=>"video/vnd.vivo",
873
+ "vob"=>"video/x-ms-vob",
874
+ "vor"=>"application/vnd.stardivision.writer",
875
+ "vox"=>"application/x-authorware-bin",
876
+ "vrml"=>"model/vrml",
877
+ "vsd"=>"application/vnd.visio",
878
+ "vsf"=>"application/vnd.vsf",
879
+ "vss"=>"application/vnd.visio",
880
+ "vst"=>"application/vnd.visio",
881
+ "vsw"=>"application/vnd.visio",
882
+ "vtu"=>"model/vnd.vtu",
883
+ "vxml"=>"application/voicexml+xml",
884
+ "w3d"=>"application/x-director",
885
+ "wad"=>"application/x-doom",
886
+ "wav"=>"audio/x-wav",
887
+ "wax"=>"audio/x-ms-wax",
888
+ "wbmp"=>"image/vnd.wap.wbmp",
889
+ "wbmxl"=>"application/vnd.wap.wbxml",
890
+ "wbs"=>"application/vnd.criticaltools.wbs+xml",
891
+ "wbxml"=>"application/vnd.wap.wbxml",
892
+ "wcm"=>"application/vnd.ms-works",
893
+ "wdb"=>"application/vnd.ms-works",
894
+ "wdp"=>"image/vnd.ms-photo",
895
+ "weba"=>"audio/webm",
896
+ "webm"=>"video/webm",
897
+ "webp"=>"image/webp",
898
+ "wg"=>"application/vnd.pmi.widget",
899
+ "wgt"=>"application/widget",
900
+ "wks"=>"application/vnd.ms-works",
901
+ "wm"=>"video/x-ms-wm",
902
+ "wma"=>"audio/x-ms-wma",
903
+ "wmd"=>"application/x-ms-wmd",
904
+ "wmf"=>"application/x-msmetafile",
905
+ "wml"=>"text/vnd.wap.wml",
906
+ "wmlc"=>"application/vnd.wap.wmlc",
907
+ "wmls"=>"text/vnd.wap.wmlscript",
908
+ "wmlsc"=>"application/vnd.wap.wmlscriptc",
909
+ "wmv"=>"video/x-ms-wmv",
910
+ "wmx"=>"video/x-ms-wmx",
911
+ "wmz"=>"application/x-ms-wmz",
912
+ "woff"=>"application/font-woff",
913
+ "wpd"=>"application/vnd.wordperfect",
914
+ "wpl"=>"application/vnd.ms-wpl",
915
+ "wps"=>"application/vnd.ms-works",
916
+ "wqd"=>"application/vnd.wqd",
917
+ "wri"=>"application/x-mswrite",
918
+ "wrl"=>"model/vrml",
919
+ "wsdl"=>"application/wsdl+xml",
920
+ "wspolicy"=>"application/wspolicy+xml",
921
+ "wtb"=>"application/vnd.webturbo",
922
+ "wvx"=>"video/x-ms-wvx",
923
+ "x32"=>"application/x-authorware-bin",
924
+ "x3d"=>"model/x3d+xml",
925
+ "x3db"=>"model/x3d+binary",
926
+ "x3dbz"=>"model/x3d+binary",
927
+ "x3dv"=>"model/x3d+vrml",
928
+ "x3dvz"=>"model/x3d+vrml",
929
+ "x3dz"=>"model/x3d+xml",
930
+ "xaml"=>"application/xaml+xml",
931
+ "xap"=>"application/x-silverlight-app",
932
+ "xar"=>"application/vnd.xara",
933
+ "xbap"=>"application/x-ms-xbap",
934
+ "xbd"=>"application/vnd.fujixerox.docuworks.binder",
935
+ "xbm"=>"image/x-xbitmap",
936
+ "xdf"=>"application/xcap-diff+xml",
937
+ "xdm"=>"application/vnd.syncml.dm+xml",
938
+ "xdp"=>"application/vnd.adobe.xdp+xml",
939
+ "xdssc"=>"application/dssc+xml",
940
+ "xdw"=>"application/vnd.fujixerox.docuworks",
941
+ "xenc"=>"application/xenc+xml",
942
+ "xer"=>"application/patch-ops-error+xml",
943
+ "xfdf"=>"application/vnd.adobe.xfdf",
944
+ "xfdl"=>"application/vnd.xfdl",
945
+ "xht"=>"application/xhtml+xml",
946
+ "xhtml"=>"application/xhtml+xml",
947
+ "xhvml"=>"application/xv+xml",
948
+ "xif"=>"image/vnd.xiff",
949
+ "xla"=>"application/vnd.ms-excel",
950
+ "xlam"=>"application/vnd.ms-excel.addin.macroenabled.12",
951
+ "xlc"=>"application/vnd.ms-excel",
952
+ "xlf"=>"application/x-xliff+xml",
953
+ "xlm"=>"application/vnd.ms-excel",
954
+ "xls"=>"application/vnd.ms-excel",
955
+ "xlsb"=>"application/vnd.ms-excel.sheet.binary.macroenabled.12",
956
+ "xlsm"=>"application/vnd.ms-excel.sheet.macroenabled.12",
957
+ "xlsx"=>"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
958
+ "xlt"=>"application/vnd.ms-excel",
959
+ "xltm"=>"application/vnd.ms-excel.template.macroenabled.12",
960
+ "xltx"=>"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
961
+ "xlw"=>"application/vnd.ms-excel",
962
+ "xm"=>"audio/xm",
963
+ "xml"=>"application/xml",
964
+ "xo"=>"application/vnd.olpc-sugar",
965
+ "xop"=>"application/xop+xml",
966
+ "xpi"=>"application/x-xpinstall",
967
+ "xpl"=>"application/xproc+xml",
968
+ "xpm"=>"image/x-xpixmap",
969
+ "xpr"=>"application/vnd.is-xpr",
970
+ "xps"=>"application/vnd.ms-xpsdocument",
971
+ "xpw"=>"application/vnd.intercon.formnet",
972
+ "xpx"=>"application/vnd.intercon.formnet",
973
+ "xsl"=>"application/xml",
974
+ "xslt"=>"application/xslt+xml",
975
+ "xsm"=>"application/vnd.syncml+xml",
976
+ "xspf"=>"application/xspf+xml",
977
+ "xul"=>"application/vnd.mozilla.xul+xml",
978
+ "xvm"=>"application/xv+xml",
979
+ "xvml"=>"application/xv+xml",
980
+ "xwd"=>"image/x-xwindowdump",
981
+ "xyz"=>"chemical/x-xyz",
982
+ "xz"=>"application/x-xz",
983
+ "yang"=>"application/yang",
984
+ "yin"=>"application/yin+xml",
985
+ "z1"=>"application/x-zmachine",
986
+ "z2"=>"application/x-zmachine",
987
+ "z3"=>"application/x-zmachine",
988
+ "z4"=>"application/x-zmachine",
989
+ "z5"=>"application/x-zmachine",
990
+ "z6"=>"application/x-zmachine",
991
+ "z7"=>"application/x-zmachine",
992
+ "z8"=>"application/x-zmachine",
993
+ "zaz"=>"application/vnd.zzazz.deck+xml",
994
+ "zip"=>"application/zip",
995
+ "zir"=>"application/vnd.zul",
996
+ "zirz"=>"application/vnd.zul",
997
+ "zmm"=>"application/vnd.handheld-entertainment+xml"}
998
+ end
999
+ end