├── HACKING ├── LICENSE ├── README.markdown ├── Rakefile ├── bin └── djsd ├── cert.key ├── cert.pem └── ext ├── dotjs.js ├── icon128.png ├── icon48.png ├── jquery.js └── manifest.json /HACKING: -------------------------------------------------------------------------------- 1 | WEBrick hacking: http://microjet.ath.cx/webrickguide/pdf/pdf_webrick.pdf 2 | 3 | Chrome Manifest: http://code.google.com/chrome/extensions/manifest.html 4 | 5 | Chrome DevGuide: http://code.google.com/chrome/extensions/devguide.html -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) Chris Wanstrath 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | Software), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | ..................... dotjs-ubuntu ................. 2 | 3 | dotjs-ubuntu is a Google Chrome extension that 4 | executes JavaScript files in `~/.js` based on their 5 | filename. 6 | 7 | This version of dotjs is maintained for 8 | users under Ubuntu. The original dotjs for Mac OSX 9 | can be found here: `https://github.com/defunkt/dotjs` 10 | 11 | If you navigate to `http://www.google.com/`, dotjs 12 | will execute `~/.js/google.com.js`. 13 | 14 | This makes it super easy to spruce up your favorite 15 | pages using JavaScript. 16 | 17 | On subdomains such as `http://gist.github.com` dotjs 18 | will try to load `~/.js/gist.github.com.js` as well 19 | as `~/.js/github.com.js` and `~/.js/com.js`. 20 | 21 | Bonus: files in `~/.js` have jQuery 1.9 loaded, 22 | regardless of whether the site you're hacking 23 | uses jQuery. 24 | 25 | Double bonus: `~/.js/default.js` is loaded on every 26 | request, meaning you can stick plugins or helper 27 | functions in it. 28 | 29 | GreaseMonkey user scripts are great, but you need to 30 | publish them somewhere and re-publish after making 31 | modifications. With dotjs, just add or edit files in 32 | `~/.js`. 33 | 34 | ## Example 35 | 36 | $ cat ~/.js/github.com.js 37 | // swap github logo with trollface 38 | $('a.header-logo-blacktocat').html( 39 | $('') 40 | .attr('src', '//bit.ly/ghD24e') 41 | .css({'width': 'auto', 'height': '22px'}) 42 | ); 43 | 44 | ![](http://puu.sh/1Kjvw) 45 | 46 | ## How It Works 47 | 48 | Chrome extensions can't access the local filesystem, 49 | so dotjs runs a tiny web server on port 3131 that 50 | serves files out of ~/.js. 51 | 52 | The ```dotjs``` executable is installed into `~/bin` 53 | and then should be added into [crontab](#install), 54 | so that the server's started when the OS starts. 55 | 56 | The dotjs Chrome extension then makes ajax requests 57 | to http://localhost:3131/convore.com.js any time you 58 | hit a page on convore.com, for example, and executes 59 | the returned JavaScript. 60 | 61 | # SSL certificate 62 | 63 | In Google Chrome the server will give an error saying that the Certificate Authority is invalid. 64 | You can simply go to: Settings > Show advanced settings > HTTPS/SSL > Manage certificates > Authorities > Import 65 | Here you can upload the `cert.pem` file in this project. 66 | 67 | ## Requires 68 | 69 | - Ubuntu 70 | - Ruby 1.8 71 | - rake (gem install rake) 72 | - Google Chrome 73 | - `/path/to/home/bin` in your $PATH 74 | 75 | ## Install 76 | 77 | git clone https://github.com/glenbot/dotjs-ubuntu.git 78 | cd dotjs-ubuntu 79 | rake install 80 | 81 | After installation add the following line to your crontab 82 | 83 | $ crontab -e 84 | @reboot /path/to/home/bin/djsd -d 85 | 86 | For the impatient run the daemon right away 87 | 88 | djsd -d 89 | 90 | For the patient reboot and enjoy! 91 | 92 | Now open https://localhost:3131 in Chrome and enable the SSL. 93 | 94 | Then install the Google Chrome extension: 95 | 96 | http://bit.ly/dotjs 97 | 98 | ## Uninstall 99 | 100 | rake uninstall 101 | 102 | ## Credits 103 | 104 | - Dotjs (OSX) 105 | - Icon: 106 | - jQuery: 107 | - Ryan Tomayko for: 108 | 109 | > "I almost wish you could just 110 | stick JavaScript in ~/.js. Do 111 | you know what I'm saying?" 112 | 113 | ## Windows 114 | 115 | - [dotjs-win](https://github.com/p3lim/dotjs-win) 116 | 117 | ## Other Browsers 118 | 119 | - [Firefox Add-on](https://github.com/rlr/dotjs-addon) 120 | - [Safari Extension](https://github.com/wfarr/dotjs.safariextension) 121 | - [Fluid UserScript](https://github.com/sj26/dotjs-fluid) 122 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | desc "Install dotjs" 2 | task :install => 'install:all' 3 | 4 | namespace :install do 5 | task :all => [ :prompt, :chrome, :daemon, :done ] 6 | 7 | task :prompt do 8 | puts "\e[1m\e[32mdotjs\e[0m" 9 | puts "\e[1m-----\e[0m" 10 | puts "I will install:", "" 11 | puts "1. djsd(1) in ~/bin" 12 | print "Ok? (y/n) " 13 | 14 | begin 15 | until %w( k ok y yes n no ).include?(answer = $stdin.gets.chomp.downcase) 16 | puts "(psst... please type y or n)" 17 | puts "Install dotjs? (y/n)" 18 | end 19 | rescue Interrupt 20 | exit 1 21 | end 22 | 23 | exit 1 if answer =~ /n/ 24 | end 25 | 26 | task :done do 27 | puts "\e[1m\e[32mdotjs installation worked\e[0m" 28 | puts "Add `@reboot /path/to/home/bin/djsd -d` to your crontab" 29 | puts "open https://localhost:3131 in chrome to enable ssl" 30 | end 31 | 32 | desc "Install dotjs daemon" 33 | task :daemon do 34 | home = ENV['HOME'] 35 | if !FileTest::directory?("#{home}/bin") 36 | Dir::mkdir("#{home}/bin") 37 | end 38 | cp "bin/djsd", "#{home}/bin", :verbose => true 39 | end 40 | 41 | desc "Install Google Chrome extension" 42 | task :chrome do 43 | puts "", "\e[31mIMPORTANT!\e[0m Install the Google Chrome extension:" 44 | puts "http://bit.ly/dotjs", "" 45 | end 46 | end 47 | 48 | desc "Uninstall dotjs" 49 | task :uninstall => 'uninstall:all' 50 | 51 | namespace :uninstall do 52 | task :all => [ :prompt, :daemon, :chrome, :done ] 53 | 54 | task :prompt do 55 | puts "\e[1m\e[32mdotjs\e[0m" 56 | puts "\e[1m-----\e[0m" 57 | puts "I will remove:", "" 58 | puts "1. djsd(1) from ~/bin" 59 | puts "3. The 'dotjs' Google Chrome Extension","" 60 | puts "I will not remove:", "" 61 | puts "1. ~/.js", "" 62 | print "Ok? (y/n) " 63 | 64 | begin 65 | until %w( k ok y yes n no ).include?(answer = $stdin.gets.chomp.downcase) 66 | puts "(psst... please type y or n)" 67 | puts "Uninstall dotjs? (y/n)" 68 | end 69 | rescue Interrupt 70 | exit 1 71 | end 72 | 73 | exit 1 if answer =~ /n/ 74 | end 75 | 76 | task :done do 77 | if system("curl http://localhost:3131 &> /dev/null") 78 | puts "\e[31mdotjs uninstall failed\e[0m" 79 | puts "djsd is still running" 80 | else 81 | puts "\e[1m\e[32mdotjs uninstall worked\e[0m" 82 | puts "your ~/.js was not touched" 83 | end 84 | end 85 | 86 | desc "Uninstall dotjs daemon" 87 | task :daemon do 88 | home = ENV['HOME'] 89 | rm "#{home}/bin/djsd", :verbose => true 90 | end 91 | 92 | desc "Uninstall Google Chrome extension" 93 | task :chrome do 94 | puts "\e[1mplease uninstall the google chrome extension manually:\e[0m" 95 | puts "google chrome > window > extensions > dotjs > uninstall" 96 | end 97 | end 98 | -------------------------------------------------------------------------------- /bin/djsd: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | daemon_mode = false 4 | 5 | if (%w( -h --help -help help ) & ARGV).length > 0 6 | puts "usage: djsd [-hvd]" 7 | puts "option(s):" 8 | puts "-d | daemon mode (background)" 9 | puts "starts dotjs server in the foreground. kill with ^C" 10 | exit 11 | end 12 | 13 | if ARGV.include?('-v') 14 | puts "djsd 2.0" 15 | exit 16 | end 17 | 18 | if ARGV.include?('-d') 19 | daemon_mode = true 20 | end 21 | 22 | require 'webrick' 23 | require 'webrick/https' 24 | 25 | dotjs = Class.new(WEBrick::HTTPServlet::AbstractServlet) do 26 | def do_GET(request, response) 27 | body = build_body(request.path) 28 | 29 | response.status = body.empty? ? 204 : 200 30 | if origin = detect_origin(request) 31 | response['Access-Control-Allow-Origin'] = origin 32 | end 33 | response['Content-Type'] = 'text/javascript' 34 | response.body = body 35 | end 36 | 37 | def build_body(path) 38 | files = [File.expand_path("~/.js/default.js")] 39 | paths = path.gsub('/','').split('.') 40 | 41 | until paths.empty? 42 | file = File.expand_path("~/.js/#{paths.join('.')}") 43 | files << file if File.file?(file) 44 | paths.shift 45 | end 46 | 47 | body = "// dotjs is working! //\n" 48 | 49 | files.each do |file| 50 | body << File.read(file) + "\n" if File.file?(file) 51 | end 52 | 53 | body 54 | end 55 | 56 | def detect_origin(req) 57 | path = req.path 58 | origin = req.header['origin'] 59 | search = path.gsub('/','').gsub(/\.js$/,'') + '$' 60 | 61 | if origin.length == 1 && path.length != 1 && origin[0].match(search) 62 | origin[0] 63 | end 64 | end 65 | end 66 | 67 | ssl_info = DATA.read 68 | ssl_cert = ssl_info.scan(/(-----BEGIN CERTIFICATE-----.+?-----END CERTIFICATE-----)/m)[0][0] 69 | ssl_key = ssl_info.scan(/(-----BEGIN RSA PRIVATE KEY-----.+?-----END RSA PRIVATE KEY-----)/m)[0][0] 70 | 71 | server_options = { 72 | :BindAddress => "127.0.0.1", 73 | :Port => 3131, 74 | :AccessLog => [], 75 | :SSLEnable => true, 76 | :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE, 77 | :SSLPrivateKey => OpenSSL::PKey::RSA.new(ssl_key), 78 | :SSLCertificate => OpenSSL::X509::Certificate.new(ssl_cert), 79 | :SSLCertName => [["CN", WEBrick::Utils::getservername]], 80 | } 81 | 82 | if daemon_mode 83 | server_options[:ServerType] = WEBrick::Daemon 84 | end 85 | 86 | server = WEBrick::HTTPServer.new(server_options) 87 | server.mount('/', dotjs) 88 | 89 | %w( INT TERM ).each do |sig| 90 | trap(sig) { server.shutdown } 91 | end 92 | 93 | server.start 94 | 95 | __END__ 96 | -----BEGIN CERTIFICATE----- 97 | MIIFTzCCAzegAwIBAgIJANwMBS108fpKMA0GCSqGSIb3DQEBCwUAMD4xCzAJBgNV 98 | BAYTAlVTMQswCQYDVQQIDAJNQTEOMAwGA1UECgwFZG90anMxEjAQBgNVBAMMCWxv 99 | Y2FsaG9zdDAeFw0xNjEyMTUxMTIzNDVaFw0yMjA2MDcxMTIzNDVaMD4xCzAJBgNV 100 | BAYTAlVTMQswCQYDVQQIDAJNQTEOMAwGA1UECgwFZG90anMxEjAQBgNVBAMMCWxv 101 | Y2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMFtEJ5t3Gz9 102 | MU40ZjHArZd45I4tj6pWCZGljbwNnaK8k6R+3ty7AcoPjbqmCyBhvyJapHqZbSmT 103 | cdGzZjxyzltgtg4MDOv0imEZXbwsMsfv+Ra40vLOhtMjEVGOF+MADc2xV7FEiaZr 104 | A1hGAfK9RMk+h/R2pv75LA6gISU+0Pb0vY/WXbzqlCT+tZtK6pRQUwTz7+JbrYgb 105 | anhaJJWyHWqgWSreCWavWfeBwITpqCYyDE0QqVdXN0HZgXfaBObjih82RpPTkW92 106 | sF5MGPMoLOyYQ/CSxwNn7IvbAVazjP67/4U2oXQd2iVtrZKc4ocJqo8sdIPbeMf2 107 | 6UaTVgQa+JFtLqwQbzAVswKYRyZtnjxoOXHcns6VjUfdIoXczzwPfdLAtMqkHX0x 108 | YSNBMoN6fp8ESY3EwmtCNegm4M6wsrHlxUI+rIvkPn//VlMlr8fUQo9GTwmmDQ4D 109 | mTo5EzxSD3iD/llXTCiY+xLaC8hPdJDnCisl8FcWpj7rGhU8UKDbQLxEoHI8rIDC 110 | tuoEouoBz1m9EW5rSLZcN7Y71GDmecxQxoRX86B4ZEGju424arNde8D6gDDsYwyt 111 | ALqo8XdMsxv3HyrHMNA0D0RiWBQzdBJm3hDI2PKvdLp9MYDc9A4UWLEmBCfyj2Jk 112 | tywgzeJ3I/wiZLguWmWxhDUWlJs0wMBBAgMBAAGjUDBOMB0GA1UdDgQWBBSlfVkV 113 | hoULAiAoJh76rg5+6xEdZTAfBgNVHSMEGDAWgBSlfVkVhoULAiAoJh76rg5+6xEd 114 | ZTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCn1BPJDcBw+g59ob+i 115 | ucHpbDonHXdkdtJxJA0IpCeMQD26LsNgL0RH5+V4+Mirz4+VTJ4ZKrABlbGP7DCA 116 | 8pXUAja9PaFKRiYWdAMJrVodoQnh+V7I+9YHh4riGmjnAbJbl3T5dU5Ox2dWqGf5 117 | GfXh7lyKaU0X53Q+82eTo0e5c5iQi+Ib8pxZ0Dz4SOYGdEFfUmlWuWwd7AzGmeSE 118 | JGBuRRgmcZ7aPZx7Newwe7PWpIG9SehroHOjltKYLK4oPnHvonOlrBD7x8r3gtkJ 119 | 5uFPRbSnqgc/1fsBk+G91/V8ZgM5QXGE0S3tRxFGSVMIsvyWYn1zelzPzzOp3WXG 120 | ePCInAw9Tm0oAaQX66bKRXP4IdSys6vA8prlNDyf78d/mjZja6Aw/EnYpyq7Jnfb 121 | 0v76YDZkTq1Fh3a4jzNM56KAZIdTGBsxks/G5O5OKRrXD58hroZATnNzSvoeDMtT 122 | qa4EZs25Dsnqaf/gjaglUAZpSPG3KJFnWhvMVYaOjx/lPGnRZFS6Th4YkBEtws3x 123 | rNQiqHmDt8F+D1yRlB/t0S23DhKgi+3aw5RrbvoWJlSRTi5qU/VX67iZxUtHEi+h 124 | Zbq5NFQ8iv8/CVLGmXPOluggwhB8gpIUXAuPVW1cfd3CqDEJyVJDtPsJPhdbrR2L 125 | E7P4cXRVyjjIwVuRAD2vNNRPKg== 126 | -----END CERTIFICATE----- 127 | -----BEGIN RSA PRIVATE KEY----- 128 | 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 177 | Wo+yq/5koLrpl4ip9BDzv4IinACg 178 | -----END RSA PRIVATE KEY----- 179 | 180 | -------------------------------------------------------------------------------- /cert.key: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | 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 51 | Wo+yq/5koLrpl4ip9BDzv4IinACg 52 | -----END PRIVATE KEY----- 53 | -------------------------------------------------------------------------------- /cert.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIFTzCCAzegAwIBAgIJANwMBS108fpKMA0GCSqGSIb3DQEBCwUAMD4xCzAJBgNV 3 | BAYTAlVTMQswCQYDVQQIDAJNQTEOMAwGA1UECgwFZG90anMxEjAQBgNVBAMMCWxv 4 | Y2FsaG9zdDAeFw0xNjEyMTUxMTIzNDVaFw0yMjA2MDcxMTIzNDVaMD4xCzAJBgNV 5 | BAYTAlVTMQswCQYDVQQIDAJNQTEOMAwGA1UECgwFZG90anMxEjAQBgNVBAMMCWxv 6 | Y2FsaG9zdDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMFtEJ5t3Gz9 7 | MU40ZjHArZd45I4tj6pWCZGljbwNnaK8k6R+3ty7AcoPjbqmCyBhvyJapHqZbSmT 8 | cdGzZjxyzltgtg4MDOv0imEZXbwsMsfv+Ra40vLOhtMjEVGOF+MADc2xV7FEiaZr 9 | A1hGAfK9RMk+h/R2pv75LA6gISU+0Pb0vY/WXbzqlCT+tZtK6pRQUwTz7+JbrYgb 10 | anhaJJWyHWqgWSreCWavWfeBwITpqCYyDE0QqVdXN0HZgXfaBObjih82RpPTkW92 11 | sF5MGPMoLOyYQ/CSxwNn7IvbAVazjP67/4U2oXQd2iVtrZKc4ocJqo8sdIPbeMf2 12 | 6UaTVgQa+JFtLqwQbzAVswKYRyZtnjxoOXHcns6VjUfdIoXczzwPfdLAtMqkHX0x 13 | YSNBMoN6fp8ESY3EwmtCNegm4M6wsrHlxUI+rIvkPn//VlMlr8fUQo9GTwmmDQ4D 14 | mTo5EzxSD3iD/llXTCiY+xLaC8hPdJDnCisl8FcWpj7rGhU8UKDbQLxEoHI8rIDC 15 | tuoEouoBz1m9EW5rSLZcN7Y71GDmecxQxoRX86B4ZEGju424arNde8D6gDDsYwyt 16 | ALqo8XdMsxv3HyrHMNA0D0RiWBQzdBJm3hDI2PKvdLp9MYDc9A4UWLEmBCfyj2Jk 17 | tywgzeJ3I/wiZLguWmWxhDUWlJs0wMBBAgMBAAGjUDBOMB0GA1UdDgQWBBSlfVkV 18 | hoULAiAoJh76rg5+6xEdZTAfBgNVHSMEGDAWgBSlfVkVhoULAiAoJh76rg5+6xEd 19 | ZTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCn1BPJDcBw+g59ob+i 20 | ucHpbDonHXdkdtJxJA0IpCeMQD26LsNgL0RH5+V4+Mirz4+VTJ4ZKrABlbGP7DCA 21 | 8pXUAja9PaFKRiYWdAMJrVodoQnh+V7I+9YHh4riGmjnAbJbl3T5dU5Ox2dWqGf5 22 | GfXh7lyKaU0X53Q+82eTo0e5c5iQi+Ib8pxZ0Dz4SOYGdEFfUmlWuWwd7AzGmeSE 23 | JGBuRRgmcZ7aPZx7Newwe7PWpIG9SehroHOjltKYLK4oPnHvonOlrBD7x8r3gtkJ 24 | 5uFPRbSnqgc/1fsBk+G91/V8ZgM5QXGE0S3tRxFGSVMIsvyWYn1zelzPzzOp3WXG 25 | ePCInAw9Tm0oAaQX66bKRXP4IdSys6vA8prlNDyf78d/mjZja6Aw/EnYpyq7Jnfb 26 | 0v76YDZkTq1Fh3a4jzNM56KAZIdTGBsxks/G5O5OKRrXD58hroZATnNzSvoeDMtT 27 | qa4EZs25Dsnqaf/gjaglUAZpSPG3KJFnWhvMVYaOjx/lPGnRZFS6Th4YkBEtws3x 28 | rNQiqHmDt8F+D1yRlB/t0S23DhKgi+3aw5RrbvoWJlSRTi5qU/VX67iZxUtHEi+h 29 | Zbq5NFQ8iv8/CVLGmXPOluggwhB8gpIUXAuPVW1cfd3CqDEJyVJDtPsJPhdbrR2L 30 | E7P4cXRVyjjIwVuRAD2vNNRPKg== 31 | -----END CERTIFICATE----- 32 | -------------------------------------------------------------------------------- /ext/dotjs.js: -------------------------------------------------------------------------------- 1 | $.ajax({ 2 | url: 'https://localhost:3131/'+location.hostname.replace(/^www\./,'')+'.js', 3 | dataType: 'text', 4 | success: function(d){ 5 | $(function(){ eval(d) }) 6 | }, 7 | error: function(){ 8 | console.log('no dotjs server found at localhost:3131') 9 | } 10 | }) 11 | -------------------------------------------------------------------------------- /ext/icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/glenbot/dotjs-ubuntu/2178aeba3edf969539a99fbb88e281f24fd7d197/ext/icon128.png -------------------------------------------------------------------------------- /ext/icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/glenbot/dotjs-ubuntu/2178aeba3edf969539a99fbb88e281f24fd7d197/ext/icon48.png -------------------------------------------------------------------------------- /ext/jquery.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("